1 | (function () {
|
2 | ;
|
3 |
|
4 | var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
5 |
|
6 | function commonjsRequire () {
|
7 | throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs');
|
8 | }
|
9 |
|
10 | function unwrapExports (x) {
|
11 | return x && x.__esModule ? x['default'] : x;
|
12 | }
|
13 |
|
14 | function createCommonjsModule(fn, module) {
|
15 | return module = { exports: {} }, fn(module, module.exports), module.exports;
|
16 | }
|
17 |
|
18 | var mapboxGl = createCommonjsModule(function (module, exports) {
|
19 | (function(f){{module.exports=f();}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof commonjsRequire=="function"&&commonjsRequire;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r);}return n[o].exports}var i=typeof commonjsRequire=="function"&&commonjsRequire;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
|
20 | !function(t,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define(r):t.glMatrix=r();}(this,function(){"use strict";function t(){var t=new Float32Array(3);return t[0]=0,t[1]=0,t[2]=0,t}function r(t,r,n){var e=r[0],a=r[1],o=r[2];return t[0]=e*n[0]+a*n[3]+o*n[6],t[1]=e*n[1]+a*n[4]+o*n[7],t[2]=e*n[2]+a*n[5]+o*n[8],t}function n(){var t=new Float32Array(4);return t[0]=0,t[1]=0,t[2]=0,t[3]=0,t}function e(t,r,n){var e=r[0],a=r[1],o=r[2],u=r[3];return t[0]=n[0]*e+n[4]*a+n[8]*o+n[12]*u,t[1]=n[1]*e+n[5]*a+n[9]*o+n[13]*u,t[2]=n[2]*e+n[6]*a+n[10]*o+n[14]*u,t[3]=n[3]*e+n[7]*a+n[11]*o+n[15]*u,t}function a(){var t=new Float32Array(4);return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t}function o(t,r,n){var e=r[0],a=r[1],o=r[2],u=r[3],i=Math.sin(n),c=Math.cos(n);return t[0]=e*c+o*i,t[1]=a*c+u*i,t[2]=e*-i+o*c,t[3]=a*-i+u*c,t}function u(t,r,n){var e=r[0],a=r[1],o=r[2],u=r[3],i=n[0],c=n[1];return t[0]=e*i,t[1]=a*i,t[2]=o*c,t[3]=u*c,t}function i(){var t=new Float32Array(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t}function c(t,r){var n=Math.sin(r),e=Math.cos(r);return t[0]=e,t[1]=n,t[2]=0,t[3]=-n,t[4]=e,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t}function f(){var t=new Float32Array(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}function v(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}function s(t,r){var n=r[0],e=r[1],a=r[2],o=r[3],u=r[4],i=r[5],c=r[6],f=r[7],v=r[8],s=r[9],l=r[10],M=r[11],h=r[12],m=r[13],y=r[14],d=r[15],p=n*i-e*u,w=n*c-a*u,A=n*f-o*u,F=e*c-a*i,x=e*f-o*i,b=a*f-o*c,g=v*m-s*h,j=v*y-l*h,R=v*d-M*h,X=s*y-l*m,Z=s*d-M*m,k=l*d-M*y,q=p*k-w*Z+A*X+F*R-x*j+b*g;return q?(q=1/q,t[0]=(i*k-c*Z+f*X)*q,t[1]=(a*Z-e*k-o*X)*q,t[2]=(m*b-y*x+d*F)*q,t[3]=(l*x-s*b-M*F)*q,t[4]=(c*R-u*k-f*j)*q,t[5]=(n*k-a*R+o*j)*q,t[6]=(y*A-h*b-d*w)*q,t[7]=(v*b-l*A+M*w)*q,t[8]=(u*Z-i*R+f*g)*q,t[9]=(e*R-n*Z-o*g)*q,t[10]=(h*x-m*A+d*p)*q,t[11]=(s*A-v*x-M*p)*q,t[12]=(i*j-u*X-c*g)*q,t[13]=(n*X-e*j+a*g)*q,t[14]=(m*w-h*F-y*p)*q,t[15]=(v*F-s*w+l*p)*q,t):null}function l(t,r,n){var e=r[0],a=r[1],o=r[2],u=r[3],i=r[4],c=r[5],f=r[6],v=r[7],s=r[8],l=r[9],M=r[10],h=r[11],m=r[12],y=r[13],d=r[14],p=r[15],w=n[0],A=n[1],F=n[2],x=n[3];return t[0]=w*e+A*i+F*s+x*m,t[1]=w*a+A*c+F*l+x*y,t[2]=w*o+A*f+F*M+x*d,t[3]=w*u+A*v+F*h+x*p,w=n[4],A=n[5],F=n[6],x=n[7],t[4]=w*e+A*i+F*s+x*m,t[5]=w*a+A*c+F*l+x*y,t[6]=w*o+A*f+F*M+x*d,t[7]=w*u+A*v+F*h+x*p,w=n[8],A=n[9],F=n[10],x=n[11],t[8]=w*e+A*i+F*s+x*m,t[9]=w*a+A*c+F*l+x*y,t[10]=w*o+A*f+F*M+x*d,t[11]=w*u+A*v+F*h+x*p,w=n[12],A=n[13],F=n[14],x=n[15],t[12]=w*e+A*i+F*s+x*m,t[13]=w*a+A*c+F*l+x*y,t[14]=w*o+A*f+F*M+x*d,t[15]=w*u+A*v+F*h+x*p,t}function M(t,r,n){var e,a,o,u,i,c,f,v,s,l,M,h,m=n[0],y=n[1],d=n[2];return r===t?(t[12]=r[0]*m+r[4]*y+r[8]*d+r[12],t[13]=r[1]*m+r[5]*y+r[9]*d+r[13],t[14]=r[2]*m+r[6]*y+r[10]*d+r[14],t[15]=r[3]*m+r[7]*y+r[11]*d+r[15]):(e=r[0],a=r[1],o=r[2],u=r[3],i=r[4],c=r[5],f=r[6],v=r[7],s=r[8],l=r[9],M=r[10],h=r[11],t[0]=e,t[1]=a,t[2]=o,t[3]=u,t[4]=i,t[5]=c,t[6]=f,t[7]=v,t[8]=s,t[9]=l,t[10]=M,t[11]=h,t[12]=e*m+i*y+s*d+r[12],t[13]=a*m+c*y+l*d+r[13],t[14]=o*m+f*y+M*d+r[14],t[15]=u*m+v*y+h*d+r[15]),t}function h(t,r,n){var e=n[0],a=n[1],o=n[2];return t[0]=r[0]*e,t[1]=r[1]*e,t[2]=r[2]*e,t[3]=r[3]*e,t[4]=r[4]*a,t[5]=r[5]*a,t[6]=r[6]*a,t[7]=r[7]*a,t[8]=r[8]*o,t[9]=r[9]*o,t[10]=r[10]*o,t[11]=r[11]*o,t[12]=r[12],t[13]=r[13],t[14]=r[14],t[15]=r[15],t}function m(t,r,n){var e=Math.sin(n),a=Math.cos(n),o=r[4],u=r[5],i=r[6],c=r[7],f=r[8],v=r[9],s=r[10],l=r[11];return r!==t&&(t[0]=r[0],t[1]=r[1],t[2]=r[2],t[3]=r[3],t[12]=r[12],t[13]=r[13],t[14]=r[14],t[15]=r[15]),t[4]=o*a+f*e,t[5]=u*a+v*e,t[6]=i*a+s*e,t[7]=c*a+l*e,t[8]=f*a-o*e,t[9]=v*a-u*e,t[10]=s*a-i*e,t[11]=l*a-c*e,t}function y(t,r,n){var e=Math.sin(n),a=Math.cos(n),o=r[0],u=r[1],i=r[2],c=r[3],f=r[4],v=r[5],s=r[6],l=r[7];return r!==t&&(t[8]=r[8],t[9]=r[9],t[10]=r[10],t[11]=r[11],t[12]=r[12],t[13]=r[13],t[14]=r[14],t[15]=r[15]),t[0]=o*a+f*e,t[1]=u*a+v*e,t[2]=i*a+s*e,t[3]=c*a+l*e,t[4]=f*a-o*e,t[5]=v*a-u*e,t[6]=s*a-i*e,t[7]=l*a-c*e,t}function d(t,r,n,e,a){var o=1/Math.tan(r/2),u=1/(e-a);return t[0]=o/n,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=o,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=(a+e)*u,t[11]=-1,t[12]=0,t[13]=0,t[14]=2*a*e*u,t[15]=0,t}function p(t,r,n,e,a,o,u){var i=1/(r-n),c=1/(e-a),f=1/(o-u);return t[0]=-2*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*c,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*f,t[11]=0,t[12]=(r+n)*i,t[13]=(a+e)*c,t[14]=(u+o)*f,t[15]=1,t}var w=(t(),n(),{vec3:{transformMat3:r},vec4:{transformMat4:e},mat2:{create:a,rotate:o,scale:u},mat3:{create:i,fromRotation:c},mat4:{create:f,identity:v,translate:M,scale:h,multiply:l,perspective:d,rotateX:m,rotateZ:y,invert:s,ortho:p}});return w});
|
21 | },{}],2:[function(_dereq_,module,exports){
|
22 | !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.ShelfPack=e();}(this,function(){function t(t,e,i){i=i||{},this.w=t||64,this.h=e||64,this.autoResize=!!i.autoResize,this.shelves=[],this.freebins=[],this.stats={},this.bins={},this.maxId=0;}function e(t,e,i){this.x=0,this.y=t,this.w=this.free=e,this.h=i;}function i(t,e,i,s,h,n,r){this.id=t,this.x=e,this.y=i,this.w=s,this.h=h,this.maxw=n||s,this.maxh=r||h,this.refcount=0;}return t.prototype.pack=function(t,e){t=[].concat(t),e=e||{};for(var i,s,h,n,r=[],f=0;f<t.length;f++)if(i=t[f].w||t[f].width,s=t[f].h||t[f].height,h=t[f].id,i&&s){if(n=this.packOne(i,s,h),!n)continue;e.inPlace&&(t[f].x=n.x,t[f].y=n.y,t[f].id=n.id),r.push(n);}if(this.shelves.length>0){for(var o=0,a=0,u=0;u<this.shelves.length;u++){var l=this.shelves[u];a+=l.h,o=Math.max(l.w-l.free,o);}this.resize(o,a);}return r},t.prototype.packOne=function(t,i,s){var h,n,r,f,o={freebin:-1,shelf:-1,waste:1/0},a=0;if("string"==typeof s||"number"==typeof s){if(h=this.getBin(s))return this.ref(h),h;"number"==typeof s&&(this.maxId=Math.max(s,this.maxId));}else s=++this.maxId;for(f=0;f<this.freebins.length;f++){if(h=this.freebins[f],i===h.maxh&&t===h.maxw)return this.allocFreebin(f,t,i,s);i>h.maxh||t>h.maxw||i<=h.maxh&&t<=h.maxw&&(r=h.maxw*h.maxh-t*i,r<o.waste&&(o.waste=r,o.freebin=f));}for(f=0;f<this.shelves.length;f++)if(n=this.shelves[f],a+=n.h,!(t>n.free)){if(i===n.h)return this.allocShelf(f,t,i,s);i>n.h||i<n.h&&(r=(n.h-i)*t,r<o.waste&&(o.freebin=-1,o.waste=r,o.shelf=f));}if(o.freebin!==-1)return this.allocFreebin(o.freebin,t,i,s);if(o.shelf!==-1)return this.allocShelf(o.shelf,t,i,s);if(i<=this.h-a&&t<=this.w)return n=new e(a,this.w,i),this.allocShelf(this.shelves.push(n)-1,t,i,s);if(this.autoResize){var u,l,c,p;return u=l=this.h,c=p=this.w,(c<=u||t>c)&&(p=2*Math.max(t,c)),(u<c||i>u)&&(l=2*Math.max(i,u)),this.resize(p,l),this.packOne(t,i,s)}return null},t.prototype.allocFreebin=function(t,e,i,s){var h=this.freebins.splice(t,1)[0];return h.id=s,h.w=e,h.h=i,h.refcount=0,this.bins[s]=h,this.ref(h),h},t.prototype.allocShelf=function(t,e,i,s){var h=this.shelves[t],n=h.alloc(e,i,s);return this.bins[s]=n,this.ref(n),n},t.prototype.getBin=function(t){return this.bins[t]},t.prototype.ref=function(t){if(1===++t.refcount){var e=t.h;this.stats[e]=(0|this.stats[e])+1;}return t.refcount},t.prototype.unref=function(t){return 0===t.refcount?0:(0===--t.refcount&&(this.stats[t.h]--,delete this.bins[t.id],this.freebins.push(t)),t.refcount)},t.prototype.clear=function(){this.shelves=[],this.freebins=[],this.stats={},this.bins={},this.maxId=0;},t.prototype.resize=function(t,e){this.w=t,this.h=e;for(var i=0;i<this.shelves.length;i++)this.shelves[i].resize(t);return!0},e.prototype.alloc=function(t,e,s){if(t>this.free||e>this.h)return null;var h=this.x;return this.x+=t,this.free-=t,new i(s,h,this.y,t,e,t,this.h)},e.prototype.resize=function(t){return this.free+=t-this.w,this.w=t,!0},t});
|
23 | },{}],3:[function(_dereq_,module,exports){
|
24 | function UnitBezier(t,i,e,r){this.cx=3*t,this.bx=3*(e-t)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*i,this.by=3*(r-i)-this.cy,this.ay=1-this.cy-this.by,this.p1x=t,this.p1y=r,this.p2x=e,this.p2y=r;}module.exports=UnitBezier,UnitBezier.prototype.sampleCurveX=function(t){return((this.ax*t+this.bx)*t+this.cx)*t},UnitBezier.prototype.sampleCurveY=function(t){return((this.ay*t+this.by)*t+this.cy)*t},UnitBezier.prototype.sampleCurveDerivativeX=function(t){return(3*this.ax*t+2*this.bx)*t+this.cx},UnitBezier.prototype.solveCurveX=function(t,i){"undefined"==typeof i&&(i=1e-6);var e,r,s,h,n;for(s=t,n=0;n<8;n++){if(h=this.sampleCurveX(s)-t,Math.abs(h)<i)return s;var u=this.sampleCurveDerivativeX(s);if(Math.abs(u)<1e-6)break;s-=h/u;}if(e=0,r=1,s=t,s<e)return e;if(s>r)return r;for(;e<r;){if(h=this.sampleCurveX(s),Math.abs(h-t)<i)return s;t>h?e=s:r=s,s=.5*(r-e)+e;}return s},UnitBezier.prototype.solve=function(t,i){return this.sampleCurveY(this.solveCurveX(t,i))};
|
25 | },{}],4:[function(_dereq_,module,exports){
|
26 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(e.WhooTS=e.WhooTS||{});}(this,function(e){function t(e,t,r,n,i,s){s=s||{};var f=e+"?"+["bbox="+o(r,n,i),"format="+(s.format||"image/png"),"service="+(s.service||"WMS"),"version="+(s.version||"1.1.1"),"request="+(s.request||"GetMap"),"srs="+(s.srs||"EPSG:3857"),"width="+(s.width||256),"height="+(s.height||256),"layers="+t].join("&");return f}function o(e,t,o){t=Math.pow(2,o)-t-1;var n=r(256*e,256*t,o),i=r(256*(e+1),256*(t+1),o);return n[0]+","+n[1]+","+i[0]+","+i[1]}function r(e,t,o){var r=2*Math.PI*6378137/256/Math.pow(2,o),n=e*r-2*Math.PI*6378137/2,i=t*r-2*Math.PI*6378137/2;return[n,i]}e.getURL=t,e.getTileBBox=o,e.getMercCoords=r,Object.defineProperty(e,"__esModule",{value:!0});});
|
27 | },{}],5:[function(_dereq_,module,exports){
|
28 | function earcut(e,n,r){r=r||2;var t=n&&n.length,i=t?n[0]*r:e.length,x=linkedList(e,0,i,r,!0),a=[];if(!x)return a;var o,l,u,s,v,f,y;if(t&&(x=eliminateHoles(e,n,x,r)),e.length>80*r){o=u=e[0],l=s=e[1];for(var d=r;d<i;d+=r)v=e[d],f=e[d+1],v<o&&(o=v),f<l&&(l=f),v>u&&(u=v),f>s&&(s=f);y=Math.max(u-o,s-l);}return earcutLinked(x,a,r,o,l,y),a}function linkedList(e,n,r,t,i){var x,a;if(i===signedArea(e,n,r,t)>0)for(x=n;x<r;x+=t)a=insertNode(x,e[x],e[x+1],a);else for(x=r-t;x>=n;x-=t)a=insertNode(x,e[x],e[x+1],a);return a&&equals(a,a.next)&&(removeNode(a),a=a.next),a}function filterPoints(e,n){if(!e)return e;n||(n=e);var r,t=e;do if(r=!1,t.steiner||!equals(t,t.next)&&0!==area(t.prev,t,t.next))t=t.next;else{if(removeNode(t),t=n=t.prev,t===t.next)return null;r=!0;}while(r||t!==n);return n}function earcutLinked(e,n,r,t,i,x,a){if(e){!a&&x&&indexCurve(e,t,i,x);for(var o,l,u=e;e.prev!==e.next;)if(o=e.prev,l=e.next,x?isEarHashed(e,t,i,x):isEar(e))n.push(o.i/r),n.push(e.i/r),n.push(l.i/r),removeNode(e),e=l.next,u=l.next;else if(e=l,e===u){a?1===a?(e=cureLocalIntersections(e,n,r),earcutLinked(e,n,r,t,i,x,2)):2===a&&splitEarcut(e,n,r,t,i,x):earcutLinked(filterPoints(e),n,r,t,i,x,1);break}}}function isEar(e){var n=e.prev,r=e,t=e.next;if(area(n,r,t)>=0)return!1;for(var i=e.next.next;i!==e.prev;){if(pointInTriangle(n.x,n.y,r.x,r.y,t.x,t.y,i.x,i.y)&&area(i.prev,i,i.next)>=0)return!1;i=i.next;}return!0}function isEarHashed(e,n,r,t){var i=e.prev,x=e,a=e.next;if(area(i,x,a)>=0)return!1;for(var o=i.x<x.x?i.x<a.x?i.x:a.x:x.x<a.x?x.x:a.x,l=i.y<x.y?i.y<a.y?i.y:a.y:x.y<a.y?x.y:a.y,u=i.x>x.x?i.x>a.x?i.x:a.x:x.x>a.x?x.x:a.x,s=i.y>x.y?i.y>a.y?i.y:a.y:x.y>a.y?x.y:a.y,v=zOrder(o,l,n,r,t),f=zOrder(u,s,n,r,t),y=e.nextZ;y&&y.z<=f;){if(y!==e.prev&&y!==e.next&&pointInTriangle(i.x,i.y,x.x,x.y,a.x,a.y,y.x,y.y)&&area(y.prev,y,y.next)>=0)return!1;y=y.nextZ;}for(y=e.prevZ;y&&y.z>=v;){if(y!==e.prev&&y!==e.next&&pointInTriangle(i.x,i.y,x.x,x.y,a.x,a.y,y.x,y.y)&&area(y.prev,y,y.next)>=0)return!1;y=y.prevZ;}return!0}function cureLocalIntersections(e,n,r){var t=e;do{var i=t.prev,x=t.next.next;!equals(i,x)&&intersects(i,t,t.next,x)&&locallyInside(i,x)&&locallyInside(x,i)&&(n.push(i.i/r),n.push(t.i/r),n.push(x.i/r),removeNode(t),removeNode(t.next),t=e=x),t=t.next;}while(t!==e);return t}function splitEarcut(e,n,r,t,i,x){var a=e;do{for(var o=a.next.next;o!==a.prev;){if(a.i!==o.i&&isValidDiagonal(a,o)){var l=splitPolygon(a,o);return a=filterPoints(a,a.next),l=filterPoints(l,l.next),earcutLinked(a,n,r,t,i,x),void earcutLinked(l,n,r,t,i,x)}o=o.next;}a=a.next;}while(a!==e)}function eliminateHoles(e,n,r,t){var i,x,a,o,l,u=[];for(i=0,x=n.length;i<x;i++)a=n[i]*t,o=i<x-1?n[i+1]*t:e.length,l=linkedList(e,a,o,t,!1),l===l.next&&(l.steiner=!0),u.push(getLeftmost(l));for(u.sort(compareX),i=0;i<u.length;i++)eliminateHole(u[i],r),r=filterPoints(r,r.next);return r}function compareX(e,n){return e.x-n.x}function eliminateHole(e,n){if(n=findHoleBridge(e,n)){var r=splitPolygon(n,e);filterPoints(r,r.next);}}function findHoleBridge(e,n){var r,t=n,i=e.x,x=e.y,a=-(1/0);do{if(x<=t.y&&x>=t.next.y){var o=t.x+(x-t.y)*(t.next.x-t.x)/(t.next.y-t.y);if(o<=i&&o>a){if(a=o,o===i){if(x===t.y)return t;if(x===t.next.y)return t.next}r=t.x<t.next.x?t:t.next;}}t=t.next;}while(t!==n);if(!r)return null;if(i===a)return r.prev;var l,u=r,s=r.x,v=r.y,f=1/0;for(t=r.next;t!==u;)i>=t.x&&t.x>=s&&pointInTriangle(x<v?i:a,x,s,v,x<v?a:i,x,t.x,t.y)&&(l=Math.abs(x-t.y)/(i-t.x),(l<f||l===f&&t.x>r.x)&&locallyInside(t,e)&&(r=t,f=l)),t=t.next;return r}function indexCurve(e,n,r,t){var i=e;do null===i.z&&(i.z=zOrder(i.x,i.y,n,r,t)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;while(i!==e);i.prevZ.nextZ=null,i.prevZ=null,sortLinked(i);}function sortLinked(e){var n,r,t,i,x,a,o,l,u=1;do{for(r=e,e=null,x=null,a=0;r;){for(a++,t=r,o=0,n=0;n<u&&(o++,t=t.nextZ,t);n++);for(l=u;o>0||l>0&&t;)0===o?(i=t,t=t.nextZ,l--):0!==l&&t?r.z<=t.z?(i=r,r=r.nextZ,o--):(i=t,t=t.nextZ,l--):(i=r,r=r.nextZ,o--),x?x.nextZ=i:e=i,i.prevZ=x,x=i;r=t;}x.nextZ=null,u*=2;}while(a>1);return e}function zOrder(e,n,r,t,i){return e=32767*(e-r)/i,n=32767*(n-t)/i,e=16711935&(e|e<<8),e=252645135&(e|e<<4),e=858993459&(e|e<<2),e=1431655765&(e|e<<1),n=16711935&(n|n<<8),n=252645135&(n|n<<4),n=858993459&(n|n<<2),n=1431655765&(n|n<<1),e|n<<1}function getLeftmost(e){var n=e,r=e;do n.x<r.x&&(r=n),n=n.next;while(n!==e);return r}function pointInTriangle(e,n,r,t,i,x,a,o){return(i-a)*(n-o)-(e-a)*(x-o)>=0&&(e-a)*(t-o)-(r-a)*(n-o)>=0&&(r-a)*(x-o)-(i-a)*(t-o)>=0}function isValidDiagonal(e,n){return e.next.i!==n.i&&e.prev.i!==n.i&&!intersectsPolygon(e,n)&&locallyInside(e,n)&&locallyInside(n,e)&&middleInside(e,n)}function area(e,n,r){return(n.y-e.y)*(r.x-n.x)-(n.x-e.x)*(r.y-n.y)}function equals(e,n){return e.x===n.x&&e.y===n.y}function intersects(e,n,r,t){return!!(equals(e,n)&&equals(r,t)||equals(e,t)&&equals(r,n))||area(e,n,r)>0!=area(e,n,t)>0&&area(r,t,e)>0!=area(r,t,n)>0}function intersectsPolygon(e,n){var r=e;do{if(r.i!==e.i&&r.next.i!==e.i&&r.i!==n.i&&r.next.i!==n.i&&intersects(r,r.next,e,n))return!0;r=r.next;}while(r!==e);return!1}function locallyInside(e,n){return area(e.prev,e,e.next)<0?area(e,n,e.next)>=0&&area(e,e.prev,n)>=0:area(e,n,e.prev)<0||area(e,e.next,n)<0}function middleInside(e,n){var r=e,t=!1,i=(e.x+n.x)/2,x=(e.y+n.y)/2;do r.y>x!=r.next.y>x&&i<(r.next.x-r.x)*(x-r.y)/(r.next.y-r.y)+r.x&&(t=!t),r=r.next;while(r!==e);return t}function splitPolygon(e,n){var r=new Node(e.i,e.x,e.y),t=new Node(n.i,n.x,n.y),i=e.next,x=n.prev;return e.next=n,n.prev=e,r.next=i,i.prev=r,t.next=r,r.prev=t,x.next=t,t.prev=x,t}function insertNode(e,n,r,t){var i=new Node(e,n,r);return t?(i.next=t.next,i.prev=t,t.next.prev=i,t.next=i):(i.prev=i,i.next=i),i}function removeNode(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ);}function Node(e,n,r){this.i=e,this.x=n,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1;}function signedArea(e,n,r,t){for(var i=0,x=n,a=r-t;x<r;x+=t)i+=(e[a]-e[x])*(e[x+1]+e[a+1]),a=x;return i}module.exports=earcut,earcut.deviation=function(e,n,r,t){var i=n&&n.length,x=i?n[0]*r:e.length,a=Math.abs(signedArea(e,0,x,r));if(i)for(var o=0,l=n.length;o<l;o++){var u=n[o]*r,s=o<l-1?n[o+1]*r:e.length;a-=Math.abs(signedArea(e,u,s,r));}var v=0;for(o=0;o<t.length;o+=3){var f=t[o]*r,y=t[o+1]*r,d=t[o+2]*r;v+=Math.abs((e[f]-e[d])*(e[y+1]-e[f+1])-(e[f]-e[y])*(e[d+1]-e[f+1]));}return 0===a&&0===v?0:Math.abs((v-a)/a)},earcut.flatten=function(e){for(var n=e[0][0].length,r={vertices:[],holes:[],dimensions:n},t=0,i=0;i<e.length;i++){for(var x=0;x<e[i].length;x++)for(var a=0;a<n;a++)r.vertices.push(e[i][x][a]);i>0&&(t+=e[i-1].length,r.holes.push(t));}return r};
; |
29 | },{}],6:[function(_dereq_,module,exports){
|
30 | function geometry(r){if("Polygon"===r.type)return polygonArea(r.coordinates);if("MultiPolygon"===r.type){for(var e=0,n=0;n<r.coordinates.length;n++)e+=polygonArea(r.coordinates[n]);return e}return null}function polygonArea(r){var e=0;if(r&&r.length>0){e+=Math.abs(ringArea(r[0]));for(var n=1;n<r.length;n++)e-=Math.abs(ringArea(r[n]));}return e}function ringArea(r){var e=0;if(r.length>2){for(var n,t,o=0;o<r.length-1;o++)n=r[o],t=r[o+1],e+=rad(t[0]-n[0])*(2+Math.sin(rad(n[1]))+Math.sin(rad(t[1])));e=e*wgs84.RADIUS*wgs84.RADIUS/2;}return e}function rad(r){return r*Math.PI/180}var wgs84=_dereq_("wgs84");module.exports.geometry=geometry,module.exports.ring=ringArea;
|
31 | },{"wgs84":42}],7:[function(_dereq_,module,exports){
|
32 | function rewind(r,e){switch(r&&r.type||null){case"FeatureCollection":return r.features=r.features.map(curryOuter(rewind,e)),r;case"Feature":return r.geometry=rewind(r.geometry,e),r;case"Polygon":case"MultiPolygon":return correct(r,e);default:return r}}function curryOuter(r,e){return function(n){return r(n,e)}}function correct(r,e){return"Polygon"===r.type?r.coordinates=correctRings(r.coordinates,e):"MultiPolygon"===r.type&&(r.coordinates=r.coordinates.map(curryOuter(correctRings,e))),r}function correctRings(r,e){e=!!e,r[0]=wind(r[0],!e);for(var n=1;n<r.length;n++)r[n]=wind(r[n],e);return r}function wind(r,e){return cw(r)===e?r:r.reverse()}function cw(r){return geojsonArea.ring(r)>=0}var geojsonArea=_dereq_("geojson-area");module.exports=rewind;
|
33 | },{"geojson-area":6}],8:[function(_dereq_,module,exports){
|
34 | function clip(e,r,t,n,u,i,l,s){if(t/=r,n/=r,l>=t&&s<=n)return e;if(l>n||s<t)return null;for(var h=[],p=0;p<e.length;p++){var a,c,o=e[p],f=o.geometry,g=o.type;if(a=o.min[u],c=o.max[u],a>=t&&c<=n)h.push(o);else if(!(a>n||c<t)){var v=1===g?clipPoints(f,t,n,u):clipGeometry(f,t,n,u,i,3===g);v.length&&h.push(createFeature(o.tags,g,v,o.id));}}return h.length?h:null}function clipPoints(e,r,t,n){for(var u=[],i=0;i<e.length;i++){var l=e[i],s=l[n];s>=r&&s<=t&&u.push(l);}return u}function clipGeometry(e,r,t,n,u,i){for(var l=[],s=0;s<e.length;s++){var h,p,a,c=0,o=0,f=null,g=e[s],v=g.area,m=g.dist,w=g.outer,S=g.length,d=[];for(p=0;p<S-1;p++)h=f||g[p],f=g[p+1],c=o||h[n],o=f[n],c<r?o>t?(d.push(u(h,f,r),u(h,f,t)),i||(d=newSlice(l,d,v,m,w))):o>=r&&d.push(u(h,f,r)):c>t?o<r?(d.push(u(h,f,t),u(h,f,r)),i||(d=newSlice(l,d,v,m,w))):o<=t&&d.push(u(h,f,t)):(d.push(h),o<r?(d.push(u(h,f,r)),i||(d=newSlice(l,d,v,m,w))):o>t&&(d.push(u(h,f,t)),i||(d=newSlice(l,d,v,m,w))));h=g[S-1],c=h[n],c>=r&&c<=t&&d.push(h),a=d[d.length-1],i&&a&&(d[0][0]!==a[0]||d[0][1]!==a[1])&&d.push(d[0]),newSlice(l,d,v,m,w);}return l}function newSlice(e,r,t,n,u){return r.length&&(r.area=t,r.dist=n,void 0!==u&&(r.outer=u),e.push(r)),[]}module.exports=clip;var createFeature=_dereq_("./feature");
; |
35 | },{"./feature":10}],9:[function(_dereq_,module,exports){
|
36 | function convert(e,t){var r=[];if("FeatureCollection"===e.type)for(var o=0;o<e.features.length;o++)convertFeature(r,e.features[o],t);else"Feature"===e.type?convertFeature(r,e,t):convertFeature(r,{geometry:e},t);return r}function convertFeature(e,t,r){if(null!==t.geometry){var o,a,i,n,u=t.geometry,c=u.type,l=u.coordinates,s=t.properties,p=t.id;if("Point"===c)e.push(createFeature(s,1,[projectPoint(l)],p));else if("MultiPoint"===c)e.push(createFeature(s,1,project(l),p));else if("LineString"===c)e.push(createFeature(s,2,[project(l,r)],p));else if("MultiLineString"===c||"Polygon"===c){for(i=[],o=0;o<l.length;o++)n=project(l[o],r),"Polygon"===c&&(n.outer=0===o),i.push(n);e.push(createFeature(s,"Polygon"===c?3:2,i,p));}else if("MultiPolygon"===c){for(i=[],o=0;o<l.length;o++)for(a=0;a<l[o].length;a++)n=project(l[o][a],r),n.outer=0===a,i.push(n);e.push(createFeature(s,3,i,p));}else{if("GeometryCollection"!==c)throw new Error("Input data is not a valid GeoJSON object.");for(o=0;o<u.geometries.length;o++)convertFeature(e,{geometry:u.geometries[o],properties:s},r);}}}function project(e,t){for(var r=[],o=0;o<e.length;o++)r.push(projectPoint(e[o]));return t&&(simplify(r,t),calcSize(r)),r}function projectPoint(e){var t=Math.sin(e[1]*Math.PI/180),r=e[0]/360+.5,o=.5-.25*Math.log((1+t)/(1-t))/Math.PI;return o=o<0?0:o>1?1:o,[r,o,0]}function calcSize(e){for(var t,r,o=0,a=0,i=0;i<e.length-1;i++)t=r||e[i],r=e[i+1],o+=t[0]*r[1]-r[0]*t[1],a+=Math.abs(r[0]-t[0])+Math.abs(r[1]-t[1]);e.area=Math.abs(o/2),e.dist=a;}module.exports=convert;var simplify=_dereq_("./simplify"),createFeature=_dereq_("./feature");
; |
37 | },{"./feature":10,"./simplify":12}],10:[function(_dereq_,module,exports){
|
38 | function createFeature(e,t,a,n){var r={id:n||null,type:t,geometry:a,tags:e||null,min:[1/0,1/0],max:[-(1/0),-(1/0)]};return calcBBox(r),r}function calcBBox(e){var t=e.geometry,a=e.min,n=e.max;if(1===e.type)calcRingBBox(a,n,t);else for(var r=0;r<t.length;r++)calcRingBBox(a,n,t[r]);return e}function calcRingBBox(e,t,a){for(var n,r=0;r<a.length;r++)n=a[r],e[0]=Math.min(n[0],e[0]),t[0]=Math.max(n[0],t[0]),e[1]=Math.min(n[1],e[1]),t[1]=Math.max(n[1],t[1]);}module.exports=createFeature;
; |
39 | },{}],11:[function(_dereq_,module,exports){
|
40 | function geojsonvt(e,t){return new GeoJSONVT(e,t)}function GeoJSONVT(e,t){t=this.options=extend(Object.create(this.options),t);var i=t.debug;i&&console.time("preprocess data");var o=1<<t.maxZoom,n=convert(e,t.tolerance/(o*t.extent));this.tiles={},this.tileCoords=[],i&&(console.timeEnd("preprocess data"),console.log("index: maxZoom: %d, maxPoints: %d",t.indexMaxZoom,t.indexMaxPoints),console.time("generate tiles"),this.stats={},this.total=0),n=wrap(n,t.buffer/t.extent,intersectX),n.length&&this.splitTile(n,0,0,0),i&&(n.length&&console.log("features: %d, points: %d",this.tiles[0].numFeatures,this.tiles[0].numPoints),console.timeEnd("generate tiles"),console.log("tiles generated:",this.total,JSON.stringify(this.stats)));}function toID(e,t,i){return 32*((1<<e)*i+t)+e}function intersectX(e,t,i){return[i,(i-e[0])*(t[1]-e[1])/(t[0]-e[0])+e[1],1]}function intersectY(e,t,i){return[(i-e[1])*(t[0]-e[0])/(t[1]-e[1])+e[0],i,1]}function extend(e,t){for(var i in t)e[i]=t[i];return e}function isClippedSquare(e,t,i){var o=e.source;if(1!==o.length)return!1;var n=o[0];if(3!==n.type||n.geometry.length>1)return!1;var r=n.geometry[0].length;if(5!==r)return!1;for(var s=0;s<r;s++){var l=transform.point(n.geometry[0][s],t,e.z2,e.x,e.y);if(l[0]!==-i&&l[0]!==t+i||l[1]!==-i&&l[1]!==t+i)return!1}return!0}module.exports=geojsonvt;var convert=_dereq_("./convert"),transform=_dereq_("./transform"),clip=_dereq_("./clip"),wrap=_dereq_("./wrap"),createTile=_dereq_("./tile");GeoJSONVT.prototype.options={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,solidChildren:!1,tolerance:3,extent:4096,buffer:64,debug:0},GeoJSONVT.prototype.splitTile=function(e,t,i,o,n,r,s){for(var l=[e,t,i,o],a=this.options,u=a.debug,c=null;l.length;){o=l.pop(),i=l.pop(),t=l.pop(),e=l.pop();var p=1<<t,d=toID(t,i,o),m=this.tiles[d],f=t===a.maxZoom?0:a.tolerance/(p*a.extent);if(!m&&(u>1&&console.time("creation"),m=this.tiles[d]=createTile(e,p,i,o,f,t===a.maxZoom),this.tileCoords.push({z:t,x:i,y:o}),u)){u>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",t,i,o,m.numFeatures,m.numPoints,m.numSimplified),console.timeEnd("creation"));var h="z"+t;this.stats[h]=(this.stats[h]||0)+1,this.total++;}if(m.source=e,n){if(t===a.maxZoom||t===n)continue;var x=1<<n-t;if(i!==Math.floor(r/x)||o!==Math.floor(s/x))continue}else if(t===a.indexMaxZoom||m.numPoints<=a.indexMaxPoints)continue;if(a.solidChildren||!isClippedSquare(m,a.extent,a.buffer)){m.source=null,u>1&&console.time("clipping");var g,v,M,T,b,y,S=.5*a.buffer/a.extent,Z=.5-S,q=.5+S,w=1+S;g=v=M=T=null,b=clip(e,p,i-S,i+q,0,intersectX,m.min[0],m.max[0]),y=clip(e,p,i+Z,i+w,0,intersectX,m.min[0],m.max[0]),b&&(g=clip(b,p,o-S,o+q,1,intersectY,m.min[1],m.max[1]),v=clip(b,p,o+Z,o+w,1,intersectY,m.min[1],m.max[1])),y&&(M=clip(y,p,o-S,o+q,1,intersectY,m.min[1],m.max[1]),T=clip(y,p,o+Z,o+w,1,intersectY,m.min[1],m.max[1])),u>1&&console.timeEnd("clipping"),e.length&&(l.push(g||[],t+1,2*i,2*o),l.push(v||[],t+1,2*i,2*o+1),l.push(M||[],t+1,2*i+1,2*o),l.push(T||[],t+1,2*i+1,2*o+1));}else n&&(c=t);}return c},GeoJSONVT.prototype.getTile=function(e,t,i){var o=this.options,n=o.extent,r=o.debug,s=1<<e;t=(t%s+s)%s;var l=toID(e,t,i);if(this.tiles[l])return transform.tile(this.tiles[l],n);r>1&&console.log("drilling down to z%d-%d-%d",e,t,i);for(var a,u=e,c=t,p=i;!a&&u>0;)u--,c=Math.floor(c/2),p=Math.floor(p/2),a=this.tiles[toID(u,c,p)];if(!a||!a.source)return null;if(r>1&&console.log("found parent tile z%d-%d-%d",u,c,p),isClippedSquare(a,n,o.buffer))return transform.tile(a,n);r>1&&console.time("drilling down");var d=this.splitTile(a.source,u,c,p,e,t,i);if(r>1&&console.timeEnd("drilling down"),null!==d){var m=1<<e-d;l=toID(d,Math.floor(t/m),Math.floor(i/m));}return this.tiles[l]?transform.tile(this.tiles[l],n):null};
; |
41 | },{"./clip":8,"./convert":9,"./tile":13,"./transform":14,"./wrap":15}],12:[function(_dereq_,module,exports){
|
42 | function simplify(t,i){var e,p,r,s,o=i*i,f=t.length,u=0,n=f-1,g=[];for(t[u][2]=1,t[n][2]=1;n;){for(p=0,e=u+1;e<n;e++)r=getSqSegDist(t[e],t[u],t[n]),r>p&&(s=e,p=r);p>o?(t[s][2]=p,g.push(u),g.push(s),u=s):(n=g.pop(),u=g.pop());}}function getSqSegDist(t,i,e){var p=i[0],r=i[1],s=e[0],o=e[1],f=t[0],u=t[1],n=s-p,g=o-r;if(0!==n||0!==g){var l=((f-p)*n+(u-r)*g)/(n*n+g*g);l>1?(p=s,r=o):l>0&&(p+=n*l,r+=g*l);}return n=f-p,g=u-r,n*n+g*g}module.exports=simplify;
; |
43 | },{}],13:[function(_dereq_,module,exports){
|
44 | function createTile(e,n,r,i,t,u){for(var a={features:[],numPoints:0,numSimplified:0,numFeatures:0,source:null,x:r,y:i,z2:n,transformed:!1,min:[2,1],max:[-1,0]},m=0;m<e.length;m++){a.numFeatures++,addFeature(a,e[m],t,u);var s=e[m].min,l=e[m].max;s[0]<a.min[0]&&(a.min[0]=s[0]),s[1]<a.min[1]&&(a.min[1]=s[1]),l[0]>a.max[0]&&(a.max[0]=l[0]),l[1]>a.max[1]&&(a.max[1]=l[1]);}return a}function addFeature(e,n,r,i){var t,u,a,m,s=n.geometry,l=n.type,o=[],f=r*r;if(1===l)for(t=0;t<s.length;t++)o.push(s[t]),e.numPoints++,e.numSimplified++;else for(t=0;t<s.length;t++)if(a=s[t],i||!(2===l&&a.dist<r||3===l&&a.area<f)){var d=[];for(u=0;u<a.length;u++)m=a[u],(i||m[2]>f)&&(d.push(m),e.numSimplified++),e.numPoints++;3===l&&rewind(d,a.outer),o.push(d);}else e.numPoints+=a.length;if(o.length){var g={geometry:o,type:l,tags:n.tags||null};null!==n.id&&(g.id=n.id),e.features.push(g);}}function rewind(e,n){var r=signedArea(e);r<0===n&&e.reverse();}function signedArea(e){for(var n,r,i=0,t=0,u=e.length,a=u-1;t<u;a=t++)n=e[t],r=e[a],i+=(r[0]-n[0])*(n[1]+r[1]);return i}module.exports=createTile;
; |
45 | },{}],14:[function(_dereq_,module,exports){
|
46 | function transformTile(r,t){if(r.transformed)return r;var n,e,o,f=r.z2,a=r.x,s=r.y;for(n=0;n<r.features.length;n++){var i=r.features[n],u=i.geometry,m=i.type;if(1===m)for(e=0;e<u.length;e++)u[e]=transformPoint(u[e],t,f,a,s);else for(e=0;e<u.length;e++){var l=u[e];for(o=0;o<l.length;o++)l[o]=transformPoint(l[o],t,f,a,s);}}return r.transformed=!0,r}function transformPoint(r,t,n,e,o){var f=Math.round(t*(r[0]*n-e)),a=Math.round(t*(r[1]*n-o));return[f,a]}exports.tile=transformTile,exports.point=transformPoint;
; |
47 | },{}],15:[function(_dereq_,module,exports){
|
48 | function wrap(r,e,t){var o=r,a=clip(r,1,-1-e,e,0,t,-1,2),s=clip(r,1,1-e,2+e,0,t,-1,2);return(a||s)&&(o=clip(r,1,-e,1+e,0,t,-1,2)||[],a&&(o=shiftFeatureCoords(a,1).concat(o)),s&&(o=o.concat(shiftFeatureCoords(s,-1)))),o}function shiftFeatureCoords(r,e){for(var t=[],o=0;o<r.length;o++){var a,s=r[o],i=s.type;if(1===i)a=shiftCoords(s.geometry,e);else{a=[];for(var u=0;u<s.geometry.length;u++)a.push(shiftCoords(s.geometry[u],e));}t.push(createFeature(s.tags,i,a,s.id));}return t}function shiftCoords(r,e){var t=[];t.area=r.area,t.dist=r.dist;for(var o=0;o<r.length;o++)t.push([r[o][0]+e,r[o][1],r[o][2]]);return t}var clip=_dereq_("./clip"),createFeature=_dereq_("./feature");module.exports=wrap;
; |
49 | },{"./clip":8,"./feature":10}],16:[function(_dereq_,module,exports){
|
50 | function GridIndex(t,r,e){var s=this.cells=[];if(t instanceof ArrayBuffer){this.arrayBuffer=t;var i=new Int32Array(this.arrayBuffer);t=i[0],r=i[1],e=i[2],this.d=r+2*e;for(var h=0;h<this.d*this.d;h++){var n=i[NUM_PARAMS+h],o=i[NUM_PARAMS+h+1];s.push(n===o?null:i.subarray(n,o));}var l=i[NUM_PARAMS+s.length],a=i[NUM_PARAMS+s.length+1];this.keys=i.subarray(l,a),this.bboxes=i.subarray(a),this.insert=this._insertReadonly;}else{this.d=r+2*e;for(var d=0;d<this.d*this.d;d++)s.push([]);this.keys=[],this.bboxes=[];}this.n=r,this.extent=t,this.padding=e,this.scale=r/t,this.uid=0;var f=e/r*t;this.min=-f,this.max=t+f;}module.exports=GridIndex;var NUM_PARAMS=3;GridIndex.prototype.insert=function(t,r,e,s,i){this._forEachCell(r,e,s,i,this._insertCell,this.uid++),this.keys.push(t),this.bboxes.push(r),this.bboxes.push(e),this.bboxes.push(s),this.bboxes.push(i);},GridIndex.prototype._insertReadonly=function(){throw"Cannot insert into a GridIndex created from an ArrayBuffer."},GridIndex.prototype._insertCell=function(t,r,e,s,i,h){this.cells[i].push(h);},GridIndex.prototype.query=function(t,r,e,s){var i=this.min,h=this.max;if(t<=i&&r<=i&&h<=e&&h<=s)return Array.prototype.slice.call(this.keys);var n=[],o={};return this._forEachCell(t,r,e,s,this._queryCell,n,o),n},GridIndex.prototype._queryCell=function(t,r,e,s,i,h,n){var o=this.cells[i];if(null!==o)for(var l=this.keys,a=this.bboxes,d=0;d<o.length;d++){var f=o[d];if(void 0===n[f]){var u=4*f;t<=a[u+2]&&r<=a[u+3]&&e>=a[u+0]&&s>=a[u+1]?(n[f]=!0,h.push(l[f])):n[f]=!1;}}},GridIndex.prototype._forEachCell=function(t,r,e,s,i,h,n){for(var o=this._convertToCellCoord(t),l=this._convertToCellCoord(r),a=this._convertToCellCoord(e),d=this._convertToCellCoord(s),f=o;f<=a;f++)for(var u=l;u<=d;u++){var y=this.d*u+f;if(i.call(this,t,r,e,s,y,h,n))return}},GridIndex.prototype._convertToCellCoord=function(t){return Math.max(0,Math.min(this.d-1,Math.floor(t*this.scale)+this.padding))},GridIndex.prototype.toArrayBuffer=function(){if(this.arrayBuffer)return this.arrayBuffer;for(var t=this.cells,r=NUM_PARAMS+this.cells.length+1+1,e=0,s=0;s<this.cells.length;s++)e+=this.cells[s].length;var i=new Int32Array(r+e+this.keys.length+this.bboxes.length);i[0]=this.extent,i[1]=this.n,i[2]=this.padding;for(var h=r,n=0;n<t.length;n++){var o=t[n];i[NUM_PARAMS+n]=h,i.set(o,h),h+=o.length;}return i[NUM_PARAMS+t.length]=h,i.set(this.keys,h),h+=this.keys.length,i[NUM_PARAMS+t.length+1]=h,i.set(this.bboxes,h),h+=this.bboxes.length,i.buffer};
; |
51 | },{}],17:[function(_dereq_,module,exports){
|
52 | exports.read=function(a,o,t,r,h){var M,p,w=8*h-r-1,f=(1<<w)-1,e=f>>1,i=-7,N=t?h-1:0,n=t?-1:1,s=a[o+N];for(N+=n,M=s&(1<<-i)-1,s>>=-i,i+=w;i>0;M=256*M+a[o+N],N+=n,i-=8);for(p=M&(1<<-i)-1,M>>=-i,i+=r;i>0;p=256*p+a[o+N],N+=n,i-=8);if(0===M)M=1-e;else{if(M===f)return p?NaN:(s?-1:1)*(1/0);p+=Math.pow(2,r),M-=e;}return(s?-1:1)*p*Math.pow(2,M-r)},exports.write=function(a,o,t,r,h,M){var p,w,f,e=8*M-h-1,i=(1<<e)-1,N=i>>1,n=23===h?Math.pow(2,-24)-Math.pow(2,-77):0,s=r?0:M-1,u=r?1:-1,l=o<0||0===o&&1/o<0?1:0;for(o=Math.abs(o),isNaN(o)||o===1/0?(w=isNaN(o)?1:0,p=i):(p=Math.floor(Math.log(o)/Math.LN2),o*(f=Math.pow(2,-p))<1&&(p--,f*=2),o+=p+N>=1?n/f:n*Math.pow(2,1-N),o*f>=2&&(p++,f/=2),p+N>=i?(w=0,p=i):p+N>=1?(w=(o*f-1)*Math.pow(2,h),p+=N):(w=o*Math.pow(2,N-1)*Math.pow(2,h),p=0));h>=8;a[t+s]=255&w,s+=u,w/=256,h-=8);for(p=p<<h|w,e+=h;e>0;a[t+s]=255&p,s+=u,p/=256,e-=8);a[t+s-u]|=128*l;};
|
53 | },{}],18:[function(_dereq_,module,exports){
|
54 | function kdbush(t,i,e,s,n){return new KDBush(t,i,e,s,n)}function KDBush(t,i,e,s,n){i=i||defaultGetX,e=e||defaultGetY,n=n||Array,this.nodeSize=s||64,this.points=t,this.ids=new n(t.length),this.coords=new n(2*t.length);for(var r=0;r<t.length;r++)this.ids[r]=r,this.coords[2*r]=i(t[r]),this.coords[2*r+1]=e(t[r]);sort(this.ids,this.coords,this.nodeSize,0,this.ids.length-1,0);}function defaultGetX(t){return t[0]}function defaultGetY(t){return t[1]}var sort=_dereq_("./sort"),range=_dereq_("./range"),within=_dereq_("./within");module.exports=kdbush,KDBush.prototype={range:function(t,i,e,s){return range(this.ids,this.coords,t,i,e,s,this.nodeSize)},within:function(t,i,e){return within(this.ids,this.coords,t,i,e,this.nodeSize)}};
; |
55 | },{"./range":19,"./sort":20,"./within":21}],19:[function(_dereq_,module,exports){
|
56 | function range(p,r,s,u,h,e,o){for(var a,t,n=[0,p.length-1,0],f=[];n.length;){var l=n.pop(),v=n.pop(),g=n.pop();if(v-g<=o)for(var i=g;i<=v;i++)a=r[2*i],t=r[2*i+1],a>=s&&a<=h&&t>=u&&t<=e&&f.push(p[i]);else{var c=Math.floor((g+v)/2);a=r[2*c],t=r[2*c+1],a>=s&&a<=h&&t>=u&&t<=e&&f.push(p[c]);var d=(l+1)%2;(0===l?s<=a:u<=t)&&(n.push(g),n.push(c-1),n.push(d)),(0===l?h>=a:e>=t)&&(n.push(c+1),n.push(v),n.push(d));}}return f}module.exports=range;
; |
57 | },{}],20:[function(_dereq_,module,exports){
|
58 | function sortKD(t,a,o,s,r,e){if(!(r-s<=o)){var f=Math.floor((s+r)/2);select(t,a,f,s,r,e%2),sortKD(t,a,o,s,f-1,e+1),sortKD(t,a,o,f+1,r,e+1);}}function select(t,a,o,s,r,e){for(;r>s;){if(r-s>600){var f=r-s+1,p=o-s+1,w=Math.log(f),m=.5*Math.exp(2*w/3),n=.5*Math.sqrt(w*m*(f-m)/f)*(p-f/2<0?-1:1),c=Math.max(s,Math.floor(o-p*m/f+n)),h=Math.min(r,Math.floor(o+(f-p)*m/f+n));select(t,a,o,c,h,e);}var i=a[2*o+e],l=s,M=r;for(swapItem(t,a,s,o),a[2*r+e]>i&&swapItem(t,a,s,r);l<M;){for(swapItem(t,a,l,M),l++,M--;a[2*l+e]<i;)l++;for(;a[2*M+e]>i;)M--;}a[2*s+e]===i?swapItem(t,a,s,M):(M++,swapItem(t,a,M,r)),M<=o&&(s=M+1),o<=M&&(r=M-1);}}function swapItem(t,a,o,s){swap(t,o,s),swap(a,2*o,2*s),swap(a,2*o+1,2*s+1);}function swap(t,a,o){var s=t[a];t[a]=t[o],t[o]=s;}module.exports=sortKD;
; |
59 | },{}],21:[function(_dereq_,module,exports){
|
60 | function within(s,p,r,t,u,h){for(var i=[0,s.length-1,0],o=[],n=u*u;i.length;){var e=i.pop(),a=i.pop(),f=i.pop();if(a-f<=h)for(var v=f;v<=a;v++)sqDist(p[2*v],p[2*v+1],r,t)<=n&&o.push(s[v]);else{var l=Math.floor((f+a)/2),c=p[2*l],q=p[2*l+1];sqDist(c,q,r,t)<=n&&o.push(s[l]);var D=(e+1)%2;(0===e?r-u<=c:t-u<=q)&&(i.push(f),i.push(l-1),i.push(D)),(0===e?r+u>=c:t+u>=q)&&(i.push(l+1),i.push(a),i.push(D));}}return o}function sqDist(s,p,r,t){var u=s-r,h=p-t;return u*u+h*h}module.exports=within;
; |
61 | },{}],22:[function(_dereq_,module,exports){
|
62 | function isSupported(e){return!!(isBrowser()&&isArraySupported()&&isFunctionSupported()&&isObjectSupported()&&isJSONSupported()&&isWorkerSupported()&&isUint8ClampedArraySupported()&&isWebGLSupportedCached(e&&e.failIfMajorPerformanceCaveat))}function isBrowser(){return"undefined"!=typeof window&&"undefined"!=typeof document}function isArraySupported(){return Array.prototype&&Array.prototype.every&&Array.prototype.filter&&Array.prototype.forEach&&Array.prototype.indexOf&&Array.prototype.lastIndexOf&&Array.prototype.map&&Array.prototype.some&&Array.prototype.reduce&&Array.prototype.reduceRight&&Array.isArray}function isFunctionSupported(){return Function.prototype&&Function.prototype.bind}function isObjectSupported(){return Object.keys&&Object.create&&Object.getPrototypeOf&&Object.getOwnPropertyNames&&Object.isSealed&&Object.isFrozen&&Object.isExtensible&&Object.getOwnPropertyDescriptor&&Object.defineProperty&&Object.defineProperties&&Object.seal&&Object.freeze&&Object.preventExtensions}function isJSONSupported(){return"JSON"in window&&"parse"in JSON&&"stringify"in JSON}function isWorkerSupported(){return"Worker"in window}function isUint8ClampedArraySupported(){return"Uint8ClampedArray"in window}function isWebGLSupportedCached(e){return void 0===isWebGLSupportedCache[e]&&(isWebGLSupportedCache[e]=isWebGLSupported(e)),isWebGLSupportedCache[e]}function isWebGLSupported(e){var t=document.createElement("canvas"),r=Object.create(isSupported.webGLContextAttributes);return r.failIfMajorPerformanceCaveat=e,t.probablySupportsContext?t.probablySupportsContext("webgl",r)||t.probablySupportsContext("experimental-webgl",r):t.supportsContext?t.supportsContext("webgl",r)||t.supportsContext("experimental-webgl",r):t.getContext("webgl",r)||t.getContext("experimental-webgl",r)}"undefined"!=typeof module&&module.exports?module.exports=isSupported:window&&(window.mapboxgl=window.mapboxgl||{},window.mapboxgl.supported=isSupported);var isWebGLSupportedCache={};isSupported.webGLContextAttributes={antialias:!1,alpha:!0,stencil:!0,depth:!0};
; |
63 | },{}],23:[function(_dereq_,module,exports){
|
64 | (function (process){
|
65 | function normalizeArray(r,t){for(var e=0,n=r.length-1;n>=0;n--){var s=r[n];"."===s?r.splice(n,1):".."===s?(r.splice(n,1),e++):e&&(r.splice(n,1),e--);}if(t)for(;e--;e)r.unshift("..");return r}function filter(r,t){if(r.filter)return r.filter(t);for(var e=[],n=0;n<r.length;n++)t(r[n],n,r)&&e.push(r[n]);return e}var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,splitPath=function(r){return splitPathRe.exec(r).slice(1)};exports.resolve=function(){for(var r="",t=!1,e=arguments.length-1;e>=-1&&!t;e--){var n=e>=0?arguments[e]:process.cwd();if("string"!=typeof n)throw new TypeError("Arguments to path.resolve must be strings");n&&(r=n+"/"+r,t="/"===n.charAt(0));}return r=normalizeArray(filter(r.split("/"),function(r){return!!r}),!t).join("/"),(t?"/":"")+r||"."},exports.normalize=function(r){var t=exports.isAbsolute(r),e="/"===substr(r,-1);return r=normalizeArray(filter(r.split("/"),function(r){return!!r}),!t).join("/"),r||t||(r="."),r&&e&&(r+="/"),(t?"/":"")+r},exports.isAbsolute=function(r){return"/"===r.charAt(0)},exports.join=function(){var r=Array.prototype.slice.call(arguments,0);return exports.normalize(filter(r,function(r,t){if("string"!=typeof r)throw new TypeError("Arguments to path.join must be strings");return r}).join("/"))},exports.relative=function(r,t){function e(r){for(var t=0;t<r.length&&""===r[t];t++);for(var e=r.length-1;e>=0&&""===r[e];e--);return t>e?[]:r.slice(t,e-t+1)}r=exports.resolve(r).substr(1),t=exports.resolve(t).substr(1);for(var n=e(r.split("/")),s=e(t.split("/")),i=Math.min(n.length,s.length),o=i,u=0;u<i;u++)if(n[u]!==s[u]){o=u;break}for(var l=[],u=o;u<n.length;u++)l.push("..");return l=l.concat(s.slice(o)),l.join("/")},exports.sep="/",exports.delimiter=":",exports.dirname=function(r){var t=splitPath(r),e=t[0],n=t[1];return e||n?(n&&(n=n.substr(0,n.length-1)),e+n):"."},exports.basename=function(r,t){var e=splitPath(r)[2];return t&&e.substr(-1*t.length)===t&&(e=e.substr(0,e.length-t.length)),e},exports.extname=function(r){return splitPath(r)[3]};var substr="b"==="ab".substr(-1)?function(r,t,e){return r.substr(t,e)}:function(r,t,e){return t<0&&(t=r.length+t),r.substr(t,e)};
|
66 | }).call(this,_dereq_('_process'));
|
67 |
|
68 | },{"_process":27}],24:[function(_dereq_,module,exports){
|
69 | function Buffer(t){var e;t&&t.length&&(e=t,t=e.length);var r=new Uint8Array(t||0);return e&&r.set(e),r.readUInt32LE=BufferMethods.readUInt32LE,r.writeUInt32LE=BufferMethods.writeUInt32LE,r.readInt32LE=BufferMethods.readInt32LE,r.writeInt32LE=BufferMethods.writeInt32LE,r.readFloatLE=BufferMethods.readFloatLE,r.writeFloatLE=BufferMethods.writeFloatLE,r.readDoubleLE=BufferMethods.readDoubleLE,r.writeDoubleLE=BufferMethods.writeDoubleLE,r.toString=BufferMethods.toString,r.write=BufferMethods.write,r.slice=BufferMethods.slice,r.copy=BufferMethods.copy,r._isBuffer=!0,r}function encodeString(t){for(var e,r,n=t.length,i=[],o=0;o<n;o++){if(e=t.charCodeAt(o),e>55295&&e<57344){if(!r){e>56319||o+1===n?i.push(239,191,189):r=e;continue}if(e<56320){i.push(239,191,189),r=e;continue}e=r-55296<<10|e-56320|65536,r=null;}else r&&(i.push(239,191,189),r=null);e<128?i.push(e):e<2048?i.push(e>>6|192,63&e|128):e<65536?i.push(e>>12|224,e>>6&63|128,63&e|128):i.push(e>>18|240,e>>12&63|128,e>>6&63|128,63&e|128);}return i}module.exports=Buffer;var ieee754=_dereq_("ieee754"),BufferMethods,lastStr,lastStrEncoded;BufferMethods={readUInt32LE:function(t){return(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},writeUInt32LE:function(t,e){this[e]=t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24;},readInt32LE:function(t){return(this[t]|this[t+1]<<8|this[t+2]<<16)+(this[t+3]<<24)},readFloatLE:function(t){return ieee754.read(this,t,!0,23,4)},readDoubleLE:function(t){return ieee754.read(this,t,!0,52,8)},writeFloatLE:function(t,e){return ieee754.write(this,t,e,!0,23,4)},writeDoubleLE:function(t,e){return ieee754.write(this,t,e,!0,52,8)},toString:function(t,e,r){var n="",i="";e=e||0,r=Math.min(this.length,r||this.length);for(var o=e;o<r;o++){var u=this[o];u<=127?(n+=decodeURIComponent(i)+String.fromCharCode(u),i=""):i+="%"+u.toString(16);}return n+=decodeURIComponent(i)},write:function(t,e){for(var r=t===lastStr?lastStrEncoded:encodeString(t),n=0;n<r.length;n++)this[e+n]=r[n];},slice:function(t,e){return this.subarray(t,e)},copy:function(t,e){e=e||0;for(var r=0;r<this.length;r++)t[e+r]=this[r];}},BufferMethods.writeInt32LE=BufferMethods.writeUInt32LE,Buffer.byteLength=function(t){return lastStr=t,lastStrEncoded=encodeString(t),lastStrEncoded.length},Buffer.isBuffer=function(t){return!(!t||!t._isBuffer)};
; |
70 | },{"ieee754":17}],25:[function(_dereq_,module,exports){
|
71 | (function (global){
|
72 | function Pbf(t){this.buf=Buffer.isBuffer(t)?t:new Buffer(t||0),this.pos=0,this.length=this.buf.length;}function readVarintRemainder(t,i){var e,r=i.buf;if(e=r[i.pos++],t+=268435456*(127&e),e<128)return t;if(e=r[i.pos++],t+=34359738368*(127&e),e<128)return t;if(e=r[i.pos++],t+=4398046511104*(127&e),e<128)return t;if(e=r[i.pos++],t+=562949953421312*(127&e),e<128)return t;if(e=r[i.pos++],t+=72057594037927940*(127&e),e<128)return t;if(e=r[i.pos++],t+=0x8000000000000000*(127&e),e<128)return t;throw new Error("Expected varint not more than 10 bytes")}function writeBigVarint(t,i){i.realloc(10);for(var e=i.pos+10;t>=1;){if(i.pos>=e)throw new Error("Given varint doesn't fit into 10 bytes");var r=255&t;i.buf[i.pos++]=r|(t>=128?128:0),t/=128;}}function reallocForRawMessage(t,i,e){var r=i<=16383?1:i<=2097151?2:i<=268435455?3:Math.ceil(Math.log(i)/(7*Math.LN2));e.realloc(r);for(var s=e.pos-1;s>=t;s--)e.buf[s+r]=e.buf[s];}function writePackedVarint(t,i){for(var e=0;e<t.length;e++)i.writeVarint(t[e]);}function writePackedSVarint(t,i){for(var e=0;e<t.length;e++)i.writeSVarint(t[e]);}function writePackedFloat(t,i){for(var e=0;e<t.length;e++)i.writeFloat(t[e]);}function writePackedDouble(t,i){for(var e=0;e<t.length;e++)i.writeDouble(t[e]);}function writePackedBoolean(t,i){for(var e=0;e<t.length;e++)i.writeBoolean(t[e]);}function writePackedFixed32(t,i){for(var e=0;e<t.length;e++)i.writeFixed32(t[e]);}function writePackedSFixed32(t,i){for(var e=0;e<t.length;e++)i.writeSFixed32(t[e]);}function writePackedFixed64(t,i){for(var e=0;e<t.length;e++)i.writeFixed64(t[e]);}function writePackedSFixed64(t,i){for(var e=0;e<t.length;e++)i.writeSFixed64(t[e]);}module.exports=Pbf;var Buffer=global.Buffer||_dereq_("./buffer");Pbf.Varint=0,Pbf.Fixed64=1,Pbf.Bytes=2,Pbf.Fixed32=5;var SHIFT_LEFT_32=4294967296,SHIFT_RIGHT_32=1/SHIFT_LEFT_32,POW_2_63=Math.pow(2,63);Pbf.prototype={destroy:function(){this.buf=null;},readFields:function(t,i,e){for(e=e||this.length;this.pos<e;){var r=this.readVarint(),s=r>>3,n=this.pos;t(s,i,this),this.pos===n&&this.skip(r);}return i},readMessage:function(t,i){return this.readFields(t,i,this.readVarint()+this.pos)},readFixed32:function(){var t=this.buf.readUInt32LE(this.pos);return this.pos+=4,t},readSFixed32:function(){var t=this.buf.readInt32LE(this.pos);return this.pos+=4,t},readFixed64:function(){var t=this.buf.readUInt32LE(this.pos)+this.buf.readUInt32LE(this.pos+4)*SHIFT_LEFT_32;return this.pos+=8,t},readSFixed64:function(){var t=this.buf.readUInt32LE(this.pos)+this.buf.readInt32LE(this.pos+4)*SHIFT_LEFT_32;return this.pos+=8,t},readFloat:function(){var t=this.buf.readFloatLE(this.pos);return this.pos+=4,t},readDouble:function(){var t=this.buf.readDoubleLE(this.pos);return this.pos+=8,t},readVarint:function(){var t,i,e=this.buf;return i=e[this.pos++],t=127&i,i<128?t:(i=e[this.pos++],t|=(127&i)<<7,i<128?t:(i=e[this.pos++],t|=(127&i)<<14,i<128?t:(i=e[this.pos++],t|=(127&i)<<21,i<128?t:readVarintRemainder(t,this))))},readVarint64:function(){var t=this.pos,i=this.readVarint();if(i<POW_2_63)return i;for(var e=this.pos-2;255===this.buf[e];)e--;e<t&&(e=t),i=0;for(var r=0;r<e-t+1;r++){var s=127&~this.buf[t+r];i+=r<4?s<<7*r:s*Math.pow(2,7*r);}return-i-1},readSVarint:function(){var t=this.readVarint();return t%2===1?(t+1)/-2:t/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var t=this.readVarint()+this.pos,i=this.buf.toString("utf8",this.pos,t);return this.pos=t,i},readBytes:function(){var t=this.readVarint()+this.pos,i=this.buf.slice(this.pos,t);return this.pos=t,i},readPackedVarint:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readVarint());return i},readPackedSVarint:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readSVarint());return i},readPackedBoolean:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readBoolean());return i},readPackedFloat:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readFloat());return i},readPackedDouble:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readDouble());return i},readPackedFixed32:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readFixed32());return i},readPackedSFixed32:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readSFixed32());return i},readPackedFixed64:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readFixed64());return i},readPackedSFixed64:function(){for(var t=this.readVarint()+this.pos,i=[];this.pos<t;)i.push(this.readSFixed64());return i},skip:function(t){var i=7&t;if(i===Pbf.Varint)for(;this.buf[this.pos++]>127;);else if(i===Pbf.Bytes)this.pos=this.readVarint()+this.pos;else if(i===Pbf.Fixed32)this.pos+=4;else{if(i!==Pbf.Fixed64)throw new Error("Unimplemented type: "+i);this.pos+=8;}},writeTag:function(t,i){this.writeVarint(t<<3|i);},realloc:function(t){for(var i=this.length||16;i<this.pos+t;)i*=2;if(i!==this.length){var e=new Buffer(i);this.buf.copy(e),this.buf=e,this.length=i;}},finish:function(){return this.length=this.pos,this.pos=0,this.buf.slice(0,this.length)},writeFixed32:function(t){this.realloc(4),this.buf.writeUInt32LE(t,this.pos),this.pos+=4;},writeSFixed32:function(t){this.realloc(4),this.buf.writeInt32LE(t,this.pos),this.pos+=4;},writeFixed64:function(t){this.realloc(8),this.buf.writeInt32LE(t&-1,this.pos),this.buf.writeUInt32LE(Math.floor(t*SHIFT_RIGHT_32),this.pos+4),this.pos+=8;},writeSFixed64:function(t){this.realloc(8),this.buf.writeInt32LE(t&-1,this.pos),this.buf.writeInt32LE(Math.floor(t*SHIFT_RIGHT_32),this.pos+4),this.pos+=8;},writeVarint:function(t){return t=+t,t>268435455?void writeBigVarint(t,this):(this.realloc(4),this.buf[this.pos++]=127&t|(t>127?128:0),void(t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=t>>>7&127)))))},writeSVarint:function(t){this.writeVarint(t<0?2*-t-1:2*t);},writeBoolean:function(t){this.writeVarint(Boolean(t));},writeString:function(t){t=String(t);var i=Buffer.byteLength(t);this.writeVarint(i),this.realloc(i),this.buf.write(t,this.pos),this.pos+=i;},writeFloat:function(t){this.realloc(4),this.buf.writeFloatLE(t,this.pos),this.pos+=4;},writeDouble:function(t){this.realloc(8),this.buf.writeDoubleLE(t,this.pos),this.pos+=8;},writeBytes:function(t){var i=t.length;this.writeVarint(i),this.realloc(i);for(var e=0;e<i;e++)this.buf[this.pos++]=t[e];},writeRawMessage:function(t,i){this.pos++;var e=this.pos;t(i,this);var r=this.pos-e;r>=128&&reallocForRawMessage(e,r,this),this.pos=e-1,this.writeVarint(r),this.pos+=r;},writeMessage:function(t,i,e){this.writeTag(t,Pbf.Bytes),this.writeRawMessage(i,e);},writePackedVarint:function(t,i){this.writeMessage(t,writePackedVarint,i);},writePackedSVarint:function(t,i){this.writeMessage(t,writePackedSVarint,i);},writePackedBoolean:function(t,i){this.writeMessage(t,writePackedBoolean,i);},writePackedFloat:function(t,i){this.writeMessage(t,writePackedFloat,i);},writePackedDouble:function(t,i){this.writeMessage(t,writePackedDouble,i);},writePackedFixed32:function(t,i){this.writeMessage(t,writePackedFixed32,i);},writePackedSFixed32:function(t,i){this.writeMessage(t,writePackedSFixed32,i);},writePackedFixed64:function(t,i){this.writeMessage(t,writePackedFixed64,i);},writePackedSFixed64:function(t,i){this.writeMessage(t,writePackedSFixed64,i);},writeBytesField:function(t,i){this.writeTag(t,Pbf.Bytes),this.writeBytes(i);},writeFixed32Field:function(t,i){this.writeTag(t,Pbf.Fixed32),this.writeFixed32(i);},writeSFixed32Field:function(t,i){this.writeTag(t,Pbf.Fixed32),this.writeSFixed32(i);},writeFixed64Field:function(t,i){this.writeTag(t,Pbf.Fixed64),this.writeFixed64(i);},writeSFixed64Field:function(t,i){this.writeTag(t,Pbf.Fixed64),this.writeSFixed64(i);},writeVarintField:function(t,i){this.writeTag(t,Pbf.Varint),this.writeVarint(i);},writeSVarintField:function(t,i){this.writeTag(t,Pbf.Varint),this.writeSVarint(i);},writeStringField:function(t,i){this.writeTag(t,Pbf.Bytes),this.writeString(i);},writeFloatField:function(t,i){this.writeTag(t,Pbf.Fixed32),this.writeFloat(i);},writeDoubleField:function(t,i){this.writeTag(t,Pbf.Fixed64),this.writeDouble(i);},writeBooleanField:function(t,i){this.writeVarintField(t,Boolean(i));}};
; |
73 | }).call(this,typeof commonjsGlobal !== "undefined" ? commonjsGlobal : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {});
|
74 |
|
75 | },{"./buffer":24}],26:[function(_dereq_,module,exports){
|
76 | function Point(t,n){this.x=t,this.y=n;}module.exports=Point,Point.prototype={clone:function(){return new Point(this.x,this.y)},add:function(t){return this.clone()._add(t)},sub:function(t){return this.clone()._sub(t)},mult:function(t){return this.clone()._mult(t)},div:function(t){return this.clone()._div(t)},rotate:function(t){return this.clone()._rotate(t)},matMult:function(t){return this.clone()._matMult(t)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(t){return this.x===t.x&&this.y===t.y},dist:function(t){return Math.sqrt(this.distSqr(t))},distSqr:function(t){var n=t.x-this.x,i=t.y-this.y;return n*n+i*i},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(t){return Math.atan2(this.y-t.y,this.x-t.x)},angleWith:function(t){return this.angleWithSep(t.x,t.y)},angleWithSep:function(t,n){return Math.atan2(this.x*n-this.y*t,this.x*t+this.y*n)},_matMult:function(t){var n=t[0]*this.x+t[1]*this.y,i=t[2]*this.x+t[3]*this.y;return this.x=n,this.y=i,this},_add:function(t){return this.x+=t.x,this.y+=t.y,this},_sub:function(t){return this.x-=t.x,this.y-=t.y,this},_mult:function(t){return this.x*=t,this.y*=t,this},_div:function(t){return this.x/=t,this.y/=t,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var t=this.y;return this.y=this.x,this.x=-t,this},_rotate:function(t){var n=Math.cos(t),i=Math.sin(t),s=n*this.x-i*this.y,r=i*this.x+n*this.y;return this.x=s,this.y=r,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},Point.convert=function(t){return t instanceof Point?t:Array.isArray(t)?new Point(t[0],t[1]):t};
; |
77 | },{}],27:[function(_dereq_,module,exports){
|
78 | function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(e){if(cachedSetTimeout===setTimeout)return setTimeout(e,0);if((cachedSetTimeout===defaultSetTimout||!cachedSetTimeout)&&setTimeout)return cachedSetTimeout=setTimeout,setTimeout(e,0);try{return cachedSetTimeout(e,0)}catch(t){try{return cachedSetTimeout.call(null,e,0)}catch(t){return cachedSetTimeout.call(this,e,0)}}}function runClearTimeout(e){if(cachedClearTimeout===clearTimeout)return clearTimeout(e);if((cachedClearTimeout===defaultClearTimeout||!cachedClearTimeout)&&clearTimeout)return cachedClearTimeout=clearTimeout,clearTimeout(e);try{return cachedClearTimeout(e)}catch(t){try{return cachedClearTimeout.call(null,e)}catch(t){return cachedClearTimeout.call(this,e)}}}function cleanUpNextTick(){draining&¤tQueue&&(draining=!1,currentQueue.length?queue=currentQueue.concat(queue):queueIndex=-1,queue.length&&drainQueue());}function drainQueue(){if(!draining){var e=runTimeout(cleanUpNextTick);draining=!0;for(var t=queue.length;t;){for(currentQueue=queue,queue=[];++queueIndex<t;)currentQueue&¤tQueue[queueIndex].run();queueIndex=-1,t=queue.length;}currentQueue=null,draining=!1,runClearTimeout(e);}}function Item(e,t){this.fun=e,this.array=t;}function noop(){}var process=module.exports={},cachedSetTimeout,cachedClearTimeout;!function(){try{cachedSetTimeout="function"==typeof setTimeout?setTimeout:defaultSetTimout;}catch(e){cachedSetTimeout=defaultSetTimout;}try{cachedClearTimeout="function"==typeof clearTimeout?clearTimeout:defaultClearTimeout;}catch(e){cachedClearTimeout=defaultClearTimeout;}}();var queue=[],draining=!1,currentQueue,queueIndex=-1;process.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var u=1;u<arguments.length;u++)t[u-1]=arguments[u];queue.push(new Item(e,t)),1!==queue.length||draining||runTimeout(drainQueue);},Item.prototype.run=function(){this.fun.apply(null,this.array);},process.title="browser",process.browser=!0,process.env={},process.argv=[],process.version="",process.versions={},process.on=noop,process.addListener=noop,process.once=noop,process.off=noop,process.removeListener=noop,process.removeAllListeners=noop,process.emit=noop,process.binding=function(e){throw new Error("process.binding is not supported")},process.cwd=function(){return"/"},process.chdir=function(e){throw new Error("process.chdir is not supported")},process.umask=function(){return 0};
|
79 | },{}],28:[function(_dereq_,module,exports){
|
80 | function partialSort(a,t,r,o,p){for(r=r||0,o=o||a.length-1,p=p||defaultCompare;o>r;){if(o-r>600){var f=o-r+1,e=t-r+1,l=Math.log(f),s=.5*Math.exp(2*l/3),i=.5*Math.sqrt(l*s*(f-s)/f)*(e-f/2<0?-1:1),n=Math.max(r,Math.floor(t-e*s/f+i)),h=Math.min(o,Math.floor(t+(f-e)*s/f+i));partialSort(a,t,n,h,p);}var u=a[t],M=r,w=o;for(swap(a,r,t),p(a[o],u)>0&&swap(a,r,o);M<w;){for(swap(a,M,w),M++,w--;p(a[M],u)<0;)M++;for(;p(a[w],u)>0;)w--;}0===p(a[r],u)?swap(a,r,w):(w++,swap(a,w,o)),w<=t&&(r=w+1),t<=w&&(o=w-1);}}function swap(a,t,r){var o=a[t];a[t]=a[r],a[r]=o;}function defaultCompare(a,t){return a<t?-1:a>t?1:0}module.exports=partialSort;
; |
81 | },{}],29:[function(_dereq_,module,exports){
|
82 | function supercluster(t){return new SuperCluster(t)}function SuperCluster(t){this.options=extend(Object.create(this.options),t),this.trees=new Array(this.options.maxZoom+1);}function createCluster(t,e,o,n){return{x:t,y:e,zoom:1/0,id:n,numPoints:o}}function createPointCluster(t,e){var o=t.geometry.coordinates;return createCluster(lngX(o[0]),latY(o[1]),1,e)}function getClusterJSON(t){return{type:"Feature",properties:getClusterProperties(t),geometry:{type:"Point",coordinates:[xLng(t.x),yLat(t.y)]}}}function getClusterProperties(t){var e=t.numPoints,o=e>=1e4?Math.round(e/1e3)+"k":e>=1e3?Math.round(e/100)/10+"k":e;return{cluster:!0,point_count:e,point_count_abbreviated:o}}function lngX(t){return t/360+.5}function latY(t){var e=Math.sin(t*Math.PI/180),o=.5-.25*Math.log((1+e)/(1-e))/Math.PI;return o<0?0:o>1?1:o}function xLng(t){return 360*(t-.5)}function yLat(t){var e=(180-360*t)*Math.PI/180;return 360*Math.atan(Math.exp(e))/Math.PI-90}function extend(t,e){for(var o in e)t[o]=e[o];return t}function getX(t){return t.x}function getY(t){return t.y}var kdbush=_dereq_("kdbush");module.exports=supercluster,SuperCluster.prototype={options:{minZoom:0,maxZoom:16,radius:40,extent:512,nodeSize:64,log:!1},load:function(t){var e=this.options.log;e&&console.time("total time");var o="prepare "+t.length+" points";e&&console.time(o),this.points=t;var n=t.map(createPointCluster);e&&console.timeEnd(o);for(var r=this.options.maxZoom;r>=this.options.minZoom;r--){var i=+Date.now();this.trees[r+1]=kdbush(n,getX,getY,this.options.nodeSize,Float32Array),n=this._cluster(n,r),e&&console.log("z%d: %d clusters in %dms",r,n.length,+Date.now()-i);}return this.trees[this.options.minZoom]=kdbush(n,getX,getY,this.options.nodeSize,Float32Array),e&&console.timeEnd("total time"),this},getClusters:function(t,e){for(var o=this.trees[this._limitZoom(e)],n=o.range(lngX(t[0]),latY(t[3]),lngX(t[2]),latY(t[1])),r=[],i=0;i<n.length;i++){var s=o.points[n[i]];r.push(s.id!==-1?this.points[s.id]:getClusterJSON(s));}return r},getTile:function(t,e,o){var n=this.trees[this._limitZoom(t)],r=Math.pow(2,t),i=this.options.extent,s=this.options.radius,u=s/i,a=(o-u)/r,h=(o+1+u)/r,l={features:[]};return this._addTileFeatures(n.range((e-u)/r,a,(e+1+u)/r,h),n.points,e,o,r,l),0===e&&this._addTileFeatures(n.range(1-u/r,a,1,h),n.points,r,o,r,l),e===r-1&&this._addTileFeatures(n.range(0,a,u/r,h),n.points,-1,o,r,l),l.features.length?l:null},_addTileFeatures:function(t,e,o,n,r,i){for(var s=0;s<t.length;s++){var u=e[t[s]];i.features.push({type:1,geometry:[[Math.round(this.options.extent*(u.x*r-o)),Math.round(this.options.extent*(u.y*r-n))]],tags:u.id!==-1?this.points[u.id].properties:getClusterProperties(u)});}},_limitZoom:function(t){return Math.max(this.options.minZoom,Math.min(t,this.options.maxZoom+1))},_cluster:function(t,e){for(var o=[],n=this.options.radius/(this.options.extent*Math.pow(2,e)),r=0;r<t.length;r++){var i=t[r];if(!(i.zoom<=e)){i.zoom=e;for(var s=this.trees[e+1],u=s.within(i.x,i.y,n),a=!1,h=i.numPoints,l=i.x*h,p=i.y*h,m=0;m<u.length;m++){var c=s.points[u[m]];e<c.zoom&&(a=!0,c.zoom=e,l+=c.x*c.numPoints,p+=c.y*c.numPoints,h+=c.numPoints);}o.push(a?createCluster(l/h,p/h,h,-1):i);}}return o}};
; |
83 | },{"kdbush":18}],30:[function(_dereq_,module,exports){
|
84 | function TinyQueue(t,i){if(!(this instanceof TinyQueue))return new TinyQueue(t,i);if(this.data=t||[],this.length=this.data.length,this.compare=i||defaultCompare,t)for(var a=Math.floor(this.length/2);a>=0;a--)this._down(a);}function defaultCompare(t,i){return t<i?-1:t>i?1:0}function swap(t,i,a){var n=t[i];t[i]=t[a],t[a]=n;}module.exports=TinyQueue,TinyQueue.prototype={push:function(t){this.data.push(t),this.length++,this._up(this.length-1);},pop:function(){var t=this.data[0];return this.data[0]=this.data[this.length-1],this.length--,this.data.pop(),this._down(0),t},peek:function(){return this.data[0]},_up:function(t){for(var i=this.data,a=this.compare;t>0;){var n=Math.floor((t-1)/2);if(!(a(i[t],i[n])<0))break;swap(i,n,t),t=n;}},_down:function(t){for(var i=this.data,a=this.compare,n=this.length;;){var e=2*t+1,h=e+1,s=t;if(e<n&&a(i[e],i[s])<0&&(s=e),h<n&&a(i[h],i[s])<0&&(s=h),s===t)return;swap(i,s,t),t=s;}}};
; |
85 | },{}],31:[function(_dereq_,module,exports){
|
86 | "function"==typeof Object.create?module.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}});}:module.exports=function(t,e){t.super_=e;var o=function(){};o.prototype=e.prototype,t.prototype=new o,t.prototype.constructor=t;};
|
87 | },{}],32:[function(_dereq_,module,exports){
|
88 | module.exports=function(o){return o&&"object"==typeof o&&"function"==typeof o.copy&&"function"==typeof o.fill&&"function"==typeof o.readUInt8};
|
89 | },{}],33:[function(_dereq_,module,exports){
|
90 | (function (process,global){
|
91 | function inspect(e,r){var t={seen:[],stylize:stylizeNoColor};return arguments.length>=3&&(t.depth=arguments[2]),arguments.length>=4&&(t.colors=arguments[3]),isBoolean(r)?t.showHidden=r:r&&exports._extend(t,r),isUndefined(t.showHidden)&&(t.showHidden=!1),isUndefined(t.depth)&&(t.depth=2),isUndefined(t.colors)&&(t.colors=!1),isUndefined(t.customInspect)&&(t.customInspect=!0),t.colors&&(t.stylize=stylizeWithColor),formatValue(t,e,t.depth)}function stylizeWithColor(e,r){var t=inspect.styles[r];return t?"["+inspect.colors[t][0]+"m"+e+"["+inspect.colors[t][1]+"m":e}function stylizeNoColor(e,r){return e}function arrayToHash(e){var r={};return e.forEach(function(e,t){r[e]=!0;}),r}function formatValue(e,r,t){if(e.customInspect&&r&&isFunction(r.inspect)&&r.inspect!==exports.inspect&&(!r.constructor||r.constructor.prototype!==r)){var n=r.inspect(t,e);return isString(n)||(n=formatValue(e,n,t)),n}var i=formatPrimitive(e,r);if(i)return i;var o=Object.keys(r),s=arrayToHash(o);if(e.showHidden&&(o=Object.getOwnPropertyNames(r)),isError(r)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return formatError(r);if(0===o.length){if(isFunction(r)){var u=r.name?": "+r.name:"";return e.stylize("[Function"+u+"]","special")}if(isRegExp(r))return e.stylize(RegExp.prototype.toString.call(r),"regexp");if(isDate(r))return e.stylize(Date.prototype.toString.call(r),"date");if(isError(r))return formatError(r)}var c="",a=!1,l=["{","}"];if(isArray(r)&&(a=!0,l=["[","]"]),isFunction(r)){var p=r.name?": "+r.name:"";c=" [Function"+p+"]";}if(isRegExp(r)&&(c=" "+RegExp.prototype.toString.call(r)),isDate(r)&&(c=" "+Date.prototype.toUTCString.call(r)),isError(r)&&(c=" "+formatError(r)),0===o.length&&(!a||0==r.length))return l[0]+c+l[1];if(t<0)return isRegExp(r)?e.stylize(RegExp.prototype.toString.call(r),"regexp"):e.stylize("[Object]","special");e.seen.push(r);var f;return f=a?formatArray(e,r,t,s,o):o.map(function(n){return formatProperty(e,r,t,s,n,a)}),e.seen.pop(),reduceToSingleString(f,c,l)}function formatPrimitive(e,r){if(isUndefined(r))return e.stylize("undefined","undefined");if(isString(r)){var t="'"+JSON.stringify(r).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(t,"string")}return isNumber(r)?e.stylize(""+r,"number"):isBoolean(r)?e.stylize(""+r,"boolean"):isNull(r)?e.stylize("null","null"):void 0}function formatError(e){return"["+Error.prototype.toString.call(e)+"]"}function formatArray(e,r,t,n,i){for(var o=[],s=0,u=r.length;s<u;++s)hasOwnProperty(r,String(s))?o.push(formatProperty(e,r,t,n,String(s),!0)):o.push("");return i.forEach(function(i){i.match(/^\d+$/)||o.push(formatProperty(e,r,t,n,i,!0));}),o}function formatProperty(e,r,t,n,i,o){var s,u,c;if(c=Object.getOwnPropertyDescriptor(r,i)||{value:r[i]},c.get?u=c.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):c.set&&(u=e.stylize("[Setter]","special")),hasOwnProperty(n,i)||(s="["+i+"]"),u||(e.seen.indexOf(c.value)<0?(u=isNull(t)?formatValue(e,c.value,null):formatValue(e,c.value,t-1),u.indexOf("\n")>-1&&(u=o?u.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+u.split("\n").map(function(e){return" "+e}).join("\n"))):u=e.stylize("[Circular]","special")),isUndefined(s)){if(o&&i.match(/^\d+$/))return u;s=JSON.stringify(""+i),s.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string"));}return s+": "+u}function reduceToSingleString(e,r,t){var n=0,i=e.reduce(function(e,r){return n++,r.indexOf("\n")>=0&&n++,e+r.replace(/\u001b\[\d\d?m/g,"").length+1},0);return i>60?t[0]+(""===r?"":r+"\n ")+" "+e.join(",\n ")+" "+t[1]:t[0]+r+" "+e.join(", ")+" "+t[1]}function isArray(e){return Array.isArray(e)}function isBoolean(e){return"boolean"==typeof e}function isNull(e){return null===e}function isNullOrUndefined(e){return null==e}function isNumber(e){return"number"==typeof e}function isString(e){return"string"==typeof e}function isSymbol(e){return"symbol"==typeof e}function isUndefined(e){return void 0===e}function isRegExp(e){return isObject(e)&&"[object RegExp]"===objectToString(e)}function isObject(e){return"object"==typeof e&&null!==e}function isDate(e){return isObject(e)&&"[object Date]"===objectToString(e)}function isError(e){return isObject(e)&&("[object Error]"===objectToString(e)||e instanceof Error)}function isFunction(e){return"function"==typeof e}function isPrimitive(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function objectToString(e){return Object.prototype.toString.call(e)}function pad(e){return e<10?"0"+e.toString(10):e.toString(10)}function timestamp(){var e=new Date,r=[pad(e.getHours()),pad(e.getMinutes()),pad(e.getSeconds())].join(":");return[e.getDate(),months[e.getMonth()],r].join(" ")}function hasOwnProperty(e,r){return Object.prototype.hasOwnProperty.call(e,r)}var formatRegExp=/%[sdj%]/g;exports.format=function(e){if(!isString(e)){for(var r=[],t=0;t<arguments.length;t++)r.push(inspect(arguments[t]));return r.join(" ")}for(var t=1,n=arguments,i=n.length,o=String(e).replace(formatRegExp,function(e){if("%%"===e)return"%";if(t>=i)return e;switch(e){case"%s":return String(n[t++]);case"%d":return Number(n[t++]);case"%j":try{return JSON.stringify(n[t++])}catch(e){return"[Circular]"}default:return e}}),s=n[t];t<i;s=n[++t])o+=isNull(s)||!isObject(s)?" "+s:" "+inspect(s);return o},exports.deprecate=function(e,r){function t(){if(!n){if(process.throwDeprecation)throw new Error(r);process.traceDeprecation?console.trace(r):console.error(r),n=!0;}return e.apply(this,arguments)}if(isUndefined(global.process))return function(){return exports.deprecate(e,r).apply(this,arguments)};if(process.noDeprecation===!0)return e;var n=!1;return t};var debugs={},debugEnviron;exports.debuglog=function(e){if(isUndefined(debugEnviron)&&(debugEnviron=process.env.NODE_DEBUG||""),e=e.toUpperCase(),!debugs[e])if(new RegExp("\\b"+e+"\\b","i").test(debugEnviron)){var r=process.pid;debugs[e]=function(){var t=exports.format.apply(exports,arguments);console.error("%s %d: %s",e,r,t);};}else debugs[e]=function(){};return debugs[e]},exports.inspect=inspect,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]},inspect.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},exports.isArray=isArray,exports.isBoolean=isBoolean,exports.isNull=isNull,exports.isNullOrUndefined=isNullOrUndefined,exports.isNumber=isNumber,exports.isString=isString,exports.isSymbol=isSymbol,exports.isUndefined=isUndefined,exports.isRegExp=isRegExp,exports.isObject=isObject,exports.isDate=isDate,exports.isError=isError,exports.isFunction=isFunction,exports.isPrimitive=isPrimitive,exports.isBuffer=_dereq_("./support/isBuffer");var months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];exports.log=function(){console.log("%s - %s",timestamp(),exports.format.apply(exports,arguments));},exports.inherits=_dereq_("inherits"),exports._extend=function(e,r){if(!r||!isObject(r))return e;for(var t=Object.keys(r),n=t.length;n--;)e[t[n]]=r[t[n]];return e};
|
92 | }).call(this,_dereq_('_process'),typeof commonjsGlobal !== "undefined" ? commonjsGlobal : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {});
|
93 |
|
94 | },{"./support/isBuffer":32,"_process":27,"inherits":31}],34:[function(_dereq_,module,exports){
|
95 | module.exports.VectorTile=_dereq_("./lib/vectortile.js"),module.exports.VectorTileFeature=_dereq_("./lib/vectortilefeature.js"),module.exports.VectorTileLayer=_dereq_("./lib/vectortilelayer.js");
|
96 | },{"./lib/vectortile.js":35,"./lib/vectortilefeature.js":36,"./lib/vectortilelayer.js":37}],35:[function(_dereq_,module,exports){
|
97 | function VectorTile(e,r){this.layers=e.readFields(readTile,{},r);}function readTile(e,r,i){if(3===e){var t=new VectorTileLayer(i,i.readVarint()+i.pos);t.length&&(r[t.name]=t);}}var VectorTileLayer=_dereq_("./vectortilelayer");module.exports=VectorTile;
; |
98 | },{"./vectortilelayer":37}],36:[function(_dereq_,module,exports){
|
99 | function VectorTileFeature(e,t,r,i,a){this.properties={},this.extent=r,this.type=0,this._pbf=e,this._geometry=-1,this._keys=i,this._values=a,e.readFields(readFeature,this,t);}function readFeature(e,t,r){1==e?t.id=r.readVarint():2==e?readTag(r,t):3==e?t.type=r.readVarint():4==e&&(t._geometry=r.pos);}function readTag(e,t){for(var r=e.readVarint()+e.pos;e.pos<r;){var i=t._keys[e.readVarint()],a=t._values[e.readVarint()];t.properties[i]=a;}}function classifyRings(e){var t=e.length;if(t<=1)return[e];for(var r,i,a=[],o=0;o<t;o++){var n=signedArea(e[o]);0!==n&&(void 0===i&&(i=n<0),i===n<0?(r&&a.push(r),r=[e[o]]):r.push(e[o]));}return r&&a.push(r),a}function signedArea(e){for(var t,r,i=0,a=0,o=e.length,n=o-1;a<o;n=a++)t=e[a],r=e[n],i+=(r.x-t.x)*(t.y+r.y);return i}var Point=_dereq_("point-geometry");module.exports=VectorTileFeature,VectorTileFeature.types=["Unknown","Point","LineString","Polygon"],VectorTileFeature.prototype.loadGeometry=function(){var e=this._pbf;e.pos=this._geometry;for(var t,r=e.readVarint()+e.pos,i=1,a=0,o=0,n=0,s=[];e.pos<r;){if(!a){var p=e.readVarint();i=7&p,a=p>>3;}if(a--,1===i||2===i)o+=e.readSVarint(),n+=e.readSVarint(),1===i&&(t&&s.push(t),t=[]),t.push(new Point(o,n));else{if(7!==i)throw new Error("unknown command "+i);t&&t.push(t[0].clone());}}return t&&s.push(t),s},VectorTileFeature.prototype.bbox=function(){var e=this._pbf;e.pos=this._geometry;for(var t=e.readVarint()+e.pos,r=1,i=0,a=0,o=0,n=1/0,s=-(1/0),p=1/0,h=-(1/0);e.pos<t;){if(!i){var u=e.readVarint();r=7&u,i=u>>3;}if(i--,1===r||2===r)a+=e.readSVarint(),o+=e.readSVarint(),a<n&&(n=a),a>s&&(s=a),o<p&&(p=o),o>h&&(h=o);else if(7!==r)throw new Error("unknown command "+r)}return[n,p,s,h]},VectorTileFeature.prototype.toGeoJSON=function(e,t,r){function i(e){for(var t=0;t<e.length;t++){var r=e[t],i=180-360*(r.y+p)/n;e[t]=[360*(r.x+s)/n-180,360/Math.PI*Math.atan(Math.exp(i*Math.PI/180))-90];}}var a,o,n=this.extent*Math.pow(2,r),s=this.extent*e,p=this.extent*t,h=this.loadGeometry(),u=VectorTileFeature.types[this.type];switch(this.type){case 1:var d=[];for(a=0;a<h.length;a++)d[a]=h[a][0];h=d,i(h);break;case 2:for(a=0;a<h.length;a++)i(h[a]);break;case 3:for(h=classifyRings(h),a=0;a<h.length;a++)for(o=0;o<h[a].length;o++)i(h[a][o]);}1===h.length?h=h[0]:u="Multi"+u;var f={type:"Feature",geometry:{type:u,coordinates:h},properties:this.properties};return"id"in this&&(f.id=this.id),f};
; |
100 | },{"point-geometry":26}],37:[function(_dereq_,module,exports){
|
101 | function VectorTileLayer(e,t){this.version=1,this.name=null,this.extent=4096,this.length=0,this._pbf=e,this._keys=[],this._values=[],this._features=[],e.readFields(readLayer,this,t),this.length=this._features.length;}function readLayer(e,t,r){15===e?t.version=r.readVarint():1===e?t.name=r.readString():5===e?t.extent=r.readVarint():2===e?t._features.push(r.pos):3===e?t._keys.push(r.readString()):4===e&&t._values.push(readValueMessage(r));}function readValueMessage(e){for(var t=null,r=e.readVarint()+e.pos;e.pos<r;){var a=e.readVarint()>>3;t=1===a?e.readString():2===a?e.readFloat():3===a?e.readDouble():4===a?e.readVarint64():5===a?e.readVarint():6===a?e.readSVarint():7===a?e.readBoolean():null;}return t}var VectorTileFeature=_dereq_("./vectortilefeature.js");module.exports=VectorTileLayer,VectorTileLayer.prototype.feature=function(e){if(e<0||e>=this._features.length)throw new Error("feature index out of bounds");this._pbf.pos=this._features[e];var t=this._pbf.readVarint()+this._pbf.pos;return new VectorTileFeature(this._pbf,t,this.extent,this._keys,this._values)};
; |
102 | },{"./vectortilefeature.js":36}],38:[function(_dereq_,module,exports){
|
103 | function fromVectorTileJs(e){var r=[];for(var o in e.layers)r.push(prepareLayer(e.layers[o]));var t=new Pbf;return vtpb.tile.write({layers:r},t),t.finish()}function fromGeojsonVt(e){var r={};for(var o in e)r[o]=new GeoJSONWrapper(e[o].features),r[o].name=o;return fromVectorTileJs({layers:r})}function prepareLayer(e){for(var r={name:e.name||"",version:e.version||1,extent:e.extent||4096,keys:[],values:[],features:[]},o={},t={},n=0;n<e.length;n++){var a=e.feature(n);a.geometry=encodeGeometry(a.loadGeometry());var u=[];for(var s in a.properties){var i=o[s];"undefined"==typeof i&&(r.keys.push(s),i=r.keys.length-1,o[s]=i);var p=wrapValue(a.properties[s]),l=t[p.key];"undefined"==typeof l&&(r.values.push(p),l=r.values.length-1,t[p.key]=l),u.push(i),u.push(l);}a.tags=u,r.features.push(a);}return r}function command(e,r){return(r<<3)+(7&e)}function zigzag(e){return e<<1^e>>31}function encodeGeometry(e){for(var r=[],o=0,t=0,n=e.length,a=0;a<n;a++){var u=e[a];r.push(command(1,1));for(var s=0;s<u.length;s++){1===s&&r.push(command(2,u.length-1));var i=u[s].x-o,p=u[s].y-t;r.push(zigzag(i),zigzag(p)),o+=i,t+=p;}}return r}function wrapValue(e){var r,o=typeof e;return"string"===o?r={string_value:e}:"boolean"===o?r={bool_value:e}:"number"===o?r=e%1!==0?{double_value:e}:e<0?{sint_value:e}:{uint_value:e}:(e=JSON.stringify(e),r={string_value:e}),r.key=o+":"+e,r}var Pbf=_dereq_("pbf"),vtpb=_dereq_("./vector-tile-pb"),GeoJSONWrapper=_dereq_("./lib/geojson_wrapper");module.exports=fromVectorTileJs,module.exports.fromVectorTileJs=fromVectorTileJs,module.exports.fromGeojsonVt=fromGeojsonVt,module.exports.GeoJSONWrapper=GeoJSONWrapper;
|
104 | },{"./lib/geojson_wrapper":39,"./vector-tile-pb":40,"pbf":25}],39:[function(_dereq_,module,exports){
|
105 | function GeoJSONWrapper(e){this.features=e,this.length=e.length;}function FeatureWrapper(e){this.id="number"==typeof e.id?e.id:void 0,this.type=e.type,this.rawGeometry=1===e.type?[e.geometry]:e.geometry,this.properties=e.tags,this.extent=4096;}var Point=_dereq_("point-geometry"),VectorTileFeature=_dereq_("vector-tile").VectorTileFeature;module.exports=GeoJSONWrapper,GeoJSONWrapper.prototype.feature=function(e){return new FeatureWrapper(this.features[e])},FeatureWrapper.prototype.loadGeometry=function(){var e=this.rawGeometry;this.geometry=[];for(var t=0;t<e.length;t++){for(var r=e[t],o=[],a=0;a<r.length;a++)o.push(new Point(r[a][0],r[a][1]));this.geometry.push(o);}return this.geometry},FeatureWrapper.prototype.bbox=function(){this.geometry||this.loadGeometry();for(var e=this.geometry,t=1/0,r=-(1/0),o=1/0,a=-(1/0),i=0;i<e.length;i++)for(var p=e[i],n=0;n<p.length;n++){var h=p[n];t=Math.min(t,h.x),r=Math.max(r,h.x),o=Math.min(o,h.y),a=Math.max(a,h.y);}return[t,o,r,a]},FeatureWrapper.prototype.toGeoJSON=VectorTileFeature.prototype.toGeoJSON;
; |
106 | },{"point-geometry":26,"vector-tile":34}],40:[function(_dereq_,module,exports){
|
107 | function readTile(e,r){return e.readFields(readTileField,{layers:[]},r)}function readTileField(e,r,i){3===e&&r.layers.push(readLayer(i,i.readVarint()+i.pos));}function writeTile(e,r){var i;if(void 0!==e.layers)for(i=0;i<e.layers.length;i++)r.writeMessage(3,writeLayer,e.layers[i]);}function readValue(e,r){return e.readFields(readValueField,{},r)}function readValueField(e,r,i){1===e?r.string_value=i.readString():2===e?r.float_value=i.readFloat():3===e?r.double_value=i.readDouble():4===e?r.int_value=i.readVarint():5===e?r.uint_value=i.readVarint():6===e?r.sint_value=i.readSVarint():7===e&&(r.bool_value=i.readBoolean());}function writeValue(e,r){void 0!==e.string_value&&r.writeStringField(1,e.string_value),void 0!==e.float_value&&r.writeFloatField(2,e.float_value),void 0!==e.double_value&&r.writeDoubleField(3,e.double_value),void 0!==e.int_value&&r.writeVarintField(4,e.int_value),void 0!==e.uint_value&&r.writeVarintField(5,e.uint_value),void 0!==e.sint_value&&r.writeSVarintField(6,e.sint_value),void 0!==e.bool_value&&r.writeBooleanField(7,e.bool_value);}function readFeature(e,r){var i=e.readFields(readFeatureField,{},r);return void 0===i.type&&(i.type="Unknown"),i}function readFeatureField(e,r,i){1===e?r.id=i.readVarint():2===e?r.tags=i.readPackedVarint():3===e?r.type=i.readVarint():4===e&&(r.geometry=i.readPackedVarint());}function writeFeature(e,r){void 0!==e.id&&r.writeVarintField(1,e.id),void 0!==e.tags&&r.writePackedVarint(2,e.tags),void 0!==e.type&&r.writeVarintField(3,e.type),void 0!==e.geometry&&r.writePackedVarint(4,e.geometry);}function readLayer(e,r){return e.readFields(readLayerField,{features:[],keys:[],values:[]},r)}function readLayerField(e,r,i){15===e?r.version=i.readVarint():1===e?r.name=i.readString():2===e?r.features.push(readFeature(i,i.readVarint()+i.pos)):3===e?r.keys.push(i.readString()):4===e?r.values.push(readValue(i,i.readVarint()+i.pos)):5===e&&(r.extent=i.readVarint());}function writeLayer(e,r){void 0!==e.version&&r.writeVarintField(15,e.version),void 0!==e.name&&r.writeStringField(1,e.name);var i;if(void 0!==e.features)for(i=0;i<e.features.length;i++)r.writeMessage(2,writeFeature,e.features[i]);if(void 0!==e.keys)for(i=0;i<e.keys.length;i++)r.writeStringField(3,e.keys[i]);if(void 0!==e.values)for(i=0;i<e.values.length;i++)r.writeMessage(4,writeValue,e.values[i]);void 0!==e.extent&&r.writeVarintField(5,e.extent);}var tile=exports.tile={read:readTile,write:writeTile};tile.GeomType={Unknown:0,Point:1,LineString:2,Polygon:3},tile.value={read:readValue,write:writeValue},tile.feature={read:readFeature,write:writeFeature},tile.layer={read:readLayer,write:writeLayer};
; |
108 | },{}],41:[function(_dereq_,module,exports){
|
109 | var bundleFn=arguments[3],sources=arguments[4],cache=arguments[5],stringify=JSON.stringify;module.exports=function(r,e){function t(r){d[r]=!0;for(var e in sources[r][1]){var n=sources[r][1][e];d[n]||t(n);}}for(var n,o=Object.keys(cache),a=0,i=o.length;a<i;a++){var s=o[a],u=cache[s].exports;if(u===r||u&&u.default===r){n=s;break}}if(!n){n=Math.floor(Math.pow(16,8)*Math.random()).toString(16);for(var f={},a=0,i=o.length;a<i;a++){var s=o[a];f[s]=s;}sources[n]=[Function(["require","module","exports"],"("+r+")(self)"),f];}var c=Math.floor(Math.pow(16,8)*Math.random()).toString(16),l={};l[n]=n,sources[c]=[Function(["require"],"var f = require("+stringify(n)+");(f.default ? f.default : f)(self);"),l];var d={};t(c);var g="("+bundleFn+")({"+Object.keys(d).map(function(r){return stringify(r)+":["+sources[r][0]+","+stringify(sources[r][1])+"]"}).join(",")+"},{},["+stringify(c)+"])",v=window.URL||window.webkitURL||window.mozURL||window.msURL,w=new Blob([g],{type:"text/javascript"});if(e&&e.bare)return w;var h=v.createObjectURL(w),b=new Worker(h);return b.objectURL=h,b};
|
110 | },{}],42:[function(_dereq_,module,exports){
|
111 | module.exports.RADIUS=6378137,module.exports.FLATTENING=1/298.257223563,module.exports.POLAR_RADIUS=6356752.3142;
|
112 | },{}],43:[function(_dereq_,module,exports){
|
113 | module.exports={"version":"0.37.0"};
|
114 | },{}],44:[function(_dereq_,module,exports){
|
115 | function serializePaintVertexArrays(r,e){var t={};for(var a in r){var i=r[a].paintVertexArray;if(0!==i.length){var n=i.serialize(e),s=i.constructor.serialize();t[a]={array:n,type:s};}}return t}var ProgramConfiguration=_dereq_("./program_configuration"),createVertexArrayType=_dereq_("./vertex_array_type"),Segment=function(r,e){this.vertexOffset=r,this.primitiveOffset=e,this.vertexLength=0,this.primitiveLength=0;},ArrayGroup=function(r,e,t){var a=this;this.globalProperties={zoom:t};var i=createVertexArrayType(r.layoutAttributes);this.layoutVertexArray=new i;var n=r.elementArrayType;n&&(this.elementArray=new n);var s=r.elementArrayType2;s&&(this.elementArray2=new s),this.layerData={};for(var y=0,o=e;y<o.length;y+=1){var p=o[y],l=ProgramConfiguration.createDynamic(r.paintAttributes||[],p,t);a.layerData[p.id]={layer:p,programConfiguration:l,paintVertexArray:new l.PaintVertexArray,paintPropertyStatistics:l.createPaintPropertyStatistics()};}this.segments=[],this.segments2=[];};ArrayGroup.prototype.prepareSegment=function(r){var e=this.segments[this.segments.length-1];return(!e||e.vertexLength+r>ArrayGroup.MAX_VERTEX_ARRAY_LENGTH)&&(e=new Segment(this.layoutVertexArray.length,this.elementArray.length),this.segments.push(e)),e},ArrayGroup.prototype.prepareSegment2=function(r){var e=this.segments2[this.segments2.length-1];return(!e||e.vertexLength+r>ArrayGroup.MAX_VERTEX_ARRAY_LENGTH)&&(e=new Segment(this.layoutVertexArray.length,this.elementArray2.length),this.segments2.push(e)),e},ArrayGroup.prototype.populatePaintArrays=function(r){var e=this;for(var t in e.layerData){var a=e.layerData[t];0!==a.paintVertexArray.bytesPerElement&&a.programConfiguration.populatePaintArray(a.layer,a.paintVertexArray,a.paintPropertyStatistics,e.layoutVertexArray.length,e.globalProperties,r);}},ArrayGroup.prototype.isEmpty=function(){return 0===this.layoutVertexArray.length},ArrayGroup.prototype.serialize=function(r){return{layoutVertexArray:this.layoutVertexArray.serialize(r),elementArray:this.elementArray&&this.elementArray.serialize(r),elementArray2:this.elementArray2&&this.elementArray2.serialize(r),paintVertexArrays:serializePaintVertexArrays(this.layerData,r),segments:this.segments,segments2:this.segments2}},ArrayGroup.MAX_VERTEX_ARRAY_LENGTH=Math.pow(2,16)-1,module.exports=ArrayGroup;
; |
116 | },{"./program_configuration":58,"./vertex_array_type":60}],45:[function(_dereq_,module,exports){
|
117 | var ArrayGroup=_dereq_("./array_group"),BufferGroup=_dereq_("./buffer_group"),util=_dereq_("../util/util"),Bucket=function(r,t){this.zoom=r.zoom,this.overscaling=r.overscaling,this.layers=r.layers,this.index=r.index,r.arrays?this.buffers=new BufferGroup(t,r.layers,r.zoom,r.arrays):this.arrays=new ArrayGroup(t,r.layers,r.zoom);};Bucket.prototype.populate=function(r,t){for(var e=this,i=0,a=r;i<a.length;i+=1){var u=a[i];e.layers[0].filter(u)&&(e.addFeature(u),t.featureIndex.insert(u,e.index));}},Bucket.prototype.getPaintPropertyStatistics=function(){return util.mapObject(this.arrays.layerData,function(r){return r.paintPropertyStatistics})},Bucket.prototype.isEmpty=function(){return this.arrays.isEmpty()},Bucket.prototype.serialize=function(r){return{zoom:this.zoom,layerIds:this.layers.map(function(r){return r.id}),arrays:this.arrays.serialize(r)}},Bucket.prototype.destroy=function(){this.buffers&&(this.buffers.destroy(),this.buffers=null);},module.exports=Bucket,Bucket.deserialize=function(r,t){if(t){for(var e={},i=0,a=r;i<a.length;i+=1){var u=a[i],o=u.layerIds.map(function(r){return t.getLayer(r)}).filter(Boolean);if(0!==o.length)for(var s=o[0].createBucket(util.extend({layers:o},u)),n=0,f=o;n<f.length;n+=1){var y=f[n];e[y.id]=s;}}return e}};
; |
118 | },{"../util/util":215,"./array_group":44,"./buffer_group":52}],46:[function(_dereq_,module,exports){
|
119 | function addCircleVertex(e,r,t,c,i){e.emplaceBack(2*r+(c+1)/2,2*t+(i+1)/2);}var Bucket=_dereq_("../bucket"),createElementArrayType=_dereq_("../element_array_type"),loadGeometry=_dereq_("../load_geometry"),EXTENT=_dereq_("../extent"),circleInterface={layoutAttributes:[{name:"a_pos",components:2,type:"Int16"}],elementArrayType:createElementArrayType(),paintAttributes:[{property:"circle-color",type:"Uint8"},{property:"circle-radius",type:"Uint16",multiplier:10},{property:"circle-blur",type:"Uint16",multiplier:10},{property:"circle-opacity",type:"Uint8",multiplier:255},{property:"circle-stroke-color",type:"Uint8"},{property:"circle-stroke-width",type:"Uint16",multiplier:10},{property:"circle-stroke-opacity",type:"Uint8",multiplier:255}]},CircleBucket=function(e){function r(r){e.call(this,r,circleInterface);}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.addFeature=function(e){for(var r=this.arrays,t=0,c=loadGeometry(e);t<c.length;t+=1)for(var i=c[t],a=0,p=i;a<p.length;a+=1){var l=p[a],o=l.x,y=l.y;if(!(o<0||o>=EXTENT||y<0||y>=EXTENT)){var n=r.prepareSegment(4),u=n.vertexLength;addCircleVertex(r.layoutVertexArray,o,y,-1,-1),addCircleVertex(r.layoutVertexArray,o,y,1,-1),addCircleVertex(r.layoutVertexArray,o,y,1,1),addCircleVertex(r.layoutVertexArray,o,y,-1,1),r.elementArray.emplaceBack(u,u+1,u+2),r.elementArray.emplaceBack(u,u+3,u+2),n.vertexLength+=4,n.primitiveLength+=2;}}r.populatePaintArrays(e.properties);},r}(Bucket);CircleBucket.programInterface=circleInterface,module.exports=CircleBucket;
; |
120 | },{"../bucket":45,"../element_array_type":53,"../extent":54,"../load_geometry":56}],47:[function(_dereq_,module,exports){
|
121 | var Bucket=_dereq_("../bucket"),createElementArrayType=_dereq_("../element_array_type"),loadGeometry=_dereq_("../load_geometry"),earcut=_dereq_("earcut"),classifyRings=_dereq_("../../util/classify_rings"),EARCUT_MAX_RINGS=500,fillInterface={layoutAttributes:[{name:"a_pos",components:2,type:"Int16"}],elementArrayType:createElementArrayType(3),elementArrayType2:createElementArrayType(2),paintAttributes:[{property:"fill-color",type:"Uint8"},{property:"fill-outline-color",type:"Uint8"},{property:"fill-opacity",type:"Uint8",multiplier:255}]},FillBucket=function(e){function t(t){e.call(this,t,fillInterface);}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.addFeature=function(e){for(var t=this.arrays,r=0,a=classifyRings(loadGeometry(e),EARCUT_MAX_RINGS);r<a.length;r+=1){for(var l=a[r],n=0,p=0,i=l;p<i.length;p+=1){var o=i[p];n+=o.length;}for(var y=t.prepareSegment(n),c=y.vertexLength,u=[],s=[],g=0,h=l;g<h.length;g+=1){var m=h[g];if(0!==m.length){m!==l[0]&&s.push(u.length/2);var f=t.prepareSegment2(m.length),A=f.vertexLength;t.layoutVertexArray.emplaceBack(m[0].x,m[0].y),t.elementArray2.emplaceBack(A+m.length-1,A),u.push(m[0].x),u.push(m[0].y);for(var v=1;v<m.length;v++)t.layoutVertexArray.emplaceBack(m[v].x,m[v].y),t.elementArray2.emplaceBack(A+v-1,A+v),u.push(m[v].x),u.push(m[v].y);f.vertexLength+=m.length,f.primitiveLength+=m.length;}}for(var _=earcut(u,s),k=0;k<_.length;k+=3)t.elementArray.emplaceBack(c+_[k],c+_[k+1],c+_[k+2]);y.vertexLength+=n,y.primitiveLength+=_.length/3;}t.populatePaintArrays(e.properties);},t}(Bucket);FillBucket.programInterface=fillInterface,module.exports=FillBucket;
; |
122 | },{"../../util/classify_rings":198,"../bucket":45,"../element_array_type":53,"../load_geometry":56,"earcut":5}],48:[function(_dereq_,module,exports){
|
123 | function addVertex(e,t,r,a,n,o,i,y){e.emplaceBack(t,r,2*Math.floor(a*FACTOR)+i,n*FACTOR*2,o*FACTOR*2,Math.round(y));}function isBoundaryEdge(e,t){return e.x===t.x&&(e.x<0||e.x>EXTENT)||e.y===t.y&&(e.y<0||e.y>EXTENT)}var Bucket=_dereq_("../bucket"),createElementArrayType=_dereq_("../element_array_type"),loadGeometry=_dereq_("../load_geometry"),EXTENT=_dereq_("../extent"),earcut=_dereq_("earcut"),classifyRings=_dereq_("../../util/classify_rings"),EARCUT_MAX_RINGS=500,fillExtrusionInterface={layoutAttributes:[{name:"a_pos",components:2,type:"Int16"},{name:"a_normal",components:3,type:"Int16"},{name:"a_edgedistance",components:1,type:"Int16"}],elementArrayType:createElementArrayType(3),paintAttributes:[{property:"fill-extrusion-base",type:"Uint16"},{property:"fill-extrusion-height",type:"Uint16"},{property:"fill-extrusion-color",type:"Uint8"}]},FACTOR=Math.pow(2,13),FillExtrusionBucket=function(e){function t(t){e.call(this,t,fillExtrusionInterface);}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.addFeature=function(e){for(var t=this.arrays,r=0,a=classifyRings(loadGeometry(e),EARCUT_MAX_RINGS);r<a.length;r+=1){for(var n=a[r],o=0,i=0,y=n;i<y.length;i+=1){var l=y[i];o+=l.length;}for(var u=t.prepareSegment(5*o),p=[],s=[],c=[],x=0,f=n;x<f.length;x+=1){var d=f[x];if(0!==d.length){d!==n[0]&&s.push(p.length/2);for(var m=0,h=0;h<d.length;h++){var g=d[h];if(addVertex(t.layoutVertexArray,g.x,g.y,0,0,1,1,0),c.push(u.vertexLength++),h>=1){var A=d[h-1];if(!isBoundaryEdge(g,A)){var E=g.sub(A)._perp()._unit();addVertex(t.layoutVertexArray,g.x,g.y,E.x,E.y,0,0,m),addVertex(t.layoutVertexArray,g.x,g.y,E.x,E.y,0,1,m),m+=A.dist(g),addVertex(t.layoutVertexArray,A.x,A.y,E.x,E.y,0,0,m),addVertex(t.layoutVertexArray,A.x,A.y,E.x,E.y,0,1,m);var v=u.vertexLength;t.elementArray.emplaceBack(v,v+1,v+2),t.elementArray.emplaceBack(v+1,v+2,v+3),u.vertexLength+=4,u.primitiveLength+=2;}}p.push(g.x),p.push(g.y);}}}for(var _=earcut(p,s),T=0;T<_.length;T+=3)t.elementArray.emplaceBack(c[_[T]],c[_[T+1]],c[_[T+2]]);u.primitiveLength+=_.length/3;}t.populatePaintArrays(e.properties);},t}(Bucket);FillExtrusionBucket.programInterface=fillExtrusionInterface,module.exports=FillExtrusionBucket;
; |
124 | },{"../../util/classify_rings":198,"../bucket":45,"../element_array_type":53,"../extent":54,"../load_geometry":56,"earcut":5}],49:[function(_dereq_,module,exports){
|
125 | function addLineVertex(e,t,r,i,a,n,d){e.emplaceBack(t.x<<1|i,t.y<<1|a,Math.round(EXTRUDE_SCALE*r.x)+128,Math.round(EXTRUDE_SCALE*r.y)+128,(0===n?0:n<0?-1:1)+1|(d*LINE_DISTANCE_SCALE&63)<<2,d*LINE_DISTANCE_SCALE>>6);}var Bucket=_dereq_("../bucket"),createElementArrayType=_dereq_("../element_array_type"),loadGeometry=_dereq_("../load_geometry"),EXTENT=_dereq_("../extent"),VectorTileFeature=_dereq_("vector-tile").VectorTileFeature,EXTRUDE_SCALE=63,COS_HALF_SHARP_CORNER=Math.cos(37.5*(Math.PI/180)),SHARP_CORNER_OFFSET=15,LINE_DISTANCE_BUFFER_BITS=15,LINE_DISTANCE_SCALE=.5,MAX_LINE_DISTANCE=Math.pow(2,LINE_DISTANCE_BUFFER_BITS-1)/LINE_DISTANCE_SCALE,lineInterface={layoutAttributes:[{name:"a_pos",components:2,type:"Int16"},{name:"a_data",components:4,type:"Uint8"}],paintAttributes:[{property:"line-color",type:"Uint8"},{property:"line-blur",multiplier:10,type:"Uint8"},{property:"line-opacity",multiplier:10,type:"Uint8"},{property:"line-gap-width",multiplier:10,type:"Uint8",name:"a_gapwidth"},{property:"line-offset",multiplier:1,type:"Int8"}],elementArrayType:createElementArrayType()},LineBucket=function(e){function t(t){e.call(this,t,lineInterface);}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.addFeature=function(e){for(var t=this,r=this.layers[0].layout,i=r["line-join"],a=r["line-cap"],n=r["line-miter-limit"],d=r["line-round-limit"],s=0,u=loadGeometry(e,LINE_DISTANCE_BUFFER_BITS);s<u.length;s+=1){var l=u[s];t.addLine(l,e,i,a,n,d);}},t.prototype.addLine=function(e,t,r,i,a,n){for(var d=this,s=t.properties,u="Polygon"===VectorTileFeature.types[t.type],l=e.length;l>=2&&e[l-1].equals(e[l-2]);)l--;for(var o=0;o<l-1&&e[o].equals(e[o+1]);)o++;if(!(l<(u?3:2))){"bevel"===r&&(a=1.05);var p=SHARP_CORNER_OFFSET*(EXTENT/(512*this.overscaling)),c=e[o],_=this.arrays,h=_.prepareSegment(10*l);this.distance=0;var y,m,E,x,C,v,f,A=i,L=u?"butt":i,S=!0;this.e1=this.e2=this.e3=-1,u&&(y=e[l-2],C=c.sub(y)._unit()._perp());for(var V=o;V<l;V++)if(E=u&&V===l-1?e[o+1]:e[V+1],!E||!e[V].equals(E)){C&&(x=C),y&&(m=y),y=e[V],C=E?E.sub(y)._unit()._perp():x,x=x||C;var I=x.add(C);0===I.x&&0===I.y||I._unit();var T=I.x*C.x+I.y*C.y,N=0!==T?1/T:1/0,b=T<COS_HALF_SHARP_CORNER&&m&&E;if(b&&V>o){var R=y.dist(m);if(R>2*p){var g=y.sub(y.sub(m)._mult(p/R)._round());d.distance+=g.dist(m),d.addCurrentVertex(g,d.distance,x.mult(1),0,0,!1,h),m=g;}}var F=m&&E,B=F?r:E?A:L;if(F&&"round"===B&&(N<n?B="miter":N<=2&&(B="fakeround")),"miter"===B&&N>a&&(B="bevel"),"bevel"===B&&(N>2&&(B="flipbevel"),N<a&&(B="miter")),m&&(d.distance+=y.dist(m)),"miter"===B)I._mult(N),d.addCurrentVertex(y,d.distance,I,0,0,!1,h);else if("flipbevel"===B){if(N>100)I=C.clone().mult(-1);else{var k=x.x*C.y-x.y*C.x>0?-1:1,D=N*x.add(C).mag()/x.sub(C).mag();I._perp()._mult(D*k);}d.addCurrentVertex(y,d.distance,I,0,0,!1,h),d.addCurrentVertex(y,d.distance,I.mult(-1),0,0,!1,h);}else if("bevel"===B||"fakeround"===B){var P=x.x*C.y-x.y*C.x>0,U=-Math.sqrt(N*N-1);if(P?(f=0,v=U):(v=0,f=U),S||d.addCurrentVertex(y,d.distance,x,v,f,!1,h),"fakeround"===B){for(var q=Math.floor(8*(.5-(T-.5))),M=void 0,O=0;O<q;O++)M=C.mult((O+1)/(q+1))._add(x)._unit(),d.addPieSliceVertex(y,d.distance,M,P,h);d.addPieSliceVertex(y,d.distance,I,P,h);for(var X=q-1;X>=0;X--)M=x.mult((X+1)/(q+1))._add(C)._unit(),d.addPieSliceVertex(y,d.distance,M,P,h);}E&&d.addCurrentVertex(y,d.distance,C,-v,-f,!1,h);}else"butt"===B?(S||d.addCurrentVertex(y,d.distance,x,0,0,!1,h),E&&d.addCurrentVertex(y,d.distance,C,0,0,!1,h)):"square"===B?(S||(d.addCurrentVertex(y,d.distance,x,1,1,!1,h),d.e1=d.e2=-1),E&&d.addCurrentVertex(y,d.distance,C,-1,-1,!1,h)):"round"===B&&(S||(d.addCurrentVertex(y,d.distance,x,0,0,!1,h),d.addCurrentVertex(y,d.distance,x,1,1,!0,h),d.e1=d.e2=-1),E&&(d.addCurrentVertex(y,d.distance,C,-1,-1,!0,h),d.addCurrentVertex(y,d.distance,C,0,0,!1,h)));if(b&&V<l-1){var H=y.dist(E);if(H>2*p){var w=y.add(E.sub(y)._mult(p/H)._round());d.distance+=w.dist(y),d.addCurrentVertex(w,d.distance,C.mult(1),0,0,!1,h),y=w;}}S=!1;}_.populatePaintArrays(s);}},t.prototype.addCurrentVertex=function(e,t,r,i,a,n,d){var s,u=n?1:0,l=this.arrays,o=l.layoutVertexArray,p=l.elementArray;s=r.clone(),i&&s._sub(r.perp()._mult(i)),addLineVertex(o,e,s,u,0,i,t),this.e3=d.vertexLength++,this.e1>=0&&this.e2>=0&&(p.emplaceBack(this.e1,this.e2,this.e3),d.primitiveLength++),this.e1=this.e2,this.e2=this.e3,s=r.mult(-1),a&&s._sub(r.perp()._mult(a)),addLineVertex(o,e,s,u,1,-a,t),this.e3=d.vertexLength++,this.e1>=0&&this.e2>=0&&(p.emplaceBack(this.e1,this.e2,this.e3),d.primitiveLength++),this.e1=this.e2,this.e2=this.e3,t>MAX_LINE_DISTANCE/2&&(this.distance=0,this.addCurrentVertex(e,this.distance,r,i,a,n,d));},t.prototype.addPieSliceVertex=function(e,t,r,i,a){var n=i?1:0;r=r.mult(i?-1:1);var d=this.arrays,s=d.layoutVertexArray,u=d.elementArray;addLineVertex(s,e,r,0,n,0,t),this.e3=a.vertexLength++,this.e1>=0&&this.e2>=0&&(u.emplaceBack(this.e1,this.e2,this.e3),a.primitiveLength++),i?this.e2=this.e3:this.e1=this.e3;},t}(Bucket);LineBucket.programInterface=lineInterface,module.exports=LineBucket;
; |
126 | },{"../bucket":45,"../element_array_type":53,"../extent":54,"../load_geometry":56,"vector-tile":34}],50:[function(_dereq_,module,exports){
|
127 | function addVertex(e,t,o,a,i,r,n,s,l,c,u,y){e.emplaceBack(t,o,Math.round(64*a),Math.round(64*i),r/4,n/4,packUint8ToFloat(10*(u||0),y%256),packUint8ToFloat(10*(l||0),10*Math.min(c||25,25)),s?s[0]:void 0,s?s[1]:void 0,s?s[2]:void 0);}function addCollisionBoxVertex(e,t,o,a,i){return e.emplaceBack(t.x,t.y,Math.round(o.x),Math.round(o.y),10*a,10*i)}function getSizeData(e,t,o){var a={isFeatureConstant:t.isLayoutValueFeatureConstant(o),isZoomConstant:t.isLayoutValueZoomConstant(o)};if(a.isFeatureConstant&&(a.layoutSize=t.getLayoutValue(o,{zoom:e+1})),!a.isZoomConstant){for(var i=t.getLayoutValueStopZoomLevels(o),r=0;r<i.length&&i[r]<=e;)r++;r=Math.max(0,r-1);for(var n=r;n<i.length&&i[n]<e+1;)n++;n=Math.min(i.length-1,n),a.coveringZoomRange=[i[r],i[n]],t.isLayoutValueFeatureConstant(o)&&(a.coveringStopValues=[t.getLayoutValue(o,{zoom:i[r]}),t.getLayoutValue(o,{zoom:i[n]})]),a.functionBase=t.getLayoutProperty(o).base,"undefined"==typeof a.functionBase&&(a.functionBase=1),a.functionType=t.getLayoutProperty(o).type||"exponential";}return a}function getSizeAttributeDeclarations(e,t){return e.isLayoutValueZoomConstant(t)&&!e.isLayoutValueFeatureConstant(t)?[{name:"a_size",components:1,type:"Uint16"}]:e.isLayoutValueZoomConstant(t)||e.isLayoutValueFeatureConstant(t)?[]:[{name:"a_size",components:3,type:"Uint16"}]}function getSizeVertexData(e,t,o,a,i){return e.isLayoutValueZoomConstant(a)&&!e.isLayoutValueFeatureConstant(a)?[10*e.getLayoutValue(a,{},i)]:e.isLayoutValueZoomConstant(a)||e.isLayoutValueFeatureConstant(a)?null:[10*e.getLayoutValue(a,{zoom:o[0]},i),10*e.getLayoutValue(a,{zoom:o[1]},i),10*e.getLayoutValue(a,{zoom:1+t},i)]}var Point=_dereq_("point-geometry"),ArrayGroup=_dereq_("../array_group"),BufferGroup=_dereq_("../buffer_group"),createElementArrayType=_dereq_("../element_array_type"),EXTENT=_dereq_("../extent"),packUint8ToFloat=_dereq_("../../shaders/encode_attribute").packUint8ToFloat,Anchor=_dereq_("../../symbol/anchor"),getAnchors=_dereq_("../../symbol/get_anchors"),resolveTokens=_dereq_("../../util/token"),Quads=_dereq_("../../symbol/quads"),Shaping=_dereq_("../../symbol/shaping"),transformText=_dereq_("../../symbol/transform_text"),mergeLines=_dereq_("../../symbol/mergelines"),clipLine=_dereq_("../../symbol/clip_line"),util=_dereq_("../../util/util"),scriptDetection=_dereq_("../../util/script_detection"),loadGeometry=_dereq_("../load_geometry"),CollisionFeature=_dereq_("../../symbol/collision_feature"),findPoleOfInaccessibility=_dereq_("../../util/find_pole_of_inaccessibility"),classifyRings=_dereq_("../../util/classify_rings"),VectorTileFeature=_dereq_("vector-tile").VectorTileFeature,shapeText=Shaping.shapeText,shapeIcon=Shaping.shapeIcon,WritingMode=Shaping.WritingMode,getGlyphQuads=Quads.getGlyphQuads,getIconQuads=Quads.getIconQuads,elementArrayType=createElementArrayType(),layoutAttributes=[{name:"a_pos_offset",components:4,type:"Int16"},{name:"a_data",components:4,type:"Uint16"}],symbolInterfaces={glyph:{layoutAttributes:layoutAttributes,elementArrayType:elementArrayType,paintAttributes:[{name:"a_fill_color",property:"text-color",type:"Uint8"},{name:"a_halo_color",property:"text-halo-color",type:"Uint8"},{name:"a_halo_width",property:"text-halo-width",type:"Uint16",multiplier:10},{name:"a_halo_blur",property:"text-halo-blur",type:"Uint16",multiplier:10},{name:"a_opacity",property:"text-opacity",type:"Uint8",multiplier:255}]},icon:{layoutAttributes:layoutAttributes,elementArrayType:elementArrayType,paintAttributes:[{name:"a_fill_color",property:"icon-color",type:"Uint8"},{name:"a_halo_color",property:"icon-halo-color",type:"Uint8"},{name:"a_halo_width",property:"icon-halo-width",type:"Uint16",multiplier:10},{name:"a_halo_blur",property:"icon-halo-blur",type:"Uint16",multiplier:10},{name:"a_opacity",property:"icon-opacity",type:"Uint8",multiplier:255}]},collisionBox:{layoutAttributes:[{name:"a_pos",components:2,type:"Int16"},{name:"a_extrude",components:2,type:"Int16"},{name:"a_data",components:2,type:"Uint8"}],elementArrayType:createElementArrayType(2)}},SymbolBucket=function(e){var t=this;this.collisionBoxArray=e.collisionBoxArray,this.zoom=e.zoom,this.overscaling=e.overscaling,this.layers=e.layers,this.index=e.index,this.sdfIcons=e.sdfIcons,this.iconsNeedLinear=e.iconsNeedLinear,this.fontstack=e.fontstack;var o=this.layers[0];if(this.symbolInterfaces={glyph:util.extend({},symbolInterfaces.glyph,{layoutAttributes:[].concat(symbolInterfaces.glyph.layoutAttributes,getSizeAttributeDeclarations(o,"text-size"))}),icon:util.extend({},symbolInterfaces.icon,{layoutAttributes:[].concat(symbolInterfaces.icon.layoutAttributes,getSizeAttributeDeclarations(o,"icon-size"))}),collisionBox:util.extend({},symbolInterfaces.collisionBox,{layoutAttributes:[].concat(symbolInterfaces.collisionBox.layoutAttributes)})},e.arrays){this.buffers={};for(var a in e.arrays)e.arrays[a]&&(t.buffers[a]=new BufferGroup(t.symbolInterfaces[a],e.layers,e.zoom,e.arrays[a]));this.textSizeData=e.textSizeData,this.iconSizeData=e.iconSizeData;}else this.textSizeData=getSizeData(this.zoom,o,"text-size"),this.iconSizeData=getSizeData(this.zoom,o,"icon-size");};SymbolBucket.prototype.populate=function(e,t){var o=this,a=this.layers[0],i=a.layout,r=i["text-font"],n=(!a.isLayoutValueFeatureConstant("text-field")||i["text-field"])&&r,s=!a.isLayoutValueFeatureConstant("icon-image")||i["icon-image"];if(this.features=[],n||s){for(var l=t.iconDependencies,c=t.glyphDependencies,u=c[r]=c[r]||{},y={zoom:this.zoom},p=0;p<e.length;p++){var m=e[p];if(a.filter(m)){var h=void 0;n&&(h=a.getLayoutValue("text-field",y,m.properties),a.isLayoutValueFeatureConstant("text-field")&&(h=resolveTokens(m.properties,h)),h=transformText(h,a,y,m.properties));var x=void 0;if(s&&(x=a.getLayoutValue("icon-image",y,m.properties),a.isLayoutValueFeatureConstant("icon-image")&&(x=resolveTokens(m.properties,x))),(h||x)&&(o.features.push({text:h,icon:x,index:p,sourceLayerIndex:m.sourceLayerIndex,geometry:loadGeometry(m),properties:m.properties,type:VectorTileFeature.types[m.type]}),x&&(l[x]=!0),h))for(var d=0;d<h.length;d++)u[h.charCodeAt(d)]=!0;}}"line"===i["symbol-placement"]&&(this.features=mergeLines(this.features));}},SymbolBucket.prototype.isEmpty=function(){return this.arrays.icon.isEmpty()&&this.arrays.glyph.isEmpty()&&this.arrays.collisionBox.isEmpty()},SymbolBucket.prototype.getPaintPropertyStatistics=function(){for(var e=this,t={},o=0,a=e.layers;o<a.length;o+=1){var i=a[o];t[i.id]=util.extend({},e.arrays.icon.layerData[i.id].paintPropertyStatistics,e.arrays.glyph.layerData[i.id].paintPropertyStatistics);}return t},SymbolBucket.prototype.serialize=function(e){return{zoom:this.zoom,layerIds:this.layers.map(function(e){return e.id}),sdfIcons:this.sdfIcons,iconsNeedLinear:this.iconsNeedLinear,textSizeData:this.textSizeData,iconSizeData:this.iconSizeData,fontstack:this.fontstack,arrays:util.mapObject(this.arrays,function(t){return t.isEmpty()?null:t.serialize(e)})}},SymbolBucket.prototype.destroy=function(){this.buffers&&(this.buffers.icon&&this.buffers.icon.destroy(),this.buffers.glyph&&this.buffers.glyph.destroy(),this.buffers.collisionBox&&this.buffers.collisionBox.destroy(),this.buffers=null);},SymbolBucket.prototype.createArrays=function(){var e=this;this.arrays=util.mapObject(this.symbolInterfaces,function(t){return new ArrayGroup(t,e.layers,e.zoom)});},SymbolBucket.prototype.prepare=function(e,t){var o=this;this.symbolInstances=[];var a=512*this.overscaling;this.tilePixelRatio=EXTENT/a,this.compareText={},this.iconsNeedLinear=!1;var i=this.layers[0].layout,r=.5,n=.5;switch(i["text-anchor"]){case"right":case"top-right":case"bottom-right":r=1;break;case"left":case"top-left":case"bottom-left":r=0;}switch(i["text-anchor"]){case"bottom":case"bottom-right":case"bottom-left":n=1;break;case"top":case"top-right":case"top-left":n=0;}for(var s="right"===i["text-justify"]?1:"left"===i["text-justify"]?0:.5,l=24,c=i["text-line-height"]*l,u="line"!==i["symbol-placement"]?i["text-max-width"]*l:0,y=i["text-letter-spacing"]*l,p=this.fontstack=i["text-font"].join(","),m="map"===i["text-rotation-alignment"]&&"line"===i["symbol-placement"],h=0,x=o.features;h<x.length;h+=1){var d=x[h],g=void 0;if(d.text){var f=scriptDetection.allowsVerticalWritingMode(d.text),b=o.layers[0].getLayoutValue("text-offset",{zoom:o.zoom},d.properties).map(function(e){return e*l});g={},g[WritingMode.horizontal]=shapeText(d.text,e[p],u,c,r,n,s,y,b,l,WritingMode.horizontal),g[WritingMode.vertical]=f&&m&&shapeText(d.text,e[p],u,c,r,n,s,y,b,l,WritingMode.vertical);}else g={};var v=void 0;if(d.icon){var S=t[d.icon],I=o.layers[0].getLayoutValue("icon-offset",{zoom:o.zoom},d.properties);v=shapeIcon(S,I),S&&(void 0===o.sdfIcons?o.sdfIcons=S.sdf:o.sdfIcons!==S.sdf&&util.warnOnce("Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer"),1!==S.pixelRatio?o.iconsNeedLinear=!0:0===i["icon-rotate"]&&o.layers[0].isLayoutValueFeatureConstant("icon-rotate")||(o.iconsNeedLinear=!0));}(g[WritingMode.horizontal]||v)&&o.addFeature(d,g,v);}},SymbolBucket.prototype.addFeature=function(e,t,o){var a=this,i=this.layers[0].getLayoutValue("text-size",{zoom:this.zoom+1},e.properties),r=this.layers[0].getLayoutValue("icon-size",{zoom:this.zoom+1},e.properties),n=this.layers[0].getLayoutValue("text-size",{zoom:18},e.properties);void 0===n&&(n=i);var s=this.layers[0].layout,l=24,c=i/l,u=this.tilePixelRatio*c,y=this.tilePixelRatio*n/l,p=this.tilePixelRatio*r,m=this.tilePixelRatio*s["symbol-spacing"],h=s["symbol-avoid-edges"],x=s["text-padding"]*this.tilePixelRatio,d=s["icon-padding"]*this.tilePixelRatio,g=s["text-max-angle"]/180*Math.PI,f="map"===s["text-rotation-alignment"]&&"line"===s["symbol-placement"],b="map"===s["icon-rotation-alignment"]&&"line"===s["symbol-placement"],v=s["text-allow-overlap"]||s["icon-allow-overlap"]||s["text-ignore-placement"]||s["icon-ignore-placement"],S=s["symbol-placement"],I=m/2,z=function(i,r){var n=!(r.x<0||r.x>EXTENT||r.y<0||r.y>EXTENT);if(!h||n){var s=n||v;a.addSymbolInstance(r,i,t,o,a.layers[0],s,a.collisionBoxArray,e.index,e.sourceLayerIndex,a.index,u,x,f,p,d,b,{zoom:a.zoom},e.properties);}};if("line"===S)for(var B=0,M=clipLine(e.geometry,0,0,EXTENT,EXTENT);B<M.length;B+=1)for(var L=M[B],A=getAnchors(L,m,g,t[WritingMode.vertical]||t[WritingMode.horizontal],o,l,y,a.overscaling,EXTENT),T=0,V=A;T<V.length;T+=1){var _=V[T],k=t[WritingMode.horizontal];k&&a.anchorIsTooClose(k.text,I,_)||z(L,_);}else if("Polygon"===e.type)for(var C=0,E=classifyRings(e.geometry,0);C<E.length;C+=1){var P=E[C],F=findPoleOfInaccessibility(P,16);z(P[0],new Anchor(F.x,F.y,0));}else if("LineString"===e.type)for(var w=0,D=e.geometry;w<D.length;w+=1){var N=D[w];z(N,new Anchor(N[0].x,N[0].y,0));}else if("Point"===e.type)for(var q=0,U=e.geometry;q<U.length;q+=1)for(var W=U[q],Q=0,R=W;Q<R.length;Q+=1){var Z=R[Q];z([Z],new Anchor(Z.x,Z.y,0));}},SymbolBucket.prototype.anchorIsTooClose=function(e,t,o){var a=this.compareText;if(e in a){for(var i=a[e],r=i.length-1;r>=0;r--)if(o.dist(i[r])<t)return!0}else a[e]=[];return a[e].push(o),!1},SymbolBucket.prototype.place=function(e,t){var o=this;this.createArrays();var a=this.layers[0],i=a.layout,r=e.maxScale,n="map"===i["text-rotation-alignment"]&&"line"===i["symbol-placement"],s="map"===i["icon-rotation-alignment"]&&"line"===i["symbol-placement"],l=i["text-allow-overlap"]||i["icon-allow-overlap"]||i["text-ignore-placement"]||i["icon-ignore-placement"];if(l){var c=e.angle,u=Math.sin(c),y=Math.cos(c);this.symbolInstances.sort(function(e,t){var o=u*e.anchor.x+y*e.anchor.y|0,a=u*t.anchor.x+y*t.anchor.y|0;return o-a||t.featureIndex-e.featureIndex});}for(var p=0,m=o.symbolInstances;p<m.length;p+=1){var h=m[p],x={boxStartIndex:h.textBoxStartIndex,boxEndIndex:h.textBoxEndIndex},d={boxStartIndex:h.iconBoxStartIndex,boxEndIndex:h.iconBoxEndIndex},g=!(h.textBoxStartIndex===h.textBoxEndIndex),f=!(h.iconBoxStartIndex===h.iconBoxEndIndex),b=i["text-optional"]||!g,v=i["icon-optional"]||!f,S=g?e.placeCollisionFeature(x,i["text-allow-overlap"],i["symbol-avoid-edges"]):e.minScale,I=f?e.placeCollisionFeature(d,i["icon-allow-overlap"],i["symbol-avoid-edges"]):e.minScale;if(b||v?!v&&S?S=Math.max(I,S):!b&&I&&(I=Math.max(I,S)):I=S=Math.max(I,S),g&&(e.insertCollisionFeature(x,S,i["text-ignore-placement"]),S<=r)){var z=getSizeVertexData(a,o.zoom,o.textSizeData.coveringZoomRange,"text-size",h.featureProperties);o.addSymbols(o.arrays.glyph,h.glyphQuads,S,z,i["text-keep-upright"],n,e.angle,h.featureProperties,h.writingModes);}if(f&&(e.insertCollisionFeature(d,I,i["icon-ignore-placement"]),I<=r)){var B=getSizeVertexData(a,o.zoom,o.iconSizeData.coveringZoomRange,"icon-size",h.featureProperties);o.addSymbols(o.arrays.icon,h.iconQuads,I,B,i["icon-keep-upright"],s,e.angle,h.featureProperties);}}t&&this.addToDebugBuffers(e);},SymbolBucket.prototype.addSymbols=function(e,t,o,a,i,r,n,s,l){for(var c=e.elementArray,u=e.layoutVertexArray,y=this.zoom,p=Math.max(Math.log(o)/Math.LN2+y,0),m=0,h=t;m<h.length;m+=1){var x=h[m],d=(x.anchorAngle+n+Math.PI)%(2*Math.PI);if(l&WritingMode.vertical){if(r&&x.writingMode===WritingMode.vertical){if(i&&r&&d<=5*Math.PI/4||d>7*Math.PI/4)continue}else if(i&&r&&d<=3*Math.PI/4||d>5*Math.PI/4)continue}else if(i&&r&&(d<=Math.PI/2||d>3*Math.PI/2))continue;var g=x.tl,f=x.tr,b=x.bl,v=x.br,S=x.tex,I=x.anchorPoint,z=Math.max(y+Math.log(x.minScale)/Math.LN2,p),B=Math.min(y+Math.log(x.maxScale)/Math.LN2,25);if(!(B<=z)){z===p&&(z=0);var M=Math.round(x.glyphAngle/(2*Math.PI)*256),L=e.prepareSegment(4),A=L.vertexLength;addVertex(u,I.x,I.y,g.x,g.y,S.x,S.y,a,z,B,p,M),addVertex(u,I.x,I.y,f.x,f.y,S.x+S.w,S.y,a,z,B,p,M),addVertex(u,I.x,I.y,b.x,b.y,S.x,S.y+S.h,a,z,B,p,M),addVertex(u,I.x,I.y,v.x,v.y,S.x+S.w,S.y+S.h,a,z,B,p,M),c.emplaceBack(A,A+1,A+2),c.emplaceBack(A+1,A+2,A+3),L.vertexLength+=4,L.primitiveLength+=2;}}e.populatePaintArrays(s);},SymbolBucket.prototype.addToDebugBuffers=function(e){for(var t=this,o=this.arrays.collisionBox,a=o.layoutVertexArray,i=o.elementArray,r=-e.angle,n=e.yStretch,s=0,l=t.symbolInstances;s<l.length;s+=1){var c=l[s];c.textCollisionFeature={boxStartIndex:c.textBoxStartIndex,boxEndIndex:c.textBoxEndIndex},c.iconCollisionFeature={boxStartIndex:c.iconBoxStartIndex,boxEndIndex:c.iconBoxEndIndex};for(var u=0;u<2;u++){var y=c[0===u?"textCollisionFeature":"iconCollisionFeature"];if(y)for(var p=y.boxStartIndex;p<y.boxEndIndex;p++){var m=t.collisionBoxArray.get(p),h=m.anchorPoint,x=new Point(m.x1,m.y1*n)._rotate(r),d=new Point(m.x2,m.y1*n)._rotate(r),g=new Point(m.x1,m.y2*n)._rotate(r),f=new Point(m.x2,m.y2*n)._rotate(r),b=Math.max(0,Math.min(25,t.zoom+Math.log(m.maxScale)/Math.LN2)),v=Math.max(0,Math.min(25,t.zoom+Math.log(m.placementScale)/Math.LN2)),S=o.prepareSegment(4),I=S.vertexLength;addCollisionBoxVertex(a,h,x,b,v),addCollisionBoxVertex(a,h,d,b,v),addCollisionBoxVertex(a,h,f,b,v),addCollisionBoxVertex(a,h,g,b,v),i.emplaceBack(I,I+1),i.emplaceBack(I+1,I+2),i.emplaceBack(I+2,I+3),i.emplaceBack(I+3,I),S.vertexLength+=4,S.primitiveLength+=4;}}}},SymbolBucket.prototype.addSymbolInstance=function(e,t,o,a,i,r,n,s,l,c,u,y,p,m,h,x,d,g){var f,b,v=[],S=[];for(var I in o){var z=parseInt(I,10);o[z]&&(S=S.concat(r?getGlyphQuads(e,o[z],u,t,i,p,d,g):[]),f=new CollisionFeature(n,t,e,s,l,c,o[z],u,y,p,!1));}var B=f?f.boxStartIndex:this.collisionBoxArray.length,M=f?f.boxEndIndex:this.collisionBoxArray.length;a&&(v=r?getIconQuads(e,a,m,t,i,x,o[WritingMode.horizontal],d,g):[],b=new CollisionFeature(n,t,e,s,l,c,a,m,h,x,!0));var L=b?b.boxStartIndex:this.collisionBoxArray.length,A=b?b.boxEndIndex:this.collisionBoxArray.length;M>SymbolBucket.MAX_INSTANCES&&util.warnOnce("Too many symbols being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907"),A>SymbolBucket.MAX_INSTANCES&&util.warnOnce("Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907");var T=(o[WritingMode.vertical]?WritingMode.vertical:0)|(o[WritingMode.horizontal]?WritingMode.horizontal:0);this.symbolInstances.push({textBoxStartIndex:B,textBoxEndIndex:M,iconBoxStartIndex:L,iconBoxEndIndex:A,glyphQuads:S,iconQuads:v,anchor:e,featureIndex:s,featureProperties:g,writingModes:T});},SymbolBucket.programInterfaces=symbolInterfaces,SymbolBucket.MAX_INSTANCES=65535,module.exports=SymbolBucket;
; |
128 | },{"../../shaders/encode_attribute":81,"../../symbol/anchor":160,"../../symbol/clip_line":162,"../../symbol/collision_feature":164,"../../symbol/get_anchors":166,"../../symbol/mergelines":169,"../../symbol/quads":170,"../../symbol/shaping":171,"../../symbol/transform_text":173,"../../util/classify_rings":198,"../../util/find_pole_of_inaccessibility":204,"../../util/script_detection":211,"../../util/token":214,"../../util/util":215,"../array_group":44,"../buffer_group":52,"../element_array_type":53,"../extent":54,"../load_geometry":56,"point-geometry":26,"vector-tile":34}],51:[function(_dereq_,module,exports){
|
129 | var AttributeType={Int8:"BYTE",Uint8:"UNSIGNED_BYTE",Int16:"SHORT",Uint16:"UNSIGNED_SHORT"},Buffer=function(t,e,r){this.arrayBuffer=t.arrayBuffer,this.length=t.length,this.attributes=e.members,this.itemSize=e.bytesPerElement,this.type=r,this.arrayType=e;};Buffer.fromStructArray=function(t,e){return new Buffer(t.serialize(),t.constructor.serialize(),e)},Buffer.prototype.bind=function(t){var e=t[this.type];this.buffer?t.bindBuffer(e,this.buffer):(this.gl=t,this.buffer=t.createBuffer(),t.bindBuffer(e,this.buffer),t.bufferData(e,this.arrayBuffer,t.STATIC_DRAW),this.arrayBuffer=null);},Buffer.prototype.enableAttributes=function(t,e){for(var r=this,f=0;f<this.attributes.length;f++){var i=r.attributes[f],u=e[i.name];void 0!==u&&t.enableVertexAttribArray(u);}},Buffer.prototype.setVertexAttribPointers=function(t,e,r){for(var f=this,i=0;i<this.attributes.length;i++){var u=f.attributes[i],s=e[u.name];void 0!==s&&t.vertexAttribPointer(s,u.components,t[AttributeType[u.type]],!1,f.arrayType.bytesPerElement,u.offset+(f.arrayType.bytesPerElement*r||0));}},Buffer.prototype.destroy=function(){this.buffer&&this.gl.deleteBuffer(this.buffer);},Buffer.BufferType={VERTEX:"ARRAY_BUFFER",ELEMENT:"ELEMENT_ARRAY_BUFFER"},module.exports=Buffer;
; |
130 | },{}],52:[function(_dereq_,module,exports){
|
131 | var util=_dereq_("../util/util"),Buffer=_dereq_("./buffer"),ProgramConfiguration=_dereq_("./program_configuration"),createVertexArrayType=_dereq_("./vertex_array_type"),VertexArrayObject=_dereq_("../render/vertex_array_object"),BufferGroup=function(e,r,t,a){var f=this,u=createVertexArrayType(e.layoutAttributes);this.layoutVertexBuffer=new Buffer(a.layoutVertexArray,u.serialize(),Buffer.BufferType.VERTEX),a.elementArray&&(this.elementBuffer=new Buffer(a.elementArray,e.elementArrayType.serialize(),Buffer.BufferType.ELEMENT)),a.elementArray2&&(this.elementBuffer2=new Buffer(a.elementArray2,e.elementArrayType2.serialize(),Buffer.BufferType.ELEMENT)),this.layerData={};for(var n=0,i=r;n<i.length;n+=1){var s=i[n],o=a.paintVertexArrays&&a.paintVertexArrays[s.id],y=ProgramConfiguration.createDynamic(e.paintAttributes||[],s,t),l=o?new Buffer(o.array,o.type,Buffer.BufferType.VERTEX):null;f.layerData[s.id]={programConfiguration:y,paintVertexBuffer:l};}this.segments=a.segments,this.segments2=a.segments2;for(var m=0,B=[f.segments,f.segments2];m<B.length;m+=1)for(var p=B[m],g=0,v=p||[];g<v.length;g+=1){var h=v[g];h.vaos=util.mapObject(f.layerData,function(){return new VertexArrayObject});}};BufferGroup.prototype.destroy=function(){var e=this;this.layoutVertexBuffer.destroy(),this.elementBuffer&&this.elementBuffer.destroy(),this.elementBuffer2&&this.elementBuffer2.destroy();for(var r in e.layerData){var t=e.layerData[r].paintVertexBuffer;t&&t.destroy();}for(var a=0,f=[e.segments,e.segments2];a<f.length;a+=1)for(var u=f[a],n=0,i=u||[];n<i.length;n+=1){var s=i[n];for(var o in s.vaos)s.vaos[o].destroy();}},module.exports=BufferGroup;
; |
132 | },{"../render/vertex_array_object":80,"../util/util":215,"./buffer":51,"./program_configuration":58,"./vertex_array_type":60}],53:[function(_dereq_,module,exports){
|
133 | function createElementArrayType(e){return createStructArrayType({members:[{type:"Uint16",name:"vertices",components:e||3}]})}var createStructArrayType=_dereq_("../util/struct_array");module.exports=createElementArrayType;
; |
134 | },{"../util/struct_array":213}],54:[function(_dereq_,module,exports){
|
135 | module.exports=8192;
; |
136 | },{}],55:[function(_dereq_,module,exports){
|
137 | function translateDistance(e){return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function topDownFeatureComparator(e,t){return t-e}function getLineWidth(e,t){return t>0?t+2*e:e}function translate(e,t,r,i,a){if(!t[0]&&!t[1])return e;t=Point.convert(t),"viewport"===r&&t._rotate(-i);for(var n=[],s=0;s<e.length;s++){for(var o=e[s],l=[],u=0;u<o.length;u++)l.push(o[u].sub(t._mult(a)));n.push(l);}return n}function offsetLine(e,t){for(var r=[],i=new Point(0,0),a=0;a<e.length;a++){for(var n=e[a],s=[],o=0;o<n.length;o++){var l=n[o-1],u=n[o],c=n[o+1],y=0===o?i:u.sub(l)._unit()._perp(),f=o===n.length-1?i:c.sub(u)._unit()._perp(),h=y._add(f)._unit(),d=h.x*f.x+h.y*f.y;h._mult(1/d),s.push(h._mult(t)._add(u));}r.push(s);}return r}var Point=_dereq_("point-geometry"),loadGeometry=_dereq_("./load_geometry"),EXTENT=_dereq_("./extent"),featureFilter=_dereq_("../style-spec/feature_filter"),createStructArrayType=_dereq_("../util/struct_array"),Grid=_dereq_("grid-index"),DictionaryCoder=_dereq_("../util/dictionary_coder"),vt=_dereq_("vector-tile"),Protobuf=_dereq_("pbf"),GeoJSONFeature=_dereq_("../util/vectortile_to_geojson"),arraysIntersect=_dereq_("../util/util").arraysIntersect,intersection=_dereq_("../util/intersection_tests"),multiPolygonIntersectsBufferedMultiPoint=intersection.multiPolygonIntersectsBufferedMultiPoint,multiPolygonIntersectsMultiPolygon=intersection.multiPolygonIntersectsMultiPolygon,multiPolygonIntersectsBufferedMultiLine=intersection.multiPolygonIntersectsBufferedMultiLine,FeatureIndexArray=createStructArrayType({members:[{type:"Uint32",name:"featureIndex"},{type:"Uint16",name:"sourceLayerIndex"},{type:"Uint16",name:"bucketIndex"}]}),FeatureIndex=function(e,t,r){if(e.grid){var i=e,a=t;e=i.coord,t=i.overscaling,this.grid=new Grid(i.grid),this.featureIndexArray=new FeatureIndexArray(i.featureIndexArray),this.rawTileData=a,this.bucketLayerIDs=i.bucketLayerIDs,this.paintPropertyStatistics=i.paintPropertyStatistics;}else this.grid=new Grid(EXTENT,16,0),this.featureIndexArray=new FeatureIndexArray;this.coord=e,this.overscaling=t,this.x=e.x,this.y=e.y,this.z=e.z-Math.log(t)/Math.LN2,this.setCollisionTile(r);};FeatureIndex.prototype.insert=function(e,t){var r=this,i=this.featureIndexArray.length;this.featureIndexArray.emplaceBack(e.index,e.sourceLayerIndex,t);for(var a=loadGeometry(e),n=0;n<a.length;n++){for(var s=a[n],o=[1/0,1/0,-(1/0),-(1/0)],l=0;l<s.length;l++){var u=s[l];o[0]=Math.min(o[0],u.x),o[1]=Math.min(o[1],u.y),o[2]=Math.max(o[2],u.x),o[3]=Math.max(o[3],u.y);}r.grid.insert(i,o[0],o[1],o[2],o[3]);}},FeatureIndex.prototype.setCollisionTile=function(e){this.collisionTile=e;},FeatureIndex.prototype.serialize=function(e){var t=this.grid.toArrayBuffer();return e&&e.push(t),{coord:this.coord,overscaling:this.overscaling,grid:t,featureIndexArray:this.featureIndexArray.serialize(e),bucketLayerIDs:this.bucketLayerIDs,paintPropertyStatistics:this.paintPropertyStatistics}},FeatureIndex.prototype.query=function(e,t){var r=this;this.vtLayers||(this.vtLayers=new vt.VectorTile(new Protobuf(this.rawTileData)).layers,this.sourceLayerCoder=new DictionaryCoder(this.vtLayers?Object.keys(this.vtLayers).sort():["_geojsonTileLayer"]));var i={},a=e.params||{},n=EXTENT/e.tileSize/e.scale,s=featureFilter(a.filter),o=0;for(var l in t)if(r.hasLayer(l)){var u=t[l],c=0;if("line"===u.type){var y=getLineWidth(r.getPaintValue("line-width",u),r.getPaintValue("line-gap-width",u)),f=r.getPaintValue("line-offset",u),h=r.getPaintValue("line-translate",u);c=y/2+Math.abs(f)+translateDistance(h);}else"fill"===u.type?c=translateDistance(r.getPaintValue("fill-translate",u)):"fill-extrusion"===u.type?c=translateDistance(r.getPaintValue("fill-extrusion-translate",u)):"circle"===u.type&&(c=r.getPaintValue("circle-radius",u)+translateDistance(r.getPaintValue("circle-translate",u)));o=Math.max(o,c*n);}for(var d=e.queryGeometry.map(function(e){return e.map(function(e){return new Point(e.x,e.y)})}),g=1/0,p=1/0,v=-(1/0),x=-(1/0),P=0;P<d.length;P++)for(var I=d[P],m=0;m<I.length;m++){var L=I[m];g=Math.min(g,L.x),p=Math.min(p,L.y),v=Math.max(v,L.x),x=Math.max(x,L.y);}var M=this.grid.query(g-o,p-o,v+o,x+o);M.sort(topDownFeatureComparator),this.filterMatching(i,M,this.featureIndexArray,d,s,a.layers,t,e.bearing,n);var b=this.collisionTile.queryRenderedSymbols(d,e.scale);return b.sort(),this.filterMatching(i,b,this.collisionTile.collisionBoxArray,d,s,a.layers,t,e.bearing,n),i},FeatureIndex.prototype.filterMatching=function(e,t,r,i,a,n,s,o,l){for(var u,c=this,y=0;y<t.length;y++){var f=t[y];if(f!==u){u=f;var h=r.get(f),d=c.bucketLayerIDs[h.bucketIndex];if(!n||arraysIntersect(n,d)){var g=c.sourceLayerCoder.decode(h.sourceLayerIndex),p=c.vtLayers[g],v=p.feature(h.featureIndex);if(a(v))for(var x=null,P=0;P<d.length;P++){var I=d[P];if(!(n&&n.indexOf(I)<0)){var m=s[I];if(m){var L=void 0;if("symbol"!==m.type)if(x||(x=loadGeometry(v)),"line"===m.type){L=translate(i,c.getPaintValue("line-translate",m,v),c.getPaintValue("line-translate-anchor",m,v),o,l);var M=l/2*getLineWidth(c.getPaintValue("line-width",m,v),c.getPaintValue("line-gap-width",m,v)),b=c.getPaintValue("line-offset",m,v);if(b&&(x=offsetLine(x,b*l)),!multiPolygonIntersectsBufferedMultiLine(L,x,M))continue}else if("fill"===m.type||"fill-extrusion"===m.type){var V=m.type;if(L=translate(i,c.getPaintValue(V+"-translate",m,v),c.getPaintValue(V+"-translate-anchor",m,v),o,l),!multiPolygonIntersectsMultiPolygon(L,x))continue}else if("circle"===m.type){L=translate(i,c.getPaintValue("circle-translate",m,v),c.getPaintValue("circle-translate-anchor",m,v),o,l);var w=c.getPaintValue("circle-radius",m,v)*l;if(!multiPolygonIntersectsBufferedMultiPoint(L,x,w))continue}var F=new GeoJSONFeature(v,c.z,c.x,c.y);F.layer=m.serialize();var _=e[I];void 0===_&&(_=e[I]=[]),_.push(F);}}}}}}},FeatureIndex.prototype.hasLayer=function(e){var t=this;for(var r in t.bucketLayerIDs)for(var i=0,a=t.bucketLayerIDs[r];i<a.length;i+=1){var n=a[i];if(e===n)return!0}return!1},FeatureIndex.prototype.getPaintValue=function(e,t,r){var i=t.isPaintValueFeatureConstant(e);if(i||r){var a=r?r.properties:{};return t.getPaintValue(e,{zoom:this.z},a)}return this.paintPropertyStatistics[t.id][e].max},module.exports=FeatureIndex;
; |
138 | },{"../style-spec/feature_filter":105,"../util/dictionary_coder":200,"../util/intersection_tests":207,"../util/struct_array":213,"../util/util":215,"../util/vectortile_to_geojson":216,"./extent":54,"./load_geometry":56,"grid-index":16,"pbf":25,"point-geometry":26,"vector-tile":34}],56:[function(_dereq_,module,exports){
|
139 | function createBounds(e){return{min:-1*Math.pow(2,e-1),max:Math.pow(2,e-1)-1}}var util=_dereq_("../util/util"),EXTENT=_dereq_("./extent"),boundsLookup={15:createBounds(15),16:createBounds(16)};module.exports=function(e,t){for(var r=boundsLookup[t||16],o=EXTENT/e.extent,u=e.loadGeometry(),n=0;n<u.length;n++)for(var a=u[n],i=0;i<a.length;i++){var d=a[i];d.x=Math.round(d.x*o),d.y=Math.round(d.y*o),(d.x<r.min||d.x>r.max||d.y<r.min||d.y>r.max)&&util.warnOnce("Geometry exceeds allowed extent, reduce your vector tile buffer size");}return u};
; |
140 | },{"../util/util":215,"./extent":54}],57:[function(_dereq_,module,exports){
|
141 | var createStructArrayType=_dereq_("../util/struct_array"),PosArray=createStructArrayType({members:[{name:"a_pos",type:"Int16",components:2}]});module.exports=PosArray;
; |
142 | },{"../util/struct_array":213}],58:[function(_dereq_,module,exports){
|
143 | function getPaintAttributeValue(t,r,e,i){if(!t.zoomStops)return r.getPaintValue(t.property,e,i);var a=t.zoomStops.map(function(a){return r.getPaintValue(t.property,util.extend({},e,{zoom:a}),i)});return 1===a.length?a[0]:a}function normalizePaintAttribute(t,r){var e=t.name;e||(e=t.property.replace(r.type+"-","").replace(/-/g,"_"));var i="color"===r._paintSpecifications[t.property].type;return util.extend({name:"a_"+e,components:i?4:1,multiplier:i?255:1,dimensions:i?4:1},t)}var createVertexArrayType=_dereq_("./vertex_array_type"),util=_dereq_("../util/util"),ProgramConfiguration=function(){this.attributes=[],this.uniforms=[],this.interpolationUniforms=[],this.pragmas={vertex:{},fragment:{}},this.cacheKey="";};ProgramConfiguration.createDynamic=function(t,r,e){for(var i=new ProgramConfiguration,a=0,n=t;a<n.length;a+=1){var o=n[a],p=normalizePaintAttribute(o,r),u=p.name.slice(2);r.isPaintValueFeatureConstant(p.property)?i.addZoomAttribute(u,p):r.isPaintValueZoomConstant(p.property)?i.addPropertyAttribute(u,p):i.addZoomAndPropertyAttribute(u,p,r,e);}return i.PaintVertexArray=createVertexArrayType(i.attributes),i},ProgramConfiguration.createStatic=function(t){for(var r=new ProgramConfiguration,e=0,i=t;e<i.length;e+=1){var a=i[e];r.addUniform(a,"u_"+a);}return r},ProgramConfiguration.prototype.addUniform=function(t,r){var e=this.getPragmas(t);e.define.push("uniform {precision} {type} "+r+";"),e.initialize.push("{precision} {type} "+t+" = "+r+";"),this.cacheKey+="/u_"+t;},ProgramConfiguration.prototype.addZoomAttribute=function(t,r){this.uniforms.push(r),this.addUniform(t,r.name);},ProgramConfiguration.prototype.addPropertyAttribute=function(t,r){var e=this.getPragmas(t);this.attributes.push(r),e.define.push("varying {precision} {type} "+t+";"),e.vertex.define.push("attribute {precision} {type} "+r.name+";"),e.vertex.initialize.push(t+" = "+r.name+" / "+r.multiplier+".0;"),this.cacheKey+="/a_"+t;},ProgramConfiguration.prototype.addZoomAndPropertyAttribute=function(t,r,e,i){var a=this,n=this.getPragmas(t);n.define.push("varying {precision} {type} "+t+";");var o=e.getPaintValueStopZoomLevels(r.property),p=0;if(o.length>4)for(;p<o.length-2&&o[p]<i;)p++;var u="u_"+t+"_t";n.vertex.define.push("uniform lowp float "+u+";"),this.interpolationUniforms.push({name:u,property:r.property,stopOffset:p});for(var s=[],m=0;m<4;m++)s.push(o[Math.min(p+m,o.length-1)]);var f=[];if(1===r.components)this.attributes.push(util.extend({},r,{components:4,zoomStops:s})),n.vertex.define.push("attribute {precision} vec4 "+r.name+";"),f.push(r.name);else for(var g=0;g<4;g++){var h=r.name+g;f.push(h),a.attributes.push(util.extend({},r,{name:h,zoomStops:[s[g]]})),n.vertex.define.push("attribute {precision} {type} "+h+";");}n.vertex.initialize.push(t+" = evaluate_zoom_function_"+r.components+"( "+f.join(", ")+", "+u+") / "+r.multiplier+".0;"),this.cacheKey+="/z_"+t;},ProgramConfiguration.prototype.getPragmas=function(t){return this.pragmas[t]||(this.pragmas[t]={define:[],initialize:[]},this.pragmas[t].fragment={define:[],initialize:[]},this.pragmas[t].vertex={define:[],initialize:[]}),this.pragmas[t]},ProgramConfiguration.prototype.applyPragmas=function(t,r){var e=this;return t.replace(/#pragma mapbox: ([\w]+) ([\w]+) ([\w]+) ([\w]+)/g,function(t,i,a,n,o){return e.pragmas[o][i].concat(e.pragmas[o][r][i]).join("\n").replace(/{type}/g,n).replace(/{precision}/g,a)})},ProgramConfiguration.prototype.createPaintPropertyStatistics=function(){for(var t=this,r={},e=0,i=t.attributes;e<i.length;e+=1){var a=i[e];1===a.dimensions&&(r[a.property]={max:-(1/0)});}return r},ProgramConfiguration.prototype.populatePaintArray=function(t,r,e,i,a,n){var o=this,p=r.length;r.resize(i);for(var u=0,s=o.attributes;u<s.length;u+=1)for(var m=s[u],f=getPaintAttributeValue(m,t,a,n),g=p;g<i;g++){var h=r.get(g);if(4===m.components)for(var l=0;l<4;l++)h[m.name+l]=f[l]*m.multiplier;else h[m.name]=f*m.multiplier;if(1===m.dimensions){var c=e[m.property];c.max=Math.max(c.max,1===m.components?f:Math.max.apply(Math,f));}}},ProgramConfiguration.prototype.setUniforms=function(t,r,e,i){for(var a=this,n=0,o=a.uniforms;n<o.length;n+=1){var p=o[n],u=e.getPaintValue(p.property,i);4===p.components?t.uniform4fv(r[p.name],u):t.uniform1f(r[p.name],u);}for(var s=0,m=a.interpolationUniforms;s<m.length;s+=1){var f=m[s],g=e.getPaintInterpolationT(f.property,i);t.uniform1f(r[f.name],Math.max(0,Math.min(3,g-f.stopOffset)));}},module.exports=ProgramConfiguration;
; |
144 | },{"../util/util":215,"./vertex_array_type":60}],59:[function(_dereq_,module,exports){
|
145 | var createStructArrayType=_dereq_("../util/struct_array"),RasterBoundsArray=createStructArrayType({members:[{name:"a_pos",type:"Int16",components:2},{name:"a_texture_pos",type:"Int16",components:2}]});module.exports=RasterBoundsArray;
; |
146 | },{"../util/struct_array":213}],60:[function(_dereq_,module,exports){
|
147 | function createVertexArrayType(r){return createStructArrayType({members:r,alignment:4})}var createStructArrayType=_dereq_("../util/struct_array");module.exports=createVertexArrayType;
; |
148 | },{"../util/struct_array":213}],61:[function(_dereq_,module,exports){
|
149 | var Coordinate=function(o,t,n){this.column=o,this.row=t,this.zoom=n;};Coordinate.prototype.clone=function(){return new Coordinate(this.column,this.row,this.zoom)},Coordinate.prototype.zoomTo=function(o){return this.clone()._zoomTo(o)},Coordinate.prototype.sub=function(o){return this.clone()._sub(o)},Coordinate.prototype._zoomTo=function(o){var t=Math.pow(2,o-this.zoom);return this.column*=t,this.row*=t,this.zoom=o,this},Coordinate.prototype._sub=function(o){return o=o.zoomTo(this.zoom),this.column-=o.column,this.row-=o.row,this},module.exports=Coordinate;
; |
150 | },{}],62:[function(_dereq_,module,exports){
|
151 | var wrap=_dereq_("../util/util").wrap,LngLat=function(t,n){if(isNaN(t)||isNaN(n))throw new Error("Invalid LngLat object: ("+t+", "+n+")");if(this.lng=+t,this.lat=+n,this.lat>90||this.lat<-90)throw new Error("Invalid LngLat latitude value: must be between -90 and 90")};LngLat.prototype.wrap=function(){return new LngLat(wrap(this.lng,-180,180),this.lat)},LngLat.prototype.toArray=function(){return[this.lng,this.lat]},LngLat.prototype.toString=function(){return"LngLat("+this.lng+", "+this.lat+")"},LngLat.convert=function(t){if(t instanceof LngLat)return t;if(Array.isArray(t)&&2===t.length)return new LngLat(Number(t[0]),Number(t[1]));if(!Array.isArray(t)&&"object"==typeof t&&null!==t)return new LngLat(Number(t.lng),Number(t.lat));throw new Error("`LngLatLike` argument must be specified as a LngLat instance, an object {lng: <lng>, lat: <lat>}, or an array of [<lng>, <lat>]")},module.exports=LngLat;
; |
152 | },{"../util/util":215}],63:[function(_dereq_,module,exports){
|
153 | var LngLat=_dereq_("./lng_lat"),LngLatBounds=function(t,n){t&&(n?this.setSouthWest(t).setNorthEast(n):4===t.length?this.setSouthWest([t[0],t[1]]).setNorthEast([t[2],t[3]]):this.setSouthWest(t[0]).setNorthEast(t[1]));};LngLatBounds.prototype.setNorthEast=function(t){return this._ne=LngLat.convert(t),this},LngLatBounds.prototype.setSouthWest=function(t){return this._sw=LngLat.convert(t),this},LngLatBounds.prototype.extend=function(t){var n,e,s=this._sw,o=this._ne;if(t instanceof LngLat)n=t,e=t;else{if(!(t instanceof LngLatBounds))return Array.isArray(t)?t.every(Array.isArray)?this.extend(LngLatBounds.convert(t)):this.extend(LngLat.convert(t)):this;if(n=t._sw,e=t._ne,!n||!e)return this}return s||o?(s.lng=Math.min(n.lng,s.lng),s.lat=Math.min(n.lat,s.lat),o.lng=Math.max(e.lng,o.lng),o.lat=Math.max(e.lat,o.lat)):(this._sw=new LngLat(n.lng,n.lat),this._ne=new LngLat(e.lng,e.lat)),this},LngLatBounds.prototype.getCenter=function(){return new LngLat((this._sw.lng+this._ne.lng)/2,(this._sw.lat+this._ne.lat)/2)},LngLatBounds.prototype.getSouthWest=function(){return this._sw},LngLatBounds.prototype.getNorthEast=function(){return this._ne},LngLatBounds.prototype.getNorthWest=function(){return new LngLat(this.getWest(),this.getNorth())},LngLatBounds.prototype.getSouthEast=function(){return new LngLat(this.getEast(),this.getSouth())},LngLatBounds.prototype.getWest=function(){return this._sw.lng},LngLatBounds.prototype.getSouth=function(){return this._sw.lat},LngLatBounds.prototype.getEast=function(){return this._ne.lng},LngLatBounds.prototype.getNorth=function(){return this._ne.lat},LngLatBounds.prototype.toArray=function(){return[this._sw.toArray(),this._ne.toArray()]},LngLatBounds.prototype.toString=function(){return"LngLatBounds("+this._sw.toString()+", "+this._ne.toString()+")"},LngLatBounds.convert=function(t){return!t||t instanceof LngLatBounds?t:new LngLatBounds(t)},module.exports=LngLatBounds;
; |
154 | },{"./lng_lat":62}],64:[function(_dereq_,module,exports){
|
155 | var LngLat=_dereq_("./lng_lat"),Point=_dereq_("point-geometry"),Coordinate=_dereq_("./coordinate"),util=_dereq_("../util/util"),interp=_dereq_("../style-spec/util/interpolate"),TileCoord=_dereq_("../source/tile_coord"),EXTENT=_dereq_("../data/extent"),glmatrix=_dereq_("@mapbox/gl-matrix"),vec4=glmatrix.vec4,mat4=glmatrix.mat4,mat2=glmatrix.mat2,Transform=function(t,i,o){this.tileSize=512,this._renderWorldCopies=void 0===o||o,this._minZoom=t||0,this._maxZoom=i||22,this.latRange=[-85.05113,85.05113],this.width=0,this.height=0,this._center=new LngLat(0,0),this.zoom=0,this.angle=0,this._fov=.6435011087932844,this._pitch=0,this._unmodified=!0;},prototypeAccessors={minZoom:{},maxZoom:{},renderWorldCopies:{},worldSize:{},centerPoint:{},size:{},bearing:{},pitch:{},fov:{},zoom:{},center:{},unmodified:{},x:{},y:{},point:{}};prototypeAccessors.minZoom.get=function(){return this._minZoom},prototypeAccessors.minZoom.set=function(t){this._minZoom!==t&&(this._minZoom=t,this.zoom=Math.max(this.zoom,t));},prototypeAccessors.maxZoom.get=function(){return this._maxZoom},prototypeAccessors.maxZoom.set=function(t){this._maxZoom!==t&&(this._maxZoom=t,this.zoom=Math.min(this.zoom,t));},prototypeAccessors.renderWorldCopies.get=function(){return this._renderWorldCopies},prototypeAccessors.worldSize.get=function(){return this.tileSize*this.scale},prototypeAccessors.centerPoint.get=function(){return this.size._div(2)},prototypeAccessors.size.get=function(){return new Point(this.width,this.height)},prototypeAccessors.bearing.get=function(){return-this.angle/Math.PI*180},prototypeAccessors.bearing.set=function(t){var i=-util.wrap(t,-180,180)*Math.PI/180;this.angle!==i&&(this._unmodified=!1,this.angle=i,this._calcMatrices(),this.rotationMatrix=mat2.create(),mat2.rotate(this.rotationMatrix,this.rotationMatrix,this.angle));},prototypeAccessors.pitch.get=function(){return this._pitch/Math.PI*180},prototypeAccessors.pitch.set=function(t){var i=util.clamp(t,0,60)/180*Math.PI;this._pitch!==i&&(this._unmodified=!1,this._pitch=i,this._calcMatrices());},prototypeAccessors.fov.get=function(){return this._fov/Math.PI*180},prototypeAccessors.fov.set=function(t){t=Math.max(.01,Math.min(60,t)),this._fov!==t&&(this._unmodified=!1,this._fov=t/180*Math.PI,this._calcMatrices());},prototypeAccessors.zoom.get=function(){return this._zoom},prototypeAccessors.zoom.set=function(t){var i=Math.min(Math.max(t,this.minZoom),this.maxZoom);this._zoom!==i&&(this._unmodified=!1,this._zoom=i,this.scale=this.zoomScale(i),this.tileZoom=Math.floor(i),this.zoomFraction=i-this.tileZoom,this._constrain(),this._calcMatrices());},prototypeAccessors.center.get=function(){return this._center},prototypeAccessors.center.set=function(t){t.lat===this._center.lat&&t.lng===this._center.lng||(this._unmodified=!1,this._center=t,this._constrain(),this._calcMatrices());},Transform.prototype.coveringZoomLevel=function(t){return(t.roundZoom?Math.round:Math.floor)(this.zoom+this.scaleZoom(this.tileSize/t.tileSize))},Transform.prototype.getVisibleWrappedCoordinates=function(t){for(var i=this.pointCoordinate(new Point(0,0),0),o=this.pointCoordinate(new Point(this.width,0),0),e=Math.floor(i.column),r=Math.floor(o.column),n=[t],s=e;s<=r;s++)0!==s&&n.push(new TileCoord(t.z,t.x,t.y,s));return n},Transform.prototype.coveringTiles=function(t){var i=this.coveringZoomLevel(t),o=i;if(i<t.minzoom)return[];i>t.maxzoom&&(i=t.maxzoom);var e=this.pointCoordinate(this.centerPoint,i),r=new Point(e.column-.5,e.row-.5),n=[this.pointCoordinate(new Point(0,0),i),this.pointCoordinate(new Point(this.width,0),i),this.pointCoordinate(new Point(this.width,this.height),i),this.pointCoordinate(new Point(0,this.height),i)];return TileCoord.cover(i,n,t.reparseOverscaled?o:i,this._renderWorldCopies).sort(function(t,i){return r.dist(t)-r.dist(i)})},Transform.prototype.resize=function(t,i){this.width=t,this.height=i,this.pixelsToGLUnits=[2/t,-2/i],this._constrain(),this._calcMatrices();},prototypeAccessors.unmodified.get=function(){return this._unmodified},Transform.prototype.zoomScale=function(t){return Math.pow(2,t)},Transform.prototype.scaleZoom=function(t){return Math.log(t)/Math.LN2},Transform.prototype.project=function(t){return new Point(this.lngX(t.lng),this.latY(t.lat))},Transform.prototype.unproject=function(t){return new LngLat(this.xLng(t.x),this.yLat(t.y))},prototypeAccessors.x.get=function(){return this.lngX(this.center.lng)},prototypeAccessors.y.get=function(){return this.latY(this.center.lat)},prototypeAccessors.point.get=function(){return new Point(this.x,this.y)},Transform.prototype.lngX=function(t){return(180+t)*this.worldSize/360},Transform.prototype.latY=function(t){var i=180/Math.PI*Math.log(Math.tan(Math.PI/4+t*Math.PI/360));return(180-i)*this.worldSize/360},Transform.prototype.xLng=function(t){return 360*t/this.worldSize-180},Transform.prototype.yLat=function(t){var i=180-360*t/this.worldSize;return 360/Math.PI*Math.atan(Math.exp(i*Math.PI/180))-90},Transform.prototype.setLocationAtPoint=function(t,i){var o=this.pointCoordinate(i)._sub(this.pointCoordinate(this.centerPoint));this.center=this.coordinateLocation(this.locationCoordinate(t)._sub(o)),this._renderWorldCopies&&(this.center=this.center.wrap());},Transform.prototype.locationPoint=function(t){return this.coordinatePoint(this.locationCoordinate(t))},Transform.prototype.pointLocation=function(t){return this.coordinateLocation(this.pointCoordinate(t))},Transform.prototype.locationCoordinate=function(t){return new Coordinate(this.lngX(t.lng)/this.tileSize,this.latY(t.lat)/this.tileSize,this.zoom).zoomTo(this.tileZoom)},Transform.prototype.coordinateLocation=function(t){var i=t.zoomTo(this.zoom);return new LngLat(this.xLng(i.column*this.tileSize),this.yLat(i.row*this.tileSize))},Transform.prototype.pointCoordinate=function(t,i){void 0===i&&(i=this.tileZoom);var o=0,e=[t.x,t.y,0,1],r=[t.x,t.y,1,1];vec4.transformMat4(e,e,this.pixelMatrixInverse),vec4.transformMat4(r,r,this.pixelMatrixInverse);var n=e[3],s=r[3],a=e[0]/n,h=r[0]/s,c=e[1]/n,m=r[1]/s,p=e[2]/n,l=r[2]/s,u=p===l?0:(o-p)/(l-p);return new Coordinate(interp(a,h,u)/this.tileSize,interp(c,m,u)/this.tileSize,this.zoom)._zoomTo(i)},Transform.prototype.coordinatePoint=function(t){var i=t.zoomTo(this.zoom),o=[i.column*this.tileSize,i.row*this.tileSize,0,1];return vec4.transformMat4(o,o,this.pixelMatrix),new Point(o[0]/o[3],o[1]/o[3])},Transform.prototype.calculatePosMatrix=function(t,i){var o=t.toCoordinate(i),e=this.worldSize/this.zoomScale(o.zoom),r=mat4.identity(new Float64Array(16));return mat4.translate(r,r,[o.column*e,o.row*e,0]),mat4.scale(r,r,[e/EXTENT,e/EXTENT,1]),mat4.multiply(r,this.projMatrix,r),new Float32Array(r)},Transform.prototype._constrain=function(){if(this.center&&this.width&&this.height&&!this._constraining){this._constraining=!0;var t,i,o,e,r=-90,n=90,s=-180,a=180,h=this.size,c=this._unmodified;if(this.latRange){var m=this.latRange;r=this.latY(m[1]),n=this.latY(m[0]),t=n-r<h.y?h.y/(n-r):0;}if(this.lngRange){var p=this.lngRange;s=this.lngX(p[0]),a=this.lngX(p[1]),i=a-s<h.x?h.x/(a-s):0;}var l=Math.max(i||0,t||0);if(l)return this.center=this.unproject(new Point(i?(a+s)/2:this.x,t?(n+r)/2:this.y)),this.zoom+=this.scaleZoom(l),this._unmodified=c,void(this._constraining=!1);if(this.latRange){var u=this.y,f=h.y/2;u-f<r&&(e=r+f),u+f>n&&(e=n-f);}if(this.lngRange){var d=this.x,g=h.x/2;d-g<s&&(o=s+g),d+g>a&&(o=a-g);}void 0===o&&void 0===e||(this.center=this.unproject(new Point(void 0!==o?o:this.x,void 0!==e?e:this.y))),this._unmodified=c,this._constraining=!1;}},Transform.prototype._calcMatrices=function(){if(this.height){this.cameraToCenterDistance=.5/Math.tan(this._fov/2)*this.height;var t=this._fov/2,i=Math.PI/2+this._pitch,o=Math.sin(t)*this.cameraToCenterDistance/Math.sin(Math.PI-i-t),e=Math.cos(Math.PI/2-this._pitch)*o+this.cameraToCenterDistance,r=1.01*e,n=new Float64Array(16);mat4.perspective(n,this._fov,this.width/this.height,1,r),mat4.scale(n,n,[1,-1,1]),mat4.translate(n,n,[0,0,-this.cameraToCenterDistance]),mat4.rotateX(n,n,this._pitch),mat4.rotateZ(n,n,this.angle),mat4.translate(n,n,[-this.x,-this.y,0]);var s=this.worldSize/(2*Math.PI*6378137*Math.abs(Math.cos(this.center.lat*(Math.PI/180))));if(mat4.scale(n,n,[1,1,s,1]),this.projMatrix=n,n=mat4.create(),mat4.scale(n,n,[this.width/2,-this.height/2,1]),mat4.translate(n,n,[1,-1,0]),this.pixelMatrix=mat4.multiply(new Float64Array(16),n,this.projMatrix),n=mat4.invert(new Float64Array(16),this.pixelMatrix),!n)throw new Error("failed to invert matrix");this.pixelMatrixInverse=n;}},Object.defineProperties(Transform.prototype,prototypeAccessors),module.exports=Transform;
; |
156 | },{"../data/extent":54,"../source/tile_coord":96,"../style-spec/util/interpolate":123,"../util/util":215,"./coordinate":61,"./lng_lat":62,"@mapbox/gl-matrix":1,"point-geometry":26}],65:[function(_dereq_,module,exports){
|
157 | var browser=_dereq_("./util/browser"),mapboxgl=module.exports={};mapboxgl.version=_dereq_("../package.json").version,mapboxgl.workerCount=Math.max(Math.floor(browser.hardwareConcurrency/2),1),mapboxgl.Map=_dereq_("./ui/map"),mapboxgl.NavigationControl=_dereq_("./ui/control/navigation_control"),mapboxgl.GeolocateControl=_dereq_("./ui/control/geolocate_control"),mapboxgl.AttributionControl=_dereq_("./ui/control/attribution_control"),mapboxgl.ScaleControl=_dereq_("./ui/control/scale_control"),mapboxgl.FullscreenControl=_dereq_("./ui/control/fullscreen_control"),mapboxgl.Popup=_dereq_("./ui/popup"),mapboxgl.Marker=_dereq_("./ui/marker"),mapboxgl.Style=_dereq_("./style/style"),mapboxgl.LngLat=_dereq_("./geo/lng_lat"),mapboxgl.LngLatBounds=_dereq_("./geo/lng_lat_bounds"),mapboxgl.Point=_dereq_("point-geometry"),mapboxgl.Evented=_dereq_("./util/evented"),mapboxgl.supported=_dereq_("./util/browser").supported;var config=_dereq_("./util/config");mapboxgl.config=config;var rtlTextPlugin=_dereq_("./source/rtl_text_plugin");mapboxgl.setRTLTextPlugin=rtlTextPlugin.setRTLTextPlugin,Object.defineProperty(mapboxgl,"accessToken",{get:function(){return config.ACCESS_TOKEN},set:function(o){config.ACCESS_TOKEN=o;}});
; |
158 | },{"../package.json":43,"./geo/lng_lat":62,"./geo/lng_lat_bounds":63,"./source/rtl_text_plugin":91,"./style/style":149,"./ui/control/attribution_control":176,"./ui/control/fullscreen_control":177,"./ui/control/geolocate_control":178,"./ui/control/navigation_control":180,"./ui/control/scale_control":181,"./ui/map":190,"./ui/marker":191,"./ui/popup":192,"./util/browser":195,"./util/config":199,"./util/evented":203,"point-geometry":26}],66:[function(_dereq_,module,exports){
|
159 | function drawBackground(r,t,e){var a=r.gl,i=r.transform,n=i.tileSize,o=e.paint["background-color"],l=e.paint["background-pattern"],u=e.paint["background-opacity"],f=!l&&1===o[3]&&1===u;if(r.isOpaquePass===f){a.disable(a.STENCIL_TEST),r.setDepthSublayer(0);var s;l?(s=r.useProgram("fillPattern",r.basicFillProgramConfiguration),pattern.prepare(l,r,s),r.tileExtentPatternVAO.bind(a,s,r.tileExtentBuffer)):(s=r.useProgram("fill",r.basicFillProgramConfiguration),a.uniform4fv(s.u_color,o),r.tileExtentVAO.bind(a,s,r.tileExtentBuffer)),a.uniform1f(s.u_opacity,u);for(var c=i.coveringTiles({tileSize:n}),g=0,p=c;g<p.length;g+=1){var d=p[g];l&&pattern.setTile({coord:d,tileSize:n},r,s),a.uniformMatrix4fv(s.u_matrix,!1,r.transform.calculatePosMatrix(d)),a.drawArrays(a.TRIANGLE_STRIP,0,r.tileExtentBuffer.length);}}}var pattern=_dereq_("./pattern");module.exports=drawBackground;
; |
160 | },{"./pattern":78}],67:[function(_dereq_,module,exports){
|
161 | function drawCircles(e,r,t,a){if(!e.isOpaquePass){var i=e.gl;e.setDepthSublayer(0),e.depthMask(!1),i.disable(i.STENCIL_TEST);for(var s=0;s<a.length;s++){var o=a[s],n=r.getTile(o),f=n.getBucket(t);if(f){var l=f.buffers,m=l.layerData[t.id],u=m.programConfiguration,c=e.useProgram("circle",u);u.setUniforms(i,c,t,{zoom:e.transform.zoom}),"map"===t.paint["circle-pitch-scale"]?(i.uniform1i(c.u_scale_with_map,!0),i.uniform2f(c.u_extrude_scale,e.transform.pixelsToGLUnits[0]*e.transform.cameraToCenterDistance,e.transform.pixelsToGLUnits[1]*e.transform.cameraToCenterDistance)):(i.uniform1i(c.u_scale_with_map,!1),i.uniform2fv(c.u_extrude_scale,e.transform.pixelsToGLUnits)),i.uniform1f(c.u_devicepixelratio,browser.devicePixelRatio),i.uniformMatrix4fv(c.u_matrix,!1,e.translatePosMatrix(o.posMatrix,n,t.paint["circle-translate"],t.paint["circle-translate-anchor"]));for(var p=0,v=l.segments;p<v.length;p+=1){var x=v[p];x.vaos[t.id].bind(i,c,l.layoutVertexBuffer,l.elementBuffer,m.paintVertexBuffer,x.vertexOffset),i.drawElements(i.TRIANGLES,3*x.primitiveLength,i.UNSIGNED_SHORT,3*x.primitiveOffset*2);}}}}}var browser=_dereq_("../util/browser");module.exports=drawCircles;
; |
162 | },{"../util/browser":195}],68:[function(_dereq_,module,exports){
|
163 | function drawCollisionDebug(e,o,r,i){var t=e.gl;t.enable(t.STENCIL_TEST);for(var f=e.useProgram("collisionBox"),l=0;l<i.length;l++){var n=i[l],a=o.getTile(n),s=a.getBucket(r);if(s){var u=s.buffers.collisionBox;if(u){t.uniformMatrix4fv(f.u_matrix,!1,n.posMatrix),e.enableTileClippingMask(n),e.lineWidth(1),t.uniform1f(f.u_scale,Math.pow(2,e.transform.zoom-a.coord.z)),t.uniform1f(f.u_zoom,10*e.transform.zoom),t.uniform1f(f.u_maxzoom,10*(a.coord.z+1));for(var m=0,g=u.segments;m<g.length;m+=1){var v=g[m];v.vaos[r.id].bind(t,f,u.layoutVertexBuffer,u.elementBuffer,null,v.vertexOffset),t.drawElements(t.LINES,2*v.primitiveLength,t.UNSIGNED_SHORT,2*v.primitiveOffset*2);}}}}}module.exports=drawCollisionDebug;
; |
164 | },{}],69:[function(_dereq_,module,exports){
|
165 | function drawDebug(r,e,a){for(var t=0;t<a.length;t++)drawDebugTile(r,e,a[t]);}function drawDebugTile(r,e,a){var t=r.gl;t.disable(t.STENCIL_TEST),r.lineWidth(1*browser.devicePixelRatio);var i=a.posMatrix,u=r.useProgram("debug");t.uniformMatrix4fv(u.u_matrix,!1,i),t.uniform4f(u.u_color,1,0,0,1),r.debugVAO.bind(t,u,r.debugBuffer),t.drawArrays(t.LINE_STRIP,0,r.debugBuffer.length);for(var o=createTextVerticies(a.toString(),50,200,5),f=new PosArray,n=0;n<o.length;n+=2)f.emplaceBack(o[n],o[n+1]);var l=Buffer.fromStructArray(f,Buffer.BufferType.VERTEX),m=new VertexArrayObject;m.bind(t,u,l),t.uniform4f(u.u_color,1,1,1,1);for(var s=e.getTile(a).tileSize,g=EXTENT/(Math.pow(2,r.transform.zoom-a.z)*s),x=[[-1,-1],[-1,1],[1,-1],[1,1]],d=0;d<x.length;d++){var b=x[d];t.uniformMatrix4fv(u.u_matrix,!1,mat4.translate([],i,[g*b[0],g*b[1],0])),t.drawArrays(t.LINES,0,l.length);}t.uniform4f(u.u_color,0,0,0,1),t.uniformMatrix4fv(u.u_matrix,!1,i),t.drawArrays(t.LINES,0,l.length);}function createTextVerticies(r,e,a,t){t=t||1;var i,u,o,f,n,l,m,s,g=[];for(i=0,u=r.length;i<u;i++)if(n=simplexFont[r[i]]){for(s=null,o=0,f=n[1].length;o<f;o+=2)n[1][o]===-1&&n[1][o+1]===-1?s=null:(l=e+n[1][o]*t,m=a-n[1][o+1]*t,s&&g.push(s.x,s.y,l,m),s={x:l,y:m});e+=n[0]*t;}return g}var browser=_dereq_("../util/browser"),mat4=_dereq_("@mapbox/gl-matrix").mat4,EXTENT=_dereq_("../data/extent"),Buffer=_dereq_("../data/buffer"),VertexArrayObject=_dereq_("./vertex_array_object"),PosArray=_dereq_("../data/pos_array");module.exports=drawDebug;var simplexFont={" ":[16,[]],"!":[10,[5,21,5,7,-1,-1,5,2,4,1,5,0,6,1,5,2]],'"':[16,[4,21,4,14,-1,-1,12,21,12,14]],"#":[21,[11,25,4,-7,-1,-1,17,25,10,-7,-1,-1,4,12,18,12,-1,-1,3,6,17,6]],$:[20,[8,25,8,-4,-1,-1,12,25,12,-4,-1,-1,17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3]],"%":[24,[21,21,3,0,-1,-1,8,21,10,19,10,17,9,15,7,14,5,14,3,16,3,18,4,20,6,21,8,21,10,20,13,19,16,19,19,20,21,21,-1,-1,17,7,15,6,14,4,14,2,16,0,18,0,20,1,21,3,21,5,19,7,17,7]],"&":[26,[23,12,23,13,22,14,21,14,20,13,19,11,17,6,15,3,13,1,11,0,7,0,5,1,4,2,3,4,3,6,4,8,5,9,12,13,13,14,14,16,14,18,13,20,11,21,9,20,8,18,8,16,9,13,11,10,16,3,18,1,20,0,22,0,23,1,23,2]],"'":[10,[5,19,4,20,5,21,6,20,6,18,5,16,4,15]],"(":[14,[11,25,9,23,7,20,5,16,4,11,4,7,5,2,7,-2,9,-5,11,-7]],")":[14,[3,25,5,23,7,20,9,16,10,11,10,7,9,2,7,-2,5,-5,3,-7]],"*":[16,[8,21,8,9,-1,-1,3,18,13,12,-1,-1,13,18,3,12]],"+":[26,[13,18,13,0,-1,-1,4,9,22,9]],",":[10,[6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4]],"-":[26,[4,9,22,9]],".":[10,[5,2,4,1,5,0,6,1,5,2]],"/":[22,[20,25,2,-7]],0:[20,[9,21,6,20,4,17,3,12,3,9,4,4,6,1,9,0,11,0,14,1,16,4,17,9,17,12,16,17,14,20,11,21,9,21]],1:[20,[6,17,8,18,11,21,11,0]],2:[20,[4,16,4,17,5,19,6,20,8,21,12,21,14,20,15,19,16,17,16,15,15,13,13,10,3,0,17,0]],3:[20,[5,21,16,21,10,13,13,13,15,12,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4]],4:[20,[13,21,3,7,18,7,-1,-1,13,21,13,0]],5:[20,[15,21,5,21,4,12,5,13,8,14,11,14,14,13,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4]],6:[20,[16,18,15,20,12,21,10,21,7,20,5,17,4,12,4,7,5,3,7,1,10,0,11,0,14,1,16,3,17,6,17,7,16,10,14,12,11,13,10,13,7,12,5,10,4,7]],7:[20,[17,21,7,0,-1,-1,3,21,17,21]],8:[20,[8,21,5,20,4,18,4,16,5,14,7,13,11,12,14,11,16,9,17,7,17,4,16,2,15,1,12,0,8,0,5,1,4,2,3,4,3,7,4,9,6,11,9,12,13,13,15,14,16,16,16,18,15,20,12,21,8,21]],9:[20,[16,14,15,11,13,9,10,8,9,8,6,9,4,11,3,14,3,15,4,18,6,20,9,21,10,21,13,20,15,18,16,14,16,9,15,4,13,1,10,0,8,0,5,1,4,3]],":":[10,[5,14,4,13,5,12,6,13,5,14,-1,-1,5,2,4,1,5,0,6,1,5,2]],";":[10,[5,14,4,13,5,12,6,13,5,14,-1,-1,6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4]],"<":[24,[20,18,4,9,20,0]],"=":[26,[4,12,22,12,-1,-1,4,6,22,6]],">":[24,[4,18,20,9,4,0]],"?":[18,[3,16,3,17,4,19,5,20,7,21,11,21,13,20,14,19,15,17,15,15,14,13,13,12,9,10,9,7,-1,-1,9,2,8,1,9,0,10,1,9,2]],"@":[27,[18,13,17,15,15,16,12,16,10,15,9,14,8,11,8,8,9,6,11,5,14,5,16,6,17,8,-1,-1,12,16,10,14,9,11,9,8,10,6,11,5,-1,-1,18,16,17,8,17,6,19,5,21,5,23,7,24,10,24,12,23,15,22,17,20,19,18,20,15,21,12,21,9,20,7,19,5,17,4,15,3,12,3,9,4,6,5,4,7,2,9,1,12,0,15,0,18,1,20,2,21,3,-1,-1,19,16,18,8,18,6,19,5]],A:[18,[9,21,1,0,-1,-1,9,21,17,0,-1,-1,4,7,14,7]],B:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,-1,-1,4,11,13,11,16,10,17,9,18,7,18,4,17,2,16,1,13,0,4,0]],C:[21,[18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5]],D:[21,[4,21,4,0,-1,-1,4,21,11,21,14,20,16,18,17,16,18,13,18,8,17,5,16,3,14,1,11,0,4,0]],E:[19,[4,21,4,0,-1,-1,4,21,17,21,-1,-1,4,11,12,11,-1,-1,4,0,17,0]],F:[18,[4,21,4,0,-1,-1,4,21,17,21,-1,-1,4,11,12,11]],G:[21,[18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,18,8,-1,-1,13,8,18,8]],H:[22,[4,21,4,0,-1,-1,18,21,18,0,-1,-1,4,11,18,11]],I:[8,[4,21,4,0]],J:[16,[12,21,12,5,11,2,10,1,8,0,6,0,4,1,3,2,2,5,2,7]],K:[21,[4,21,4,0,-1,-1,18,21,4,7,-1,-1,9,12,18,0]],L:[17,[4,21,4,0,-1,-1,4,0,16,0]],M:[24,[4,21,4,0,-1,-1,4,21,12,0,-1,-1,20,21,12,0,-1,-1,20,21,20,0]],N:[22,[4,21,4,0,-1,-1,4,21,18,0,-1,-1,18,21,18,0]],O:[22,[9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21]],P:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,14,17,12,16,11,13,10,4,10]],Q:[22,[9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21,-1,-1,12,4,18,-2]],R:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,4,11,-1,-1,11,11,18,0]],S:[20,[17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3]],T:[16,[8,21,8,0,-1,-1,1,21,15,21]],U:[22,[4,21,4,6,5,3,7,1,10,0,12,0,15,1,17,3,18,6,18,21]],V:[18,[1,21,9,0,-1,-1,17,21,9,0]],W:[24,[2,21,7,0,-1,-1,12,21,7,0,-1,-1,12,21,17,0,-1,-1,22,21,17,0]],X:[20,[3,21,17,0,-1,-1,17,21,3,0]],Y:[18,[1,21,9,11,9,0,-1,-1,17,21,9,11]],Z:[20,[17,21,3,0,-1,-1,3,21,17,21,-1,-1,3,0,17,0]],"[":[14,[4,25,4,-7,-1,-1,5,25,5,-7,-1,-1,4,25,11,25,-1,-1,4,-7,11,-7]],"\\":[14,[0,21,14,-3]],"]":[14,[9,25,9,-7,-1,-1,10,25,10,-7,-1,-1,3,25,10,25,-1,-1,3,-7,10,-7]],"^":[16,[6,15,8,18,10,15,-1,-1,3,12,8,17,13,12,-1,-1,8,17,8,0]],_:[16,[0,-2,16,-2]],"`":[10,[6,21,5,20,4,18,4,16,5,15,6,16,5,17]],a:[19,[15,14,15,0,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],b:[19,[4,21,4,0,-1,-1,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3]],c:[18,[15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],d:[19,[15,21,15,0,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],e:[18,[3,8,15,8,15,10,14,12,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],f:[12,[10,21,8,21,6,20,5,17,5,0,-1,-1,2,14,9,14]],g:[19,[15,14,15,-2,14,-5,13,-6,11,-7,8,-7,6,-6,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],h:[19,[4,21,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0]],i:[8,[3,21,4,20,5,21,4,22,3,21,-1,-1,4,14,4,0]],j:[10,[5,21,6,20,7,21,6,22,5,21,-1,-1,6,14,6,-3,5,-6,3,-7,1,-7]],k:[17,[4,21,4,0,-1,-1,14,14,4,4,-1,-1,8,8,15,0]],l:[8,[4,21,4,0]],m:[30,[4,14,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0,-1,-1,15,10,18,13,20,14,23,14,25,13,26,10,26,0]],n:[19,[4,14,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0]],o:[19,[8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3,16,6,16,8,15,11,13,13,11,14,8,14]],p:[19,[4,14,4,-7,-1,-1,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3]],q:[19,[15,14,15,-7,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],r:[13,[4,14,4,0,-1,-1,4,8,5,11,7,13,9,14,12,14]],s:[17,[14,11,13,13,10,14,7,14,4,13,3,11,4,9,6,8,11,7,13,6,14,4,14,3,13,1,10,0,7,0,4,1,3,3]],t:[12,[5,21,5,4,6,1,8,0,10,0,-1,-1,2,14,9,14]],u:[19,[4,14,4,4,5,1,7,0,10,0,12,1,15,4,-1,-1,15,14,15,0]],v:[16,[2,14,8,0,-1,-1,14,14,8,0]],w:[22,[3,14,7,0,-1,-1,11,14,7,0,-1,-1,11,14,15,0,-1,-1,19,14,15,0]],x:[17,[3,14,14,0,-1,-1,14,14,3,0]],y:[16,[2,14,8,0,-1,-1,14,14,8,0,6,-4,4,-6,2,-7,1,-7]],z:[17,[14,14,3,0,-1,-1,3,14,14,14,-1,-1,3,0,14,0]],"{":[14,[9,25,7,24,6,23,5,21,5,19,6,17,7,16,8,14,8,12,6,10,-1,-1,7,24,6,22,6,20,7,18,8,17,9,15,9,13,8,11,4,9,8,7,9,5,9,3,8,1,7,0,6,-2,6,-4,7,-6,-1,-1,6,8,8,6,8,4,7,2,6,1,5,-1,5,-3,6,-5,7,-6,9,-7]],"|":[8,[4,25,4,-7]],"}":[14,[5,25,7,24,8,23,9,21,9,19,8,17,7,16,6,14,6,12,8,10,-1,-1,7,24,8,22,8,20,7,18,6,17,5,15,5,13,6,11,10,9,6,7,5,5,5,3,6,1,7,0,8,-2,8,-4,7,-6,-1,-1,8,8,6,6,6,4,7,2,8,1,9,-1,9,-3,8,-5,7,-6,5,-7]],"~":[24,[3,6,3,8,4,11,6,12,8,12,10,11,14,8,16,7,18,7,20,8,21,10,-1,-1,3,8,4,10,6,11,8,11,10,10,14,7,16,6,18,6,20,7,21,10,21,12]]};
; |
166 | },{"../data/buffer":51,"../data/extent":54,"../data/pos_array":57,"../util/browser":195,"./vertex_array_object":80,"@mapbox/gl-matrix":1}],70:[function(_dereq_,module,exports){
|
167 | function drawFill(t,e,r,i){var a=t.gl;a.enable(a.STENCIL_TEST);var l=!r.paint["fill-pattern"]&&r.isPaintValueFeatureConstant("fill-color")&&r.isPaintValueFeatureConstant("fill-opacity")&&1===r.paint["fill-color"][3]&&1===r.paint["fill-opacity"];t.isOpaquePass===l&&(t.setDepthSublayer(1),drawFillTiles(t,e,r,i,drawFillTile)),!t.isOpaquePass&&r.paint["fill-antialias"]&&(t.lineWidth(2),t.depthMask(!1),t.setDepthSublayer(r.getPaintProperty("fill-outline-color")?2:0),drawFillTiles(t,e,r,i,drawStrokeTile));}function drawFillTiles(t,e,r,i,a){for(var l=!0,n=0,o=i;n<o.length;n+=1){var f=o[n],s=e.getTile(f),u=s.getBucket(r);u&&(t.enableTileClippingMask(f),a(t,e,r,s,f,u.buffers,l),l=!1);}}function drawFillTile(t,e,r,i,a,l,n){for(var o=t.gl,f=l.layerData[r.id],s=setFillProgram("fill",r.paint["fill-pattern"],t,f,r,i,a,n),u=0,p=l.segments;u<p.length;u+=1){var g=p[u];g.vaos[r.id].bind(o,s,l.layoutVertexBuffer,l.elementBuffer,f.paintVertexBuffer,g.vertexOffset),o.drawElements(o.TRIANGLES,3*g.primitiveLength,o.UNSIGNED_SHORT,3*g.primitiveOffset*2);}}function drawStrokeTile(t,e,r,i,a,l,n){var o=t.gl,f=l.layerData[r.id],s=r.paint["fill-pattern"]&&!r.getPaintProperty("fill-outline-color"),u=setFillProgram("fillOutline",s,t,f,r,i,a,n);o.uniform2f(u.u_world,o.drawingBufferWidth,o.drawingBufferHeight);for(var p=0,g=l.segments2;p<g.length;p+=1){var m=g[p];m.vaos[r.id].bind(o,u,l.layoutVertexBuffer,l.elementBuffer2,f.paintVertexBuffer,m.vertexOffset),o.drawElements(o.LINES,2*m.primitiveLength,o.UNSIGNED_SHORT,2*m.primitiveOffset*2);}}function setFillProgram(t,e,r,i,a,l,n,o){var f,s=r.currentProgram;return e?(f=r.useProgram(t+"Pattern",i.programConfiguration),(o||f!==s)&&(i.programConfiguration.setUniforms(r.gl,f,a,{zoom:r.transform.zoom}),pattern.prepare(a.paint["fill-pattern"],r,f)),pattern.setTile(l,r,f)):(f=r.useProgram(t,i.programConfiguration),(o||f!==s)&&i.programConfiguration.setUniforms(r.gl,f,a,{zoom:r.transform.zoom})),r.gl.uniformMatrix4fv(f.u_matrix,!1,r.translatePosMatrix(n.posMatrix,l,a.paint["fill-translate"],a.paint["fill-translate-anchor"])),f}var pattern=_dereq_("./pattern");module.exports=drawFill;
; |
168 | },{"./pattern":78}],71:[function(_dereq_,module,exports){
|
169 | function draw(t,e,r,i){if(0!==r.paint["fill-extrusion-opacity"]){var a=t.gl;a.disable(a.STENCIL_TEST),a.enable(a.DEPTH_TEST),t.depthMask(!0);var s=new ExtrusionTexture(a,t,r);s.bindFramebuffer(),a.clearColor(0,0,0,0),a.clear(a.COLOR_BUFFER_BIT|a.DEPTH_BUFFER_BIT);for(var u=0;u<i.length;u++)drawExtrusion(t,e,r,i[u]);s.unbindFramebuffer(),s.renderToMap();}}function ExtrusionTexture(t,e,r){this.gl=t,this.width=e.width,this.height=e.height,this.painter=e,this.layer=r,this.texture=null,this.fbo=null,this.fbos=this.painter.preFbos[this.width]&&this.painter.preFbos[this.width][this.height];}function drawExtrusion(t,e,r,i){if(!t.isOpaquePass){var a=e.getTile(i),s=a.getBucket(r);if(s){var u=s.buffers,f=t.gl,n=r.paint["fill-extrusion-pattern"],o=u.layerData[r.id],h=o.programConfiguration,E=t.useProgram(n?"fillExtrusionPattern":"fillExtrusion",h);h.setUniforms(f,E,r,{zoom:t.transform.zoom}),n&&(pattern.prepare(n,t,E),pattern.setTile(a,t,E),f.uniform1f(E.u_height_factor,-Math.pow(2,i.z)/a.tileSize/8)),t.gl.uniformMatrix4fv(E.u_matrix,!1,t.translatePosMatrix(i.posMatrix,a,r.paint["fill-extrusion-translate"],r.paint["fill-extrusion-translate-anchor"])),setLight(E,t);for(var T=0,l=u.segments;T<l.length;T+=1){var x=l[T];x.vaos[r.id].bind(f,E,u.layoutVertexBuffer,u.elementBuffer,o.paintVertexBuffer,x.vertexOffset),f.drawElements(f.TRIANGLES,3*x.primitiveLength,f.UNSIGNED_SHORT,3*x.primitiveOffset*2);}}}}function setLight(t,e){var r=e.gl,i=e.style.light,a=i.calculated.position,s=[a.x,a.y,a.z],u=mat3.create();"viewport"===i.calculated.anchor&&mat3.fromRotation(u,-e.transform.angle),vec3.transformMat3(s,s,u),r.uniform3fv(t.u_lightpos,s),r.uniform1f(t.u_lightintensity,i.calculated.intensity),r.uniform3fv(t.u_lightcolor,i.calculated.color.slice(0,3));}var glMatrix=_dereq_("@mapbox/gl-matrix"),Buffer=_dereq_("../data/buffer"),VertexArrayObject=_dereq_("./vertex_array_object"),PosArray=_dereq_("../data/pos_array"),pattern=_dereq_("./pattern"),mat3=glMatrix.mat3,mat4=glMatrix.mat4,vec3=glMatrix.vec3;module.exports=draw,ExtrusionTexture.prototype.bindFramebuffer=function(){var t=this.gl;if(this.texture=this.painter.getViewportTexture(this.width,this.height),t.activeTexture(t.TEXTURE1),this.texture?t.bindTexture(t.TEXTURE_2D,this.texture):(this.texture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.texture),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),this.texture.width=this.width,this.texture.height=this.height),this.fbos)this.fbo=this.fbos.pop(),t.bindFramebuffer(t.FRAMEBUFFER,this.fbo),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.texture,0);else{this.fbo=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.fbo);var e=t.createRenderbuffer();t.bindRenderbuffer(t.RENDERBUFFER,e),t.renderbufferStorage(t.RENDERBUFFER,t.DEPTH_COMPONENT16,this.width,this.height),t.framebufferRenderbuffer(t.FRAMEBUFFER,t.DEPTH_ATTACHMENT,t.RENDERBUFFER,e),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.texture,0);}},ExtrusionTexture.prototype.unbindFramebuffer=function(){this.painter.bindDefaultFramebuffer(),this.fbos?this.fbos.push(this.fbo):(this.painter.preFbos[this.width]||(this.painter.preFbos[this.width]={}),this.painter.preFbos[this.width][this.height]=[this.fbo]),this.painter.saveViewportTexture(this.texture);},ExtrusionTexture.prototype.renderToMap=function(){var t=this.gl,e=this.painter,r=e.useProgram("extrusionTexture");t.activeTexture(t.TEXTURE0),t.bindTexture(t.TEXTURE_2D,this.texture),t.uniform1f(r.u_opacity,this.layer.paint["fill-extrusion-opacity"]),t.uniform1i(r.u_image,1),t.uniformMatrix4fv(r.u_matrix,!1,mat4.ortho(mat4.create(),0,e.width,e.height,0,0,1)),t.disable(t.DEPTH_TEST),t.uniform2f(r.u_world,t.drawingBufferWidth,t.drawingBufferHeight);var i=new PosArray;i.emplaceBack(0,0),i.emplaceBack(1,0),i.emplaceBack(0,1),i.emplaceBack(1,1);var a=Buffer.fromStructArray(i,Buffer.BufferType.VERTEX),s=new VertexArrayObject;s.bind(t,r,a),t.drawArrays(t.TRIANGLE_STRIP,0,4),t.enable(t.DEPTH_TEST);};
; |
170 | },{"../data/buffer":51,"../data/pos_array":57,"./pattern":78,"./vertex_array_object":80,"@mapbox/gl-matrix":1}],72:[function(_dereq_,module,exports){
|
171 | function drawLineTile(e,i,t,r,a,n,o,f,s){var l,u,m,_,p=i.gl,g=a.paint["line-dasharray"],d=a.paint["line-pattern"];if(f||s){var v=1/pixelsToTileUnits(t,1,i.transform.tileZoom);if(g){l=i.lineAtlas.getDash(g.from,"round"===a.layout["line-cap"]),u=i.lineAtlas.getDash(g.to,"round"===a.layout["line-cap"]);var T=l.width*g.fromScale,h=u.width*g.toScale;p.uniform2f(e.u_patternscale_a,v/T,-l.height/2),p.uniform2f(e.u_patternscale_b,v/h,-u.height/2),p.uniform1f(e.u_sdfgamma,i.lineAtlas.width/(256*Math.min(T,h)*browser.devicePixelRatio)/2);}else if(d){if(m=i.spriteAtlas.getPosition(d.from,!0),_=i.spriteAtlas.getPosition(d.to,!0),!m||!_)return;p.uniform2f(e.u_pattern_size_a,m.size[0]*d.fromScale/v,_.size[1]),p.uniform2f(e.u_pattern_size_b,_.size[0]*d.toScale/v,_.size[1]);}p.uniform2f(e.u_gl_units_to_pixels,1/i.transform.pixelsToGLUnits[0],1/i.transform.pixelsToGLUnits[1]);}f&&(g?(p.uniform1i(e.u_image,0),p.activeTexture(p.TEXTURE0),i.lineAtlas.bind(p),p.uniform1f(e.u_tex_y_a,l.y),p.uniform1f(e.u_tex_y_b,u.y),p.uniform1f(e.u_mix,g.t)):d&&(p.uniform1i(e.u_image,0),p.activeTexture(p.TEXTURE0),i.spriteAtlas.bind(p,!0),p.uniform2fv(e.u_pattern_tl_a,m.tl),p.uniform2fv(e.u_pattern_br_a,m.br),p.uniform2fv(e.u_pattern_tl_b,_.tl),p.uniform2fv(e.u_pattern_br_b,_.br),p.uniform1f(e.u_fade,d.t)),p.uniform1f(e.u_width,a.paint["line-width"])),i.enableTileClippingMask(n);var x=i.translatePosMatrix(n.posMatrix,t,a.paint["line-translate"],a.paint["line-translate-anchor"]);p.uniformMatrix4fv(e.u_matrix,!1,x),p.uniform1f(e.u_ratio,1/pixelsToTileUnits(t,1,i.transform.zoom));for(var b=0,c=r.segments;b<c.length;b+=1){var w=c[b];w.vaos[a.id].bind(p,e,r.layoutVertexBuffer,r.elementBuffer,o.paintVertexBuffer,w.vertexOffset),p.drawElements(p.TRIANGLES,3*w.primitiveLength,p.UNSIGNED_SHORT,3*w.primitiveOffset*2);}}var browser=_dereq_("../util/browser"),pixelsToTileUnits=_dereq_("../source/pixels_to_tile_units");module.exports=function(e,i,t,r){if(!e.isOpaquePass){e.setDepthSublayer(0),e.depthMask(!1);var a=e.gl;if(a.enable(a.STENCIL_TEST),!(t.paint["line-width"]<=0))for(var n,o=t.paint["line-dasharray"]?"lineSDF":t.paint["line-pattern"]?"linePattern":"line",f=!0,s=0,l=r;s<l.length;s+=1){var u=l[s],m=i.getTile(u),_=m.getBucket(t);if(_){var p=_.buffers.layerData[t.id],g=e.currentProgram,d=e.useProgram(o,p.programConfiguration),v=f||d!==g,T=n!==m.coord.z;v&&p.programConfiguration.setUniforms(e.gl,d,t,{zoom:e.transform.zoom}),drawLineTile(d,e,m,_.buffers,t,u,p,v,T),n=m.coord.z,f=!1;}}}};
; |
172 | },{"../source/pixels_to_tile_units":88,"../util/browser":195}],73:[function(_dereq_,module,exports){
|
173 | function drawRaster(r,t,e,a){if(!r.isOpaquePass){var i=r.gl;i.enable(i.DEPTH_TEST),r.depthMask(!0),i.depthFunc(i.LESS);for(var o=a.length&&a[0].z,n=0;n<a.length;n++){var u=a[n];r.setDepthSublayer(u.z-o),drawRasterTile(r,t,e,u);}i.depthFunc(i.LEQUAL);}}function drawRasterTile(r,t,e,a){var i=r.gl;i.disable(i.STENCIL_TEST);var o=t.getTile(a),n=r.transform.calculatePosMatrix(a,t.getSource().maxzoom);o.registerFadeDuration(r.style.animationLoop,e.paint["raster-fade-duration"]);var u=r.useProgram("raster");i.uniformMatrix4fv(u.u_matrix,!1,n),i.uniform1f(u.u_brightness_low,e.paint["raster-brightness-min"]),i.uniform1f(u.u_brightness_high,e.paint["raster-brightness-max"]),i.uniform1f(u.u_saturation_factor,saturationFactor(e.paint["raster-saturation"])),i.uniform1f(u.u_contrast_factor,contrastFactor(e.paint["raster-contrast"])),i.uniform3fv(u.u_spin_weights,spinWeights(e.paint["raster-hue-rotate"]));var s,c,f=o.sourceCache&&o.sourceCache.findLoadedParent(a,0,{}),d=getFadeValues(o,f,e,r.transform);i.activeTexture(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,o.texture),i.activeTexture(i.TEXTURE1),f?(i.bindTexture(i.TEXTURE_2D,f.texture),s=Math.pow(2,f.coord.z-o.coord.z),c=[o.coord.x*s%1,o.coord.y*s%1]):i.bindTexture(i.TEXTURE_2D,o.texture),i.uniform2fv(u.u_tl_parent,c||[0,0]),i.uniform1f(u.u_scale_parent,s||1),i.uniform1f(u.u_buffer_scale,1),i.uniform1f(u.u_fade_t,d.mix),i.uniform1f(u.u_opacity,d.opacity*e.paint["raster-opacity"]),i.uniform1i(u.u_image0,0),i.uniform1i(u.u_image1,1);var m=o.boundsBuffer||r.rasterBoundsBuffer,p=o.boundsVAO||r.rasterBoundsVAO;p.bind(i,u,m),i.drawArrays(i.TRIANGLE_STRIP,0,m.length);}function spinWeights(r){r*=Math.PI/180;var t=Math.sin(r),e=Math.cos(r);return[(2*e+1)/3,(-Math.sqrt(3)*t-e+1)/3,(Math.sqrt(3)*t-e+1)/3]}function contrastFactor(r){return r>0?1/(1-r):1+r}function saturationFactor(r){return r>0?1-1/(1.001-r):-r}function getFadeValues(r,t,e,a){var i=e.paint["raster-fade-duration"];if(r.sourceCache&&i>0){var o=Date.now(),n=(o-r.timeAdded)/i,u=t?(o-t.timeAdded)/i:-1,s=r.sourceCache.getSource(),c=a.coveringZoomLevel({tileSize:s.tileSize,roundZoom:s.roundZoom}),f=!t||Math.abs(t.coord.z-c)>Math.abs(r.coord.z-c),d=f&&r.refreshedUponExpiration?1:util.clamp(f?n:1-u,0,1);return r.refreshedUponExpiration&&n>=1&&(r.refreshedUponExpiration=!1),t?{opacity:1,mix:1-d}:{opacity:d,mix:0}}return{opacity:1,mix:0}}var util=_dereq_("../util/util");module.exports=drawRaster;
; |
174 | },{"../util/util":215}],74:[function(_dereq_,module,exports){
|
175 | function drawSymbols(t,e,i,o){if(!t.isOpaquePass){var a=!(i.layout["text-allow-overlap"]||i.layout["icon-allow-overlap"]||i.layout["text-ignore-placement"]||i.layout["icon-ignore-placement"]),n=t.gl;a?n.disable(n.STENCIL_TEST):n.enable(n.STENCIL_TEST),t.setDepthSublayer(0),t.depthMask(!1),drawLayerSymbols(t,e,i,o,!1,i.paint["icon-translate"],i.paint["icon-translate-anchor"],i.layout["icon-rotation-alignment"],i.layout["icon-rotation-alignment"]),drawLayerSymbols(t,e,i,o,!0,i.paint["text-translate"],i.paint["text-translate-anchor"],i.layout["text-rotation-alignment"],i.layout["text-pitch-alignment"]),e.map.showCollisionBoxes&&drawCollisionDebug(t,e,i,o);}}function drawLayerSymbols(t,e,i,o,a,n,r,s,l){if(a||!t.style.sprite||t.style.sprite.loaded()){var u=t.gl,m="map"===s,f="map"===l,c=f;c?u.enable(u.DEPTH_TEST):u.disable(u.DEPTH_TEST);for(var p,_,g=0,y=o;g<y.length;g+=1){var d=y[g],T=e.getTile(d),v=T.getBucket(i);if(v){var h=a?v.buffers.glyph:v.buffers.icon;if(h&&h.segments.length){var x=h.layerData[i.id],b=x.programConfiguration,S=a||v.sdfIcons,z=a?v.textSizeData:v.iconSizeData;p&&v.fontstack===_||(p=t.useProgram(S?"symbolSDF":"symbolIcon",b),b.setUniforms(u,p,i,{zoom:t.transform.zoom}),setSymbolDrawState(p,t,i,d.z,a,S,m,f,v.fontstack,v.iconsNeedLinear,z)),t.enableTileClippingMask(d),u.uniformMatrix4fv(p.u_matrix,!1,t.translatePosMatrix(d.posMatrix,T,n,r)),drawTileSymbols(p,b,t,i,T,h,a,S,f),_=v.fontstack;}}}c||u.enable(u.DEPTH_TEST);}}function setSymbolDrawState(t,e,i,o,a,n,r,s,l,u,m){var f=e.gl,c=e.transform;if(f.uniform1i(t.u_rotate_with_map,r),f.uniform1i(t.u_pitch_with_map,s),f.activeTexture(f.TEXTURE0),f.uniform1i(t.u_texture,0),f.uniform1f(t.u_is_text,a?1:0),a){var p=l&&e.glyphSource.getGlyphAtlas(l);if(!p)return;p.updateTexture(f),f.uniform2f(t.u_texsize,p.width/4,p.height/4);}else{var _=e.options.rotating||e.options.zooming,g=!i.isLayoutValueFeatureConstant("icon-size")||!i.isLayoutValueZoomConstant("icon-size")||1!==i.getLayoutValue("icon-size",{zoom:c.zoom}),y=g||browser.devicePixelRatio!==e.spriteAtlas.pixelRatio||u,d=s||c.pitch;e.spriteAtlas.bind(f,n||_||y||d),f.uniform2f(t.u_texsize,e.spriteAtlas.width/4,e.spriteAtlas.height/4);}if(f.activeTexture(f.TEXTURE1),e.frameHistory.bind(f),f.uniform1i(t.u_fadetexture,1),f.uniform1f(t.u_zoom,c.zoom),f.uniform1f(t.u_pitch,c.pitch/360*2*Math.PI),f.uniform1f(t.u_bearing,c.bearing/360*2*Math.PI),f.uniform1f(t.u_aspect_ratio,c.width/c.height),f.uniform1i(t.u_is_size_zoom_constant,m.isZoomConstant?1:0),f.uniform1i(t.u_is_size_feature_constant,m.isFeatureConstant?1:0),m.isZoomConstant||m.isFeatureConstant)if(m.isFeatureConstant&&!m.isZoomConstant){var T;if("interval"===m.functionType)T=i.getLayoutValue(a?"text-size":"icon-size",{zoom:c.zoom});else{var v="interval"===m.functionType?0:interpolationFactor(c.zoom,m.functionBase,m.coveringZoomRange[0],m.coveringZoomRange[1]),h=m.coveringStopValues[0],x=m.coveringStopValues[1];T=h+(x-h)*util.clamp(v,0,1);}f.uniform1f(t.u_size,T),f.uniform1f(t.u_layout_size,m.layoutSize);}else m.isFeatureConstant&&m.isZoomConstant&&f.uniform1f(t.u_size,m.layoutSize);else{var b=interpolationFactor(c.zoom,m.functionBase,m.coveringZoomRange[0],m.coveringZoomRange[1]);f.uniform1f(t.u_size_t,util.clamp(b,0,1));}}function drawTileSymbols(t,e,i,o,a,n,r,s,l){var u=i.gl,m=i.transform;if(l){var f=pixelsToTileUnits(a,1,m.zoom);u.uniform2f(t.u_extrude_scale,f,f);}else{var c=m.cameraToCenterDistance;u.uniform2f(t.u_extrude_scale,m.pixelsToGLUnits[0]*c,m.pixelsToGLUnits[1]*c);}if(s){var p=(r?"text":"icon")+"-halo-width",_=!o.isPaintValueFeatureConstant(p)||o.paint[p],g=(l?Math.cos(m._pitch):1)*m.cameraToCenterDistance;u.uniform1f(t.u_gamma_scale,g),_&&(u.uniform1f(t.u_is_halo,1),drawSymbolElements(n,o,u,t)),u.uniform1f(t.u_is_halo,0);}drawSymbolElements(n,o,u,t);}function drawSymbolElements(t,e,i,o){for(var a=t.layerData[e.id],n=a&&a.paintVertexBuffer,r=0,s=t.segments;r<s.length;r+=1){var l=s[r];l.vaos[e.id].bind(i,o,t.layoutVertexBuffer,t.elementBuffer,n,l.vertexOffset),i.drawElements(i.TRIANGLES,3*l.primitiveLength,i.UNSIGNED_SHORT,3*l.primitiveOffset*2);}}var util=_dereq_("../util/util"),browser=_dereq_("../util/browser"),drawCollisionDebug=_dereq_("./draw_collision_debug"),pixelsToTileUnits=_dereq_("../source/pixels_to_tile_units"),interpolationFactor=_dereq_("../style-spec/function").interpolationFactor;module.exports=drawSymbols;
; |
176 | },{"../source/pixels_to_tile_units":88,"../style-spec/function":107,"../util/browser":195,"../util/util":215,"./draw_collision_debug":68}],75:[function(_dereq_,module,exports){
|
177 | var FrameHistory=function(){this.changeTimes=new Float64Array(256),this.changeOpacities=new Uint8Array(256),this.opacities=new Uint8ClampedArray(256),this.array=new Uint8Array(this.opacities.buffer),this.previousZoom=0,this.firstFrame=!0;};FrameHistory.prototype.record=function(e,t,i){var r=this;this.firstFrame&&(e=0,this.firstFrame=!1),t=Math.floor(10*t);var a;if(t<this.previousZoom)for(a=t+1;a<=this.previousZoom;a++)r.changeTimes[a]=e,r.changeOpacities[a]=r.opacities[a];else for(a=t;a>this.previousZoom;a--)r.changeTimes[a]=e,r.changeOpacities[a]=r.opacities[a];for(a=0;a<256;a++){var s=e-r.changeTimes[a],o=255*(i?s/i:1);a<=t?r.opacities[a]=r.changeOpacities[a]+o:r.opacities[a]=r.changeOpacities[a]-o;}this.changed=!0,this.previousZoom=t;},FrameHistory.prototype.bind=function(e){this.texture?(e.bindTexture(e.TEXTURE_2D,this.texture),this.changed&&(e.texSubImage2D(e.TEXTURE_2D,0,0,0,256,1,e.ALPHA,e.UNSIGNED_BYTE,this.array),this.changed=!1)):(this.texture=e.createTexture(),e.bindTexture(e.TEXTURE_2D,this.texture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texImage2D(e.TEXTURE_2D,0,e.ALPHA,256,1,0,e.ALPHA,e.UNSIGNED_BYTE,this.array));},module.exports=FrameHistory;
; |
178 | },{}],76:[function(_dereq_,module,exports){
|
179 | var util=_dereq_("../util/util"),LineAtlas=function(t,i){this.width=t,this.height=i,this.nextRow=0,this.bytes=4,this.data=new Uint8Array(this.width*this.height*this.bytes),this.positions={};};LineAtlas.prototype.setSprite=function(t){this.sprite=t;},LineAtlas.prototype.getDash=function(t,i){var e=t.join(",")+i;return this.positions[e]||(this.positions[e]=this.addDash(t,i)),this.positions[e]},LineAtlas.prototype.addDash=function(t,i){var e=this,h=i?7:0,s=2*h+1,a=128;if(this.nextRow+s>this.height)return util.warnOnce("LineAtlas out of space"),null;for(var r=0,n=0;n<t.length;n++)r+=t[n];for(var o=this.width/r,E=o/2,T=t.length%2===1,R=-h;R<=h;R++)for(var u=e.nextRow+h+R,d=e.width*u,l=T?-t[t.length-1]:0,x=t[0],A=1,_=0;_<this.width;_++){for(;x<_/o;)l=x,x+=t[A],T&&A===t.length-1&&(x+=t[0]),A++;var p=Math.abs(_-l*o),g=Math.abs(_-x*o),w=Math.min(p,g),D=A%2===1,U=void 0;if(i){var f=h?R/h*(E+1):0;if(D){var X=E-Math.abs(f);U=Math.sqrt(w*w+X*X);}else U=E-Math.sqrt(w*w+f*f);}else U=(D?1:-1)*w;e.data[3+4*(d+_)]=Math.max(0,Math.min(255,U+a));}var v={y:(this.nextRow+h+.5)/this.height,height:2*h/this.height,width:r};return this.nextRow+=s,this.dirty=!0,v},LineAtlas.prototype.bind=function(t){this.texture?(t.bindTexture(t.TEXTURE_2D,this.texture),this.dirty&&(this.dirty=!1,t.texSubImage2D(t.TEXTURE_2D,0,0,0,this.width,this.height,t.RGBA,t.UNSIGNED_BYTE,this.data))):(this.texture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.texture),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.REPEAT),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.REPEAT),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,this.data));},module.exports=LineAtlas;
; |
180 | },{"../util/util":215}],77:[function(_dereq_,module,exports){
|
181 | var browser=_dereq_("../util/browser"),mat4=_dereq_("@mapbox/gl-matrix").mat4,FrameHistory=_dereq_("./frame_history"),SourceCache=_dereq_("../source/source_cache"),EXTENT=_dereq_("../data/extent"),pixelsToTileUnits=_dereq_("../source/pixels_to_tile_units"),util=_dereq_("../util/util"),Buffer=_dereq_("../data/buffer"),VertexArrayObject=_dereq_("./vertex_array_object"),RasterBoundsArray=_dereq_("../data/raster_bounds_array"),PosArray=_dereq_("../data/pos_array"),ProgramConfiguration=_dereq_("../data/program_configuration"),shaders=_dereq_("./shaders"),draw={symbol:_dereq_("./draw_symbol"),circle:_dereq_("./draw_circle"),line:_dereq_("./draw_line"),fill:_dereq_("./draw_fill"),"fill-extrusion":_dereq_("./draw_fill_extrusion"),raster:_dereq_("./draw_raster"),background:_dereq_("./draw_background"),debug:_dereq_("./draw_debug")},Painter=function(e,r){this.gl=e,this.transform=r,this.reusableTextures={tiles:{},viewport:null},this.preFbos={},this.frameHistory=new FrameHistory,this.setup(),this.numSublayers=SourceCache.maxUnderzooming+SourceCache.maxOverzooming+1,this.depthEpsilon=1/Math.pow(2,16),this.lineWidthRange=e.getParameter(e.ALIASED_LINE_WIDTH_RANGE),this.basicFillProgramConfiguration=ProgramConfiguration.createStatic(["color","opacity"]),this.emptyProgramConfiguration=new ProgramConfiguration;};Painter.prototype.resize=function(e,r){var t=this.gl;this.width=e*browser.devicePixelRatio,this.height=r*browser.devicePixelRatio,t.viewport(0,0,this.width,this.height);},Painter.prototype.setup=function(){var e=this.gl;e.verbose=!0,e.enable(e.BLEND),e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA),e.enable(e.STENCIL_TEST),e.enable(e.DEPTH_TEST),e.depthFunc(e.LEQUAL),this._depthMask=!1,e.depthMask(!1);var r=new PosArray;r.emplaceBack(0,0),r.emplaceBack(EXTENT,0),r.emplaceBack(0,EXTENT),r.emplaceBack(EXTENT,EXTENT),this.tileExtentBuffer=Buffer.fromStructArray(r,Buffer.BufferType.VERTEX),this.tileExtentVAO=new VertexArrayObject,this.tileExtentPatternVAO=new VertexArrayObject;var t=new PosArray;t.emplaceBack(0,0),t.emplaceBack(EXTENT,0),t.emplaceBack(EXTENT,EXTENT),t.emplaceBack(0,EXTENT),t.emplaceBack(0,0),this.debugBuffer=Buffer.fromStructArray(t,Buffer.BufferType.VERTEX),this.debugVAO=new VertexArrayObject;var i=new RasterBoundsArray;i.emplaceBack(0,0,0,0),i.emplaceBack(EXTENT,0,32767,0),i.emplaceBack(0,EXTENT,0,32767),i.emplaceBack(EXTENT,EXTENT,32767,32767),this.rasterBoundsBuffer=Buffer.fromStructArray(i,Buffer.BufferType.VERTEX),this.rasterBoundsVAO=new VertexArrayObject,this.extTextureFilterAnisotropic=e.getExtension("EXT_texture_filter_anisotropic")||e.getExtension("MOZ_EXT_texture_filter_anisotropic")||e.getExtension("WEBKIT_EXT_texture_filter_anisotropic"),this.extTextureFilterAnisotropic&&(this.extTextureFilterAnisotropicMax=e.getParameter(this.extTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT));},Painter.prototype.clearColor=function(){var e=this.gl;e.clearColor(0,0,0,0),e.clear(e.COLOR_BUFFER_BIT);},Painter.prototype.clearStencil=function(){var e=this.gl;e.clearStencil(0),e.stencilMask(255),e.clear(e.STENCIL_BUFFER_BIT);},Painter.prototype.clearDepth=function(){var e=this.gl;e.clearDepth(1),this.depthMask(!0),e.clear(e.DEPTH_BUFFER_BIT);},Painter.prototype._renderTileClippingMasks=function(e){var r=this,t=this.gl;t.colorMask(!1,!1,!1,!1),this.depthMask(!1),t.disable(t.DEPTH_TEST),t.enable(t.STENCIL_TEST),t.stencilMask(255),t.stencilOp(t.KEEP,t.KEEP,t.REPLACE);var i=1;this._tileClippingMaskIDs={};for(var a=0,s=e;a<s.length;a+=1){var o=s[a],n=r._tileClippingMaskIDs[o.id]=i++;t.stencilFunc(t.ALWAYS,n,255);var l=r.useProgram("fill",r.basicFillProgramConfiguration);t.uniformMatrix4fv(l.u_matrix,!1,o.posMatrix),r.tileExtentVAO.bind(t,l,r.tileExtentBuffer),t.drawArrays(t.TRIANGLE_STRIP,0,r.tileExtentBuffer.length);}t.stencilMask(0),t.colorMask(!0,!0,!0,!0),this.depthMask(!0),t.enable(t.DEPTH_TEST);},Painter.prototype.enableTileClippingMask=function(e){var r=this.gl;r.stencilFunc(r.EQUAL,this._tileClippingMaskIDs[e.id],255);},Painter.prototype.prepareBuffers=function(){},Painter.prototype.bindDefaultFramebuffer=function(){var e=this.gl;e.bindFramebuffer(e.FRAMEBUFFER,null);},Painter.prototype.render=function(e,r){if(this.style=e,this.options=r,this.lineAtlas=e.lineAtlas,this.spriteAtlas=e.spriteAtlas,this.spriteAtlas.setSprite(e.sprite),this.glyphSource=e.glyphSource,this.frameHistory.record(Date.now(),this.transform.zoom,e.getTransition().duration),this.prepareBuffers(),this.clearColor(),this.clearDepth(),this.showOverdrawInspector(r.showOverdrawInspector),this.depthRange=(e._order.length+2)*this.numSublayers*this.depthEpsilon,this.isOpaquePass=!0,this.renderPass(),this.isOpaquePass=!1,this.renderPass(),this.options.showTileBoundaries){var t=this.style.sourceCaches[Object.keys(this.style.sourceCaches)[0]];t&&draw.debug(this,t,t.getVisibleCoordinates());}},Painter.prototype.renderPass=function(){var e,r,t=this,i=this.style._order;this.currentLayer=this.isOpaquePass?i.length-1:0,this.isOpaquePass?this._showOverdrawInspector||this.gl.disable(this.gl.BLEND):this.gl.enable(this.gl.BLEND);for(var a=0;a<i.length;a++){var s=t.style._layers[i[t.currentLayer]];s.source!==(e&&e.id)&&(e=t.style.sourceCaches[s.source],r=[],e&&(e.prepare&&e.prepare(),t.clearStencil(),r=e.getVisibleCoordinates(),e.getSource().isTileClipped&&t._renderTileClippingMasks(r)),t.isOpaquePass||r.reverse()),t.renderLayer(t,e,s,r),t.currentLayer+=t.isOpaquePass?-1:1;}},Painter.prototype.depthMask=function(e){e!==this._depthMask&&(this._depthMask=e,this.gl.depthMask(e));},Painter.prototype.renderLayer=function(e,r,t,i){t.isHidden(this.transform.zoom)||("background"===t.type||i.length)&&(this.id=t.id,draw[t.type](e,r,t,i));},Painter.prototype.setDepthSublayer=function(e){var r=1-((1+this.currentLayer)*this.numSublayers+e)*this.depthEpsilon,t=r-1+this.depthRange;this.gl.depthRange(t,r);},Painter.prototype.translatePosMatrix=function(e,r,t,i){if(!t[0]&&!t[1])return e;if("viewport"===i){var a=Math.sin(-this.transform.angle),s=Math.cos(-this.transform.angle);t=[t[0]*s-t[1]*a,t[0]*a+t[1]*s];}var o=[pixelsToTileUnits(r,t[0],this.transform.zoom),pixelsToTileUnits(r,t[1],this.transform.zoom),0],n=new Float32Array(16);return mat4.translate(n,e,o),n},Painter.prototype.saveTileTexture=function(e){var r=this.reusableTextures.tiles[e.size];r?r.push(e):this.reusableTextures.tiles[e.size]=[e];},Painter.prototype.saveViewportTexture=function(e){this.reusableTextures.viewport=e;},Painter.prototype.getTileTexture=function(e){var r=this.reusableTextures.tiles[e];return r&&r.length>0?r.pop():null},Painter.prototype.getViewportTexture=function(e,r){var t=this.reusableTextures.viewport;if(t)return t.width===e&&t.height===r?t:(this.gl.deleteTexture(t),void(this.reusableTextures.viewport=null))},Painter.prototype.lineWidth=function(e){this.gl.lineWidth(util.clamp(e,this.lineWidthRange[0],this.lineWidthRange[1]));},Painter.prototype.showOverdrawInspector=function(e){if(e||this._showOverdrawInspector){this._showOverdrawInspector=e;var r=this.gl;if(e){r.blendFunc(r.CONSTANT_COLOR,r.ONE);var t=8,i=1/t;r.blendColor(i,i,i,0),r.clearColor(0,0,0,1),r.clear(r.COLOR_BUFFER_BIT);}else r.blendFunc(r.ONE,r.ONE_MINUS_SRC_ALPHA);}},Painter.prototype.createProgram=function(e,r){var t=this.gl,i=t.createProgram(),a=shaders[e],s="#define MAPBOX_GL_JS\n#define DEVICE_PIXEL_RATIO "+browser.devicePixelRatio.toFixed(1)+"\n";this._showOverdrawInspector&&(s+="#define OVERDRAW_INSPECTOR;\n");var o=r.applyPragmas(s+shaders.prelude.fragmentSource+a.fragmentSource,"fragment"),n=r.applyPragmas(s+shaders.prelude.vertexSource+a.vertexSource,"vertex"),l=t.createShader(t.FRAGMENT_SHADER);t.shaderSource(l,o),t.compileShader(l),t.attachShader(i,l);var h=t.createShader(t.VERTEX_SHADER);t.shaderSource(h,n),t.compileShader(h),t.attachShader(i,h),t.linkProgram(i);for(var u=t.getProgramParameter(i,t.ACTIVE_ATTRIBUTES),c={program:i,numAttributes:u},p=0;p<u;p++){var d=t.getActiveAttrib(i,p);c[d.name]=t.getAttribLocation(i,d.name);}for(var f=t.getProgramParameter(i,t.ACTIVE_UNIFORMS),g=0;g<f;g++){var T=t.getActiveUniform(i,g);c[T.name]=t.getUniformLocation(i,T.name);}return c},Painter.prototype._createProgramCached=function(e,r){this.cache=this.cache||{};var t=""+e+(r.cacheKey||"")+(this._showOverdrawInspector?"/overdraw":"");return this.cache[t]||(this.cache[t]=this.createProgram(e,r)),this.cache[t]},Painter.prototype.useProgram=function(e,r){var t=this.gl,i=this._createProgramCached(e,r||this.emptyProgramConfiguration);return this.currentProgram!==i&&(t.useProgram(i.program),this.currentProgram=i),i},module.exports=Painter;
; |
182 | },{"../data/buffer":51,"../data/extent":54,"../data/pos_array":57,"../data/program_configuration":58,"../data/raster_bounds_array":59,"../source/pixels_to_tile_units":88,"../source/source_cache":93,"../util/browser":195,"../util/util":215,"./draw_background":66,"./draw_circle":67,"./draw_debug":69,"./draw_fill":70,"./draw_fill_extrusion":71,"./draw_line":72,"./draw_raster":73,"./draw_symbol":74,"./frame_history":75,"./shaders":79,"./vertex_array_object":80,"@mapbox/gl-matrix":1}],78:[function(_dereq_,module,exports){
|
183 | var pixelsToTileUnits=_dereq_("../source/pixels_to_tile_units");exports.prepare=function(r,t,i){var o=t.gl,e=t.spriteAtlas.getPosition(r.from,!0),_=t.spriteAtlas.getPosition(r.to,!0);e&&_&&(o.uniform1i(i.u_image,0),o.uniform2fv(i.u_pattern_tl_a,e.tl),o.uniform2fv(i.u_pattern_br_a,e.br),o.uniform2fv(i.u_pattern_tl_b,_.tl),o.uniform2fv(i.u_pattern_br_b,_.br),o.uniform1f(i.u_mix,r.t),o.uniform2fv(i.u_pattern_size_a,e.size),o.uniform2fv(i.u_pattern_size_b,_.size),o.uniform1f(i.u_scale_a,r.fromScale),o.uniform1f(i.u_scale_b,r.toScale),o.activeTexture(o.TEXTURE0),t.spriteAtlas.bind(o,!0));},exports.setTile=function(r,t,i){var o=t.gl;o.uniform1f(i.u_tile_units_to_pixels,1/pixelsToTileUnits(r,1,t.transform.tileZoom));var e=Math.pow(2,r.coord.z),_=r.tileSize*Math.pow(2,t.transform.tileZoom)/e,u=_*(r.coord.x+r.coord.w*e),n=_*r.coord.y;o.uniform2f(i.u_pixel_coord_upper,u>>16,n>>16),o.uniform2f(i.u_pixel_coord_lower,65535&u,65535&n);};
; |
184 | },{"../source/pixels_to_tile_units":88}],79:[function(_dereq_,module,exports){
|
185 | var path=_dereq_("path");module.exports={prelude:{fragmentSource:"#ifdef GL_ES\nprecision mediump float;\n#else\n\n#if !defined(lowp)\n#define lowp\n#endif\n\n#if !defined(mediump)\n#define mediump\n#endif\n\n#if !defined(highp)\n#define highp\n#endif\n\n#endif\n",vertexSource:"#ifdef GL_ES\nprecision highp float;\n#else\n\n#if !defined(lowp)\n#define lowp\n#endif\n\n#if !defined(mediump)\n#define mediump\n#endif\n\n#if !defined(highp)\n#define highp\n#endif\n\n#endif\n\nfloat evaluate_zoom_function_1(const vec4 values, const float t) {\n if (t < 1.0) {\n return mix(values[0], values[1], t);\n } else if (t < 2.0) {\n return mix(values[1], values[2], t - 1.0);\n } else {\n return mix(values[2], values[3], t - 2.0);\n }\n}\nvec4 evaluate_zoom_function_4(const vec4 value0, const vec4 value1, const vec4 value2, const vec4 value3, const float t) {\n if (t < 1.0) {\n return mix(value0, value1, t);\n } else if (t < 2.0) {\n return mix(value1, value2, t - 1.0);\n } else {\n return mix(value2, value3, t - 2.0);\n }\n}\n\n// Unpack a pair of values that have been packed into a single float.\n// The packed values are assumed to be 8-bit unsigned integers, and are\n// packed like so:\n// packedValue = floor(input[0]) * 256 + input[1],\nvec2 unpack_float(const float packedValue) {\n int packedIntValue = int(packedValue);\n int v0 = packedIntValue / 256;\n return vec2(v0, packedIntValue - v0 * 256);\n}\n\n\n// To minimize the number of attributes needed in the mapbox-gl-native shaders,\n// we encode a 4-component color into a pair of floats (i.e. a vec2) as follows:\n// [ floor(color.r * 255) * 256 + color.g * 255,\n// floor(color.b * 255) * 256 + color.g * 255 ]\nvec4 decode_color(const vec2 encodedColor) {\n return vec4(\n unpack_float(encodedColor[0]) / 255.0,\n unpack_float(encodedColor[1]) / 255.0\n );\n}\n\n// Unpack a pair of paint values and interpolate between them.\nfloat unpack_mix_vec2(const vec2 packedValue, const float t) {\n return mix(packedValue[0], packedValue[1], t);\n}\n\n// Unpack a pair of paint values and interpolate between them.\nvec4 unpack_mix_vec4(const vec4 packedColors, const float t) {\n vec4 minColor = decode_color(vec2(packedColors[0], packedColors[1]));\n vec4 maxColor = decode_color(vec2(packedColors[2], packedColors[3]));\n return mix(minColor, maxColor, t);\n}\n\n// The offset depends on how many pixels are between the world origin and the edge of the tile:\n// vec2 offset = mod(pixel_coord, size)\n//\n// At high zoom levels there are a ton of pixels between the world origin and the edge of the tile.\n// The glsl spec only guarantees 16 bits of precision for highp floats. We need more than that.\n//\n// The pixel_coord is passed in as two 16 bit values:\n// pixel_coord_upper = floor(pixel_coord / 2^16)\n// pixel_coord_lower = mod(pixel_coord, 2^16)\n//\n// The offset is calculated in a series of steps that should preserve this precision:\nvec2 get_pattern_pos(const vec2 pixel_coord_upper, const vec2 pixel_coord_lower,\n const vec2 pattern_size, const float tile_units_to_pixels, const vec2 pos) {\n\n vec2 offset = mod(mod(mod(pixel_coord_upper, pattern_size) * 256.0, pattern_size) * 256.0 + pixel_coord_lower, pattern_size);\n return (tile_units_to_pixels * pos + offset) / pattern_size;\n}\n"},circle:{fragmentSource:"#pragma mapbox: define highp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define highp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\n\nvarying vec2 v_extrude;\nvarying lowp float v_antialiasblur;\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize mediump float radius\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize highp vec4 stroke_color\n #pragma mapbox: initialize mediump float stroke_width\n #pragma mapbox: initialize lowp float stroke_opacity\n\n float extrude_length = length(v_extrude);\n float antialiased_blur = -max(blur, v_antialiasblur);\n\n float opacity_t = smoothstep(0.0, antialiased_blur, extrude_length - 1.0);\n\n float color_t = stroke_width < 0.01 ? 0.0 : smoothstep(\n antialiased_blur,\n 0.0,\n extrude_length - radius / (radius + stroke_width)\n );\n\n gl_FragColor = opacity_t * mix(color * opacity, stroke_color * stroke_opacity, color_t);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform bool u_scale_with_map;\nuniform vec2 u_extrude_scale;\n\nattribute vec2 a_pos;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define highp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\n\nvarying vec2 v_extrude;\nvarying lowp float v_antialiasblur;\n\nvoid main(void) {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize mediump float radius\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize highp vec4 stroke_color\n #pragma mapbox: initialize mediump float stroke_width\n #pragma mapbox: initialize lowp float stroke_opacity\n\n // unencode the extrusion vector that we snuck into the a_pos vector\n v_extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0);\n\n vec2 extrude = v_extrude * (radius + stroke_width) * u_extrude_scale;\n // multiply a_pos by 0.5, since we had it * 2 in order to sneak\n // in extrusion data\n gl_Position = u_matrix * vec4(floor(a_pos * 0.5), 0, 1);\n\n if (u_scale_with_map) {\n gl_Position.xy += extrude;\n } else {\n gl_Position.xy += extrude * gl_Position.w;\n }\n\n // This is a minimum blur distance that serves as a faux-antialiasing for\n // the circle. since blur is a ratio of the circle's size and the intent is\n // to keep the blur at roughly 1px, the two are inversely related.\n v_antialiasblur = 1.0 / DEVICE_PIXEL_RATIO / (radius + stroke_width);\n}\n"},collisionBox:{fragmentSource:"uniform float u_zoom;\nuniform float u_maxzoom;\n\nvarying float v_max_zoom;\nvarying float v_placement_zoom;\n\nvoid main() {\n\n float alpha = 0.5;\n\n gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0) * alpha;\n\n if (v_placement_zoom > u_zoom) {\n gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0) * alpha;\n }\n\n if (u_zoom >= v_max_zoom) {\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0) * alpha * 0.25;\n }\n\n if (v_placement_zoom >= u_maxzoom) {\n gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0) * alpha * 0.2;\n }\n}\n",vertexSource:"attribute vec2 a_pos;\nattribute vec2 a_extrude;\nattribute vec2 a_data;\n\nuniform mat4 u_matrix;\nuniform float u_scale;\n\nvarying float v_max_zoom;\nvarying float v_placement_zoom;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos + a_extrude / u_scale, 0.0, 1.0);\n\n v_max_zoom = a_data.x;\n v_placement_zoom = a_data.y;\n}\n"},debug:{fragmentSource:"uniform highp vec4 u_color;\n\nvoid main() {\n gl_FragColor = u_color;\n}\n",vertexSource:"attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, step(32767.0, a_pos.x), 1);\n}\n"},fill:{fragmentSource:"#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float opacity\n\n gl_FragColor = color * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n"},fillOutline:{fragmentSource:"#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\n\nvarying vec2 v_pos;\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 outline_color\n #pragma mapbox: initialize lowp float opacity\n\n float dist = length(v_pos - gl_FragCoord.xy);\n float alpha = 1.0 - smoothstep(0.0, 1.0, dist);\n gl_FragColor = outline_color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\nuniform vec2 u_world;\n\nvarying vec2 v_pos;\n\n#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 outline_color\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\n}\n"},fillOutlinePattern:{fragmentSource:"uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform float u_mix;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n // find distance to outline for alpha interpolation\n\n float dist = length(v_pos - gl_FragCoord.xy);\n float alpha = 1.0 - smoothstep(0.0, 1.0, dist);\n\n\n gl_FragColor = mix(color1, color2, u_mix) * alpha * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_world;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, a_pos);\n\n v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\n}\n"},fillPattern:{fragmentSource:"uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform float u_mix;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n gl_FragColor = mix(color1, color2, u_mix) * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, a_pos);\n}\n"},fillExtrusion:{fragmentSource:"varying vec4 v_color;\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define highp vec4 color\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n #pragma mapbox: initialize highp vec4 color\n\n gl_FragColor = v_color;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec3 u_lightcolor;\nuniform lowp vec3 u_lightpos;\nuniform lowp float u_lightintensity;\n\nattribute vec2 a_pos;\nattribute vec3 a_normal;\nattribute float a_edgedistance;\n\nvarying vec4 v_color;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n\n#pragma mapbox: define highp vec4 color\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n #pragma mapbox: initialize highp vec4 color\n\n base = max(0.0, base);\n height = max(0.0, height);\n\n float ed = a_edgedistance; // use each attrib in order to not trip a VAO assert\n float t = mod(a_normal.x, 2.0);\n\n gl_Position = u_matrix * vec4(a_pos, t > 0.0 ? height : base, 1);\n\n // Relative luminance (how dark/bright is the surface color?)\n float colorvalue = color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722;\n\n v_color = vec4(0.0, 0.0, 0.0, 1.0);\n\n // Add slight ambient lighting so no extrusions are totally black\n vec4 ambientlight = vec4(0.03, 0.03, 0.03, 1.0);\n color += ambientlight;\n\n // Calculate cos(theta), where theta is the angle between surface normal and diffuse light ray\n float directional = clamp(dot(a_normal / 16384.0, u_lightpos), 0.0, 1.0);\n\n // Adjust directional so that\n // the range of values for highlight/shading is narrower\n // with lower light intensity\n // and with lighter/brighter surface colors\n directional = mix((1.0 - u_lightintensity), max((1.0 - colorvalue + u_lightintensity), 1.0), directional);\n\n // Add gradient along z axis of side surfaces\n if (a_normal.y != 0.0) {\n directional *= clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0);\n }\n\n // Assign final color based on surface + ambient light color, diffuse light directional, and light color\n // with lower bounds adjusted to hue of light\n // so that shading is tinted with the complementary (opposite) color to the light color\n v_color.r += clamp(color.r * directional * u_lightcolor.r, mix(0.0, 0.3, 1.0 - u_lightcolor.r), 1.0);\n v_color.g += clamp(color.g * directional * u_lightcolor.g, mix(0.0, 0.3, 1.0 - u_lightcolor.g), 1.0);\n v_color.b += clamp(color.b * directional * u_lightcolor.b, mix(0.0, 0.3, 1.0 - u_lightcolor.b), 1.0);\n}\n"},fillExtrusionPattern:{fragmentSource:"uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform float u_mix;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec4 v_lighting;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n vec4 mixedColor = mix(color1, color2, u_mix);\n\n gl_FragColor = mixedColor * v_lighting;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\nuniform float u_height_factor;\n\nuniform vec3 u_lightcolor;\nuniform lowp vec3 u_lightpos;\nuniform lowp float u_lightintensity;\n\nattribute vec2 a_pos;\nattribute vec3 a_normal;\nattribute float a_edgedistance;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec4 v_lighting;\nvarying float v_directional;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n\n base = max(0.0, base);\n height = max(0.0, height);\n\n float t = mod(a_normal.x, 2.0);\n float z = t > 0.0 ? height : base;\n\n gl_Position = u_matrix * vec4(a_pos, z, 1);\n\n vec2 pos = a_normal.x == 1.0 && a_normal.y == 0.0 && a_normal.z == 16384.0\n ? a_pos // extrusion top\n : vec2(a_edgedistance, z * u_height_factor); // extrusion side\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, pos);\n\n v_lighting = vec4(0.0, 0.0, 0.0, 1.0);\n float directional = clamp(dot(a_normal / 16383.0, u_lightpos), 0.0, 1.0);\n directional = mix((1.0 - u_lightintensity), max((0.5 + u_lightintensity), 1.0), directional);\n\n if (a_normal.y != 0.0) {\n directional *= clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0);\n }\n\n v_lighting.rgb += clamp(directional * u_lightcolor, mix(vec3(0.0), vec3(0.3), 1.0 - u_lightcolor), vec3(1.0));\n}\n"},extrusionTexture:{fragmentSource:"uniform sampler2D u_image;\nuniform float u_opacity;\nvarying vec2 v_pos;\n\nvoid main() {\n gl_FragColor = texture2D(u_image, v_pos) * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(0.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_world;\nattribute vec2 a_pos;\nvarying vec2 v_pos;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos * u_world, 0, 1);\n\n v_pos.x = a_pos.x;\n v_pos.y = 1.0 - a_pos.y;\n}\n"},line:{fragmentSource:"#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvarying vec2 v_width2;\nvarying vec2 v_normal;\nvarying float v_gamma_scale;\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\n// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\nattribute vec2 a_pos;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform mediump float u_width;\nuniform vec2 u_gl_units_to_pixels;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump float gapwidth\n #pragma mapbox: initialize lowp float offset\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n\n // We store the texture normals in the most insignificant bit\n // transform y so that 0 => -1 and 1 => 1\n // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\n // y is 1 if the normal points up, and -1 if it points down\n mediump vec2 normal = mod(a_pos, 2.0);\n normal.y = sign(normal.y - 0.5);\n v_normal = normal;\n\n\n // these transformations used to be applied in the JS and native code bases. \n // moved them into the shader for clarity and simplicity. \n gapwidth = gapwidth / 2.0;\n float width = u_width / 2.0;\n offset = -1.0 * offset; \n\n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + width * (gapwidth > 0.0 ? 2.0 : 1.0) + ANTIALIASING;\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist = outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n // Remove the texture normal bit to get the position\n vec2 pos = floor(a_pos * 0.5);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_width2 = vec2(outset, inset);\n}\n"},linePattern:{fragmentSource:"uniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform float u_fade;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_linesofar;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n float x_a = mod(v_linesofar / u_pattern_size_a.x, 1.0);\n float x_b = mod(v_linesofar / u_pattern_size_b.x, 1.0);\n float y_a = 0.5 + (v_normal.y * v_width2.s / u_pattern_size_a.y);\n float y_b = 0.5 + (v_normal.y * v_width2.s / u_pattern_size_b.y);\n vec2 pos_a = mix(u_pattern_tl_a, u_pattern_br_a, vec2(x_a, y_a));\n vec2 pos_b = mix(u_pattern_tl_b, u_pattern_br_b, vec2(x_b, y_b));\n\n vec4 color = mix(texture2D(u_image, pos_a), texture2D(u_image, pos_b), u_fade);\n\n gl_FragColor = color * alpha * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\n// We scale the distance before adding it to the buffers so that we can store\n// long distances for long segments. Use this value to unscale the distance.\n#define LINE_DISTANCE_SCALE 2.0\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\nattribute vec2 a_pos;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform mediump float u_width;\nuniform vec2 u_gl_units_to_pixels;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_linesofar;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float gapwidth\n\nvoid main() {\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp float offset\n #pragma mapbox: initialize mediump float gapwidth\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\n\n // We store the texture normals in the most insignificant bit\n // transform y so that 0 => -1 and 1 => 1\n // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\n // y is 1 if the normal points up, and -1 if it points down\n mediump vec2 normal = mod(a_pos, 2.0);\n normal.y = sign(normal.y - 0.5);\n v_normal = normal;\n\n // these transformations used to be applied in the JS and native code bases. \n // moved them into the shader for clarity and simplicity. \n gapwidth = gapwidth / 2.0;\n float width = u_width / 2.0;\n offset = -1.0 * offset; \n\n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + width * (gapwidth > 0.0 ? 2.0 : 1.0) + ANTIALIASING;\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist = outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n // Remove the texture normal bit to get the position\n vec2 pos = floor(a_pos * 0.5);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_linesofar = a_linesofar;\n v_width2 = vec2(outset, inset);\n}\n"},lineSDF:{fragmentSource:"\nuniform sampler2D u_image;\nuniform float u_sdfgamma;\nuniform float u_mix;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n float sdfdist_a = texture2D(u_image, v_tex_a).a;\n float sdfdist_b = texture2D(u_image, v_tex_b).a;\n float sdfdist = mix(sdfdist_a, sdfdist_b, u_mix);\n alpha *= smoothstep(0.5 - u_sdfgamma, 0.5 + u_sdfgamma, sdfdist);\n\n gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\n// We scale the distance before adding it to the buffers so that we can store\n// long distances for long segments. Use this value to unscale the distance.\n#define LINE_DISTANCE_SCALE 2.0\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\nattribute vec2 a_pos;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform vec2 u_patternscale_a;\nuniform float u_tex_y_a;\nuniform vec2 u_patternscale_b;\nuniform float u_tex_y_b;\nuniform vec2 u_gl_units_to_pixels;\nuniform mediump float u_width;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump float gapwidth\n #pragma mapbox: initialize lowp float offset\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\n\n // We store the texture normals in the most insignificant bit\n // transform y so that 0 => -1 and 1 => 1\n // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\n // y is 1 if the normal points up, and -1 if it points down\n mediump vec2 normal = mod(a_pos, 2.0);\n normal.y = sign(normal.y - 0.5);\n v_normal = normal;\n\n // these transformations used to be applied in the JS and native code bases. \n // moved them into the shader for clarity and simplicity. \n gapwidth = gapwidth / 2.0;\n float width = u_width / 2.0;\n offset = -1.0 * offset;\n \n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + width * (gapwidth > 0.0 ? 2.0 : 1.0) + ANTIALIASING;\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist =outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n // Remove the texture normal bit to get the position\n vec2 pos = floor(a_pos * 0.5);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_tex_a = vec2(a_linesofar * u_patternscale_a.x, normal.y * u_patternscale_a.y + u_tex_y_a);\n v_tex_b = vec2(a_linesofar * u_patternscale_b.x, normal.y * u_patternscale_b.y + u_tex_y_b);\n\n v_width2 = vec2(outset, inset);\n}\n"
; |
186 | },raster:{fragmentSource:"uniform float u_fade_t;\nuniform float u_opacity;\nuniform sampler2D u_image0;\nuniform sampler2D u_image1;\nvarying vec2 v_pos0;\nvarying vec2 v_pos1;\n\nuniform float u_brightness_low;\nuniform float u_brightness_high;\n\nuniform float u_saturation_factor;\nuniform float u_contrast_factor;\nuniform vec3 u_spin_weights;\n\nvoid main() {\n\n // read and cross-fade colors from the main and parent tiles\n vec4 color0 = texture2D(u_image0, v_pos0);\n vec4 color1 = texture2D(u_image1, v_pos1);\n vec4 color = mix(color0, color1, u_fade_t);\n color.a *= u_opacity;\n vec3 rgb = color.rgb;\n\n // spin\n rgb = vec3(\n dot(rgb, u_spin_weights.xyz),\n dot(rgb, u_spin_weights.zxy),\n dot(rgb, u_spin_weights.yzx));\n\n // saturation\n float average = (color.r + color.g + color.b) / 3.0;\n rgb += (average - rgb) * u_saturation_factor;\n\n // contrast\n rgb = (rgb - 0.5) * u_contrast_factor + 0.5;\n\n // brightness\n vec3 u_high_vec = vec3(u_brightness_low, u_brightness_low, u_brightness_low);\n vec3 u_low_vec = vec3(u_brightness_high, u_brightness_high, u_brightness_high);\n\n gl_FragColor = vec4(mix(u_high_vec, u_low_vec, rgb) * color.a, color.a);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_tl_parent;\nuniform float u_scale_parent;\nuniform float u_buffer_scale;\n\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying vec2 v_pos0;\nvarying vec2 v_pos1;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n v_pos0 = (((a_texture_pos / 32767.0) - 0.5) / u_buffer_scale ) + 0.5;\n v_pos1 = (v_pos0 * u_scale_parent) + u_tl_parent;\n}\n"},symbolIcon:{fragmentSource:"uniform sampler2D u_texture;\nuniform sampler2D u_fadetexture;\n\n#pragma mapbox: define lowp float opacity\n\nvarying vec2 v_tex;\nvarying vec2 v_fade_tex;\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n lowp float alpha = texture2D(u_fadetexture, v_fade_tex).a * opacity;\n gl_FragColor = texture2D(u_texture, v_tex) * alpha;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:'\nattribute vec4 a_pos_offset;\nattribute vec4 a_data;\n\n// icon-size data (see symbol_sdf.vertex.glsl for more)\nattribute vec3 a_size;\nuniform bool u_is_size_zoom_constant;\nuniform bool u_is_size_feature_constant;\nuniform mediump float u_size_t; // used to interpolate between zoom stops when size is a composite function\nuniform mediump float u_size; // used when size is both zoom and feature constant\nuniform mediump float u_layout_size; // used when size is feature constant\n\n#pragma mapbox: define lowp float opacity\n\n// matrix is for the vertex position.\nuniform mat4 u_matrix;\n\nuniform bool u_is_text;\nuniform mediump float u_zoom;\nuniform bool u_rotate_with_map;\nuniform vec2 u_extrude_scale;\n\nuniform vec2 u_texsize;\n\nvarying vec2 v_tex;\nvarying vec2 v_fade_tex;\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n vec2 a_pos = a_pos_offset.xy;\n vec2 a_offset = a_pos_offset.zw;\n\n vec2 a_tex = a_data.xy;\n mediump vec2 label_data = unpack_float(a_data[2]);\n mediump float a_labelminzoom = label_data[0];\n mediump vec2 a_zoom = unpack_float(a_data[3]);\n mediump float a_minzoom = a_zoom[0];\n mediump float a_maxzoom = a_zoom[1];\n\n float size;\n // In order to accommodate placing labels around corners in\n // symbol-placement: line, each glyph in a label could have multiple\n // "quad"s only one of which should be shown at a given zoom level.\n // The min/max zoom assigned to each quad is based on the font size at\n // the vector tile\'s zoom level, which might be different than at the\n // currently rendered zoom level if text-size is zoom-dependent.\n // Thus, we compensate for this difference by calculating an adjustment\n // based on the scale of rendered text size relative to layout text size.\n mediump float layoutSize;\n if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = mix(a_size[0], a_size[1], u_size_t) / 10.0;\n layoutSize = a_size[2] / 10.0;\n } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = a_size[0] / 10.0;\n layoutSize = size;\n } else if (!u_is_size_zoom_constant && u_is_size_feature_constant) {\n size = u_size;\n layoutSize = u_layout_size;\n } else {\n size = u_size;\n layoutSize = u_size;\n }\n\n float fontScale = u_is_text ? size / 24.0 : size;\n\n mediump float zoomAdjust = log2(size / layoutSize);\n mediump float adjustedZoom = (u_zoom - zoomAdjust) * 10.0;\n // result: z = 0 if a_minzoom <= adjustedZoom < a_maxzoom, and 1 otherwise\n mediump float z = 2.0 - step(a_minzoom, adjustedZoom) - (1.0 - step(a_maxzoom, adjustedZoom));\n\n vec2 extrude = fontScale * u_extrude_scale * (a_offset / 64.0);\n if (u_rotate_with_map) {\n gl_Position = u_matrix * vec4(a_pos + extrude, 0, 1);\n gl_Position.z += z * gl_Position.w;\n } else {\n gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\n }\n\n v_tex = a_tex / u_texsize;\n v_fade_tex = vec2(a_labelminzoom / 255.0, 0.0);\n}\n'},symbolSDF:{fragmentSource:"#define SDF_PX 8.0\n#define EDGE_GAMMA 0.105/DEVICE_PIXEL_RATIO\n\nuniform bool u_is_halo;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\n\nuniform sampler2D u_texture;\nuniform sampler2D u_fadetexture;\nuniform highp float u_gamma_scale;\nuniform bool u_is_text;\n\nvarying vec2 v_tex;\nvarying vec2 v_fade_tex;\nvarying float v_gamma_scale;\nvarying float v_size;\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 fill_color\n #pragma mapbox: initialize highp vec4 halo_color\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp float halo_width\n #pragma mapbox: initialize lowp float halo_blur\n\n float fontScale = u_is_text ? v_size / 24.0 : v_size;\n\n lowp vec4 color = fill_color;\n highp float gamma = EDGE_GAMMA / (fontScale * u_gamma_scale);\n lowp float buff = (256.0 - 64.0) / 256.0;\n if (u_is_halo) {\n color = halo_color;\n gamma = (halo_blur * 1.19 / SDF_PX + EDGE_GAMMA) / (fontScale * u_gamma_scale);\n buff = (6.0 - halo_width / fontScale) / SDF_PX;\n }\n\n lowp float dist = texture2D(u_texture, v_tex).a;\n lowp float fade_alpha = texture2D(u_fadetexture, v_fade_tex).a;\n highp float gamma_scaled = gamma * v_gamma_scale;\n highp float alpha = smoothstep(buff - gamma_scaled, buff + gamma_scaled, dist) * fade_alpha;\n\n gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"const float PI = 3.141592653589793;\n\nattribute vec4 a_pos_offset;\nattribute vec4 a_data;\n\n// contents of a_size vary based on the type of property value\n// used for {text,icon}-size.\n// For constants, a_size is disabled.\n// For source functions, we bind only one value per vertex: the value of {text,icon}-size evaluated for the current feature.\n// For composite functions:\n// [ text-size(lowerZoomStop, feature),\n// text-size(upperZoomStop, feature),\n// layoutSize == text-size(layoutZoomLevel, feature) ]\nattribute vec3 a_size;\nuniform bool u_is_size_zoom_constant;\nuniform bool u_is_size_feature_constant;\nuniform mediump float u_size_t; // used to interpolate between zoom stops when size is a composite function\nuniform mediump float u_size; // used when size is both zoom and feature constant\nuniform mediump float u_layout_size; // used when size is feature constant\n\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\n\n// matrix is for the vertex position.\nuniform mat4 u_matrix;\n\nuniform bool u_is_text;\nuniform mediump float u_zoom;\nuniform bool u_rotate_with_map;\nuniform bool u_pitch_with_map;\nuniform mediump float u_pitch;\nuniform mediump float u_bearing;\nuniform mediump float u_aspect_ratio;\nuniform vec2 u_extrude_scale;\n\nuniform vec2 u_texsize;\n\nvarying vec2 v_tex;\nvarying vec2 v_fade_tex;\nvarying float v_gamma_scale;\nvarying float v_size;\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 fill_color\n #pragma mapbox: initialize highp vec4 halo_color\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp float halo_width\n #pragma mapbox: initialize lowp float halo_blur\n\n vec2 a_pos = a_pos_offset.xy;\n vec2 a_offset = a_pos_offset.zw;\n\n vec2 a_tex = a_data.xy;\n\n mediump vec2 label_data = unpack_float(a_data[2]);\n mediump float a_labelminzoom = label_data[0];\n mediump float a_labelangle = label_data[1];\n\n mediump vec2 a_zoom = unpack_float(a_data[3]);\n mediump float a_minzoom = a_zoom[0];\n mediump float a_maxzoom = a_zoom[1];\n\n // In order to accommodate placing labels around corners in\n // symbol-placement: line, each glyph in a label could have multiple\n // \"quad\"s only one of which should be shown at a given zoom level.\n // The min/max zoom assigned to each quad is based on the font size at\n // the vector tile's zoom level, which might be different than at the\n // currently rendered zoom level if text-size is zoom-dependent.\n // Thus, we compensate for this difference by calculating an adjustment\n // based on the scale of rendered text size relative to layout text size.\n mediump float layoutSize;\n if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {\n v_size = mix(a_size[0], a_size[1], u_size_t) / 10.0;\n layoutSize = a_size[2] / 10.0;\n } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {\n v_size = a_size[0] / 10.0;\n layoutSize = v_size;\n } else if (!u_is_size_zoom_constant && u_is_size_feature_constant) {\n v_size = u_size;\n layoutSize = u_layout_size;\n } else {\n v_size = u_size;\n layoutSize = u_size;\n }\n\n float fontScale = u_is_text ? v_size / 24.0 : v_size;\n\n mediump float zoomAdjust = log2(v_size / layoutSize);\n mediump float adjustedZoom = (u_zoom - zoomAdjust) * 10.0;\n // result: z = 0 if a_minzoom <= adjustedZoom < a_maxzoom, and 1 otherwise\n // Used below to move the vertex out of the clip space for when the current\n // zoom is out of the glyph's zoom range.\n mediump float z = 2.0 - step(a_minzoom, adjustedZoom) - (1.0 - step(a_maxzoom, adjustedZoom));\n\n // pitch-alignment: map\n // rotation-alignment: map | viewport\n if (u_pitch_with_map) {\n lowp float angle = u_rotate_with_map ? (a_labelangle / 256.0 * 2.0 * PI) : u_bearing;\n lowp float asin = sin(angle);\n lowp float acos = cos(angle);\n mat2 RotationMatrix = mat2(acos, asin, -1.0 * asin, acos);\n vec2 offset = RotationMatrix * a_offset;\n vec2 extrude = fontScale * u_extrude_scale * (offset / 64.0);\n gl_Position = u_matrix * vec4(a_pos + extrude, 0, 1);\n gl_Position.z += z * gl_Position.w;\n // pitch-alignment: viewport\n // rotation-alignment: map\n } else if (u_rotate_with_map) {\n // foreshortening factor to apply on pitched maps\n // as a label goes from horizontal <=> vertical in angle\n // it goes from 0% foreshortening to up to around 70% foreshortening\n lowp float pitchfactor = 1.0 - cos(u_pitch * sin(u_pitch * 0.75));\n\n lowp float lineangle = a_labelangle / 256.0 * 2.0 * PI;\n\n // use the lineangle to position points a,b along the line\n // project the points and calculate the label angle in projected space\n // this calculation allows labels to be rendered unskewed on pitched maps\n vec4 a = u_matrix * vec4(a_pos, 0, 1);\n vec4 b = u_matrix * vec4(a_pos + vec2(cos(lineangle),sin(lineangle)), 0, 1);\n lowp float angle = atan((b[1]/b[3] - a[1]/a[3])/u_aspect_ratio, b[0]/b[3] - a[0]/a[3]);\n lowp float asin = sin(angle);\n lowp float acos = cos(angle);\n mat2 RotationMatrix = mat2(acos, -1.0 * asin, asin, acos);\n\n vec2 offset = RotationMatrix * (vec2((1.0-pitchfactor)+(pitchfactor*cos(angle*2.0)), 1.0) * a_offset);\n vec2 extrude = fontScale * u_extrude_scale * (offset / 64.0);\n gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\n gl_Position.z += z * gl_Position.w;\n // pitch-alignment: viewport\n // rotation-alignment: viewport\n } else {\n vec2 extrude = fontScale * u_extrude_scale * (a_offset / 64.0);\n gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\n }\n\n v_gamma_scale = gl_Position.w;\n\n v_tex = a_tex / u_texsize;\n v_fade_tex = vec2(a_labelminzoom / 255.0, 0.0);\n}\n"}};
|
187 | },{"path":23}],80:[function(_dereq_,module,exports){
|
188 | var VertexArrayObject=function(){this.boundProgram=null,this.boundVertexBuffer=null,this.boundVertexBuffer2=null,this.boundElementBuffer=null,this.boundVertexOffset=null,this.vao=null;};VertexArrayObject.prototype.bind=function(e,t,r,i,n,s){void 0===e.extVertexArrayObject&&(e.extVertexArrayObject=e.getExtension("OES_vertex_array_object"));var o=!this.vao||this.boundProgram!==t||this.boundVertexBuffer!==r||this.boundVertexBuffer2!==n||this.boundElementBuffer!==i||this.boundVertexOffset!==s;!e.extVertexArrayObject||o?(this.freshBind(e,t,r,i,n,s),this.gl=e):e.extVertexArrayObject.bindVertexArrayOES(this.vao);},VertexArrayObject.prototype.freshBind=function(e,t,r,i,n,s){var o,u=t.numAttributes;if(e.extVertexArrayObject)this.vao&&this.destroy(),this.vao=e.extVertexArrayObject.createVertexArrayOES(),e.extVertexArrayObject.bindVertexArrayOES(this.vao),o=0,this.boundProgram=t,this.boundVertexBuffer=r,this.boundVertexBuffer2=n,this.boundElementBuffer=i,this.boundVertexOffset=s;else{o=e.currentNumAttributes||0;for(var b=u;b<o;b++)e.disableVertexAttribArray(b);}r.enableAttributes(e,t),n&&n.enableAttributes(e,t),r.bind(e),r.setVertexAttribPointers(e,t,s),n&&(n.bind(e),n.setVertexAttribPointers(e,t,s)),i&&i.bind(e),e.currentNumAttributes=u;},VertexArrayObject.prototype.destroy=function(){this.vao&&(this.gl.extVertexArrayObject.deleteVertexArrayOES(this.vao),this.vao=null);},module.exports=VertexArrayObject;
; |
189 | },{}],81:[function(_dereq_,module,exports){
|
190 | var util=_dereq_("../util/util");exports.packUint8ToFloat=function(t,l){return t=util.clamp(Math.floor(t),0,255),l=util.clamp(Math.floor(l),0,255),256*t+l};
; |
191 | },{"../util/util":215}],82:[function(_dereq_,module,exports){
|
192 | var ImageSource=_dereq_("./image_source"),window=_dereq_("../util/window"),CanvasSource=function(t){function i(i,a,s,n){t.call(this,i,a,s,n),this.options=a,this.animate=!a.hasOwnProperty("animate")||a.animate;}return t&&(i.__proto__=t),i.prototype=Object.create(t&&t.prototype),i.prototype.constructor=i,i.prototype.load=function(){if(this.canvas=this.canvas||window.document.getElementById(this.options.canvas),this.width=this.canvas.width,this.height=this.canvas.height,this._hasInvalidDimensions())return this.fire("error",new Error("Canvas dimensions cannot be less than or equal to zero."));var t;this.play=function(){t=this.map.style.animationLoop.set(1/0),this.map._rerender();},this.pause=function(){this.map.style.animationLoop.cancel(t);},this._finishLoading();},i.prototype.getCanvas=function(){return this.canvas},i.prototype.onAdd=function(t){this.map||(this.map=t,this.load(),this.canvas&&this.animate&&this.play());},i.prototype.prepare=function(){var t=!1;this.canvas.width!==this.width&&(this.width=this.canvas.width,t=!0),this.canvas.height!==this.height&&(this.height=this.canvas.height,t=!0),this._hasInvalidDimensions()||this.tile&&this._prepareImage(this.map.painter.gl,this.canvas,t);},i.prototype.serialize=function(){return{type:"canvas",canvas:this.canvas,coordinates:this.coordinates}},i.prototype._hasInvalidDimensions=function(){for(var t=this,i=0,a=[t.canvas.width,t.canvas.height];i<a.length;i+=1){var s=a[i];if(isNaN(s)||s<=0)return!0}return!1},i}(ImageSource);module.exports=CanvasSource;
; |
193 | },{"../util/window":197,"./image_source":86}],83:[function(_dereq_,module,exports){
|
194 | function resolveURL(t){var e=window.document.createElement("a");return e.href=t,e.href}var Evented=_dereq_("../util/evented"),util=_dereq_("../util/util"),window=_dereq_("../util/window"),EXTENT=_dereq_("../data/extent"),GeoJSONSource=function(t){function e(e,o,i,r){t.call(this),o=o||{},this.id=e,this.type="geojson",this.minzoom=0,this.maxzoom=18,this.tileSize=512,this.isTileClipped=!0,this.reparseOverscaled=!0,this.dispatcher=i,this.setEventedParent(r),this._data=o.data,void 0!==o.maxzoom&&(this.maxzoom=o.maxzoom),o.type&&(this.type=o.type);var a=EXTENT/this.tileSize;this.workerOptions=util.extend({source:this.id,cluster:o.cluster||!1,geojsonVtOptions:{buffer:(void 0!==o.buffer?o.buffer:128)*a,tolerance:(void 0!==o.tolerance?o.tolerance:.375)*a,extent:EXTENT,maxZoom:this.maxzoom},superclusterOptions:{maxZoom:Math.min(o.clusterMaxZoom,this.maxzoom-1)||this.maxzoom-1,extent:EXTENT,radius:(o.clusterRadius||50)*a,log:!1}},o.workerOptions);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.load=function(){var t=this;this.fire("dataloading",{dataType:"source"}),this._updateWorkerData(function(e){return e?void t.fire("error",{error:e}):void t.fire("data",{dataType:"source",sourceDataType:"metadata"})});},e.prototype.onAdd=function(t){this.load(),this.map=t;},e.prototype.setData=function(t){var e=this;return this._data=t,this.fire("dataloading",{dataType:"source"}),this._updateWorkerData(function(t){return t?e.fire("error",{error:t}):void e.fire("data",{dataType:"source",sourceDataType:"content"})}),this},e.prototype._updateWorkerData=function(t){var e=this,o=util.extend({},this.workerOptions),i=this._data;"string"==typeof i?o.url=resolveURL(i):o.data=JSON.stringify(i),this.workerID=this.dispatcher.send(this.type+".loadData",o,function(o){e._loaded=!0,t(o);});},e.prototype.loadTile=function(t,e){var o=this,i=t.coord.z>this.maxzoom?Math.pow(2,t.coord.z-this.maxzoom):1,r={type:this.type,uid:t.uid,coord:t.coord,zoom:t.coord.z,maxZoom:this.maxzoom,tileSize:this.tileSize,source:this.id,overscaling:i,angle:this.map.transform.angle,pitch:this.map.transform.pitch,showCollisionBoxes:this.map.showCollisionBoxes};t.workerID=this.dispatcher.send("loadTile",r,function(i,r){if(t.unloadVectorData(),!t.aborted)return i?e(i):(t.loadVectorData(r,o.map.painter),t.redoWhenDone&&(t.redoWhenDone=!1,t.redoPlacement(o)),e(null))},this.workerID);},e.prototype.abortTile=function(t){t.aborted=!0;},e.prototype.unloadTile=function(t){t.unloadVectorData(),this.dispatcher.send("removeTile",{uid:t.uid,type:this.type,source:this.id},function(){},t.workerID);},e.prototype.onRemove=function(){this.dispatcher.broadcast("removeSource",{type:this.type,source:this.id},function(){});},e.prototype.serialize=function(){return{type:this.type,data:this._data}},e}(Evented);module.exports=GeoJSONSource;
; |
195 | },{"../data/extent":54,"../util/evented":203,"../util/util":215,"../util/window":197}],84:[function(_dereq_,module,exports){
|
196 | var ajax=_dereq_("../util/ajax"),rewind=_dereq_("geojson-rewind"),GeoJSONWrapper=_dereq_("./geojson_wrapper"),vtpbf=_dereq_("vt-pbf"),supercluster=_dereq_("supercluster"),geojsonvt=_dereq_("geojson-vt"),VectorTileWorkerSource=_dereq_("./vector_tile_worker_source"),GeoJSONWorkerSource=function(e){function r(r,t,o){e.call(this,r,t),o&&(this.loadGeoJSON=o),this._geoJSONIndexes={};}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.loadVectorData=function(e,r){var t=e.source,o=e.coord;if(!this._geoJSONIndexes[t])return r(null,null);var n=this._geoJSONIndexes[t].getTile(Math.min(o.z,e.maxZoom),o.x,o.y);if(!n)return r(null,null);var u=new GeoJSONWrapper(n.features);u.name="_geojsonTileLayer";var a=vtpbf({layers:{_geojsonTileLayer:u}});0===a.byteOffset&&a.byteLength===a.buffer.byteLength||(a=new Uint8Array(a)),u.rawData=a.buffer,r(null,u);},r.prototype.loadData=function(e,r){var t=function(t,o){var n=this;return t?r(t):"object"!=typeof o?r(new Error("Input data is not a valid GeoJSON object.")):(rewind(o,!0),void this._indexData(o,e,function(t,o){return t?r(t):(n._geoJSONIndexes[e.source]=o,void r(null))}))}.bind(this);this.loadGeoJSON(e,t);},r.prototype.loadGeoJSON=function(e,r){if(e.url)ajax.getJSON(e.url,r);else{if("string"!=typeof e.data)return r(new Error("Input data is not a valid GeoJSON object."));try{return r(null,JSON.parse(e.data))}catch(e){return r(new Error("Input data is not a valid GeoJSON object."))}}},r.prototype.removeSource=function(e){this._geoJSONIndexes[e.source]&&delete this._geoJSONIndexes[e.source];},r.prototype._indexData=function(e,r,t){try{r.cluster?t(null,supercluster(r.superclusterOptions).load(e.features)):t(null,geojsonvt(e,r.geojsonVtOptions));}catch(e){return t(e)}},r}(VectorTileWorkerSource);module.exports=GeoJSONWorkerSource;
; |
197 | },{"../util/ajax":194,"./geojson_wrapper":85,"./vector_tile_worker_source":98,"geojson-rewind":7,"geojson-vt":11,"supercluster":29,"vt-pbf":38}],85:[function(_dereq_,module,exports){
|
198 | var Point=_dereq_("point-geometry"),VectorTileFeature=_dereq_("vector-tile").VectorTileFeature,EXTENT=_dereq_("../data/extent"),FeatureWrapper=function(e){var t=this;if(this.type=e.type,1===e.type){this.rawGeometry=[];for(var r=0;r<e.geometry.length;r++)t.rawGeometry.push([e.geometry[r]]);}else this.rawGeometry=e.geometry;this.properties=e.tags,"id"in e&&!isNaN(e.id)&&(this.id=parseInt(e.id,10)),this.extent=EXTENT;};FeatureWrapper.prototype.loadGeometry=function(){var e=this,t=this.rawGeometry;this.geometry=[];for(var r=0;r<t.length;r++){for(var o=t[r],a=[],i=0;i<o.length;i++)a.push(new Point(o[i][0],o[i][1]));e.geometry.push(a);}return this.geometry},FeatureWrapper.prototype.bbox=function(){this.geometry||this.loadGeometry();for(var e=this.geometry,t=1/0,r=-(1/0),o=1/0,a=-(1/0),i=0;i<e.length;i++)for(var p=e[i],n=0;n<p.length;n++){var h=p[n];t=Math.min(t,h.x),r=Math.max(r,h.x),o=Math.min(o,h.y),a=Math.max(a,h.y);}return[t,o,r,a]},FeatureWrapper.prototype.toGeoJSON=function(){VectorTileFeature.prototype.toGeoJSON.call(this);};var GeoJSONWrapper=function(e){this.features=e,this.length=e.length,this.extent=EXTENT;};GeoJSONWrapper.prototype.feature=function(e){return new FeatureWrapper(this.features[e])},module.exports=GeoJSONWrapper;
; |
199 | },{"../data/extent":54,"point-geometry":26,"vector-tile":34}],86:[function(_dereq_,module,exports){
|
200 | var util=_dereq_("../util/util"),window=_dereq_("../util/window"),TileCoord=_dereq_("./tile_coord"),LngLat=_dereq_("../geo/lng_lat"),Point=_dereq_("point-geometry"),Evented=_dereq_("../util/evented"),ajax=_dereq_("../util/ajax"),EXTENT=_dereq_("../data/extent"),RasterBoundsArray=_dereq_("../data/raster_bounds_array"),Buffer=_dereq_("../data/buffer"),VertexArrayObject=_dereq_("../render/vertex_array_object"),ImageSource=function(t){function e(e,o,r,i){t.call(this),this.id=e,this.dispatcher=r,this.coordinates=o.coordinates,this.type="image",this.minzoom=0,this.maxzoom=22,this.tileSize=512,this.setEventedParent(i),this.options=o;}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.load=function(){var t=this;this.fire("dataloading",{dataType:"source"}),this.url=this.options.url,ajax.getImage(this.options.url,function(e,o){return e?t.fire("error",{error:e}):(t.image=o,void t._finishLoading())});},e.prototype._finishLoading=function(){this.map&&(this.setCoordinates(this.coordinates),this.fire("data",{dataType:"source",sourceDataType:"metadata"}));},e.prototype.onAdd=function(t){this.load(),this.map=t,this.image&&this.setCoordinates(this.coordinates);},e.prototype.setCoordinates=function(t){this.coordinates=t;var e=this.map,o=t.map(function(t){return e.transform.locationCoordinate(LngLat.convert(t)).zoomTo(0)}),r=this.centerCoord=util.getCoordinatesCenter(o);return r.column=Math.floor(r.column),r.row=Math.floor(r.row),this.coord=new TileCoord(r.zoom,r.column,r.row),this.minzoom=this.maxzoom=r.zoom,this._tileCoords=o.map(function(t){var e=t.zoomTo(r.zoom);return new Point(Math.round((e.column-r.column)*EXTENT),Math.round((e.row-r.row)*EXTENT))}),this.fire("data",{dataType:"source",sourceDataType:"content"}),this},e.prototype._setTile=function(t){this.tile=t;var e=32767,o=new RasterBoundsArray;o.emplaceBack(this._tileCoords[0].x,this._tileCoords[0].y,0,0),o.emplaceBack(this._tileCoords[1].x,this._tileCoords[1].y,e,0),o.emplaceBack(this._tileCoords[3].x,this._tileCoords[3].y,0,e),o.emplaceBack(this._tileCoords[2].x,this._tileCoords[2].y,e,e),this.tile.buckets={},this.tile.boundsBuffer=Buffer.fromStructArray(o,Buffer.BufferType.VERTEX),this.tile.boundsVAO=new VertexArrayObject;},e.prototype.prepare=function(){this.tile&&this.image&&this._prepareImage(this.map.painter.gl,this.image);},e.prototype._prepareImage=function(t,e,o){"loaded"!==this.tile.state?(this.tile.state="loaded",this.tile.texture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.tile.texture),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,e)):o?t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,e):(e instanceof window.HTMLVideoElement||e instanceof window.ImageData||e instanceof window.HTMLCanvasElement)&&(t.bindTexture(t.TEXTURE_2D,this.tile.texture),t.texSubImage2D(t.TEXTURE_2D,0,0,0,t.RGBA,t.UNSIGNED_BYTE,e));},e.prototype.loadTile=function(t,e){this.coord&&this.coord.toString()===t.coord.toString()?(this._setTile(t),e(null)):(t.state="errored",e(null));},e.prototype.serialize=function(){return{type:"image",urls:this.url,coordinates:this.coordinates}},e}(Evented);module.exports=ImageSource;
; |
201 | },{"../data/buffer":51,"../data/extent":54,"../data/raster_bounds_array":59,"../geo/lng_lat":62,"../render/vertex_array_object":80,"../util/ajax":194,"../util/evented":203,"../util/util":215,"../util/window":197,"./tile_coord":96,"point-geometry":26}],87:[function(_dereq_,module,exports){
|
202 | var util=_dereq_("../util/util"),ajax=_dereq_("../util/ajax"),browser=_dereq_("../util/browser"),normalizeURL=_dereq_("../util/mapbox").normalizeSourceURL;module.exports=function(r,e){var o=function(r,o){if(r)return e(r);var i=util.pick(o,["tiles","minzoom","maxzoom","attribution","mapbox_logo","bounds"]);o.vector_layers&&(i.vectorLayers=o.vector_layers,i.vectorLayerIds=i.vectorLayers.map(function(r){return r.id})),e(null,i);};r.url?ajax.getJSON(normalizeURL(r.url),o):browser.frame(o.bind(null,null,r));};
; |
203 | },{"../util/ajax":194,"../util/browser":195,"../util/mapbox":210,"../util/util":215}],88:[function(_dereq_,module,exports){
|
204 | var EXTENT=_dereq_("../data/extent");module.exports=function(e,t,r){return t*(EXTENT/(e.tileSize*Math.pow(2,r-e.coord.z)))};
; |
205 | },{"../data/extent":54}],89:[function(_dereq_,module,exports){
|
206 | function sortTilesIn(e,r){var o=e.coord,t=r.coord;return o.z-t.z||o.y-t.y||o.w-t.w||o.x-t.x}function mergeRenderedFeatureLayers(e){for(var r=e[0]||{},o=1;o<e.length;o++){var t=e[o];for(var n in t){var a=t[n],i=r[n];if(void 0===i)i=r[n]=a;else for(var u=0;u<a.length;u++)i.push(a[u]);}}return r}var TileCoord=_dereq_("./tile_coord");exports.rendered=function(e,r,o,t,n,a){var i=e.tilesIn(o);i.sort(sortTilesIn);for(var u=[],s=0;s<i.length;s++){var d=i[s];d.tile.featureIndex&&u.push(d.tile.featureIndex.query({queryGeometry:d.queryGeometry,scale:d.scale,tileSize:d.tile.tileSize,bearing:a,params:t},r));}return mergeRenderedFeatureLayers(u)},exports.source=function(e,r){for(var o=e.getRenderableIds().map(function(r){return e.getTileByID(r)}),t=[],n={},a=0;a<o.length;a++){var i=o[a],u=new TileCoord(Math.min(i.sourceMaxZoom,i.coord.z),i.coord.x,i.coord.y,0).id;n[u]||(n[u]=!0,i.querySourceFeatures(t,r));}return t};
; |
207 | },{"./tile_coord":96}],90:[function(_dereq_,module,exports){
|
208 | var util=_dereq_("../util/util"),ajax=_dereq_("../util/ajax"),Evented=_dereq_("../util/evented"),loadTileJSON=_dereq_("./load_tilejson"),normalizeURL=_dereq_("../util/mapbox").normalizeTileURL,TileBounds=_dereq_("./tile_bounds"),RasterTileSource=function(e){function t(t,i,r,o){e.call(this),this.id=t,this.dispatcher=r,this.setEventedParent(o),this.type="raster",this.minzoom=0,this.maxzoom=22,this.roundZoom=!0,this.scheme="xyz",this.tileSize=512,this._loaded=!1,this.options=i,util.extend(this,util.pick(i,["url","scheme","tileSize"]));}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.load=function(){var e=this;this.fire("dataloading",{dataType:"source"}),loadTileJSON(this.options,function(t,i){return t?e.fire("error",t):(util.extend(e,i),e.setBounds(i.bounds),e.fire("data",{dataType:"source",sourceDataType:"metadata"}),void e.fire("data",{dataType:"source",sourceDataType:"content"}))});},t.prototype.onAdd=function(e){this.load(),this.map=e;},t.prototype.setBounds=function(e){this.bounds=e,e&&(this.tileBounds=new TileBounds(e,this.minzoom,this.maxzoom));},t.prototype.serialize=function(){return{type:"raster",url:this.url,tileSize:this.tileSize,tiles:this.tiles,bounds:this.bounds}},t.prototype.hasTile=function(e){return!this.tileBounds||this.tileBounds.contains(e,this.maxzoom)},t.prototype.loadTile=function(e,t){function i(i,r){if(delete e.request,e.aborted)return this.state="unloaded",t(null);if(i)return this.state="errored",t(i);this.map._refreshExpiredTiles&&e.setExpiryData(r),delete r.cacheControl,delete r.expires;var o=this.map.painter.gl;e.texture=this.map.painter.getTileTexture(r.width),e.texture?(o.bindTexture(o.TEXTURE_2D,e.texture),o.texSubImage2D(o.TEXTURE_2D,0,0,0,o.RGBA,o.UNSIGNED_BYTE,r)):(e.texture=o.createTexture(),o.bindTexture(o.TEXTURE_2D,e.texture),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MIN_FILTER,o.LINEAR_MIPMAP_NEAREST),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MAG_FILTER,o.LINEAR),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_S,o.CLAMP_TO_EDGE),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_T,o.CLAMP_TO_EDGE),this.map.painter.extTextureFilterAnisotropic&&o.texParameterf(o.TEXTURE_2D,this.map.painter.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT,this.map.painter.extTextureFilterAnisotropicMax),o.texImage2D(o.TEXTURE_2D,0,o.RGBA,o.RGBA,o.UNSIGNED_BYTE,r),e.texture.size=r.width),o.generateMipmap(o.TEXTURE_2D),e.state="loaded",t(null);}var r=normalizeURL(e.coord.url(this.tiles,null,this.scheme),this.url,this.tileSize);e.request=ajax.getImage(r,i.bind(this));},t.prototype.abortTile=function(e){e.request&&(e.request.abort(),delete e.request);},t.prototype.unloadTile=function(e){e.texture&&this.map.painter.saveTileTexture(e.texture);},t}(Evented);module.exports=RasterTileSource;
; |
209 | },{"../util/ajax":194,"../util/evented":203,"../util/mapbox":210,"../util/util":215,"./load_tilejson":87,"./tile_bounds":95}],91:[function(_dereq_,module,exports){
|
210 | var ajax=_dereq_("../util/ajax"),Evented=_dereq_("../util/evented"),window=_dereq_("../util/window"),pluginRequested=!1,pluginBlobURL=null;module.exports.evented=new Evented,module.exports.registerForPluginAvailability=function(e){return pluginBlobURL?e(pluginBlobURL,module.exports.errorCallback):module.exports.evented.once("pluginAvailable",e),e},module.exports.setRTLTextPlugin=function(e,l){if(pluginRequested)throw new Error("setRTLTextPlugin cannot be called multiple times.");pluginRequested=!0,module.exports.errorCallback=l,ajax.getArrayBuffer(e,function(e,t){e?l(e):(pluginBlobURL=window.URL.createObjectURL(new window.Blob([t.data]),{type:"text/javascript"}),module.exports.evented.fire("pluginAvailable",{pluginBlobURL:pluginBlobURL,errorCallback:l}));});};
; |
211 | },{"../util/ajax":194,"../util/evented":203,"../util/window":197}],92:[function(_dereq_,module,exports){
|
212 | var util=_dereq_("../util/util"),sourceTypes={vector:_dereq_("../source/vector_tile_source"),raster:_dereq_("../source/raster_tile_source"),geojson:_dereq_("../source/geojson_source"),video:_dereq_("../source/video_source"),image:_dereq_("../source/image_source"),canvas:_dereq_("../source/canvas_source")};exports.create=function(e,r,o,u){if(r=new sourceTypes[r.type](e,r,o,u),r.id!==e)throw new Error("Expected Source id to be "+e+" instead of "+r.id);return util.bindAll(["load","abort","unload","serialize","prepare"],r),r},exports.getType=function(e){return sourceTypes[e]},exports.setType=function(e,r){sourceTypes[e]=r;};
; |
213 | },{"../source/canvas_source":82,"../source/geojson_source":83,"../source/image_source":86,"../source/raster_tile_source":90,"../source/vector_tile_source":97,"../source/video_source":99,"../util/util":215}],93:[function(_dereq_,module,exports){
|
214 | function coordinateToTilePoint(e,t,o){var i=o.zoomTo(Math.min(e.z,t));return{x:(i.column-(e.x+e.w*Math.pow(2,e.z)))*EXTENT,y:(i.row-e.y)*EXTENT}}function compareKeyZoom(e,t){return e%32-t%32}function isRasterType(e){return"raster"===e||"image"===e||"video"===e}var Source=_dereq_("./source"),Tile=_dereq_("./tile"),Evented=_dereq_("../util/evented"),TileCoord=_dereq_("./tile_coord"),Cache=_dereq_("../util/lru_cache"),Coordinate=_dereq_("../geo/coordinate"),util=_dereq_("../util/util"),EXTENT=_dereq_("../data/extent"),SourceCache=function(e){function t(t,o,i){e.call(this),this.id=t,this.dispatcher=i,this.on("data",function(e){"source"===e.dataType&&"metadata"===e.sourceDataType&&(this._sourceLoaded=!0),this._sourceLoaded&&"source"===e.dataType&&"content"===e.sourceDataType&&(this.reload(),this.transform&&this.update(this.transform));}),this.on("error",function(){this._sourceErrored=!0;}),this._source=Source.create(t,o,i,this),this._tiles={},this._cache=new Cache(0,this.unloadTile.bind(this)),this._timers={},this._cacheTimers={},this._isIdRenderable=this._isIdRenderable.bind(this);}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.onAdd=function(e){this.map=e,this._source&&this._source.onAdd&&this._source.onAdd(e);},t.prototype.onRemove=function(e){this._source&&this._source.onRemove&&this._source.onRemove(e);},t.prototype.loaded=function(){var e=this;if(this._sourceErrored)return!0;if(!this._sourceLoaded)return!1;for(var t in e._tiles){var o=e._tiles[t];if("loaded"!==o.state&&"errored"!==o.state)return!1}return!0},t.prototype.getSource=function(){return this._source},t.prototype.loadTile=function(e,t){return this._source.loadTile(e,t)},t.prototype.unloadTile=function(e){if(this._source.unloadTile)return this._source.unloadTile(e)},t.prototype.abortTile=function(e){if(this._source.abortTile)return this._source.abortTile(e)},t.prototype.serialize=function(){return this._source.serialize()},t.prototype.prepare=function(){if(this._sourceLoaded&&this._source.prepare)return this._source.prepare()},t.prototype.getIds=function(){return Object.keys(this._tiles).map(Number).sort(compareKeyZoom)},t.prototype.getRenderableIds=function(){return this.getIds().filter(this._isIdRenderable)},t.prototype._isIdRenderable=function(e){return this._tiles[e].hasData()&&!this._coveredTiles[e]},t.prototype.reload=function(){var e=this;this._cache.reset();for(var t in e._tiles)e.reloadTile(t,"reloading");},t.prototype.reloadTile=function(e,t){var o=this._tiles[e];o&&("loading"!==o.state&&(o.state=t),this.loadTile(o,this._tileLoaded.bind(this,o,e,t)));},t.prototype._tileLoaded=function(e,t,o,i){return i?(e.state="errored",void(404!==i.status&&this._source.fire("error",{tile:e,error:i}))):(e.sourceCache=this,e.timeAdded=(new Date).getTime(),"expired"===o&&(e.refreshedUponExpiration=!0),this._setTileReloadTimer(t,e),this._source.fire("data",{dataType:"source",tile:e,coord:e.coord}),void(this.map&&(this.map.painter.tileExtentVAO.vao=null)))},t.prototype.getTile=function(e){return this.getTileByID(e.id)},t.prototype.getTileByID=function(e){return this._tiles[e]},t.prototype.getZoom=function(e){return e.zoom+e.scaleZoom(e.tileSize/this._source.tileSize)},t.prototype.findLoadedChildren=function(e,t,o){var i=this,r=!1;for(var s in i._tiles){var a=i._tiles[s];if(!(o[s]||!a.hasData()||a.coord.z<=e.z||a.coord.z>t)){var n=Math.pow(2,Math.min(a.coord.z,i._source.maxzoom)-Math.min(e.z,i._source.maxzoom));if(Math.floor(a.coord.x/n)===e.x&&Math.floor(a.coord.y/n)===e.y)for(o[s]=!0,r=!0;a&&a.coord.z-1>e.z;){var d=a.coord.parent(i._source.maxzoom).id;a=i._tiles[d],a&&a.hasData()&&(delete o[s],o[d]=!0);}}}return r},t.prototype.findLoadedParent=function(e,t,o){for(var i=this,r=e.z-1;r>=t;r--){e=e.parent(i._source.maxzoom);var s=i._tiles[e.id];if(s&&s.hasData())return o[e.id]=!0,s;if(i._cache.has(e.id))return o[e.id]=!0,i._cache.getWithoutRemoving(e.id)}},t.prototype.updateCacheSize=function(e){var t=Math.ceil(e.width/e.tileSize)+1,o=Math.ceil(e.height/e.tileSize)+1,i=t*o,r=5;this._cache.setMaxSize(Math.floor(i*r));},t.prototype.update=function(e){var o=this;if(this.transform=e,this._sourceLoaded){var i,r,s,a;this.updateCacheSize(e);var n=(this._source.roundZoom?Math.round:Math.floor)(this.getZoom(e)),d=Math.max(n-t.maxOverzooming,this._source.minzoom),c=Math.max(n+t.maxUnderzooming,this._source.minzoom),h={};this._coveredTiles={};var u;for(this.used?this._source.coord?u=e.getVisibleWrappedCoordinates(this._source.coord):(u=e.coveringTiles({tileSize:this._source.tileSize,minzoom:this._source.minzoom,maxzoom:this._source.maxzoom,roundZoom:this._source.roundZoom,reparseOverscaled:this._source.reparseOverscaled}),this._source.hasTile&&(u=u.filter(function(e){return o._source.hasTile(e)}))):u=[],i=0;i<u.length;i++)r=u[i],s=o.addTile(r),h[r.id]=!0,s.hasData()||o.findLoadedChildren(r,c,h)||(a=o.findLoadedParent(r,d,h),a&&o.addTile(a.coord));var l={};if(isRasterType(this._source.type))for(var m=Object.keys(h),p=0;p<m.length;p++){var _=m[p];r=TileCoord.fromID(_),s=o._tiles[_],s&&("undefined"==typeof s.fadeEndTime||s.fadeEndTime>=Date.now())&&(o.findLoadedChildren(r,c,h)&&(h[_]=!0),a=o.findLoadedParent(r,d,l),a&&o.addTile(a.coord));}var f;for(f in l)h[f]||(o._coveredTiles[f]=!0);for(f in l)h[f]=!0;var T=util.keysDifference(this._tiles,h);for(i=0;i<T.length;i++)o.removeTile(+T[i]);}},t.prototype.addTile=function(e){var t=this._tiles[e.id];if(t)return t;var o=e.wrapped();t=this._tiles[o.id],t||(t=this._cache.get(o.id),t&&(t.redoPlacement(this._source),this._cacheTimers[o.id]&&(clearTimeout(this._cacheTimers[o.id]),this._cacheTimers[o.id]=void 0,this._setTileReloadTimer(o.id,t))));var i=Boolean(t);if(!i){var r=e.z,s=r>this._source.maxzoom?Math.pow(2,r-this._source.maxzoom):1;t=new Tile(o,this._source.tileSize*s,this._source.maxzoom),this.loadTile(t,this._tileLoaded.bind(this,t,e.id,t.state));}return t.uses++,this._tiles[e.id]=t,i||this._source.fire("dataloading",{tile:t,coord:t.coord,dataType:"source"}),t},t.prototype._setTileReloadTimer=function(e,t){var o=this,i=t.getExpiryTimeout();i&&(this._timers[e]=setTimeout(function(){o.reloadTile(e,"expired"),o._timers[e]=void 0;},i));},t.prototype._setCacheInvalidationTimer=function(e,t){var o=this,i=t.getExpiryTimeout();i&&(this._cacheTimers[e]=setTimeout(function(){o._cache.remove(e),o._cacheTimers[e]=void 0;},i));},t.prototype.removeTile=function(e){var t=this._tiles[e];if(t&&(t.uses--,delete this._tiles[e],this._timers[e]&&(clearTimeout(this._timers[e]),this._timers[e]=void 0),!(t.uses>0)))if(t.hasData()){var o=t.coord.wrapped().id;this._cache.add(o,t),this._setCacheInvalidationTimer(o,t);}else t.aborted=!0,this.abortTile(t),this.unloadTile(t);},t.prototype.clearTiles=function(){var e=this;for(var t in e._tiles)e.removeTile(t);this._cache.reset();},t.prototype.tilesIn=function(e){for(var t=this,o={},i=this.getIds(),r=1/0,s=1/0,a=-(1/0),n=-(1/0),d=e[0].zoom,c=0;c<e.length;c++){var h=e[c];r=Math.min(r,h.column),s=Math.min(s,h.row),a=Math.max(a,h.column),n=Math.max(n,h.row);}for(var u=0;u<i.length;u++){var l=t._tiles[i[u]],m=TileCoord.fromID(i[u]),p=[coordinateToTilePoint(m,l.sourceMaxZoom,new Coordinate(r,s,d)),coordinateToTilePoint(m,l.sourceMaxZoom,new Coordinate(a,n,d))];if(p[0].x<EXTENT&&p[0].y<EXTENT&&p[1].x>=0&&p[1].y>=0){for(var _=[],f=0;f<e.length;f++)_.push(coordinateToTilePoint(m,l.sourceMaxZoom,e[f]));var T=o[l.coord.id];void 0===T&&(T=o[l.coord.id]={tile:l,coord:m,queryGeometry:[],scale:Math.pow(2,t.transform.zoom-l.coord.z)}),T.queryGeometry.push(_);}}var v=[];for(var y in o)v.push(o[y]);return v},t.prototype.redoPlacement=function(){for(var e=this,t=this.getIds(),o=0;o<t.length;o++){var i=e.getTileByID(t[o]);i.redoPlacement(e._source);}},t.prototype.getVisibleCoordinates=function(){for(var e=this,t=this.getRenderableIds().map(TileCoord.fromID),o=0,i=t;o<i.length;o+=1){var r=i[o];r.posMatrix=e.transform.calculatePosMatrix(r,e._source.maxzoom);}return t},t}(Evented);SourceCache.maxOverzooming=10,SourceCache.maxUnderzooming=3,module.exports=SourceCache;
; |
215 | },{"../data/extent":54,"../geo/coordinate":61,"../util/evented":203,"../util/lru_cache":209,"../util/util":215,"./source":92,"./tile":94,"./tile_coord":96}],94:[function(_dereq_,module,exports){
|
216 | var util=_dereq_("../util/util"),Bucket=_dereq_("../data/bucket"),FeatureIndex=_dereq_("../data/feature_index"),vt=_dereq_("vector-tile"),Protobuf=_dereq_("pbf"),GeoJSONFeature=_dereq_("../util/vectortile_to_geojson"),featureFilter=_dereq_("../style-spec/feature_filter"),CollisionTile=_dereq_("../symbol/collision_tile"),CollisionBoxArray=_dereq_("../symbol/collision_box"),CLOCK_SKEW_RETRY_TIMEOUT=3e4,Tile=function(e,t,i){this.coord=e,this.uid=util.uniqueId(),this.uses=0,this.tileSize=t,this.sourceMaxZoom=i,this.buckets={},this.expirationTime=null,this.expiredRequestCount=0,this.state="loading";};Tile.prototype.registerFadeDuration=function(e,t){var i=t+this.timeAdded;i<Date.now()||this.fadeEndTime&&i<this.fadeEndTime||(this.fadeEndTime=i,e.set(this.fadeEndTime-Date.now()));},Tile.prototype.loadVectorData=function(e,t){this.hasData()&&this.unloadVectorData(),this.state="loaded",e&&(e.rawTileData&&(this.rawTileData=e.rawTileData),this.collisionBoxArray=new CollisionBoxArray(e.collisionBoxArray),this.collisionTile=new CollisionTile(e.collisionTile,this.collisionBoxArray),this.featureIndex=new FeatureIndex(e.featureIndex,this.rawTileData,this.collisionTile),this.buckets=Bucket.deserialize(e.buckets,t.style));},Tile.prototype.reloadSymbolData=function(e,t){var i=this;if("unloaded"!==this.state){this.collisionTile=new CollisionTile(e.collisionTile,this.collisionBoxArray),this.featureIndex.setCollisionTile(this.collisionTile);for(var o in i.buckets){var r=i.buckets[o];"symbol"===r.layers[0].type&&(r.destroy(),delete i.buckets[o]);}util.extend(this.buckets,Bucket.deserialize(e.buckets,t));}},Tile.prototype.unloadVectorData=function(){var e=this;for(var t in e.buckets)e.buckets[t].destroy();this.buckets={},this.collisionBoxArray=null,this.collisionTile=null,this.featureIndex=null,this.state="unloaded";},Tile.prototype.redoPlacement=function(e){var t=this;if("vector"===e.type||"geojson"===e.type)return"loaded"!==this.state?void(this.redoWhenDone=!0):void(this.collisionTile&&(this.state="reloading",e.dispatcher.send("redoPlacement",{type:e.type,uid:this.uid,source:e.id,angle:e.map.transform.angle,pitch:e.map.transform.pitch,showCollisionBoxes:e.map.showCollisionBoxes},function(i,o){t.reloadSymbolData(o,e.map.style),e.map&&(e.map.painter.tileExtentVAO.vao=null),t.state="loaded",t.redoWhenDone&&(t.redoWhenDone=!1,t.redoPlacement(e));},this.workerID)))},Tile.prototype.getBucket=function(e){return this.buckets[e.id]},Tile.prototype.querySourceFeatures=function(e,t){var i=this;if(this.rawTileData){this.vtLayers||(this.vtLayers=new vt.VectorTile(new Protobuf(this.rawTileData)).layers);var o=this.vtLayers._geojsonTileLayer||this.vtLayers[t.sourceLayer];if(o)for(var r=featureFilter(t&&t.filter),s={z:this.coord.z,x:this.coord.x,y:this.coord.y},a=0;a<o.length;a++){var l=o.feature(a);if(r(l)){var n=new GeoJSONFeature(l,i.coord.z,i.coord.x,i.coord.y);n.tile=s,e.push(n);}}}},Tile.prototype.hasData=function(){return"loaded"===this.state||"reloading"===this.state||"expired"===this.state},Tile.prototype.setExpiryData=function(e){var t=this.expirationTime;if(e.cacheControl){var i=util.parseCacheControl(e.cacheControl);i["max-age"]&&(this.expirationTime=Date.now()+1e3*i["max-age"]);}else e.expires&&(this.expirationTime=new Date(e.expires).getTime());if(this.expirationTime){var o=Date.now(),r=!1;if(this.expirationTime>o)r=!1;else if(t)if(this.expirationTime<t)r=!0;else{var s=this.expirationTime-t;s?this.expirationTime=o+Math.max(s,CLOCK_SKEW_RETRY_TIMEOUT):r=!0;}else r=!0;r?(this.expiredRequestCount++,this.state="expired"):this.expiredRequestCount=0;}},Tile.prototype.getExpiryTimeout=function(){if(this.expirationTime)return this.expiredRequestCount?1e3*(1<<Math.min(this.expiredRequestCount-1,31)):Math.min(this.expirationTime-(new Date).getTime(),Math.pow(2,31)-1)},module.exports=Tile;
; |
217 | },{"../data/bucket":45,"../data/feature_index":55,"../style-spec/feature_filter":105,"../symbol/collision_box":163,"../symbol/collision_tile":165,"../util/util":215,"../util/vectortile_to_geojson":216,"pbf":25,"vector-tile":34}],95:[function(_dereq_,module,exports){
|
218 | var LngLatBounds=_dereq_("../geo/lng_lat_bounds"),clamp=_dereq_("../util/util").clamp,TileBounds=function(t,n,o){this.bounds=LngLatBounds.convert(this.validateBounds(t)),this.minzoom=n||0,this.maxzoom=o||24;};TileBounds.prototype.validateBounds=function(t){return Array.isArray(t)&&4===t.length?[Math.max(-180,t[0]),Math.max(-90,t[1]),Math.min(180,t[2]),Math.min(90,t[3])]:[-180,-90,180,90]},TileBounds.prototype.contains=function(t,n){var o=n?Math.min(t.z,n):t.z,a={minX:Math.floor(this.lngX(this.bounds.getWest(),o)),minY:Math.floor(this.latY(this.bounds.getNorth(),o)),maxX:Math.ceil(this.lngX(this.bounds.getEast(),o)),maxY:Math.ceil(this.latY(this.bounds.getSouth(),o))},i=t.x>=a.minX&&t.x<a.maxX&&t.y>=a.minY&&t.y<a.maxY;return i},TileBounds.prototype.lngX=function(t,n){return(t+180)*(Math.pow(2,n)/360)},TileBounds.prototype.latY=function(t,n){var o=clamp(Math.sin(Math.PI/180*t),-.9999,.9999),a=Math.pow(2,n)/(2*Math.PI);return Math.pow(2,n-1)+.5*Math.log((1+o)/(1-o))*-a},module.exports=TileBounds;
; |
219 | },{"../geo/lng_lat_bounds":63,"../util/util":215}],96:[function(_dereq_,module,exports){
|
220 | function edge(t,i){if(t.row>i.row){var o=t;t=i,i=o;}return{x0:t.column,y0:t.row,x1:i.column,y1:i.row,dx:i.column-t.column,dy:i.row-t.row}}function scanSpans(t,i,o,r,e){var n=Math.max(o,Math.floor(i.y0)),h=Math.min(r,Math.ceil(i.y1));if(t.x0===i.x0&&t.y0===i.y0?t.x0+i.dy/t.dy*t.dx<i.x1:t.x1-i.dy/t.dy*t.dx<i.x0){var s=t;t=i,i=s;}for(var a=t.dx/t.dy,d=i.dx/i.dy,y=t.dx>0,l=i.dx<0,u=n;u<h;u++){var x=a*Math.max(0,Math.min(t.dy,u+y-t.y0))+t.x0,c=d*Math.max(0,Math.min(i.dy,u+l-i.y0))+i.x0;e(Math.floor(c),Math.ceil(x),u);}}function scanTriangle(t,i,o,r,e,n){var h,s=edge(t,i),a=edge(i,o),d=edge(o,t);s.dy>a.dy&&(h=s,s=a,a=h),s.dy>d.dy&&(h=s,s=d,d=h),a.dy>d.dy&&(h=a,a=d,d=h),s.dy&&scanSpans(d,s,r,e,n),a.dy&&scanSpans(d,a,r,e,n);}function getQuadkey(t,i,o){for(var r,e="",n=t;n>0;n--)r=1<<n-1,e+=(i&r?1:0)+(o&r?2:0);return e}var WhooTS=_dereq_("@mapbox/whoots-js"),Coordinate=_dereq_("../geo/coordinate"),TileCoord=function(t,i,o,r){isNaN(r)&&(r=0),this.z=+t,this.x=+i,this.y=+o,this.w=+r,r*=2,r<0&&(r=r*-1-1);var e=1<<this.z;this.id=32*(e*e*r+e*this.y+this.x)+this.z,this.posMatrix=null;};TileCoord.prototype.toString=function(){return this.z+"/"+this.x+"/"+this.y},TileCoord.prototype.toCoordinate=function(t){var i=Math.min(this.z,void 0===t?this.z:t),o=Math.pow(2,i),r=this.y,e=this.x+o*this.w;return new Coordinate(e,r,i)},TileCoord.prototype.url=function(t,i,o){var r=WhooTS.getTileBBox(this.x,this.y,this.z),e=getQuadkey(this.z,this.x,this.y);return t[(this.x+this.y)%t.length].replace("{prefix}",(this.x%16).toString(16)+(this.y%16).toString(16)).replace("{z}",Math.min(this.z,i||this.z)).replace("{x}",this.x).replace("{y}","tms"===o?Math.pow(2,this.z)-this.y-1:this.y).replace("{quadkey}",e).replace("{bbox-epsg-3857}",r)},TileCoord.prototype.parent=function(t){return 0===this.z?null:this.z>t?new TileCoord(this.z-1,this.x,this.y,this.w):new TileCoord(this.z-1,Math.floor(this.x/2),Math.floor(this.y/2),this.w)},TileCoord.prototype.wrapped=function(){return new TileCoord(this.z,this.x,this.y,0)},TileCoord.prototype.children=function(t){if(this.z>=t)return[new TileCoord(this.z+1,this.x,this.y,this.w)];var i=this.z+1,o=2*this.x,r=2*this.y;return[new TileCoord(i,o,r,this.w),new TileCoord(i,o+1,r,this.w),new TileCoord(i,o,r+1,this.w),new TileCoord(i,o+1,r+1,this.w)]},TileCoord.cover=function(t,i,o,r){function e(t,i,e){var s,a,d,y;if(e>=0&&e<=n)for(s=t;s<i;s++)a=Math.floor(s/n),d=(s%n+n)%n,0!==a&&r!==!0||(y=new TileCoord(o,d,e,a),h[y.id]=y);}void 0===r&&(r=!0);var n=1<<t,h={};return scanTriangle(i[0],i[1],i[2],0,n,e),scanTriangle(i[2],i[3],i[0],0,n,e),Object.keys(h).map(function(t){return h[t]})},TileCoord.fromID=function(t){var i=t%32,o=1<<i,r=(t-i)/32,e=r%o,n=(r-e)/o%o,h=Math.floor(r/(o*o));return h%2!==0&&(h=h*-1-1),h/=2,new TileCoord(i,e,n,h)},module.exports=TileCoord;
; |
221 | },{"../geo/coordinate":61,"@mapbox/whoots-js":4}],97:[function(_dereq_,module,exports){
|
222 | var Evented=_dereq_("../util/evented"),util=_dereq_("../util/util"),loadTileJSON=_dereq_("./load_tilejson"),normalizeURL=_dereq_("../util/mapbox").normalizeTileURL,TileBounds=_dereq_("./tile_bounds"),VectorTileSource=function(e){function t(t,i,o,r){if(e.call(this),this.id=t,this.dispatcher=o,this.type="vector",this.minzoom=0,this.maxzoom=22,this.scheme="xyz",this.tileSize=512,this.reparseOverscaled=!0,this.isTileClipped=!0,util.extend(this,util.pick(i,["url","scheme","tileSize"])),this._options=util.extend({type:"vector"},i),512!==this.tileSize)throw new Error("vector tile sources must have a tileSize of 512");this.setEventedParent(r);}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.load=function(){var e=this;this.fire("dataloading",{dataType:"source"}),loadTileJSON(this._options,function(t,i){return t?void e.fire("error",t):(util.extend(e,i),e.setBounds(i.bounds),e.fire("data",{dataType:"source",sourceDataType:"metadata"}),void e.fire("data",{dataType:"source",sourceDataType:"content"}))});},t.prototype.setBounds=function(e){this.bounds=e,e&&(this.tileBounds=new TileBounds(e,this.minzoom,this.maxzoom));},t.prototype.hasTile=function(e){return!this.tileBounds||this.tileBounds.contains(e,this.maxzoom)},t.prototype.onAdd=function(e){this.load(),this.map=e;},t.prototype.serialize=function(){return util.extend({},this._options)},t.prototype.loadTile=function(e,t){function i(i,o){if(!e.aborted){if(i)return t(i);this.map._refreshExpiredTiles&&e.setExpiryData(o),e.loadVectorData(o,this.map.painter),e.redoWhenDone&&(e.redoWhenDone=!1,e.redoPlacement(this)),t(null),e.reloadCallback&&(this.loadTile(e,e.reloadCallback),e.reloadCallback=null);}}var o=e.coord.z>this.maxzoom?Math.pow(2,e.coord.z-this.maxzoom):1,r={url:normalizeURL(e.coord.url(this.tiles,this.maxzoom,this.scheme),this.url),uid:e.uid,coord:e.coord,zoom:e.coord.z,tileSize:this.tileSize*o,type:this.type,source:this.id,overscaling:o,angle:this.map.transform.angle,pitch:this.map.transform.pitch,showCollisionBoxes:this.map.showCollisionBoxes};e.workerID&&"expired"!==e.state?"loading"===e.state?e.reloadCallback=t:this.dispatcher.send("reloadTile",r,i.bind(this),e.workerID):e.workerID=this.dispatcher.send("loadTile",r,i.bind(this));},t.prototype.abortTile=function(e){this.dispatcher.send("abortTile",{uid:e.uid,type:this.type,source:this.id},null,e.workerID);},t.prototype.unloadTile=function(e){e.unloadVectorData(),this.dispatcher.send("removeTile",{uid:e.uid,type:this.type,source:this.id},null,e.workerID);},t}(Evented);module.exports=VectorTileSource;
; |
223 | },{"../util/evented":203,"../util/mapbox":210,"../util/util":215,"./load_tilejson":87,"./tile_bounds":95}],98:[function(_dereq_,module,exports){
|
224 | var ajax=_dereq_("../util/ajax"),vt=_dereq_("vector-tile"),Protobuf=_dereq_("pbf"),WorkerTile=_dereq_("./worker_tile"),util=_dereq_("../util/util"),VectorTileWorkerSource=function(e,r,t){this.actor=e,this.layerIndex=r,t&&(this.loadVectorData=t),this.loading={},this.loaded={};};VectorTileWorkerSource.prototype.loadTile=function(e,r){function t(e,t){return delete this.loading[o][i],e?r(e):t?(a.vectorTile=t,a.parse(t,this.layerIndex,this.actor,function(e,o,i){if(e)return r(e);var a={};t.expires&&(a.expires=t.expires),t.cacheControl&&(a.cacheControl=t.cacheControl),r(null,util.extend({rawTileData:t.rawData},o,a),i);}),this.loaded[o]=this.loaded[o]||{},void(this.loaded[o][i]=a)):r(null,null)}var o=e.source,i=e.uid;this.loading[o]||(this.loading[o]={});var a=this.loading[o][i]=new WorkerTile(e);a.abort=this.loadVectorData(e,t.bind(this));},VectorTileWorkerSource.prototype.reloadTile=function(e,r){function t(e,t){if(this.reloadCallback){var o=this.reloadCallback;delete this.reloadCallback,this.parse(this.vectorTile,a.layerIndex,a.actor,o);}r(e,t);}var o=this.loaded[e.source],i=e.uid,a=this;if(o&&o[i]){var l=o[i];"parsing"===l.status?l.reloadCallback=r:"done"===l.status&&l.parse(l.vectorTile,this.layerIndex,this.actor,t.bind(l));}},VectorTileWorkerSource.prototype.abortTile=function(e){var r=this.loading[e.source],t=e.uid;r&&r[t]&&r[t].abort&&(r[t].abort(),delete r[t]);},VectorTileWorkerSource.prototype.removeTile=function(e){var r=this.loaded[e.source],t=e.uid;r&&r[t]&&delete r[t];},VectorTileWorkerSource.prototype.loadVectorData=function(e,r){function t(e,t){if(e)return r(e);var o=new vt.VectorTile(new Protobuf(t.data));o.rawData=t.data,o.cacheControl=t.cacheControl,o.expires=t.expires,r(e,o);}var o=ajax.getArrayBuffer(e.url,t.bind(this));return function(){o.abort();}},VectorTileWorkerSource.prototype.redoPlacement=function(e,r){var t=this.loaded[e.source],o=this.loading[e.source],i=e.uid;if(t&&t[i]){var a=t[i],l=a.redoPlacement(e.angle,e.pitch,e.showCollisionBoxes);l.result&&r(null,l.result,l.transferables);}else o&&o[i]&&(o[i].angle=e.angle);},module.exports=VectorTileWorkerSource;
; |
225 | },{"../util/ajax":194,"../util/util":215,"./worker_tile":101,"pbf":25,"vector-tile":34}],99:[function(_dereq_,module,exports){
|
226 | var ajax=_dereq_("../util/ajax"),ImageSource=_dereq_("./image_source"),VideoSource=function(t){function e(e,o,i,r){t.call(this,e,o,i,r),this.roundZoom=!0,this.type="video",this.options=o;}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.load=function(){var t=this,e=this.options;this.urls=e.urls,ajax.getVideo(e.urls,function(e,o){if(e)return t.fire("error",{error:e});t.video=o,t.video.loop=!0;var i;t.video.addEventListener("playing",function(){i=t.map.style.animationLoop.set(1/0),t.map._rerender();}),t.video.addEventListener("pause",function(){t.map.style.animationLoop.cancel(i);}),t.map&&t.video.play(),t._finishLoading();});},e.prototype.getVideo=function(){return this.video},e.prototype.onAdd=function(t){this.map||(this.load(),this.map=t,this.video&&(this.video.play(),this.setCoordinates(this.coordinates)));},e.prototype.prepare=function(){!this.tile||this.video.readyState<2||this._prepareImage(this.map.painter.gl,this.video);},e.prototype.serialize=function(){return{type:"video",urls:this.urls,coordinates:this.coordinates}},e}(ImageSource);module.exports=VideoSource;
; |
227 | },{"../util/ajax":194,"./image_source":86}],100:[function(_dereq_,module,exports){
|
228 | var Actor=_dereq_("../util/actor"),StyleLayerIndex=_dereq_("../style/style_layer_index"),VectorTileWorkerSource=_dereq_("./vector_tile_worker_source"),GeoJSONWorkerSource=_dereq_("./geojson_worker_source"),globalRTLTextPlugin=_dereq_("./rtl_text_plugin"),Worker=function(e){var r=this;this.self=e,this.actor=new Actor(e,this),this.layerIndexes={},this.workerSourceTypes={vector:VectorTileWorkerSource,geojson:GeoJSONWorkerSource},this.workerSources={},this.self.registerWorkerSource=function(e,o){if(r.workerSourceTypes[e])throw new Error('Worker source with name "'+e+'" already registered.');r.workerSourceTypes[e]=o;},this.self.registerRTLTextPlugin=function(e){if(globalRTLTextPlugin.applyArabicShaping||globalRTLTextPlugin.processBidirectionalText)throw new Error("RTL text plugin already registered.");globalRTLTextPlugin.applyArabicShaping=e.applyArabicShaping,globalRTLTextPlugin.processBidirectionalText=e.processBidirectionalText;};};Worker.prototype.setLayers=function(e,r){this.getLayerIndex(e).replace(r);},Worker.prototype.updateLayers=function(e,r){this.getLayerIndex(e).update(r.layers,r.removedIds,r.symbolOrder);},Worker.prototype.loadTile=function(e,r,o){this.getWorkerSource(e,r.type).loadTile(r,o);},Worker.prototype.reloadTile=function(e,r,o){this.getWorkerSource(e,r.type).reloadTile(r,o);},Worker.prototype.abortTile=function(e,r){this.getWorkerSource(e,r.type).abortTile(r);},Worker.prototype.removeTile=function(e,r){this.getWorkerSource(e,r.type).removeTile(r);},Worker.prototype.removeSource=function(e,r){var o=this.getWorkerSource(e,r.type);void 0!==o.removeSource&&o.removeSource(r);},Worker.prototype.redoPlacement=function(e,r,o){this.getWorkerSource(e,r.type).redoPlacement(r,o);},Worker.prototype.loadWorkerSource=function(e,r,o){try{this.self.importScripts(r.url),o();}catch(e){o(e);}},Worker.prototype.loadRTLTextPlugin=function(e,r,o){try{globalRTLTextPlugin.applyArabicShaping||globalRTLTextPlugin.processBidirectionalText||this.self.importScripts(r);}catch(e){o(e);}},Worker.prototype.getLayerIndex=function(e){var r=this.layerIndexes[e];return r||(r=this.layerIndexes[e]=new StyleLayerIndex),r},Worker.prototype.getWorkerSource=function(e,r){var o=this;if(this.workerSources[e]||(this.workerSources[e]={}),!this.workerSources[e][r]){var t={send:function(r,t,i,n){o.actor.send(r,t,i,n,e);}};this.workerSources[e][r]=new this.workerSourceTypes[r](t,this.getLayerIndex(e));}return this.workerSources[e][r]},module.exports=function(e){return new Worker(e)};
; |
229 | },{"../style/style_layer_index":157,"../util/actor":193,"./geojson_worker_source":84,"./rtl_text_plugin":91,"./vector_tile_worker_source":98}],101:[function(_dereq_,module,exports){
|
230 | function recalculateLayers(e,i){for(var r=0,o=e.layers;r<o.length;r+=1){var t=o[r];t.recalculate(i);}}function serializeBuckets(e,i){return e.filter(function(e){return!e.isEmpty()}).map(function(e){return e.serialize(i)})}var FeatureIndex=_dereq_("../data/feature_index"),CollisionTile=_dereq_("../symbol/collision_tile"),CollisionBoxArray=_dereq_("../symbol/collision_box"),DictionaryCoder=_dereq_("../util/dictionary_coder"),util=_dereq_("../util/util"),WorkerTile=function(e){this.coord=e.coord,this.uid=e.uid,this.zoom=e.zoom,this.tileSize=e.tileSize,this.source=e.source,this.overscaling=e.overscaling,this.angle=e.angle,this.pitch=e.pitch,this.showCollisionBoxes=e.showCollisionBoxes;};WorkerTile.prototype.parse=function(e,i,r,o){var t=this;e.layers||(e={layers:{_geojsonTileLayer:e}}),this.status="parsing",this.data=e,this.collisionBoxArray=new CollisionBoxArray;var s=new DictionaryCoder(Object.keys(e.layers).sort()),l=new FeatureIndex(this.coord,this.overscaling);l.bucketLayerIDs={};var n={},a=0,c={featureIndex:l,iconDependencies:{},glyphDependencies:{}},u=i.familiesBySource[this.source];for(var h in u){var y=e.layers[h];if(y){1===y.version&&util.warnOnce('Vector tile source "'+t.source+'" layer "'+h+'" does not use vector tile spec v2 and therefore may have some rendering errors.');for(var d=s.encode(h),p=[],m=0;m<y.length;m++){var v=y.feature(m);v.index=m,v.sourceLayerIndex=d,p.push(v);}for(var f=0,g=u[h];f<g.length;f+=1){var x=g[f],B=x[0];if(!(B.minzoom&&t.zoom<B.minzoom||B.maxzoom&&t.zoom>=B.maxzoom||B.layout&&"none"===B.layout.visibility)){for(var b=0,k=x;b<k.length;b+=1){var z=k[b];z.recalculate(t.zoom);}var C=n[B.id]=B.createBucket({index:a,layers:x,zoom:t.zoom,overscaling:t.overscaling,collisionBoxArray:t.collisionBoxArray});C.populate(p,c),l.bucketLayerIDs[a]=x.map(function(e){return e.id}),a++;}}}}var T=function(e){t.status="done",l.paintPropertyStatistics={};for(var i in n)util.extend(l.paintPropertyStatistics,n[i].getPaintPropertyStatistics());var r=[];o(null,{buckets:serializeBuckets(util.values(n),r),featureIndex:l.serialize(r),collisionTile:e.serialize(r),collisionBoxArray:t.collisionBoxArray.serialize()},r);};this.symbolBuckets=[];for(var w=i.symbolOrder.length-1;w>=0;w--){var A=n[i.symbolOrder[w]];A&&t.symbolBuckets.push(A);}if(0===this.symbolBuckets.length)return T(new CollisionTile(this.angle,this.pitch,this.collisionBoxArray));var D=0,I=Object.keys(c.iconDependencies),O=util.mapObject(c.glyphDependencies,function(e){return Object.keys(e).map(Number)}),L=function(e){if(e)return o(e);if(D++,2===D){for(var i=new CollisionTile(t.angle,t.pitch,t.collisionBoxArray),r=0,s=t.symbolBuckets;r<s.length;r+=1){var l=s[r];recalculateLayers(l,t.zoom),l.prepare(O,I),l.place(i,t.showCollisionBoxes);}T(i);}};Object.keys(O).length?r.send("getGlyphs",{uid:this.uid,stacks:O},function(e,i){O=i,L(e);}):L(),I.length?r.send("getIcons",{icons:I},function(e,i){I=i,L(e);}):L();},WorkerTile.prototype.redoPlacement=function(e,i,r){var o=this;if(this.angle=e,this.pitch=i,"done"!==this.status)return{};for(var t=new CollisionTile(this.angle,this.pitch,this.collisionBoxArray),s=0,l=o.symbolBuckets;s<l.length;s+=1){var n=l[s];recalculateLayers(n,o.zoom),n.place(t,r);}var a=[];return{result:{buckets:serializeBuckets(this.symbolBuckets,a),collisionTile:t.serialize(a)},transferables:a}},module.exports=WorkerTile;
; |
231 | },{"../data/feature_index":55,"../symbol/collision_box":163,"../symbol/collision_tile":165,"../util/dictionary_coder":200,"../util/util":215}],102:[function(_dereq_,module,exports){
|
232 | function deref(r,e){var f={};for(var t in r)"ref"!==t&&(f[t]=r[t]);return refProperties.forEach(function(r){r in e&&(f[r]=e[r]);}),f}function derefLayers(r){r=r.slice();for(var e=Object.create(null),f=0;f<r.length;f++)e[r[f].id]=r[f];for(var t=0;t<r.length;t++)"ref"in r[t]&&(r[t]=deref(r[t],e[r[t].ref]));return r}var refProperties=_dereq_("./util/ref_properties");module.exports=derefLayers;
; |
233 | },{"./util/ref_properties":125}],103:[function(_dereq_,module,exports){
|
234 | function diffSources(e,r,o,a){e=e||{},r=r||{};var s;for(s in e)e.hasOwnProperty(s)&&(r.hasOwnProperty(s)||(o.push({command:operations.removeSource,args:[s]}),a[s]=!0));for(s in r)r.hasOwnProperty(s)&&(e.hasOwnProperty(s)?isEqual(e[s],r[s])||(o.push({command:operations.removeSource,args:[s]}),o.push({command:operations.addSource,args:[s,r[s]]}),a[s]=!0):o.push({command:operations.addSource,args:[s,r[s]]}));}function diffLayerPropertyChanges(e,r,o,a,s,t){e=e||{},r=r||{};var n;for(n in e)e.hasOwnProperty(n)&&(isEqual(e[n],r[n])||o.push({command:t,args:[a,n,r[n],s]}));for(n in r)r.hasOwnProperty(n)&&!e.hasOwnProperty(n)&&(isEqual(e[n],r[n])||o.push({command:t,args:[a,n,r[n],s]}));}function pluckId(e){return e.id}function indexById(e,r){return e[r.id]=r,e}function diffLayers(e,r,o){e=e||[],r=r||[];var a,s,t,n,i,p,m,u=e.map(pluckId),l=r.map(pluckId),y=e.reduce(indexById,{}),c=r.reduce(indexById,{}),d=u.slice(),h=Object.create(null);for(a=0,s=0;a<u.length;a++)t=u[a],c.hasOwnProperty(t)?s++:(o.push({command:operations.removeLayer,args:[t]}),d.splice(d.indexOf(t,s),1));for(a=0,s=0;a<l.length;a++)t=l[l.length-1-a],d[d.length-1-a]!==t&&(y.hasOwnProperty(t)?(o.push({command:operations.removeLayer,args:[t]}),d.splice(d.lastIndexOf(t,d.length-s),1)):s++,p=d[d.length-a],o.push({command:operations.addLayer,args:[c[t],p]}),d.splice(d.length-a,0,t),h[t]=!0);for(a=0;a<l.length;a++)if(t=l[a],n=y[t],i=c[t],!h[t]&&!isEqual(n,i))if(isEqual(n.source,i.source)&&isEqual(n["source-layer"],i["source-layer"])&&isEqual(n.type,i.type)){diffLayerPropertyChanges(n.layout,i.layout,o,t,null,operations.setLayoutProperty),diffLayerPropertyChanges(n.paint,i.paint,o,t,null,operations.setPaintProperty),isEqual(n.filter,i.filter)||o.push({command:operations.setFilter,args:[t,i.filter]}),isEqual(n.minzoom,i.minzoom)&&isEqual(n.maxzoom,i.maxzoom)||o.push({command:operations.setLayerZoomRange,args:[t,i.minzoom,i.maxzoom]});for(m in n)n.hasOwnProperty(m)&&"layout"!==m&&"paint"!==m&&"filter"!==m&&"metadata"!==m&&"minzoom"!==m&&"maxzoom"!==m&&(0===m.indexOf("paint.")?diffLayerPropertyChanges(n[m],i[m],o,t,m.slice(6),operations.setPaintProperty):isEqual(n[m],i[m])||o.push({command:operations.setLayerProperty,args:[t,m,i[m]]}));for(m in i)i.hasOwnProperty(m)&&!n.hasOwnProperty(m)&&"layout"!==m&&"paint"!==m&&"filter"!==m&&"metadata"!==m&&"minzoom"!==m&&"maxzoom"!==m&&(0===m.indexOf("paint.")?diffLayerPropertyChanges(n[m],i[m],o,t,m.slice(6),operations.setPaintProperty):isEqual(n[m],i[m])||o.push({command:operations.setLayerProperty,args:[t,m,i[m]]}));}else o.push({command:operations.removeLayer,args:[t]}),p=d[d.lastIndexOf(t)+1],o.push({command:operations.addLayer,args:[i,p]});}function diffStyles(e,r){if(!e)return[{command:operations.setStyle,args:[r]}];var o=[];try{if(!isEqual(e.version,r.version))return[{command:operations.setStyle,args:[r]}];isEqual(e.center,r.center)||o.push({command:operations.setCenter,args:[r.center]}),isEqual(e.zoom,r.zoom)||o.push({command:operations.setZoom,args:[r.zoom]}),isEqual(e.bearing,r.bearing)||o.push({command:operations.setBearing,args:[r.bearing]}),isEqual(e.pitch,r.pitch)||o.push({command:operations.setPitch,args:[r.pitch]}),isEqual(e.sprite,r.sprite)||o.push({command:operations.setSprite,args:[r.sprite]}),isEqual(e.glyphs,r.glyphs)||o.push({command:operations.setGlyphs,args:[r.glyphs]}),isEqual(e.transition,r.transition)||o.push({command:operations.setTransition,args:[r.transition]}),isEqual(e.light,r.light)||o.push({command:operations.setLight,args:[r.light]});var a={},s=[];diffSources(e.sources,r.sources,s,a);var t=[];e.layers&&e.layers.forEach(function(e){a[e.source]?o.push({command:operations.removeLayer,args:[e.id]}):t.push(e);}),o=o.concat(s),diffLayers(t,r.layers,o);}catch(e){console.warn("Unable to compute style diff:",e),o=[{command:operations.setStyle,args:[r]}];}return o}var isEqual=_dereq_("lodash.isequal"),operations={setStyle:"setStyle",addLayer:"addLayer",removeLayer:"removeLayer",setPaintProperty:"setPaintProperty",setLayoutProperty:"setLayoutProperty",setFilter:"setFilter",addSource:"addSource",removeSource:"removeSource",setLayerZoomRange:"setLayerZoomRange",setLayerProperty:"setLayerProperty",setCenter:"setCenter",setZoom:"setZoom",setBearing:"setBearing",setPitch:"setPitch",setSprite:"setSprite",setGlyphs:"setGlyphs",setTransition:"setTransition",setLight:"setLight"};module.exports=diffStyles,module.exports.operations=operations;
; |
235 | },{"lodash.isequal":116}],104:[function(_dereq_,module,exports){
|
236 | function ValidationError(r,i){this.message=(r?r+": ":"")+format.apply(format,Array.prototype.slice.call(arguments,2)),null!==i&&void 0!==i&&i.__line__&&(this.line=i.__line__);}var format=_dereq_("util").format;module.exports=ValidationError;
; |
237 | },{"util":33}],105:[function(_dereq_,module,exports){
|
238 | function createFilter(e){return new Function("f","var p = (f && f.properties || {}); return "+compile(e))}function compile(e){if(!e)return"true";var i=e[0];if(e.length<=1)return"any"===i?"false":"true";var n="=="===i?compileComparisonOp(e[1],e[2],"===",!1):"!="===i?compileComparisonOp(e[1],e[2],"!==",!1):"<"===i||">"===i||"<="===i||">="===i?compileComparisonOp(e[1],e[2],i,!0):"any"===i?compileLogicalOp(e.slice(1),"||"):"all"===i?compileLogicalOp(e.slice(1),"&&"):"none"===i?compileNegation(compileLogicalOp(e.slice(1),"||")):"in"===i?compileInOp(e[1],e.slice(2)):"!in"===i?compileNegation(compileInOp(e[1],e.slice(2))):"has"===i?compileHasOp(e[1]):"!has"===i?compileNegation(compileHasOp(e[1])):"true";return"("+n+")"}function compilePropertyReference(e){return"$type"===e?"f.type":"$id"===e?"f.id":"p["+JSON.stringify(e)+"]"}function compileComparisonOp(e,i,n,r){var o=compilePropertyReference(e),t="$type"===e?types.indexOf(i):JSON.stringify(i);return(r?"typeof "+o+"=== typeof "+t+"&&":"")+o+n+t}function compileLogicalOp(e,i){return e.map(compile).join(i)}function compileInOp(e,i){"$type"===e&&(i=i.map(function(e){return types.indexOf(e)}));var n=JSON.stringify(i.sort(compare)),r=compilePropertyReference(e);return i.length<=200?n+".indexOf("+r+") !== -1":"function(v, a, i, j) {while (i <= j) { var m = (i + j) >> 1; if (a[m] === v) return true; if (a[m] > v) j = m - 1; else i = m + 1;}return false; }("+r+", "+n+",0,"+(i.length-1)+")"}function compileHasOp(e){return"$id"===e?'"id" in f':JSON.stringify(e)+" in p"}function compileNegation(e){return"!("+e+")"}function compare(e,i){return e<i?-1:e>i?1:0}module.exports=createFilter;var types=["Unknown","Point","LineString","Polygon"];
; |
239 | },{}],106:[function(_dereq_,module,exports){
|
240 | function xyz2lab(r){return r>t3?Math.pow(r,1/3):r/t2+t0}function lab2xyz(r){return r>t1?r*r*r:t2*(r-t0)}function xyz2rgb(r){return 255*(r<=.0031308?12.92*r:1.055*Math.pow(r,1/2.4)-.055)}function rgb2xyz(r){return r/=255,r<=.04045?r/12.92:Math.pow((r+.055)/1.055,2.4)}function rgbToLab(r){var t=rgb2xyz(r[0]),a=rgb2xyz(r[1]),n=rgb2xyz(r[2]),b=xyz2lab((.4124564*t+.3575761*a+.1804375*n)/Xn),o=xyz2lab((.2126729*t+.7151522*a+.072175*n)/Yn),g=xyz2lab((.0193339*t+.119192*a+.9503041*n)/Zn);return[116*o-16,500*(b-o),200*(o-g),r[3]]}function labToRgb(r){var t=(r[0]+16)/116,a=isNaN(r[1])?t:t+r[1]/500,n=isNaN(r[2])?t:t-r[2]/200;return t=Yn*lab2xyz(t),a=Xn*lab2xyz(a),n=Zn*lab2xyz(n),[xyz2rgb(3.2404542*a-1.5371385*t-.4985314*n),xyz2rgb(-.969266*a+1.8760108*t+.041556*n),xyz2rgb(.0556434*a-.2040259*t+1.0572252*n),r[3]]}function rgbToHcl(r){var t=rgbToLab(r),a=t[0],n=t[1],b=t[2],o=Math.atan2(b,n)*rad2deg;return[o<0?o+360:o,Math.sqrt(n*n+b*b),a,r[3]]}function hclToRgb(r){var t=r[0]*deg2rad,a=r[1],n=r[2];return labToRgb([n,Math.cos(t)*a,Math.sin(t)*a,r[3]])}var Xn=.95047,Yn=1,Zn=1.08883,t0=4/29,t1=6/29,t2=3*t1*t1,t3=t1*t1*t1,deg2rad=Math.PI/180,rad2deg=180/Math.PI;module.exports={lab:{forward:rgbToLab,reverse:labToRgb},hcl:{forward:rgbToHcl,reverse:hclToRgb}};
; |
241 | },{}],107:[function(_dereq_,module,exports){
|
242 | function identityFunction(t){return t}function createFunction(t,e){var o,n="color"===e.type;if(isFunctionDefinition(t)){var r=t.stops&&"object"==typeof t.stops[0][0],a=r||void 0!==t.property,i=r||!a,s=t.type||("interpolated"===e.function?"exponential":"interval");n&&(t=extend({},t),t.stops&&(t.stops=t.stops.map(function(t){return[t[0],parseColor(t[1])]})),t.default?t.default=parseColor(t.default):t.default=parseColor(e.default));var u,p,l;if("exponential"===s)u=evaluateExponentialFunction;else if("interval"===s)u=evaluateIntervalFunction;else if("categorical"===s){u=evaluateCategoricalFunction,p=Object.create(null);for(var c=0,f=t.stops;c<f.length;c+=1){var d=f[c];p[d[0]]=d[1];}l=typeof t.stops[0][0];}else{if("identity"!==s)throw new Error('Unknown function type "'+s+'"');u=evaluateIdentityFunction;}var v;if(t.colorSpace&&"rgb"!==t.colorSpace){if(!colorSpaces[t.colorSpace])throw new Error("Unknown color space: "+t.colorSpace);var y=colorSpaces[t.colorSpace];t=JSON.parse(JSON.stringify(t));for(var F=0;F<t.stops.length;F++)t.stops[F]=[t.stops[F][0],y.forward(t.stops[F][1])];v=y.reverse;}else v=identityFunction;if(r){for(var h={},g=[],C=0;C<t.stops.length;C++){var m=t.stops[C],S=m[0].zoom;void 0===h[S]&&(h[S]={zoom:S,type:t.type,property:t.property,default:t.default,stops:[]},g.push(S)),h[S].stops.push([m[0].value,m[1]]);}for(var T=[],x=0,b=g;x<b.length;x+=1){var q=b[x];T.push([h[q].zoom,createFunction(h[q],e)]);}o=function(o,n){return v(evaluateExponentialFunction({stops:T,base:t.base},e,o)(o,n))},o.isFeatureConstant=!1,o.isZoomConstant=!1;}else i?(o=function(o){return v(u(t,e,o,p,l))},o.isFeatureConstant=!0,o.isZoomConstant=!1):(o=function(o,n){var r=n[t.property];return void 0===r?coalesce(t.default,e.default):v(u(t,e,r,p,l))},o.isFeatureConstant=!1,o.isZoomConstant=!0);}else n&&t&&(t=parseColor(t)),o=function(){return t},o.isFeatureConstant=!0,o.isZoomConstant=!0;return o}function coalesce(t,e,o){return void 0!==t?t:void 0!==e?e:void 0!==o?o:void 0}function evaluateCategoricalFunction(t,e,o,n,r){var a=typeof o===r?n[o]:void 0;return coalesce(a,t.default,e.default)}function evaluateIntervalFunction(t,e,o){if("number"!==getType(o))return coalesce(t.default,e.default);var n=t.stops.length;if(1===n)return t.stops[0][1];if(o<=t.stops[0][0])return t.stops[0][1];if(o>=t.stops[n-1][0])return t.stops[n-1][1];var r=findStopLessThanOrEqualTo(t.stops,o);return t.stops[r][1]}function evaluateExponentialFunction(t,e,o){var n=void 0!==t.base?t.base:1;if("number"!==getType(o))return coalesce(t.default,e.default);var r=t.stops.length;if(1===r)return t.stops[0][1];if(o<=t.stops[0][0])return t.stops[0][1];if(o>=t.stops[r-1][0])return t.stops[r-1][1];var a=findStopLessThanOrEqualTo(t.stops,o),i=interpolationFactor(o,n,t.stops[a][0],t.stops[a+1][0]),s=t.stops[a][1],u=t.stops[a+1][1],p=interpolate[e.type]||identityFunction;return"function"==typeof s?function(){var t=s.apply(void 0,arguments),e=u.apply(void 0,arguments);if(void 0!==t&&void 0!==e)return p(t,e,i)}:p(s,u,i)}function evaluateIdentityFunction(t,e,o){return"color"===e.type?o=parseColor(o):getType(o)!==e.type&&(o=void 0),coalesce(o,t.default,e.default)}function findStopLessThanOrEqualTo(t,e){for(var o,n,r=t.length,a=0,i=r-1,s=0;a<=i;){if(s=Math.floor((a+i)/2),o=t[s][0],n=t[s+1][0],e===o||e>o&&e<n)return s;o<e?a=s+1:o>e&&(i=s-1);}return Math.max(s-1,0)}function isFunctionDefinition(t){return"object"==typeof t&&(t.stops||"identity"===t.type)}function interpolationFactor(t,e,o,n){var r=n-o,a=t-o;return 1===e?a/r:(Math.pow(e,a)-1)/(Math.pow(e,r)-1)}var colorSpaces=_dereq_("./color_spaces"),parseColor=_dereq_("../util/parse_color"),extend=_dereq_("../util/extend"),getType=_dereq_("../util/get_type"),interpolate=_dereq_("../util/interpolate");module.exports=createFunction,module.exports.isFunctionDefinition=isFunctionDefinition,module.exports.interpolationFactor=interpolationFactor,module.exports.findStopLessThanOrEqualTo=findStopLessThanOrEqualTo;
; |
243 | },{"../util/extend":121,"../util/get_type":122,"../util/interpolate":123,"../util/parse_color":124,"./color_spaces":106}],108:[function(_dereq_,module,exports){
|
244 | function key(r){return stringify(refProperties.map(function(e){return r[e]}))}function groupByLayout(r){for(var e={},t=0;t<r.length;t++){var i=key(r[t]),u=e[i];u||(u=e[i]=[]),u.push(r[t]);}var n=[];for(var o in e)n.push(e[o]);return n}var refProperties=_dereq_("./util/ref_properties"),stringify=_dereq_("fast-stable-stringify");module.exports=groupByLayout;
; |
245 | },{"./util/ref_properties":125,"fast-stable-stringify":110}],109:[function(_dereq_,module,exports){
|
246 | function clamp_css_byte(e){return e=Math.round(e),e<0?0:e>255?255:e}function clamp_css_float(e){return e<0?0:e>1?1:e}function parse_css_int(e){return clamp_css_byte("%"===e[e.length-1]?parseFloat(e)/100*255:parseInt(e))}function parse_css_float(e){return clamp_css_float("%"===e[e.length-1]?parseFloat(e)/100:parseFloat(e))}function css_hue_to_rgb(e,r,l){return l<0?l+=1:l>1&&(l-=1),6*l<1?e+(r-e)*l*6:2*l<1?r:3*l<2?e+(r-e)*(2/3-l)*6:e}function parseCSSColor(e){var r=e.replace(/ /g,"").toLowerCase();if(r in kCSSColorTable)return kCSSColorTable[r].slice();if("#"===r[0]){if(4===r.length){var l=parseInt(r.substr(1),16);return l>=0&&l<=4095?[(3840&l)>>4|(3840&l)>>8,240&l|(240&l)>>4,15&l|(15&l)<<4,1]:null}if(7===r.length){var l=parseInt(r.substr(1),16);return l>=0&&l<=16777215?[(16711680&l)>>16,(65280&l)>>8,255&l,1]:null}return null}var a=r.indexOf("("),t=r.indexOf(")");if(a!==-1&&t+1===r.length){var n=r.substr(0,a),s=r.substr(a+1,t-(a+1)).split(","),o=1;switch(n){case"rgba":if(4!==s.length)return null;o=parse_css_float(s.pop());case"rgb":return 3!==s.length?null:[parse_css_int(s[0]),parse_css_int(s[1]),parse_css_int(s[2]),o];case"hsla":if(4!==s.length)return null;o=parse_css_float(s.pop());case"hsl":if(3!==s.length)return null;var i=(parseFloat(s[0])%360+360)%360/360,u=parse_css_float(s[1]),g=parse_css_float(s[2]),d=g<=.5?g*(u+1):g+u-g*u,c=2*g-d;return[clamp_css_byte(255*css_hue_to_rgb(c,d,i+1/3)),clamp_css_byte(255*css_hue_to_rgb(c,d,i)),clamp_css_byte(255*css_hue_to_rgb(c,d,i-1/3)),o];default:return null}}return null}var kCSSColorTable={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],rebeccapurple:[102,51,153,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};try{exports.parseCSSColor=parseCSSColor;}catch(e){}
|
247 | },{}],110:[function(_dereq_,module,exports){
|
248 | function sss(r){var e,t,s,n,u,a;switch(typeof r){case"object":if(null===r)return null;if(isArray(r)){for(s="[",t=r.length-1,e=0;e<t;e++)s+=sss(r[e])+",";return t>-1&&(s+=sss(r[e])),s+"]"}for(n=objKeys(r).sort(),t=n.length,s="{",u=n[e=0],a=t>0&&void 0!==r[u];e<t;)a?(s+='"'+u.replace(strReg,strReplace)+'":'+sss(r[u]),u=n[++e],a=e<t&&void 0!==r[u],a&&(s+=",")):(u=n[++e],a=e<t&&void 0!==r[u]);return s+"}";case"undefined":return null;case"string":return'"'+r.replace(strReg,strReplace)+'"';default:return r}}var toString={}.toString,isArray=Array.isArray||function(r){return"[object Array]"===toString.call(r)},objKeys=Object.keys||function(r){var e=[];for(var t in r)r.hasOwnProperty(t)&&e.push(t);return e},strReg=/[\u0000-\u001f"\\]/g,strReplace=function(r){var e=r.charCodeAt(0);switch(e){case 34:return'\\"';case 92:return"\\\\";case 12:return"\\f";case 10:return"\\n";case 13:return"\\r";case 9:return"\\t";case 8:return"\\b";default:return e>15?"\\u00"+e.toString(16):"\\u000"+e.toString(16)}};module.exports=function(r){if(void 0!==r)return""+sss(r)},module.exports.stringSearch=strReg,module.exports.stringReplace=strReplace;
|
249 | },{}],111:[function(_dereq_,module,exports){
|
250 | function isObjectLike(r){return!!r&&"object"==typeof r}function arraySome(r,e){for(var a=-1,t=r.length;++a<t;)if(e(r[a],a,r))return!0;return!1}function baseIsEqual(r,e,a,t,o,n){return r===e||(null==r||null==e||!isObject(r)&&!isObjectLike(e)?r!==r&&e!==e:baseIsEqualDeep(r,e,baseIsEqual,a,t,o,n))}function baseIsEqualDeep(r,e,a,t,o,n,u){var c=isArray(r),s=isArray(e),i=arrayTag,g=arrayTag;c||(i=objToString.call(r),i==argsTag?i=objectTag:i!=objectTag&&(c=isTypedArray(r))),s||(g=objToString.call(e),g==argsTag?g=objectTag:g!=objectTag&&(s=isTypedArray(e)));var b=i==objectTag,l=g==objectTag,f=i==g;if(f&&!c&&!b)return equalByTag(r,e,i);if(!o){var y=b&&hasOwnProperty.call(r,"__wrapped__"),T=l&&hasOwnProperty.call(e,"__wrapped__");if(y||T)return a(y?r.value():r,T?e.value():e,t,o,n,u)}if(!f)return!1;n||(n=[]),u||(u=[]);for(var j=n.length;j--;)if(n[j]==r)return u[j]==e;n.push(r),u.push(e);var p=(c?equalArrays:equalObjects)(r,e,a,t,o,n,u);return n.pop(),u.pop(),p}function equalArrays(r,e,a,t,o,n,u){var c=-1,s=r.length,i=e.length;if(s!=i&&!(o&&i>s))return!1;for(;++c<s;){var g=r[c],b=e[c],l=t?t(o?b:g,o?g:b,c):void 0;if(void 0!==l){if(l)continue;return!1}if(o){if(!arraySome(e,function(r){return g===r||a(g,r,t,o,n,u)}))return!1}else if(g!==b&&!a(g,b,t,o,n,u))return!1}return!0}function equalByTag(r,e,a){switch(a){case boolTag:case dateTag:return+r==+e;case errorTag:return r.name==e.name&&r.message==e.message;case numberTag:return r!=+r?e!=+e:r==+e;case regexpTag:case stringTag:return r==e+""}return!1}function equalObjects(r,e,a,t,o,n,u){var c=keys(r),s=c.length,i=keys(e),g=i.length;if(s!=g&&!o)return!1;for(var b=s;b--;){var l=c[b];if(!(o?l in e:hasOwnProperty.call(e,l)))return!1}for(var f=o;++b<s;){l=c[b];var y=r[l],T=e[l],j=t?t(o?T:y,o?y:T,l):void 0;if(!(void 0===j?a(y,T,t,o,n,u):j))return!1;f||(f="constructor"==l);}if(!f){var p=r.constructor,v=e.constructor;if(p!=v&&"constructor"in r&&"constructor"in e&&!("function"==typeof p&&p instanceof p&&"function"==typeof v&&v instanceof v))return!1}return!0}function isObject(r){var e=typeof r;return!!r&&("object"==e||"function"==e)}var isArray=_dereq_("lodash.isarray"),isTypedArray=_dereq_("lodash.istypedarray"),keys=_dereq_("lodash.keys"),argsTag="[object Arguments]",arrayTag="[object Array]",boolTag="[object Boolean]",dateTag="[object Date]",errorTag="[object Error]",numberTag="[object Number]",objectTag="[object Object]",regexpTag="[object RegExp]",stringTag="[object String]",objectProto=Object.prototype,hasOwnProperty=objectProto.hasOwnProperty,objToString=objectProto.toString;module.exports=baseIsEqual;
|
251 | },{"lodash.isarray":115,"lodash.istypedarray":117,"lodash.keys":118}],112:[function(_dereq_,module,exports){
|
252 | function bindCallback(n,t,r){if("function"!=typeof n)return identity;if(void 0===t)return n;switch(r){case 1:return function(r){return n.call(t,r)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,c){return n.call(t,r,e,u,c)};case 5:return function(r,e,u,c,i){return n.call(t,r,e,u,c,i)}}return function(){return n.apply(t,arguments)}}function identity(n){return n}module.exports=bindCallback;
|
253 | },{}],113:[function(_dereq_,module,exports){
|
254 | function isObjectLike(t){return!!t&&"object"==typeof t}function getNative(t,o){var e=null==t?void 0:t[o];return isNative(e)?e:void 0}function isFunction(t){return isObject(t)&&objToString.call(t)==funcTag}function isObject(t){var o=typeof t;return!!t&&("object"==o||"function"==o)}function isNative(t){return null!=t&&(isFunction(t)?reIsNative.test(fnToString.call(t)):isObjectLike(t)&&reIsHostCtor.test(t))}var funcTag="[object Function]",reIsHostCtor=/^\[object .+?Constructor\]$/,objectProto=Object.prototype,fnToString=Function.prototype.toString,hasOwnProperty=objectProto.hasOwnProperty,objToString=objectProto.toString,reIsNative=RegExp("^"+fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");module.exports=getNative;
|
255 | },{}],114:[function(_dereq_,module,exports){
|
256 | function isArguments(t){return isArrayLikeObject(t)&&hasOwnProperty.call(t,"callee")&&(!propertyIsEnumerable.call(t,"callee")||objectToString.call(t)==argsTag)}function isArrayLike(t){return null!=t&&isLength(t.length)&&!isFunction(t)}function isArrayLikeObject(t){return isObjectLike(t)&&isArrayLike(t)}function isFunction(t){var e=isObject(t)?objectToString.call(t):"";return e==funcTag||e==genTag}function isLength(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=MAX_SAFE_INTEGER}function isObject(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function isObjectLike(t){return!!t&&"object"==typeof t}var MAX_SAFE_INTEGER=9007199254740991,argsTag="[object Arguments]",funcTag="[object Function]",genTag="[object GeneratorFunction]",objectProto=Object.prototype,hasOwnProperty=objectProto.hasOwnProperty,objectToString=objectProto.toString,propertyIsEnumerable=objectProto.propertyIsEnumerable;module.exports=isArguments;
|
257 | },{}],115:[function(_dereq_,module,exports){
|
258 | function isObjectLike(t){return!!t&&"object"==typeof t}function getNative(t,r){var e=null==t?void 0:t[r];return isNative(e)?e:void 0}function isLength(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=MAX_SAFE_INTEGER}function isFunction(t){return isObject(t)&&objToString.call(t)==funcTag}function isObject(t){var r=typeof t;return!!t&&("object"==r||"function"==r)}function isNative(t){return null!=t&&(isFunction(t)?reIsNative.test(fnToString.call(t)):isObjectLike(t)&&reIsHostCtor.test(t))}var arrayTag="[object Array]",funcTag="[object Function]",reIsHostCtor=/^\[object .+?Constructor\]$/,objectProto=Object.prototype,fnToString=Function.prototype.toString,hasOwnProperty=objectProto.hasOwnProperty,objToString=objectProto.toString,reIsNative=RegExp("^"+fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),nativeIsArray=getNative(Array,"isArray"),MAX_SAFE_INTEGER=9007199254740991,isArray=nativeIsArray||function(t){return isObjectLike(t)&&isLength(t.length)&&objToString.call(t)==arrayTag};module.exports=isArray;
|
259 | },{}],116:[function(_dereq_,module,exports){
|
260 | function isEqual(a,l,i,e){i="function"==typeof i?bindCallback(i,e,3):void 0;var s=i?i(a,l):void 0;return void 0===s?baseIsEqual(a,l,i):!!s}var baseIsEqual=_dereq_("lodash._baseisequal"),bindCallback=_dereq_("lodash._bindcallback");module.exports=isEqual;
|
261 | },{"lodash._baseisequal":111,"lodash._bindcallback":112}],117:[function(_dereq_,module,exports){
|
262 | function isLength(a){return"number"==typeof a&&a>-1&&a%1==0&&a<=MAX_SAFE_INTEGER}function isObjectLike(a){return!!a&&"object"==typeof a}function isTypedArray(a){return isObjectLike(a)&&isLength(a.length)&&!!typedArrayTags[objectToString.call(a)]}var MAX_SAFE_INTEGER=9007199254740991,argsTag="[object Arguments]",arrayTag="[object Array]",boolTag="[object Boolean]",dateTag="[object Date]",errorTag="[object Error]",funcTag="[object Function]",mapTag="[object Map]",numberTag="[object Number]",objectTag="[object Object]",regexpTag="[object RegExp]",setTag="[object Set]",stringTag="[object String]",weakMapTag="[object WeakMap]",arrayBufferTag="[object ArrayBuffer]",dataViewTag="[object DataView]",float32Tag="[object Float32Array]",float64Tag="[object Float64Array]",int8Tag="[object Int8Array]",int16Tag="[object Int16Array]",int32Tag="[object Int32Array]",uint8Tag="[object Uint8Array]",uint8ClampedTag="[object Uint8ClampedArray]",uint16Tag="[object Uint16Array]",uint32Tag="[object Uint32Array]",typedArrayTags={};typedArrayTags[float32Tag]=typedArrayTags[float64Tag]=typedArrayTags[int8Tag]=typedArrayTags[int16Tag]=typedArrayTags[int32Tag]=typedArrayTags[uint8Tag]=typedArrayTags[uint8ClampedTag]=typedArrayTags[uint16Tag]=typedArrayTags[uint32Tag]=!0,typedArrayTags[argsTag]=typedArrayTags[arrayTag]=typedArrayTags[arrayBufferTag]=typedArrayTags[boolTag]=typedArrayTags[dataViewTag]=typedArrayTags[dateTag]=typedArrayTags[errorTag]=typedArrayTags[funcTag]=typedArrayTags[mapTag]=typedArrayTags[numberTag]=typedArrayTags[objectTag]=typedArrayTags[regexpTag]=typedArrayTags[setTag]=typedArrayTags[stringTag]=typedArrayTags[weakMapTag]=!1;var objectProto=Object.prototype,objectToString=objectProto.toString;module.exports=isTypedArray;
|
263 | },{}],118:[function(_dereq_,module,exports){
|
264 | function baseProperty(e){return function(t){return null==t?void 0:t[e]}}function isArrayLike(e){return null!=e&&isLength(getLength(e))}function isIndex(e,t){return e="number"==typeof e||reIsUint.test(e)?+e:-1,t=null==t?MAX_SAFE_INTEGER:t,e>-1&&e%1==0&&e<t}function isLength(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=MAX_SAFE_INTEGER}function shimKeys(e){for(var t=keysIn(e),r=t.length,n=r&&e.length,s=!!n&&isLength(n)&&(isArray(e)||isArguments(e)),o=-1,i=[];++o<r;){var u=t[o];(s&&isIndex(u,n)||hasOwnProperty.call(e,u))&&i.push(u);}return i}function isObject(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function keysIn(e){if(null==e)return[];isObject(e)||(e=Object(e));var t=e.length;t=t&&isLength(t)&&(isArray(e)||isArguments(e))&&t||0;for(var r=e.constructor,n=-1,s="function"==typeof r&&r.prototype===e,o=Array(t),i=t>0;++n<t;)o[n]=n+"";for(var u in e)i&&isIndex(u,t)||"constructor"==u&&(s||!hasOwnProperty.call(e,u))||o.push(u);return o}var getNative=_dereq_("lodash._getnative"),isArguments=_dereq_("lodash.isarguments"),isArray=_dereq_("lodash.isarray"),reIsUint=/^\d+$/,objectProto=Object.prototype,hasOwnProperty=objectProto.hasOwnProperty,nativeKeys=getNative(Object,"keys"),MAX_SAFE_INTEGER=9007199254740991,getLength=baseProperty("length"),keys=nativeKeys?function(e){var t=null==e?void 0:e.constructor;return"function"==typeof t&&t.prototype===e||"function"!=typeof e&&isArrayLike(e)?shimKeys(e):isObject(e)?nativeKeys(e):[]}:shimKeys;module.exports=keys;
|
265 | },{"lodash._getnative":113,"lodash.isarguments":114,"lodash.isarray":115}],119:[function(_dereq_,module,exports){
|
266 | module.exports=_dereq_("./v8.json");
; |
267 | },{"./v8.json":120}],120:[function(_dereq_,module,exports){
|
268 | module.exports={"$version":8,"$root":{"version":{"required":true,"type":"enum","values":[8]},"name":{"type":"string"},"metadata":{"type":"*"},"center":{"type":"array","value":"number"},"zoom":{"type":"number"},"bearing":{"type":"number","default":0,"period":360,"units":"degrees"},"pitch":{"type":"number","default":0,"units":"degrees"},"light":{"type":"light"},"sources":{"required":true,"type":"sources"},"sprite":{"type":"string"},"glyphs":{"type":"string"},"transition":{"type":"transition"},"layers":{"required":true,"type":"array","value":"layer"}},"sources":{"*":{"type":"source"}},"source":["source_tile","source_geojson","source_video","source_image","source_canvas"],"source_tile":{"type":{"required":true,"type":"enum","values":{"vector":{},"raster":{}}},"url":{"type":"string"},"tiles":{"type":"array","value":"string"},"minzoom":{"type":"number","default":0},"maxzoom":{"type":"number","default":22},"tileSize":{"type":"number","default":512,"units":"pixels"},"*":{"type":"*"}},"source_geojson":{"type":{"required":true,"type":"enum","values":{"geojson":{}}},"data":{"type":"*"},"maxzoom":{"type":"number","default":18},"buffer":{"type":"number","default":128,"maximum":512,"minimum":0},"tolerance":{"type":"number","default":0.375},"cluster":{"type":"boolean","default":false},"clusterRadius":{"type":"number","default":50,"minimum":0},"clusterMaxZoom":{"type":"number"}},"source_video":{"type":{"required":true,"type":"enum","values":{"video":{}}},"urls":{"required":true,"type":"array","value":"string"},"coordinates":{"required":true,"type":"array","length":4,"value":{"type":"array","length":2,"value":"number"}}},"source_image":{"type":{"required":true,"type":"enum","values":{"image":{}}},"url":{"required":true,"type":"string"},"coordinates":{"required":true,"type":"array","length":4,"value":{"type":"array","length":2,"value":"number"}}},"source_canvas":{"type":{"required":true,"type":"enum","values":{"canvas":{}}},"coordinates":{"required":true,"type":"array","length":4,"value":{"type":"array","length":2,"value":"number"}},"animate":{"type":"boolean","default":"true"},"canvas":{"type":"string","required":true}},"layer":{"id":{"type":"string","required":true},"type":{"type":"enum","values":{"fill":{},"line":{},"symbol":{},"circle":{},"fill-extrusion":{},"raster":{},"background":{}}},"metadata":{"type":"*"},"ref":{"type":"string"},"source":{"type":"string"},"source-layer":{"type":"string"},"minzoom":{"type":"number","minimum":0,"maximum":24},"maxzoom":{"type":"number","minimum":0,"maximum":24},"filter":{"type":"filter"},"layout":{"type":"layout"},"paint":{"type":"paint"},"paint.*":{"type":"paint"}},"layout":["layout_fill","layout_line","layout_circle","layout_fill-extrusion","layout_symbol","layout_raster","layout_background"],"layout_background":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_fill":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_circle":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_fill-extrusion":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_line":{"line-cap":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"butt":{},"round":{},"square":{}},"default":"butt"},"line-join":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"bevel":{},"round":{},"miter":{}},"default":"miter"},"line-miter-limit":{"type":"number","default":2,"function":"interpolated","zoom-function":true,"requires":[{"line-join":"miter"}]},"line-round-limit":{"type":"number","default":1.05,"function":"interpolated","zoom-function":true,"requires":[{"line-join":"round"}]},"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_symbol":{"symbol-placement":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"point":{},"line":{}},"default":"point"},"symbol-spacing":{"type":"number","default":250,"minimum":1,"function":"interpolated","zoom-function":true,"units":"pixels","requires":[{"symbol-placement":"line"}]},"symbol-avoid-edges":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false},"icon-allow-overlap":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["icon-image"]},"icon-ignore-placement":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["icon-image"]},"icon-optional":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["icon-image","text-field"]},"icon-rotation-alignment":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["icon-image"]},"icon-size":{"type":"number","default":1,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"requires":["icon-image"]},"icon-text-fit":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"none":{},"width":{},"height":{},"both":{}},"default":"none","requires":["icon-image","text-field"]},"icon-text-fit-padding":{"type":"array","value":"number","length":4,"default":[0,0,0,0],"units":"pixels","function":"interpolated","zoom-function":true,"requires":["icon-image","text-field",{"icon-text-fit":["both","width","height"]}]},"icon-image":{"type":"string","function":"piecewise-constant","zoom-function":true,"property-function":true,"tokens":true},"icon-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","zoom-function":true,"property-function":true,"units":"degrees","requires":["icon-image"]},"icon-padding":{"type":"number","default":2,"minimum":0,"function":"interpolated","zoom-function":true,"units":"pixels","requires":["icon-image"]},"icon-keep-upright":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["icon-image",{"icon-rotation-alignment":"map"},{"symbol-placement":"line"}]},"icon-offset":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"property-function":true,"requires":["icon-image"]},"text-pitch-alignment":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["text-field"]},"text-rotation-alignment":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["text-field"]},"text-field":{"type":"string","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":"","tokens":true},"text-font":{"type":"array","value":"string","function":"piecewise-constant","zoom-function":true,"default":["Open Sans Regular","Arial Unicode MS Regular"],"requires":["text-field"]},"text-size":{"type":"number","default":16,"minimum":0,"units":"pixels","function":"interpolated","zoom-function":true,"property-function":true,"requires":["text-field"]},"text-max-width":{"type":"number","default":10,"minimum":0,"units":"ems","function":"interpolated","zoom-function":true,"requires":["text-field"]},"text-line-height":{"type":"number","default":1.2,"units":"ems","function":"interpolated","zoom-function":true,"requires":["text-field"]},"text-letter-spacing":{"type":"number","default":0,"units":"ems","function":"interpolated","zoom-function":true,"requires":["text-field"]},"text-justify":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"left":{},"center":{},"right":{}},"default":"center","requires":["text-field"]},"text-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"center":{},"left":{},"right":{},"top":{},"bottom":{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},"default":"center","requires":["text-field"]},"text-max-angle":{"type":"number","default":45,"units":"degrees","function":"interpolated","zoom-function":true,"requires":["text-field",{"symbol-placement":"line"}]},"text-rotate":{"type":"number","default":0,"period":360,"units":"degrees","function":"interpolated","zoom-function":true,"property-function":true,"requires":["text-field"]},"text-padding":{"type":"number","default":2,"minimum":0,"units":"pixels","function":"interpolated","zoom-function":true,"requires":["text-field"]},"text-keep-upright":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":true,"requires":["text-field",{"text-rotation-alignment":"map"},{"symbol-placement":"line"}]},"text-transform":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"none":{},"uppercase":{},"lowercase":{}},"default":"none","requires":["text-field"]},"text-offset":{"type":"array","value":"number","units":"ems","function":"interpolated","zoom-function":true,"property-function":true,"length":2,"default":[0,0],"requires":["text-field"]},"text-allow-overlap":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["text-field"]},"text-ignore-placement":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["text-field"]},"text-optional":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["text-field","icon-image"]},"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_raster":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"filter":{"type":"array","value":"*"},"filter_operator":{"type":"enum","values":{"==":{},"!=":{},">":{},">=":{},"<":{},"<=":{},"in":{},"!in":{},"all":{},"any":{},"none":{},"has":{},"!has":{}}},"geometry_type":{"type":"enum","values":{"Point":{},"LineString":{},"Polygon":{}}},"function":{"stops":{"type":"array","value":"function_stop"},"base":{"type":"number","default":1,"minimum":0},"property":{"type":"string","default":"$zoom"},"type":{"type":"enum","values":{"identity":{},"exponential":{},"interval":{},"categorical":{}},"default":"exponential"},"colorSpace":{"type":"enum","values":{"rgb":{},"lab":{},"hcl":{}},"default":"rgb"},"default":{"type":"*","required":false}},"function_stop":{"type":"array","minimum":0,"maximum":22,"value":["number","color"],"length":2},"light":{"anchor":{"type":"enum","default":"viewport","values":{"map":{},"viewport":{}},"transition":false},"position":{"type":"array","default":[1.15,210,30],"length":3,"value":"number","transition":true,"function":"interpolated","zoom-function":true,"property-function":false},"color":{"type":"color","default":"#ffffff","function":"interpolated","zoom-function":true,"property-function":false,"transition":true},"intensity":{"type":"number","default":0.5,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":false,"transition":true}},"paint":["paint_fill","paint_line","paint_circle","paint_fill-extrusion","paint_symbol","paint_raster","paint_background"],"paint_fill":{"fill-antialias":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":true},"fill-opacity":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":1,"minimum":0,"maximum":1,"transition":true},"fill-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"fill-pattern"}]},"fill-outline-color":{"type":"color","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"fill-pattern"},{"fill-antialias":true}]},"fill-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels"},"fill-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["fill-translate"]},"fill-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"transition":true}},"paint_fill-extrusion":{"fill-extrusion-opacity":{"type":"number","function":"interpolated","zoom-function":true,"property-function":false,"default":1,"minimum":0,"maximum":1,"transition":true},"fill-extrusion-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"fill-extrusion-pattern"}]},"fill-extrusion-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels"},"fill-extrusion-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["fill-extrusion-translate"]},"fill-extrusion-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"transition":true},"fill-extrusion-height":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":0,"minimum":0,"maximum":65535,"units":"meters","transition":true},"fill-extrusion-base":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":0,"minimum":0,"maximum":65535,"units":"meters","transition":true,"requires":["fill-extrusion-height"]}},"paint_line":{"line-opacity":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":1,"minimum":0,"maximum":1,"transition":true},"line-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"line-pattern"}]},"line-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels"},"line-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["line-translate"]},"line-width":{"type":"number","default":1,"minimum":0,"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels"},"line-gap-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-offset":{"type":"number","default":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-dasharray":{"type":"array","value":"number","function":"piecewise-constant","zoom-function":true,"minimum":0,"transition":true,"units":"line widths","requires":[{"!":"line-pattern"}]},"line-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"transition":true}},"paint_circle":{"circle-radius":{"type":"number","default":5,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"circle-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-blur":{"type":"number","default":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels"},"circle-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["circle-translate"]},"circle-pitch-scale":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map"},"circle-stroke-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"circle-stroke-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-stroke-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true}},"paint_symbol":{"icon-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["icon-image"]},"icon-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["icon-image"]},"icon-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["icon-image"]},"icon-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels","requires":["icon-image"]},"icon-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels","requires":["icon-image"]},"icon-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels","requires":["icon-image"]},"icon-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["icon-image","icon-translate"]},"text-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["text-field"]},"text-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["text-field"]},"text-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["text-field"]},"text-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels","requires":["text-field"]},"text-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels","requires":["text-field"]},"text-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels","requires":["text-field"]},"text-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["text-field","text-translate"]}},"paint_raster":{"raster-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true},"raster-hue-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","zoom-function":true,"transition":true,"units":"degrees"},"raster-brightness-min":{"type":"number","function":"interpolated","zoom-function":true,"default":0,"minimum":0,"maximum":1,"transition":true},"raster-brightness-max":{"type":"number","function":"interpolated","zoom-function":true,"default":1,"minimum":0,"maximum":1,"transition":true},"raster-saturation":{"type":"number","default":0,"minimum":-1,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true},"raster-contrast":{"type":"number","default":0,"minimum":-1,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true},"raster-fade-duration":{"type":"number","default":300,"minimum":0,"function":"interpolated","zoom-function":true,"transition":true,"units":"milliseconds"}},"paint_background":{"background-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"transition":true,"requires":[{"!":"background-pattern"}]},"background-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"transition":true},"background-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true}},"transition":{"duration":{"type":"number","default":300,"minimum":0,"units":"milliseconds"},"delay":{"type":"number","default":0,"minimum":0,"units":"milliseconds"}}};
|
269 | },{}],121:[function(_dereq_,module,exports){
|
270 | module.exports=function(r){for(var t=arguments,e=1;e<arguments.length;e++){var n=t[e];for(var o in n)r[o]=n[o];}return r};
; |
271 | },{}],122:[function(_dereq_,module,exports){
|
272 | module.exports=function(n){return n instanceof Number?"number":n instanceof String?"string":n instanceof Boolean?"boolean":Array.isArray(n)?"array":null===n?"null":typeof n};
; |
273 | },{}],123:[function(_dereq_,module,exports){
|
274 | function interpolate(t,e,n){return t*(1-n)+e*n}module.exports=interpolate,interpolate.number=interpolate,interpolate.vec2=function(t,e,n){return[interpolate(t[0],e[0],n),interpolate(t[1],e[1],n)]},interpolate.color=function(t,e,n){return[interpolate(t[0],e[0],n),interpolate(t[1],e[1],n),interpolate(t[2],e[2],n),interpolate(t[3],e[3],n)]},interpolate.array=function(t,e,n){return t.map(function(t,r){return interpolate(t,e[r],n)})};
; |
275 | },{}],124:[function(_dereq_,module,exports){
|
276 | var parseColorString=_dereq_("csscolorparser").parseCSSColor;module.exports=function(r){if("string"==typeof r){var e=parseColorString(r);if(!e)return;return[e[0]/255*e[3],e[1]/255*e[3],e[2]/255*e[3],e[3]]}return Array.isArray(r)?r:void 0};
; |
277 | },{"csscolorparser":109}],125:[function(_dereq_,module,exports){
|
278 | module.exports=["type","source","source-layer","minzoom","maxzoom","filter","layout"];
; |
279 | },{}],126:[function(_dereq_,module,exports){
|
280 | module.exports=function(n){return n instanceof Number||n instanceof String||n instanceof Boolean?n.valueOf():n};
; |
281 | },{}],127:[function(_dereq_,module,exports){
|
282 | var ValidationError=_dereq_("../error/validation_error"),getType=_dereq_("../util/get_type"),extend=_dereq_("../util/extend");module.exports=function(e){var r=_dereq_("./validate_function"),t=_dereq_("./validate_object"),i={"*":function(){return[]},array:_dereq_("./validate_array"),boolean:_dereq_("./validate_boolean"),number:_dereq_("./validate_number"),color:_dereq_("./validate_color"),constants:_dereq_("./validate_constants"),enum:_dereq_("./validate_enum"),filter:_dereq_("./validate_filter"),function:_dereq_("./validate_function"),layer:_dereq_("./validate_layer"),object:_dereq_("./validate_object"),source:_dereq_("./validate_source"),light:_dereq_("./validate_light"),string:_dereq_("./validate_string")},a=e.value,n=e.valueSpec,u=e.key,o=e.styleSpec,l=e.style;if("string"===getType(a)&&"@"===a[0]){if(o.$version>7)return[new ValidationError(u,a,"constants have been deprecated as of v8")];if(!(a in l.constants))return[new ValidationError(u,a,'constant "%s" not found',a)];e=extend({},e,{value:l.constants[a]});}return n.function&&"object"===getType(a)?r(e):n.type&&i[n.type]?i[n.type](e):t(extend({},e,{valueSpec:n.type?o[n.type]:n}))};
; |
283 | },{"../error/validation_error":104,"../util/extend":121,"../util/get_type":122,"./validate_array":128,"./validate_boolean":129,"./validate_color":130,"./validate_constants":131,"./validate_enum":132,"./validate_filter":133,"./validate_function":134,"./validate_layer":136,"./validate_light":138,"./validate_number":139,"./validate_object":140,"./validate_source":143,"./validate_string":144}],128:[function(_dereq_,module,exports){
|
284 | var getType=_dereq_("../util/get_type"),validate=_dereq_("./validate"),ValidationError=_dereq_("../error/validation_error");module.exports=function(e){var r=e.value,t=e.valueSpec,a=e.style,n=e.styleSpec,l=e.key,i=e.arrayElementValidator||validate;if("array"!==getType(r))return[new ValidationError(l,r,"array expected, %s found",getType(r))];if(t.length&&r.length!==t.length)return[new ValidationError(l,r,"array length %d expected, length %d found",t.length,r.length)];if(t["min-length"]&&r.length<t["min-length"])return[new ValidationError(l,r,"array length at least %d expected, length %d found",t["min-length"],r.length)];var o={type:t.value};n.$version<7&&(o.function=t.function),"object"===getType(t.value)&&(o=t.value);for(var u=[],d=0;d<r.length;d++)u=u.concat(i({array:r,arrayIndex:d,value:r[d],valueSpec:o,style:a,styleSpec:n,key:l+"["+d+"]"}));return u};
; |
285 | },{"../error/validation_error":104,"../util/get_type":122,"./validate":127}],129:[function(_dereq_,module,exports){
|
286 | var getType=_dereq_("../util/get_type"),ValidationError=_dereq_("../error/validation_error");module.exports=function(e){var r=e.value,o=e.key,t=getType(r);return"boolean"!==t?[new ValidationError(o,r,"boolean expected, %s found",t)]:[]};
; |
287 | },{"../error/validation_error":104,"../util/get_type":122}],130:[function(_dereq_,module,exports){
|
288 | var ValidationError=_dereq_("../error/validation_error"),getType=_dereq_("../util/get_type"),parseCSSColor=_dereq_("csscolorparser").parseCSSColor;module.exports=function(r){var e=r.key,o=r.value,t=getType(o);return"string"!==t?[new ValidationError(e,o,"color expected, %s found",t)]:null===parseCSSColor(o)?[new ValidationError(e,o,'color expected, "%s" found',o)]:[]};
; |
289 | },{"../error/validation_error":104,"../util/get_type":122,"csscolorparser":109}],131:[function(_dereq_,module,exports){
|
290 | var ValidationError=_dereq_("../error/validation_error"),getType=_dereq_("../util/get_type");module.exports=function(r){var e=r.key,t=r.value,a=r.styleSpec;if(a.$version>7)return t?[new ValidationError(e,t,"constants have been deprecated as of v8")]:[];var o=getType(t);if("object"!==o)return[new ValidationError(e,t,"object expected, %s found",o)];var n=[];for(var i in t)"@"!==i[0]&&n.push(new ValidationError(e+"."+i,t[i],'constants must start with "@"'));return n};
; |
291 | },{"../error/validation_error":104,"../util/get_type":122}],132:[function(_dereq_,module,exports){
|
292 | var ValidationError=_dereq_("../error/validation_error"),unbundle=_dereq_("../util/unbundle_jsonlint");module.exports=function(e){var r=e.key,n=e.value,u=e.valueSpec,o=[];return Array.isArray(u.values)?u.values.indexOf(unbundle(n))===-1&&o.push(new ValidationError(r,n,"expected one of [%s], %s found",u.values.join(", "),n)):Object.keys(u.values).indexOf(unbundle(n))===-1&&o.push(new ValidationError(r,n,"expected one of [%s], %s found",Object.keys(u.values).join(", "),n)),o};
; |
293 | },{"../error/validation_error":104,"../util/unbundle_jsonlint":126}],133:[function(_dereq_,module,exports){
|
294 | var ValidationError=_dereq_("../error/validation_error"),validateEnum=_dereq_("./validate_enum"),getType=_dereq_("../util/get_type"),unbundle=_dereq_("../util/unbundle_jsonlint");module.exports=function e(r){var t,a=r.value,n=r.key,l=r.styleSpec,s=[];if("array"!==getType(a))return[new ValidationError(n,a,"array expected, %s found",getType(a))];if(a.length<1)return[new ValidationError(n,a,"filter array must have at least 1 element")];switch(s=s.concat(validateEnum({key:n+"[0]",value:a[0],valueSpec:l.filter_operator,style:r.style,styleSpec:r.styleSpec})),unbundle(a[0])){case"<":case"<=":case">":case">=":a.length>=2&&"$type"===unbundle(a[1])&&s.push(new ValidationError(n,a,'"$type" cannot be use with operator "%s"',a[0]));case"==":case"!=":3!==a.length&&s.push(new ValidationError(n,a,'filter array for operator "%s" must have 3 elements',a[0]));case"in":case"!in":a.length>=2&&(t=getType(a[1]),"string"!==t&&s.push(new ValidationError(n+"[1]",a[1],"string expected, %s found",t)));for(var o=2;o<a.length;o++)t=getType(a[o]),"$type"===unbundle(a[1])?s=s.concat(validateEnum({key:n+"["+o+"]",value:a[o],valueSpec:l.geometry_type,style:r.style,styleSpec:r.styleSpec})):"string"!==t&&"number"!==t&&"boolean"!==t&&s.push(new ValidationError(n+"["+o+"]",a[o],"string, number, or boolean expected, %s found",t));break;case"any":case"all":case"none":for(var i=1;i<a.length;i++)s=s.concat(e({key:n+"["+i+"]",value:a[i],style:r.style,styleSpec:r.styleSpec}));break;case"has":case"!has":t=getType(a[1]),2!==a.length?s.push(new ValidationError(n,a,'filter array for "%s" operator must have 2 elements',a[0])):"string"!==t&&s.push(new ValidationError(n+"[1]",a[1],"string expected, %s found",t));}return s};
; |
295 | },{"../error/validation_error":104,"../util/get_type":122,"../util/unbundle_jsonlint":126,"./validate_enum":132}],134:[function(_dereq_,module,exports){
|
296 | var ValidationError=_dereq_("../error/validation_error"),getType=_dereq_("../util/get_type"),validate=_dereq_("./validate"),validateObject=_dereq_("./validate_object"),validateArray=_dereq_("./validate_array"),validateNumber=_dereq_("./validate_number"),unbundle=_dereq_("../util/unbundle_jsonlint");module.exports=function(e){function t(e){if("identity"===p)return[new ValidationError(e.key,e.value,'identity function may not have a "stops" property')];var t=[],a=e.value;return t=t.concat(validateArray({key:e.key,value:a,valueSpec:e.valueSpec,style:e.style,styleSpec:e.styleSpec,arrayElementValidator:r})),"array"===getType(a)&&0===a.length&&t.push(new ValidationError(e.key,a,"array must have at least one stop")),t}function r(e){var t=[],r=e.value,o=e.key;if("array"!==getType(r))return[new ValidationError(o,r,"array expected, %s found",getType(r))];if(2!==r.length)return[new ValidationError(o,r,"array length %d expected, length %d found",2,r.length)];if(c){if("object"!==getType(r[0]))return[new ValidationError(o,r,"object expected, %s found",getType(r[0]))];if(void 0===r[0].zoom)return[new ValidationError(o,r,"object stop key must have zoom")];if(void 0===r[0].value)return[new ValidationError(o,r,"object stop key must have value")];if(l&&l>unbundle(r[0].zoom))return[new ValidationError(o,r[0].zoom,"stop zoom values must appear in ascending order")];unbundle(r[0].zoom)!==l&&(l=unbundle(r[0].zoom),i=void 0,s={}),t=t.concat(validateObject({key:o+"[0]",value:r[0],valueSpec:{zoom:{}},style:e.style,styleSpec:e.styleSpec,objectElementValidators:{zoom:validateNumber,value:a}}));}else t=t.concat(a({key:o+"[0]",value:r[0],valueSpec:{},style:e.style,styleSpec:e.styleSpec}));return t.concat(validate({key:o+"[1]",value:r[1],valueSpec:u,style:e.style,styleSpec:e.styleSpec}))}function a(e){var t=getType(e.value),r=unbundle(e.value);if(n){if(t!==n)return[new ValidationError(e.key,e.value,"%s stop domain type must match previous stop domain type %s",t,n)]}else n=t;if("number"!==t&&"string"!==t&&"boolean"!==t)return[new ValidationError(e.key,e.value,"stop domain value must be a number, string, or boolean")];if("number"!==t&&"categorical"!==p){var a="number expected, %s found";return u["property-function"]&&void 0===p&&(a+='\nIf you intended to use a categorical function, specify `"type": "categorical"`.'),[new ValidationError(e.key,e.value,a,t)]}return"categorical"!==p||"number"!==t||isFinite(r)&&Math.floor(r)===r?"number"===t&&void 0!==i&&r<i?[new ValidationError(e.key,e.value,"stop domain values must appear in ascending order")]:(i=r,"categorical"===p&&r in s?[new ValidationError(e.key,e.value,"stop domain values must be unique")]:(s[r]=!0,[])):[new ValidationError(e.key,e.value,"integer expected, found %s",r)]}function o(e){return validate({key:e.key,value:e.value,valueSpec:u,style:e.style,styleSpec:e.styleSpec})}var n,i,l,u=e.valueSpec,p=unbundle(e.value.type),s={},y="categorical"!==p&&void 0===e.value.property,d=!y,c="array"===getType(e.value.stops)&&"array"===getType(e.value.stops[0])&&"object"===getType(e.value.stops[0][0]),v=validateObject({key:e.key,value:e.value,valueSpec:e.styleSpec.function,style:e.style,styleSpec:e.styleSpec,objectElementValidators:{stops:t,default:o}});return"identity"===p&&y&&v.push(new ValidationError(e.key,e.value,'missing required property "property"')),"identity"===p||e.value.stops||v.push(new ValidationError(e.key,e.value,'missing required property "stops"')),"exponential"===p&&"piecewise-constant"===e.valueSpec.function&&v.push(new ValidationError(e.key,e.value,"exponential functions not supported")),e.styleSpec.$version>=8&&(d&&!e.valueSpec["property-function"]?v.push(new ValidationError(e.key,e.value,"property functions not supported")):y&&!e.valueSpec["zoom-function"]&&v.push(new ValidationError(e.key,e.value,"zoom functions not supported"))),"categorical"!==p&&!c||void 0!==e.value.property||v.push(new ValidationError(e.key,e.value,'"property" property is required')),v};
; |
297 | },{"../error/validation_error":104,"../util/get_type":122,"../util/unbundle_jsonlint":126,"./validate":127,"./validate_array":128,"./validate_number":139,"./validate_object":140}],135:[function(_dereq_,module,exports){
|
298 | var ValidationError=_dereq_("../error/validation_error"),validateString=_dereq_("./validate_string");module.exports=function(r){var e=r.value,t=r.key,a=validateString(r);return a.length?a:(e.indexOf("{fontstack}")===-1&&a.push(new ValidationError(t,e,'"glyphs" url must include a "{fontstack}" token')),e.indexOf("{range}")===-1&&a.push(new ValidationError(t,e,'"glyphs" url must include a "{range}" token')),a)};
; |
299 | },{"../error/validation_error":104,"./validate_string":144}],136:[function(_dereq_,module,exports){
|
300 | var ValidationError=_dereq_("../error/validation_error"),unbundle=_dereq_("../util/unbundle_jsonlint"),validateObject=_dereq_("./validate_object"),validateFilter=_dereq_("./validate_filter"),validatePaintProperty=_dereq_("./validate_paint_property"),validateLayoutProperty=_dereq_("./validate_layout_property"),extend=_dereq_("../util/extend");module.exports=function(e){var r=[],t=e.value,a=e.key,i=e.style,l=e.styleSpec;t.type||t.ref||r.push(new ValidationError(a,t,'either "type" or "ref" is required'));var u=unbundle(t.type),n=unbundle(t.ref);if(t.id)for(var o=unbundle(t.id),s=0;s<e.arrayIndex;s++){var d=i.layers[s];unbundle(d.id)===o&&r.push(new ValidationError(a,t.id,'duplicate layer id "%s", previously used at line %d',t.id,d.id.__line__));}if("ref"in t){["type","source","source-layer","filter","layout"].forEach(function(e){e in t&&r.push(new ValidationError(a,t[e],'"%s" is prohibited for ref layers',e));});var y;i.layers.forEach(function(e){unbundle(e.id)===n&&(y=e);}),y?y.ref?r.push(new ValidationError(a,t.ref,"ref cannot reference another ref layer")):u=unbundle(y.type):r.push(new ValidationError(a,t.ref,'ref layer "%s" not found',n));}else if("background"!==u)if(t.source){var c=i.sources&&i.sources[t.source],p=c&&unbundle(c.type);c?"vector"===p&&"raster"===u?r.push(new ValidationError(a,t.source,'layer "%s" requires a raster source',t.id)):"raster"===p&&"raster"!==u?r.push(new ValidationError(a,t.source,'layer "%s" requires a vector source',t.id)):"vector"!==p||t["source-layer"]||r.push(new ValidationError(a,t,'layer "%s" must specify a "source-layer"',t.id)):r.push(new ValidationError(a,t.source,'source "%s" not found',t.source));}else r.push(new ValidationError(a,t,'missing required property "source"'));return r=r.concat(validateObject({key:a,value:t,valueSpec:l.layer,style:e.style,styleSpec:e.styleSpec,objectElementValidators:{"*":function(){return[]},filter:validateFilter,layout:function(e){return validateObject({layer:t,key:e.key,value:e.value,style:e.style,styleSpec:e.styleSpec,objectElementValidators:{"*":function(e){return validateLayoutProperty(extend({layerType:u},e))}}})},paint:function(e){return validateObject({layer:t,key:e.key,value:e.value,style:e.style,styleSpec:e.styleSpec,objectElementValidators:{"*":function(e){return validatePaintProperty(extend({layerType:u},e))}}})}}}))};
; |
301 | },{"../error/validation_error":104,"../util/extend":121,"../util/unbundle_jsonlint":126,"./validate_filter":133,"./validate_layout_property":137,"./validate_object":140,"./validate_paint_property":141}],137:[function(_dereq_,module,exports){
|
302 | var validateProperty=_dereq_("./validate_property");module.exports=function(r){return validateProperty(r,"layout")};
; |
303 | },{"./validate_property":142}],138:[function(_dereq_,module,exports){
|
304 | var ValidationError=_dereq_("../error/validation_error"),getType=_dereq_("../util/get_type"),validate=_dereq_("./validate");module.exports=function(e){var t=e.value,r=e.styleSpec,a=r.light,i=e.style,n=[],o=getType(t);if(void 0===t)return n;if("object"!==o)return n=n.concat([new ValidationError("light",t,"object expected, %s found",o)]);for(var l in t){var c=l.match(/^(.*)-transition$/);n=c&&a[c[1]]&&a[c[1]].transition?n.concat(validate({key:l,value:t[l],valueSpec:r.transition,style:i,styleSpec:r})):a[l]?n.concat(validate({key:l,value:t[l],valueSpec:a[l],style:i,styleSpec:r})):n.concat([new ValidationError(l,t[l],'unknown property "%s"',l)]);}return n};
; |
305 | },{"../error/validation_error":104,"../util/get_type":122,"./validate":127}],139:[function(_dereq_,module,exports){
|
306 | var getType=_dereq_("../util/get_type"),ValidationError=_dereq_("../error/validation_error");module.exports=function(e){var r=e.key,i=e.value,m=e.valueSpec,a=getType(i);return"number"!==a?[new ValidationError(r,i,"number expected, %s found",a)]:"minimum"in m&&i<m.minimum?[new ValidationError(r,i,"%s is less than the minimum value %s",i,m.minimum)]:"maximum"in m&&i>m.maximum?[new ValidationError(r,i,"%s is greater than the maximum value %s",i,m.maximum)]:[]};
; |
307 | },{"../error/validation_error":104,"../util/get_type":122}],140:[function(_dereq_,module,exports){
|
308 | var ValidationError=_dereq_("../error/validation_error"),getType=_dereq_("../util/get_type"),validateSpec=_dereq_("./validate");module.exports=function(e){var r=e.key,t=e.value,i=e.valueSpec||{},a=e.objectElementValidators||{},o=e.style,l=e.styleSpec,n=[],u=getType(t);if("object"!==u)return[new ValidationError(r,t,"object expected, %s found",u)];for(var d in t){var p=d.split(".")[0],s=i[p]||i["*"],c=void 0;if(a[p])c=a[p];else if(i[p])c=validateSpec;else if(a["*"])c=a["*"];else{if(!i["*"]){n.push(new ValidationError(r,t[d],'unknown property "%s"',d));continue}c=validateSpec;}n=n.concat(c({key:(r?r+".":r)+d,value:t[d],valueSpec:s,style:o,styleSpec:l,object:t,objectKey:d}));}for(var v in i)i[v].required&&void 0===i[v].default&&void 0===t[v]&&n.push(new ValidationError(r,t,'missing required property "%s"',v));return n};
; |
309 | },{"../error/validation_error":104,"../util/get_type":122,"./validate":127}],141:[function(_dereq_,module,exports){
|
310 | var validateProperty=_dereq_("./validate_property");module.exports=function(r){return validateProperty(r,"paint")};
; |
311 | },{"./validate_property":142}],142:[function(_dereq_,module,exports){
|
312 | var validate=_dereq_("./validate"),ValidationError=_dereq_("../error/validation_error"),getType=_dereq_("../util/get_type");module.exports=function(e,t){var r=e.key,i=e.style,a=e.styleSpec,n=e.value,o=e.objectKey,l=a[t+"_"+e.layerType];if(!l)return[];var y=o.match(/^(.*)-transition$/);if("paint"===t&&y&&l[y[1]]&&l[y[1]].transition)return validate({key:r,value:n,valueSpec:a.transition,style:i,styleSpec:a});var p=e.valueSpec||l[o];if(!p)return[new ValidationError(r,n,'unknown property "%s"',o)];var s;if("string"===getType(n)&&p["property-function"]&&!p.tokens&&(s=/^{([^}]+)}$/.exec(n)))return[new ValidationError(r,n,'"%s" does not support interpolation syntax\nUse an identity property function instead: `{ "type": "identity", "property": %s` }`.',o,JSON.stringify(s[1]))];var u=[];return"symbol"===e.layerType&&"text-field"===o&&i&&!i.glyphs&&u.push(new ValidationError(r,n,'use of "text-field" requires a style "glyphs" property')),u.concat(validate({key:e.key,value:n,valueSpec:p,style:i,styleSpec:a}))};
; |
313 | },{"../error/validation_error":104,"../util/get_type":122,"./validate":127}],143:[function(_dereq_,module,exports){
|
314 | var ValidationError=_dereq_("../error/validation_error"),unbundle=_dereq_("../util/unbundle_jsonlint"),validateObject=_dereq_("./validate_object"),validateEnum=_dereq_("./validate_enum");module.exports=function(e){var a=e.value,t=e.key,r=e.styleSpec,l=e.style;if(!a.type)return[new ValidationError(t,a,'"type" is required')];var u=unbundle(a.type),i=[];switch(u){case"vector":case"raster":if(i=i.concat(validateObject({key:t,value:a,valueSpec:r.source_tile,style:e.style,styleSpec:r})),"url"in a)for(var s in a)["type","url","tileSize"].indexOf(s)<0&&i.push(new ValidationError(t+"."+s,a[s],'a source with a "url" property may not include a "%s" property',s));return i;case"geojson":return validateObject({key:t,value:a,valueSpec:r.source_geojson,style:l,styleSpec:r});case"video":return validateObject({key:t,value:a,valueSpec:r.source_video,style:l,styleSpec:r});case"image":return validateObject({key:t,value:a,valueSpec:r.source_image,style:l,styleSpec:r});case"canvas":return validateObject({key:t,value:a,valueSpec:r.source_canvas,style:l,styleSpec:r});default:return validateEnum({key:t+".type",value:a.type,valueSpec:{values:["vector","raster","geojson","video","image","canvas"]},style:l,styleSpec:r})}};
; |
315 | },{"../error/validation_error":104,"../util/unbundle_jsonlint":126,"./validate_enum":132,"./validate_object":140}],144:[function(_dereq_,module,exports){
|
316 | var getType=_dereq_("../util/get_type"),ValidationError=_dereq_("../error/validation_error");module.exports=function(r){var e=r.value,t=r.key,i=getType(e);return"string"!==i?[new ValidationError(t,e,"string expected, %s found",i)]:[]};
; |
317 | },{"../error/validation_error":104,"../util/get_type":122}],145:[function(_dereq_,module,exports){
|
318 | function validateStyleMin(e,a){a=a||latestStyleSpec;var t=[];return t=t.concat(validate({key:"",value:e,valueSpec:a.$root,styleSpec:a,style:e,objectElementValidators:{glyphs:validateGlyphsURL,"*":function(){return[]}}})),a.$version>7&&e.constants&&(t=t.concat(validateConstants({key:"constants",value:e.constants,style:e,styleSpec:a}))),sortErrors(t)}function sortErrors(e){return[].concat(e).sort(function(e,a){return e.line-a.line})}function wrapCleanErrors(e){return function(){return sortErrors(e.apply(this,arguments))}}var validateConstants=_dereq_("./validate/validate_constants"),validate=_dereq_("./validate/validate"),latestStyleSpec=_dereq_("./reference/latest"),validateGlyphsURL=_dereq_("./validate/validate_glyphs_url");validateStyleMin.source=wrapCleanErrors(_dereq_("./validate/validate_source")),validateStyleMin.light=wrapCleanErrors(_dereq_("./validate/validate_light")),validateStyleMin.layer=wrapCleanErrors(_dereq_("./validate/validate_layer")),validateStyleMin.filter=wrapCleanErrors(_dereq_("./validate/validate_filter")),validateStyleMin.paintProperty=wrapCleanErrors(_dereq_("./validate/validate_paint_property")),validateStyleMin.layoutProperty=wrapCleanErrors(_dereq_("./validate/validate_layout_property")),module.exports=validateStyleMin;
; |
319 | },{"./reference/latest":119,"./validate/validate":127,"./validate/validate_constants":131,"./validate/validate_filter":133,"./validate/validate_glyphs_url":135,"./validate/validate_layer":136,"./validate/validate_layout_property":137,"./validate/validate_light":138,"./validate/validate_paint_property":141,"./validate/validate_source":143}],146:[function(_dereq_,module,exports){
|
320 | var AnimationLoop=function(){this.n=0,this.times=[];};AnimationLoop.prototype.stopped=function(){return this.times=this.times.filter(function(t){return t.time>=(new Date).getTime()}),!this.times.length},AnimationLoop.prototype.set=function(t){return this.times.push({id:this.n,time:t+(new Date).getTime()}),this.n++},AnimationLoop.prototype.cancel=function(t){this.times=this.times.filter(function(i){return i.id!==t});},module.exports=AnimationLoop;
; |
321 | },{}],147:[function(_dereq_,module,exports){
|
322 | var Evented=_dereq_("../util/evented"),ajax=_dereq_("../util/ajax"),browser=_dereq_("../util/browser"),normalizeURL=_dereq_("../util/mapbox").normalizeSpriteURL,SpritePosition=function(){this.x=0,this.y=0,this.width=0,this.height=0,this.pixelRatio=1,this.sdf=!1;},ImageSprite=function(t){function e(e,i){var r=this;t.call(this),this.base=e,this.retina=browser.devicePixelRatio>1,this.setEventedParent(i);var a=this.retina?"@2x":"";ajax.getJSON(normalizeURL(e,a,".json"),function(t,e){return t?void r.fire("error",{error:t}):(r.data=e,void(r.imgData&&r.fire("data",{dataType:"style"})))}),ajax.getImage(normalizeURL(e,a,".png"),function(t,e){return t?void r.fire("error",{error:t}):(r.imgData=browser.getImageData(e),r.width=e.width,void(r.data&&r.fire("data",{dataType:"style"})))});}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.toJSON=function(){return this.base},e.prototype.loaded=function(){return!(!this.data||!this.imgData)},e.prototype.resize=function(){var t=this;if(browser.devicePixelRatio>1!==this.retina){var i=new e(this.base);i.on("data",function(){t.data=i.data,t.imgData=i.imgData,t.width=i.width,t.retina=i.retina;});}},e.prototype.getSpritePosition=function(t){if(!this.loaded())return new SpritePosition;var e=this.data&&this.data[t];return e&&this.imgData?e:new SpritePosition},e}(Evented);module.exports=ImageSprite;
; |
323 | },{"../util/ajax":194,"../util/browser":195,"../util/evented":203,"../util/mapbox":210}],148:[function(_dereq_,module,exports){
|
324 | var styleSpec=_dereq_("../style-spec/reference/latest"),util=_dereq_("../util/util"),Evented=_dereq_("../util/evented"),validateStyle=_dereq_("./validate_style"),StyleDeclaration=_dereq_("./style_declaration"),StyleTransition=_dereq_("./style_transition"),TRANSITION_SUFFIX="-transition",Light=function(t){function i(i){t.call(this),this.properties=["anchor","color","position","intensity"],this._specifications=styleSpec.light,this.set(i);}return t&&(i.__proto__=t),i.prototype=Object.create(t&&t.prototype),i.prototype.constructor=i,i.prototype.set=function(t){var i=this;if(!this._validate(validateStyle.light,t)){this._declarations={},this._transitions={},this._transitionOptions={},this.calculated={},t=util.extend({anchor:this._specifications.anchor.default,color:this._specifications.color.default,position:this._specifications.position.default,intensity:this._specifications.intensity.default},t);for(var e=0,o=i.properties;e<o.length;e+=1){var n=o[e];i._declarations[n]=new StyleDeclaration(i._specifications[n],t[n]);}return this}},i.prototype.getLight=function(){return{anchor:this.getLightProperty("anchor"),color:this.getLightProperty("color"),position:this.getLightProperty("position"),intensity:this.getLightProperty("intensity")}},i.prototype.getLightProperty=function(t){return util.endsWith(t,TRANSITION_SUFFIX)?this._transitionOptions[t]:this._declarations[t]&&this._declarations[t].value},i.prototype.getLightValue=function(t,i){if("position"===t){var e=this._transitions[t].calculate(i),o=util.sphericalToCartesian(e);return{x:o[0],y:o[1],z:o[2]}}return this._transitions[t].calculate(i)},i.prototype.setLight=function(t){var i=this;if(!this._validate(validateStyle.light,t))for(var e in t){var o=t[e];util.endsWith(e,TRANSITION_SUFFIX)?i._transitionOptions[e]=o:null===o||void 0===o?delete i._declarations[e]:i._declarations[e]=new StyleDeclaration(i._specifications[e],o);}},i.prototype.recalculate=function(t){var i=this;for(var e in i._declarations)i.calculated[e]=i.getLightValue(e,{zoom:t});},i.prototype._applyLightDeclaration=function(t,i,e,o,n){var r=e.transition?this._transitions[t]:void 0,a=this._specifications[t];if(null!==i&&void 0!==i||(i=new StyleDeclaration(a,a.default)),!r||r.declaration.json!==i.json){var s=util.extend({duration:300,delay:0},o,this.getLightProperty(t+TRANSITION_SUFFIX)),l=this._transitions[t]=new StyleTransition(a,i,r,s);l.instant()||(l.loopID=n.set(l.endTime-Date.now())),r&&n.cancel(r.loopID);}},i.prototype.updateLightTransitions=function(t,i,e){var o,n=this;for(o in n._declarations)n._applyLightDeclaration(o,n._declarations[o],t,i,e);},i.prototype._validate=function(t,i){return validateStyle.emitErrors(this,t.call(validateStyle,util.extend({value:i,style:{glyphs:!0,sprite:!0},styleSpec:styleSpec})))},i}(Evented);module.exports=Light;
; |
325 | },{"../style-spec/reference/latest":119,"../util/evented":203,"../util/util":215,"./style_declaration":150,"./style_transition":158,"./validate_style":159}],149:[function(_dereq_,module,exports){
|
326 | var Evented=_dereq_("../util/evented"),StyleLayer=_dereq_("./style_layer"),ImageSprite=_dereq_("./image_sprite"),Light=_dereq_("./light"),GlyphSource=_dereq_("../symbol/glyph_source"),SpriteAtlas=_dereq_("../symbol/sprite_atlas"),LineAtlas=_dereq_("../render/line_atlas"),util=_dereq_("../util/util"),ajax=_dereq_("../util/ajax"),mapbox=_dereq_("../util/mapbox"),browser=_dereq_("../util/browser"),Dispatcher=_dereq_("../util/dispatcher"),AnimationLoop=_dereq_("./animation_loop"),validateStyle=_dereq_("./validate_style"),Source=_dereq_("../source/source"),QueryFeatures=_dereq_("../source/query_features"),SourceCache=_dereq_("../source/source_cache"),styleSpec=_dereq_("../style-spec/reference/latest"),MapboxGLFunction=_dereq_("../style-spec/function"),getWorkerPool=_dereq_("../util/global_worker_pool"),deref=_dereq_("../style-spec/deref"),diff=_dereq_("../style-spec/diff"),rtlTextPlugin=_dereq_("../source/rtl_text_plugin"),supportedDiffOperations=util.pick(diff.operations,["addLayer","removeLayer","setPaintProperty","setLayoutProperty","setFilter","addSource","removeSource","setLayerZoomRange","setLight","setTransition"]),ignoredDiffOperations=util.pick(diff.operations,["setCenter","setZoom","setBearing","setPitch"]),Style=function(e){function t(t,r,i){var o=this;e.call(this),this.map=r,this.animationLoop=r&&r.animationLoop||new AnimationLoop,this.dispatcher=new Dispatcher(getWorkerPool(),this),this.spriteAtlas=new SpriteAtlas(1024,1024),this.spriteAtlas.setEventedParent(this),this.lineAtlas=new LineAtlas(256,512),this._layers={},this._order=[],this.sourceCaches={},this.zoomHistory={},this._loaded=!1,util.bindAll(["_redoPlacement"],this),this._resetUpdates(),i=util.extend({validate:"string"!=typeof t||!mapbox.isMapboxURL(t)},i),this.setEventedParent(r),this.fire("dataloading",{dataType:"style"});var s=this;this._rtlTextPluginCallback=rtlTextPlugin.registerForPluginAvailability(function(e){s.dispatcher.broadcast("loadRTLTextPlugin",e.pluginBlobURL,e.errorCallback);for(var t in s.sourceCaches)s.sourceCaches[t].reload();});var a=function(e,t){if(e)return void o.fire("error",{error:e});if(!i.validate||!validateStyle.emitErrors(o,validateStyle(t))){o._loaded=!0,o.stylesheet=t,o.updateClasses();for(var r in t.sources)o.addSource(r,t.sources[r],i);t.sprite&&(o.sprite=new ImageSprite(t.sprite,o)),o.glyphSource=new GlyphSource(t.glyphs),o._resolve(),o.fire("data",{dataType:"style"}),o.fire("style.load");}};"string"==typeof t?ajax.getJSON(mapbox.normalizeStyleURL(t),a):browser.frame(a.bind(this,null,t)),this.on("data",function(e){if("source"===e.dataType&&"metadata"===e.sourceDataType){var t=o.sourceCaches[e.sourceId].getSource();if(t&&t.vectorLayerIds)for(var r in o._layers){var i=o._layers[r];i.source===t.id&&o._validateLayer(i);}}});}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype._validateLayer=function(e){var t=this.sourceCaches[e.source];if(e.sourceLayer&&t){var r=t.getSource();("geojson"===r.type||r.vectorLayerIds&&r.vectorLayerIds.indexOf(e.sourceLayer)===-1)&&this.fire("error",{error:new Error('Source layer "'+e.sourceLayer+'" does not exist on source "'+r.id+'" as specified by style layer "'+e.id+'"')});}},t.prototype.loaded=function(){var e=this;if(!this._loaded)return!1;if(Object.keys(this._updatedSources).length)return!1;for(var t in e.sourceCaches)if(!e.sourceCaches[t].loaded())return!1;return!(this.sprite&&!this.sprite.loaded())},t.prototype._resolve=function(){var e=this,t=deref(this.stylesheet.layers);this._order=t.map(function(e){return e.id}),this._layers={};for(var r=0,i=t;r<i.length;r+=1){var o=i[r];o=StyleLayer.create(o),o.setEventedParent(e,{layer:{id:o.id}}),e._layers[o.id]=o;}this.dispatcher.broadcast("setLayers",this._serializeLayers(this._order)),this.light=new Light(this.stylesheet.light);},t.prototype._serializeLayers=function(e){var t=this;return e.map(function(e){return t._layers[e].serialize()})},t.prototype._applyClasses=function(e,t){var r=this;if(this._loaded){e=e||[],t=t||{transition:!0};var i=this.stylesheet.transition||{},o=this._updatedAllPaintProps?this._layers:this._updatedPaintProps;for(var s in o){var a=r._layers[s],n=r._updatedPaintProps[s];if(r._updatedAllPaintProps||n.all)a.updatePaintTransitions(e,t,i,r.animationLoop,r.zoomHistory);else for(var l in n)r._layers[s].updatePaintTransition(l,e,t,i,r.animationLoop,r.zoomHistory);}this.light.updateLightTransitions(t,i,this.animationLoop);}},t.prototype._recalculate=function(e){var t=this;if(this._loaded){for(var r in t.sourceCaches)t.sourceCaches[r].used=!1;this._updateZoomHistory(e);for(var i=0,o=t._order;i<o.length;i+=1){var s=o[i],a=t._layers[s];a.recalculate(e),!a.isHidden(e)&&a.source&&(t.sourceCaches[a.source].used=!0);}this.light.recalculate(e);var n=300;Math.floor(this.z)!==Math.floor(e)&&this.animationLoop.set(n),this.z=e;}},t.prototype._updateZoomHistory=function(e){var t=this.zoomHistory;void 0===t.lastIntegerZoom&&(t.lastIntegerZoom=Math.floor(e),t.lastIntegerZoomTime=0,t.lastZoom=e),Math.floor(t.lastZoom)<Math.floor(e)?(t.lastIntegerZoom=Math.floor(e),t.lastIntegerZoomTime=Date.now()):Math.floor(t.lastZoom)>Math.floor(e)&&(t.lastIntegerZoom=Math.floor(e+1),t.lastIntegerZoomTime=Date.now()),t.lastZoom=e;},t.prototype._checkLoaded=function(){if(!this._loaded)throw new Error("Style is not done loading")},t.prototype.update=function(e,t){var r=this;if(this._changed){var i=Object.keys(this._updatedLayers),o=Object.keys(this._removedLayers);(i.length||o.length||this._updatedSymbolOrder)&&this._updateWorkerLayers(i,o);for(var s in r._updatedSources){var a=r._updatedSources[s];"reload"===a?r._reloadSource(s):"clear"===a&&r._clearSource(s);}this._applyClasses(e,t),this._resetUpdates(),this.fire("data",{dataType:"style"});}},t.prototype._updateWorkerLayers=function(e,t){var r=this,i=this._updatedSymbolOrder?this._order.filter(function(e){return"symbol"===r._layers[e].type}):null;this.dispatcher.broadcast("updateLayers",{layers:this._serializeLayers(e),removedIds:t,symbolOrder:i});},t.prototype._resetUpdates=function(){this._changed=!1,this._updatedLayers={},this._removedLayers={},this._updatedSymbolOrder=!1,this._updatedSources={},this._updatedPaintProps={},this._updatedAllPaintProps=!1;},t.prototype.setState=function(e){var t=this;if(this._checkLoaded(),validateStyle.emitErrors(this,validateStyle(e)))return!1;e=util.extend({},e),e.layers=deref(e.layers);var r=diff(this.serialize(),e).filter(function(e){return!(e.command in ignoredDiffOperations)});if(0===r.length)return!1;var i=r.filter(function(e){return!(e.command in supportedDiffOperations)});if(i.length>0)throw new Error("Unimplemented: "+i.map(function(e){return e.command}).join(", ")+".");return r.forEach(function(e){"setTransition"!==e.command&&t[e.command].apply(t,e.args);}),this.stylesheet=e,!0},t.prototype.addSource=function(e,t,r){var i=this;if(this._checkLoaded(),void 0!==this.sourceCaches[e])throw new Error("There is already a source with this ID");if(!t.type)throw new Error("The type property must be defined, but the only the following properties were given: "+Object.keys(t)+".");var o=["vector","raster","geojson","video","image","canvas"],s=o.indexOf(t.type)>=0;if(!s||!this._validate(validateStyle.source,"sources."+e,t,null,r)){var a=this.sourceCaches[e]=new SourceCache(e,t,this.dispatcher);a.style=this,a.setEventedParent(this,function(){return{isSourceLoaded:i.loaded(),source:a.serialize(),sourceId:e}}),a.onAdd(this.map),this._changed=!0;}},t.prototype.removeSource=function(e){if(this._checkLoaded(),void 0===this.sourceCaches[e])throw new Error("There is no source with this ID");var t=this.sourceCaches[e];delete this.sourceCaches[e],delete this._updatedSources[e],t.setEventedParent(null),t.clearTiles(),t.onRemove&&t.onRemove(this.map),this._changed=!0;},t.prototype.getSource=function(e){return this.sourceCaches[e]&&this.sourceCaches[e].getSource()},t.prototype.addLayer=function(e,t,r){this._checkLoaded();var i=e.id;if("object"==typeof e.source&&(this.addSource(i,e.source),e=util.extend(e,{source:i})),!this._validate(validateStyle.layer,"layers."+i,e,{arrayIndex:-1},r)){var o=StyleLayer.create(e);this._validateLayer(o),o.setEventedParent(this,{layer:{id:i}});var s=t?this._order.indexOf(t):this._order.length;if(this._order.splice(s,0,i),this._layers[i]=o,this._removedLayers[i]&&o.source){var a=this._removedLayers[i];delete this._removedLayers[i],this._updatedSources[o.source]=a.type!==o.type?"clear":"reload";}this._updateLayer(o),"symbol"===o.type&&(this._updatedSymbolOrder=!0),this.updateClasses(i);}},t.prototype.moveLayer=function(e,t){this._checkLoaded(),this._changed=!0;var r=this._layers[e];if(!r)return void this.fire("error",{error:new Error("The layer '"+e+"' does not exist in the map's style and cannot be moved.")});var i=this._order.indexOf(e);this._order.splice(i,1);var o=t?this._order.indexOf(t):this._order.length;this._order.splice(o,0,e),"symbol"===r.type&&(this._updatedSymbolOrder=!0,r.source&&!this._updatedSources[r.source]&&(this._updatedSources[r.source]="reload"));},t.prototype.removeLayer=function(e){this._checkLoaded();var t=this._layers[e];if(!t)return void this.fire("error",{error:new Error("The layer '"+e+"' does not exist in the map's style and cannot be removed.")});t.setEventedParent(null);var r=this._order.indexOf(e);this._order.splice(r,1),"symbol"===t.type&&(this._updatedSymbolOrder=!0),this._changed=!0,this._removedLayers[e]=t,delete this._layers[e],delete this._updatedLayers[e],delete this._updatedPaintProps[e];},t.prototype.getLayer=function(e){return this._layers[e]},t.prototype.setLayerZoomRange=function(e,t,r){this._checkLoaded();var i=this.getLayer(e);return i?void(i.minzoom===t&&i.maxzoom===r||(null!=t&&(i.minzoom=t),null!=r&&(i.maxzoom=r),this._updateLayer(i))):void this.fire("error",{error:new Error("The layer '"+e+"' does not exist in the map's style and cannot have zoom extent.")})},t.prototype.setFilter=function(e,t){this._checkLoaded();var r=this.getLayer(e);return r?void(null!==t&&void 0!==t&&this._validate(validateStyle.filter,"layers."+r.id+".filter",t)||util.deepEqual(r.filter,t)||(r.filter=util.clone(t),this._updateLayer(r))):void this.fire("error",{error:new Error("The layer '"+e+"' does not exist in the map's style and cannot be filtered.")})},t.prototype.getFilter=function(e){return util.clone(this.getLayer(e).filter)},t.prototype.setLayoutProperty=function(e,t,r){this._checkLoaded();var i=this.getLayer(e);return i?void(util.deepEqual(i.getLayoutProperty(t),r)||(i.setLayoutProperty(t,r),this._updateLayer(i))):void this.fire("error",{error:new Error("The layer '"+e+"' does not exist in the map's style and cannot be styled.")})},t.prototype.getLayoutProperty=function(e,t){return this.getLayer(e).getLayoutProperty(t)},t.prototype.setPaintProperty=function(e,t,r,i){this._checkLoaded();var o=this.getLayer(e);if(!o)return void this.fire("error",{error:new Error("The layer '"+e+"' does not exist in the map's style and cannot be styled.")});if(!util.deepEqual(o.getPaintProperty(t,i),r)){var s=o.isPaintValueFeatureConstant(t);o.setPaintProperty(t,r,i);var a=!(r&&MapboxGLFunction.isFunctionDefinition(r)&&"$zoom"!==r.property&&void 0!==r.property);a&&s||this._updateLayer(o),this.updateClasses(e,t);}},t.prototype.getPaintProperty=function(e,t,r){return this.getLayer(e).getPaintProperty(t,r)},t.prototype.getTransition=function(){return util.extend({duration:300,delay:0},this.stylesheet&&this.stylesheet.transition)},t.prototype.updateClasses=function(e,t){if(this._changed=!0,e){var r=this._updatedPaintProps;r[e]||(r[e]={}),r[e][t||"all"]=!0;}else this._updatedAllPaintProps=!0;},t.prototype.serialize=function(){var e=this;return util.filterObject({version:this.stylesheet.version,name:this.stylesheet.name,metadata:this.stylesheet.metadata,light:this.stylesheet.light,center:this.stylesheet.center,zoom:this.stylesheet.zoom,bearing:this.stylesheet.bearing,pitch:this.stylesheet.pitch,sprite:this.stylesheet.sprite,glyphs:this.stylesheet.glyphs,transition:this.stylesheet.transition,sources:util.mapObject(this.sourceCaches,function(e){return e.serialize()}),layers:this._order.map(function(t){return e._layers[t].serialize()})},function(e){return void 0!==e})},t.prototype._updateLayer=function(e){this._updatedLayers[e.id]=!0,e.source&&!this._updatedSources[e.source]&&(this._updatedSources[e.source]="reload"),this._changed=!0;},t.prototype._flattenRenderedFeatures=function(e){for(var t=this,r=[],i=this._order.length-1;i>=0;i--)for(var o=t._order[i],s=0,a=e;s<a.length;s+=1){var n=a[s],l=n[o];if(l)for(var d=0,u=l;d<u.length;d+=1){var h=u[d];r.push(h);}}return r},t.prototype.queryRenderedFeatures=function(e,t,r,i){var o=this;t&&t.filter&&this._validate(validateStyle.filter,"queryRenderedFeatures.filter",t.filter);var s={};if(t&&t.layers){if(!Array.isArray(t.layers))return void this.fire("error",{error:"parameters.layers must be an Array."});for(var a=0,n=t.layers;a<n.length;a+=1){var l=n[a],d=o._layers[l];if(!d)return void o.fire("error",{error:"The layer '"+l+"' does not exist in the map's style and cannot be queried for features."});s[d.source]=!0;}}var u=[];for(var h in o.sourceCaches)if(!t.layers||s[h]){var c=QueryFeatures.rendered(o.sourceCaches[h],o._layers,e,t,r,i);u.push(c);}return this._flattenRenderedFeatures(u)},t.prototype.querySourceFeatures=function(e,t){t&&t.filter&&this._validate(validateStyle.filter,"querySourceFeatures.filter",t.filter);var r=this.sourceCaches[e];return r?QueryFeatures.source(r,t):[]},t.prototype.addSourceType=function(e,t,r){return Source.getType(e)?r(new Error('A source type called "'+e+'" already exists.')):(Source.setType(e,t),t.workerSourceURL?void this.dispatcher.broadcast("loadWorkerSource",{name:e,url:t.workerSourceURL},r):r(null,null))},t.prototype.getLight=function(){return this.light.getLight()},t.prototype.setLight=function(e,t){this._checkLoaded();var r=this.light.getLight(),i=!1;for(var o in e)if(!util.deepEqual(e[o],r[o])){i=!0;break}if(i){var s=this.stylesheet.transition||{};this.light.setLight(e),this.light.updateLightTransitions(t||{transition:!0},s,this.animationLoop);}},t.prototype._validate=function(e,t,r,i,o){return(!o||o.validate!==!1)&&validateStyle.emitErrors(this,e.call(validateStyle,util.extend({key:t,style:this.serialize(),value:r,styleSpec:styleSpec},i)))},t.prototype._remove=function(){var e=this;rtlTextPlugin.evented.off("pluginAvailable",this._rtlTextPluginCallback);for(var t in e.sourceCaches)e.sourceCaches[t].clearTiles();this.dispatcher.remove();},t.prototype._clearSource=function(e){this.sourceCaches[e].clearTiles();},t.prototype._reloadSource=function(e){this.sourceCaches[e].reload();},t.prototype._updateSources=function(e){var t=this;for(var r in t.sourceCaches)t.sourceCaches[r].update(e);},t.prototype._redoPlacement=function(){var e=this;for(var t in e.sourceCaches)e.sourceCaches[t].redoPlacement();},t.prototype.getIcons=function(e,t,r){var i=this,o=function(){i.spriteAtlas.setSprite(i.sprite),i.spriteAtlas.addIcons(t.icons,r);};!this.sprite||this.sprite.loaded()?o():this.sprite.on("data",o);},t.prototype.getGlyphs=function(e,t,r){function i(e,t,i){e&&console.error(e),n[i]=t,a--,0===a&&r(null,n);}var o=this,s=t.stacks,a=Object.keys(s).length,n={};for(var l in s)o.glyphSource.getSimpleGlyphs(l,s[l],t.uid,i);},t}(Evented);module.exports=Style;
; |
327 | },{"../render/line_atlas":76,"../source/query_features":89,"../source/rtl_text_plugin":91,"../source/source":92,"../source/source_cache":93,"../style-spec/deref":102,"../style-spec/diff":103,"../style-spec/function":107,"../style-spec/reference/latest":119,"../symbol/glyph_source":168,"../symbol/sprite_atlas":172,"../util/ajax":194,"../util/browser":195,"../util/dispatcher":201,"../util/evented":203,"../util/global_worker_pool":205,"../util/mapbox":210,"../util/util":215,"./animation_loop":146,"./image_sprite":147,"./light":148,"./style_layer":151,"./validate_style":159}],150:[function(_dereq_,module,exports){
|
328 | var createFunction=_dereq_("../style-spec/function"),util=_dereq_("../util/util"),StyleDeclaration=function(t,i){var o=this;if(this.value=util.clone(i),this.isFunction=createFunction.isFunctionDefinition(i),this.json=JSON.stringify(this.value),this.minimum=t.minimum,this.function=createFunction(this.value,t),this.isFeatureConstant=this.function.isFeatureConstant,this.isZoomConstant=this.function.isZoomConstant,this.isFeatureConstant||this.isZoomConstant){if(!this.isZoomConstant){this.stopZoomLevels=[];for(var n=0,s=o.value.stops;n<s.length;n+=1){var e=s[n];o.stopZoomLevels.indexOf(e[0])<0&&o.stopZoomLevels.push(e[0]);}}}else{this.stopZoomLevels=[];for(var a=[],u=0,l=o.value.stops;u<l.length;u+=1){var r=l[u],c=r[0].zoom;o.stopZoomLevels.indexOf(c)<0&&(o.stopZoomLevels.push(c),a.push([c,a.length]));}this._functionInterpolationT=createFunction({type:"exponential",stops:a,base:i.base},{type:"number"});}};StyleDeclaration.prototype.calculate=function(t,i){var o=this.function(t&&t.zoom,i||{});return void 0!==this.minimum&&o<this.minimum?this.minimum:o},StyleDeclaration.prototype.calculateInterpolationT=function(t){return this.isFeatureConstant||this.isZoomConstant?0:this._functionInterpolationT(t&&t.zoom,{})},module.exports=StyleDeclaration;
; |
329 | },{"../style-spec/function":107,"../util/util":215}],151:[function(_dereq_,module,exports){
|
330 | function getDeclarationValue(t){return t.value}var util=_dereq_("../util/util"),StyleTransition=_dereq_("./style_transition"),StyleDeclaration=_dereq_("./style_declaration"),styleSpec=_dereq_("../style-spec/reference/latest"),validateStyle=_dereq_("./validate_style"),parseColor=_dereq_("./../style-spec/util/parse_color"),Evented=_dereq_("../util/evented"),TRANSITION_SUFFIX="-transition",StyleLayer=function(t){function i(i){var a=this;t.call(this),this.id=i.id,this.metadata=i.metadata,this.type=i.type,this.source=i.source,this.sourceLayer=i["source-layer"],this.minzoom=i.minzoom,this.maxzoom=i.maxzoom,this.filter=i.filter,this.paint={},this.layout={},this._paintSpecifications=styleSpec["paint_"+this.type],this._layoutSpecifications=styleSpec["layout_"+this.type],this._paintTransitions={},this._paintTransitionOptions={},this._paintDeclarations={},this._layoutDeclarations={},this._layoutFunctions={};var e,o,n={validate:!1};for(var r in i){var s=r.match(/^paint(?:\.(.*))?$/);if(s){var l=s[1]||"";for(e in i[r])a.setPaintProperty(e,i[r][e],l,n);}}for(o in i.layout)a.setLayoutProperty(o,i.layout[o],n);for(e in a._paintSpecifications)a.paint[e]=a.getPaintValue(e);for(o in a._layoutSpecifications)a._updateLayoutValue(o);}return t&&(i.__proto__=t),i.prototype=Object.create(t&&t.prototype),i.prototype.constructor=i,i.prototype.setLayoutProperty=function(t,i,a){if(null==i)delete this._layoutDeclarations[t];else{var e="layers."+this.id+".layout."+t;if(this._validate(validateStyle.layoutProperty,e,t,i,a))return;this._layoutDeclarations[t]=new StyleDeclaration(this._layoutSpecifications[t],i);}this._updateLayoutValue(t);},i.prototype.getLayoutProperty=function(t){return this._layoutDeclarations[t]&&this._layoutDeclarations[t].value},i.prototype.getLayoutValue=function(t,i,a){var e=this._layoutSpecifications[t],o=this._layoutDeclarations[t];return o?o.calculate(i,a):e.default},i.prototype.setPaintProperty=function(t,i,a,e){var o="layers."+this.id+(a?'["paint.'+a+'"].':".paint.")+t;if(util.endsWith(t,TRANSITION_SUFFIX))if(this._paintTransitionOptions[a||""]||(this._paintTransitionOptions[a||""]={}),null===i||void 0===i)delete this._paintTransitionOptions[a||""][t];else{if(this._validate(validateStyle.paintProperty,o,t,i,e))return;this._paintTransitionOptions[a||""][t]=i;}else if(this._paintDeclarations[a||""]||(this._paintDeclarations[a||""]={}),null===i||void 0===i)delete this._paintDeclarations[a||""][t];else{if(this._validate(validateStyle.paintProperty,o,t,i,e))return;this._paintDeclarations[a||""][t]=new StyleDeclaration(this._paintSpecifications[t],i);}},i.prototype.getPaintProperty=function(t,i){return i=i||"",util.endsWith(t,TRANSITION_SUFFIX)?this._paintTransitionOptions[i]&&this._paintTransitionOptions[i][t]:this._paintDeclarations[i]&&this._paintDeclarations[i][t]&&this._paintDeclarations[i][t].value},i.prototype.getPaintValue=function(t,i,a){var e=this._paintSpecifications[t],o=this._paintTransitions[t];return o?o.calculate(i,a):"color"===e.type&&e.default?parseColor(e.default):e.default},i.prototype.getPaintValueStopZoomLevels=function(t){var i=this._paintTransitions[t];return i?i.declaration.stopZoomLevels:[]},i.prototype.getLayoutValueStopZoomLevels=function(t){var i=this._layoutDeclarations[t];return i?i.stopZoomLevels:[]},i.prototype.getPaintInterpolationT=function(t,i){var a=this._paintTransitions[t];return a.declaration.calculateInterpolationT(i)},i.prototype.getLayoutInterpolationT=function(t,i){var a=this._layoutDeclarations[t];return a.calculateInterpolationT(i)},i.prototype.isPaintValueFeatureConstant=function(t){var i=this._paintTransitions[t];return!i||i.declaration.isFeatureConstant},i.prototype.isLayoutValueFeatureConstant=function(t){var i=this._layoutDeclarations[t];return!i||i.isFeatureConstant},i.prototype.isPaintValueZoomConstant=function(t){var i=this._paintTransitions[t];return!i||i.declaration.isZoomConstant},i.prototype.isLayoutValueZoomConstant=function(t){var i=this._layoutDeclarations[t];return!i||i.isZoomConstant},i.prototype.isHidden=function(t){return!!(this.minzoom&&t<this.minzoom)||(!!(this.maxzoom&&t>=this.maxzoom)||"none"===this.layout.visibility)},i.prototype.updatePaintTransitions=function(t,i,a,e,o){for(var n=this,r=util.extend({},this._paintDeclarations[""]),s=0;s<t.length;s++)util.extend(r,n._paintDeclarations[t[s]]);var l;for(l in r)n._applyPaintDeclaration(l,r[l],i,a,e,o);for(l in n._paintTransitions)l in r||n._applyPaintDeclaration(l,null,i,a,e,o);},i.prototype.updatePaintTransition=function(t,i,a,e,o,n){for(var r=this,s=this._paintDeclarations[""][t],l=0;l<i.length;l++){var u=r._paintDeclarations[i[l]];u&&u[t]&&(s=u[t]);}this._applyPaintDeclaration(t,s,a,e,o,n);},i.prototype.recalculate=function(t){var i=this;for(var a in i._paintTransitions)i.paint[a]=i.getPaintValue(a,{zoom:t});for(var e in i._layoutFunctions)i.layout[e]=i.getLayoutValue(e,{zoom:t});},i.prototype.serialize=function(){var t=this,i={id:this.id,type:this.type,source:this.source,"source-layer":this.sourceLayer,metadata:this.metadata,minzoom:this.minzoom,maxzoom:this.maxzoom,filter:this.filter,layout:util.mapObject(this._layoutDeclarations,getDeclarationValue)};for(var a in t._paintDeclarations){var e=""===a?"paint":"paint."+a;i[e]=util.mapObject(t._paintDeclarations[a],getDeclarationValue);}return util.filterObject(i,function(t,i){return void 0!==t&&!("layout"===i&&!Object.keys(t).length)})},i.prototype._applyPaintDeclaration=function(t,i,a,e,o,n){var r=a.transition?this._paintTransitions[t]:void 0,s=this._paintSpecifications[t];if(null!==i&&void 0!==i||(i=new StyleDeclaration(s,s.default)),!r||r.declaration.json!==i.json){var l=util.extend({duration:300,delay:0},e,this.getPaintProperty(t+TRANSITION_SUFFIX)),u=this._paintTransitions[t]=new StyleTransition(s,i,r,l,n);u.instant()||(u.loopID=o.set(u.endTime-Date.now())),r&&o.cancel(r.loopID);}},i.prototype._updateLayoutValue=function(t){var i=this._layoutDeclarations[t];i&&i.isFunction?this._layoutFunctions[t]=!0:(delete this._layoutFunctions[t],this.layout[t]=this.getLayoutValue(t));},i.prototype._validate=function(t,i,a,e,o){return(!o||o.validate!==!1)&&validateStyle.emitErrors(this,t.call(validateStyle,{key:i,layerType:this.type,objectKey:a,value:e,styleSpec:styleSpec,style:{glyphs:!0,sprite:!0}}))},i}(Evented);module.exports=StyleLayer;var subclasses={circle:_dereq_("./style_layer/circle_style_layer"),fill:_dereq_("./style_layer/fill_style_layer"),"fill-extrusion":_dereq_("./style_layer/fill_extrusion_style_layer"),line:_dereq_("./style_layer/line_style_layer"),symbol:_dereq_("./style_layer/symbol_style_layer")};StyleLayer.create=function(t){var i=subclasses[t.type]||StyleLayer;return new i(t)};
; |
331 | },{"../style-spec/reference/latest":119,"../util/evented":203,"../util/util":215,"./../style-spec/util/parse_color":124,"./style_declaration":150,"./style_layer/circle_style_layer":152,"./style_layer/fill_extrusion_style_layer":153,"./style_layer/fill_style_layer":154,"./style_layer/line_style_layer":155,"./style_layer/symbol_style_layer":156,"./style_transition":158,"./validate_style":159}],152:[function(_dereq_,module,exports){
|
332 | var StyleLayer=_dereq_("../style_layer"),CircleBucket=_dereq_("../../data/bucket/circle_bucket"),CircleStyleLayer=function(e){function t(){e.apply(this,arguments);}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.createBucket=function(e){return new CircleBucket(e)},t}(StyleLayer);module.exports=CircleStyleLayer;
; |
333 | },{"../../data/bucket/circle_bucket":46,"../style_layer":151}],153:[function(_dereq_,module,exports){
|
334 | var StyleLayer=_dereq_("../style_layer"),FillExtrusionBucket=_dereq_("../../data/bucket/fill_extrusion_bucket"),FillExtrusionStyleLayer=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getPaintValue=function(e,r,o){var l=t.prototype.getPaintValue.call(this,e,r,o);return"fill-extrusion-color"===e&&l&&(l[3]=1),l},e.prototype.createBucket=function(t){return new FillExtrusionBucket(t)},e}(StyleLayer);module.exports=FillExtrusionStyleLayer;
; |
335 | },{"../../data/bucket/fill_extrusion_bucket":48,"../style_layer":151}],154:[function(_dereq_,module,exports){
|
336 | var StyleLayer=_dereq_("../style_layer"),FillBucket=_dereq_("../../data/bucket/fill_bucket"),FillStyleLayer=function(t){function o(){t.apply(this,arguments);}return t&&(o.__proto__=t),o.prototype=Object.create(t&&t.prototype),o.prototype.constructor=o,o.prototype.getPaintValue=function(o,l,e){var i=this;if("fill-outline-color"===o){if(void 0===this.getPaintProperty("fill-outline-color"))return t.prototype.getPaintValue.call(this,"fill-color",l,e);for(var r=this._paintTransitions["fill-outline-color"];r;){var n=r&&r.declaration&&r.declaration.value;if(!n)return t.prototype.getPaintValue.call(i,"fill-color",l,e);r=r.oldTransition;}}return t.prototype.getPaintValue.call(this,o,l,e)},o.prototype.getPaintValueStopZoomLevels=function(o){return"fill-outline-color"===o&&void 0===this.getPaintProperty("fill-outline-color")?t.prototype.getPaintValueStopZoomLevels.call(this,"fill-color"):t.prototype.getPaintValueStopZoomLevels.call(this,o)},o.prototype.getPaintInterpolationT=function(o,l){return"fill-outline-color"===o&&void 0===this.getPaintProperty("fill-outline-color")?t.prototype.getPaintInterpolationT.call(this,"fill-color",l):t.prototype.getPaintInterpolationT.call(this,o,l)},o.prototype.isPaintValueFeatureConstant=function(o){return"fill-outline-color"===o&&void 0===this.getPaintProperty("fill-outline-color")?t.prototype.isPaintValueFeatureConstant.call(this,"fill-color"):t.prototype.isPaintValueFeatureConstant.call(this,o)},o.prototype.isPaintValueZoomConstant=function(o){return"fill-outline-color"===o&&void 0===this.getPaintProperty("fill-outline-color")?t.prototype.isPaintValueZoomConstant.call(this,"fill-color"):t.prototype.isPaintValueZoomConstant.call(this,o)},o.prototype.createBucket=function(t){return new FillBucket(t)},o}(StyleLayer);module.exports=FillStyleLayer;
; |
337 | },{"../../data/bucket/fill_bucket":47,"../style_layer":151}],155:[function(_dereq_,module,exports){
|
338 | var StyleLayer=_dereq_("../style_layer"),LineBucket=_dereq_("../../data/bucket/line_bucket"),util=_dereq_("../../util/util"),LineStyleLayer=function(e){function t(){e.apply(this,arguments);}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.getPaintValue=function(t,r,o){var i=e.prototype.getPaintValue.call(this,t,r,o);if(i&&"line-dasharray"===t){var a=this.getPaintValue("line-width",util.extend({},r,{zoom:Math.floor(r.zoom)}),o);i.fromScale*=a,i.toScale*=a;}return i},t.prototype.createBucket=function(e){return new LineBucket(e)},t}(StyleLayer);module.exports=LineStyleLayer;
; |
339 | },{"../../data/bucket/line_bucket":49,"../../util/util":215,"../style_layer":151}],156:[function(_dereq_,module,exports){
|
340 | var StyleLayer=_dereq_("../style_layer"),SymbolBucket=_dereq_("../../data/bucket/symbol_bucket"),SymbolStyleLayer=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getLayoutValue=function(e,o,r){var a=t.prototype.getLayoutValue.call(this,e,o,r);if("auto"!==a)return a;switch(e){case"text-rotation-alignment":case"icon-rotation-alignment":return"line"===this.getLayoutValue("symbol-placement",o,r)?"map":"viewport";case"text-pitch-alignment":return this.getLayoutValue("text-rotation-alignment",o,r);default:return a}},e.prototype.createBucket=function(t){return new SymbolBucket(t)},e}(StyleLayer);module.exports=SymbolStyleLayer;
; |
341 | },{"../../data/bucket/symbol_bucket":50,"../style_layer":151}],157:[function(_dereq_,module,exports){
|
342 | var StyleLayer=_dereq_("./style_layer"),util=_dereq_("../util/util"),featureFilter=_dereq_("../style-spec/feature_filter"),groupByLayout=_dereq_("../style-spec/group_by_layout"),StyleLayerIndex=function(e){e&&this.replace(e);};StyleLayerIndex.prototype.replace=function(e){var r=this;this.symbolOrder=[];for(var t=0,i=e;t<i.length;t+=1){var a=i[t];"symbol"===a.type&&r.symbolOrder.push(a.id);}this._layerConfigs={},this._layers={},this.update(e,[]);},StyleLayerIndex.prototype.update=function(e,r,t){for(var i=this,a=0,l=e;a<l.length;a+=1){var y=l[a];i._layerConfigs[y.id]=y;var s=i._layers[y.id]=StyleLayer.create(y);s.updatePaintTransitions({},{transition:!1}),s.filter=featureFilter(s.filter);}for(var o=0,u=r;o<u.length;o+=1){var n=u[o];delete i._layerConfigs[n],delete i._layers[n];}t&&(this.symbolOrder=t),this.familiesBySource={};for(var f=groupByLayout(util.values(this._layerConfigs)),p=0,d=f;p<d.length;p+=1){var h=d[p],c=h.map(function(e){return i._layers[e.id]}),v=c[0];if(!v.layout||"none"!==v.layout.visibility){var _=v.source||"",g=i.familiesBySource[_];g||(g=i.familiesBySource[_]={});var L=v.sourceLayer||"_geojsonTileLayer",m=g[L];m||(m=g[L]=[]),m.push(c);}}},module.exports=StyleLayerIndex;
; |
343 | },{"../style-spec/feature_filter":105,"../style-spec/group_by_layout":108,"../util/util":215,"./style_layer":151}],158:[function(_dereq_,module,exports){
|
344 | function interpZoomTransitioned(t,i,e){if(void 0!==t&&void 0!==i)return{from:t.to,fromScale:t.toScale,to:i.to,toScale:i.toScale,t:e}}var util=_dereq_("../util/util"),interpolate=_dereq_("../style-spec/util/interpolate"),fakeZoomHistory={lastIntegerZoom:0,lastIntegerZoomTime:0,lastZoom:0},StyleTransition=function(t,i,e,o,a){this.declaration=i,this.startTime=this.endTime=(new Date).getTime(),this.oldTransition=e,this.duration=o.duration||0,this.delay=o.delay||0,this.zoomTransitioned="piecewise-constant"===t.function&&t.transition,this.interp=this.zoomTransitioned?interpZoomTransitioned:interpolate[t.type],this.zoomHistory=a||fakeZoomHistory,this.instant()||(this.endTime=this.startTime+this.duration+this.delay),e&&e.endTime<=this.startTime&&delete e.oldTransition;};StyleTransition.prototype.instant=function(){return!this.oldTransition||!this.interp||0===this.duration&&0===this.delay},StyleTransition.prototype.calculate=function(t,i,e){var o=this._calculateTargetValue(t,i);if(this.instant())return o;if(e=e||Date.now(),e>=this.endTime)return o;var a=this.oldTransition.calculate(t,i,this.startTime),n=util.easeCubicInOut((e-this.startTime-this.delay)/this.duration);return this.interp(a,o,n)},StyleTransition.prototype._calculateTargetValue=function(t,i){if(!this.zoomTransitioned)return this.declaration.calculate(t,i);var e=t.zoom,o=this.zoomHistory.lastIntegerZoom,a=e>o?2:.5,n=this.declaration.calculate({zoom:e>o?e-1:e+1},i),r=this.declaration.calculate({zoom:e},i),s=Math.min((Date.now()-this.zoomHistory.lastIntegerZoomTime)/this.duration,1),l=Math.abs(e-o),u=interpolate(s,1,l);return void 0!==n&&void 0!==r?{from:n,fromScale:a,to:r,toScale:1,t:u}:void 0},module.exports=StyleTransition;
; |
345 | },{"../style-spec/util/interpolate":123,"../util/util":215}],159:[function(_dereq_,module,exports){
|
346 | module.exports=_dereq_("../style-spec/validate_style.min"),module.exports.emitErrors=function(r,e){if(e&&e.length){for(var t=0;t<e.length;t++)r.fire("error",{error:new Error(e[t].message)});return!0}return!1};
; |
347 | },{"../style-spec/validate_style.min":145}],160:[function(_dereq_,module,exports){
|
348 | var Point=_dereq_("point-geometry"),Anchor=function(t){function o(o,e,n,r){t.call(this,o,e),this.angle=n,void 0!==r&&(this.segment=r);}return t&&(o.__proto__=t),o.prototype=Object.create(t&&t.prototype),o.prototype.constructor=o,o.prototype.clone=function(){return new o(this.x,this.y,this.angle,this.segment)},o}(Point);module.exports=Anchor;
; |
349 | },{"point-geometry":26}],161:[function(_dereq_,module,exports){
|
350 | function checkMaxAngle(e,t,a,r,n){if(void 0===t.segment)return!0;for(var i=t,s=t.segment+1,f=0;f>-a/2;){if(s--,s<0)return!1;f-=e[s].dist(i),i=e[s];}f+=e[s].dist(e[s+1]),s++;for(var l=[],o=0;f<a/2;){var u=e[s-1],c=e[s],g=e[s+1];if(!g)return!1;var h=u.angleTo(c)-c.angleTo(g);for(h=Math.abs((h+3*Math.PI)%(2*Math.PI)-Math.PI),l.push({distance:f,angleDelta:h}),o+=h;f-l[0].distance>r;)o-=l.shift().angleDelta;if(o>n)return!1;s++,f+=c.dist(g);}return!0}module.exports=checkMaxAngle;
; |
351 | },{}],162:[function(_dereq_,module,exports){
|
352 | function clipLine(n,x,y,o,e){for(var r=[],t=0;t<n.length;t++)for(var i=n[t],u=void 0,d=0;d<i.length-1;d++){var P=i[d],w=i[d+1];P.x<x&&w.x<x||(P.x<x?P=new Point(x,P.y+(w.y-P.y)*((x-P.x)/(w.x-P.x)))._round():w.x<x&&(w=new Point(x,P.y+(w.y-P.y)*((x-P.x)/(w.x-P.x)))._round()),P.y<y&&w.y<y||(P.y<y?P=new Point(P.x+(w.x-P.x)*((y-P.y)/(w.y-P.y)),y)._round():w.y<y&&(w=new Point(P.x+(w.x-P.x)*((y-P.y)/(w.y-P.y)),y)._round()),P.x>=o&&w.x>=o||(P.x>=o?P=new Point(o,P.y+(w.y-P.y)*((o-P.x)/(w.x-P.x)))._round():w.x>=o&&(w=new Point(o,P.y+(w.y-P.y)*((o-P.x)/(w.x-P.x)))._round()),P.y>=e&&w.y>=e||(P.y>=e?P=new Point(P.x+(w.x-P.x)*((e-P.y)/(w.y-P.y)),e)._round():w.y>=e&&(w=new Point(P.x+(w.x-P.x)*((e-P.y)/(w.y-P.y)),e)._round()),u&&P.equals(u[u.length-1])||(u=[P],r.push(u)),u.push(w)))));}return r}var Point=_dereq_("point-geometry");module.exports=clipLine;
; |
353 | },{"point-geometry":26}],163:[function(_dereq_,module,exports){
|
354 | var createStructArrayType=_dereq_("../util/struct_array"),Point=_dereq_("point-geometry"),CollisionBoxArray=createStructArrayType({members:[{type:"Int16",name:"anchorPointX"},{type:"Int16",name:"anchorPointY"},{type:"Int16",name:"x1"},{type:"Int16",name:"y1"},{type:"Int16",name:"x2"},{type:"Int16",name:"y2"},{type:"Float32",name:"maxScale"},{type:"Uint32",name:"featureIndex"},{type:"Uint16",name:"sourceLayerIndex"},{type:"Uint16",name:"bucketIndex"},{type:"Int16",name:"bbox0"},{type:"Int16",name:"bbox1"},{type:"Int16",name:"bbox2"},{type:"Int16",name:"bbox3"},{type:"Float32",name:"placementScale"}]});Object.defineProperty(CollisionBoxArray.prototype.StructType.prototype,"anchorPoint",{get:function(){return new Point(this.anchorPointX,this.anchorPointY)}}),module.exports=CollisionBoxArray;
; |
355 | },{"../util/struct_array":213,"point-geometry":26}],164:[function(_dereq_,module,exports){
|
356 | var CollisionFeature=function(t,e,i,o,s,a,n,r,l,d,u){var h=n.top*r-l,x=n.bottom*r+l,f=n.left*r-l,m=n.right*r+l;if(this.boxStartIndex=t.length,d){var _=x-h,b=m-f;if(_>0)if(_=Math.max(10*r,_),u){var v=e[i.segment+1].sub(e[i.segment])._unit()._mult(b),c=[i.sub(v),i.add(v)];this._addLineCollisionBoxes(t,c,i,0,b,_,o,s,a);}else this._addLineCollisionBoxes(t,e,i,i.segment,b,_,o,s,a);}else t.emplaceBack(i.x,i.y,f,h,m,x,1/0,o,s,a,0,0,0,0,0);this.boxEndIndex=t.length;};CollisionFeature.prototype._addLineCollisionBoxes=function(t,e,i,o,s,a,n,r,l){var d=a/2,u=Math.floor(s/d),h=-a/2,x=this.boxes,f=i,m=o+1,_=h;do{if(m--,m<0)return x;_-=e[m].dist(f),f=e[m];}while(_>-s/2);for(var b=e[m].dist(e[m+1]),v=0;v<u;v++){for(var c=-s/2+v*d;_+b<c;){if(_+=b,m++,m+1>=e.length)return x;b=e[m].dist(e[m+1]);}var g=c-_,p=e[m],C=e[m+1],B=C.sub(p)._unit()._mult(g)._add(p)._round(),M=Math.max(Math.abs(c-h)-d/2,0),y=s/2/M;t.emplaceBack(B.x,B.y,-a/2,-a/2,a/2,a/2,y,n,r,l,0,0,0,0,0);}return x},module.exports=CollisionFeature;
; |
357 | },{}],165:[function(_dereq_,module,exports){
|
358 | var Point=_dereq_("point-geometry"),EXTENT=_dereq_("../data/extent"),Grid=_dereq_("grid-index"),intersectionTests=_dereq_("../util/intersection_tests"),CollisionTile=function(t,e,i){if("object"==typeof t){var r=t;i=e,t=r.angle,e=r.pitch,this.grid=new Grid(r.grid),this.ignoredGrid=new Grid(r.ignoredGrid);}else this.grid=new Grid(EXTENT,12,6),this.ignoredGrid=new Grid(EXTENT,12,0);this.minScale=.5,this.maxScale=2,this.angle=t,this.pitch=e;var a=Math.sin(t),o=Math.cos(t);if(this.rotationMatrix=[o,-a,a,o],this.reverseRotationMatrix=[o,a,-a,o],this.yStretch=1/Math.cos(e/180*Math.PI),this.yStretch=Math.pow(this.yStretch,1.3),this.collisionBoxArray=i,0===i.length){i.emplaceBack();var n=32767;i.emplaceBack(0,0,0,-n,0,n,n,0,0,0,0,0,0,0,0,0),i.emplaceBack(EXTENT,0,0,-n,0,n,n,0,0,0,0,0,0,0,0,0),i.emplaceBack(0,0,-n,0,n,0,n,0,0,0,0,0,0,0,0,0),i.emplaceBack(0,EXTENT,-n,0,n,0,n,0,0,0,0,0,0,0,0,0);}this.tempCollisionBox=i.get(0),this.edges=[i.get(1),i.get(2),i.get(3),i.get(4)];};CollisionTile.prototype.serialize=function(t){var e=this.grid.toArrayBuffer(),i=this.ignoredGrid.toArrayBuffer();return t&&(t.push(e),t.push(i)),{angle:this.angle,pitch:this.pitch,grid:e,ignoredGrid:i}},CollisionTile.prototype.placeCollisionFeature=function(t,e,i){for(var r=this,a=this.collisionBoxArray,o=this.minScale,n=this.rotationMatrix,l=this.yStretch,h=t.boxStartIndex;h<t.boxEndIndex;h++){var s=a.get(h),x=s.anchorPoint._matMult(n),c=x.x,g=x.y,y=c+s.x1,d=g+s.y1*l,m=c+s.x2,u=g+s.y2*l;if(s.bbox0=y,s.bbox1=d,s.bbox2=m,s.bbox3=u,!e)for(var p=r.grid.query(y,d,m,u),M=0;M<p.length;M++){var f=a.get(p[M]),v=f.anchorPoint._matMult(n);if(o=r.getPlacementScale(o,x,s,v,f),o>=r.maxScale)return o}if(i){var S=void 0;if(r.angle){var P=r.reverseRotationMatrix,b=new Point(s.x1,s.y1).matMult(P),T=new Point(s.x2,s.y1).matMult(P),w=new Point(s.x1,s.y2).matMult(P),N=new Point(s.x2,s.y2).matMult(P);S=r.tempCollisionBox,S.anchorPointX=s.anchorPoint.x,S.anchorPointY=s.anchorPoint.y,S.x1=Math.min(b.x,T.x,w.x,N.x),S.y1=Math.min(b.y,T.x,w.x,N.x),S.x2=Math.max(b.x,T.x,w.x,N.x),S.y2=Math.max(b.y,T.x,w.x,N.x),S.maxScale=s.maxScale;}else S=s;for(var B=0;B<this.edges.length;B++){var G=r.edges[B];if(o=r.getPlacementScale(o,s.anchorPoint,S,G.anchorPoint,G),o>=r.maxScale)return o}}}return o},CollisionTile.prototype.queryRenderedSymbols=function(t,e){var i={},r=[];if(0===t.length||0===this.grid.length&&0===this.ignoredGrid.length)return r;for(var a=this.collisionBoxArray,o=this.rotationMatrix,n=this.yStretch,l=[],h=1/0,s=1/0,x=-(1/0),c=-(1/0),g=0;g<t.length;g++)for(var y=t[g],d=0;d<y.length;d++){var m=y[d].matMult(o);h=Math.min(h,m.x),s=Math.min(s,m.y),x=Math.max(x,m.x),c=Math.max(c,m.y),l.push(m);}for(var u=this.grid.query(h,s,x,c),p=this.ignoredGrid.query(h,s,x,c),M=0;M<p.length;M++)u.push(p[M]);for(var f=Math.pow(2,Math.ceil(Math.log(e)/Math.LN2*10)/10),v=0;v<u.length;v++){var S=a.get(u[v]),P=S.sourceLayerIndex,b=S.featureIndex;if(void 0===i[P]&&(i[P]={}),!i[P][b]&&!(f<S.placementScale||f>S.maxScale)){var T=S.anchorPoint.matMult(o),w=T.x+S.x1/e,N=T.y+S.y1/e*n,B=T.x+S.x2/e,G=T.y+S.y2/e*n,E=[new Point(w,N),new Point(B,N),new Point(B,G),new Point(w,G)];intersectionTests.polygonIntersectsPolygon(l,E)&&(i[P][b]=!0,r.push(u[v]));}}return r},CollisionTile.prototype.getPlacementScale=function(t,e,i,r,a){var o=e.x-r.x,n=e.y-r.y,l=(a.x1-i.x2)/o,h=(a.x2-i.x1)/o,s=(a.y1-i.y2)*this.yStretch/n,x=(a.y2-i.y1)*this.yStretch/n;(isNaN(l)||isNaN(h))&&(l=h=1),(isNaN(s)||isNaN(x))&&(s=x=1);var c=Math.min(Math.max(l,h),Math.max(s,x)),g=a.maxScale,y=i.maxScale;return c>g&&(c=g),c>y&&(c=y),c>t&&c>=a.placementScale&&(t=c),t},CollisionTile.prototype.insertCollisionFeature=function(t,e,i){for(var r=this,a=i?this.ignoredGrid:this.grid,o=this.collisionBoxArray,n=t.boxStartIndex;n<t.boxEndIndex;n++){var l=o.get(n);l.placementScale=e,e<r.maxScale&&a.insert(n,l.bbox0,l.bbox1,l.bbox2,l.bbox3);}},module.exports=CollisionTile;
; |
359 | },{"../data/extent":54,"../util/intersection_tests":207,"grid-index":16,"point-geometry":26}],166:[function(_dereq_,module,exports){
|
360 | function getAnchors(e,r,t,n,a,l,o,i,c){var h=n?.6*l*o:0,s=Math.max(n?n.right-n.left:0,a?a.right-a.left:0),u=0===e[0].x||e[0].x===c||0===e[0].y||e[0].y===c;r-s*o<r/4&&(r=s*o+r/4);var g=2*l,p=u?r/2*i%r:(s/2+g)*o*i%r;return resample(e,p,r,h,t,s*o,u,!1,c)}function resample(e,r,t,n,a,l,o,i,c){for(var h=l/2,s=0,u=0;u<e.length-1;u++)s+=e[u].dist(e[u+1]);for(var g=0,p=r-t,x=[],f=0;f<e.length-1;f++){for(var v=e[f],m=e[f+1],y=v.dist(m),A=m.angleTo(v);p+t<g+y;){p+=t;var d=(p-g)/y,k=interpolate(v.x,m.x,d),q=interpolate(v.y,m.y,d);if(k>=0&&k<c&&q>=0&&q<c&&p-h>=0&&p+h<=s){var M=new Anchor(k,q,A,f)._round();n&&!checkMaxAngle(e,M,l,n,a)||x.push(M);}}g+=y;}return i||x.length||o||(x=resample(e,g/2,t,n,a,l,o,!0,c)),x}var interpolate=_dereq_("../style-spec/util/interpolate"),Anchor=_dereq_("../symbol/anchor"),checkMaxAngle=_dereq_("./check_max_angle");module.exports=getAnchors;
; |
361 | },{"../style-spec/util/interpolate":123,"../symbol/anchor":160,"./check_max_angle":161}],167:[function(_dereq_,module,exports){
|
362 | var ShelfPack=_dereq_("@mapbox/shelf-pack"),util=_dereq_("../util/util"),SIZE_GROWTH_RATE=4,DEFAULT_SIZE=128,MAX_SIZE=2048,GlyphAtlas=function(){this.width=DEFAULT_SIZE,this.height=DEFAULT_SIZE,this.atlas=new ShelfPack(this.width,this.height),this.index={},this.ids={},this.data=new Uint8Array(this.width*this.height);};GlyphAtlas.prototype.getGlyphs=function(){var t,i,e,h=this,r={};for(var s in h.ids)t=s.split("#"),i=t[0],e=t[1],r[i]||(r[i]=[]),r[i].push(e);return r},GlyphAtlas.prototype.getRects=function(){var t,i,e,h=this,r={};for(var s in h.ids)t=s.split("#"),i=t[0],e=t[1],r[i]||(r[i]={}),r[i][e]=h.index[s];return r},GlyphAtlas.prototype.addGlyph=function(t,i,e,h){var r=this;if(!e)return null;var s=i+"#"+e.id;if(this.index[s])return this.ids[s].indexOf(t)<0&&this.ids[s].push(t),this.index[s];if(!e.bitmap)return null;var a=e.width+2*h,E=e.height+2*h,n=1,l=a+2*n,T=E+2*n;l+=4-l%4,T+=4-T%4;var u=this.atlas.packOne(l,T);if(u||(this.resize(),u=this.atlas.packOne(l,T)),!u)return util.warnOnce("glyph bitmap overflow"),null;this.index[s]=u,this.ids[s]=[t];for(var d=this.data,p=e.bitmap,A=0;A<E;A++)for(var _=r.width*(u.y+A+n)+u.x+n,o=a*A,x=0;x<a;x++)d[_+x]=p[o+x];return this.dirty=!0,u},GlyphAtlas.prototype.resize=function(){var t=this,i=this.width,e=this.height;if(!(i>=MAX_SIZE||e>=MAX_SIZE)){this.texture&&(this.gl&&this.gl.deleteTexture(this.texture),this.texture=null),this.width*=SIZE_GROWTH_RATE,this.height*=SIZE_GROWTH_RATE,this.atlas.resize(this.width,this.height);for(var h=new ArrayBuffer(this.width*this.height),r=0;r<e;r++){var s=new Uint8Array(t.data.buffer,e*r,i),a=new Uint8Array(h,e*r*SIZE_GROWTH_RATE,i);a.set(s);}this.data=new Uint8Array(h);}},GlyphAtlas.prototype.bind=function(t){this.gl=t,this.texture?t.bindTexture(t.TEXTURE_2D,this.texture):(this.texture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.texture),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.texImage2D(t.TEXTURE_2D,0,t.ALPHA,this.width,this.height,0,t.ALPHA,t.UNSIGNED_BYTE,null));},GlyphAtlas.prototype.updateTexture=function(t){this.bind(t),this.dirty&&(t.texSubImage2D(t.TEXTURE_2D,0,0,0,this.width,this.height,t.ALPHA,t.UNSIGNED_BYTE,this.data),this.dirty=!1);},module.exports=GlyphAtlas;
; |
363 | },{"../util/util":215,"@mapbox/shelf-pack":2}],168:[function(_dereq_,module,exports){
|
364 | function glyphUrl(t,e,a,l){return l=l||"abc",a.replace("{s}",l[t.length%l.length]).replace("{fontstack}",t).replace("{range}",e)}var normalizeURL=_dereq_("../util/mapbox").normalizeGlyphsURL,ajax=_dereq_("../util/ajax"),verticalizePunctuation=_dereq_("../util/verticalize_punctuation"),Glyphs=_dereq_("../util/glyphs"),GlyphAtlas=_dereq_("../symbol/glyph_atlas"),Protobuf=_dereq_("pbf"),SimpleGlyph=function(t,e,a){var l=1;this.advance=t.advance,this.left=t.left-a-l,this.top=t.top+a+l,this.rect=e;},GlyphSource=function(t){this.url=t&&normalizeURL(t),this.atlases={},this.stacks={},this.loading={};};GlyphSource.prototype.getSimpleGlyphs=function(t,e,a,l){var i=this;void 0===this.stacks[t]&&(this.stacks[t]={}),void 0===this.atlases[t]&&(this.atlases[t]=new GlyphAtlas);for(var r={},o=this.stacks[t],s=this.atlases[t],n=3,h={},p=0,u=function(e){var l=Math.floor(e/256);if(o[l]){var i=o[l].glyphs[e],u=s.addGlyph(a,t,i,n);i&&(r[e]=new SimpleGlyph(i,u,n));}else void 0===h[l]&&(h[l]=[],p++),h[l].push(e);},c=0;c<e.length;c++){var y=e[c],f=String.fromCharCode(y);u(y),verticalizePunctuation.lookup[f]&&u(verticalizePunctuation.lookup[f].charCodeAt(0));}p||l(void 0,r,t);var v=function(e,o,u){if(!e)for(var c=i.stacks[t][o]=u.stacks[0],y=0;y<h[o].length;y++){var f=h[o][y],v=c.glyphs[f],d=s.addGlyph(a,t,v,n);v&&(r[f]=new SimpleGlyph(v,d,n));}p--,p||l(void 0,r,t);};for(var d in h)i.loadRange(t,d,v);},GlyphSource.prototype.loadRange=function(t,e,a){if(256*e>65535)return a("glyphs > 65535 not supported");void 0===this.loading[t]&&(this.loading[t]={});var l=this.loading[t];if(l[e])l[e].push(a);else{l[e]=[a];var i=256*e+"-"+(256*e+255),r=glyphUrl(t,i,this.url);ajax.getArrayBuffer(r,function(t,a){for(var i=!t&&new Glyphs(new Protobuf(a.data)),r=0;r<l[e].length;r++)l[e][r](t,e,i);delete l[e];});}},GlyphSource.prototype.getGlyphAtlas=function(t){return this.atlases[t]},module.exports=GlyphSource;
; |
365 | },{"../symbol/glyph_atlas":167,"../util/ajax":194,"../util/glyphs":206,"../util/mapbox":210,"../util/verticalize_punctuation":217,"pbf":25}],169:[function(_dereq_,module,exports){
|
366 | module.exports=function(e){function t(t){g.push(e[t]),l++;}function r(e,t,r){var n=u[e];return delete u[e],u[t]=n,g[n].geometry[0].pop(),g[n].geometry[0]=g[n].geometry[0].concat(r[0]),n}function n(e,t,r){var n=i[t];return delete i[t],i[e]=n,g[n].geometry[0].shift(),g[n].geometry[0]=r[0].concat(g[n].geometry[0]),n}function o(e,t,r){var n=r?t[0][t[0].length-1]:t[0][0];return e+":"+n.x+":"+n.y}for(var i={},u={},g=[],l=0,m=0;m<e.length;m++){var y=e[m],c=y.geometry,f=y.text;if(f){var a=o(f,c),s=o(f,c,!0);if(a in u&&s in i&&u[a]!==i[s]){var v=n(a,s,c),d=r(a,s,g[v].geometry);delete i[a],delete u[s],u[o(f,g[d].geometry,!0)]=d,g[v].geometry=null;}else a in u?r(a,s,c):s in i?n(a,s,c):(t(m),i[a]=l-1,u[s]=l-1);}else t(m);}return g.filter(function(e){return e.geometry})};
; |
367 | },{}],170:[function(_dereq_,module,exports){
|
368 | function SymbolQuad(t,e,n,a,i,o,l,r,h,c,g){this.anchorPoint=t,this.tl=e,this.tr=n,this.bl=a,this.br=i,this.tex=o,this.anchorAngle=l,this.glyphAngle=r,this.minScale=h,this.maxScale=c,this.writingMode=g;}function getIconQuads(t,e,n,a,i,o,l,r,h){var c,g,u,m,s=e.image.rect,d=i.layout,x=1,S=e.left-x,f=S+s.w/e.image.pixelRatio,M=e.top-x,y=M+s.h/e.image.pixelRatio;if("none"!==d["icon-text-fit"]&&l){var P=f-S,p=y-M,w=d["text-size"]/24,v=l.left*w,b=l.right*w,I=l.top*w,_=l.bottom*w,Q=b-v,G=_-I,V=d["icon-text-fit-padding"][0],L=d["icon-text-fit-padding"][1],A=d["icon-text-fit-padding"][2],D=d["icon-text-fit-padding"][3],E="width"===d["icon-text-fit"]?.5*(G-p):0,F="height"===d["icon-text-fit"]?.5*(Q-P):0,q="width"===d["icon-text-fit"]||"both"===d["icon-text-fit"]?Q:P,N="height"===d["icon-text-fit"]||"both"===d["icon-text-fit"]?G:p;c=new Point(v+F-D,I+E-V),g=new Point(v+F+L+q,I+E-V),u=new Point(v+F+L+q,I+E+A+N),m=new Point(v+F-D,I+E+A+N);}else c=new Point(S,M),g=new Point(f,M),u=new Point(f,y),m=new Point(S,y);var R=i.getLayoutValue("icon-rotate",r,h)*Math.PI/180;if(o){var k=a[t.segment];if(t.y===k.y&&t.x===k.x&&t.segment+1<a.length){var z=a[t.segment+1];R+=Math.atan2(t.y-z.y,t.x-z.x)+Math.PI;}else R+=Math.atan2(t.y-k.y,t.x-k.x);}if(R){var j=Math.sin(R),B=Math.cos(R),C=[B,-j,j,B];c=c.matMult(C),g=g.matMult(C),m=m.matMult(C),u=u.matMult(C);}return[new SymbolQuad(new Point(t.x,t.y),c,g,m,u,e.image.rect,0,0,minScale,1/0)]}function getGlyphQuads(t,e,n,a,i,o,l,r){for(var h=i.getLayoutValue("text-rotate",l,r)*Math.PI/180,c=i.layout["text-keep-upright"],g=e.positionedGlyphs,u=[],m=0;m<g.length;m++){var s=g[m],d=s.glyph;if(d){var x=d.rect;if(x){var S=(s.x+d.advance/2)*n,f=void 0,M=minScale;o?(f=[],M=getLineGlyphs(f,t,S,a,t.segment,!1),c&&(M=Math.min(M,getLineGlyphs(f,t,S,a,t.segment,!0)))):f=[{anchorPoint:new Point(t.x,t.y),upsideDown:!1,angle:0,maxScale:1/0,minScale:minScale}];var y=s.x+d.left,P=s.y-d.top,p=y+x.w,w=P+x.h,v=new Point(s.x,d.advance/2),b=new Point(y,P),I=new Point(p,P),_=new Point(y,w),Q=new Point(p,w);0!==s.angle&&(b._sub(v)._rotate(s.angle)._add(v),I._sub(v)._rotate(s.angle)._add(v),_._sub(v)._rotate(s.angle)._add(v),Q._sub(v)._rotate(s.angle)._add(v));for(var G=0;G<f.length;G++){var V=f[G],L=b,A=I,D=_,E=Q;if(h){var F=Math.sin(h),q=Math.cos(h),N=[q,-F,F,q];L=L.matMult(N),A=A.matMult(N),D=D.matMult(N),E=E.matMult(N);}var R=Math.max(V.minScale,M),k=(t.angle+(V.upsideDown?Math.PI:0)+2*Math.PI)%(2*Math.PI),z=(V.angle+(V.upsideDown?Math.PI:0)+2*Math.PI)%(2*Math.PI);u.push(new SymbolQuad(V.anchorPoint,L,A,D,E,x,k,z,R,V.maxScale,e.writingMode));}}}}return u}function getLineGlyphs(t,e,n,a,i,o){for(var l=n>=0^o,r=Math.abs(n),h=new Point(e.x,e.y),c=getSegmentEnd(l,a,i),g={anchor:h,end:c,index:i,minScale:getMinScaleForSegment(r,h,c),maxScale:1/0};;){if(insertSegmentGlyph(t,g,l,o),g.minScale<=e.scale)return e.scale;var u=getNextVirtualSegment(g,a,r,l);if(!u)return g.minScale;g=u;}}function insertSegmentGlyph(t,e,n,a){var i=Math.atan2(e.end.y-e.anchor.y,e.end.x-e.anchor.x),o=n?i:i+Math.PI;t.push({anchorPoint:e.anchor,upsideDown:a,minScale:e.minScale,maxScale:e.maxScale,angle:(o+2*Math.PI)%(2*Math.PI)});}function getVirtualSegmentAnchor(t,e,n){var a=e.sub(t)._unit();return t.sub(a._mult(n))}function getMinScaleForSegment(t,e,n){var a=e.dist(n);return t/a}function getSegmentEnd(t,e,n){return t?e[n+1]:e[n]}function getNextVirtualSegment(t,e,n,a){for(var i=t.end,o=i,l=t.index;o.equals(i);){if(a&&l+2<e.length)l+=1;else{if(a||0===l)return null;l-=1;}o=getSegmentEnd(a,e,l);}var r=getVirtualSegmentAnchor(i,o,t.anchor.dist(t.end));return{anchor:r,end:o,index:l,minScale:getMinScaleForSegment(n,r,o),maxScale:t.minScale}}var Point=_dereq_("point-geometry");module.exports={getIconQuads:getIconQuads,getGlyphQuads:getGlyphQuads,SymbolQuad:SymbolQuad};var minScale=.5;
; |
369 | },{"point-geometry":26}],171:[function(_dereq_,module,exports){
|
370 | function PositionedGlyph(e,t,i,n,r){this.codePoint=e,this.x=t,this.y=i,this.glyph=n||null,this.angle=r;}function Shaping(e,t,i,n,r,a,o){this.positionedGlyphs=e,this.text=t,this.top=i,this.bottom=n,this.left=r,this.right=a,this.writingMode=o;}function breakLines(e,t){for(var i=[],n=0,r=0,a=t;r<a.length;r+=1){var o=a[r];i.push(e.substring(n,o)),n=o;}return n<e.length&&i.push(e.substring(n,e.length)),i}function shapeText(e,t,i,n,r,a,o,s,h,l,c){var u=e.trim();c===WritingMode.vertical&&(u=verticalizePunctuation(u));var d,g=[],p=new Shaping(g,u,h[1],h[1],h[0],h[0],c);return d=rtlTextPlugin.processBidirectionalText?rtlTextPlugin.processBidirectionalText(u,determineLineBreaks(u,s,i,t)):breakLines(u,determineLineBreaks(u,s,i,t)),shapeLines(p,t,d,n,r,a,o,h,c,s,l),!!g.length&&p}function determineAverageLineWidth(e,t,i,n){var r=0;for(var a in e){var o=n[e.charCodeAt(a)];o&&(r+=o.advance+t);}var s=Math.max(1,Math.ceil(r/i));return r/s}function calculateBadness(e,t,i,n){var r=Math.pow(e-t,2);return n?e<t?r/2:2*r:r+Math.abs(i)*i}function calculatePenalty(e,t){var i=0;return 10===e&&(i-=1e4),40!==e&&65288!==e||(i+=50),41!==t&&65289!==t||(i+=50),i}function evaluateBreak(e,t,i,n,r,a){for(var o=null,s=calculateBadness(t,i,r,a),h=0,l=n;h<l.length;h+=1){var c=l[h],u=t-c.x,d=calculateBadness(u,i,r,a)+c.badness;d<=s&&(o=c,s=d);}return{index:e,x:t,priorBreak:o,badness:s}}function leastBadBreaks(e){return e?leastBadBreaks(e.priorBreak).concat(e.index):[]}function determineLineBreaks(e,t,i,n){if(!i)return[];if(!e)return[];for(var r=[],a=determineAverageLineWidth(e,t,i,n),o=0,s=0;s<e.length;s++){var h=e.charCodeAt(s),l=n[h];l&&!whitespace[h]&&(o+=l.advance+t),s<e.length-1&&(breakable[h]||scriptDetection.charAllowsIdeographicBreaking(h))&&r.push(evaluateBreak(s+1,o,a,r,calculatePenalty(h,e.charCodeAt(s+1)),!1));}return leastBadBreaks(evaluateBreak(e.length,o,a,r,0,!0))}function shapeLines(e,t,i,n,r,a,o,s,h,l,c){var u=-17,d=0,g=u,p=0,v=e.positionedGlyphs;for(var f in i){var x=i[f].trim();if(x.length){for(var B=v.length,k=0;k<x.length;k++){var P=x.charCodeAt(k),b=t[P];b&&(scriptDetection.charHasUprightVerticalOrientation(P)&&h!==WritingMode.horizontal?(v.push(new PositionedGlyph(P,d,0,b,-Math.PI/2)),d+=c+l):(v.push(new PositionedGlyph(P,d,g,b,0)),d+=b.advance+l));}if(v.length!==B){var m=d-l;p=Math.max(m,p),justifyLine(v,t,B,v.length-1,o);}d=0,g+=n;}else g+=n;}align(v,o,r,a,p,n,i.length,s);var y=i.length*n;e.top+=-a*y,e.bottom=e.top+y,e.left+=-r*p,e.right=e.left+p;}function justifyLine(e,t,i,n,r){if(r)for(var a=t[e[n].codePoint].advance,o=(e[n].x+a)*r,s=i;s<=n;s++)e[s].x-=o;}function align(e,t,i,n,r,a,o,s){for(var h=(t-i)*r+s[0],l=(-n*o+.5)*a+s[1],c=0;c<e.length;c++)e[c].x+=h,e[c].y+=l;}function shapeIcon(e,t){if(!e||!e.rect)return null;var i=t[0],n=t[1],r=i-e.width/2,a=r+e.width,o=n-e.height/2,s=o+e.height;return new PositionedIcon(e,o,s,r,a)}function PositionedIcon(e,t,i,n,r){this.image=e,this.top=t,this.bottom=i,this.left=n,this.right=r;}var scriptDetection=_dereq_("../util/script_detection"),verticalizePunctuation=_dereq_("../util/verticalize_punctuation"),rtlTextPlugin=_dereq_("../source/rtl_text_plugin"),WritingMode={horizontal:1,vertical:2};module.exports={shapeText:shapeText,shapeIcon:shapeIcon,WritingMode:WritingMode};var whitespace={9:!0,10:!0,11:!0,12:!0,13:!0,32:!0},breakable={10:!0,32:!0,38:!0,40:!0,41:!0,43:!0,45:!0,47:!0,173:!0,183:!0,8203:!0,8208:!0,8211:!0,8231:!0};
; |
371 | },{"../source/rtl_text_plugin":91,"../util/script_detection":211,"../util/verticalize_punctuation":217}],172:[function(_dereq_,module,exports){
|
372 | function copyBitmap(t,i,e,r,a,h,s,o,n,l,p){var f,u,d=r*i+e,g=o*h+s;if(p)for(g-=h,u=-1;u<=l;u++,g+=h)for(d=((u+l)%l+r)*i+e,f=-1;f<=n;f++)a[g+f]=t[d+(f+n)%n];else for(u=0;u<l;u++,d+=i,g+=h)for(f=0;f<n;f++)a[g+f]=t[d+f];}var ShelfPack=_dereq_("@mapbox/shelf-pack"),browser=_dereq_("../util/browser"),util=_dereq_("../util/util"),window=_dereq_("../util/window"),Evented=_dereq_("../util/evented"),SpriteAtlas=function(t){function i(i,e){t.call(this),this.width=i,this.height=e,this.shelfPack=new ShelfPack(i,e),this.images={},this.data=!1,this.texture=0,this.filter=0,this.pixelRatio=browser.devicePixelRatio>1?2:1,this.dirty=!0;}return t&&(i.__proto__=t),i.prototype=Object.create(t&&t.prototype),i.prototype.constructor=i,i.prototype.allocateImage=function(t,i){t/=this.pixelRatio,i/=this.pixelRatio;var e=2,r=t+e+(4-(t+e)%4),a=i+e+(4-(i+e)%4),h=this.shelfPack.packOne(r,a);return h?h:(util.warnOnce("SpriteAtlas out of space."),null)},i.prototype.addImage=function(t,i,e){var r,a,h;if(i instanceof window.HTMLImageElement?(r=i.width,a=i.height,i=browser.getImageData(i),h=1):(r=e.width,a=e.height,h=e.pixelRatio||1),ArrayBuffer.isView(i)&&(i=new Uint32Array(i.buffer)),!(i instanceof Uint32Array))return this.fire("error",{error:new Error("Image provided in an invalid format. Supported formats are HTMLImageElement and ArrayBufferView.")});if(this.images[t])return this.fire("error",{error:new Error("An image with this name already exists.")});var s=this.allocateImage(r,a);if(!s)return this.fire("error",{error:new Error("There is not enough space to add this image.")});var o={rect:s,width:r/h,height:a/h,sdf:!1,pixelRatio:h/this.pixelRatio};this.images[t]=o,this.copy(i,r,s,{pixelRatio:h,x:0,y:0,width:r,height:a},!1),this.fire("data",{dataType:"style"});},i.prototype.removeImage=function(t){var i=this.images[t];return delete this.images[t],i?(this.shelfPack.unref(i.rect),void this.fire("data",{dataType:"style"})):this.fire("error",{error:new Error("No image with this name exists.")})},i.prototype.getImage=function(t,i){if(this.images[t])return this.images[t];if(!this.sprite)return null;var e=this.sprite.getSpritePosition(t);if(!e.width||!e.height)return null;var r=this.allocateImage(e.width,e.height);if(!r)return null;var a={rect:r,width:e.width/e.pixelRatio,height:e.height/e.pixelRatio,sdf:e.sdf,pixelRatio:e.pixelRatio/this.pixelRatio};if(this.images[t]=a,!this.sprite.imgData)return null;var h=new Uint32Array(this.sprite.imgData.buffer);return this.copy(h,this.sprite.width,r,e,i),a},i.prototype.getPosition=function(t,i){var e=this.getImage(t,i),r=e&&e.rect;if(!r)return null;var a=e.width*e.pixelRatio,h=e.height*e.pixelRatio,s=1;return{size:[e.width,e.height],tl:[(r.x+s)/this.width,(r.y+s)/this.height],br:[(r.x+s+a)/this.width,(r.y+s+h)/this.height]}},i.prototype.allocate=function(){var t=this;if(!this.data){var i=Math.floor(this.width*this.pixelRatio),e=Math.floor(this.height*this.pixelRatio);this.data=new Uint32Array(i*e);for(var r=0;r<this.data.length;r++)t.data[r]=0;}},i.prototype.copy=function(t,i,e,r,a){this.allocate();var h=this.data,s=1;copyBitmap(t,i,r.x,r.y,h,this.width*this.pixelRatio,(e.x+s)*this.pixelRatio,(e.y+s)*this.pixelRatio,r.width,r.height,a),this.dirty=!0;},i.prototype.setSprite=function(t){t&&this.canvas&&(this.canvas.width=this.width*this.pixelRatio,this.canvas.height=this.height*this.pixelRatio),this.sprite=t;},i.prototype.addIcons=function(t,i){for(var e=this,r=0;r<t.length;r++)e.getImage(t[r]);i(null,this.images);},i.prototype.bind=function(t,i){var e=!1;this.texture?t.bindTexture(t.TEXTURE_2D,this.texture):(this.texture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.texture),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.pixelStorei(t.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e=!0);var r=i?t.LINEAR:t.NEAREST;r!==this.filter&&(t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,r),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,r),this.filter=r),this.dirty&&(this.allocate(),e?t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width*this.pixelRatio,this.height*this.pixelRatio,0,t.RGBA,t.UNSIGNED_BYTE,new Uint8Array(this.data.buffer)):t.texSubImage2D(t.TEXTURE_2D,0,0,0,this.width*this.pixelRatio,this.height*this.pixelRatio,t.RGBA,t.UNSIGNED_BYTE,new Uint8Array(this.data.buffer)),this.dirty=!1);},i}(Evented);module.exports=SpriteAtlas;
; |
373 | },{"../util/browser":195,"../util/evented":203,"../util/util":215,"../util/window":197,"@mapbox/shelf-pack":2}],173:[function(_dereq_,module,exports){
|
374 | var rtlTextPlugin=_dereq_("../source/rtl_text_plugin");module.exports=function(e,r,t,a){var l=r.getLayoutValue("text-transform",t,a);return"uppercase"===l?e=e.toLocaleUpperCase():"lowercase"===l&&(e=e.toLocaleLowerCase()),rtlTextPlugin.applyArabicShaping&&(e=rtlTextPlugin.applyArabicShaping(e)),e};
; |
375 | },{"../source/rtl_text_plugin":91}],174:[function(_dereq_,module,exports){
|
376 | var DOM=_dereq_("../util/dom"),Point=_dereq_("point-geometry"),handlers={scrollZoom:_dereq_("./handler/scroll_zoom"),boxZoom:_dereq_("./handler/box_zoom"),dragRotate:_dereq_("./handler/drag_rotate"),dragPan:_dereq_("./handler/drag_pan"),keyboard:_dereq_("./handler/keyboard"),doubleClickZoom:_dereq_("./handler/dblclick_zoom"),touchZoomRotate:_dereq_("./handler/touch_zoom_rotate")};module.exports=function(e,t){function n(e){h("mouseout",e);}function o(t){e.stop(),L=DOM.mousePos(g,t),h("mousedown",t),E=!0;}function r(t){var n=e.dragRotate&&e.dragRotate.isActive();p&&!n&&h("contextmenu",p),p=null,E=!1,h("mouseup",t);}function a(t){if(!(e.dragPan&&e.dragPan.isActive()||e.dragRotate&&e.dragRotate.isActive())){for(var n=t.toElement||t.target;n&&n!==g;)n=n.parentNode;n===g&&h("mousemove",t);}}function u(t){e.stop(),f("touchstart",t),!t.touches||t.touches.length>1||(b?(clearTimeout(b),b=null,h("dblclick",t)):b=setTimeout(l,300));}function i(e){f("touchmove",e);}function c(e){f("touchend",e);}function d(e){f("touchcancel",e);}function l(){b=null;}function s(e){var t=DOM.mousePos(g,e);t.equals(L)&&h("click",e);}function v(e){h("dblclick",e),e.preventDefault();}function m(t){var n=e.dragRotate&&e.dragRotate.isActive();E||n?E&&(p=t):h("contextmenu",t),t.preventDefault();}function h(t,n){var o=DOM.mousePos(g,n);return e.fire(t,{lngLat:e.unproject(o),point:o,originalEvent:n})}function f(t,n){var o=DOM.touchPos(g,n),r=o.reduce(function(e,t,n,o){return e.add(t.div(o.length))},new Point(0,0));return e.fire(t,{lngLat:e.unproject(r),point:r,lngLats:o.map(function(t){return e.unproject(t)},this),points:o,originalEvent:n})}var g=e.getCanvasContainer(),p=null,E=!1,L=null,b=null;for(var q in handlers)e[q]=new handlers[q](e,t),t.interactive&&t[q]&&e[q].enable(t[q]);g.addEventListener("mouseout",n,!1),g.addEventListener("mousedown",o,!1),g.addEventListener("mouseup",r,!1),g.addEventListener("mousemove",a,!1),g.addEventListener("touchstart",u,!1),g.addEventListener("touchend",c,!1),g.addEventListener("touchmove",i,!1),g.addEventListener("touchcancel",d,!1),g.addEventListener("click",s,!1),g.addEventListener("dblclick",v,!1),g.addEventListener("contextmenu",m,!1);};
; |
377 | },{"../util/dom":202,"./handler/box_zoom":182,"./handler/dblclick_zoom":183,"./handler/drag_pan":184,"./handler/drag_rotate":185,"./handler/keyboard":186,"./handler/scroll_zoom":187,"./handler/touch_zoom_rotate":188,"point-geometry":26}],175:[function(_dereq_,module,exports){
|
378 | var util=_dereq_("../util/util"),interpolate=_dereq_("../style-spec/util/interpolate"),browser=_dereq_("../util/browser"),LngLat=_dereq_("../geo/lng_lat"),LngLatBounds=_dereq_("../geo/lng_lat_bounds"),Point=_dereq_("point-geometry"),Evented=_dereq_("../util/evented"),Camera=function(t){function e(e,i){t.call(this),this.moving=!1,this.transform=e,this._bearingSnap=i.bearingSnap;}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getCenter=function(){return this.transform.center},e.prototype.setCenter=function(t,e){return this.jumpTo({center:t},e)},e.prototype.panBy=function(t,e,i){return t=Point.convert(t).mult(-1),this.panTo(this.transform.center,util.extend({offset:t},e),i)},e.prototype.panTo=function(t,e,i){return this.easeTo(util.extend({center:t},e),i)},e.prototype.getZoom=function(){return this.transform.zoom},e.prototype.setZoom=function(t,e){return this.jumpTo({zoom:t},e),this},e.prototype.zoomTo=function(t,e,i){return this.easeTo(util.extend({zoom:t},e),i)},e.prototype.zoomIn=function(t,e){return this.zoomTo(this.getZoom()+1,t,e),this},e.prototype.zoomOut=function(t,e){return this.zoomTo(this.getZoom()-1,t,e),this},e.prototype.getBearing=function(){return this.transform.bearing},e.prototype.setBearing=function(t,e){return this.jumpTo({bearing:t},e),this},e.prototype.rotateTo=function(t,e,i){return this.easeTo(util.extend({bearing:t},e),i)},e.prototype.resetNorth=function(t,e){return this.rotateTo(0,util.extend({duration:1e3},t),e),this},e.prototype.snapToNorth=function(t,e){return Math.abs(this.getBearing())<this._bearingSnap?this.resetNorth(t,e):this},e.prototype.getPitch=function(){return this.transform.pitch},e.prototype.setPitch=function(t,e){return this.jumpTo({pitch:t},e),this},e.prototype.fitBounds=function(t,e,i){if(e=util.extend({padding:{top:0,bottom:0,right:0,left:0},offset:[0,0],maxZoom:this.transform.maxZoom},e),"number"==typeof e.padding){var o=e.padding;e.padding={top:o,bottom:o,right:o,left:o};}if(!util.deepEqual(Object.keys(e.padding).sort(function(t,e){return t<e?-1:t>e?1:0}),["bottom","left","right","top"]))return void util.warnOnce("options.padding must be a positive number, or an Object with keys 'bottom', 'left', 'right', 'top'");t=LngLatBounds.convert(t);var n=[e.padding.left-e.padding.right,e.padding.top-e.padding.bottom],r=Math.min(e.padding.right,e.padding.left),a=Math.min(e.padding.top,e.padding.bottom);e.offset=[e.offset[0]+n[0],e.offset[1]+n[1]];var s=Point.convert(e.offset),h=this.transform,p=h.project(t.getNorthWest()),u=h.project(t.getSouthEast()),c=u.sub(p),f=(h.width-2*r-2*Math.abs(s.x))/c.x,m=(h.height-2*a-2*Math.abs(s.y))/c.y;return m<0||f<0?void util.warnOnce("Map cannot fit within canvas with the given bounds, padding, and/or offset."):(e.center=h.unproject(p.add(u).div(2)),e.zoom=Math.min(h.scaleZoom(h.scale*Math.min(f,m)),e.maxZoom),e.bearing=0,e.linear?this.easeTo(e,i):this.flyTo(e,i))},e.prototype.jumpTo=function(t,e){this.stop();var i=this.transform,o=!1,n=!1,r=!1;return"zoom"in t&&i.zoom!==+t.zoom&&(o=!0,i.zoom=+t.zoom),"center"in t&&(i.center=LngLat.convert(t.center)),"bearing"in t&&i.bearing!==+t.bearing&&(n=!0,i.bearing=+t.bearing),"pitch"in t&&i.pitch!==+t.pitch&&(r=!0,i.pitch=+t.pitch),this.fire("movestart",e).fire("move",e),o&&this.fire("zoomstart",e).fire("zoom",e).fire("zoomend",e),n&&this.fire("rotate",e),r&&this.fire("pitchstart",e).fire("pitch",e).fire("pitchend",e),this.fire("moveend",e)},e.prototype.easeTo=function(t,e){var i=this;this.stop(),t=util.extend({offset:[0,0],duration:500,easing:util.ease},t),t.animate===!1&&(t.duration=0),t.smoothEasing&&0!==t.duration&&(t.easing=this._smoothOutEasing(t.duration));var o=this.transform,n=this.getZoom(),r=this.getBearing(),a=this.getPitch(),s="zoom"in t?+t.zoom:n,h="bearing"in t?this._normalizeBearing(t.bearing,r):r,p="pitch"in t?+t.pitch:a,u=o.centerPoint.add(Point.convert(t.offset)),c=o.pointLocation(u),f=LngLat.convert(t.center||c);this._normalizeCenter(f);var m,g,d=o.project(c),l=o.project(f).sub(d),v=o.zoomScale(s-n);return t.around&&(m=LngLat.convert(t.around),g=o.locationPoint(m)),this.zooming=s!==n,this.rotating=r!==h,this.pitching=p!==a,this._prepareEase(e,t.noMoveStart),clearTimeout(this._onEaseEnd),this._ease(function(t){if(this.zooming&&(o.zoom=interpolate(n,s,t)),this.rotating&&(o.bearing=interpolate(r,h,t)),this.pitching&&(o.pitch=interpolate(a,p,t)),m)o.setLocationAtPoint(m,g);else{var i=o.zoomScale(o.zoom-n),c=s>n?Math.min(2,v):Math.max(.5,v),f=Math.pow(c,1-t),b=o.unproject(d.add(l.mult(t*f)).mult(i));o.setLocationAtPoint(o.renderWorldCopies?b.wrap():b,u);}this._fireMoveEvents(e);},function(){t.delayEndEvents?i._onEaseEnd=setTimeout(function(){return i._easeToEnd(e)},t.delayEndEvents):i._easeToEnd(e);},t),this},e.prototype._prepareEase=function(t,e){this.moving=!0,e||this.fire("movestart",t),this.zooming&&this.fire("zoomstart",t),this.pitching&&this.fire("pitchstart",t);},e.prototype._fireMoveEvents=function(t){this.fire("move",t),this.zooming&&this.fire("zoom",t),this.rotating&&this.fire("rotate",t),this.pitching&&this.fire("pitch",t);},e.prototype._easeToEnd=function(t){var e=this.zooming,i=this.pitching;this.moving=!1,this.zooming=!1,this.rotating=!1,this.pitching=!1,e&&this.fire("zoomend",t),i&&this.fire("pitchend",t),this.fire("moveend",t);},e.prototype.flyTo=function(t,e){function i(t){var e=(M*M-z*z+(t?-1:1)*L*L*E*E)/(2*(t?M:z)*L*E);return Math.log(Math.sqrt(e*e+1)-e)}function o(t){return(Math.exp(t)-Math.exp(-t))/2}function n(t){return(Math.exp(t)+Math.exp(-t))/2}function r(t){return o(t)/n(t)}var a=this;this.stop(),t=util.extend({offset:[0,0],speed:1.2,curve:1.42,easing:util.ease},t);var s=this.transform,h=this.getZoom(),p=this.getBearing(),u=this.getPitch(),c="zoom"in t?+t.zoom:h,f="bearing"in t?this._normalizeBearing(t.bearing,p):p,m="pitch"in t?+t.pitch:u,g=s.zoomScale(c-h),d=s.centerPoint.add(Point.convert(t.offset)),l=s.pointLocation(d),v=LngLat.convert(t.center||l);this._normalizeCenter(v);var b=s.project(l),y=s.project(v).sub(b),_=t.curve,z=Math.max(s.width,s.height),M=z/g,E=y.mag();if("minZoom"in t){var T=util.clamp(Math.min(t.minZoom,h,c),s.minZoom,s.maxZoom),x=z/s.zoomScale(T-h);_=Math.sqrt(x/E*2);}var L=_*_,j=i(0),w=function(t){return n(j)/n(j+_*t)},P=function(t){return z*((n(j)*r(j+_*t)-o(j))/L)/E},Z=(i(1)-j)/_;if(Math.abs(E)<1e-6){if(Math.abs(z-M)<1e-6)return this.easeTo(t,e);var q=M<z?-1:1;Z=Math.abs(Math.log(M/z))/_,P=function(){return 0},w=function(t){return Math.exp(q*_*t)};}if("duration"in t)t.duration=+t.duration;else{var B="screenSpeed"in t?+t.screenSpeed/_:+t.speed;t.duration=1e3*Z/B;}return this.zooming=!0,this.rotating=p!==f,this.pitching=m!==u,this._prepareEase(e,!1),this._ease(function(t){var i=t*Z,o=1/w(i);s.zoom=h+s.scaleZoom(o),this.rotating&&(s.bearing=interpolate(p,f,t)),this.pitching&&(s.pitch=interpolate(u,m,t));var n=s.unproject(b.add(y.mult(P(i))).mult(o));s.setLocationAtPoint(s.renderWorldCopies?n.wrap():n,d),this._fireMoveEvents(e);},function(){return a._easeToEnd(e)},t),this},e.prototype.isEasing=function(){return!!this._abortFn},e.prototype.isMoving=function(){return this.moving},e.prototype.stop=function(){return this._abortFn&&(this._abortFn(),this._finishEase()),this},e.prototype._ease=function(t,e,i){this._finishFn=e,this._abortFn=browser.timed(function(e){t.call(this,i.easing(e)),1===e&&this._finishEase();},i.animate===!1?0:i.duration,this);},e.prototype._finishEase=function(){delete this._abortFn;var t=this._finishFn;delete this._finishFn,t.call(this);},e.prototype._normalizeBearing=function(t,e){t=util.wrap(t,-180,180);var i=Math.abs(t-e);return Math.abs(t-360-e)<i&&(t-=360),Math.abs(t+360-e)<i&&(t+=360),t},e.prototype._normalizeCenter=function(t){var e=this.transform;if(e.renderWorldCopies&&!e.lngRange){var i=t.lng-e.center.lng;t.lng+=i>180?-360:i<-180?360:0;}},e.prototype._smoothOutEasing=function(t){var e=util.ease;if(this._prevEase){var i=this._prevEase,o=(Date.now()-i.start)/i.duration,n=i.easing(o+.01)-i.easing(o),r=.27/Math.sqrt(n*n+1e-4)*.01,a=Math.sqrt(.0729-r*r);e=util.bezier(r,a,.25,1);}return this._prevEase={start:(new Date).getTime(),duration:t,easing:e},e},e}(Evented);module.exports=Camera;
; |
379 | },{"../geo/lng_lat":62,"../geo/lng_lat_bounds":63,"../style-spec/util/interpolate":123,"../util/browser":195,"../util/evented":203,"../util/util":215,"point-geometry":26}],176:[function(_dereq_,module,exports){
|
380 | var DOM=_dereq_("../../util/dom"),util=_dereq_("../../util/util"),AttributionControl=function(t){this.options=t,util.bindAll(["_updateEditLink","_updateData","_updateCompact"],this);};AttributionControl.prototype.getDefaultPosition=function(){return"bottom-right"},AttributionControl.prototype.onAdd=function(t){var i=this.options&&this.options.compact;return this._map=t,this._container=DOM.create("div","mapboxgl-ctrl mapboxgl-ctrl-attrib"),i&&this._container.classList.add("mapboxgl-compact"),this._updateAttributions(),this._updateEditLink(),this._map.on("sourcedata",this._updateData),this._map.on("moveend",this._updateEditLink),void 0===i&&(this._map.on("resize",this._updateCompact),this._updateCompact()),this._container},AttributionControl.prototype.onRemove=function(){this._container.parentNode.removeChild(this._container),this._map.off("sourcedata",this._updateData),this._map.off("moveend",this._updateEditLink),this._map.off("resize",this._updateCompact),this._map=void 0;},AttributionControl.prototype._updateEditLink=function(){if(this._editLink||(this._editLink=this._container.querySelector(".mapboxgl-improve-map")),this._editLink){var t=this._map.getCenter();this._editLink.href="https://www.mapbox.com/map-feedback/#/"+t.lng+"/"+t.lat+"/"+Math.round(this._map.getZoom()+1);}},AttributionControl.prototype._updateData=function(t){t&&"metadata"===t.sourceDataType&&(this._updateAttributions(),this._updateEditLink());},AttributionControl.prototype._updateAttributions=function(){if(this._map.style){var t=[],i=this._map.style.sourceCaches;for(var o in i){var n=i[o].getSource();n.attribution&&t.indexOf(n.attribution)<0&&t.push(n.attribution);}t.sort(function(t,i){return t.length-i.length}),t=t.filter(function(i,o){for(var n=o+1;n<t.length;n++)if(t[n].indexOf(i)>=0)return!1;return!0}),this._container.innerHTML=t.join(" | "),this._editLink=null;}},AttributionControl.prototype._updateCompact=function(){var t=this._map.getCanvasContainer().offsetWidth<=640;this._container.classList[t?"add":"remove"]("mapboxgl-compact");},module.exports=AttributionControl;
; |
381 | },{"../../util/dom":202,"../../util/util":215}],177:[function(_dereq_,module,exports){
|
382 | var DOM=_dereq_("../../util/dom"),util=_dereq_("../../util/util"),window=_dereq_("../../util/window"),FullscreenControl=function(){this._fullscreen=!1,util.bindAll(["_onClickFullscreen","_changeIcon"],this),"onfullscreenchange"in window.document?this._fullscreenchange="fullscreenchange":"onmozfullscreenchange"in window.document?this._fullscreenchange="mozfullscreenchange":"onwebkitfullscreenchange"in window.document?this._fullscreenchange="webkitfullscreenchange":"onmsfullscreenchange"in window.document&&(this._fullscreenchange="MSFullscreenChange");};FullscreenControl.prototype.onAdd=function(e){var n="mapboxgl-ctrl",l=this._container=DOM.create("div",n+" mapboxgl-ctrl-group"),t=this._fullscreenButton=DOM.create("button",n+"-icon "+n+"-fullscreen",this._container);return t.setAttribute("aria-label","Toggle fullscreen"),t.type="button",this._fullscreenButton.addEventListener("click",this._onClickFullscreen),this._mapContainer=e.getContainer(),window.document.addEventListener(this._fullscreenchange,this._changeIcon),l},FullscreenControl.prototype.onRemove=function(){this._container.parentNode.removeChild(this._container),this._map=null,window.document.removeEventListener(this._fullscreenchange,this._changeIcon);},FullscreenControl.prototype._isFullscreen=function(){return this._fullscreen},FullscreenControl.prototype._changeIcon=function(){var e=window.document.fullscreenElement||window.document.mozFullScreenElement||window.document.webkitFullscreenElement||window.document.msFullscreenElement;if(e===this._mapContainer!==this._fullscreen){this._fullscreen=!this._fullscreen;var n="mapboxgl-ctrl";this._fullscreenButton.classList.toggle(n+"-shrink"),this._fullscreenButton.classList.toggle(n+"-fullscreen");}},FullscreenControl.prototype._onClickFullscreen=function(){this._isFullscreen()?window.document.exitFullscreen?window.document.exitFullscreen():window.document.mozCancelFullScreen?window.document.mozCancelFullScreen():window.document.msExitFullscreen?window.document.msExitFullscreen():window.document.webkitCancelFullScreen&&window.document.webkitCancelFullScreen():this._mapContainer.requestFullscreen?this._mapContainer.requestFullscreen():this._mapContainer.mozRequestFullScreen?this._mapContainer.mozRequestFullScreen():this._mapContainer.msRequestFullscreen?this._mapContainer.msRequestFullscreen():this._mapContainer.webkitRequestFullscreen&&this._mapContainer.webkitRequestFullscreen();},module.exports=FullscreenControl;
; |
383 | },{"../../util/dom":202,"../../util/util":215,"../../util/window":197}],178:[function(_dereq_,module,exports){
|
384 | function checkGeolocationSupport(t){void 0!==supportsGeolocation?t(supportsGeolocation):void 0!==window.navigator.permissions?window.navigator.permissions.query({name:"geolocation"}).then(function(o){supportsGeolocation="denied"!==o.state,t(supportsGeolocation);}):(supportsGeolocation=!!window.navigator.geolocation,t(supportsGeolocation));}var Evented=_dereq_("../../util/evented"),DOM=_dereq_("../../util/dom"),window=_dereq_("../../util/window"),util=_dereq_("../../util/util"),defaultGeoPositionOptions={enableHighAccuracy:!1,timeout:6e3},className="mapboxgl-ctrl",supportsGeolocation,GeolocateControl=function(t){function o(o){t.call(this),this.options=o||{},util.bindAll(["_onSuccess","_onError","_finish","_setupUI"],this);}return t&&(o.__proto__=t),o.prototype=Object.create(t&&t.prototype),o.prototype.constructor=o,o.prototype.onAdd=function(t){return this._map=t,this._container=DOM.create("div",className+" "+className+"-group"),checkGeolocationSupport(this._setupUI),this._container},o.prototype.onRemove=function(){this._container.parentNode.removeChild(this._container),this._map=void 0;},o.prototype._onSuccess=function(t){this._map.jumpTo({center:[t.coords.longitude,t.coords.latitude],zoom:17,bearing:0,pitch:0}),this.fire("geolocate",t),this._finish();},o.prototype._onError=function(t){this.fire("error",t),this._finish();},o.prototype._finish=function(){this._timeoutId&&clearTimeout(this._timeoutId),this._timeoutId=void 0;},o.prototype._setupUI=function(t){t!==!1&&(this._container.addEventListener("contextmenu",function(t){return t.preventDefault()}),this._geolocateButton=DOM.create("button",className+"-icon "+className+"-geolocate",this._container),this._geolocateButton.type="button",this._geolocateButton.setAttribute("aria-label","Geolocate"),this.options.watchPosition&&this._geolocateButton.setAttribute("aria-pressed",!1),this._geolocateButton.addEventListener("click",this._onClickGeolocate.bind(this)));},o.prototype._onClickGeolocate=function(){var t=util.extend(defaultGeoPositionOptions,this.options&&this.options.positionOptions||{});this.options.watchPosition?void 0!==this._geolocationWatchID?(this._geolocateButton.classList.remove("mapboxgl-watching"),this._geolocateButton.setAttribute("aria-pressed",!1),window.navigator.geolocation.clearWatch(this._geolocationWatchID),this._geolocationWatchID=void 0):(this._geolocateButton.classList.add("mapboxgl-watching"),this._geolocateButton.setAttribute("aria-pressed",!0),this._geolocationWatchID=window.navigator.geolocation.watchPosition(this._onSuccess,this._onError,t)):(window.navigator.geolocation.getCurrentPosition(this._onSuccess,this._onError,t),this._timeoutId=setTimeout(this._finish,1e4));},o}(Evented);module.exports=GeolocateControl;
; |
385 | },{"../../util/dom":202,"../../util/evented":203,"../../util/util":215,"../../util/window":197}],179:[function(_dereq_,module,exports){
|
386 | var DOM=_dereq_("../../util/dom"),util=_dereq_("../../util/util"),LogoControl=function(){util.bindAll(["_updateLogo"],this);};LogoControl.prototype.onAdd=function(o){return this._map=o,this._container=DOM.create("div","mapboxgl-ctrl"),this._map.on("sourcedata",this._updateLogo),this._updateLogo(),this._container},LogoControl.prototype.onRemove=function(){this._container.parentNode.removeChild(this._container),this._map.off("sourcedata",this._updateLogo);},LogoControl.prototype.getDefaultPosition=function(){return"bottom-left"},LogoControl.prototype._updateLogo=function(o){if(o&&"metadata"===o.sourceDataType)if(!this._container.childNodes.length&&this._logoRequired()){var t=DOM.create("a","mapboxgl-ctrl-logo");t.target="_blank",t.href="https://www.mapbox.com/",t.setAttribute("aria-label","Mapbox logo"),this._container.appendChild(t),this._map.off("data",this._updateLogo);}else this._container.childNodes.length&&!this._logoRequired()&&this.onRemove();},LogoControl.prototype._logoRequired=function(){if(this._map.style){var o=this._map.style.sourceCaches;for(var t in o){var e=o[t].getSource();if(e.mapbox_logo)return!0}return!1}},module.exports=LogoControl;
; |
387 | },{"../../util/dom":202,"../../util/util":215}],180:[function(_dereq_,module,exports){
|
388 | function copyMouseEvent(t){return new window.MouseEvent(t.type,{button:2,buttons:2,bubbles:!0,cancelable:!0,detail:t.detail,view:t.view,screenX:t.screenX,screenY:t.screenY,clientX:t.clientX,clientY:t.clientY,movementX:t.movementX,movementY:t.movementY,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey})}var DOM=_dereq_("../../util/dom"),window=_dereq_("../../util/window"),util=_dereq_("../../util/util"),className="mapboxgl-ctrl",NavigationControl=function(){util.bindAll(["_rotateCompassArrow"],this);};NavigationControl.prototype._rotateCompassArrow=function(){var t="rotate("+this._map.transform.angle*(180/Math.PI)+"deg)";this._compassArrow.style.transform=t;},NavigationControl.prototype.onAdd=function(t){return this._map=t,this._container=DOM.create("div",className+" "+className+"-group",t.getContainer()),this._container.addEventListener("contextmenu",this._onContextMenu.bind(this)),this._zoomInButton=this._createButton(className+"-icon "+className+"-zoom-in","Zoom In",t.zoomIn.bind(t)),this._zoomOutButton=this._createButton(className+"-icon "+className+"-zoom-out","Zoom Out",t.zoomOut.bind(t)),this._compass=this._createButton(className+"-icon "+className+"-compass","Reset North",t.resetNorth.bind(t)),this._compassArrow=DOM.create("span",className+"-compass-arrow",this._compass),this._compass.addEventListener("mousedown",this._onCompassDown.bind(this)),this._onCompassMove=this._onCompassMove.bind(this),this._onCompassUp=this._onCompassUp.bind(this),this._map.on("rotate",this._rotateCompassArrow),this._rotateCompassArrow(),this._container},NavigationControl.prototype.onRemove=function(){this._container.parentNode.removeChild(this._container),this._map.off("rotate",this._rotateCompassArrow),this._map=void 0;},NavigationControl.prototype._onContextMenu=function(t){t.preventDefault();},NavigationControl.prototype._onCompassDown=function(t){0===t.button&&(DOM.disableDrag(),window.document.addEventListener("mousemove",this._onCompassMove),window.document.addEventListener("mouseup",this._onCompassUp),this._map.getCanvasContainer().dispatchEvent(copyMouseEvent(t)),t.stopPropagation());},NavigationControl.prototype._onCompassMove=function(t){0===t.button&&(this._map.getCanvasContainer().dispatchEvent(copyMouseEvent(t)),t.stopPropagation());},NavigationControl.prototype._onCompassUp=function(t){0===t.button&&(window.document.removeEventListener("mousemove",this._onCompassMove),window.document.removeEventListener("mouseup",this._onCompassUp),DOM.enableDrag(),this._map.getCanvasContainer().dispatchEvent(copyMouseEvent(t)),t.stopPropagation());},NavigationControl.prototype._createButton=function(t,o,e){var n=DOM.create("button",t,this._container);return n.type="button",n.setAttribute("aria-label",o),n.addEventListener("click",function(){e();}),n},module.exports=NavigationControl;
; |
389 | },{"../../util/dom":202,"../../util/util":215,"../../util/window":197}],181:[function(_dereq_,module,exports){
|
390 | function updateScale(t,e,o){var n=o&&o.maxWidth||100,i=t._container.clientHeight/2,a=getDistance(t.unproject([0,i]),t.unproject([n,i]));if(o&&"imperial"===o.unit){var r=3.2808*a;if(r>5280){var l=r/5280;setScale(e,n,l,"mi");}else setScale(e,n,r,"ft");}else setScale(e,n,a,"m");}function setScale(t,e,o,n){var i=getRoundNum(o),a=i/o;"m"===n&&i>=1e3&&(i/=1e3,n="km"),t.style.width=e*a+"px",t.innerHTML=i+n;}function getDistance(t,e){var o=6371e3,n=Math.PI/180,i=t.lat*n,a=e.lat*n,r=Math.sin(i)*Math.sin(a)+Math.cos(i)*Math.cos(a)*Math.cos((e.lng-t.lng)*n),l=o*Math.acos(Math.min(r,1));return l}function getRoundNum(t){var e=Math.pow(10,(""+Math.floor(t)).length-1),o=t/e;return o=o>=10?10:o>=5?5:o>=3?3:o>=2?2:1,e*o}var DOM=_dereq_("../../util/dom"),util=_dereq_("../../util/util"),ScaleControl=function(t){this.options=t,util.bindAll(["_onMove"],this);};ScaleControl.prototype.getDefaultPosition=function(){return"bottom-left"},ScaleControl.prototype._onMove=function(){updateScale(this._map,this._container,this.options);},ScaleControl.prototype.onAdd=function(t){return this._map=t,this._container=DOM.create("div","mapboxgl-ctrl mapboxgl-ctrl-scale",t.getContainer()),this._map.on("move",this._onMove),this._onMove(),this._container},ScaleControl.prototype.onRemove=function(){this._container.parentNode.removeChild(this._container),this._map.off("move",this._onMove),this._map=void 0;},module.exports=ScaleControl;
; |
391 | },{"../../util/dom":202,"../../util/util":215}],182:[function(_dereq_,module,exports){
|
392 | var DOM=_dereq_("../../util/dom"),LngLatBounds=_dereq_("../../geo/lng_lat_bounds"),util=_dereq_("../../util/util"),window=_dereq_("../../util/window"),BoxZoomHandler=function(o){this._map=o,this._el=o.getCanvasContainer(),this._container=o.getContainer(),util.bindAll(["_onMouseDown","_onMouseMove","_onMouseUp","_onKeyDown"],this);};BoxZoomHandler.prototype.isEnabled=function(){return!!this._enabled},BoxZoomHandler.prototype.isActive=function(){return!!this._active},BoxZoomHandler.prototype.enable=function(){this.isEnabled()||(this._map.dragPan&&this._map.dragPan.disable(),this._el.addEventListener("mousedown",this._onMouseDown,!1),this._map.dragPan&&this._map.dragPan.enable(),this._enabled=!0);},BoxZoomHandler.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("mousedown",this._onMouseDown),this._enabled=!1);},BoxZoomHandler.prototype._onMouseDown=function(o){o.shiftKey&&0===o.button&&(window.document.addEventListener("mousemove",this._onMouseMove,!1),window.document.addEventListener("keydown",this._onKeyDown,!1),window.document.addEventListener("mouseup",this._onMouseUp,!1),DOM.disableDrag(),this._startPos=DOM.mousePos(this._el,o),this._active=!0);},BoxZoomHandler.prototype._onMouseMove=function(o){var e=this._startPos,t=DOM.mousePos(this._el,o);this._box||(this._box=DOM.create("div","mapboxgl-boxzoom",this._container),this._container.classList.add("mapboxgl-crosshair"),this._fireEvent("boxzoomstart",o));var n=Math.min(e.x,t.x),i=Math.max(e.x,t.x),s=Math.min(e.y,t.y),a=Math.max(e.y,t.y);DOM.setTransform(this._box,"translate("+n+"px,"+s+"px)"),this._box.style.width=i-n+"px",this._box.style.height=a-s+"px";},BoxZoomHandler.prototype._onMouseUp=function(o){if(0===o.button){var e=this._startPos,t=DOM.mousePos(this._el,o),n=(new LngLatBounds).extend(this._map.unproject(e)).extend(this._map.unproject(t));this._finish(),e.x===t.x&&e.y===t.y?this._fireEvent("boxzoomcancel",o):this._map.fitBounds(n,{linear:!0}).fire("boxzoomend",{originalEvent:o,boxZoomBounds:n});}},BoxZoomHandler.prototype._onKeyDown=function(o){27===o.keyCode&&(this._finish(),this._fireEvent("boxzoomcancel",o));},BoxZoomHandler.prototype._finish=function(){this._active=!1,window.document.removeEventListener("mousemove",this._onMouseMove,!1),window.document.removeEventListener("keydown",this._onKeyDown,!1),window.document.removeEventListener("mouseup",this._onMouseUp,!1),this._container.classList.remove("mapboxgl-crosshair"),this._box&&(this._box.parentNode.removeChild(this._box),this._box=null),DOM.enableDrag();},BoxZoomHandler.prototype._fireEvent=function(o,e){return this._map.fire(o,{originalEvent:e})},module.exports=BoxZoomHandler;
; |
393 | },{"../../geo/lng_lat_bounds":63,"../../util/dom":202,"../../util/util":215,"../../util/window":197}],183:[function(_dereq_,module,exports){
|
394 | var DoubleClickZoomHandler=function(o){this._map=o,this._onDblClick=this._onDblClick.bind(this);};DoubleClickZoomHandler.prototype.isEnabled=function(){return!!this._enabled},DoubleClickZoomHandler.prototype.enable=function(){this.isEnabled()||(this._map.on("dblclick",this._onDblClick),this._enabled=!0);},DoubleClickZoomHandler.prototype.disable=function(){this.isEnabled()&&(this._map.off("dblclick",this._onDblClick),this._enabled=!1);},DoubleClickZoomHandler.prototype._onDblClick=function(o){this._map.zoomTo(this._map.getZoom()+(o.originalEvent.shiftKey?-1:1),{around:o.lngLat},o);},module.exports=DoubleClickZoomHandler;
; |
395 | },{}],184:[function(_dereq_,module,exports){
|
396 | var DOM=_dereq_("../../util/dom"),util=_dereq_("../../util/util"),window=_dereq_("../../util/window"),inertiaLinearity=.3,inertiaEasing=util.bezier(0,0,inertiaLinearity,1),inertiaMaxSpeed=1400,inertiaDeceleration=2500,DragPanHandler=function(t){this._map=t,this._el=t.getCanvasContainer(),util.bindAll(["_onDown","_onMove","_onUp","_onTouchEnd","_onMouseUp"],this);};DragPanHandler.prototype.isEnabled=function(){return!!this._enabled},DragPanHandler.prototype.isActive=function(){return!!this._active},DragPanHandler.prototype.enable=function(){this.isEnabled()||(this._el.classList.add("mapboxgl-touch-drag-pan"),this._el.addEventListener("mousedown",this._onDown),this._el.addEventListener("touchstart",this._onDown),this._enabled=!0);},DragPanHandler.prototype.disable=function(){this.isEnabled()&&(this._el.classList.remove("mapboxgl-touch-drag-pan"),this._el.removeEventListener("mousedown",this._onDown),this._el.removeEventListener("touchstart",this._onDown),this._enabled=!1);},DragPanHandler.prototype._onDown=function(t){this._ignoreEvent(t)||this.isActive()||(t.touches?(window.document.addEventListener("touchmove",this._onMove),window.document.addEventListener("touchend",this._onTouchEnd)):(window.document.addEventListener("mousemove",this._onMove),window.document.addEventListener("mouseup",this._onMouseUp)),window.addEventListener("blur",this._onMouseUp),this._active=!1,this._startPos=this._pos=DOM.mousePos(this._el,t),this._inertia=[[Date.now(),this._pos]]);},DragPanHandler.prototype._onMove=function(t){if(!this._ignoreEvent(t)){this.isActive()||(this._active=!0,this._map.moving=!0,this._fireEvent("dragstart",t),this._fireEvent("movestart",t));var e=DOM.mousePos(this._el,t),n=this._map;n.stop(),this._drainInertiaBuffer(),this._inertia.push([Date.now(),e]),n.transform.setLocationAtPoint(n.transform.pointLocation(this._pos),e),this._fireEvent("drag",t),this._fireEvent("move",t),this._pos=e,t.preventDefault();}},DragPanHandler.prototype._onUp=function(t){var e=this;if(this.isActive()){this._active=!1,this._fireEvent("dragend",t),this._drainInertiaBuffer();var n=function(){e._map.moving=!1,e._fireEvent("moveend",t);},i=this._inertia;if(i.length<2)return void n();var o=i[i.length-1],r=i[0],a=o[1].sub(r[1]),s=(o[0]-r[0])/1e3;if(0===s||o[1].equals(r[1]))return void n();var u=a.mult(inertiaLinearity/s),d=u.mag();d>inertiaMaxSpeed&&(d=inertiaMaxSpeed,u._unit()._mult(d));var h=d/(inertiaDeceleration*inertiaLinearity),v=u.mult(-h/2);this._map.panBy(v,{duration:1e3*h,easing:inertiaEasing,noMoveStart:!0},{originalEvent:t});}},DragPanHandler.prototype._onMouseUp=function(t){this._ignoreEvent(t)||(this._onUp(t),window.document.removeEventListener("mousemove",this._onMove),window.document.removeEventListener("mouseup",this._onMouseUp),window.removeEventListener("blur",this._onMouseUp));},DragPanHandler.prototype._onTouchEnd=function(t){this._ignoreEvent(t)||(this._onUp(t),window.document.removeEventListener("touchmove",this._onMove),window.document.removeEventListener("touchend",this._onTouchEnd));},DragPanHandler.prototype._fireEvent=function(t,e){return this._map.fire(t,{originalEvent:e})},DragPanHandler.prototype._ignoreEvent=function(t){var e=this._map;if(e.boxZoom&&e.boxZoom.isActive())return!0;if(e.dragRotate&&e.dragRotate.isActive())return!0;if(t.touches)return t.touches.length>1;if(t.ctrlKey)return!0;var n=1,i=0;return"mousemove"===t.type?t.buttons&0===n:t.button&&t.button!==i},DragPanHandler.prototype._drainInertiaBuffer=function(){for(var t=this._inertia,e=Date.now(),n=160;t.length>0&&e-t[0][0]>n;)t.shift();},module.exports=DragPanHandler;
; |
397 | },{"../../util/dom":202,"../../util/util":215,"../../util/window":197}],185:[function(_dereq_,module,exports){
|
398 | var DOM=_dereq_("../../util/dom"),util=_dereq_("../../util/util"),window=_dereq_("../../util/window"),inertiaLinearity=.25,inertiaEasing=util.bezier(0,0,inertiaLinearity,1),inertiaMaxSpeed=180,inertiaDeceleration=720,DragRotateHandler=function(t,e){this._map=t,this._el=t.getCanvasContainer(),this._bearingSnap=e.bearingSnap,this._pitchWithRotate=e.pitchWithRotate!==!1,util.bindAll(["_onDown","_onMove","_onUp"],this);};DragRotateHandler.prototype.isEnabled=function(){return!!this._enabled},DragRotateHandler.prototype.isActive=function(){return!!this._active},DragRotateHandler.prototype.enable=function(){this.isEnabled()||(this._el.addEventListener("mousedown",this._onDown),this._enabled=!0);},DragRotateHandler.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("mousedown",this._onDown),this._enabled=!1);},DragRotateHandler.prototype._onDown=function(t){this._ignoreEvent(t)||this.isActive()||(window.document.addEventListener("mousemove",this._onMove),window.document.addEventListener("mouseup",this._onUp),window.addEventListener("blur",this._onUp),this._active=!1,this._inertia=[[Date.now(),this._map.getBearing()]],this._startPos=this._pos=DOM.mousePos(this._el,t),this._center=this._map.transform.centerPoint,t.preventDefault());},DragRotateHandler.prototype._onMove=function(t){if(!this._ignoreEvent(t)){this.isActive()||(this._active=!0,this._map.moving=!0,this._fireEvent("rotatestart",t),this._fireEvent("movestart",t),this._pitchWithRotate&&this._fireEvent("pitchstart",t));var e=this._map;e.stop();var i=this._pos,n=DOM.mousePos(this._el,t),r=.8*(i.x-n.x),a=(i.y-n.y)*-.5,o=e.getBearing()-r,s=e.getPitch()-a,h=this._inertia,_=h[h.length-1];this._drainInertiaBuffer(),h.push([Date.now(),e._normalizeBearing(o,_[1])]),e.transform.bearing=o,this._pitchWithRotate&&(this._fireEvent("pitch",t),e.transform.pitch=s),this._fireEvent("rotate",t),this._fireEvent("move",t),this._pos=n;}},DragRotateHandler.prototype._onUp=function(t){var e=this;if(!this._ignoreEvent(t)&&(window.document.removeEventListener("mousemove",this._onMove),window.document.removeEventListener("mouseup",this._onUp),window.removeEventListener("blur",this._onUp),this.isActive())){this._active=!1,this._fireEvent("rotateend",t),this._drainInertiaBuffer();var i=this._map,n=i.getBearing(),r=this._inertia,a=function(){Math.abs(n)<e._bearingSnap?i.resetNorth({noMoveStart:!0},{originalEvent:t}):(e._map.moving=!1,e._fireEvent("moveend",t)),e._pitchWithRotate&&e._fireEvent("pitchend",t);};if(r.length<2)return void a();var o=r[0],s=r[r.length-1],h=r[r.length-2],_=i._normalizeBearing(n,h[1]),v=s[1]-o[1],p=v<0?-1:1,d=(s[0]-o[0])/1e3;if(0===v||0===d)return void a();var u=Math.abs(v*(inertiaLinearity/d));u>inertiaMaxSpeed&&(u=inertiaMaxSpeed);var l=u/(inertiaDeceleration*inertiaLinearity),g=p*u*(l/2);_+=g,Math.abs(i._normalizeBearing(_,0))<this._bearingSnap&&(_=i._normalizeBearing(0,_)),i.rotateTo(_,{duration:1e3*l,easing:inertiaEasing,noMoveStart:!0},{originalEvent:t});}},DragRotateHandler.prototype._fireEvent=function(t,e){return this._map.fire(t,{originalEvent:e})},DragRotateHandler.prototype._ignoreEvent=function(t){var e=this._map;if(e.boxZoom&&e.boxZoom.isActive())return!0;if(e.dragPan&&e.dragPan.isActive())return!0;if(t.touches)return t.touches.length>1;var i=t.ctrlKey?1:2,n=t.ctrlKey?0:2,r=t.button;return"undefined"!=typeof InstallTrigger&&2===t.button&&t.ctrlKey&&window.navigator.platform.toUpperCase().indexOf("MAC")>=0&&(r=0),"mousemove"===t.type?t.buttons&0===i:!this.isActive()&&r!==n},DragRotateHandler.prototype._drainInertiaBuffer=function(){for(var t=this._inertia,e=Date.now(),i=160;t.length>0&&e-t[0][0]>i;)t.shift();},module.exports=DragRotateHandler;
; |
399 | },{"../../util/dom":202,"../../util/util":215,"../../util/window":197}],186:[function(_dereq_,module,exports){
|
400 | function easeOut(e){return e*(2-e)}var panStep=100,bearingStep=15,pitchStep=10,KeyboardHandler=function(e){this._map=e,this._el=e.getCanvasContainer(),this._onKeyDown=this._onKeyDown.bind(this);};KeyboardHandler.prototype.isEnabled=function(){return!!this._enabled},KeyboardHandler.prototype.enable=function(){this.isEnabled()||(this._el.addEventListener("keydown",this._onKeyDown,!1),this._enabled=!0);},KeyboardHandler.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("keydown",this._onKeyDown),this._enabled=!1);},KeyboardHandler.prototype._onKeyDown=function(e){if(!(e.altKey||e.ctrlKey||e.metaKey)){var t=0,a=0,n=0,r=0,i=0;switch(e.keyCode){case 61:case 107:case 171:case 187:t=1;break;case 189:case 109:case 173:t=-1;break;case 37:e.shiftKey?a=-1:(e.preventDefault(),r=-1);break;case 39:e.shiftKey?a=1:(e.preventDefault(),r=1);break;case 38:e.shiftKey?n=1:(e.preventDefault(),i=-1);break;case 40:e.shiftKey?n=-1:(i=1,e.preventDefault());break;default:return}var s=this._map,o=s.getZoom(),d={duration:300,delayEndEvents:500,easing:easeOut,zoom:t?Math.round(o)+t*(e.shiftKey?2:1):o,bearing:s.getBearing()+a*bearingStep,pitch:s.getPitch()+n*pitchStep,offset:[-r*panStep,-i*panStep],center:s.getCenter()};s.easeTo(d,{originalEvent:e});}},module.exports=KeyboardHandler;
; |
401 | },{}],187:[function(_dereq_,module,exports){
|
402 | var DOM=_dereq_("../../util/dom"),util=_dereq_("../../util/util"),browser=_dereq_("../../util/browser"),window=_dereq_("../../util/window"),ua=window.navigator.userAgent.toLowerCase(),firefox=ua.indexOf("firefox")!==-1,safari=ua.indexOf("safari")!==-1&&ua.indexOf("chrom")===-1,ScrollZoomHandler=function(e){this._map=e,this._el=e.getCanvasContainer(),util.bindAll(["_onWheel","_onTimeout"],this);};ScrollZoomHandler.prototype.isEnabled=function(){return!!this._enabled},ScrollZoomHandler.prototype.enable=function(e){this.isEnabled()||(this._el.addEventListener("wheel",this._onWheel,!1),this._el.addEventListener("mousewheel",this._onWheel,!1),this._enabled=!0,this._aroundCenter=e&&"center"===e.around);},ScrollZoomHandler.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("wheel",this._onWheel),this._el.removeEventListener("mousewheel",this._onWheel),this._enabled=!1);},ScrollZoomHandler.prototype._onWheel=function(e){var t;"wheel"===e.type?(t=e.deltaY,firefox&&e.deltaMode===window.WheelEvent.DOM_DELTA_PIXEL&&(t/=browser.devicePixelRatio),e.deltaMode===window.WheelEvent.DOM_DELTA_LINE&&(t*=40)):"mousewheel"===e.type&&(t=-e.wheelDeltaY,safari&&(t/=3));var o=browser.now(),i=o-(this._time||0);this._pos=DOM.mousePos(this._el,e),this._time=o,0!==t&&t%4.000244140625===0?this._type="wheel":0!==t&&Math.abs(t)<4?this._type="trackpad":i>400?(this._type=null,this._lastValue=t,this._timeout=setTimeout(this._onTimeout,40)):this._type||(this._type=Math.abs(i*t)<200?"trackpad":"wheel",this._timeout&&(clearTimeout(this._timeout),this._timeout=null,t+=this._lastValue)),e.shiftKey&&t&&(t/=4),this._type&&this._zoom(-t,e),e.preventDefault();},ScrollZoomHandler.prototype._onTimeout=function(){this._type="wheel",this._zoom(-this._lastValue);},ScrollZoomHandler.prototype._zoom=function(e,t){if(0!==e){var o=this._map,i=2/(1+Math.exp(-Math.abs(e/100)));e<0&&0!==i&&(i=1/i);var l=o.ease?o.ease.to:o.transform.scale,s=o.transform.scaleZoom(l*i);o.zoomTo(s,{duration:"wheel"===this._type?200:0,around:this._aroundCenter?o.getCenter():o.unproject(this._pos),delayEndEvents:200,smoothEasing:!0},{originalEvent:t});}},module.exports=ScrollZoomHandler;
; |
403 | },{"../../util/browser":195,"../../util/dom":202,"../../util/util":215,"../../util/window":197}],188:[function(_dereq_,module,exports){
|
404 | var DOM=_dereq_("../../util/dom"),util=_dereq_("../../util/util"),window=_dereq_("../../util/window"),inertiaLinearity=.15,inertiaEasing=util.bezier(0,0,inertiaLinearity,1),inertiaDeceleration=12,inertiaMaxSpeed=2.5,significantScaleThreshold=.15,significantRotateThreshold=4,TouchZoomRotateHandler=function(t){this._map=t,this._el=t.getCanvasContainer(),util.bindAll(["_onStart","_onMove","_onEnd"],this);};TouchZoomRotateHandler.prototype.isEnabled=function(){return!!this._enabled},TouchZoomRotateHandler.prototype.enable=function(t){this.isEnabled()||(this._el.classList.add("mapboxgl-touch-zoom-rotate"),this._el.addEventListener("touchstart",this._onStart,!1),this._enabled=!0,this._aroundCenter=t&&"center"===t.around);},TouchZoomRotateHandler.prototype.disable=function(){this.isEnabled()&&(this._el.classList.remove("mapboxgl-touch-zoom-rotate"),this._el.removeEventListener("touchstart",this._onStart),this._enabled=!1);},TouchZoomRotateHandler.prototype.disableRotation=function(){this._rotationDisabled=!0;},TouchZoomRotateHandler.prototype.enableRotation=function(){this._rotationDisabled=!1;},TouchZoomRotateHandler.prototype._onStart=function(t){if(2===t.touches.length){var e=DOM.mousePos(this._el,t.touches[0]),o=DOM.mousePos(this._el,t.touches[1]);this._startVec=e.sub(o),this._startScale=this._map.transform.scale,this._startBearing=this._map.transform.bearing,this._gestureIntent=void 0,this._inertia=[],window.document.addEventListener("touchmove",this._onMove,!1),window.document.addEventListener("touchend",this._onEnd,!1);}},TouchZoomRotateHandler.prototype._onMove=function(t){if(2===t.touches.length){var e=DOM.mousePos(this._el,t.touches[0]),o=DOM.mousePos(this._el,t.touches[1]),i=e.add(o).div(2),n=e.sub(o),a=n.mag()/this._startVec.mag(),r=this._rotationDisabled?0:180*n.angleWith(this._startVec)/Math.PI,s=this._map;if(this._gestureIntent){var h={duration:0,around:s.unproject(i)};"rotate"===this._gestureIntent&&(h.bearing=this._startBearing+r),"zoom"!==this._gestureIntent&&"rotate"!==this._gestureIntent||(h.zoom=s.transform.scaleZoom(this._startScale*a)),s.stop(),this._drainInertiaBuffer(),this._inertia.push([Date.now(),a,i]),s.easeTo(h,{originalEvent:t});}else{var u=Math.abs(1-a)>significantScaleThreshold,l=Math.abs(r)>significantRotateThreshold;l?this._gestureIntent="rotate":u&&(this._gestureIntent="zoom"),this._gestureIntent&&(this._startVec=n,this._startScale=s.transform.scale,this._startBearing=s.transform.bearing);}t.preventDefault();}},TouchZoomRotateHandler.prototype._onEnd=function(t){window.document.removeEventListener("touchmove",this._onMove),window.document.removeEventListener("touchend",this._onEnd),this._drainInertiaBuffer();var e=this._inertia,o=this._map;if(e.length<2)return void o.snapToNorth({},{originalEvent:t});var i=e[e.length-1],n=e[0],a=o.transform.scaleZoom(this._startScale*i[1]),r=o.transform.scaleZoom(this._startScale*n[1]),s=a-r,h=(i[0]-n[0])/1e3,u=i[2];if(0===h||a===r)return void o.snapToNorth({},{originalEvent:t});var l=s*inertiaLinearity/h;Math.abs(l)>inertiaMaxSpeed&&(l=l>0?inertiaMaxSpeed:-inertiaMaxSpeed);var d=1e3*Math.abs(l/(inertiaDeceleration*inertiaLinearity)),c=a+l*d/2e3;c<0&&(c=0),o.easeTo({zoom:c,duration:d,easing:inertiaEasing,around:this._aroundCenter?o.getCenter():o.unproject(u)},{originalEvent:t});},TouchZoomRotateHandler.prototype._drainInertiaBuffer=function(){for(var t=this._inertia,e=Date.now(),o=160;t.length>2&&e-t[0][0]>o;)t.shift();},module.exports=TouchZoomRotateHandler;
; |
405 | },{"../../util/dom":202,"../../util/util":215,"../../util/window":197}],189:[function(_dereq_,module,exports){
|
406 | var util=_dereq_("../util/util"),window=_dereq_("../util/window"),Hash=function(){util.bindAll(["_onHashChange","_updateHash"],this);};Hash.prototype.addTo=function(t){return this._map=t,window.addEventListener("hashchange",this._onHashChange,!1),this._map.on("moveend",this._updateHash),this},Hash.prototype.remove=function(){return window.removeEventListener("hashchange",this._onHashChange,!1),this._map.off("moveend",this._updateHash),delete this._map,this},Hash.prototype._onHashChange=function(){var t=window.location.hash.replace("#","").split("/");return t.length>=3&&(this._map.jumpTo({center:[+t[2],+t[1]],zoom:+t[0],bearing:+(t[3]||0),pitch:+(t[4]||0)}),!0)},Hash.prototype._updateHash=function(){var t=this._map.getCenter(),e=this._map.getZoom(),a=this._map.getBearing(),h=this._map.getPitch(),i=Math.max(0,Math.ceil(Math.log(e)/Math.LN2)),n="#"+Math.round(100*e)/100+"/"+t.lat.toFixed(i)+"/"+t.lng.toFixed(i);(a||h)&&(n+="/"+Math.round(10*a)/10),h&&(n+="/"+Math.round(h)),window.history.replaceState("","",n);},module.exports=Hash;
; |
407 | },{"../util/util":215,"../util/window":197}],190:[function(_dereq_,module,exports){
|
408 | function removeNode(t){t.parentNode&&t.parentNode.removeChild(t);}var util=_dereq_("../util/util"),browser=_dereq_("../util/browser"),window=_dereq_("../util/window"),DOM=_dereq_("../util/dom"),ajax=_dereq_("../util/ajax"),Style=_dereq_("../style/style"),AnimationLoop=_dereq_("../style/animation_loop"),Painter=_dereq_("../render/painter"),Transform=_dereq_("../geo/transform"),Hash=_dereq_("./hash"),bindHandlers=_dereq_("./bind_handlers"),Camera=_dereq_("./camera"),LngLat=_dereq_("../geo/lng_lat"),LngLatBounds=_dereq_("../geo/lng_lat_bounds"),Point=_dereq_("point-geometry"),AttributionControl=_dereq_("./control/attribution_control"),LogoControl=_dereq_("./control/logo_control"),isSupported=_dereq_("mapbox-gl-supported"),defaultMinZoom=0,defaultMaxZoom=22,defaultOptions={center:[0,0],zoom:0,bearing:0,pitch:0,minZoom:defaultMinZoom,maxZoom:defaultMaxZoom,interactive:!0,scrollZoom:!0,boxZoom:!0,dragRotate:!0,dragPan:!0,keyboard:!0,doubleClickZoom:!0,touchZoomRotate:!0,bearingSnap:7,hash:!1,attributionControl:!0,failIfMajorPerformanceCaveat:!1,preserveDrawingBuffer:!1,trackResize:!0,renderWorldCopies:!0,refreshExpiredTiles:!0},Map=function(t){function e(e){var o=this;if(e=util.extend({},defaultOptions,e),null!=e.minZoom&&null!=e.maxZoom&&e.minZoom>e.maxZoom)throw new Error("maxZoom must be greater than minZoom");var i=new Transform(e.minZoom,e.maxZoom,e.renderWorldCopies);if(t.call(this,i,e),this._interactive=e.interactive,this._failIfMajorPerformanceCaveat=e.failIfMajorPerformanceCaveat,this._preserveDrawingBuffer=e.preserveDrawingBuffer,this._trackResize=e.trackResize,this._bearingSnap=e.bearingSnap,this._refreshExpiredTiles=e.refreshExpiredTiles,"string"==typeof e.container){if(this._container=window.document.getElementById(e.container),!this._container)throw new Error("Container '"+e.container+"' not found.")}else this._container=e.container;this.animationLoop=new AnimationLoop,e.maxBounds&&this.setMaxBounds(e.maxBounds),util.bindAll(["_onWindowOnline","_onWindowResize","_contextLost","_contextRestored","_update","_render","_onData","_onDataLoading"],this),this._setupContainer(),this._setupPainter(),this.on("move",this._update.bind(this,!1)),this.on("zoom",this._update.bind(this,!0)),this.on("moveend",function(){o.animationLoop.set(300),o._rerender();}),"undefined"!=typeof window&&(window.addEventListener("online",this._onWindowOnline,!1),window.addEventListener("resize",this._onWindowResize,!1)),bindHandlers(this,e),this._hash=e.hash&&(new Hash).addTo(this),this._hash&&this._hash._onHashChange()||this.jumpTo({center:e.center,zoom:e.zoom,bearing:e.bearing,pitch:e.pitch}),this._classes=[],this.resize(),e.classes&&this.setClasses(e.classes),e.style&&this.setStyle(e.style),e.attributionControl&&this.addControl(new AttributionControl),this.addControl(new LogoControl,e.logoPosition),this.on("style.load",function(){this.transform.unmodified&&this.jumpTo(this.style.stylesheet),this.style.update(this._classes,{transition:!1});}),this.on("data",this._onData),this.on("dataloading",this._onDataLoading);}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var o={showTileBoundaries:{},showCollisionBoxes:{},showOverdrawInspector:{},repaint:{},vertices:{}};return e.prototype.addControl=function(t,e){void 0===e&&t.getDefaultPosition&&(e=t.getDefaultPosition()),void 0===e&&(e="top-right");var o=t.onAdd(this),i=this._controlPositions[e];return e.indexOf("bottom")!==-1?i.insertBefore(o,i.firstChild):i.appendChild(o),this},e.prototype.removeControl=function(t){return t.onRemove(this),this},e.prototype.addClass=function(t,e){return util.warnOnce("Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS."),this._classes.indexOf(t)>=0||""===t?this:(this._classes.push(t),this._classOptions=e,this.style&&this.style.updateClasses(),this._update(!0))},e.prototype.removeClass=function(t,e){util.warnOnce("Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS.");var o=this._classes.indexOf(t);return o<0||""===t?this:(this._classes.splice(o,1),this._classOptions=e,this.style&&this.style.updateClasses(),this._update(!0))},e.prototype.setClasses=function(t,e){util.warnOnce("Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS.");for(var o={},i=0;i<t.length;i++)""!==t[i]&&(o[t[i]]=!0);return this._classes=Object.keys(o),this._classOptions=e,this.style&&this.style.updateClasses(),this._update(!0)},e.prototype.hasClass=function(t){return util.warnOnce("Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS."),this._classes.indexOf(t)>=0},e.prototype.getClasses=function(){return util.warnOnce("Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS."),this._classes},e.prototype.resize=function(){var t=this._containerDimensions(),e=t[0],o=t[1];return this._resizeCanvas(e,o),this.transform.resize(e,o),this.painter.resize(e,o),this.fire("movestart").fire("move").fire("resize").fire("moveend")},e.prototype.getBounds=function(){var t=new LngLatBounds(this.transform.pointLocation(new Point(0,this.transform.height)),this.transform.pointLocation(new Point(this.transform.width,0)));return(this.transform.angle||this.transform.pitch)&&(t.extend(this.transform.pointLocation(new Point(this.transform.size.x,0))),t.extend(this.transform.pointLocation(new Point(0,this.transform.size.y)))),t},e.prototype.setMaxBounds=function(t){if(t){var e=LngLatBounds.convert(t);this.transform.lngRange=[e.getWest(),e.getEast()],this.transform.latRange=[e.getSouth(),e.getNorth()],this.transform._constrain(),this._update();}else null!==t&&void 0!==t||(this.transform.lngRange=[],this.transform.latRange=[],this._update());return this},e.prototype.setMinZoom=function(t){if(t=null===t||void 0===t?defaultMinZoom:t,t>=defaultMinZoom&&t<=this.transform.maxZoom)return this.transform.minZoom=t,this._update(),this.getZoom()<t&&this.setZoom(t),this;throw new Error("minZoom must be between "+defaultMinZoom+" and the current maxZoom, inclusive")},e.prototype.getMinZoom=function(){return this.transform.minZoom},e.prototype.setMaxZoom=function(t){if(t=null===t||void 0===t?defaultMaxZoom:t,t>=this.transform.minZoom)return this.transform.maxZoom=t,this._update(),this.getZoom()>t&&this.setZoom(t),this;throw new Error("maxZoom must be greater than the current minZoom")},e.prototype.getMaxZoom=function(){return this.transform.maxZoom},e.prototype.project=function(t){return this.transform.locationPoint(LngLat.convert(t))},e.prototype.unproject=function(t){return this.transform.pointLocation(Point.convert(t))},e.prototype.on=function(e,o,i){var r=this;if(void 0===i)return t.prototype.on.call(this,e,o);var s=function(){if("mouseenter"===e||"mouseover"===e){var t=!1,s=function(s){var n=r.queryRenderedFeatures(s.point,{layers:[o]});n.length?t||(t=!0,i.call(r,util.extend({features:n},s,{type:e}))):t=!1;},n=function(){t=!1;};return{layer:o,listener:i,delegates:{mousemove:s,mouseout:n}}}if("mouseleave"===e||"mouseout"===e){var a=!1,h=function(t){var s=r.queryRenderedFeatures(t.point,{layers:[o]});s.length?a=!0:a&&(a=!1,i.call(r,util.extend({},t,{type:e})));},l=function(t){a&&(a=!1,i.call(r,util.extend({},t,{type:e})));};return{layer:o,listener:i,delegates:{mousemove:h,mouseout:l}}}var u=function(t){var e=r.queryRenderedFeatures(t.point,{layers:[o]});e.length&&i.call(r,util.extend({features:e},t));};return{layer:o,listener:i,delegates:(d={},d[e]=u,d)};var d;}();this._delegatedListeners=this._delegatedListeners||{},this._delegatedListeners[e]=this._delegatedListeners[e]||[],this._delegatedListeners[e].push(s);for(var n in s.delegates)r.on(n,s.delegates[n]);return this},e.prototype.off=function(e,o,i){var r=this;if(void 0===i)return t.prototype.off.call(this,e,o);if(this._delegatedListeners&&this._delegatedListeners[e])for(var s=this._delegatedListeners[e],n=0;n<s.length;n++){var a=s[n];if(a.layer===o&&a.listener===i){for(var h in a.delegates)r.off(h,a.delegates[h]);return s.splice(n,1),r}}},e.prototype.queryRenderedFeatures=function(){function t(t){return t instanceof Point||Array.isArray(t)}var e,o={};return 2===arguments.length?(e=arguments[0],o=arguments[1]):1===arguments.length&&t(arguments[0])?e=arguments[0]:1===arguments.length&&(o=arguments[0]),this.style?this.style.queryRenderedFeatures(this._makeQueryGeometry(e),o,this.transform.zoom,this.transform.angle):[]},e.prototype._makeQueryGeometry=function(t){var e=this;void 0===t&&(t=[Point.convert([0,0]),Point.convert([this.transform.width,this.transform.height])]);var o,i=t instanceof Point||"number"==typeof t[0];if(i){var r=Point.convert(t);o=[r];}else{var s=[Point.convert(t[0]),Point.convert(t[1])];o=[s[0],new Point(s[1].x,s[0].y),s[1],new Point(s[0].x,s[1].y),s[0]];}return o=o.map(function(t){return e.transform.pointCoordinate(t)})},e.prototype.querySourceFeatures=function(t,e){return this.style.querySourceFeatures(t,e)},e.prototype.setStyle=function(t,e){var o=(!e||e.diff!==!1)&&this.style&&t&&!(t instanceof Style)&&"string"!=typeof t;if(o)try{return this.style.setState(t)&&this._update(!0),this}catch(t){util.warnOnce("Unable to perform style diff: "+(t.message||t.error||t)+". Rebuilding the style from scratch.");}return this.style&&(this.style.setEventedParent(null),this.style._remove(),this.off("rotate",this.style._redoPlacement),this.off("pitch",this.style._redoPlacement)),t?(t instanceof Style?this.style=t:this.style=new Style(t,this),this.style.setEventedParent(this,{style:this.style}),this.on("rotate",this.style._redoPlacement),this.on("pitch",this.style._redoPlacement),this):(this.style=null,this)},e.prototype.getStyle=function(){if(this.style)return this.style.serialize()},e.prototype.isStyleLoaded=function(){return this.style?this.style.loaded():util.warnOnce("There is no style added to the map.")},e.prototype.addSource=function(t,e){return this.style.addSource(t,e),this._update(!0),this},e.prototype.isSourceLoaded=function(t){var e=this.style&&this.style.sourceCaches[t];return void 0===e?void this.fire("error",{error:new Error("There is no source with ID '"+t+"'")}):e.loaded()},e.prototype.areTilesLoaded=function(){var t=this.style&&this.style.sourceCaches;for(var e in t){var o=t[e],i=o._tiles;for(var r in i){var s=i[r];if("loaded"!==s.state&&"errored"!==s.state)return!1}}return!0},e.prototype.addSourceType=function(t,e,o){return this.style.addSourceType(t,e,o)},e.prototype.removeSource=function(t){return this.style.removeSource(t),this._update(!0),this},e.prototype.getSource=function(t){return this.style.getSource(t)},e.prototype.addImage=function(t,e,o){this.style.spriteAtlas.addImage(t,e,o);},e.prototype.removeImage=function(t){this.style.spriteAtlas.removeImage(t);},e.prototype.loadImage=function(t,e){ajax.getImage(t,e);},e.prototype.addLayer=function(t,e){return this.style.addLayer(t,e),this._update(!0),this},e.prototype.moveLayer=function(t,e){return this.style.moveLayer(t,e),this._update(!0),this},e.prototype.removeLayer=function(t){return this.style.removeLayer(t),this._update(!0),this},e.prototype.getLayer=function(t){return this.style.getLayer(t)},e.prototype.setFilter=function(t,e){return this.style.setFilter(t,e),this._update(!0),this},e.prototype.setLayerZoomRange=function(t,e,o){return this.style.setLayerZoomRange(t,e,o),this._update(!0),this},e.prototype.getFilter=function(t){return this.style.getFilter(t)},e.prototype.setPaintProperty=function(t,e,o,i){return this.style.setPaintProperty(t,e,o,i),this._update(!0),this},e.prototype.getPaintProperty=function(t,e,o){return this.style.getPaintProperty(t,e,o)},e.prototype.setLayoutProperty=function(t,e,o){return this.style.setLayoutProperty(t,e,o),this._update(!0),this},e.prototype.getLayoutProperty=function(t,e){return this.style.getLayoutProperty(t,e)},e.prototype.setLight=function(t){return this.style.setLight(t),this._update(!0),this},e.prototype.getLight=function(){return this.style.getLight()},e.prototype.getContainer=function(){return this._container},e.prototype.getCanvasContainer=function(){return this._canvasContainer},e.prototype.getCanvas=function(){return this._canvas},e.prototype._containerDimensions=function(){var t=0,e=0;return this._container&&(t=this._container.offsetWidth||400,e=this._container.offsetHeight||300),[t,e]},e.prototype._setupContainer=function(){var t=this._container;t.classList.add("mapboxgl-map");var e=this._canvasContainer=DOM.create("div","mapboxgl-canvas-container",t);this._interactive&&e.classList.add("mapboxgl-interactive"),this._canvas=DOM.create("canvas","mapboxgl-canvas",e),this._canvas.style.position="absolute",this._canvas.addEventListener("webglcontextlost",this._contextLost,!1),this._canvas.addEventListener("webglcontextrestored",this._contextRestored,!1),this._canvas.setAttribute("tabindex",0),this._canvas.setAttribute("aria-label","Map");var o=this._containerDimensions();this._resizeCanvas(o[0],o[1]);var i=this._controlContainer=DOM.create("div","mapboxgl-control-container",t),r=this._controlPositions={};["top-left","top-right","bottom-left","bottom-right"].forEach(function(t){r[t]=DOM.create("div","mapboxgl-ctrl-"+t,i);});},e.prototype._resizeCanvas=function(t,e){var o=window.devicePixelRatio||1;this._canvas.width=o*t,this._canvas.height=o*e,this._canvas.style.width=t+"px",this._canvas.style.height=e+"px";},e.prototype._setupPainter=function(){var t=util.extend({failIfMajorPerformanceCaveat:this._failIfMajorPerformanceCaveat,preserveDrawingBuffer:this._preserveDrawingBuffer},isSupported.webGLContextAttributes),e=this._canvas.getContext("webgl",t)||this._canvas.getContext("experimental-webgl",t);return e?void(this.painter=new Painter(e,this.transform)):void this.fire("error",{error:new Error("Failed to initialize WebGL")})},e.prototype._contextLost=function(t){t.preventDefault(),this._frameId&&browser.cancelFrame(this._frameId),this.fire("webglcontextlost",{originalEvent:t});},e.prototype._contextRestored=function(t){this._setupPainter(),this.resize(),this._update(),this.fire("webglcontextrestored",{originalEvent:t});},e.prototype.loaded=function(){return!this._styleDirty&&!this._sourcesDirty&&!(!this.style||!this.style.loaded())},e.prototype._update=function(t){return this.style?(this._styleDirty=this._styleDirty||t,this._sourcesDirty=!0,this._rerender(),this):this},e.prototype._render=function(){return this.style&&this._styleDirty&&(this._styleDirty=!1,this.style.update(this._classes,this._classOptions),this._classOptions=null,this.style._recalculate(this.transform.zoom)),this.style&&this._sourcesDirty&&(this._sourcesDirty=!1,this.style._updateSources(this.transform)),this.painter.render(this.style,{showTileBoundaries:this.showTileBoundaries,showOverdrawInspector:this._showOverdrawInspector,rotating:this.rotating,zooming:this.zooming}),this.fire("render"),this.loaded()&&!this._loaded&&(this._loaded=!0,this.fire("load")),this._frameId=null,this.animationLoop.stopped()||(this._styleDirty=!0),(this._sourcesDirty||this._repaint||this._styleDirty)&&this._rerender(),this},e.prototype.remove=function(){this._hash&&this._hash.remove(),browser.cancelFrame(this._frameId),this.setStyle(null),"undefined"!=typeof window&&(window.removeEventListener("resize",this._onWindowResize,!1),window.removeEventListener("online",this._onWindowOnline,!1));var t=this.painter.gl.getExtension("WEBGL_lose_context");t&&t.loseContext(),removeNode(this._canvasContainer),removeNode(this._controlContainer),this._container.classList.remove("mapboxgl-map"),this.fire("remove");},e.prototype._rerender=function(){this.style&&!this._frameId&&(this._frameId=browser.frame(this._render));},e.prototype._onWindowOnline=function(){this._update();},e.prototype._onWindowResize=function(){this._trackResize&&this.stop().resize()._update();},o.showTileBoundaries.get=function(){return!!this._showTileBoundaries},o.showTileBoundaries.set=function(t){this._showTileBoundaries!==t&&(this._showTileBoundaries=t,this._update());},o.showCollisionBoxes.get=function(){return!!this._showCollisionBoxes},o.showCollisionBoxes.set=function(t){this._showCollisionBoxes!==t&&(this._showCollisionBoxes=t,this.style._redoPlacement());},o.showOverdrawInspector.get=function(){return!!this._showOverdrawInspector},o.showOverdrawInspector.set=function(t){this._showOverdrawInspector!==t&&(this._showOverdrawInspector=t,this._update());},o.repaint.get=function(){return!!this._repaint},o.repaint.set=function(t){this._repaint=t,this._update();},o.vertices.get=function(){return!!this._vertices},o.vertices.set=function(t){this._vertices=t,this._update();},e.prototype._onData=function(t){this._update("style"===t.dataType),this.fire(t.dataType+"data",t);},e.prototype._onDataLoading=function(t){this.fire(t.dataType+"dataloading",t);},Object.defineProperties(e.prototype,o),e}(Camera);module.exports=Map;
; |
409 | },{"../geo/lng_lat":62,"../geo/lng_lat_bounds":63,"../geo/transform":64,"../render/painter":77,"../style/animation_loop":146,"../style/style":149,"../util/ajax":194,"../util/browser":195,"../util/dom":202,"../util/util":215,"../util/window":197,"./bind_handlers":174,"./camera":175,"./control/attribution_control":176,"./control/logo_control":179,"./hash":189,"mapbox-gl-supported":22,"point-geometry":26}],191:[function(_dereq_,module,exports){
|
410 | var DOM=_dereq_("../util/dom"),LngLat=_dereq_("../geo/lng_lat"),Point=_dereq_("point-geometry"),smartWrap=_dereq_("../util/smart_wrap"),Marker=function(t,e){this._offset=Point.convert(e&&e.offset||[0,0]),this._update=this._update.bind(this),this._onMapClick=this._onMapClick.bind(this),t||(t=DOM.create("div")),t.classList.add("mapboxgl-marker"),this._element=t,this._popup=null;};Marker.prototype.addTo=function(t){return this.remove(),this._map=t,t.getCanvasContainer().appendChild(this._element),t.on("move",this._update),t.on("moveend",this._update),this._update(),this._map.on("click",this._onMapClick),this},Marker.prototype.remove=function(){return this._map&&(this._map.off("click",this._onMapClick),this._map.off("move",this._update),this._map.off("moveend",this._update),this._map=null),DOM.remove(this._element),this._popup&&this._popup.remove(),this},Marker.prototype.getLngLat=function(){return this._lngLat},Marker.prototype.setLngLat=function(t){return this._lngLat=LngLat.convert(t),this._pos=null,this._popup&&this._popup.setLngLat(this._lngLat),this._update(),this},Marker.prototype.getElement=function(){return this._element},Marker.prototype.setPopup=function(t){return this._popup&&(this._popup.remove(),this._popup=null),t&&(this._popup=t,this._popup.setLngLat(this._lngLat)),this},Marker.prototype._onMapClick=function(t){var e=t.originalEvent.target,p=this._element;this._popup&&(e===p||p.contains(e))&&this.togglePopup();},Marker.prototype.getPopup=function(){return this._popup},Marker.prototype.togglePopup=function(){var t=this._popup;t&&(t.isOpen()?t.remove():t.addTo(this._map));},Marker.prototype._update=function(t){this._map&&(this._map.transform.renderWorldCopies&&(this._lngLat=smartWrap(this._lngLat,this._pos,this._map.transform)),this._pos=this._map.project(this._lngLat)._add(this._offset),t&&"moveend"!==t.type||(this._pos=this._pos.round()),DOM.setTransform(this._element,"translate("+this._pos.x+"px, "+this._pos.y+"px)"));},module.exports=Marker;
; |
411 | },{"../geo/lng_lat":62,"../util/dom":202,"../util/smart_wrap":212,"point-geometry":26}],192:[function(_dereq_,module,exports){
|
412 | function normalizeOffset(t){if(t){if("number"==typeof t){var o=Math.round(Math.sqrt(.5*Math.pow(t,2)));return{top:new Point(0,t),"top-left":new Point(o,o),"top-right":new Point(-o,o),bottom:new Point(0,-t),"bottom-left":new Point(o,-o),"bottom-right":new Point(-o,-o),left:new Point(t,0),right:new Point(-t,0)}}if(isPointLike(t)){var e=Point.convert(t);return{top:e,"top-left":e,"top-right":e,bottom:e,"bottom-left":e,"bottom-right":e,left:e,right:e}}return{top:Point.convert(t.top||[0,0]),"top-left":Point.convert(t["top-left"]||[0,0]),"top-right":Point.convert(t["top-right"]||[0,0]),bottom:Point.convert(t.bottom||[0,0]),"bottom-left":Point.convert(t["bottom-left"]||[0,0]),"bottom-right":Point.convert(t["bottom-right"]||[0,0]),left:Point.convert(t.left||[0,0]),right:Point.convert(t.right||[0,0])}}return normalizeOffset(new Point(0,0))}function isPointLike(t){return t instanceof Point||Array.isArray(t)}var util=_dereq_("../util/util"),Evented=_dereq_("../util/evented"),DOM=_dereq_("../util/dom"),LngLat=_dereq_("../geo/lng_lat"),Point=_dereq_("point-geometry"),window=_dereq_("../util/window"),smartWrap=_dereq_("../util/smart_wrap"),defaultOptions={closeButton:!0,closeOnClick:!0},Popup=function(t){function o(o){t.call(this),this.options=util.extend(Object.create(defaultOptions),o),util.bindAll(["_update","_onClickClose"],this);}return t&&(o.__proto__=t),o.prototype=Object.create(t&&t.prototype),o.prototype.constructor=o,o.prototype.addTo=function(t){return this._map=t,this._map.on("move",this._update),this.options.closeOnClick&&this._map.on("click",this._onClickClose),this._update(),this},o.prototype.isOpen=function(){return!!this._map},o.prototype.remove=function(){return this._content&&this._content.parentNode&&this._content.parentNode.removeChild(this._content),this._container&&(this._container.parentNode.removeChild(this._container),delete this._container),this._map&&(this._map.off("move",this._update),this._map.off("click",this._onClickClose),delete this._map),this.fire("close"),this},o.prototype.getLngLat=function(){return this._lngLat},o.prototype.setLngLat=function(t){return this._lngLat=LngLat.convert(t),this._pos=null,this._update(),this},o.prototype.setText=function(t){return this.setDOMContent(window.document.createTextNode(t))},o.prototype.setHTML=function(t){var o,e=window.document.createDocumentFragment(),n=window.document.createElement("body");for(n.innerHTML=t;;){if(o=n.firstChild,!o)break;e.appendChild(o);}return this.setDOMContent(e)},o.prototype.setDOMContent=function(t){return this._createContent(),this._content.appendChild(t),this._update(),this},o.prototype._createContent=function(){this._content&&this._content.parentNode&&this._content.parentNode.removeChild(this._content),this._content=DOM.create("div","mapboxgl-popup-content",this._container),this.options.closeButton&&(this._closeButton=DOM.create("button","mapboxgl-popup-close-button",this._content),this._closeButton.type="button",this._closeButton.innerHTML="×",this._closeButton.addEventListener("click",this._onClickClose));},o.prototype._update=function(){if(this._map&&this._lngLat&&this._content){this._container||(this._container=DOM.create("div","mapboxgl-popup",this._map.getContainer()),this._tip=DOM.create("div","mapboxgl-popup-tip",this._container),this._container.appendChild(this._content)),this._map.transform.renderWorldCopies&&(this._lngLat=smartWrap(this._lngLat,this._pos,this._map.transform)),this._pos=this._map.project(this._lngLat);var t=this.options.anchor,o=normalizeOffset(this.options.offset);if(!t){var e=this._container.offsetWidth,n=this._container.offsetHeight;t=this._pos.y+o.bottom.y<n?["top"]:this._pos.y>this._map.transform.height-n?["bottom"]:[],this._pos.x<e/2?t.push("left"):this._pos.x>this._map.transform.width-e/2&&t.push("right"),t=0===t.length?"bottom":t.join("-");}var i=this._pos.add(o[t]).round(),r={top:"translate(-50%,0)","top-left":"translate(0,0)","top-right":"translate(-100%,0)",bottom:"translate(-50%,-100%)","bottom-left":"translate(0,-100%)","bottom-right":"translate(-100%,-100%)",left:"translate(0,-50%)",right:"translate(-100%,-50%)"},s=this._container.classList;for(var p in r)s.remove("mapboxgl-popup-anchor-"+p);s.add("mapboxgl-popup-anchor-"+t),DOM.setTransform(this._container,r[t]+" translate("+i.x+"px,"+i.y+"px)");}},o.prototype._onClickClose=function(){this.remove();},o}(Evented);module.exports=Popup;
; |
413 | },{"../geo/lng_lat":62,"../util/dom":202,"../util/evented":203,"../util/smart_wrap":212,"../util/util":215,"../util/window":197,"point-geometry":26}],193:[function(_dereq_,module,exports){
|
414 | var Actor=function(t,e,a){this.target=t,this.parent=e,this.mapId=a,this.callbacks={},this.callbackID=0,this.receive=this.receive.bind(this),this.target.addEventListener("message",this.receive,!1);};Actor.prototype.send=function(t,e,a,r,s){var i=a?this.mapId+":"+this.callbackID++:null;a&&(this.callbacks[i]=a),this.target.postMessage({targetMapId:s,sourceMapId:this.mapId,type:t,id:String(i),data:e},r);},Actor.prototype.receive=function(t){var e,a=this,r=t.data,s=r.id;if(!r.targetMapId||this.mapId===r.targetMapId){var i=function(t,e,r){a.target.postMessage({sourceMapId:a.mapId,type:"<response>",id:String(s),error:t?String(t):null,data:e},r);};if("<response>"===r.type)e=this.callbacks[r.id],delete this.callbacks[r.id],e&&e(r.error||null,r.data);else if("undefined"!=typeof r.id&&this.parent[r.type])this.parent[r.type](r.sourceMapId,r.data,i);else if("undefined"!=typeof r.id&&this.parent.getWorkerSource){var p=r.type.split("."),d=this.parent.getWorkerSource(r.sourceMapId,p[0]);d[p[1]](r.data,i);}else this.parent[r.type](r.data);}},Actor.prototype.remove=function(){this.target.removeEventListener("message",this.receive,!1);},module.exports=Actor;
; |
415 | },{}],194:[function(_dereq_,module,exports){
|
416 | function sameOrigin(e){var t=window.document.createElement("a");return t.href=e,t.protocol===window.document.location.protocol&&t.host===window.document.location.host}var window=_dereq_("./window"),AJAXError=function(e){function t(t,r){e.call(this,t),this.status=r;}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t}(Error);exports.getJSON=function(e,t){var r=new window.XMLHttpRequest;return r.open("GET",e,!0),r.setRequestHeader("Accept","application/json"),r.onerror=function(e){t(e);},r.onload=function(){if(r.status>=200&&r.status<300&&r.response){var e;try{e=JSON.parse(r.response);}catch(e){return t(e)}t(null,e);}else t(new AJAXError(r.statusText,r.status));},r.send(),r},exports.getArrayBuffer=function(e,t){var r=new window.XMLHttpRequest;return r.open("GET",e,!0),r.responseType="arraybuffer",r.onerror=function(e){t(e);},r.onload=function(){return 0===r.response.byteLength&&200===r.status?t(new Error("http status 200 returned without content.")):void(r.status>=200&&r.status<300&&r.response?t(null,{data:r.response,cacheControl:r.getResponseHeader("Cache-Control"),expires:r.getResponseHeader("Expires")}):t(new AJAXError(r.statusText,r.status)))},r.send(),r};var transparentPngUrl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=";exports.getImage=function(e,t){return exports.getArrayBuffer(e,function(e,r){if(e)return t(e);var n=new window.Image,o=window.URL||window.webkitURL;n.onload=function(){t(null,n),o.revokeObjectURL(n.src);};var s=new window.Blob([new Uint8Array(r.data)],{type:"image/png"});n.cacheControl=r.cacheControl,n.expires=r.expires,n.src=r.data.byteLength?o.createObjectURL(s):transparentPngUrl;})},exports.getVideo=function(e,t){var r=window.document.createElement("video");r.onloadstart=function(){t(null,r);};for(var n=0;n<e.length;n++){var o=window.document.createElement("source");sameOrigin(e[n])||(r.crossOrigin="Anonymous"),o.src=e[n],r.appendChild(o);}return r};
; |
417 | },{"./window":197}],195:[function(_dereq_,module,exports){
|
418 | var window=_dereq_("./window");module.exports.now=function(){return window.performance&&window.performance.now?window.performance.now.bind(window.performance):Date.now.bind(Date)}();var frame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame;exports.frame=function(e){return frame(e)};var cancel=window.cancelAnimationFrame||window.mozCancelAnimationFrame||window.webkitCancelAnimationFrame||window.msCancelAnimationFrame;exports.cancelFrame=function(e){cancel(e);},exports.timed=function(e,n,t){function o(i){r||(i=module.exports.now(),i>=a+n?e.call(t,1):(e.call(t,(i-a)/n),exports.frame(o)));}if(!n)return e.call(t,1),null;var r=!1,a=module.exports.now();return exports.frame(o),function(){r=!0;}},exports.getImageData=function(e){var n=window.document.createElement("canvas"),t=n.getContext("2d");return n.width=e.width,n.height=e.height,t.drawImage(e,0,0,e.width,e.height),t.getImageData(0,0,e.width,e.height).data},exports.supported=_dereq_("mapbox-gl-supported"),exports.hardwareConcurrency=window.navigator.hardwareConcurrency||4,Object.defineProperty(exports,"devicePixelRatio",{get:function(){return window.devicePixelRatio}}),exports.supportsWebp=!1;var webpImgTest=window.document.createElement("img");webpImgTest.onload=function(){exports.supportsWebp=!0;},webpImgTest.src="data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA=";
; |
419 | },{"./window":197,"mapbox-gl-supported":22}],196:[function(_dereq_,module,exports){
|
420 | var WebWorkify=_dereq_("webworkify"),window=_dereq_("../window"),workerURL=window.URL.createObjectURL(new WebWorkify(_dereq_("../../source/worker"),{bare:!0}));module.exports=function(){return new window.Worker(workerURL)};
; |
421 | },{"../../source/worker":100,"../window":197,"webworkify":41}],197:[function(_dereq_,module,exports){
|
422 | module.exports=self;
; |
423 | },{}],198:[function(_dereq_,module,exports){
|
424 | function compareAreas(e,r){return r.area-e.area}var quickselect=_dereq_("quickselect"),calculateSignedArea=_dereq_("./util").calculateSignedArea;module.exports=function(e,r){var a=e.length;if(a<=1)return[e];for(var t,u,c=[],i=0;i<a;i++){var l=calculateSignedArea(e[i]);0!==l&&(e[i].area=Math.abs(l),void 0===u&&(u=l<0),u===l<0?(t&&c.push(t),t=[e[i]]):t.push(e[i]));}if(t&&c.push(t),r>1)for(var n=0;n<c.length;n++)c[n].length<=r||(quickselect(c[n],r,1,c[n].length-1,compareAreas),c[n]=c[n].slice(0,r));return c};
; |
425 | },{"./util":215,"quickselect":28}],199:[function(_dereq_,module,exports){
|
426 | var config={API_URL:"https://api.mapbox.com",REQUIRE_ACCESS_TOKEN:!0,ACCESS_TOKEN:null};module.exports=config;
; |
427 | },{}],200:[function(_dereq_,module,exports){
|
428 | var DictionaryCoder=function(r){var t=this;this._stringToNumber={},this._numberToString=[];for(var o=0;o<r.length;o++){var i=r[o];t._stringToNumber[i]=o,t._numberToString[o]=i;}};DictionaryCoder.prototype.encode=function(r){return this._stringToNumber[r]},DictionaryCoder.prototype.decode=function(r){return this._numberToString[r]},module.exports=DictionaryCoder;
; |
429 | },{}],201:[function(_dereq_,module,exports){
|
430 | var util=_dereq_("./util"),Actor=_dereq_("./actor"),Dispatcher=function(t,r){var o=this;this.workerPool=t,this.actors=[],this.currentActor=0,this.id=util.uniqueId();for(var i=this.workerPool.acquire(this.id),e=0;e<i.length;e++){var s=i[e],c=new Actor(s,r,o.id);c.name="Worker "+e,o.actors.push(c);}};Dispatcher.prototype.broadcast=function(t,r,o){o=o||function(){},util.asyncAll(this.actors,function(o,i){o.send(t,r,i);},o);},Dispatcher.prototype.send=function(t,r,o,i,e){return("number"!=typeof i||isNaN(i))&&(i=this.currentActor=(this.currentActor+1)%this.actors.length),this.actors[i].send(t,r,o,e),i},Dispatcher.prototype.remove=function(){this.actors.forEach(function(t){t.remove();}),this.actors=[],this.workerPool.release(this.id);},module.exports=Dispatcher;
; |
431 | },{"./actor":193,"./util":215}],202:[function(_dereq_,module,exports){
|
432 | function testProp(e){for(var t=0;t<e.length;t++)if(e[t]in docStyle)return e[t];return e[0]}function suppressClick(e){e.preventDefault(),e.stopPropagation(),window.removeEventListener("click",suppressClick,!0);}var Point=_dereq_("point-geometry"),window=_dereq_("./window");exports.create=function(e,t,o){var n=window.document.createElement(e);return t&&(n.className=t),o&&o.appendChild(n),n};var docStyle=window.document.documentElement.style,selectProp=testProp(["userSelect","MozUserSelect","WebkitUserSelect","msUserSelect"]),userSelect;exports.disableDrag=function(){selectProp&&(userSelect=docStyle[selectProp],docStyle[selectProp]="none");},exports.enableDrag=function(){selectProp&&(docStyle[selectProp]=userSelect);};var transformProp=testProp(["transform","WebkitTransform"]);exports.setTransform=function(e,t){e.style[transformProp]=t;},exports.suppressClick=function(){window.addEventListener("click",suppressClick,!0),window.setTimeout(function(){window.removeEventListener("click",suppressClick,!0);},0);},exports.mousePos=function(e,t){var o=e.getBoundingClientRect();return t=t.touches?t.touches[0]:t,new Point(t.clientX-o.left-e.clientLeft,t.clientY-o.top-e.clientTop)},exports.touchPos=function(e,t){for(var o=e.getBoundingClientRect(),n=[],r="touchend"===t.type?t.changedTouches:t.touches,s=0;s<r.length;s++)n.push(new Point(r[s].clientX-o.left-e.clientLeft,r[s].clientY-o.top-e.clientTop));return n},exports.remove=function(e){e.parentNode&&e.parentNode.removeChild(e);};
; |
433 | },{"./window":197,"point-geometry":26}],203:[function(_dereq_,module,exports){
|
434 | function _addEventListener(e,t,n){n[e]=n[e]||[],n[e].push(t);}function _removeEventListener(e,t,n){if(n&&n[e]){var i=n[e].indexOf(t);i!==-1&&n[e].splice(i,1);}}var util=_dereq_("./util"),Evented=function(){};Evented.prototype.on=function(e,t){return this._listeners=this._listeners||{},_addEventListener(e,t,this._listeners),this},Evented.prototype.off=function(e,t){return _removeEventListener(e,t,this._listeners),_removeEventListener(e,t,this._oneTimeListeners),this},Evented.prototype.once=function(e,t){return this._oneTimeListeners=this._oneTimeListeners||{},_addEventListener(e,t,this._oneTimeListeners),this},Evented.prototype.fire=function(e,t){var n=this;if(this.listens(e)){t=util.extend({},t,{type:e,target:this});for(var i=this._listeners&&this._listeners[e]?this._listeners[e].slice():[],s=0;s<i.length;s++)i[s].call(n,t);for(var r=this._oneTimeListeners&&this._oneTimeListeners[e]?this._oneTimeListeners[e].slice():[],o=0;o<r.length;o++)r[o].call(n,t),_removeEventListener(e,r[o],n._oneTimeListeners);this._eventedParent&&this._eventedParent.fire(e,util.extend({},t,"function"==typeof this._eventedParentData?this._eventedParentData():this._eventedParentData));}else util.endsWith(e,"error")&&console.error(t&&t.error||t||"Empty error event");return this},Evented.prototype.listens=function(e){return this._listeners&&this._listeners[e]&&this._listeners[e].length>0||this._oneTimeListeners&&this._oneTimeListeners[e]&&this._oneTimeListeners[e].length>0||this._eventedParent&&this._eventedParent.listens(e)},Evented.prototype.setEventedParent=function(e,t){return this._eventedParent=e,this._eventedParentData=t,this},module.exports=Evented;
; |
435 | },{"./util":215}],204:[function(_dereq_,module,exports){
|
436 | function compareMax(e,t){return t.max-e.max}function Cell(e,t,n,r){this.p=new Point(e,t),this.h=n,this.d=pointToPolygonDist(this.p,r),this.max=this.d+this.h*Math.SQRT2;}function pointToPolygonDist(e,t){for(var n=!1,r=1/0,o=0;o<t.length;o++)for(var i=t[o],l=0,u=i.length,s=u-1;l<u;s=l++){var a=i[l],h=i[s];a.y>e.y!=h.y>e.y&&e.x<(h.x-a.x)*(e.y-a.y)/(h.y-a.y)+a.x&&(n=!n),r=Math.min(r,distToSegmentSquared(e,a,h));}return(n?1:-1)*Math.sqrt(r)}function getCentroidCell(e){for(var t=0,n=0,r=0,o=e[0],i=0,l=o.length,u=l-1;i<l;u=i++){var s=o[i],a=o[u],h=s.x*a.y-a.x*s.y;n+=(s.x+a.x)*h,r+=(s.y+a.y)*h,t+=3*h;}return new Cell(n/t,r/t,0,e)}var Queue=_dereq_("tinyqueue"),Point=_dereq_("point-geometry"),distToSegmentSquared=_dereq_("./intersection_tests").distToSegmentSquared;module.exports=function(e,t,n){t=t||1;for(var r,o,i,l,u=e[0],s=0;s<u.length;s++){var a=u[s];(!s||a.x<r)&&(r=a.x),(!s||a.y<o)&&(o=a.y),(!s||a.x>i)&&(i=a.x),(!s||a.y>l)&&(l=a.y);}var h=i-r,p=l-o,y=Math.min(h,p),x=y/2,d=new Queue(null,compareMax);if(0===y)return[r,o];for(var g=r;g<i;g+=y)for(var f=o;f<l;f+=y)d.push(new Cell(g+x,f+x,x,e));for(var m=getCentroidCell(e),c=d.length;d.length;){var v=d.pop();(v.d>m.d||!m.d)&&(m=v,n&&console.log("found best %d after %d probes",Math.round(1e4*v.d)/1e4,c)),v.max-m.d<=t||(x=v.h/2,d.push(new Cell(v.p.x-x,v.p.y-x,x,e)),d.push(new Cell(v.p.x+x,v.p.y-x,x,e)),d.push(new Cell(v.p.x-x,v.p.y+x,x,e)),d.push(new Cell(v.p.x+x,v.p.y+x,x,e)),c+=4);}return n&&(console.log("num probes: "+c),console.log("best distance: "+m.d)),m.p};
; |
437 | },{"./intersection_tests":207,"point-geometry":26,"tinyqueue":30}],205:[function(_dereq_,module,exports){
|
438 | var WorkerPool=_dereq_("./worker_pool"),globalWorkerPool;module.exports=function(){return globalWorkerPool||(globalWorkerPool=new WorkerPool),globalWorkerPool};
; |
439 | },{"./worker_pool":218}],206:[function(_dereq_,module,exports){
|
440 | function Glyphs(a,e){this.stacks=a.readFields(readFontstacks,[],e);}function readFontstacks(a,e,r){if(1===a){var t=r.readMessage(readFontstack,{glyphs:{}});e.push(t);}}function readFontstack(a,e,r){if(1===a)e.name=r.readString();else if(2===a)e.range=r.readString();else if(3===a){var t=r.readMessage(readGlyph,{});e.glyphs[t.id]=t;}}function readGlyph(a,e,r){1===a?e.id=r.readVarint():2===a?e.bitmap=r.readBytes():3===a?e.width=r.readVarint():4===a?e.height=r.readVarint():5===a?e.left=r.readSVarint():6===a?e.top=r.readSVarint():7===a&&(e.advance=r.readVarint());}module.exports=Glyphs;
; |
441 | },{}],207:[function(_dereq_,module,exports){
|
442 | function polygonIntersectsPolygon(n,t){for(var e=0;e<n.length;e++)if(polygonContainsPoint(t,n[e]))return!0;for(var r=0;r<t.length;r++)if(polygonContainsPoint(n,t[r]))return!0;return!!lineIntersectsLine(n,t)}function multiPolygonIntersectsBufferedMultiPoint(n,t,e){for(var r=0;r<n.length;r++)for(var o=n[r],i=0;i<t.length;i++)for(var l=t[i],u=0;u<l.length;u++){var s=l[u];if(polygonContainsPoint(o,s))return!0;if(pointIntersectsBufferedLine(s,o,e))return!0}return!1}function multiPolygonIntersectsMultiPolygon(n,t){if(1===n.length&&1===n[0].length)return multiPolygonContainsPoint(t,n[0][0]);for(var e=0;e<t.length;e++)for(var r=t[e],o=0;o<r.length;o++)if(multiPolygonContainsPoint(n,r[o]))return!0;for(var i=0;i<n.length;i++){for(var l=n[i],u=0;u<l.length;u++)if(multiPolygonContainsPoint(t,l[u]))return!0;for(var s=0;s<t.length;s++)if(lineIntersectsLine(l,t[s]))return!0}return!1}function multiPolygonIntersectsBufferedMultiLine(n,t,e){for(var r=0;r<t.length;r++)for(var o=t[r],i=0;i<n.length;i++){var l=n[i];if(l.length>=3)for(var u=0;u<o.length;u++)if(polygonContainsPoint(l,o[u]))return!0;if(lineIntersectsBufferedLine(l,o,e))return!0}return!1}function lineIntersectsBufferedLine(n,t,e){if(n.length>1){if(lineIntersectsLine(n,t))return!0;for(var r=0;r<t.length;r++)if(pointIntersectsBufferedLine(t[r],n,e))return!0}for(var o=0;o<n.length;o++)if(pointIntersectsBufferedLine(n[o],t,e))return!0;return!1}function lineIntersectsLine(n,t){if(0===n.length||0===t.length)return!1;for(var e=0;e<n.length-1;e++)for(var r=n[e],o=n[e+1],i=0;i<t.length-1;i++){var l=t[i],u=t[i+1];if(lineSegmentIntersectsLineSegment(r,o,l,u))return!0}return!1}function lineSegmentIntersectsLineSegment(n,t,e,r){return isCounterClockwise(n,e,r)!==isCounterClockwise(t,e,r)&&isCounterClockwise(n,t,e)!==isCounterClockwise(n,t,r)}function pointIntersectsBufferedLine(n,t,e){var r=e*e;if(1===t.length)return n.distSqr(t[0])<r;for(var o=1;o<t.length;o++){var i=t[o-1],l=t[o];if(distToSegmentSquared(n,i,l)<r)return!0}return!1}function distToSegmentSquared(n,t,e){var r=t.distSqr(e);if(0===r)return n.distSqr(t);var o=((n.x-t.x)*(e.x-t.x)+(n.y-t.y)*(e.y-t.y))/r;return o<0?n.distSqr(t):o>1?n.distSqr(e):n.distSqr(e.sub(t)._mult(o)._add(t))}function multiPolygonContainsPoint(n,t){for(var e,r,o,i=!1,l=0;l<n.length;l++){e=n[l];for(var u=0,s=e.length-1;u<e.length;s=u++)r=e[u],o=e[s],r.y>t.y!=o.y>t.y&&t.x<(o.x-r.x)*(t.y-r.y)/(o.y-r.y)+r.x&&(i=!i);}return i}function polygonContainsPoint(n,t){for(var e=!1,r=0,o=n.length-1;r<n.length;o=r++){var i=n[r],l=n[o];i.y>t.y!=l.y>t.y&&t.x<(l.x-i.x)*(t.y-i.y)/(l.y-i.y)+i.x&&(e=!e);}return e}var isCounterClockwise=_dereq_("./util").isCounterClockwise;module.exports={multiPolygonIntersectsBufferedMultiPoint:multiPolygonIntersectsBufferedMultiPoint,multiPolygonIntersectsMultiPolygon:multiPolygonIntersectsMultiPolygon,multiPolygonIntersectsBufferedMultiLine:multiPolygonIntersectsBufferedMultiLine,polygonIntersectsPolygon:polygonIntersectsPolygon,distToSegmentSquared:distToSegmentSquared};
; |
443 | },{"./util":215}],208:[function(_dereq_,module,exports){
|
444 | var unicodeBlockLookup={"Latin-1 Supplement":function(n){return n>=128&&n<=255},"Hangul Jamo":function(n){return n>=4352&&n<=4607},"Unified Canadian Aboriginal Syllabics":function(n){return n>=5120&&n<=5759},"Unified Canadian Aboriginal Syllabics Extended":function(n){return n>=6320&&n<=6399},"General Punctuation":function(n){return n>=8192&&n<=8303},"Letterlike Symbols":function(n){return n>=8448&&n<=8527},"Number Forms":function(n){return n>=8528&&n<=8591},"Miscellaneous Technical":function(n){return n>=8960&&n<=9215},"Control Pictures":function(n){return n>=9216&&n<=9279},"Optical Character Recognition":function(n){return n>=9280&&n<=9311},"Enclosed Alphanumerics":function(n){return n>=9312&&n<=9471},"Geometric Shapes":function(n){return n>=9632&&n<=9727},"Miscellaneous Symbols":function(n){return n>=9728&&n<=9983},"Miscellaneous Symbols and Arrows":function(n){return n>=11008&&n<=11263},"CJK Radicals Supplement":function(n){return n>=11904&&n<=12031},"Kangxi Radicals":function(n){return n>=12032&&n<=12255},"Ideographic Description Characters":function(n){return n>=12272&&n<=12287},"CJK Symbols and Punctuation":function(n){return n>=12288&&n<=12351},Hiragana:function(n){return n>=12352&&n<=12447},Katakana:function(n){return n>=12448&&n<=12543},Bopomofo:function(n){return n>=12544&&n<=12591},"Hangul Compatibility Jamo":function(n){return n>=12592&&n<=12687},Kanbun:function(n){return n>=12688&&n<=12703},"Bopomofo Extended":function(n){return n>=12704&&n<=12735},"CJK Strokes":function(n){return n>=12736&&n<=12783},"Katakana Phonetic Extensions":function(n){return n>=12784&&n<=12799},"Enclosed CJK Letters and Months":function(n){return n>=12800&&n<=13055},"CJK Compatibility":function(n){return n>=13056&&n<=13311},"CJK Unified Ideographs Extension A":function(n){return n>=13312&&n<=19903},"Yijing Hexagram Symbols":function(n){return n>=19904&&n<=19967},"CJK Unified Ideographs":function(n){return n>=19968&&n<=40959},"Yi Syllables":function(n){return n>=40960&&n<=42127},"Yi Radicals":function(n){return n>=42128&&n<=42191},"Hangul Jamo Extended-A":function(n){return n>=43360&&n<=43391},"Hangul Syllables":function(n){return n>=44032&&n<=55215},"Hangul Jamo Extended-B":function(n){return n>=55216&&n<=55295},"Private Use Area":function(n){return n>=57344&&n<=63743},"CJK Compatibility Ideographs":function(n){return n>=63744&&n<=64255},"Vertical Forms":function(n){return n>=65040&&n<=65055},"CJK Compatibility Forms":function(n){return n>=65072&&n<=65103},"Small Form Variants":function(n){return n>=65104&&n<=65135},"Halfwidth and Fullwidth Forms":function(n){return n>=65280&&n<=65519}};module.exports=unicodeBlockLookup;
; |
445 | },{}],209:[function(_dereq_,module,exports){
|
446 | var LRUCache=function(t,e){this.max=t,this.onRemove=e,this.reset();};LRUCache.prototype.reset=function(){var t=this;for(var e in t.data)t.onRemove(t.data[e]);return this.data={},this.order=[],this},LRUCache.prototype.add=function(t,e){if(this.has(t))this.order.splice(this.order.indexOf(t),1),this.data[t]=e,this.order.push(t);else if(this.data[t]=e,this.order.push(t),this.order.length>this.max){var r=this.get(this.order[0]);r&&this.onRemove(r);}return this},LRUCache.prototype.has=function(t){return t in this.data},LRUCache.prototype.keys=function(){return this.order},LRUCache.prototype.get=function(t){if(!this.has(t))return null;var e=this.data[t];return delete this.data[t],this.order.splice(this.order.indexOf(t),1),e},LRUCache.prototype.getWithoutRemoving=function(t){if(!this.has(t))return null;var e=this.data[t];return e},LRUCache.prototype.remove=function(t){if(!this.has(t))return this;var e=this.data[t];return delete this.data[t],this.onRemove(e),this.order.splice(this.order.indexOf(t),1),this},LRUCache.prototype.setMaxSize=function(t){var e=this;for(this.max=t;this.order.length>this.max;){var r=e.get(e.order[0]);r&&e.onRemove(r);}return this},module.exports=LRUCache;
; |
447 | },{}],210:[function(_dereq_,module,exports){
|
448 | function makeAPIURL(r,e){var t=parseUrl(config.API_URL);if(r.protocol=t.protocol,r.authority=t.authority,!config.REQUIRE_ACCESS_TOKEN)return formatUrl(r);if(e=e||config.ACCESS_TOKEN,!e)throw new Error("An API access token is required to use Mapbox GL. "+help);if("s"===e[0])throw new Error("Use a public access token (pk.*) with Mapbox GL, not a secret access token (sk.*). "+help);return r.params.push("access_token="+e),formatUrl(r)}function isMapboxURL(r){return 0===r.indexOf("mapbox:")}function replaceTempAccessToken(r){for(var e=0;e<r.length;e++)0===r[e].indexOf("access_token=tk.")&&(r[e]="access_token="+(config.ACCESS_TOKEN||""));}function parseUrl(r){var e=r.match(urlRe);if(!e)throw new Error("Unable to parse URL object");return{protocol:e[1],authority:e[2],path:e[3]||"/",params:e[4]?e[4].split("&"):[]}}function formatUrl(r){var e=r.params.length?"?"+r.params.join("&"):"";return r.protocol+"://"+r.authority+r.path+e}var config=_dereq_("./config"),browser=_dereq_("./browser"),help="See https://www.mapbox.com/api-documentation/#access-tokens";exports.isMapboxURL=isMapboxURL,exports.normalizeStyleURL=function(r,e){if(!isMapboxURL(r))return r;var t=parseUrl(r);return t.path="/styles/v1"+t.path,makeAPIURL(t,e)},exports.normalizeGlyphsURL=function(r,e){if(!isMapboxURL(r))return r;var t=parseUrl(r);return t.path="/fonts/v1"+t.path,makeAPIURL(t,e)},exports.normalizeSourceURL=function(r,e){if(!isMapboxURL(r))return r;var t=parseUrl(r);return t.path="/v4/"+t.authority+".json",t.params.push("secure"),makeAPIURL(t,e)},exports.normalizeSpriteURL=function(r,e,t,o){var a=parseUrl(r);return isMapboxURL(r)?(a.path="/styles/v1"+a.path+"/sprite"+e+t,makeAPIURL(a,o)):(a.path+=""+e+t,formatUrl(a))};var imageExtensionRe=/(\.(png|jpg)\d*)(?=$)/;exports.normalizeTileURL=function(r,e,t){if(!e||!isMapboxURL(e))return r;var o=parseUrl(r),a=browser.devicePixelRatio>=2||512===t?"@2x":"",s=browser.supportsWebp?".webp":"$1";return o.path=o.path.replace(imageExtensionRe,""+a+s),replaceTempAccessToken(o.params),formatUrl(o)};var urlRe=/^(\w+):\/\/([^\/?]*)(\/[^?]+)?\??(.+)?/;
; |
449 | },{"./browser":195,"./config":199}],211:[function(_dereq_,module,exports){
|
450 | var isChar=_dereq_("./is_char_in_unicode_block");module.exports.allowsIdeographicBreaking=function(a){for(var i=0,r=a;i<r.length;i+=1){var s=r[i];if(!exports.charAllowsIdeographicBreaking(s.charCodeAt(0)))return!1}return!0},module.exports.allowsVerticalWritingMode=function(a){for(var i=0,r=a;i<r.length;i+=1){var s=r[i];if(exports.charHasUprightVerticalOrientation(s.charCodeAt(0)))return!0}return!1},module.exports.charAllowsIdeographicBreaking=function(a){return!(a<11904)&&(!!isChar["Bopomofo Extended"](a)||(!!isChar.Bopomofo(a)||(!!isChar["CJK Compatibility Forms"](a)||(!!isChar["CJK Compatibility Ideographs"](a)||(!!isChar["CJK Compatibility"](a)||(!!isChar["CJK Radicals Supplement"](a)||(!!isChar["CJK Strokes"](a)||(!!isChar["CJK Symbols and Punctuation"](a)||(!!isChar["CJK Unified Ideographs Extension A"](a)||(!!isChar["CJK Unified Ideographs"](a)||(!!isChar["Enclosed CJK Letters and Months"](a)||(!!isChar["Halfwidth and Fullwidth Forms"](a)||(!!isChar.Hiragana(a)||(!!isChar["Ideographic Description Characters"](a)||(!!isChar["Kangxi Radicals"](a)||(!!isChar["Katakana Phonetic Extensions"](a)||(!!isChar.Katakana(a)||(!!isChar["Vertical Forms"](a)||(!!isChar["Yi Radicals"](a)||!!isChar["Yi Syllables"](a))))))))))))))))))))},exports.charHasUprightVerticalOrientation=function(a){return 746===a||747===a||!(a<4352)&&(!!isChar["Bopomofo Extended"](a)||(!!isChar.Bopomofo(a)||(!(!isChar["CJK Compatibility Forms"](a)||a>=65097&&a<=65103)||(!!isChar["CJK Compatibility Ideographs"](a)||(!!isChar["CJK Compatibility"](a)||(!!isChar["CJK Radicals Supplement"](a)||(!!isChar["CJK Strokes"](a)||(!(!isChar["CJK Symbols and Punctuation"](a)||a>=12296&&a<=12305||a>=12308&&a<=12319||12336===a)||(!!isChar["CJK Unified Ideographs Extension A"](a)||(!!isChar["CJK Unified Ideographs"](a)||(!!isChar["Enclosed CJK Letters and Months"](a)||(!!isChar["Hangul Compatibility Jamo"](a)||(!!isChar["Hangul Jamo Extended-A"](a)||(!!isChar["Hangul Jamo Extended-B"](a)||(!!isChar["Hangul Jamo"](a)||(!!isChar["Hangul Syllables"](a)||(!!isChar.Hiragana(a)||(!!isChar["Ideographic Description Characters"](a)||(!!isChar.Kanbun(a)||(!!isChar["Kangxi Radicals"](a)||(!!isChar["Katakana Phonetic Extensions"](a)||(!(!isChar.Katakana(a)||12540===a)||(!(!isChar["Halfwidth and Fullwidth Forms"](a)||65288===a||65289===a||65293===a||a>=65306&&a<=65310||65339===a||65341===a||65343===a||a>=65371&&a<=65503||65507===a||a>=65512&&a<=65519)||(!(!isChar["Small Form Variants"](a)||a>=65112&&a<=65118||a>=65123&&a<=65126)||(!!isChar["Unified Canadian Aboriginal Syllabics"](a)||(!!isChar["Unified Canadian Aboriginal Syllabics Extended"](a)||(!!isChar["Vertical Forms"](a)||(!!isChar["Yijing Hexagram Symbols"](a)||(!!isChar["Yi Syllables"](a)||!!isChar["Yi Radicals"](a))))))))))))))))))))))))))))))},exports.charHasNeutralVerticalOrientation=function(a){return!(!isChar["Latin-1 Supplement"](a)||167!==a&&169!==a&&174!==a&&177!==a&&188!==a&&189!==a&&190!==a&&215!==a&&247!==a)||(!(!isChar["General Punctuation"](a)||8214!==a&&8224!==a&&8225!==a&&8240!==a&&8241!==a&&8251!==a&&8252!==a&&8258!==a&&8263!==a&&8264!==a&&8265!==a&&8273!==a)||(!!isChar["Letterlike Symbols"](a)||(!!isChar["Number Forms"](a)||(!(!isChar["Miscellaneous Technical"](a)||!(a>=8960&&a<=8967||a>=8972&&a<=8991||a>=8996&&a<=9e3||9003===a||a>=9085&&a<=9114||a>=9150&&a<=9165||9167===a||a>=9169&&a<=9179||a>=9186&&a<=9215))||(!(!isChar["Control Pictures"](a)||9251===a)||(!!isChar["Optical Character Recognition"](a)||(!!isChar["Enclosed Alphanumerics"](a)||(!!isChar["Geometric Shapes"](a)||(!(!isChar["Miscellaneous Symbols"](a)||a>=9754&&a<=9759)||(!(!isChar["Miscellaneous Symbols and Arrows"](a)||!(a>=11026&&a<=11055||a>=11088&&a<=11097||a>=11192&&a<=11243))||(!!isChar["CJK Symbols and Punctuation"](a)||(!!isChar.Katakana(a)||(!!isChar["Private Use Area"](a)||(!!isChar["CJK Compatibility Forms"](a)||(!!isChar["Small Form Variants"](a)||(!!isChar["Halfwidth and Fullwidth Forms"](a)||(8734===a||8756===a||8757===a||a>=9984&&a<=10087||a>=10102&&a<=10131||65532===a||65533===a)))))))))))))))))},exports.charHasRotatedVerticalOrientation=function(a){return!(exports.charHasUprightVerticalOrientation(a)||exports.charHasNeutralVerticalOrientation(a))};
; |
451 | },{"./is_char_in_unicode_block":208}],212:[function(_dereq_,module,exports){
|
452 | var LngLat=_dereq_("../geo/lng_lat");module.exports=function(n,t,l){if(n=new LngLat(n.lng,n.lat),t){var a=new LngLat(n.lng-360,n.lat),i=new LngLat(n.lng+360,n.lat),o=l.locationPoint(n).distSqr(t);l.locationPoint(a).distSqr(t)<o?n=a:l.locationPoint(i).distSqr(t)<o&&(n=i);}for(;Math.abs(n.lng-l.center.lng)>180;){var e=l.locationPoint(n);if(e.x>=0&&e.y>=0&&e.x<=l.width&&e.y<=l.height)break;n.lng>l.center.lng?n.lng-=360:n.lng+=360;}return n};
; |
453 | },{"../geo/lng_lat":62}],213:[function(_dereq_,module,exports){
|
454 | function createStructArrayType(t){var e=JSON.stringify(t);if(structArrayTypeCache[e])return structArrayTypeCache[e];var r=void 0===t.alignment?1:t.alignment,i=0,n=0,a=["Uint8"],o=t.members.map(function(t){a.indexOf(t.type)<0&&a.push(t.type);var e=sizeOf(t.type),o=i=align(i,Math.max(r,e)),s=t.components||1;return n=Math.max(n,e),i+=e*s,{name:t.name,type:t.type,components:s,offset:o}}),s=align(i,Math.max(n,r)),p=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(Struct);p.prototype.alignment=r,p.prototype.size=s;for(var y=0,c=o;y<c.length;y+=1)for(var h=c[y],u=0;u<h.components;u++){var f=h.name+(1===h.components?"":u);Object.defineProperty(p.prototype,f,{get:createGetter(h,u),set:createSetter(h,u)});}var m=function(t){function e(){t.apply(this,arguments);}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(StructArray);return m.prototype.members=o,m.prototype.StructType=p,m.prototype.bytesPerElement=s,m.prototype.emplaceBack=createEmplaceBack(o,s),m.prototype._usedTypes=a,structArrayTypeCache[e]=m,m}function align(t,e){return Math.ceil(t/e)*e}function sizeOf(t){return viewTypes[t].BYTES_PER_ELEMENT}function getArrayViewName(t){return t.toLowerCase()}function createEmplaceBack(t,e){for(var r=[],i=[],n="var i = this.length;\nthis.resize(this.length + 1);\n",a=0,o=t;a<o.length;a+=1){var s=o[a],p=sizeOf(s.type);r.indexOf(p)<0&&(r.push(p),n+="var o"+p.toFixed(0)+" = i * "+(e/p).toFixed(0)+";\n");for(var y=0;y<s.components;y++){var c="v"+i.length,h="o"+p.toFixed(0)+" + "+(s.offset/p+y).toFixed(0);n+="this."+getArrayViewName(s.type)+"["+h+"] = "+c+";\n",i.push(c);}}return n+="return i;",new Function(i.toString(),n)}function createMemberComponentString(t,e){var r="this._pos"+sizeOf(t.type).toFixed(0),i=(t.offset/sizeOf(t.type)+e).toFixed(0),n=r+" + "+i;return"this._structArray."+getArrayViewName(t.type)+"["+n+"]"}function createGetter(t,e){return new Function("return "+createMemberComponentString(t,e)+";")}function createSetter(t,e){return new Function("x",createMemberComponentString(t,e)+" = x;")}module.exports=createStructArrayType;var viewTypes={Int8:Int8Array,Uint8:Uint8Array,Uint8Clamped:Uint8ClampedArray,Int16:Int16Array,Uint16:Uint16Array,Int32:Int32Array,Uint32:Uint32Array,Float32:Float32Array,Float64:Float64Array},Struct=function(t,e){this._structArray=t,this._pos1=e*this.size,this._pos2=this._pos1/2,this._pos4=this._pos1/4,this._pos8=this._pos1/8;},DEFAULT_CAPACITY=128,RESIZE_MULTIPLIER=5,StructArray=function(t){this.isTransferred=!1,void 0!==t?(this.arrayBuffer=t.arrayBuffer,this.length=t.length,this.capacity=this.arrayBuffer.byteLength/this.bytesPerElement,this._refreshViews()):(this.capacity=-1,this.resize(0));};StructArray.serialize=function(){return{members:this.prototype.members,alignment:this.prototype.StructType.prototype.alignment,bytesPerElement:this.prototype.bytesPerElement}},StructArray.prototype.serialize=function(t){return this._trim(),t&&(this.isTransferred=!0,t.push(this.arrayBuffer)),{length:this.length,arrayBuffer:this.arrayBuffer}},StructArray.prototype.get=function(t){return new this.StructType(this,t)},StructArray.prototype._trim=function(){this.length!==this.capacity&&(this.capacity=this.length,this.arrayBuffer=this.arrayBuffer.slice(0,this.length*this.bytesPerElement),this._refreshViews());},StructArray.prototype.resize=function(t){if(this.length=t,t>this.capacity){this.capacity=Math.max(t,Math.floor(this.capacity*RESIZE_MULTIPLIER),DEFAULT_CAPACITY),this.arrayBuffer=new ArrayBuffer(this.capacity*this.bytesPerElement);var e=this.uint8;this._refreshViews(),e&&this.uint8.set(e);}},StructArray.prototype._refreshViews=function(){for(var t=this,e=0,r=t._usedTypes;e<r.length;e+=1){var i=r[e];t[getArrayViewName(i)]=new viewTypes[i](t.arrayBuffer);}},StructArray.prototype.toArray=function(t,e){for(var r=this,i=[],n=t;n<e;n++){var a=r.get(n);i.push(a);}return i};var structArrayTypeCache={};
; |
455 | },{}],214:[function(_dereq_,module,exports){
|
456 | function resolveTokens(e,n){return n.replace(/{([^{}]+)}/g,function(n,r){return r in e?e[r]:""})}module.exports=resolveTokens;
; |
457 | },{}],215:[function(_dereq_,module,exports){
|
458 | var UnitBezier=_dereq_("@mapbox/unitbezier"),Coordinate=_dereq_("../geo/coordinate"),Point=_dereq_("point-geometry");exports.easeCubicInOut=function(r){if(r<=0)return 0;if(r>=1)return 1;var e=r*r,t=e*r;return 4*(r<.5?t:3*(r-e)+t-.75)},exports.bezier=function(r,e,t,n){var o=new UnitBezier(r,e,t,n);return function(r){return o.solve(r)}},exports.ease=exports.bezier(.25,.1,.25,1),exports.clamp=function(r,e,t){return Math.min(t,Math.max(e,r))},exports.wrap=function(r,e,t){var n=t-e,o=((r-e)%n+n)%n+e;return o===e?t:o},exports.asyncAll=function(r,e,t){if(!r.length)return t(null,[]);var n=r.length,o=new Array(r.length),a=null;r.forEach(function(r,i){e(r,function(r,e){r&&(a=r),o[i]=e,0===--n&&t(a,o);});});},exports.values=function(r){var e=[];for(var t in r)e.push(r[t]);return e},exports.keysDifference=function(r,e){var t=[];for(var n in r)n in e||t.push(n);return t},exports.extend=function(r,e,t,n){for(var o=arguments,a=1;a<arguments.length;a++){var i=o[a];for(var u in i)r[u]=i[u];}return r},exports.pick=function(r,e){for(var t={},n=0;n<e.length;n++){var o=e[n];o in r&&(t[o]=r[o]);}return t};var id=1;exports.uniqueId=function(){return id++},exports.bindAll=function(r,e){r.forEach(function(r){e[r]&&(e[r]=e[r].bind(e));});},exports.getCoordinatesCenter=function(r){for(var e=1/0,t=1/0,n=-(1/0),o=-(1/0),a=0;a<r.length;a++)e=Math.min(e,r[a].column),t=Math.min(t,r[a].row),n=Math.max(n,r[a].column),o=Math.max(o,r[a].row);var i=n-e,u=o-t,s=Math.max(i,u),c=Math.max(0,Math.floor(-Math.log(s)/Math.LN2));return new Coordinate((e+n)/2,(t+o)/2,0).zoomTo(c)},exports.endsWith=function(r,e){return r.indexOf(e,r.length-e.length)!==-1},exports.mapObject=function(r,e,t){var n=this,o={};for(var a in r)o[a]=e.call(t||n,r[a],a,r);return o},exports.filterObject=function(r,e,t){var n=this,o={};for(var a in r)e.call(t||n,r[a],a,r)&&(o[a]=r[a]);return o},exports.deepEqual=function(r,e){if(Array.isArray(r)){if(!Array.isArray(e)||r.length!==e.length)return!1;for(var t=0;t<r.length;t++)if(!exports.deepEqual(r[t],e[t]))return!1;return!0}if("object"==typeof r&&null!==r&&null!==e){if("object"!=typeof e)return!1;var n=Object.keys(r);if(n.length!==Object.keys(e).length)return!1;for(var o in r)if(!exports.deepEqual(r[o],e[o]))return!1;return!0}return r===e},exports.clone=function(r){return Array.isArray(r)?r.map(exports.clone):"object"==typeof r&&r?exports.mapObject(r,exports.clone):r},exports.arraysIntersect=function(r,e){for(var t=0;t<r.length;t++)if(e.indexOf(r[t])>=0)return!0;return!1};var warnOnceHistory={};exports.warnOnce=function(r){warnOnceHistory[r]||("undefined"!=typeof console&&console.warn(r),warnOnceHistory[r]=!0);},exports.isCounterClockwise=function(r,e,t){return(t.y-r.y)*(e.x-r.x)>(e.y-r.y)*(t.x-r.x)},exports.calculateSignedArea=function(r){for(var e=0,t=0,n=r.length,o=n-1,a=void 0,i=void 0;t<n;o=t++)a=r[t],i=r[o],e+=(i.x-a.x)*(a.y+i.y);return e},exports.isClosedPolygon=function(r){if(r.length<4)return!1;var e=r[0],t=r[r.length-1];return!(Math.abs(e.x-t.x)>0||Math.abs(e.y-t.y)>0)&&Math.abs(exports.calculateSignedArea(r))>.01},exports.sphericalToCartesian=function(r){var e=r[0],t=r[1],n=r[2];return t+=90,t*=Math.PI/180,n*=Math.PI/180,[e*Math.cos(t)*Math.sin(n),e*Math.sin(t)*Math.sin(n),e*Math.cos(n)]},exports.parseCacheControl=function(r){var e=/(?:^|(?:\s*\,\s*))([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g,t={};if(r.replace(e,function(r,e,n,o){var a=n||o;return t[e]=!a||a.toLowerCase(),""}),t["max-age"]){var n=parseInt(t["max-age"],10);isNaN(n)?delete t["max-age"]:t["max-age"]=n;}return t};
; |
459 | },{"../geo/coordinate":61,"@mapbox/unitbezier":3,"point-geometry":26}],216:[function(_dereq_,module,exports){
|
460 | var Feature=function(e,t,r,o){this.type="Feature",this._vectorTileFeature=e,e._z=t,e._x=r,e._y=o,this.properties=e.properties,null!=e.id&&(this.id=e.id);},prototypeAccessors={geometry:{}};prototypeAccessors.geometry.get=function(){return void 0===this._geometry&&(this._geometry=this._vectorTileFeature.toGeoJSON(this._vectorTileFeature._x,this._vectorTileFeature._y,this._vectorTileFeature._z).geometry),this._geometry},prototypeAccessors.geometry.set=function(e){this._geometry=e;},Feature.prototype.toJSON=function(){var e=this,t={geometry:this.geometry};for(var r in e)"_geometry"!==r&&"_vectorTileFeature"!==r&&(t[r]=e[r]);return t},Object.defineProperties(Feature.prototype,prototypeAccessors),module.exports=Feature;
; |
461 | },{}],217:[function(_dereq_,module,exports){
|
462 | var scriptDetection=_dereq_("./script_detection");module.exports=function(t){for(var o="",e=0;e<t.length;e++){var r=t.charCodeAt(e+1)||null,l=t.charCodeAt(e-1)||null,i=(!r||!scriptDetection.charHasRotatedVerticalOrientation(r)||module.exports.lookup[t[e+1]])&&(!l||!scriptDetection.charHasRotatedVerticalOrientation(l)||module.exports.lookup[t[e-1]]);o+=i&&module.exports.lookup[t[e]]?module.exports.lookup[t[e]]:t[e];}return o},module.exports.lookup={"!":"︕","#":"#",$:"$","%":"%","&":"&","(":"︵",")":"︶","*":"*","+":"+",",":"︐","-":"︲",".":"・","/":"/",":":"︓",";":"︔","<":"︿","=":"=",">":"﹀","?":"︖","@":"@","[":"﹇","\\":"\","]":"﹈","^":"^",_:"︳","`":"`","{":"︷","|":"―","}":"︸","~":"~","¢":"¢","£":"£","¥":"¥","¦":"¦","¬":"¬","¯":" ̄","–":"︲","—":"︱","‘":"﹃","’":"﹄","“":"﹁","”":"﹂","…":"︙","‧":"・","₩":"₩","、":"︑","。":"︒","〈":"︿","〉":"﹀","《":"︽","》":"︾","「":"﹁","」":"﹂","『":"﹃","』":"﹄","【":"︻","】":"︼","〔":"︹","〕":"︺","〖":"︗","〗":"︘","!":"︕","(":"︵",")":"︶",",":"︐","-":"︲",".":"・",":":"︓",";":"︔","<":"︿",">":"﹀","?":"︖","[":"﹇","]":"﹈","_":"︳","{":"︷","|":"―","}":"︸","⦅":"︵","⦆":"︶","。":"︒","「":"﹁","」":"﹂"};
; |
463 | },{"./script_detection":211}],218:[function(_dereq_,module,exports){
|
464 | var WebWorker=_dereq_("./web_worker"),WorkerPool=function(){this.active={};};WorkerPool.prototype.acquire=function(r){var e=this;if(!this.workers){var o=_dereq_("../").workerCount;for(this.workers=[];this.workers.length<o;)e.workers.push(new WebWorker);}return this.active[r]=!0,this.workers.slice()},WorkerPool.prototype.release=function(r){delete this.active[r],0===Object.keys(this.active).length&&(this.workers.forEach(function(r){r.terminate();}),this.workers=null);},module.exports=WorkerPool;
; |
465 | },{"../":65,"./web_worker":196}]},{},[65])(65)
|
466 | });
|
467 |
|
468 |
|
469 |
|
470 | });
|
471 |
|
472 | var mapboxgl = unwrapExports(mapboxGl);
|
473 |
|
474 | var domain;
|
475 |
|
476 | // This constructor is used to store event handlers. Instantiating this is
|
477 | // faster than explicitly calling `Object.create(null)` to get a "clean" empty
|
478 | // object (tested with v8 v4.9).
|
479 | function EventHandlers() {}
|
480 | EventHandlers.prototype = Object.create(null);
|
481 |
|
482 | function EventEmitter() {
|
483 | EventEmitter.init.call(this);
|
484 | }
|
485 | // nodejs oddity
|
486 | // require('events') === require('events').EventEmitter
|
487 | EventEmitter.EventEmitter = EventEmitter;
|
488 |
|
489 | EventEmitter.usingDomains = false;
|
490 |
|
491 | EventEmitter.prototype.domain = undefined;
|
492 | EventEmitter.prototype._events = undefined;
|
493 | EventEmitter.prototype._maxListeners = undefined;
|
494 |
|
495 | // By default EventEmitters will print a warning if more than 10 listeners are
|
496 | // added to it. This is a useful default which helps finding memory leaks.
|
497 | EventEmitter.defaultMaxListeners = 10;
|
498 |
|
499 | EventEmitter.init = function() {
|
500 | this.domain = null;
|
501 | if (EventEmitter.usingDomains) {
|
502 | // if there is an active domain, then attach to it.
|
503 | if (domain.active && !(this instanceof domain.Domain)) {
|
504 | this.domain = domain.active;
|
505 | }
|
506 | }
|
507 |
|
508 | if (!this._events || this._events === Object.getPrototypeOf(this)._events) {
|
509 | this._events = new EventHandlers();
|
510 | this._eventsCount = 0;
|
511 | }
|
512 |
|
513 | this._maxListeners = this._maxListeners || undefined;
|
514 | };
|
515 |
|
516 | // Obviously not all Emitters should be limited to 10. This function allows
|
517 | // that to be increased. Set to zero for unlimited.
|
518 | EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
|
519 | if (typeof n !== 'number' || n < 0 || isNaN(n))
|
520 | throw new TypeError('"n" argument must be a positive number');
|
521 | this._maxListeners = n;
|
522 | return this;
|
523 | };
|
524 |
|
525 | function $getMaxListeners(that) {
|
526 | if (that._maxListeners === undefined)
|
527 | return EventEmitter.defaultMaxListeners;
|
528 | return that._maxListeners;
|
529 | }
|
530 |
|
531 | EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
|
532 | return $getMaxListeners(this);
|
533 | };
|
534 |
|
535 | // These standalone emit* functions are used to optimize calling of event
|
536 | // handlers for fast cases because emit() itself often has a variable number of
|
537 | // arguments and can be deoptimized because of that. These functions always have
|
538 | // the same number of arguments and thus do not get deoptimized, so the code
|
539 | // inside them can execute faster.
|
540 | function emitNone(handler, isFn, self) {
|
541 | if (isFn)
|
542 | handler.call(self);
|
543 | else {
|
544 | var len = handler.length;
|
545 | var listeners = arrayClone(handler, len);
|
546 | for (var i = 0; i < len; ++i)
|
547 | listeners[i].call(self);
|
548 | }
|
549 | }
|
550 | function emitOne(handler, isFn, self, arg1) {
|
551 | if (isFn)
|
552 | handler.call(self, arg1);
|
553 | else {
|
554 | var len = handler.length;
|
555 | var listeners = arrayClone(handler, len);
|
556 | for (var i = 0; i < len; ++i)
|
557 | listeners[i].call(self, arg1);
|
558 | }
|
559 | }
|
560 | function emitTwo(handler, isFn, self, arg1, arg2) {
|
561 | if (isFn)
|
562 | handler.call(self, arg1, arg2);
|
563 | else {
|
564 | var len = handler.length;
|
565 | var listeners = arrayClone(handler, len);
|
566 | for (var i = 0; i < len; ++i)
|
567 | listeners[i].call(self, arg1, arg2);
|
568 | }
|
569 | }
|
570 | function emitThree(handler, isFn, self, arg1, arg2, arg3) {
|
571 | if (isFn)
|
572 | handler.call(self, arg1, arg2, arg3);
|
573 | else {
|
574 | var len = handler.length;
|
575 | var listeners = arrayClone(handler, len);
|
576 | for (var i = 0; i < len; ++i)
|
577 | listeners[i].call(self, arg1, arg2, arg3);
|
578 | }
|
579 | }
|
580 |
|
581 | function emitMany(handler, isFn, self, args) {
|
582 | if (isFn)
|
583 | handler.apply(self, args);
|
584 | else {
|
585 | var len = handler.length;
|
586 | var listeners = arrayClone(handler, len);
|
587 | for (var i = 0; i < len; ++i)
|
588 | listeners[i].apply(self, args);
|
589 | }
|
590 | }
|
591 |
|
592 | EventEmitter.prototype.emit = function emit(type) {
|
593 | var er, handler, len, args, i, events, domain;
|
594 | var needDomainExit = false;
|
595 | var doError = (type === 'error');
|
596 |
|
597 | events = this._events;
|
598 | if (events)
|
599 | doError = (doError && events.error == null);
|
600 | else if (!doError)
|
601 | return false;
|
602 |
|
603 | domain = this.domain;
|
604 |
|
605 | // If there is no 'error' event listener then throw.
|
606 | if (doError) {
|
607 | er = arguments[1];
|
608 | if (domain) {
|
609 | if (!er)
|
610 | er = new Error('Uncaught, unspecified "error" event');
|
611 | er.domainEmitter = this;
|
612 | er.domain = domain;
|
613 | er.domainThrown = false;
|
614 | domain.emit('error', er);
|
615 | } else if (er instanceof Error) {
|
616 | throw er; // Unhandled 'error' event
|
617 | } else {
|
618 | // At least give some kind of context to the user
|
619 | var err = new Error('Uncaught, unspecified "error" event. (' + er + ')');
|
620 | err.context = er;
|
621 | throw err;
|
622 | }
|
623 | return false;
|
624 | }
|
625 |
|
626 | handler = events[type];
|
627 |
|
628 | if (!handler)
|
629 | return false;
|
630 |
|
631 | var isFn = typeof handler === 'function';
|
632 | len = arguments.length;
|
633 | switch (len) {
|
634 | // fast cases
|
635 | case 1:
|
636 | emitNone(handler, isFn, this);
|
637 | break;
|
638 | case 2:
|
639 | emitOne(handler, isFn, this, arguments[1]);
|
640 | break;
|
641 | case 3:
|
642 | emitTwo(handler, isFn, this, arguments[1], arguments[2]);
|
643 | break;
|
644 | case 4:
|
645 | emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]);
|
646 | break;
|
647 | // slower
|
648 | default:
|
649 | args = new Array(len - 1);
|
650 | for (i = 1; i < len; i++)
|
651 | args[i - 1] = arguments[i];
|
652 | emitMany(handler, isFn, this, args);
|
653 | }
|
654 |
|
655 | if (needDomainExit)
|
656 | domain.exit();
|
657 |
|
658 | return true;
|
659 | };
|
660 |
|
661 | function _addListener(target, type, listener, prepend) {
|
662 | var m;
|
663 | var events;
|
664 | var existing;
|
665 |
|
666 | if (typeof listener !== 'function')
|
667 | throw new TypeError('"listener" argument must be a function');
|
668 |
|
669 | events = target._events;
|
670 | if (!events) {
|
671 | events = target._events = new EventHandlers();
|
672 | target._eventsCount = 0;
|
673 | } else {
|
674 | // To avoid recursion in the case that type === "newListener"! Before
|
675 | // adding it to the listeners, first emit "newListener".
|
676 | if (events.newListener) {
|
677 | target.emit('newListener', type,
|
678 | listener.listener ? listener.listener : listener);
|
679 |
|
680 | // Re-assign `events` because a newListener handler could have caused the
|
681 | // this._events to be assigned to a new object
|
682 | events = target._events;
|
683 | }
|
684 | existing = events[type];
|
685 | }
|
686 |
|
687 | if (!existing) {
|
688 | // Optimize the case of one listener. Don't need the extra array object.
|
689 | existing = events[type] = listener;
|
690 | ++target._eventsCount;
|
691 | } else {
|
692 | if (typeof existing === 'function') {
|
693 | // Adding the second element, need to change to array.
|
694 | existing = events[type] = prepend ? [listener, existing] :
|
695 | [existing, listener];
|
696 | } else {
|
697 | // If we've already got an array, just append.
|
698 | if (prepend) {
|
699 | existing.unshift(listener);
|
700 | } else {
|
701 | existing.push(listener);
|
702 | }
|
703 | }
|
704 |
|
705 | // Check for listener leak
|
706 | if (!existing.warned) {
|
707 | m = $getMaxListeners(target);
|
708 | if (m && m > 0 && existing.length > m) {
|
709 | existing.warned = true;
|
710 | var w = new Error('Possible EventEmitter memory leak detected. ' +
|
711 | existing.length + ' ' + type + ' listeners added. ' +
|
712 | 'Use emitter.setMaxListeners() to increase limit');
|
713 | w.name = 'MaxListenersExceededWarning';
|
714 | w.emitter = target;
|
715 | w.type = type;
|
716 | w.count = existing.length;
|
717 | emitWarning(w);
|
718 | }
|
719 | }
|
720 | }
|
721 |
|
722 | return target;
|
723 | }
|
724 | function emitWarning(e) {
|
725 | typeof console.warn === 'function' ? console.warn(e) : console.log(e);
|
726 | }
|
727 | EventEmitter.prototype.addListener = function addListener(type, listener) {
|
728 | return _addListener(this, type, listener, false);
|
729 | };
|
730 |
|
731 | EventEmitter.prototype.on = EventEmitter.prototype.addListener;
|
732 |
|
733 | EventEmitter.prototype.prependListener =
|
734 | function prependListener(type, listener) {
|
735 | return _addListener(this, type, listener, true);
|
736 | };
|
737 |
|
738 | function _onceWrap(target, type, listener) {
|
739 | var fired = false;
|
740 | function g() {
|
741 | target.removeListener(type, g);
|
742 | if (!fired) {
|
743 | fired = true;
|
744 | listener.apply(target, arguments);
|
745 | }
|
746 | }
|
747 | g.listener = listener;
|
748 | return g;
|
749 | }
|
750 |
|
751 | EventEmitter.prototype.once = function once(type, listener) {
|
752 | if (typeof listener !== 'function')
|
753 | throw new TypeError('"listener" argument must be a function');
|
754 | this.on(type, _onceWrap(this, type, listener));
|
755 | return this;
|
756 | };
|
757 |
|
758 | EventEmitter.prototype.prependOnceListener =
|
759 | function prependOnceListener(type, listener) {
|
760 | if (typeof listener !== 'function')
|
761 | throw new TypeError('"listener" argument must be a function');
|
762 | this.prependListener(type, _onceWrap(this, type, listener));
|
763 | return this;
|
764 | };
|
765 |
|
766 | // emits a 'removeListener' event iff the listener was removed
|
767 | EventEmitter.prototype.removeListener =
|
768 | function removeListener(type, listener) {
|
769 | var list, events, position, i, originalListener;
|
770 |
|
771 | if (typeof listener !== 'function')
|
772 | throw new TypeError('"listener" argument must be a function');
|
773 |
|
774 | events = this._events;
|
775 | if (!events)
|
776 | return this;
|
777 |
|
778 | list = events[type];
|
779 | if (!list)
|
780 | return this;
|
781 |
|
782 | if (list === listener || (list.listener && list.listener === listener)) {
|
783 | if (--this._eventsCount === 0)
|
784 | this._events = new EventHandlers();
|
785 | else {
|
786 | delete events[type];
|
787 | if (events.removeListener)
|
788 | this.emit('removeListener', type, list.listener || listener);
|
789 | }
|
790 | } else if (typeof list !== 'function') {
|
791 | position = -1;
|
792 |
|
793 | for (i = list.length; i-- > 0;) {
|
794 | if (list[i] === listener ||
|
795 | (list[i].listener && list[i].listener === listener)) {
|
796 | originalListener = list[i].listener;
|
797 | position = i;
|
798 | break;
|
799 | }
|
800 | }
|
801 |
|
802 | if (position < 0)
|
803 | return this;
|
804 |
|
805 | if (list.length === 1) {
|
806 | list[0] = undefined;
|
807 | if (--this._eventsCount === 0) {
|
808 | this._events = new EventHandlers();
|
809 | return this;
|
810 | } else {
|
811 | delete events[type];
|
812 | }
|
813 | } else {
|
814 | spliceOne(list, position);
|
815 | }
|
816 |
|
817 | if (events.removeListener)
|
818 | this.emit('removeListener', type, originalListener || listener);
|
819 | }
|
820 |
|
821 | return this;
|
822 | };
|
823 |
|
824 | EventEmitter.prototype.removeAllListeners =
|
825 | function removeAllListeners(type) {
|
826 | var listeners, events;
|
827 |
|
828 | events = this._events;
|
829 | if (!events)
|
830 | return this;
|
831 |
|
832 | // not listening for removeListener, no need to emit
|
833 | if (!events.removeListener) {
|
834 | if (arguments.length === 0) {
|
835 | this._events = new EventHandlers();
|
836 | this._eventsCount = 0;
|
837 | } else if (events[type]) {
|
838 | if (--this._eventsCount === 0)
|
839 | this._events = new EventHandlers();
|
840 | else
|
841 | delete events[type];
|
842 | }
|
843 | return this;
|
844 | }
|
845 |
|
846 | // emit removeListener for all listeners on all events
|
847 | if (arguments.length === 0) {
|
848 | var keys = Object.keys(events);
|
849 | for (var i = 0, key; i < keys.length; ++i) {
|
850 | key = keys[i];
|
851 | if (key === 'removeListener') continue;
|
852 | this.removeAllListeners(key);
|
853 | }
|
854 | this.removeAllListeners('removeListener');
|
855 | this._events = new EventHandlers();
|
856 | this._eventsCount = 0;
|
857 | return this;
|
858 | }
|
859 |
|
860 | listeners = events[type];
|
861 |
|
862 | if (typeof listeners === 'function') {
|
863 | this.removeListener(type, listeners);
|
864 | } else if (listeners) {
|
865 | // LIFO order
|
866 | do {
|
867 | this.removeListener(type, listeners[listeners.length - 1]);
|
868 | } while (listeners[0]);
|
869 | }
|
870 |
|
871 | return this;
|
872 | };
|
873 |
|
874 | EventEmitter.prototype.listeners = function listeners(type) {
|
875 | var evlistener;
|
876 | var ret;
|
877 | var events = this._events;
|
878 |
|
879 | if (!events)
|
880 | ret = [];
|
881 | else {
|
882 | evlistener = events[type];
|
883 | if (!evlistener)
|
884 | ret = [];
|
885 | else if (typeof evlistener === 'function')
|
886 | ret = [evlistener.listener || evlistener];
|
887 | else
|
888 | ret = unwrapListeners(evlistener);
|
889 | }
|
890 |
|
891 | return ret;
|
892 | };
|
893 |
|
894 | EventEmitter.listenerCount = function(emitter, type) {
|
895 | if (typeof emitter.listenerCount === 'function') {
|
896 | return emitter.listenerCount(type);
|
897 | } else {
|
898 | return listenerCount.call(emitter, type);
|
899 | }
|
900 | };
|
901 |
|
902 | EventEmitter.prototype.listenerCount = listenerCount;
|
903 | function listenerCount(type) {
|
904 | var events = this._events;
|
905 |
|
906 | if (events) {
|
907 | var evlistener = events[type];
|
908 |
|
909 | if (typeof evlistener === 'function') {
|
910 | return 1;
|
911 | } else if (evlistener) {
|
912 | return evlistener.length;
|
913 | }
|
914 | }
|
915 |
|
916 | return 0;
|
917 | }
|
918 |
|
919 | EventEmitter.prototype.eventNames = function eventNames() {
|
920 | return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : [];
|
921 | };
|
922 |
|
923 | // About 1.5x faster than the two-arg version of Array#splice().
|
924 | function spliceOne(list, index) {
|
925 | for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1)
|
926 | list[i] = list[k];
|
927 | list.pop();
|
928 | }
|
929 |
|
930 | function arrayClone(arr, i) {
|
931 | var copy = new Array(i);
|
932 | while (i--)
|
933 | copy[i] = arr[i];
|
934 | return copy;
|
935 | }
|
936 |
|
937 | function unwrapListeners(arr) {
|
938 | var ret = new Array(arr.length);
|
939 | for (var i = 0; i < ret.length; ++i) {
|
940 | ret[i] = arr[i].listener || arr[i];
|
941 | }
|
942 | return ret;
|
943 | }
|
944 |
|
945 | /**
|
946 | * Copyright (c) 2013-present, Facebook, Inc.
|
947 | * All rights reserved.
|
948 | *
|
949 | * This source code is licensed under the BSD-style license found in the
|
950 | * LICENSE file in the root directory of this source tree. An additional grant
|
951 | * of patent rights can be found in the PATENTS file in the same directory.
|
952 | *
|
953 | *
|
954 | */
|
955 | /**
|
956 | * WARNING: DO NOT manually require this module.
|
957 | * This is a replacement for `invariant(...)` used by the error code system
|
958 | * and will _only_ be required by the corresponding babel pass.
|
959 | * It always throws.
|
960 | */
|
961 |
|
962 | function reactProdInvariant(code) {
|
963 | var argCount = arguments.length - 1;
|
964 |
|
965 | var message = 'Minified React error #' + code + '; visit ' + 'http://facebook.github.io/react/docs/error-decoder.html?invariant=' + code;
|
966 |
|
967 | for (var argIdx = 0; argIdx < argCount; argIdx++) {
|
968 | message += '&args[]=' + encodeURIComponent(arguments[argIdx + 1]);
|
969 | }
|
970 |
|
971 | message += ' for the full message or use the non-minified dev environment' + ' for full errors and additional helpful warnings.';
|
972 |
|
973 | var error = new Error(message);
|
974 | error.name = 'Invariant Violation';
|
975 | error.framesToPop = 1; // we don't care about reactProdInvariant's own frame
|
976 |
|
977 | throw error;
|
978 | }
|
979 |
|
980 | var reactProdInvariant_1 = reactProdInvariant;
|
981 |
|
982 | /**
|
983 | * Copyright (c) 2013-present, Facebook, Inc.
|
984 | * All rights reserved.
|
985 | *
|
986 | * This source code is licensed under the BSD-style license found in the
|
987 | * LICENSE file in the root directory of this source tree. An additional grant
|
988 | * of patent rights can be found in the PATENTS file in the same directory.
|
989 | *
|
990 | */
|
991 |
|
992 | /**
|
993 | * Use invariant() to assert state which your program assumes to be true.
|
994 | *
|
995 | * Provide sprintf-style format (only %s is supported) and arguments
|
996 | * to provide information about what broke and what you were
|
997 | * expecting.
|
998 | *
|
999 | * The invariant message will be stripped in production, but the invariant
|
1000 | * will remain to ensure logic does not differ in production.
|
1001 | */
|
1002 |
|
1003 | var validateFormat = function validateFormat(format) {};
|
1004 |
|
1005 | function invariant(condition, format, a, b, c, d, e, f) {
|
1006 | validateFormat(format);
|
1007 |
|
1008 | if (!condition) {
|
1009 | var error;
|
1010 | if (format === undefined) {
|
1011 | error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');
|
1012 | } else {
|
1013 | var args = [a, b, c, d, e, f];
|
1014 | var argIndex = 0;
|
1015 | error = new Error(format.replace(/%s/g, function () {
|
1016 | return args[argIndex++];
|
1017 | }));
|
1018 | error.name = 'Invariant Violation';
|
1019 | }
|
1020 |
|
1021 | error.framesToPop = 1; // we don't care about invariant's own frame
|
1022 | throw error;
|
1023 | }
|
1024 | }
|
1025 |
|
1026 | var invariant_1 = invariant;
|
1027 |
|
1028 | function checkMask(value, bitmask) {
|
1029 | return (value & bitmask) === bitmask;
|
1030 | }
|
1031 |
|
1032 | var DOMPropertyInjection = {
|
1033 | /**
|
1034 | * Mapping from normalized, camelcased property names to a configuration that
|
1035 | * specifies how the associated DOM property should be accessed or rendered.
|
1036 | */
|
1037 | MUST_USE_PROPERTY: 0x1,
|
1038 | HAS_BOOLEAN_VALUE: 0x4,
|
1039 | HAS_NUMERIC_VALUE: 0x8,
|
1040 | HAS_POSITIVE_NUMERIC_VALUE: 0x10 | 0x8,
|
1041 | HAS_OVERLOADED_BOOLEAN_VALUE: 0x20,
|
1042 |
|
1043 | /**
|
1044 | * Inject some specialized knowledge about the DOM. This takes a config object
|
1045 | * with the following properties:
|
1046 | *
|
1047 | * isCustomAttribute: function that given an attribute name will return true
|
1048 | * if it can be inserted into the DOM verbatim. Useful for data-* or aria-*
|
1049 | * attributes where it's impossible to enumerate all of the possible
|
1050 | * attribute names,
|
1051 | *
|
1052 | * Properties: object mapping DOM property name to one of the
|
1053 | * DOMPropertyInjection constants or null. If your attribute isn't in here,
|
1054 | * it won't get written to the DOM.
|
1055 | *
|
1056 | * DOMAttributeNames: object mapping React attribute name to the DOM
|
1057 | * attribute name. Attribute names not specified use the **lowercase**
|
1058 | * normalized name.
|
1059 | *
|
1060 | * DOMAttributeNamespaces: object mapping React attribute name to the DOM
|
1061 | * attribute namespace URL. (Attribute names not specified use no namespace.)
|
1062 | *
|
1063 | * DOMPropertyNames: similar to DOMAttributeNames but for DOM properties.
|
1064 | * Property names not specified use the normalized name.
|
1065 | *
|
1066 | * DOMMutationMethods: Properties that require special mutation methods. If
|
1067 | * `value` is undefined, the mutation method should unset the property.
|
1068 | *
|
1069 | * @param {object} domPropertyConfig the config as described above.
|
1070 | */
|
1071 | injectDOMPropertyConfig: function (domPropertyConfig) {
|
1072 | var Injection = DOMPropertyInjection;
|
1073 | var Properties = domPropertyConfig.Properties || {};
|
1074 | var DOMAttributeNamespaces = domPropertyConfig.DOMAttributeNamespaces || {};
|
1075 | var DOMAttributeNames = domPropertyConfig.DOMAttributeNames || {};
|
1076 | var DOMPropertyNames = domPropertyConfig.DOMPropertyNames || {};
|
1077 | var DOMMutationMethods = domPropertyConfig.DOMMutationMethods || {};
|
1078 |
|
1079 | if (domPropertyConfig.isCustomAttribute) {
|
1080 | DOMProperty._isCustomAttributeFunctions.push(domPropertyConfig.isCustomAttribute);
|
1081 | }
|
1082 |
|
1083 | for (var propName in Properties) {
|
1084 | !!DOMProperty.properties.hasOwnProperty(propName) ? reactProdInvariant_1('48', propName) : void 0;
|
1085 |
|
1086 | var lowerCased = propName.toLowerCase();
|
1087 | var propConfig = Properties[propName];
|
1088 |
|
1089 | var propertyInfo = {
|
1090 | attributeName: lowerCased,
|
1091 | attributeNamespace: null,
|
1092 | propertyName: propName,
|
1093 | mutationMethod: null,
|
1094 |
|
1095 | mustUseProperty: checkMask(propConfig, Injection.MUST_USE_PROPERTY),
|
1096 | hasBooleanValue: checkMask(propConfig, Injection.HAS_BOOLEAN_VALUE),
|
1097 | hasNumericValue: checkMask(propConfig, Injection.HAS_NUMERIC_VALUE),
|
1098 | hasPositiveNumericValue: checkMask(propConfig, Injection.HAS_POSITIVE_NUMERIC_VALUE),
|
1099 | hasOverloadedBooleanValue: checkMask(propConfig, Injection.HAS_OVERLOADED_BOOLEAN_VALUE)
|
1100 | };
|
1101 | !(propertyInfo.hasBooleanValue + propertyInfo.hasNumericValue + propertyInfo.hasOverloadedBooleanValue <= 1) ? reactProdInvariant_1('50', propName) : void 0;
|
1102 |
|
1103 | if (DOMAttributeNames.hasOwnProperty(propName)) {
|
1104 | var attributeName = DOMAttributeNames[propName];
|
1105 | propertyInfo.attributeName = attributeName;
|
1106 |
|
1107 | }
|
1108 |
|
1109 | if (DOMAttributeNamespaces.hasOwnProperty(propName)) {
|
1110 | propertyInfo.attributeNamespace = DOMAttributeNamespaces[propName];
|
1111 | }
|
1112 |
|
1113 | if (DOMPropertyNames.hasOwnProperty(propName)) {
|
1114 | propertyInfo.propertyName = DOMPropertyNames[propName];
|
1115 | }
|
1116 |
|
1117 | if (DOMMutationMethods.hasOwnProperty(propName)) {
|
1118 | propertyInfo.mutationMethod = DOMMutationMethods[propName];
|
1119 | }
|
1120 |
|
1121 | DOMProperty.properties[propName] = propertyInfo;
|
1122 | }
|
1123 | }
|
1124 | };
|
1125 |
|
1126 | /* eslint-disable max-len */
|
1127 | var ATTRIBUTE_NAME_START_CHAR = ':A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD';
|
1128 | /* eslint-enable max-len */
|
1129 |
|
1130 | /**
|
1131 | * DOMProperty exports lookup objects that can be used like functions:
|
1132 | *
|
1133 | * > DOMProperty.isValid['id']
|
1134 | * true
|
1135 | * > DOMProperty.isValid['foobar']
|
1136 | * undefined
|
1137 | *
|
1138 | * Although this may be confusing, it performs better in general.
|
1139 | *
|
1140 | * @see http://jsperf.com/key-exists
|
1141 | * @see http://jsperf.com/key-missing
|
1142 | */
|
1143 | var DOMProperty = {
|
1144 | ID_ATTRIBUTE_NAME: 'data-reactid',
|
1145 | ROOT_ATTRIBUTE_NAME: 'data-reactroot',
|
1146 |
|
1147 | ATTRIBUTE_NAME_START_CHAR: ATTRIBUTE_NAME_START_CHAR,
|
1148 | ATTRIBUTE_NAME_CHAR: ATTRIBUTE_NAME_START_CHAR + '\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040',
|
1149 |
|
1150 | /**
|
1151 | * Map from property "standard name" to an object with info about how to set
|
1152 | * the property in the DOM. Each object contains:
|
1153 | *
|
1154 | * attributeName:
|
1155 | * Used when rendering markup or with `*Attribute()`.
|
1156 | * attributeNamespace
|
1157 | * propertyName:
|
1158 | * Used on DOM node instances. (This includes properties that mutate due to
|
1159 | * external factors.)
|
1160 | * mutationMethod:
|
1161 | * If non-null, used instead of the property or `setAttribute()` after
|
1162 | * initial render.
|
1163 | * mustUseProperty:
|
1164 | * Whether the property must be accessed and mutated as an object property.
|
1165 | * hasBooleanValue:
|
1166 | * Whether the property should be removed when set to a falsey value.
|
1167 | * hasNumericValue:
|
1168 | * Whether the property must be numeric or parse as a numeric and should be
|
1169 | * removed when set to a falsey value.
|
1170 | * hasPositiveNumericValue:
|
1171 | * Whether the property must be positive numeric or parse as a positive
|
1172 | * numeric and should be removed when set to a falsey value.
|
1173 | * hasOverloadedBooleanValue:
|
1174 | * Whether the property can be used as a flag as well as with a value.
|
1175 | * Removed when strictly equal to false; present without a value when
|
1176 | * strictly equal to true; present with a value otherwise.
|
1177 | */
|
1178 | properties: {},
|
1179 |
|
1180 | /**
|
1181 | * Mapping from lowercase property names to the properly cased version, used
|
1182 | * to warn in the case of missing properties. Available only in __DEV__.
|
1183 | *
|
1184 | * autofocus is predefined, because adding it to the property whitelist
|
1185 | * causes unintended side effects.
|
1186 | *
|
1187 | * @type {Object}
|
1188 | */
|
1189 | getPossibleStandardName: null,
|
1190 |
|
1191 | /**
|
1192 | * All of the isCustomAttribute() functions that have been injected.
|
1193 | */
|
1194 | _isCustomAttributeFunctions: [],
|
1195 |
|
1196 | /**
|
1197 | * Checks whether a property name is a custom attribute.
|
1198 | * @method
|
1199 | */
|
1200 | isCustomAttribute: function (attributeName) {
|
1201 | for (var i = 0; i < DOMProperty._isCustomAttributeFunctions.length; i++) {
|
1202 | var isCustomAttributeFn = DOMProperty._isCustomAttributeFunctions[i];
|
1203 | if (isCustomAttributeFn(attributeName)) {
|
1204 | return true;
|
1205 | }
|
1206 | }
|
1207 | return false;
|
1208 | },
|
1209 |
|
1210 | injection: DOMPropertyInjection
|
1211 | };
|
1212 |
|
1213 | var DOMProperty_1 = DOMProperty;
|
1214 |
|
1215 | /**
|
1216 | * Copyright 2015-present, Facebook, Inc.
|
1217 | * All rights reserved.
|
1218 | *
|
1219 | * This source code is licensed under the BSD-style license found in the
|
1220 | * LICENSE file in the root directory of this source tree. An additional grant
|
1221 | * of patent rights can be found in the PATENTS file in the same directory.
|
1222 | *
|
1223 | */
|
1224 |
|
1225 | var ReactDOMComponentFlags = {
|
1226 | hasCachedChildNodes: 1 << 0
|
1227 | };
|
1228 |
|
1229 | var ReactDOMComponentFlags_1 = ReactDOMComponentFlags;
|
1230 |
|
1231 | var ATTR_NAME = DOMProperty_1.ID_ATTRIBUTE_NAME;
|
1232 | var Flags = ReactDOMComponentFlags_1;
|
1233 |
|
1234 | var internalInstanceKey = '__reactInternalInstance$' + Math.random().toString(36).slice(2);
|
1235 |
|
1236 | /**
|
1237 | * Check if a given node should be cached.
|
1238 | */
|
1239 | function shouldPrecacheNode(node, nodeID) {
|
1240 | return node.nodeType === 1 && node.getAttribute(ATTR_NAME) === String(nodeID) || node.nodeType === 8 && node.nodeValue === ' react-text: ' + nodeID + ' ' || node.nodeType === 8 && node.nodeValue === ' react-empty: ' + nodeID + ' ';
|
1241 | }
|
1242 |
|
1243 | /**
|
1244 | * Drill down (through composites and empty components) until we get a host or
|
1245 | * host text component.
|
1246 | *
|
1247 | * This is pretty polymorphic but unavoidable with the current structure we have
|
1248 | * for `_renderedChildren`.
|
1249 | */
|
1250 | function getRenderedHostOrTextFromComponent(component) {
|
1251 | var rendered;
|
1252 | while (rendered = component._renderedComponent) {
|
1253 | component = rendered;
|
1254 | }
|
1255 | return component;
|
1256 | }
|
1257 |
|
1258 | /**
|
1259 | * Populate `_hostNode` on the rendered host/text component with the given
|
1260 | * DOM node. The passed `inst` can be a composite.
|
1261 | */
|
1262 | function precacheNode(inst, node) {
|
1263 | var hostInst = getRenderedHostOrTextFromComponent(inst);
|
1264 | hostInst._hostNode = node;
|
1265 | node[internalInstanceKey] = hostInst;
|
1266 | }
|
1267 |
|
1268 | function uncacheNode(inst) {
|
1269 | var node = inst._hostNode;
|
1270 | if (node) {
|
1271 | delete node[internalInstanceKey];
|
1272 | inst._hostNode = null;
|
1273 | }
|
1274 | }
|
1275 |
|
1276 | /**
|
1277 | * Populate `_hostNode` on each child of `inst`, assuming that the children
|
1278 | * match up with the DOM (element) children of `node`.
|
1279 | *
|
1280 | * We cache entire levels at once to avoid an n^2 problem where we access the
|
1281 | * children of a node sequentially and have to walk from the start to our target
|
1282 | * node every time.
|
1283 | *
|
1284 | * Since we update `_renderedChildren` and the actual DOM at (slightly)
|
1285 | * different times, we could race here and see a newer `_renderedChildren` than
|
1286 | * the DOM nodes we see. To avoid this, ReactMultiChild calls
|
1287 | * `prepareToManageChildren` before we change `_renderedChildren`, at which
|
1288 | * time the container's child nodes are always cached (until it unmounts).
|
1289 | */
|
1290 | function precacheChildNodes(inst, node) {
|
1291 | if (inst._flags & Flags.hasCachedChildNodes) {
|
1292 | return;
|
1293 | }
|
1294 | var children = inst._renderedChildren;
|
1295 | var childNode = node.firstChild;
|
1296 | outer: for (var name in children) {
|
1297 | if (!children.hasOwnProperty(name)) {
|
1298 | continue;
|
1299 | }
|
1300 | var childInst = children[name];
|
1301 | var childID = getRenderedHostOrTextFromComponent(childInst)._domID;
|
1302 | if (childID === 0) {
|
1303 | // We're currently unmounting this child in ReactMultiChild; skip it.
|
1304 | continue;
|
1305 | }
|
1306 | // We assume the child nodes are in the same order as the child instances.
|
1307 | for (; childNode !== null; childNode = childNode.nextSibling) {
|
1308 | if (shouldPrecacheNode(childNode, childID)) {
|
1309 | precacheNode(childInst, childNode);
|
1310 | continue outer;
|
1311 | }
|
1312 | }
|
1313 | // We reached the end of the DOM children without finding an ID match.
|
1314 | reactProdInvariant_1('32', childID);
|
1315 | }
|
1316 | inst._flags |= Flags.hasCachedChildNodes;
|
1317 | }
|
1318 |
|
1319 | /**
|
1320 | * Given a DOM node, return the closest ReactDOMComponent or
|
1321 | * ReactDOMTextComponent instance ancestor.
|
1322 | */
|
1323 | function getClosestInstanceFromNode(node) {
|
1324 | if (node[internalInstanceKey]) {
|
1325 | return node[internalInstanceKey];
|
1326 | }
|
1327 |
|
1328 | // Walk up the tree until we find an ancestor whose instance we have cached.
|
1329 | var parents = [];
|
1330 | while (!node[internalInstanceKey]) {
|
1331 | parents.push(node);
|
1332 | if (node.parentNode) {
|
1333 | node = node.parentNode;
|
1334 | } else {
|
1335 | // Top of the tree. This node must not be part of a React tree (or is
|
1336 | // unmounted, potentially).
|
1337 | return null;
|
1338 | }
|
1339 | }
|
1340 |
|
1341 | var closest;
|
1342 | var inst;
|
1343 | for (; node && (inst = node[internalInstanceKey]); node = parents.pop()) {
|
1344 | closest = inst;
|
1345 | if (parents.length) {
|
1346 | precacheChildNodes(inst, node);
|
1347 | }
|
1348 | }
|
1349 |
|
1350 | return closest;
|
1351 | }
|
1352 |
|
1353 | /**
|
1354 | * Given a DOM node, return the ReactDOMComponent or ReactDOMTextComponent
|
1355 | * instance, or null if the node was not rendered by this React.
|
1356 | */
|
1357 | function getInstanceFromNode(node) {
|
1358 | var inst = getClosestInstanceFromNode(node);
|
1359 | if (inst != null && inst._hostNode === node) {
|
1360 | return inst;
|
1361 | } else {
|
1362 | return null;
|
1363 | }
|
1364 | }
|
1365 |
|
1366 | /**
|
1367 | * Given a ReactDOMComponent or ReactDOMTextComponent, return the corresponding
|
1368 | * DOM node.
|
1369 | */
|
1370 | function getNodeFromInstance(inst) {
|
1371 | // Without this first invariant, passing a non-DOM-component triggers the next
|
1372 | // invariant for a missing parent, which is super confusing.
|
1373 | !(inst._hostNode !== undefined) ? reactProdInvariant_1('33') : void 0;
|
1374 |
|
1375 | if (inst._hostNode) {
|
1376 | return inst._hostNode;
|
1377 | }
|
1378 |
|
1379 | // Walk up the tree until we find an ancestor whose DOM node we have cached.
|
1380 | var parents = [];
|
1381 | while (!inst._hostNode) {
|
1382 | parents.push(inst);
|
1383 | !inst._hostParent ? reactProdInvariant_1('34') : void 0;
|
1384 | inst = inst._hostParent;
|
1385 | }
|
1386 |
|
1387 | // Now parents contains each ancestor that does *not* have a cached native
|
1388 | // node, and `inst` is the deepest ancestor that does.
|
1389 | for (; parents.length; inst = parents.pop()) {
|
1390 | precacheChildNodes(inst, inst._hostNode);
|
1391 | }
|
1392 |
|
1393 | return inst._hostNode;
|
1394 | }
|
1395 |
|
1396 | var ReactDOMComponentTree = {
|
1397 | getClosestInstanceFromNode: getClosestInstanceFromNode,
|
1398 | getInstanceFromNode: getInstanceFromNode,
|
1399 | getNodeFromInstance: getNodeFromInstance,
|
1400 | precacheChildNodes: precacheChildNodes,
|
1401 | precacheNode: precacheNode,
|
1402 | uncacheNode: uncacheNode
|
1403 | };
|
1404 |
|
1405 | var ReactDOMComponentTree_1 = ReactDOMComponentTree;
|
1406 |
|
1407 | /**
|
1408 | * Copyright 2013-present, Facebook, Inc.
|
1409 | * All rights reserved.
|
1410 | *
|
1411 | * This source code is licensed under the BSD-style license found in the
|
1412 | * LICENSE file in the root directory of this source tree. An additional grant
|
1413 | * of patent rights can be found in the PATENTS file in the same directory.
|
1414 | *
|
1415 | */
|
1416 |
|
1417 | var ARIADOMPropertyConfig = {
|
1418 | Properties: {
|
1419 | // Global States and Properties
|
1420 | 'aria-current': 0, // state
|
1421 | 'aria-details': 0,
|
1422 | 'aria-disabled': 0, // state
|
1423 | 'aria-hidden': 0, // state
|
1424 | 'aria-invalid': 0, // state
|
1425 | 'aria-keyshortcuts': 0,
|
1426 | 'aria-label': 0,
|
1427 | 'aria-roledescription': 0,
|
1428 | // Widget Attributes
|
1429 | 'aria-autocomplete': 0,
|
1430 | 'aria-checked': 0,
|
1431 | 'aria-expanded': 0,
|
1432 | 'aria-haspopup': 0,
|
1433 | 'aria-level': 0,
|
1434 | 'aria-modal': 0,
|
1435 | 'aria-multiline': 0,
|
1436 | 'aria-multiselectable': 0,
|
1437 | 'aria-orientation': 0,
|
1438 | 'aria-placeholder': 0,
|
1439 | 'aria-pressed': 0,
|
1440 | 'aria-readonly': 0,
|
1441 | 'aria-required': 0,
|
1442 | 'aria-selected': 0,
|
1443 | 'aria-sort': 0,
|
1444 | 'aria-valuemax': 0,
|
1445 | 'aria-valuemin': 0,
|
1446 | 'aria-valuenow': 0,
|
1447 | 'aria-valuetext': 0,
|
1448 | // Live Region Attributes
|
1449 | 'aria-atomic': 0,
|
1450 | 'aria-busy': 0,
|
1451 | 'aria-live': 0,
|
1452 | 'aria-relevant': 0,
|
1453 | // Drag-and-Drop Attributes
|
1454 | 'aria-dropeffect': 0,
|
1455 | 'aria-grabbed': 0,
|
1456 | // Relationship Attributes
|
1457 | 'aria-activedescendant': 0,
|
1458 | 'aria-colcount': 0,
|
1459 | 'aria-colindex': 0,
|
1460 | 'aria-colspan': 0,
|
1461 | 'aria-controls': 0,
|
1462 | 'aria-describedby': 0,
|
1463 | 'aria-errormessage': 0,
|
1464 | 'aria-flowto': 0,
|
1465 | 'aria-labelledby': 0,
|
1466 | 'aria-owns': 0,
|
1467 | 'aria-posinset': 0,
|
1468 | 'aria-rowcount': 0,
|
1469 | 'aria-rowindex': 0,
|
1470 | 'aria-rowspan': 0,
|
1471 | 'aria-setsize': 0
|
1472 | },
|
1473 | DOMAttributeNames: {},
|
1474 | DOMPropertyNames: {}
|
1475 | };
|
1476 |
|
1477 | var ARIADOMPropertyConfig_1 = ARIADOMPropertyConfig;
|
1478 |
|
1479 | /**
|
1480 | * Injectable ordering of event plugins.
|
1481 | */
|
1482 | var eventPluginOrder = null;
|
1483 |
|
1484 | /**
|
1485 | * Injectable mapping from names to event plugin modules.
|
1486 | */
|
1487 | var namesToPlugins = {};
|
1488 |
|
1489 | /**
|
1490 | * Recomputes the plugin list using the injected plugins and plugin ordering.
|
1491 | *
|
1492 | * @private
|
1493 | */
|
1494 | function recomputePluginOrdering() {
|
1495 | if (!eventPluginOrder) {
|
1496 | // Wait until an `eventPluginOrder` is injected.
|
1497 | return;
|
1498 | }
|
1499 | for (var pluginName in namesToPlugins) {
|
1500 | var pluginModule = namesToPlugins[pluginName];
|
1501 | var pluginIndex = eventPluginOrder.indexOf(pluginName);
|
1502 | !(pluginIndex > -1) ? reactProdInvariant_1('96', pluginName) : void 0;
|
1503 | if (EventPluginRegistry.plugins[pluginIndex]) {
|
1504 | continue;
|
1505 | }
|
1506 | !pluginModule.extractEvents ? reactProdInvariant_1('97', pluginName) : void 0;
|
1507 | EventPluginRegistry.plugins[pluginIndex] = pluginModule;
|
1508 | var publishedEvents = pluginModule.eventTypes;
|
1509 | for (var eventName in publishedEvents) {
|
1510 | !publishEventForPlugin(publishedEvents[eventName], pluginModule, eventName) ? reactProdInvariant_1('98', eventName, pluginName) : void 0;
|
1511 | }
|
1512 | }
|
1513 | }
|
1514 |
|
1515 | /**
|
1516 | * Publishes an event so that it can be dispatched by the supplied plugin.
|
1517 | *
|
1518 | * @param {object} dispatchConfig Dispatch configuration for the event.
|
1519 | * @param {object} PluginModule Plugin publishing the event.
|
1520 | * @return {boolean} True if the event was successfully published.
|
1521 | * @private
|
1522 | */
|
1523 | function publishEventForPlugin(dispatchConfig, pluginModule, eventName) {
|
1524 | !!EventPluginRegistry.eventNameDispatchConfigs.hasOwnProperty(eventName) ? reactProdInvariant_1('99', eventName) : void 0;
|
1525 | EventPluginRegistry.eventNameDispatchConfigs[eventName] = dispatchConfig;
|
1526 |
|
1527 | var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;
|
1528 | if (phasedRegistrationNames) {
|
1529 | for (var phaseName in phasedRegistrationNames) {
|
1530 | if (phasedRegistrationNames.hasOwnProperty(phaseName)) {
|
1531 | var phasedRegistrationName = phasedRegistrationNames[phaseName];
|
1532 | publishRegistrationName(phasedRegistrationName, pluginModule, eventName);
|
1533 | }
|
1534 | }
|
1535 | return true;
|
1536 | } else if (dispatchConfig.registrationName) {
|
1537 | publishRegistrationName(dispatchConfig.registrationName, pluginModule, eventName);
|
1538 | return true;
|
1539 | }
|
1540 | return false;
|
1541 | }
|
1542 |
|
1543 | /**
|
1544 | * Publishes a registration name that is used to identify dispatched events and
|
1545 | * can be used with `EventPluginHub.putListener` to register listeners.
|
1546 | *
|
1547 | * @param {string} registrationName Registration name to add.
|
1548 | * @param {object} PluginModule Plugin publishing the event.
|
1549 | * @private
|
1550 | */
|
1551 | function publishRegistrationName(registrationName, pluginModule, eventName) {
|
1552 | !!EventPluginRegistry.registrationNameModules[registrationName] ? reactProdInvariant_1('100', registrationName) : void 0;
|
1553 | EventPluginRegistry.registrationNameModules[registrationName] = pluginModule;
|
1554 | EventPluginRegistry.registrationNameDependencies[registrationName] = pluginModule.eventTypes[eventName].dependencies;
|
1555 |
|
1556 |
|
1557 | }
|
1558 |
|
1559 | /**
|
1560 | * Registers plugins so that they can extract and dispatch events.
|
1561 | *
|
1562 | * @see {EventPluginHub}
|
1563 | */
|
1564 | var EventPluginRegistry = {
|
1565 | /**
|
1566 | * Ordered list of injected plugins.
|
1567 | */
|
1568 | plugins: [],
|
1569 |
|
1570 | /**
|
1571 | * Mapping from event name to dispatch config
|
1572 | */
|
1573 | eventNameDispatchConfigs: {},
|
1574 |
|
1575 | /**
|
1576 | * Mapping from registration name to plugin module
|
1577 | */
|
1578 | registrationNameModules: {},
|
1579 |
|
1580 | /**
|
1581 | * Mapping from registration name to event name
|
1582 | */
|
1583 | registrationNameDependencies: {},
|
1584 |
|
1585 | /**
|
1586 | * Mapping from lowercase registration names to the properly cased version,
|
1587 | * used to warn in the case of missing event handlers. Available
|
1588 | * only in __DEV__.
|
1589 | * @type {Object}
|
1590 | */
|
1591 | possibleRegistrationNames: null,
|
1592 | // Trust the developer to only use possibleRegistrationNames in __DEV__
|
1593 |
|
1594 | /**
|
1595 | * Injects an ordering of plugins (by plugin name). This allows the ordering
|
1596 | * to be decoupled from injection of the actual plugins so that ordering is
|
1597 | * always deterministic regardless of packaging, on-the-fly injection, etc.
|
1598 | *
|
1599 | * @param {array} InjectedEventPluginOrder
|
1600 | * @internal
|
1601 | * @see {EventPluginHub.injection.injectEventPluginOrder}
|
1602 | */
|
1603 | injectEventPluginOrder: function (injectedEventPluginOrder) {
|
1604 | !!eventPluginOrder ? reactProdInvariant_1('101') : void 0;
|
1605 | // Clone the ordering so it cannot be dynamically mutated.
|
1606 | eventPluginOrder = Array.prototype.slice.call(injectedEventPluginOrder);
|
1607 | recomputePluginOrdering();
|
1608 | },
|
1609 |
|
1610 | /**
|
1611 | * Injects plugins to be used by `EventPluginHub`. The plugin names must be
|
1612 | * in the ordering injected by `injectEventPluginOrder`.
|
1613 | *
|
1614 | * Plugins can be injected as part of page initialization or on-the-fly.
|
1615 | *
|
1616 | * @param {object} injectedNamesToPlugins Map from names to plugin modules.
|
1617 | * @internal
|
1618 | * @see {EventPluginHub.injection.injectEventPluginsByName}
|
1619 | */
|
1620 | injectEventPluginsByName: function (injectedNamesToPlugins) {
|
1621 | var isOrderingDirty = false;
|
1622 | for (var pluginName in injectedNamesToPlugins) {
|
1623 | if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) {
|
1624 | continue;
|
1625 | }
|
1626 | var pluginModule = injectedNamesToPlugins[pluginName];
|
1627 | if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== pluginModule) {
|
1628 | !!namesToPlugins[pluginName] ? reactProdInvariant_1('102', pluginName) : void 0;
|
1629 | namesToPlugins[pluginName] = pluginModule;
|
1630 | isOrderingDirty = true;
|
1631 | }
|
1632 | }
|
1633 | if (isOrderingDirty) {
|
1634 | recomputePluginOrdering();
|
1635 | }
|
1636 | },
|
1637 |
|
1638 | /**
|
1639 | * Looks up the plugin for the supplied event.
|
1640 | *
|
1641 | * @param {object} event A synthetic event.
|
1642 | * @return {?object} The plugin that created the supplied event.
|
1643 | * @internal
|
1644 | */
|
1645 | getPluginModuleForEvent: function (event) {
|
1646 | var dispatchConfig = event.dispatchConfig;
|
1647 | if (dispatchConfig.registrationName) {
|
1648 | return EventPluginRegistry.registrationNameModules[dispatchConfig.registrationName] || null;
|
1649 | }
|
1650 | if (dispatchConfig.phasedRegistrationNames !== undefined) {
|
1651 | // pulling phasedRegistrationNames out of dispatchConfig helps Flow see
|
1652 | // that it is not undefined.
|
1653 | var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;
|
1654 |
|
1655 | for (var phase in phasedRegistrationNames) {
|
1656 | if (!phasedRegistrationNames.hasOwnProperty(phase)) {
|
1657 | continue;
|
1658 | }
|
1659 | var pluginModule = EventPluginRegistry.registrationNameModules[phasedRegistrationNames[phase]];
|
1660 | if (pluginModule) {
|
1661 | return pluginModule;
|
1662 | }
|
1663 | }
|
1664 | }
|
1665 | return null;
|
1666 | },
|
1667 |
|
1668 | /**
|
1669 | * Exposed for unit testing.
|
1670 | * @private
|
1671 | */
|
1672 | _resetEventPlugins: function () {
|
1673 | eventPluginOrder = null;
|
1674 | for (var pluginName in namesToPlugins) {
|
1675 | if (namesToPlugins.hasOwnProperty(pluginName)) {
|
1676 | delete namesToPlugins[pluginName];
|
1677 | }
|
1678 | }
|
1679 | EventPluginRegistry.plugins.length = 0;
|
1680 |
|
1681 | var eventNameDispatchConfigs = EventPluginRegistry.eventNameDispatchConfigs;
|
1682 | for (var eventName in eventNameDispatchConfigs) {
|
1683 | if (eventNameDispatchConfigs.hasOwnProperty(eventName)) {
|
1684 | delete eventNameDispatchConfigs[eventName];
|
1685 | }
|
1686 | }
|
1687 |
|
1688 | var registrationNameModules = EventPluginRegistry.registrationNameModules;
|
1689 | for (var registrationName in registrationNameModules) {
|
1690 | if (registrationNameModules.hasOwnProperty(registrationName)) {
|
1691 | delete registrationNameModules[registrationName];
|
1692 | }
|
1693 | }
|
1694 |
|
1695 |
|
1696 | }
|
1697 | };
|
1698 |
|
1699 | var EventPluginRegistry_1 = EventPluginRegistry;
|
1700 |
|
1701 | /**
|
1702 | * Copyright 2013-present, Facebook, Inc.
|
1703 | * All rights reserved.
|
1704 | *
|
1705 | * This source code is licensed under the BSD-style license found in the
|
1706 | * LICENSE file in the root directory of this source tree. An additional grant
|
1707 | * of patent rights can be found in the PATENTS file in the same directory.
|
1708 | *
|
1709 | *
|
1710 | */
|
1711 |
|
1712 | var caughtError = null;
|
1713 |
|
1714 | /**
|
1715 | * Call a function while guarding against errors that happens within it.
|
1716 | *
|
1717 | * @param {String} name of the guard to use for logging or debugging
|
1718 | * @param {Function} func The function to invoke
|
1719 | * @param {*} a First argument
|
1720 | * @param {*} b Second argument
|
1721 | */
|
1722 | function invokeGuardedCallback(name, func, a) {
|
1723 | try {
|
1724 | func(a);
|
1725 | } catch (x) {
|
1726 | if (caughtError === null) {
|
1727 | caughtError = x;
|
1728 | }
|
1729 | }
|
1730 | }
|
1731 |
|
1732 | var ReactErrorUtils = {
|
1733 | invokeGuardedCallback: invokeGuardedCallback,
|
1734 |
|
1735 | /**
|
1736 | * Invoked by ReactTestUtils.Simulate so that any errors thrown by the event
|
1737 | * handler are sure to be rethrown by rethrowCaughtError.
|
1738 | */
|
1739 | invokeGuardedCallbackWithCatch: invokeGuardedCallback,
|
1740 |
|
1741 | /**
|
1742 | * During execution of guarded functions we will capture the first error which
|
1743 | * we will rethrow to be handled by the top level error handler.
|
1744 | */
|
1745 | rethrowCaughtError: function () {
|
1746 | if (caughtError) {
|
1747 | var error = caughtError;
|
1748 | caughtError = null;
|
1749 | throw error;
|
1750 | }
|
1751 | }
|
1752 | };
|
1753 |
|
1754 | var ReactErrorUtils_1 = ReactErrorUtils;
|
1755 |
|
1756 | /**
|
1757 | * Copyright (c) 2013-present, Facebook, Inc.
|
1758 | * All rights reserved.
|
1759 | *
|
1760 | * This source code is licensed under the BSD-style license found in the
|
1761 | * LICENSE file in the root directory of this source tree. An additional grant
|
1762 | * of patent rights can be found in the PATENTS file in the same directory.
|
1763 | *
|
1764 | *
|
1765 | */
|
1766 |
|
1767 | function makeEmptyFunction(arg) {
|
1768 | return function () {
|
1769 | return arg;
|
1770 | };
|
1771 | }
|
1772 |
|
1773 | /**
|
1774 | * This function accepts and discards inputs; it has no side effects. This is
|
1775 | * primarily useful idiomatically for overridable function endpoints which
|
1776 | * always need to be callable, since JS lacks a null-call idiom ala Cocoa.
|
1777 | */
|
1778 | var emptyFunction = function emptyFunction() {};
|
1779 |
|
1780 | emptyFunction.thatReturns = makeEmptyFunction;
|
1781 | emptyFunction.thatReturnsFalse = makeEmptyFunction(false);
|
1782 | emptyFunction.thatReturnsTrue = makeEmptyFunction(true);
|
1783 | emptyFunction.thatReturnsNull = makeEmptyFunction(null);
|
1784 | emptyFunction.thatReturnsThis = function () {
|
1785 | return this;
|
1786 | };
|
1787 | emptyFunction.thatReturnsArgument = function (arg) {
|
1788 | return arg;
|
1789 | };
|
1790 |
|
1791 | var emptyFunction_1 = emptyFunction;
|
1792 |
|
1793 | /**
|
1794 | * Similar to invariant but only logs a warning if the condition is not met.
|
1795 | * This can be used to log issues in development environments in critical
|
1796 | * paths. Removing the logging code for production environments will keep the
|
1797 | * same logic and follow the same code paths.
|
1798 | */
|
1799 |
|
1800 | var warning = emptyFunction_1;
|
1801 |
|
1802 | var warning_1 = warning;
|
1803 |
|
1804 | /**
|
1805 | * Injected dependencies:
|
1806 | */
|
1807 |
|
1808 | /**
|
1809 | * - `ComponentTree`: [required] Module that can convert between React instances
|
1810 | * and actual node references.
|
1811 | */
|
1812 | var ComponentTree;
|
1813 | var TreeTraversal;
|
1814 | var injection = {
|
1815 | injectComponentTree: function (Injected) {
|
1816 | ComponentTree = Injected;
|
1817 |
|
1818 | },
|
1819 | injectTreeTraversal: function (Injected) {
|
1820 | TreeTraversal = Injected;
|
1821 |
|
1822 | }
|
1823 | };
|
1824 |
|
1825 | function isEndish(topLevelType) {
|
1826 | return topLevelType === 'topMouseUp' || topLevelType === 'topTouchEnd' || topLevelType === 'topTouchCancel';
|
1827 | }
|
1828 |
|
1829 | function isMoveish(topLevelType) {
|
1830 | return topLevelType === 'topMouseMove' || topLevelType === 'topTouchMove';
|
1831 | }
|
1832 | function isStartish(topLevelType) {
|
1833 | return topLevelType === 'topMouseDown' || topLevelType === 'topTouchStart';
|
1834 | }
|
1835 |
|
1836 | /**
|
1837 | * Dispatch the event to the listener.
|
1838 | * @param {SyntheticEvent} event SyntheticEvent to handle
|
1839 | * @param {boolean} simulated If the event is simulated (changes exn behavior)
|
1840 | * @param {function} listener Application-level callback
|
1841 | * @param {*} inst Internal component instance
|
1842 | */
|
1843 | function executeDispatch(event, simulated, listener, inst) {
|
1844 | var type = event.type || 'unknown-event';
|
1845 | event.currentTarget = EventPluginUtils.getNodeFromInstance(inst);
|
1846 | if (simulated) {
|
1847 | ReactErrorUtils_1.invokeGuardedCallbackWithCatch(type, listener, event);
|
1848 | } else {
|
1849 | ReactErrorUtils_1.invokeGuardedCallback(type, listener, event);
|
1850 | }
|
1851 | event.currentTarget = null;
|
1852 | }
|
1853 |
|
1854 | /**
|
1855 | * Standard/simple iteration through an event's collected dispatches.
|
1856 | */
|
1857 | function executeDispatchesInOrder(event, simulated) {
|
1858 | var dispatchListeners = event._dispatchListeners;
|
1859 | var dispatchInstances = event._dispatchInstances;
|
1860 | if (Array.isArray(dispatchListeners)) {
|
1861 | for (var i = 0; i < dispatchListeners.length; i++) {
|
1862 | if (event.isPropagationStopped()) {
|
1863 | break;
|
1864 | }
|
1865 | // Listeners and Instances are two parallel arrays that are always in sync.
|
1866 | executeDispatch(event, simulated, dispatchListeners[i], dispatchInstances[i]);
|
1867 | }
|
1868 | } else if (dispatchListeners) {
|
1869 | executeDispatch(event, simulated, dispatchListeners, dispatchInstances);
|
1870 | }
|
1871 | event._dispatchListeners = null;
|
1872 | event._dispatchInstances = null;
|
1873 | }
|
1874 |
|
1875 | /**
|
1876 | * Standard/simple iteration through an event's collected dispatches, but stops
|
1877 | * at the first dispatch execution returning true, and returns that id.
|
1878 | *
|
1879 | * @return {?string} id of the first dispatch execution who's listener returns
|
1880 | * true, or null if no listener returned true.
|
1881 | */
|
1882 | function executeDispatchesInOrderStopAtTrueImpl(event) {
|
1883 | var dispatchListeners = event._dispatchListeners;
|
1884 | var dispatchInstances = event._dispatchInstances;
|
1885 | if (Array.isArray(dispatchListeners)) {
|
1886 | for (var i = 0; i < dispatchListeners.length; i++) {
|
1887 | if (event.isPropagationStopped()) {
|
1888 | break;
|
1889 | }
|
1890 | // Listeners and Instances are two parallel arrays that are always in sync.
|
1891 | if (dispatchListeners[i](event, dispatchInstances[i])) {
|
1892 | return dispatchInstances[i];
|
1893 | }
|
1894 | }
|
1895 | } else if (dispatchListeners) {
|
1896 | if (dispatchListeners(event, dispatchInstances)) {
|
1897 | return dispatchInstances;
|
1898 | }
|
1899 | }
|
1900 | return null;
|
1901 | }
|
1902 |
|
1903 | /**
|
1904 | * @see executeDispatchesInOrderStopAtTrueImpl
|
1905 | */
|
1906 | function executeDispatchesInOrderStopAtTrue(event) {
|
1907 | var ret = executeDispatchesInOrderStopAtTrueImpl(event);
|
1908 | event._dispatchInstances = null;
|
1909 | event._dispatchListeners = null;
|
1910 | return ret;
|
1911 | }
|
1912 |
|
1913 | /**
|
1914 | * Execution of a "direct" dispatch - there must be at most one dispatch
|
1915 | * accumulated on the event or it is considered an error. It doesn't really make
|
1916 | * sense for an event with multiple dispatches (bubbled) to keep track of the
|
1917 | * return values at each dispatch execution, but it does tend to make sense when
|
1918 | * dealing with "direct" dispatches.
|
1919 | *
|
1920 | * @return {*} The return value of executing the single dispatch.
|
1921 | */
|
1922 | function executeDirectDispatch(event) {
|
1923 | var dispatchListener = event._dispatchListeners;
|
1924 | var dispatchInstance = event._dispatchInstances;
|
1925 | !!Array.isArray(dispatchListener) ? reactProdInvariant_1('103') : void 0;
|
1926 | event.currentTarget = dispatchListener ? EventPluginUtils.getNodeFromInstance(dispatchInstance) : null;
|
1927 | var res = dispatchListener ? dispatchListener(event) : null;
|
1928 | event.currentTarget = null;
|
1929 | event._dispatchListeners = null;
|
1930 | event._dispatchInstances = null;
|
1931 | return res;
|
1932 | }
|
1933 |
|
1934 | /**
|
1935 | * @param {SyntheticEvent} event
|
1936 | * @return {boolean} True iff number of dispatches accumulated is greater than 0.
|
1937 | */
|
1938 | function hasDispatches(event) {
|
1939 | return !!event._dispatchListeners;
|
1940 | }
|
1941 |
|
1942 | /**
|
1943 | * General utilities that are useful in creating custom Event Plugins.
|
1944 | */
|
1945 | var EventPluginUtils = {
|
1946 | isEndish: isEndish,
|
1947 | isMoveish: isMoveish,
|
1948 | isStartish: isStartish,
|
1949 |
|
1950 | executeDirectDispatch: executeDirectDispatch,
|
1951 | executeDispatchesInOrder: executeDispatchesInOrder,
|
1952 | executeDispatchesInOrderStopAtTrue: executeDispatchesInOrderStopAtTrue,
|
1953 | hasDispatches: hasDispatches,
|
1954 |
|
1955 | getInstanceFromNode: function (node) {
|
1956 | return ComponentTree.getInstanceFromNode(node);
|
1957 | },
|
1958 | getNodeFromInstance: function (node) {
|
1959 | return ComponentTree.getNodeFromInstance(node);
|
1960 | },
|
1961 | isAncestor: function (a, b) {
|
1962 | return TreeTraversal.isAncestor(a, b);
|
1963 | },
|
1964 | getLowestCommonAncestor: function (a, b) {
|
1965 | return TreeTraversal.getLowestCommonAncestor(a, b);
|
1966 | },
|
1967 | getParentInstance: function (inst) {
|
1968 | return TreeTraversal.getParentInstance(inst);
|
1969 | },
|
1970 | traverseTwoPhase: function (target, fn, arg) {
|
1971 | return TreeTraversal.traverseTwoPhase(target, fn, arg);
|
1972 | },
|
1973 | traverseEnterLeave: function (from, to, fn, argFrom, argTo) {
|
1974 | return TreeTraversal.traverseEnterLeave(from, to, fn, argFrom, argTo);
|
1975 | },
|
1976 |
|
1977 | injection: injection
|
1978 | };
|
1979 |
|
1980 | var EventPluginUtils_1 = EventPluginUtils;
|
1981 |
|
1982 | /**
|
1983 | * Accumulates items that must not be null or undefined into the first one. This
|
1984 | * is used to conserve memory by avoiding array allocations, and thus sacrifices
|
1985 | * API cleanness. Since `current` can be null before being passed in and not
|
1986 | * null after this function, make sure to assign it back to `current`:
|
1987 | *
|
1988 | * `a = accumulateInto(a, b);`
|
1989 | *
|
1990 | * This API should be sparingly used. Try `accumulate` for something cleaner.
|
1991 | *
|
1992 | * @return {*|array<*>} An accumulation of items.
|
1993 | */
|
1994 |
|
1995 | function accumulateInto(current, next) {
|
1996 | !(next != null) ? reactProdInvariant_1('30') : void 0;
|
1997 |
|
1998 | if (current == null) {
|
1999 | return next;
|
2000 | }
|
2001 |
|
2002 | // Both are not empty. Warning: Never call x.concat(y) when you are not
|
2003 | // certain that x is an Array (x could be a string with concat method).
|
2004 | if (Array.isArray(current)) {
|
2005 | if (Array.isArray(next)) {
|
2006 | current.push.apply(current, next);
|
2007 | return current;
|
2008 | }
|
2009 | current.push(next);
|
2010 | return current;
|
2011 | }
|
2012 |
|
2013 | if (Array.isArray(next)) {
|
2014 | // A bit too dangerous to mutate `next`.
|
2015 | return [current].concat(next);
|
2016 | }
|
2017 |
|
2018 | return [current, next];
|
2019 | }
|
2020 |
|
2021 | var accumulateInto_1 = accumulateInto;
|
2022 |
|
2023 | /**
|
2024 | * Copyright 2013-present, Facebook, Inc.
|
2025 | * All rights reserved.
|
2026 | *
|
2027 | * This source code is licensed under the BSD-style license found in the
|
2028 | * LICENSE file in the root directory of this source tree. An additional grant
|
2029 | * of patent rights can be found in the PATENTS file in the same directory.
|
2030 | *
|
2031 | *
|
2032 | */
|
2033 |
|
2034 | /**
|
2035 | * @param {array} arr an "accumulation" of items which is either an Array or
|
2036 | * a single item. Useful when paired with the `accumulate` module. This is a
|
2037 | * simple utility that allows us to reason about a collection of items, but
|
2038 | * handling the case when there is exactly one item (and we do not need to
|
2039 | * allocate an array).
|
2040 | */
|
2041 |
|
2042 | function forEachAccumulated(arr, cb, scope) {
|
2043 | if (Array.isArray(arr)) {
|
2044 | arr.forEach(cb, scope);
|
2045 | } else if (arr) {
|
2046 | cb.call(scope, arr);
|
2047 | }
|
2048 | }
|
2049 |
|
2050 | var forEachAccumulated_1 = forEachAccumulated;
|
2051 |
|
2052 | /**
|
2053 | * Internal store for event listeners
|
2054 | */
|
2055 | var listenerBank = {};
|
2056 |
|
2057 | /**
|
2058 | * Internal queue of events that have accumulated their dispatches and are
|
2059 | * waiting to have their dispatches executed.
|
2060 | */
|
2061 | var eventQueue = null;
|
2062 |
|
2063 | /**
|
2064 | * Dispatches an event and releases it back into the pool, unless persistent.
|
2065 | *
|
2066 | * @param {?object} event Synthetic event to be dispatched.
|
2067 | * @param {boolean} simulated If the event is simulated (changes exn behavior)
|
2068 | * @private
|
2069 | */
|
2070 | var executeDispatchesAndRelease = function (event, simulated) {
|
2071 | if (event) {
|
2072 | EventPluginUtils_1.executeDispatchesInOrder(event, simulated);
|
2073 |
|
2074 | if (!event.isPersistent()) {
|
2075 | event.constructor.release(event);
|
2076 | }
|
2077 | }
|
2078 | };
|
2079 | var executeDispatchesAndReleaseSimulated = function (e) {
|
2080 | return executeDispatchesAndRelease(e, true);
|
2081 | };
|
2082 | var executeDispatchesAndReleaseTopLevel = function (e) {
|
2083 | return executeDispatchesAndRelease(e, false);
|
2084 | };
|
2085 |
|
2086 | var getDictionaryKey = function (inst) {
|
2087 | // Prevents V8 performance issue:
|
2088 | // https://github.com/facebook/react/pull/7232
|
2089 | return '.' + inst._rootNodeID;
|
2090 | };
|
2091 |
|
2092 | function isInteractive(tag) {
|
2093 | return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea';
|
2094 | }
|
2095 |
|
2096 | function shouldPreventMouseEvent(name, type, props) {
|
2097 | switch (name) {
|
2098 | case 'onClick':
|
2099 | case 'onClickCapture':
|
2100 | case 'onDoubleClick':
|
2101 | case 'onDoubleClickCapture':
|
2102 | case 'onMouseDown':
|
2103 | case 'onMouseDownCapture':
|
2104 | case 'onMouseMove':
|
2105 | case 'onMouseMoveCapture':
|
2106 | case 'onMouseUp':
|
2107 | case 'onMouseUpCapture':
|
2108 | return !!(props.disabled && isInteractive(type));
|
2109 | default:
|
2110 | return false;
|
2111 | }
|
2112 | }
|
2113 |
|
2114 | /**
|
2115 | * This is a unified interface for event plugins to be installed and configured.
|
2116 | *
|
2117 | * Event plugins can implement the following properties:
|
2118 | *
|
2119 | * `extractEvents` {function(string, DOMEventTarget, string, object): *}
|
2120 | * Required. When a top-level event is fired, this method is expected to
|
2121 | * extract synthetic events that will in turn be queued and dispatched.
|
2122 | *
|
2123 | * `eventTypes` {object}
|
2124 | * Optional, plugins that fire events must publish a mapping of registration
|
2125 | * names that are used to register listeners. Values of this mapping must
|
2126 | * be objects that contain `registrationName` or `phasedRegistrationNames`.
|
2127 | *
|
2128 | * `executeDispatch` {function(object, function, string)}
|
2129 | * Optional, allows plugins to override how an event gets dispatched. By
|
2130 | * default, the listener is simply invoked.
|
2131 | *
|
2132 | * Each plugin that is injected into `EventsPluginHub` is immediately operable.
|
2133 | *
|
2134 | * @public
|
2135 | */
|
2136 | var EventPluginHub = {
|
2137 | /**
|
2138 | * Methods for injecting dependencies.
|
2139 | */
|
2140 | injection: {
|
2141 | /**
|
2142 | * @param {array} InjectedEventPluginOrder
|
2143 | * @public
|
2144 | */
|
2145 | injectEventPluginOrder: EventPluginRegistry_1.injectEventPluginOrder,
|
2146 |
|
2147 | /**
|
2148 | * @param {object} injectedNamesToPlugins Map from names to plugin modules.
|
2149 | */
|
2150 | injectEventPluginsByName: EventPluginRegistry_1.injectEventPluginsByName
|
2151 | },
|
2152 |
|
2153 | /**
|
2154 | * Stores `listener` at `listenerBank[registrationName][key]`. Is idempotent.
|
2155 | *
|
2156 | * @param {object} inst The instance, which is the source of events.
|
2157 | * @param {string} registrationName Name of listener (e.g. `onClick`).
|
2158 | * @param {function} listener The callback to store.
|
2159 | */
|
2160 | putListener: function (inst, registrationName, listener) {
|
2161 | !(typeof listener === 'function') ? reactProdInvariant_1('94', registrationName, typeof listener) : void 0;
|
2162 |
|
2163 | var key = getDictionaryKey(inst);
|
2164 | var bankForRegistrationName = listenerBank[registrationName] || (listenerBank[registrationName] = {});
|
2165 | bankForRegistrationName[key] = listener;
|
2166 |
|
2167 | var PluginModule = EventPluginRegistry_1.registrationNameModules[registrationName];
|
2168 | if (PluginModule && PluginModule.didPutListener) {
|
2169 | PluginModule.didPutListener(inst, registrationName, listener);
|
2170 | }
|
2171 | },
|
2172 |
|
2173 | /**
|
2174 | * @param {object} inst The instance, which is the source of events.
|
2175 | * @param {string} registrationName Name of listener (e.g. `onClick`).
|
2176 | * @return {?function} The stored callback.
|
2177 | */
|
2178 | getListener: function (inst, registrationName) {
|
2179 | // TODO: shouldPreventMouseEvent is DOM-specific and definitely should not
|
2180 | // live here; needs to be moved to a better place soon
|
2181 | var bankForRegistrationName = listenerBank[registrationName];
|
2182 | if (shouldPreventMouseEvent(registrationName, inst._currentElement.type, inst._currentElement.props)) {
|
2183 | return null;
|
2184 | }
|
2185 | var key = getDictionaryKey(inst);
|
2186 | return bankForRegistrationName && bankForRegistrationName[key];
|
2187 | },
|
2188 |
|
2189 | /**
|
2190 | * Deletes a listener from the registration bank.
|
2191 | *
|
2192 | * @param {object} inst The instance, which is the source of events.
|
2193 | * @param {string} registrationName Name of listener (e.g. `onClick`).
|
2194 | */
|
2195 | deleteListener: function (inst, registrationName) {
|
2196 | var PluginModule = EventPluginRegistry_1.registrationNameModules[registrationName];
|
2197 | if (PluginModule && PluginModule.willDeleteListener) {
|
2198 | PluginModule.willDeleteListener(inst, registrationName);
|
2199 | }
|
2200 |
|
2201 | var bankForRegistrationName = listenerBank[registrationName];
|
2202 | // TODO: This should never be null -- when is it?
|
2203 | if (bankForRegistrationName) {
|
2204 | var key = getDictionaryKey(inst);
|
2205 | delete bankForRegistrationName[key];
|
2206 | }
|
2207 | },
|
2208 |
|
2209 | /**
|
2210 | * Deletes all listeners for the DOM element with the supplied ID.
|
2211 | *
|
2212 | * @param {object} inst The instance, which is the source of events.
|
2213 | */
|
2214 | deleteAllListeners: function (inst) {
|
2215 | var key = getDictionaryKey(inst);
|
2216 | for (var registrationName in listenerBank) {
|
2217 | if (!listenerBank.hasOwnProperty(registrationName)) {
|
2218 | continue;
|
2219 | }
|
2220 |
|
2221 | if (!listenerBank[registrationName][key]) {
|
2222 | continue;
|
2223 | }
|
2224 |
|
2225 | var PluginModule = EventPluginRegistry_1.registrationNameModules[registrationName];
|
2226 | if (PluginModule && PluginModule.willDeleteListener) {
|
2227 | PluginModule.willDeleteListener(inst, registrationName);
|
2228 | }
|
2229 |
|
2230 | delete listenerBank[registrationName][key];
|
2231 | }
|
2232 | },
|
2233 |
|
2234 | /**
|
2235 | * Allows registered plugins an opportunity to extract events from top-level
|
2236 | * native browser events.
|
2237 | *
|
2238 | * @return {*} An accumulation of synthetic events.
|
2239 | * @internal
|
2240 | */
|
2241 | extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {
|
2242 | var events;
|
2243 | var plugins = EventPluginRegistry_1.plugins;
|
2244 | for (var i = 0; i < plugins.length; i++) {
|
2245 | // Not every plugin in the ordering may be loaded at runtime.
|
2246 | var possiblePlugin = plugins[i];
|
2247 | if (possiblePlugin) {
|
2248 | var extractedEvents = possiblePlugin.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget);
|
2249 | if (extractedEvents) {
|
2250 | events = accumulateInto_1(events, extractedEvents);
|
2251 | }
|
2252 | }
|
2253 | }
|
2254 | return events;
|
2255 | },
|
2256 |
|
2257 | /**
|
2258 | * Enqueues a synthetic event that should be dispatched when
|
2259 | * `processEventQueue` is invoked.
|
2260 | *
|
2261 | * @param {*} events An accumulation of synthetic events.
|
2262 | * @internal
|
2263 | */
|
2264 | enqueueEvents: function (events) {
|
2265 | if (events) {
|
2266 | eventQueue = accumulateInto_1(eventQueue, events);
|
2267 | }
|
2268 | },
|
2269 |
|
2270 | /**
|
2271 | * Dispatches all synthetic events on the event queue.
|
2272 | *
|
2273 | * @internal
|
2274 | */
|
2275 | processEventQueue: function (simulated) {
|
2276 | // Set `eventQueue` to null before processing it so that we can tell if more
|
2277 | // events get enqueued while processing.
|
2278 | var processingEventQueue = eventQueue;
|
2279 | eventQueue = null;
|
2280 | if (simulated) {
|
2281 | forEachAccumulated_1(processingEventQueue, executeDispatchesAndReleaseSimulated);
|
2282 | } else {
|
2283 | forEachAccumulated_1(processingEventQueue, executeDispatchesAndReleaseTopLevel);
|
2284 | }
|
2285 | !!eventQueue ? reactProdInvariant_1('95') : void 0;
|
2286 | // This would be a good time to rethrow if any of the event handlers threw.
|
2287 | ReactErrorUtils_1.rethrowCaughtError();
|
2288 | },
|
2289 |
|
2290 | /**
|
2291 | * These are needed for tests only. Do not use!
|
2292 | */
|
2293 | __purge: function () {
|
2294 | listenerBank = {};
|
2295 | },
|
2296 |
|
2297 | __getListenerBank: function () {
|
2298 | return listenerBank;
|
2299 | }
|
2300 | };
|
2301 |
|
2302 | var EventPluginHub_1 = EventPluginHub;
|
2303 |
|
2304 | var getListener = EventPluginHub_1.getListener;
|
2305 |
|
2306 | /**
|
2307 | * Some event types have a notion of different registration names for different
|
2308 | * "phases" of propagation. This finds listeners by a given phase.
|
2309 | */
|
2310 | function listenerAtPhase(inst, event, propagationPhase) {
|
2311 | var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase];
|
2312 | return getListener(inst, registrationName);
|
2313 | }
|
2314 |
|
2315 | /**
|
2316 | * Tags a `SyntheticEvent` with dispatched listeners. Creating this function
|
2317 | * here, allows us to not have to bind or create functions for each event.
|
2318 | * Mutating the event's members allows us to not have to create a wrapping
|
2319 | * "dispatch" object that pairs the event with the listener.
|
2320 | */
|
2321 | function accumulateDirectionalDispatches(inst, phase, event) {
|
2322 | var listener = listenerAtPhase(inst, event, phase);
|
2323 | if (listener) {
|
2324 | event._dispatchListeners = accumulateInto_1(event._dispatchListeners, listener);
|
2325 | event._dispatchInstances = accumulateInto_1(event._dispatchInstances, inst);
|
2326 | }
|
2327 | }
|
2328 |
|
2329 | /**
|
2330 | * Collect dispatches (must be entirely collected before dispatching - see unit
|
2331 | * tests). Lazily allocate the array to conserve memory. We must loop through
|
2332 | * each event and perform the traversal for each one. We cannot perform a
|
2333 | * single traversal for the entire collection of events because each event may
|
2334 | * have a different target.
|
2335 | */
|
2336 | function accumulateTwoPhaseDispatchesSingle(event) {
|
2337 | if (event && event.dispatchConfig.phasedRegistrationNames) {
|
2338 | EventPluginUtils_1.traverseTwoPhase(event._targetInst, accumulateDirectionalDispatches, event);
|
2339 | }
|
2340 | }
|
2341 |
|
2342 | /**
|
2343 | * Same as `accumulateTwoPhaseDispatchesSingle`, but skips over the targetID.
|
2344 | */
|
2345 | function accumulateTwoPhaseDispatchesSingleSkipTarget(event) {
|
2346 | if (event && event.dispatchConfig.phasedRegistrationNames) {
|
2347 | var targetInst = event._targetInst;
|
2348 | var parentInst = targetInst ? EventPluginUtils_1.getParentInstance(targetInst) : null;
|
2349 | EventPluginUtils_1.traverseTwoPhase(parentInst, accumulateDirectionalDispatches, event);
|
2350 | }
|
2351 | }
|
2352 |
|
2353 | /**
|
2354 | * Accumulates without regard to direction, does not look for phased
|
2355 | * registration names. Same as `accumulateDirectDispatchesSingle` but without
|
2356 | * requiring that the `dispatchMarker` be the same as the dispatched ID.
|
2357 | */
|
2358 | function accumulateDispatches(inst, ignoredDirection, event) {
|
2359 | if (event && event.dispatchConfig.registrationName) {
|
2360 | var registrationName = event.dispatchConfig.registrationName;
|
2361 | var listener = getListener(inst, registrationName);
|
2362 | if (listener) {
|
2363 | event._dispatchListeners = accumulateInto_1(event._dispatchListeners, listener);
|
2364 | event._dispatchInstances = accumulateInto_1(event._dispatchInstances, inst);
|
2365 | }
|
2366 | }
|
2367 | }
|
2368 |
|
2369 | /**
|
2370 | * Accumulates dispatches on an `SyntheticEvent`, but only for the
|
2371 | * `dispatchMarker`.
|
2372 | * @param {SyntheticEvent} event
|
2373 | */
|
2374 | function accumulateDirectDispatchesSingle(event) {
|
2375 | if (event && event.dispatchConfig.registrationName) {
|
2376 | accumulateDispatches(event._targetInst, null, event);
|
2377 | }
|
2378 | }
|
2379 |
|
2380 | function accumulateTwoPhaseDispatches(events) {
|
2381 | forEachAccumulated_1(events, accumulateTwoPhaseDispatchesSingle);
|
2382 | }
|
2383 |
|
2384 | function accumulateTwoPhaseDispatchesSkipTarget(events) {
|
2385 | forEachAccumulated_1(events, accumulateTwoPhaseDispatchesSingleSkipTarget);
|
2386 | }
|
2387 |
|
2388 | function accumulateEnterLeaveDispatches(leave, enter, from, to) {
|
2389 | EventPluginUtils_1.traverseEnterLeave(from, to, accumulateDispatches, leave, enter);
|
2390 | }
|
2391 |
|
2392 | function accumulateDirectDispatches(events) {
|
2393 | forEachAccumulated_1(events, accumulateDirectDispatchesSingle);
|
2394 | }
|
2395 |
|
2396 | /**
|
2397 | * A small set of propagation patterns, each of which will accept a small amount
|
2398 | * of information, and generate a set of "dispatch ready event objects" - which
|
2399 | * are sets of events that have already been annotated with a set of dispatched
|
2400 | * listener functions/ids. The API is designed this way to discourage these
|
2401 | * propagation strategies from actually executing the dispatches, since we
|
2402 | * always want to collect the entire set of dispatches before executing event a
|
2403 | * single one.
|
2404 | *
|
2405 | * @constructor EventPropagators
|
2406 | */
|
2407 | var EventPropagators = {
|
2408 | accumulateTwoPhaseDispatches: accumulateTwoPhaseDispatches,
|
2409 | accumulateTwoPhaseDispatchesSkipTarget: accumulateTwoPhaseDispatchesSkipTarget,
|
2410 | accumulateDirectDispatches: accumulateDirectDispatches,
|
2411 | accumulateEnterLeaveDispatches: accumulateEnterLeaveDispatches
|
2412 | };
|
2413 |
|
2414 | var EventPropagators_1 = EventPropagators;
|
2415 |
|
2416 | /**
|
2417 | * Copyright (c) 2013-present, Facebook, Inc.
|
2418 | * All rights reserved.
|
2419 | *
|
2420 | * This source code is licensed under the BSD-style license found in the
|
2421 | * LICENSE file in the root directory of this source tree. An additional grant
|
2422 | * of patent rights can be found in the PATENTS file in the same directory.
|
2423 | *
|
2424 | */
|
2425 |
|
2426 | var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);
|
2427 |
|
2428 | /**
|
2429 | * Simple, lightweight module assisting with the detection and context of
|
2430 | * Worker. Helps avoid circular dependencies and allows code to reason about
|
2431 | * whether or not they are in a Worker, even if they never include the main
|
2432 | * `ReactWorker` dependency.
|
2433 | */
|
2434 | var ExecutionEnvironment$1 = {
|
2435 |
|
2436 | canUseDOM: canUseDOM,
|
2437 |
|
2438 | canUseWorkers: typeof Worker !== 'undefined',
|
2439 |
|
2440 | canUseEventListeners: canUseDOM && !!(window.addEventListener || window.attachEvent),
|
2441 |
|
2442 | canUseViewport: canUseDOM && !!window.screen,
|
2443 |
|
2444 | isInWorker: !canUseDOM // For now, this is true - might change in the future.
|
2445 |
|
2446 | };
|
2447 |
|
2448 | var ExecutionEnvironment_1 = ExecutionEnvironment$1;
|
2449 |
|
2450 | /*
|
2451 | object-assign
|
2452 | (c) Sindre Sorhus
|
2453 | @license MIT
|
2454 | */
|
2455 |
|
2456 | /* eslint-disable no-unused-vars */
|
2457 | var getOwnPropertySymbols = Object.getOwnPropertySymbols;
|
2458 | var hasOwnProperty = Object.prototype.hasOwnProperty;
|
2459 | var propIsEnumerable = Object.prototype.propertyIsEnumerable;
|
2460 |
|
2461 | function toObject(val) {
|
2462 | if (val === null || val === undefined) {
|
2463 | throw new TypeError('Object.assign cannot be called with null or undefined');
|
2464 | }
|
2465 |
|
2466 | return Object(val);
|
2467 | }
|
2468 |
|
2469 | function shouldUseNative() {
|
2470 | try {
|
2471 | if (!Object.assign) {
|
2472 | return false;
|
2473 | }
|
2474 |
|
2475 | // Detect buggy property enumeration order in older V8 versions.
|
2476 |
|
2477 | // https://bugs.chromium.org/p/v8/issues/detail?id=4118
|
2478 | var test1 = new String('abc'); // eslint-disable-line no-new-wrappers
|
2479 | test1[5] = 'de';
|
2480 | if (Object.getOwnPropertyNames(test1)[0] === '5') {
|
2481 | return false;
|
2482 | }
|
2483 |
|
2484 | // https://bugs.chromium.org/p/v8/issues/detail?id=3056
|
2485 | var test2 = {};
|
2486 | for (var i = 0; i < 10; i++) {
|
2487 | test2['_' + String.fromCharCode(i)] = i;
|
2488 | }
|
2489 | var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
|
2490 | return test2[n];
|
2491 | });
|
2492 | if (order2.join('') !== '0123456789') {
|
2493 | return false;
|
2494 | }
|
2495 |
|
2496 | // https://bugs.chromium.org/p/v8/issues/detail?id=3056
|
2497 | var test3 = {};
|
2498 | 'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
|
2499 | test3[letter] = letter;
|
2500 | });
|
2501 | if (Object.keys(Object.assign({}, test3)).join('') !==
|
2502 | 'abcdefghijklmnopqrst') {
|
2503 | return false;
|
2504 | }
|
2505 |
|
2506 | return true;
|
2507 | } catch (err) {
|
2508 | // We don't expect any of the above to throw, but better to be safe.
|
2509 | return false;
|
2510 | }
|
2511 | }
|
2512 |
|
2513 | var objectAssign = shouldUseNative() ? Object.assign : function (target, source) {
|
2514 | var from;
|
2515 | var to = toObject(target);
|
2516 | var symbols;
|
2517 |
|
2518 | for (var s = 1; s < arguments.length; s++) {
|
2519 | from = Object(arguments[s]);
|
2520 |
|
2521 | for (var key in from) {
|
2522 | if (hasOwnProperty.call(from, key)) {
|
2523 | to[key] = from[key];
|
2524 | }
|
2525 | }
|
2526 |
|
2527 | if (getOwnPropertySymbols) {
|
2528 | symbols = getOwnPropertySymbols(from);
|
2529 | for (var i = 0; i < symbols.length; i++) {
|
2530 | if (propIsEnumerable.call(from, symbols[i])) {
|
2531 | to[symbols[i]] = from[symbols[i]];
|
2532 | }
|
2533 | }
|
2534 | }
|
2535 | }
|
2536 |
|
2537 | return to;
|
2538 | };
|
2539 |
|
2540 | /**
|
2541 | * Static poolers. Several custom versions for each potential number of
|
2542 | * arguments. A completely generic pooler is easy to implement, but would
|
2543 | * require accessing the `arguments` object. In each of these, `this` refers to
|
2544 | * the Class itself, not an instance. If any others are needed, simply add them
|
2545 | * here, or in their own files.
|
2546 | */
|
2547 | var oneArgumentPooler = function (copyFieldsFrom) {
|
2548 | var Klass = this;
|
2549 | if (Klass.instancePool.length) {
|
2550 | var instance = Klass.instancePool.pop();
|
2551 | Klass.call(instance, copyFieldsFrom);
|
2552 | return instance;
|
2553 | } else {
|
2554 | return new Klass(copyFieldsFrom);
|
2555 | }
|
2556 | };
|
2557 |
|
2558 | var twoArgumentPooler = function (a1, a2) {
|
2559 | var Klass = this;
|
2560 | if (Klass.instancePool.length) {
|
2561 | var instance = Klass.instancePool.pop();
|
2562 | Klass.call(instance, a1, a2);
|
2563 | return instance;
|
2564 | } else {
|
2565 | return new Klass(a1, a2);
|
2566 | }
|
2567 | };
|
2568 |
|
2569 | var threeArgumentPooler = function (a1, a2, a3) {
|
2570 | var Klass = this;
|
2571 | if (Klass.instancePool.length) {
|
2572 | var instance = Klass.instancePool.pop();
|
2573 | Klass.call(instance, a1, a2, a3);
|
2574 | return instance;
|
2575 | } else {
|
2576 | return new Klass(a1, a2, a3);
|
2577 | }
|
2578 | };
|
2579 |
|
2580 | var fourArgumentPooler = function (a1, a2, a3, a4) {
|
2581 | var Klass = this;
|
2582 | if (Klass.instancePool.length) {
|
2583 | var instance = Klass.instancePool.pop();
|
2584 | Klass.call(instance, a1, a2, a3, a4);
|
2585 | return instance;
|
2586 | } else {
|
2587 | return new Klass(a1, a2, a3, a4);
|
2588 | }
|
2589 | };
|
2590 |
|
2591 | var standardReleaser = function (instance) {
|
2592 | var Klass = this;
|
2593 | !(instance instanceof Klass) ? reactProdInvariant_1('25') : void 0;
|
2594 | instance.destructor();
|
2595 | if (Klass.instancePool.length < Klass.poolSize) {
|
2596 | Klass.instancePool.push(instance);
|
2597 | }
|
2598 | };
|
2599 |
|
2600 | var DEFAULT_POOL_SIZE = 10;
|
2601 | var DEFAULT_POOLER = oneArgumentPooler;
|
2602 |
|
2603 | /**
|
2604 | * Augments `CopyConstructor` to be a poolable class, augmenting only the class
|
2605 | * itself (statically) not adding any prototypical fields. Any CopyConstructor
|
2606 | * you give this may have a `poolSize` property, and will look for a
|
2607 | * prototypical `destructor` on instances.
|
2608 | *
|
2609 | * @param {Function} CopyConstructor Constructor that can be used to reset.
|
2610 | * @param {Function} pooler Customizable pooler.
|
2611 | */
|
2612 | var addPoolingTo = function (CopyConstructor, pooler) {
|
2613 | // Casting as any so that flow ignores the actual implementation and trusts
|
2614 | // it to match the type we declared
|
2615 | var NewKlass = CopyConstructor;
|
2616 | NewKlass.instancePool = [];
|
2617 | NewKlass.getPooled = pooler || DEFAULT_POOLER;
|
2618 | if (!NewKlass.poolSize) {
|
2619 | NewKlass.poolSize = DEFAULT_POOL_SIZE;
|
2620 | }
|
2621 | NewKlass.release = standardReleaser;
|
2622 | return NewKlass;
|
2623 | };
|
2624 |
|
2625 | var PooledClass = {
|
2626 | addPoolingTo: addPoolingTo,
|
2627 | oneArgumentPooler: oneArgumentPooler,
|
2628 | twoArgumentPooler: twoArgumentPooler,
|
2629 | threeArgumentPooler: threeArgumentPooler,
|
2630 | fourArgumentPooler: fourArgumentPooler
|
2631 | };
|
2632 |
|
2633 | var PooledClass_1 = PooledClass;
|
2634 |
|
2635 | var contentKey = null;
|
2636 |
|
2637 | /**
|
2638 | * Gets the key used to access text content on a DOM node.
|
2639 | *
|
2640 | * @return {?string} Key used to access text content.
|
2641 | * @internal
|
2642 | */
|
2643 | function getTextContentAccessor() {
|
2644 | if (!contentKey && ExecutionEnvironment_1.canUseDOM) {
|
2645 | // Prefer textContent to innerText because many browsers support both but
|
2646 | // SVG <text> elements don't support innerText even when <div> does.
|
2647 | contentKey = 'textContent' in document.documentElement ? 'textContent' : 'innerText';
|
2648 | }
|
2649 | return contentKey;
|
2650 | }
|
2651 |
|
2652 | var getTextContentAccessor_1 = getTextContentAccessor;
|
2653 |
|
2654 | /**
|
2655 | * This helper class stores information about text content of a target node,
|
2656 | * allowing comparison of content before and after a given event.
|
2657 | *
|
2658 | * Identify the node where selection currently begins, then observe
|
2659 | * both its text content and its current position in the DOM. Since the
|
2660 | * browser may natively replace the target node during composition, we can
|
2661 | * use its position to find its replacement.
|
2662 | *
|
2663 | * @param {DOMEventTarget} root
|
2664 | */
|
2665 | function FallbackCompositionState(root) {
|
2666 | this._root = root;
|
2667 | this._startText = this.getText();
|
2668 | this._fallbackText = null;
|
2669 | }
|
2670 |
|
2671 | objectAssign(FallbackCompositionState.prototype, {
|
2672 | destructor: function () {
|
2673 | this._root = null;
|
2674 | this._startText = null;
|
2675 | this._fallbackText = null;
|
2676 | },
|
2677 |
|
2678 | /**
|
2679 | * Get current text of input.
|
2680 | *
|
2681 | * @return {string}
|
2682 | */
|
2683 | getText: function () {
|
2684 | if ('value' in this._root) {
|
2685 | return this._root.value;
|
2686 | }
|
2687 | return this._root[getTextContentAccessor_1()];
|
2688 | },
|
2689 |
|
2690 | /**
|
2691 | * Determine the differing substring between the initially stored
|
2692 | * text content and the current content.
|
2693 | *
|
2694 | * @return {string}
|
2695 | */
|
2696 | getData: function () {
|
2697 | if (this._fallbackText) {
|
2698 | return this._fallbackText;
|
2699 | }
|
2700 |
|
2701 | var start;
|
2702 | var startValue = this._startText;
|
2703 | var startLength = startValue.length;
|
2704 | var end;
|
2705 | var endValue = this.getText();
|
2706 | var endLength = endValue.length;
|
2707 |
|
2708 | for (start = 0; start < startLength; start++) {
|
2709 | if (startValue[start] !== endValue[start]) {
|
2710 | break;
|
2711 | }
|
2712 | }
|
2713 |
|
2714 | var minEnd = startLength - start;
|
2715 | for (end = 1; end <= minEnd; end++) {
|
2716 | if (startValue[startLength - end] !== endValue[endLength - end]) {
|
2717 | break;
|
2718 | }
|
2719 | }
|
2720 |
|
2721 | var sliceTail = end > 1 ? 1 - end : undefined;
|
2722 | this._fallbackText = endValue.slice(start, sliceTail);
|
2723 | return this._fallbackText;
|
2724 | }
|
2725 | });
|
2726 |
|
2727 | PooledClass_1.addPoolingTo(FallbackCompositionState);
|
2728 |
|
2729 | var FallbackCompositionState_1 = FallbackCompositionState;
|
2730 |
|
2731 | var shouldBeReleasedProperties = ['dispatchConfig', '_targetInst', 'nativeEvent', 'isDefaultPrevented', 'isPropagationStopped', '_dispatchListeners', '_dispatchInstances'];
|
2732 |
|
2733 | /**
|
2734 | * @interface Event
|
2735 | * @see http://www.w3.org/TR/DOM-Level-3-Events/
|
2736 | */
|
2737 | var EventInterface = {
|
2738 | type: null,
|
2739 | target: null,
|
2740 | // currentTarget is set when dispatching; no use in copying it here
|
2741 | currentTarget: emptyFunction_1.thatReturnsNull,
|
2742 | eventPhase: null,
|
2743 | bubbles: null,
|
2744 | cancelable: null,
|
2745 | timeStamp: function (event) {
|
2746 | return event.timeStamp || Date.now();
|
2747 | },
|
2748 | defaultPrevented: null,
|
2749 | isTrusted: null
|
2750 | };
|
2751 |
|
2752 | /**
|
2753 | * Synthetic events are dispatched by event plugins, typically in response to a
|
2754 | * top-level event delegation handler.
|
2755 | *
|
2756 | * These systems should generally use pooling to reduce the frequency of garbage
|
2757 | * collection. The system should check `isPersistent` to determine whether the
|
2758 | * event should be released into the pool after being dispatched. Users that
|
2759 | * need a persisted event should invoke `persist`.
|
2760 | *
|
2761 | * Synthetic events (and subclasses) implement the DOM Level 3 Events API by
|
2762 | * normalizing browser quirks. Subclasses do not necessarily have to implement a
|
2763 | * DOM interface; custom application-specific events can also subclass this.
|
2764 | *
|
2765 | * @param {object} dispatchConfig Configuration used to dispatch this event.
|
2766 | * @param {*} targetInst Marker identifying the event target.
|
2767 | * @param {object} nativeEvent Native browser event.
|
2768 | * @param {DOMEventTarget} nativeEventTarget Target node.
|
2769 | */
|
2770 | function SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeEventTarget) {
|
2771 | this.dispatchConfig = dispatchConfig;
|
2772 | this._targetInst = targetInst;
|
2773 | this.nativeEvent = nativeEvent;
|
2774 |
|
2775 | var Interface = this.constructor.Interface;
|
2776 | for (var propName in Interface) {
|
2777 | if (!Interface.hasOwnProperty(propName)) {
|
2778 | continue;
|
2779 | }
|
2780 | var normalize = Interface[propName];
|
2781 | if (normalize) {
|
2782 | this[propName] = normalize(nativeEvent);
|
2783 | } else {
|
2784 | if (propName === 'target') {
|
2785 | this.target = nativeEventTarget;
|
2786 | } else {
|
2787 | this[propName] = nativeEvent[propName];
|
2788 | }
|
2789 | }
|
2790 | }
|
2791 |
|
2792 | var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false;
|
2793 | if (defaultPrevented) {
|
2794 | this.isDefaultPrevented = emptyFunction_1.thatReturnsTrue;
|
2795 | } else {
|
2796 | this.isDefaultPrevented = emptyFunction_1.thatReturnsFalse;
|
2797 | }
|
2798 | this.isPropagationStopped = emptyFunction_1.thatReturnsFalse;
|
2799 | return this;
|
2800 | }
|
2801 |
|
2802 | objectAssign(SyntheticEvent.prototype, {
|
2803 | preventDefault: function () {
|
2804 | this.defaultPrevented = true;
|
2805 | var event = this.nativeEvent;
|
2806 | if (!event) {
|
2807 | return;
|
2808 | }
|
2809 |
|
2810 | if (event.preventDefault) {
|
2811 | event.preventDefault();
|
2812 | // eslint-disable-next-line valid-typeof
|
2813 | } else if (typeof event.returnValue !== 'unknown') {
|
2814 | event.returnValue = false;
|
2815 | }
|
2816 | this.isDefaultPrevented = emptyFunction_1.thatReturnsTrue;
|
2817 | },
|
2818 |
|
2819 | stopPropagation: function () {
|
2820 | var event = this.nativeEvent;
|
2821 | if (!event) {
|
2822 | return;
|
2823 | }
|
2824 |
|
2825 | if (event.stopPropagation) {
|
2826 | event.stopPropagation();
|
2827 | // eslint-disable-next-line valid-typeof
|
2828 | } else if (typeof event.cancelBubble !== 'unknown') {
|
2829 | // The ChangeEventPlugin registers a "propertychange" event for
|
2830 | // IE. This event does not support bubbling or cancelling, and
|
2831 | // any references to cancelBubble throw "Member not found". A
|
2832 | // typeof check of "unknown" circumvents this issue (and is also
|
2833 | // IE specific).
|
2834 | event.cancelBubble = true;
|
2835 | }
|
2836 |
|
2837 | this.isPropagationStopped = emptyFunction_1.thatReturnsTrue;
|
2838 | },
|
2839 |
|
2840 | /**
|
2841 | * We release all dispatched `SyntheticEvent`s after each event loop, adding
|
2842 | * them back into the pool. This allows a way to hold onto a reference that
|
2843 | * won't be added back into the pool.
|
2844 | */
|
2845 | persist: function () {
|
2846 | this.isPersistent = emptyFunction_1.thatReturnsTrue;
|
2847 | },
|
2848 |
|
2849 | /**
|
2850 | * Checks if this event should be released back into the pool.
|
2851 | *
|
2852 | * @return {boolean} True if this should not be released, false otherwise.
|
2853 | */
|
2854 | isPersistent: emptyFunction_1.thatReturnsFalse,
|
2855 |
|
2856 | /**
|
2857 | * `PooledClass` looks for `destructor` on each instance it releases.
|
2858 | */
|
2859 | destructor: function () {
|
2860 | var Interface = this.constructor.Interface;
|
2861 | for (var propName in Interface) {
|
2862 | {
|
2863 | this[propName] = null;
|
2864 | }
|
2865 | }
|
2866 | for (var i = 0; i < shouldBeReleasedProperties.length; i++) {
|
2867 | this[shouldBeReleasedProperties[i]] = null;
|
2868 | }
|
2869 |
|
2870 | }
|
2871 | });
|
2872 |
|
2873 | SyntheticEvent.Interface = EventInterface;
|
2874 |
|
2875 | /**
|
2876 | * Helper to reduce boilerplate when creating subclasses.
|
2877 | *
|
2878 | * @param {function} Class
|
2879 | * @param {?object} Interface
|
2880 | */
|
2881 | SyntheticEvent.augmentClass = function (Class, Interface) {
|
2882 | var Super = this;
|
2883 |
|
2884 | var E = function () {};
|
2885 | E.prototype = Super.prototype;
|
2886 | var prototype = new E();
|
2887 |
|
2888 | objectAssign(prototype, Class.prototype);
|
2889 | Class.prototype = prototype;
|
2890 | Class.prototype.constructor = Class;
|
2891 |
|
2892 | Class.Interface = objectAssign({}, Super.Interface, Interface);
|
2893 | Class.augmentClass = Super.augmentClass;
|
2894 |
|
2895 | PooledClass_1.addPoolingTo(Class, PooledClass_1.fourArgumentPooler);
|
2896 | };
|
2897 |
|
2898 | PooledClass_1.addPoolingTo(SyntheticEvent, PooledClass_1.fourArgumentPooler);
|
2899 |
|
2900 | var SyntheticEvent_1 = SyntheticEvent;
|
2901 |
|
2902 | /**
|
2903 | * @interface Event
|
2904 | * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents
|
2905 | */
|
2906 | var CompositionEventInterface = {
|
2907 | data: null
|
2908 | };
|
2909 |
|
2910 | /**
|
2911 | * @param {object} dispatchConfig Configuration used to dispatch this event.
|
2912 | * @param {string} dispatchMarker Marker identifying the event target.
|
2913 | * @param {object} nativeEvent Native browser event.
|
2914 | * @extends {SyntheticUIEvent}
|
2915 | */
|
2916 | function SyntheticCompositionEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
2917 | return SyntheticEvent_1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
2918 | }
|
2919 |
|
2920 | SyntheticEvent_1.augmentClass(SyntheticCompositionEvent, CompositionEventInterface);
|
2921 |
|
2922 | var SyntheticCompositionEvent_1 = SyntheticCompositionEvent;
|
2923 |
|
2924 | /**
|
2925 | * @interface Event
|
2926 | * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105
|
2927 | * /#events-inputevents
|
2928 | */
|
2929 | var InputEventInterface = {
|
2930 | data: null
|
2931 | };
|
2932 |
|
2933 | /**
|
2934 | * @param {object} dispatchConfig Configuration used to dispatch this event.
|
2935 | * @param {string} dispatchMarker Marker identifying the event target.
|
2936 | * @param {object} nativeEvent Native browser event.
|
2937 | * @extends {SyntheticUIEvent}
|
2938 | */
|
2939 | function SyntheticInputEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
2940 | return SyntheticEvent_1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
2941 | }
|
2942 |
|
2943 | SyntheticEvent_1.augmentClass(SyntheticInputEvent, InputEventInterface);
|
2944 |
|
2945 | var SyntheticInputEvent_1 = SyntheticInputEvent;
|
2946 |
|
2947 | var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space
|
2948 | var START_KEYCODE = 229;
|
2949 |
|
2950 | var canUseCompositionEvent = ExecutionEnvironment_1.canUseDOM && 'CompositionEvent' in window;
|
2951 |
|
2952 | var documentMode = null;
|
2953 | if (ExecutionEnvironment_1.canUseDOM && 'documentMode' in document) {
|
2954 | documentMode = document.documentMode;
|
2955 | }
|
2956 |
|
2957 | // Webkit offers a very useful `textInput` event that can be used to
|
2958 | // directly represent `beforeInput`. The IE `textinput` event is not as
|
2959 | // useful, so we don't use it.
|
2960 | var canUseTextInputEvent = ExecutionEnvironment_1.canUseDOM && 'TextEvent' in window && !documentMode && !isPresto();
|
2961 |
|
2962 | // In IE9+, we have access to composition events, but the data supplied
|
2963 | // by the native compositionend event may be incorrect. Japanese ideographic
|
2964 | // spaces, for instance (\u3000) are not recorded correctly.
|
2965 | var useFallbackCompositionData = ExecutionEnvironment_1.canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11);
|
2966 |
|
2967 | /**
|
2968 | * Opera <= 12 includes TextEvent in window, but does not fire
|
2969 | * text input events. Rely on keypress instead.
|
2970 | */
|
2971 | function isPresto() {
|
2972 | var opera = window.opera;
|
2973 | return typeof opera === 'object' && typeof opera.version === 'function' && parseInt(opera.version(), 10) <= 12;
|
2974 | }
|
2975 |
|
2976 | var SPACEBAR_CODE = 32;
|
2977 | var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE);
|
2978 |
|
2979 | // Events and their corresponding property names.
|
2980 | var eventTypes = {
|
2981 | beforeInput: {
|
2982 | phasedRegistrationNames: {
|
2983 | bubbled: 'onBeforeInput',
|
2984 | captured: 'onBeforeInputCapture'
|
2985 | },
|
2986 | dependencies: ['topCompositionEnd', 'topKeyPress', 'topTextInput', 'topPaste']
|
2987 | },
|
2988 | compositionEnd: {
|
2989 | phasedRegistrationNames: {
|
2990 | bubbled: 'onCompositionEnd',
|
2991 | captured: 'onCompositionEndCapture'
|
2992 | },
|
2993 | dependencies: ['topBlur', 'topCompositionEnd', 'topKeyDown', 'topKeyPress', 'topKeyUp', 'topMouseDown']
|
2994 | },
|
2995 | compositionStart: {
|
2996 | phasedRegistrationNames: {
|
2997 | bubbled: 'onCompositionStart',
|
2998 | captured: 'onCompositionStartCapture'
|
2999 | },
|
3000 | dependencies: ['topBlur', 'topCompositionStart', 'topKeyDown', 'topKeyPress', 'topKeyUp', 'topMouseDown']
|
3001 | },
|
3002 | compositionUpdate: {
|
3003 | phasedRegistrationNames: {
|
3004 | bubbled: 'onCompositionUpdate',
|
3005 | captured: 'onCompositionUpdateCapture'
|
3006 | },
|
3007 | dependencies: ['topBlur', 'topCompositionUpdate', 'topKeyDown', 'topKeyPress', 'topKeyUp', 'topMouseDown']
|
3008 | }
|
3009 | };
|
3010 |
|
3011 | // Track whether we've ever handled a keypress on the space key.
|
3012 | var hasSpaceKeypress = false;
|
3013 |
|
3014 | /**
|
3015 | * Return whether a native keypress event is assumed to be a command.
|
3016 | * This is required because Firefox fires `keypress` events for key commands
|
3017 | * (cut, copy, select-all, etc.) even though no character is inserted.
|
3018 | */
|
3019 | function isKeypressCommand(nativeEvent) {
|
3020 | return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) &&
|
3021 | // ctrlKey && altKey is equivalent to AltGr, and is not a command.
|
3022 | !(nativeEvent.ctrlKey && nativeEvent.altKey);
|
3023 | }
|
3024 |
|
3025 | /**
|
3026 | * Translate native top level events into event types.
|
3027 | *
|
3028 | * @param {string} topLevelType
|
3029 | * @return {object}
|
3030 | */
|
3031 | function getCompositionEventType(topLevelType) {
|
3032 | switch (topLevelType) {
|
3033 | case 'topCompositionStart':
|
3034 | return eventTypes.compositionStart;
|
3035 | case 'topCompositionEnd':
|
3036 | return eventTypes.compositionEnd;
|
3037 | case 'topCompositionUpdate':
|
3038 | return eventTypes.compositionUpdate;
|
3039 | }
|
3040 | }
|
3041 |
|
3042 | /**
|
3043 | * Does our fallback best-guess model think this event signifies that
|
3044 | * composition has begun?
|
3045 | *
|
3046 | * @param {string} topLevelType
|
3047 | * @param {object} nativeEvent
|
3048 | * @return {boolean}
|
3049 | */
|
3050 | function isFallbackCompositionStart(topLevelType, nativeEvent) {
|
3051 | return topLevelType === 'topKeyDown' && nativeEvent.keyCode === START_KEYCODE;
|
3052 | }
|
3053 |
|
3054 | /**
|
3055 | * Does our fallback mode think that this event is the end of composition?
|
3056 | *
|
3057 | * @param {string} topLevelType
|
3058 | * @param {object} nativeEvent
|
3059 | * @return {boolean}
|
3060 | */
|
3061 | function isFallbackCompositionEnd(topLevelType, nativeEvent) {
|
3062 | switch (topLevelType) {
|
3063 | case 'topKeyUp':
|
3064 | // Command keys insert or clear IME input.
|
3065 | return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;
|
3066 | case 'topKeyDown':
|
3067 | // Expect IME keyCode on each keydown. If we get any other
|
3068 | // code we must have exited earlier.
|
3069 | return nativeEvent.keyCode !== START_KEYCODE;
|
3070 | case 'topKeyPress':
|
3071 | case 'topMouseDown':
|
3072 | case 'topBlur':
|
3073 | // Events are not possible without cancelling IME.
|
3074 | return true;
|
3075 | default:
|
3076 | return false;
|
3077 | }
|
3078 | }
|
3079 |
|
3080 | /**
|
3081 | * Google Input Tools provides composition data via a CustomEvent,
|
3082 | * with the `data` property populated in the `detail` object. If this
|
3083 | * is available on the event object, use it. If not, this is a plain
|
3084 | * composition event and we have nothing special to extract.
|
3085 | *
|
3086 | * @param {object} nativeEvent
|
3087 | * @return {?string}
|
3088 | */
|
3089 | function getDataFromCustomEvent(nativeEvent) {
|
3090 | var detail = nativeEvent.detail;
|
3091 | if (typeof detail === 'object' && 'data' in detail) {
|
3092 | return detail.data;
|
3093 | }
|
3094 | return null;
|
3095 | }
|
3096 |
|
3097 | // Track the current IME composition fallback object, if any.
|
3098 | var currentComposition = null;
|
3099 |
|
3100 | /**
|
3101 | * @return {?object} A SyntheticCompositionEvent.
|
3102 | */
|
3103 | function extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
|
3104 | var eventType;
|
3105 | var fallbackData;
|
3106 |
|
3107 | if (canUseCompositionEvent) {
|
3108 | eventType = getCompositionEventType(topLevelType);
|
3109 | } else if (!currentComposition) {
|
3110 | if (isFallbackCompositionStart(topLevelType, nativeEvent)) {
|
3111 | eventType = eventTypes.compositionStart;
|
3112 | }
|
3113 | } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) {
|
3114 | eventType = eventTypes.compositionEnd;
|
3115 | }
|
3116 |
|
3117 | if (!eventType) {
|
3118 | return null;
|
3119 | }
|
3120 |
|
3121 | if (useFallbackCompositionData) {
|
3122 | // The current composition is stored statically and must not be
|
3123 | // overwritten while composition continues.
|
3124 | if (!currentComposition && eventType === eventTypes.compositionStart) {
|
3125 | currentComposition = FallbackCompositionState_1.getPooled(nativeEventTarget);
|
3126 | } else if (eventType === eventTypes.compositionEnd) {
|
3127 | if (currentComposition) {
|
3128 | fallbackData = currentComposition.getData();
|
3129 | }
|
3130 | }
|
3131 | }
|
3132 |
|
3133 | var event = SyntheticCompositionEvent_1.getPooled(eventType, targetInst, nativeEvent, nativeEventTarget);
|
3134 |
|
3135 | if (fallbackData) {
|
3136 | // Inject data generated from fallback path into the synthetic event.
|
3137 | // This matches the property of native CompositionEventInterface.
|
3138 | event.data = fallbackData;
|
3139 | } else {
|
3140 | var customData = getDataFromCustomEvent(nativeEvent);
|
3141 | if (customData !== null) {
|
3142 | event.data = customData;
|
3143 | }
|
3144 | }
|
3145 |
|
3146 | EventPropagators_1.accumulateTwoPhaseDispatches(event);
|
3147 | return event;
|
3148 | }
|
3149 |
|
3150 | /**
|
3151 | * @param {string} topLevelType Record from `EventConstants`.
|
3152 | * @param {object} nativeEvent Native browser event.
|
3153 | * @return {?string} The string corresponding to this `beforeInput` event.
|
3154 | */
|
3155 | function getNativeBeforeInputChars(topLevelType, nativeEvent) {
|
3156 | switch (topLevelType) {
|
3157 | case 'topCompositionEnd':
|
3158 | return getDataFromCustomEvent(nativeEvent);
|
3159 | case 'topKeyPress':
|
3160 | /**
|
3161 | * If native `textInput` events are available, our goal is to make
|
3162 | * use of them. However, there is a special case: the spacebar key.
|
3163 | * In Webkit, preventing default on a spacebar `textInput` event
|
3164 | * cancels character insertion, but it *also* causes the browser
|
3165 | * to fall back to its default spacebar behavior of scrolling the
|
3166 | * page.
|
3167 | *
|
3168 | * Tracking at:
|
3169 | * https://code.google.com/p/chromium/issues/detail?id=355103
|
3170 | *
|
3171 | * To avoid this issue, use the keypress event as if no `textInput`
|
3172 | * event is available.
|
3173 | */
|
3174 | var which = nativeEvent.which;
|
3175 | if (which !== SPACEBAR_CODE) {
|
3176 | return null;
|
3177 | }
|
3178 |
|
3179 | hasSpaceKeypress = true;
|
3180 | return SPACEBAR_CHAR;
|
3181 |
|
3182 | case 'topTextInput':
|
3183 | // Record the characters to be added to the DOM.
|
3184 | var chars = nativeEvent.data;
|
3185 |
|
3186 | // If it's a spacebar character, assume that we have already handled
|
3187 | // it at the keypress level and bail immediately. Android Chrome
|
3188 | // doesn't give us keycodes, so we need to blacklist it.
|
3189 | if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {
|
3190 | return null;
|
3191 | }
|
3192 |
|
3193 | return chars;
|
3194 |
|
3195 | default:
|
3196 | // For other native event types, do nothing.
|
3197 | return null;
|
3198 | }
|
3199 | }
|
3200 |
|
3201 | /**
|
3202 | * For browsers that do not provide the `textInput` event, extract the
|
3203 | * appropriate string to use for SyntheticInputEvent.
|
3204 | *
|
3205 | * @param {string} topLevelType Record from `EventConstants`.
|
3206 | * @param {object} nativeEvent Native browser event.
|
3207 | * @return {?string} The fallback string for this `beforeInput` event.
|
3208 | */
|
3209 | function getFallbackBeforeInputChars(topLevelType, nativeEvent) {
|
3210 | // If we are currently composing (IME) and using a fallback to do so,
|
3211 | // try to extract the composed characters from the fallback object.
|
3212 | // If composition event is available, we extract a string only at
|
3213 | // compositionevent, otherwise extract it at fallback events.
|
3214 | if (currentComposition) {
|
3215 | if (topLevelType === 'topCompositionEnd' || !canUseCompositionEvent && isFallbackCompositionEnd(topLevelType, nativeEvent)) {
|
3216 | var chars = currentComposition.getData();
|
3217 | FallbackCompositionState_1.release(currentComposition);
|
3218 | currentComposition = null;
|
3219 | return chars;
|
3220 | }
|
3221 | return null;
|
3222 | }
|
3223 |
|
3224 | switch (topLevelType) {
|
3225 | case 'topPaste':
|
3226 | // If a paste event occurs after a keypress, throw out the input
|
3227 | // chars. Paste events should not lead to BeforeInput events.
|
3228 | return null;
|
3229 | case 'topKeyPress':
|
3230 | /**
|
3231 | * As of v27, Firefox may fire keypress events even when no character
|
3232 | * will be inserted. A few possibilities:
|
3233 | *
|
3234 | * - `which` is `0`. Arrow keys, Esc key, etc.
|
3235 | *
|
3236 | * - `which` is the pressed key code, but no char is available.
|
3237 | * Ex: 'AltGr + d` in Polish. There is no modified character for
|
3238 | * this key combination and no character is inserted into the
|
3239 | * document, but FF fires the keypress for char code `100` anyway.
|
3240 | * No `input` event will occur.
|
3241 | *
|
3242 | * - `which` is the pressed key code, but a command combination is
|
3243 | * being used. Ex: `Cmd+C`. No character is inserted, and no
|
3244 | * `input` event will occur.
|
3245 | */
|
3246 | if (nativeEvent.which && !isKeypressCommand(nativeEvent)) {
|
3247 | return String.fromCharCode(nativeEvent.which);
|
3248 | }
|
3249 | return null;
|
3250 | case 'topCompositionEnd':
|
3251 | return useFallbackCompositionData ? null : nativeEvent.data;
|
3252 | default:
|
3253 | return null;
|
3254 | }
|
3255 | }
|
3256 |
|
3257 | /**
|
3258 | * Extract a SyntheticInputEvent for `beforeInput`, based on either native
|
3259 | * `textInput` or fallback behavior.
|
3260 | *
|
3261 | * @return {?object} A SyntheticInputEvent.
|
3262 | */
|
3263 | function extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {
|
3264 | var chars;
|
3265 |
|
3266 | if (canUseTextInputEvent) {
|
3267 | chars = getNativeBeforeInputChars(topLevelType, nativeEvent);
|
3268 | } else {
|
3269 | chars = getFallbackBeforeInputChars(topLevelType, nativeEvent);
|
3270 | }
|
3271 |
|
3272 | // If no characters are being inserted, no BeforeInput event should
|
3273 | // be fired.
|
3274 | if (!chars) {
|
3275 | return null;
|
3276 | }
|
3277 |
|
3278 | var event = SyntheticInputEvent_1.getPooled(eventTypes.beforeInput, targetInst, nativeEvent, nativeEventTarget);
|
3279 |
|
3280 | event.data = chars;
|
3281 | EventPropagators_1.accumulateTwoPhaseDispatches(event);
|
3282 | return event;
|
3283 | }
|
3284 |
|
3285 | /**
|
3286 | * Create an `onBeforeInput` event to match
|
3287 | * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.
|
3288 | *
|
3289 | * This event plugin is based on the native `textInput` event
|
3290 | * available in Chrome, Safari, Opera, and IE. This event fires after
|
3291 | * `onKeyPress` and `onCompositionEnd`, but before `onInput`.
|
3292 | *
|
3293 | * `beforeInput` is spec'd but not implemented in any browsers, and
|
3294 | * the `input` event does not provide any useful information about what has
|
3295 | * actually been added, contrary to the spec. Thus, `textInput` is the best
|
3296 | * available event to identify the characters that have actually been inserted
|
3297 | * into the target node.
|
3298 | *
|
3299 | * This plugin is also responsible for emitting `composition` events, thus
|
3300 | * allowing us to share composition fallback code for both `beforeInput` and
|
3301 | * `composition` event types.
|
3302 | */
|
3303 | var BeforeInputEventPlugin = {
|
3304 | eventTypes: eventTypes,
|
3305 |
|
3306 | extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {
|
3307 | return [extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget), extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget)];
|
3308 | }
|
3309 | };
|
3310 |
|
3311 | var BeforeInputEventPlugin_1 = BeforeInputEventPlugin;
|
3312 |
|
3313 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
3314 |
|
3315 |
|
3316 |
|
3317 |
|
3318 |
|
3319 | /**
|
3320 | * A specialized pseudo-event module to help keep track of components waiting to
|
3321 | * be notified when their DOM representations are available for use.
|
3322 | *
|
3323 | * This implements `PooledClass`, so you should never need to instantiate this.
|
3324 | * Instead, use `CallbackQueue.getPooled()`.
|
3325 | *
|
3326 | * @class ReactMountReady
|
3327 | * @implements PooledClass
|
3328 | * @internal
|
3329 | */
|
3330 |
|
3331 | var CallbackQueue = function () {
|
3332 | function CallbackQueue(arg) {
|
3333 | _classCallCheck(this, CallbackQueue);
|
3334 |
|
3335 | this._callbacks = null;
|
3336 | this._contexts = null;
|
3337 | this._arg = arg;
|
3338 | }
|
3339 |
|
3340 | /**
|
3341 | * Enqueues a callback to be invoked when `notifyAll` is invoked.
|
3342 | *
|
3343 | * @param {function} callback Invoked when `notifyAll` is invoked.
|
3344 | * @param {?object} context Context to call `callback` with.
|
3345 | * @internal
|
3346 | */
|
3347 |
|
3348 |
|
3349 | CallbackQueue.prototype.enqueue = function enqueue(callback, context) {
|
3350 | this._callbacks = this._callbacks || [];
|
3351 | this._callbacks.push(callback);
|
3352 | this._contexts = this._contexts || [];
|
3353 | this._contexts.push(context);
|
3354 | };
|
3355 |
|
3356 | /**
|
3357 | * Invokes all enqueued callbacks and clears the queue. This is invoked after
|
3358 | * the DOM representation of a component has been created or updated.
|
3359 | *
|
3360 | * @internal
|
3361 | */
|
3362 |
|
3363 |
|
3364 | CallbackQueue.prototype.notifyAll = function notifyAll() {
|
3365 | var callbacks = this._callbacks;
|
3366 | var contexts = this._contexts;
|
3367 | var arg = this._arg;
|
3368 | if (callbacks && contexts) {
|
3369 | !(callbacks.length === contexts.length) ? reactProdInvariant_1('24') : void 0;
|
3370 | this._callbacks = null;
|
3371 | this._contexts = null;
|
3372 | for (var i = 0; i < callbacks.length; i++) {
|
3373 | callbacks[i].call(contexts[i], arg);
|
3374 | }
|
3375 | callbacks.length = 0;
|
3376 | contexts.length = 0;
|
3377 | }
|
3378 | };
|
3379 |
|
3380 | CallbackQueue.prototype.checkpoint = function checkpoint() {
|
3381 | return this._callbacks ? this._callbacks.length : 0;
|
3382 | };
|
3383 |
|
3384 | CallbackQueue.prototype.rollback = function rollback(len) {
|
3385 | if (this._callbacks && this._contexts) {
|
3386 | this._callbacks.length = len;
|
3387 | this._contexts.length = len;
|
3388 | }
|
3389 | };
|
3390 |
|
3391 | /**
|
3392 | * Resets the internal queue.
|
3393 | *
|
3394 | * @internal
|
3395 | */
|
3396 |
|
3397 |
|
3398 | CallbackQueue.prototype.reset = function reset() {
|
3399 | this._callbacks = null;
|
3400 | this._contexts = null;
|
3401 | };
|
3402 |
|
3403 | /**
|
3404 | * `PooledClass` looks for this.
|
3405 | */
|
3406 |
|
3407 |
|
3408 | CallbackQueue.prototype.destructor = function destructor() {
|
3409 | this.reset();
|
3410 | };
|
3411 |
|
3412 | return CallbackQueue;
|
3413 | }();
|
3414 |
|
3415 | var CallbackQueue_1 = PooledClass_1.addPoolingTo(CallbackQueue);
|
3416 |
|
3417 | /**
|
3418 | * Copyright 2013-present, Facebook, Inc.
|
3419 | * All rights reserved.
|
3420 | *
|
3421 | * This source code is licensed under the BSD-style license found in the
|
3422 | * LICENSE file in the root directory of this source tree. An additional grant
|
3423 | * of patent rights can be found in the PATENTS file in the same directory.
|
3424 | *
|
3425 | *
|
3426 | */
|
3427 |
|
3428 | var ReactFeatureFlags = {
|
3429 | // When true, call console.time() before and .timeEnd() after each top-level
|
3430 | // render (both initial renders and updates). Useful when looking at prod-mode
|
3431 | // timeline profiles in Chrome, for example.
|
3432 | logTopLevelRenders: false
|
3433 | };
|
3434 |
|
3435 | var ReactFeatureFlags_1 = ReactFeatureFlags;
|
3436 |
|
3437 | /**
|
3438 | * @param {?object} object
|
3439 | * @return {boolean} True if `object` is a valid owner.
|
3440 | * @final
|
3441 | */
|
3442 | function isValidOwner(object) {
|
3443 | return !!(object && typeof object.attachRef === 'function' && typeof object.detachRef === 'function');
|
3444 | }
|
3445 |
|
3446 | /**
|
3447 | * ReactOwners are capable of storing references to owned components.
|
3448 | *
|
3449 | * All components are capable of //being// referenced by owner components, but
|
3450 | * only ReactOwner components are capable of //referencing// owned components.
|
3451 | * The named reference is known as a "ref".
|
3452 | *
|
3453 | * Refs are available when mounted and updated during reconciliation.
|
3454 | *
|
3455 | * var MyComponent = React.createClass({
|
3456 | * render: function() {
|
3457 | * return (
|
3458 | * <div onClick={this.handleClick}>
|
3459 | * <CustomComponent ref="custom" />
|
3460 | * </div>
|
3461 | * );
|
3462 | * },
|
3463 | * handleClick: function() {
|
3464 | * this.refs.custom.handleClick();
|
3465 | * },
|
3466 | * componentDidMount: function() {
|
3467 | * this.refs.custom.initialize();
|
3468 | * }
|
3469 | * });
|
3470 | *
|
3471 | * Refs should rarely be used. When refs are used, they should only be done to
|
3472 | * control data that is not handled by React's data flow.
|
3473 | *
|
3474 | * @class ReactOwner
|
3475 | */
|
3476 | var ReactOwner = {
|
3477 | /**
|
3478 | * Adds a component by ref to an owner component.
|
3479 | *
|
3480 | * @param {ReactComponent} component Component to reference.
|
3481 | * @param {string} ref Name by which to refer to the component.
|
3482 | * @param {ReactOwner} owner Component on which to record the ref.
|
3483 | * @final
|
3484 | * @internal
|
3485 | */
|
3486 | addComponentAsRefTo: function (component, ref, owner) {
|
3487 | !isValidOwner(owner) ? reactProdInvariant_1('119') : void 0;
|
3488 | owner.attachRef(ref, component);
|
3489 | },
|
3490 |
|
3491 | /**
|
3492 | * Removes a component by ref from an owner component.
|
3493 | *
|
3494 | * @param {ReactComponent} component Component to dereference.
|
3495 | * @param {string} ref Name of the ref to remove.
|
3496 | * @param {ReactOwner} owner Component on which the ref is recorded.
|
3497 | * @final
|
3498 | * @internal
|
3499 | */
|
3500 | removeComponentAsRefFrom: function (component, ref, owner) {
|
3501 | !isValidOwner(owner) ? reactProdInvariant_1('120') : void 0;
|
3502 | var ownerPublicInstance = owner.getPublicInstance();
|
3503 | // Check that `component`'s owner is still alive and that `component` is still the current ref
|
3504 | // because we do not want to detach the ref if another component stole it.
|
3505 | if (ownerPublicInstance && ownerPublicInstance.refs[ref] === component.getPublicInstance()) {
|
3506 | owner.detachRef(ref);
|
3507 | }
|
3508 | }
|
3509 | };
|
3510 |
|
3511 | var ReactOwner_1 = ReactOwner;
|
3512 |
|
3513 | var ReactRef = {};
|
3514 |
|
3515 | function attachRef(ref, component, owner) {
|
3516 | if (typeof ref === 'function') {
|
3517 | ref(component.getPublicInstance());
|
3518 | } else {
|
3519 | // Legacy ref
|
3520 | ReactOwner_1.addComponentAsRefTo(component, ref, owner);
|
3521 | }
|
3522 | }
|
3523 |
|
3524 | function detachRef(ref, component, owner) {
|
3525 | if (typeof ref === 'function') {
|
3526 | ref(null);
|
3527 | } else {
|
3528 | // Legacy ref
|
3529 | ReactOwner_1.removeComponentAsRefFrom(component, ref, owner);
|
3530 | }
|
3531 | }
|
3532 |
|
3533 | ReactRef.attachRefs = function (instance, element) {
|
3534 | if (element === null || typeof element !== 'object') {
|
3535 | return;
|
3536 | }
|
3537 | var ref = element.ref;
|
3538 | if (ref != null) {
|
3539 | attachRef(ref, instance, element._owner);
|
3540 | }
|
3541 | };
|
3542 |
|
3543 | ReactRef.shouldUpdateRefs = function (prevElement, nextElement) {
|
3544 | // If either the owner or a `ref` has changed, make sure the newest owner
|
3545 | // has stored a reference to `this`, and the previous owner (if different)
|
3546 | // has forgotten the reference to `this`. We use the element instead
|
3547 | // of the public this.props because the post processing cannot determine
|
3548 | // a ref. The ref conceptually lives on the element.
|
3549 |
|
3550 | // TODO: Should this even be possible? The owner cannot change because
|
3551 | // it's forbidden by shouldUpdateReactComponent. The ref can change
|
3552 | // if you swap the keys of but not the refs. Reconsider where this check
|
3553 | // is made. It probably belongs where the key checking and
|
3554 | // instantiateReactComponent is done.
|
3555 |
|
3556 | var prevRef = null;
|
3557 | var prevOwner = null;
|
3558 | if (prevElement !== null && typeof prevElement === 'object') {
|
3559 | prevRef = prevElement.ref;
|
3560 | prevOwner = prevElement._owner;
|
3561 | }
|
3562 |
|
3563 | var nextRef = null;
|
3564 | var nextOwner = null;
|
3565 | if (nextElement !== null && typeof nextElement === 'object') {
|
3566 | nextRef = nextElement.ref;
|
3567 | nextOwner = nextElement._owner;
|
3568 | }
|
3569 |
|
3570 | return prevRef !== nextRef ||
|
3571 | // If owner changes but we have an unchanged function ref, don't update refs
|
3572 | typeof nextRef === 'string' && nextOwner !== prevOwner;
|
3573 | };
|
3574 |
|
3575 | ReactRef.detachRefs = function (instance, element) {
|
3576 | if (element === null || typeof element !== 'object') {
|
3577 | return;
|
3578 | }
|
3579 | var ref = element.ref;
|
3580 | if (ref != null) {
|
3581 | detachRef(ref, instance, element._owner);
|
3582 | }
|
3583 | };
|
3584 |
|
3585 | var ReactRef_1 = ReactRef;
|
3586 |
|
3587 | /**
|
3588 | * Copyright 2016-present, Facebook, Inc.
|
3589 | * All rights reserved.
|
3590 | *
|
3591 | * This source code is licensed under the BSD-style license found in the
|
3592 | * LICENSE file in the root directory of this source tree. An additional grant
|
3593 | * of patent rights can be found in the PATENTS file in the same directory.
|
3594 | *
|
3595 | *
|
3596 | */
|
3597 |
|
3598 | /**
|
3599 | * Helper to call ReactRef.attachRefs with this composite component, split out
|
3600 | * to avoid allocations in the transaction mount-ready queue.
|
3601 | */
|
3602 | function attachRefs() {
|
3603 | ReactRef_1.attachRefs(this, this._currentElement);
|
3604 | }
|
3605 |
|
3606 | var ReactReconciler = {
|
3607 | /**
|
3608 | * Initializes the component, renders markup, and registers event listeners.
|
3609 | *
|
3610 | * @param {ReactComponent} internalInstance
|
3611 | * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction
|
3612 | * @param {?object} the containing host component instance
|
3613 | * @param {?object} info about the host container
|
3614 | * @return {?string} Rendered markup to be inserted into the DOM.
|
3615 | * @final
|
3616 | * @internal
|
3617 | */
|
3618 | mountComponent: function (internalInstance, transaction, hostParent, hostContainerInfo, context, parentDebugID) // 0 in production and for roots
|
3619 | {
|
3620 | var markup = internalInstance.mountComponent(transaction, hostParent, hostContainerInfo, context, parentDebugID);
|
3621 | if (internalInstance._currentElement && internalInstance._currentElement.ref != null) {
|
3622 | transaction.getReactMountReady().enqueue(attachRefs, internalInstance);
|
3623 | }
|
3624 | return markup;
|
3625 | },
|
3626 |
|
3627 | /**
|
3628 | * Returns a value that can be passed to
|
3629 | * ReactComponentEnvironment.replaceNodeWithMarkup.
|
3630 | */
|
3631 | getHostNode: function (internalInstance) {
|
3632 | return internalInstance.getHostNode();
|
3633 | },
|
3634 |
|
3635 | /**
|
3636 | * Releases any resources allocated by `mountComponent`.
|
3637 | *
|
3638 | * @final
|
3639 | * @internal
|
3640 | */
|
3641 | unmountComponent: function (internalInstance, safely) {
|
3642 | ReactRef_1.detachRefs(internalInstance, internalInstance._currentElement);
|
3643 | internalInstance.unmountComponent(safely);
|
3644 |
|
3645 | },
|
3646 |
|
3647 | /**
|
3648 | * Update a component using a new element.
|
3649 | *
|
3650 | * @param {ReactComponent} internalInstance
|
3651 | * @param {ReactElement} nextElement
|
3652 | * @param {ReactReconcileTransaction} transaction
|
3653 | * @param {object} context
|
3654 | * @internal
|
3655 | */
|
3656 | receiveComponent: function (internalInstance, nextElement, transaction, context) {
|
3657 | var prevElement = internalInstance._currentElement;
|
3658 |
|
3659 | if (nextElement === prevElement && context === internalInstance._context) {
|
3660 | // Since elements are immutable after the owner is rendered,
|
3661 | // we can do a cheap identity compare here to determine if this is a
|
3662 | // superfluous reconcile. It's possible for state to be mutable but such
|
3663 | // change should trigger an update of the owner which would recreate
|
3664 | // the element. We explicitly check for the existence of an owner since
|
3665 | // it's possible for an element created outside a composite to be
|
3666 | // deeply mutated and reused.
|
3667 |
|
3668 | // TODO: Bailing out early is just a perf optimization right?
|
3669 | // TODO: Removing the return statement should affect correctness?
|
3670 | return;
|
3671 | }
|
3672 |
|
3673 | var refsChanged = ReactRef_1.shouldUpdateRefs(prevElement, nextElement);
|
3674 |
|
3675 | if (refsChanged) {
|
3676 | ReactRef_1.detachRefs(internalInstance, prevElement);
|
3677 | }
|
3678 |
|
3679 | internalInstance.receiveComponent(nextElement, transaction, context);
|
3680 |
|
3681 | if (refsChanged && internalInstance._currentElement && internalInstance._currentElement.ref != null) {
|
3682 | transaction.getReactMountReady().enqueue(attachRefs, internalInstance);
|
3683 | }
|
3684 |
|
3685 |
|
3686 | },
|
3687 |
|
3688 | /**
|
3689 | * Flush any dirty changes in a component.
|
3690 | *
|
3691 | * @param {ReactComponent} internalInstance
|
3692 | * @param {ReactReconcileTransaction} transaction
|
3693 | * @internal
|
3694 | */
|
3695 | performUpdateIfNecessary: function (internalInstance, transaction, updateBatchNumber) {
|
3696 | if (internalInstance._updateBatchNumber !== updateBatchNumber) {
|
3697 | // The component's enqueued batch number should always be the current
|
3698 | // batch or the following one.
|
3699 | void 0;
|
3700 | return;
|
3701 | }
|
3702 | internalInstance.performUpdateIfNecessary(transaction);
|
3703 |
|
3704 | }
|
3705 | };
|
3706 |
|
3707 | var ReactReconciler_1 = ReactReconciler;
|
3708 |
|
3709 | var OBSERVED_ERROR = {};
|
3710 |
|
3711 | /**
|
3712 | * `Transaction` creates a black box that is able to wrap any method such that
|
3713 | * certain invariants are maintained before and after the method is invoked
|
3714 | * (Even if an exception is thrown while invoking the wrapped method). Whoever
|
3715 | * instantiates a transaction can provide enforcers of the invariants at
|
3716 | * creation time. The `Transaction` class itself will supply one additional
|
3717 | * automatic invariant for you - the invariant that any transaction instance
|
3718 | * should not be run while it is already being run. You would typically create a
|
3719 | * single instance of a `Transaction` for reuse multiple times, that potentially
|
3720 | * is used to wrap several different methods. Wrappers are extremely simple -
|
3721 | * they only require implementing two methods.
|
3722 | *
|
3723 | * <pre>
|
3724 | * wrappers (injected at creation time)
|
3725 | * + +
|
3726 | * | |
|
3727 | * +-----------------|--------|--------------+
|
3728 | * | v | |
|
3729 | * | +---------------+ | |
|
3730 | * | +--| wrapper1 |---|----+ |
|
3731 | * | | +---------------+ v | |
|
3732 | * | | +-------------+ | |
|
3733 | * | | +----| wrapper2 |--------+ |
|
3734 | * | | | +-------------+ | | |
|
3735 | * | | | | | |
|
3736 | * | v v v v | wrapper
|
3737 | * | +---+ +---+ +---------+ +---+ +---+ | invariants
|
3738 | * perform(anyMethod) | | | | | | | | | | | | maintained
|
3739 | * +----------------->|-|---|-|---|-->|anyMethod|---|---|-|---|-|-------->
|
3740 | * | | | | | | | | | | | |
|
3741 | * | | | | | | | | | | | |
|
3742 | * | | | | | | | | | | | |
|
3743 | * | +---+ +---+ +---------+ +---+ +---+ |
|
3744 | * | initialize close |
|
3745 | * +-----------------------------------------+
|
3746 | * </pre>
|
3747 | *
|
3748 | * Use cases:
|
3749 | * - Preserving the input selection ranges before/after reconciliation.
|
3750 | * Restoring selection even in the event of an unexpected error.
|
3751 | * - Deactivating events while rearranging the DOM, preventing blurs/focuses,
|
3752 | * while guaranteeing that afterwards, the event system is reactivated.
|
3753 | * - Flushing a queue of collected DOM mutations to the main UI thread after a
|
3754 | * reconciliation takes place in a worker thread.
|
3755 | * - Invoking any collected `componentDidUpdate` callbacks after rendering new
|
3756 | * content.
|
3757 | * - (Future use case): Wrapping particular flushes of the `ReactWorker` queue
|
3758 | * to preserve the `scrollTop` (an automatic scroll aware DOM).
|
3759 | * - (Future use case): Layout calculations before and after DOM updates.
|
3760 | *
|
3761 | * Transactional plugin API:
|
3762 | * - A module that has an `initialize` method that returns any precomputation.
|
3763 | * - and a `close` method that accepts the precomputation. `close` is invoked
|
3764 | * when the wrapped process is completed, or has failed.
|
3765 | *
|
3766 | * @param {Array<TransactionalWrapper>} transactionWrapper Wrapper modules
|
3767 | * that implement `initialize` and `close`.
|
3768 | * @return {Transaction} Single transaction for reuse in thread.
|
3769 | *
|
3770 | * @class Transaction
|
3771 | */
|
3772 | var TransactionImpl = {
|
3773 | /**
|
3774 | * Sets up this instance so that it is prepared for collecting metrics. Does
|
3775 | * so such that this setup method may be used on an instance that is already
|
3776 | * initialized, in a way that does not consume additional memory upon reuse.
|
3777 | * That can be useful if you decide to make your subclass of this mixin a
|
3778 | * "PooledClass".
|
3779 | */
|
3780 | reinitializeTransaction: function () {
|
3781 | this.transactionWrappers = this.getTransactionWrappers();
|
3782 | if (this.wrapperInitData) {
|
3783 | this.wrapperInitData.length = 0;
|
3784 | } else {
|
3785 | this.wrapperInitData = [];
|
3786 | }
|
3787 | this._isInTransaction = false;
|
3788 | },
|
3789 |
|
3790 | _isInTransaction: false,
|
3791 |
|
3792 | /**
|
3793 | * @abstract
|
3794 | * @return {Array<TransactionWrapper>} Array of transaction wrappers.
|
3795 | */
|
3796 | getTransactionWrappers: null,
|
3797 |
|
3798 | isInTransaction: function () {
|
3799 | return !!this._isInTransaction;
|
3800 | },
|
3801 |
|
3802 | /* eslint-disable space-before-function-paren */
|
3803 |
|
3804 | /**
|
3805 | * Executes the function within a safety window. Use this for the top level
|
3806 | * methods that result in large amounts of computation/mutations that would
|
3807 | * need to be safety checked. The optional arguments helps prevent the need
|
3808 | * to bind in many cases.
|
3809 | *
|
3810 | * @param {function} method Member of scope to call.
|
3811 | * @param {Object} scope Scope to invoke from.
|
3812 | * @param {Object?=} a Argument to pass to the method.
|
3813 | * @param {Object?=} b Argument to pass to the method.
|
3814 | * @param {Object?=} c Argument to pass to the method.
|
3815 | * @param {Object?=} d Argument to pass to the method.
|
3816 | * @param {Object?=} e Argument to pass to the method.
|
3817 | * @param {Object?=} f Argument to pass to the method.
|
3818 | *
|
3819 | * @return {*} Return value from `method`.
|
3820 | */
|
3821 | perform: function (method, scope, a, b, c, d, e, f) {
|
3822 | /* eslint-enable space-before-function-paren */
|
3823 | !!this.isInTransaction() ? reactProdInvariant_1('27') : void 0;
|
3824 | var errorThrown;
|
3825 | var ret;
|
3826 | try {
|
3827 | this._isInTransaction = true;
|
3828 | // Catching errors makes debugging more difficult, so we start with
|
3829 | // errorThrown set to true before setting it to false after calling
|
3830 | // close -- if it's still set to true in the finally block, it means
|
3831 | // one of these calls threw.
|
3832 | errorThrown = true;
|
3833 | this.initializeAll(0);
|
3834 | ret = method.call(scope, a, b, c, d, e, f);
|
3835 | errorThrown = false;
|
3836 | } finally {
|
3837 | try {
|
3838 | if (errorThrown) {
|
3839 | // If `method` throws, prefer to show that stack trace over any thrown
|
3840 | // by invoking `closeAll`.
|
3841 | try {
|
3842 | this.closeAll(0);
|
3843 | } catch (err) {}
|
3844 | } else {
|
3845 | // Since `method` didn't throw, we don't want to silence the exception
|
3846 | // here.
|
3847 | this.closeAll(0);
|
3848 | }
|
3849 | } finally {
|
3850 | this._isInTransaction = false;
|
3851 | }
|
3852 | }
|
3853 | return ret;
|
3854 | },
|
3855 |
|
3856 | initializeAll: function (startIndex) {
|
3857 | var transactionWrappers = this.transactionWrappers;
|
3858 | for (var i = startIndex; i < transactionWrappers.length; i++) {
|
3859 | var wrapper = transactionWrappers[i];
|
3860 | try {
|
3861 | // Catching errors makes debugging more difficult, so we start with the
|
3862 | // OBSERVED_ERROR state before overwriting it with the real return value
|
3863 | // of initialize -- if it's still set to OBSERVED_ERROR in the finally
|
3864 | // block, it means wrapper.initialize threw.
|
3865 | this.wrapperInitData[i] = OBSERVED_ERROR;
|
3866 | this.wrapperInitData[i] = wrapper.initialize ? wrapper.initialize.call(this) : null;
|
3867 | } finally {
|
3868 | if (this.wrapperInitData[i] === OBSERVED_ERROR) {
|
3869 | // The initializer for wrapper i threw an error; initialize the
|
3870 | // remaining wrappers but silence any exceptions from them to ensure
|
3871 | // that the first error is the one to bubble up.
|
3872 | try {
|
3873 | this.initializeAll(i + 1);
|
3874 | } catch (err) {}
|
3875 | }
|
3876 | }
|
3877 | }
|
3878 | },
|
3879 |
|
3880 | /**
|
3881 | * Invokes each of `this.transactionWrappers.close[i]` functions, passing into
|
3882 | * them the respective return values of `this.transactionWrappers.init[i]`
|
3883 | * (`close`rs that correspond to initializers that failed will not be
|
3884 | * invoked).
|
3885 | */
|
3886 | closeAll: function (startIndex) {
|
3887 | !this.isInTransaction() ? reactProdInvariant_1('28') : void 0;
|
3888 | var transactionWrappers = this.transactionWrappers;
|
3889 | for (var i = startIndex; i < transactionWrappers.length; i++) {
|
3890 | var wrapper = transactionWrappers[i];
|
3891 | var initData = this.wrapperInitData[i];
|
3892 | var errorThrown;
|
3893 | try {
|
3894 | // Catching errors makes debugging more difficult, so we start with
|
3895 | // errorThrown set to true before setting it to false after calling
|
3896 | // close -- if it's still set to true in the finally block, it means
|
3897 | // wrapper.close threw.
|
3898 | errorThrown = true;
|
3899 | if (initData !== OBSERVED_ERROR && wrapper.close) {
|
3900 | wrapper.close.call(this, initData);
|
3901 | }
|
3902 | errorThrown = false;
|
3903 | } finally {
|
3904 | if (errorThrown) {
|
3905 | // The closer for wrapper i threw an error; close the remaining
|
3906 | // wrappers but silence any exceptions from them to ensure that the
|
3907 | // first error is the one to bubble up.
|
3908 | try {
|
3909 | this.closeAll(i + 1);
|
3910 | } catch (e) {}
|
3911 | }
|
3912 | }
|
3913 | }
|
3914 | this.wrapperInitData.length = 0;
|
3915 | }
|
3916 | };
|
3917 |
|
3918 | var Transaction = TransactionImpl;
|
3919 |
|
3920 | var dirtyComponents = [];
|
3921 | var updateBatchNumber = 0;
|
3922 | var asapCallbackQueue = CallbackQueue_1.getPooled();
|
3923 | var asapEnqueued = false;
|
3924 |
|
3925 | var batchingStrategy = null;
|
3926 |
|
3927 | function ensureInjected() {
|
3928 | !(ReactUpdates.ReactReconcileTransaction && batchingStrategy) ? reactProdInvariant_1('123') : void 0;
|
3929 | }
|
3930 |
|
3931 | var NESTED_UPDATES = {
|
3932 | initialize: function () {
|
3933 | this.dirtyComponentsLength = dirtyComponents.length;
|
3934 | },
|
3935 | close: function () {
|
3936 | if (this.dirtyComponentsLength !== dirtyComponents.length) {
|
3937 | // Additional updates were enqueued by componentDidUpdate handlers or
|
3938 | // similar; before our own UPDATE_QUEUEING wrapper closes, we want to run
|
3939 | // these new updates so that if A's componentDidUpdate calls setState on
|
3940 | // B, B will update before the callback A's updater provided when calling
|
3941 | // setState.
|
3942 | dirtyComponents.splice(0, this.dirtyComponentsLength);
|
3943 | flushBatchedUpdates();
|
3944 | } else {
|
3945 | dirtyComponents.length = 0;
|
3946 | }
|
3947 | }
|
3948 | };
|
3949 |
|
3950 | var UPDATE_QUEUEING = {
|
3951 | initialize: function () {
|
3952 | this.callbackQueue.reset();
|
3953 | },
|
3954 | close: function () {
|
3955 | this.callbackQueue.notifyAll();
|
3956 | }
|
3957 | };
|
3958 |
|
3959 | var TRANSACTION_WRAPPERS = [NESTED_UPDATES, UPDATE_QUEUEING];
|
3960 |
|
3961 | function ReactUpdatesFlushTransaction() {
|
3962 | this.reinitializeTransaction();
|
3963 | this.dirtyComponentsLength = null;
|
3964 | this.callbackQueue = CallbackQueue_1.getPooled();
|
3965 | this.reconcileTransaction = ReactUpdates.ReactReconcileTransaction.getPooled(
|
3966 | /* useCreateElement */true);
|
3967 | }
|
3968 |
|
3969 | objectAssign(ReactUpdatesFlushTransaction.prototype, Transaction, {
|
3970 | getTransactionWrappers: function () {
|
3971 | return TRANSACTION_WRAPPERS;
|
3972 | },
|
3973 |
|
3974 | destructor: function () {
|
3975 | this.dirtyComponentsLength = null;
|
3976 | CallbackQueue_1.release(this.callbackQueue);
|
3977 | this.callbackQueue = null;
|
3978 | ReactUpdates.ReactReconcileTransaction.release(this.reconcileTransaction);
|
3979 | this.reconcileTransaction = null;
|
3980 | },
|
3981 |
|
3982 | perform: function (method, scope, a) {
|
3983 | // Essentially calls `this.reconcileTransaction.perform(method, scope, a)`
|
3984 | // with this transaction's wrappers around it.
|
3985 | return Transaction.perform.call(this, this.reconcileTransaction.perform, this.reconcileTransaction, method, scope, a);
|
3986 | }
|
3987 | });
|
3988 |
|
3989 | PooledClass_1.addPoolingTo(ReactUpdatesFlushTransaction);
|
3990 |
|
3991 | function batchedUpdates(callback, a, b, c, d, e) {
|
3992 | ensureInjected();
|
3993 | return batchingStrategy.batchedUpdates(callback, a, b, c, d, e);
|
3994 | }
|
3995 |
|
3996 | /**
|
3997 | * Array comparator for ReactComponents by mount ordering.
|
3998 | *
|
3999 | * @param {ReactComponent} c1 first component you're comparing
|
4000 | * @param {ReactComponent} c2 second component you're comparing
|
4001 | * @return {number} Return value usable by Array.prototype.sort().
|
4002 | */
|
4003 | function mountOrderComparator(c1, c2) {
|
4004 | return c1._mountOrder - c2._mountOrder;
|
4005 | }
|
4006 |
|
4007 | function runBatchedUpdates(transaction) {
|
4008 | var len = transaction.dirtyComponentsLength;
|
4009 | !(len === dirtyComponents.length) ? reactProdInvariant_1('124', len, dirtyComponents.length) : void 0;
|
4010 |
|
4011 | // Since reconciling a component higher in the owner hierarchy usually (not
|
4012 | // always -- see shouldComponentUpdate()) will reconcile children, reconcile
|
4013 | // them before their children by sorting the array.
|
4014 | dirtyComponents.sort(mountOrderComparator);
|
4015 |
|
4016 | // Any updates enqueued while reconciling must be performed after this entire
|
4017 | // batch. Otherwise, if dirtyComponents is [A, B] where A has children B and
|
4018 | // C, B could update twice in a single batch if C's render enqueues an update
|
4019 | // to B (since B would have already updated, we should skip it, and the only
|
4020 | // way we can know to do so is by checking the batch counter).
|
4021 | updateBatchNumber++;
|
4022 |
|
4023 | for (var i = 0; i < len; i++) {
|
4024 | // If a component is unmounted before pending changes apply, it will still
|
4025 | // be here, but we assume that it has cleared its _pendingCallbacks and
|
4026 | // that performUpdateIfNecessary is a noop.
|
4027 | var component = dirtyComponents[i];
|
4028 |
|
4029 | // If performUpdateIfNecessary happens to enqueue any new updates, we
|
4030 | // shouldn't execute the callbacks until the next render happens, so
|
4031 | // stash the callbacks first
|
4032 | var callbacks = component._pendingCallbacks;
|
4033 | component._pendingCallbacks = null;
|
4034 |
|
4035 | var markerName;
|
4036 | if (ReactFeatureFlags_1.logTopLevelRenders) {
|
4037 | var namedComponent = component;
|
4038 | // Duck type TopLevelWrapper. This is probably always true.
|
4039 | if (component._currentElement.type.isReactTopLevelWrapper) {
|
4040 | namedComponent = component._renderedComponent;
|
4041 | }
|
4042 | markerName = 'React update: ' + namedComponent.getName();
|
4043 | console.time(markerName);
|
4044 | }
|
4045 |
|
4046 | ReactReconciler_1.performUpdateIfNecessary(component, transaction.reconcileTransaction, updateBatchNumber);
|
4047 |
|
4048 | if (markerName) {
|
4049 | console.timeEnd(markerName);
|
4050 | }
|
4051 |
|
4052 | if (callbacks) {
|
4053 | for (var j = 0; j < callbacks.length; j++) {
|
4054 | transaction.callbackQueue.enqueue(callbacks[j], component.getPublicInstance());
|
4055 | }
|
4056 | }
|
4057 | }
|
4058 | }
|
4059 |
|
4060 | var flushBatchedUpdates = function () {
|
4061 | // ReactUpdatesFlushTransaction's wrappers will clear the dirtyComponents
|
4062 | // array and perform any updates enqueued by mount-ready handlers (i.e.,
|
4063 | // componentDidUpdate) but we need to check here too in order to catch
|
4064 | // updates enqueued by setState callbacks and asap calls.
|
4065 | while (dirtyComponents.length || asapEnqueued) {
|
4066 | if (dirtyComponents.length) {
|
4067 | var transaction = ReactUpdatesFlushTransaction.getPooled();
|
4068 | transaction.perform(runBatchedUpdates, null, transaction);
|
4069 | ReactUpdatesFlushTransaction.release(transaction);
|
4070 | }
|
4071 |
|
4072 | if (asapEnqueued) {
|
4073 | asapEnqueued = false;
|
4074 | var queue = asapCallbackQueue;
|
4075 | asapCallbackQueue = CallbackQueue_1.getPooled();
|
4076 | queue.notifyAll();
|
4077 | CallbackQueue_1.release(queue);
|
4078 | }
|
4079 | }
|
4080 | };
|
4081 |
|
4082 | /**
|
4083 | * Mark a component as needing a rerender, adding an optional callback to a
|
4084 | * list of functions which will be executed once the rerender occurs.
|
4085 | */
|
4086 | function enqueueUpdate(component) {
|
4087 | ensureInjected();
|
4088 |
|
4089 | // Various parts of our code (such as ReactCompositeComponent's
|
4090 | // _renderValidatedComponent) assume that calls to render aren't nested;
|
4091 | // verify that that's the case. (This is called by each top-level update
|
4092 | // function, like setState, forceUpdate, etc.; creation and
|
4093 | // destruction of top-level components is guarded in ReactMount.)
|
4094 |
|
4095 | if (!batchingStrategy.isBatchingUpdates) {
|
4096 | batchingStrategy.batchedUpdates(enqueueUpdate, component);
|
4097 | return;
|
4098 | }
|
4099 |
|
4100 | dirtyComponents.push(component);
|
4101 | if (component._updateBatchNumber == null) {
|
4102 | component._updateBatchNumber = updateBatchNumber + 1;
|
4103 | }
|
4104 | }
|
4105 |
|
4106 | /**
|
4107 | * Enqueue a callback to be run at the end of the current batching cycle. Throws
|
4108 | * if no updates are currently being performed.
|
4109 | */
|
4110 | function asap(callback, context) {
|
4111 | !batchingStrategy.isBatchingUpdates ? reactProdInvariant_1('125') : void 0;
|
4112 | asapCallbackQueue.enqueue(callback, context);
|
4113 | asapEnqueued = true;
|
4114 | }
|
4115 |
|
4116 | var ReactUpdatesInjection = {
|
4117 | injectReconcileTransaction: function (ReconcileTransaction) {
|
4118 | !ReconcileTransaction ? reactProdInvariant_1('126') : void 0;
|
4119 | ReactUpdates.ReactReconcileTransaction = ReconcileTransaction;
|
4120 | },
|
4121 |
|
4122 | injectBatchingStrategy: function (_batchingStrategy) {
|
4123 | !_batchingStrategy ? reactProdInvariant_1('127') : void 0;
|
4124 | !(typeof _batchingStrategy.batchedUpdates === 'function') ? reactProdInvariant_1('128') : void 0;
|
4125 | !(typeof _batchingStrategy.isBatchingUpdates === 'boolean') ? reactProdInvariant_1('129') : void 0;
|
4126 | batchingStrategy = _batchingStrategy;
|
4127 | }
|
4128 | };
|
4129 |
|
4130 | var ReactUpdates = {
|
4131 | /**
|
4132 | * React references `ReactReconcileTransaction` using this property in order
|
4133 | * to allow dependency injection.
|
4134 | *
|
4135 | * @internal
|
4136 | */
|
4137 | ReactReconcileTransaction: null,
|
4138 |
|
4139 | batchedUpdates: batchedUpdates,
|
4140 | enqueueUpdate: enqueueUpdate,
|
4141 | flushBatchedUpdates: flushBatchedUpdates,
|
4142 | injection: ReactUpdatesInjection,
|
4143 | asap: asap
|
4144 | };
|
4145 |
|
4146 | var ReactUpdates_1 = ReactUpdates;
|
4147 |
|
4148 | function isCheckable(elem) {
|
4149 | var type = elem.type;
|
4150 | var nodeName = elem.nodeName;
|
4151 | return nodeName && nodeName.toLowerCase() === 'input' && (type === 'checkbox' || type === 'radio');
|
4152 | }
|
4153 |
|
4154 | function getTracker(inst) {
|
4155 | return inst._wrapperState.valueTracker;
|
4156 | }
|
4157 |
|
4158 | function attachTracker(inst, tracker) {
|
4159 | inst._wrapperState.valueTracker = tracker;
|
4160 | }
|
4161 |
|
4162 | function detachTracker(inst) {
|
4163 | delete inst._wrapperState.valueTracker;
|
4164 | }
|
4165 |
|
4166 | function getValueFromNode(node) {
|
4167 | var value;
|
4168 | if (node) {
|
4169 | value = isCheckable(node) ? '' + node.checked : node.value;
|
4170 | }
|
4171 | return value;
|
4172 | }
|
4173 |
|
4174 | var inputValueTracking = {
|
4175 | // exposed for testing
|
4176 | _getTrackerFromNode: function (node) {
|
4177 | return getTracker(ReactDOMComponentTree_1.getInstanceFromNode(node));
|
4178 | },
|
4179 |
|
4180 |
|
4181 | track: function (inst) {
|
4182 | if (getTracker(inst)) {
|
4183 | return;
|
4184 | }
|
4185 |
|
4186 | var node = ReactDOMComponentTree_1.getNodeFromInstance(inst);
|
4187 | var valueField = isCheckable(node) ? 'checked' : 'value';
|
4188 | var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField);
|
4189 |
|
4190 | var currentValue = '' + node[valueField];
|
4191 |
|
4192 | // if someone has already defined a value or Safari, then bail
|
4193 | // and don't track value will cause over reporting of changes,
|
4194 | // but it's better then a hard failure
|
4195 | // (needed for certain tests that spyOn input values and Safari)
|
4196 | if (node.hasOwnProperty(valueField) || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') {
|
4197 | return;
|
4198 | }
|
4199 |
|
4200 | Object.defineProperty(node, valueField, {
|
4201 | enumerable: descriptor.enumerable,
|
4202 | configurable: true,
|
4203 | get: function () {
|
4204 | return descriptor.get.call(this);
|
4205 | },
|
4206 | set: function (value) {
|
4207 | currentValue = '' + value;
|
4208 | descriptor.set.call(this, value);
|
4209 | }
|
4210 | });
|
4211 |
|
4212 | attachTracker(inst, {
|
4213 | getValue: function () {
|
4214 | return currentValue;
|
4215 | },
|
4216 | setValue: function (value) {
|
4217 | currentValue = '' + value;
|
4218 | },
|
4219 | stopTracking: function () {
|
4220 | detachTracker(inst);
|
4221 | delete node[valueField];
|
4222 | }
|
4223 | });
|
4224 | },
|
4225 |
|
4226 | updateValueIfChanged: function (inst) {
|
4227 | if (!inst) {
|
4228 | return false;
|
4229 | }
|
4230 | var tracker = getTracker(inst);
|
4231 |
|
4232 | if (!tracker) {
|
4233 | inputValueTracking.track(inst);
|
4234 | return true;
|
4235 | }
|
4236 |
|
4237 | var lastValue = tracker.getValue();
|
4238 | var nextValue = getValueFromNode(ReactDOMComponentTree_1.getNodeFromInstance(inst));
|
4239 |
|
4240 | if (nextValue !== lastValue) {
|
4241 | tracker.setValue(nextValue);
|
4242 | return true;
|
4243 | }
|
4244 |
|
4245 | return false;
|
4246 | },
|
4247 | stopTracking: function (inst) {
|
4248 | var tracker = getTracker(inst);
|
4249 | if (tracker) {
|
4250 | tracker.stopTracking();
|
4251 | }
|
4252 | }
|
4253 | };
|
4254 |
|
4255 | var inputValueTracking_1 = inputValueTracking;
|
4256 |
|
4257 | /**
|
4258 | * Copyright 2013-present, Facebook, Inc.
|
4259 | * All rights reserved.
|
4260 | *
|
4261 | * This source code is licensed under the BSD-style license found in the
|
4262 | * LICENSE file in the root directory of this source tree. An additional grant
|
4263 | * of patent rights can be found in the PATENTS file in the same directory.
|
4264 | *
|
4265 | */
|
4266 |
|
4267 | /**
|
4268 | * Gets the target node from a native browser event by accounting for
|
4269 | * inconsistencies in browser DOM APIs.
|
4270 | *
|
4271 | * @param {object} nativeEvent Native browser event.
|
4272 | * @return {DOMEventTarget} Target node.
|
4273 | */
|
4274 |
|
4275 | function getEventTarget(nativeEvent) {
|
4276 | var target = nativeEvent.target || nativeEvent.srcElement || window;
|
4277 |
|
4278 | // Normalize SVG <use> element events #4963
|
4279 | if (target.correspondingUseElement) {
|
4280 | target = target.correspondingUseElement;
|
4281 | }
|
4282 |
|
4283 | // Safari may fire events on text nodes (Node.TEXT_NODE is 3).
|
4284 | // @see http://www.quirksmode.org/js/events_properties.html
|
4285 | return target.nodeType === 3 ? target.parentNode : target;
|
4286 | }
|
4287 |
|
4288 | var getEventTarget_1 = getEventTarget;
|
4289 |
|
4290 | var useHasFeature;
|
4291 | if (ExecutionEnvironment_1.canUseDOM) {
|
4292 | useHasFeature = document.implementation && document.implementation.hasFeature &&
|
4293 | // always returns true in newer browsers as per the standard.
|
4294 | // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature
|
4295 | document.implementation.hasFeature('', '') !== true;
|
4296 | }
|
4297 |
|
4298 | /**
|
4299 | * Checks if an event is supported in the current execution environment.
|
4300 | *
|
4301 | * NOTE: This will not work correctly for non-generic events such as `change`,
|
4302 | * `reset`, `load`, `error`, and `select`.
|
4303 | *
|
4304 | * Borrows from Modernizr.
|
4305 | *
|
4306 | * @param {string} eventNameSuffix Event name, e.g. "click".
|
4307 | * @param {?boolean} capture Check if the capture phase is supported.
|
4308 | * @return {boolean} True if the event is supported.
|
4309 | * @internal
|
4310 | * @license Modernizr 3.0.0pre (Custom Build) | MIT
|
4311 | */
|
4312 | function isEventSupported(eventNameSuffix, capture) {
|
4313 | if (!ExecutionEnvironment_1.canUseDOM || capture && !('addEventListener' in document)) {
|
4314 | return false;
|
4315 | }
|
4316 |
|
4317 | var eventName = 'on' + eventNameSuffix;
|
4318 | var isSupported = eventName in document;
|
4319 |
|
4320 | if (!isSupported) {
|
4321 | var element = document.createElement('div');
|
4322 | element.setAttribute(eventName, 'return;');
|
4323 | isSupported = typeof element[eventName] === 'function';
|
4324 | }
|
4325 |
|
4326 | if (!isSupported && useHasFeature && eventNameSuffix === 'wheel') {
|
4327 | // This is the only way to test support for the `wheel` event in IE9+.
|
4328 | isSupported = document.implementation.hasFeature('Events.wheel', '3.0');
|
4329 | }
|
4330 |
|
4331 | return isSupported;
|
4332 | }
|
4333 |
|
4334 | var isEventSupported_1 = isEventSupported;
|
4335 |
|
4336 | /**
|
4337 | * Copyright 2013-present, Facebook, Inc.
|
4338 | * All rights reserved.
|
4339 | *
|
4340 | * This source code is licensed under the BSD-style license found in the
|
4341 | * LICENSE file in the root directory of this source tree. An additional grant
|
4342 | * of patent rights can be found in the PATENTS file in the same directory.
|
4343 | *
|
4344 | *
|
4345 | */
|
4346 |
|
4347 | /**
|
4348 | * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary
|
4349 | */
|
4350 |
|
4351 | var supportedInputTypes = {
|
4352 | color: true,
|
4353 | date: true,
|
4354 | datetime: true,
|
4355 | 'datetime-local': true,
|
4356 | email: true,
|
4357 | month: true,
|
4358 | number: true,
|
4359 | password: true,
|
4360 | range: true,
|
4361 | search: true,
|
4362 | tel: true,
|
4363 | text: true,
|
4364 | time: true,
|
4365 | url: true,
|
4366 | week: true
|
4367 | };
|
4368 |
|
4369 | function isTextInputElement(elem) {
|
4370 | var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
|
4371 |
|
4372 | if (nodeName === 'input') {
|
4373 | return !!supportedInputTypes[elem.type];
|
4374 | }
|
4375 |
|
4376 | if (nodeName === 'textarea') {
|
4377 | return true;
|
4378 | }
|
4379 |
|
4380 | return false;
|
4381 | }
|
4382 |
|
4383 | var isTextInputElement_1 = isTextInputElement;
|
4384 |
|
4385 | var eventTypes$1 = {
|
4386 | change: {
|
4387 | phasedRegistrationNames: {
|
4388 | bubbled: 'onChange',
|
4389 | captured: 'onChangeCapture'
|
4390 | },
|
4391 | dependencies: ['topBlur', 'topChange', 'topClick', 'topFocus', 'topInput', 'topKeyDown', 'topKeyUp', 'topSelectionChange']
|
4392 | }
|
4393 | };
|
4394 |
|
4395 | function createAndAccumulateChangeEvent(inst, nativeEvent, target) {
|
4396 | var event = SyntheticEvent_1.getPooled(eventTypes$1.change, inst, nativeEvent, target);
|
4397 | event.type = 'change';
|
4398 | EventPropagators_1.accumulateTwoPhaseDispatches(event);
|
4399 | return event;
|
4400 | }
|
4401 | /**
|
4402 | * For IE shims
|
4403 | */
|
4404 | var activeElement = null;
|
4405 | var activeElementInst = null;
|
4406 |
|
4407 | /**
|
4408 | * SECTION: handle `change` event
|
4409 | */
|
4410 | function shouldUseChangeEvent(elem) {
|
4411 | var nodeName = elem.nodeName && elem.nodeName.toLowerCase();
|
4412 | return nodeName === 'select' || nodeName === 'input' && elem.type === 'file';
|
4413 | }
|
4414 |
|
4415 | var doesChangeEventBubble = false;
|
4416 | if (ExecutionEnvironment_1.canUseDOM) {
|
4417 | // See `handleChange` comment below
|
4418 | doesChangeEventBubble = isEventSupported_1('change') && (!document.documentMode || document.documentMode > 8);
|
4419 | }
|
4420 |
|
4421 | function manualDispatchChangeEvent(nativeEvent) {
|
4422 | var event = createAndAccumulateChangeEvent(activeElementInst, nativeEvent, getEventTarget_1(nativeEvent));
|
4423 |
|
4424 | // If change and propertychange bubbled, we'd just bind to it like all the
|
4425 | // other events and have it go through ReactBrowserEventEmitter. Since it
|
4426 | // doesn't, we manually listen for the events and so we have to enqueue and
|
4427 | // process the abstract event manually.
|
4428 | //
|
4429 | // Batching is necessary here in order to ensure that all event handlers run
|
4430 | // before the next rerender (including event handlers attached to ancestor
|
4431 | // elements instead of directly on the input). Without this, controlled
|
4432 | // components don't work properly in conjunction with event bubbling because
|
4433 | // the component is rerendered and the value reverted before all the event
|
4434 | // handlers can run. See https://github.com/facebook/react/issues/708.
|
4435 | ReactUpdates_1.batchedUpdates(runEventInBatch, event);
|
4436 | }
|
4437 |
|
4438 | function runEventInBatch(event) {
|
4439 | EventPluginHub_1.enqueueEvents(event);
|
4440 | EventPluginHub_1.processEventQueue(false);
|
4441 | }
|
4442 |
|
4443 | function startWatchingForChangeEventIE8(target, targetInst) {
|
4444 | activeElement = target;
|
4445 | activeElementInst = targetInst;
|
4446 | activeElement.attachEvent('onchange', manualDispatchChangeEvent);
|
4447 | }
|
4448 |
|
4449 | function stopWatchingForChangeEventIE8() {
|
4450 | if (!activeElement) {
|
4451 | return;
|
4452 | }
|
4453 | activeElement.detachEvent('onchange', manualDispatchChangeEvent);
|
4454 | activeElement = null;
|
4455 | activeElementInst = null;
|
4456 | }
|
4457 |
|
4458 | function getInstIfValueChanged(targetInst, nativeEvent) {
|
4459 | var updated = inputValueTracking_1.updateValueIfChanged(targetInst);
|
4460 | var simulated = nativeEvent.simulated === true && ChangeEventPlugin._allowSimulatedPassThrough;
|
4461 |
|
4462 | if (updated || simulated) {
|
4463 | return targetInst;
|
4464 | }
|
4465 | }
|
4466 |
|
4467 | function getTargetInstForChangeEvent(topLevelType, targetInst) {
|
4468 | if (topLevelType === 'topChange') {
|
4469 | return targetInst;
|
4470 | }
|
4471 | }
|
4472 |
|
4473 | function handleEventsForChangeEventIE8(topLevelType, target, targetInst) {
|
4474 | if (topLevelType === 'topFocus') {
|
4475 | // stopWatching() should be a noop here but we call it just in case we
|
4476 | // missed a blur event somehow.
|
4477 | stopWatchingForChangeEventIE8();
|
4478 | startWatchingForChangeEventIE8(target, targetInst);
|
4479 | } else if (topLevelType === 'topBlur') {
|
4480 | stopWatchingForChangeEventIE8();
|
4481 | }
|
4482 | }
|
4483 |
|
4484 | /**
|
4485 | * SECTION: handle `input` event
|
4486 | */
|
4487 | var isInputEventSupported = false;
|
4488 | if (ExecutionEnvironment_1.canUseDOM) {
|
4489 | // IE9 claims to support the input event but fails to trigger it when
|
4490 | // deleting text, so we ignore its input events.
|
4491 |
|
4492 | isInputEventSupported = isEventSupported_1('input') && (!('documentMode' in document) || document.documentMode > 9);
|
4493 | }
|
4494 |
|
4495 | /**
|
4496 | * (For IE <=9) Starts tracking propertychange events on the passed-in element
|
4497 | * and override the value property so that we can distinguish user events from
|
4498 | * value changes in JS.
|
4499 | */
|
4500 | function startWatchingForValueChange(target, targetInst) {
|
4501 | activeElement = target;
|
4502 | activeElementInst = targetInst;
|
4503 | activeElement.attachEvent('onpropertychange', handlePropertyChange);
|
4504 | }
|
4505 |
|
4506 | /**
|
4507 | * (For IE <=9) Removes the event listeners from the currently-tracked element,
|
4508 | * if any exists.
|
4509 | */
|
4510 | function stopWatchingForValueChange() {
|
4511 | if (!activeElement) {
|
4512 | return;
|
4513 | }
|
4514 | activeElement.detachEvent('onpropertychange', handlePropertyChange);
|
4515 |
|
4516 | activeElement = null;
|
4517 | activeElementInst = null;
|
4518 | }
|
4519 |
|
4520 | /**
|
4521 | * (For IE <=9) Handles a propertychange event, sending a `change` event if
|
4522 | * the value of the active element has changed.
|
4523 | */
|
4524 | function handlePropertyChange(nativeEvent) {
|
4525 | if (nativeEvent.propertyName !== 'value') {
|
4526 | return;
|
4527 | }
|
4528 | if (getInstIfValueChanged(activeElementInst, nativeEvent)) {
|
4529 | manualDispatchChangeEvent(nativeEvent);
|
4530 | }
|
4531 | }
|
4532 |
|
4533 | function handleEventsForInputEventPolyfill(topLevelType, target, targetInst) {
|
4534 | if (topLevelType === 'topFocus') {
|
4535 | // In IE8, we can capture almost all .value changes by adding a
|
4536 | // propertychange handler and looking for events with propertyName
|
4537 | // equal to 'value'
|
4538 | // In IE9, propertychange fires for most input events but is buggy and
|
4539 | // doesn't fire when text is deleted, but conveniently, selectionchange
|
4540 | // appears to fire in all of the remaining cases so we catch those and
|
4541 | // forward the event if the value has changed
|
4542 | // In either case, we don't want to call the event handler if the value
|
4543 | // is changed from JS so we redefine a setter for `.value` that updates
|
4544 | // our activeElementValue variable, allowing us to ignore those changes
|
4545 | //
|
4546 | // stopWatching() should be a noop here but we call it just in case we
|
4547 | // missed a blur event somehow.
|
4548 | stopWatchingForValueChange();
|
4549 | startWatchingForValueChange(target, targetInst);
|
4550 | } else if (topLevelType === 'topBlur') {
|
4551 | stopWatchingForValueChange();
|
4552 | }
|
4553 | }
|
4554 |
|
4555 | // For IE8 and IE9.
|
4556 | function getTargetInstForInputEventPolyfill(topLevelType, targetInst, nativeEvent) {
|
4557 | if (topLevelType === 'topSelectionChange' || topLevelType === 'topKeyUp' || topLevelType === 'topKeyDown') {
|
4558 | // On the selectionchange event, the target is just document which isn't
|
4559 | // helpful for us so just check activeElement instead.
|
4560 | //
|
4561 | // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire
|
4562 | // propertychange on the first input event after setting `value` from a
|
4563 | // script and fires only keydown, keypress, keyup. Catching keyup usually
|
4564 | // gets it and catching keydown lets us fire an event for the first
|
4565 | // keystroke if user does a key repeat (it'll be a little delayed: right
|
4566 | // before the second keystroke). Other input methods (e.g., paste) seem to
|
4567 | // fire selectionchange normally.
|
4568 | return getInstIfValueChanged(activeElementInst, nativeEvent);
|
4569 | }
|
4570 | }
|
4571 |
|
4572 | /**
|
4573 | * SECTION: handle `click` event
|
4574 | */
|
4575 | function shouldUseClickEvent(elem) {
|
4576 | // Use the `click` event to detect changes to checkbox and radio inputs.
|
4577 | // This approach works across all browsers, whereas `change` does not fire
|
4578 | // until `blur` in IE8.
|
4579 | var nodeName = elem.nodeName;
|
4580 | return nodeName && nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio');
|
4581 | }
|
4582 |
|
4583 | function getTargetInstForClickEvent(topLevelType, targetInst, nativeEvent) {
|
4584 | if (topLevelType === 'topClick') {
|
4585 | return getInstIfValueChanged(targetInst, nativeEvent);
|
4586 | }
|
4587 | }
|
4588 |
|
4589 | function getTargetInstForInputOrChangeEvent(topLevelType, targetInst, nativeEvent) {
|
4590 | if (topLevelType === 'topInput' || topLevelType === 'topChange') {
|
4591 | return getInstIfValueChanged(targetInst, nativeEvent);
|
4592 | }
|
4593 | }
|
4594 |
|
4595 | function handleControlledInputBlur(inst, node) {
|
4596 | // TODO: In IE, inst is occasionally null. Why?
|
4597 | if (inst == null) {
|
4598 | return;
|
4599 | }
|
4600 |
|
4601 | // Fiber and ReactDOM keep wrapper state in separate places
|
4602 | var state = inst._wrapperState || node._wrapperState;
|
4603 |
|
4604 | if (!state || !state.controlled || node.type !== 'number') {
|
4605 | return;
|
4606 | }
|
4607 |
|
4608 | // If controlled, assign the value attribute to the current value on blur
|
4609 | var value = '' + node.value;
|
4610 | if (node.getAttribute('value') !== value) {
|
4611 | node.setAttribute('value', value);
|
4612 | }
|
4613 | }
|
4614 |
|
4615 | /**
|
4616 | * This plugin creates an `onChange` event that normalizes change events
|
4617 | * across form elements. This event fires at a time when it's possible to
|
4618 | * change the element's value without seeing a flicker.
|
4619 | *
|
4620 | * Supported elements are:
|
4621 | * - input (see `isTextInputElement`)
|
4622 | * - textarea
|
4623 | * - select
|
4624 | */
|
4625 | var ChangeEventPlugin = {
|
4626 | eventTypes: eventTypes$1,
|
4627 |
|
4628 | _allowSimulatedPassThrough: true,
|
4629 | _isInputEventSupported: isInputEventSupported,
|
4630 |
|
4631 | extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {
|
4632 | var targetNode = targetInst ? ReactDOMComponentTree_1.getNodeFromInstance(targetInst) : window;
|
4633 |
|
4634 | var getTargetInstFunc, handleEventFunc;
|
4635 | if (shouldUseChangeEvent(targetNode)) {
|
4636 | if (doesChangeEventBubble) {
|
4637 | getTargetInstFunc = getTargetInstForChangeEvent;
|
4638 | } else {
|
4639 | handleEventFunc = handleEventsForChangeEventIE8;
|
4640 | }
|
4641 | } else if (isTextInputElement_1(targetNode)) {
|
4642 | if (isInputEventSupported) {
|
4643 | getTargetInstFunc = getTargetInstForInputOrChangeEvent;
|
4644 | } else {
|
4645 | getTargetInstFunc = getTargetInstForInputEventPolyfill;
|
4646 | handleEventFunc = handleEventsForInputEventPolyfill;
|
4647 | }
|
4648 | } else if (shouldUseClickEvent(targetNode)) {
|
4649 | getTargetInstFunc = getTargetInstForClickEvent;
|
4650 | }
|
4651 |
|
4652 | if (getTargetInstFunc) {
|
4653 | var inst = getTargetInstFunc(topLevelType, targetInst, nativeEvent);
|
4654 | if (inst) {
|
4655 | var event = createAndAccumulateChangeEvent(inst, nativeEvent, nativeEventTarget);
|
4656 | return event;
|
4657 | }
|
4658 | }
|
4659 |
|
4660 | if (handleEventFunc) {
|
4661 | handleEventFunc(topLevelType, targetNode, targetInst);
|
4662 | }
|
4663 |
|
4664 | // When blurring, set the value attribute for number inputs
|
4665 | if (topLevelType === 'topBlur') {
|
4666 | handleControlledInputBlur(targetInst, targetNode);
|
4667 | }
|
4668 | }
|
4669 | };
|
4670 |
|
4671 | var ChangeEventPlugin_1 = ChangeEventPlugin;
|
4672 |
|
4673 | /**
|
4674 | * Copyright 2013-present, Facebook, Inc.
|
4675 | * All rights reserved.
|
4676 | *
|
4677 | * This source code is licensed under the BSD-style license found in the
|
4678 | * LICENSE file in the root directory of this source tree. An additional grant
|
4679 | * of patent rights can be found in the PATENTS file in the same directory.
|
4680 | *
|
4681 | */
|
4682 |
|
4683 | /**
|
4684 | * Module that is injectable into `EventPluginHub`, that specifies a
|
4685 | * deterministic ordering of `EventPlugin`s. A convenient way to reason about
|
4686 | * plugins, without having to package every one of them. This is better than
|
4687 | * having plugins be ordered in the same order that they are injected because
|
4688 | * that ordering would be influenced by the packaging order.
|
4689 | * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that
|
4690 | * preventing default on events is convenient in `SimpleEventPlugin` handlers.
|
4691 | */
|
4692 |
|
4693 | var DefaultEventPluginOrder = ['ResponderEventPlugin', 'SimpleEventPlugin', 'TapEventPlugin', 'EnterLeaveEventPlugin', 'ChangeEventPlugin', 'SelectEventPlugin', 'BeforeInputEventPlugin'];
|
4694 |
|
4695 | var DefaultEventPluginOrder_1 = DefaultEventPluginOrder;
|
4696 |
|
4697 | /**
|
4698 | * @interface UIEvent
|
4699 | * @see http://www.w3.org/TR/DOM-Level-3-Events/
|
4700 | */
|
4701 | var UIEventInterface = {
|
4702 | view: function (event) {
|
4703 | if (event.view) {
|
4704 | return event.view;
|
4705 | }
|
4706 |
|
4707 | var target = getEventTarget_1(event);
|
4708 | if (target.window === target) {
|
4709 | // target is a window object
|
4710 | return target;
|
4711 | }
|
4712 |
|
4713 | var doc = target.ownerDocument;
|
4714 | // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.
|
4715 | if (doc) {
|
4716 | return doc.defaultView || doc.parentWindow;
|
4717 | } else {
|
4718 | return window;
|
4719 | }
|
4720 | },
|
4721 | detail: function (event) {
|
4722 | return event.detail || 0;
|
4723 | }
|
4724 | };
|
4725 |
|
4726 | /**
|
4727 | * @param {object} dispatchConfig Configuration used to dispatch this event.
|
4728 | * @param {string} dispatchMarker Marker identifying the event target.
|
4729 | * @param {object} nativeEvent Native browser event.
|
4730 | * @extends {SyntheticEvent}
|
4731 | */
|
4732 | function SyntheticUIEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
4733 | return SyntheticEvent_1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
4734 | }
|
4735 |
|
4736 | SyntheticEvent_1.augmentClass(SyntheticUIEvent, UIEventInterface);
|
4737 |
|
4738 | var SyntheticUIEvent_1 = SyntheticUIEvent;
|
4739 |
|
4740 | /**
|
4741 | * Copyright 2013-present, Facebook, Inc.
|
4742 | * All rights reserved.
|
4743 | *
|
4744 | * This source code is licensed under the BSD-style license found in the
|
4745 | * LICENSE file in the root directory of this source tree. An additional grant
|
4746 | * of patent rights can be found in the PATENTS file in the same directory.
|
4747 | *
|
4748 | */
|
4749 |
|
4750 | var ViewportMetrics = {
|
4751 | currentScrollLeft: 0,
|
4752 |
|
4753 | currentScrollTop: 0,
|
4754 |
|
4755 | refreshScrollValues: function (scrollPosition) {
|
4756 | ViewportMetrics.currentScrollLeft = scrollPosition.x;
|
4757 | ViewportMetrics.currentScrollTop = scrollPosition.y;
|
4758 | }
|
4759 | };
|
4760 |
|
4761 | var ViewportMetrics_1 = ViewportMetrics;
|
4762 |
|
4763 | /**
|
4764 | * Copyright 2013-present, Facebook, Inc.
|
4765 | * All rights reserved.
|
4766 | *
|
4767 | * This source code is licensed under the BSD-style license found in the
|
4768 | * LICENSE file in the root directory of this source tree. An additional grant
|
4769 | * of patent rights can be found in the PATENTS file in the same directory.
|
4770 | *
|
4771 | */
|
4772 |
|
4773 | /**
|
4774 | * Translation from modifier key to the associated property in the event.
|
4775 | * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers
|
4776 | */
|
4777 |
|
4778 | var modifierKeyToProp = {
|
4779 | Alt: 'altKey',
|
4780 | Control: 'ctrlKey',
|
4781 | Meta: 'metaKey',
|
4782 | Shift: 'shiftKey'
|
4783 | };
|
4784 |
|
4785 | // IE8 does not implement getModifierState so we simply map it to the only
|
4786 | // modifier keys exposed by the event itself, does not support Lock-keys.
|
4787 | // Currently, all major browsers except Chrome seems to support Lock-keys.
|
4788 | function modifierStateGetter(keyArg) {
|
4789 | var syntheticEvent = this;
|
4790 | var nativeEvent = syntheticEvent.nativeEvent;
|
4791 | if (nativeEvent.getModifierState) {
|
4792 | return nativeEvent.getModifierState(keyArg);
|
4793 | }
|
4794 | var keyProp = modifierKeyToProp[keyArg];
|
4795 | return keyProp ? !!nativeEvent[keyProp] : false;
|
4796 | }
|
4797 |
|
4798 | function getEventModifierState(nativeEvent) {
|
4799 | return modifierStateGetter;
|
4800 | }
|
4801 |
|
4802 | var getEventModifierState_1 = getEventModifierState;
|
4803 |
|
4804 | /**
|
4805 | * @interface MouseEvent
|
4806 | * @see http://www.w3.org/TR/DOM-Level-3-Events/
|
4807 | */
|
4808 | var MouseEventInterface = {
|
4809 | screenX: null,
|
4810 | screenY: null,
|
4811 | clientX: null,
|
4812 | clientY: null,
|
4813 | ctrlKey: null,
|
4814 | shiftKey: null,
|
4815 | altKey: null,
|
4816 | metaKey: null,
|
4817 | getModifierState: getEventModifierState_1,
|
4818 | button: function (event) {
|
4819 | // Webkit, Firefox, IE9+
|
4820 | // which: 1 2 3
|
4821 | // button: 0 1 2 (standard)
|
4822 | var button = event.button;
|
4823 | if ('which' in event) {
|
4824 | return button;
|
4825 | }
|
4826 | // IE<9
|
4827 | // which: undefined
|
4828 | // button: 0 0 0
|
4829 | // button: 1 4 2 (onmouseup)
|
4830 | return button === 2 ? 2 : button === 4 ? 1 : 0;
|
4831 | },
|
4832 | buttons: null,
|
4833 | relatedTarget: function (event) {
|
4834 | return event.relatedTarget || (event.fromElement === event.srcElement ? event.toElement : event.fromElement);
|
4835 | },
|
4836 | // "Proprietary" Interface.
|
4837 | pageX: function (event) {
|
4838 | return 'pageX' in event ? event.pageX : event.clientX + ViewportMetrics_1.currentScrollLeft;
|
4839 | },
|
4840 | pageY: function (event) {
|
4841 | return 'pageY' in event ? event.pageY : event.clientY + ViewportMetrics_1.currentScrollTop;
|
4842 | }
|
4843 | };
|
4844 |
|
4845 | /**
|
4846 | * @param {object} dispatchConfig Configuration used to dispatch this event.
|
4847 | * @param {string} dispatchMarker Marker identifying the event target.
|
4848 | * @param {object} nativeEvent Native browser event.
|
4849 | * @extends {SyntheticUIEvent}
|
4850 | */
|
4851 | function SyntheticMouseEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
4852 | return SyntheticUIEvent_1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
4853 | }
|
4854 |
|
4855 | SyntheticUIEvent_1.augmentClass(SyntheticMouseEvent, MouseEventInterface);
|
4856 |
|
4857 | var SyntheticMouseEvent_1 = SyntheticMouseEvent;
|
4858 |
|
4859 | var eventTypes$2 = {
|
4860 | mouseEnter: {
|
4861 | registrationName: 'onMouseEnter',
|
4862 | dependencies: ['topMouseOut', 'topMouseOver']
|
4863 | },
|
4864 | mouseLeave: {
|
4865 | registrationName: 'onMouseLeave',
|
4866 | dependencies: ['topMouseOut', 'topMouseOver']
|
4867 | }
|
4868 | };
|
4869 |
|
4870 | var EnterLeaveEventPlugin = {
|
4871 | eventTypes: eventTypes$2,
|
4872 |
|
4873 | /**
|
4874 | * For almost every interaction we care about, there will be both a top-level
|
4875 | * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that
|
4876 | * we do not extract duplicate events. However, moving the mouse into the
|
4877 | * browser from outside will not fire a `mouseout` event. In this case, we use
|
4878 | * the `mouseover` top-level event.
|
4879 | */
|
4880 | extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {
|
4881 | if (topLevelType === 'topMouseOver' && (nativeEvent.relatedTarget || nativeEvent.fromElement)) {
|
4882 | return null;
|
4883 | }
|
4884 | if (topLevelType !== 'topMouseOut' && topLevelType !== 'topMouseOver') {
|
4885 | // Must not be a mouse in or mouse out - ignoring.
|
4886 | return null;
|
4887 | }
|
4888 |
|
4889 | var win;
|
4890 | if (nativeEventTarget.window === nativeEventTarget) {
|
4891 | // `nativeEventTarget` is probably a window object.
|
4892 | win = nativeEventTarget;
|
4893 | } else {
|
4894 | // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.
|
4895 | var doc = nativeEventTarget.ownerDocument;
|
4896 | if (doc) {
|
4897 | win = doc.defaultView || doc.parentWindow;
|
4898 | } else {
|
4899 | win = window;
|
4900 | }
|
4901 | }
|
4902 |
|
4903 | var from;
|
4904 | var to;
|
4905 | if (topLevelType === 'topMouseOut') {
|
4906 | from = targetInst;
|
4907 | var related = nativeEvent.relatedTarget || nativeEvent.toElement;
|
4908 | to = related ? ReactDOMComponentTree_1.getClosestInstanceFromNode(related) : null;
|
4909 | } else {
|
4910 | // Moving to a node from outside the window.
|
4911 | from = null;
|
4912 | to = targetInst;
|
4913 | }
|
4914 |
|
4915 | if (from === to) {
|
4916 | // Nothing pertains to our managed components.
|
4917 | return null;
|
4918 | }
|
4919 |
|
4920 | var fromNode = from == null ? win : ReactDOMComponentTree_1.getNodeFromInstance(from);
|
4921 | var toNode = to == null ? win : ReactDOMComponentTree_1.getNodeFromInstance(to);
|
4922 |
|
4923 | var leave = SyntheticMouseEvent_1.getPooled(eventTypes$2.mouseLeave, from, nativeEvent, nativeEventTarget);
|
4924 | leave.type = 'mouseleave';
|
4925 | leave.target = fromNode;
|
4926 | leave.relatedTarget = toNode;
|
4927 |
|
4928 | var enter = SyntheticMouseEvent_1.getPooled(eventTypes$2.mouseEnter, to, nativeEvent, nativeEventTarget);
|
4929 | enter.type = 'mouseenter';
|
4930 | enter.target = toNode;
|
4931 | enter.relatedTarget = fromNode;
|
4932 |
|
4933 | EventPropagators_1.accumulateEnterLeaveDispatches(leave, enter, from, to);
|
4934 |
|
4935 | return [leave, enter];
|
4936 | }
|
4937 | };
|
4938 |
|
4939 | var EnterLeaveEventPlugin_1 = EnterLeaveEventPlugin;
|
4940 |
|
4941 | var MUST_USE_PROPERTY = DOMProperty_1.injection.MUST_USE_PROPERTY;
|
4942 | var HAS_BOOLEAN_VALUE = DOMProperty_1.injection.HAS_BOOLEAN_VALUE;
|
4943 | var HAS_NUMERIC_VALUE = DOMProperty_1.injection.HAS_NUMERIC_VALUE;
|
4944 | var HAS_POSITIVE_NUMERIC_VALUE = DOMProperty_1.injection.HAS_POSITIVE_NUMERIC_VALUE;
|
4945 | var HAS_OVERLOADED_BOOLEAN_VALUE = DOMProperty_1.injection.HAS_OVERLOADED_BOOLEAN_VALUE;
|
4946 |
|
4947 | var HTMLDOMPropertyConfig = {
|
4948 | isCustomAttribute: RegExp.prototype.test.bind(new RegExp('^(data|aria)-[' + DOMProperty_1.ATTRIBUTE_NAME_CHAR + ']*$')),
|
4949 | Properties: {
|
4950 | /**
|
4951 | * Standard Properties
|
4952 | */
|
4953 | accept: 0,
|
4954 | acceptCharset: 0,
|
4955 | accessKey: 0,
|
4956 | action: 0,
|
4957 | allowFullScreen: HAS_BOOLEAN_VALUE,
|
4958 | allowTransparency: 0,
|
4959 | alt: 0,
|
4960 | // specifies target context for links with `preload` type
|
4961 | as: 0,
|
4962 | async: HAS_BOOLEAN_VALUE,
|
4963 | autoComplete: 0,
|
4964 | // autoFocus is polyfilled/normalized by AutoFocusUtils
|
4965 | // autoFocus: HAS_BOOLEAN_VALUE,
|
4966 | autoPlay: HAS_BOOLEAN_VALUE,
|
4967 | capture: HAS_BOOLEAN_VALUE,
|
4968 | cellPadding: 0,
|
4969 | cellSpacing: 0,
|
4970 | charSet: 0,
|
4971 | challenge: 0,
|
4972 | checked: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
|
4973 | cite: 0,
|
4974 | classID: 0,
|
4975 | className: 0,
|
4976 | cols: HAS_POSITIVE_NUMERIC_VALUE,
|
4977 | colSpan: 0,
|
4978 | content: 0,
|
4979 | contentEditable: 0,
|
4980 | contextMenu: 0,
|
4981 | controls: HAS_BOOLEAN_VALUE,
|
4982 | coords: 0,
|
4983 | crossOrigin: 0,
|
4984 | data: 0, // For `<object />` acts as `src`.
|
4985 | dateTime: 0,
|
4986 | 'default': HAS_BOOLEAN_VALUE,
|
4987 | defer: HAS_BOOLEAN_VALUE,
|
4988 | dir: 0,
|
4989 | disabled: HAS_BOOLEAN_VALUE,
|
4990 | download: HAS_OVERLOADED_BOOLEAN_VALUE,
|
4991 | draggable: 0,
|
4992 | encType: 0,
|
4993 | form: 0,
|
4994 | formAction: 0,
|
4995 | formEncType: 0,
|
4996 | formMethod: 0,
|
4997 | formNoValidate: HAS_BOOLEAN_VALUE,
|
4998 | formTarget: 0,
|
4999 | frameBorder: 0,
|
5000 | headers: 0,
|
5001 | height: 0,
|
5002 | hidden: HAS_BOOLEAN_VALUE,
|
5003 | high: 0,
|
5004 | href: 0,
|
5005 | hrefLang: 0,
|
5006 | htmlFor: 0,
|
5007 | httpEquiv: 0,
|
5008 | icon: 0,
|
5009 | id: 0,
|
5010 | inputMode: 0,
|
5011 | integrity: 0,
|
5012 | is: 0,
|
5013 | keyParams: 0,
|
5014 | keyType: 0,
|
5015 | kind: 0,
|
5016 | label: 0,
|
5017 | lang: 0,
|
5018 | list: 0,
|
5019 | loop: HAS_BOOLEAN_VALUE,
|
5020 | low: 0,
|
5021 | manifest: 0,
|
5022 | marginHeight: 0,
|
5023 | marginWidth: 0,
|
5024 | max: 0,
|
5025 | maxLength: 0,
|
5026 | media: 0,
|
5027 | mediaGroup: 0,
|
5028 | method: 0,
|
5029 | min: 0,
|
5030 | minLength: 0,
|
5031 | // Caution; `option.selected` is not updated if `select.multiple` is
|
5032 | // disabled with `removeAttribute`.
|
5033 | multiple: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
|
5034 | muted: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
|
5035 | name: 0,
|
5036 | nonce: 0,
|
5037 | noValidate: HAS_BOOLEAN_VALUE,
|
5038 | open: HAS_BOOLEAN_VALUE,
|
5039 | optimum: 0,
|
5040 | pattern: 0,
|
5041 | placeholder: 0,
|
5042 | playsInline: HAS_BOOLEAN_VALUE,
|
5043 | poster: 0,
|
5044 | preload: 0,
|
5045 | profile: 0,
|
5046 | radioGroup: 0,
|
5047 | readOnly: HAS_BOOLEAN_VALUE,
|
5048 | referrerPolicy: 0,
|
5049 | rel: 0,
|
5050 | required: HAS_BOOLEAN_VALUE,
|
5051 | reversed: HAS_BOOLEAN_VALUE,
|
5052 | role: 0,
|
5053 | rows: HAS_POSITIVE_NUMERIC_VALUE,
|
5054 | rowSpan: HAS_NUMERIC_VALUE,
|
5055 | sandbox: 0,
|
5056 | scope: 0,
|
5057 | scoped: HAS_BOOLEAN_VALUE,
|
5058 | scrolling: 0,
|
5059 | seamless: HAS_BOOLEAN_VALUE,
|
5060 | selected: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
|
5061 | shape: 0,
|
5062 | size: HAS_POSITIVE_NUMERIC_VALUE,
|
5063 | sizes: 0,
|
5064 | span: HAS_POSITIVE_NUMERIC_VALUE,
|
5065 | spellCheck: 0,
|
5066 | src: 0,
|
5067 | srcDoc: 0,
|
5068 | srcLang: 0,
|
5069 | srcSet: 0,
|
5070 | start: HAS_NUMERIC_VALUE,
|
5071 | step: 0,
|
5072 | style: 0,
|
5073 | summary: 0,
|
5074 | tabIndex: 0,
|
5075 | target: 0,
|
5076 | title: 0,
|
5077 | // Setting .type throws on non-<input> tags
|
5078 | type: 0,
|
5079 | useMap: 0,
|
5080 | value: 0,
|
5081 | width: 0,
|
5082 | wmode: 0,
|
5083 | wrap: 0,
|
5084 |
|
5085 | /**
|
5086 | * RDFa Properties
|
5087 | */
|
5088 | about: 0,
|
5089 | datatype: 0,
|
5090 | inlist: 0,
|
5091 | prefix: 0,
|
5092 | // property is also supported for OpenGraph in meta tags.
|
5093 | property: 0,
|
5094 | resource: 0,
|
5095 | 'typeof': 0,
|
5096 | vocab: 0,
|
5097 |
|
5098 | /**
|
5099 | * Non-standard Properties
|
5100 | */
|
5101 | // autoCapitalize and autoCorrect are supported in Mobile Safari for
|
5102 | // keyboard hints.
|
5103 | autoCapitalize: 0,
|
5104 | autoCorrect: 0,
|
5105 | // autoSave allows WebKit/Blink to persist values of input fields on page reloads
|
5106 | autoSave: 0,
|
5107 | // color is for Safari mask-icon link
|
5108 | color: 0,
|
5109 | // itemProp, itemScope, itemType are for
|
5110 | // Microdata support. See http://schema.org/docs/gs.html
|
5111 | itemProp: 0,
|
5112 | itemScope: HAS_BOOLEAN_VALUE,
|
5113 | itemType: 0,
|
5114 | // itemID and itemRef are for Microdata support as well but
|
5115 | // only specified in the WHATWG spec document. See
|
5116 | // https://html.spec.whatwg.org/multipage/microdata.html#microdata-dom-api
|
5117 | itemID: 0,
|
5118 | itemRef: 0,
|
5119 | // results show looking glass icon and recent searches on input
|
5120 | // search fields in WebKit/Blink
|
5121 | results: 0,
|
5122 | // IE-only attribute that specifies security restrictions on an iframe
|
5123 | // as an alternative to the sandbox attribute on IE<10
|
5124 | security: 0,
|
5125 | // IE-only attribute that controls focus behavior
|
5126 | unselectable: 0
|
5127 | },
|
5128 | DOMAttributeNames: {
|
5129 | acceptCharset: 'accept-charset',
|
5130 | className: 'class',
|
5131 | htmlFor: 'for',
|
5132 | httpEquiv: 'http-equiv'
|
5133 | },
|
5134 | DOMPropertyNames: {},
|
5135 | DOMMutationMethods: {
|
5136 | value: function (node, value) {
|
5137 | if (value == null) {
|
5138 | return node.removeAttribute('value');
|
5139 | }
|
5140 |
|
5141 | // Number inputs get special treatment due to some edge cases in
|
5142 | // Chrome. Let everything else assign the value attribute as normal.
|
5143 | // https://github.com/facebook/react/issues/7253#issuecomment-236074326
|
5144 | if (node.type !== 'number' || node.hasAttribute('value') === false) {
|
5145 | node.setAttribute('value', '' + value);
|
5146 | } else if (node.validity && !node.validity.badInput && node.ownerDocument.activeElement !== node) {
|
5147 | // Don't assign an attribute if validation reports bad
|
5148 | // input. Chrome will clear the value. Additionally, don't
|
5149 | // operate on inputs that have focus, otherwise Chrome might
|
5150 | // strip off trailing decimal places and cause the user's
|
5151 | // cursor position to jump to the beginning of the input.
|
5152 | //
|
5153 | // In ReactDOMInput, we have an onBlur event that will trigger
|
5154 | // this function again when focus is lost.
|
5155 | node.setAttribute('value', '' + value);
|
5156 | }
|
5157 | }
|
5158 | }
|
5159 | };
|
5160 |
|
5161 | var HTMLDOMPropertyConfig_1 = HTMLDOMPropertyConfig;
|
5162 |
|
5163 | /**
|
5164 | * Copyright 2013-present, Facebook, Inc.
|
5165 | * All rights reserved.
|
5166 | *
|
5167 | * This source code is licensed under the BSD-style license found in the
|
5168 | * LICENSE file in the root directory of this source tree. An additional grant
|
5169 | * of patent rights can be found in the PATENTS file in the same directory.
|
5170 | *
|
5171 | */
|
5172 |
|
5173 | var DOMNamespaces = {
|
5174 | html: 'http://www.w3.org/1999/xhtml',
|
5175 | mathml: 'http://www.w3.org/1998/Math/MathML',
|
5176 | svg: 'http://www.w3.org/2000/svg'
|
5177 | };
|
5178 |
|
5179 | var DOMNamespaces_1 = DOMNamespaces;
|
5180 |
|
5181 | /**
|
5182 | * Copyright 2013-present, Facebook, Inc.
|
5183 | * All rights reserved.
|
5184 | *
|
5185 | * This source code is licensed under the BSD-style license found in the
|
5186 | * LICENSE file in the root directory of this source tree. An additional grant
|
5187 | * of patent rights can be found in the PATENTS file in the same directory.
|
5188 | *
|
5189 | */
|
5190 |
|
5191 | /* globals MSApp */
|
5192 |
|
5193 | /**
|
5194 | * Create a function which has 'unsafe' privileges (required by windows8 apps)
|
5195 | */
|
5196 |
|
5197 | var createMicrosoftUnsafeLocalFunction = function (func) {
|
5198 | if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) {
|
5199 | return function (arg0, arg1, arg2, arg3) {
|
5200 | MSApp.execUnsafeLocalFunction(function () {
|
5201 | return func(arg0, arg1, arg2, arg3);
|
5202 | });
|
5203 | };
|
5204 | } else {
|
5205 | return func;
|
5206 | }
|
5207 | };
|
5208 |
|
5209 | var createMicrosoftUnsafeLocalFunction_1 = createMicrosoftUnsafeLocalFunction;
|
5210 |
|
5211 | var WHITESPACE_TEST = /^[ \r\n\t\f]/;
|
5212 | var NONVISIBLE_TEST = /<(!--|link|noscript|meta|script|style)[ \r\n\t\f\/>]/;
|
5213 |
|
5214 |
|
5215 |
|
5216 | // SVG temp container for IE lacking innerHTML
|
5217 | var reusableSVGContainer;
|
5218 |
|
5219 | /**
|
5220 | * Set the innerHTML property of a node, ensuring that whitespace is preserved
|
5221 | * even in IE8.
|
5222 | *
|
5223 | * @param {DOMElement} node
|
5224 | * @param {string} html
|
5225 | * @internal
|
5226 | */
|
5227 | var setInnerHTML = createMicrosoftUnsafeLocalFunction_1(function (node, html) {
|
5228 | // IE does not have innerHTML for SVG nodes, so instead we inject the
|
5229 | // new markup in a temp node and then move the child nodes across into
|
5230 | // the target node
|
5231 | if (node.namespaceURI === DOMNamespaces_1.svg && !('innerHTML' in node)) {
|
5232 | reusableSVGContainer = reusableSVGContainer || document.createElement('div');
|
5233 | reusableSVGContainer.innerHTML = '<svg>' + html + '</svg>';
|
5234 | var svgNode = reusableSVGContainer.firstChild;
|
5235 | while (svgNode.firstChild) {
|
5236 | node.appendChild(svgNode.firstChild);
|
5237 | }
|
5238 | } else {
|
5239 | node.innerHTML = html;
|
5240 | }
|
5241 | });
|
5242 |
|
5243 | if (ExecutionEnvironment_1.canUseDOM) {
|
5244 | // IE8: When updating a just created node with innerHTML only leading
|
5245 | // whitespace is removed. When updating an existing node with innerHTML
|
5246 | // whitespace in root TextNodes is also collapsed.
|
5247 | // @see quirksmode.org/bugreports/archives/2004/11/innerhtml_and_t.html
|
5248 |
|
5249 | // Feature detection; only IE8 is known to behave improperly like this.
|
5250 | var testElement = document.createElement('div');
|
5251 | testElement.innerHTML = ' ';
|
5252 | if (testElement.innerHTML === '') {
|
5253 | setInnerHTML = function (node, html) {
|
5254 | // Magic theory: IE8 supposedly differentiates between added and updated
|
5255 | // nodes when processing innerHTML, innerHTML on updated nodes suffers
|
5256 | // from worse whitespace behavior. Re-adding a node like this triggers
|
5257 | // the initial and more favorable whitespace behavior.
|
5258 | // TODO: What to do on a detached node?
|
5259 | if (node.parentNode) {
|
5260 | node.parentNode.replaceChild(node, node);
|
5261 | }
|
5262 |
|
5263 | // We also implement a workaround for non-visible tags disappearing into
|
5264 | // thin air on IE8, this only happens if there is no visible text
|
5265 | // in-front of the non-visible tags. Piggyback on the whitespace fix
|
5266 | // and simply check if any non-visible tags appear in the source.
|
5267 | if (WHITESPACE_TEST.test(html) || html[0] === '<' && NONVISIBLE_TEST.test(html)) {
|
5268 | // Recover leading whitespace by temporarily prepending any character.
|
5269 | // \uFEFF has the potential advantage of being zero-width/invisible.
|
5270 | // UglifyJS drops U+FEFF chars when parsing, so use String.fromCharCode
|
5271 | // in hopes that this is preserved even if "\uFEFF" is transformed to
|
5272 | // the actual Unicode character (by Babel, for example).
|
5273 | // https://github.com/mishoo/UglifyJS2/blob/v2.4.20/lib/parse.js#L216
|
5274 | node.innerHTML = String.fromCharCode(0xfeff) + html;
|
5275 |
|
5276 | // deleteData leaves an empty `TextNode` which offsets the index of all
|
5277 | // children. Definitely want to avoid this.
|
5278 | var textNode = node.firstChild;
|
5279 | if (textNode.data.length === 1) {
|
5280 | node.removeChild(textNode);
|
5281 | } else {
|
5282 | textNode.deleteData(0, 1);
|
5283 | }
|
5284 | } else {
|
5285 | node.innerHTML = html;
|
5286 | }
|
5287 | };
|
5288 | }
|
5289 | testElement = null;
|
5290 | }
|
5291 |
|
5292 | var setInnerHTML_1 = setInnerHTML;
|
5293 |
|
5294 | /**
|
5295 | * Copyright 2016-present, Facebook, Inc.
|
5296 | * All rights reserved.
|
5297 | *
|
5298 | * This source code is licensed under the BSD-style license found in the
|
5299 | * LICENSE file in the root directory of this source tree. An additional grant
|
5300 | * of patent rights can be found in the PATENTS file in the same directory.
|
5301 | *
|
5302 | * Based on the escape-html library, which is used under the MIT License below:
|
5303 | *
|
5304 | * Copyright (c) 2012-2013 TJ Holowaychuk
|
5305 | * Copyright (c) 2015 Andreas Lubbe
|
5306 | * Copyright (c) 2015 Tiancheng "Timothy" Gu
|
5307 | *
|
5308 | * Permission is hereby granted, free of charge, to any person obtaining
|
5309 | * a copy of this software and associated documentation files (the
|
5310 | * 'Software'), to deal in the Software without restriction, including
|
5311 | * without limitation the rights to use, copy, modify, merge, publish,
|
5312 | * distribute, sublicense, and/or sell copies of the Software, and to
|
5313 | * permit persons to whom the Software is furnished to do so, subject to
|
5314 | * the following conditions:
|
5315 | *
|
5316 | * The above copyright notice and this permission notice shall be
|
5317 | * included in all copies or substantial portions of the Software.
|
5318 | *
|
5319 | * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
5320 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
5321 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
5322 | * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
5323 | * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
5324 | * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
5325 | * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
5326 | *
|
5327 | */
|
5328 |
|
5329 | // code copied and modified from escape-html
|
5330 | /**
|
5331 | * Module variables.
|
5332 | * @private
|
5333 | */
|
5334 |
|
5335 | var matchHtmlRegExp = /["'&<>]/;
|
5336 |
|
5337 | /**
|
5338 | * Escape special characters in the given string of html.
|
5339 | *
|
5340 | * @param {string} string The string to escape for inserting into HTML
|
5341 | * @return {string}
|
5342 | * @public
|
5343 | */
|
5344 |
|
5345 | function escapeHtml(string) {
|
5346 | var str = '' + string;
|
5347 | var match = matchHtmlRegExp.exec(str);
|
5348 |
|
5349 | if (!match) {
|
5350 | return str;
|
5351 | }
|
5352 |
|
5353 | var escape;
|
5354 | var html = '';
|
5355 | var index = 0;
|
5356 | var lastIndex = 0;
|
5357 |
|
5358 | for (index = match.index; index < str.length; index++) {
|
5359 | switch (str.charCodeAt(index)) {
|
5360 | case 34:
|
5361 | // "
|
5362 | escape = '"';
|
5363 | break;
|
5364 | case 38:
|
5365 | // &
|
5366 | escape = '&';
|
5367 | break;
|
5368 | case 39:
|
5369 | // '
|
5370 | escape = '''; // modified from escape-html; used to be '''
|
5371 | break;
|
5372 | case 60:
|
5373 | // <
|
5374 | escape = '<';
|
5375 | break;
|
5376 | case 62:
|
5377 | // >
|
5378 | escape = '>';
|
5379 | break;
|
5380 | default:
|
5381 | continue;
|
5382 | }
|
5383 |
|
5384 | if (lastIndex !== index) {
|
5385 | html += str.substring(lastIndex, index);
|
5386 | }
|
5387 |
|
5388 | lastIndex = index + 1;
|
5389 | html += escape;
|
5390 | }
|
5391 |
|
5392 | return lastIndex !== index ? html + str.substring(lastIndex, index) : html;
|
5393 | }
|
5394 | // end code copied and modified from escape-html
|
5395 |
|
5396 | /**
|
5397 | * Escapes text to prevent scripting attacks.
|
5398 | *
|
5399 | * @param {*} text Text value to escape.
|
5400 | * @return {string} An escaped string.
|
5401 | */
|
5402 | function escapeTextContentForBrowser(text) {
|
5403 | if (typeof text === 'boolean' || typeof text === 'number') {
|
5404 | // this shortcircuit helps perf for types that we know will never have
|
5405 | // special characters, especially given that this function is used often
|
5406 | // for numeric dom ids.
|
5407 | return '' + text;
|
5408 | }
|
5409 | return escapeHtml(text);
|
5410 | }
|
5411 |
|
5412 | var escapeTextContentForBrowser_1 = escapeTextContentForBrowser;
|
5413 |
|
5414 | /**
|
5415 | * Set the textContent property of a node, ensuring that whitespace is preserved
|
5416 | * even in IE8. innerText is a poor substitute for textContent and, among many
|
5417 | * issues, inserts <br> instead of the literal newline chars. innerHTML behaves
|
5418 | * as it should.
|
5419 | *
|
5420 | * @param {DOMElement} node
|
5421 | * @param {string} text
|
5422 | * @internal
|
5423 | */
|
5424 | var setTextContent = function (node, text) {
|
5425 | if (text) {
|
5426 | var firstChild = node.firstChild;
|
5427 |
|
5428 | if (firstChild && firstChild === node.lastChild && firstChild.nodeType === 3) {
|
5429 | firstChild.nodeValue = text;
|
5430 | return;
|
5431 | }
|
5432 | }
|
5433 | node.textContent = text;
|
5434 | };
|
5435 |
|
5436 | if (ExecutionEnvironment_1.canUseDOM) {
|
5437 | if (!('textContent' in document.documentElement)) {
|
5438 | setTextContent = function (node, text) {
|
5439 | if (node.nodeType === 3) {
|
5440 | node.nodeValue = text;
|
5441 | return;
|
5442 | }
|
5443 | setInnerHTML_1(node, escapeTextContentForBrowser_1(text));
|
5444 | };
|
5445 | }
|
5446 | }
|
5447 |
|
5448 | var setTextContent_1 = setTextContent;
|
5449 |
|
5450 | var ELEMENT_NODE_TYPE = 1;
|
5451 | var DOCUMENT_FRAGMENT_NODE_TYPE = 11;
|
5452 |
|
5453 | /**
|
5454 | * In IE (8-11) and Edge, appending nodes with no children is dramatically
|
5455 | * faster than appending a full subtree, so we essentially queue up the
|
5456 | * .appendChild calls here and apply them so each node is added to its parent
|
5457 | * before any children are added.
|
5458 | *
|
5459 | * In other browsers, doing so is slower or neutral compared to the other order
|
5460 | * (in Firefox, twice as slow) so we only do this inversion in IE.
|
5461 | *
|
5462 | * See https://github.com/spicyj/innerhtml-vs-createelement-vs-clonenode.
|
5463 | */
|
5464 | var enableLazy = typeof document !== 'undefined' && typeof document.documentMode === 'number' || typeof navigator !== 'undefined' && typeof navigator.userAgent === 'string' && /\bEdge\/\d/.test(navigator.userAgent);
|
5465 |
|
5466 | function insertTreeChildren(tree) {
|
5467 | if (!enableLazy) {
|
5468 | return;
|
5469 | }
|
5470 | var node = tree.node;
|
5471 | var children = tree.children;
|
5472 | if (children.length) {
|
5473 | for (var i = 0; i < children.length; i++) {
|
5474 | insertTreeBefore(node, children[i], null);
|
5475 | }
|
5476 | } else if (tree.html != null) {
|
5477 | setInnerHTML_1(node, tree.html);
|
5478 | } else if (tree.text != null) {
|
5479 | setTextContent_1(node, tree.text);
|
5480 | }
|
5481 | }
|
5482 |
|
5483 | var insertTreeBefore = createMicrosoftUnsafeLocalFunction_1(function (parentNode, tree, referenceNode) {
|
5484 | // DocumentFragments aren't actually part of the DOM after insertion so
|
5485 | // appending children won't update the DOM. We need to ensure the fragment
|
5486 | // is properly populated first, breaking out of our lazy approach for just
|
5487 | // this level. Also, some <object> plugins (like Flash Player) will read
|
5488 | // <param> nodes immediately upon insertion into the DOM, so <object>
|
5489 | // must also be populated prior to insertion into the DOM.
|
5490 | if (tree.node.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE || tree.node.nodeType === ELEMENT_NODE_TYPE && tree.node.nodeName.toLowerCase() === 'object' && (tree.node.namespaceURI == null || tree.node.namespaceURI === DOMNamespaces_1.html)) {
|
5491 | insertTreeChildren(tree);
|
5492 | parentNode.insertBefore(tree.node, referenceNode);
|
5493 | } else {
|
5494 | parentNode.insertBefore(tree.node, referenceNode);
|
5495 | insertTreeChildren(tree);
|
5496 | }
|
5497 | });
|
5498 |
|
5499 | function replaceChildWithTree(oldNode, newTree) {
|
5500 | oldNode.parentNode.replaceChild(newTree.node, oldNode);
|
5501 | insertTreeChildren(newTree);
|
5502 | }
|
5503 |
|
5504 | function queueChild(parentTree, childTree) {
|
5505 | if (enableLazy) {
|
5506 | parentTree.children.push(childTree);
|
5507 | } else {
|
5508 | parentTree.node.appendChild(childTree.node);
|
5509 | }
|
5510 | }
|
5511 |
|
5512 | function queueHTML(tree, html) {
|
5513 | if (enableLazy) {
|
5514 | tree.html = html;
|
5515 | } else {
|
5516 | setInnerHTML_1(tree.node, html);
|
5517 | }
|
5518 | }
|
5519 |
|
5520 | function queueText(tree, text) {
|
5521 | if (enableLazy) {
|
5522 | tree.text = text;
|
5523 | } else {
|
5524 | setTextContent_1(tree.node, text);
|
5525 | }
|
5526 | }
|
5527 |
|
5528 | function toString() {
|
5529 | return this.node.nodeName;
|
5530 | }
|
5531 |
|
5532 | function DOMLazyTree(node) {
|
5533 | return {
|
5534 | node: node,
|
5535 | children: [],
|
5536 | html: null,
|
5537 | text: null,
|
5538 | toString: toString
|
5539 | };
|
5540 | }
|
5541 |
|
5542 | DOMLazyTree.insertTreeBefore = insertTreeBefore;
|
5543 | DOMLazyTree.replaceChildWithTree = replaceChildWithTree;
|
5544 | DOMLazyTree.queueChild = queueChild;
|
5545 | DOMLazyTree.queueHTML = queueHTML;
|
5546 | DOMLazyTree.queueText = queueText;
|
5547 |
|
5548 | var DOMLazyTree_1 = DOMLazyTree;
|
5549 |
|
5550 | /**
|
5551 | * Copyright (c) 2013-present, Facebook, Inc.
|
5552 | * All rights reserved.
|
5553 | *
|
5554 | * This source code is licensed under the BSD-style license found in the
|
5555 | * LICENSE file in the root directory of this source tree. An additional grant
|
5556 | * of patent rights can be found in the PATENTS file in the same directory.
|
5557 | *
|
5558 | * @typechecks
|
5559 | */
|
5560 |
|
5561 |
|
5562 |
|
5563 | /**
|
5564 | * Convert array-like objects to arrays.
|
5565 | *
|
5566 | * This API assumes the caller knows the contents of the data type. For less
|
5567 | * well defined inputs use createArrayFromMixed.
|
5568 | *
|
5569 | * @param {object|function|filelist} obj
|
5570 | * @return {array}
|
5571 | */
|
5572 | function toArray(obj) {
|
5573 | var length = obj.length;
|
5574 |
|
5575 | // Some browsers builtin objects can report typeof 'function' (e.g. NodeList
|
5576 | // in old versions of Safari).
|
5577 | !(!Array.isArray(obj) && (typeof obj === 'object' || typeof obj === 'function')) ? invariant_1(false) : void 0;
|
5578 |
|
5579 | !(typeof length === 'number') ? invariant_1(false) : void 0;
|
5580 |
|
5581 | !(length === 0 || length - 1 in obj) ? invariant_1(false) : void 0;
|
5582 |
|
5583 | !(typeof obj.callee !== 'function') ? invariant_1(false) : void 0;
|
5584 |
|
5585 | // Old IE doesn't give collections access to hasOwnProperty. Assume inputs
|
5586 | // without method will throw during the slice call and skip straight to the
|
5587 | // fallback.
|
5588 | if (obj.hasOwnProperty) {
|
5589 | try {
|
5590 | return Array.prototype.slice.call(obj);
|
5591 | } catch (e) {
|
5592 | // IE < 9 does not support Array#slice on collections objects
|
5593 | }
|
5594 | }
|
5595 |
|
5596 | // Fall back to copying key by key. This assumes all keys have a value,
|
5597 | // so will not preserve sparsely populated inputs.
|
5598 | var ret = Array(length);
|
5599 | for (var ii = 0; ii < length; ii++) {
|
5600 | ret[ii] = obj[ii];
|
5601 | }
|
5602 | return ret;
|
5603 | }
|
5604 |
|
5605 | /**
|
5606 | * Perform a heuristic test to determine if an object is "array-like".
|
5607 | *
|
5608 | * A monk asked Joshu, a Zen master, "Has a dog Buddha nature?"
|
5609 | * Joshu replied: "Mu."
|
5610 | *
|
5611 | * This function determines if its argument has "array nature": it returns
|
5612 | * true if the argument is an actual array, an `arguments' object, or an
|
5613 | * HTMLCollection (e.g. node.childNodes or node.getElementsByTagName()).
|
5614 | *
|
5615 | * It will return false for other array-like objects like Filelist.
|
5616 | *
|
5617 | * @param {*} obj
|
5618 | * @return {boolean}
|
5619 | */
|
5620 | function hasArrayNature(obj) {
|
5621 | return (
|
5622 | // not null/false
|
5623 | !!obj && (
|
5624 | // arrays are objects, NodeLists are functions in Safari
|
5625 | typeof obj == 'object' || typeof obj == 'function') &&
|
5626 | // quacks like an array
|
5627 | 'length' in obj &&
|
5628 | // not window
|
5629 | !('setInterval' in obj) &&
|
5630 | // no DOM node should be considered an array-like
|
5631 | // a 'select' element has 'length' and 'item' properties on IE8
|
5632 | typeof obj.nodeType != 'number' && (
|
5633 | // a real array
|
5634 | Array.isArray(obj) ||
|
5635 | // arguments
|
5636 | 'callee' in obj ||
|
5637 | // HTMLCollection/NodeList
|
5638 | 'item' in obj)
|
5639 | );
|
5640 | }
|
5641 |
|
5642 | /**
|
5643 | * Ensure that the argument is an array by wrapping it in an array if it is not.
|
5644 | * Creates a copy of the argument if it is already an array.
|
5645 | *
|
5646 | * This is mostly useful idiomatically:
|
5647 | *
|
5648 | * var createArrayFromMixed = require('createArrayFromMixed');
|
5649 | *
|
5650 | * function takesOneOrMoreThings(things) {
|
5651 | * things = createArrayFromMixed(things);
|
5652 | * ...
|
5653 | * }
|
5654 | *
|
5655 | * This allows you to treat `things' as an array, but accept scalars in the API.
|
5656 | *
|
5657 | * If you need to convert an array-like object, like `arguments`, into an array
|
5658 | * use toArray instead.
|
5659 | *
|
5660 | * @param {*} obj
|
5661 | * @return {array}
|
5662 | */
|
5663 | function createArrayFromMixed(obj) {
|
5664 | if (!hasArrayNature(obj)) {
|
5665 | return [obj];
|
5666 | } else if (Array.isArray(obj)) {
|
5667 | return obj.slice();
|
5668 | } else {
|
5669 | return toArray(obj);
|
5670 | }
|
5671 | }
|
5672 |
|
5673 | var createArrayFromMixed_1 = createArrayFromMixed;
|
5674 |
|
5675 | /**
|
5676 | * Copyright (c) 2013-present, Facebook, Inc.
|
5677 | * All rights reserved.
|
5678 | *
|
5679 | * This source code is licensed under the BSD-style license found in the
|
5680 | * LICENSE file in the root directory of this source tree. An additional grant
|
5681 | * of patent rights can be found in the PATENTS file in the same directory.
|
5682 | *
|
5683 | */
|
5684 |
|
5685 | /*eslint-disable fb-www/unsafe-html */
|
5686 |
|
5687 |
|
5688 |
|
5689 |
|
5690 |
|
5691 | /**
|
5692 | * Dummy container used to detect which wraps are necessary.
|
5693 | */
|
5694 | var dummyNode$1 = ExecutionEnvironment_1.canUseDOM ? document.createElement('div') : null;
|
5695 |
|
5696 | /**
|
5697 | * Some browsers cannot use `innerHTML` to render certain elements standalone,
|
5698 | * so we wrap them, render the wrapped nodes, then extract the desired node.
|
5699 | *
|
5700 | * In IE8, certain elements cannot render alone, so wrap all elements ('*').
|
5701 | */
|
5702 |
|
5703 | var shouldWrap = {};
|
5704 |
|
5705 | var selectWrap = [1, '<select multiple="true">', '</select>'];
|
5706 | var tableWrap = [1, '<table>', '</table>'];
|
5707 | var trWrap = [3, '<table><tbody><tr>', '</tr></tbody></table>'];
|
5708 |
|
5709 | var svgWrap = [1, '<svg xmlns="http://www.w3.org/2000/svg">', '</svg>'];
|
5710 |
|
5711 | var markupWrap = {
|
5712 | '*': [1, '?<div>', '</div>'],
|
5713 |
|
5714 | 'area': [1, '<map>', '</map>'],
|
5715 | 'col': [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'],
|
5716 | 'legend': [1, '<fieldset>', '</fieldset>'],
|
5717 | 'param': [1, '<object>', '</object>'],
|
5718 | 'tr': [2, '<table><tbody>', '</tbody></table>'],
|
5719 |
|
5720 | 'optgroup': selectWrap,
|
5721 | 'option': selectWrap,
|
5722 |
|
5723 | 'caption': tableWrap,
|
5724 | 'colgroup': tableWrap,
|
5725 | 'tbody': tableWrap,
|
5726 | 'tfoot': tableWrap,
|
5727 | 'thead': tableWrap,
|
5728 |
|
5729 | 'td': trWrap,
|
5730 | 'th': trWrap
|
5731 | };
|
5732 |
|
5733 | // Initialize the SVG elements since we know they'll always need to be wrapped
|
5734 | // consistently. If they are created inside a <div> they will be initialized in
|
5735 | // the wrong namespace (and will not display).
|
5736 | var svgElements = ['circle', 'clipPath', 'defs', 'ellipse', 'g', 'image', 'line', 'linearGradient', 'mask', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'stop', 'text', 'tspan'];
|
5737 | svgElements.forEach(function (nodeName) {
|
5738 | markupWrap[nodeName] = svgWrap;
|
5739 | shouldWrap[nodeName] = true;
|
5740 | });
|
5741 |
|
5742 | /**
|
5743 | * Gets the markup wrap configuration for the supplied `nodeName`.
|
5744 | *
|
5745 | * NOTE: This lazily detects which wraps are necessary for the current browser.
|
5746 | *
|
5747 | * @param {string} nodeName Lowercase `nodeName`.
|
5748 | * @return {?array} Markup wrap configuration, if applicable.
|
5749 | */
|
5750 | function getMarkupWrap(nodeName) {
|
5751 | !!!dummyNode$1 ? invariant_1(false) : void 0;
|
5752 | if (!markupWrap.hasOwnProperty(nodeName)) {
|
5753 | nodeName = '*';
|
5754 | }
|
5755 | if (!shouldWrap.hasOwnProperty(nodeName)) {
|
5756 | if (nodeName === '*') {
|
5757 | dummyNode$1.innerHTML = '<link />';
|
5758 | } else {
|
5759 | dummyNode$1.innerHTML = '<' + nodeName + '></' + nodeName + '>';
|
5760 | }
|
5761 | shouldWrap[nodeName] = !dummyNode$1.firstChild;
|
5762 | }
|
5763 | return shouldWrap[nodeName] ? markupWrap[nodeName] : null;
|
5764 | }
|
5765 |
|
5766 | var getMarkupWrap_1 = getMarkupWrap;
|
5767 |
|
5768 | /**
|
5769 | * Copyright (c) 2013-present, Facebook, Inc.
|
5770 | * All rights reserved.
|
5771 | *
|
5772 | * This source code is licensed under the BSD-style license found in the
|
5773 | * LICENSE file in the root directory of this source tree. An additional grant
|
5774 | * of patent rights can be found in the PATENTS file in the same directory.
|
5775 | *
|
5776 | * @typechecks
|
5777 | */
|
5778 |
|
5779 | /*eslint-disable fb-www/unsafe-html*/
|
5780 |
|
5781 |
|
5782 |
|
5783 |
|
5784 |
|
5785 |
|
5786 |
|
5787 | /**
|
5788 | * Dummy container used to render all markup.
|
5789 | */
|
5790 | var dummyNode = ExecutionEnvironment_1.canUseDOM ? document.createElement('div') : null;
|
5791 |
|
5792 | /**
|
5793 | * Pattern used by `getNodeName`.
|
5794 | */
|
5795 | var nodeNamePattern = /^\s*<(\w+)/;
|
5796 |
|
5797 | /**
|
5798 | * Extracts the `nodeName` of the first element in a string of markup.
|
5799 | *
|
5800 | * @param {string} markup String of markup.
|
5801 | * @return {?string} Node name of the supplied markup.
|
5802 | */
|
5803 | function getNodeName(markup) {
|
5804 | var nodeNameMatch = markup.match(nodeNamePattern);
|
5805 | return nodeNameMatch && nodeNameMatch[1].toLowerCase();
|
5806 | }
|
5807 |
|
5808 | /**
|
5809 | * Creates an array containing the nodes rendered from the supplied markup. The
|
5810 | * optionally supplied `handleScript` function will be invoked once for each
|
5811 | * <script> element that is rendered. If no `handleScript` function is supplied,
|
5812 | * an exception is thrown if any <script> elements are rendered.
|
5813 | *
|
5814 | * @param {string} markup A string of valid HTML markup.
|
5815 | * @param {?function} handleScript Invoked once for each rendered <script>.
|
5816 | * @return {array<DOMElement|DOMTextNode>} An array of rendered nodes.
|
5817 | */
|
5818 | function createNodesFromMarkup(markup, handleScript) {
|
5819 | var node = dummyNode;
|
5820 | !!!dummyNode ? invariant_1(false) : void 0;
|
5821 | var nodeName = getNodeName(markup);
|
5822 |
|
5823 | var wrap = nodeName && getMarkupWrap_1(nodeName);
|
5824 | if (wrap) {
|
5825 | node.innerHTML = wrap[1] + markup + wrap[2];
|
5826 |
|
5827 | var wrapDepth = wrap[0];
|
5828 | while (wrapDepth--) {
|
5829 | node = node.lastChild;
|
5830 | }
|
5831 | } else {
|
5832 | node.innerHTML = markup;
|
5833 | }
|
5834 |
|
5835 | var scripts = node.getElementsByTagName('script');
|
5836 | if (scripts.length) {
|
5837 | !handleScript ? invariant_1(false) : void 0;
|
5838 | createArrayFromMixed_1(scripts).forEach(handleScript);
|
5839 | }
|
5840 |
|
5841 | var nodes = Array.from(node.childNodes);
|
5842 | while (node.lastChild) {
|
5843 | node.removeChild(node.lastChild);
|
5844 | }
|
5845 | return nodes;
|
5846 | }
|
5847 |
|
5848 | var createNodesFromMarkup_1 = createNodesFromMarkup;
|
5849 |
|
5850 | var Danger = {
|
5851 | /**
|
5852 | * Replaces a node with a string of markup at its current position within its
|
5853 | * parent. The markup must render into a single root node.
|
5854 | *
|
5855 | * @param {DOMElement} oldChild Child node to replace.
|
5856 | * @param {string} markup Markup to render in place of the child node.
|
5857 | * @internal
|
5858 | */
|
5859 | dangerouslyReplaceNodeWithMarkup: function (oldChild, markup) {
|
5860 | !ExecutionEnvironment_1.canUseDOM ? reactProdInvariant_1('56') : void 0;
|
5861 | !markup ? reactProdInvariant_1('57') : void 0;
|
5862 | !(oldChild.nodeName !== 'HTML') ? reactProdInvariant_1('58') : void 0;
|
5863 |
|
5864 | if (typeof markup === 'string') {
|
5865 | var newChild = createNodesFromMarkup_1(markup, emptyFunction_1)[0];
|
5866 | oldChild.parentNode.replaceChild(newChild, oldChild);
|
5867 | } else {
|
5868 | DOMLazyTree_1.replaceChildWithTree(oldChild, markup);
|
5869 | }
|
5870 | }
|
5871 | };
|
5872 |
|
5873 | var Danger_1 = Danger;
|
5874 |
|
5875 | function getNodeAfter(parentNode, node) {
|
5876 | // Special case for text components, which return [open, close] comments
|
5877 | // from getHostNode.
|
5878 | if (Array.isArray(node)) {
|
5879 | node = node[1];
|
5880 | }
|
5881 | return node ? node.nextSibling : parentNode.firstChild;
|
5882 | }
|
5883 |
|
5884 | /**
|
5885 | * Inserts `childNode` as a child of `parentNode` at the `index`.
|
5886 | *
|
5887 | * @param {DOMElement} parentNode Parent node in which to insert.
|
5888 | * @param {DOMElement} childNode Child node to insert.
|
5889 | * @param {number} index Index at which to insert the child.
|
5890 | * @internal
|
5891 | */
|
5892 | var insertChildAt = createMicrosoftUnsafeLocalFunction_1(function (parentNode, childNode, referenceNode) {
|
5893 | // We rely exclusively on `insertBefore(node, null)` instead of also using
|
5894 | // `appendChild(node)`. (Using `undefined` is not allowed by all browsers so
|
5895 | // we are careful to use `null`.)
|
5896 | parentNode.insertBefore(childNode, referenceNode);
|
5897 | });
|
5898 |
|
5899 | function insertLazyTreeChildAt(parentNode, childTree, referenceNode) {
|
5900 | DOMLazyTree_1.insertTreeBefore(parentNode, childTree, referenceNode);
|
5901 | }
|
5902 |
|
5903 | function moveChild(parentNode, childNode, referenceNode) {
|
5904 | if (Array.isArray(childNode)) {
|
5905 | moveDelimitedText(parentNode, childNode[0], childNode[1], referenceNode);
|
5906 | } else {
|
5907 | insertChildAt(parentNode, childNode, referenceNode);
|
5908 | }
|
5909 | }
|
5910 |
|
5911 | function removeChild(parentNode, childNode) {
|
5912 | if (Array.isArray(childNode)) {
|
5913 | var closingComment = childNode[1];
|
5914 | childNode = childNode[0];
|
5915 | removeDelimitedText(parentNode, childNode, closingComment);
|
5916 | parentNode.removeChild(closingComment);
|
5917 | }
|
5918 | parentNode.removeChild(childNode);
|
5919 | }
|
5920 |
|
5921 | function moveDelimitedText(parentNode, openingComment, closingComment, referenceNode) {
|
5922 | var node = openingComment;
|
5923 | while (true) {
|
5924 | var nextNode = node.nextSibling;
|
5925 | insertChildAt(parentNode, node, referenceNode);
|
5926 | if (node === closingComment) {
|
5927 | break;
|
5928 | }
|
5929 | node = nextNode;
|
5930 | }
|
5931 | }
|
5932 |
|
5933 | function removeDelimitedText(parentNode, startNode, closingComment) {
|
5934 | while (true) {
|
5935 | var node = startNode.nextSibling;
|
5936 | if (node === closingComment) {
|
5937 | // The closing comment is removed by ReactMultiChild.
|
5938 | break;
|
5939 | } else {
|
5940 | parentNode.removeChild(node);
|
5941 | }
|
5942 | }
|
5943 | }
|
5944 |
|
5945 | function replaceDelimitedText(openingComment, closingComment, stringText) {
|
5946 | var parentNode = openingComment.parentNode;
|
5947 | var nodeAfterComment = openingComment.nextSibling;
|
5948 | if (nodeAfterComment === closingComment) {
|
5949 | // There are no text nodes between the opening and closing comments; insert
|
5950 | // a new one if stringText isn't empty.
|
5951 | if (stringText) {
|
5952 | insertChildAt(parentNode, document.createTextNode(stringText), nodeAfterComment);
|
5953 | }
|
5954 | } else {
|
5955 | if (stringText) {
|
5956 | // Set the text content of the first node after the opening comment, and
|
5957 | // remove all following nodes up until the closing comment.
|
5958 | setTextContent_1(nodeAfterComment, stringText);
|
5959 | removeDelimitedText(parentNode, nodeAfterComment, closingComment);
|
5960 | } else {
|
5961 | removeDelimitedText(parentNode, openingComment, closingComment);
|
5962 | }
|
5963 | }
|
5964 |
|
5965 |
|
5966 | }
|
5967 |
|
5968 | var dangerouslyReplaceNodeWithMarkup = Danger_1.dangerouslyReplaceNodeWithMarkup;
|
5969 | /**
|
5970 | * Operations for updating with DOM children.
|
5971 | */
|
5972 | var DOMChildrenOperations = {
|
5973 | dangerouslyReplaceNodeWithMarkup: dangerouslyReplaceNodeWithMarkup,
|
5974 |
|
5975 | replaceDelimitedText: replaceDelimitedText,
|
5976 |
|
5977 | /**
|
5978 | * Updates a component's children by processing a series of updates. The
|
5979 | * update configurations are each expected to have a `parentNode` property.
|
5980 | *
|
5981 | * @param {array<object>} updates List of update configurations.
|
5982 | * @internal
|
5983 | */
|
5984 | processUpdates: function (parentNode, updates) {
|
5985 | for (var k = 0; k < updates.length; k++) {
|
5986 | var update = updates[k];
|
5987 | switch (update.type) {
|
5988 | case 'INSERT_MARKUP':
|
5989 | insertLazyTreeChildAt(parentNode, update.content, getNodeAfter(parentNode, update.afterNode));
|
5990 |
|
5991 | break;
|
5992 | case 'MOVE_EXISTING':
|
5993 | moveChild(parentNode, update.fromNode, getNodeAfter(parentNode, update.afterNode));
|
5994 |
|
5995 | break;
|
5996 | case 'SET_MARKUP':
|
5997 | setInnerHTML_1(parentNode, update.content);
|
5998 |
|
5999 | break;
|
6000 | case 'TEXT_CONTENT':
|
6001 | setTextContent_1(parentNode, update.content);
|
6002 |
|
6003 | break;
|
6004 | case 'REMOVE_NODE':
|
6005 | removeChild(parentNode, update.fromNode);
|
6006 |
|
6007 | break;
|
6008 | }
|
6009 | }
|
6010 | }
|
6011 | };
|
6012 |
|
6013 | var DOMChildrenOperations_1 = DOMChildrenOperations;
|
6014 |
|
6015 | /**
|
6016 | * Operations used to process updates to DOM nodes.
|
6017 | */
|
6018 | var ReactDOMIDOperations = {
|
6019 | /**
|
6020 | * Updates a component's children by processing a series of updates.
|
6021 | *
|
6022 | * @param {array<object>} updates List of update configurations.
|
6023 | * @internal
|
6024 | */
|
6025 | dangerouslyProcessChildrenUpdates: function (parentInst, updates) {
|
6026 | var node = ReactDOMComponentTree_1.getNodeFromInstance(parentInst);
|
6027 | DOMChildrenOperations_1.processUpdates(node, updates);
|
6028 | }
|
6029 | };
|
6030 |
|
6031 | var ReactDOMIDOperations_1 = ReactDOMIDOperations;
|
6032 |
|
6033 | /**
|
6034 | * Abstracts away all functionality of the reconciler that requires knowledge of
|
6035 | * the browser context. TODO: These callers should be refactored to avoid the
|
6036 | * need for this injection.
|
6037 | */
|
6038 | var ReactComponentBrowserEnvironment = {
|
6039 | processChildrenUpdates: ReactDOMIDOperations_1.dangerouslyProcessChildrenUpdates,
|
6040 |
|
6041 | replaceNodeWithMarkup: DOMChildrenOperations_1.dangerouslyReplaceNodeWithMarkup
|
6042 | };
|
6043 |
|
6044 | var ReactComponentBrowserEnvironment_1 = ReactComponentBrowserEnvironment;
|
6045 |
|
6046 | /**
|
6047 | * Copyright (c) 2013-present, Facebook, Inc.
|
6048 | * All rights reserved.
|
6049 | *
|
6050 | * This source code is licensed under the BSD-style license found in the
|
6051 | * LICENSE file in the root directory of this source tree. An additional grant
|
6052 | * of patent rights can be found in the PATENTS file in the same directory.
|
6053 | *
|
6054 | */
|
6055 |
|
6056 | /**
|
6057 | * @param {DOMElement} node input/textarea to focus
|
6058 | */
|
6059 |
|
6060 | function focusNode(node) {
|
6061 | // IE8 can throw "Can't move focus to the control because it is invisible,
|
6062 | // not enabled, or of a type that does not accept the focus." for all kinds of
|
6063 | // reasons that are too expensive and fragile to test.
|
6064 | try {
|
6065 | node.focus();
|
6066 | } catch (e) {}
|
6067 | }
|
6068 |
|
6069 | var focusNode_1 = focusNode;
|
6070 |
|
6071 | var AutoFocusUtils = {
|
6072 | focusDOMComponent: function () {
|
6073 | focusNode_1(ReactDOMComponentTree_1.getNodeFromInstance(this));
|
6074 | }
|
6075 | };
|
6076 |
|
6077 | var AutoFocusUtils_1 = AutoFocusUtils;
|
6078 |
|
6079 | /**
|
6080 | * Copyright 2013-present, Facebook, Inc.
|
6081 | * All rights reserved.
|
6082 | *
|
6083 | * This source code is licensed under the BSD-style license found in the
|
6084 | * LICENSE file in the root directory of this source tree. An additional grant
|
6085 | * of patent rights can be found in the PATENTS file in the same directory.
|
6086 | *
|
6087 | */
|
6088 |
|
6089 | /**
|
6090 | * CSS properties which accept numbers but are not in units of "px".
|
6091 | */
|
6092 |
|
6093 | var isUnitlessNumber = {
|
6094 | animationIterationCount: true,
|
6095 | borderImageOutset: true,
|
6096 | borderImageSlice: true,
|
6097 | borderImageWidth: true,
|
6098 | boxFlex: true,
|
6099 | boxFlexGroup: true,
|
6100 | boxOrdinalGroup: true,
|
6101 | columnCount: true,
|
6102 | flex: true,
|
6103 | flexGrow: true,
|
6104 | flexPositive: true,
|
6105 | flexShrink: true,
|
6106 | flexNegative: true,
|
6107 | flexOrder: true,
|
6108 | gridRow: true,
|
6109 | gridRowEnd: true,
|
6110 | gridRowSpan: true,
|
6111 | gridRowStart: true,
|
6112 | gridColumn: true,
|
6113 | gridColumnEnd: true,
|
6114 | gridColumnSpan: true,
|
6115 | gridColumnStart: true,
|
6116 | fontWeight: true,
|
6117 | lineClamp: true,
|
6118 | lineHeight: true,
|
6119 | opacity: true,
|
6120 | order: true,
|
6121 | orphans: true,
|
6122 | tabSize: true,
|
6123 | widows: true,
|
6124 | zIndex: true,
|
6125 | zoom: true,
|
6126 |
|
6127 | // SVG-related properties
|
6128 | fillOpacity: true,
|
6129 | floodOpacity: true,
|
6130 | stopOpacity: true,
|
6131 | strokeDasharray: true,
|
6132 | strokeDashoffset: true,
|
6133 | strokeMiterlimit: true,
|
6134 | strokeOpacity: true,
|
6135 | strokeWidth: true
|
6136 | };
|
6137 |
|
6138 | /**
|
6139 | * @param {string} prefix vendor-specific prefix, eg: Webkit
|
6140 | * @param {string} key style name, eg: transitionDuration
|
6141 | * @return {string} style name prefixed with `prefix`, properly camelCased, eg:
|
6142 | * WebkitTransitionDuration
|
6143 | */
|
6144 | function prefixKey(prefix, key) {
|
6145 | return prefix + key.charAt(0).toUpperCase() + key.substring(1);
|
6146 | }
|
6147 |
|
6148 | /**
|
6149 | * Support style names that may come passed in prefixed by adding permutations
|
6150 | * of vendor prefixes.
|
6151 | */
|
6152 | var prefixes = ['Webkit', 'ms', 'Moz', 'O'];
|
6153 |
|
6154 | // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an
|
6155 | // infinite loop, because it iterates over the newly added props too.
|
6156 | Object.keys(isUnitlessNumber).forEach(function (prop) {
|
6157 | prefixes.forEach(function (prefix) {
|
6158 | isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];
|
6159 | });
|
6160 | });
|
6161 |
|
6162 | /**
|
6163 | * Most style properties can be unset by doing .style[prop] = '' but IE8
|
6164 | * doesn't like doing that with shorthand properties so for the properties that
|
6165 | * IE8 breaks on, which are listed here, we instead unset each of the
|
6166 | * individual properties. See http://bugs.jquery.com/ticket/12385.
|
6167 | * The 4-value 'clock' properties like margin, padding, border-width seem to
|
6168 | * behave without any problems. Curiously, list-style works too without any
|
6169 | * special prodding.
|
6170 | */
|
6171 | var shorthandPropertyExpansions = {
|
6172 | background: {
|
6173 | backgroundAttachment: true,
|
6174 | backgroundColor: true,
|
6175 | backgroundImage: true,
|
6176 | backgroundPositionX: true,
|
6177 | backgroundPositionY: true,
|
6178 | backgroundRepeat: true
|
6179 | },
|
6180 | backgroundPosition: {
|
6181 | backgroundPositionX: true,
|
6182 | backgroundPositionY: true
|
6183 | },
|
6184 | border: {
|
6185 | borderWidth: true,
|
6186 | borderStyle: true,
|
6187 | borderColor: true
|
6188 | },
|
6189 | borderBottom: {
|
6190 | borderBottomWidth: true,
|
6191 | borderBottomStyle: true,
|
6192 | borderBottomColor: true
|
6193 | },
|
6194 | borderLeft: {
|
6195 | borderLeftWidth: true,
|
6196 | borderLeftStyle: true,
|
6197 | borderLeftColor: true
|
6198 | },
|
6199 | borderRight: {
|
6200 | borderRightWidth: true,
|
6201 | borderRightStyle: true,
|
6202 | borderRightColor: true
|
6203 | },
|
6204 | borderTop: {
|
6205 | borderTopWidth: true,
|
6206 | borderTopStyle: true,
|
6207 | borderTopColor: true
|
6208 | },
|
6209 | font: {
|
6210 | fontStyle: true,
|
6211 | fontVariant: true,
|
6212 | fontWeight: true,
|
6213 | fontSize: true,
|
6214 | lineHeight: true,
|
6215 | fontFamily: true
|
6216 | },
|
6217 | outline: {
|
6218 | outlineWidth: true,
|
6219 | outlineStyle: true,
|
6220 | outlineColor: true
|
6221 | }
|
6222 | };
|
6223 |
|
6224 | var CSSProperty = {
|
6225 | isUnitlessNumber: isUnitlessNumber,
|
6226 | shorthandPropertyExpansions: shorthandPropertyExpansions
|
6227 | };
|
6228 |
|
6229 | var CSSProperty_1 = CSSProperty;
|
6230 |
|
6231 | var isUnitlessNumber$1 = CSSProperty_1.isUnitlessNumber;
|
6232 | /**
|
6233 | * Convert a value into the proper css writable value. The style name `name`
|
6234 | * should be logical (no hyphens), as specified
|
6235 | * in `CSSProperty.isUnitlessNumber`.
|
6236 | *
|
6237 | * @param {string} name CSS property name such as `topMargin`.
|
6238 | * @param {*} value CSS property value such as `10px`.
|
6239 | * @param {ReactDOMComponent} component
|
6240 | * @return {string} Normalized style value with dimensions applied.
|
6241 | */
|
6242 | function dangerousStyleValue(name, value, component, isCustomProperty) {
|
6243 | // Note that we've removed escapeTextForBrowser() calls here since the
|
6244 | // whole string will be escaped when the attribute is injected into
|
6245 | // the markup. If you provide unsafe user data here they can inject
|
6246 | // arbitrary CSS which may be problematic (I couldn't repro this):
|
6247 | // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
|
6248 | // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/
|
6249 | // This is not an XSS hole but instead a potential CSS injection issue
|
6250 | // which has lead to a greater discussion about how we're going to
|
6251 | // trust URLs moving forward. See #2115901
|
6252 |
|
6253 | var isEmpty = value == null || typeof value === 'boolean' || value === '';
|
6254 | if (isEmpty) {
|
6255 | return '';
|
6256 | }
|
6257 |
|
6258 | var isNonNumeric = isNaN(value);
|
6259 | if (isCustomProperty || isNonNumeric || value === 0 || isUnitlessNumber$1.hasOwnProperty(name) && isUnitlessNumber$1[name]) {
|
6260 | return '' + value; // cast to string
|
6261 | }
|
6262 |
|
6263 | if (typeof value === 'string') {
|
6264 | value = value.trim();
|
6265 | }
|
6266 | return value + 'px';
|
6267 | }
|
6268 |
|
6269 | var dangerousStyleValue_1 = dangerousStyleValue;
|
6270 |
|
6271 | /**
|
6272 | * Copyright (c) 2013-present, Facebook, Inc.
|
6273 | * All rights reserved.
|
6274 | *
|
6275 | * This source code is licensed under the BSD-style license found in the
|
6276 | * LICENSE file in the root directory of this source tree. An additional grant
|
6277 | * of patent rights can be found in the PATENTS file in the same directory.
|
6278 | *
|
6279 | * @typechecks
|
6280 | */
|
6281 |
|
6282 | var _uppercasePattern = /([A-Z])/g;
|
6283 |
|
6284 | /**
|
6285 | * Hyphenates a camelcased string, for example:
|
6286 | *
|
6287 | * > hyphenate('backgroundColor')
|
6288 | * < "background-color"
|
6289 | *
|
6290 | * For CSS style names, use `hyphenateStyleName` instead which works properly
|
6291 | * with all vendor prefixes, including `ms`.
|
6292 | *
|
6293 | * @param {string} string
|
6294 | * @return {string}
|
6295 | */
|
6296 | function hyphenate(string) {
|
6297 | return string.replace(_uppercasePattern, '-$1').toLowerCase();
|
6298 | }
|
6299 |
|
6300 | var hyphenate_1 = hyphenate;
|
6301 |
|
6302 | var msPattern$1 = /^ms-/;
|
6303 |
|
6304 | /**
|
6305 | * Hyphenates a camelcased CSS property name, for example:
|
6306 | *
|
6307 | * > hyphenateStyleName('backgroundColor')
|
6308 | * < "background-color"
|
6309 | * > hyphenateStyleName('MozTransition')
|
6310 | * < "-moz-transition"
|
6311 | * > hyphenateStyleName('msTransition')
|
6312 | * < "-ms-transition"
|
6313 | *
|
6314 | * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix
|
6315 | * is converted to `-ms-`.
|
6316 | *
|
6317 | * @param {string} string
|
6318 | * @return {string}
|
6319 | */
|
6320 | function hyphenateStyleName(string) {
|
6321 | return hyphenate_1(string).replace(msPattern$1, '-ms-');
|
6322 | }
|
6323 |
|
6324 | var hyphenateStyleName_1 = hyphenateStyleName;
|
6325 |
|
6326 | /**
|
6327 | * Copyright (c) 2013-present, Facebook, Inc.
|
6328 | * All rights reserved.
|
6329 | *
|
6330 | * This source code is licensed under the BSD-style license found in the
|
6331 | * LICENSE file in the root directory of this source tree. An additional grant
|
6332 | * of patent rights can be found in the PATENTS file in the same directory.
|
6333 | *
|
6334 | *
|
6335 | * @typechecks static-only
|
6336 | */
|
6337 |
|
6338 | /**
|
6339 | * Memoizes the return value of a function that accepts one string argument.
|
6340 | */
|
6341 |
|
6342 | function memoizeStringOnly(callback) {
|
6343 | var cache = {};
|
6344 | return function (string) {
|
6345 | if (!cache.hasOwnProperty(string)) {
|
6346 | cache[string] = callback.call(this, string);
|
6347 | }
|
6348 | return cache[string];
|
6349 | };
|
6350 | }
|
6351 |
|
6352 | var memoizeStringOnly_1 = memoizeStringOnly;
|
6353 |
|
6354 | var processStyleName = memoizeStringOnly_1(function (styleName) {
|
6355 | return hyphenateStyleName_1(styleName);
|
6356 | });
|
6357 |
|
6358 | var hasShorthandPropertyBug = false;
|
6359 | var styleFloatAccessor = 'cssFloat';
|
6360 | if (ExecutionEnvironment_1.canUseDOM) {
|
6361 | var tempStyle = document.createElement('div').style;
|
6362 | try {
|
6363 | // IE8 throws "Invalid argument." if resetting shorthand style properties.
|
6364 | tempStyle.font = '';
|
6365 | } catch (e) {
|
6366 | hasShorthandPropertyBug = true;
|
6367 | }
|
6368 | // IE8 only supports accessing cssFloat (standard) as styleFloat
|
6369 | if (document.documentElement.style.cssFloat === undefined) {
|
6370 | styleFloatAccessor = 'styleFloat';
|
6371 | }
|
6372 | }
|
6373 |
|
6374 | /**
|
6375 | * Operations for dealing with CSS properties.
|
6376 | */
|
6377 | var CSSPropertyOperations = {
|
6378 | /**
|
6379 | * Serializes a mapping of style properties for use as inline styles:
|
6380 | *
|
6381 | * > createMarkupForStyles({width: '200px', height: 0})
|
6382 | * "width:200px;height:0;"
|
6383 | *
|
6384 | * Undefined values are ignored so that declarative programming is easier.
|
6385 | * The result should be HTML-escaped before insertion into the DOM.
|
6386 | *
|
6387 | * @param {object} styles
|
6388 | * @param {ReactDOMComponent} component
|
6389 | * @return {?string}
|
6390 | */
|
6391 | createMarkupForStyles: function (styles, component) {
|
6392 | var serialized = '';
|
6393 | for (var styleName in styles) {
|
6394 | if (!styles.hasOwnProperty(styleName)) {
|
6395 | continue;
|
6396 | }
|
6397 | var isCustomProperty = styleName.indexOf('--') === 0;
|
6398 | var styleValue = styles[styleName];
|
6399 | if (styleValue != null) {
|
6400 | serialized += processStyleName(styleName) + ':';
|
6401 | serialized += dangerousStyleValue_1(styleName, styleValue, component, isCustomProperty) + ';';
|
6402 | }
|
6403 | }
|
6404 | return serialized || null;
|
6405 | },
|
6406 |
|
6407 | /**
|
6408 | * Sets the value for multiple styles on a node. If a value is specified as
|
6409 | * '' (empty string), the corresponding style property will be unset.
|
6410 | *
|
6411 | * @param {DOMElement} node
|
6412 | * @param {object} styles
|
6413 | * @param {ReactDOMComponent} component
|
6414 | */
|
6415 | setValueForStyles: function (node, styles, component) {
|
6416 | var style = node.style;
|
6417 | for (var styleName in styles) {
|
6418 | if (!styles.hasOwnProperty(styleName)) {
|
6419 | continue;
|
6420 | }
|
6421 | var isCustomProperty = styleName.indexOf('--') === 0;
|
6422 | var styleValue = dangerousStyleValue_1(styleName, styles[styleName], component, isCustomProperty);
|
6423 | if (styleName === 'float' || styleName === 'cssFloat') {
|
6424 | styleName = styleFloatAccessor;
|
6425 | }
|
6426 | if (isCustomProperty) {
|
6427 | style.setProperty(styleName, styleValue);
|
6428 | } else if (styleValue) {
|
6429 | style[styleName] = styleValue;
|
6430 | } else {
|
6431 | var expansion = hasShorthandPropertyBug && CSSProperty_1.shorthandPropertyExpansions[styleName];
|
6432 | if (expansion) {
|
6433 | // Shorthand property that IE8 won't like unsetting, so unset each
|
6434 | // component to placate it
|
6435 | for (var individualStyleName in expansion) {
|
6436 | style[individualStyleName] = '';
|
6437 | }
|
6438 | } else {
|
6439 | style[styleName] = '';
|
6440 | }
|
6441 | }
|
6442 | }
|
6443 | }
|
6444 | };
|
6445 |
|
6446 | var CSSPropertyOperations_1 = CSSPropertyOperations;
|
6447 |
|
6448 | /**
|
6449 | * Escapes attribute value to prevent scripting attacks.
|
6450 | *
|
6451 | * @param {*} value Value to escape.
|
6452 | * @return {string} An escaped string.
|
6453 | */
|
6454 | function quoteAttributeValueForBrowser(value) {
|
6455 | return '"' + escapeTextContentForBrowser_1(value) + '"';
|
6456 | }
|
6457 |
|
6458 | var quoteAttributeValueForBrowser_1 = quoteAttributeValueForBrowser;
|
6459 |
|
6460 | var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + DOMProperty_1.ATTRIBUTE_NAME_START_CHAR + '][' + DOMProperty_1.ATTRIBUTE_NAME_CHAR + ']*$');
|
6461 | var illegalAttributeNameCache = {};
|
6462 | var validatedAttributeNameCache = {};
|
6463 |
|
6464 | function isAttributeNameSafe(attributeName) {
|
6465 | if (validatedAttributeNameCache.hasOwnProperty(attributeName)) {
|
6466 | return true;
|
6467 | }
|
6468 | if (illegalAttributeNameCache.hasOwnProperty(attributeName)) {
|
6469 | return false;
|
6470 | }
|
6471 | if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {
|
6472 | validatedAttributeNameCache[attributeName] = true;
|
6473 | return true;
|
6474 | }
|
6475 | illegalAttributeNameCache[attributeName] = true;
|
6476 | void 0;
|
6477 | return false;
|
6478 | }
|
6479 |
|
6480 | function shouldIgnoreValue(propertyInfo, value) {
|
6481 | return value == null || propertyInfo.hasBooleanValue && !value || propertyInfo.hasNumericValue && isNaN(value) || propertyInfo.hasPositiveNumericValue && value < 1 || propertyInfo.hasOverloadedBooleanValue && value === false;
|
6482 | }
|
6483 |
|
6484 | /**
|
6485 | * Operations for dealing with DOM properties.
|
6486 | */
|
6487 | var DOMPropertyOperations = {
|
6488 | /**
|
6489 | * Creates markup for the ID property.
|
6490 | *
|
6491 | * @param {string} id Unescaped ID.
|
6492 | * @return {string} Markup string.
|
6493 | */
|
6494 | createMarkupForID: function (id) {
|
6495 | return DOMProperty_1.ID_ATTRIBUTE_NAME + '=' + quoteAttributeValueForBrowser_1(id);
|
6496 | },
|
6497 |
|
6498 | setAttributeForID: function (node, id) {
|
6499 | node.setAttribute(DOMProperty_1.ID_ATTRIBUTE_NAME, id);
|
6500 | },
|
6501 |
|
6502 | createMarkupForRoot: function () {
|
6503 | return DOMProperty_1.ROOT_ATTRIBUTE_NAME + '=""';
|
6504 | },
|
6505 |
|
6506 | setAttributeForRoot: function (node) {
|
6507 | node.setAttribute(DOMProperty_1.ROOT_ATTRIBUTE_NAME, '');
|
6508 | },
|
6509 |
|
6510 | /**
|
6511 | * Creates markup for a property.
|
6512 | *
|
6513 | * @param {string} name
|
6514 | * @param {*} value
|
6515 | * @return {?string} Markup string, or null if the property was invalid.
|
6516 | */
|
6517 | createMarkupForProperty: function (name, value) {
|
6518 | var propertyInfo = DOMProperty_1.properties.hasOwnProperty(name) ? DOMProperty_1.properties[name] : null;
|
6519 | if (propertyInfo) {
|
6520 | if (shouldIgnoreValue(propertyInfo, value)) {
|
6521 | return '';
|
6522 | }
|
6523 | var attributeName = propertyInfo.attributeName;
|
6524 | if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) {
|
6525 | return attributeName + '=""';
|
6526 | }
|
6527 | return attributeName + '=' + quoteAttributeValueForBrowser_1(value);
|
6528 | } else if (DOMProperty_1.isCustomAttribute(name)) {
|
6529 | if (value == null) {
|
6530 | return '';
|
6531 | }
|
6532 | return name + '=' + quoteAttributeValueForBrowser_1(value);
|
6533 | }
|
6534 | return null;
|
6535 | },
|
6536 |
|
6537 | /**
|
6538 | * Creates markup for a custom property.
|
6539 | *
|
6540 | * @param {string} name
|
6541 | * @param {*} value
|
6542 | * @return {string} Markup string, or empty string if the property was invalid.
|
6543 | */
|
6544 | createMarkupForCustomAttribute: function (name, value) {
|
6545 | if (!isAttributeNameSafe(name) || value == null) {
|
6546 | return '';
|
6547 | }
|
6548 | return name + '=' + quoteAttributeValueForBrowser_1(value);
|
6549 | },
|
6550 |
|
6551 | /**
|
6552 | * Sets the value for a property on a node.
|
6553 | *
|
6554 | * @param {DOMElement} node
|
6555 | * @param {string} name
|
6556 | * @param {*} value
|
6557 | */
|
6558 | setValueForProperty: function (node, name, value) {
|
6559 | var propertyInfo = DOMProperty_1.properties.hasOwnProperty(name) ? DOMProperty_1.properties[name] : null;
|
6560 | if (propertyInfo) {
|
6561 | var mutationMethod = propertyInfo.mutationMethod;
|
6562 | if (mutationMethod) {
|
6563 | mutationMethod(node, value);
|
6564 | } else if (shouldIgnoreValue(propertyInfo, value)) {
|
6565 | this.deleteValueForProperty(node, name);
|
6566 | return;
|
6567 | } else if (propertyInfo.mustUseProperty) {
|
6568 | // Contrary to `setAttribute`, object properties are properly
|
6569 | // `toString`ed by IE8/9.
|
6570 | node[propertyInfo.propertyName] = value;
|
6571 | } else {
|
6572 | var attributeName = propertyInfo.attributeName;
|
6573 | var namespace = propertyInfo.attributeNamespace;
|
6574 | // `setAttribute` with objects becomes only `[object]` in IE8/9,
|
6575 | // ('' + value) makes it output the correct toString()-value.
|
6576 | if (namespace) {
|
6577 | node.setAttributeNS(namespace, attributeName, '' + value);
|
6578 | } else if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) {
|
6579 | node.setAttribute(attributeName, '');
|
6580 | } else {
|
6581 | node.setAttribute(attributeName, '' + value);
|
6582 | }
|
6583 | }
|
6584 | } else if (DOMProperty_1.isCustomAttribute(name)) {
|
6585 | DOMPropertyOperations.setValueForAttribute(node, name, value);
|
6586 | return;
|
6587 | }
|
6588 |
|
6589 |
|
6590 | },
|
6591 |
|
6592 | setValueForAttribute: function (node, name, value) {
|
6593 | if (!isAttributeNameSafe(name)) {
|
6594 | return;
|
6595 | }
|
6596 | if (value == null) {
|
6597 | node.removeAttribute(name);
|
6598 | } else {
|
6599 | node.setAttribute(name, '' + value);
|
6600 | }
|
6601 |
|
6602 |
|
6603 | },
|
6604 |
|
6605 | /**
|
6606 | * Deletes an attributes from a node.
|
6607 | *
|
6608 | * @param {DOMElement} node
|
6609 | * @param {string} name
|
6610 | */
|
6611 | deleteValueForAttribute: function (node, name) {
|
6612 | node.removeAttribute(name);
|
6613 |
|
6614 | },
|
6615 |
|
6616 | /**
|
6617 | * Deletes the value for a property on a node.
|
6618 | *
|
6619 | * @param {DOMElement} node
|
6620 | * @param {string} name
|
6621 | */
|
6622 | deleteValueForProperty: function (node, name) {
|
6623 | var propertyInfo = DOMProperty_1.properties.hasOwnProperty(name) ? DOMProperty_1.properties[name] : null;
|
6624 | if (propertyInfo) {
|
6625 | var mutationMethod = propertyInfo.mutationMethod;
|
6626 | if (mutationMethod) {
|
6627 | mutationMethod(node, undefined);
|
6628 | } else if (propertyInfo.mustUseProperty) {
|
6629 | var propName = propertyInfo.propertyName;
|
6630 | if (propertyInfo.hasBooleanValue) {
|
6631 | node[propName] = false;
|
6632 | } else {
|
6633 | node[propName] = '';
|
6634 | }
|
6635 | } else {
|
6636 | node.removeAttribute(propertyInfo.attributeName);
|
6637 | }
|
6638 | } else if (DOMProperty_1.isCustomAttribute(name)) {
|
6639 | node.removeAttribute(name);
|
6640 | }
|
6641 |
|
6642 |
|
6643 | }
|
6644 | };
|
6645 |
|
6646 | var DOMPropertyOperations_1 = DOMPropertyOperations;
|
6647 |
|
6648 | function runEventQueueInBatch(events) {
|
6649 | EventPluginHub_1.enqueueEvents(events);
|
6650 | EventPluginHub_1.processEventQueue(false);
|
6651 | }
|
6652 |
|
6653 | var ReactEventEmitterMixin = {
|
6654 | /**
|
6655 | * Streams a fired top-level event to `EventPluginHub` where plugins have the
|
6656 | * opportunity to create `ReactEvent`s to be dispatched.
|
6657 | */
|
6658 | handleTopLevel: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {
|
6659 | var events = EventPluginHub_1.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget);
|
6660 | runEventQueueInBatch(events);
|
6661 | }
|
6662 | };
|
6663 |
|
6664 | var ReactEventEmitterMixin_1 = ReactEventEmitterMixin;
|
6665 |
|
6666 | /**
|
6667 | * Generate a mapping of standard vendor prefixes using the defined style property and event name.
|
6668 | *
|
6669 | * @param {string} styleProp
|
6670 | * @param {string} eventName
|
6671 | * @returns {object}
|
6672 | */
|
6673 | function makePrefixMap(styleProp, eventName) {
|
6674 | var prefixes = {};
|
6675 |
|
6676 | prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();
|
6677 | prefixes['Webkit' + styleProp] = 'webkit' + eventName;
|
6678 | prefixes['Moz' + styleProp] = 'moz' + eventName;
|
6679 | prefixes['ms' + styleProp] = 'MS' + eventName;
|
6680 | prefixes['O' + styleProp] = 'o' + eventName.toLowerCase();
|
6681 |
|
6682 | return prefixes;
|
6683 | }
|
6684 |
|
6685 | /**
|
6686 | * A list of event names to a configurable list of vendor prefixes.
|
6687 | */
|
6688 | var vendorPrefixes = {
|
6689 | animationend: makePrefixMap('Animation', 'AnimationEnd'),
|
6690 | animationiteration: makePrefixMap('Animation', 'AnimationIteration'),
|
6691 | animationstart: makePrefixMap('Animation', 'AnimationStart'),
|
6692 | transitionend: makePrefixMap('Transition', 'TransitionEnd')
|
6693 | };
|
6694 |
|
6695 | /**
|
6696 | * Event names that have already been detected and prefixed (if applicable).
|
6697 | */
|
6698 | var prefixedEventNames = {};
|
6699 |
|
6700 | /**
|
6701 | * Element to check for prefixes on.
|
6702 | */
|
6703 | var style = {};
|
6704 |
|
6705 | /**
|
6706 | * Bootstrap if a DOM exists.
|
6707 | */
|
6708 | if (ExecutionEnvironment_1.canUseDOM) {
|
6709 | style = document.createElement('div').style;
|
6710 |
|
6711 | // On some platforms, in particular some releases of Android 4.x,
|
6712 | // the un-prefixed "animation" and "transition" properties are defined on the
|
6713 | // style object but the events that fire will still be prefixed, so we need
|
6714 | // to check if the un-prefixed events are usable, and if not remove them from the map.
|
6715 | if (!('AnimationEvent' in window)) {
|
6716 | delete vendorPrefixes.animationend.animation;
|
6717 | delete vendorPrefixes.animationiteration.animation;
|
6718 | delete vendorPrefixes.animationstart.animation;
|
6719 | }
|
6720 |
|
6721 | // Same as above
|
6722 | if (!('TransitionEvent' in window)) {
|
6723 | delete vendorPrefixes.transitionend.transition;
|
6724 | }
|
6725 | }
|
6726 |
|
6727 | /**
|
6728 | * Attempts to determine the correct vendor prefixed event name.
|
6729 | *
|
6730 | * @param {string} eventName
|
6731 | * @returns {string}
|
6732 | */
|
6733 | function getVendorPrefixedEventName(eventName) {
|
6734 | if (prefixedEventNames[eventName]) {
|
6735 | return prefixedEventNames[eventName];
|
6736 | } else if (!vendorPrefixes[eventName]) {
|
6737 | return eventName;
|
6738 | }
|
6739 |
|
6740 | var prefixMap = vendorPrefixes[eventName];
|
6741 |
|
6742 | for (var styleProp in prefixMap) {
|
6743 | if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) {
|
6744 | return prefixedEventNames[eventName] = prefixMap[styleProp];
|
6745 | }
|
6746 | }
|
6747 |
|
6748 | return '';
|
6749 | }
|
6750 |
|
6751 | var getVendorPrefixedEventName_1 = getVendorPrefixedEventName;
|
6752 |
|
6753 | /**
|
6754 | * Summary of `ReactBrowserEventEmitter` event handling:
|
6755 | *
|
6756 | * - Top-level delegation is used to trap most native browser events. This
|
6757 | * may only occur in the main thread and is the responsibility of
|
6758 | * ReactEventListener, which is injected and can therefore support pluggable
|
6759 | * event sources. This is the only work that occurs in the main thread.
|
6760 | *
|
6761 | * - We normalize and de-duplicate events to account for browser quirks. This
|
6762 | * may be done in the worker thread.
|
6763 | *
|
6764 | * - Forward these native events (with the associated top-level type used to
|
6765 | * trap it) to `EventPluginHub`, which in turn will ask plugins if they want
|
6766 | * to extract any synthetic events.
|
6767 | *
|
6768 | * - The `EventPluginHub` will then process each event by annotating them with
|
6769 | * "dispatches", a sequence of listeners and IDs that care about that event.
|
6770 | *
|
6771 | * - The `EventPluginHub` then dispatches the events.
|
6772 | *
|
6773 | * Overview of React and the event system:
|
6774 | *
|
6775 | * +------------+ .
|
6776 | * | DOM | .
|
6777 | * +------------+ .
|
6778 | * | .
|
6779 | * v .
|
6780 | * +------------+ .
|
6781 | * | ReactEvent | .
|
6782 | * | Listener | .
|
6783 | * +------------+ . +-----------+
|
6784 | * | . +--------+|SimpleEvent|
|
6785 | * | . | |Plugin |
|
6786 | * +-----|------+ . v +-----------+
|
6787 | * | | | . +--------------+ +------------+
|
6788 | * | +-----------.--->|EventPluginHub| | Event |
|
6789 | * | | . | | +-----------+ | Propagators|
|
6790 | * | ReactEvent | . | | |TapEvent | |------------|
|
6791 | * | Emitter | . | |<---+|Plugin | |other plugin|
|
6792 | * | | . | | +-----------+ | utilities |
|
6793 | * | +-----------.--->| | +------------+
|
6794 | * | | | . +--------------+
|
6795 | * +-----|------+ . ^ +-----------+
|
6796 | * | . | |Enter/Leave|
|
6797 | * + . +-------+|Plugin |
|
6798 | * +-------------+ . +-----------+
|
6799 | * | application | .
|
6800 | * |-------------| .
|
6801 | * | | .
|
6802 | * | | .
|
6803 | * +-------------+ .
|
6804 | * .
|
6805 | * React Core . General Purpose Event Plugin System
|
6806 | */
|
6807 |
|
6808 | var hasEventPageXY;
|
6809 | var alreadyListeningTo = {};
|
6810 | var isMonitoringScrollValue = false;
|
6811 | var reactTopListenersCounter = 0;
|
6812 |
|
6813 | // For events like 'submit' which don't consistently bubble (which we trap at a
|
6814 | // lower node than `document`), binding at `document` would cause duplicate
|
6815 | // events so we don't include them here
|
6816 | var topEventMapping = {
|
6817 | topAbort: 'abort',
|
6818 | topAnimationEnd: getVendorPrefixedEventName_1('animationend') || 'animationend',
|
6819 | topAnimationIteration: getVendorPrefixedEventName_1('animationiteration') || 'animationiteration',
|
6820 | topAnimationStart: getVendorPrefixedEventName_1('animationstart') || 'animationstart',
|
6821 | topBlur: 'blur',
|
6822 | topCanPlay: 'canplay',
|
6823 | topCanPlayThrough: 'canplaythrough',
|
6824 | topChange: 'change',
|
6825 | topClick: 'click',
|
6826 | topCompositionEnd: 'compositionend',
|
6827 | topCompositionStart: 'compositionstart',
|
6828 | topCompositionUpdate: 'compositionupdate',
|
6829 | topContextMenu: 'contextmenu',
|
6830 | topCopy: 'copy',
|
6831 | topCut: 'cut',
|
6832 | topDoubleClick: 'dblclick',
|
6833 | topDrag: 'drag',
|
6834 | topDragEnd: 'dragend',
|
6835 | topDragEnter: 'dragenter',
|
6836 | topDragExit: 'dragexit',
|
6837 | topDragLeave: 'dragleave',
|
6838 | topDragOver: 'dragover',
|
6839 | topDragStart: 'dragstart',
|
6840 | topDrop: 'drop',
|
6841 | topDurationChange: 'durationchange',
|
6842 | topEmptied: 'emptied',
|
6843 | topEncrypted: 'encrypted',
|
6844 | topEnded: 'ended',
|
6845 | topError: 'error',
|
6846 | topFocus: 'focus',
|
6847 | topInput: 'input',
|
6848 | topKeyDown: 'keydown',
|
6849 | topKeyPress: 'keypress',
|
6850 | topKeyUp: 'keyup',
|
6851 | topLoadedData: 'loadeddata',
|
6852 | topLoadedMetadata: 'loadedmetadata',
|
6853 | topLoadStart: 'loadstart',
|
6854 | topMouseDown: 'mousedown',
|
6855 | topMouseMove: 'mousemove',
|
6856 | topMouseOut: 'mouseout',
|
6857 | topMouseOver: 'mouseover',
|
6858 | topMouseUp: 'mouseup',
|
6859 | topPaste: 'paste',
|
6860 | topPause: 'pause',
|
6861 | topPlay: 'play',
|
6862 | topPlaying: 'playing',
|
6863 | topProgress: 'progress',
|
6864 | topRateChange: 'ratechange',
|
6865 | topScroll: 'scroll',
|
6866 | topSeeked: 'seeked',
|
6867 | topSeeking: 'seeking',
|
6868 | topSelectionChange: 'selectionchange',
|
6869 | topStalled: 'stalled',
|
6870 | topSuspend: 'suspend',
|
6871 | topTextInput: 'textInput',
|
6872 | topTimeUpdate: 'timeupdate',
|
6873 | topTouchCancel: 'touchcancel',
|
6874 | topTouchEnd: 'touchend',
|
6875 | topTouchMove: 'touchmove',
|
6876 | topTouchStart: 'touchstart',
|
6877 | topTransitionEnd: getVendorPrefixedEventName_1('transitionend') || 'transitionend',
|
6878 | topVolumeChange: 'volumechange',
|
6879 | topWaiting: 'waiting',
|
6880 | topWheel: 'wheel'
|
6881 | };
|
6882 |
|
6883 | /**
|
6884 | * To ensure no conflicts with other potential React instances on the page
|
6885 | */
|
6886 | var topListenersIDKey = '_reactListenersID' + String(Math.random()).slice(2);
|
6887 |
|
6888 | function getListeningForDocument(mountAt) {
|
6889 | // In IE8, `mountAt` is a host object and doesn't have `hasOwnProperty`
|
6890 | // directly.
|
6891 | if (!Object.prototype.hasOwnProperty.call(mountAt, topListenersIDKey)) {
|
6892 | mountAt[topListenersIDKey] = reactTopListenersCounter++;
|
6893 | alreadyListeningTo[mountAt[topListenersIDKey]] = {};
|
6894 | }
|
6895 | return alreadyListeningTo[mountAt[topListenersIDKey]];
|
6896 | }
|
6897 |
|
6898 | /**
|
6899 | * `ReactBrowserEventEmitter` is used to attach top-level event listeners. For
|
6900 | * example:
|
6901 | *
|
6902 | * EventPluginHub.putListener('myID', 'onClick', myFunction);
|
6903 | *
|
6904 | * This would allocate a "registration" of `('onClick', myFunction)` on 'myID'.
|
6905 | *
|
6906 | * @internal
|
6907 | */
|
6908 | var ReactBrowserEventEmitter = objectAssign({}, ReactEventEmitterMixin_1, {
|
6909 | /**
|
6910 | * Injectable event backend
|
6911 | */
|
6912 | ReactEventListener: null,
|
6913 |
|
6914 | injection: {
|
6915 | /**
|
6916 | * @param {object} ReactEventListener
|
6917 | */
|
6918 | injectReactEventListener: function (ReactEventListener) {
|
6919 | ReactEventListener.setHandleTopLevel(ReactBrowserEventEmitter.handleTopLevel);
|
6920 | ReactBrowserEventEmitter.ReactEventListener = ReactEventListener;
|
6921 | }
|
6922 | },
|
6923 |
|
6924 | /**
|
6925 | * Sets whether or not any created callbacks should be enabled.
|
6926 | *
|
6927 | * @param {boolean} enabled True if callbacks should be enabled.
|
6928 | */
|
6929 | setEnabled: function (enabled) {
|
6930 | if (ReactBrowserEventEmitter.ReactEventListener) {
|
6931 | ReactBrowserEventEmitter.ReactEventListener.setEnabled(enabled);
|
6932 | }
|
6933 | },
|
6934 |
|
6935 | /**
|
6936 | * @return {boolean} True if callbacks are enabled.
|
6937 | */
|
6938 | isEnabled: function () {
|
6939 | return !!(ReactBrowserEventEmitter.ReactEventListener && ReactBrowserEventEmitter.ReactEventListener.isEnabled());
|
6940 | },
|
6941 |
|
6942 | /**
|
6943 | * We listen for bubbled touch events on the document object.
|
6944 | *
|
6945 | * Firefox v8.01 (and possibly others) exhibited strange behavior when
|
6946 | * mounting `onmousemove` events at some node that was not the document
|
6947 | * element. The symptoms were that if your mouse is not moving over something
|
6948 | * contained within that mount point (for example on the background) the
|
6949 | * top-level listeners for `onmousemove` won't be called. However, if you
|
6950 | * register the `mousemove` on the document object, then it will of course
|
6951 | * catch all `mousemove`s. This along with iOS quirks, justifies restricting
|
6952 | * top-level listeners to the document object only, at least for these
|
6953 | * movement types of events and possibly all events.
|
6954 | *
|
6955 | * @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html
|
6956 | *
|
6957 | * Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but
|
6958 | * they bubble to document.
|
6959 | *
|
6960 | * @param {string} registrationName Name of listener (e.g. `onClick`).
|
6961 | * @param {object} contentDocumentHandle Document which owns the container
|
6962 | */
|
6963 | listenTo: function (registrationName, contentDocumentHandle) {
|
6964 | var mountAt = contentDocumentHandle;
|
6965 | var isListening = getListeningForDocument(mountAt);
|
6966 | var dependencies = EventPluginRegistry_1.registrationNameDependencies[registrationName];
|
6967 |
|
6968 | for (var i = 0; i < dependencies.length; i++) {
|
6969 | var dependency = dependencies[i];
|
6970 | if (!(isListening.hasOwnProperty(dependency) && isListening[dependency])) {
|
6971 | if (dependency === 'topWheel') {
|
6972 | if (isEventSupported_1('wheel')) {
|
6973 | ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topWheel', 'wheel', mountAt);
|
6974 | } else if (isEventSupported_1('mousewheel')) {
|
6975 | ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topWheel', 'mousewheel', mountAt);
|
6976 | } else {
|
6977 | // Firefox needs to capture a different mouse scroll event.
|
6978 | // @see http://www.quirksmode.org/dom/events/tests/scroll.html
|
6979 | ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topWheel', 'DOMMouseScroll', mountAt);
|
6980 | }
|
6981 | } else if (dependency === 'topScroll') {
|
6982 | if (isEventSupported_1('scroll', true)) {
|
6983 | ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent('topScroll', 'scroll', mountAt);
|
6984 | } else {
|
6985 | ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topScroll', 'scroll', ReactBrowserEventEmitter.ReactEventListener.WINDOW_HANDLE);
|
6986 | }
|
6987 | } else if (dependency === 'topFocus' || dependency === 'topBlur') {
|
6988 | if (isEventSupported_1('focus', true)) {
|
6989 | ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent('topFocus', 'focus', mountAt);
|
6990 | ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent('topBlur', 'blur', mountAt);
|
6991 | } else if (isEventSupported_1('focusin')) {
|
6992 | // IE has `focusin` and `focusout` events which bubble.
|
6993 | // @see http://www.quirksmode.org/blog/archives/2008/04/delegating_the.html
|
6994 | ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topFocus', 'focusin', mountAt);
|
6995 | ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topBlur', 'focusout', mountAt);
|
6996 | }
|
6997 |
|
6998 | // to make sure blur and focus event listeners are only attached once
|
6999 | isListening.topBlur = true;
|
7000 | isListening.topFocus = true;
|
7001 | } else if (topEventMapping.hasOwnProperty(dependency)) {
|
7002 | ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(dependency, topEventMapping[dependency], mountAt);
|
7003 | }
|
7004 |
|
7005 | isListening[dependency] = true;
|
7006 | }
|
7007 | }
|
7008 | },
|
7009 |
|
7010 | trapBubbledEvent: function (topLevelType, handlerBaseName, handle) {
|
7011 | return ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelType, handlerBaseName, handle);
|
7012 | },
|
7013 |
|
7014 | trapCapturedEvent: function (topLevelType, handlerBaseName, handle) {
|
7015 | return ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelType, handlerBaseName, handle);
|
7016 | },
|
7017 |
|
7018 | /**
|
7019 | * Protect against document.createEvent() returning null
|
7020 | * Some popup blocker extensions appear to do this:
|
7021 | * https://github.com/facebook/react/issues/6887
|
7022 | */
|
7023 | supportsEventPageXY: function () {
|
7024 | if (!document.createEvent) {
|
7025 | return false;
|
7026 | }
|
7027 | var ev = document.createEvent('MouseEvent');
|
7028 | return ev != null && 'pageX' in ev;
|
7029 | },
|
7030 |
|
7031 | /**
|
7032 | * Listens to window scroll and resize events. We cache scroll values so that
|
7033 | * application code can access them without triggering reflows.
|
7034 | *
|
7035 | * ViewportMetrics is only used by SyntheticMouse/TouchEvent and only when
|
7036 | * pageX/pageY isn't supported (legacy browsers).
|
7037 | *
|
7038 | * NOTE: Scroll events do not bubble.
|
7039 | *
|
7040 | * @see http://www.quirksmode.org/dom/events/scroll.html
|
7041 | */
|
7042 | ensureScrollValueMonitoring: function () {
|
7043 | if (hasEventPageXY === undefined) {
|
7044 | hasEventPageXY = ReactBrowserEventEmitter.supportsEventPageXY();
|
7045 | }
|
7046 | if (!hasEventPageXY && !isMonitoringScrollValue) {
|
7047 | var refresh = ViewportMetrics_1.refreshScrollValues;
|
7048 | ReactBrowserEventEmitter.ReactEventListener.monitorScrollValue(refresh);
|
7049 | isMonitoringScrollValue = true;
|
7050 | }
|
7051 | }
|
7052 | });
|
7053 |
|
7054 | var ReactBrowserEventEmitter_1 = ReactBrowserEventEmitter;
|
7055 |
|
7056 | /**
|
7057 | * Copyright 2013-present, Facebook, Inc.
|
7058 | * All rights reserved.
|
7059 | *
|
7060 | * This source code is licensed under the BSD-style license found in the
|
7061 | * LICENSE file in the root directory of this source tree. An additional grant
|
7062 | * of patent rights can be found in the PATENTS file in the same directory.
|
7063 | *
|
7064 | *
|
7065 | */
|
7066 |
|
7067 | var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
|
7068 |
|
7069 | var ReactPropTypesSecret_1 = ReactPropTypesSecret;
|
7070 |
|
7071 | /**
|
7072 | * Copyright 2013-present, Facebook, Inc.
|
7073 | * All rights reserved.
|
7074 | *
|
7075 | * This source code is licensed under the BSD-style license found in the
|
7076 | * LICENSE file in the root directory of this source tree. An additional grant
|
7077 | * of patent rights can be found in the PATENTS file in the same directory.
|
7078 | */
|
7079 |
|
7080 | var ReactPropTypesSecret$1 = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
|
7081 |
|
7082 | var ReactPropTypesSecret_1$2 = ReactPropTypesSecret$1;
|
7083 |
|
7084 | /**
|
7085 | * Copyright 2013-present, Facebook, Inc.
|
7086 | * All rights reserved.
|
7087 | *
|
7088 | * This source code is licensed under the BSD-style license found in the
|
7089 | * LICENSE file in the root directory of this source tree. An additional grant
|
7090 | * of patent rights can be found in the PATENTS file in the same directory.
|
7091 | */
|
7092 |
|
7093 | /**
|
7094 | * Assert that the values match with the type specs.
|
7095 | * Error messages are memorized and will only be shown once.
|
7096 | *
|
7097 | * @param {object} typeSpecs Map of name to a ReactPropType
|
7098 | * @param {object} values Runtime values that need to be type-checked
|
7099 | * @param {string} location e.g. "prop", "context", "child context"
|
7100 | * @param {string} componentName Name of the component for error messages.
|
7101 | * @param {?Function} getStack Returns the component stack.
|
7102 | * @private
|
7103 | */
|
7104 | function checkPropTypes(typeSpecs, values, location, componentName, getStack) {
|
7105 |
|
7106 | }
|
7107 |
|
7108 | var checkPropTypes_1 = checkPropTypes;
|
7109 |
|
7110 | var factoryWithTypeCheckers = function(isValidElement, throwOnDirectAccess) {
|
7111 | /* global Symbol */
|
7112 | var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
|
7113 | var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.
|
7114 |
|
7115 | /**
|
7116 | * Returns the iterator method function contained on the iterable object.
|
7117 | *
|
7118 | * Be sure to invoke the function with the iterable as context:
|
7119 | *
|
7120 | * var iteratorFn = getIteratorFn(myIterable);
|
7121 | * if (iteratorFn) {
|
7122 | * var iterator = iteratorFn.call(myIterable);
|
7123 | * ...
|
7124 | * }
|
7125 | *
|
7126 | * @param {?object} maybeIterable
|
7127 | * @return {?function}
|
7128 | */
|
7129 | function getIteratorFn(maybeIterable) {
|
7130 | var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);
|
7131 | if (typeof iteratorFn === 'function') {
|
7132 | return iteratorFn;
|
7133 | }
|
7134 | }
|
7135 |
|
7136 | /**
|
7137 | * Collection of methods that allow declaration and validation of props that are
|
7138 | * supplied to React components. Example usage:
|
7139 | *
|
7140 | * var Props = require('ReactPropTypes');
|
7141 | * var MyArticle = React.createClass({
|
7142 | * propTypes: {
|
7143 | * // An optional string prop named "description".
|
7144 | * description: Props.string,
|
7145 | *
|
7146 | * // A required enum prop named "category".
|
7147 | * category: Props.oneOf(['News','Photos']).isRequired,
|
7148 | *
|
7149 | * // A prop named "dialog" that requires an instance of Dialog.
|
7150 | * dialog: Props.instanceOf(Dialog).isRequired
|
7151 | * },
|
7152 | * render: function() { ... }
|
7153 | * });
|
7154 | *
|
7155 | * A more formal specification of how these methods are used:
|
7156 | *
|
7157 | * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)
|
7158 | * decl := ReactPropTypes.{type}(.isRequired)?
|
7159 | *
|
7160 | * Each and every declaration produces a function with the same signature. This
|
7161 | * allows the creation of custom validation functions. For example:
|
7162 | *
|
7163 | * var MyLink = React.createClass({
|
7164 | * propTypes: {
|
7165 | * // An optional string or URI prop named "href".
|
7166 | * href: function(props, propName, componentName) {
|
7167 | * var propValue = props[propName];
|
7168 | * if (propValue != null && typeof propValue !== 'string' &&
|
7169 | * !(propValue instanceof URI)) {
|
7170 | * return new Error(
|
7171 | * 'Expected a string or an URI for ' + propName + ' in ' +
|
7172 | * componentName
|
7173 | * );
|
7174 | * }
|
7175 | * }
|
7176 | * },
|
7177 | * render: function() {...}
|
7178 | * });
|
7179 | *
|
7180 | * @internal
|
7181 | */
|
7182 |
|
7183 | var ANONYMOUS = '<<anonymous>>';
|
7184 |
|
7185 | // Important!
|
7186 | // Keep this list in sync with production version in `./factoryWithThrowingShims.js`.
|
7187 | var ReactPropTypes = {
|
7188 | array: createPrimitiveTypeChecker('array'),
|
7189 | bool: createPrimitiveTypeChecker('boolean'),
|
7190 | func: createPrimitiveTypeChecker('function'),
|
7191 | number: createPrimitiveTypeChecker('number'),
|
7192 | object: createPrimitiveTypeChecker('object'),
|
7193 | string: createPrimitiveTypeChecker('string'),
|
7194 | symbol: createPrimitiveTypeChecker('symbol'),
|
7195 |
|
7196 | any: createAnyTypeChecker(),
|
7197 | arrayOf: createArrayOfTypeChecker,
|
7198 | element: createElementTypeChecker(),
|
7199 | instanceOf: createInstanceTypeChecker,
|
7200 | node: createNodeChecker(),
|
7201 | objectOf: createObjectOfTypeChecker,
|
7202 | oneOf: createEnumTypeChecker,
|
7203 | oneOfType: createUnionTypeChecker,
|
7204 | shape: createShapeTypeChecker
|
7205 | };
|
7206 |
|
7207 | /**
|
7208 | * inlined Object.is polyfill to avoid requiring consumers ship their own
|
7209 | * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
|
7210 | */
|
7211 | /*eslint-disable no-self-compare*/
|
7212 | function is(x, y) {
|
7213 | // SameValue algorithm
|
7214 | if (x === y) {
|
7215 | // Steps 1-5, 7-10
|
7216 | // Steps 6.b-6.e: +0 != -0
|
7217 | return x !== 0 || 1 / x === 1 / y;
|
7218 | } else {
|
7219 | // Step 6.a: NaN == NaN
|
7220 | return x !== x && y !== y;
|
7221 | }
|
7222 | }
|
7223 | /*eslint-enable no-self-compare*/
|
7224 |
|
7225 | /**
|
7226 | * We use an Error-like object for backward compatibility as people may call
|
7227 | * PropTypes directly and inspect their output. However, we don't use real
|
7228 | * Errors anymore. We don't inspect their stack anyway, and creating them
|
7229 | * is prohibitively expensive if they are created too often, such as what
|
7230 | * happens in oneOfType() for any type before the one that matched.
|
7231 | */
|
7232 | function PropTypeError(message) {
|
7233 | this.message = message;
|
7234 | this.stack = '';
|
7235 | }
|
7236 | // Make `instanceof Error` still work for returned errors.
|
7237 | PropTypeError.prototype = Error.prototype;
|
7238 |
|
7239 | function createChainableTypeChecker(validate) {
|
7240 | var manualPropTypeCallCache, manualPropTypeWarningCount;
|
7241 |
|
7242 | function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {
|
7243 | componentName = componentName || ANONYMOUS;
|
7244 | propFullName = propFullName || propName;
|
7245 |
|
7246 | if (secret !== ReactPropTypesSecret_1$2) {
|
7247 | if (throwOnDirectAccess) {
|
7248 | // New behavior only for users of `prop-types` package
|
7249 | invariant_1(
|
7250 | false,
|
7251 | 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +
|
7252 | 'Use `PropTypes.checkPropTypes()` to call them. ' +
|
7253 | 'Read more at http://fb.me/use-check-prop-types'
|
7254 | );
|
7255 | } else if ("production" !== 'production' && typeof console !== 'undefined') {
|
7256 | // Old behavior for people using React.PropTypes
|
7257 | var cacheKey = componentName + ':' + propName;
|
7258 | if (
|
7259 | !manualPropTypeCallCache[cacheKey] &&
|
7260 | // Avoid spamming the console because they are often not actionable except for lib authors
|
7261 | manualPropTypeWarningCount < 3
|
7262 | ) {
|
7263 | warning_1(
|
7264 | false,
|
7265 | 'You are manually calling a React.PropTypes validation ' +
|
7266 | 'function for the `%s` prop on `%s`. This is deprecated ' +
|
7267 | 'and will throw in the standalone `prop-types` package. ' +
|
7268 | 'You may be seeing this warning due to a third-party PropTypes ' +
|
7269 | 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.',
|
7270 | propFullName,
|
7271 | componentName
|
7272 | );
|
7273 | manualPropTypeCallCache[cacheKey] = true;
|
7274 | manualPropTypeWarningCount++;
|
7275 | }
|
7276 | }
|
7277 | }
|
7278 | if (props[propName] == null) {
|
7279 | if (isRequired) {
|
7280 | if (props[propName] === null) {
|
7281 | return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));
|
7282 | }
|
7283 | return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));
|
7284 | }
|
7285 | return null;
|
7286 | } else {
|
7287 | return validate(props, propName, componentName, location, propFullName);
|
7288 | }
|
7289 | }
|
7290 |
|
7291 | var chainedCheckType = checkType.bind(null, false);
|
7292 | chainedCheckType.isRequired = checkType.bind(null, true);
|
7293 |
|
7294 | return chainedCheckType;
|
7295 | }
|
7296 |
|
7297 | function createPrimitiveTypeChecker(expectedType) {
|
7298 | function validate(props, propName, componentName, location, propFullName, secret) {
|
7299 | var propValue = props[propName];
|
7300 | var propType = getPropType(propValue);
|
7301 | if (propType !== expectedType) {
|
7302 | // `propValue` being instance of, say, date/regexp, pass the 'object'
|
7303 | // check, but we can offer a more precise error message here rather than
|
7304 | // 'of type `object`'.
|
7305 | var preciseType = getPreciseType(propValue);
|
7306 |
|
7307 | return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'));
|
7308 | }
|
7309 | return null;
|
7310 | }
|
7311 | return createChainableTypeChecker(validate);
|
7312 | }
|
7313 |
|
7314 | function createAnyTypeChecker() {
|
7315 | return createChainableTypeChecker(emptyFunction_1.thatReturnsNull);
|
7316 | }
|
7317 |
|
7318 | function createArrayOfTypeChecker(typeChecker) {
|
7319 | function validate(props, propName, componentName, location, propFullName) {
|
7320 | if (typeof typeChecker !== 'function') {
|
7321 | return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');
|
7322 | }
|
7323 | var propValue = props[propName];
|
7324 | if (!Array.isArray(propValue)) {
|
7325 | var propType = getPropType(propValue);
|
7326 | return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));
|
7327 | }
|
7328 | for (var i = 0; i < propValue.length; i++) {
|
7329 | var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret_1$2);
|
7330 | if (error instanceof Error) {
|
7331 | return error;
|
7332 | }
|
7333 | }
|
7334 | return null;
|
7335 | }
|
7336 | return createChainableTypeChecker(validate);
|
7337 | }
|
7338 |
|
7339 | function createElementTypeChecker() {
|
7340 | function validate(props, propName, componentName, location, propFullName) {
|
7341 | var propValue = props[propName];
|
7342 | if (!isValidElement(propValue)) {
|
7343 | var propType = getPropType(propValue);
|
7344 | return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));
|
7345 | }
|
7346 | return null;
|
7347 | }
|
7348 | return createChainableTypeChecker(validate);
|
7349 | }
|
7350 |
|
7351 | function createInstanceTypeChecker(expectedClass) {
|
7352 | function validate(props, propName, componentName, location, propFullName) {
|
7353 | if (!(props[propName] instanceof expectedClass)) {
|
7354 | var expectedClassName = expectedClass.name || ANONYMOUS;
|
7355 | var actualClassName = getClassName(props[propName]);
|
7356 | return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));
|
7357 | }
|
7358 | return null;
|
7359 | }
|
7360 | return createChainableTypeChecker(validate);
|
7361 | }
|
7362 |
|
7363 | function createEnumTypeChecker(expectedValues) {
|
7364 | if (!Array.isArray(expectedValues)) {
|
7365 | void 0;
|
7366 | return emptyFunction_1.thatReturnsNull;
|
7367 | }
|
7368 |
|
7369 | function validate(props, propName, componentName, location, propFullName) {
|
7370 | var propValue = props[propName];
|
7371 | for (var i = 0; i < expectedValues.length; i++) {
|
7372 | if (is(propValue, expectedValues[i])) {
|
7373 | return null;
|
7374 | }
|
7375 | }
|
7376 |
|
7377 | var valuesString = JSON.stringify(expectedValues);
|
7378 | return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + propValue + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));
|
7379 | }
|
7380 | return createChainableTypeChecker(validate);
|
7381 | }
|
7382 |
|
7383 | function createObjectOfTypeChecker(typeChecker) {
|
7384 | function validate(props, propName, componentName, location, propFullName) {
|
7385 | if (typeof typeChecker !== 'function') {
|
7386 | return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');
|
7387 | }
|
7388 | var propValue = props[propName];
|
7389 | var propType = getPropType(propValue);
|
7390 | if (propType !== 'object') {
|
7391 | return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));
|
7392 | }
|
7393 | for (var key in propValue) {
|
7394 | if (propValue.hasOwnProperty(key)) {
|
7395 | var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret_1$2);
|
7396 | if (error instanceof Error) {
|
7397 | return error;
|
7398 | }
|
7399 | }
|
7400 | }
|
7401 | return null;
|
7402 | }
|
7403 | return createChainableTypeChecker(validate);
|
7404 | }
|
7405 |
|
7406 | function createUnionTypeChecker(arrayOfTypeCheckers) {
|
7407 | if (!Array.isArray(arrayOfTypeCheckers)) {
|
7408 | void 0;
|
7409 | return emptyFunction_1.thatReturnsNull;
|
7410 | }
|
7411 |
|
7412 | for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
|
7413 | var checker = arrayOfTypeCheckers[i];
|
7414 | if (typeof checker !== 'function') {
|
7415 | warning_1(
|
7416 | false,
|
7417 | 'Invalid argument supplid to oneOfType. Expected an array of check functions, but ' +
|
7418 | 'received %s at index %s.',
|
7419 | getPostfixForTypeWarning(checker),
|
7420 | i
|
7421 | );
|
7422 | return emptyFunction_1.thatReturnsNull;
|
7423 | }
|
7424 | }
|
7425 |
|
7426 | function validate(props, propName, componentName, location, propFullName) {
|
7427 | for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
|
7428 | var checker = arrayOfTypeCheckers[i];
|
7429 | if (checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret_1$2) == null) {
|
7430 | return null;
|
7431 | }
|
7432 | }
|
7433 |
|
7434 | return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.'));
|
7435 | }
|
7436 | return createChainableTypeChecker(validate);
|
7437 | }
|
7438 |
|
7439 | function createNodeChecker() {
|
7440 | function validate(props, propName, componentName, location, propFullName) {
|
7441 | if (!isNode(props[propName])) {
|
7442 | return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));
|
7443 | }
|
7444 | return null;
|
7445 | }
|
7446 | return createChainableTypeChecker(validate);
|
7447 | }
|
7448 |
|
7449 | function createShapeTypeChecker(shapeTypes) {
|
7450 | function validate(props, propName, componentName, location, propFullName) {
|
7451 | var propValue = props[propName];
|
7452 | var propType = getPropType(propValue);
|
7453 | if (propType !== 'object') {
|
7454 | return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));
|
7455 | }
|
7456 | for (var key in shapeTypes) {
|
7457 | var checker = shapeTypes[key];
|
7458 | if (!checker) {
|
7459 | continue;
|
7460 | }
|
7461 | var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret_1$2);
|
7462 | if (error) {
|
7463 | return error;
|
7464 | }
|
7465 | }
|
7466 | return null;
|
7467 | }
|
7468 | return createChainableTypeChecker(validate);
|
7469 | }
|
7470 |
|
7471 | function isNode(propValue) {
|
7472 | switch (typeof propValue) {
|
7473 | case 'number':
|
7474 | case 'string':
|
7475 | case 'undefined':
|
7476 | return true;
|
7477 | case 'boolean':
|
7478 | return !propValue;
|
7479 | case 'object':
|
7480 | if (Array.isArray(propValue)) {
|
7481 | return propValue.every(isNode);
|
7482 | }
|
7483 | if (propValue === null || isValidElement(propValue)) {
|
7484 | return true;
|
7485 | }
|
7486 |
|
7487 | var iteratorFn = getIteratorFn(propValue);
|
7488 | if (iteratorFn) {
|
7489 | var iterator = iteratorFn.call(propValue);
|
7490 | var step;
|
7491 | if (iteratorFn !== propValue.entries) {
|
7492 | while (!(step = iterator.next()).done) {
|
7493 | if (!isNode(step.value)) {
|
7494 | return false;
|
7495 | }
|
7496 | }
|
7497 | } else {
|
7498 | // Iterator will provide entry [k,v] tuples rather than values.
|
7499 | while (!(step = iterator.next()).done) {
|
7500 | var entry = step.value;
|
7501 | if (entry) {
|
7502 | if (!isNode(entry[1])) {
|
7503 | return false;
|
7504 | }
|
7505 | }
|
7506 | }
|
7507 | }
|
7508 | } else {
|
7509 | return false;
|
7510 | }
|
7511 |
|
7512 | return true;
|
7513 | default:
|
7514 | return false;
|
7515 | }
|
7516 | }
|
7517 |
|
7518 | function isSymbol(propType, propValue) {
|
7519 | // Native Symbol.
|
7520 | if (propType === 'symbol') {
|
7521 | return true;
|
7522 | }
|
7523 |
|
7524 | // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'
|
7525 | if (propValue['@@toStringTag'] === 'Symbol') {
|
7526 | return true;
|
7527 | }
|
7528 |
|
7529 | // Fallback for non-spec compliant Symbols which are polyfilled.
|
7530 | if (typeof Symbol === 'function' && propValue instanceof Symbol) {
|
7531 | return true;
|
7532 | }
|
7533 |
|
7534 | return false;
|
7535 | }
|
7536 |
|
7537 | // Equivalent of `typeof` but with special handling for array and regexp.
|
7538 | function getPropType(propValue) {
|
7539 | var propType = typeof propValue;
|
7540 | if (Array.isArray(propValue)) {
|
7541 | return 'array';
|
7542 | }
|
7543 | if (propValue instanceof RegExp) {
|
7544 | // Old webkits (at least until Android 4.0) return 'function' rather than
|
7545 | // 'object' for typeof a RegExp. We'll normalize this here so that /bla/
|
7546 | // passes PropTypes.object.
|
7547 | return 'object';
|
7548 | }
|
7549 | if (isSymbol(propType, propValue)) {
|
7550 | return 'symbol';
|
7551 | }
|
7552 | return propType;
|
7553 | }
|
7554 |
|
7555 | // This handles more types than `getPropType`. Only used for error messages.
|
7556 | // See `createPrimitiveTypeChecker`.
|
7557 | function getPreciseType(propValue) {
|
7558 | if (typeof propValue === 'undefined' || propValue === null) {
|
7559 | return '' + propValue;
|
7560 | }
|
7561 | var propType = getPropType(propValue);
|
7562 | if (propType === 'object') {
|
7563 | if (propValue instanceof Date) {
|
7564 | return 'date';
|
7565 | } else if (propValue instanceof RegExp) {
|
7566 | return 'regexp';
|
7567 | }
|
7568 | }
|
7569 | return propType;
|
7570 | }
|
7571 |
|
7572 | // Returns a string that is postfixed to a warning about an invalid type.
|
7573 | // For example, "undefined" or "of type array"
|
7574 | function getPostfixForTypeWarning(value) {
|
7575 | var type = getPreciseType(value);
|
7576 | switch (type) {
|
7577 | case 'array':
|
7578 | case 'object':
|
7579 | return 'an ' + type;
|
7580 | case 'boolean':
|
7581 | case 'date':
|
7582 | case 'regexp':
|
7583 | return 'a ' + type;
|
7584 | default:
|
7585 | return type;
|
7586 | }
|
7587 | }
|
7588 |
|
7589 | // Returns class name of the object, if any.
|
7590 | function getClassName(propValue) {
|
7591 | if (!propValue.constructor || !propValue.constructor.name) {
|
7592 | return ANONYMOUS;
|
7593 | }
|
7594 | return propValue.constructor.name;
|
7595 | }
|
7596 |
|
7597 | ReactPropTypes.checkPropTypes = checkPropTypes_1;
|
7598 | ReactPropTypes.PropTypes = ReactPropTypes;
|
7599 |
|
7600 | return ReactPropTypes;
|
7601 | };
|
7602 |
|
7603 | // React 15.5 references this module, and assumes PropTypes are still callable in production.
|
7604 | // Therefore we re-export development-only version with all the PropTypes checks here.
|
7605 | // However if one is migrating to the `prop-types` npm library, they will go through the
|
7606 | // `index.js` entry point, and it will branch depending on the environment.
|
7607 |
|
7608 | var factory_1 = function(isValidElement) {
|
7609 | // It is still allowed in 15.5.
|
7610 | var throwOnDirectAccess = false;
|
7611 | return factoryWithTypeCheckers(isValidElement, throwOnDirectAccess);
|
7612 | };
|
7613 |
|
7614 | /**
|
7615 | * Copyright (c) 2013-present, Facebook, Inc.
|
7616 | * All rights reserved.
|
7617 | *
|
7618 | * This source code is licensed under the BSD-style license found in the
|
7619 | * LICENSE file in the root directory of this source tree. An additional grant
|
7620 | * of patent rights can be found in the PATENTS file in the same directory.
|
7621 | *
|
7622 | *
|
7623 | */
|
7624 | /**
|
7625 | * WARNING: DO NOT manually require this module.
|
7626 | * This is a replacement for `invariant(...)` used by the error code system
|
7627 | * and will _only_ be required by the corresponding babel pass.
|
7628 | * It always throws.
|
7629 | */
|
7630 |
|
7631 | function reactProdInvariant$1(code) {
|
7632 | var argCount = arguments.length - 1;
|
7633 |
|
7634 | var message = 'Minified React error #' + code + '; visit ' + 'http://facebook.github.io/react/docs/error-decoder.html?invariant=' + code;
|
7635 |
|
7636 | for (var argIdx = 0; argIdx < argCount; argIdx++) {
|
7637 | message += '&args[]=' + encodeURIComponent(arguments[argIdx + 1]);
|
7638 | }
|
7639 |
|
7640 | message += ' for the full message or use the non-minified dev environment' + ' for full errors and additional helpful warnings.';
|
7641 |
|
7642 | var error = new Error(message);
|
7643 | error.name = 'Invariant Violation';
|
7644 | error.framesToPop = 1; // we don't care about reactProdInvariant's own frame
|
7645 |
|
7646 | throw error;
|
7647 | }
|
7648 |
|
7649 | var reactProdInvariant_1$2 = reactProdInvariant$1;
|
7650 |
|
7651 | function warnNoop(publicInstance, callerName) {
|
7652 |
|
7653 | }
|
7654 |
|
7655 | /**
|
7656 | * This is the abstract API for an update queue.
|
7657 | */
|
7658 | var ReactNoopUpdateQueue = {
|
7659 | /**
|
7660 | * Checks whether or not this composite component is mounted.
|
7661 | * @param {ReactClass} publicInstance The instance we want to test.
|
7662 | * @return {boolean} True if mounted, false otherwise.
|
7663 | * @protected
|
7664 | * @final
|
7665 | */
|
7666 | isMounted: function (publicInstance) {
|
7667 | return false;
|
7668 | },
|
7669 |
|
7670 | /**
|
7671 | * Enqueue a callback that will be executed after all the pending updates
|
7672 | * have processed.
|
7673 | *
|
7674 | * @param {ReactClass} publicInstance The instance to use as `this` context.
|
7675 | * @param {?function} callback Called after state is updated.
|
7676 | * @internal
|
7677 | */
|
7678 | enqueueCallback: function (publicInstance, callback) {},
|
7679 |
|
7680 | /**
|
7681 | * Forces an update. This should only be invoked when it is known with
|
7682 | * certainty that we are **not** in a DOM transaction.
|
7683 | *
|
7684 | * You may want to call this when you know that some deeper aspect of the
|
7685 | * component's state has changed but `setState` was not called.
|
7686 | *
|
7687 | * This will not invoke `shouldComponentUpdate`, but it will invoke
|
7688 | * `componentWillUpdate` and `componentDidUpdate`.
|
7689 | *
|
7690 | * @param {ReactClass} publicInstance The instance that should rerender.
|
7691 | * @internal
|
7692 | */
|
7693 | enqueueForceUpdate: function (publicInstance) {
|
7694 | warnNoop(publicInstance, 'forceUpdate');
|
7695 | },
|
7696 |
|
7697 | /**
|
7698 | * Replaces all of the state. Always use this or `setState` to mutate state.
|
7699 | * You should treat `this.state` as immutable.
|
7700 | *
|
7701 | * There is no guarantee that `this.state` will be immediately updated, so
|
7702 | * accessing `this.state` after calling this method may return the old value.
|
7703 | *
|
7704 | * @param {ReactClass} publicInstance The instance that should rerender.
|
7705 | * @param {object} completeState Next state.
|
7706 | * @internal
|
7707 | */
|
7708 | enqueueReplaceState: function (publicInstance, completeState) {
|
7709 | warnNoop(publicInstance, 'replaceState');
|
7710 | },
|
7711 |
|
7712 | /**
|
7713 | * Sets a subset of the state. This only exists because _pendingState is
|
7714 | * internal. This provides a merging strategy that is not available to deep
|
7715 | * properties which is confusing. TODO: Expose pendingState or don't use it
|
7716 | * during the merge.
|
7717 | *
|
7718 | * @param {ReactClass} publicInstance The instance that should rerender.
|
7719 | * @param {object} partialState Next partial state to be merged with state.
|
7720 | * @internal
|
7721 | */
|
7722 | enqueueSetState: function (publicInstance, partialState) {
|
7723 | warnNoop(publicInstance, 'setState');
|
7724 | }
|
7725 | };
|
7726 |
|
7727 | var ReactNoopUpdateQueue_1 = ReactNoopUpdateQueue;
|
7728 |
|
7729 | /**
|
7730 | * Copyright 2013-present, Facebook, Inc.
|
7731 | * All rights reserved.
|
7732 | *
|
7733 | * This source code is licensed under the BSD-style license found in the
|
7734 | * LICENSE file in the root directory of this source tree. An additional grant
|
7735 | * of patent rights can be found in the PATENTS file in the same directory.
|
7736 | *
|
7737 | *
|
7738 | */
|
7739 |
|
7740 | /**
|
7741 | * Copyright (c) 2013-present, Facebook, Inc.
|
7742 | * All rights reserved.
|
7743 | *
|
7744 | * This source code is licensed under the BSD-style license found in the
|
7745 | * LICENSE file in the root directory of this source tree. An additional grant
|
7746 | * of patent rights can be found in the PATENTS file in the same directory.
|
7747 | *
|
7748 | */
|
7749 |
|
7750 | var emptyObject = {};
|
7751 |
|
7752 | var emptyObject_1 = emptyObject;
|
7753 |
|
7754 | /**
|
7755 | * Copyright 2014-2015, Facebook, Inc.
|
7756 | * All rights reserved.
|
7757 | *
|
7758 | * This source code is licensed under the BSD-style license found in the
|
7759 | * LICENSE file in the root directory of this source tree. An additional grant
|
7760 | * of patent rights can be found in the PATENTS file in the same directory.
|
7761 | *
|
7762 | */
|
7763 |
|
7764 | /**
|
7765 | * Base class helpers for the updating state of a component.
|
7766 | */
|
7767 | function ReactComponent(props, context, updater) {
|
7768 | this.props = props;
|
7769 | this.context = context;
|
7770 | this.refs = emptyObject_1;
|
7771 | // We initialize the default updater but the real one gets injected by the
|
7772 | // renderer.
|
7773 | this.updater = updater || ReactNoopUpdateQueue_1;
|
7774 | }
|
7775 |
|
7776 | ReactComponent.prototype.isReactComponent = {};
|
7777 |
|
7778 | /**
|
7779 | * Sets a subset of the state. Always use this to mutate
|
7780 | * state. You should treat `this.state` as immutable.
|
7781 | *
|
7782 | * There is no guarantee that `this.state` will be immediately updated, so
|
7783 | * accessing `this.state` after calling this method may return the old value.
|
7784 | *
|
7785 | * There is no guarantee that calls to `setState` will run synchronously,
|
7786 | * as they may eventually be batched together. You can provide an optional
|
7787 | * callback that will be executed when the call to setState is actually
|
7788 | * completed.
|
7789 | *
|
7790 | * When a function is provided to setState, it will be called at some point in
|
7791 | * the future (not synchronously). It will be called with the up to date
|
7792 | * component arguments (state, props, context). These values can be different
|
7793 | * from this.* because your function may be called after receiveProps but before
|
7794 | * shouldComponentUpdate, and this new state, props, and context will not yet be
|
7795 | * assigned to this.
|
7796 | *
|
7797 | * @param {object|function} partialState Next partial state or function to
|
7798 | * produce next partial state to be merged with current state.
|
7799 | * @param {?function} callback Called after state is updated.
|
7800 | * @final
|
7801 | * @protected
|
7802 | */
|
7803 | ReactComponent.prototype.setState = function (partialState, callback) {
|
7804 | !(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null) ? reactProdInvariant_1$2('85') : void 0;
|
7805 | this.updater.enqueueSetState(this, partialState);
|
7806 | if (callback) {
|
7807 | this.updater.enqueueCallback(this, callback, 'setState');
|
7808 | }
|
7809 | };
|
7810 |
|
7811 | /**
|
7812 | * Forces an update. This should only be invoked when it is known with
|
7813 | * certainty that we are **not** in a DOM transaction.
|
7814 | *
|
7815 | * You may want to call this when you know that some deeper aspect of the
|
7816 | * component's state has changed but `setState` was not called.
|
7817 | *
|
7818 | * This will not invoke `shouldComponentUpdate`, but it will invoke
|
7819 | * `componentWillUpdate` and `componentDidUpdate`.
|
7820 | *
|
7821 | * @param {?function} callback Called after update is complete.
|
7822 | * @final
|
7823 | * @protected
|
7824 | */
|
7825 | ReactComponent.prototype.forceUpdate = function (callback) {
|
7826 | this.updater.enqueueForceUpdate(this);
|
7827 | if (callback) {
|
7828 | this.updater.enqueueCallback(this, callback, 'forceUpdate');
|
7829 | }
|
7830 | };
|
7831 |
|
7832 | /**
|
7833 | * Deprecated APIs. These APIs used to exist on classic React classes but since
|
7834 | * we would like to deprecate them, we're not going to move them over to this
|
7835 | * modern base class. Instead, we define a getter that warns if it's accessed.
|
7836 | */
|
7837 | /**
|
7838 | * Base class helpers for the updating state of a component.
|
7839 | */
|
7840 | function ReactPureComponent(props, context, updater) {
|
7841 | // Duplicated from ReactComponent.
|
7842 | this.props = props;
|
7843 | this.context = context;
|
7844 | this.refs = emptyObject_1;
|
7845 | // We initialize the default updater but the real one gets injected by the
|
7846 | // renderer.
|
7847 | this.updater = updater || ReactNoopUpdateQueue_1;
|
7848 | }
|
7849 |
|
7850 | function ComponentDummy() {}
|
7851 | ComponentDummy.prototype = ReactComponent.prototype;
|
7852 | ReactPureComponent.prototype = new ComponentDummy();
|
7853 | ReactPureComponent.prototype.constructor = ReactPureComponent;
|
7854 | // Avoid an extra prototype jump for these methods.
|
7855 | objectAssign(ReactPureComponent.prototype, ReactComponent.prototype);
|
7856 | ReactPureComponent.prototype.isPureReactComponent = true;
|
7857 |
|
7858 | var ReactBaseClasses = {
|
7859 | Component: ReactComponent,
|
7860 | PureComponent: ReactPureComponent
|
7861 | };
|
7862 |
|
7863 | /**
|
7864 | * Static poolers. Several custom versions for each potential number of
|
7865 | * arguments. A completely generic pooler is easy to implement, but would
|
7866 | * require accessing the `arguments` object. In each of these, `this` refers to
|
7867 | * the Class itself, not an instance. If any others are needed, simply add them
|
7868 | * here, or in their own files.
|
7869 | */
|
7870 | var oneArgumentPooler$1 = function (copyFieldsFrom) {
|
7871 | var Klass = this;
|
7872 | if (Klass.instancePool.length) {
|
7873 | var instance = Klass.instancePool.pop();
|
7874 | Klass.call(instance, copyFieldsFrom);
|
7875 | return instance;
|
7876 | } else {
|
7877 | return new Klass(copyFieldsFrom);
|
7878 | }
|
7879 | };
|
7880 |
|
7881 | var twoArgumentPooler$2 = function (a1, a2) {
|
7882 | var Klass = this;
|
7883 | if (Klass.instancePool.length) {
|
7884 | var instance = Klass.instancePool.pop();
|
7885 | Klass.call(instance, a1, a2);
|
7886 | return instance;
|
7887 | } else {
|
7888 | return new Klass(a1, a2);
|
7889 | }
|
7890 | };
|
7891 |
|
7892 | var threeArgumentPooler$1 = function (a1, a2, a3) {
|
7893 | var Klass = this;
|
7894 | if (Klass.instancePool.length) {
|
7895 | var instance = Klass.instancePool.pop();
|
7896 | Klass.call(instance, a1, a2, a3);
|
7897 | return instance;
|
7898 | } else {
|
7899 | return new Klass(a1, a2, a3);
|
7900 | }
|
7901 | };
|
7902 |
|
7903 | var fourArgumentPooler$2 = function (a1, a2, a3, a4) {
|
7904 | var Klass = this;
|
7905 | if (Klass.instancePool.length) {
|
7906 | var instance = Klass.instancePool.pop();
|
7907 | Klass.call(instance, a1, a2, a3, a4);
|
7908 | return instance;
|
7909 | } else {
|
7910 | return new Klass(a1, a2, a3, a4);
|
7911 | }
|
7912 | };
|
7913 |
|
7914 | var standardReleaser$1 = function (instance) {
|
7915 | var Klass = this;
|
7916 | !(instance instanceof Klass) ? reactProdInvariant_1$2('25') : void 0;
|
7917 | instance.destructor();
|
7918 | if (Klass.instancePool.length < Klass.poolSize) {
|
7919 | Klass.instancePool.push(instance);
|
7920 | }
|
7921 | };
|
7922 |
|
7923 | var DEFAULT_POOL_SIZE$1 = 10;
|
7924 | var DEFAULT_POOLER$1 = oneArgumentPooler$1;
|
7925 |
|
7926 | /**
|
7927 | * Augments `CopyConstructor` to be a poolable class, augmenting only the class
|
7928 | * itself (statically) not adding any prototypical fields. Any CopyConstructor
|
7929 | * you give this may have a `poolSize` property, and will look for a
|
7930 | * prototypical `destructor` on instances.
|
7931 | *
|
7932 | * @param {Function} CopyConstructor Constructor that can be used to reset.
|
7933 | * @param {Function} pooler Customizable pooler.
|
7934 | */
|
7935 | var addPoolingTo$1 = function (CopyConstructor, pooler) {
|
7936 | // Casting as any so that flow ignores the actual implementation and trusts
|
7937 | // it to match the type we declared
|
7938 | var NewKlass = CopyConstructor;
|
7939 | NewKlass.instancePool = [];
|
7940 | NewKlass.getPooled = pooler || DEFAULT_POOLER$1;
|
7941 | if (!NewKlass.poolSize) {
|
7942 | NewKlass.poolSize = DEFAULT_POOL_SIZE$1;
|
7943 | }
|
7944 | NewKlass.release = standardReleaser$1;
|
7945 | return NewKlass;
|
7946 | };
|
7947 |
|
7948 | var PooledClass$2 = {
|
7949 | addPoolingTo: addPoolingTo$1,
|
7950 | oneArgumentPooler: oneArgumentPooler$1,
|
7951 | twoArgumentPooler: twoArgumentPooler$2,
|
7952 | threeArgumentPooler: threeArgumentPooler$1,
|
7953 | fourArgumentPooler: fourArgumentPooler$2
|
7954 | };
|
7955 |
|
7956 | var PooledClass_1$2 = PooledClass$2;
|
7957 |
|
7958 | /**
|
7959 | * Copyright 2013-present, Facebook, Inc.
|
7960 | * All rights reserved.
|
7961 | *
|
7962 | * This source code is licensed under the BSD-style license found in the
|
7963 | * LICENSE file in the root directory of this source tree. An additional grant
|
7964 | * of patent rights can be found in the PATENTS file in the same directory.
|
7965 | *
|
7966 | *
|
7967 | */
|
7968 |
|
7969 | /**
|
7970 | * Keeps track of the current owner.
|
7971 | *
|
7972 | * The current owner is the component who should own any components that are
|
7973 | * currently being constructed.
|
7974 | */
|
7975 | var ReactCurrentOwner = {
|
7976 | /**
|
7977 | * @internal
|
7978 | * @type {ReactComponent}
|
7979 | */
|
7980 | current: null
|
7981 | };
|
7982 |
|
7983 | var ReactCurrentOwner_1 = ReactCurrentOwner;
|
7984 |
|
7985 | /**
|
7986 | * Copyright 2014-present, Facebook, Inc.
|
7987 | * All rights reserved.
|
7988 | *
|
7989 | * This source code is licensed under the BSD-style license found in the
|
7990 | * LICENSE file in the root directory of this source tree. An additional grant
|
7991 | * of patent rights can be found in the PATENTS file in the same directory.
|
7992 | *
|
7993 | *
|
7994 | */
|
7995 |
|
7996 | // The Symbol used to tag the ReactElement type. If there is no native Symbol
|
7997 | // nor polyfill, then a plain number is used for performance.
|
7998 |
|
7999 | var REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol['for'] && Symbol['for']('react.element') || 0xeac7;
|
8000 |
|
8001 | var ReactElementSymbol = REACT_ELEMENT_TYPE;
|
8002 |
|
8003 | var hasOwnProperty$2 = Object.prototype.hasOwnProperty;
|
8004 |
|
8005 |
|
8006 |
|
8007 | var RESERVED_PROPS$1 = {
|
8008 | key: true,
|
8009 | ref: true,
|
8010 | __self: true,
|
8011 | __source: true
|
8012 | };
|
8013 |
|
8014 | function hasValidRef(config) {
|
8015 | return config.ref !== undefined;
|
8016 | }
|
8017 |
|
8018 | function hasValidKey(config) {
|
8019 | return config.key !== undefined;
|
8020 | }
|
8021 |
|
8022 | /**
|
8023 | * Factory method to create a new React element. This no longer adheres to
|
8024 | * the class pattern, so do not use new to call it. Also, no instanceof check
|
8025 | * will work. Instead test $$typeof field against Symbol.for('react.element') to check
|
8026 | * if something is a React Element.
|
8027 | *
|
8028 | * @param {*} type
|
8029 | * @param {*} key
|
8030 | * @param {string|object} ref
|
8031 | * @param {*} self A *temporary* helper to detect places where `this` is
|
8032 | * different from the `owner` when React.createElement is called, so that we
|
8033 | * can warn. We want to get rid of owner and replace string `ref`s with arrow
|
8034 | * functions, and as long as `this` and owner are the same, there will be no
|
8035 | * change in behavior.
|
8036 | * @param {*} source An annotation object (added by a transpiler or otherwise)
|
8037 | * indicating filename, line number, and/or other information.
|
8038 | * @param {*} owner
|
8039 | * @param {*} props
|
8040 | * @internal
|
8041 | */
|
8042 | var ReactElement = function (type, key, ref, self, source, owner, props) {
|
8043 | var element = {
|
8044 | // This tag allow us to uniquely identify this as a React Element
|
8045 | $$typeof: ReactElementSymbol,
|
8046 |
|
8047 | // Built-in properties that belong on the element
|
8048 | type: type,
|
8049 | key: key,
|
8050 | ref: ref,
|
8051 | props: props,
|
8052 |
|
8053 | // Record the component responsible for creating this element.
|
8054 | _owner: owner
|
8055 | };
|
8056 |
|
8057 | return element;
|
8058 | };
|
8059 |
|
8060 | /**
|
8061 | * Create and return a new ReactElement of the given type.
|
8062 | * See https://facebook.github.io/react/docs/top-level-api.html#react.createelement
|
8063 | */
|
8064 | ReactElement.createElement = function (type, config, children) {
|
8065 | var propName;
|
8066 |
|
8067 | // Reserved names are extracted
|
8068 | var props = {};
|
8069 |
|
8070 | var key = null;
|
8071 | var ref = null;
|
8072 | var self = null;
|
8073 | var source = null;
|
8074 |
|
8075 | if (config != null) {
|
8076 | if (hasValidRef(config)) {
|
8077 | ref = config.ref;
|
8078 | }
|
8079 | if (hasValidKey(config)) {
|
8080 | key = '' + config.key;
|
8081 | }
|
8082 |
|
8083 | self = config.__self === undefined ? null : config.__self;
|
8084 | source = config.__source === undefined ? null : config.__source;
|
8085 | // Remaining properties are added to a new props object
|
8086 | for (propName in config) {
|
8087 | if (hasOwnProperty$2.call(config, propName) && !RESERVED_PROPS$1.hasOwnProperty(propName)) {
|
8088 | props[propName] = config[propName];
|
8089 | }
|
8090 | }
|
8091 | }
|
8092 |
|
8093 | // Children can be more than one argument, and those are transferred onto
|
8094 | // the newly allocated props object.
|
8095 | var childrenLength = arguments.length - 2;
|
8096 | if (childrenLength === 1) {
|
8097 | props.children = children;
|
8098 | } else if (childrenLength > 1) {
|
8099 | var childArray = Array(childrenLength);
|
8100 | for (var i = 0; i < childrenLength; i++) {
|
8101 | childArray[i] = arguments[i + 2];
|
8102 | }
|
8103 | props.children = childArray;
|
8104 | }
|
8105 |
|
8106 | // Resolve default props
|
8107 | if (type && type.defaultProps) {
|
8108 | var defaultProps = type.defaultProps;
|
8109 | for (propName in defaultProps) {
|
8110 | if (props[propName] === undefined) {
|
8111 | props[propName] = defaultProps[propName];
|
8112 | }
|
8113 | }
|
8114 | }
|
8115 | return ReactElement(type, key, ref, self, source, ReactCurrentOwner_1.current, props);
|
8116 | };
|
8117 |
|
8118 | /**
|
8119 | * Return a function that produces ReactElements of a given type.
|
8120 | * See https://facebook.github.io/react/docs/top-level-api.html#react.createfactory
|
8121 | */
|
8122 | ReactElement.createFactory = function (type) {
|
8123 | var factory = ReactElement.createElement.bind(null, type);
|
8124 | // Expose the type on the factory and the prototype so that it can be
|
8125 | // easily accessed on elements. E.g. `<Foo />.type === Foo`.
|
8126 | // This should not be named `constructor` since this may not be the function
|
8127 | // that created the element, and it may not even be a constructor.
|
8128 | // Legacy hook TODO: Warn if this is accessed
|
8129 | factory.type = type;
|
8130 | return factory;
|
8131 | };
|
8132 |
|
8133 | ReactElement.cloneAndReplaceKey = function (oldElement, newKey) {
|
8134 | var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);
|
8135 |
|
8136 | return newElement;
|
8137 | };
|
8138 |
|
8139 | /**
|
8140 | * Clone and return a new ReactElement using element as the starting point.
|
8141 | * See https://facebook.github.io/react/docs/top-level-api.html#react.cloneelement
|
8142 | */
|
8143 | ReactElement.cloneElement = function (element, config, children) {
|
8144 | var propName;
|
8145 |
|
8146 | // Original props are copied
|
8147 | var props = objectAssign({}, element.props);
|
8148 |
|
8149 | // Reserved names are extracted
|
8150 | var key = element.key;
|
8151 | var ref = element.ref;
|
8152 | // Self is preserved since the owner is preserved.
|
8153 | var self = element._self;
|
8154 | // Source is preserved since cloneElement is unlikely to be targeted by a
|
8155 | // transpiler, and the original source is probably a better indicator of the
|
8156 | // true owner.
|
8157 | var source = element._source;
|
8158 |
|
8159 | // Owner will be preserved, unless ref is overridden
|
8160 | var owner = element._owner;
|
8161 |
|
8162 | if (config != null) {
|
8163 | if (hasValidRef(config)) {
|
8164 | // Silently steal the ref from the parent.
|
8165 | ref = config.ref;
|
8166 | owner = ReactCurrentOwner_1.current;
|
8167 | }
|
8168 | if (hasValidKey(config)) {
|
8169 | key = '' + config.key;
|
8170 | }
|
8171 |
|
8172 | // Remaining properties override existing props
|
8173 | var defaultProps;
|
8174 | if (element.type && element.type.defaultProps) {
|
8175 | defaultProps = element.type.defaultProps;
|
8176 | }
|
8177 | for (propName in config) {
|
8178 | if (hasOwnProperty$2.call(config, propName) && !RESERVED_PROPS$1.hasOwnProperty(propName)) {
|
8179 | if (config[propName] === undefined && defaultProps !== undefined) {
|
8180 | // Resolve default props
|
8181 | props[propName] = defaultProps[propName];
|
8182 | } else {
|
8183 | props[propName] = config[propName];
|
8184 | }
|
8185 | }
|
8186 | }
|
8187 | }
|
8188 |
|
8189 | // Children can be more than one argument, and those are transferred onto
|
8190 | // the newly allocated props object.
|
8191 | var childrenLength = arguments.length - 2;
|
8192 | if (childrenLength === 1) {
|
8193 | props.children = children;
|
8194 | } else if (childrenLength > 1) {
|
8195 | var childArray = Array(childrenLength);
|
8196 | for (var i = 0; i < childrenLength; i++) {
|
8197 | childArray[i] = arguments[i + 2];
|
8198 | }
|
8199 | props.children = childArray;
|
8200 | }
|
8201 |
|
8202 | return ReactElement(element.type, key, ref, self, source, owner, props);
|
8203 | };
|
8204 |
|
8205 | /**
|
8206 | * Verifies the object is a ReactElement.
|
8207 | * See https://facebook.github.io/react/docs/top-level-api.html#react.isvalidelement
|
8208 | * @param {?object} object
|
8209 | * @return {boolean} True if `object` is a valid component.
|
8210 | * @final
|
8211 | */
|
8212 | ReactElement.isValidElement = function (object) {
|
8213 | return typeof object === 'object' && object !== null && object.$$typeof === ReactElementSymbol;
|
8214 | };
|
8215 |
|
8216 | var ReactElement_1 = ReactElement;
|
8217 |
|
8218 | /**
|
8219 | * Copyright 2013-present, Facebook, Inc.
|
8220 | * All rights reserved.
|
8221 | *
|
8222 | * This source code is licensed under the BSD-style license found in the
|
8223 | * LICENSE file in the root directory of this source tree. An additional grant
|
8224 | * of patent rights can be found in the PATENTS file in the same directory.
|
8225 | *
|
8226 | *
|
8227 | */
|
8228 |
|
8229 | /* global Symbol */
|
8230 |
|
8231 | var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
|
8232 | var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.
|
8233 |
|
8234 | /**
|
8235 | * Returns the iterator method function contained on the iterable object.
|
8236 | *
|
8237 | * Be sure to invoke the function with the iterable as context:
|
8238 | *
|
8239 | * var iteratorFn = getIteratorFn(myIterable);
|
8240 | * if (iteratorFn) {
|
8241 | * var iterator = iteratorFn.call(myIterable);
|
8242 | * ...
|
8243 | * }
|
8244 | *
|
8245 | * @param {?object} maybeIterable
|
8246 | * @return {?function}
|
8247 | */
|
8248 | function getIteratorFn(maybeIterable) {
|
8249 | var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);
|
8250 | if (typeof iteratorFn === 'function') {
|
8251 | return iteratorFn;
|
8252 | }
|
8253 | }
|
8254 |
|
8255 | var getIteratorFn_1 = getIteratorFn;
|
8256 |
|
8257 | /**
|
8258 | * Copyright 2013-present, Facebook, Inc.
|
8259 | * All rights reserved.
|
8260 | *
|
8261 | * This source code is licensed under the BSD-style license found in the
|
8262 | * LICENSE file in the root directory of this source tree. An additional grant
|
8263 | * of patent rights can be found in the PATENTS file in the same directory.
|
8264 | *
|
8265 | *
|
8266 | */
|
8267 |
|
8268 | /**
|
8269 | * Escape and wrap key so it is safe to use as a reactid
|
8270 | *
|
8271 | * @param {string} key to be escaped.
|
8272 | * @return {string} the escaped key.
|
8273 | */
|
8274 |
|
8275 | function escape(key) {
|
8276 | var escapeRegex = /[=:]/g;
|
8277 | var escaperLookup = {
|
8278 | '=': '=0',
|
8279 | ':': '=2'
|
8280 | };
|
8281 | var escapedString = ('' + key).replace(escapeRegex, function (match) {
|
8282 | return escaperLookup[match];
|
8283 | });
|
8284 |
|
8285 | return '$' + escapedString;
|
8286 | }
|
8287 |
|
8288 | /**
|
8289 | * Unescape and unwrap key for human-readable display
|
8290 | *
|
8291 | * @param {string} key to unescape.
|
8292 | * @return {string} the unescaped key.
|
8293 | */
|
8294 | function unescape(key) {
|
8295 | var unescapeRegex = /(=0|=2)/g;
|
8296 | var unescaperLookup = {
|
8297 | '=0': '=',
|
8298 | '=2': ':'
|
8299 | };
|
8300 | var keySubstring = key[0] === '.' && key[1] === '$' ? key.substring(2) : key.substring(1);
|
8301 |
|
8302 | return ('' + keySubstring).replace(unescapeRegex, function (match) {
|
8303 | return unescaperLookup[match];
|
8304 | });
|
8305 | }
|
8306 |
|
8307 | var KeyEscapeUtils = {
|
8308 | escape: escape,
|
8309 | unescape: unescape
|
8310 | };
|
8311 |
|
8312 | var KeyEscapeUtils_1 = KeyEscapeUtils;
|
8313 |
|
8314 | var SEPARATOR = '.';
|
8315 | var SUBSEPARATOR = ':';
|
8316 |
|
8317 | /**
|
8318 | * Generate a key string that identifies a component within a set.
|
8319 | *
|
8320 | * @param {*} component A component that could contain a manual key.
|
8321 | * @param {number} index Index that is used if a manual key is not provided.
|
8322 | * @return {string}
|
8323 | */
|
8324 | function getComponentKey(component, index) {
|
8325 | // Do some typechecking here since we call this blindly. We want to ensure
|
8326 | // that we don't block potential future ES APIs.
|
8327 | if (component && typeof component === 'object' && component.key != null) {
|
8328 | // Explicit key
|
8329 | return KeyEscapeUtils_1.escape(component.key);
|
8330 | }
|
8331 | // Implicit key determined by the index in the set
|
8332 | return index.toString(36);
|
8333 | }
|
8334 |
|
8335 | /**
|
8336 | * @param {?*} children Children tree container.
|
8337 | * @param {!string} nameSoFar Name of the key path so far.
|
8338 | * @param {!function} callback Callback to invoke with each child found.
|
8339 | * @param {?*} traverseContext Used to pass information throughout the traversal
|
8340 | * process.
|
8341 | * @return {!number} The number of children in this subtree.
|
8342 | */
|
8343 | function traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) {
|
8344 | var type = typeof children;
|
8345 |
|
8346 | if (type === 'undefined' || type === 'boolean') {
|
8347 | // All of the above are perceived as null.
|
8348 | children = null;
|
8349 | }
|
8350 |
|
8351 | if (children === null || type === 'string' || type === 'number' ||
|
8352 | // The following is inlined from ReactElement. This means we can optimize
|
8353 | // some checks. React Fiber also inlines this logic for similar purposes.
|
8354 | type === 'object' && children.$$typeof === ReactElementSymbol) {
|
8355 | callback(traverseContext, children,
|
8356 | // If it's the only child, treat the name as if it was wrapped in an array
|
8357 | // so that it's consistent if the number of children grows.
|
8358 | nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar);
|
8359 | return 1;
|
8360 | }
|
8361 |
|
8362 | var child;
|
8363 | var nextName;
|
8364 | var subtreeCount = 0; // Count of children found in the current subtree.
|
8365 | var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;
|
8366 |
|
8367 | if (Array.isArray(children)) {
|
8368 | for (var i = 0; i < children.length; i++) {
|
8369 | child = children[i];
|
8370 | nextName = nextNamePrefix + getComponentKey(child, i);
|
8371 | subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);
|
8372 | }
|
8373 | } else {
|
8374 | var iteratorFn = getIteratorFn_1(children);
|
8375 | if (iteratorFn) {
|
8376 | var iterator = iteratorFn.call(children);
|
8377 | var step;
|
8378 | if (iteratorFn !== children.entries) {
|
8379 | var ii = 0;
|
8380 | while (!(step = iterator.next()).done) {
|
8381 | child = step.value;
|
8382 | nextName = nextNamePrefix + getComponentKey(child, ii++);
|
8383 | subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);
|
8384 | }
|
8385 | } else {
|
8386 | while (!(step = iterator.next()).done) {
|
8387 | var entry = step.value;
|
8388 | if (entry) {
|
8389 | child = entry[1];
|
8390 | nextName = nextNamePrefix + KeyEscapeUtils_1.escape(entry[0]) + SUBSEPARATOR + getComponentKey(child, 0);
|
8391 | subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);
|
8392 | }
|
8393 | }
|
8394 | }
|
8395 | } else if (type === 'object') {
|
8396 | var addendum = '';
|
8397 | var childrenString = String(children);
|
8398 | reactProdInvariant_1$2('31', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum);
|
8399 | }
|
8400 | }
|
8401 |
|
8402 | return subtreeCount;
|
8403 | }
|
8404 |
|
8405 | /**
|
8406 | * Traverses children that are typically specified as `props.children`, but
|
8407 | * might also be specified through attributes:
|
8408 | *
|
8409 | * - `traverseAllChildren(this.props.children, ...)`
|
8410 | * - `traverseAllChildren(this.props.leftPanelChildren, ...)`
|
8411 | *
|
8412 | * The `traverseContext` is an optional argument that is passed through the
|
8413 | * entire traversal. It can be used to store accumulations or anything else that
|
8414 | * the callback might find relevant.
|
8415 | *
|
8416 | * @param {?*} children Children tree object.
|
8417 | * @param {!function} callback To invoke upon traversing each child.
|
8418 | * @param {?*} traverseContext Context for traversal.
|
8419 | * @return {!number} The number of children in this subtree.
|
8420 | */
|
8421 | function traverseAllChildren(children, callback, traverseContext) {
|
8422 | if (children == null) {
|
8423 | return 0;
|
8424 | }
|
8425 |
|
8426 | return traverseAllChildrenImpl(children, '', callback, traverseContext);
|
8427 | }
|
8428 |
|
8429 | var traverseAllChildren_1 = traverseAllChildren;
|
8430 |
|
8431 | var twoArgumentPooler$1 = PooledClass_1$2.twoArgumentPooler;
|
8432 | var fourArgumentPooler$1 = PooledClass_1$2.fourArgumentPooler;
|
8433 |
|
8434 | var userProvidedKeyEscapeRegex = /\/+/g;
|
8435 | function escapeUserProvidedKey(text) {
|
8436 | return ('' + text).replace(userProvidedKeyEscapeRegex, '$&/');
|
8437 | }
|
8438 |
|
8439 | /**
|
8440 | * PooledClass representing the bookkeeping associated with performing a child
|
8441 | * traversal. Allows avoiding binding callbacks.
|
8442 | *
|
8443 | * @constructor ForEachBookKeeping
|
8444 | * @param {!function} forEachFunction Function to perform traversal with.
|
8445 | * @param {?*} forEachContext Context to perform context with.
|
8446 | */
|
8447 | function ForEachBookKeeping(forEachFunction, forEachContext) {
|
8448 | this.func = forEachFunction;
|
8449 | this.context = forEachContext;
|
8450 | this.count = 0;
|
8451 | }
|
8452 | ForEachBookKeeping.prototype.destructor = function () {
|
8453 | this.func = null;
|
8454 | this.context = null;
|
8455 | this.count = 0;
|
8456 | };
|
8457 | PooledClass_1$2.addPoolingTo(ForEachBookKeeping, twoArgumentPooler$1);
|
8458 |
|
8459 | function forEachSingleChild(bookKeeping, child, name) {
|
8460 | var func = bookKeeping.func,
|
8461 | context = bookKeeping.context;
|
8462 |
|
8463 | func.call(context, child, bookKeeping.count++);
|
8464 | }
|
8465 |
|
8466 | /**
|
8467 | * Iterates through children that are typically specified as `props.children`.
|
8468 | *
|
8469 | * See https://facebook.github.io/react/docs/top-level-api.html#react.children.foreach
|
8470 | *
|
8471 | * The provided forEachFunc(child, index) will be called for each
|
8472 | * leaf child.
|
8473 | *
|
8474 | * @param {?*} children Children tree container.
|
8475 | * @param {function(*, int)} forEachFunc
|
8476 | * @param {*} forEachContext Context for forEachContext.
|
8477 | */
|
8478 | function forEachChildren(children, forEachFunc, forEachContext) {
|
8479 | if (children == null) {
|
8480 | return children;
|
8481 | }
|
8482 | var traverseContext = ForEachBookKeeping.getPooled(forEachFunc, forEachContext);
|
8483 | traverseAllChildren_1(children, forEachSingleChild, traverseContext);
|
8484 | ForEachBookKeeping.release(traverseContext);
|
8485 | }
|
8486 |
|
8487 | /**
|
8488 | * PooledClass representing the bookkeeping associated with performing a child
|
8489 | * mapping. Allows avoiding binding callbacks.
|
8490 | *
|
8491 | * @constructor MapBookKeeping
|
8492 | * @param {!*} mapResult Object containing the ordered map of results.
|
8493 | * @param {!function} mapFunction Function to perform mapping with.
|
8494 | * @param {?*} mapContext Context to perform mapping with.
|
8495 | */
|
8496 | function MapBookKeeping(mapResult, keyPrefix, mapFunction, mapContext) {
|
8497 | this.result = mapResult;
|
8498 | this.keyPrefix = keyPrefix;
|
8499 | this.func = mapFunction;
|
8500 | this.context = mapContext;
|
8501 | this.count = 0;
|
8502 | }
|
8503 | MapBookKeeping.prototype.destructor = function () {
|
8504 | this.result = null;
|
8505 | this.keyPrefix = null;
|
8506 | this.func = null;
|
8507 | this.context = null;
|
8508 | this.count = 0;
|
8509 | };
|
8510 | PooledClass_1$2.addPoolingTo(MapBookKeeping, fourArgumentPooler$1);
|
8511 |
|
8512 | function mapSingleChildIntoContext(bookKeeping, child, childKey) {
|
8513 | var result = bookKeeping.result,
|
8514 | keyPrefix = bookKeeping.keyPrefix,
|
8515 | func = bookKeeping.func,
|
8516 | context = bookKeeping.context;
|
8517 |
|
8518 |
|
8519 | var mappedChild = func.call(context, child, bookKeeping.count++);
|
8520 | if (Array.isArray(mappedChild)) {
|
8521 | mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, emptyFunction_1.thatReturnsArgument);
|
8522 | } else if (mappedChild != null) {
|
8523 | if (ReactElement_1.isValidElement(mappedChild)) {
|
8524 | mappedChild = ReactElement_1.cloneAndReplaceKey(mappedChild,
|
8525 | // Keep both the (mapped) and old keys if they differ, just as
|
8526 | // traverseAllChildren used to do for objects as children
|
8527 | keyPrefix + (mappedChild.key && (!child || child.key !== mappedChild.key) ? escapeUserProvidedKey(mappedChild.key) + '/' : '') + childKey);
|
8528 | }
|
8529 | result.push(mappedChild);
|
8530 | }
|
8531 | }
|
8532 |
|
8533 | function mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) {
|
8534 | var escapedPrefix = '';
|
8535 | if (prefix != null) {
|
8536 | escapedPrefix = escapeUserProvidedKey(prefix) + '/';
|
8537 | }
|
8538 | var traverseContext = MapBookKeeping.getPooled(array, escapedPrefix, func, context);
|
8539 | traverseAllChildren_1(children, mapSingleChildIntoContext, traverseContext);
|
8540 | MapBookKeeping.release(traverseContext);
|
8541 | }
|
8542 |
|
8543 | /**
|
8544 | * Maps children that are typically specified as `props.children`.
|
8545 | *
|
8546 | * See https://facebook.github.io/react/docs/top-level-api.html#react.children.map
|
8547 | *
|
8548 | * The provided mapFunction(child, key, index) will be called for each
|
8549 | * leaf child.
|
8550 | *
|
8551 | * @param {?*} children Children tree container.
|
8552 | * @param {function(*, int)} func The map function.
|
8553 | * @param {*} context Context for mapFunction.
|
8554 | * @return {object} Object containing the ordered map of results.
|
8555 | */
|
8556 | function mapChildren(children, func, context) {
|
8557 | if (children == null) {
|
8558 | return children;
|
8559 | }
|
8560 | var result = [];
|
8561 | mapIntoWithKeyPrefixInternal(children, result, null, func, context);
|
8562 | return result;
|
8563 | }
|
8564 |
|
8565 | function forEachSingleChildDummy(traverseContext, child, name) {
|
8566 | return null;
|
8567 | }
|
8568 |
|
8569 | /**
|
8570 | * Count the number of children that are typically specified as
|
8571 | * `props.children`.
|
8572 | *
|
8573 | * See https://facebook.github.io/react/docs/top-level-api.html#react.children.count
|
8574 | *
|
8575 | * @param {?*} children Children tree container.
|
8576 | * @return {number} The number of children.
|
8577 | */
|
8578 | function countChildren(children, context) {
|
8579 | return traverseAllChildren_1(children, forEachSingleChildDummy, null);
|
8580 | }
|
8581 |
|
8582 | /**
|
8583 | * Flatten a children object (typically specified as `props.children`) and
|
8584 | * return an array with appropriately re-keyed children.
|
8585 | *
|
8586 | * See https://facebook.github.io/react/docs/top-level-api.html#react.children.toarray
|
8587 | */
|
8588 | function toArray$1(children) {
|
8589 | var result = [];
|
8590 | mapIntoWithKeyPrefixInternal(children, result, null, emptyFunction_1.thatReturnsArgument);
|
8591 | return result;
|
8592 | }
|
8593 |
|
8594 | var ReactChildren = {
|
8595 | forEach: forEachChildren,
|
8596 | map: mapChildren,
|
8597 | mapIntoWithKeyPrefixInternal: mapIntoWithKeyPrefixInternal,
|
8598 | count: countChildren,
|
8599 | toArray: toArray$1
|
8600 | };
|
8601 |
|
8602 | var ReactChildren_1 = ReactChildren;
|
8603 |
|
8604 | /**
|
8605 | * Create a factory that creates HTML tag elements.
|
8606 | *
|
8607 | * @private
|
8608 | */
|
8609 | var createDOMFactory = ReactElement_1.createFactory;
|
8610 | /**
|
8611 | * Creates a mapping from supported HTML tags to `ReactDOMComponent` classes.
|
8612 | *
|
8613 | * @public
|
8614 | */
|
8615 | var ReactDOMFactories = {
|
8616 | a: createDOMFactory('a'),
|
8617 | abbr: createDOMFactory('abbr'),
|
8618 | address: createDOMFactory('address'),
|
8619 | area: createDOMFactory('area'),
|
8620 | article: createDOMFactory('article'),
|
8621 | aside: createDOMFactory('aside'),
|
8622 | audio: createDOMFactory('audio'),
|
8623 | b: createDOMFactory('b'),
|
8624 | base: createDOMFactory('base'),
|
8625 | bdi: createDOMFactory('bdi'),
|
8626 | bdo: createDOMFactory('bdo'),
|
8627 | big: createDOMFactory('big'),
|
8628 | blockquote: createDOMFactory('blockquote'),
|
8629 | body: createDOMFactory('body'),
|
8630 | br: createDOMFactory('br'),
|
8631 | button: createDOMFactory('button'),
|
8632 | canvas: createDOMFactory('canvas'),
|
8633 | caption: createDOMFactory('caption'),
|
8634 | cite: createDOMFactory('cite'),
|
8635 | code: createDOMFactory('code'),
|
8636 | col: createDOMFactory('col'),
|
8637 | colgroup: createDOMFactory('colgroup'),
|
8638 | data: createDOMFactory('data'),
|
8639 | datalist: createDOMFactory('datalist'),
|
8640 | dd: createDOMFactory('dd'),
|
8641 | del: createDOMFactory('del'),
|
8642 | details: createDOMFactory('details'),
|
8643 | dfn: createDOMFactory('dfn'),
|
8644 | dialog: createDOMFactory('dialog'),
|
8645 | div: createDOMFactory('div'),
|
8646 | dl: createDOMFactory('dl'),
|
8647 | dt: createDOMFactory('dt'),
|
8648 | em: createDOMFactory('em'),
|
8649 | embed: createDOMFactory('embed'),
|
8650 | fieldset: createDOMFactory('fieldset'),
|
8651 | figcaption: createDOMFactory('figcaption'),
|
8652 | figure: createDOMFactory('figure'),
|
8653 | footer: createDOMFactory('footer'),
|
8654 | form: createDOMFactory('form'),
|
8655 | h1: createDOMFactory('h1'),
|
8656 | h2: createDOMFactory('h2'),
|
8657 | h3: createDOMFactory('h3'),
|
8658 | h4: createDOMFactory('h4'),
|
8659 | h5: createDOMFactory('h5'),
|
8660 | h6: createDOMFactory('h6'),
|
8661 | head: createDOMFactory('head'),
|
8662 | header: createDOMFactory('header'),
|
8663 | hgroup: createDOMFactory('hgroup'),
|
8664 | hr: createDOMFactory('hr'),
|
8665 | html: createDOMFactory('html'),
|
8666 | i: createDOMFactory('i'),
|
8667 | iframe: createDOMFactory('iframe'),
|
8668 | img: createDOMFactory('img'),
|
8669 | input: createDOMFactory('input'),
|
8670 | ins: createDOMFactory('ins'),
|
8671 | kbd: createDOMFactory('kbd'),
|
8672 | keygen: createDOMFactory('keygen'),
|
8673 | label: createDOMFactory('label'),
|
8674 | legend: createDOMFactory('legend'),
|
8675 | li: createDOMFactory('li'),
|
8676 | link: createDOMFactory('link'),
|
8677 | main: createDOMFactory('main'),
|
8678 | map: createDOMFactory('map'),
|
8679 | mark: createDOMFactory('mark'),
|
8680 | menu: createDOMFactory('menu'),
|
8681 | menuitem: createDOMFactory('menuitem'),
|
8682 | meta: createDOMFactory('meta'),
|
8683 | meter: createDOMFactory('meter'),
|
8684 | nav: createDOMFactory('nav'),
|
8685 | noscript: createDOMFactory('noscript'),
|
8686 | object: createDOMFactory('object'),
|
8687 | ol: createDOMFactory('ol'),
|
8688 | optgroup: createDOMFactory('optgroup'),
|
8689 | option: createDOMFactory('option'),
|
8690 | output: createDOMFactory('output'),
|
8691 | p: createDOMFactory('p'),
|
8692 | param: createDOMFactory('param'),
|
8693 | picture: createDOMFactory('picture'),
|
8694 | pre: createDOMFactory('pre'),
|
8695 | progress: createDOMFactory('progress'),
|
8696 | q: createDOMFactory('q'),
|
8697 | rp: createDOMFactory('rp'),
|
8698 | rt: createDOMFactory('rt'),
|
8699 | ruby: createDOMFactory('ruby'),
|
8700 | s: createDOMFactory('s'),
|
8701 | samp: createDOMFactory('samp'),
|
8702 | script: createDOMFactory('script'),
|
8703 | section: createDOMFactory('section'),
|
8704 | select: createDOMFactory('select'),
|
8705 | small: createDOMFactory('small'),
|
8706 | source: createDOMFactory('source'),
|
8707 | span: createDOMFactory('span'),
|
8708 | strong: createDOMFactory('strong'),
|
8709 | style: createDOMFactory('style'),
|
8710 | sub: createDOMFactory('sub'),
|
8711 | summary: createDOMFactory('summary'),
|
8712 | sup: createDOMFactory('sup'),
|
8713 | table: createDOMFactory('table'),
|
8714 | tbody: createDOMFactory('tbody'),
|
8715 | td: createDOMFactory('td'),
|
8716 | textarea: createDOMFactory('textarea'),
|
8717 | tfoot: createDOMFactory('tfoot'),
|
8718 | th: createDOMFactory('th'),
|
8719 | thead: createDOMFactory('thead'),
|
8720 | time: createDOMFactory('time'),
|
8721 | title: createDOMFactory('title'),
|
8722 | tr: createDOMFactory('tr'),
|
8723 | track: createDOMFactory('track'),
|
8724 | u: createDOMFactory('u'),
|
8725 | ul: createDOMFactory('ul'),
|
8726 | 'var': createDOMFactory('var'),
|
8727 | video: createDOMFactory('video'),
|
8728 | wbr: createDOMFactory('wbr'),
|
8729 |
|
8730 | // SVG
|
8731 | circle: createDOMFactory('circle'),
|
8732 | clipPath: createDOMFactory('clipPath'),
|
8733 | defs: createDOMFactory('defs'),
|
8734 | ellipse: createDOMFactory('ellipse'),
|
8735 | g: createDOMFactory('g'),
|
8736 | image: createDOMFactory('image'),
|
8737 | line: createDOMFactory('line'),
|
8738 | linearGradient: createDOMFactory('linearGradient'),
|
8739 | mask: createDOMFactory('mask'),
|
8740 | path: createDOMFactory('path'),
|
8741 | pattern: createDOMFactory('pattern'),
|
8742 | polygon: createDOMFactory('polygon'),
|
8743 | polyline: createDOMFactory('polyline'),
|
8744 | radialGradient: createDOMFactory('radialGradient'),
|
8745 | rect: createDOMFactory('rect'),
|
8746 | stop: createDOMFactory('stop'),
|
8747 | svg: createDOMFactory('svg'),
|
8748 | text: createDOMFactory('text'),
|
8749 | tspan: createDOMFactory('tspan')
|
8750 | };
|
8751 |
|
8752 | var ReactDOMFactories_1 = ReactDOMFactories;
|
8753 |
|
8754 | var isValidElement = ReactElement_1.isValidElement;
|
8755 |
|
8756 |
|
8757 |
|
8758 | var ReactPropTypes = factory_1(isValidElement);
|
8759 |
|
8760 | /**
|
8761 | * Copyright 2013-present, Facebook, Inc.
|
8762 | * All rights reserved.
|
8763 | *
|
8764 | * This source code is licensed under the BSD-style license found in the
|
8765 | * LICENSE file in the root directory of this source tree. An additional grant
|
8766 | * of patent rights can be found in the PATENTS file in the same directory.
|
8767 | *
|
8768 | */
|
8769 |
|
8770 | var ReactVersion = '15.6.1';
|
8771 |
|
8772 | var MIXINS_KEY = 'mixins';
|
8773 |
|
8774 | // Helper function to allow the creation of anonymous functions which do not
|
8775 | // have .name set to the name of the variable being assigned to.
|
8776 | function identity(fn) {
|
8777 | return fn;
|
8778 | }
|
8779 |
|
8780 | {
|
8781 |
|
8782 | }
|
8783 |
|
8784 | function factory$2(ReactComponent, isValidElement, ReactNoopUpdateQueue) {
|
8785 | /**
|
8786 | * Policies that describe methods in `ReactClassInterface`.
|
8787 | */
|
8788 |
|
8789 | var injectedMixins = [];
|
8790 |
|
8791 | /**
|
8792 | * Composite components are higher-level components that compose other composite
|
8793 | * or host components.
|
8794 | *
|
8795 | * To create a new type of `ReactClass`, pass a specification of
|
8796 | * your new class to `React.createClass`. The only requirement of your class
|
8797 | * specification is that you implement a `render` method.
|
8798 | *
|
8799 | * var MyComponent = React.createClass({
|
8800 | * render: function() {
|
8801 | * return <div>Hello World</div>;
|
8802 | * }
|
8803 | * });
|
8804 | *
|
8805 | * The class specification supports a specific protocol of methods that have
|
8806 | * special meaning (e.g. `render`). See `ReactClassInterface` for
|
8807 | * more the comprehensive protocol. Any other properties and methods in the
|
8808 | * class specification will be available on the prototype.
|
8809 | *
|
8810 | * @interface ReactClassInterface
|
8811 | * @internal
|
8812 | */
|
8813 | var ReactClassInterface = {
|
8814 | /**
|
8815 | * An array of Mixin objects to include when defining your component.
|
8816 | *
|
8817 | * @type {array}
|
8818 | * @optional
|
8819 | */
|
8820 | mixins: 'DEFINE_MANY',
|
8821 |
|
8822 | /**
|
8823 | * An object containing properties and methods that should be defined on
|
8824 | * the component's constructor instead of its prototype (static methods).
|
8825 | *
|
8826 | * @type {object}
|
8827 | * @optional
|
8828 | */
|
8829 | statics: 'DEFINE_MANY',
|
8830 |
|
8831 | /**
|
8832 | * Definition of prop types for this component.
|
8833 | *
|
8834 | * @type {object}
|
8835 | * @optional
|
8836 | */
|
8837 | propTypes: 'DEFINE_MANY',
|
8838 |
|
8839 | /**
|
8840 | * Definition of context types for this component.
|
8841 | *
|
8842 | * @type {object}
|
8843 | * @optional
|
8844 | */
|
8845 | contextTypes: 'DEFINE_MANY',
|
8846 |
|
8847 | /**
|
8848 | * Definition of context types this component sets for its children.
|
8849 | *
|
8850 | * @type {object}
|
8851 | * @optional
|
8852 | */
|
8853 | childContextTypes: 'DEFINE_MANY',
|
8854 |
|
8855 | // ==== Definition methods ====
|
8856 |
|
8857 | /**
|
8858 | * Invoked when the component is mounted. Values in the mapping will be set on
|
8859 | * `this.props` if that prop is not specified (i.e. using an `in` check).
|
8860 | *
|
8861 | * This method is invoked before `getInitialState` and therefore cannot rely
|
8862 | * on `this.state` or use `this.setState`.
|
8863 | *
|
8864 | * @return {object}
|
8865 | * @optional
|
8866 | */
|
8867 | getDefaultProps: 'DEFINE_MANY_MERGED',
|
8868 |
|
8869 | /**
|
8870 | * Invoked once before the component is mounted. The return value will be used
|
8871 | * as the initial value of `this.state`.
|
8872 | *
|
8873 | * getInitialState: function() {
|
8874 | * return {
|
8875 | * isOn: false,
|
8876 | * fooBaz: new BazFoo()
|
8877 | * }
|
8878 | * }
|
8879 | *
|
8880 | * @return {object}
|
8881 | * @optional
|
8882 | */
|
8883 | getInitialState: 'DEFINE_MANY_MERGED',
|
8884 |
|
8885 | /**
|
8886 | * @return {object}
|
8887 | * @optional
|
8888 | */
|
8889 | getChildContext: 'DEFINE_MANY_MERGED',
|
8890 |
|
8891 | /**
|
8892 | * Uses props from `this.props` and state from `this.state` to render the
|
8893 | * structure of the component.
|
8894 | *
|
8895 | * No guarantees are made about when or how often this method is invoked, so
|
8896 | * it must not have side effects.
|
8897 | *
|
8898 | * render: function() {
|
8899 | * var name = this.props.name;
|
8900 | * return <div>Hello, {name}!</div>;
|
8901 | * }
|
8902 | *
|
8903 | * @return {ReactComponent}
|
8904 | * @required
|
8905 | */
|
8906 | render: 'DEFINE_ONCE',
|
8907 |
|
8908 | // ==== Delegate methods ====
|
8909 |
|
8910 | /**
|
8911 | * Invoked when the component is initially created and about to be mounted.
|
8912 | * This may have side effects, but any external subscriptions or data created
|
8913 | * by this method must be cleaned up in `componentWillUnmount`.
|
8914 | *
|
8915 | * @optional
|
8916 | */
|
8917 | componentWillMount: 'DEFINE_MANY',
|
8918 |
|
8919 | /**
|
8920 | * Invoked when the component has been mounted and has a DOM representation.
|
8921 | * However, there is no guarantee that the DOM node is in the document.
|
8922 | *
|
8923 | * Use this as an opportunity to operate on the DOM when the component has
|
8924 | * been mounted (initialized and rendered) for the first time.
|
8925 | *
|
8926 | * @param {DOMElement} rootNode DOM element representing the component.
|
8927 | * @optional
|
8928 | */
|
8929 | componentDidMount: 'DEFINE_MANY',
|
8930 |
|
8931 | /**
|
8932 | * Invoked before the component receives new props.
|
8933 | *
|
8934 | * Use this as an opportunity to react to a prop transition by updating the
|
8935 | * state using `this.setState`. Current props are accessed via `this.props`.
|
8936 | *
|
8937 | * componentWillReceiveProps: function(nextProps, nextContext) {
|
8938 | * this.setState({
|
8939 | * likesIncreasing: nextProps.likeCount > this.props.likeCount
|
8940 | * });
|
8941 | * }
|
8942 | *
|
8943 | * NOTE: There is no equivalent `componentWillReceiveState`. An incoming prop
|
8944 | * transition may cause a state change, but the opposite is not true. If you
|
8945 | * need it, you are probably looking for `componentWillUpdate`.
|
8946 | *
|
8947 | * @param {object} nextProps
|
8948 | * @optional
|
8949 | */
|
8950 | componentWillReceiveProps: 'DEFINE_MANY',
|
8951 |
|
8952 | /**
|
8953 | * Invoked while deciding if the component should be updated as a result of
|
8954 | * receiving new props, state and/or context.
|
8955 | *
|
8956 | * Use this as an opportunity to `return false` when you're certain that the
|
8957 | * transition to the new props/state/context will not require a component
|
8958 | * update.
|
8959 | *
|
8960 | * shouldComponentUpdate: function(nextProps, nextState, nextContext) {
|
8961 | * return !equal(nextProps, this.props) ||
|
8962 | * !equal(nextState, this.state) ||
|
8963 | * !equal(nextContext, this.context);
|
8964 | * }
|
8965 | *
|
8966 | * @param {object} nextProps
|
8967 | * @param {?object} nextState
|
8968 | * @param {?object} nextContext
|
8969 | * @return {boolean} True if the component should update.
|
8970 | * @optional
|
8971 | */
|
8972 | shouldComponentUpdate: 'DEFINE_ONCE',
|
8973 |
|
8974 | /**
|
8975 | * Invoked when the component is about to update due to a transition from
|
8976 | * `this.props`, `this.state` and `this.context` to `nextProps`, `nextState`
|
8977 | * and `nextContext`.
|
8978 | *
|
8979 | * Use this as an opportunity to perform preparation before an update occurs.
|
8980 | *
|
8981 | * NOTE: You **cannot** use `this.setState()` in this method.
|
8982 | *
|
8983 | * @param {object} nextProps
|
8984 | * @param {?object} nextState
|
8985 | * @param {?object} nextContext
|
8986 | * @param {ReactReconcileTransaction} transaction
|
8987 | * @optional
|
8988 | */
|
8989 | componentWillUpdate: 'DEFINE_MANY',
|
8990 |
|
8991 | /**
|
8992 | * Invoked when the component's DOM representation has been updated.
|
8993 | *
|
8994 | * Use this as an opportunity to operate on the DOM when the component has
|
8995 | * been updated.
|
8996 | *
|
8997 | * @param {object} prevProps
|
8998 | * @param {?object} prevState
|
8999 | * @param {?object} prevContext
|
9000 | * @param {DOMElement} rootNode DOM element representing the component.
|
9001 | * @optional
|
9002 | */
|
9003 | componentDidUpdate: 'DEFINE_MANY',
|
9004 |
|
9005 | /**
|
9006 | * Invoked when the component is about to be removed from its parent and have
|
9007 | * its DOM representation destroyed.
|
9008 | *
|
9009 | * Use this as an opportunity to deallocate any external resources.
|
9010 | *
|
9011 | * NOTE: There is no `componentDidUnmount` since your component will have been
|
9012 | * destroyed by that point.
|
9013 | *
|
9014 | * @optional
|
9015 | */
|
9016 | componentWillUnmount: 'DEFINE_MANY',
|
9017 |
|
9018 | // ==== Advanced methods ====
|
9019 |
|
9020 | /**
|
9021 | * Updates the component's currently mounted DOM representation.
|
9022 | *
|
9023 | * By default, this implements React's rendering and reconciliation algorithm.
|
9024 | * Sophisticated clients may wish to override this.
|
9025 | *
|
9026 | * @param {ReactReconcileTransaction} transaction
|
9027 | * @internal
|
9028 | * @overridable
|
9029 | */
|
9030 | updateComponent: 'OVERRIDE_BASE'
|
9031 | };
|
9032 |
|
9033 | /**
|
9034 | * Mapping from class specification keys to special processing functions.
|
9035 | *
|
9036 | * Although these are declared like instance properties in the specification
|
9037 | * when defining classes using `React.createClass`, they are actually static
|
9038 | * and are accessible on the constructor instead of the prototype. Despite
|
9039 | * being static, they must be defined outside of the "statics" key under
|
9040 | * which all other static methods are defined.
|
9041 | */
|
9042 | var RESERVED_SPEC_KEYS = {
|
9043 | displayName: function(Constructor, displayName) {
|
9044 | Constructor.displayName = displayName;
|
9045 | },
|
9046 | mixins: function(Constructor, mixins) {
|
9047 | if (mixins) {
|
9048 | for (var i = 0; i < mixins.length; i++) {
|
9049 | mixSpecIntoComponent(Constructor, mixins[i]);
|
9050 | }
|
9051 | }
|
9052 | },
|
9053 | childContextTypes: function(Constructor, childContextTypes) {
|
9054 | Constructor.childContextTypes = objectAssign(
|
9055 | {},
|
9056 | Constructor.childContextTypes,
|
9057 | childContextTypes
|
9058 | );
|
9059 | },
|
9060 | contextTypes: function(Constructor, contextTypes) {
|
9061 | Constructor.contextTypes = objectAssign(
|
9062 | {},
|
9063 | Constructor.contextTypes,
|
9064 | contextTypes
|
9065 | );
|
9066 | },
|
9067 | /**
|
9068 | * Special case getDefaultProps which should move into statics but requires
|
9069 | * automatic merging.
|
9070 | */
|
9071 | getDefaultProps: function(Constructor, getDefaultProps) {
|
9072 | if (Constructor.getDefaultProps) {
|
9073 | Constructor.getDefaultProps = createMergedResultFunction(
|
9074 | Constructor.getDefaultProps,
|
9075 | getDefaultProps
|
9076 | );
|
9077 | } else {
|
9078 | Constructor.getDefaultProps = getDefaultProps;
|
9079 | }
|
9080 | },
|
9081 | propTypes: function(Constructor, propTypes) {
|
9082 | Constructor.propTypes = objectAssign({}, Constructor.propTypes, propTypes);
|
9083 | },
|
9084 | statics: function(Constructor, statics) {
|
9085 | mixStaticSpecIntoComponent(Constructor, statics);
|
9086 | },
|
9087 | autobind: function() {}
|
9088 | };
|
9089 |
|
9090 | function validateMethodOverride(isAlreadyDefined, name) {
|
9091 | var specPolicy = ReactClassInterface.hasOwnProperty(name)
|
9092 | ? ReactClassInterface[name]
|
9093 | : null;
|
9094 |
|
9095 | // Disallow overriding of base class methods unless explicitly allowed.
|
9096 | if (ReactClassMixin.hasOwnProperty(name)) {
|
9097 | invariant_1(
|
9098 | specPolicy === 'OVERRIDE_BASE',
|
9099 | 'ReactClassInterface: You are attempting to override ' +
|
9100 | '`%s` from your class specification. Ensure that your method names ' +
|
9101 | 'do not overlap with React methods.',
|
9102 | name
|
9103 | );
|
9104 | }
|
9105 |
|
9106 | // Disallow defining methods more than once unless explicitly allowed.
|
9107 | if (isAlreadyDefined) {
|
9108 | invariant_1(
|
9109 | specPolicy === 'DEFINE_MANY' || specPolicy === 'DEFINE_MANY_MERGED',
|
9110 | 'ReactClassInterface: You are attempting to define ' +
|
9111 | '`%s` on your component more than once. This conflict may be due ' +
|
9112 | 'to a mixin.',
|
9113 | name
|
9114 | );
|
9115 | }
|
9116 | }
|
9117 |
|
9118 | /**
|
9119 | * Mixin helper which handles policy validation and reserved
|
9120 | * specification keys when building React classes.
|
9121 | */
|
9122 | function mixSpecIntoComponent(Constructor, spec) {
|
9123 | if (!spec) {
|
9124 | return;
|
9125 | }
|
9126 |
|
9127 | invariant_1(
|
9128 | typeof spec !== 'function',
|
9129 | "ReactClass: You're attempting to " +
|
9130 | 'use a component class or function as a mixin. Instead, just use a ' +
|
9131 | 'regular object.'
|
9132 | );
|
9133 | invariant_1(
|
9134 | !isValidElement(spec),
|
9135 | "ReactClass: You're attempting to " +
|
9136 | 'use a component as a mixin. Instead, just use a regular object.'
|
9137 | );
|
9138 |
|
9139 | var proto = Constructor.prototype;
|
9140 | var autoBindPairs = proto.__reactAutoBindPairs;
|
9141 |
|
9142 | // By handling mixins before any other properties, we ensure the same
|
9143 | // chaining order is applied to methods with DEFINE_MANY policy, whether
|
9144 | // mixins are listed before or after these methods in the spec.
|
9145 | if (spec.hasOwnProperty(MIXINS_KEY)) {
|
9146 | RESERVED_SPEC_KEYS.mixins(Constructor, spec.mixins);
|
9147 | }
|
9148 |
|
9149 | for (var name in spec) {
|
9150 | if (!spec.hasOwnProperty(name)) {
|
9151 | continue;
|
9152 | }
|
9153 |
|
9154 | if (name === MIXINS_KEY) {
|
9155 | // We have already handled mixins in a special case above.
|
9156 | continue;
|
9157 | }
|
9158 |
|
9159 | var property = spec[name];
|
9160 | var isAlreadyDefined = proto.hasOwnProperty(name);
|
9161 | validateMethodOverride(isAlreadyDefined, name);
|
9162 |
|
9163 | if (RESERVED_SPEC_KEYS.hasOwnProperty(name)) {
|
9164 | RESERVED_SPEC_KEYS[name](Constructor, property);
|
9165 | } else {
|
9166 | // Setup methods on prototype:
|
9167 | // The following member methods should not be automatically bound:
|
9168 | // 1. Expected ReactClass methods (in the "interface").
|
9169 | // 2. Overridden methods (that were mixed in).
|
9170 | var isReactClassMethod = ReactClassInterface.hasOwnProperty(name);
|
9171 | var isFunction = typeof property === 'function';
|
9172 | var shouldAutoBind =
|
9173 | isFunction &&
|
9174 | !isReactClassMethod &&
|
9175 | !isAlreadyDefined &&
|
9176 | spec.autobind !== false;
|
9177 |
|
9178 | if (shouldAutoBind) {
|
9179 | autoBindPairs.push(name, property);
|
9180 | proto[name] = property;
|
9181 | } else {
|
9182 | if (isAlreadyDefined) {
|
9183 | var specPolicy = ReactClassInterface[name];
|
9184 |
|
9185 | // These cases should already be caught by validateMethodOverride.
|
9186 | invariant_1(
|
9187 | isReactClassMethod &&
|
9188 | (specPolicy === 'DEFINE_MANY_MERGED' ||
|
9189 | specPolicy === 'DEFINE_MANY'),
|
9190 | 'ReactClass: Unexpected spec policy %s for key %s ' +
|
9191 | 'when mixing in component specs.',
|
9192 | specPolicy,
|
9193 | name
|
9194 | );
|
9195 |
|
9196 | // For methods which are defined more than once, call the existing
|
9197 | // methods before calling the new property, merging if appropriate.
|
9198 | if (specPolicy === 'DEFINE_MANY_MERGED') {
|
9199 | proto[name] = createMergedResultFunction(proto[name], property);
|
9200 | } else if (specPolicy === 'DEFINE_MANY') {
|
9201 | proto[name] = createChainedFunction(proto[name], property);
|
9202 | }
|
9203 | } else {
|
9204 | proto[name] = property;
|
9205 |
|
9206 | }
|
9207 | }
|
9208 | }
|
9209 | }
|
9210 | }
|
9211 |
|
9212 | function mixStaticSpecIntoComponent(Constructor, statics) {
|
9213 | if (!statics) {
|
9214 | return;
|
9215 | }
|
9216 | for (var name in statics) {
|
9217 | var property = statics[name];
|
9218 | if (!statics.hasOwnProperty(name)) {
|
9219 | continue;
|
9220 | }
|
9221 |
|
9222 | var isReserved = name in RESERVED_SPEC_KEYS;
|
9223 | invariant_1(
|
9224 | !isReserved,
|
9225 | 'ReactClass: You are attempting to define a reserved ' +
|
9226 | 'property, `%s`, that shouldn\'t be on the "statics" key. Define it ' +
|
9227 | 'as an instance property instead; it will still be accessible on the ' +
|
9228 | 'constructor.',
|
9229 | name
|
9230 | );
|
9231 |
|
9232 | var isInherited = name in Constructor;
|
9233 | invariant_1(
|
9234 | !isInherited,
|
9235 | 'ReactClass: You are attempting to define ' +
|
9236 | '`%s` on your component more than once. This conflict may be ' +
|
9237 | 'due to a mixin.',
|
9238 | name
|
9239 | );
|
9240 | Constructor[name] = property;
|
9241 | }
|
9242 | }
|
9243 |
|
9244 | /**
|
9245 | * Merge two objects, but throw if both contain the same key.
|
9246 | *
|
9247 | * @param {object} one The first object, which is mutated.
|
9248 | * @param {object} two The second object
|
9249 | * @return {object} one after it has been mutated to contain everything in two.
|
9250 | */
|
9251 | function mergeIntoWithNoDuplicateKeys(one, two) {
|
9252 | invariant_1(
|
9253 | one && two && typeof one === 'object' && typeof two === 'object',
|
9254 | 'mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.'
|
9255 | );
|
9256 |
|
9257 | for (var key in two) {
|
9258 | if (two.hasOwnProperty(key)) {
|
9259 | invariant_1(
|
9260 | one[key] === undefined,
|
9261 | 'mergeIntoWithNoDuplicateKeys(): ' +
|
9262 | 'Tried to merge two objects with the same key: `%s`. This conflict ' +
|
9263 | 'may be due to a mixin; in particular, this may be caused by two ' +
|
9264 | 'getInitialState() or getDefaultProps() methods returning objects ' +
|
9265 | 'with clashing keys.',
|
9266 | key
|
9267 | );
|
9268 | one[key] = two[key];
|
9269 | }
|
9270 | }
|
9271 | return one;
|
9272 | }
|
9273 |
|
9274 | /**
|
9275 | * Creates a function that invokes two functions and merges their return values.
|
9276 | *
|
9277 | * @param {function} one Function to invoke first.
|
9278 | * @param {function} two Function to invoke second.
|
9279 | * @return {function} Function that invokes the two argument functions.
|
9280 | * @private
|
9281 | */
|
9282 | function createMergedResultFunction(one, two) {
|
9283 | return function mergedResult() {
|
9284 | var a = one.apply(this, arguments);
|
9285 | var b = two.apply(this, arguments);
|
9286 | if (a == null) {
|
9287 | return b;
|
9288 | } else if (b == null) {
|
9289 | return a;
|
9290 | }
|
9291 | var c = {};
|
9292 | mergeIntoWithNoDuplicateKeys(c, a);
|
9293 | mergeIntoWithNoDuplicateKeys(c, b);
|
9294 | return c;
|
9295 | };
|
9296 | }
|
9297 |
|
9298 | /**
|
9299 | * Creates a function that invokes two functions and ignores their return vales.
|
9300 | *
|
9301 | * @param {function} one Function to invoke first.
|
9302 | * @param {function} two Function to invoke second.
|
9303 | * @return {function} Function that invokes the two argument functions.
|
9304 | * @private
|
9305 | */
|
9306 | function createChainedFunction(one, two) {
|
9307 | return function chainedFunction() {
|
9308 | one.apply(this, arguments);
|
9309 | two.apply(this, arguments);
|
9310 | };
|
9311 | }
|
9312 |
|
9313 | /**
|
9314 | * Binds a method to the component.
|
9315 | *
|
9316 | * @param {object} component Component whose method is going to be bound.
|
9317 | * @param {function} method Method to be bound.
|
9318 | * @return {function} The bound method.
|
9319 | */
|
9320 | function bindAutoBindMethod(component, method) {
|
9321 | var boundMethod = method.bind(component);
|
9322 | return boundMethod;
|
9323 | }
|
9324 |
|
9325 | /**
|
9326 | * Binds all auto-bound methods in a component.
|
9327 | *
|
9328 | * @param {object} component Component whose method is going to be bound.
|
9329 | */
|
9330 | function bindAutoBindMethods(component) {
|
9331 | var pairs = component.__reactAutoBindPairs;
|
9332 | for (var i = 0; i < pairs.length; i += 2) {
|
9333 | var autoBindKey = pairs[i];
|
9334 | var method = pairs[i + 1];
|
9335 | component[autoBindKey] = bindAutoBindMethod(component, method);
|
9336 | }
|
9337 | }
|
9338 |
|
9339 | var IsMountedPreMixin = {
|
9340 | componentDidMount: function() {
|
9341 | this.__isMounted = true;
|
9342 | }
|
9343 | };
|
9344 |
|
9345 | var IsMountedPostMixin = {
|
9346 | componentWillUnmount: function() {
|
9347 | this.__isMounted = false;
|
9348 | }
|
9349 | };
|
9350 |
|
9351 | /**
|
9352 | * Add more to the ReactClass base class. These are all legacy features and
|
9353 | * therefore not already part of the modern ReactComponent.
|
9354 | */
|
9355 | var ReactClassMixin = {
|
9356 | /**
|
9357 | * TODO: This will be deprecated because state should always keep a consistent
|
9358 | * type signature and the only use case for this, is to avoid that.
|
9359 | */
|
9360 | replaceState: function(newState, callback) {
|
9361 | this.updater.enqueueReplaceState(this, newState, callback);
|
9362 | },
|
9363 |
|
9364 | /**
|
9365 | * Checks whether or not this composite component is mounted.
|
9366 | * @return {boolean} True if mounted, false otherwise.
|
9367 | * @protected
|
9368 | * @final
|
9369 | */
|
9370 | isMounted: function() {
|
9371 | return !!this.__isMounted;
|
9372 | }
|
9373 | };
|
9374 |
|
9375 | var ReactClassComponent = function() {};
|
9376 | objectAssign(
|
9377 | ReactClassComponent.prototype,
|
9378 | ReactComponent.prototype,
|
9379 | ReactClassMixin
|
9380 | );
|
9381 |
|
9382 | /**
|
9383 | * Creates a composite component class given a class specification.
|
9384 | * See https://facebook.github.io/react/docs/top-level-api.html#react.createclass
|
9385 | *
|
9386 | * @param {object} spec Class specification (which must define `render`).
|
9387 | * @return {function} Component constructor function.
|
9388 | * @public
|
9389 | */
|
9390 | function createClass(spec) {
|
9391 | // To keep our warnings more understandable, we'll use a little hack here to
|
9392 | // ensure that Constructor.name !== 'Constructor'. This makes sure we don't
|
9393 | // unnecessarily identify a class without displayName as 'Constructor'.
|
9394 | var Constructor = identity(function(props, context, updater) {
|
9395 | // This constructor gets overridden by mocks. The argument is used
|
9396 | // by mocks to assert on what gets mounted.
|
9397 |
|
9398 | if (this.__reactAutoBindPairs.length) {
|
9399 | bindAutoBindMethods(this);
|
9400 | }
|
9401 |
|
9402 | this.props = props;
|
9403 | this.context = context;
|
9404 | this.refs = emptyObject_1;
|
9405 | this.updater = updater || ReactNoopUpdateQueue;
|
9406 |
|
9407 | this.state = null;
|
9408 |
|
9409 | // ReactClasses doesn't have constructors. Instead, they use the
|
9410 | // getInitialState and componentWillMount methods for initialization.
|
9411 |
|
9412 | var initialState = this.getInitialState ? this.getInitialState() : null;
|
9413 | invariant_1(
|
9414 | typeof initialState === 'object' && !Array.isArray(initialState),
|
9415 | '%s.getInitialState(): must return an object or null',
|
9416 | Constructor.displayName || 'ReactCompositeComponent'
|
9417 | );
|
9418 |
|
9419 | this.state = initialState;
|
9420 | });
|
9421 | Constructor.prototype = new ReactClassComponent();
|
9422 | Constructor.prototype.constructor = Constructor;
|
9423 | Constructor.prototype.__reactAutoBindPairs = [];
|
9424 |
|
9425 | injectedMixins.forEach(mixSpecIntoComponent.bind(null, Constructor));
|
9426 |
|
9427 | mixSpecIntoComponent(Constructor, IsMountedPreMixin);
|
9428 | mixSpecIntoComponent(Constructor, spec);
|
9429 | mixSpecIntoComponent(Constructor, IsMountedPostMixin);
|
9430 |
|
9431 | // Initialize the defaultProps property after all mixins have been merged.
|
9432 | if (Constructor.getDefaultProps) {
|
9433 | Constructor.defaultProps = Constructor.getDefaultProps();
|
9434 | }
|
9435 |
|
9436 | invariant_1(
|
9437 | Constructor.prototype.render,
|
9438 | 'createClass(...): Class specification must implement a `render` method.'
|
9439 | );
|
9440 |
|
9441 | for (var methodName in ReactClassInterface) {
|
9442 | if (!Constructor.prototype[methodName]) {
|
9443 | Constructor.prototype[methodName] = null;
|
9444 | }
|
9445 | }
|
9446 |
|
9447 | return Constructor;
|
9448 | }
|
9449 |
|
9450 | return createClass;
|
9451 | }
|
9452 |
|
9453 | var factory_1$2 = factory$2;
|
9454 |
|
9455 | var Component = ReactBaseClasses.Component;
|
9456 |
|
9457 | var isValidElement$1 = ReactElement_1.isValidElement;
|
9458 |
|
9459 |
|
9460 |
|
9461 |
|
9462 | var createClass = factory_1$2(Component, isValidElement$1, ReactNoopUpdateQueue_1);
|
9463 |
|
9464 | /**
|
9465 | * Returns the first child in a collection of children and verifies that there
|
9466 | * is only one child in the collection.
|
9467 | *
|
9468 | * See https://facebook.github.io/react/docs/top-level-api.html#react.children.only
|
9469 | *
|
9470 | * The current implementation of this function assumes that a single child gets
|
9471 | * passed without a wrapper, but the purpose of this helper function is to
|
9472 | * abstract away the particular structure of children.
|
9473 | *
|
9474 | * @param {?object} children Child collection structure.
|
9475 | * @return {ReactElement} The first and only `ReactElement` contained in the
|
9476 | * structure.
|
9477 | */
|
9478 | function onlyChild(children) {
|
9479 | !ReactElement_1.isValidElement(children) ? reactProdInvariant_1$2('143') : void 0;
|
9480 | return children;
|
9481 | }
|
9482 |
|
9483 | var onlyChild_1 = onlyChild;
|
9484 |
|
9485 | var createElement = ReactElement_1.createElement;
|
9486 | var createFactory = ReactElement_1.createFactory;
|
9487 | var cloneElement = ReactElement_1.cloneElement;
|
9488 |
|
9489 | var __spread = objectAssign;
|
9490 | var createMixin = function (mixin) {
|
9491 | return mixin;
|
9492 | };
|
9493 |
|
9494 | var React = {
|
9495 | // Modern
|
9496 |
|
9497 | Children: {
|
9498 | map: ReactChildren_1.map,
|
9499 | forEach: ReactChildren_1.forEach,
|
9500 | count: ReactChildren_1.count,
|
9501 | toArray: ReactChildren_1.toArray,
|
9502 | only: onlyChild_1
|
9503 | },
|
9504 |
|
9505 | Component: ReactBaseClasses.Component,
|
9506 | PureComponent: ReactBaseClasses.PureComponent,
|
9507 |
|
9508 | createElement: createElement,
|
9509 | cloneElement: cloneElement,
|
9510 | isValidElement: ReactElement_1.isValidElement,
|
9511 |
|
9512 | // Classic
|
9513 |
|
9514 | PropTypes: ReactPropTypes,
|
9515 | createClass: createClass,
|
9516 | createFactory: createFactory,
|
9517 | createMixin: createMixin,
|
9518 |
|
9519 | // This looks DOM specific but these are actually isomorphic helpers
|
9520 | // since they are just generating DOM strings.
|
9521 | DOM: ReactDOMFactories_1,
|
9522 |
|
9523 | version: ReactVersion,
|
9524 |
|
9525 | // Deprecated hook for JSX spread, don't use this for anything.
|
9526 | __spread: __spread
|
9527 | };
|
9528 |
|
9529 | var React_1 = React;
|
9530 |
|
9531 | var PropTypes = factory_1(React_1.isValidElement);
|
9532 |
|
9533 |
|
9534 |
|
9535 |
|
9536 | var hasReadOnlyValue = {
|
9537 | button: true,
|
9538 | checkbox: true,
|
9539 | image: true,
|
9540 | hidden: true,
|
9541 | radio: true,
|
9542 | reset: true,
|
9543 | submit: true
|
9544 | };
|
9545 |
|
9546 | function _assertSingleLink(inputProps) {
|
9547 | !(inputProps.checkedLink == null || inputProps.valueLink == null) ? reactProdInvariant_1('87') : void 0;
|
9548 | }
|
9549 | function _assertValueLink(inputProps) {
|
9550 | _assertSingleLink(inputProps);
|
9551 | !(inputProps.value == null && inputProps.onChange == null) ? reactProdInvariant_1('88') : void 0;
|
9552 | }
|
9553 |
|
9554 | function _assertCheckedLink(inputProps) {
|
9555 | _assertSingleLink(inputProps);
|
9556 | !(inputProps.checked == null && inputProps.onChange == null) ? reactProdInvariant_1('89') : void 0;
|
9557 | }
|
9558 |
|
9559 | var propTypes = {
|
9560 | value: function (props, propName, componentName) {
|
9561 | if (!props[propName] || hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled) {
|
9562 | return null;
|
9563 | }
|
9564 | return new Error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.');
|
9565 | },
|
9566 | checked: function (props, propName, componentName) {
|
9567 | if (!props[propName] || props.onChange || props.readOnly || props.disabled) {
|
9568 | return null;
|
9569 | }
|
9570 | return new Error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.');
|
9571 | },
|
9572 | onChange: PropTypes.func
|
9573 | };
|
9574 |
|
9575 | var loggedTypeFailures = {};
|
9576 | function getDeclarationErrorAddendum$1(owner) {
|
9577 | if (owner) {
|
9578 | var name = owner.getName();
|
9579 | if (name) {
|
9580 | return ' Check the render method of `' + name + '`.';
|
9581 | }
|
9582 | }
|
9583 | return '';
|
9584 | }
|
9585 |
|
9586 | /**
|
9587 | * Provide a linked `value` attribute for controlled forms. You should not use
|
9588 | * this outside of the ReactDOM controlled form components.
|
9589 | */
|
9590 | var LinkedValueUtils = {
|
9591 | checkPropTypes: function (tagName, props, owner) {
|
9592 | for (var propName in propTypes) {
|
9593 | if (propTypes.hasOwnProperty(propName)) {
|
9594 | var error = propTypes[propName](props, propName, tagName, 'prop', null, ReactPropTypesSecret_1);
|
9595 | }
|
9596 | if (error instanceof Error && !(error.message in loggedTypeFailures)) {
|
9597 | // Only monitor this failure once because there tends to be a lot of the
|
9598 | // same error.
|
9599 | loggedTypeFailures[error.message] = true;
|
9600 |
|
9601 | var addendum = getDeclarationErrorAddendum$1(owner);
|
9602 | void 0;
|
9603 | }
|
9604 | }
|
9605 | },
|
9606 |
|
9607 | /**
|
9608 | * @param {object} inputProps Props for form component
|
9609 | * @return {*} current value of the input either from value prop or link.
|
9610 | */
|
9611 | getValue: function (inputProps) {
|
9612 | if (inputProps.valueLink) {
|
9613 | _assertValueLink(inputProps);
|
9614 | return inputProps.valueLink.value;
|
9615 | }
|
9616 | return inputProps.value;
|
9617 | },
|
9618 |
|
9619 | /**
|
9620 | * @param {object} inputProps Props for form component
|
9621 | * @return {*} current checked status of the input either from checked prop
|
9622 | * or link.
|
9623 | */
|
9624 | getChecked: function (inputProps) {
|
9625 | if (inputProps.checkedLink) {
|
9626 | _assertCheckedLink(inputProps);
|
9627 | return inputProps.checkedLink.value;
|
9628 | }
|
9629 | return inputProps.checked;
|
9630 | },
|
9631 |
|
9632 | /**
|
9633 | * @param {object} inputProps Props for form component
|
9634 | * @param {SyntheticEvent} event change event to handle
|
9635 | */
|
9636 | executeOnChange: function (inputProps, event) {
|
9637 | if (inputProps.valueLink) {
|
9638 | _assertValueLink(inputProps);
|
9639 | return inputProps.valueLink.requestChange(event.target.value);
|
9640 | } else if (inputProps.checkedLink) {
|
9641 | _assertCheckedLink(inputProps);
|
9642 | return inputProps.checkedLink.requestChange(event.target.checked);
|
9643 | } else if (inputProps.onChange) {
|
9644 | return inputProps.onChange.call(undefined, event);
|
9645 | }
|
9646 | }
|
9647 | };
|
9648 |
|
9649 | var LinkedValueUtils_1 = LinkedValueUtils;
|
9650 |
|
9651 | function forceUpdateIfMounted() {
|
9652 | if (this._rootNodeID) {
|
9653 | // DOM component is still mounted; update
|
9654 | ReactDOMInput.updateWrapper(this);
|
9655 | }
|
9656 | }
|
9657 |
|
9658 | function isControlled(props) {
|
9659 | var usesChecked = props.type === 'checkbox' || props.type === 'radio';
|
9660 | return usesChecked ? props.checked != null : props.value != null;
|
9661 | }
|
9662 |
|
9663 | /**
|
9664 | * Implements an <input> host component that allows setting these optional
|
9665 | * props: `checked`, `value`, `defaultChecked`, and `defaultValue`.
|
9666 | *
|
9667 | * If `checked` or `value` are not supplied (or null/undefined), user actions
|
9668 | * that affect the checked state or value will trigger updates to the element.
|
9669 | *
|
9670 | * If they are supplied (and not null/undefined), the rendered element will not
|
9671 | * trigger updates to the element. Instead, the props must change in order for
|
9672 | * the rendered element to be updated.
|
9673 | *
|
9674 | * The rendered element will be initialized as unchecked (or `defaultChecked`)
|
9675 | * with an empty value (or `defaultValue`).
|
9676 | *
|
9677 | * @see http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html
|
9678 | */
|
9679 | var ReactDOMInput = {
|
9680 | getHostProps: function (inst, props) {
|
9681 | var value = LinkedValueUtils_1.getValue(props);
|
9682 | var checked = LinkedValueUtils_1.getChecked(props);
|
9683 |
|
9684 | var hostProps = objectAssign({
|
9685 | // Make sure we set .type before any other properties (setting .value
|
9686 | // before .type means .value is lost in IE11 and below)
|
9687 | type: undefined,
|
9688 | // Make sure we set .step before .value (setting .value before .step
|
9689 | // means .value is rounded on mount, based upon step precision)
|
9690 | step: undefined,
|
9691 | // Make sure we set .min & .max before .value (to ensure proper order
|
9692 | // in corner cases such as min or max deriving from value, e.g. Issue #7170)
|
9693 | min: undefined,
|
9694 | max: undefined
|
9695 | }, props, {
|
9696 | defaultChecked: undefined,
|
9697 | defaultValue: undefined,
|
9698 | value: value != null ? value : inst._wrapperState.initialValue,
|
9699 | checked: checked != null ? checked : inst._wrapperState.initialChecked,
|
9700 | onChange: inst._wrapperState.onChange
|
9701 | });
|
9702 |
|
9703 | return hostProps;
|
9704 | },
|
9705 |
|
9706 | mountWrapper: function (inst, props) {
|
9707 | var defaultValue = props.defaultValue;
|
9708 | inst._wrapperState = {
|
9709 | initialChecked: props.checked != null ? props.checked : props.defaultChecked,
|
9710 | initialValue: props.value != null ? props.value : defaultValue,
|
9711 | listeners: null,
|
9712 | onChange: _handleChange.bind(inst),
|
9713 | controlled: isControlled(props)
|
9714 | };
|
9715 | },
|
9716 |
|
9717 | updateWrapper: function (inst) {
|
9718 | var props = inst._currentElement.props;
|
9719 |
|
9720 | var checked = props.checked;
|
9721 | if (checked != null) {
|
9722 | DOMPropertyOperations_1.setValueForProperty(ReactDOMComponentTree_1.getNodeFromInstance(inst), 'checked', checked || false);
|
9723 | }
|
9724 |
|
9725 | var node = ReactDOMComponentTree_1.getNodeFromInstance(inst);
|
9726 | var value = LinkedValueUtils_1.getValue(props);
|
9727 | if (value != null) {
|
9728 | if (value === 0 && node.value === '') {
|
9729 | node.value = '0';
|
9730 | // Note: IE9 reports a number inputs as 'text', so check props instead.
|
9731 | } else if (props.type === 'number') {
|
9732 | // Simulate `input.valueAsNumber`. IE9 does not support it
|
9733 | var valueAsNumber = parseFloat(node.value, 10) || 0;
|
9734 |
|
9735 | if (
|
9736 | // eslint-disable-next-line
|
9737 | value != valueAsNumber ||
|
9738 | // eslint-disable-next-line
|
9739 | value == valueAsNumber && node.value != value) {
|
9740 | // Cast `value` to a string to ensure the value is set correctly. While
|
9741 | // browsers typically do this as necessary, jsdom doesn't.
|
9742 | node.value = '' + value;
|
9743 | }
|
9744 | } else if (node.value !== '' + value) {
|
9745 | // Cast `value` to a string to ensure the value is set correctly. While
|
9746 | // browsers typically do this as necessary, jsdom doesn't.
|
9747 | node.value = '' + value;
|
9748 | }
|
9749 | } else {
|
9750 | if (props.value == null && props.defaultValue != null) {
|
9751 | // In Chrome, assigning defaultValue to certain input types triggers input validation.
|
9752 | // For number inputs, the display value loses trailing decimal points. For email inputs,
|
9753 | // Chrome raises "The specified value <x> is not a valid email address".
|
9754 | //
|
9755 | // Here we check to see if the defaultValue has actually changed, avoiding these problems
|
9756 | // when the user is inputting text
|
9757 | //
|
9758 | // https://github.com/facebook/react/issues/7253
|
9759 | if (node.defaultValue !== '' + props.defaultValue) {
|
9760 | node.defaultValue = '' + props.defaultValue;
|
9761 | }
|
9762 | }
|
9763 | if (props.checked == null && props.defaultChecked != null) {
|
9764 | node.defaultChecked = !!props.defaultChecked;
|
9765 | }
|
9766 | }
|
9767 | },
|
9768 |
|
9769 | postMountWrapper: function (inst) {
|
9770 | var props = inst._currentElement.props;
|
9771 |
|
9772 | // This is in postMount because we need access to the DOM node, which is not
|
9773 | // available until after the component has mounted.
|
9774 | var node = ReactDOMComponentTree_1.getNodeFromInstance(inst);
|
9775 |
|
9776 | // Detach value from defaultValue. We won't do anything if we're working on
|
9777 | // submit or reset inputs as those values & defaultValues are linked. They
|
9778 | // are not resetable nodes so this operation doesn't matter and actually
|
9779 | // removes browser-default values (eg "Submit Query") when no value is
|
9780 | // provided.
|
9781 |
|
9782 | switch (props.type) {
|
9783 | case 'submit':
|
9784 | case 'reset':
|
9785 | break;
|
9786 | case 'color':
|
9787 | case 'date':
|
9788 | case 'datetime':
|
9789 | case 'datetime-local':
|
9790 | case 'month':
|
9791 | case 'time':
|
9792 | case 'week':
|
9793 | // This fixes the no-show issue on iOS Safari and Android Chrome:
|
9794 | // https://github.com/facebook/react/issues/7233
|
9795 | node.value = '';
|
9796 | node.value = node.defaultValue;
|
9797 | break;
|
9798 | default:
|
9799 | node.value = node.value;
|
9800 | break;
|
9801 | }
|
9802 |
|
9803 | // Normally, we'd just do `node.checked = node.checked` upon initial mount, less this bug
|
9804 | // this is needed to work around a chrome bug where setting defaultChecked
|
9805 | // will sometimes influence the value of checked (even after detachment).
|
9806 | // Reference: https://bugs.chromium.org/p/chromium/issues/detail?id=608416
|
9807 | // We need to temporarily unset name to avoid disrupting radio button groups.
|
9808 | var name = node.name;
|
9809 | if (name !== '') {
|
9810 | node.name = '';
|
9811 | }
|
9812 | node.defaultChecked = !node.defaultChecked;
|
9813 | node.defaultChecked = !node.defaultChecked;
|
9814 | if (name !== '') {
|
9815 | node.name = name;
|
9816 | }
|
9817 | }
|
9818 | };
|
9819 |
|
9820 | function _handleChange(event) {
|
9821 | var props = this._currentElement.props;
|
9822 |
|
9823 | var returnValue = LinkedValueUtils_1.executeOnChange(props, event);
|
9824 |
|
9825 | // Here we use asap to wait until all updates have propagated, which
|
9826 | // is important when using controlled components within layers:
|
9827 | // https://github.com/facebook/react/issues/1698
|
9828 | ReactUpdates_1.asap(forceUpdateIfMounted, this);
|
9829 |
|
9830 | var name = props.name;
|
9831 | if (props.type === 'radio' && name != null) {
|
9832 | var rootNode = ReactDOMComponentTree_1.getNodeFromInstance(this);
|
9833 | var queryRoot = rootNode;
|
9834 |
|
9835 | while (queryRoot.parentNode) {
|
9836 | queryRoot = queryRoot.parentNode;
|
9837 | }
|
9838 |
|
9839 | // If `rootNode.form` was non-null, then we could try `form.elements`,
|
9840 | // but that sometimes behaves strangely in IE8. We could also try using
|
9841 | // `form.getElementsByName`, but that will only return direct children
|
9842 | // and won't include inputs that use the HTML5 `form=` attribute. Since
|
9843 | // the input might not even be in a form, let's just use the global
|
9844 | // `querySelectorAll` to ensure we don't miss anything.
|
9845 | var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type="radio"]');
|
9846 |
|
9847 | for (var i = 0; i < group.length; i++) {
|
9848 | var otherNode = group[i];
|
9849 | if (otherNode === rootNode || otherNode.form !== rootNode.form) {
|
9850 | continue;
|
9851 | }
|
9852 | // This will throw if radio buttons rendered by different copies of React
|
9853 | // and the same name are rendered into the same form (same as #1939).
|
9854 | // That's probably okay; we don't support it just as we don't support
|
9855 | // mixing React radio buttons with non-React ones.
|
9856 | var otherInstance = ReactDOMComponentTree_1.getInstanceFromNode(otherNode);
|
9857 | !otherInstance ? reactProdInvariant_1('90') : void 0;
|
9858 | // If this is a controlled radio button group, forcing the input that
|
9859 | // was previously checked to update will cause it to be come re-checked
|
9860 | // as appropriate.
|
9861 | ReactUpdates_1.asap(forceUpdateIfMounted, otherInstance);
|
9862 | }
|
9863 | }
|
9864 |
|
9865 | return returnValue;
|
9866 | }
|
9867 |
|
9868 | var ReactDOMInput_1 = ReactDOMInput;
|
9869 |
|
9870 | var didWarnValueDefaultValue$1 = false;
|
9871 |
|
9872 | function updateOptionsIfPendingUpdateAndMounted() {
|
9873 | if (this._rootNodeID && this._wrapperState.pendingUpdate) {
|
9874 | this._wrapperState.pendingUpdate = false;
|
9875 |
|
9876 | var props = this._currentElement.props;
|
9877 | var value = LinkedValueUtils_1.getValue(props);
|
9878 |
|
9879 | if (value != null) {
|
9880 | updateOptions(this, Boolean(props.multiple), value);
|
9881 | }
|
9882 | }
|
9883 | }
|
9884 |
|
9885 | /**
|
9886 | * @param {ReactDOMComponent} inst
|
9887 | * @param {boolean} multiple
|
9888 | * @param {*} propValue A stringable (with `multiple`, a list of stringables).
|
9889 | * @private
|
9890 | */
|
9891 | function updateOptions(inst, multiple, propValue) {
|
9892 | var selectedValue, i;
|
9893 | var options = ReactDOMComponentTree_1.getNodeFromInstance(inst).options;
|
9894 |
|
9895 | if (multiple) {
|
9896 | selectedValue = {};
|
9897 | for (i = 0; i < propValue.length; i++) {
|
9898 | selectedValue['' + propValue[i]] = true;
|
9899 | }
|
9900 | for (i = 0; i < options.length; i++) {
|
9901 | var selected = selectedValue.hasOwnProperty(options[i].value);
|
9902 | if (options[i].selected !== selected) {
|
9903 | options[i].selected = selected;
|
9904 | }
|
9905 | }
|
9906 | } else {
|
9907 | // Do not set `select.value` as exact behavior isn't consistent across all
|
9908 | // browsers for all cases.
|
9909 | selectedValue = '' + propValue;
|
9910 | for (i = 0; i < options.length; i++) {
|
9911 | if (options[i].value === selectedValue) {
|
9912 | options[i].selected = true;
|
9913 | return;
|
9914 | }
|
9915 | }
|
9916 | if (options.length) {
|
9917 | options[0].selected = true;
|
9918 | }
|
9919 | }
|
9920 | }
|
9921 |
|
9922 | /**
|
9923 | * Implements a <select> host component that allows optionally setting the
|
9924 | * props `value` and `defaultValue`. If `multiple` is false, the prop must be a
|
9925 | * stringable. If `multiple` is true, the prop must be an array of stringables.
|
9926 | *
|
9927 | * If `value` is not supplied (or null/undefined), user actions that change the
|
9928 | * selected option will trigger updates to the rendered options.
|
9929 | *
|
9930 | * If it is supplied (and not null/undefined), the rendered options will not
|
9931 | * update in response to user actions. Instead, the `value` prop must change in
|
9932 | * order for the rendered options to update.
|
9933 | *
|
9934 | * If `defaultValue` is provided, any options with the supplied values will be
|
9935 | * selected.
|
9936 | */
|
9937 | var ReactDOMSelect = {
|
9938 | getHostProps: function (inst, props) {
|
9939 | return objectAssign({}, props, {
|
9940 | onChange: inst._wrapperState.onChange,
|
9941 | value: undefined
|
9942 | });
|
9943 | },
|
9944 |
|
9945 | mountWrapper: function (inst, props) {
|
9946 | var value = LinkedValueUtils_1.getValue(props);
|
9947 | inst._wrapperState = {
|
9948 | pendingUpdate: false,
|
9949 | initialValue: value != null ? value : props.defaultValue,
|
9950 | listeners: null,
|
9951 | onChange: _handleChange$1.bind(inst),
|
9952 | wasMultiple: Boolean(props.multiple)
|
9953 | };
|
9954 |
|
9955 | if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue$1) {
|
9956 | void 0;
|
9957 | didWarnValueDefaultValue$1 = true;
|
9958 | }
|
9959 | },
|
9960 |
|
9961 | getSelectValueContext: function (inst) {
|
9962 | // ReactDOMOption looks at this initial value so the initial generated
|
9963 | // markup has correct `selected` attributes
|
9964 | return inst._wrapperState.initialValue;
|
9965 | },
|
9966 |
|
9967 | postUpdateWrapper: function (inst) {
|
9968 | var props = inst._currentElement.props;
|
9969 |
|
9970 | // After the initial mount, we control selected-ness manually so don't pass
|
9971 | // this value down
|
9972 | inst._wrapperState.initialValue = undefined;
|
9973 |
|
9974 | var wasMultiple = inst._wrapperState.wasMultiple;
|
9975 | inst._wrapperState.wasMultiple = Boolean(props.multiple);
|
9976 |
|
9977 | var value = LinkedValueUtils_1.getValue(props);
|
9978 | if (value != null) {
|
9979 | inst._wrapperState.pendingUpdate = false;
|
9980 | updateOptions(inst, Boolean(props.multiple), value);
|
9981 | } else if (wasMultiple !== Boolean(props.multiple)) {
|
9982 | // For simplicity, reapply `defaultValue` if `multiple` is toggled.
|
9983 | if (props.defaultValue != null) {
|
9984 | updateOptions(inst, Boolean(props.multiple), props.defaultValue);
|
9985 | } else {
|
9986 | // Revert the select back to its default unselected state.
|
9987 | updateOptions(inst, Boolean(props.multiple), props.multiple ? [] : '');
|
9988 | }
|
9989 | }
|
9990 | }
|
9991 | };
|
9992 |
|
9993 | function _handleChange$1(event) {
|
9994 | var props = this._currentElement.props;
|
9995 | var returnValue = LinkedValueUtils_1.executeOnChange(props, event);
|
9996 |
|
9997 | if (this._rootNodeID) {
|
9998 | this._wrapperState.pendingUpdate = true;
|
9999 | }
|
10000 | ReactUpdates_1.asap(updateOptionsIfPendingUpdateAndMounted, this);
|
10001 | return returnValue;
|
10002 | }
|
10003 |
|
10004 | var ReactDOMSelect_1 = ReactDOMSelect;
|
10005 |
|
10006 | var didWarnInvalidOptionChildren = false;
|
10007 |
|
10008 | function flattenChildren(children) {
|
10009 | var content = '';
|
10010 |
|
10011 | // Flatten children and warn if they aren't strings or numbers;
|
10012 | // invalid types are ignored.
|
10013 | React_1.Children.forEach(children, function (child) {
|
10014 | if (child == null) {
|
10015 | return;
|
10016 | }
|
10017 | if (typeof child === 'string' || typeof child === 'number') {
|
10018 | content += child;
|
10019 | } else if (!didWarnInvalidOptionChildren) {
|
10020 | didWarnInvalidOptionChildren = true;
|
10021 | void 0;
|
10022 | }
|
10023 | });
|
10024 |
|
10025 | return content;
|
10026 | }
|
10027 |
|
10028 | /**
|
10029 | * Implements an <option> host component that warns when `selected` is set.
|
10030 | */
|
10031 | var ReactDOMOption = {
|
10032 | mountWrapper: function (inst, props, hostParent) {
|
10033 | // TODO (yungsters): Remove support for `selected` in <option>.
|
10034 | var selectValue = null;
|
10035 | if (hostParent != null) {
|
10036 | var selectParent = hostParent;
|
10037 |
|
10038 | if (selectParent._tag === 'optgroup') {
|
10039 | selectParent = selectParent._hostParent;
|
10040 | }
|
10041 |
|
10042 | if (selectParent != null && selectParent._tag === 'select') {
|
10043 | selectValue = ReactDOMSelect_1.getSelectValueContext(selectParent);
|
10044 | }
|
10045 | }
|
10046 |
|
10047 | // If the value is null (e.g., no specified value or after initial mount)
|
10048 | // or missing (e.g., for <datalist>), we don't change props.selected
|
10049 | var selected = null;
|
10050 | if (selectValue != null) {
|
10051 | var value;
|
10052 | if (props.value != null) {
|
10053 | value = props.value + '';
|
10054 | } else {
|
10055 | value = flattenChildren(props.children);
|
10056 | }
|
10057 | selected = false;
|
10058 | if (Array.isArray(selectValue)) {
|
10059 | // multiple
|
10060 | for (var i = 0; i < selectValue.length; i++) {
|
10061 | if ('' + selectValue[i] === value) {
|
10062 | selected = true;
|
10063 | break;
|
10064 | }
|
10065 | }
|
10066 | } else {
|
10067 | selected = '' + selectValue === value;
|
10068 | }
|
10069 | }
|
10070 |
|
10071 | inst._wrapperState = { selected: selected };
|
10072 | },
|
10073 |
|
10074 | postMountWrapper: function (inst) {
|
10075 | // value="" should make a value attribute (#6219)
|
10076 | var props = inst._currentElement.props;
|
10077 | if (props.value != null) {
|
10078 | var node = ReactDOMComponentTree_1.getNodeFromInstance(inst);
|
10079 | node.setAttribute('value', props.value);
|
10080 | }
|
10081 | },
|
10082 |
|
10083 | getHostProps: function (inst, props) {
|
10084 | var hostProps = objectAssign({ selected: undefined, children: undefined }, props);
|
10085 |
|
10086 | // Read state only from initial mount because <select> updates value
|
10087 | // manually; we need the initial state only for server rendering
|
10088 | if (inst._wrapperState.selected != null) {
|
10089 | hostProps.selected = inst._wrapperState.selected;
|
10090 | }
|
10091 |
|
10092 | var content = flattenChildren(props.children);
|
10093 |
|
10094 | if (content) {
|
10095 | hostProps.children = content;
|
10096 | }
|
10097 |
|
10098 | return hostProps;
|
10099 | }
|
10100 | };
|
10101 |
|
10102 | var ReactDOMOption_1 = ReactDOMOption;
|
10103 |
|
10104 | function forceUpdateIfMounted$1() {
|
10105 | if (this._rootNodeID) {
|
10106 | // DOM component is still mounted; update
|
10107 | ReactDOMTextarea.updateWrapper(this);
|
10108 | }
|
10109 | }
|
10110 |
|
10111 | /**
|
10112 | * Implements a <textarea> host component that allows setting `value`, and
|
10113 | * `defaultValue`. This differs from the traditional DOM API because value is
|
10114 | * usually set as PCDATA children.
|
10115 | *
|
10116 | * If `value` is not supplied (or null/undefined), user actions that affect the
|
10117 | * value will trigger updates to the element.
|
10118 | *
|
10119 | * If `value` is supplied (and not null/undefined), the rendered element will
|
10120 | * not trigger updates to the element. Instead, the `value` prop must change in
|
10121 | * order for the rendered element to be updated.
|
10122 | *
|
10123 | * The rendered element will be initialized with an empty value, the prop
|
10124 | * `defaultValue` if specified, or the children content (deprecated).
|
10125 | */
|
10126 | var ReactDOMTextarea = {
|
10127 | getHostProps: function (inst, props) {
|
10128 | !(props.dangerouslySetInnerHTML == null) ? reactProdInvariant_1('91') : void 0;
|
10129 |
|
10130 | // Always set children to the same thing. In IE9, the selection range will
|
10131 | // get reset if `textContent` is mutated. We could add a check in setTextContent
|
10132 | // to only set the value if/when the value differs from the node value (which would
|
10133 | // completely solve this IE9 bug), but Sebastian+Ben seemed to like this solution.
|
10134 | // The value can be a boolean or object so that's why it's forced to be a string.
|
10135 | var hostProps = objectAssign({}, props, {
|
10136 | value: undefined,
|
10137 | defaultValue: undefined,
|
10138 | children: '' + inst._wrapperState.initialValue,
|
10139 | onChange: inst._wrapperState.onChange
|
10140 | });
|
10141 |
|
10142 | return hostProps;
|
10143 | },
|
10144 |
|
10145 | mountWrapper: function (inst, props) {
|
10146 | var value = LinkedValueUtils_1.getValue(props);
|
10147 | var initialValue = value;
|
10148 |
|
10149 | // Only bother fetching default value if we're going to use it
|
10150 | if (value == null) {
|
10151 | var defaultValue = props.defaultValue;
|
10152 | // TODO (yungsters): Remove support for children content in <textarea>.
|
10153 | var children = props.children;
|
10154 | if (children != null) {
|
10155 | !(defaultValue == null) ? reactProdInvariant_1('92') : void 0;
|
10156 | if (Array.isArray(children)) {
|
10157 | !(children.length <= 1) ? reactProdInvariant_1('93') : void 0;
|
10158 | children = children[0];
|
10159 | }
|
10160 |
|
10161 | defaultValue = '' + children;
|
10162 | }
|
10163 | if (defaultValue == null) {
|
10164 | defaultValue = '';
|
10165 | }
|
10166 | initialValue = defaultValue;
|
10167 | }
|
10168 |
|
10169 | inst._wrapperState = {
|
10170 | initialValue: '' + initialValue,
|
10171 | listeners: null,
|
10172 | onChange: _handleChange$2.bind(inst)
|
10173 | };
|
10174 | },
|
10175 |
|
10176 | updateWrapper: function (inst) {
|
10177 | var props = inst._currentElement.props;
|
10178 |
|
10179 | var node = ReactDOMComponentTree_1.getNodeFromInstance(inst);
|
10180 | var value = LinkedValueUtils_1.getValue(props);
|
10181 | if (value != null) {
|
10182 | // Cast `value` to a string to ensure the value is set correctly. While
|
10183 | // browsers typically do this as necessary, jsdom doesn't.
|
10184 | var newValue = '' + value;
|
10185 |
|
10186 | // To avoid side effects (such as losing text selection), only set value if changed
|
10187 | if (newValue !== node.value) {
|
10188 | node.value = newValue;
|
10189 | }
|
10190 | if (props.defaultValue == null) {
|
10191 | node.defaultValue = newValue;
|
10192 | }
|
10193 | }
|
10194 | if (props.defaultValue != null) {
|
10195 | node.defaultValue = props.defaultValue;
|
10196 | }
|
10197 | },
|
10198 |
|
10199 | postMountWrapper: function (inst) {
|
10200 | // This is in postMount because we need access to the DOM node, which is not
|
10201 | // available until after the component has mounted.
|
10202 | var node = ReactDOMComponentTree_1.getNodeFromInstance(inst);
|
10203 | var textContent = node.textContent;
|
10204 |
|
10205 | // Only set node.value if textContent is equal to the expected
|
10206 | // initial value. In IE10/IE11 there is a bug where the placeholder attribute
|
10207 | // will populate textContent as well.
|
10208 | // https://developer.microsoft.com/microsoft-edge/platform/issues/101525/
|
10209 | if (textContent === inst._wrapperState.initialValue) {
|
10210 | node.value = textContent;
|
10211 | }
|
10212 | }
|
10213 | };
|
10214 |
|
10215 | function _handleChange$2(event) {
|
10216 | var props = this._currentElement.props;
|
10217 | var returnValue = LinkedValueUtils_1.executeOnChange(props, event);
|
10218 | ReactUpdates_1.asap(forceUpdateIfMounted$1, this);
|
10219 | return returnValue;
|
10220 | }
|
10221 |
|
10222 | var ReactDOMTextarea_1 = ReactDOMTextarea;
|
10223 |
|
10224 | var injected = false;
|
10225 |
|
10226 | var ReactComponentEnvironment = {
|
10227 | /**
|
10228 | * Optionally injectable hook for swapping out mount images in the middle of
|
10229 | * the tree.
|
10230 | */
|
10231 | replaceNodeWithMarkup: null,
|
10232 |
|
10233 | /**
|
10234 | * Optionally injectable hook for processing a queue of child updates. Will
|
10235 | * later move into MultiChildComponents.
|
10236 | */
|
10237 | processChildrenUpdates: null,
|
10238 |
|
10239 | injection: {
|
10240 | injectEnvironment: function (environment) {
|
10241 | !!injected ? reactProdInvariant_1('104') : void 0;
|
10242 | ReactComponentEnvironment.replaceNodeWithMarkup = environment.replaceNodeWithMarkup;
|
10243 | ReactComponentEnvironment.processChildrenUpdates = environment.processChildrenUpdates;
|
10244 | injected = true;
|
10245 | }
|
10246 | }
|
10247 | };
|
10248 |
|
10249 | var ReactComponentEnvironment_1 = ReactComponentEnvironment;
|
10250 |
|
10251 | /**
|
10252 | * Copyright 2013-present, Facebook, Inc.
|
10253 | * All rights reserved.
|
10254 | *
|
10255 | * This source code is licensed under the BSD-style license found in the
|
10256 | * LICENSE file in the root directory of this source tree. An additional grant
|
10257 | * of patent rights can be found in the PATENTS file in the same directory.
|
10258 | *
|
10259 | */
|
10260 |
|
10261 | /**
|
10262 | * `ReactInstanceMap` maintains a mapping from a public facing stateful
|
10263 | * instance (key) and the internal representation (value). This allows public
|
10264 | * methods to accept the user facing instance as an argument and map them back
|
10265 | * to internal methods.
|
10266 | */
|
10267 |
|
10268 | // TODO: Replace this with ES6: var ReactInstanceMap = new Map();
|
10269 |
|
10270 | var ReactInstanceMap = {
|
10271 | /**
|
10272 | * This API should be called `delete` but we'd have to make sure to always
|
10273 | * transform these to strings for IE support. When this transform is fully
|
10274 | * supported we can rename it.
|
10275 | */
|
10276 | remove: function (key) {
|
10277 | key._reactInternalInstance = undefined;
|
10278 | },
|
10279 |
|
10280 | get: function (key) {
|
10281 | return key._reactInternalInstance;
|
10282 | },
|
10283 |
|
10284 | has: function (key) {
|
10285 | return key._reactInternalInstance !== undefined;
|
10286 | },
|
10287 |
|
10288 | set: function (key, value) {
|
10289 | key._reactInternalInstance = value;
|
10290 | }
|
10291 | };
|
10292 |
|
10293 | var ReactInstanceMap_1 = ReactInstanceMap;
|
10294 |
|
10295 | var global$1 = typeof global !== "undefined" ? global :
|
10296 | typeof self !== "undefined" ? self :
|
10297 | typeof window !== "undefined" ? window : {};
|
10298 |
|
10299 | // shim for using process in browser
|
10300 | // based off https://github.com/defunctzombie/node-process/blob/master/browser.js
|
10301 |
|
10302 | function defaultSetTimout() {
|
10303 | throw new Error('setTimeout has not been defined');
|
10304 | }
|
10305 | function defaultClearTimeout () {
|
10306 | throw new Error('clearTimeout has not been defined');
|
10307 | }
|
10308 | var cachedSetTimeout = defaultSetTimout;
|
10309 | var cachedClearTimeout = defaultClearTimeout;
|
10310 | if (typeof global$1.setTimeout === 'function') {
|
10311 | cachedSetTimeout = setTimeout;
|
10312 | }
|
10313 | if (typeof global$1.clearTimeout === 'function') {
|
10314 | cachedClearTimeout = clearTimeout;
|
10315 | }
|
10316 |
|
10317 | function runTimeout(fun) {
|
10318 | if (cachedSetTimeout === setTimeout) {
|
10319 | //normal enviroments in sane situations
|
10320 | return setTimeout(fun, 0);
|
10321 | }
|
10322 | // if setTimeout wasn't available but was latter defined
|
10323 | if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
|
10324 | cachedSetTimeout = setTimeout;
|
10325 | return setTimeout(fun, 0);
|
10326 | }
|
10327 | try {
|
10328 | // when when somebody has screwed with setTimeout but no I.E. maddness
|
10329 | return cachedSetTimeout(fun, 0);
|
10330 | } catch(e){
|
10331 | try {
|
10332 | // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
10333 | return cachedSetTimeout.call(null, fun, 0);
|
10334 | } catch(e){
|
10335 | // 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
|
10336 | return cachedSetTimeout.call(this, fun, 0);
|
10337 | }
|
10338 | }
|
10339 |
|
10340 |
|
10341 | }
|
10342 | function runClearTimeout(marker) {
|
10343 | if (cachedClearTimeout === clearTimeout) {
|
10344 | //normal enviroments in sane situations
|
10345 | return clearTimeout(marker);
|
10346 | }
|
10347 | // if clearTimeout wasn't available but was latter defined
|
10348 | if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
|
10349 | cachedClearTimeout = clearTimeout;
|
10350 | return clearTimeout(marker);
|
10351 | }
|
10352 | try {
|
10353 | // when when somebody has screwed with setTimeout but no I.E. maddness
|
10354 | return cachedClearTimeout(marker);
|
10355 | } catch (e){
|
10356 | try {
|
10357 | // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
|
10358 | return cachedClearTimeout.call(null, marker);
|
10359 | } catch (e){
|
10360 | // 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.
|
10361 | // Some versions of I.E. have different rules for clearTimeout vs setTimeout
|
10362 | return cachedClearTimeout.call(this, marker);
|
10363 | }
|
10364 | }
|
10365 |
|
10366 |
|
10367 |
|
10368 | }
|
10369 | var queue = [];
|
10370 | var draining = false;
|
10371 | var currentQueue;
|
10372 | var queueIndex = -1;
|
10373 |
|
10374 | function cleanUpNextTick() {
|
10375 | if (!draining || !currentQueue) {
|
10376 | return;
|
10377 | }
|
10378 | draining = false;
|
10379 | if (currentQueue.length) {
|
10380 | queue = currentQueue.concat(queue);
|
10381 | } else {
|
10382 | queueIndex = -1;
|
10383 | }
|
10384 | if (queue.length) {
|
10385 | drainQueue();
|
10386 | }
|
10387 | }
|
10388 |
|
10389 | function drainQueue() {
|
10390 | if (draining) {
|
10391 | return;
|
10392 | }
|
10393 | var timeout = runTimeout(cleanUpNextTick);
|
10394 | draining = true;
|
10395 |
|
10396 | var len = queue.length;
|
10397 | while(len) {
|
10398 | currentQueue = queue;
|
10399 | queue = [];
|
10400 | while (++queueIndex < len) {
|
10401 | if (currentQueue) {
|
10402 | currentQueue[queueIndex].run();
|
10403 | }
|
10404 | }
|
10405 | queueIndex = -1;
|
10406 | len = queue.length;
|
10407 | }
|
10408 | currentQueue = null;
|
10409 | draining = false;
|
10410 | runClearTimeout(timeout);
|
10411 | }
|
10412 | function nextTick(fun) {
|
10413 | var args = new Array(arguments.length - 1);
|
10414 | if (arguments.length > 1) {
|
10415 | for (var i = 1; i < arguments.length; i++) {
|
10416 | args[i - 1] = arguments[i];
|
10417 | }
|
10418 | }
|
10419 | queue.push(new Item(fun, args));
|
10420 | if (queue.length === 1 && !draining) {
|
10421 | runTimeout(drainQueue);
|
10422 | }
|
10423 | }
|
10424 | // v8 likes predictible objects
|
10425 | function Item(fun, array) {
|
10426 | this.fun = fun;
|
10427 | this.array = array;
|
10428 | }
|
10429 | Item.prototype.run = function () {
|
10430 | this.fun.apply(null, this.array);
|
10431 | };
|
10432 | var title = 'browser';
|
10433 | var platform = 'browser';
|
10434 | var browser = true;
|
10435 | var env = {};
|
10436 | var argv = [];
|
10437 | var version = ''; // empty string to avoid regexp issues
|
10438 | var versions = {};
|
10439 | var release = {};
|
10440 | var config = {};
|
10441 |
|
10442 | function noop() {}
|
10443 |
|
10444 | var on = noop;
|
10445 | var addListener = noop;
|
10446 | var once = noop;
|
10447 | var off = noop;
|
10448 | var removeListener = noop;
|
10449 | var removeAllListeners = noop;
|
10450 | var emit = noop;
|
10451 |
|
10452 | function binding(name) {
|
10453 | throw new Error('process.binding is not supported');
|
10454 | }
|
10455 |
|
10456 | function cwd () { return '/' }
|
10457 | function chdir (dir) {
|
10458 | throw new Error('process.chdir is not supported');
|
10459 | }
|
10460 | function umask() { return 0; }
|
10461 |
|
10462 | // from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js
|
10463 | var performance = global$1.performance || {};
|
10464 | var performanceNow =
|
10465 | performance.now ||
|
10466 | performance.mozNow ||
|
10467 | performance.msNow ||
|
10468 | performance.oNow ||
|
10469 | performance.webkitNow ||
|
10470 | function(){ return (new Date()).getTime() };
|
10471 |
|
10472 | // generate timestamp or delta
|
10473 | // see http://nodejs.org/api/process.html#process_process_hrtime
|
10474 | function hrtime(previousTimestamp){
|
10475 | var clocktime = performanceNow.call(performance)*1e-3;
|
10476 | var seconds = Math.floor(clocktime);
|
10477 | var nanoseconds = Math.floor((clocktime%1)*1e9);
|
10478 | if (previousTimestamp) {
|
10479 | seconds = seconds - previousTimestamp[0];
|
10480 | nanoseconds = nanoseconds - previousTimestamp[1];
|
10481 | if (nanoseconds<0) {
|
10482 | seconds--;
|
10483 | nanoseconds += 1e9;
|
10484 | }
|
10485 | }
|
10486 | return [seconds,nanoseconds]
|
10487 | }
|
10488 |
|
10489 | var startTime = new Date();
|
10490 | function uptime() {
|
10491 | var currentTime = new Date();
|
10492 | var dif = currentTime - startTime;
|
10493 | return dif / 1000;
|
10494 | }
|
10495 |
|
10496 | var process = {
|
10497 | nextTick: nextTick,
|
10498 | title: title,
|
10499 | browser: browser,
|
10500 | env: env,
|
10501 | argv: argv,
|
10502 | version: version,
|
10503 | versions: versions,
|
10504 | on: on,
|
10505 | addListener: addListener,
|
10506 | once: once,
|
10507 | off: off,
|
10508 | removeListener: removeListener,
|
10509 | removeAllListeners: removeAllListeners,
|
10510 | emit: emit,
|
10511 | binding: binding,
|
10512 | cwd: cwd,
|
10513 | chdir: chdir,
|
10514 | umask: umask,
|
10515 | hrtime: hrtime,
|
10516 | platform: platform,
|
10517 | release: release,
|
10518 | config: config,
|
10519 | uptime: uptime
|
10520 | };
|
10521 |
|
10522 | var ReactNodeTypes = {
|
10523 | HOST: 0,
|
10524 | COMPOSITE: 1,
|
10525 | EMPTY: 2,
|
10526 |
|
10527 | getType: function (node) {
|
10528 | if (node === null || node === false) {
|
10529 | return ReactNodeTypes.EMPTY;
|
10530 | } else if (React_1.isValidElement(node)) {
|
10531 | if (typeof node.type === 'function') {
|
10532 | return ReactNodeTypes.COMPOSITE;
|
10533 | } else {
|
10534 | return ReactNodeTypes.HOST;
|
10535 | }
|
10536 | }
|
10537 | reactProdInvariant_1('26', node);
|
10538 | }
|
10539 | };
|
10540 |
|
10541 | var ReactNodeTypes_1 = ReactNodeTypes;
|
10542 |
|
10543 | /**
|
10544 | * Copyright (c) 2013-present, Facebook, Inc.
|
10545 | * All rights reserved.
|
10546 | *
|
10547 | * This source code is licensed under the BSD-style license found in the
|
10548 | * LICENSE file in the root directory of this source tree. An additional grant
|
10549 | * of patent rights can be found in the PATENTS file in the same directory.
|
10550 | *
|
10551 | * @typechecks
|
10552 | *
|
10553 | */
|
10554 |
|
10555 | /*eslint-disable no-self-compare */
|
10556 |
|
10557 | var hasOwnProperty$3 = Object.prototype.hasOwnProperty;
|
10558 |
|
10559 | /**
|
10560 | * inlined Object.is polyfill to avoid requiring consumers ship their own
|
10561 | * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
|
10562 | */
|
10563 | function is(x, y) {
|
10564 | // SameValue algorithm
|
10565 | if (x === y) {
|
10566 | // Steps 1-5, 7-10
|
10567 | // Steps 6.b-6.e: +0 != -0
|
10568 | // Added the nonzero y check to make Flow happy, but it is redundant
|
10569 | return x !== 0 || y !== 0 || 1 / x === 1 / y;
|
10570 | } else {
|
10571 | // Step 6.a: NaN == NaN
|
10572 | return x !== x && y !== y;
|
10573 | }
|
10574 | }
|
10575 |
|
10576 | /**
|
10577 | * Performs equality by iterating through keys on an object and returning false
|
10578 | * when any key has values which are not strictly equal between the arguments.
|
10579 | * Returns true when the values of all keys are strictly equal.
|
10580 | */
|
10581 | function shallowEqual(objA, objB) {
|
10582 | if (is(objA, objB)) {
|
10583 | return true;
|
10584 | }
|
10585 |
|
10586 | if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {
|
10587 | return false;
|
10588 | }
|
10589 |
|
10590 | var keysA = Object.keys(objA);
|
10591 | var keysB = Object.keys(objB);
|
10592 |
|
10593 | if (keysA.length !== keysB.length) {
|
10594 | return false;
|
10595 | }
|
10596 |
|
10597 | // Test for A's keys different from B.
|
10598 | for (var i = 0; i < keysA.length; i++) {
|
10599 | if (!hasOwnProperty$3.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {
|
10600 | return false;
|
10601 | }
|
10602 | }
|
10603 |
|
10604 | return true;
|
10605 | }
|
10606 |
|
10607 | var shallowEqual_1 = shallowEqual;
|
10608 |
|
10609 | /**
|
10610 | * Copyright 2013-present, Facebook, Inc.
|
10611 | * All rights reserved.
|
10612 | *
|
10613 | * This source code is licensed under the BSD-style license found in the
|
10614 | * LICENSE file in the root directory of this source tree. An additional grant
|
10615 | * of patent rights can be found in the PATENTS file in the same directory.
|
10616 | *
|
10617 | */
|
10618 |
|
10619 | /**
|
10620 | * Given a `prevElement` and `nextElement`, determines if the existing
|
10621 | * instance should be updated as opposed to being destroyed or replaced by a new
|
10622 | * instance. Both arguments are elements. This ensures that this logic can
|
10623 | * operate on stateless trees without any backing instance.
|
10624 | *
|
10625 | * @param {?object} prevElement
|
10626 | * @param {?object} nextElement
|
10627 | * @return {boolean} True if the existing instance should be updated.
|
10628 | * @protected
|
10629 | */
|
10630 |
|
10631 | function shouldUpdateReactComponent(prevElement, nextElement) {
|
10632 | var prevEmpty = prevElement === null || prevElement === false;
|
10633 | var nextEmpty = nextElement === null || nextElement === false;
|
10634 | if (prevEmpty || nextEmpty) {
|
10635 | return prevEmpty === nextEmpty;
|
10636 | }
|
10637 |
|
10638 | var prevType = typeof prevElement;
|
10639 | var nextType = typeof nextElement;
|
10640 | if (prevType === 'string' || prevType === 'number') {
|
10641 | return nextType === 'string' || nextType === 'number';
|
10642 | } else {
|
10643 | return nextType === 'object' && prevElement.type === nextElement.type && prevElement.key === nextElement.key;
|
10644 | }
|
10645 | }
|
10646 |
|
10647 | var shouldUpdateReactComponent_1 = shouldUpdateReactComponent;
|
10648 |
|
10649 | var CompositeTypes = {
|
10650 | ImpureClass: 0,
|
10651 | PureClass: 1,
|
10652 | StatelessFunctional: 2
|
10653 | };
|
10654 |
|
10655 | function StatelessComponent(Component) {}
|
10656 | StatelessComponent.prototype.render = function () {
|
10657 | var Component = ReactInstanceMap_1.get(this)._currentElement.type;
|
10658 | var element = Component(this.props, this.context, this.updater);
|
10659 | warnIfInvalidElement(Component, element);
|
10660 | return element;
|
10661 | };
|
10662 |
|
10663 | function warnIfInvalidElement(Component, element) {
|
10664 |
|
10665 | }
|
10666 |
|
10667 | function shouldConstruct(Component) {
|
10668 | return !!(Component.prototype && Component.prototype.isReactComponent);
|
10669 | }
|
10670 |
|
10671 | function isPureComponent(Component) {
|
10672 | return !!(Component.prototype && Component.prototype.isPureReactComponent);
|
10673 | }
|
10674 |
|
10675 | /**
|
10676 | * ------------------ The Life-Cycle of a Composite Component ------------------
|
10677 | *
|
10678 | * - constructor: Initialization of state. The instance is now retained.
|
10679 | * - componentWillMount
|
10680 | * - render
|
10681 | * - [children's constructors]
|
10682 | * - [children's componentWillMount and render]
|
10683 | * - [children's componentDidMount]
|
10684 | * - componentDidMount
|
10685 | *
|
10686 | * Update Phases:
|
10687 | * - componentWillReceiveProps (only called if parent updated)
|
10688 | * - shouldComponentUpdate
|
10689 | * - componentWillUpdate
|
10690 | * - render
|
10691 | * - [children's constructors or receive props phases]
|
10692 | * - componentDidUpdate
|
10693 | *
|
10694 | * - componentWillUnmount
|
10695 | * - [children's componentWillUnmount]
|
10696 | * - [children destroyed]
|
10697 | * - (destroyed): The instance is now blank, released by React and ready for GC.
|
10698 | *
|
10699 | * -----------------------------------------------------------------------------
|
10700 | */
|
10701 |
|
10702 | /**
|
10703 | * An incrementing ID assigned to each component when it is mounted. This is
|
10704 | * used to enforce the order in which `ReactUpdates` updates dirty components.
|
10705 | *
|
10706 | * @private
|
10707 | */
|
10708 | var nextMountID = 1;
|
10709 |
|
10710 | /**
|
10711 | * @lends {ReactCompositeComponent.prototype}
|
10712 | */
|
10713 | var ReactCompositeComponent = {
|
10714 | /**
|
10715 | * Base constructor for all composite component.
|
10716 | *
|
10717 | * @param {ReactElement} element
|
10718 | * @final
|
10719 | * @internal
|
10720 | */
|
10721 | construct: function (element) {
|
10722 | this._currentElement = element;
|
10723 | this._rootNodeID = 0;
|
10724 | this._compositeType = null;
|
10725 | this._instance = null;
|
10726 | this._hostParent = null;
|
10727 | this._hostContainerInfo = null;
|
10728 |
|
10729 | // See ReactUpdateQueue
|
10730 | this._updateBatchNumber = null;
|
10731 | this._pendingElement = null;
|
10732 | this._pendingStateQueue = null;
|
10733 | this._pendingReplaceState = false;
|
10734 | this._pendingForceUpdate = false;
|
10735 |
|
10736 | this._renderedNodeType = null;
|
10737 | this._renderedComponent = null;
|
10738 | this._context = null;
|
10739 | this._mountOrder = 0;
|
10740 | this._topLevelWrapper = null;
|
10741 |
|
10742 | // See ReactUpdates and ReactUpdateQueue.
|
10743 | this._pendingCallbacks = null;
|
10744 |
|
10745 | // ComponentWillUnmount shall only be called once
|
10746 | this._calledComponentWillUnmount = false;
|
10747 |
|
10748 |
|
10749 | },
|
10750 |
|
10751 | /**
|
10752 | * Initializes the component, renders markup, and registers event listeners.
|
10753 | *
|
10754 | * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction
|
10755 | * @param {?object} hostParent
|
10756 | * @param {?object} hostContainerInfo
|
10757 | * @param {?object} context
|
10758 | * @return {?string} Rendered markup to be inserted into the DOM.
|
10759 | * @final
|
10760 | * @internal
|
10761 | */
|
10762 | mountComponent: function (transaction, hostParent, hostContainerInfo, context) {
|
10763 | var _this = this;
|
10764 |
|
10765 | this._context = context;
|
10766 | this._mountOrder = nextMountID++;
|
10767 | this._hostParent = hostParent;
|
10768 | this._hostContainerInfo = hostContainerInfo;
|
10769 |
|
10770 | var publicProps = this._currentElement.props;
|
10771 | var publicContext = this._processContext(context);
|
10772 |
|
10773 | var Component = this._currentElement.type;
|
10774 |
|
10775 | var updateQueue = transaction.getUpdateQueue();
|
10776 |
|
10777 | // Initialize the public class
|
10778 | var doConstruct = shouldConstruct(Component);
|
10779 | var inst = this._constructComponent(doConstruct, publicProps, publicContext, updateQueue);
|
10780 | var renderedElement;
|
10781 |
|
10782 | // Support functional components
|
10783 | if (!doConstruct && (inst == null || inst.render == null)) {
|
10784 | renderedElement = inst;
|
10785 | warnIfInvalidElement(Component, renderedElement);
|
10786 | !(inst === null || inst === false || React_1.isValidElement(inst)) ? reactProdInvariant_1('105', Component.displayName || Component.name || 'Component') : void 0;
|
10787 | inst = new StatelessComponent(Component);
|
10788 | this._compositeType = CompositeTypes.StatelessFunctional;
|
10789 | } else {
|
10790 | if (isPureComponent(Component)) {
|
10791 | this._compositeType = CompositeTypes.PureClass;
|
10792 | } else {
|
10793 | this._compositeType = CompositeTypes.ImpureClass;
|
10794 | }
|
10795 | }
|
10796 |
|
10797 | inst.props = publicProps;
|
10798 | inst.context = publicContext;
|
10799 | inst.refs = emptyObject_1;
|
10800 | inst.updater = updateQueue;
|
10801 |
|
10802 | this._instance = inst;
|
10803 |
|
10804 | // Store a reference from the instance back to the internal representation
|
10805 | ReactInstanceMap_1.set(inst, this);
|
10806 |
|
10807 | var initialState = inst.state;
|
10808 | if (initialState === undefined) {
|
10809 | inst.state = initialState = null;
|
10810 | }
|
10811 | !(typeof initialState === 'object' && !Array.isArray(initialState)) ? reactProdInvariant_1('106', this.getName() || 'ReactCompositeComponent') : void 0;
|
10812 |
|
10813 | this._pendingStateQueue = null;
|
10814 | this._pendingReplaceState = false;
|
10815 | this._pendingForceUpdate = false;
|
10816 |
|
10817 | var markup;
|
10818 | if (inst.unstable_handleError) {
|
10819 | markup = this.performInitialMountWithErrorHandling(renderedElement, hostParent, hostContainerInfo, transaction, context);
|
10820 | } else {
|
10821 | markup = this.performInitialMount(renderedElement, hostParent, hostContainerInfo, transaction, context);
|
10822 | }
|
10823 |
|
10824 | if (inst.componentDidMount) {
|
10825 | {
|
10826 | transaction.getReactMountReady().enqueue(inst.componentDidMount, inst);
|
10827 | }
|
10828 | }
|
10829 |
|
10830 | return markup;
|
10831 | },
|
10832 |
|
10833 | _constructComponent: function (doConstruct, publicProps, publicContext, updateQueue) {
|
10834 | {
|
10835 | return this._constructComponentWithoutOwner(doConstruct, publicProps, publicContext, updateQueue);
|
10836 | }
|
10837 | },
|
10838 |
|
10839 | _constructComponentWithoutOwner: function (doConstruct, publicProps, publicContext, updateQueue) {
|
10840 | var Component = this._currentElement.type;
|
10841 |
|
10842 | if (doConstruct) {
|
10843 | {
|
10844 | return new Component(publicProps, publicContext, updateQueue);
|
10845 | }
|
10846 | }
|
10847 |
|
10848 | // This can still be an instance in case of factory components
|
10849 | // but we'll count this as time spent rendering as the more common case.
|
10850 | {
|
10851 | return Component(publicProps, publicContext, updateQueue);
|
10852 | }
|
10853 | },
|
10854 |
|
10855 | performInitialMountWithErrorHandling: function (renderedElement, hostParent, hostContainerInfo, transaction, context) {
|
10856 | var markup;
|
10857 | var checkpoint = transaction.checkpoint();
|
10858 | try {
|
10859 | markup = this.performInitialMount(renderedElement, hostParent, hostContainerInfo, transaction, context);
|
10860 | } catch (e) {
|
10861 | // Roll back to checkpoint, handle error (which may add items to the transaction), and take a new checkpoint
|
10862 | transaction.rollback(checkpoint);
|
10863 | this._instance.unstable_handleError(e);
|
10864 | if (this._pendingStateQueue) {
|
10865 | this._instance.state = this._processPendingState(this._instance.props, this._instance.context);
|
10866 | }
|
10867 | checkpoint = transaction.checkpoint();
|
10868 |
|
10869 | this._renderedComponent.unmountComponent(true);
|
10870 | transaction.rollback(checkpoint);
|
10871 |
|
10872 | // Try again - we've informed the component about the error, so they can render an error message this time.
|
10873 | // If this throws again, the error will bubble up (and can be caught by a higher error boundary).
|
10874 | markup = this.performInitialMount(renderedElement, hostParent, hostContainerInfo, transaction, context);
|
10875 | }
|
10876 | return markup;
|
10877 | },
|
10878 |
|
10879 | performInitialMount: function (renderedElement, hostParent, hostContainerInfo, transaction, context) {
|
10880 | var inst = this._instance;
|
10881 |
|
10882 | var debugID = 0;
|
10883 | if (inst.componentWillMount) {
|
10884 | {
|
10885 | inst.componentWillMount();
|
10886 | }
|
10887 | // When mounting, calls to `setState` by `componentWillMount` will set
|
10888 | // `this._pendingStateQueue` without triggering a re-render.
|
10889 | if (this._pendingStateQueue) {
|
10890 | inst.state = this._processPendingState(inst.props, inst.context);
|
10891 | }
|
10892 | }
|
10893 |
|
10894 | // If not a stateless component, we now render
|
10895 | if (renderedElement === undefined) {
|
10896 | renderedElement = this._renderValidatedComponent();
|
10897 | }
|
10898 |
|
10899 | var nodeType = ReactNodeTypes_1.getType(renderedElement);
|
10900 | this._renderedNodeType = nodeType;
|
10901 | var child = this._instantiateReactComponent(renderedElement, nodeType !== ReactNodeTypes_1.EMPTY /* shouldHaveDebugID */
|
10902 | );
|
10903 | this._renderedComponent = child;
|
10904 |
|
10905 | var markup = ReactReconciler_1.mountComponent(child, transaction, hostParent, hostContainerInfo, this._processChildContext(context), debugID);
|
10906 |
|
10907 | return markup;
|
10908 | },
|
10909 |
|
10910 | getHostNode: function () {
|
10911 | return ReactReconciler_1.getHostNode(this._renderedComponent);
|
10912 | },
|
10913 |
|
10914 | /**
|
10915 | * Releases any resources allocated by `mountComponent`.
|
10916 | *
|
10917 | * @final
|
10918 | * @internal
|
10919 | */
|
10920 | unmountComponent: function (safely) {
|
10921 | if (!this._renderedComponent) {
|
10922 | return;
|
10923 | }
|
10924 |
|
10925 | var inst = this._instance;
|
10926 |
|
10927 | if (inst.componentWillUnmount && !inst._calledComponentWillUnmount) {
|
10928 | inst._calledComponentWillUnmount = true;
|
10929 |
|
10930 | if (safely) {
|
10931 | var name = this.getName() + '.componentWillUnmount()';
|
10932 | ReactErrorUtils_1.invokeGuardedCallback(name, inst.componentWillUnmount.bind(inst));
|
10933 | } else {
|
10934 | {
|
10935 | inst.componentWillUnmount();
|
10936 | }
|
10937 | }
|
10938 | }
|
10939 |
|
10940 | if (this._renderedComponent) {
|
10941 | ReactReconciler_1.unmountComponent(this._renderedComponent, safely);
|
10942 | this._renderedNodeType = null;
|
10943 | this._renderedComponent = null;
|
10944 | this._instance = null;
|
10945 | }
|
10946 |
|
10947 | // Reset pending fields
|
10948 | // Even if this component is scheduled for another update in ReactUpdates,
|
10949 | // it would still be ignored because these fields are reset.
|
10950 | this._pendingStateQueue = null;
|
10951 | this._pendingReplaceState = false;
|
10952 | this._pendingForceUpdate = false;
|
10953 | this._pendingCallbacks = null;
|
10954 | this._pendingElement = null;
|
10955 |
|
10956 | // These fields do not really need to be reset since this object is no
|
10957 | // longer accessible.
|
10958 | this._context = null;
|
10959 | this._rootNodeID = 0;
|
10960 | this._topLevelWrapper = null;
|
10961 |
|
10962 | // Delete the reference from the instance to this internal representation
|
10963 | // which allow the internals to be properly cleaned up even if the user
|
10964 | // leaks a reference to the public instance.
|
10965 | ReactInstanceMap_1.remove(inst);
|
10966 |
|
10967 | // Some existing components rely on inst.props even after they've been
|
10968 | // destroyed (in event handlers).
|
10969 | // TODO: inst.props = null;
|
10970 | // TODO: inst.state = null;
|
10971 | // TODO: inst.context = null;
|
10972 | },
|
10973 |
|
10974 | /**
|
10975 | * Filters the context object to only contain keys specified in
|
10976 | * `contextTypes`
|
10977 | *
|
10978 | * @param {object} context
|
10979 | * @return {?object}
|
10980 | * @private
|
10981 | */
|
10982 | _maskContext: function (context) {
|
10983 | var Component = this._currentElement.type;
|
10984 | var contextTypes = Component.contextTypes;
|
10985 | if (!contextTypes) {
|
10986 | return emptyObject_1;
|
10987 | }
|
10988 | var maskedContext = {};
|
10989 | for (var contextName in contextTypes) {
|
10990 | maskedContext[contextName] = context[contextName];
|
10991 | }
|
10992 | return maskedContext;
|
10993 | },
|
10994 |
|
10995 | /**
|
10996 | * Filters the context object to only contain keys specified in
|
10997 | * `contextTypes`, and asserts that they are valid.
|
10998 | *
|
10999 | * @param {object} context
|
11000 | * @return {?object}
|
11001 | * @private
|
11002 | */
|
11003 | _processContext: function (context) {
|
11004 | var maskedContext = this._maskContext(context);
|
11005 | return maskedContext;
|
11006 | },
|
11007 |
|
11008 | /**
|
11009 | * @param {object} currentContext
|
11010 | * @return {object}
|
11011 | * @private
|
11012 | */
|
11013 | _processChildContext: function (currentContext) {
|
11014 | var Component = this._currentElement.type;
|
11015 | var inst = this._instance;
|
11016 | var childContext;
|
11017 |
|
11018 | if (inst.getChildContext) {
|
11019 | {
|
11020 | childContext = inst.getChildContext();
|
11021 | }
|
11022 | }
|
11023 |
|
11024 | if (childContext) {
|
11025 | !(typeof Component.childContextTypes === 'object') ? reactProdInvariant_1('107', this.getName() || 'ReactCompositeComponent') : void 0;
|
11026 | for (var name in childContext) {
|
11027 | !(name in Component.childContextTypes) ? reactProdInvariant_1('108', this.getName() || 'ReactCompositeComponent', name) : void 0;
|
11028 | }
|
11029 | return objectAssign({}, currentContext, childContext);
|
11030 | }
|
11031 | return currentContext;
|
11032 | },
|
11033 |
|
11034 | /**
|
11035 | * Assert that the context types are valid
|
11036 | *
|
11037 | * @param {object} typeSpecs Map of context field to a ReactPropType
|
11038 | * @param {object} values Runtime values that need to be type-checked
|
11039 | * @param {string} location e.g. "prop", "context", "child context"
|
11040 | * @private
|
11041 | */
|
11042 | _checkContextTypes: function (typeSpecs, values, location) {
|
11043 |
|
11044 | },
|
11045 |
|
11046 | receiveComponent: function (nextElement, transaction, nextContext) {
|
11047 | var prevElement = this._currentElement;
|
11048 | var prevContext = this._context;
|
11049 |
|
11050 | this._pendingElement = null;
|
11051 |
|
11052 | this.updateComponent(transaction, prevElement, nextElement, prevContext, nextContext);
|
11053 | },
|
11054 |
|
11055 | /**
|
11056 | * If any of `_pendingElement`, `_pendingStateQueue`, or `_pendingForceUpdate`
|
11057 | * is set, update the component.
|
11058 | *
|
11059 | * @param {ReactReconcileTransaction} transaction
|
11060 | * @internal
|
11061 | */
|
11062 | performUpdateIfNecessary: function (transaction) {
|
11063 | if (this._pendingElement != null) {
|
11064 | ReactReconciler_1.receiveComponent(this, this._pendingElement, transaction, this._context);
|
11065 | } else if (this._pendingStateQueue !== null || this._pendingForceUpdate) {
|
11066 | this.updateComponent(transaction, this._currentElement, this._currentElement, this._context, this._context);
|
11067 | } else {
|
11068 | this._updateBatchNumber = null;
|
11069 | }
|
11070 | },
|
11071 |
|
11072 | /**
|
11073 | * Perform an update to a mounted component. The componentWillReceiveProps and
|
11074 | * shouldComponentUpdate methods are called, then (assuming the update isn't
|
11075 | * skipped) the remaining update lifecycle methods are called and the DOM
|
11076 | * representation is updated.
|
11077 | *
|
11078 | * By default, this implements React's rendering and reconciliation algorithm.
|
11079 | * Sophisticated clients may wish to override this.
|
11080 | *
|
11081 | * @param {ReactReconcileTransaction} transaction
|
11082 | * @param {ReactElement} prevParentElement
|
11083 | * @param {ReactElement} nextParentElement
|
11084 | * @internal
|
11085 | * @overridable
|
11086 | */
|
11087 | updateComponent: function (transaction, prevParentElement, nextParentElement, prevUnmaskedContext, nextUnmaskedContext) {
|
11088 | var inst = this._instance;
|
11089 | !(inst != null) ? reactProdInvariant_1('136', this.getName() || 'ReactCompositeComponent') : void 0;
|
11090 |
|
11091 | var willReceive = false;
|
11092 | var nextContext;
|
11093 |
|
11094 | // Determine if the context has changed or not
|
11095 | if (this._context === nextUnmaskedContext) {
|
11096 | nextContext = inst.context;
|
11097 | } else {
|
11098 | nextContext = this._processContext(nextUnmaskedContext);
|
11099 | willReceive = true;
|
11100 | }
|
11101 |
|
11102 | var prevProps = prevParentElement.props;
|
11103 | var nextProps = nextParentElement.props;
|
11104 |
|
11105 | // Not a simple state update but a props update
|
11106 | if (prevParentElement !== nextParentElement) {
|
11107 | willReceive = true;
|
11108 | }
|
11109 |
|
11110 | // An update here will schedule an update but immediately set
|
11111 | // _pendingStateQueue which will ensure that any state updates gets
|
11112 | // immediately reconciled instead of waiting for the next batch.
|
11113 | if (willReceive && inst.componentWillReceiveProps) {
|
11114 | {
|
11115 | inst.componentWillReceiveProps(nextProps, nextContext);
|
11116 | }
|
11117 | }
|
11118 |
|
11119 | var nextState = this._processPendingState(nextProps, nextContext);
|
11120 | var shouldUpdate = true;
|
11121 |
|
11122 | if (!this._pendingForceUpdate) {
|
11123 | if (inst.shouldComponentUpdate) {
|
11124 | {
|
11125 | shouldUpdate = inst.shouldComponentUpdate(nextProps, nextState, nextContext);
|
11126 | }
|
11127 | } else {
|
11128 | if (this._compositeType === CompositeTypes.PureClass) {
|
11129 | shouldUpdate = !shallowEqual_1(prevProps, nextProps) || !shallowEqual_1(inst.state, nextState);
|
11130 | }
|
11131 | }
|
11132 | }
|
11133 |
|
11134 | this._updateBatchNumber = null;
|
11135 | if (shouldUpdate) {
|
11136 | this._pendingForceUpdate = false;
|
11137 | // Will set `this.props`, `this.state` and `this.context`.
|
11138 | this._performComponentUpdate(nextParentElement, nextProps, nextState, nextContext, transaction, nextUnmaskedContext);
|
11139 | } else {
|
11140 | // If it's determined that a component should not update, we still want
|
11141 | // to set props and state but we shortcut the rest of the update.
|
11142 | this._currentElement = nextParentElement;
|
11143 | this._context = nextUnmaskedContext;
|
11144 | inst.props = nextProps;
|
11145 | inst.state = nextState;
|
11146 | inst.context = nextContext;
|
11147 | }
|
11148 | },
|
11149 |
|
11150 | _processPendingState: function (props, context) {
|
11151 | var inst = this._instance;
|
11152 | var queue = this._pendingStateQueue;
|
11153 | var replace = this._pendingReplaceState;
|
11154 | this._pendingReplaceState = false;
|
11155 | this._pendingStateQueue = null;
|
11156 |
|
11157 | if (!queue) {
|
11158 | return inst.state;
|
11159 | }
|
11160 |
|
11161 | if (replace && queue.length === 1) {
|
11162 | return queue[0];
|
11163 | }
|
11164 |
|
11165 | var nextState = objectAssign({}, replace ? queue[0] : inst.state);
|
11166 | for (var i = replace ? 1 : 0; i < queue.length; i++) {
|
11167 | var partial = queue[i];
|
11168 | objectAssign(nextState, typeof partial === 'function' ? partial.call(inst, nextState, props, context) : partial);
|
11169 | }
|
11170 |
|
11171 | return nextState;
|
11172 | },
|
11173 |
|
11174 | /**
|
11175 | * Merges new props and state, notifies delegate methods of update and
|
11176 | * performs update.
|
11177 | *
|
11178 | * @param {ReactElement} nextElement Next element
|
11179 | * @param {object} nextProps Next public object to set as properties.
|
11180 | * @param {?object} nextState Next object to set as state.
|
11181 | * @param {?object} nextContext Next public object to set as context.
|
11182 | * @param {ReactReconcileTransaction} transaction
|
11183 | * @param {?object} unmaskedContext
|
11184 | * @private
|
11185 | */
|
11186 | _performComponentUpdate: function (nextElement, nextProps, nextState, nextContext, transaction, unmaskedContext) {
|
11187 | var _this2 = this;
|
11188 |
|
11189 | var inst = this._instance;
|
11190 |
|
11191 | var hasComponentDidUpdate = Boolean(inst.componentDidUpdate);
|
11192 | var prevProps;
|
11193 | var prevState;
|
11194 | var prevContext;
|
11195 | if (hasComponentDidUpdate) {
|
11196 | prevProps = inst.props;
|
11197 | prevState = inst.state;
|
11198 | prevContext = inst.context;
|
11199 | }
|
11200 |
|
11201 | if (inst.componentWillUpdate) {
|
11202 | {
|
11203 | inst.componentWillUpdate(nextProps, nextState, nextContext);
|
11204 | }
|
11205 | }
|
11206 |
|
11207 | this._currentElement = nextElement;
|
11208 | this._context = unmaskedContext;
|
11209 | inst.props = nextProps;
|
11210 | inst.state = nextState;
|
11211 | inst.context = nextContext;
|
11212 |
|
11213 | this._updateRenderedComponent(transaction, unmaskedContext);
|
11214 |
|
11215 | if (hasComponentDidUpdate) {
|
11216 | {
|
11217 | transaction.getReactMountReady().enqueue(inst.componentDidUpdate.bind(inst, prevProps, prevState, prevContext), inst);
|
11218 | }
|
11219 | }
|
11220 | },
|
11221 |
|
11222 | /**
|
11223 | * Call the component's `render` method and update the DOM accordingly.
|
11224 | *
|
11225 | * @param {ReactReconcileTransaction} transaction
|
11226 | * @internal
|
11227 | */
|
11228 | _updateRenderedComponent: function (transaction, context) {
|
11229 | var prevComponentInstance = this._renderedComponent;
|
11230 | var prevRenderedElement = prevComponentInstance._currentElement;
|
11231 | var nextRenderedElement = this._renderValidatedComponent();
|
11232 |
|
11233 | var debugID = 0;
|
11234 | if (shouldUpdateReactComponent_1(prevRenderedElement, nextRenderedElement)) {
|
11235 | ReactReconciler_1.receiveComponent(prevComponentInstance, nextRenderedElement, transaction, this._processChildContext(context));
|
11236 | } else {
|
11237 | var oldHostNode = ReactReconciler_1.getHostNode(prevComponentInstance);
|
11238 | ReactReconciler_1.unmountComponent(prevComponentInstance, false);
|
11239 |
|
11240 | var nodeType = ReactNodeTypes_1.getType(nextRenderedElement);
|
11241 | this._renderedNodeType = nodeType;
|
11242 | var child = this._instantiateReactComponent(nextRenderedElement, nodeType !== ReactNodeTypes_1.EMPTY /* shouldHaveDebugID */
|
11243 | );
|
11244 | this._renderedComponent = child;
|
11245 |
|
11246 | var nextMarkup = ReactReconciler_1.mountComponent(child, transaction, this._hostParent, this._hostContainerInfo, this._processChildContext(context), debugID);
|
11247 |
|
11248 | this._replaceNodeWithMarkup(oldHostNode, nextMarkup, prevComponentInstance);
|
11249 | }
|
11250 | },
|
11251 |
|
11252 | /**
|
11253 | * Overridden in shallow rendering.
|
11254 | *
|
11255 | * @protected
|
11256 | */
|
11257 | _replaceNodeWithMarkup: function (oldHostNode, nextMarkup, prevInstance) {
|
11258 | ReactComponentEnvironment_1.replaceNodeWithMarkup(oldHostNode, nextMarkup, prevInstance);
|
11259 | },
|
11260 |
|
11261 | /**
|
11262 | * @protected
|
11263 | */
|
11264 | _renderValidatedComponentWithoutOwnerOrContext: function () {
|
11265 | var inst = this._instance;
|
11266 | var renderedElement;
|
11267 |
|
11268 | {
|
11269 | renderedElement = inst.render();
|
11270 | }
|
11271 |
|
11272 | return renderedElement;
|
11273 | },
|
11274 |
|
11275 | /**
|
11276 | * @private
|
11277 | */
|
11278 | _renderValidatedComponent: function () {
|
11279 | var renderedElement;
|
11280 | if ("production" !== 'production' || this._compositeType !== CompositeTypes.StatelessFunctional) {
|
11281 | ReactCurrentOwner_1.current = this;
|
11282 | try {
|
11283 | renderedElement = this._renderValidatedComponentWithoutOwnerOrContext();
|
11284 | } finally {
|
11285 | ReactCurrentOwner_1.current = null;
|
11286 | }
|
11287 | } else {
|
11288 | renderedElement = this._renderValidatedComponentWithoutOwnerOrContext();
|
11289 | }
|
11290 | !(
|
11291 | // TODO: An `isValidNode` function would probably be more appropriate
|
11292 | renderedElement === null || renderedElement === false || React_1.isValidElement(renderedElement)) ? reactProdInvariant_1('109', this.getName() || 'ReactCompositeComponent') : void 0;
|
11293 |
|
11294 | return renderedElement;
|
11295 | },
|
11296 |
|
11297 | /**
|
11298 | * Lazily allocates the refs object and stores `component` as `ref`.
|
11299 | *
|
11300 | * @param {string} ref Reference name.
|
11301 | * @param {component} component Component to store as `ref`.
|
11302 | * @final
|
11303 | * @private
|
11304 | */
|
11305 | attachRef: function (ref, component) {
|
11306 | var inst = this.getPublicInstance();
|
11307 | !(inst != null) ? reactProdInvariant_1('110') : void 0;
|
11308 | var publicComponentInstance = component.getPublicInstance();
|
11309 | var refs = inst.refs === emptyObject_1 ? inst.refs = {} : inst.refs;
|
11310 | refs[ref] = publicComponentInstance;
|
11311 | },
|
11312 |
|
11313 | /**
|
11314 | * Detaches a reference name.
|
11315 | *
|
11316 | * @param {string} ref Name to dereference.
|
11317 | * @final
|
11318 | * @private
|
11319 | */
|
11320 | detachRef: function (ref) {
|
11321 | var refs = this.getPublicInstance().refs;
|
11322 | delete refs[ref];
|
11323 | },
|
11324 |
|
11325 | /**
|
11326 | * Get a text description of the component that can be used to identify it
|
11327 | * in error messages.
|
11328 | * @return {string} The name or null.
|
11329 | * @internal
|
11330 | */
|
11331 | getName: function () {
|
11332 | var type = this._currentElement.type;
|
11333 | var constructor = this._instance && this._instance.constructor;
|
11334 | return type.displayName || constructor && constructor.displayName || type.name || constructor && constructor.name || null;
|
11335 | },
|
11336 |
|
11337 | /**
|
11338 | * Get the publicly accessible representation of this component - i.e. what
|
11339 | * is exposed by refs and returned by render. Can be null for stateless
|
11340 | * components.
|
11341 | *
|
11342 | * @return {ReactComponent} the public component instance.
|
11343 | * @internal
|
11344 | */
|
11345 | getPublicInstance: function () {
|
11346 | var inst = this._instance;
|
11347 | if (this._compositeType === CompositeTypes.StatelessFunctional) {
|
11348 | return null;
|
11349 | }
|
11350 | return inst;
|
11351 | },
|
11352 |
|
11353 | // Stub
|
11354 | _instantiateReactComponent: null
|
11355 | };
|
11356 |
|
11357 | var ReactCompositeComponent_1 = ReactCompositeComponent;
|
11358 |
|
11359 | /**
|
11360 | * Copyright 2014-present, Facebook, Inc.
|
11361 | * All rights reserved.
|
11362 | *
|
11363 | * This source code is licensed under the BSD-style license found in the
|
11364 | * LICENSE file in the root directory of this source tree. An additional grant
|
11365 | * of patent rights can be found in the PATENTS file in the same directory.
|
11366 | *
|
11367 | */
|
11368 |
|
11369 | var emptyComponentFactory;
|
11370 |
|
11371 | var ReactEmptyComponentInjection = {
|
11372 | injectEmptyComponentFactory: function (factory) {
|
11373 | emptyComponentFactory = factory;
|
11374 | }
|
11375 | };
|
11376 |
|
11377 | var ReactEmptyComponent = {
|
11378 | create: function (instantiate) {
|
11379 | return emptyComponentFactory(instantiate);
|
11380 | }
|
11381 | };
|
11382 |
|
11383 | ReactEmptyComponent.injection = ReactEmptyComponentInjection;
|
11384 |
|
11385 | var ReactEmptyComponent_1 = ReactEmptyComponent;
|
11386 |
|
11387 | var genericComponentClass = null;
|
11388 | var textComponentClass = null;
|
11389 |
|
11390 | var ReactHostComponentInjection = {
|
11391 | // This accepts a class that receives the tag string. This is a catch all
|
11392 | // that can render any kind of tag.
|
11393 | injectGenericComponentClass: function (componentClass) {
|
11394 | genericComponentClass = componentClass;
|
11395 | },
|
11396 | // This accepts a text component class that takes the text string to be
|
11397 | // rendered as props.
|
11398 | injectTextComponentClass: function (componentClass) {
|
11399 | textComponentClass = componentClass;
|
11400 | }
|
11401 | };
|
11402 |
|
11403 | /**
|
11404 | * Get a host internal component class for a specific tag.
|
11405 | *
|
11406 | * @param {ReactElement} element The element to create.
|
11407 | * @return {function} The internal class constructor function.
|
11408 | */
|
11409 | function createInternalComponent(element) {
|
11410 | !genericComponentClass ? reactProdInvariant_1('111', element.type) : void 0;
|
11411 | return new genericComponentClass(element);
|
11412 | }
|
11413 |
|
11414 | /**
|
11415 | * @param {ReactText} text
|
11416 | * @return {ReactComponent}
|
11417 | */
|
11418 | function createInstanceForText(text) {
|
11419 | return new textComponentClass(text);
|
11420 | }
|
11421 |
|
11422 | /**
|
11423 | * @param {ReactComponent} component
|
11424 | * @return {boolean}
|
11425 | */
|
11426 | function isTextComponent(component) {
|
11427 | return component instanceof textComponentClass;
|
11428 | }
|
11429 |
|
11430 | var ReactHostComponent = {
|
11431 | createInternalComponent: createInternalComponent,
|
11432 | createInstanceForText: createInstanceForText,
|
11433 | isTextComponent: isTextComponent,
|
11434 | injection: ReactHostComponentInjection
|
11435 | };
|
11436 |
|
11437 | var ReactHostComponent_1 = ReactHostComponent;
|
11438 |
|
11439 | /**
|
11440 | * Copyright 2013-present, Facebook, Inc.
|
11441 | * All rights reserved.
|
11442 | *
|
11443 | * This source code is licensed under the BSD-style license found in the
|
11444 | * LICENSE file in the root directory of this source tree. An additional grant
|
11445 | * of patent rights can be found in the PATENTS file in the same directory.
|
11446 | *
|
11447 | *
|
11448 | */
|
11449 |
|
11450 | // To avoid a cyclic dependency, we create the final class in this module
|
11451 | var ReactCompositeComponentWrapper = function (element) {
|
11452 | this.construct(element);
|
11453 | };
|
11454 |
|
11455 | function getDeclarationErrorAddendum$3(owner) {
|
11456 | if (owner) {
|
11457 | var name = owner.getName();
|
11458 | if (name) {
|
11459 | return ' Check the render method of `' + name + '`.';
|
11460 | }
|
11461 | }
|
11462 | return '';
|
11463 | }
|
11464 |
|
11465 | /**
|
11466 | * Check if the type reference is a known internal type. I.e. not a user
|
11467 | * provided composite type.
|
11468 | *
|
11469 | * @param {function} type
|
11470 | * @return {boolean} Returns true if this is a valid internal type.
|
11471 | */
|
11472 | function isInternalComponentType(type) {
|
11473 | return typeof type === 'function' && typeof type.prototype !== 'undefined' && typeof type.prototype.mountComponent === 'function' && typeof type.prototype.receiveComponent === 'function';
|
11474 | }
|
11475 |
|
11476 | /**
|
11477 | * Given a ReactNode, create an instance that will actually be mounted.
|
11478 | *
|
11479 | * @param {ReactNode} node
|
11480 | * @param {boolean} shouldHaveDebugID
|
11481 | * @return {object} A new instance of the element's constructor.
|
11482 | * @protected
|
11483 | */
|
11484 | function instantiateReactComponent(node, shouldHaveDebugID) {
|
11485 | var instance;
|
11486 |
|
11487 | if (node === null || node === false) {
|
11488 | instance = ReactEmptyComponent_1.create(instantiateReactComponent);
|
11489 | } else if (typeof node === 'object') {
|
11490 | var element = node;
|
11491 | var type = element.type;
|
11492 | if (typeof type !== 'function' && typeof type !== 'string') {
|
11493 | var info = '';
|
11494 | info += getDeclarationErrorAddendum$3(element._owner);
|
11495 | reactProdInvariant_1('130', type == null ? type : typeof type, info);
|
11496 | }
|
11497 |
|
11498 | // Special case string values
|
11499 | if (typeof element.type === 'string') {
|
11500 | instance = ReactHostComponent_1.createInternalComponent(element);
|
11501 | } else if (isInternalComponentType(element.type)) {
|
11502 | // This is temporarily available for custom components that are not string
|
11503 | // representations. I.e. ART. Once those are updated to use the string
|
11504 | // representation, we can drop this code path.
|
11505 | instance = new element.type(element);
|
11506 |
|
11507 | // We renamed this. Allow the old name for compat. :(
|
11508 | if (!instance.getHostNode) {
|
11509 | instance.getHostNode = instance.getNativeNode;
|
11510 | }
|
11511 | } else {
|
11512 | instance = new ReactCompositeComponentWrapper(element);
|
11513 | }
|
11514 | } else if (typeof node === 'string' || typeof node === 'number') {
|
11515 | instance = ReactHostComponent_1.createInstanceForText(node);
|
11516 | } else {
|
11517 | reactProdInvariant_1('131', typeof node);
|
11518 | }
|
11519 |
|
11520 | instance._mountIndex = 0;
|
11521 | instance._mountImage = null;
|
11522 |
|
11523 | return instance;
|
11524 | }
|
11525 |
|
11526 | objectAssign(ReactCompositeComponentWrapper.prototype, ReactCompositeComponent_1, {
|
11527 | _instantiateReactComponent: instantiateReactComponent
|
11528 | });
|
11529 |
|
11530 | var instantiateReactComponent_1 = instantiateReactComponent;
|
11531 |
|
11532 | /**
|
11533 | * Copyright 2013-present, Facebook, Inc.
|
11534 | * All rights reserved.
|
11535 | *
|
11536 | * This source code is licensed under the BSD-style license found in the
|
11537 | * LICENSE file in the root directory of this source tree. An additional grant
|
11538 | * of patent rights can be found in the PATENTS file in the same directory.
|
11539 | *
|
11540 | *
|
11541 | */
|
11542 |
|
11543 | /**
|
11544 | * Escape and wrap key so it is safe to use as a reactid
|
11545 | *
|
11546 | * @param {string} key to be escaped.
|
11547 | * @return {string} the escaped key.
|
11548 | */
|
11549 |
|
11550 | function escape$1(key) {
|
11551 | var escapeRegex = /[=:]/g;
|
11552 | var escaperLookup = {
|
11553 | '=': '=0',
|
11554 | ':': '=2'
|
11555 | };
|
11556 | var escapedString = ('' + key).replace(escapeRegex, function (match) {
|
11557 | return escaperLookup[match];
|
11558 | });
|
11559 |
|
11560 | return '$' + escapedString;
|
11561 | }
|
11562 |
|
11563 | /**
|
11564 | * Unescape and unwrap key for human-readable display
|
11565 | *
|
11566 | * @param {string} key to unescape.
|
11567 | * @return {string} the unescaped key.
|
11568 | */
|
11569 | function unescape$1(key) {
|
11570 | var unescapeRegex = /(=0|=2)/g;
|
11571 | var unescaperLookup = {
|
11572 | '=0': '=',
|
11573 | '=2': ':'
|
11574 | };
|
11575 | var keySubstring = key[0] === '.' && key[1] === '$' ? key.substring(2) : key.substring(1);
|
11576 |
|
11577 | return ('' + keySubstring).replace(unescapeRegex, function (match) {
|
11578 | return unescaperLookup[match];
|
11579 | });
|
11580 | }
|
11581 |
|
11582 | var KeyEscapeUtils$2 = {
|
11583 | escape: escape$1,
|
11584 | unescape: unescape$1
|
11585 | };
|
11586 |
|
11587 | var KeyEscapeUtils_1$2 = KeyEscapeUtils$2;
|
11588 |
|
11589 | /**
|
11590 | * Copyright 2014-present, Facebook, Inc.
|
11591 | * All rights reserved.
|
11592 | *
|
11593 | * This source code is licensed under the BSD-style license found in the
|
11594 | * LICENSE file in the root directory of this source tree. An additional grant
|
11595 | * of patent rights can be found in the PATENTS file in the same directory.
|
11596 | *
|
11597 | *
|
11598 | */
|
11599 |
|
11600 | // The Symbol used to tag the ReactElement type. If there is no native Symbol
|
11601 | // nor polyfill, then a plain number is used for performance.
|
11602 |
|
11603 | var REACT_ELEMENT_TYPE$2 = typeof Symbol === 'function' && Symbol['for'] && Symbol['for']('react.element') || 0xeac7;
|
11604 |
|
11605 | var ReactElementSymbol$2 = REACT_ELEMENT_TYPE$2;
|
11606 |
|
11607 | /**
|
11608 | * Copyright 2013-present, Facebook, Inc.
|
11609 | * All rights reserved.
|
11610 | *
|
11611 | * This source code is licensed under the BSD-style license found in the
|
11612 | * LICENSE file in the root directory of this source tree. An additional grant
|
11613 | * of patent rights can be found in the PATENTS file in the same directory.
|
11614 | *
|
11615 | *
|
11616 | */
|
11617 |
|
11618 | /* global Symbol */
|
11619 |
|
11620 | var ITERATOR_SYMBOL$1 = typeof Symbol === 'function' && Symbol.iterator;
|
11621 | var FAUX_ITERATOR_SYMBOL$1 = '@@iterator'; // Before Symbol spec.
|
11622 |
|
11623 | /**
|
11624 | * Returns the iterator method function contained on the iterable object.
|
11625 | *
|
11626 | * Be sure to invoke the function with the iterable as context:
|
11627 | *
|
11628 | * var iteratorFn = getIteratorFn(myIterable);
|
11629 | * if (iteratorFn) {
|
11630 | * var iterator = iteratorFn.call(myIterable);
|
11631 | * ...
|
11632 | * }
|
11633 | *
|
11634 | * @param {?object} maybeIterable
|
11635 | * @return {?function}
|
11636 | */
|
11637 | function getIteratorFn$2(maybeIterable) {
|
11638 | var iteratorFn = maybeIterable && (ITERATOR_SYMBOL$1 && maybeIterable[ITERATOR_SYMBOL$1] || maybeIterable[FAUX_ITERATOR_SYMBOL$1]);
|
11639 | if (typeof iteratorFn === 'function') {
|
11640 | return iteratorFn;
|
11641 | }
|
11642 | }
|
11643 |
|
11644 | var getIteratorFn_1$2 = getIteratorFn$2;
|
11645 |
|
11646 | var SEPARATOR$1 = '.';
|
11647 | var SUBSEPARATOR$1 = ':';
|
11648 |
|
11649 | /**
|
11650 | * Generate a key string that identifies a component within a set.
|
11651 | *
|
11652 | * @param {*} component A component that could contain a manual key.
|
11653 | * @param {number} index Index that is used if a manual key is not provided.
|
11654 | * @return {string}
|
11655 | */
|
11656 | function getComponentKey$1(component, index) {
|
11657 | // Do some typechecking here since we call this blindly. We want to ensure
|
11658 | // that we don't block potential future ES APIs.
|
11659 | if (component && typeof component === 'object' && component.key != null) {
|
11660 | // Explicit key
|
11661 | return KeyEscapeUtils_1$2.escape(component.key);
|
11662 | }
|
11663 | // Implicit key determined by the index in the set
|
11664 | return index.toString(36);
|
11665 | }
|
11666 |
|
11667 | /**
|
11668 | * @param {?*} children Children tree container.
|
11669 | * @param {!string} nameSoFar Name of the key path so far.
|
11670 | * @param {!function} callback Callback to invoke with each child found.
|
11671 | * @param {?*} traverseContext Used to pass information throughout the traversal
|
11672 | * process.
|
11673 | * @return {!number} The number of children in this subtree.
|
11674 | */
|
11675 | function traverseAllChildrenImpl$1(children, nameSoFar, callback, traverseContext) {
|
11676 | var type = typeof children;
|
11677 |
|
11678 | if (type === 'undefined' || type === 'boolean') {
|
11679 | // All of the above are perceived as null.
|
11680 | children = null;
|
11681 | }
|
11682 |
|
11683 | if (children === null || type === 'string' || type === 'number' ||
|
11684 | // The following is inlined from ReactElement. This means we can optimize
|
11685 | // some checks. React Fiber also inlines this logic for similar purposes.
|
11686 | type === 'object' && children.$$typeof === ReactElementSymbol$2) {
|
11687 | callback(traverseContext, children,
|
11688 | // If it's the only child, treat the name as if it was wrapped in an array
|
11689 | // so that it's consistent if the number of children grows.
|
11690 | nameSoFar === '' ? SEPARATOR$1 + getComponentKey$1(children, 0) : nameSoFar);
|
11691 | return 1;
|
11692 | }
|
11693 |
|
11694 | var child;
|
11695 | var nextName;
|
11696 | var subtreeCount = 0; // Count of children found in the current subtree.
|
11697 | var nextNamePrefix = nameSoFar === '' ? SEPARATOR$1 : nameSoFar + SUBSEPARATOR$1;
|
11698 |
|
11699 | if (Array.isArray(children)) {
|
11700 | for (var i = 0; i < children.length; i++) {
|
11701 | child = children[i];
|
11702 | nextName = nextNamePrefix + getComponentKey$1(child, i);
|
11703 | subtreeCount += traverseAllChildrenImpl$1(child, nextName, callback, traverseContext);
|
11704 | }
|
11705 | } else {
|
11706 | var iteratorFn = getIteratorFn_1$2(children);
|
11707 | if (iteratorFn) {
|
11708 | var iterator = iteratorFn.call(children);
|
11709 | var step;
|
11710 | if (iteratorFn !== children.entries) {
|
11711 | var ii = 0;
|
11712 | while (!(step = iterator.next()).done) {
|
11713 | child = step.value;
|
11714 | nextName = nextNamePrefix + getComponentKey$1(child, ii++);
|
11715 | subtreeCount += traverseAllChildrenImpl$1(child, nextName, callback, traverseContext);
|
11716 | }
|
11717 | } else {
|
11718 | while (!(step = iterator.next()).done) {
|
11719 | var entry = step.value;
|
11720 | if (entry) {
|
11721 | child = entry[1];
|
11722 | nextName = nextNamePrefix + KeyEscapeUtils_1$2.escape(entry[0]) + SUBSEPARATOR$1 + getComponentKey$1(child, 0);
|
11723 | subtreeCount += traverseAllChildrenImpl$1(child, nextName, callback, traverseContext);
|
11724 | }
|
11725 | }
|
11726 | }
|
11727 | } else if (type === 'object') {
|
11728 | var addendum = '';
|
11729 | var childrenString = String(children);
|
11730 | reactProdInvariant_1('31', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum);
|
11731 | }
|
11732 | }
|
11733 |
|
11734 | return subtreeCount;
|
11735 | }
|
11736 |
|
11737 | /**
|
11738 | * Traverses children that are typically specified as `props.children`, but
|
11739 | * might also be specified through attributes:
|
11740 | *
|
11741 | * - `traverseAllChildren(this.props.children, ...)`
|
11742 | * - `traverseAllChildren(this.props.leftPanelChildren, ...)`
|
11743 | *
|
11744 | * The `traverseContext` is an optional argument that is passed through the
|
11745 | * entire traversal. It can be used to store accumulations or anything else that
|
11746 | * the callback might find relevant.
|
11747 | *
|
11748 | * @param {?*} children Children tree object.
|
11749 | * @param {!function} callback To invoke upon traversing each child.
|
11750 | * @param {?*} traverseContext Context for traversal.
|
11751 | * @return {!number} The number of children in this subtree.
|
11752 | */
|
11753 | function traverseAllChildren$2(children, callback, traverseContext) {
|
11754 | if (children == null) {
|
11755 | return 0;
|
11756 | }
|
11757 |
|
11758 | return traverseAllChildrenImpl$1(children, '', callback, traverseContext);
|
11759 | }
|
11760 |
|
11761 | var traverseAllChildren_1$2 = traverseAllChildren$2;
|
11762 |
|
11763 | function isNative(fn) {
|
11764 | // Based on isNative() from Lodash
|
11765 | var funcToString = Function.prototype.toString;
|
11766 | var hasOwnProperty = Object.prototype.hasOwnProperty;
|
11767 | var reIsNative = RegExp('^' + funcToString
|
11768 | // Take an example native function source for comparison
|
11769 | .call(hasOwnProperty
|
11770 | // Strip regex characters so we can use it for regex
|
11771 | ).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&'
|
11772 | // Remove hasOwnProperty from the template to make it generic
|
11773 | ).replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$');
|
11774 | try {
|
11775 | var source = funcToString.call(fn);
|
11776 | return reIsNative.test(source);
|
11777 | } catch (err) {
|
11778 | return false;
|
11779 | }
|
11780 | }
|
11781 |
|
11782 | var canUseCollections =
|
11783 | // Array.from
|
11784 | typeof Array.from === 'function' &&
|
11785 | // Map
|
11786 | typeof Map === 'function' && isNative(Map) &&
|
11787 | // Map.prototype.keys
|
11788 | Map.prototype != null && typeof Map.prototype.keys === 'function' && isNative(Map.prototype.keys) &&
|
11789 | // Set
|
11790 | typeof Set === 'function' && isNative(Set) &&
|
11791 | // Set.prototype.keys
|
11792 | Set.prototype != null && typeof Set.prototype.keys === 'function' && isNative(Set.prototype.keys);
|
11793 |
|
11794 | var setItem;
|
11795 | var getItem;
|
11796 | var removeItem;
|
11797 | var getItemIDs;
|
11798 | var addRoot;
|
11799 | var removeRoot;
|
11800 | var getRootIDs;
|
11801 |
|
11802 | if (canUseCollections) {
|
11803 | var itemMap = new Map();
|
11804 | var rootIDSet = new Set();
|
11805 |
|
11806 | setItem = function (id, item) {
|
11807 | itemMap.set(id, item);
|
11808 | };
|
11809 | getItem = function (id) {
|
11810 | return itemMap.get(id);
|
11811 | };
|
11812 | removeItem = function (id) {
|
11813 | itemMap['delete'](id);
|
11814 | };
|
11815 | getItemIDs = function () {
|
11816 | return Array.from(itemMap.keys());
|
11817 | };
|
11818 |
|
11819 | addRoot = function (id) {
|
11820 | rootIDSet.add(id);
|
11821 | };
|
11822 | removeRoot = function (id) {
|
11823 | rootIDSet['delete'](id);
|
11824 | };
|
11825 | getRootIDs = function () {
|
11826 | return Array.from(rootIDSet.keys());
|
11827 | };
|
11828 | } else {
|
11829 | var itemByKey = {};
|
11830 | var rootByKey = {};
|
11831 |
|
11832 | // Use non-numeric keys to prevent V8 performance issues:
|
11833 | // https://github.com/facebook/react/pull/7232
|
11834 | var getKeyFromID = function (id) {
|
11835 | return '.' + id;
|
11836 | };
|
11837 | var getIDFromKey = function (key) {
|
11838 | return parseInt(key.substr(1), 10);
|
11839 | };
|
11840 |
|
11841 | setItem = function (id, item) {
|
11842 | var key = getKeyFromID(id);
|
11843 | itemByKey[key] = item;
|
11844 | };
|
11845 | getItem = function (id) {
|
11846 | var key = getKeyFromID(id);
|
11847 | return itemByKey[key];
|
11848 | };
|
11849 | removeItem = function (id) {
|
11850 | var key = getKeyFromID(id);
|
11851 | delete itemByKey[key];
|
11852 | };
|
11853 | getItemIDs = function () {
|
11854 | return Object.keys(itemByKey).map(getIDFromKey);
|
11855 | };
|
11856 |
|
11857 | addRoot = function (id) {
|
11858 | var key = getKeyFromID(id);
|
11859 | rootByKey[key] = true;
|
11860 | };
|
11861 | removeRoot = function (id) {
|
11862 | var key = getKeyFromID(id);
|
11863 | delete rootByKey[key];
|
11864 | };
|
11865 | getRootIDs = function () {
|
11866 | return Object.keys(rootByKey).map(getIDFromKey);
|
11867 | };
|
11868 | }
|
11869 |
|
11870 | function instantiateChild(childInstances, child, name, selfDebugID) {
|
11871 | // We found a component instance.
|
11872 | var keyUnique = childInstances[name] === undefined;
|
11873 | if (child != null && keyUnique) {
|
11874 | childInstances[name] = instantiateReactComponent_1(child, true);
|
11875 | }
|
11876 | }
|
11877 |
|
11878 | /**
|
11879 | * ReactChildReconciler provides helpers for initializing or updating a set of
|
11880 | * children. Its output is suitable for passing it onto ReactMultiChild which
|
11881 | * does diffed reordering and insertion.
|
11882 | */
|
11883 | var ReactChildReconciler = {
|
11884 | /**
|
11885 | * Generates a "mount image" for each of the supplied children. In the case
|
11886 | * of `ReactDOMComponent`, a mount image is a string of markup.
|
11887 | *
|
11888 | * @param {?object} nestedChildNodes Nested child maps.
|
11889 | * @return {?object} A set of child instances.
|
11890 | * @internal
|
11891 | */
|
11892 | instantiateChildren: function (nestedChildNodes, transaction, context, selfDebugID) // 0 in production and for roots
|
11893 | {
|
11894 | if (nestedChildNodes == null) {
|
11895 | return null;
|
11896 | }
|
11897 | var childInstances = {};
|
11898 |
|
11899 | {
|
11900 | traverseAllChildren_1$2(nestedChildNodes, instantiateChild, childInstances);
|
11901 | }
|
11902 | return childInstances;
|
11903 | },
|
11904 |
|
11905 | /**
|
11906 | * Updates the rendered children and returns a new set of children.
|
11907 | *
|
11908 | * @param {?object} prevChildren Previously initialized set of children.
|
11909 | * @param {?object} nextChildren Flat child element maps.
|
11910 | * @param {ReactReconcileTransaction} transaction
|
11911 | * @param {object} context
|
11912 | * @return {?object} A new set of child instances.
|
11913 | * @internal
|
11914 | */
|
11915 | updateChildren: function (prevChildren, nextChildren, mountImages, removedNodes, transaction, hostParent, hostContainerInfo, context, selfDebugID) // 0 in production and for roots
|
11916 | {
|
11917 | // We currently don't have a way to track moves here but if we use iterators
|
11918 | // instead of for..in we can zip the iterators and check if an item has
|
11919 | // moved.
|
11920 | // TODO: If nothing has changed, return the prevChildren object so that we
|
11921 | // can quickly bailout if nothing has changed.
|
11922 | if (!nextChildren && !prevChildren) {
|
11923 | return;
|
11924 | }
|
11925 | var name;
|
11926 | var prevChild;
|
11927 | for (name in nextChildren) {
|
11928 | if (!nextChildren.hasOwnProperty(name)) {
|
11929 | continue;
|
11930 | }
|
11931 | prevChild = prevChildren && prevChildren[name];
|
11932 | var prevElement = prevChild && prevChild._currentElement;
|
11933 | var nextElement = nextChildren[name];
|
11934 | if (prevChild != null && shouldUpdateReactComponent_1(prevElement, nextElement)) {
|
11935 | ReactReconciler_1.receiveComponent(prevChild, nextElement, transaction, context);
|
11936 | nextChildren[name] = prevChild;
|
11937 | } else {
|
11938 | if (prevChild) {
|
11939 | removedNodes[name] = ReactReconciler_1.getHostNode(prevChild);
|
11940 | ReactReconciler_1.unmountComponent(prevChild, false);
|
11941 | }
|
11942 | // The child must be instantiated before it's mounted.
|
11943 | var nextChildInstance = instantiateReactComponent_1(nextElement, true);
|
11944 | nextChildren[name] = nextChildInstance;
|
11945 | // Creating mount image now ensures refs are resolved in right order
|
11946 | // (see https://github.com/facebook/react/pull/7101 for explanation).
|
11947 | var nextChildMountImage = ReactReconciler_1.mountComponent(nextChildInstance, transaction, hostParent, hostContainerInfo, context, selfDebugID);
|
11948 | mountImages.push(nextChildMountImage);
|
11949 | }
|
11950 | }
|
11951 | // Unmount children that are no longer present.
|
11952 | for (name in prevChildren) {
|
11953 | if (prevChildren.hasOwnProperty(name) && !(nextChildren && nextChildren.hasOwnProperty(name))) {
|
11954 | prevChild = prevChildren[name];
|
11955 | removedNodes[name] = ReactReconciler_1.getHostNode(prevChild);
|
11956 | ReactReconciler_1.unmountComponent(prevChild, false);
|
11957 | }
|
11958 | }
|
11959 | },
|
11960 |
|
11961 | /**
|
11962 | * Unmounts all rendered children. This should be used to clean up children
|
11963 | * when this component is unmounted.
|
11964 | *
|
11965 | * @param {?object} renderedChildren Previously initialized set of children.
|
11966 | * @internal
|
11967 | */
|
11968 | unmountChildren: function (renderedChildren, safely) {
|
11969 | for (var name in renderedChildren) {
|
11970 | if (renderedChildren.hasOwnProperty(name)) {
|
11971 | var renderedChild = renderedChildren[name];
|
11972 | ReactReconciler_1.unmountComponent(renderedChild, safely);
|
11973 | }
|
11974 | }
|
11975 | }
|
11976 | };
|
11977 |
|
11978 | var ReactChildReconciler_1 = ReactChildReconciler;
|
11979 |
|
11980 | /**
|
11981 | * @param {function} traverseContext Context passed through traversal.
|
11982 | * @param {?ReactComponent} child React child component.
|
11983 | * @param {!string} name String name of key path to child.
|
11984 | * @param {number=} selfDebugID Optional debugID of the current internal instance.
|
11985 | */
|
11986 | function flattenSingleChildIntoContext(traverseContext, child, name, selfDebugID) {
|
11987 | // We found a component instance.
|
11988 | if (traverseContext && typeof traverseContext === 'object') {
|
11989 | var result = traverseContext;
|
11990 | var keyUnique = result[name] === undefined;
|
11991 | if (keyUnique && child != null) {
|
11992 | result[name] = child;
|
11993 | }
|
11994 | }
|
11995 | }
|
11996 |
|
11997 | /**
|
11998 | * Flattens children that are typically specified as `props.children`. Any null
|
11999 | * children will not be included in the resulting object.
|
12000 | * @return {!object} flattened children keyed by name.
|
12001 | */
|
12002 | function flattenChildren$1(children, selfDebugID) {
|
12003 | if (children == null) {
|
12004 | return children;
|
12005 | }
|
12006 | var result = {};
|
12007 |
|
12008 | {
|
12009 | traverseAllChildren_1$2(children, flattenSingleChildIntoContext, result);
|
12010 | }
|
12011 | return result;
|
12012 | }
|
12013 |
|
12014 | var flattenChildren_1 = flattenChildren$1;
|
12015 |
|
12016 | /**
|
12017 | * Make an update for markup to be rendered and inserted at a supplied index.
|
12018 | *
|
12019 | * @param {string} markup Markup that renders into an element.
|
12020 | * @param {number} toIndex Destination index.
|
12021 | * @private
|
12022 | */
|
12023 | function makeInsertMarkup(markup, afterNode, toIndex) {
|
12024 | // NOTE: Null values reduce hidden classes.
|
12025 | return {
|
12026 | type: 'INSERT_MARKUP',
|
12027 | content: markup,
|
12028 | fromIndex: null,
|
12029 | fromNode: null,
|
12030 | toIndex: toIndex,
|
12031 | afterNode: afterNode
|
12032 | };
|
12033 | }
|
12034 |
|
12035 | /**
|
12036 | * Make an update for moving an existing element to another index.
|
12037 | *
|
12038 | * @param {number} fromIndex Source index of the existing element.
|
12039 | * @param {number} toIndex Destination index of the element.
|
12040 | * @private
|
12041 | */
|
12042 | function makeMove(child, afterNode, toIndex) {
|
12043 | // NOTE: Null values reduce hidden classes.
|
12044 | return {
|
12045 | type: 'MOVE_EXISTING',
|
12046 | content: null,
|
12047 | fromIndex: child._mountIndex,
|
12048 | fromNode: ReactReconciler_1.getHostNode(child),
|
12049 | toIndex: toIndex,
|
12050 | afterNode: afterNode
|
12051 | };
|
12052 | }
|
12053 |
|
12054 | /**
|
12055 | * Make an update for removing an element at an index.
|
12056 | *
|
12057 | * @param {number} fromIndex Index of the element to remove.
|
12058 | * @private
|
12059 | */
|
12060 | function makeRemove(child, node) {
|
12061 | // NOTE: Null values reduce hidden classes.
|
12062 | return {
|
12063 | type: 'REMOVE_NODE',
|
12064 | content: null,
|
12065 | fromIndex: child._mountIndex,
|
12066 | fromNode: node,
|
12067 | toIndex: null,
|
12068 | afterNode: null
|
12069 | };
|
12070 | }
|
12071 |
|
12072 | /**
|
12073 | * Make an update for setting the markup of a node.
|
12074 | *
|
12075 | * @param {string} markup Markup that renders into an element.
|
12076 | * @private
|
12077 | */
|
12078 | function makeSetMarkup(markup) {
|
12079 | // NOTE: Null values reduce hidden classes.
|
12080 | return {
|
12081 | type: 'SET_MARKUP',
|
12082 | content: markup,
|
12083 | fromIndex: null,
|
12084 | fromNode: null,
|
12085 | toIndex: null,
|
12086 | afterNode: null
|
12087 | };
|
12088 | }
|
12089 |
|
12090 | /**
|
12091 | * Make an update for setting the text content.
|
12092 | *
|
12093 | * @param {string} textContent Text content to set.
|
12094 | * @private
|
12095 | */
|
12096 | function makeTextContent(textContent) {
|
12097 | // NOTE: Null values reduce hidden classes.
|
12098 | return {
|
12099 | type: 'TEXT_CONTENT',
|
12100 | content: textContent,
|
12101 | fromIndex: null,
|
12102 | fromNode: null,
|
12103 | toIndex: null,
|
12104 | afterNode: null
|
12105 | };
|
12106 | }
|
12107 |
|
12108 | /**
|
12109 | * Push an update, if any, onto the queue. Creates a new queue if none is
|
12110 | * passed and always returns the queue. Mutative.
|
12111 | */
|
12112 | function enqueue(queue, update) {
|
12113 | if (update) {
|
12114 | queue = queue || [];
|
12115 | queue.push(update);
|
12116 | }
|
12117 | return queue;
|
12118 | }
|
12119 |
|
12120 | /**
|
12121 | * Processes any enqueued updates.
|
12122 | *
|
12123 | * @private
|
12124 | */
|
12125 | function processQueue(inst, updateQueue) {
|
12126 | ReactComponentEnvironment_1.processChildrenUpdates(inst, updateQueue);
|
12127 | }
|
12128 |
|
12129 | /**
|
12130 | * ReactMultiChild are capable of reconciling multiple children.
|
12131 | *
|
12132 | * @class ReactMultiChild
|
12133 | * @internal
|
12134 | */
|
12135 | var ReactMultiChild = {
|
12136 | /**
|
12137 | * Provides common functionality for components that must reconcile multiple
|
12138 | * children. This is used by `ReactDOMComponent` to mount, update, and
|
12139 | * unmount child components.
|
12140 | *
|
12141 | * @lends {ReactMultiChild.prototype}
|
12142 | */
|
12143 | Mixin: {
|
12144 | _reconcilerInstantiateChildren: function (nestedChildren, transaction, context) {
|
12145 | return ReactChildReconciler_1.instantiateChildren(nestedChildren, transaction, context);
|
12146 | },
|
12147 |
|
12148 | _reconcilerUpdateChildren: function (prevChildren, nextNestedChildrenElements, mountImages, removedNodes, transaction, context) {
|
12149 | var nextChildren;
|
12150 | var selfDebugID = 0;
|
12151 | nextChildren = flattenChildren_1(nextNestedChildrenElements, selfDebugID);
|
12152 | ReactChildReconciler_1.updateChildren(prevChildren, nextChildren, mountImages, removedNodes, transaction, this, this._hostContainerInfo, context, selfDebugID);
|
12153 | return nextChildren;
|
12154 | },
|
12155 |
|
12156 | /**
|
12157 | * Generates a "mount image" for each of the supplied children. In the case
|
12158 | * of `ReactDOMComponent`, a mount image is a string of markup.
|
12159 | *
|
12160 | * @param {?object} nestedChildren Nested child maps.
|
12161 | * @return {array} An array of mounted representations.
|
12162 | * @internal
|
12163 | */
|
12164 | mountChildren: function (nestedChildren, transaction, context) {
|
12165 | var children = this._reconcilerInstantiateChildren(nestedChildren, transaction, context);
|
12166 | this._renderedChildren = children;
|
12167 |
|
12168 | var mountImages = [];
|
12169 | var index = 0;
|
12170 | for (var name in children) {
|
12171 | if (children.hasOwnProperty(name)) {
|
12172 | var child = children[name];
|
12173 | var selfDebugID = 0;
|
12174 | var mountImage = ReactReconciler_1.mountComponent(child, transaction, this, this._hostContainerInfo, context, selfDebugID);
|
12175 | child._mountIndex = index++;
|
12176 | mountImages.push(mountImage);
|
12177 | }
|
12178 | }
|
12179 |
|
12180 | return mountImages;
|
12181 | },
|
12182 |
|
12183 | /**
|
12184 | * Replaces any rendered children with a text content string.
|
12185 | *
|
12186 | * @param {string} nextContent String of content.
|
12187 | * @internal
|
12188 | */
|
12189 | updateTextContent: function (nextContent) {
|
12190 | var prevChildren = this._renderedChildren;
|
12191 | // Remove any rendered children.
|
12192 | ReactChildReconciler_1.unmountChildren(prevChildren, false);
|
12193 | for (var name in prevChildren) {
|
12194 | if (prevChildren.hasOwnProperty(name)) {
|
12195 | reactProdInvariant_1('118');
|
12196 | }
|
12197 | }
|
12198 | // Set new text content.
|
12199 | var updates = [makeTextContent(nextContent)];
|
12200 | processQueue(this, updates);
|
12201 | },
|
12202 |
|
12203 | /**
|
12204 | * Replaces any rendered children with a markup string.
|
12205 | *
|
12206 | * @param {string} nextMarkup String of markup.
|
12207 | * @internal
|
12208 | */
|
12209 | updateMarkup: function (nextMarkup) {
|
12210 | var prevChildren = this._renderedChildren;
|
12211 | // Remove any rendered children.
|
12212 | ReactChildReconciler_1.unmountChildren(prevChildren, false);
|
12213 | for (var name in prevChildren) {
|
12214 | if (prevChildren.hasOwnProperty(name)) {
|
12215 | reactProdInvariant_1('118');
|
12216 | }
|
12217 | }
|
12218 | var updates = [makeSetMarkup(nextMarkup)];
|
12219 | processQueue(this, updates);
|
12220 | },
|
12221 |
|
12222 | /**
|
12223 | * Updates the rendered children with new children.
|
12224 | *
|
12225 | * @param {?object} nextNestedChildrenElements Nested child element maps.
|
12226 | * @param {ReactReconcileTransaction} transaction
|
12227 | * @internal
|
12228 | */
|
12229 | updateChildren: function (nextNestedChildrenElements, transaction, context) {
|
12230 | // Hook used by React ART
|
12231 | this._updateChildren(nextNestedChildrenElements, transaction, context);
|
12232 | },
|
12233 |
|
12234 | /**
|
12235 | * @param {?object} nextNestedChildrenElements Nested child element maps.
|
12236 | * @param {ReactReconcileTransaction} transaction
|
12237 | * @final
|
12238 | * @protected
|
12239 | */
|
12240 | _updateChildren: function (nextNestedChildrenElements, transaction, context) {
|
12241 | var prevChildren = this._renderedChildren;
|
12242 | var removedNodes = {};
|
12243 | var mountImages = [];
|
12244 | var nextChildren = this._reconcilerUpdateChildren(prevChildren, nextNestedChildrenElements, mountImages, removedNodes, transaction, context);
|
12245 | if (!nextChildren && !prevChildren) {
|
12246 | return;
|
12247 | }
|
12248 | var updates = null;
|
12249 | var name;
|
12250 | // `nextIndex` will increment for each child in `nextChildren`, but
|
12251 | // `lastIndex` will be the last index visited in `prevChildren`.
|
12252 | var nextIndex = 0;
|
12253 | var lastIndex = 0;
|
12254 | // `nextMountIndex` will increment for each newly mounted child.
|
12255 | var nextMountIndex = 0;
|
12256 | var lastPlacedNode = null;
|
12257 | for (name in nextChildren) {
|
12258 | if (!nextChildren.hasOwnProperty(name)) {
|
12259 | continue;
|
12260 | }
|
12261 | var prevChild = prevChildren && prevChildren[name];
|
12262 | var nextChild = nextChildren[name];
|
12263 | if (prevChild === nextChild) {
|
12264 | updates = enqueue(updates, this.moveChild(prevChild, lastPlacedNode, nextIndex, lastIndex));
|
12265 | lastIndex = Math.max(prevChild._mountIndex, lastIndex);
|
12266 | prevChild._mountIndex = nextIndex;
|
12267 | } else {
|
12268 | if (prevChild) {
|
12269 | // Update `lastIndex` before `_mountIndex` gets unset by unmounting.
|
12270 | lastIndex = Math.max(prevChild._mountIndex, lastIndex);
|
12271 | // The `removedNodes` loop below will actually remove the child.
|
12272 | }
|
12273 | // The child must be instantiated before it's mounted.
|
12274 | updates = enqueue(updates, this._mountChildAtIndex(nextChild, mountImages[nextMountIndex], lastPlacedNode, nextIndex, transaction, context));
|
12275 | nextMountIndex++;
|
12276 | }
|
12277 | nextIndex++;
|
12278 | lastPlacedNode = ReactReconciler_1.getHostNode(nextChild);
|
12279 | }
|
12280 | // Remove children that are no longer present.
|
12281 | for (name in removedNodes) {
|
12282 | if (removedNodes.hasOwnProperty(name)) {
|
12283 | updates = enqueue(updates, this._unmountChild(prevChildren[name], removedNodes[name]));
|
12284 | }
|
12285 | }
|
12286 | if (updates) {
|
12287 | processQueue(this, updates);
|
12288 | }
|
12289 | this._renderedChildren = nextChildren;
|
12290 |
|
12291 |
|
12292 | },
|
12293 |
|
12294 | /**
|
12295 | * Unmounts all rendered children. This should be used to clean up children
|
12296 | * when this component is unmounted. It does not actually perform any
|
12297 | * backend operations.
|
12298 | *
|
12299 | * @internal
|
12300 | */
|
12301 | unmountChildren: function (safely) {
|
12302 | var renderedChildren = this._renderedChildren;
|
12303 | ReactChildReconciler_1.unmountChildren(renderedChildren, safely);
|
12304 | this._renderedChildren = null;
|
12305 | },
|
12306 |
|
12307 | /**
|
12308 | * Moves a child component to the supplied index.
|
12309 | *
|
12310 | * @param {ReactComponent} child Component to move.
|
12311 | * @param {number} toIndex Destination index of the element.
|
12312 | * @param {number} lastIndex Last index visited of the siblings of `child`.
|
12313 | * @protected
|
12314 | */
|
12315 | moveChild: function (child, afterNode, toIndex, lastIndex) {
|
12316 | // If the index of `child` is less than `lastIndex`, then it needs to
|
12317 | // be moved. Otherwise, we do not need to move it because a child will be
|
12318 | // inserted or moved before `child`.
|
12319 | if (child._mountIndex < lastIndex) {
|
12320 | return makeMove(child, afterNode, toIndex);
|
12321 | }
|
12322 | },
|
12323 |
|
12324 | /**
|
12325 | * Creates a child component.
|
12326 | *
|
12327 | * @param {ReactComponent} child Component to create.
|
12328 | * @param {string} mountImage Markup to insert.
|
12329 | * @protected
|
12330 | */
|
12331 | createChild: function (child, afterNode, mountImage) {
|
12332 | return makeInsertMarkup(mountImage, afterNode, child._mountIndex);
|
12333 | },
|
12334 |
|
12335 | /**
|
12336 | * Removes a child component.
|
12337 | *
|
12338 | * @param {ReactComponent} child Child to remove.
|
12339 | * @protected
|
12340 | */
|
12341 | removeChild: function (child, node) {
|
12342 | return makeRemove(child, node);
|
12343 | },
|
12344 |
|
12345 | /**
|
12346 | * Mounts a child with the supplied name.
|
12347 | *
|
12348 | * NOTE: This is part of `updateChildren` and is here for readability.
|
12349 | *
|
12350 | * @param {ReactComponent} child Component to mount.
|
12351 | * @param {string} name Name of the child.
|
12352 | * @param {number} index Index at which to insert the child.
|
12353 | * @param {ReactReconcileTransaction} transaction
|
12354 | * @private
|
12355 | */
|
12356 | _mountChildAtIndex: function (child, mountImage, afterNode, index, transaction, context) {
|
12357 | child._mountIndex = index;
|
12358 | return this.createChild(child, afterNode, mountImage);
|
12359 | },
|
12360 |
|
12361 | /**
|
12362 | * Unmounts a rendered child.
|
12363 | *
|
12364 | * NOTE: This is part of `updateChildren` and is here for readability.
|
12365 | *
|
12366 | * @param {ReactComponent} child Component to unmount.
|
12367 | * @private
|
12368 | */
|
12369 | _unmountChild: function (child, node) {
|
12370 | var update = this.removeChild(child, node);
|
12371 | child._mountIndex = null;
|
12372 | return update;
|
12373 | }
|
12374 | }
|
12375 | };
|
12376 |
|
12377 | var ReactMultiChild_1 = ReactMultiChild;
|
12378 |
|
12379 | function enqueueUpdate$1(internalInstance) {
|
12380 | ReactUpdates_1.enqueueUpdate(internalInstance);
|
12381 | }
|
12382 |
|
12383 | function formatUnexpectedArgument(arg) {
|
12384 | var type = typeof arg;
|
12385 | if (type !== 'object') {
|
12386 | return type;
|
12387 | }
|
12388 | var displayName = arg.constructor && arg.constructor.name || type;
|
12389 | var keys = Object.keys(arg);
|
12390 | if (keys.length > 0 && keys.length < 20) {
|
12391 | return displayName + ' (keys: ' + keys.join(', ') + ')';
|
12392 | }
|
12393 | return displayName;
|
12394 | }
|
12395 |
|
12396 | function getInternalInstanceReadyForUpdate(publicInstance, callerName) {
|
12397 | var internalInstance = ReactInstanceMap_1.get(publicInstance);
|
12398 | if (!internalInstance) {
|
12399 | return null;
|
12400 | }
|
12401 |
|
12402 | return internalInstance;
|
12403 | }
|
12404 |
|
12405 | /**
|
12406 | * ReactUpdateQueue allows for state updates to be scheduled into a later
|
12407 | * reconciliation step.
|
12408 | */
|
12409 | var ReactUpdateQueue = {
|
12410 | /**
|
12411 | * Checks whether or not this composite component is mounted.
|
12412 | * @param {ReactClass} publicInstance The instance we want to test.
|
12413 | * @return {boolean} True if mounted, false otherwise.
|
12414 | * @protected
|
12415 | * @final
|
12416 | */
|
12417 | isMounted: function (publicInstance) {
|
12418 | var internalInstance = ReactInstanceMap_1.get(publicInstance);
|
12419 | if (internalInstance) {
|
12420 | // During componentWillMount and render this will still be null but after
|
12421 | // that will always render to something. At least for now. So we can use
|
12422 | // this hack.
|
12423 | return !!internalInstance._renderedComponent;
|
12424 | } else {
|
12425 | return false;
|
12426 | }
|
12427 | },
|
12428 |
|
12429 | /**
|
12430 | * Enqueue a callback that will be executed after all the pending updates
|
12431 | * have processed.
|
12432 | *
|
12433 | * @param {ReactClass} publicInstance The instance to use as `this` context.
|
12434 | * @param {?function} callback Called after state is updated.
|
12435 | * @param {string} callerName Name of the calling function in the public API.
|
12436 | * @internal
|
12437 | */
|
12438 | enqueueCallback: function (publicInstance, callback, callerName) {
|
12439 | ReactUpdateQueue.validateCallback(callback, callerName);
|
12440 | var internalInstance = getInternalInstanceReadyForUpdate(publicInstance);
|
12441 |
|
12442 | // Previously we would throw an error if we didn't have an internal
|
12443 | // instance. Since we want to make it a no-op instead, we mirror the same
|
12444 | // behavior we have in other enqueue* methods.
|
12445 | // We also need to ignore callbacks in componentWillMount. See
|
12446 | // enqueueUpdates.
|
12447 | if (!internalInstance) {
|
12448 | return null;
|
12449 | }
|
12450 |
|
12451 | if (internalInstance._pendingCallbacks) {
|
12452 | internalInstance._pendingCallbacks.push(callback);
|
12453 | } else {
|
12454 | internalInstance._pendingCallbacks = [callback];
|
12455 | }
|
12456 | // TODO: The callback here is ignored when setState is called from
|
12457 | // componentWillMount. Either fix it or disallow doing so completely in
|
12458 | // favor of getInitialState. Alternatively, we can disallow
|
12459 | // componentWillMount during server-side rendering.
|
12460 | enqueueUpdate$1(internalInstance);
|
12461 | },
|
12462 |
|
12463 | enqueueCallbackInternal: function (internalInstance, callback) {
|
12464 | if (internalInstance._pendingCallbacks) {
|
12465 | internalInstance._pendingCallbacks.push(callback);
|
12466 | } else {
|
12467 | internalInstance._pendingCallbacks = [callback];
|
12468 | }
|
12469 | enqueueUpdate$1(internalInstance);
|
12470 | },
|
12471 |
|
12472 | /**
|
12473 | * Forces an update. This should only be invoked when it is known with
|
12474 | * certainty that we are **not** in a DOM transaction.
|
12475 | *
|
12476 | * You may want to call this when you know that some deeper aspect of the
|
12477 | * component's state has changed but `setState` was not called.
|
12478 | *
|
12479 | * This will not invoke `shouldComponentUpdate`, but it will invoke
|
12480 | * `componentWillUpdate` and `componentDidUpdate`.
|
12481 | *
|
12482 | * @param {ReactClass} publicInstance The instance that should rerender.
|
12483 | * @internal
|
12484 | */
|
12485 | enqueueForceUpdate: function (publicInstance) {
|
12486 | var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'forceUpdate');
|
12487 |
|
12488 | if (!internalInstance) {
|
12489 | return;
|
12490 | }
|
12491 |
|
12492 | internalInstance._pendingForceUpdate = true;
|
12493 |
|
12494 | enqueueUpdate$1(internalInstance);
|
12495 | },
|
12496 |
|
12497 | /**
|
12498 | * Replaces all of the state. Always use this or `setState` to mutate state.
|
12499 | * You should treat `this.state` as immutable.
|
12500 | *
|
12501 | * There is no guarantee that `this.state` will be immediately updated, so
|
12502 | * accessing `this.state` after calling this method may return the old value.
|
12503 | *
|
12504 | * @param {ReactClass} publicInstance The instance that should rerender.
|
12505 | * @param {object} completeState Next state.
|
12506 | * @internal
|
12507 | */
|
12508 | enqueueReplaceState: function (publicInstance, completeState, callback) {
|
12509 | var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'replaceState');
|
12510 |
|
12511 | if (!internalInstance) {
|
12512 | return;
|
12513 | }
|
12514 |
|
12515 | internalInstance._pendingStateQueue = [completeState];
|
12516 | internalInstance._pendingReplaceState = true;
|
12517 |
|
12518 | // Future-proof 15.5
|
12519 | if (callback !== undefined && callback !== null) {
|
12520 | ReactUpdateQueue.validateCallback(callback, 'replaceState');
|
12521 | if (internalInstance._pendingCallbacks) {
|
12522 | internalInstance._pendingCallbacks.push(callback);
|
12523 | } else {
|
12524 | internalInstance._pendingCallbacks = [callback];
|
12525 | }
|
12526 | }
|
12527 |
|
12528 | enqueueUpdate$1(internalInstance);
|
12529 | },
|
12530 |
|
12531 | /**
|
12532 | * Sets a subset of the state. This only exists because _pendingState is
|
12533 | * internal. This provides a merging strategy that is not available to deep
|
12534 | * properties which is confusing. TODO: Expose pendingState or don't use it
|
12535 | * during the merge.
|
12536 | *
|
12537 | * @param {ReactClass} publicInstance The instance that should rerender.
|
12538 | * @param {object} partialState Next partial state to be merged with state.
|
12539 | * @internal
|
12540 | */
|
12541 | enqueueSetState: function (publicInstance, partialState) {
|
12542 | var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'setState');
|
12543 |
|
12544 | if (!internalInstance) {
|
12545 | return;
|
12546 | }
|
12547 |
|
12548 | var queue = internalInstance._pendingStateQueue || (internalInstance._pendingStateQueue = []);
|
12549 | queue.push(partialState);
|
12550 |
|
12551 | enqueueUpdate$1(internalInstance);
|
12552 | },
|
12553 |
|
12554 | enqueueElementInternal: function (internalInstance, nextElement, nextContext) {
|
12555 | internalInstance._pendingElement = nextElement;
|
12556 | // TODO: introduce _pendingContext instead of setting it directly.
|
12557 | internalInstance._context = nextContext;
|
12558 | enqueueUpdate$1(internalInstance);
|
12559 | },
|
12560 |
|
12561 | validateCallback: function (callback, callerName) {
|
12562 | !(!callback || typeof callback === 'function') ? reactProdInvariant_1('122', callerName, formatUnexpectedArgument(callback)) : void 0;
|
12563 | }
|
12564 | };
|
12565 |
|
12566 | var ReactUpdateQueue_1 = ReactUpdateQueue;
|
12567 |
|
12568 | function _classCallCheck$1(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
12569 |
|
12570 |
|
12571 |
|
12572 |
|
12573 |
|
12574 | function warnNoop$1(publicInstance, callerName) {
|
12575 |
|
12576 | }
|
12577 |
|
12578 | /**
|
12579 | * This is the update queue used for server rendering.
|
12580 | * It delegates to ReactUpdateQueue while server rendering is in progress and
|
12581 | * switches to ReactNoopUpdateQueue after the transaction has completed.
|
12582 | * @class ReactServerUpdateQueue
|
12583 | * @param {Transaction} transaction
|
12584 | */
|
12585 |
|
12586 | var ReactServerUpdateQueue = function () {
|
12587 | function ReactServerUpdateQueue(transaction) {
|
12588 | _classCallCheck$1(this, ReactServerUpdateQueue);
|
12589 |
|
12590 | this.transaction = transaction;
|
12591 | }
|
12592 |
|
12593 | /**
|
12594 | * Checks whether or not this composite component is mounted.
|
12595 | * @param {ReactClass} publicInstance The instance we want to test.
|
12596 | * @return {boolean} True if mounted, false otherwise.
|
12597 | * @protected
|
12598 | * @final
|
12599 | */
|
12600 |
|
12601 |
|
12602 | ReactServerUpdateQueue.prototype.isMounted = function isMounted(publicInstance) {
|
12603 | return false;
|
12604 | };
|
12605 |
|
12606 | /**
|
12607 | * Enqueue a callback that will be executed after all the pending updates
|
12608 | * have processed.
|
12609 | *
|
12610 | * @param {ReactClass} publicInstance The instance to use as `this` context.
|
12611 | * @param {?function} callback Called after state is updated.
|
12612 | * @internal
|
12613 | */
|
12614 |
|
12615 |
|
12616 | ReactServerUpdateQueue.prototype.enqueueCallback = function enqueueCallback(publicInstance, callback, callerName) {
|
12617 | if (this.transaction.isInTransaction()) {
|
12618 | ReactUpdateQueue_1.enqueueCallback(publicInstance, callback, callerName);
|
12619 | }
|
12620 | };
|
12621 |
|
12622 | /**
|
12623 | * Forces an update. This should only be invoked when it is known with
|
12624 | * certainty that we are **not** in a DOM transaction.
|
12625 | *
|
12626 | * You may want to call this when you know that some deeper aspect of the
|
12627 | * component's state has changed but `setState` was not called.
|
12628 | *
|
12629 | * This will not invoke `shouldComponentUpdate`, but it will invoke
|
12630 | * `componentWillUpdate` and `componentDidUpdate`.
|
12631 | *
|
12632 | * @param {ReactClass} publicInstance The instance that should rerender.
|
12633 | * @internal
|
12634 | */
|
12635 |
|
12636 |
|
12637 | ReactServerUpdateQueue.prototype.enqueueForceUpdate = function enqueueForceUpdate(publicInstance) {
|
12638 | if (this.transaction.isInTransaction()) {
|
12639 | ReactUpdateQueue_1.enqueueForceUpdate(publicInstance);
|
12640 | } else {
|
12641 | warnNoop$1(publicInstance, 'forceUpdate');
|
12642 | }
|
12643 | };
|
12644 |
|
12645 | /**
|
12646 | * Replaces all of the state. Always use this or `setState` to mutate state.
|
12647 | * You should treat `this.state` as immutable.
|
12648 | *
|
12649 | * There is no guarantee that `this.state` will be immediately updated, so
|
12650 | * accessing `this.state` after calling this method may return the old value.
|
12651 | *
|
12652 | * @param {ReactClass} publicInstance The instance that should rerender.
|
12653 | * @param {object|function} completeState Next state.
|
12654 | * @internal
|
12655 | */
|
12656 |
|
12657 |
|
12658 | ReactServerUpdateQueue.prototype.enqueueReplaceState = function enqueueReplaceState(publicInstance, completeState) {
|
12659 | if (this.transaction.isInTransaction()) {
|
12660 | ReactUpdateQueue_1.enqueueReplaceState(publicInstance, completeState);
|
12661 | } else {
|
12662 | warnNoop$1(publicInstance, 'replaceState');
|
12663 | }
|
12664 | };
|
12665 |
|
12666 | /**
|
12667 | * Sets a subset of the state. This only exists because _pendingState is
|
12668 | * internal. This provides a merging strategy that is not available to deep
|
12669 | * properties which is confusing. TODO: Expose pendingState or don't use it
|
12670 | * during the merge.
|
12671 | *
|
12672 | * @param {ReactClass} publicInstance The instance that should rerender.
|
12673 | * @param {object|function} partialState Next partial state to be merged with state.
|
12674 | * @internal
|
12675 | */
|
12676 |
|
12677 |
|
12678 | ReactServerUpdateQueue.prototype.enqueueSetState = function enqueueSetState(publicInstance, partialState) {
|
12679 | if (this.transaction.isInTransaction()) {
|
12680 | ReactUpdateQueue_1.enqueueSetState(publicInstance, partialState);
|
12681 | } else {
|
12682 | warnNoop$1(publicInstance, 'setState');
|
12683 | }
|
12684 | };
|
12685 |
|
12686 | return ReactServerUpdateQueue;
|
12687 | }();
|
12688 |
|
12689 | var ReactServerUpdateQueue_1 = ReactServerUpdateQueue;
|
12690 |
|
12691 | /**
|
12692 | * Executed within the scope of the `Transaction` instance. Consider these as
|
12693 | * being member methods, but with an implied ordering while being isolated from
|
12694 | * each other.
|
12695 | */
|
12696 | var TRANSACTION_WRAPPERS$1 = [];
|
12697 |
|
12698 | var noopCallbackQueue = {
|
12699 | enqueue: function () {}
|
12700 | };
|
12701 |
|
12702 | /**
|
12703 | * @class ReactServerRenderingTransaction
|
12704 | * @param {boolean} renderToStaticMarkup
|
12705 | */
|
12706 | function ReactServerRenderingTransaction(renderToStaticMarkup) {
|
12707 | this.reinitializeTransaction();
|
12708 | this.renderToStaticMarkup = renderToStaticMarkup;
|
12709 | this.useCreateElement = false;
|
12710 | this.updateQueue = new ReactServerUpdateQueue_1(this);
|
12711 | }
|
12712 |
|
12713 | var Mixin = {
|
12714 | /**
|
12715 | * @see Transaction
|
12716 | * @abstract
|
12717 | * @final
|
12718 | * @return {array} Empty list of operation wrap procedures.
|
12719 | */
|
12720 | getTransactionWrappers: function () {
|
12721 | return TRANSACTION_WRAPPERS$1;
|
12722 | },
|
12723 |
|
12724 | /**
|
12725 | * @return {object} The queue to collect `onDOMReady` callbacks with.
|
12726 | */
|
12727 | getReactMountReady: function () {
|
12728 | return noopCallbackQueue;
|
12729 | },
|
12730 |
|
12731 | /**
|
12732 | * @return {object} The queue to collect React async events.
|
12733 | */
|
12734 | getUpdateQueue: function () {
|
12735 | return this.updateQueue;
|
12736 | },
|
12737 |
|
12738 | /**
|
12739 | * `PooledClass` looks for this, and will invoke this before allowing this
|
12740 | * instance to be reused.
|
12741 | */
|
12742 | destructor: function () {},
|
12743 |
|
12744 | checkpoint: function () {},
|
12745 |
|
12746 | rollback: function () {}
|
12747 | };
|
12748 |
|
12749 | objectAssign(ReactServerRenderingTransaction.prototype, Transaction, Mixin);
|
12750 |
|
12751 | PooledClass_1.addPoolingTo(ReactServerRenderingTransaction);
|
12752 |
|
12753 | var ReactServerRenderingTransaction_1 = ReactServerRenderingTransaction;
|
12754 |
|
12755 | var Flags$1 = ReactDOMComponentFlags_1;
|
12756 | var deleteListener = EventPluginHub_1.deleteListener;
|
12757 | var getNode = ReactDOMComponentTree_1.getNodeFromInstance;
|
12758 | var listenTo = ReactBrowserEventEmitter_1.listenTo;
|
12759 | var registrationNameModules = EventPluginRegistry_1.registrationNameModules;
|
12760 |
|
12761 | // For quickly matching children type, to test if can be treated as content.
|
12762 | var CONTENT_TYPES = { string: true, number: true };
|
12763 |
|
12764 | var STYLE = 'style';
|
12765 | var HTML = '__html';
|
12766 | var RESERVED_PROPS = {
|
12767 | children: null,
|
12768 | dangerouslySetInnerHTML: null,
|
12769 | suppressContentEditableWarning: null
|
12770 | };
|
12771 |
|
12772 | // Node type for document fragments (Node.DOCUMENT_FRAGMENT_NODE).
|
12773 | var DOC_FRAGMENT_TYPE = 11;
|
12774 |
|
12775 | function getDeclarationErrorAddendum(internalInstance) {
|
12776 | if (internalInstance) {
|
12777 | var owner = internalInstance._currentElement._owner || null;
|
12778 | if (owner) {
|
12779 | var name = owner.getName();
|
12780 | if (name) {
|
12781 | return ' This DOM node was rendered by `' + name + '`.';
|
12782 | }
|
12783 | }
|
12784 | }
|
12785 | return '';
|
12786 | }
|
12787 |
|
12788 | /**
|
12789 | * @param {object} component
|
12790 | * @param {?object} props
|
12791 | */
|
12792 | function assertValidProps(component, props) {
|
12793 | if (!props) {
|
12794 | return;
|
12795 | }
|
12796 | // Note the use of `==` which checks for null or undefined.
|
12797 | if (voidElementTags[component._tag]) {
|
12798 | !(props.children == null && props.dangerouslySetInnerHTML == null) ? reactProdInvariant_1('137', component._tag, component._currentElement._owner ? ' Check the render method of ' + component._currentElement._owner.getName() + '.' : '') : void 0;
|
12799 | }
|
12800 | if (props.dangerouslySetInnerHTML != null) {
|
12801 | !(props.children == null) ? reactProdInvariant_1('60') : void 0;
|
12802 | !(typeof props.dangerouslySetInnerHTML === 'object' && HTML in props.dangerouslySetInnerHTML) ? reactProdInvariant_1('61') : void 0;
|
12803 | }
|
12804 | !(props.style == null || typeof props.style === 'object') ? reactProdInvariant_1('62', getDeclarationErrorAddendum(component)) : void 0;
|
12805 | }
|
12806 |
|
12807 | function enqueuePutListener(inst, registrationName, listener, transaction) {
|
12808 | if (transaction instanceof ReactServerRenderingTransaction_1) {
|
12809 | return;
|
12810 | }
|
12811 | var containerInfo = inst._hostContainerInfo;
|
12812 | var isDocumentFragment = containerInfo._node && containerInfo._node.nodeType === DOC_FRAGMENT_TYPE;
|
12813 | var doc = isDocumentFragment ? containerInfo._node : containerInfo._ownerDocument;
|
12814 | listenTo(registrationName, doc);
|
12815 | transaction.getReactMountReady().enqueue(putListener, {
|
12816 | inst: inst,
|
12817 | registrationName: registrationName,
|
12818 | listener: listener
|
12819 | });
|
12820 | }
|
12821 |
|
12822 | function putListener() {
|
12823 | var listenerToPut = this;
|
12824 | EventPluginHub_1.putListener(listenerToPut.inst, listenerToPut.registrationName, listenerToPut.listener);
|
12825 | }
|
12826 |
|
12827 | function inputPostMount() {
|
12828 | var inst = this;
|
12829 | ReactDOMInput_1.postMountWrapper(inst);
|
12830 | }
|
12831 |
|
12832 | function textareaPostMount() {
|
12833 | var inst = this;
|
12834 | ReactDOMTextarea_1.postMountWrapper(inst);
|
12835 | }
|
12836 |
|
12837 | function optionPostMount() {
|
12838 | var inst = this;
|
12839 | ReactDOMOption_1.postMountWrapper(inst);
|
12840 | }
|
12841 |
|
12842 | // There are so many media events, it makes sense to just
|
12843 | // maintain a list rather than create a `trapBubbledEvent` for each
|
12844 | var mediaEvents = {
|
12845 | topAbort: 'abort',
|
12846 | topCanPlay: 'canplay',
|
12847 | topCanPlayThrough: 'canplaythrough',
|
12848 | topDurationChange: 'durationchange',
|
12849 | topEmptied: 'emptied',
|
12850 | topEncrypted: 'encrypted',
|
12851 | topEnded: 'ended',
|
12852 | topError: 'error',
|
12853 | topLoadedData: 'loadeddata',
|
12854 | topLoadedMetadata: 'loadedmetadata',
|
12855 | topLoadStart: 'loadstart',
|
12856 | topPause: 'pause',
|
12857 | topPlay: 'play',
|
12858 | topPlaying: 'playing',
|
12859 | topProgress: 'progress',
|
12860 | topRateChange: 'ratechange',
|
12861 | topSeeked: 'seeked',
|
12862 | topSeeking: 'seeking',
|
12863 | topStalled: 'stalled',
|
12864 | topSuspend: 'suspend',
|
12865 | topTimeUpdate: 'timeupdate',
|
12866 | topVolumeChange: 'volumechange',
|
12867 | topWaiting: 'waiting'
|
12868 | };
|
12869 |
|
12870 | function trackInputValue() {
|
12871 | inputValueTracking_1.track(this);
|
12872 | }
|
12873 |
|
12874 | function trapBubbledEventsLocal() {
|
12875 | var inst = this;
|
12876 | // If a component renders to null or if another component fatals and causes
|
12877 | // the state of the tree to be corrupted, `node` here can be null.
|
12878 | !inst._rootNodeID ? reactProdInvariant_1('63') : void 0;
|
12879 | var node = getNode(inst);
|
12880 | !node ? reactProdInvariant_1('64') : void 0;
|
12881 |
|
12882 | switch (inst._tag) {
|
12883 | case 'iframe':
|
12884 | case 'object':
|
12885 | inst._wrapperState.listeners = [ReactBrowserEventEmitter_1.trapBubbledEvent('topLoad', 'load', node)];
|
12886 | break;
|
12887 | case 'video':
|
12888 | case 'audio':
|
12889 | inst._wrapperState.listeners = [];
|
12890 | // Create listener for each media event
|
12891 | for (var event in mediaEvents) {
|
12892 | if (mediaEvents.hasOwnProperty(event)) {
|
12893 | inst._wrapperState.listeners.push(ReactBrowserEventEmitter_1.trapBubbledEvent(event, mediaEvents[event], node));
|
12894 | }
|
12895 | }
|
12896 | break;
|
12897 | case 'source':
|
12898 | inst._wrapperState.listeners = [ReactBrowserEventEmitter_1.trapBubbledEvent('topError', 'error', node)];
|
12899 | break;
|
12900 | case 'img':
|
12901 | inst._wrapperState.listeners = [ReactBrowserEventEmitter_1.trapBubbledEvent('topError', 'error', node), ReactBrowserEventEmitter_1.trapBubbledEvent('topLoad', 'load', node)];
|
12902 | break;
|
12903 | case 'form':
|
12904 | inst._wrapperState.listeners = [ReactBrowserEventEmitter_1.trapBubbledEvent('topReset', 'reset', node), ReactBrowserEventEmitter_1.trapBubbledEvent('topSubmit', 'submit', node)];
|
12905 | break;
|
12906 | case 'input':
|
12907 | case 'select':
|
12908 | case 'textarea':
|
12909 | inst._wrapperState.listeners = [ReactBrowserEventEmitter_1.trapBubbledEvent('topInvalid', 'invalid', node)];
|
12910 | break;
|
12911 | }
|
12912 | }
|
12913 |
|
12914 | function postUpdateSelectWrapper() {
|
12915 | ReactDOMSelect_1.postUpdateWrapper(this);
|
12916 | }
|
12917 |
|
12918 | // For HTML, certain tags should omit their close tag. We keep a whitelist for
|
12919 | // those special-case tags.
|
12920 |
|
12921 | var omittedCloseTags = {
|
12922 | area: true,
|
12923 | base: true,
|
12924 | br: true,
|
12925 | col: true,
|
12926 | embed: true,
|
12927 | hr: true,
|
12928 | img: true,
|
12929 | input: true,
|
12930 | keygen: true,
|
12931 | link: true,
|
12932 | meta: true,
|
12933 | param: true,
|
12934 | source: true,
|
12935 | track: true,
|
12936 | wbr: true
|
12937 | // NOTE: menuitem's close tag should be omitted, but that causes problems.
|
12938 | };
|
12939 |
|
12940 | var newlineEatingTags = {
|
12941 | listing: true,
|
12942 | pre: true,
|
12943 | textarea: true
|
12944 | };
|
12945 |
|
12946 | // For HTML, certain tags cannot have children. This has the same purpose as
|
12947 | // `omittedCloseTags` except that `menuitem` should still have its closing tag.
|
12948 |
|
12949 | var voidElementTags = objectAssign({
|
12950 | menuitem: true
|
12951 | }, omittedCloseTags);
|
12952 |
|
12953 | // We accept any tag to be rendered but since this gets injected into arbitrary
|
12954 | // HTML, we want to make sure that it's a safe tag.
|
12955 | // http://www.w3.org/TR/REC-xml/#NT-Name
|
12956 |
|
12957 | var VALID_TAG_REGEX = /^[a-zA-Z][a-zA-Z:_\.\-\d]*$/; // Simplified subset
|
12958 | var validatedTagCache = {};
|
12959 | var hasOwnProperty$1 = {}.hasOwnProperty;
|
12960 |
|
12961 | function validateDangerousTag(tag) {
|
12962 | if (!hasOwnProperty$1.call(validatedTagCache, tag)) {
|
12963 | !VALID_TAG_REGEX.test(tag) ? reactProdInvariant_1('65', tag) : void 0;
|
12964 | validatedTagCache[tag] = true;
|
12965 | }
|
12966 | }
|
12967 |
|
12968 | function isCustomComponent(tagName, props) {
|
12969 | return tagName.indexOf('-') >= 0 || props.is != null;
|
12970 | }
|
12971 |
|
12972 | var globalIdCounter = 1;
|
12973 |
|
12974 | /**
|
12975 | * Creates a new React class that is idempotent and capable of containing other
|
12976 | * React components. It accepts event listeners and DOM properties that are
|
12977 | * valid according to `DOMProperty`.
|
12978 | *
|
12979 | * - Event listeners: `onClick`, `onMouseDown`, etc.
|
12980 | * - DOM properties: `className`, `name`, `title`, etc.
|
12981 | *
|
12982 | * The `style` property functions differently from the DOM API. It accepts an
|
12983 | * object mapping of style properties to values.
|
12984 | *
|
12985 | * @constructor ReactDOMComponent
|
12986 | * @extends ReactMultiChild
|
12987 | */
|
12988 | function ReactDOMComponent(element) {
|
12989 | var tag = element.type;
|
12990 | validateDangerousTag(tag);
|
12991 | this._currentElement = element;
|
12992 | this._tag = tag.toLowerCase();
|
12993 | this._namespaceURI = null;
|
12994 | this._renderedChildren = null;
|
12995 | this._previousStyle = null;
|
12996 | this._previousStyleCopy = null;
|
12997 | this._hostNode = null;
|
12998 | this._hostParent = null;
|
12999 | this._rootNodeID = 0;
|
13000 | this._domID = 0;
|
13001 | this._hostContainerInfo = null;
|
13002 | this._wrapperState = null;
|
13003 | this._topLevelWrapper = null;
|
13004 | this._flags = 0;
|
13005 |
|
13006 | }
|
13007 |
|
13008 | ReactDOMComponent.displayName = 'ReactDOMComponent';
|
13009 |
|
13010 | ReactDOMComponent.Mixin = {
|
13011 | /**
|
13012 | * Generates root tag markup then recurses. This method has side effects and
|
13013 | * is not idempotent.
|
13014 | *
|
13015 | * @internal
|
13016 | * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction
|
13017 | * @param {?ReactDOMComponent} the parent component instance
|
13018 | * @param {?object} info about the host container
|
13019 | * @param {object} context
|
13020 | * @return {string} The computed markup.
|
13021 | */
|
13022 | mountComponent: function (transaction, hostParent, hostContainerInfo, context) {
|
13023 | this._rootNodeID = globalIdCounter++;
|
13024 | this._domID = hostContainerInfo._idCounter++;
|
13025 | this._hostParent = hostParent;
|
13026 | this._hostContainerInfo = hostContainerInfo;
|
13027 |
|
13028 | var props = this._currentElement.props;
|
13029 |
|
13030 | switch (this._tag) {
|
13031 | case 'audio':
|
13032 | case 'form':
|
13033 | case 'iframe':
|
13034 | case 'img':
|
13035 | case 'link':
|
13036 | case 'object':
|
13037 | case 'source':
|
13038 | case 'video':
|
13039 | this._wrapperState = {
|
13040 | listeners: null
|
13041 | };
|
13042 | transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this);
|
13043 | break;
|
13044 | case 'input':
|
13045 | ReactDOMInput_1.mountWrapper(this, props, hostParent);
|
13046 | props = ReactDOMInput_1.getHostProps(this, props);
|
13047 | transaction.getReactMountReady().enqueue(trackInputValue, this);
|
13048 | transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this);
|
13049 | break;
|
13050 | case 'option':
|
13051 | ReactDOMOption_1.mountWrapper(this, props, hostParent);
|
13052 | props = ReactDOMOption_1.getHostProps(this, props);
|
13053 | break;
|
13054 | case 'select':
|
13055 | ReactDOMSelect_1.mountWrapper(this, props, hostParent);
|
13056 | props = ReactDOMSelect_1.getHostProps(this, props);
|
13057 | transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this);
|
13058 | break;
|
13059 | case 'textarea':
|
13060 | ReactDOMTextarea_1.mountWrapper(this, props, hostParent);
|
13061 | props = ReactDOMTextarea_1.getHostProps(this, props);
|
13062 | transaction.getReactMountReady().enqueue(trackInputValue, this);
|
13063 | transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this);
|
13064 | break;
|
13065 | }
|
13066 |
|
13067 | assertValidProps(this, props);
|
13068 |
|
13069 | // We create tags in the namespace of their parent container, except HTML
|
13070 | // tags get no namespace.
|
13071 | var namespaceURI;
|
13072 | var parentTag;
|
13073 | if (hostParent != null) {
|
13074 | namespaceURI = hostParent._namespaceURI;
|
13075 | parentTag = hostParent._tag;
|
13076 | } else if (hostContainerInfo._tag) {
|
13077 | namespaceURI = hostContainerInfo._namespaceURI;
|
13078 | parentTag = hostContainerInfo._tag;
|
13079 | }
|
13080 | if (namespaceURI == null || namespaceURI === DOMNamespaces_1.svg && parentTag === 'foreignobject') {
|
13081 | namespaceURI = DOMNamespaces_1.html;
|
13082 | }
|
13083 | if (namespaceURI === DOMNamespaces_1.html) {
|
13084 | if (this._tag === 'svg') {
|
13085 | namespaceURI = DOMNamespaces_1.svg;
|
13086 | } else if (this._tag === 'math') {
|
13087 | namespaceURI = DOMNamespaces_1.mathml;
|
13088 | }
|
13089 | }
|
13090 | this._namespaceURI = namespaceURI;
|
13091 |
|
13092 | var mountImage;
|
13093 | if (transaction.useCreateElement) {
|
13094 | var ownerDocument = hostContainerInfo._ownerDocument;
|
13095 | var el;
|
13096 | if (namespaceURI === DOMNamespaces_1.html) {
|
13097 | if (this._tag === 'script') {
|
13098 | // Create the script via .innerHTML so its "parser-inserted" flag is
|
13099 | // set to true and it does not execute
|
13100 | var div = ownerDocument.createElement('div');
|
13101 | var type = this._currentElement.type;
|
13102 | div.innerHTML = '<' + type + '></' + type + '>';
|
13103 | el = div.removeChild(div.firstChild);
|
13104 | } else if (props.is) {
|
13105 | el = ownerDocument.createElement(this._currentElement.type, props.is);
|
13106 | } else {
|
13107 | // Separate else branch instead of using `props.is || undefined` above becuase of a Firefox bug.
|
13108 | // See discussion in https://github.com/facebook/react/pull/6896
|
13109 | // and discussion in https://bugzilla.mozilla.org/show_bug.cgi?id=1276240
|
13110 | el = ownerDocument.createElement(this._currentElement.type);
|
13111 | }
|
13112 | } else {
|
13113 | el = ownerDocument.createElementNS(namespaceURI, this._currentElement.type);
|
13114 | }
|
13115 | ReactDOMComponentTree_1.precacheNode(this, el);
|
13116 | this._flags |= Flags$1.hasCachedChildNodes;
|
13117 | if (!this._hostParent) {
|
13118 | DOMPropertyOperations_1.setAttributeForRoot(el);
|
13119 | }
|
13120 | this._updateDOMProperties(null, props, transaction);
|
13121 | var lazyTree = DOMLazyTree_1(el);
|
13122 | this._createInitialChildren(transaction, props, context, lazyTree);
|
13123 | mountImage = lazyTree;
|
13124 | } else {
|
13125 | var tagOpen = this._createOpenTagMarkupAndPutListeners(transaction, props);
|
13126 | var tagContent = this._createContentMarkup(transaction, props, context);
|
13127 | if (!tagContent && omittedCloseTags[this._tag]) {
|
13128 | mountImage = tagOpen + '/>';
|
13129 | } else {
|
13130 | mountImage = tagOpen + '>' + tagContent + '</' + this._currentElement.type + '>';
|
13131 | }
|
13132 | }
|
13133 |
|
13134 | switch (this._tag) {
|
13135 | case 'input':
|
13136 | transaction.getReactMountReady().enqueue(inputPostMount, this);
|
13137 | if (props.autoFocus) {
|
13138 | transaction.getReactMountReady().enqueue(AutoFocusUtils_1.focusDOMComponent, this);
|
13139 | }
|
13140 | break;
|
13141 | case 'textarea':
|
13142 | transaction.getReactMountReady().enqueue(textareaPostMount, this);
|
13143 | if (props.autoFocus) {
|
13144 | transaction.getReactMountReady().enqueue(AutoFocusUtils_1.focusDOMComponent, this);
|
13145 | }
|
13146 | break;
|
13147 | case 'select':
|
13148 | if (props.autoFocus) {
|
13149 | transaction.getReactMountReady().enqueue(AutoFocusUtils_1.focusDOMComponent, this);
|
13150 | }
|
13151 | break;
|
13152 | case 'button':
|
13153 | if (props.autoFocus) {
|
13154 | transaction.getReactMountReady().enqueue(AutoFocusUtils_1.focusDOMComponent, this);
|
13155 | }
|
13156 | break;
|
13157 | case 'option':
|
13158 | transaction.getReactMountReady().enqueue(optionPostMount, this);
|
13159 | break;
|
13160 | }
|
13161 |
|
13162 | return mountImage;
|
13163 | },
|
13164 |
|
13165 | /**
|
13166 | * Creates markup for the open tag and all attributes.
|
13167 | *
|
13168 | * This method has side effects because events get registered.
|
13169 | *
|
13170 | * Iterating over object properties is faster than iterating over arrays.
|
13171 | * @see http://jsperf.com/obj-vs-arr-iteration
|
13172 | *
|
13173 | * @private
|
13174 | * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction
|
13175 | * @param {object} props
|
13176 | * @return {string} Markup of opening tag.
|
13177 | */
|
13178 | _createOpenTagMarkupAndPutListeners: function (transaction, props) {
|
13179 | var ret = '<' + this._currentElement.type;
|
13180 |
|
13181 | for (var propKey in props) {
|
13182 | if (!props.hasOwnProperty(propKey)) {
|
13183 | continue;
|
13184 | }
|
13185 | var propValue = props[propKey];
|
13186 | if (propValue == null) {
|
13187 | continue;
|
13188 | }
|
13189 | if (registrationNameModules.hasOwnProperty(propKey)) {
|
13190 | if (propValue) {
|
13191 | enqueuePutListener(this, propKey, propValue, transaction);
|
13192 | }
|
13193 | } else {
|
13194 | if (propKey === STYLE) {
|
13195 | if (propValue) {
|
13196 | propValue = this._previousStyleCopy = objectAssign({}, props.style);
|
13197 | }
|
13198 | propValue = CSSPropertyOperations_1.createMarkupForStyles(propValue, this);
|
13199 | }
|
13200 | var markup = null;
|
13201 | if (this._tag != null && isCustomComponent(this._tag, props)) {
|
13202 | if (!RESERVED_PROPS.hasOwnProperty(propKey)) {
|
13203 | markup = DOMPropertyOperations_1.createMarkupForCustomAttribute(propKey, propValue);
|
13204 | }
|
13205 | } else {
|
13206 | markup = DOMPropertyOperations_1.createMarkupForProperty(propKey, propValue);
|
13207 | }
|
13208 | if (markup) {
|
13209 | ret += ' ' + markup;
|
13210 | }
|
13211 | }
|
13212 | }
|
13213 |
|
13214 | // For static pages, no need to put React ID and checksum. Saves lots of
|
13215 | // bytes.
|
13216 | if (transaction.renderToStaticMarkup) {
|
13217 | return ret;
|
13218 | }
|
13219 |
|
13220 | if (!this._hostParent) {
|
13221 | ret += ' ' + DOMPropertyOperations_1.createMarkupForRoot();
|
13222 | }
|
13223 | ret += ' ' + DOMPropertyOperations_1.createMarkupForID(this._domID);
|
13224 | return ret;
|
13225 | },
|
13226 |
|
13227 | /**
|
13228 | * Creates markup for the content between the tags.
|
13229 | *
|
13230 | * @private
|
13231 | * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction
|
13232 | * @param {object} props
|
13233 | * @param {object} context
|
13234 | * @return {string} Content markup.
|
13235 | */
|
13236 | _createContentMarkup: function (transaction, props, context) {
|
13237 | var ret = '';
|
13238 |
|
13239 | // Intentional use of != to avoid catching zero/false.
|
13240 | var innerHTML = props.dangerouslySetInnerHTML;
|
13241 | if (innerHTML != null) {
|
13242 | if (innerHTML.__html != null) {
|
13243 | ret = innerHTML.__html;
|
13244 | }
|
13245 | } else {
|
13246 | var contentToUse = CONTENT_TYPES[typeof props.children] ? props.children : null;
|
13247 | var childrenToUse = contentToUse != null ? null : props.children;
|
13248 | if (contentToUse != null) {
|
13249 | // TODO: Validate that text is allowed as a child of this node
|
13250 | ret = escapeTextContentForBrowser_1(contentToUse);
|
13251 |
|
13252 | } else if (childrenToUse != null) {
|
13253 | var mountImages = this.mountChildren(childrenToUse, transaction, context);
|
13254 | ret = mountImages.join('');
|
13255 | }
|
13256 | }
|
13257 | if (newlineEatingTags[this._tag] && ret.charAt(0) === '\n') {
|
13258 | // text/html ignores the first character in these tags if it's a newline
|
13259 | // Prefer to break application/xml over text/html (for now) by adding
|
13260 | // a newline specifically to get eaten by the parser. (Alternately for
|
13261 | // textareas, replacing "^\n" with "\r\n" doesn't get eaten, and the first
|
13262 | // \r is normalized out by HTMLTextAreaElement#value.)
|
13263 | // See: <http://www.w3.org/TR/html-polyglot/#newlines-in-textarea-and-pre>
|
13264 | // See: <http://www.w3.org/TR/html5/syntax.html#element-restrictions>
|
13265 | // See: <http://www.w3.org/TR/html5/syntax.html#newlines>
|
13266 | // See: Parsing of "textarea" "listing" and "pre" elements
|
13267 | // from <http://www.w3.org/TR/html5/syntax.html#parsing-main-inbody>
|
13268 | return '\n' + ret;
|
13269 | } else {
|
13270 | return ret;
|
13271 | }
|
13272 | },
|
13273 |
|
13274 | _createInitialChildren: function (transaction, props, context, lazyTree) {
|
13275 | // Intentional use of != to avoid catching zero/false.
|
13276 | var innerHTML = props.dangerouslySetInnerHTML;
|
13277 | if (innerHTML != null) {
|
13278 | if (innerHTML.__html != null) {
|
13279 | DOMLazyTree_1.queueHTML(lazyTree, innerHTML.__html);
|
13280 | }
|
13281 | } else {
|
13282 | var contentToUse = CONTENT_TYPES[typeof props.children] ? props.children : null;
|
13283 | var childrenToUse = contentToUse != null ? null : props.children;
|
13284 | // TODO: Validate that text is allowed as a child of this node
|
13285 | if (contentToUse != null) {
|
13286 | // Avoid setting textContent when the text is empty. In IE11 setting
|
13287 | // textContent on a text area will cause the placeholder to not
|
13288 | // show within the textarea until it has been focused and blurred again.
|
13289 | // https://github.com/facebook/react/issues/6731#issuecomment-254874553
|
13290 | if (contentToUse !== '') {
|
13291 | DOMLazyTree_1.queueText(lazyTree, contentToUse);
|
13292 | }
|
13293 | } else if (childrenToUse != null) {
|
13294 | var mountImages = this.mountChildren(childrenToUse, transaction, context);
|
13295 | for (var i = 0; i < mountImages.length; i++) {
|
13296 | DOMLazyTree_1.queueChild(lazyTree, mountImages[i]);
|
13297 | }
|
13298 | }
|
13299 | }
|
13300 | },
|
13301 |
|
13302 | /**
|
13303 | * Receives a next element and updates the component.
|
13304 | *
|
13305 | * @internal
|
13306 | * @param {ReactElement} nextElement
|
13307 | * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction
|
13308 | * @param {object} context
|
13309 | */
|
13310 | receiveComponent: function (nextElement, transaction, context) {
|
13311 | var prevElement = this._currentElement;
|
13312 | this._currentElement = nextElement;
|
13313 | this.updateComponent(transaction, prevElement, nextElement, context);
|
13314 | },
|
13315 |
|
13316 | /**
|
13317 | * Updates a DOM component after it has already been allocated and
|
13318 | * attached to the DOM. Reconciles the root DOM node, then recurses.
|
13319 | *
|
13320 | * @param {ReactReconcileTransaction} transaction
|
13321 | * @param {ReactElement} prevElement
|
13322 | * @param {ReactElement} nextElement
|
13323 | * @internal
|
13324 | * @overridable
|
13325 | */
|
13326 | updateComponent: function (transaction, prevElement, nextElement, context) {
|
13327 | var lastProps = prevElement.props;
|
13328 | var nextProps = this._currentElement.props;
|
13329 |
|
13330 | switch (this._tag) {
|
13331 | case 'input':
|
13332 | lastProps = ReactDOMInput_1.getHostProps(this, lastProps);
|
13333 | nextProps = ReactDOMInput_1.getHostProps(this, nextProps);
|
13334 | break;
|
13335 | case 'option':
|
13336 | lastProps = ReactDOMOption_1.getHostProps(this, lastProps);
|
13337 | nextProps = ReactDOMOption_1.getHostProps(this, nextProps);
|
13338 | break;
|
13339 | case 'select':
|
13340 | lastProps = ReactDOMSelect_1.getHostProps(this, lastProps);
|
13341 | nextProps = ReactDOMSelect_1.getHostProps(this, nextProps);
|
13342 | break;
|
13343 | case 'textarea':
|
13344 | lastProps = ReactDOMTextarea_1.getHostProps(this, lastProps);
|
13345 | nextProps = ReactDOMTextarea_1.getHostProps(this, nextProps);
|
13346 | break;
|
13347 | }
|
13348 |
|
13349 | assertValidProps(this, nextProps);
|
13350 | this._updateDOMProperties(lastProps, nextProps, transaction);
|
13351 | this._updateDOMChildren(lastProps, nextProps, transaction, context);
|
13352 |
|
13353 | switch (this._tag) {
|
13354 | case 'input':
|
13355 | // Update the wrapper around inputs *after* updating props. This has to
|
13356 | // happen after `_updateDOMProperties`. Otherwise HTML5 input validations
|
13357 | // raise warnings and prevent the new value from being assigned.
|
13358 | ReactDOMInput_1.updateWrapper(this);
|
13359 | break;
|
13360 | case 'textarea':
|
13361 | ReactDOMTextarea_1.updateWrapper(this);
|
13362 | break;
|
13363 | case 'select':
|
13364 | // <select> value update needs to occur after <option> children
|
13365 | // reconciliation
|
13366 | transaction.getReactMountReady().enqueue(postUpdateSelectWrapper, this);
|
13367 | break;
|
13368 | }
|
13369 | },
|
13370 |
|
13371 | /**
|
13372 | * Reconciles the properties by detecting differences in property values and
|
13373 | * updating the DOM as necessary. This function is probably the single most
|
13374 | * critical path for performance optimization.
|
13375 | *
|
13376 | * TODO: Benchmark whether checking for changed values in memory actually
|
13377 | * improves performance (especially statically positioned elements).
|
13378 | * TODO: Benchmark the effects of putting this at the top since 99% of props
|
13379 | * do not change for a given reconciliation.
|
13380 | * TODO: Benchmark areas that can be improved with caching.
|
13381 | *
|
13382 | * @private
|
13383 | * @param {object} lastProps
|
13384 | * @param {object} nextProps
|
13385 | * @param {?DOMElement} node
|
13386 | */
|
13387 | _updateDOMProperties: function (lastProps, nextProps, transaction) {
|
13388 | var propKey;
|
13389 | var styleName;
|
13390 | var styleUpdates;
|
13391 | for (propKey in lastProps) {
|
13392 | if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) {
|
13393 | continue;
|
13394 | }
|
13395 | if (propKey === STYLE) {
|
13396 | var lastStyle = this._previousStyleCopy;
|
13397 | for (styleName in lastStyle) {
|
13398 | if (lastStyle.hasOwnProperty(styleName)) {
|
13399 | styleUpdates = styleUpdates || {};
|
13400 | styleUpdates[styleName] = '';
|
13401 | }
|
13402 | }
|
13403 | this._previousStyleCopy = null;
|
13404 | } else if (registrationNameModules.hasOwnProperty(propKey)) {
|
13405 | if (lastProps[propKey]) {
|
13406 | // Only call deleteListener if there was a listener previously or
|
13407 | // else willDeleteListener gets called when there wasn't actually a
|
13408 | // listener (e.g., onClick={null})
|
13409 | deleteListener(this, propKey);
|
13410 | }
|
13411 | } else if (isCustomComponent(this._tag, lastProps)) {
|
13412 | if (!RESERVED_PROPS.hasOwnProperty(propKey)) {
|
13413 | DOMPropertyOperations_1.deleteValueForAttribute(getNode(this), propKey);
|
13414 | }
|
13415 | } else if (DOMProperty_1.properties[propKey] || DOMProperty_1.isCustomAttribute(propKey)) {
|
13416 | DOMPropertyOperations_1.deleteValueForProperty(getNode(this), propKey);
|
13417 | }
|
13418 | }
|
13419 | for (propKey in nextProps) {
|
13420 | var nextProp = nextProps[propKey];
|
13421 | var lastProp = propKey === STYLE ? this._previousStyleCopy : lastProps != null ? lastProps[propKey] : undefined;
|
13422 | if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) {
|
13423 | continue;
|
13424 | }
|
13425 | if (propKey === STYLE) {
|
13426 | if (nextProp) {
|
13427 | nextProp = this._previousStyleCopy = objectAssign({}, nextProp);
|
13428 | } else {
|
13429 | this._previousStyleCopy = null;
|
13430 | }
|
13431 | if (lastProp) {
|
13432 | // Unset styles on `lastProp` but not on `nextProp`.
|
13433 | for (styleName in lastProp) {
|
13434 | if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) {
|
13435 | styleUpdates = styleUpdates || {};
|
13436 | styleUpdates[styleName] = '';
|
13437 | }
|
13438 | }
|
13439 | // Update styles that changed since `lastProp`.
|
13440 | for (styleName in nextProp) {
|
13441 | if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) {
|
13442 | styleUpdates = styleUpdates || {};
|
13443 | styleUpdates[styleName] = nextProp[styleName];
|
13444 | }
|
13445 | }
|
13446 | } else {
|
13447 | // Relies on `updateStylesByID` not mutating `styleUpdates`.
|
13448 | styleUpdates = nextProp;
|
13449 | }
|
13450 | } else if (registrationNameModules.hasOwnProperty(propKey)) {
|
13451 | if (nextProp) {
|
13452 | enqueuePutListener(this, propKey, nextProp, transaction);
|
13453 | } else if (lastProp) {
|
13454 | deleteListener(this, propKey);
|
13455 | }
|
13456 | } else if (isCustomComponent(this._tag, nextProps)) {
|
13457 | if (!RESERVED_PROPS.hasOwnProperty(propKey)) {
|
13458 | DOMPropertyOperations_1.setValueForAttribute(getNode(this), propKey, nextProp);
|
13459 | }
|
13460 | } else if (DOMProperty_1.properties[propKey] || DOMProperty_1.isCustomAttribute(propKey)) {
|
13461 | var node = getNode(this);
|
13462 | // If we're updating to null or undefined, we should remove the property
|
13463 | // from the DOM node instead of inadvertently setting to a string. This
|
13464 | // brings us in line with the same behavior we have on initial render.
|
13465 | if (nextProp != null) {
|
13466 | DOMPropertyOperations_1.setValueForProperty(node, propKey, nextProp);
|
13467 | } else {
|
13468 | DOMPropertyOperations_1.deleteValueForProperty(node, propKey);
|
13469 | }
|
13470 | }
|
13471 | }
|
13472 | if (styleUpdates) {
|
13473 | CSSPropertyOperations_1.setValueForStyles(getNode(this), styleUpdates, this);
|
13474 | }
|
13475 | },
|
13476 |
|
13477 | /**
|
13478 | * Reconciles the children with the various properties that affect the
|
13479 | * children content.
|
13480 | *
|
13481 | * @param {object} lastProps
|
13482 | * @param {object} nextProps
|
13483 | * @param {ReactReconcileTransaction} transaction
|
13484 | * @param {object} context
|
13485 | */
|
13486 | _updateDOMChildren: function (lastProps, nextProps, transaction, context) {
|
13487 | var lastContent = CONTENT_TYPES[typeof lastProps.children] ? lastProps.children : null;
|
13488 | var nextContent = CONTENT_TYPES[typeof nextProps.children] ? nextProps.children : null;
|
13489 |
|
13490 | var lastHtml = lastProps.dangerouslySetInnerHTML && lastProps.dangerouslySetInnerHTML.__html;
|
13491 | var nextHtml = nextProps.dangerouslySetInnerHTML && nextProps.dangerouslySetInnerHTML.__html;
|
13492 |
|
13493 | // Note the use of `!=` which checks for null or undefined.
|
13494 | var lastChildren = lastContent != null ? null : lastProps.children;
|
13495 | var nextChildren = nextContent != null ? null : nextProps.children;
|
13496 |
|
13497 | // If we're switching from children to content/html or vice versa, remove
|
13498 | // the old content
|
13499 | var lastHasContentOrHtml = lastContent != null || lastHtml != null;
|
13500 | var nextHasContentOrHtml = nextContent != null || nextHtml != null;
|
13501 | if (lastChildren != null && nextChildren == null) {
|
13502 | this.updateChildren(null, transaction, context);
|
13503 | } else if (lastHasContentOrHtml && !nextHasContentOrHtml) {
|
13504 | this.updateTextContent('');
|
13505 |
|
13506 | }
|
13507 |
|
13508 | if (nextContent != null) {
|
13509 | if (lastContent !== nextContent) {
|
13510 | this.updateTextContent('' + nextContent);
|
13511 |
|
13512 | }
|
13513 | } else if (nextHtml != null) {
|
13514 | if (lastHtml !== nextHtml) {
|
13515 | this.updateMarkup('' + nextHtml);
|
13516 | }
|
13517 |
|
13518 | } else if (nextChildren != null) {
|
13519 | this.updateChildren(nextChildren, transaction, context);
|
13520 | }
|
13521 | },
|
13522 |
|
13523 | getHostNode: function () {
|
13524 | return getNode(this);
|
13525 | },
|
13526 |
|
13527 | /**
|
13528 | * Destroys all event registrations for this instance. Does not remove from
|
13529 | * the DOM. That must be done by the parent.
|
13530 | *
|
13531 | * @internal
|
13532 | */
|
13533 | unmountComponent: function (safely) {
|
13534 | switch (this._tag) {
|
13535 | case 'audio':
|
13536 | case 'form':
|
13537 | case 'iframe':
|
13538 | case 'img':
|
13539 | case 'link':
|
13540 | case 'object':
|
13541 | case 'source':
|
13542 | case 'video':
|
13543 | var listeners = this._wrapperState.listeners;
|
13544 | if (listeners) {
|
13545 | for (var i = 0; i < listeners.length; i++) {
|
13546 | listeners[i].remove();
|
13547 | }
|
13548 | }
|
13549 | break;
|
13550 | case 'input':
|
13551 | case 'textarea':
|
13552 | inputValueTracking_1.stopTracking(this);
|
13553 | break;
|
13554 | case 'html':
|
13555 | case 'head':
|
13556 | case 'body':
|
13557 | /**
|
13558 | * Components like <html> <head> and <body> can't be removed or added
|
13559 | * easily in a cross-browser way, however it's valuable to be able to
|
13560 | * take advantage of React's reconciliation for styling and <title>
|
13561 | * management. So we just document it and throw in dangerous cases.
|
13562 | */
|
13563 | reactProdInvariant_1('66', this._tag);
|
13564 | break;
|
13565 | }
|
13566 |
|
13567 | this.unmountChildren(safely);
|
13568 | ReactDOMComponentTree_1.uncacheNode(this);
|
13569 | EventPluginHub_1.deleteAllListeners(this);
|
13570 | this._rootNodeID = 0;
|
13571 | this._domID = 0;
|
13572 | this._wrapperState = null;
|
13573 |
|
13574 |
|
13575 | },
|
13576 |
|
13577 | getPublicInstance: function () {
|
13578 | return getNode(this);
|
13579 | }
|
13580 | };
|
13581 |
|
13582 | objectAssign(ReactDOMComponent.prototype, ReactDOMComponent.Mixin, ReactMultiChild_1.Mixin);
|
13583 |
|
13584 | var ReactDOMComponent_1 = ReactDOMComponent;
|
13585 |
|
13586 | var ReactDOMEmptyComponent = function (instantiate) {
|
13587 | // ReactCompositeComponent uses this:
|
13588 | this._currentElement = null;
|
13589 | // ReactDOMComponentTree uses these:
|
13590 | this._hostNode = null;
|
13591 | this._hostParent = null;
|
13592 | this._hostContainerInfo = null;
|
13593 | this._domID = 0;
|
13594 | };
|
13595 | objectAssign(ReactDOMEmptyComponent.prototype, {
|
13596 | mountComponent: function (transaction, hostParent, hostContainerInfo, context) {
|
13597 | var domID = hostContainerInfo._idCounter++;
|
13598 | this._domID = domID;
|
13599 | this._hostParent = hostParent;
|
13600 | this._hostContainerInfo = hostContainerInfo;
|
13601 |
|
13602 | var nodeValue = ' react-empty: ' + this._domID + ' ';
|
13603 | if (transaction.useCreateElement) {
|
13604 | var ownerDocument = hostContainerInfo._ownerDocument;
|
13605 | var node = ownerDocument.createComment(nodeValue);
|
13606 | ReactDOMComponentTree_1.precacheNode(this, node);
|
13607 | return DOMLazyTree_1(node);
|
13608 | } else {
|
13609 | if (transaction.renderToStaticMarkup) {
|
13610 | // Normally we'd insert a comment node, but since this is a situation
|
13611 | // where React won't take over (static pages), we can simply return
|
13612 | // nothing.
|
13613 | return '';
|
13614 | }
|
13615 | return '<!--' + nodeValue + '-->';
|
13616 | }
|
13617 | },
|
13618 | receiveComponent: function () {},
|
13619 | getHostNode: function () {
|
13620 | return ReactDOMComponentTree_1.getNodeFromInstance(this);
|
13621 | },
|
13622 | unmountComponent: function () {
|
13623 | ReactDOMComponentTree_1.uncacheNode(this);
|
13624 | }
|
13625 | });
|
13626 |
|
13627 | var ReactDOMEmptyComponent_1 = ReactDOMEmptyComponent;
|
13628 |
|
13629 | /**
|
13630 | * Return the lowest common ancestor of A and B, or null if they are in
|
13631 | * different trees.
|
13632 | */
|
13633 | function getLowestCommonAncestor(instA, instB) {
|
13634 | !('_hostNode' in instA) ? reactProdInvariant_1('33') : void 0;
|
13635 | !('_hostNode' in instB) ? reactProdInvariant_1('33') : void 0;
|
13636 |
|
13637 | var depthA = 0;
|
13638 | for (var tempA = instA; tempA; tempA = tempA._hostParent) {
|
13639 | depthA++;
|
13640 | }
|
13641 | var depthB = 0;
|
13642 | for (var tempB = instB; tempB; tempB = tempB._hostParent) {
|
13643 | depthB++;
|
13644 | }
|
13645 |
|
13646 | // If A is deeper, crawl up.
|
13647 | while (depthA - depthB > 0) {
|
13648 | instA = instA._hostParent;
|
13649 | depthA--;
|
13650 | }
|
13651 |
|
13652 | // If B is deeper, crawl up.
|
13653 | while (depthB - depthA > 0) {
|
13654 | instB = instB._hostParent;
|
13655 | depthB--;
|
13656 | }
|
13657 |
|
13658 | // Walk in lockstep until we find a match.
|
13659 | var depth = depthA;
|
13660 | while (depth--) {
|
13661 | if (instA === instB) {
|
13662 | return instA;
|
13663 | }
|
13664 | instA = instA._hostParent;
|
13665 | instB = instB._hostParent;
|
13666 | }
|
13667 | return null;
|
13668 | }
|
13669 |
|
13670 | /**
|
13671 | * Return if A is an ancestor of B.
|
13672 | */
|
13673 | function isAncestor(instA, instB) {
|
13674 | !('_hostNode' in instA) ? reactProdInvariant_1('35') : void 0;
|
13675 | !('_hostNode' in instB) ? reactProdInvariant_1('35') : void 0;
|
13676 |
|
13677 | while (instB) {
|
13678 | if (instB === instA) {
|
13679 | return true;
|
13680 | }
|
13681 | instB = instB._hostParent;
|
13682 | }
|
13683 | return false;
|
13684 | }
|
13685 |
|
13686 | /**
|
13687 | * Return the parent instance of the passed-in instance.
|
13688 | */
|
13689 | function getParentInstance(inst) {
|
13690 | !('_hostNode' in inst) ? reactProdInvariant_1('36') : void 0;
|
13691 |
|
13692 | return inst._hostParent;
|
13693 | }
|
13694 |
|
13695 | /**
|
13696 | * Simulates the traversal of a two-phase, capture/bubble event dispatch.
|
13697 | */
|
13698 | function traverseTwoPhase(inst, fn, arg) {
|
13699 | var path = [];
|
13700 | while (inst) {
|
13701 | path.push(inst);
|
13702 | inst = inst._hostParent;
|
13703 | }
|
13704 | var i;
|
13705 | for (i = path.length; i-- > 0;) {
|
13706 | fn(path[i], 'captured', arg);
|
13707 | }
|
13708 | for (i = 0; i < path.length; i++) {
|
13709 | fn(path[i], 'bubbled', arg);
|
13710 | }
|
13711 | }
|
13712 |
|
13713 | /**
|
13714 | * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that
|
13715 | * should would receive a `mouseEnter` or `mouseLeave` event.
|
13716 | *
|
13717 | * Does not invoke the callback on the nearest common ancestor because nothing
|
13718 | * "entered" or "left" that element.
|
13719 | */
|
13720 | function traverseEnterLeave(from, to, fn, argFrom, argTo) {
|
13721 | var common = from && to ? getLowestCommonAncestor(from, to) : null;
|
13722 | var pathFrom = [];
|
13723 | while (from && from !== common) {
|
13724 | pathFrom.push(from);
|
13725 | from = from._hostParent;
|
13726 | }
|
13727 | var pathTo = [];
|
13728 | while (to && to !== common) {
|
13729 | pathTo.push(to);
|
13730 | to = to._hostParent;
|
13731 | }
|
13732 | var i;
|
13733 | for (i = 0; i < pathFrom.length; i++) {
|
13734 | fn(pathFrom[i], 'bubbled', argFrom);
|
13735 | }
|
13736 | for (i = pathTo.length; i-- > 0;) {
|
13737 | fn(pathTo[i], 'captured', argTo);
|
13738 | }
|
13739 | }
|
13740 |
|
13741 | var ReactDOMTreeTraversal = {
|
13742 | isAncestor: isAncestor,
|
13743 | getLowestCommonAncestor: getLowestCommonAncestor,
|
13744 | getParentInstance: getParentInstance,
|
13745 | traverseTwoPhase: traverseTwoPhase,
|
13746 | traverseEnterLeave: traverseEnterLeave
|
13747 | };
|
13748 |
|
13749 | /**
|
13750 | * Text nodes violate a couple assumptions that React makes about components:
|
13751 | *
|
13752 | * - When mounting text into the DOM, adjacent text nodes are merged.
|
13753 | * - Text nodes cannot be assigned a React root ID.
|
13754 | *
|
13755 | * This component is used to wrap strings between comment nodes so that they
|
13756 | * can undergo the same reconciliation that is applied to elements.
|
13757 | *
|
13758 | * TODO: Investigate representing React components in the DOM with text nodes.
|
13759 | *
|
13760 | * @class ReactDOMTextComponent
|
13761 | * @extends ReactComponent
|
13762 | * @internal
|
13763 | */
|
13764 | var ReactDOMTextComponent = function (text) {
|
13765 | // TODO: This is really a ReactText (ReactNode), not a ReactElement
|
13766 | this._currentElement = text;
|
13767 | this._stringText = '' + text;
|
13768 | // ReactDOMComponentTree uses these:
|
13769 | this._hostNode = null;
|
13770 | this._hostParent = null;
|
13771 |
|
13772 | // Properties
|
13773 | this._domID = 0;
|
13774 | this._mountIndex = 0;
|
13775 | this._closingComment = null;
|
13776 | this._commentNodes = null;
|
13777 | };
|
13778 |
|
13779 | objectAssign(ReactDOMTextComponent.prototype, {
|
13780 | /**
|
13781 | * Creates the markup for this text node. This node is not intended to have
|
13782 | * any features besides containing text content.
|
13783 | *
|
13784 | * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction
|
13785 | * @return {string} Markup for this text node.
|
13786 | * @internal
|
13787 | */
|
13788 | mountComponent: function (transaction, hostParent, hostContainerInfo, context) {
|
13789 | var domID = hostContainerInfo._idCounter++;
|
13790 | var openingValue = ' react-text: ' + domID + ' ';
|
13791 | var closingValue = ' /react-text ';
|
13792 | this._domID = domID;
|
13793 | this._hostParent = hostParent;
|
13794 | if (transaction.useCreateElement) {
|
13795 | var ownerDocument = hostContainerInfo._ownerDocument;
|
13796 | var openingComment = ownerDocument.createComment(openingValue);
|
13797 | var closingComment = ownerDocument.createComment(closingValue);
|
13798 | var lazyTree = DOMLazyTree_1(ownerDocument.createDocumentFragment());
|
13799 | DOMLazyTree_1.queueChild(lazyTree, DOMLazyTree_1(openingComment));
|
13800 | if (this._stringText) {
|
13801 | DOMLazyTree_1.queueChild(lazyTree, DOMLazyTree_1(ownerDocument.createTextNode(this._stringText)));
|
13802 | }
|
13803 | DOMLazyTree_1.queueChild(lazyTree, DOMLazyTree_1(closingComment));
|
13804 | ReactDOMComponentTree_1.precacheNode(this, openingComment);
|
13805 | this._closingComment = closingComment;
|
13806 | return lazyTree;
|
13807 | } else {
|
13808 | var escapedText = escapeTextContentForBrowser_1(this._stringText);
|
13809 |
|
13810 | if (transaction.renderToStaticMarkup) {
|
13811 | // Normally we'd wrap this between comment nodes for the reasons stated
|
13812 | // above, but since this is a situation where React won't take over
|
13813 | // (static pages), we can simply return the text as it is.
|
13814 | return escapedText;
|
13815 | }
|
13816 |
|
13817 | return '<!--' + openingValue + '-->' + escapedText + '<!--' + closingValue + '-->';
|
13818 | }
|
13819 | },
|
13820 |
|
13821 | /**
|
13822 | * Updates this component by updating the text content.
|
13823 | *
|
13824 | * @param {ReactText} nextText The next text content
|
13825 | * @param {ReactReconcileTransaction} transaction
|
13826 | * @internal
|
13827 | */
|
13828 | receiveComponent: function (nextText, transaction) {
|
13829 | if (nextText !== this._currentElement) {
|
13830 | this._currentElement = nextText;
|
13831 | var nextStringText = '' + nextText;
|
13832 | if (nextStringText !== this._stringText) {
|
13833 | // TODO: Save this as pending props and use performUpdateIfNecessary
|
13834 | // and/or updateComponent to do the actual update for consistency with
|
13835 | // other component types?
|
13836 | this._stringText = nextStringText;
|
13837 | var commentNodes = this.getHostNode();
|
13838 | DOMChildrenOperations_1.replaceDelimitedText(commentNodes[0], commentNodes[1], nextStringText);
|
13839 | }
|
13840 | }
|
13841 | },
|
13842 |
|
13843 | getHostNode: function () {
|
13844 | var hostNode = this._commentNodes;
|
13845 | if (hostNode) {
|
13846 | return hostNode;
|
13847 | }
|
13848 | if (!this._closingComment) {
|
13849 | var openingComment = ReactDOMComponentTree_1.getNodeFromInstance(this);
|
13850 | var node = openingComment.nextSibling;
|
13851 | while (true) {
|
13852 | !(node != null) ? reactProdInvariant_1('67', this._domID) : void 0;
|
13853 | if (node.nodeType === 8 && node.nodeValue === ' /react-text ') {
|
13854 | this._closingComment = node;
|
13855 | break;
|
13856 | }
|
13857 | node = node.nextSibling;
|
13858 | }
|
13859 | }
|
13860 | hostNode = [this._hostNode, this._closingComment];
|
13861 | this._commentNodes = hostNode;
|
13862 | return hostNode;
|
13863 | },
|
13864 |
|
13865 | unmountComponent: function () {
|
13866 | this._closingComment = null;
|
13867 | this._commentNodes = null;
|
13868 | ReactDOMComponentTree_1.uncacheNode(this);
|
13869 | }
|
13870 | });
|
13871 |
|
13872 | var ReactDOMTextComponent_1 = ReactDOMTextComponent;
|
13873 |
|
13874 | var RESET_BATCHED_UPDATES = {
|
13875 | initialize: emptyFunction_1,
|
13876 | close: function () {
|
13877 | ReactDefaultBatchingStrategy.isBatchingUpdates = false;
|
13878 | }
|
13879 | };
|
13880 |
|
13881 | var FLUSH_BATCHED_UPDATES = {
|
13882 | initialize: emptyFunction_1,
|
13883 | close: ReactUpdates_1.flushBatchedUpdates.bind(ReactUpdates_1)
|
13884 | };
|
13885 |
|
13886 | var TRANSACTION_WRAPPERS$2 = [FLUSH_BATCHED_UPDATES, RESET_BATCHED_UPDATES];
|
13887 |
|
13888 | function ReactDefaultBatchingStrategyTransaction() {
|
13889 | this.reinitializeTransaction();
|
13890 | }
|
13891 |
|
13892 | objectAssign(ReactDefaultBatchingStrategyTransaction.prototype, Transaction, {
|
13893 | getTransactionWrappers: function () {
|
13894 | return TRANSACTION_WRAPPERS$2;
|
13895 | }
|
13896 | });
|
13897 |
|
13898 | var transaction = new ReactDefaultBatchingStrategyTransaction();
|
13899 |
|
13900 | var ReactDefaultBatchingStrategy = {
|
13901 | isBatchingUpdates: false,
|
13902 |
|
13903 | /**
|
13904 | * Call the provided function in a context within which calls to `setState`
|
13905 | * and friends are batched such that components aren't updated unnecessarily.
|
13906 | */
|
13907 | batchedUpdates: function (callback, a, b, c, d, e) {
|
13908 | var alreadyBatchingUpdates = ReactDefaultBatchingStrategy.isBatchingUpdates;
|
13909 |
|
13910 | ReactDefaultBatchingStrategy.isBatchingUpdates = true;
|
13911 |
|
13912 | // The code is written this way to avoid extra allocations
|
13913 | if (alreadyBatchingUpdates) {
|
13914 | return callback(a, b, c, d, e);
|
13915 | } else {
|
13916 | return transaction.perform(callback, null, a, b, c, d, e);
|
13917 | }
|
13918 | }
|
13919 | };
|
13920 |
|
13921 | var ReactDefaultBatchingStrategy_1 = ReactDefaultBatchingStrategy;
|
13922 |
|
13923 | /**
|
13924 | * Copyright (c) 2013-present, Facebook, Inc.
|
13925 | * All rights reserved.
|
13926 | *
|
13927 | * This source code is licensed under the BSD-style license found in the
|
13928 | * LICENSE file in the root directory of this source tree. An additional grant
|
13929 | * of patent rights can be found in the PATENTS file in the same directory.
|
13930 | *
|
13931 | * @typechecks
|
13932 | */
|
13933 |
|
13934 |
|
13935 |
|
13936 | /**
|
13937 | * Upstream version of event listener. Does not take into account specific
|
13938 | * nature of platform.
|
13939 | */
|
13940 | var EventListener = {
|
13941 | /**
|
13942 | * Listen to DOM events during the bubble phase.
|
13943 | *
|
13944 | * @param {DOMEventTarget} target DOM element to register listener on.
|
13945 | * @param {string} eventType Event type, e.g. 'click' or 'mouseover'.
|
13946 | * @param {function} callback Callback function.
|
13947 | * @return {object} Object with a `remove` method.
|
13948 | */
|
13949 | listen: function listen(target, eventType, callback) {
|
13950 | if (target.addEventListener) {
|
13951 | target.addEventListener(eventType, callback, false);
|
13952 | return {
|
13953 | remove: function remove() {
|
13954 | target.removeEventListener(eventType, callback, false);
|
13955 | }
|
13956 | };
|
13957 | } else if (target.attachEvent) {
|
13958 | target.attachEvent('on' + eventType, callback);
|
13959 | return {
|
13960 | remove: function remove() {
|
13961 | target.detachEvent('on' + eventType, callback);
|
13962 | }
|
13963 | };
|
13964 | }
|
13965 | },
|
13966 |
|
13967 | /**
|
13968 | * Listen to DOM events during the capture phase.
|
13969 | *
|
13970 | * @param {DOMEventTarget} target DOM element to register listener on.
|
13971 | * @param {string} eventType Event type, e.g. 'click' or 'mouseover'.
|
13972 | * @param {function} callback Callback function.
|
13973 | * @return {object} Object with a `remove` method.
|
13974 | */
|
13975 | capture: function capture(target, eventType, callback) {
|
13976 | if (target.addEventListener) {
|
13977 | target.addEventListener(eventType, callback, true);
|
13978 | return {
|
13979 | remove: function remove() {
|
13980 | target.removeEventListener(eventType, callback, true);
|
13981 | }
|
13982 | };
|
13983 | } else {
|
13984 | return {
|
13985 | remove: emptyFunction_1
|
13986 | };
|
13987 | }
|
13988 | },
|
13989 |
|
13990 | registerDefault: function registerDefault() {}
|
13991 | };
|
13992 |
|
13993 | var EventListener_1 = EventListener;
|
13994 |
|
13995 | /**
|
13996 | * Copyright (c) 2013-present, Facebook, Inc.
|
13997 | * All rights reserved.
|
13998 | *
|
13999 | * This source code is licensed under the BSD-style license found in the
|
14000 | * LICENSE file in the root directory of this source tree. An additional grant
|
14001 | * of patent rights can be found in the PATENTS file in the same directory.
|
14002 | *
|
14003 | * @typechecks
|
14004 | */
|
14005 |
|
14006 | /**
|
14007 | * Gets the scroll position of the supplied element or window.
|
14008 | *
|
14009 | * The return values are unbounded, unlike `getScrollPosition`. This means they
|
14010 | * may be negative or exceed the element boundaries (which is possible using
|
14011 | * inertial scrolling).
|
14012 | *
|
14013 | * @param {DOMWindow|DOMElement} scrollable
|
14014 | * @return {object} Map with `x` and `y` keys.
|
14015 | */
|
14016 |
|
14017 | function getUnboundedScrollPosition(scrollable) {
|
14018 | if (scrollable.Window && scrollable instanceof scrollable.Window) {
|
14019 | return {
|
14020 | x: scrollable.pageXOffset || scrollable.document.documentElement.scrollLeft,
|
14021 | y: scrollable.pageYOffset || scrollable.document.documentElement.scrollTop
|
14022 | };
|
14023 | }
|
14024 | return {
|
14025 | x: scrollable.scrollLeft,
|
14026 | y: scrollable.scrollTop
|
14027 | };
|
14028 | }
|
14029 |
|
14030 | var getUnboundedScrollPosition_1 = getUnboundedScrollPosition;
|
14031 |
|
14032 | /**
|
14033 | * Find the deepest React component completely containing the root of the
|
14034 | * passed-in instance (for use when entire React trees are nested within each
|
14035 | * other). If React trees are not nested, returns null.
|
14036 | */
|
14037 | function findParent(inst) {
|
14038 | // TODO: It may be a good idea to cache this to prevent unnecessary DOM
|
14039 | // traversal, but caching is difficult to do correctly without using a
|
14040 | // mutation observer to listen for all DOM changes.
|
14041 | while (inst._hostParent) {
|
14042 | inst = inst._hostParent;
|
14043 | }
|
14044 | var rootNode = ReactDOMComponentTree_1.getNodeFromInstance(inst);
|
14045 | var container = rootNode.parentNode;
|
14046 | return ReactDOMComponentTree_1.getClosestInstanceFromNode(container);
|
14047 | }
|
14048 |
|
14049 | // Used to store ancestor hierarchy in top level callback
|
14050 | function TopLevelCallbackBookKeeping(topLevelType, nativeEvent) {
|
14051 | this.topLevelType = topLevelType;
|
14052 | this.nativeEvent = nativeEvent;
|
14053 | this.ancestors = [];
|
14054 | }
|
14055 | objectAssign(TopLevelCallbackBookKeeping.prototype, {
|
14056 | destructor: function () {
|
14057 | this.topLevelType = null;
|
14058 | this.nativeEvent = null;
|
14059 | this.ancestors.length = 0;
|
14060 | }
|
14061 | });
|
14062 | PooledClass_1.addPoolingTo(TopLevelCallbackBookKeeping, PooledClass_1.twoArgumentPooler);
|
14063 |
|
14064 | function handleTopLevelImpl(bookKeeping) {
|
14065 | var nativeEventTarget = getEventTarget_1(bookKeeping.nativeEvent);
|
14066 | var targetInst = ReactDOMComponentTree_1.getClosestInstanceFromNode(nativeEventTarget);
|
14067 |
|
14068 | // Loop through the hierarchy, in case there's any nested components.
|
14069 | // It's important that we build the array of ancestors before calling any
|
14070 | // event handlers, because event handlers can modify the DOM, leading to
|
14071 | // inconsistencies with ReactMount's node cache. See #1105.
|
14072 | var ancestor = targetInst;
|
14073 | do {
|
14074 | bookKeeping.ancestors.push(ancestor);
|
14075 | ancestor = ancestor && findParent(ancestor);
|
14076 | } while (ancestor);
|
14077 |
|
14078 | for (var i = 0; i < bookKeeping.ancestors.length; i++) {
|
14079 | targetInst = bookKeeping.ancestors[i];
|
14080 | ReactEventListener._handleTopLevel(bookKeeping.topLevelType, targetInst, bookKeeping.nativeEvent, getEventTarget_1(bookKeeping.nativeEvent));
|
14081 | }
|
14082 | }
|
14083 |
|
14084 | function scrollValueMonitor(cb) {
|
14085 | var scrollPosition = getUnboundedScrollPosition_1(window);
|
14086 | cb(scrollPosition);
|
14087 | }
|
14088 |
|
14089 | var ReactEventListener = {
|
14090 | _enabled: true,
|
14091 | _handleTopLevel: null,
|
14092 |
|
14093 | WINDOW_HANDLE: ExecutionEnvironment_1.canUseDOM ? window : null,
|
14094 |
|
14095 | setHandleTopLevel: function (handleTopLevel) {
|
14096 | ReactEventListener._handleTopLevel = handleTopLevel;
|
14097 | },
|
14098 |
|
14099 | setEnabled: function (enabled) {
|
14100 | ReactEventListener._enabled = !!enabled;
|
14101 | },
|
14102 |
|
14103 | isEnabled: function () {
|
14104 | return ReactEventListener._enabled;
|
14105 | },
|
14106 |
|
14107 | /**
|
14108 | * Traps top-level events by using event bubbling.
|
14109 | *
|
14110 | * @param {string} topLevelType Record from `EventConstants`.
|
14111 | * @param {string} handlerBaseName Event name (e.g. "click").
|
14112 | * @param {object} element Element on which to attach listener.
|
14113 | * @return {?object} An object with a remove function which will forcefully
|
14114 | * remove the listener.
|
14115 | * @internal
|
14116 | */
|
14117 | trapBubbledEvent: function (topLevelType, handlerBaseName, element) {
|
14118 | if (!element) {
|
14119 | return null;
|
14120 | }
|
14121 | return EventListener_1.listen(element, handlerBaseName, ReactEventListener.dispatchEvent.bind(null, topLevelType));
|
14122 | },
|
14123 |
|
14124 | /**
|
14125 | * Traps a top-level event by using event capturing.
|
14126 | *
|
14127 | * @param {string} topLevelType Record from `EventConstants`.
|
14128 | * @param {string} handlerBaseName Event name (e.g. "click").
|
14129 | * @param {object} element Element on which to attach listener.
|
14130 | * @return {?object} An object with a remove function which will forcefully
|
14131 | * remove the listener.
|
14132 | * @internal
|
14133 | */
|
14134 | trapCapturedEvent: function (topLevelType, handlerBaseName, element) {
|
14135 | if (!element) {
|
14136 | return null;
|
14137 | }
|
14138 | return EventListener_1.capture(element, handlerBaseName, ReactEventListener.dispatchEvent.bind(null, topLevelType));
|
14139 | },
|
14140 |
|
14141 | monitorScrollValue: function (refresh) {
|
14142 | var callback = scrollValueMonitor.bind(null, refresh);
|
14143 | EventListener_1.listen(window, 'scroll', callback);
|
14144 | },
|
14145 |
|
14146 | dispatchEvent: function (topLevelType, nativeEvent) {
|
14147 | if (!ReactEventListener._enabled) {
|
14148 | return;
|
14149 | }
|
14150 |
|
14151 | var bookKeeping = TopLevelCallbackBookKeeping.getPooled(topLevelType, nativeEvent);
|
14152 | try {
|
14153 | // Event queue being processed in the same cycle allows
|
14154 | // `preventDefault`.
|
14155 | ReactUpdates_1.batchedUpdates(handleTopLevelImpl, bookKeeping);
|
14156 | } finally {
|
14157 | TopLevelCallbackBookKeeping.release(bookKeeping);
|
14158 | }
|
14159 | }
|
14160 | };
|
14161 |
|
14162 | var ReactEventListener_1 = ReactEventListener;
|
14163 |
|
14164 | var ReactInjection = {
|
14165 | Component: ReactComponentEnvironment_1.injection,
|
14166 | DOMProperty: DOMProperty_1.injection,
|
14167 | EmptyComponent: ReactEmptyComponent_1.injection,
|
14168 | EventPluginHub: EventPluginHub_1.injection,
|
14169 | EventPluginUtils: EventPluginUtils_1.injection,
|
14170 | EventEmitter: ReactBrowserEventEmitter_1.injection,
|
14171 | HostComponent: ReactHostComponent_1.injection,
|
14172 | Updates: ReactUpdates_1.injection
|
14173 | };
|
14174 |
|
14175 | var ReactInjection_1 = ReactInjection;
|
14176 |
|
14177 | /**
|
14178 | * Copyright 2013-present, Facebook, Inc.
|
14179 | * All rights reserved.
|
14180 | *
|
14181 | * This source code is licensed under the BSD-style license found in the
|
14182 | * LICENSE file in the root directory of this source tree. An additional grant
|
14183 | * of patent rights can be found in the PATENTS file in the same directory.
|
14184 | *
|
14185 | */
|
14186 |
|
14187 | /**
|
14188 | * Given any node return the first leaf node without children.
|
14189 | *
|
14190 | * @param {DOMElement|DOMTextNode} node
|
14191 | * @return {DOMElement|DOMTextNode}
|
14192 | */
|
14193 |
|
14194 | function getLeafNode(node) {
|
14195 | while (node && node.firstChild) {
|
14196 | node = node.firstChild;
|
14197 | }
|
14198 | return node;
|
14199 | }
|
14200 |
|
14201 | /**
|
14202 | * Get the next sibling within a container. This will walk up the
|
14203 | * DOM if a node's siblings have been exhausted.
|
14204 | *
|
14205 | * @param {DOMElement|DOMTextNode} node
|
14206 | * @return {?DOMElement|DOMTextNode}
|
14207 | */
|
14208 | function getSiblingNode(node) {
|
14209 | while (node) {
|
14210 | if (node.nextSibling) {
|
14211 | return node.nextSibling;
|
14212 | }
|
14213 | node = node.parentNode;
|
14214 | }
|
14215 | }
|
14216 |
|
14217 | /**
|
14218 | * Get object describing the nodes which contain characters at offset.
|
14219 | *
|
14220 | * @param {DOMElement|DOMTextNode} root
|
14221 | * @param {number} offset
|
14222 | * @return {?object}
|
14223 | */
|
14224 | function getNodeForCharacterOffset(root, offset) {
|
14225 | var node = getLeafNode(root);
|
14226 | var nodeStart = 0;
|
14227 | var nodeEnd = 0;
|
14228 |
|
14229 | while (node) {
|
14230 | if (node.nodeType === 3) {
|
14231 | nodeEnd = nodeStart + node.textContent.length;
|
14232 |
|
14233 | if (nodeStart <= offset && nodeEnd >= offset) {
|
14234 | return {
|
14235 | node: node,
|
14236 | offset: offset - nodeStart
|
14237 | };
|
14238 | }
|
14239 |
|
14240 | nodeStart = nodeEnd;
|
14241 | }
|
14242 |
|
14243 | node = getLeafNode(getSiblingNode(node));
|
14244 | }
|
14245 | }
|
14246 |
|
14247 | var getNodeForCharacterOffset_1 = getNodeForCharacterOffset;
|
14248 |
|
14249 | /**
|
14250 | * While `isCollapsed` is available on the Selection object and `collapsed`
|
14251 | * is available on the Range object, IE11 sometimes gets them wrong.
|
14252 | * If the anchor/focus nodes and offsets are the same, the range is collapsed.
|
14253 | */
|
14254 | function isCollapsed(anchorNode, anchorOffset, focusNode, focusOffset) {
|
14255 | return anchorNode === focusNode && anchorOffset === focusOffset;
|
14256 | }
|
14257 |
|
14258 | /**
|
14259 | * Get the appropriate anchor and focus node/offset pairs for IE.
|
14260 | *
|
14261 | * The catch here is that IE's selection API doesn't provide information
|
14262 | * about whether the selection is forward or backward, so we have to
|
14263 | * behave as though it's always forward.
|
14264 | *
|
14265 | * IE text differs from modern selection in that it behaves as though
|
14266 | * block elements end with a new line. This means character offsets will
|
14267 | * differ between the two APIs.
|
14268 | *
|
14269 | * @param {DOMElement} node
|
14270 | * @return {object}
|
14271 | */
|
14272 | function getIEOffsets(node) {
|
14273 | var selection = document.selection;
|
14274 | var selectedRange = selection.createRange();
|
14275 | var selectedLength = selectedRange.text.length;
|
14276 |
|
14277 | // Duplicate selection so we can move range without breaking user selection.
|
14278 | var fromStart = selectedRange.duplicate();
|
14279 | fromStart.moveToElementText(node);
|
14280 | fromStart.setEndPoint('EndToStart', selectedRange);
|
14281 |
|
14282 | var startOffset = fromStart.text.length;
|
14283 | var endOffset = startOffset + selectedLength;
|
14284 |
|
14285 | return {
|
14286 | start: startOffset,
|
14287 | end: endOffset
|
14288 | };
|
14289 | }
|
14290 |
|
14291 | /**
|
14292 | * @param {DOMElement} node
|
14293 | * @return {?object}
|
14294 | */
|
14295 | function getModernOffsets(node) {
|
14296 | var selection = window.getSelection && window.getSelection();
|
14297 |
|
14298 | if (!selection || selection.rangeCount === 0) {
|
14299 | return null;
|
14300 | }
|
14301 |
|
14302 | var anchorNode = selection.anchorNode;
|
14303 | var anchorOffset = selection.anchorOffset;
|
14304 | var focusNode = selection.focusNode;
|
14305 | var focusOffset = selection.focusOffset;
|
14306 |
|
14307 | var currentRange = selection.getRangeAt(0);
|
14308 |
|
14309 | // In Firefox, range.startContainer and range.endContainer can be "anonymous
|
14310 | // divs", e.g. the up/down buttons on an <input type="number">. Anonymous
|
14311 | // divs do not seem to expose properties, triggering a "Permission denied
|
14312 | // error" if any of its properties are accessed. The only seemingly possible
|
14313 | // way to avoid erroring is to access a property that typically works for
|
14314 | // non-anonymous divs and catch any error that may otherwise arise. See
|
14315 | // https://bugzilla.mozilla.org/show_bug.cgi?id=208427
|
14316 | try {
|
14317 | /* eslint-disable no-unused-expressions */
|
14318 | currentRange.startContainer.nodeType;
|
14319 | currentRange.endContainer.nodeType;
|
14320 | /* eslint-enable no-unused-expressions */
|
14321 | } catch (e) {
|
14322 | return null;
|
14323 | }
|
14324 |
|
14325 | // If the node and offset values are the same, the selection is collapsed.
|
14326 | // `Selection.isCollapsed` is available natively, but IE sometimes gets
|
14327 | // this value wrong.
|
14328 | var isSelectionCollapsed = isCollapsed(selection.anchorNode, selection.anchorOffset, selection.focusNode, selection.focusOffset);
|
14329 |
|
14330 | var rangeLength = isSelectionCollapsed ? 0 : currentRange.toString().length;
|
14331 |
|
14332 | var tempRange = currentRange.cloneRange();
|
14333 | tempRange.selectNodeContents(node);
|
14334 | tempRange.setEnd(currentRange.startContainer, currentRange.startOffset);
|
14335 |
|
14336 | var isTempRangeCollapsed = isCollapsed(tempRange.startContainer, tempRange.startOffset, tempRange.endContainer, tempRange.endOffset);
|
14337 |
|
14338 | var start = isTempRangeCollapsed ? 0 : tempRange.toString().length;
|
14339 | var end = start + rangeLength;
|
14340 |
|
14341 | // Detect whether the selection is backward.
|
14342 | var detectionRange = document.createRange();
|
14343 | detectionRange.setStart(anchorNode, anchorOffset);
|
14344 | detectionRange.setEnd(focusNode, focusOffset);
|
14345 | var isBackward = detectionRange.collapsed;
|
14346 |
|
14347 | return {
|
14348 | start: isBackward ? end : start,
|
14349 | end: isBackward ? start : end
|
14350 | };
|
14351 | }
|
14352 |
|
14353 | /**
|
14354 | * @param {DOMElement|DOMTextNode} node
|
14355 | * @param {object} offsets
|
14356 | */
|
14357 | function setIEOffsets(node, offsets) {
|
14358 | var range = document.selection.createRange().duplicate();
|
14359 | var start, end;
|
14360 |
|
14361 | if (offsets.end === undefined) {
|
14362 | start = offsets.start;
|
14363 | end = start;
|
14364 | } else if (offsets.start > offsets.end) {
|
14365 | start = offsets.end;
|
14366 | end = offsets.start;
|
14367 | } else {
|
14368 | start = offsets.start;
|
14369 | end = offsets.end;
|
14370 | }
|
14371 |
|
14372 | range.moveToElementText(node);
|
14373 | range.moveStart('character', start);
|
14374 | range.setEndPoint('EndToStart', range);
|
14375 | range.moveEnd('character', end - start);
|
14376 | range.select();
|
14377 | }
|
14378 |
|
14379 | /**
|
14380 | * In modern non-IE browsers, we can support both forward and backward
|
14381 | * selections.
|
14382 | *
|
14383 | * Note: IE10+ supports the Selection object, but it does not support
|
14384 | * the `extend` method, which means that even in modern IE, it's not possible
|
14385 | * to programmatically create a backward selection. Thus, for all IE
|
14386 | * versions, we use the old IE API to create our selections.
|
14387 | *
|
14388 | * @param {DOMElement|DOMTextNode} node
|
14389 | * @param {object} offsets
|
14390 | */
|
14391 | function setModernOffsets(node, offsets) {
|
14392 | if (!window.getSelection) {
|
14393 | return;
|
14394 | }
|
14395 |
|
14396 | var selection = window.getSelection();
|
14397 | var length = node[getTextContentAccessor_1()].length;
|
14398 | var start = Math.min(offsets.start, length);
|
14399 | var end = offsets.end === undefined ? start : Math.min(offsets.end, length);
|
14400 |
|
14401 | // IE 11 uses modern selection, but doesn't support the extend method.
|
14402 | // Flip backward selections, so we can set with a single range.
|
14403 | if (!selection.extend && start > end) {
|
14404 | var temp = end;
|
14405 | end = start;
|
14406 | start = temp;
|
14407 | }
|
14408 |
|
14409 | var startMarker = getNodeForCharacterOffset_1(node, start);
|
14410 | var endMarker = getNodeForCharacterOffset_1(node, end);
|
14411 |
|
14412 | if (startMarker && endMarker) {
|
14413 | var range = document.createRange();
|
14414 | range.setStart(startMarker.node, startMarker.offset);
|
14415 | selection.removeAllRanges();
|
14416 |
|
14417 | if (start > end) {
|
14418 | selection.addRange(range);
|
14419 | selection.extend(endMarker.node, endMarker.offset);
|
14420 | } else {
|
14421 | range.setEnd(endMarker.node, endMarker.offset);
|
14422 | selection.addRange(range);
|
14423 | }
|
14424 | }
|
14425 | }
|
14426 |
|
14427 | var useIEOffsets = ExecutionEnvironment_1.canUseDOM && 'selection' in document && !('getSelection' in window);
|
14428 |
|
14429 | var ReactDOMSelection = {
|
14430 | /**
|
14431 | * @param {DOMElement} node
|
14432 | */
|
14433 | getOffsets: useIEOffsets ? getIEOffsets : getModernOffsets,
|
14434 |
|
14435 | /**
|
14436 | * @param {DOMElement|DOMTextNode} node
|
14437 | * @param {object} offsets
|
14438 | */
|
14439 | setOffsets: useIEOffsets ? setIEOffsets : setModernOffsets
|
14440 | };
|
14441 |
|
14442 | var ReactDOMSelection_1 = ReactDOMSelection;
|
14443 |
|
14444 | /**
|
14445 | * Copyright (c) 2013-present, Facebook, Inc.
|
14446 | * All rights reserved.
|
14447 | *
|
14448 | * This source code is licensed under the BSD-style license found in the
|
14449 | * LICENSE file in the root directory of this source tree. An additional grant
|
14450 | * of patent rights can be found in the PATENTS file in the same directory.
|
14451 | *
|
14452 | * @typechecks
|
14453 | */
|
14454 |
|
14455 | /**
|
14456 | * @param {*} object The object to check.
|
14457 | * @return {boolean} Whether or not the object is a DOM node.
|
14458 | */
|
14459 | function isNode(object) {
|
14460 | var doc = object ? object.ownerDocument || object : document;
|
14461 | var defaultView = doc.defaultView || window;
|
14462 | return !!(object && (typeof defaultView.Node === 'function' ? object instanceof defaultView.Node : typeof object === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string'));
|
14463 | }
|
14464 |
|
14465 | var isNode_1 = isNode;
|
14466 |
|
14467 | /**
|
14468 | * Copyright (c) 2013-present, Facebook, Inc.
|
14469 | * All rights reserved.
|
14470 | *
|
14471 | * This source code is licensed under the BSD-style license found in the
|
14472 | * LICENSE file in the root directory of this source tree. An additional grant
|
14473 | * of patent rights can be found in the PATENTS file in the same directory.
|
14474 | *
|
14475 | * @typechecks
|
14476 | */
|
14477 |
|
14478 |
|
14479 |
|
14480 | /**
|
14481 | * @param {*} object The object to check.
|
14482 | * @return {boolean} Whether or not the object is a DOM text node.
|
14483 | */
|
14484 | function isTextNode(object) {
|
14485 | return isNode_1(object) && object.nodeType == 3;
|
14486 | }
|
14487 |
|
14488 | var isTextNode_1 = isTextNode;
|
14489 |
|
14490 | /**
|
14491 | * Copyright (c) 2013-present, Facebook, Inc.
|
14492 | * All rights reserved.
|
14493 | *
|
14494 | * This source code is licensed under the BSD-style license found in the
|
14495 | * LICENSE file in the root directory of this source tree. An additional grant
|
14496 | * of patent rights can be found in the PATENTS file in the same directory.
|
14497 | *
|
14498 | *
|
14499 | */
|
14500 |
|
14501 |
|
14502 |
|
14503 | /*eslint-disable no-bitwise */
|
14504 |
|
14505 | /**
|
14506 | * Checks if a given DOM node contains or is another DOM node.
|
14507 | */
|
14508 | function containsNode(outerNode, innerNode) {
|
14509 | if (!outerNode || !innerNode) {
|
14510 | return false;
|
14511 | } else if (outerNode === innerNode) {
|
14512 | return true;
|
14513 | } else if (isTextNode_1(outerNode)) {
|
14514 | return false;
|
14515 | } else if (isTextNode_1(innerNode)) {
|
14516 | return containsNode(outerNode, innerNode.parentNode);
|
14517 | } else if ('contains' in outerNode) {
|
14518 | return outerNode.contains(innerNode);
|
14519 | } else if (outerNode.compareDocumentPosition) {
|
14520 | return !!(outerNode.compareDocumentPosition(innerNode) & 16);
|
14521 | } else {
|
14522 | return false;
|
14523 | }
|
14524 | }
|
14525 |
|
14526 | var containsNode_1 = containsNode;
|
14527 |
|
14528 | /**
|
14529 | * Copyright (c) 2013-present, Facebook, Inc.
|
14530 | * All rights reserved.
|
14531 | *
|
14532 | * This source code is licensed under the BSD-style license found in the
|
14533 | * LICENSE file in the root directory of this source tree. An additional grant
|
14534 | * of patent rights can be found in the PATENTS file in the same directory.
|
14535 | *
|
14536 | * @typechecks
|
14537 | */
|
14538 |
|
14539 | /* eslint-disable fb-www/typeof-undefined */
|
14540 |
|
14541 | /**
|
14542 | * Same as document.activeElement but wraps in a try-catch block. In IE it is
|
14543 | * not safe to call document.activeElement if there is nothing focused.
|
14544 | *
|
14545 | * The activeElement will be null only if the document or document body is not
|
14546 | * yet defined.
|
14547 | *
|
14548 | * @param {?DOMDocument} doc Defaults to current document.
|
14549 | * @return {?DOMElement}
|
14550 | */
|
14551 | function getActiveElement(doc) /*?DOMElement*/{
|
14552 | doc = doc || (typeof document !== 'undefined' ? document : undefined);
|
14553 | if (typeof doc === 'undefined') {
|
14554 | return null;
|
14555 | }
|
14556 | try {
|
14557 | return doc.activeElement || doc.body;
|
14558 | } catch (e) {
|
14559 | return doc.body;
|
14560 | }
|
14561 | }
|
14562 |
|
14563 | var getActiveElement_1 = getActiveElement;
|
14564 |
|
14565 | function isInDocument(node) {
|
14566 | return containsNode_1(document.documentElement, node);
|
14567 | }
|
14568 |
|
14569 | /**
|
14570 | * @ReactInputSelection: React input selection module. Based on Selection.js,
|
14571 | * but modified to be suitable for react and has a couple of bug fixes (doesn't
|
14572 | * assume buttons have range selections allowed).
|
14573 | * Input selection module for React.
|
14574 | */
|
14575 | var ReactInputSelection = {
|
14576 | hasSelectionCapabilities: function (elem) {
|
14577 | var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
|
14578 | return nodeName && (nodeName === 'input' && elem.type === 'text' || nodeName === 'textarea' || elem.contentEditable === 'true');
|
14579 | },
|
14580 |
|
14581 | getSelectionInformation: function () {
|
14582 | var focusedElem = getActiveElement_1();
|
14583 | return {
|
14584 | focusedElem: focusedElem,
|
14585 | selectionRange: ReactInputSelection.hasSelectionCapabilities(focusedElem) ? ReactInputSelection.getSelection(focusedElem) : null
|
14586 | };
|
14587 | },
|
14588 |
|
14589 | /**
|
14590 | * @restoreSelection: If any selection information was potentially lost,
|
14591 | * restore it. This is useful when performing operations that could remove dom
|
14592 | * nodes and place them back in, resulting in focus being lost.
|
14593 | */
|
14594 | restoreSelection: function (priorSelectionInformation) {
|
14595 | var curFocusedElem = getActiveElement_1();
|
14596 | var priorFocusedElem = priorSelectionInformation.focusedElem;
|
14597 | var priorSelectionRange = priorSelectionInformation.selectionRange;
|
14598 | if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) {
|
14599 | if (ReactInputSelection.hasSelectionCapabilities(priorFocusedElem)) {
|
14600 | ReactInputSelection.setSelection(priorFocusedElem, priorSelectionRange);
|
14601 | }
|
14602 | focusNode_1(priorFocusedElem);
|
14603 | }
|
14604 | },
|
14605 |
|
14606 | /**
|
14607 | * @getSelection: Gets the selection bounds of a focused textarea, input or
|
14608 | * contentEditable node.
|
14609 | * -@input: Look up selection bounds of this input
|
14610 | * -@return {start: selectionStart, end: selectionEnd}
|
14611 | */
|
14612 | getSelection: function (input) {
|
14613 | var selection;
|
14614 |
|
14615 | if ('selectionStart' in input) {
|
14616 | // Modern browser with input or textarea.
|
14617 | selection = {
|
14618 | start: input.selectionStart,
|
14619 | end: input.selectionEnd
|
14620 | };
|
14621 | } else if (document.selection && input.nodeName && input.nodeName.toLowerCase() === 'input') {
|
14622 | // IE8 input.
|
14623 | var range = document.selection.createRange();
|
14624 | // There can only be one selection per document in IE, so it must
|
14625 | // be in our element.
|
14626 | if (range.parentElement() === input) {
|
14627 | selection = {
|
14628 | start: -range.moveStart('character', -input.value.length),
|
14629 | end: -range.moveEnd('character', -input.value.length)
|
14630 | };
|
14631 | }
|
14632 | } else {
|
14633 | // Content editable or old IE textarea.
|
14634 | selection = ReactDOMSelection_1.getOffsets(input);
|
14635 | }
|
14636 |
|
14637 | return selection || { start: 0, end: 0 };
|
14638 | },
|
14639 |
|
14640 | /**
|
14641 | * @setSelection: Sets the selection bounds of a textarea or input and focuses
|
14642 | * the input.
|
14643 | * -@input Set selection bounds of this input or textarea
|
14644 | * -@offsets Object of same form that is returned from get*
|
14645 | */
|
14646 | setSelection: function (input, offsets) {
|
14647 | var start = offsets.start;
|
14648 | var end = offsets.end;
|
14649 | if (end === undefined) {
|
14650 | end = start;
|
14651 | }
|
14652 |
|
14653 | if ('selectionStart' in input) {
|
14654 | input.selectionStart = start;
|
14655 | input.selectionEnd = Math.min(end, input.value.length);
|
14656 | } else if (document.selection && input.nodeName && input.nodeName.toLowerCase() === 'input') {
|
14657 | var range = input.createTextRange();
|
14658 | range.collapse(true);
|
14659 | range.moveStart('character', start);
|
14660 | range.moveEnd('character', end - start);
|
14661 | range.select();
|
14662 | } else {
|
14663 | ReactDOMSelection_1.setOffsets(input, offsets);
|
14664 | }
|
14665 | }
|
14666 | };
|
14667 |
|
14668 | var ReactInputSelection_1 = ReactInputSelection;
|
14669 |
|
14670 | /**
|
14671 | * Ensures that, when possible, the selection range (currently selected text
|
14672 | * input) is not disturbed by performing the transaction.
|
14673 | */
|
14674 | var SELECTION_RESTORATION = {
|
14675 | /**
|
14676 | * @return {Selection} Selection information.
|
14677 | */
|
14678 | initialize: ReactInputSelection_1.getSelectionInformation,
|
14679 | /**
|
14680 | * @param {Selection} sel Selection information returned from `initialize`.
|
14681 | */
|
14682 | close: ReactInputSelection_1.restoreSelection
|
14683 | };
|
14684 |
|
14685 | /**
|
14686 | * Suppresses events (blur/focus) that could be inadvertently dispatched due to
|
14687 | * high level DOM manipulations (like temporarily removing a text input from the
|
14688 | * DOM).
|
14689 | */
|
14690 | var EVENT_SUPPRESSION = {
|
14691 | /**
|
14692 | * @return {boolean} The enabled status of `ReactBrowserEventEmitter` before
|
14693 | * the reconciliation.
|
14694 | */
|
14695 | initialize: function () {
|
14696 | var currentlyEnabled = ReactBrowserEventEmitter_1.isEnabled();
|
14697 | ReactBrowserEventEmitter_1.setEnabled(false);
|
14698 | return currentlyEnabled;
|
14699 | },
|
14700 |
|
14701 | /**
|
14702 | * @param {boolean} previouslyEnabled Enabled status of
|
14703 | * `ReactBrowserEventEmitter` before the reconciliation occurred. `close`
|
14704 | * restores the previous value.
|
14705 | */
|
14706 | close: function (previouslyEnabled) {
|
14707 | ReactBrowserEventEmitter_1.setEnabled(previouslyEnabled);
|
14708 | }
|
14709 | };
|
14710 |
|
14711 | /**
|
14712 | * Provides a queue for collecting `componentDidMount` and
|
14713 | * `componentDidUpdate` callbacks during the transaction.
|
14714 | */
|
14715 | var ON_DOM_READY_QUEUEING = {
|
14716 | /**
|
14717 | * Initializes the internal `onDOMReady` queue.
|
14718 | */
|
14719 | initialize: function () {
|
14720 | this.reactMountReady.reset();
|
14721 | },
|
14722 |
|
14723 | /**
|
14724 | * After DOM is flushed, invoke all registered `onDOMReady` callbacks.
|
14725 | */
|
14726 | close: function () {
|
14727 | this.reactMountReady.notifyAll();
|
14728 | }
|
14729 | };
|
14730 |
|
14731 | /**
|
14732 | * Executed within the scope of the `Transaction` instance. Consider these as
|
14733 | * being member methods, but with an implied ordering while being isolated from
|
14734 | * each other.
|
14735 | */
|
14736 | var TRANSACTION_WRAPPERS$3 = [SELECTION_RESTORATION, EVENT_SUPPRESSION, ON_DOM_READY_QUEUEING];
|
14737 |
|
14738 | /**
|
14739 | * Currently:
|
14740 | * - The order that these are listed in the transaction is critical:
|
14741 | * - Suppresses events.
|
14742 | * - Restores selection range.
|
14743 | *
|
14744 | * Future:
|
14745 | * - Restore document/overflow scroll positions that were unintentionally
|
14746 | * modified via DOM insertions above the top viewport boundary.
|
14747 | * - Implement/integrate with customized constraint based layout system and keep
|
14748 | * track of which dimensions must be remeasured.
|
14749 | *
|
14750 | * @class ReactReconcileTransaction
|
14751 | */
|
14752 | function ReactReconcileTransaction(useCreateElement) {
|
14753 | this.reinitializeTransaction();
|
14754 | // Only server-side rendering really needs this option (see
|
14755 | // `ReactServerRendering`), but server-side uses
|
14756 | // `ReactServerRenderingTransaction` instead. This option is here so that it's
|
14757 | // accessible and defaults to false when `ReactDOMComponent` and
|
14758 | // `ReactDOMTextComponent` checks it in `mountComponent`.`
|
14759 | this.renderToStaticMarkup = false;
|
14760 | this.reactMountReady = CallbackQueue_1.getPooled(null);
|
14761 | this.useCreateElement = useCreateElement;
|
14762 | }
|
14763 |
|
14764 | var Mixin$1 = {
|
14765 | /**
|
14766 | * @see Transaction
|
14767 | * @abstract
|
14768 | * @final
|
14769 | * @return {array<object>} List of operation wrap procedures.
|
14770 | * TODO: convert to array<TransactionWrapper>
|
14771 | */
|
14772 | getTransactionWrappers: function () {
|
14773 | return TRANSACTION_WRAPPERS$3;
|
14774 | },
|
14775 |
|
14776 | /**
|
14777 | * @return {object} The queue to collect `onDOMReady` callbacks with.
|
14778 | */
|
14779 | getReactMountReady: function () {
|
14780 | return this.reactMountReady;
|
14781 | },
|
14782 |
|
14783 | /**
|
14784 | * @return {object} The queue to collect React async events.
|
14785 | */
|
14786 | getUpdateQueue: function () {
|
14787 | return ReactUpdateQueue_1;
|
14788 | },
|
14789 |
|
14790 | /**
|
14791 | * Save current transaction state -- if the return value from this method is
|
14792 | * passed to `rollback`, the transaction will be reset to that state.
|
14793 | */
|
14794 | checkpoint: function () {
|
14795 | // reactMountReady is the our only stateful wrapper
|
14796 | return this.reactMountReady.checkpoint();
|
14797 | },
|
14798 |
|
14799 | rollback: function (checkpoint) {
|
14800 | this.reactMountReady.rollback(checkpoint);
|
14801 | },
|
14802 |
|
14803 | /**
|
14804 | * `PooledClass` looks for this, and will invoke this before allowing this
|
14805 | * instance to be reused.
|
14806 | */
|
14807 | destructor: function () {
|
14808 | CallbackQueue_1.release(this.reactMountReady);
|
14809 | this.reactMountReady = null;
|
14810 | }
|
14811 | };
|
14812 |
|
14813 | objectAssign(ReactReconcileTransaction.prototype, Transaction, Mixin$1);
|
14814 |
|
14815 | PooledClass_1.addPoolingTo(ReactReconcileTransaction);
|
14816 |
|
14817 | var ReactReconcileTransaction_1 = ReactReconcileTransaction;
|
14818 |
|
14819 | /**
|
14820 | * Copyright 2013-present, Facebook, Inc.
|
14821 | * All rights reserved.
|
14822 | *
|
14823 | * This source code is licensed under the BSD-style license found in the
|
14824 | * LICENSE file in the root directory of this source tree. An additional grant
|
14825 | * of patent rights can be found in the PATENTS file in the same directory.
|
14826 | *
|
14827 | */
|
14828 |
|
14829 | var NS = {
|
14830 | xlink: 'http://www.w3.org/1999/xlink',
|
14831 | xml: 'http://www.w3.org/XML/1998/namespace'
|
14832 | };
|
14833 |
|
14834 | // We use attributes for everything SVG so let's avoid some duplication and run
|
14835 | // code instead.
|
14836 | // The following are all specified in the HTML config already so we exclude here.
|
14837 | // - class (as className)
|
14838 | // - color
|
14839 | // - height
|
14840 | // - id
|
14841 | // - lang
|
14842 | // - max
|
14843 | // - media
|
14844 | // - method
|
14845 | // - min
|
14846 | // - name
|
14847 | // - style
|
14848 | // - target
|
14849 | // - type
|
14850 | // - width
|
14851 | var ATTRS = {
|
14852 | accentHeight: 'accent-height',
|
14853 | accumulate: 0,
|
14854 | additive: 0,
|
14855 | alignmentBaseline: 'alignment-baseline',
|
14856 | allowReorder: 'allowReorder',
|
14857 | alphabetic: 0,
|
14858 | amplitude: 0,
|
14859 | arabicForm: 'arabic-form',
|
14860 | ascent: 0,
|
14861 | attributeName: 'attributeName',
|
14862 | attributeType: 'attributeType',
|
14863 | autoReverse: 'autoReverse',
|
14864 | azimuth: 0,
|
14865 | baseFrequency: 'baseFrequency',
|
14866 | baseProfile: 'baseProfile',
|
14867 | baselineShift: 'baseline-shift',
|
14868 | bbox: 0,
|
14869 | begin: 0,
|
14870 | bias: 0,
|
14871 | by: 0,
|
14872 | calcMode: 'calcMode',
|
14873 | capHeight: 'cap-height',
|
14874 | clip: 0,
|
14875 | clipPath: 'clip-path',
|
14876 | clipRule: 'clip-rule',
|
14877 | clipPathUnits: 'clipPathUnits',
|
14878 | colorInterpolation: 'color-interpolation',
|
14879 | colorInterpolationFilters: 'color-interpolation-filters',
|
14880 | colorProfile: 'color-profile',
|
14881 | colorRendering: 'color-rendering',
|
14882 | contentScriptType: 'contentScriptType',
|
14883 | contentStyleType: 'contentStyleType',
|
14884 | cursor: 0,
|
14885 | cx: 0,
|
14886 | cy: 0,
|
14887 | d: 0,
|
14888 | decelerate: 0,
|
14889 | descent: 0,
|
14890 | diffuseConstant: 'diffuseConstant',
|
14891 | direction: 0,
|
14892 | display: 0,
|
14893 | divisor: 0,
|
14894 | dominantBaseline: 'dominant-baseline',
|
14895 | dur: 0,
|
14896 | dx: 0,
|
14897 | dy: 0,
|
14898 | edgeMode: 'edgeMode',
|
14899 | elevation: 0,
|
14900 | enableBackground: 'enable-background',
|
14901 | end: 0,
|
14902 | exponent: 0,
|
14903 | externalResourcesRequired: 'externalResourcesRequired',
|
14904 | fill: 0,
|
14905 | fillOpacity: 'fill-opacity',
|
14906 | fillRule: 'fill-rule',
|
14907 | filter: 0,
|
14908 | filterRes: 'filterRes',
|
14909 | filterUnits: 'filterUnits',
|
14910 | floodColor: 'flood-color',
|
14911 | floodOpacity: 'flood-opacity',
|
14912 | focusable: 0,
|
14913 | fontFamily: 'font-family',
|
14914 | fontSize: 'font-size',
|
14915 | fontSizeAdjust: 'font-size-adjust',
|
14916 | fontStretch: 'font-stretch',
|
14917 | fontStyle: 'font-style',
|
14918 | fontVariant: 'font-variant',
|
14919 | fontWeight: 'font-weight',
|
14920 | format: 0,
|
14921 | from: 0,
|
14922 | fx: 0,
|
14923 | fy: 0,
|
14924 | g1: 0,
|
14925 | g2: 0,
|
14926 | glyphName: 'glyph-name',
|
14927 | glyphOrientationHorizontal: 'glyph-orientation-horizontal',
|
14928 | glyphOrientationVertical: 'glyph-orientation-vertical',
|
14929 | glyphRef: 'glyphRef',
|
14930 | gradientTransform: 'gradientTransform',
|
14931 | gradientUnits: 'gradientUnits',
|
14932 | hanging: 0,
|
14933 | horizAdvX: 'horiz-adv-x',
|
14934 | horizOriginX: 'horiz-origin-x',
|
14935 | ideographic: 0,
|
14936 | imageRendering: 'image-rendering',
|
14937 | 'in': 0,
|
14938 | in2: 0,
|
14939 | intercept: 0,
|
14940 | k: 0,
|
14941 | k1: 0,
|
14942 | k2: 0,
|
14943 | k3: 0,
|
14944 | k4: 0,
|
14945 | kernelMatrix: 'kernelMatrix',
|
14946 | kernelUnitLength: 'kernelUnitLength',
|
14947 | kerning: 0,
|
14948 | keyPoints: 'keyPoints',
|
14949 | keySplines: 'keySplines',
|
14950 | keyTimes: 'keyTimes',
|
14951 | lengthAdjust: 'lengthAdjust',
|
14952 | letterSpacing: 'letter-spacing',
|
14953 | lightingColor: 'lighting-color',
|
14954 | limitingConeAngle: 'limitingConeAngle',
|
14955 | local: 0,
|
14956 | markerEnd: 'marker-end',
|
14957 | markerMid: 'marker-mid',
|
14958 | markerStart: 'marker-start',
|
14959 | markerHeight: 'markerHeight',
|
14960 | markerUnits: 'markerUnits',
|
14961 | markerWidth: 'markerWidth',
|
14962 | mask: 0,
|
14963 | maskContentUnits: 'maskContentUnits',
|
14964 | maskUnits: 'maskUnits',
|
14965 | mathematical: 0,
|
14966 | mode: 0,
|
14967 | numOctaves: 'numOctaves',
|
14968 | offset: 0,
|
14969 | opacity: 0,
|
14970 | operator: 0,
|
14971 | order: 0,
|
14972 | orient: 0,
|
14973 | orientation: 0,
|
14974 | origin: 0,
|
14975 | overflow: 0,
|
14976 | overlinePosition: 'overline-position',
|
14977 | overlineThickness: 'overline-thickness',
|
14978 | paintOrder: 'paint-order',
|
14979 | panose1: 'panose-1',
|
14980 | pathLength: 'pathLength',
|
14981 | patternContentUnits: 'patternContentUnits',
|
14982 | patternTransform: 'patternTransform',
|
14983 | patternUnits: 'patternUnits',
|
14984 | pointerEvents: 'pointer-events',
|
14985 | points: 0,
|
14986 | pointsAtX: 'pointsAtX',
|
14987 | pointsAtY: 'pointsAtY',
|
14988 | pointsAtZ: 'pointsAtZ',
|
14989 | preserveAlpha: 'preserveAlpha',
|
14990 | preserveAspectRatio: 'preserveAspectRatio',
|
14991 | primitiveUnits: 'primitiveUnits',
|
14992 | r: 0,
|
14993 | radius: 0,
|
14994 | refX: 'refX',
|
14995 | refY: 'refY',
|
14996 | renderingIntent: 'rendering-intent',
|
14997 | repeatCount: 'repeatCount',
|
14998 | repeatDur: 'repeatDur',
|
14999 | requiredExtensions: 'requiredExtensions',
|
15000 | requiredFeatures: 'requiredFeatures',
|
15001 | restart: 0,
|
15002 | result: 0,
|
15003 | rotate: 0,
|
15004 | rx: 0,
|
15005 | ry: 0,
|
15006 | scale: 0,
|
15007 | seed: 0,
|
15008 | shapeRendering: 'shape-rendering',
|
15009 | slope: 0,
|
15010 | spacing: 0,
|
15011 | specularConstant: 'specularConstant',
|
15012 | specularExponent: 'specularExponent',
|
15013 | speed: 0,
|
15014 | spreadMethod: 'spreadMethod',
|
15015 | startOffset: 'startOffset',
|
15016 | stdDeviation: 'stdDeviation',
|
15017 | stemh: 0,
|
15018 | stemv: 0,
|
15019 | stitchTiles: 'stitchTiles',
|
15020 | stopColor: 'stop-color',
|
15021 | stopOpacity: 'stop-opacity',
|
15022 | strikethroughPosition: 'strikethrough-position',
|
15023 | strikethroughThickness: 'strikethrough-thickness',
|
15024 | string: 0,
|
15025 | stroke: 0,
|
15026 | strokeDasharray: 'stroke-dasharray',
|
15027 | strokeDashoffset: 'stroke-dashoffset',
|
15028 | strokeLinecap: 'stroke-linecap',
|
15029 | strokeLinejoin: 'stroke-linejoin',
|
15030 | strokeMiterlimit: 'stroke-miterlimit',
|
15031 | strokeOpacity: 'stroke-opacity',
|
15032 | strokeWidth: 'stroke-width',
|
15033 | surfaceScale: 'surfaceScale',
|
15034 | systemLanguage: 'systemLanguage',
|
15035 | tableValues: 'tableValues',
|
15036 | targetX: 'targetX',
|
15037 | targetY: 'targetY',
|
15038 | textAnchor: 'text-anchor',
|
15039 | textDecoration: 'text-decoration',
|
15040 | textRendering: 'text-rendering',
|
15041 | textLength: 'textLength',
|
15042 | to: 0,
|
15043 | transform: 0,
|
15044 | u1: 0,
|
15045 | u2: 0,
|
15046 | underlinePosition: 'underline-position',
|
15047 | underlineThickness: 'underline-thickness',
|
15048 | unicode: 0,
|
15049 | unicodeBidi: 'unicode-bidi',
|
15050 | unicodeRange: 'unicode-range',
|
15051 | unitsPerEm: 'units-per-em',
|
15052 | vAlphabetic: 'v-alphabetic',
|
15053 | vHanging: 'v-hanging',
|
15054 | vIdeographic: 'v-ideographic',
|
15055 | vMathematical: 'v-mathematical',
|
15056 | values: 0,
|
15057 | vectorEffect: 'vector-effect',
|
15058 | version: 0,
|
15059 | vertAdvY: 'vert-adv-y',
|
15060 | vertOriginX: 'vert-origin-x',
|
15061 | vertOriginY: 'vert-origin-y',
|
15062 | viewBox: 'viewBox',
|
15063 | viewTarget: 'viewTarget',
|
15064 | visibility: 0,
|
15065 | widths: 0,
|
15066 | wordSpacing: 'word-spacing',
|
15067 | writingMode: 'writing-mode',
|
15068 | x: 0,
|
15069 | xHeight: 'x-height',
|
15070 | x1: 0,
|
15071 | x2: 0,
|
15072 | xChannelSelector: 'xChannelSelector',
|
15073 | xlinkActuate: 'xlink:actuate',
|
15074 | xlinkArcrole: 'xlink:arcrole',
|
15075 | xlinkHref: 'xlink:href',
|
15076 | xlinkRole: 'xlink:role',
|
15077 | xlinkShow: 'xlink:show',
|
15078 | xlinkTitle: 'xlink:title',
|
15079 | xlinkType: 'xlink:type',
|
15080 | xmlBase: 'xml:base',
|
15081 | xmlns: 0,
|
15082 | xmlnsXlink: 'xmlns:xlink',
|
15083 | xmlLang: 'xml:lang',
|
15084 | xmlSpace: 'xml:space',
|
15085 | y: 0,
|
15086 | y1: 0,
|
15087 | y2: 0,
|
15088 | yChannelSelector: 'yChannelSelector',
|
15089 | z: 0,
|
15090 | zoomAndPan: 'zoomAndPan'
|
15091 | };
|
15092 |
|
15093 | var SVGDOMPropertyConfig = {
|
15094 | Properties: {},
|
15095 | DOMAttributeNamespaces: {
|
15096 | xlinkActuate: NS.xlink,
|
15097 | xlinkArcrole: NS.xlink,
|
15098 | xlinkHref: NS.xlink,
|
15099 | xlinkRole: NS.xlink,
|
15100 | xlinkShow: NS.xlink,
|
15101 | xlinkTitle: NS.xlink,
|
15102 | xlinkType: NS.xlink,
|
15103 | xmlBase: NS.xml,
|
15104 | xmlLang: NS.xml,
|
15105 | xmlSpace: NS.xml
|
15106 | },
|
15107 | DOMAttributeNames: {}
|
15108 | };
|
15109 |
|
15110 | Object.keys(ATTRS).forEach(function (key) {
|
15111 | SVGDOMPropertyConfig.Properties[key] = 0;
|
15112 | if (ATTRS[key]) {
|
15113 | SVGDOMPropertyConfig.DOMAttributeNames[key] = ATTRS[key];
|
15114 | }
|
15115 | });
|
15116 |
|
15117 | var SVGDOMPropertyConfig_1 = SVGDOMPropertyConfig;
|
15118 |
|
15119 | var skipSelectionChangeEvent = ExecutionEnvironment_1.canUseDOM && 'documentMode' in document && document.documentMode <= 11;
|
15120 |
|
15121 | var eventTypes$3 = {
|
15122 | select: {
|
15123 | phasedRegistrationNames: {
|
15124 | bubbled: 'onSelect',
|
15125 | captured: 'onSelectCapture'
|
15126 | },
|
15127 | dependencies: ['topBlur', 'topContextMenu', 'topFocus', 'topKeyDown', 'topKeyUp', 'topMouseDown', 'topMouseUp', 'topSelectionChange']
|
15128 | }
|
15129 | };
|
15130 |
|
15131 | var activeElement$1 = null;
|
15132 | var activeElementInst$1 = null;
|
15133 | var lastSelection = null;
|
15134 | var mouseDown = false;
|
15135 |
|
15136 | // Track whether a listener exists for this plugin. If none exist, we do
|
15137 | // not extract events. See #3639.
|
15138 | var hasListener = false;
|
15139 |
|
15140 | /**
|
15141 | * Get an object which is a unique representation of the current selection.
|
15142 | *
|
15143 | * The return value will not be consistent across nodes or browsers, but
|
15144 | * two identical selections on the same node will return identical objects.
|
15145 | *
|
15146 | * @param {DOMElement} node
|
15147 | * @return {object}
|
15148 | */
|
15149 | function getSelection(node) {
|
15150 | if ('selectionStart' in node && ReactInputSelection_1.hasSelectionCapabilities(node)) {
|
15151 | return {
|
15152 | start: node.selectionStart,
|
15153 | end: node.selectionEnd
|
15154 | };
|
15155 | } else if (window.getSelection) {
|
15156 | var selection = window.getSelection();
|
15157 | return {
|
15158 | anchorNode: selection.anchorNode,
|
15159 | anchorOffset: selection.anchorOffset,
|
15160 | focusNode: selection.focusNode,
|
15161 | focusOffset: selection.focusOffset
|
15162 | };
|
15163 | } else if (document.selection) {
|
15164 | var range = document.selection.createRange();
|
15165 | return {
|
15166 | parentElement: range.parentElement(),
|
15167 | text: range.text,
|
15168 | top: range.boundingTop,
|
15169 | left: range.boundingLeft
|
15170 | };
|
15171 | }
|
15172 | }
|
15173 |
|
15174 | /**
|
15175 | * Poll selection to see whether it's changed.
|
15176 | *
|
15177 | * @param {object} nativeEvent
|
15178 | * @return {?SyntheticEvent}
|
15179 | */
|
15180 | function constructSelectEvent(nativeEvent, nativeEventTarget) {
|
15181 | // Ensure we have the right element, and that the user is not dragging a
|
15182 | // selection (this matches native `select` event behavior). In HTML5, select
|
15183 | // fires only on input and textarea thus if there's no focused element we
|
15184 | // won't dispatch.
|
15185 | if (mouseDown || activeElement$1 == null || activeElement$1 !== getActiveElement_1()) {
|
15186 | return null;
|
15187 | }
|
15188 |
|
15189 | // Only fire when selection has actually changed.
|
15190 | var currentSelection = getSelection(activeElement$1);
|
15191 | if (!lastSelection || !shallowEqual_1(lastSelection, currentSelection)) {
|
15192 | lastSelection = currentSelection;
|
15193 |
|
15194 | var syntheticEvent = SyntheticEvent_1.getPooled(eventTypes$3.select, activeElementInst$1, nativeEvent, nativeEventTarget);
|
15195 |
|
15196 | syntheticEvent.type = 'select';
|
15197 | syntheticEvent.target = activeElement$1;
|
15198 |
|
15199 | EventPropagators_1.accumulateTwoPhaseDispatches(syntheticEvent);
|
15200 |
|
15201 | return syntheticEvent;
|
15202 | }
|
15203 |
|
15204 | return null;
|
15205 | }
|
15206 |
|
15207 | /**
|
15208 | * This plugin creates an `onSelect` event that normalizes select events
|
15209 | * across form elements.
|
15210 | *
|
15211 | * Supported elements are:
|
15212 | * - input (see `isTextInputElement`)
|
15213 | * - textarea
|
15214 | * - contentEditable
|
15215 | *
|
15216 | * This differs from native browser implementations in the following ways:
|
15217 | * - Fires on contentEditable fields as well as inputs.
|
15218 | * - Fires for collapsed selection.
|
15219 | * - Fires after user input.
|
15220 | */
|
15221 | var SelectEventPlugin = {
|
15222 | eventTypes: eventTypes$3,
|
15223 |
|
15224 | extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {
|
15225 | if (!hasListener) {
|
15226 | return null;
|
15227 | }
|
15228 |
|
15229 | var targetNode = targetInst ? ReactDOMComponentTree_1.getNodeFromInstance(targetInst) : window;
|
15230 |
|
15231 | switch (topLevelType) {
|
15232 | // Track the input node that has focus.
|
15233 | case 'topFocus':
|
15234 | if (isTextInputElement_1(targetNode) || targetNode.contentEditable === 'true') {
|
15235 | activeElement$1 = targetNode;
|
15236 | activeElementInst$1 = targetInst;
|
15237 | lastSelection = null;
|
15238 | }
|
15239 | break;
|
15240 | case 'topBlur':
|
15241 | activeElement$1 = null;
|
15242 | activeElementInst$1 = null;
|
15243 | lastSelection = null;
|
15244 | break;
|
15245 | // Don't fire the event while the user is dragging. This matches the
|
15246 | // semantics of the native select event.
|
15247 | case 'topMouseDown':
|
15248 | mouseDown = true;
|
15249 | break;
|
15250 | case 'topContextMenu':
|
15251 | case 'topMouseUp':
|
15252 | mouseDown = false;
|
15253 | return constructSelectEvent(nativeEvent, nativeEventTarget);
|
15254 | // Chrome and IE fire non-standard event when selection is changed (and
|
15255 | // sometimes when it hasn't). IE's event fires out of order with respect
|
15256 | // to key and input events on deletion, so we discard it.
|
15257 | //
|
15258 | // Firefox doesn't support selectionchange, so check selection status
|
15259 | // after each key entry. The selection changes after keydown and before
|
15260 | // keyup, but we check on keydown as well in the case of holding down a
|
15261 | // key, when multiple keydown events are fired but only one keyup is.
|
15262 | // This is also our approach for IE handling, for the reason above.
|
15263 | case 'topSelectionChange':
|
15264 | if (skipSelectionChangeEvent) {
|
15265 | break;
|
15266 | }
|
15267 | // falls through
|
15268 | case 'topKeyDown':
|
15269 | case 'topKeyUp':
|
15270 | return constructSelectEvent(nativeEvent, nativeEventTarget);
|
15271 | }
|
15272 |
|
15273 | return null;
|
15274 | },
|
15275 |
|
15276 | didPutListener: function (inst, registrationName, listener) {
|
15277 | if (registrationName === 'onSelect') {
|
15278 | hasListener = true;
|
15279 | }
|
15280 | }
|
15281 | };
|
15282 |
|
15283 | var SelectEventPlugin_1 = SelectEventPlugin;
|
15284 |
|
15285 | /**
|
15286 | * @interface Event
|
15287 | * @see http://www.w3.org/TR/css3-animations/#AnimationEvent-interface
|
15288 | * @see https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent
|
15289 | */
|
15290 | var AnimationEventInterface = {
|
15291 | animationName: null,
|
15292 | elapsedTime: null,
|
15293 | pseudoElement: null
|
15294 | };
|
15295 |
|
15296 | /**
|
15297 | * @param {object} dispatchConfig Configuration used to dispatch this event.
|
15298 | * @param {string} dispatchMarker Marker identifying the event target.
|
15299 | * @param {object} nativeEvent Native browser event.
|
15300 | * @extends {SyntheticEvent}
|
15301 | */
|
15302 | function SyntheticAnimationEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
15303 | return SyntheticEvent_1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
15304 | }
|
15305 |
|
15306 | SyntheticEvent_1.augmentClass(SyntheticAnimationEvent, AnimationEventInterface);
|
15307 |
|
15308 | var SyntheticAnimationEvent_1 = SyntheticAnimationEvent;
|
15309 |
|
15310 | /**
|
15311 | * @interface Event
|
15312 | * @see http://www.w3.org/TR/clipboard-apis/
|
15313 | */
|
15314 | var ClipboardEventInterface = {
|
15315 | clipboardData: function (event) {
|
15316 | return 'clipboardData' in event ? event.clipboardData : window.clipboardData;
|
15317 | }
|
15318 | };
|
15319 |
|
15320 | /**
|
15321 | * @param {object} dispatchConfig Configuration used to dispatch this event.
|
15322 | * @param {string} dispatchMarker Marker identifying the event target.
|
15323 | * @param {object} nativeEvent Native browser event.
|
15324 | * @extends {SyntheticUIEvent}
|
15325 | */
|
15326 | function SyntheticClipboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
15327 | return SyntheticEvent_1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
15328 | }
|
15329 |
|
15330 | SyntheticEvent_1.augmentClass(SyntheticClipboardEvent, ClipboardEventInterface);
|
15331 |
|
15332 | var SyntheticClipboardEvent_1 = SyntheticClipboardEvent;
|
15333 |
|
15334 | /**
|
15335 | * @interface FocusEvent
|
15336 | * @see http://www.w3.org/TR/DOM-Level-3-Events/
|
15337 | */
|
15338 | var FocusEventInterface = {
|
15339 | relatedTarget: null
|
15340 | };
|
15341 |
|
15342 | /**
|
15343 | * @param {object} dispatchConfig Configuration used to dispatch this event.
|
15344 | * @param {string} dispatchMarker Marker identifying the event target.
|
15345 | * @param {object} nativeEvent Native browser event.
|
15346 | * @extends {SyntheticUIEvent}
|
15347 | */
|
15348 | function SyntheticFocusEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
15349 | return SyntheticUIEvent_1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
15350 | }
|
15351 |
|
15352 | SyntheticUIEvent_1.augmentClass(SyntheticFocusEvent, FocusEventInterface);
|
15353 |
|
15354 | var SyntheticFocusEvent_1 = SyntheticFocusEvent;
|
15355 |
|
15356 | /**
|
15357 | * Copyright 2013-present, Facebook, Inc.
|
15358 | * All rights reserved.
|
15359 | *
|
15360 | * This source code is licensed under the BSD-style license found in the
|
15361 | * LICENSE file in the root directory of this source tree. An additional grant
|
15362 | * of patent rights can be found in the PATENTS file in the same directory.
|
15363 | *
|
15364 | */
|
15365 |
|
15366 | /**
|
15367 | * `charCode` represents the actual "character code" and is safe to use with
|
15368 | * `String.fromCharCode`. As such, only keys that correspond to printable
|
15369 | * characters produce a valid `charCode`, the only exception to this is Enter.
|
15370 | * The Tab-key is considered non-printable and does not have a `charCode`,
|
15371 | * presumably because it does not produce a tab-character in browsers.
|
15372 | *
|
15373 | * @param {object} nativeEvent Native browser event.
|
15374 | * @return {number} Normalized `charCode` property.
|
15375 | */
|
15376 |
|
15377 | function getEventCharCode(nativeEvent) {
|
15378 | var charCode;
|
15379 | var keyCode = nativeEvent.keyCode;
|
15380 |
|
15381 | if ('charCode' in nativeEvent) {
|
15382 | charCode = nativeEvent.charCode;
|
15383 |
|
15384 | // FF does not set `charCode` for the Enter-key, check against `keyCode`.
|
15385 | if (charCode === 0 && keyCode === 13) {
|
15386 | charCode = 13;
|
15387 | }
|
15388 | } else {
|
15389 | // IE8 does not implement `charCode`, but `keyCode` has the correct value.
|
15390 | charCode = keyCode;
|
15391 | }
|
15392 |
|
15393 | // Some non-printable keys are reported in `charCode`/`keyCode`, discard them.
|
15394 | // Must not discard the (non-)printable Enter-key.
|
15395 | if (charCode >= 32 || charCode === 13) {
|
15396 | return charCode;
|
15397 | }
|
15398 |
|
15399 | return 0;
|
15400 | }
|
15401 |
|
15402 | var getEventCharCode_1 = getEventCharCode;
|
15403 |
|
15404 | /**
|
15405 | * Normalization of deprecated HTML5 `key` values
|
15406 | * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names
|
15407 | */
|
15408 | var normalizeKey = {
|
15409 | Esc: 'Escape',
|
15410 | Spacebar: ' ',
|
15411 | Left: 'ArrowLeft',
|
15412 | Up: 'ArrowUp',
|
15413 | Right: 'ArrowRight',
|
15414 | Down: 'ArrowDown',
|
15415 | Del: 'Delete',
|
15416 | Win: 'OS',
|
15417 | Menu: 'ContextMenu',
|
15418 | Apps: 'ContextMenu',
|
15419 | Scroll: 'ScrollLock',
|
15420 | MozPrintableKey: 'Unidentified'
|
15421 | };
|
15422 |
|
15423 | /**
|
15424 | * Translation from legacy `keyCode` to HTML5 `key`
|
15425 | * Only special keys supported, all others depend on keyboard layout or browser
|
15426 | * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names
|
15427 | */
|
15428 | var translateToKey = {
|
15429 | 8: 'Backspace',
|
15430 | 9: 'Tab',
|
15431 | 12: 'Clear',
|
15432 | 13: 'Enter',
|
15433 | 16: 'Shift',
|
15434 | 17: 'Control',
|
15435 | 18: 'Alt',
|
15436 | 19: 'Pause',
|
15437 | 20: 'CapsLock',
|
15438 | 27: 'Escape',
|
15439 | 32: ' ',
|
15440 | 33: 'PageUp',
|
15441 | 34: 'PageDown',
|
15442 | 35: 'End',
|
15443 | 36: 'Home',
|
15444 | 37: 'ArrowLeft',
|
15445 | 38: 'ArrowUp',
|
15446 | 39: 'ArrowRight',
|
15447 | 40: 'ArrowDown',
|
15448 | 45: 'Insert',
|
15449 | 46: 'Delete',
|
15450 | 112: 'F1',
|
15451 | 113: 'F2',
|
15452 | 114: 'F3',
|
15453 | 115: 'F4',
|
15454 | 116: 'F5',
|
15455 | 117: 'F6',
|
15456 | 118: 'F7',
|
15457 | 119: 'F8',
|
15458 | 120: 'F9',
|
15459 | 121: 'F10',
|
15460 | 122: 'F11',
|
15461 | 123: 'F12',
|
15462 | 144: 'NumLock',
|
15463 | 145: 'ScrollLock',
|
15464 | 224: 'Meta'
|
15465 | };
|
15466 |
|
15467 | /**
|
15468 | * @param {object} nativeEvent Native browser event.
|
15469 | * @return {string} Normalized `key` property.
|
15470 | */
|
15471 | function getEventKey(nativeEvent) {
|
15472 | if (nativeEvent.key) {
|
15473 | // Normalize inconsistent values reported by browsers due to
|
15474 | // implementations of a working draft specification.
|
15475 |
|
15476 | // FireFox implements `key` but returns `MozPrintableKey` for all
|
15477 | // printable characters (normalized to `Unidentified`), ignore it.
|
15478 | var key = normalizeKey[nativeEvent.key] || nativeEvent.key;
|
15479 | if (key !== 'Unidentified') {
|
15480 | return key;
|
15481 | }
|
15482 | }
|
15483 |
|
15484 | // Browser does not implement `key`, polyfill as much of it as we can.
|
15485 | if (nativeEvent.type === 'keypress') {
|
15486 | var charCode = getEventCharCode_1(nativeEvent);
|
15487 |
|
15488 | // The enter-key is technically both printable and non-printable and can
|
15489 | // thus be captured by `keypress`, no other non-printable key should.
|
15490 | return charCode === 13 ? 'Enter' : String.fromCharCode(charCode);
|
15491 | }
|
15492 | if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') {
|
15493 | // While user keyboard layout determines the actual meaning of each
|
15494 | // `keyCode` value, almost all function keys have a universal value.
|
15495 | return translateToKey[nativeEvent.keyCode] || 'Unidentified';
|
15496 | }
|
15497 | return '';
|
15498 | }
|
15499 |
|
15500 | var getEventKey_1 = getEventKey;
|
15501 |
|
15502 | /**
|
15503 | * @interface KeyboardEvent
|
15504 | * @see http://www.w3.org/TR/DOM-Level-3-Events/
|
15505 | */
|
15506 | var KeyboardEventInterface = {
|
15507 | key: getEventKey_1,
|
15508 | location: null,
|
15509 | ctrlKey: null,
|
15510 | shiftKey: null,
|
15511 | altKey: null,
|
15512 | metaKey: null,
|
15513 | repeat: null,
|
15514 | locale: null,
|
15515 | getModifierState: getEventModifierState_1,
|
15516 | // Legacy Interface
|
15517 | charCode: function (event) {
|
15518 | // `charCode` is the result of a KeyPress event and represents the value of
|
15519 | // the actual printable character.
|
15520 |
|
15521 | // KeyPress is deprecated, but its replacement is not yet final and not
|
15522 | // implemented in any major browser. Only KeyPress has charCode.
|
15523 | if (event.type === 'keypress') {
|
15524 | return getEventCharCode_1(event);
|
15525 | }
|
15526 | return 0;
|
15527 | },
|
15528 | keyCode: function (event) {
|
15529 | // `keyCode` is the result of a KeyDown/Up event and represents the value of
|
15530 | // physical keyboard key.
|
15531 |
|
15532 | // The actual meaning of the value depends on the users' keyboard layout
|
15533 | // which cannot be detected. Assuming that it is a US keyboard layout
|
15534 | // provides a surprisingly accurate mapping for US and European users.
|
15535 | // Due to this, it is left to the user to implement at this time.
|
15536 | if (event.type === 'keydown' || event.type === 'keyup') {
|
15537 | return event.keyCode;
|
15538 | }
|
15539 | return 0;
|
15540 | },
|
15541 | which: function (event) {
|
15542 | // `which` is an alias for either `keyCode` or `charCode` depending on the
|
15543 | // type of the event.
|
15544 | if (event.type === 'keypress') {
|
15545 | return getEventCharCode_1(event);
|
15546 | }
|
15547 | if (event.type === 'keydown' || event.type === 'keyup') {
|
15548 | return event.keyCode;
|
15549 | }
|
15550 | return 0;
|
15551 | }
|
15552 | };
|
15553 |
|
15554 | /**
|
15555 | * @param {object} dispatchConfig Configuration used to dispatch this event.
|
15556 | * @param {string} dispatchMarker Marker identifying the event target.
|
15557 | * @param {object} nativeEvent Native browser event.
|
15558 | * @extends {SyntheticUIEvent}
|
15559 | */
|
15560 | function SyntheticKeyboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
15561 | return SyntheticUIEvent_1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
15562 | }
|
15563 |
|
15564 | SyntheticUIEvent_1.augmentClass(SyntheticKeyboardEvent, KeyboardEventInterface);
|
15565 |
|
15566 | var SyntheticKeyboardEvent_1 = SyntheticKeyboardEvent;
|
15567 |
|
15568 | /**
|
15569 | * @interface DragEvent
|
15570 | * @see http://www.w3.org/TR/DOM-Level-3-Events/
|
15571 | */
|
15572 | var DragEventInterface = {
|
15573 | dataTransfer: null
|
15574 | };
|
15575 |
|
15576 | /**
|
15577 | * @param {object} dispatchConfig Configuration used to dispatch this event.
|
15578 | * @param {string} dispatchMarker Marker identifying the event target.
|
15579 | * @param {object} nativeEvent Native browser event.
|
15580 | * @extends {SyntheticUIEvent}
|
15581 | */
|
15582 | function SyntheticDragEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
15583 | return SyntheticMouseEvent_1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
15584 | }
|
15585 |
|
15586 | SyntheticMouseEvent_1.augmentClass(SyntheticDragEvent, DragEventInterface);
|
15587 |
|
15588 | var SyntheticDragEvent_1 = SyntheticDragEvent;
|
15589 |
|
15590 | /**
|
15591 | * @interface TouchEvent
|
15592 | * @see http://www.w3.org/TR/touch-events/
|
15593 | */
|
15594 | var TouchEventInterface = {
|
15595 | touches: null,
|
15596 | targetTouches: null,
|
15597 | changedTouches: null,
|
15598 | altKey: null,
|
15599 | metaKey: null,
|
15600 | ctrlKey: null,
|
15601 | shiftKey: null,
|
15602 | getModifierState: getEventModifierState_1
|
15603 | };
|
15604 |
|
15605 | /**
|
15606 | * @param {object} dispatchConfig Configuration used to dispatch this event.
|
15607 | * @param {string} dispatchMarker Marker identifying the event target.
|
15608 | * @param {object} nativeEvent Native browser event.
|
15609 | * @extends {SyntheticUIEvent}
|
15610 | */
|
15611 | function SyntheticTouchEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
15612 | return SyntheticUIEvent_1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
15613 | }
|
15614 |
|
15615 | SyntheticUIEvent_1.augmentClass(SyntheticTouchEvent, TouchEventInterface);
|
15616 |
|
15617 | var SyntheticTouchEvent_1 = SyntheticTouchEvent;
|
15618 |
|
15619 | /**
|
15620 | * @interface Event
|
15621 | * @see http://www.w3.org/TR/2009/WD-css3-transitions-20090320/#transition-events-
|
15622 | * @see https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent
|
15623 | */
|
15624 | var TransitionEventInterface = {
|
15625 | propertyName: null,
|
15626 | elapsedTime: null,
|
15627 | pseudoElement: null
|
15628 | };
|
15629 |
|
15630 | /**
|
15631 | * @param {object} dispatchConfig Configuration used to dispatch this event.
|
15632 | * @param {string} dispatchMarker Marker identifying the event target.
|
15633 | * @param {object} nativeEvent Native browser event.
|
15634 | * @extends {SyntheticEvent}
|
15635 | */
|
15636 | function SyntheticTransitionEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
15637 | return SyntheticEvent_1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
15638 | }
|
15639 |
|
15640 | SyntheticEvent_1.augmentClass(SyntheticTransitionEvent, TransitionEventInterface);
|
15641 |
|
15642 | var SyntheticTransitionEvent_1 = SyntheticTransitionEvent;
|
15643 |
|
15644 | /**
|
15645 | * @interface WheelEvent
|
15646 | * @see http://www.w3.org/TR/DOM-Level-3-Events/
|
15647 | */
|
15648 | var WheelEventInterface = {
|
15649 | deltaX: function (event) {
|
15650 | return 'deltaX' in event ? event.deltaX : // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive).
|
15651 | 'wheelDeltaX' in event ? -event.wheelDeltaX : 0;
|
15652 | },
|
15653 | deltaY: function (event) {
|
15654 | return 'deltaY' in event ? event.deltaY : // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive).
|
15655 | 'wheelDeltaY' in event ? -event.wheelDeltaY : // Fallback to `wheelDelta` for IE<9 and normalize (down is positive).
|
15656 | 'wheelDelta' in event ? -event.wheelDelta : 0;
|
15657 | },
|
15658 | deltaZ: null,
|
15659 |
|
15660 | // Browsers without "deltaMode" is reporting in raw wheel delta where one
|
15661 | // notch on the scroll is always +/- 120, roughly equivalent to pixels.
|
15662 | // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or
|
15663 | // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size.
|
15664 | deltaMode: null
|
15665 | };
|
15666 |
|
15667 | /**
|
15668 | * @param {object} dispatchConfig Configuration used to dispatch this event.
|
15669 | * @param {string} dispatchMarker Marker identifying the event target.
|
15670 | * @param {object} nativeEvent Native browser event.
|
15671 | * @extends {SyntheticMouseEvent}
|
15672 | */
|
15673 | function SyntheticWheelEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
|
15674 | return SyntheticMouseEvent_1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
|
15675 | }
|
15676 |
|
15677 | SyntheticMouseEvent_1.augmentClass(SyntheticWheelEvent, WheelEventInterface);
|
15678 |
|
15679 | var SyntheticWheelEvent_1 = SyntheticWheelEvent;
|
15680 |
|
15681 | /**
|
15682 | * Turns
|
15683 | * ['abort', ...]
|
15684 | * into
|
15685 | * eventTypes = {
|
15686 | * 'abort': {
|
15687 | * phasedRegistrationNames: {
|
15688 | * bubbled: 'onAbort',
|
15689 | * captured: 'onAbortCapture',
|
15690 | * },
|
15691 | * dependencies: ['topAbort'],
|
15692 | * },
|
15693 | * ...
|
15694 | * };
|
15695 | * topLevelEventsToDispatchConfig = {
|
15696 | * 'topAbort': { sameConfig }
|
15697 | * };
|
15698 | */
|
15699 | var eventTypes$4 = {};
|
15700 | var topLevelEventsToDispatchConfig = {};
|
15701 | ['abort', 'animationEnd', 'animationIteration', 'animationStart', 'blur', 'canPlay', 'canPlayThrough', 'click', 'contextMenu', 'copy', 'cut', 'doubleClick', 'drag', 'dragEnd', 'dragEnter', 'dragExit', 'dragLeave', 'dragOver', 'dragStart', 'drop', 'durationChange', 'emptied', 'encrypted', 'ended', 'error', 'focus', 'input', 'invalid', 'keyDown', 'keyPress', 'keyUp', 'load', 'loadedData', 'loadedMetadata', 'loadStart', 'mouseDown', 'mouseMove', 'mouseOut', 'mouseOver', 'mouseUp', 'paste', 'pause', 'play', 'playing', 'progress', 'rateChange', 'reset', 'scroll', 'seeked', 'seeking', 'stalled', 'submit', 'suspend', 'timeUpdate', 'touchCancel', 'touchEnd', 'touchMove', 'touchStart', 'transitionEnd', 'volumeChange', 'waiting', 'wheel'].forEach(function (event) {
|
15702 | var capitalizedEvent = event[0].toUpperCase() + event.slice(1);
|
15703 | var onEvent = 'on' + capitalizedEvent;
|
15704 | var topEvent = 'top' + capitalizedEvent;
|
15705 |
|
15706 | var type = {
|
15707 | phasedRegistrationNames: {
|
15708 | bubbled: onEvent,
|
15709 | captured: onEvent + 'Capture'
|
15710 | },
|
15711 | dependencies: [topEvent]
|
15712 | };
|
15713 | eventTypes$4[event] = type;
|
15714 | topLevelEventsToDispatchConfig[topEvent] = type;
|
15715 | });
|
15716 |
|
15717 | var onClickListeners = {};
|
15718 |
|
15719 | function getDictionaryKey$1(inst) {
|
15720 | // Prevents V8 performance issue:
|
15721 | // https://github.com/facebook/react/pull/7232
|
15722 | return '.' + inst._rootNodeID;
|
15723 | }
|
15724 |
|
15725 | function isInteractive$1(tag) {
|
15726 | return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea';
|
15727 | }
|
15728 |
|
15729 | var SimpleEventPlugin = {
|
15730 | eventTypes: eventTypes$4,
|
15731 |
|
15732 | extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {
|
15733 | var dispatchConfig = topLevelEventsToDispatchConfig[topLevelType];
|
15734 | if (!dispatchConfig) {
|
15735 | return null;
|
15736 | }
|
15737 | var EventConstructor;
|
15738 | switch (topLevelType) {
|
15739 | case 'topAbort':
|
15740 | case 'topCanPlay':
|
15741 | case 'topCanPlayThrough':
|
15742 | case 'topDurationChange':
|
15743 | case 'topEmptied':
|
15744 | case 'topEncrypted':
|
15745 | case 'topEnded':
|
15746 | case 'topError':
|
15747 | case 'topInput':
|
15748 | case 'topInvalid':
|
15749 | case 'topLoad':
|
15750 | case 'topLoadedData':
|
15751 | case 'topLoadedMetadata':
|
15752 | case 'topLoadStart':
|
15753 | case 'topPause':
|
15754 | case 'topPlay':
|
15755 | case 'topPlaying':
|
15756 | case 'topProgress':
|
15757 | case 'topRateChange':
|
15758 | case 'topReset':
|
15759 | case 'topSeeked':
|
15760 | case 'topSeeking':
|
15761 | case 'topStalled':
|
15762 | case 'topSubmit':
|
15763 | case 'topSuspend':
|
15764 | case 'topTimeUpdate':
|
15765 | case 'topVolumeChange':
|
15766 | case 'topWaiting':
|
15767 | // HTML Events
|
15768 | // @see http://www.w3.org/TR/html5/index.html#events-0
|
15769 | EventConstructor = SyntheticEvent_1;
|
15770 | break;
|
15771 | case 'topKeyPress':
|
15772 | // Firefox creates a keypress event for function keys too. This removes
|
15773 | // the unwanted keypress events. Enter is however both printable and
|
15774 | // non-printable. One would expect Tab to be as well (but it isn't).
|
15775 | if (getEventCharCode_1(nativeEvent) === 0) {
|
15776 | return null;
|
15777 | }
|
15778 | /* falls through */
|
15779 | case 'topKeyDown':
|
15780 | case 'topKeyUp':
|
15781 | EventConstructor = SyntheticKeyboardEvent_1;
|
15782 | break;
|
15783 | case 'topBlur':
|
15784 | case 'topFocus':
|
15785 | EventConstructor = SyntheticFocusEvent_1;
|
15786 | break;
|
15787 | case 'topClick':
|
15788 | // Firefox creates a click event on right mouse clicks. This removes the
|
15789 | // unwanted click events.
|
15790 | if (nativeEvent.button === 2) {
|
15791 | return null;
|
15792 | }
|
15793 | /* falls through */
|
15794 | case 'topDoubleClick':
|
15795 | case 'topMouseDown':
|
15796 | case 'topMouseMove':
|
15797 | case 'topMouseUp':
|
15798 | // TODO: Disabled elements should not respond to mouse events
|
15799 | /* falls through */
|
15800 | case 'topMouseOut':
|
15801 | case 'topMouseOver':
|
15802 | case 'topContextMenu':
|
15803 | EventConstructor = SyntheticMouseEvent_1;
|
15804 | break;
|
15805 | case 'topDrag':
|
15806 | case 'topDragEnd':
|
15807 | case 'topDragEnter':
|
15808 | case 'topDragExit':
|
15809 | case 'topDragLeave':
|
15810 | case 'topDragOver':
|
15811 | case 'topDragStart':
|
15812 | case 'topDrop':
|
15813 | EventConstructor = SyntheticDragEvent_1;
|
15814 | break;
|
15815 | case 'topTouchCancel':
|
15816 | case 'topTouchEnd':
|
15817 | case 'topTouchMove':
|
15818 | case 'topTouchStart':
|
15819 | EventConstructor = SyntheticTouchEvent_1;
|
15820 | break;
|
15821 | case 'topAnimationEnd':
|
15822 | case 'topAnimationIteration':
|
15823 | case 'topAnimationStart':
|
15824 | EventConstructor = SyntheticAnimationEvent_1;
|
15825 | break;
|
15826 | case 'topTransitionEnd':
|
15827 | EventConstructor = SyntheticTransitionEvent_1;
|
15828 | break;
|
15829 | case 'topScroll':
|
15830 | EventConstructor = SyntheticUIEvent_1;
|
15831 | break;
|
15832 | case 'topWheel':
|
15833 | EventConstructor = SyntheticWheelEvent_1;
|
15834 | break;
|
15835 | case 'topCopy':
|
15836 | case 'topCut':
|
15837 | case 'topPaste':
|
15838 | EventConstructor = SyntheticClipboardEvent_1;
|
15839 | break;
|
15840 | }
|
15841 | !EventConstructor ? reactProdInvariant_1('86', topLevelType) : void 0;
|
15842 | var event = EventConstructor.getPooled(dispatchConfig, targetInst, nativeEvent, nativeEventTarget);
|
15843 | EventPropagators_1.accumulateTwoPhaseDispatches(event);
|
15844 | return event;
|
15845 | },
|
15846 |
|
15847 | didPutListener: function (inst, registrationName, listener) {
|
15848 | // Mobile Safari does not fire properly bubble click events on
|
15849 | // non-interactive elements, which means delegated click listeners do not
|
15850 | // fire. The workaround for this bug involves attaching an empty click
|
15851 | // listener on the target node.
|
15852 | // http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html
|
15853 | if (registrationName === 'onClick' && !isInteractive$1(inst._tag)) {
|
15854 | var key = getDictionaryKey$1(inst);
|
15855 | var node = ReactDOMComponentTree_1.getNodeFromInstance(inst);
|
15856 | if (!onClickListeners[key]) {
|
15857 | onClickListeners[key] = EventListener_1.listen(node, 'click', emptyFunction_1);
|
15858 | }
|
15859 | }
|
15860 | },
|
15861 |
|
15862 | willDeleteListener: function (inst, registrationName) {
|
15863 | if (registrationName === 'onClick' && !isInteractive$1(inst._tag)) {
|
15864 | var key = getDictionaryKey$1(inst);
|
15865 | onClickListeners[key].remove();
|
15866 | delete onClickListeners[key];
|
15867 | }
|
15868 | }
|
15869 | };
|
15870 |
|
15871 | var SimpleEventPlugin_1 = SimpleEventPlugin;
|
15872 |
|
15873 | var alreadyInjected = false;
|
15874 |
|
15875 | function inject() {
|
15876 | if (alreadyInjected) {
|
15877 | // TODO: This is currently true because these injections are shared between
|
15878 | // the client and the server package. They should be built independently
|
15879 | // and not share any injection state. Then this problem will be solved.
|
15880 | return;
|
15881 | }
|
15882 | alreadyInjected = true;
|
15883 |
|
15884 | ReactInjection_1.EventEmitter.injectReactEventListener(ReactEventListener_1);
|
15885 |
|
15886 | /**
|
15887 | * Inject modules for resolving DOM hierarchy and plugin ordering.
|
15888 | */
|
15889 | ReactInjection_1.EventPluginHub.injectEventPluginOrder(DefaultEventPluginOrder_1);
|
15890 | ReactInjection_1.EventPluginUtils.injectComponentTree(ReactDOMComponentTree_1);
|
15891 | ReactInjection_1.EventPluginUtils.injectTreeTraversal(ReactDOMTreeTraversal);
|
15892 |
|
15893 | /**
|
15894 | * Some important event plugins included by default (without having to require
|
15895 | * them).
|
15896 | */
|
15897 | ReactInjection_1.EventPluginHub.injectEventPluginsByName({
|
15898 | SimpleEventPlugin: SimpleEventPlugin_1,
|
15899 | EnterLeaveEventPlugin: EnterLeaveEventPlugin_1,
|
15900 | ChangeEventPlugin: ChangeEventPlugin_1,
|
15901 | SelectEventPlugin: SelectEventPlugin_1,
|
15902 | BeforeInputEventPlugin: BeforeInputEventPlugin_1
|
15903 | });
|
15904 |
|
15905 | ReactInjection_1.HostComponent.injectGenericComponentClass(ReactDOMComponent_1);
|
15906 |
|
15907 | ReactInjection_1.HostComponent.injectTextComponentClass(ReactDOMTextComponent_1);
|
15908 |
|
15909 | ReactInjection_1.DOMProperty.injectDOMPropertyConfig(ARIADOMPropertyConfig_1);
|
15910 | ReactInjection_1.DOMProperty.injectDOMPropertyConfig(HTMLDOMPropertyConfig_1);
|
15911 | ReactInjection_1.DOMProperty.injectDOMPropertyConfig(SVGDOMPropertyConfig_1);
|
15912 |
|
15913 | ReactInjection_1.EmptyComponent.injectEmptyComponentFactory(function (instantiate) {
|
15914 | return new ReactDOMEmptyComponent_1(instantiate);
|
15915 | });
|
15916 |
|
15917 | ReactInjection_1.Updates.injectReconcileTransaction(ReactReconcileTransaction_1);
|
15918 | ReactInjection_1.Updates.injectBatchingStrategy(ReactDefaultBatchingStrategy_1);
|
15919 |
|
15920 | ReactInjection_1.Component.injectEnvironment(ReactComponentBrowserEnvironment_1);
|
15921 | }
|
15922 |
|
15923 | var ReactDefaultInjection = {
|
15924 | inject: inject
|
15925 | };
|
15926 |
|
15927 | var DOC_NODE_TYPE$1 = 9;
|
15928 |
|
15929 | function ReactDOMContainerInfo(topLevelWrapper, node) {
|
15930 | var info = {
|
15931 | _topLevelWrapper: topLevelWrapper,
|
15932 | _idCounter: 1,
|
15933 | _ownerDocument: node ? node.nodeType === DOC_NODE_TYPE$1 ? node : node.ownerDocument : null,
|
15934 | _node: node,
|
15935 | _tag: node ? node.nodeName.toLowerCase() : null,
|
15936 | _namespaceURI: node ? node.namespaceURI : null
|
15937 | };
|
15938 | return info;
|
15939 | }
|
15940 |
|
15941 | var ReactDOMContainerInfo_1 = ReactDOMContainerInfo;
|
15942 |
|
15943 | /**
|
15944 | * Copyright 2013-present, Facebook, Inc.
|
15945 | * All rights reserved.
|
15946 | *
|
15947 | * This source code is licensed under the BSD-style license found in the
|
15948 | * LICENSE file in the root directory of this source tree. An additional grant
|
15949 | * of patent rights can be found in the PATENTS file in the same directory.
|
15950 | *
|
15951 | */
|
15952 |
|
15953 | var ReactDOMFeatureFlags = {
|
15954 | useCreateElement: true,
|
15955 | useFiber: false
|
15956 | };
|
15957 |
|
15958 | var ReactDOMFeatureFlags_1 = ReactDOMFeatureFlags;
|
15959 |
|
15960 | /**
|
15961 | * Copyright 2013-present, Facebook, Inc.
|
15962 | * All rights reserved.
|
15963 | *
|
15964 | * This source code is licensed under the BSD-style license found in the
|
15965 | * LICENSE file in the root directory of this source tree. An additional grant
|
15966 | * of patent rights can be found in the PATENTS file in the same directory.
|
15967 | *
|
15968 | *
|
15969 | */
|
15970 |
|
15971 | var MOD = 65521;
|
15972 |
|
15973 | // adler32 is not cryptographically strong, and is only used to sanity check that
|
15974 | // markup generated on the server matches the markup generated on the client.
|
15975 | // This implementation (a modified version of the SheetJS version) has been optimized
|
15976 | // for our use case, at the expense of conforming to the adler32 specification
|
15977 | // for non-ascii inputs.
|
15978 | function adler32(data) {
|
15979 | var a = 1;
|
15980 | var b = 0;
|
15981 | var i = 0;
|
15982 | var l = data.length;
|
15983 | var m = l & ~0x3;
|
15984 | while (i < m) {
|
15985 | var n = Math.min(i + 4096, m);
|
15986 | for (; i < n; i += 4) {
|
15987 | b += (a += data.charCodeAt(i)) + (a += data.charCodeAt(i + 1)) + (a += data.charCodeAt(i + 2)) + (a += data.charCodeAt(i + 3));
|
15988 | }
|
15989 | a %= MOD;
|
15990 | b %= MOD;
|
15991 | }
|
15992 | for (; i < l; i++) {
|
15993 | b += a += data.charCodeAt(i);
|
15994 | }
|
15995 | a %= MOD;
|
15996 | b %= MOD;
|
15997 | return a | b << 16;
|
15998 | }
|
15999 |
|
16000 | var adler32_1 = adler32;
|
16001 |
|
16002 | var TAG_END = /\/?>/;
|
16003 | var COMMENT_START = /^<\!\-\-/;
|
16004 |
|
16005 | var ReactMarkupChecksum = {
|
16006 | CHECKSUM_ATTR_NAME: 'data-react-checksum',
|
16007 |
|
16008 | /**
|
16009 | * @param {string} markup Markup string
|
16010 | * @return {string} Markup string with checksum attribute attached
|
16011 | */
|
16012 | addChecksumToMarkup: function (markup) {
|
16013 | var checksum = adler32_1(markup);
|
16014 |
|
16015 | // Add checksum (handle both parent tags, comments and self-closing tags)
|
16016 | if (COMMENT_START.test(markup)) {
|
16017 | return markup;
|
16018 | } else {
|
16019 | return markup.replace(TAG_END, ' ' + ReactMarkupChecksum.CHECKSUM_ATTR_NAME + '="' + checksum + '"$&');
|
16020 | }
|
16021 | },
|
16022 |
|
16023 | /**
|
16024 | * @param {string} markup to use
|
16025 | * @param {DOMElement} element root React element
|
16026 | * @returns {boolean} whether or not the markup is the same
|
16027 | */
|
16028 | canReuseMarkup: function (markup, element) {
|
16029 | var existingChecksum = element.getAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME);
|
16030 | existingChecksum = existingChecksum && parseInt(existingChecksum, 10);
|
16031 | var markupChecksum = adler32_1(markup);
|
16032 | return markupChecksum === existingChecksum;
|
16033 | }
|
16034 | };
|
16035 |
|
16036 | var ReactMarkupChecksum_1 = ReactMarkupChecksum;
|
16037 |
|
16038 | var ATTR_NAME$1 = DOMProperty_1.ID_ATTRIBUTE_NAME;
|
16039 | var ROOT_ATTR_NAME = DOMProperty_1.ROOT_ATTRIBUTE_NAME;
|
16040 |
|
16041 | var ELEMENT_NODE_TYPE$1 = 1;
|
16042 | var DOC_NODE_TYPE = 9;
|
16043 | var DOCUMENT_FRAGMENT_NODE_TYPE$1 = 11;
|
16044 |
|
16045 | var instancesByReactRootID = {};
|
16046 |
|
16047 | /**
|
16048 | * Finds the index of the first character
|
16049 | * that's not common between the two given strings.
|
16050 | *
|
16051 | * @return {number} the index of the character where the strings diverge
|
16052 | */
|
16053 | function firstDifferenceIndex(string1, string2) {
|
16054 | var minLen = Math.min(string1.length, string2.length);
|
16055 | for (var i = 0; i < minLen; i++) {
|
16056 | if (string1.charAt(i) !== string2.charAt(i)) {
|
16057 | return i;
|
16058 | }
|
16059 | }
|
16060 | return string1.length === string2.length ? -1 : minLen;
|
16061 | }
|
16062 |
|
16063 | /**
|
16064 | * @param {DOMElement|DOMDocument} container DOM element that may contain
|
16065 | * a React component
|
16066 | * @return {?*} DOM element that may have the reactRoot ID, or null.
|
16067 | */
|
16068 | function getReactRootElementInContainer(container) {
|
16069 | if (!container) {
|
16070 | return null;
|
16071 | }
|
16072 |
|
16073 | if (container.nodeType === DOC_NODE_TYPE) {
|
16074 | return container.documentElement;
|
16075 | } else {
|
16076 | return container.firstChild;
|
16077 | }
|
16078 | }
|
16079 |
|
16080 | function internalGetID(node) {
|
16081 | // If node is something like a window, document, or text node, none of
|
16082 | // which support attributes or a .getAttribute method, gracefully return
|
16083 | // the empty string, as if the attribute were missing.
|
16084 | return node.getAttribute && node.getAttribute(ATTR_NAME$1) || '';
|
16085 | }
|
16086 |
|
16087 | /**
|
16088 | * Mounts this component and inserts it into the DOM.
|
16089 | *
|
16090 | * @param {ReactComponent} componentInstance The instance to mount.
|
16091 | * @param {DOMElement} container DOM element to mount into.
|
16092 | * @param {ReactReconcileTransaction} transaction
|
16093 | * @param {boolean} shouldReuseMarkup If true, do not insert markup
|
16094 | */
|
16095 | function mountComponentIntoNode(wrapperInstance, container, transaction, shouldReuseMarkup, context) {
|
16096 | var markerName;
|
16097 | if (ReactFeatureFlags_1.logTopLevelRenders) {
|
16098 | var wrappedElement = wrapperInstance._currentElement.props.child;
|
16099 | var type = wrappedElement.type;
|
16100 | markerName = 'React mount: ' + (typeof type === 'string' ? type : type.displayName || type.name);
|
16101 | console.time(markerName);
|
16102 | }
|
16103 |
|
16104 | var markup = ReactReconciler_1.mountComponent(wrapperInstance, transaction, null, ReactDOMContainerInfo_1(wrapperInstance, container), context, 0 /* parentDebugID */
|
16105 | );
|
16106 |
|
16107 | if (markerName) {
|
16108 | console.timeEnd(markerName);
|
16109 | }
|
16110 |
|
16111 | wrapperInstance._renderedComponent._topLevelWrapper = wrapperInstance;
|
16112 | ReactMount._mountImageIntoNode(markup, container, wrapperInstance, shouldReuseMarkup, transaction);
|
16113 | }
|
16114 |
|
16115 | /**
|
16116 | * Batched mount.
|
16117 | *
|
16118 | * @param {ReactComponent} componentInstance The instance to mount.
|
16119 | * @param {DOMElement} container DOM element to mount into.
|
16120 | * @param {boolean} shouldReuseMarkup If true, do not insert markup
|
16121 | */
|
16122 | function batchedMountComponentIntoNode(componentInstance, container, shouldReuseMarkup, context) {
|
16123 | var transaction = ReactUpdates_1.ReactReconcileTransaction.getPooled(
|
16124 | /* useCreateElement */
|
16125 | !shouldReuseMarkup && ReactDOMFeatureFlags_1.useCreateElement);
|
16126 | transaction.perform(mountComponentIntoNode, null, componentInstance, container, transaction, shouldReuseMarkup, context);
|
16127 | ReactUpdates_1.ReactReconcileTransaction.release(transaction);
|
16128 | }
|
16129 |
|
16130 | /**
|
16131 | * Unmounts a component and removes it from the DOM.
|
16132 | *
|
16133 | * @param {ReactComponent} instance React component instance.
|
16134 | * @param {DOMElement} container DOM element to unmount from.
|
16135 | * @final
|
16136 | * @internal
|
16137 | * @see {ReactMount.unmountComponentAtNode}
|
16138 | */
|
16139 | function unmountComponentFromNode(instance, container, safely) {
|
16140 | ReactReconciler_1.unmountComponent(instance, safely);
|
16141 | if (container.nodeType === DOC_NODE_TYPE) {
|
16142 | container = container.documentElement;
|
16143 | }
|
16144 |
|
16145 | // http://jsperf.com/emptying-a-node
|
16146 | while (container.lastChild) {
|
16147 | container.removeChild(container.lastChild);
|
16148 | }
|
16149 | }
|
16150 |
|
16151 | /**
|
16152 | * True if the supplied DOM node has a direct React-rendered child that is
|
16153 | * not a React root element. Useful for warning in `render`,
|
16154 | * `unmountComponentAtNode`, etc.
|
16155 | *
|
16156 | * @param {?DOMElement} node The candidate DOM node.
|
16157 | * @return {boolean} True if the DOM element contains a direct child that was
|
16158 | * rendered by React but is not a root element.
|
16159 | * @internal
|
16160 | */
|
16161 | function hasNonRootReactChild(container) {
|
16162 | var rootEl = getReactRootElementInContainer(container);
|
16163 | if (rootEl) {
|
16164 | var inst = ReactDOMComponentTree_1.getInstanceFromNode(rootEl);
|
16165 | return !!(inst && inst._hostParent);
|
16166 | }
|
16167 | }
|
16168 |
|
16169 | /**
|
16170 | * True if the supplied DOM node is a valid node element.
|
16171 | *
|
16172 | * @param {?DOMElement} node The candidate DOM node.
|
16173 | * @return {boolean} True if the DOM is a valid DOM node.
|
16174 | * @internal
|
16175 | */
|
16176 | function isValidContainer(node) {
|
16177 | return !!(node && (node.nodeType === ELEMENT_NODE_TYPE$1 || node.nodeType === DOC_NODE_TYPE || node.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE$1));
|
16178 | }
|
16179 |
|
16180 | function getHostRootInstanceInContainer(container) {
|
16181 | var rootEl = getReactRootElementInContainer(container);
|
16182 | var prevHostInstance = rootEl && ReactDOMComponentTree_1.getInstanceFromNode(rootEl);
|
16183 | return prevHostInstance && !prevHostInstance._hostParent ? prevHostInstance : null;
|
16184 | }
|
16185 |
|
16186 | function getTopLevelWrapperInContainer(container) {
|
16187 | var root = getHostRootInstanceInContainer(container);
|
16188 | return root ? root._hostContainerInfo._topLevelWrapper : null;
|
16189 | }
|
16190 |
|
16191 | /**
|
16192 | * Temporary (?) hack so that we can store all top-level pending updates on
|
16193 | * composites instead of having to worry about different types of components
|
16194 | * here.
|
16195 | */
|
16196 | var topLevelRootCounter = 1;
|
16197 | var TopLevelWrapper = function () {
|
16198 | this.rootID = topLevelRootCounter++;
|
16199 | };
|
16200 | TopLevelWrapper.prototype.isReactComponent = {};
|
16201 | TopLevelWrapper.prototype.render = function () {
|
16202 | return this.props.child;
|
16203 | };
|
16204 | TopLevelWrapper.isReactTopLevelWrapper = true;
|
16205 |
|
16206 | /**
|
16207 | * Mounting is the process of initializing a React component by creating its
|
16208 | * representative DOM elements and inserting them into a supplied `container`.
|
16209 | * Any prior content inside `container` is destroyed in the process.
|
16210 | *
|
16211 | * ReactMount.render(
|
16212 | * component,
|
16213 | * document.getElementById('container')
|
16214 | * );
|
16215 | *
|
16216 | * <div id="container"> <-- Supplied `container`.
|
16217 | * <div data-reactid=".3"> <-- Rendered reactRoot of React
|
16218 | * // ... component.
|
16219 | * </div>
|
16220 | * </div>
|
16221 | *
|
16222 | * Inside of `container`, the first element rendered is the "reactRoot".
|
16223 | */
|
16224 | var ReactMount = {
|
16225 | TopLevelWrapper: TopLevelWrapper,
|
16226 |
|
16227 | /**
|
16228 | * Used by devtools. The keys are not important.
|
16229 | */
|
16230 | _instancesByReactRootID: instancesByReactRootID,
|
16231 |
|
16232 | /**
|
16233 | * This is a hook provided to support rendering React components while
|
16234 | * ensuring that the apparent scroll position of its `container` does not
|
16235 | * change.
|
16236 | *
|
16237 | * @param {DOMElement} container The `container` being rendered into.
|
16238 | * @param {function} renderCallback This must be called once to do the render.
|
16239 | */
|
16240 | scrollMonitor: function (container, renderCallback) {
|
16241 | renderCallback();
|
16242 | },
|
16243 |
|
16244 | /**
|
16245 | * Take a component that's already mounted into the DOM and replace its props
|
16246 | * @param {ReactComponent} prevComponent component instance already in the DOM
|
16247 | * @param {ReactElement} nextElement component instance to render
|
16248 | * @param {DOMElement} container container to render into
|
16249 | * @param {?function} callback function triggered on completion
|
16250 | */
|
16251 | _updateRootComponent: function (prevComponent, nextElement, nextContext, container, callback) {
|
16252 | ReactMount.scrollMonitor(container, function () {
|
16253 | ReactUpdateQueue_1.enqueueElementInternal(prevComponent, nextElement, nextContext);
|
16254 | if (callback) {
|
16255 | ReactUpdateQueue_1.enqueueCallbackInternal(prevComponent, callback);
|
16256 | }
|
16257 | });
|
16258 |
|
16259 | return prevComponent;
|
16260 | },
|
16261 |
|
16262 | /**
|
16263 | * Render a new component into the DOM. Hooked by hooks!
|
16264 | *
|
16265 | * @param {ReactElement} nextElement element to render
|
16266 | * @param {DOMElement} container container to render into
|
16267 | * @param {boolean} shouldReuseMarkup if we should skip the markup insertion
|
16268 | * @return {ReactComponent} nextComponent
|
16269 | */
|
16270 | _renderNewRootComponent: function (nextElement, container, shouldReuseMarkup, context) {
|
16271 | // Various parts of our code (such as ReactCompositeComponent's
|
16272 | // _renderValidatedComponent) assume that calls to render aren't nested;
|
16273 | // verify that that's the case.
|
16274 | void 0;
|
16275 |
|
16276 | !isValidContainer(container) ? reactProdInvariant_1('37') : void 0;
|
16277 |
|
16278 | ReactBrowserEventEmitter_1.ensureScrollValueMonitoring();
|
16279 | var componentInstance = instantiateReactComponent_1(nextElement, false);
|
16280 |
|
16281 | // The initial render is synchronous but any updates that happen during
|
16282 | // rendering, in componentWillMount or componentDidMount, will be batched
|
16283 | // according to the current batching strategy.
|
16284 |
|
16285 | ReactUpdates_1.batchedUpdates(batchedMountComponentIntoNode, componentInstance, container, shouldReuseMarkup, context);
|
16286 |
|
16287 | var wrapperID = componentInstance._instance.rootID;
|
16288 | instancesByReactRootID[wrapperID] = componentInstance;
|
16289 |
|
16290 | return componentInstance;
|
16291 | },
|
16292 |
|
16293 | /**
|
16294 | * Renders a React component into the DOM in the supplied `container`.
|
16295 | *
|
16296 | * If the React component was previously rendered into `container`, this will
|
16297 | * perform an update on it and only mutate the DOM as necessary to reflect the
|
16298 | * latest React component.
|
16299 | *
|
16300 | * @param {ReactComponent} parentComponent The conceptual parent of this render tree.
|
16301 | * @param {ReactElement} nextElement Component element to render.
|
16302 | * @param {DOMElement} container DOM element to render into.
|
16303 | * @param {?function} callback function triggered on completion
|
16304 | * @return {ReactComponent} Component instance rendered in `container`.
|
16305 | */
|
16306 | renderSubtreeIntoContainer: function (parentComponent, nextElement, container, callback) {
|
16307 | !(parentComponent != null && ReactInstanceMap_1.has(parentComponent)) ? reactProdInvariant_1('38') : void 0;
|
16308 | return ReactMount._renderSubtreeIntoContainer(parentComponent, nextElement, container, callback);
|
16309 | },
|
16310 |
|
16311 | _renderSubtreeIntoContainer: function (parentComponent, nextElement, container, callback) {
|
16312 | ReactUpdateQueue_1.validateCallback(callback, 'ReactDOM.render');
|
16313 | !React_1.isValidElement(nextElement) ? reactProdInvariant_1('39', typeof nextElement === 'string' ? " Instead of passing a string like 'div', pass " + "React.createElement('div') or <div />." : typeof nextElement === 'function' ? ' Instead of passing a class like Foo, pass ' + 'React.createElement(Foo) or <Foo />.' : nextElement != null && nextElement.props !== undefined ? ' This may be caused by unintentionally loading two independent ' + 'copies of React.' : '') : void 0;
|
16314 |
|
16315 | void 0;
|
16316 |
|
16317 | var nextWrappedElement = React_1.createElement(TopLevelWrapper, {
|
16318 | child: nextElement
|
16319 | });
|
16320 |
|
16321 | var nextContext;
|
16322 | if (parentComponent) {
|
16323 | var parentInst = ReactInstanceMap_1.get(parentComponent);
|
16324 | nextContext = parentInst._processChildContext(parentInst._context);
|
16325 | } else {
|
16326 | nextContext = emptyObject_1;
|
16327 | }
|
16328 |
|
16329 | var prevComponent = getTopLevelWrapperInContainer(container);
|
16330 |
|
16331 | if (prevComponent) {
|
16332 | var prevWrappedElement = prevComponent._currentElement;
|
16333 | var prevElement = prevWrappedElement.props.child;
|
16334 | if (shouldUpdateReactComponent_1(prevElement, nextElement)) {
|
16335 | var publicInst = prevComponent._renderedComponent.getPublicInstance();
|
16336 | var updatedCallback = callback && function () {
|
16337 | callback.call(publicInst);
|
16338 | };
|
16339 | ReactMount._updateRootComponent(prevComponent, nextWrappedElement, nextContext, container, updatedCallback);
|
16340 | return publicInst;
|
16341 | } else {
|
16342 | ReactMount.unmountComponentAtNode(container);
|
16343 | }
|
16344 | }
|
16345 |
|
16346 | var reactRootElement = getReactRootElementInContainer(container);
|
16347 | var containerHasReactMarkup = reactRootElement && !!internalGetID(reactRootElement);
|
16348 | var containerHasNonRootReactChild = hasNonRootReactChild(container);
|
16349 |
|
16350 | var shouldReuseMarkup = containerHasReactMarkup && !prevComponent && !containerHasNonRootReactChild;
|
16351 | var component = ReactMount._renderNewRootComponent(nextWrappedElement, container, shouldReuseMarkup, nextContext)._renderedComponent.getPublicInstance();
|
16352 | if (callback) {
|
16353 | callback.call(component);
|
16354 | }
|
16355 | return component;
|
16356 | },
|
16357 |
|
16358 | /**
|
16359 | * Renders a React component into the DOM in the supplied `container`.
|
16360 | * See https://facebook.github.io/react/docs/top-level-api.html#reactdom.render
|
16361 | *
|
16362 | * If the React component was previously rendered into `container`, this will
|
16363 | * perform an update on it and only mutate the DOM as necessary to reflect the
|
16364 | * latest React component.
|
16365 | *
|
16366 | * @param {ReactElement} nextElement Component element to render.
|
16367 | * @param {DOMElement} container DOM element to render into.
|
16368 | * @param {?function} callback function triggered on completion
|
16369 | * @return {ReactComponent} Component instance rendered in `container`.
|
16370 | */
|
16371 | render: function (nextElement, container, callback) {
|
16372 | return ReactMount._renderSubtreeIntoContainer(null, nextElement, container, callback);
|
16373 | },
|
16374 |
|
16375 | /**
|
16376 | * Unmounts and destroys the React component rendered in the `container`.
|
16377 | * See https://facebook.github.io/react/docs/top-level-api.html#reactdom.unmountcomponentatnode
|
16378 | *
|
16379 | * @param {DOMElement} container DOM element containing a React component.
|
16380 | * @return {boolean} True if a component was found in and unmounted from
|
16381 | * `container`
|
16382 | */
|
16383 | unmountComponentAtNode: function (container) {
|
16384 | // Various parts of our code (such as ReactCompositeComponent's
|
16385 | // _renderValidatedComponent) assume that calls to render aren't nested;
|
16386 | // verify that that's the case. (Strictly speaking, unmounting won't cause a
|
16387 | // render but we still don't expect to be in a render call here.)
|
16388 | void 0;
|
16389 |
|
16390 | !isValidContainer(container) ? reactProdInvariant_1('40') : void 0;
|
16391 |
|
16392 | var prevComponent = getTopLevelWrapperInContainer(container);
|
16393 | if (!prevComponent) {
|
16394 | // Check if the node being unmounted was rendered by React, but isn't a
|
16395 | // root node.
|
16396 | var containerHasNonRootReactChild = hasNonRootReactChild(container);
|
16397 |
|
16398 | // Check if the container itself is a React root node.
|
16399 | var isContainerReactRoot = container.nodeType === 1 && container.hasAttribute(ROOT_ATTR_NAME);
|
16400 |
|
16401 | return false;
|
16402 | }
|
16403 | delete instancesByReactRootID[prevComponent._instance.rootID];
|
16404 | ReactUpdates_1.batchedUpdates(unmountComponentFromNode, prevComponent, container, false);
|
16405 | return true;
|
16406 | },
|
16407 |
|
16408 | _mountImageIntoNode: function (markup, container, instance, shouldReuseMarkup, transaction) {
|
16409 | !isValidContainer(container) ? reactProdInvariant_1('41') : void 0;
|
16410 |
|
16411 | if (shouldReuseMarkup) {
|
16412 | var rootElement = getReactRootElementInContainer(container);
|
16413 | if (ReactMarkupChecksum_1.canReuseMarkup(markup, rootElement)) {
|
16414 | ReactDOMComponentTree_1.precacheNode(instance, rootElement);
|
16415 | return;
|
16416 | } else {
|
16417 | var checksum = rootElement.getAttribute(ReactMarkupChecksum_1.CHECKSUM_ATTR_NAME);
|
16418 | rootElement.removeAttribute(ReactMarkupChecksum_1.CHECKSUM_ATTR_NAME);
|
16419 |
|
16420 | var rootMarkup = rootElement.outerHTML;
|
16421 | rootElement.setAttribute(ReactMarkupChecksum_1.CHECKSUM_ATTR_NAME, checksum);
|
16422 |
|
16423 | var normalizedMarkup = markup;
|
16424 | var diffIndex = firstDifferenceIndex(normalizedMarkup, rootMarkup);
|
16425 | var difference = ' (client) ' + normalizedMarkup.substring(diffIndex - 20, diffIndex + 20) + '\n (server) ' + rootMarkup.substring(diffIndex - 20, diffIndex + 20);
|
16426 |
|
16427 | !(container.nodeType !== DOC_NODE_TYPE) ? reactProdInvariant_1('42', difference) : void 0;
|
16428 |
|
16429 |
|
16430 | }
|
16431 | }
|
16432 |
|
16433 | !(container.nodeType !== DOC_NODE_TYPE) ? reactProdInvariant_1('43') : void 0;
|
16434 |
|
16435 | if (transaction.useCreateElement) {
|
16436 | while (container.lastChild) {
|
16437 | container.removeChild(container.lastChild);
|
16438 | }
|
16439 | DOMLazyTree_1.insertTreeBefore(container, markup, null);
|
16440 | } else {
|
16441 | setInnerHTML_1(container, markup);
|
16442 | ReactDOMComponentTree_1.precacheNode(instance, container.firstChild);
|
16443 | }
|
16444 |
|
16445 |
|
16446 | }
|
16447 | };
|
16448 |
|
16449 | var ReactMount_1 = ReactMount;
|
16450 |
|
16451 | /**
|
16452 | * Copyright 2013-present, Facebook, Inc.
|
16453 | * All rights reserved.
|
16454 | *
|
16455 | * This source code is licensed under the BSD-style license found in the
|
16456 | * LICENSE file in the root directory of this source tree. An additional grant
|
16457 | * of patent rights can be found in the PATENTS file in the same directory.
|
16458 | *
|
16459 | */
|
16460 |
|
16461 | var ReactVersion$3 = '15.6.1';
|
16462 |
|
16463 | function getHostComponentFromComposite(inst) {
|
16464 | var type;
|
16465 |
|
16466 | while ((type = inst._renderedNodeType) === ReactNodeTypes_1.COMPOSITE) {
|
16467 | inst = inst._renderedComponent;
|
16468 | }
|
16469 |
|
16470 | if (type === ReactNodeTypes_1.HOST) {
|
16471 | return inst._renderedComponent;
|
16472 | } else if (type === ReactNodeTypes_1.EMPTY) {
|
16473 | return null;
|
16474 | }
|
16475 | }
|
16476 |
|
16477 | var getHostComponentFromComposite_1 = getHostComponentFromComposite;
|
16478 |
|
16479 | /**
|
16480 | * Returns the DOM node rendered by this element.
|
16481 | *
|
16482 | * See https://facebook.github.io/react/docs/top-level-api.html#reactdom.finddomnode
|
16483 | *
|
16484 | * @param {ReactComponent|DOMElement} componentOrElement
|
16485 | * @return {?DOMElement} The root node of this element.
|
16486 | */
|
16487 | function findDOMNode(componentOrElement) {
|
16488 | if (componentOrElement == null) {
|
16489 | return null;
|
16490 | }
|
16491 | if (componentOrElement.nodeType === 1) {
|
16492 | return componentOrElement;
|
16493 | }
|
16494 |
|
16495 | var inst = ReactInstanceMap_1.get(componentOrElement);
|
16496 | if (inst) {
|
16497 | inst = getHostComponentFromComposite_1(inst);
|
16498 | return inst ? ReactDOMComponentTree_1.getNodeFromInstance(inst) : null;
|
16499 | }
|
16500 |
|
16501 | if (typeof componentOrElement.render === 'function') {
|
16502 | reactProdInvariant_1('44');
|
16503 | } else {
|
16504 | reactProdInvariant_1('45', Object.keys(componentOrElement));
|
16505 | }
|
16506 | }
|
16507 |
|
16508 | var findDOMNode_1 = findDOMNode;
|
16509 |
|
16510 | var renderSubtreeIntoContainer = ReactMount_1.renderSubtreeIntoContainer;
|
16511 |
|
16512 | ReactDefaultInjection.inject();
|
16513 |
|
16514 | var ReactDOM = {
|
16515 | findDOMNode: findDOMNode_1,
|
16516 | render: ReactMount_1.render,
|
16517 | unmountComponentAtNode: ReactMount_1.unmountComponentAtNode,
|
16518 | version: ReactVersion$3,
|
16519 |
|
16520 | /* eslint-disable camelcase */
|
16521 | unstable_batchedUpdates: ReactUpdates_1.batchedUpdates,
|
16522 | unstable_renderSubtreeIntoContainer: renderSubtreeIntoContainer
|
16523 | /* eslint-enable camelcase */
|
16524 | };
|
16525 |
|
16526 | // Inject the runtime into a devtools global hook regardless of browser.
|
16527 | // Allows for debugging when the hook is injected on the page.
|
16528 | if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject === 'function') {
|
16529 | __REACT_DEVTOOLS_GLOBAL_HOOK__.inject({
|
16530 | ComponentTree: {
|
16531 | getClosestInstanceFromNode: ReactDOMComponentTree_1.getClosestInstanceFromNode,
|
16532 | getNodeFromInstance: function (inst) {
|
16533 | // inst is an internal instance (but could be a composite)
|
16534 | if (inst._renderedComponent) {
|
16535 | inst = getHostComponentFromComposite_1(inst);
|
16536 | }
|
16537 | if (inst) {
|
16538 | return ReactDOMComponentTree_1.getNodeFromInstance(inst);
|
16539 | } else {
|
16540 | return null;
|
16541 | }
|
16542 | }
|
16543 | },
|
16544 | Mount: ReactMount_1,
|
16545 | Reconciler: ReactReconciler_1
|
16546 | });
|
16547 | }
|
16548 |
|
16549 | var ReactDOM_1 = ReactDOM;
|
16550 |
|
16551 | var reactDom = ReactDOM_1;
|
16552 |
|
16553 | var reactDom_1 = reactDom.render;
|
16554 |
|
16555 | var react = React_1;
|
16556 |
|
16557 | var _isPlaceholder = function _isPlaceholder(a) {
|
16558 | return a != null &&
|
16559 | typeof a === 'object' &&
|
16560 | a['@@functional/placeholder'] === true;
|
16561 | };
|
16562 |
|
16563 | /**
|
16564 | * Optimized internal one-arity curry function.
|
16565 | *
|
16566 | * @private
|
16567 | * @category Function
|
16568 | * @param {Function} fn The function to curry.
|
16569 | * @return {Function} The curried function.
|
16570 | */
|
16571 | var _curry1 = function _curry1(fn) {
|
16572 | return function f1(a) {
|
16573 | if (arguments.length === 0 || _isPlaceholder(a)) {
|
16574 | return f1;
|
16575 | } else {
|
16576 | return fn.apply(this, arguments);
|
16577 | }
|
16578 | };
|
16579 | };
|
16580 |
|
16581 | /**
|
16582 | * Returns a function that always returns the given value. Note that for
|
16583 | * non-primitives the value returned is a reference to the original value.
|
16584 | *
|
16585 | * This function is known as `const`, `constant`, or `K` (for K combinator) in
|
16586 | * other languages and libraries.
|
16587 | *
|
16588 | * @func
|
16589 | * @memberOf R
|
16590 | * @since v0.1.0
|
16591 | * @category Function
|
16592 | * @sig a -> (* -> a)
|
16593 | * @param {*} val The value to wrap in a function
|
16594 | * @return {Function} A Function :: * -> val.
|
16595 | * @example
|
16596 | *
|
16597 | * var t = R.always('Tee');
|
16598 | * t(); //=> 'Tee'
|
16599 | */
|
16600 | var always = _curry1(function always(val) {
|
16601 | return function() {
|
16602 | return val;
|
16603 | };
|
16604 | });
|
16605 |
|
16606 | /**
|
16607 | * A function that always returns `false`. Any passed in parameters are ignored.
|
16608 | *
|
16609 | * @func
|
16610 | * @memberOf R
|
16611 | * @since v0.9.0
|
16612 | * @category Function
|
16613 | * @sig * -> Boolean
|
16614 | * @param {*}
|
16615 | * @return {Boolean}
|
16616 | * @see R.always, R.T
|
16617 | * @example
|
16618 | *
|
16619 | * R.F(); //=> false
|
16620 | */
|
16621 | var F = always(false);
|
16622 |
|
16623 | /**
|
16624 | * A function that always returns `true`. Any passed in parameters are ignored.
|
16625 | *
|
16626 | * @func
|
16627 | * @memberOf R
|
16628 | * @since v0.9.0
|
16629 | * @category Function
|
16630 | * @sig * -> Boolean
|
16631 | * @param {*}
|
16632 | * @return {Boolean}
|
16633 | * @see R.always, R.F
|
16634 | * @example
|
16635 | *
|
16636 | * R.T(); //=> true
|
16637 | */
|
16638 | var T = always(true);
|
16639 |
|
16640 | /**
|
16641 | * A special placeholder value used to specify "gaps" within curried functions,
|
16642 | * allowing partial application of any combination of arguments, regardless of
|
16643 | * their positions.
|
16644 | *
|
16645 | * If `g` is a curried ternary function and `_` is `R.__`, the following are
|
16646 | * equivalent:
|
16647 | *
|
16648 | * - `g(1, 2, 3)`
|
16649 | * - `g(_, 2, 3)(1)`
|
16650 | * - `g(_, _, 3)(1)(2)`
|
16651 | * - `g(_, _, 3)(1, 2)`
|
16652 | * - `g(_, 2, _)(1, 3)`
|
16653 | * - `g(_, 2)(1)(3)`
|
16654 | * - `g(_, 2)(1, 3)`
|
16655 | * - `g(_, 2)(_, 3)(1)`
|
16656 | *
|
16657 | * @constant
|
16658 | * @memberOf R
|
16659 | * @since v0.6.0
|
16660 | * @category Function
|
16661 | * @example
|
16662 | *
|
16663 | * var greet = R.replace('{name}', R.__, 'Hello, {name}!');
|
16664 | * greet('Alice'); //=> 'Hello, Alice!'
|
16665 | */
|
16666 | var __ = {'@@functional/placeholder': true};
|
16667 |
|
16668 | /**
|
16669 | * Optimized internal two-arity curry function.
|
16670 | *
|
16671 | * @private
|
16672 | * @category Function
|
16673 | * @param {Function} fn The function to curry.
|
16674 | * @return {Function} The curried function.
|
16675 | */
|
16676 | var _curry2 = function _curry2(fn) {
|
16677 | return function f2(a, b) {
|
16678 | switch (arguments.length) {
|
16679 | case 0:
|
16680 | return f2;
|
16681 | case 1:
|
16682 | return _isPlaceholder(a) ? f2
|
16683 | : _curry1(function(_b) { return fn(a, _b); });
|
16684 | default:
|
16685 | return _isPlaceholder(a) && _isPlaceholder(b) ? f2
|
16686 | : _isPlaceholder(a) ? _curry1(function(_a) { return fn(_a, b); })
|
16687 | : _isPlaceholder(b) ? _curry1(function(_b) { return fn(a, _b); })
|
16688 | : fn(a, b);
|
16689 | }
|
16690 | };
|
16691 | };
|
16692 |
|
16693 | /**
|
16694 | * Adds two values.
|
16695 | *
|
16696 | * @func
|
16697 | * @memberOf R
|
16698 | * @since v0.1.0
|
16699 | * @category Math
|
16700 | * @sig Number -> Number -> Number
|
16701 | * @param {Number} a
|
16702 | * @param {Number} b
|
16703 | * @return {Number}
|
16704 | * @see R.subtract
|
16705 | * @example
|
16706 | *
|
16707 | * R.add(2, 3); //=> 5
|
16708 | * R.add(7)(10); //=> 17
|
16709 | */
|
16710 | var add = _curry2(function add(a, b) {
|
16711 | return Number(a) + Number(b);
|
16712 | });
|
16713 |
|
16714 | /**
|
16715 | * Private `concat` function to merge two array-like objects.
|
16716 | *
|
16717 | * @private
|
16718 | * @param {Array|Arguments} [set1=[]] An array-like object.
|
16719 | * @param {Array|Arguments} [set2=[]] An array-like object.
|
16720 | * @return {Array} A new, merged array.
|
16721 | * @example
|
16722 | *
|
16723 | * _concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3]
|
16724 | */
|
16725 | var _concat = function _concat(set1, set2) {
|
16726 | set1 = set1 || [];
|
16727 | set2 = set2 || [];
|
16728 | var idx;
|
16729 | var len1 = set1.length;
|
16730 | var len2 = set2.length;
|
16731 | var result = [];
|
16732 |
|
16733 | idx = 0;
|
16734 | while (idx < len1) {
|
16735 | result[result.length] = set1[idx];
|
16736 | idx += 1;
|
16737 | }
|
16738 | idx = 0;
|
16739 | while (idx < len2) {
|
16740 | result[result.length] = set2[idx];
|
16741 | idx += 1;
|
16742 | }
|
16743 | return result;
|
16744 | };
|
16745 |
|
16746 | var _arity = function _arity(n, fn) {
|
16747 | /* eslint-disable no-unused-vars */
|
16748 | switch (n) {
|
16749 | case 0: return function() { return fn.apply(this, arguments); };
|
16750 | case 1: return function(a0) { return fn.apply(this, arguments); };
|
16751 | case 2: return function(a0, a1) { return fn.apply(this, arguments); };
|
16752 | case 3: return function(a0, a1, a2) { return fn.apply(this, arguments); };
|
16753 | case 4: return function(a0, a1, a2, a3) { return fn.apply(this, arguments); };
|
16754 | case 5: return function(a0, a1, a2, a3, a4) { return fn.apply(this, arguments); };
|
16755 | case 6: return function(a0, a1, a2, a3, a4, a5) { return fn.apply(this, arguments); };
|
16756 | case 7: return function(a0, a1, a2, a3, a4, a5, a6) { return fn.apply(this, arguments); };
|
16757 | case 8: return function(a0, a1, a2, a3, a4, a5, a6, a7) { return fn.apply(this, arguments); };
|
16758 | case 9: return function(a0, a1, a2, a3, a4, a5, a6, a7, a8) { return fn.apply(this, arguments); };
|
16759 | case 10: return function(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) { return fn.apply(this, arguments); };
|
16760 | default: throw new Error('First argument to _arity must be a non-negative integer no greater than ten');
|
16761 | }
|
16762 | };
|
16763 |
|
16764 | /**
|
16765 | * Internal curryN function.
|
16766 | *
|
16767 | * @private
|
16768 | * @category Function
|
16769 | * @param {Number} length The arity of the curried function.
|
16770 | * @param {Array} received An array of arguments received thus far.
|
16771 | * @param {Function} fn The function to curry.
|
16772 | * @return {Function} The curried function.
|
16773 | */
|
16774 | var _curryN = function _curryN(length, received, fn) {
|
16775 | return function() {
|
16776 | var combined = [];
|
16777 | var argsIdx = 0;
|
16778 | var left = length;
|
16779 | var combinedIdx = 0;
|
16780 | while (combinedIdx < received.length || argsIdx < arguments.length) {
|
16781 | var result;
|
16782 | if (combinedIdx < received.length &&
|
16783 | (!_isPlaceholder(received[combinedIdx]) ||
|
16784 | argsIdx >= arguments.length)) {
|
16785 | result = received[combinedIdx];
|
16786 | } else {
|
16787 | result = arguments[argsIdx];
|
16788 | argsIdx += 1;
|
16789 | }
|
16790 | combined[combinedIdx] = result;
|
16791 | if (!_isPlaceholder(result)) {
|
16792 | left -= 1;
|
16793 | }
|
16794 | combinedIdx += 1;
|
16795 | }
|
16796 | return left <= 0 ? fn.apply(this, combined)
|
16797 | : _arity(left, _curryN(length, combined, fn));
|
16798 | };
|
16799 | };
|
16800 |
|
16801 | /**
|
16802 | * Returns a curried equivalent of the provided function, with the specified
|
16803 | * arity. The curried function has two unusual capabilities. First, its
|
16804 | * arguments needn't be provided one at a time. If `g` is `R.curryN(3, f)`, the
|
16805 | * following are equivalent:
|
16806 | *
|
16807 | * - `g(1)(2)(3)`
|
16808 | * - `g(1)(2, 3)`
|
16809 | * - `g(1, 2)(3)`
|
16810 | * - `g(1, 2, 3)`
|
16811 | *
|
16812 | * Secondly, the special placeholder value `R.__` may be used to specify
|
16813 | * "gaps", allowing partial application of any combination of arguments,
|
16814 | * regardless of their positions. If `g` is as above and `_` is `R.__`, the
|
16815 | * following are equivalent:
|
16816 | *
|
16817 | * - `g(1, 2, 3)`
|
16818 | * - `g(_, 2, 3)(1)`
|
16819 | * - `g(_, _, 3)(1)(2)`
|
16820 | * - `g(_, _, 3)(1, 2)`
|
16821 | * - `g(_, 2)(1)(3)`
|
16822 | * - `g(_, 2)(1, 3)`
|
16823 | * - `g(_, 2)(_, 3)(1)`
|
16824 | *
|
16825 | * @func
|
16826 | * @memberOf R
|
16827 | * @since v0.5.0
|
16828 | * @category Function
|
16829 | * @sig Number -> (* -> a) -> (* -> a)
|
16830 | * @param {Number} length The arity for the returned function.
|
16831 | * @param {Function} fn The function to curry.
|
16832 | * @return {Function} A new, curried function.
|
16833 | * @see R.curry
|
16834 | * @example
|
16835 | *
|
16836 | * var sumArgs = (...args) => R.sum(args);
|
16837 | *
|
16838 | * var curriedAddFourNumbers = R.curryN(4, sumArgs);
|
16839 | * var f = curriedAddFourNumbers(1, 2);
|
16840 | * var g = f(3);
|
16841 | * g(4); //=> 10
|
16842 | */
|
16843 | var curryN = _curry2(function curryN(length, fn) {
|
16844 | if (length === 1) {
|
16845 | return _curry1(fn);
|
16846 | }
|
16847 | return _arity(length, _curryN(length, [], fn));
|
16848 | });
|
16849 |
|
16850 | /**
|
16851 | * Creates a new list iteration function from an existing one by adding two new
|
16852 | * parameters to its callback function: the current index, and the entire list.
|
16853 | *
|
16854 | * This would turn, for instance, Ramda's simple `map` function into one that
|
16855 | * more closely resembles `Array.prototype.map`. Note that this will only work
|
16856 | * for functions in which the iteration callback function is the first
|
16857 | * parameter, and where the list is the last parameter. (This latter might be
|
16858 | * unimportant if the list parameter is not used.)
|
16859 | *
|
16860 | * @func
|
16861 | * @memberOf R
|
16862 | * @since v0.15.0
|
16863 | * @category Function
|
16864 | * @category List
|
16865 | * @sig ((a ... -> b) ... -> [a] -> *) -> (a ..., Int, [a] -> b) ... -> [a] -> *)
|
16866 | * @param {Function} fn A list iteration function that does not pass index or list to its callback
|
16867 | * @return {Function} An altered list iteration function that passes (item, index, list) to its callback
|
16868 | * @example
|
16869 | *
|
16870 | * var mapIndexed = R.addIndex(R.map);
|
16871 | * mapIndexed((val, idx) => idx + '-' + val, ['f', 'o', 'o', 'b', 'a', 'r']);
|
16872 | * //=> ['0-f', '1-o', '2-o', '3-b', '4-a', '5-r']
|
16873 | */
|
16874 | var addIndex = _curry1(function addIndex(fn) {
|
16875 | return curryN(fn.length, function() {
|
16876 | var idx = 0;
|
16877 | var origFn = arguments[0];
|
16878 | var list = arguments[arguments.length - 1];
|
16879 | var args = Array.prototype.slice.call(arguments, 0);
|
16880 | args[0] = function() {
|
16881 | var result = origFn.apply(this, _concat(arguments, [idx, list]));
|
16882 | idx += 1;
|
16883 | return result;
|
16884 | };
|
16885 | return fn.apply(this, args);
|
16886 | });
|
16887 | });
|
16888 |
|
16889 | /**
|
16890 | * Optimized internal three-arity curry function.
|
16891 | *
|
16892 | * @private
|
16893 | * @category Function
|
16894 | * @param {Function} fn The function to curry.
|
16895 | * @return {Function} The curried function.
|
16896 | */
|
16897 | var _curry3 = function _curry3(fn) {
|
16898 | return function f3(a, b, c) {
|
16899 | switch (arguments.length) {
|
16900 | case 0:
|
16901 | return f3;
|
16902 | case 1:
|
16903 | return _isPlaceholder(a) ? f3
|
16904 | : _curry2(function(_b, _c) { return fn(a, _b, _c); });
|
16905 | case 2:
|
16906 | return _isPlaceholder(a) && _isPlaceholder(b) ? f3
|
16907 | : _isPlaceholder(a) ? _curry2(function(_a, _c) { return fn(_a, b, _c); })
|
16908 | : _isPlaceholder(b) ? _curry2(function(_b, _c) { return fn(a, _b, _c); })
|
16909 | : _curry1(function(_c) { return fn(a, b, _c); });
|
16910 | default:
|
16911 | return _isPlaceholder(a) && _isPlaceholder(b) && _isPlaceholder(c) ? f3
|
16912 | : _isPlaceholder(a) && _isPlaceholder(b) ? _curry2(function(_a, _b) { return fn(_a, _b, c); })
|
16913 | : _isPlaceholder(a) && _isPlaceholder(c) ? _curry2(function(_a, _c) { return fn(_a, b, _c); })
|
16914 | : _isPlaceholder(b) && _isPlaceholder(c) ? _curry2(function(_b, _c) { return fn(a, _b, _c); })
|
16915 | : _isPlaceholder(a) ? _curry1(function(_a) { return fn(_a, b, c); })
|
16916 | : _isPlaceholder(b) ? _curry1(function(_b) { return fn(a, _b, c); })
|
16917 | : _isPlaceholder(c) ? _curry1(function(_c) { return fn(a, b, _c); })
|
16918 | : fn(a, b, c);
|
16919 | }
|
16920 | };
|
16921 | };
|
16922 |
|
16923 | /**
|
16924 | * Applies a function to the value at the given index of an array, returning a
|
16925 | * new copy of the array with the element at the given index replaced with the
|
16926 | * result of the function application.
|
16927 | *
|
16928 | * @func
|
16929 | * @memberOf R
|
16930 | * @since v0.14.0
|
16931 | * @category List
|
16932 | * @sig (a -> a) -> Number -> [a] -> [a]
|
16933 | * @param {Function} fn The function to apply.
|
16934 | * @param {Number} idx The index.
|
16935 | * @param {Array|Arguments} list An array-like object whose value
|
16936 | * at the supplied index will be replaced.
|
16937 | * @return {Array} A copy of the supplied array-like object with
|
16938 | * the element at index `idx` replaced with the value
|
16939 | * returned by applying `fn` to the existing element.
|
16940 | * @see R.update
|
16941 | * @example
|
16942 | *
|
16943 | * R.adjust(R.add(10), 1, [1, 2, 3]); //=> [1, 12, 3]
|
16944 | * R.adjust(R.add(10))(1)([1, 2, 3]); //=> [1, 12, 3]
|
16945 | * @symb R.adjust(f, -1, [a, b]) = [a, f(b)]
|
16946 | * @symb R.adjust(f, 0, [a, b]) = [f(a), b]
|
16947 | */
|
16948 | var adjust = _curry3(function adjust(fn, idx, list) {
|
16949 | if (idx >= list.length || idx < -list.length) {
|
16950 | return list;
|
16951 | }
|
16952 | var start = idx < 0 ? list.length : 0;
|
16953 | var _idx = start + idx;
|
16954 | var _list = _concat(list);
|
16955 | _list[_idx] = fn(list[_idx]);
|
16956 | return _list;
|
16957 | });
|
16958 |
|
16959 | /**
|
16960 | * Tests whether or not an object is an array.
|
16961 | *
|
16962 | * @private
|
16963 | * @param {*} val The object to test.
|
16964 | * @return {Boolean} `true` if `val` is an array, `false` otherwise.
|
16965 | * @example
|
16966 | *
|
16967 | * _isArray([]); //=> true
|
16968 | * _isArray(null); //=> false
|
16969 | * _isArray({}); //=> false
|
16970 | */
|
16971 | var _isArray = Array.isArray || function _isArray(val) {
|
16972 | return (val != null &&
|
16973 | val.length >= 0 &&
|
16974 | Object.prototype.toString.call(val) === '[object Array]');
|
16975 | };
|
16976 |
|
16977 | var _isTransformer = function _isTransformer(obj) {
|
16978 | return typeof obj['@@transducer/step'] === 'function';
|
16979 | };
|
16980 |
|
16981 | /**
|
16982 | * Returns a function that dispatches with different strategies based on the
|
16983 | * object in list position (last argument). If it is an array, executes [fn].
|
16984 | * Otherwise, if it has a function with one of the given method names, it will
|
16985 | * execute that function (functor case). Otherwise, if it is a transformer,
|
16986 | * uses transducer [xf] to return a new transformer (transducer case).
|
16987 | * Otherwise, it will default to executing [fn].
|
16988 | *
|
16989 | * @private
|
16990 | * @param {Array} methodNames properties to check for a custom implementation
|
16991 | * @param {Function} xf transducer to initialize if object is transformer
|
16992 | * @param {Function} fn default ramda implementation
|
16993 | * @return {Function} A function that dispatches on object in list position
|
16994 | */
|
16995 | var _dispatchable = function _dispatchable(methodNames, xf, fn) {
|
16996 | return function() {
|
16997 | if (arguments.length === 0) {
|
16998 | return fn();
|
16999 | }
|
17000 | var args = Array.prototype.slice.call(arguments, 0);
|
17001 | var obj = args.pop();
|
17002 | if (!_isArray(obj)) {
|
17003 | var idx = 0;
|
17004 | while (idx < methodNames.length) {
|
17005 | if (typeof obj[methodNames[idx]] === 'function') {
|
17006 | return obj[methodNames[idx]].apply(obj, args);
|
17007 | }
|
17008 | idx += 1;
|
17009 | }
|
17010 | if (_isTransformer(obj)) {
|
17011 | var transducer = xf.apply(null, args);
|
17012 | return transducer(obj);
|
17013 | }
|
17014 | }
|
17015 | return fn.apply(this, arguments);
|
17016 | };
|
17017 | };
|
17018 |
|
17019 | var _reduced = function _reduced(x) {
|
17020 | return x && x['@@transducer/reduced'] ? x :
|
17021 | {
|
17022 | '@@transducer/value': x,
|
17023 | '@@transducer/reduced': true
|
17024 | };
|
17025 | };
|
17026 |
|
17027 | var _xfBase = {
|
17028 | init: function() {
|
17029 | return this.xf['@@transducer/init']();
|
17030 | },
|
17031 | result: function(result) {
|
17032 | return this.xf['@@transducer/result'](result);
|
17033 | }
|
17034 | };
|
17035 |
|
17036 | var _xall = (function() {
|
17037 | function XAll(f, xf) {
|
17038 | this.xf = xf;
|
17039 | this.f = f;
|
17040 | this.all = true;
|
17041 | }
|
17042 | XAll.prototype['@@transducer/init'] = _xfBase.init;
|
17043 | XAll.prototype['@@transducer/result'] = function(result) {
|
17044 | if (this.all) {
|
17045 | result = this.xf['@@transducer/step'](result, true);
|
17046 | }
|
17047 | return this.xf['@@transducer/result'](result);
|
17048 | };
|
17049 | XAll.prototype['@@transducer/step'] = function(result, input) {
|
17050 | if (!this.f(input)) {
|
17051 | this.all = false;
|
17052 | result = _reduced(this.xf['@@transducer/step'](result, false));
|
17053 | }
|
17054 | return result;
|
17055 | };
|
17056 |
|
17057 | return _curry2(function _xall(f, xf) { return new XAll(f, xf); });
|
17058 | }());
|
17059 |
|
17060 | /**
|
17061 | * Returns `true` if all elements of the list match the predicate, `false` if
|
17062 | * there are any that don't.
|
17063 | *
|
17064 | * Dispatches to the `all` method of the second argument, if present.
|
17065 | *
|
17066 | * Acts as a transducer if a transformer is given in list position.
|
17067 | *
|
17068 | * @func
|
17069 | * @memberOf R
|
17070 | * @since v0.1.0
|
17071 | * @category List
|
17072 | * @sig (a -> Boolean) -> [a] -> Boolean
|
17073 | * @param {Function} fn The predicate function.
|
17074 | * @param {Array} list The array to consider.
|
17075 | * @return {Boolean} `true` if the predicate is satisfied by every element, `false`
|
17076 | * otherwise.
|
17077 | * @see R.any, R.none, R.transduce
|
17078 | * @example
|
17079 | *
|
17080 | * var equals3 = R.equals(3);
|
17081 | * R.all(equals3)([3, 3, 3, 3]); //=> true
|
17082 | * R.all(equals3)([3, 3, 1, 3]); //=> false
|
17083 | */
|
17084 | var all = _curry2(_dispatchable(['all'], _xall, function all(fn, list) {
|
17085 | var idx = 0;
|
17086 | while (idx < list.length) {
|
17087 | if (!fn(list[idx])) {
|
17088 | return false;
|
17089 | }
|
17090 | idx += 1;
|
17091 | }
|
17092 | return true;
|
17093 | }));
|
17094 |
|
17095 | /**
|
17096 | * Returns the larger of its two arguments.
|
17097 | *
|
17098 | * @func
|
17099 | * @memberOf R
|
17100 | * @since v0.1.0
|
17101 | * @category Relation
|
17102 | * @sig Ord a => a -> a -> a
|
17103 | * @param {*} a
|
17104 | * @param {*} b
|
17105 | * @return {*}
|
17106 | * @see R.maxBy, R.min
|
17107 | * @example
|
17108 | *
|
17109 | * R.max(789, 123); //=> 789
|
17110 | * R.max('a', 'b'); //=> 'b'
|
17111 | */
|
17112 | var max = _curry2(function max(a, b) { return b > a ? b : a; });
|
17113 |
|
17114 | var _map = function _map(fn, functor) {
|
17115 | var idx = 0;
|
17116 | var len = functor.length;
|
17117 | var result = Array(len);
|
17118 | while (idx < len) {
|
17119 | result[idx] = fn(functor[idx]);
|
17120 | idx += 1;
|
17121 | }
|
17122 | return result;
|
17123 | };
|
17124 |
|
17125 | var _xwrap = (function() {
|
17126 | function XWrap(fn) {
|
17127 | this.f = fn;
|
17128 | }
|
17129 | XWrap.prototype['@@transducer/init'] = function() {
|
17130 | throw new Error('init not implemented on XWrap');
|
17131 | };
|
17132 | XWrap.prototype['@@transducer/result'] = function(acc) { return acc; };
|
17133 | XWrap.prototype['@@transducer/step'] = function(acc, x) {
|
17134 | return this.f(acc, x);
|
17135 | };
|
17136 |
|
17137 | return function _xwrap(fn) { return new XWrap(fn); };
|
17138 | }());
|
17139 |
|
17140 | /**
|
17141 | * Creates a function that is bound to a context.
|
17142 | * Note: `R.bind` does not provide the additional argument-binding capabilities of
|
17143 | * [Function.prototype.bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).
|
17144 | *
|
17145 | * @func
|
17146 | * @memberOf R
|
17147 | * @since v0.6.0
|
17148 | * @category Function
|
17149 | * @category Object
|
17150 | * @sig (* -> *) -> {*} -> (* -> *)
|
17151 | * @param {Function} fn The function to bind to context
|
17152 | * @param {Object} thisObj The context to bind `fn` to
|
17153 | * @return {Function} A function that will execute in the context of `thisObj`.
|
17154 | * @see R.partial
|
17155 | * @example
|
17156 | *
|
17157 | * var log = R.bind(console.log, console);
|
17158 | * R.pipe(R.assoc('a', 2), R.tap(log), R.assoc('a', 3))({a: 1}); //=> {a: 3}
|
17159 | * // logs {a: 2}
|
17160 | * @symb R.bind(f, o)(a, b) = f.call(o, a, b)
|
17161 | */
|
17162 | var bind = _curry2(function bind(fn, thisObj) {
|
17163 | return _arity(fn.length, function() {
|
17164 | return fn.apply(thisObj, arguments);
|
17165 | });
|
17166 | });
|
17167 |
|
17168 | var _isString = function _isString(x) {
|
17169 | return Object.prototype.toString.call(x) === '[object String]';
|
17170 | };
|
17171 |
|
17172 | /**
|
17173 | * Tests whether or not an object is similar to an array.
|
17174 | *
|
17175 | * @func
|
17176 | * @memberOf R
|
17177 | * @since v0.5.0
|
17178 | * @category Type
|
17179 | * @category List
|
17180 | * @sig * -> Boolean
|
17181 | * @param {*} x The object to test.
|
17182 | * @return {Boolean} `true` if `x` has a numeric length property and extreme indices defined; `false` otherwise.
|
17183 | * @deprecated since v0.23.0
|
17184 | * @example
|
17185 | *
|
17186 | * R.isArrayLike([]); //=> true
|
17187 | * R.isArrayLike(true); //=> false
|
17188 | * R.isArrayLike({}); //=> false
|
17189 | * R.isArrayLike({length: 10}); //=> false
|
17190 | * R.isArrayLike({0: 'zero', 9: 'nine', length: 10}); //=> true
|
17191 | */
|
17192 | var isArrayLike = _curry1(function isArrayLike(x) {
|
17193 | if (_isArray(x)) { return true; }
|
17194 | if (!x) { return false; }
|
17195 | if (typeof x !== 'object') { return false; }
|
17196 | if (_isString(x)) { return false; }
|
17197 | if (x.nodeType === 1) { return !!x.length; }
|
17198 | if (x.length === 0) { return true; }
|
17199 | if (x.length > 0) {
|
17200 | return x.hasOwnProperty(0) && x.hasOwnProperty(x.length - 1);
|
17201 | }
|
17202 | return false;
|
17203 | });
|
17204 |
|
17205 | var _reduce = (function() {
|
17206 | function _arrayReduce(xf, acc, list) {
|
17207 | var idx = 0;
|
17208 | var len = list.length;
|
17209 | while (idx < len) {
|
17210 | acc = xf['@@transducer/step'](acc, list[idx]);
|
17211 | if (acc && acc['@@transducer/reduced']) {
|
17212 | acc = acc['@@transducer/value'];
|
17213 | break;
|
17214 | }
|
17215 | idx += 1;
|
17216 | }
|
17217 | return xf['@@transducer/result'](acc);
|
17218 | }
|
17219 |
|
17220 | function _iterableReduce(xf, acc, iter) {
|
17221 | var step = iter.next();
|
17222 | while (!step.done) {
|
17223 | acc = xf['@@transducer/step'](acc, step.value);
|
17224 | if (acc && acc['@@transducer/reduced']) {
|
17225 | acc = acc['@@transducer/value'];
|
17226 | break;
|
17227 | }
|
17228 | step = iter.next();
|
17229 | }
|
17230 | return xf['@@transducer/result'](acc);
|
17231 | }
|
17232 |
|
17233 | function _methodReduce(xf, acc, obj) {
|
17234 | return xf['@@transducer/result'](obj.reduce(bind(xf['@@transducer/step'], xf), acc));
|
17235 | }
|
17236 |
|
17237 | var symIterator = (typeof Symbol !== 'undefined') ? Symbol.iterator : '@@iterator';
|
17238 | return function _reduce(fn, acc, list) {
|
17239 | if (typeof fn === 'function') {
|
17240 | fn = _xwrap(fn);
|
17241 | }
|
17242 | if (isArrayLike(list)) {
|
17243 | return _arrayReduce(fn, acc, list);
|
17244 | }
|
17245 | if (typeof list.reduce === 'function') {
|
17246 | return _methodReduce(fn, acc, list);
|
17247 | }
|
17248 | if (list[symIterator] != null) {
|
17249 | return _iterableReduce(fn, acc, list[symIterator]());
|
17250 | }
|
17251 | if (typeof list.next === 'function') {
|
17252 | return _iterableReduce(fn, acc, list);
|
17253 | }
|
17254 | throw new TypeError('reduce: list must be array or iterable');
|
17255 | };
|
17256 | }());
|
17257 |
|
17258 | var _xmap = (function() {
|
17259 | function XMap(f, xf) {
|
17260 | this.xf = xf;
|
17261 | this.f = f;
|
17262 | }
|
17263 | XMap.prototype['@@transducer/init'] = _xfBase.init;
|
17264 | XMap.prototype['@@transducer/result'] = _xfBase.result;
|
17265 | XMap.prototype['@@transducer/step'] = function(result, input) {
|
17266 | return this.xf['@@transducer/step'](result, this.f(input));
|
17267 | };
|
17268 |
|
17269 | return _curry2(function _xmap(f, xf) { return new XMap(f, xf); });
|
17270 | }());
|
17271 |
|
17272 | var _has = function _has(prop, obj) {
|
17273 | return Object.prototype.hasOwnProperty.call(obj, prop);
|
17274 | };
|
17275 |
|
17276 | var _isArguments = (function() {
|
17277 | var toString = Object.prototype.toString;
|
17278 | return toString.call(arguments) === '[object Arguments]' ?
|
17279 | function _isArguments(x) { return toString.call(x) === '[object Arguments]'; } :
|
17280 | function _isArguments(x) { return _has('callee', x); };
|
17281 | }());
|
17282 |
|
17283 | /**
|
17284 | * Returns a list containing the names of all the enumerable own properties of
|
17285 | * the supplied object.
|
17286 | * Note that the order of the output array is not guaranteed to be consistent
|
17287 | * across different JS platforms.
|
17288 | *
|
17289 | * @func
|
17290 | * @memberOf R
|
17291 | * @since v0.1.0
|
17292 | * @category Object
|
17293 | * @sig {k: v} -> [k]
|
17294 | * @param {Object} obj The object to extract properties from
|
17295 | * @return {Array} An array of the object's own properties.
|
17296 | * @example
|
17297 | *
|
17298 | * R.keys({a: 1, b: 2, c: 3}); //=> ['a', 'b', 'c']
|
17299 | */
|
17300 | var keys = (function() {
|
17301 | // cover IE < 9 keys issues
|
17302 | var hasEnumBug = !({toString: null}).propertyIsEnumerable('toString');
|
17303 | var nonEnumerableProps = ['constructor', 'valueOf', 'isPrototypeOf', 'toString',
|
17304 | 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
|
17305 | // Safari bug
|
17306 | var hasArgsEnumBug = (function() {
|
17307 | ;
|
17308 | return arguments.propertyIsEnumerable('length');
|
17309 | }());
|
17310 |
|
17311 | var contains = function contains(list, item) {
|
17312 | var idx = 0;
|
17313 | while (idx < list.length) {
|
17314 | if (list[idx] === item) {
|
17315 | return true;
|
17316 | }
|
17317 | idx += 1;
|
17318 | }
|
17319 | return false;
|
17320 | };
|
17321 |
|
17322 | return typeof Object.keys === 'function' && !hasArgsEnumBug ?
|
17323 | _curry1(function keys(obj) {
|
17324 | return Object(obj) !== obj ? [] : Object.keys(obj);
|
17325 | }) :
|
17326 | _curry1(function keys(obj) {
|
17327 | if (Object(obj) !== obj) {
|
17328 | return [];
|
17329 | }
|
17330 | var prop, nIdx;
|
17331 | var ks = [];
|
17332 | var checkArgsLength = hasArgsEnumBug && _isArguments(obj);
|
17333 | for (prop in obj) {
|
17334 | if (_has(prop, obj) && (!checkArgsLength || prop !== 'length')) {
|
17335 | ks[ks.length] = prop;
|
17336 | }
|
17337 | }
|
17338 | if (hasEnumBug) {
|
17339 | nIdx = nonEnumerableProps.length - 1;
|
17340 | while (nIdx >= 0) {
|
17341 | prop = nonEnumerableProps[nIdx];
|
17342 | if (_has(prop, obj) && !contains(ks, prop)) {
|
17343 | ks[ks.length] = prop;
|
17344 | }
|
17345 | nIdx -= 1;
|
17346 | }
|
17347 | }
|
17348 | return ks;
|
17349 | });
|
17350 | }());
|
17351 |
|
17352 | /**
|
17353 | * Takes a function and
|
17354 | * a [functor](https://github.com/fantasyland/fantasy-land#functor),
|
17355 | * applies the function to each of the functor's values, and returns
|
17356 | * a functor of the same shape.
|
17357 | *
|
17358 | * Ramda provides suitable `map` implementations for `Array` and `Object`,
|
17359 | * so this function may be applied to `[1, 2, 3]` or `{x: 1, y: 2, z: 3}`.
|
17360 | *
|
17361 | * Dispatches to the `map` method of the second argument, if present.
|
17362 | *
|
17363 | * Acts as a transducer if a transformer is given in list position.
|
17364 | *
|
17365 | * Also treats functions as functors and will compose them together.
|
17366 | *
|
17367 | * @func
|
17368 | * @memberOf R
|
17369 | * @since v0.1.0
|
17370 | * @category List
|
17371 | * @sig Functor f => (a -> b) -> f a -> f b
|
17372 | * @param {Function} fn The function to be called on every element of the input `list`.
|
17373 | * @param {Array} list The list to be iterated over.
|
17374 | * @return {Array} The new list.
|
17375 | * @see R.transduce, R.addIndex
|
17376 | * @example
|
17377 | *
|
17378 | * var double = x => x * 2;
|
17379 | *
|
17380 | * R.map(double, [1, 2, 3]); //=> [2, 4, 6]
|
17381 | *
|
17382 | * R.map(double, {x: 1, y: 2, z: 3}); //=> {x: 2, y: 4, z: 6}
|
17383 | * @symb R.map(f, [a, b]) = [f(a), f(b)]
|
17384 | * @symb R.map(f, { x: a, y: b }) = { x: f(a), y: f(b) }
|
17385 | * @symb R.map(f, functor_o) = functor_o.map(f)
|
17386 | */
|
17387 | var map$1 = _curry2(_dispatchable(['map'], _xmap, function map(fn, functor) {
|
17388 | switch (Object.prototype.toString.call(functor)) {
|
17389 | case '[object Function]':
|
17390 | return curryN(functor.length, function() {
|
17391 | return fn.call(this, functor.apply(this, arguments));
|
17392 | });
|
17393 | case '[object Object]':
|
17394 | return _reduce(function(acc, key) {
|
17395 | acc[key] = fn(functor[key]);
|
17396 | return acc;
|
17397 | }, {}, keys(functor));
|
17398 | default:
|
17399 | return _map(fn, functor);
|
17400 | }
|
17401 | }));
|
17402 |
|
17403 | /**
|
17404 | * Returns a function that when supplied an object returns the indicated
|
17405 | * property of that object, if it exists.
|
17406 | *
|
17407 | * @func
|
17408 | * @memberOf R
|
17409 | * @since v0.1.0
|
17410 | * @category Object
|
17411 | * @sig s -> {s: a} -> a | Undefined
|
17412 | * @param {String} p The property name
|
17413 | * @param {Object} obj The object to query
|
17414 | * @return {*} The value at `obj.p`.
|
17415 | * @see R.path
|
17416 | * @example
|
17417 | *
|
17418 | * R.prop('x', {x: 100}); //=> 100
|
17419 | * R.prop('x', {}); //=> undefined
|
17420 | */
|
17421 | var prop = _curry2(function prop(p, obj) { return obj[p]; });
|
17422 |
|
17423 | /**
|
17424 | * Returns a new list by plucking the same named property off all objects in
|
17425 | * the list supplied.
|
17426 | *
|
17427 | * @func
|
17428 | * @memberOf R
|
17429 | * @since v0.1.0
|
17430 | * @category List
|
17431 | * @sig k -> [{k: v}] -> [v]
|
17432 | * @param {Number|String} key The key name to pluck off of each object.
|
17433 | * @param {Array} list The array to consider.
|
17434 | * @return {Array} The list of values for the given key.
|
17435 | * @see R.props
|
17436 | * @example
|
17437 | *
|
17438 | * R.pluck('a')([{a: 1}, {a: 2}]); //=> [1, 2]
|
17439 | * R.pluck(0)([[1, 2], [3, 4]]); //=> [1, 3]
|
17440 | * @symb R.pluck('x', [{x: 1, y: 2}, {x: 3, y: 4}, {x: 5, y: 6}]) = [1, 3, 5]
|
17441 | * @symb R.pluck(0, [[1, 2], [3, 4], [5, 6]]) = [1, 3, 5]
|
17442 | */
|
17443 | var pluck = _curry2(function pluck(p, list) {
|
17444 | return map$1(prop(p), list);
|
17445 | });
|
17446 |
|
17447 | /**
|
17448 | * Returns a single item by iterating through the list, successively calling
|
17449 | * the iterator function and passing it an accumulator value and the current
|
17450 | * value from the array, and then passing the result to the next call.
|
17451 | *
|
17452 | * The iterator function receives two values: *(acc, value)*. It may use
|
17453 | * `R.reduced` to shortcut the iteration.
|
17454 | *
|
17455 | * The arguments' order of `reduceRight`'s iterator function is *(value, acc)*.
|
17456 | *
|
17457 | * Note: `R.reduce` does not skip deleted or unassigned indices (sparse
|
17458 | * arrays), unlike the native `Array.prototype.reduce` method. For more details
|
17459 | * on this behavior, see:
|
17460 | * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#Description
|
17461 | *
|
17462 | * Dispatches to the `reduce` method of the third argument, if present.
|
17463 | *
|
17464 | * @func
|
17465 | * @memberOf R
|
17466 | * @since v0.1.0
|
17467 | * @category List
|
17468 | * @sig ((a, b) -> a) -> a -> [b] -> a
|
17469 | * @param {Function} fn The iterator function. Receives two values, the accumulator and the
|
17470 | * current element from the array.
|
17471 | * @param {*} acc The accumulator value.
|
17472 | * @param {Array} list The list to iterate over.
|
17473 | * @return {*} The final, accumulated value.
|
17474 | * @see R.reduced, R.addIndex, R.reduceRight
|
17475 | * @example
|
17476 | *
|
17477 | * R.reduce(R.subtract, 0, [1, 2, 3, 4]) // => ((((0 - 1) - 2) - 3) - 4) = -10
|
17478 | * - -10
|
17479 | * / \ / \
|
17480 | * - 4 -6 4
|
17481 | * / \ / \
|
17482 | * - 3 ==> -3 3
|
17483 | * / \ / \
|
17484 | * - 2 -1 2
|
17485 | * / \ / \
|
17486 | * 0 1 0 1
|
17487 | *
|
17488 | * @symb R.reduce(f, a, [b, c, d]) = f(f(f(a, b), c), d)
|
17489 | */
|
17490 | var reduce = _curry3(_reduce);
|
17491 |
|
17492 | /**
|
17493 | * Takes a list of predicates and returns a predicate that returns true for a
|
17494 | * given list of arguments if every one of the provided predicates is satisfied
|
17495 | * by those arguments.
|
17496 | *
|
17497 | * The function returned is a curried function whose arity matches that of the
|
17498 | * highest-arity predicate.
|
17499 | *
|
17500 | * @func
|
17501 | * @memberOf R
|
17502 | * @since v0.9.0
|
17503 | * @category Logic
|
17504 | * @sig [(*... -> Boolean)] -> (*... -> Boolean)
|
17505 | * @param {Array} predicates An array of predicates to check
|
17506 | * @return {Function} The combined predicate
|
17507 | * @see R.anyPass
|
17508 | * @example
|
17509 | *
|
17510 | * var isQueen = R.propEq('rank', 'Q');
|
17511 | * var isSpade = R.propEq('suit', '♠︎');
|
17512 | * var isQueenOfSpades = R.allPass([isQueen, isSpade]);
|
17513 | *
|
17514 | * isQueenOfSpades({rank: 'Q', suit: '♣︎'}); //=> false
|
17515 | * isQueenOfSpades({rank: 'Q', suit: '♠︎'}); //=> true
|
17516 | */
|
17517 | var allPass = _curry1(function allPass(preds) {
|
17518 | return curryN(reduce(max, 0, pluck('length', preds)), function() {
|
17519 | var idx = 0;
|
17520 | var len = preds.length;
|
17521 | while (idx < len) {
|
17522 | if (!preds[idx].apply(this, arguments)) {
|
17523 | return false;
|
17524 | }
|
17525 | idx += 1;
|
17526 | }
|
17527 | return true;
|
17528 | });
|
17529 | });
|
17530 |
|
17531 | /**
|
17532 | * Returns `true` if both arguments are `true`; `false` otherwise.
|
17533 | *
|
17534 | * @func
|
17535 | * @memberOf R
|
17536 | * @since v0.1.0
|
17537 | * @category Logic
|
17538 | * @sig a -> b -> a | b
|
17539 | * @param {Any} a
|
17540 | * @param {Any} b
|
17541 | * @return {Any} the first argument if it is falsy, otherwise the second argument.
|
17542 | * @see R.both
|
17543 | * @example
|
17544 | *
|
17545 | * R.and(true, true); //=> true
|
17546 | * R.and(true, false); //=> false
|
17547 | * R.and(false, true); //=> false
|
17548 | * R.and(false, false); //=> false
|
17549 | */
|
17550 | var and = _curry2(function and(a, b) {
|
17551 | return a && b;
|
17552 | });
|
17553 |
|
17554 | var _xany = (function() {
|
17555 | function XAny(f, xf) {
|
17556 | this.xf = xf;
|
17557 | this.f = f;
|
17558 | this.any = false;
|
17559 | }
|
17560 | XAny.prototype['@@transducer/init'] = _xfBase.init;
|
17561 | XAny.prototype['@@transducer/result'] = function(result) {
|
17562 | if (!this.any) {
|
17563 | result = this.xf['@@transducer/step'](result, false);
|
17564 | }
|
17565 | return this.xf['@@transducer/result'](result);
|
17566 | };
|
17567 | XAny.prototype['@@transducer/step'] = function(result, input) {
|
17568 | if (this.f(input)) {
|
17569 | this.any = true;
|
17570 | result = _reduced(this.xf['@@transducer/step'](result, true));
|
17571 | }
|
17572 | return result;
|
17573 | };
|
17574 |
|
17575 | return _curry2(function _xany(f, xf) { return new XAny(f, xf); });
|
17576 | }());
|
17577 |
|
17578 | /**
|
17579 | * Returns `true` if at least one of elements of the list match the predicate,
|
17580 | * `false` otherwise.
|
17581 | *
|
17582 | * Dispatches to the `any` method of the second argument, if present.
|
17583 | *
|
17584 | * Acts as a transducer if a transformer is given in list position.
|
17585 | *
|
17586 | * @func
|
17587 | * @memberOf R
|
17588 | * @since v0.1.0
|
17589 | * @category List
|
17590 | * @sig (a -> Boolean) -> [a] -> Boolean
|
17591 | * @param {Function} fn The predicate function.
|
17592 | * @param {Array} list The array to consider.
|
17593 | * @return {Boolean} `true` if the predicate is satisfied by at least one element, `false`
|
17594 | * otherwise.
|
17595 | * @see R.all, R.none, R.transduce
|
17596 | * @example
|
17597 | *
|
17598 | * var lessThan0 = R.flip(R.lt)(0);
|
17599 | * var lessThan2 = R.flip(R.lt)(2);
|
17600 | * R.any(lessThan0)([1, 2]); //=> false
|
17601 | * R.any(lessThan2)([1, 2]); //=> true
|
17602 | */
|
17603 | var any = _curry2(_dispatchable(['any'], _xany, function any(fn, list) {
|
17604 | var idx = 0;
|
17605 | while (idx < list.length) {
|
17606 | if (fn(list[idx])) {
|
17607 | return true;
|
17608 | }
|
17609 | idx += 1;
|
17610 | }
|
17611 | return false;
|
17612 | }));
|
17613 |
|
17614 | /**
|
17615 | * Takes a list of predicates and returns a predicate that returns true for a
|
17616 | * given list of arguments if at least one of the provided predicates is
|
17617 | * satisfied by those arguments.
|
17618 | *
|
17619 | * The function returned is a curried function whose arity matches that of the
|
17620 | * highest-arity predicate.
|
17621 | *
|
17622 | * @func
|
17623 | * @memberOf R
|
17624 | * @since v0.9.0
|
17625 | * @category Logic
|
17626 | * @sig [(*... -> Boolean)] -> (*... -> Boolean)
|
17627 | * @param {Array} predicates An array of predicates to check
|
17628 | * @return {Function} The combined predicate
|
17629 | * @see R.allPass
|
17630 | * @example
|
17631 | *
|
17632 | * var isClub = R.propEq('suit', '♣');
|
17633 | * var isSpade = R.propEq('suit', '♠');
|
17634 | * var isBlackCard = R.anyPass([isClub, isSpade]);
|
17635 | *
|
17636 | * isBlackCard({rank: '10', suit: '♣'}); //=> true
|
17637 | * isBlackCard({rank: 'Q', suit: '♠'}); //=> true
|
17638 | * isBlackCard({rank: 'Q', suit: '♦'}); //=> false
|
17639 | */
|
17640 | var anyPass = _curry1(function anyPass(preds) {
|
17641 | return curryN(reduce(max, 0, pluck('length', preds)), function() {
|
17642 | var idx = 0;
|
17643 | var len = preds.length;
|
17644 | while (idx < len) {
|
17645 | if (preds[idx].apply(this, arguments)) {
|
17646 | return true;
|
17647 | }
|
17648 | idx += 1;
|
17649 | }
|
17650 | return false;
|
17651 | });
|
17652 | });
|
17653 |
|
17654 | /**
|
17655 | * ap applies a list of functions to a list of values.
|
17656 | *
|
17657 | * Dispatches to the `ap` method of the second argument, if present. Also
|
17658 | * treats curried functions as applicatives.
|
17659 | *
|
17660 | * @func
|
17661 | * @memberOf R
|
17662 | * @since v0.3.0
|
17663 | * @category Function
|
17664 | * @sig [a -> b] -> [a] -> [b]
|
17665 | * @sig Apply f => f (a -> b) -> f a -> f b
|
17666 | * @param {Array} fns An array of functions
|
17667 | * @param {Array} vs An array of values
|
17668 | * @return {Array} An array of results of applying each of `fns` to all of `vs` in turn.
|
17669 | * @example
|
17670 | *
|
17671 | * R.ap([R.multiply(2), R.add(3)], [1,2,3]); //=> [2, 4, 6, 4, 5, 6]
|
17672 | * R.ap([R.concat('tasty '), R.toUpper], ['pizza', 'salad']); //=> ["tasty pizza", "tasty salad", "PIZZA", "SALAD"]
|
17673 | * @symb R.ap([f, g], [a, b]) = [f(a), f(b), g(a), g(b)]
|
17674 | */
|
17675 | var ap = _curry2(function ap(applicative, fn) {
|
17676 | return (
|
17677 | typeof applicative.ap === 'function' ?
|
17678 | applicative.ap(fn) :
|
17679 | typeof applicative === 'function' ?
|
17680 | function(x) { return applicative(x)(fn(x)); } :
|
17681 | // else
|
17682 | _reduce(function(acc, f) { return _concat(acc, map$1(f, fn)); }, [], applicative)
|
17683 | );
|
17684 | });
|
17685 |
|
17686 | var _aperture = function _aperture(n, list) {
|
17687 | var idx = 0;
|
17688 | var limit = list.length - (n - 1);
|
17689 | var acc = new Array(limit >= 0 ? limit : 0);
|
17690 | while (idx < limit) {
|
17691 | acc[idx] = Array.prototype.slice.call(list, idx, idx + n);
|
17692 | idx += 1;
|
17693 | }
|
17694 | return acc;
|
17695 | };
|
17696 |
|
17697 | var _xaperture = (function() {
|
17698 | function XAperture(n, xf) {
|
17699 | this.xf = xf;
|
17700 | this.pos = 0;
|
17701 | this.full = false;
|
17702 | this.acc = new Array(n);
|
17703 | }
|
17704 | XAperture.prototype['@@transducer/init'] = _xfBase.init;
|
17705 | XAperture.prototype['@@transducer/result'] = function(result) {
|
17706 | this.acc = null;
|
17707 | return this.xf['@@transducer/result'](result);
|
17708 | };
|
17709 | XAperture.prototype['@@transducer/step'] = function(result, input) {
|
17710 | this.store(input);
|
17711 | return this.full ? this.xf['@@transducer/step'](result, this.getCopy()) : result;
|
17712 | };
|
17713 | XAperture.prototype.store = function(input) {
|
17714 | this.acc[this.pos] = input;
|
17715 | this.pos += 1;
|
17716 | if (this.pos === this.acc.length) {
|
17717 | this.pos = 0;
|
17718 | this.full = true;
|
17719 | }
|
17720 | };
|
17721 | XAperture.prototype.getCopy = function() {
|
17722 | return _concat(Array.prototype.slice.call(this.acc, this.pos),
|
17723 | Array.prototype.slice.call(this.acc, 0, this.pos));
|
17724 | };
|
17725 |
|
17726 | return _curry2(function _xaperture(n, xf) { return new XAperture(n, xf); });
|
17727 | }());
|
17728 |
|
17729 | /**
|
17730 | * Returns a new list, composed of n-tuples of consecutive elements If `n` is
|
17731 | * greater than the length of the list, an empty list is returned.
|
17732 | *
|
17733 | * Acts as a transducer if a transformer is given in list position.
|
17734 | *
|
17735 | * @func
|
17736 | * @memberOf R
|
17737 | * @since v0.12.0
|
17738 | * @category List
|
17739 | * @sig Number -> [a] -> [[a]]
|
17740 | * @param {Number} n The size of the tuples to create
|
17741 | * @param {Array} list The list to split into `n`-length tuples
|
17742 | * @return {Array} The resulting list of `n`-length tuples
|
17743 | * @see R.transduce
|
17744 | * @example
|
17745 | *
|
17746 | * R.aperture(2, [1, 2, 3, 4, 5]); //=> [[1, 2], [2, 3], [3, 4], [4, 5]]
|
17747 | * R.aperture(3, [1, 2, 3, 4, 5]); //=> [[1, 2, 3], [2, 3, 4], [3, 4, 5]]
|
17748 | * R.aperture(7, [1, 2, 3, 4, 5]); //=> []
|
17749 | */
|
17750 | var aperture = _curry2(_dispatchable([], _xaperture, _aperture));
|
17751 |
|
17752 | /**
|
17753 | * Returns a new list containing the contents of the given list, followed by
|
17754 | * the given element.
|
17755 | *
|
17756 | * @func
|
17757 | * @memberOf R
|
17758 | * @since v0.1.0
|
17759 | * @category List
|
17760 | * @sig a -> [a] -> [a]
|
17761 | * @param {*} el The element to add to the end of the new list.
|
17762 | * @param {Array} list The list of elements to add a new item to.
|
17763 | * list.
|
17764 | * @return {Array} A new list containing the elements of the old list followed by `el`.
|
17765 | * @see R.prepend
|
17766 | * @example
|
17767 | *
|
17768 | * R.append('tests', ['write', 'more']); //=> ['write', 'more', 'tests']
|
17769 | * R.append('tests', []); //=> ['tests']
|
17770 | * R.append(['tests'], ['write', 'more']); //=> ['write', 'more', ['tests']]
|
17771 | */
|
17772 | var append = _curry2(function append(el, list) {
|
17773 | return _concat(list, [el]);
|
17774 | });
|
17775 |
|
17776 | /**
|
17777 | * Applies function `fn` to the argument list `args`. This is useful for
|
17778 | * creating a fixed-arity function from a variadic function. `fn` should be a
|
17779 | * bound function if context is significant.
|
17780 | *
|
17781 | * @func
|
17782 | * @memberOf R
|
17783 | * @since v0.7.0
|
17784 | * @category Function
|
17785 | * @sig (*... -> a) -> [*] -> a
|
17786 | * @param {Function} fn The function which will be called with `args`
|
17787 | * @param {Array} args The arguments to call `fn` with
|
17788 | * @return {*} result The result, equivalent to `fn(...args)`
|
17789 | * @see R.call, R.unapply
|
17790 | * @example
|
17791 | *
|
17792 | * var nums = [1, 2, 3, -99, 42, 6, 7];
|
17793 | * R.apply(Math.max, nums); //=> 42
|
17794 | * @symb R.apply(f, [a, b, c]) = f(a, b, c)
|
17795 | */
|
17796 | var apply = _curry2(function apply(fn, args) {
|
17797 | return fn.apply(this, args);
|
17798 | });
|
17799 |
|
17800 | /**
|
17801 | * Returns a list of all the enumerable own properties of the supplied object.
|
17802 | * Note that the order of the output array is not guaranteed across different
|
17803 | * JS platforms.
|
17804 | *
|
17805 | * @func
|
17806 | * @memberOf R
|
17807 | * @since v0.1.0
|
17808 | * @category Object
|
17809 | * @sig {k: v} -> [v]
|
17810 | * @param {Object} obj The object to extract values from
|
17811 | * @return {Array} An array of the values of the object's own properties.
|
17812 | * @example
|
17813 | *
|
17814 | * R.values({a: 1, b: 2, c: 3}); //=> [1, 2, 3]
|
17815 | */
|
17816 | var values = _curry1(function values(obj) {
|
17817 | var props = keys(obj);
|
17818 | var len = props.length;
|
17819 | var vals = [];
|
17820 | var idx = 0;
|
17821 | while (idx < len) {
|
17822 | vals[idx] = obj[props[idx]];
|
17823 | idx += 1;
|
17824 | }
|
17825 | return vals;
|
17826 | });
|
17827 |
|
17828 | /**
|
17829 | * Given a spec object recursively mapping properties to functions, creates a
|
17830 | * function producing an object of the same structure, by mapping each property
|
17831 | * to the result of calling its associated function with the supplied arguments.
|
17832 | *
|
17833 | * @func
|
17834 | * @memberOf R
|
17835 | * @since v0.20.0
|
17836 | * @category Function
|
17837 | * @sig {k: ((a, b, ..., m) -> v)} -> ((a, b, ..., m) -> {k: v})
|
17838 | * @param {Object} spec an object recursively mapping properties to functions for
|
17839 | * producing the values for these properties.
|
17840 | * @return {Function} A function that returns an object of the same structure
|
17841 | * as `spec', with each property set to the value returned by calling its
|
17842 | * associated function with the supplied arguments.
|
17843 | * @see R.converge, R.juxt
|
17844 | * @example
|
17845 | *
|
17846 | * var getMetrics = R.applySpec({
|
17847 | * sum: R.add,
|
17848 | * nested: { mul: R.multiply }
|
17849 | * });
|
17850 | * getMetrics(2, 4); // => { sum: 6, nested: { mul: 8 } }
|
17851 | * @symb R.applySpec({ x: f, y: { z: g } })(a, b) = { x: f(a, b), y: { z: g(a, b) } }
|
17852 | */
|
17853 | var applySpec = _curry1(function applySpec(spec) {
|
17854 | spec = map$1(function(v) { return typeof v == 'function' ? v : applySpec(v); },
|
17855 | spec);
|
17856 | return curryN(reduce(max, 0, pluck('length', values(spec))),
|
17857 | function() {
|
17858 | var args = arguments;
|
17859 | return map$1(function(f) { return apply(f, args); }, spec);
|
17860 | });
|
17861 | });
|
17862 |
|
17863 | /**
|
17864 | * Makes an ascending comparator function out of a function that returns a value
|
17865 | * that can be compared with `<` and `>`.
|
17866 | *
|
17867 | * @func
|
17868 | * @memberOf R
|
17869 | * @since v0.23.0
|
17870 | * @category Function
|
17871 | * @sig Ord b => (a -> b) -> a -> a -> Number
|
17872 | * @param {Function} fn A function of arity one that returns a value that can be compared
|
17873 | * @param {*} a The first item to be compared.
|
17874 | * @param {*} b The second item to be compared.
|
17875 | * @return {Number} `-1` if fn(a) < fn(b), `1` if fn(b) < fn(a), otherwise `0`
|
17876 | * @example
|
17877 | *
|
17878 | * var byAge = R.ascend(R.prop('age'));
|
17879 | * var people = [
|
17880 | * // ...
|
17881 | * ];
|
17882 | * var peopleByYoungestFirst = R.sort(byAge, people);
|
17883 | */
|
17884 | var ascend = _curry3(function ascend(fn, a, b) {
|
17885 | var aa = fn(a);
|
17886 | var bb = fn(b);
|
17887 | return aa < bb ? -1 : aa > bb ? 1 : 0;
|
17888 | });
|
17889 |
|
17890 | /**
|
17891 | * Makes a shallow clone of an object, setting or overriding the specified
|
17892 | * property with the given value. Note that this copies and flattens prototype
|
17893 | * properties onto the new object as well. All non-primitive properties are
|
17894 | * copied by reference.
|
17895 | *
|
17896 | * @func
|
17897 | * @memberOf R
|
17898 | * @since v0.8.0
|
17899 | * @category Object
|
17900 | * @sig String -> a -> {k: v} -> {k: v}
|
17901 | * @param {String} prop The property name to set
|
17902 | * @param {*} val The new value
|
17903 | * @param {Object} obj The object to clone
|
17904 | * @return {Object} A new object equivalent to the original except for the changed property.
|
17905 | * @see R.dissoc
|
17906 | * @example
|
17907 | *
|
17908 | * R.assoc('c', 3, {a: 1, b: 2}); //=> {a: 1, b: 2, c: 3}
|
17909 | */
|
17910 | var assoc = _curry3(function assoc(prop, val, obj) {
|
17911 | var result = {};
|
17912 | for (var p in obj) {
|
17913 | result[p] = obj[p];
|
17914 | }
|
17915 | result[prop] = val;
|
17916 | return result;
|
17917 | });
|
17918 |
|
17919 | /**
|
17920 | * Determine if the passed argument is an integer.
|
17921 | *
|
17922 | * @private
|
17923 | * @param {*} n
|
17924 | * @category Type
|
17925 | * @return {Boolean}
|
17926 | */
|
17927 | var _isInteger = Number.isInteger || function _isInteger(n) {
|
17928 | return (n << 0) === n;
|
17929 | };
|
17930 |
|
17931 | /**
|
17932 | * Makes a shallow clone of an object, setting or overriding the nodes required
|
17933 | * to create the given path, and placing the specific value at the tail end of
|
17934 | * that path. Note that this copies and flattens prototype properties onto the
|
17935 | * new object as well. All non-primitive properties are copied by reference.
|
17936 | *
|
17937 | * @func
|
17938 | * @memberOf R
|
17939 | * @since v0.8.0
|
17940 | * @category Object
|
17941 | * @typedefn Idx = String | Int
|
17942 | * @sig [Idx] -> a -> {a} -> {a}
|
17943 | * @param {Array} path the path to set
|
17944 | * @param {*} val The new value
|
17945 | * @param {Object} obj The object to clone
|
17946 | * @return {Object} A new object equivalent to the original except along the specified path.
|
17947 | * @see R.dissocPath
|
17948 | * @example
|
17949 | *
|
17950 | * R.assocPath(['a', 'b', 'c'], 42, {a: {b: {c: 0}}}); //=> {a: {b: {c: 42}}}
|
17951 | *
|
17952 | * // Any missing or non-object keys in path will be overridden
|
17953 | * R.assocPath(['a', 'b', 'c'], 42, {a: 5}); //=> {a: {b: {c: 42}}}
|
17954 | */
|
17955 | var assocPath = _curry3(function assocPath(path, val, obj) {
|
17956 | if (path.length === 0) {
|
17957 | return val;
|
17958 | }
|
17959 | var idx = path[0];
|
17960 | if (path.length > 1) {
|
17961 | var nextObj = _has(idx, obj) ? obj[idx] : _isInteger(path[1]) ? [] : {};
|
17962 | val = assocPath(Array.prototype.slice.call(path, 1), val, nextObj);
|
17963 | }
|
17964 | if (_isInteger(idx) && _isArray(obj)) {
|
17965 | var arr = [].concat(obj);
|
17966 | arr[idx] = val;
|
17967 | return arr;
|
17968 | } else {
|
17969 | return assoc(idx, val, obj);
|
17970 | }
|
17971 | });
|
17972 |
|
17973 | /**
|
17974 | * Wraps a function of any arity (including nullary) in a function that accepts
|
17975 | * exactly `n` parameters. Any extraneous parameters will not be passed to the
|
17976 | * supplied function.
|
17977 | *
|
17978 | * @func
|
17979 | * @memberOf R
|
17980 | * @since v0.1.0
|
17981 | * @category Function
|
17982 | * @sig Number -> (* -> a) -> (* -> a)
|
17983 | * @param {Number} n The desired arity of the new function.
|
17984 | * @param {Function} fn The function to wrap.
|
17985 | * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of
|
17986 | * arity `n`.
|
17987 | * @example
|
17988 | *
|
17989 | * var takesTwoArgs = (a, b) => [a, b];
|
17990 | *
|
17991 | * takesTwoArgs.length; //=> 2
|
17992 | * takesTwoArgs(1, 2); //=> [1, 2]
|
17993 | *
|
17994 | * var takesOneArg = R.nAry(1, takesTwoArgs);
|
17995 | * takesOneArg.length; //=> 1
|
17996 | * // Only `n` arguments are passed to the wrapped function
|
17997 | * takesOneArg(1, 2); //=> [1, undefined]
|
17998 | * @symb R.nAry(0, f)(a, b) = f()
|
17999 | * @symb R.nAry(1, f)(a, b) = f(a)
|
18000 | * @symb R.nAry(2, f)(a, b) = f(a, b)
|
18001 | */
|
18002 | var nAry = _curry2(function nAry(n, fn) {
|
18003 | switch (n) {
|
18004 | case 0: return function() {return fn.call(this);};
|
18005 | case 1: return function(a0) {return fn.call(this, a0);};
|
18006 | case 2: return function(a0, a1) {return fn.call(this, a0, a1);};
|
18007 | case 3: return function(a0, a1, a2) {return fn.call(this, a0, a1, a2);};
|
18008 | case 4: return function(a0, a1, a2, a3) {return fn.call(this, a0, a1, a2, a3);};
|
18009 | case 5: return function(a0, a1, a2, a3, a4) {return fn.call(this, a0, a1, a2, a3, a4);};
|
18010 | case 6: return function(a0, a1, a2, a3, a4, a5) {return fn.call(this, a0, a1, a2, a3, a4, a5);};
|
18011 | case 7: return function(a0, a1, a2, a3, a4, a5, a6) {return fn.call(this, a0, a1, a2, a3, a4, a5, a6);};
|
18012 | case 8: return function(a0, a1, a2, a3, a4, a5, a6, a7) {return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7);};
|
18013 | case 9: return function(a0, a1, a2, a3, a4, a5, a6, a7, a8) {return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7, a8);};
|
18014 | case 10: return function(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {return fn.call(this, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);};
|
18015 | default: throw new Error('First argument to nAry must be a non-negative integer no greater than ten');
|
18016 | }
|
18017 | });
|
18018 |
|
18019 | /**
|
18020 | * Wraps a function of any arity (including nullary) in a function that accepts
|
18021 | * exactly 2 parameters. Any extraneous parameters will not be passed to the
|
18022 | * supplied function.
|
18023 | *
|
18024 | * @func
|
18025 | * @memberOf R
|
18026 | * @since v0.2.0
|
18027 | * @category Function
|
18028 | * @sig (* -> c) -> (a, b -> c)
|
18029 | * @param {Function} fn The function to wrap.
|
18030 | * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of
|
18031 | * arity 2.
|
18032 | * @example
|
18033 | *
|
18034 | * var takesThreeArgs = function(a, b, c) {
|
18035 | * return [a, b, c];
|
18036 | * };
|
18037 | * takesThreeArgs.length; //=> 3
|
18038 | * takesThreeArgs(1, 2, 3); //=> [1, 2, 3]
|
18039 | *
|
18040 | * var takesTwoArgs = R.binary(takesThreeArgs);
|
18041 | * takesTwoArgs.length; //=> 2
|
18042 | * // Only 2 arguments are passed to the wrapped function
|
18043 | * takesTwoArgs(1, 2, 3); //=> [1, 2, undefined]
|
18044 | * @symb R.binary(f)(a, b, c) = f(a, b)
|
18045 | */
|
18046 | var binary = _curry1(function binary(fn) {
|
18047 | return nAry(2, fn);
|
18048 | });
|
18049 |
|
18050 | var _isFunction = function _isFunction(x) {
|
18051 | return Object.prototype.toString.call(x) === '[object Function]';
|
18052 | };
|
18053 |
|
18054 | /**
|
18055 | * "lifts" a function to be the specified arity, so that it may "map over" that
|
18056 | * many lists, Functions or other objects that satisfy the [FantasyLand Apply spec](https://github.com/fantasyland/fantasy-land#apply).
|
18057 | *
|
18058 | * @func
|
18059 | * @memberOf R
|
18060 | * @since v0.7.0
|
18061 | * @category Function
|
18062 | * @sig Number -> (*... -> *) -> ([*]... -> [*])
|
18063 | * @param {Function} fn The function to lift into higher context
|
18064 | * @return {Function} The lifted function.
|
18065 | * @see R.lift, R.ap
|
18066 | * @example
|
18067 | *
|
18068 | * var madd3 = R.liftN(3, (...args) => R.sum(args));
|
18069 | * madd3([1,2,3], [1,2,3], [1]); //=> [3, 4, 5, 4, 5, 6, 5, 6, 7]
|
18070 | */
|
18071 | var liftN = _curry2(function liftN(arity, fn) {
|
18072 | var lifted = curryN(arity, fn);
|
18073 | return curryN(arity, function() {
|
18074 | return _reduce(ap, map$1(lifted, arguments[0]), Array.prototype.slice.call(arguments, 1));
|
18075 | });
|
18076 | });
|
18077 |
|
18078 | /**
|
18079 | * "lifts" a function of arity > 1 so that it may "map over" a list, Function or other
|
18080 | * object that satisfies the [FantasyLand Apply spec](https://github.com/fantasyland/fantasy-land#apply).
|
18081 | *
|
18082 | * @func
|
18083 | * @memberOf R
|
18084 | * @since v0.7.0
|
18085 | * @category Function
|
18086 | * @sig (*... -> *) -> ([*]... -> [*])
|
18087 | * @param {Function} fn The function to lift into higher context
|
18088 | * @return {Function} The lifted function.
|
18089 | * @see R.liftN
|
18090 | * @example
|
18091 | *
|
18092 | * var madd3 = R.lift((a, b, c) => a + b + c);
|
18093 | *
|
18094 | * madd3([1,2,3], [1,2,3], [1]); //=> [3, 4, 5, 4, 5, 6, 5, 6, 7]
|
18095 | *
|
18096 | * var madd5 = R.lift((a, b, c, d, e) => a + b + c + d + e);
|
18097 | *
|
18098 | * madd5([1,2], [3], [4, 5], [6], [7, 8]); //=> [21, 22, 22, 23, 22, 23, 23, 24]
|
18099 | */
|
18100 | var lift = _curry1(function lift(fn) {
|
18101 | return liftN(fn.length, fn);
|
18102 | });
|
18103 |
|
18104 | /**
|
18105 | * A function which calls the two provided functions and returns the `&&`
|
18106 | * of the results.
|
18107 | * It returns the result of the first function if it is false-y and the result
|
18108 | * of the second function otherwise. Note that this is short-circuited,
|
18109 | * meaning that the second function will not be invoked if the first returns a
|
18110 | * false-y value.
|
18111 | *
|
18112 | * In addition to functions, `R.both` also accepts any fantasy-land compatible
|
18113 | * applicative functor.
|
18114 | *
|
18115 | * @func
|
18116 | * @memberOf R
|
18117 | * @since v0.12.0
|
18118 | * @category Logic
|
18119 | * @sig (*... -> Boolean) -> (*... -> Boolean) -> (*... -> Boolean)
|
18120 | * @param {Function} f A predicate
|
18121 | * @param {Function} g Another predicate
|
18122 | * @return {Function} a function that applies its arguments to `f` and `g` and `&&`s their outputs together.
|
18123 | * @see R.and
|
18124 | * @example
|
18125 | *
|
18126 | * var gt10 = R.gt(R.__, 10)
|
18127 | * var lt20 = R.lt(R.__, 20)
|
18128 | * var f = R.both(gt10, lt20);
|
18129 | * f(15); //=> true
|
18130 | * f(30); //=> false
|
18131 | */
|
18132 | var both = _curry2(function both(f, g) {
|
18133 | return _isFunction(f) ?
|
18134 | function _both() {
|
18135 | return f.apply(this, arguments) && g.apply(this, arguments);
|
18136 | } :
|
18137 | lift(and)(f, g);
|
18138 | });
|
18139 |
|
18140 | /**
|
18141 | * Returns a curried equivalent of the provided function. The curried function
|
18142 | * has two unusual capabilities. First, its arguments needn't be provided one
|
18143 | * at a time. If `f` is a ternary function and `g` is `R.curry(f)`, the
|
18144 | * following are equivalent:
|
18145 | *
|
18146 | * - `g(1)(2)(3)`
|
18147 | * - `g(1)(2, 3)`
|
18148 | * - `g(1, 2)(3)`
|
18149 | * - `g(1, 2, 3)`
|
18150 | *
|
18151 | * Secondly, the special placeholder value `R.__` may be used to specify
|
18152 | * "gaps", allowing partial application of any combination of arguments,
|
18153 | * regardless of their positions. If `g` is as above and `_` is `R.__`, the
|
18154 | * following are equivalent:
|
18155 | *
|
18156 | * - `g(1, 2, 3)`
|
18157 | * - `g(_, 2, 3)(1)`
|
18158 | * - `g(_, _, 3)(1)(2)`
|
18159 | * - `g(_, _, 3)(1, 2)`
|
18160 | * - `g(_, 2)(1)(3)`
|
18161 | * - `g(_, 2)(1, 3)`
|
18162 | * - `g(_, 2)(_, 3)(1)`
|
18163 | *
|
18164 | * @func
|
18165 | * @memberOf R
|
18166 | * @since v0.1.0
|
18167 | * @category Function
|
18168 | * @sig (* -> a) -> (* -> a)
|
18169 | * @param {Function} fn The function to curry.
|
18170 | * @return {Function} A new, curried function.
|
18171 | * @see R.curryN
|
18172 | * @example
|
18173 | *
|
18174 | * var addFourNumbers = (a, b, c, d) => a + b + c + d;
|
18175 | *
|
18176 | * var curriedAddFourNumbers = R.curry(addFourNumbers);
|
18177 | * var f = curriedAddFourNumbers(1, 2);
|
18178 | * var g = f(3);
|
18179 | * g(4); //=> 10
|
18180 | */
|
18181 | var curry = _curry1(function curry(fn) {
|
18182 | return curryN(fn.length, fn);
|
18183 | });
|
18184 |
|
18185 | /**
|
18186 | * Returns the result of calling its first argument with the remaining
|
18187 | * arguments. This is occasionally useful as a converging function for
|
18188 | * `R.converge`: the left branch can produce a function while the right branch
|
18189 | * produces a value to be passed to that function as an argument.
|
18190 | *
|
18191 | * @func
|
18192 | * @memberOf R
|
18193 | * @since v0.9.0
|
18194 | * @category Function
|
18195 | * @sig (*... -> a),*... -> a
|
18196 | * @param {Function} fn The function to apply to the remaining arguments.
|
18197 | * @param {...*} args Any number of positional arguments.
|
18198 | * @return {*}
|
18199 | * @see R.apply
|
18200 | * @example
|
18201 | *
|
18202 | * R.call(R.add, 1, 2); //=> 3
|
18203 | *
|
18204 | * var indentN = R.pipe(R.times(R.always(' ')),
|
18205 | * R.join(''),
|
18206 | * R.replace(/^(?!$)/gm));
|
18207 | *
|
18208 | * var format = R.converge(R.call, [
|
18209 | * R.pipe(R.prop('indent'), indentN),
|
18210 | * R.prop('value')
|
18211 | * ]);
|
18212 | *
|
18213 | * format({indent: 2, value: 'foo\nbar\nbaz\n'}); //=> ' foo\n bar\n baz\n'
|
18214 | * @symb R.call(f, a, b) = f(a, b)
|
18215 | */
|
18216 | var call = curry(function call(fn) {
|
18217 | return fn.apply(this, Array.prototype.slice.call(arguments, 1));
|
18218 | });
|
18219 |
|
18220 | /**
|
18221 | * `_makeFlat` is a helper function that returns a one-level or fully recursive
|
18222 | * function based on the flag passed in.
|
18223 | *
|
18224 | * @private
|
18225 | */
|
18226 | var _makeFlat = function _makeFlat(recursive) {
|
18227 | return function flatt(list) {
|
18228 | var value, jlen, j;
|
18229 | var result = [];
|
18230 | var idx = 0;
|
18231 | var ilen = list.length;
|
18232 |
|
18233 | while (idx < ilen) {
|
18234 | if (isArrayLike(list[idx])) {
|
18235 | value = recursive ? flatt(list[idx]) : list[idx];
|
18236 | j = 0;
|
18237 | jlen = value.length;
|
18238 | while (j < jlen) {
|
18239 | result[result.length] = value[j];
|
18240 | j += 1;
|
18241 | }
|
18242 | } else {
|
18243 | result[result.length] = list[idx];
|
18244 | }
|
18245 | idx += 1;
|
18246 | }
|
18247 | return result;
|
18248 | };
|
18249 | };
|
18250 |
|
18251 | var _forceReduced = function _forceReduced(x) {
|
18252 | return {
|
18253 | '@@transducer/value': x,
|
18254 | '@@transducer/reduced': true
|
18255 | };
|
18256 | };
|
18257 |
|
18258 | var _flatCat = (function() {
|
18259 | var preservingReduced = function(xf) {
|
18260 | return {
|
18261 | '@@transducer/init': _xfBase.init,
|
18262 | '@@transducer/result': function(result) {
|
18263 | return xf['@@transducer/result'](result);
|
18264 | },
|
18265 | '@@transducer/step': function(result, input) {
|
18266 | var ret = xf['@@transducer/step'](result, input);
|
18267 | return ret['@@transducer/reduced'] ? _forceReduced(ret) : ret;
|
18268 | }
|
18269 | };
|
18270 | };
|
18271 |
|
18272 | return function _xcat(xf) {
|
18273 | var rxf = preservingReduced(xf);
|
18274 | return {
|
18275 | '@@transducer/init': _xfBase.init,
|
18276 | '@@transducer/result': function(result) {
|
18277 | return rxf['@@transducer/result'](result);
|
18278 | },
|
18279 | '@@transducer/step': function(result, input) {
|
18280 | return !isArrayLike(input) ? _reduce(rxf, result, [input]) : _reduce(rxf, result, input);
|
18281 | }
|
18282 | };
|
18283 | };
|
18284 | }());
|
18285 |
|
18286 | var _xchain = _curry2(function _xchain(f, xf) {
|
18287 | return map$1(f, _flatCat(xf));
|
18288 | });
|
18289 |
|
18290 | /**
|
18291 | * `chain` maps a function over a list and concatenates the results. `chain`
|
18292 | * is also known as `flatMap` in some libraries
|
18293 | *
|
18294 | * Dispatches to the `chain` method of the second argument, if present,
|
18295 | * according to the [FantasyLand Chain spec](https://github.com/fantasyland/fantasy-land#chain).
|
18296 | *
|
18297 | * @func
|
18298 | * @memberOf R
|
18299 | * @since v0.3.0
|
18300 | * @category List
|
18301 | * @sig Chain m => (a -> m b) -> m a -> m b
|
18302 | * @param {Function} fn The function to map with
|
18303 | * @param {Array} list The list to map over
|
18304 | * @return {Array} The result of flat-mapping `list` with `fn`
|
18305 | * @example
|
18306 | *
|
18307 | * var duplicate = n => [n, n];
|
18308 | * R.chain(duplicate, [1, 2, 3]); //=> [1, 1, 2, 2, 3, 3]
|
18309 | *
|
18310 | * R.chain(R.append, R.head)([1, 2, 3]); //=> [1, 2, 3, 1]
|
18311 | */
|
18312 | var chain = _curry2(_dispatchable(['chain'], _xchain, function chain(fn, monad) {
|
18313 | if (typeof monad === 'function') {
|
18314 | return function(x) { return fn(monad(x))(x); };
|
18315 | }
|
18316 | return _makeFlat(false)(map$1(fn, monad));
|
18317 | }));
|
18318 |
|
18319 | /**
|
18320 | * Restricts a number to be within a range.
|
18321 | *
|
18322 | * Also works for other ordered types such as Strings and Dates.
|
18323 | *
|
18324 | * @func
|
18325 | * @memberOf R
|
18326 | * @since v0.20.0
|
18327 | * @category Relation
|
18328 | * @sig Ord a => a -> a -> a -> a
|
18329 | * @param {Number} minimum The lower limit of the clamp (inclusive)
|
18330 | * @param {Number} maximum The upper limit of the clamp (inclusive)
|
18331 | * @param {Number} value Value to be clamped
|
18332 | * @return {Number} Returns `minimum` when `val < minimum`, `maximum` when `val > maximum`, returns `val` otherwise
|
18333 | * @example
|
18334 | *
|
18335 | * R.clamp(1, 10, -5) // => 1
|
18336 | * R.clamp(1, 10, 15) // => 10
|
18337 | * R.clamp(1, 10, 4) // => 4
|
18338 | */
|
18339 | var clamp = _curry3(function clamp(min, max, value) {
|
18340 | if (min > max) {
|
18341 | throw new Error('min must not be greater than max in clamp(min, max, value)');
|
18342 | }
|
18343 | return value < min ? min :
|
18344 | value > max ? max :
|
18345 | value;
|
18346 | });
|
18347 |
|
18348 | var _cloneRegExp = function _cloneRegExp(pattern) {
|
18349 | return new RegExp(pattern.source, (pattern.global ? 'g' : '') +
|
18350 | (pattern.ignoreCase ? 'i' : '') +
|
18351 | (pattern.multiline ? 'm' : '') +
|
18352 | (pattern.sticky ? 'y' : '') +
|
18353 | (pattern.unicode ? 'u' : ''));
|
18354 | };
|
18355 |
|
18356 | /**
|
18357 | * Gives a single-word string description of the (native) type of a value,
|
18358 | * returning such answers as 'Object', 'Number', 'Array', or 'Null'. Does not
|
18359 | * attempt to distinguish user Object types any further, reporting them all as
|
18360 | * 'Object'.
|
18361 | *
|
18362 | * @func
|
18363 | * @memberOf R
|
18364 | * @since v0.8.0
|
18365 | * @category Type
|
18366 | * @sig (* -> {*}) -> String
|
18367 | * @param {*} val The value to test
|
18368 | * @return {String}
|
18369 | * @example
|
18370 | *
|
18371 | * R.type({}); //=> "Object"
|
18372 | * R.type(1); //=> "Number"
|
18373 | * R.type(false); //=> "Boolean"
|
18374 | * R.type('s'); //=> "String"
|
18375 | * R.type(null); //=> "Null"
|
18376 | * R.type([]); //=> "Array"
|
18377 | * R.type(/[A-z]/); //=> "RegExp"
|
18378 | */
|
18379 | var type = _curry1(function type(val) {
|
18380 | return val === null ? 'Null' :
|
18381 | val === undefined ? 'Undefined' :
|
18382 | Object.prototype.toString.call(val).slice(8, -1);
|
18383 | });
|
18384 |
|
18385 | /**
|
18386 | * Copies an object.
|
18387 | *
|
18388 | * @private
|
18389 | * @param {*} value The value to be copied
|
18390 | * @param {Array} refFrom Array containing the source references
|
18391 | * @param {Array} refTo Array containing the copied source references
|
18392 | * @param {Boolean} deep Whether or not to perform deep cloning.
|
18393 | * @return {*} The copied value.
|
18394 | */
|
18395 | var _clone = function _clone(value, refFrom, refTo, deep) {
|
18396 | var copy = function copy(copiedValue) {
|
18397 | var len = refFrom.length;
|
18398 | var idx = 0;
|
18399 | while (idx < len) {
|
18400 | if (value === refFrom[idx]) {
|
18401 | return refTo[idx];
|
18402 | }
|
18403 | idx += 1;
|
18404 | }
|
18405 | refFrom[idx + 1] = value;
|
18406 | refTo[idx + 1] = copiedValue;
|
18407 | for (var key in value) {
|
18408 | copiedValue[key] = deep ?
|
18409 | _clone(value[key], refFrom, refTo, true) : value[key];
|
18410 | }
|
18411 | return copiedValue;
|
18412 | };
|
18413 | switch (type(value)) {
|
18414 | case 'Object': return copy({});
|
18415 | case 'Array': return copy([]);
|
18416 | case 'Date': return new Date(value.valueOf());
|
18417 | case 'RegExp': return _cloneRegExp(value);
|
18418 | default: return value;
|
18419 | }
|
18420 | };
|
18421 |
|
18422 | /**
|
18423 | * Creates a deep copy of the value which may contain (nested) `Array`s and
|
18424 | * `Object`s, `Number`s, `String`s, `Boolean`s and `Date`s. `Function`s are
|
18425 | * assigned by reference rather than copied
|
18426 | *
|
18427 | * Dispatches to a `clone` method if present.
|
18428 | *
|
18429 | * @func
|
18430 | * @memberOf R
|
18431 | * @since v0.1.0
|
18432 | * @category Object
|
18433 | * @sig {*} -> {*}
|
18434 | * @param {*} value The object or array to clone
|
18435 | * @return {*} A deeply cloned copy of `val`
|
18436 | * @example
|
18437 | *
|
18438 | * var objects = [{}, {}, {}];
|
18439 | * var objectsClone = R.clone(objects);
|
18440 | * objects === objectsClone; //=> false
|
18441 | * objects[0] === objectsClone[0]; //=> false
|
18442 | */
|
18443 | var clone = _curry1(function clone(value) {
|
18444 | return value != null && typeof value.clone === 'function' ?
|
18445 | value.clone() :
|
18446 | _clone(value, [], [], true);
|
18447 | });
|
18448 |
|
18449 | /**
|
18450 | * Makes a comparator function out of a function that reports whether the first
|
18451 | * element is less than the second.
|
18452 | *
|
18453 | * @func
|
18454 | * @memberOf R
|
18455 | * @since v0.1.0
|
18456 | * @category Function
|
18457 | * @sig (a, b -> Boolean) -> (a, b -> Number)
|
18458 | * @param {Function} pred A predicate function of arity two which will return `true` if the first argument
|
18459 | * is less than the second, `false` otherwise
|
18460 | * @return {Function} A Function :: a -> b -> Int that returns `-1` if a < b, `1` if b < a, otherwise `0`
|
18461 | * @example
|
18462 | *
|
18463 | * var byAge = R.comparator((a, b) => a.age < b.age);
|
18464 | * var people = [
|
18465 | * // ...
|
18466 | * ];
|
18467 | * var peopleByIncreasingAge = R.sort(byAge, people);
|
18468 | */
|
18469 | var comparator = _curry1(function comparator(pred) {
|
18470 | return function(a, b) {
|
18471 | return pred(a, b) ? -1 : pred(b, a) ? 1 : 0;
|
18472 | };
|
18473 | });
|
18474 |
|
18475 | /**
|
18476 | * A function that returns the `!` of its argument. It will return `true` when
|
18477 | * passed false-y value, and `false` when passed a truth-y one.
|
18478 | *
|
18479 | * @func
|
18480 | * @memberOf R
|
18481 | * @since v0.1.0
|
18482 | * @category Logic
|
18483 | * @sig * -> Boolean
|
18484 | * @param {*} a any value
|
18485 | * @return {Boolean} the logical inverse of passed argument.
|
18486 | * @see R.complement
|
18487 | * @example
|
18488 | *
|
18489 | * R.not(true); //=> false
|
18490 | * R.not(false); //=> true
|
18491 | * R.not(0); //=> true
|
18492 | * R.not(1); //=> false
|
18493 | */
|
18494 | var not = _curry1(function not(a) {
|
18495 | return !a;
|
18496 | });
|
18497 |
|
18498 | /**
|
18499 | * Takes a function `f` and returns a function `g` such that if called with the same arguments
|
18500 | * when `f` returns a "truthy" value, `g` returns `false` and when `f` returns a "falsy" value `g` returns `true`.
|
18501 | *
|
18502 | * `R.complement` may be applied to any functor
|
18503 | *
|
18504 | * @func
|
18505 | * @memberOf R
|
18506 | * @since v0.12.0
|
18507 | * @category Logic
|
18508 | * @sig (*... -> *) -> (*... -> Boolean)
|
18509 | * @param {Function} f
|
18510 | * @return {Function}
|
18511 | * @see R.not
|
18512 | * @example
|
18513 | *
|
18514 | * var isNotNil = R.complement(R.isNil);
|
18515 | * isNil(null); //=> true
|
18516 | * isNotNil(null); //=> false
|
18517 | * isNil(7); //=> false
|
18518 | * isNotNil(7); //=> true
|
18519 | */
|
18520 | var complement = lift(not);
|
18521 |
|
18522 | var _pipe = function _pipe(f, g) {
|
18523 | return function() {
|
18524 | return g.call(this, f.apply(this, arguments));
|
18525 | };
|
18526 | };
|
18527 |
|
18528 | /**
|
18529 | * This checks whether a function has a [methodname] function. If it isn't an
|
18530 | * array it will execute that function otherwise it will default to the ramda
|
18531 | * implementation.
|
18532 | *
|
18533 | * @private
|
18534 | * @param {Function} fn ramda implemtation
|
18535 | * @param {String} methodname property to check for a custom implementation
|
18536 | * @return {Object} Whatever the return value of the method is.
|
18537 | */
|
18538 | var _checkForMethod = function _checkForMethod(methodname, fn) {
|
18539 | return function() {
|
18540 | var length = arguments.length;
|
18541 | if (length === 0) {
|
18542 | return fn();
|
18543 | }
|
18544 | var obj = arguments[length - 1];
|
18545 | return (_isArray(obj) || typeof obj[methodname] !== 'function') ?
|
18546 | fn.apply(this, arguments) :
|
18547 | obj[methodname].apply(obj, Array.prototype.slice.call(arguments, 0, length - 1));
|
18548 | };
|
18549 | };
|
18550 |
|
18551 | /**
|
18552 | * Returns the elements of the given list or string (or object with a `slice`
|
18553 | * method) from `fromIndex` (inclusive) to `toIndex` (exclusive).
|
18554 | *
|
18555 | * Dispatches to the `slice` method of the third argument, if present.
|
18556 | *
|
18557 | * @func
|
18558 | * @memberOf R
|
18559 | * @since v0.1.4
|
18560 | * @category List
|
18561 | * @sig Number -> Number -> [a] -> [a]
|
18562 | * @sig Number -> Number -> String -> String
|
18563 | * @param {Number} fromIndex The start index (inclusive).
|
18564 | * @param {Number} toIndex The end index (exclusive).
|
18565 | * @param {*} list
|
18566 | * @return {*}
|
18567 | * @example
|
18568 | *
|
18569 | * R.slice(1, 3, ['a', 'b', 'c', 'd']); //=> ['b', 'c']
|
18570 | * R.slice(1, Infinity, ['a', 'b', 'c', 'd']); //=> ['b', 'c', 'd']
|
18571 | * R.slice(0, -1, ['a', 'b', 'c', 'd']); //=> ['a', 'b', 'c']
|
18572 | * R.slice(-3, -1, ['a', 'b', 'c', 'd']); //=> ['b', 'c']
|
18573 | * R.slice(0, 3, 'ramda'); //=> 'ram'
|
18574 | */
|
18575 | var slice = _curry3(_checkForMethod('slice', function slice(fromIndex, toIndex, list) {
|
18576 | return Array.prototype.slice.call(list, fromIndex, toIndex);
|
18577 | }));
|
18578 |
|
18579 | /**
|
18580 | * Returns all but the first element of the given list or string (or object
|
18581 | * with a `tail` method).
|
18582 | *
|
18583 | * Dispatches to the `slice` method of the first argument, if present.
|
18584 | *
|
18585 | * @func
|
18586 | * @memberOf R
|
18587 | * @since v0.1.0
|
18588 | * @category List
|
18589 | * @sig [a] -> [a]
|
18590 | * @sig String -> String
|
18591 | * @param {*} list
|
18592 | * @return {*}
|
18593 | * @see R.head, R.init, R.last
|
18594 | * @example
|
18595 | *
|
18596 | * R.tail([1, 2, 3]); //=> [2, 3]
|
18597 | * R.tail([1, 2]); //=> [2]
|
18598 | * R.tail([1]); //=> []
|
18599 | * R.tail([]); //=> []
|
18600 | *
|
18601 | * R.tail('abc'); //=> 'bc'
|
18602 | * R.tail('ab'); //=> 'b'
|
18603 | * R.tail('a'); //=> ''
|
18604 | * R.tail(''); //=> ''
|
18605 | */
|
18606 | var tail = _curry1(_checkForMethod('tail', slice(1, Infinity)));
|
18607 |
|
18608 | /**
|
18609 | * Performs left-to-right function composition. The leftmost function may have
|
18610 | * any arity; the remaining functions must be unary.
|
18611 | *
|
18612 | * In some libraries this function is named `sequence`.
|
18613 | *
|
18614 | * **Note:** The result of pipe is not automatically curried.
|
18615 | *
|
18616 | * @func
|
18617 | * @memberOf R
|
18618 | * @since v0.1.0
|
18619 | * @category Function
|
18620 | * @sig (((a, b, ..., n) -> o), (o -> p), ..., (x -> y), (y -> z)) -> ((a, b, ..., n) -> z)
|
18621 | * @param {...Function} functions
|
18622 | * @return {Function}
|
18623 | * @see R.compose
|
18624 | * @example
|
18625 | *
|
18626 | * var f = R.pipe(Math.pow, R.negate, R.inc);
|
18627 | *
|
18628 | * f(3, 4); // -(3^4) + 1
|
18629 | * @symb R.pipe(f, g, h)(a, b) = h(g(f(a, b)))
|
18630 | */
|
18631 | var pipe = function pipe() {
|
18632 | if (arguments.length === 0) {
|
18633 | throw new Error('pipe requires at least one argument');
|
18634 | }
|
18635 | return _arity(arguments[0].length,
|
18636 | reduce(_pipe, arguments[0], tail(arguments)));
|
18637 | };
|
18638 |
|
18639 | /**
|
18640 | * Returns a new list or string with the elements or characters in reverse
|
18641 | * order.
|
18642 | *
|
18643 | * @func
|
18644 | * @memberOf R
|
18645 | * @since v0.1.0
|
18646 | * @category List
|
18647 | * @sig [a] -> [a]
|
18648 | * @sig String -> String
|
18649 | * @param {Array|String} list
|
18650 | * @return {Array|String}
|
18651 | * @example
|
18652 | *
|
18653 | * R.reverse([1, 2, 3]); //=> [3, 2, 1]
|
18654 | * R.reverse([1, 2]); //=> [2, 1]
|
18655 | * R.reverse([1]); //=> [1]
|
18656 | * R.reverse([]); //=> []
|
18657 | *
|
18658 | * R.reverse('abc'); //=> 'cba'
|
18659 | * R.reverse('ab'); //=> 'ba'
|
18660 | * R.reverse('a'); //=> 'a'
|
18661 | * R.reverse(''); //=> ''
|
18662 | */
|
18663 | var reverse = _curry1(function reverse(list) {
|
18664 | return _isString(list) ? list.split('').reverse().join('') :
|
18665 | Array.prototype.slice.call(list, 0).reverse();
|
18666 | });
|
18667 |
|
18668 | /**
|
18669 | * Performs right-to-left function composition. The rightmost function may have
|
18670 | * any arity; the remaining functions must be unary.
|
18671 | *
|
18672 | * **Note:** The result of compose is not automatically curried.
|
18673 | *
|
18674 | * @func
|
18675 | * @memberOf R
|
18676 | * @since v0.1.0
|
18677 | * @category Function
|
18678 | * @sig ((y -> z), (x -> y), ..., (o -> p), ((a, b, ..., n) -> o)) -> ((a, b, ..., n) -> z)
|
18679 | * @param {...Function} ...functions The functions to compose
|
18680 | * @return {Function}
|
18681 | * @see R.pipe
|
18682 | * @example
|
18683 | *
|
18684 | * var classyGreeting = (firstName, lastName) => "The name's " + lastName + ", " + firstName + " " + lastName
|
18685 | * var yellGreeting = R.compose(R.toUpper, classyGreeting);
|
18686 | * yellGreeting('James', 'Bond'); //=> "THE NAME'S BOND, JAMES BOND"
|
18687 | *
|
18688 | * R.compose(Math.abs, R.add(1), R.multiply(2))(-4) //=> 7
|
18689 | *
|
18690 | * @symb R.compose(f, g, h)(a, b) = f(g(h(a, b)))
|
18691 | */
|
18692 | var compose = function compose() {
|
18693 | if (arguments.length === 0) {
|
18694 | throw new Error('compose requires at least one argument');
|
18695 | }
|
18696 | return pipe.apply(this, reverse(arguments));
|
18697 | };
|
18698 |
|
18699 | /**
|
18700 | * Returns the right-to-left Kleisli composition of the provided functions,
|
18701 | * each of which must return a value of a type supported by [`chain`](#chain).
|
18702 | *
|
18703 | * `R.composeK(h, g, f)` is equivalent to `R.compose(R.chain(h), R.chain(g), R.chain(f))`.
|
18704 | *
|
18705 | * @func
|
18706 | * @memberOf R
|
18707 | * @since v0.16.0
|
18708 | * @category Function
|
18709 | * @sig Chain m => ((y -> m z), (x -> m y), ..., (a -> m b)) -> (a -> m z)
|
18710 | * @param {...Function} ...functions The functions to compose
|
18711 | * @return {Function}
|
18712 | * @see R.pipeK
|
18713 | * @example
|
18714 | *
|
18715 | * // get :: String -> Object -> Maybe *
|
18716 | * var get = R.curry((propName, obj) => Maybe(obj[propName]))
|
18717 | *
|
18718 | * // getStateCode :: Maybe String -> Maybe String
|
18719 | * var getStateCode = R.composeK(
|
18720 | * R.compose(Maybe.of, R.toUpper),
|
18721 | * get('state'),
|
18722 | * get('address'),
|
18723 | * get('user'),
|
18724 | * );
|
18725 | * getStateCode({"user":{"address":{"state":"ny"}}}); //=> Maybe.Just("NY")
|
18726 | * getStateCode({}); //=> Maybe.Nothing()
|
18727 | * @symb R.composeK(f, g, h)(a) = R.chain(f, R.chain(g, h(a)))
|
18728 | */
|
18729 | var composeK = function composeK() {
|
18730 | if (arguments.length === 0) {
|
18731 | throw new Error('composeK requires at least one argument');
|
18732 | }
|
18733 | var init = Array.prototype.slice.call(arguments);
|
18734 | var last = init.pop();
|
18735 | return compose(compose.apply(this, map$1(chain, init)), last);
|
18736 | };
|
18737 |
|
18738 | var _pipeP = function _pipeP(f, g) {
|
18739 | return function() {
|
18740 | var ctx = this;
|
18741 | return f.apply(ctx, arguments).then(function(x) {
|
18742 | return g.call(ctx, x);
|
18743 | });
|
18744 | };
|
18745 | };
|
18746 |
|
18747 | /**
|
18748 | * Performs left-to-right composition of one or more Promise-returning
|
18749 | * functions. The leftmost function may have any arity; the remaining functions
|
18750 | * must be unary.
|
18751 | *
|
18752 | * @func
|
18753 | * @memberOf R
|
18754 | * @since v0.10.0
|
18755 | * @category Function
|
18756 | * @sig ((a -> Promise b), (b -> Promise c), ..., (y -> Promise z)) -> (a -> Promise z)
|
18757 | * @param {...Function} functions
|
18758 | * @return {Function}
|
18759 | * @see R.composeP
|
18760 | * @example
|
18761 | *
|
18762 | * // followersForUser :: String -> Promise [User]
|
18763 | * var followersForUser = R.pipeP(db.getUserById, db.getFollowers);
|
18764 | */
|
18765 | var pipeP = function pipeP() {
|
18766 | if (arguments.length === 0) {
|
18767 | throw new Error('pipeP requires at least one argument');
|
18768 | }
|
18769 | return _arity(arguments[0].length,
|
18770 | reduce(_pipeP, arguments[0], tail(arguments)));
|
18771 | };
|
18772 |
|
18773 | /**
|
18774 | * Performs right-to-left composition of one or more Promise-returning
|
18775 | * functions. The rightmost function may have any arity; the remaining
|
18776 | * functions must be unary.
|
18777 | *
|
18778 | * @func
|
18779 | * @memberOf R
|
18780 | * @since v0.10.0
|
18781 | * @category Function
|
18782 | * @sig ((y -> Promise z), (x -> Promise y), ..., (a -> Promise b)) -> (a -> Promise z)
|
18783 | * @param {...Function} functions The functions to compose
|
18784 | * @return {Function}
|
18785 | * @see R.pipeP
|
18786 | * @example
|
18787 | *
|
18788 | * var db = {
|
18789 | * users: {
|
18790 | * JOE: {
|
18791 | * name: 'Joe',
|
18792 | * followers: ['STEVE', 'SUZY']
|
18793 | * }
|
18794 | * }
|
18795 | * }
|
18796 | *
|
18797 | * // We'll pretend to do a db lookup which returns a promise
|
18798 | * var lookupUser = (userId) => Promise.resolve(db.users[userId])
|
18799 | * var lookupFollowers = (user) => Promise.resolve(user.followers)
|
18800 | * lookupUser('JOE').then(lookupFollowers)
|
18801 | *
|
18802 | * // followersForUser :: String -> Promise [UserId]
|
18803 | * var followersForUser = R.composeP(lookupFollowers, lookupUser);
|
18804 | * followersForUser('JOE').then(followers => console.log('Followers:', followers))
|
18805 | * // Followers: ["STEVE","SUZY"]
|
18806 | */
|
18807 | var composeP = function composeP() {
|
18808 | if (arguments.length === 0) {
|
18809 | throw new Error('composeP requires at least one argument');
|
18810 | }
|
18811 | return pipeP.apply(this, reverse(arguments));
|
18812 | };
|
18813 |
|
18814 | var _arrayFromIterator = function _arrayFromIterator(iter) {
|
18815 | var list = [];
|
18816 | var next;
|
18817 | while (!(next = iter.next()).done) {
|
18818 | list.push(next.value);
|
18819 | }
|
18820 | return list;
|
18821 | };
|
18822 |
|
18823 | var _functionName = function _functionName(f) {
|
18824 | // String(x => x) evaluates to "x => x", so the pattern may not match.
|
18825 | var match = String(f).match(/^function (\w*)/);
|
18826 | return match == null ? '' : match[1];
|
18827 | };
|
18828 |
|
18829 | /**
|
18830 | * Returns true if its arguments are identical, false otherwise. Values are
|
18831 | * identical if they reference the same memory. `NaN` is identical to `NaN`;
|
18832 | * `0` and `-0` are not identical.
|
18833 | *
|
18834 | * @func
|
18835 | * @memberOf R
|
18836 | * @since v0.15.0
|
18837 | * @category Relation
|
18838 | * @sig a -> a -> Boolean
|
18839 | * @param {*} a
|
18840 | * @param {*} b
|
18841 | * @return {Boolean}
|
18842 | * @example
|
18843 | *
|
18844 | * var o = {};
|
18845 | * R.identical(o, o); //=> true
|
18846 | * R.identical(1, 1); //=> true
|
18847 | * R.identical(1, '1'); //=> false
|
18848 | * R.identical([], []); //=> false
|
18849 | * R.identical(0, -0); //=> false
|
18850 | * R.identical(NaN, NaN); //=> true
|
18851 | */
|
18852 | var identical = _curry2(function identical(a, b) {
|
18853 | // SameValue algorithm
|
18854 | if (a === b) { // Steps 1-5, 7-10
|
18855 | // Steps 6.b-6.e: +0 != -0
|
18856 | return a !== 0 || 1 / a === 1 / b;
|
18857 | } else {
|
18858 | // Step 6.a: NaN == NaN
|
18859 | return a !== a && b !== b;
|
18860 | }
|
18861 | });
|
18862 |
|
18863 | var _equals = function _equals(a, b, stackA, stackB) {
|
18864 | if (identical(a, b)) {
|
18865 | return true;
|
18866 | }
|
18867 |
|
18868 | if (type(a) !== type(b)) {
|
18869 | return false;
|
18870 | }
|
18871 |
|
18872 | if (a == null || b == null) {
|
18873 | return false;
|
18874 | }
|
18875 |
|
18876 | if (typeof a.equals === 'function' || typeof b.equals === 'function') {
|
18877 | return typeof a.equals === 'function' && a.equals(b) &&
|
18878 | typeof b.equals === 'function' && b.equals(a);
|
18879 | }
|
18880 |
|
18881 | switch (type(a)) {
|
18882 | case 'Arguments':
|
18883 | case 'Array':
|
18884 | case 'Object':
|
18885 | if (typeof a.constructor === 'function' &&
|
18886 | _functionName(a.constructor) === 'Promise') {
|
18887 | return a === b;
|
18888 | }
|
18889 | break;
|
18890 | case 'Boolean':
|
18891 | case 'Number':
|
18892 | case 'String':
|
18893 | if (!(typeof a === typeof b && identical(a.valueOf(), b.valueOf()))) {
|
18894 | return false;
|
18895 | }
|
18896 | break;
|
18897 | case 'Date':
|
18898 | if (!identical(a.valueOf(), b.valueOf())) {
|
18899 | return false;
|
18900 | }
|
18901 | break;
|
18902 | case 'Error':
|
18903 | return a.name === b.name && a.message === b.message;
|
18904 | case 'RegExp':
|
18905 | if (!(a.source === b.source &&
|
18906 | a.global === b.global &&
|
18907 | a.ignoreCase === b.ignoreCase &&
|
18908 | a.multiline === b.multiline &&
|
18909 | a.sticky === b.sticky &&
|
18910 | a.unicode === b.unicode)) {
|
18911 | return false;
|
18912 | }
|
18913 | break;
|
18914 | case 'Map':
|
18915 | case 'Set':
|
18916 | if (!_equals(_arrayFromIterator(a.entries()), _arrayFromIterator(b.entries()), stackA, stackB)) {
|
18917 | return false;
|
18918 | }
|
18919 | break;
|
18920 | case 'Int8Array':
|
18921 | case 'Uint8Array':
|
18922 | case 'Uint8ClampedArray':
|
18923 | case 'Int16Array':
|
18924 | case 'Uint16Array':
|
18925 | case 'Int32Array':
|
18926 | case 'Uint32Array':
|
18927 | case 'Float32Array':
|
18928 | case 'Float64Array':
|
18929 | break;
|
18930 | case 'ArrayBuffer':
|
18931 | break;
|
18932 | default:
|
18933 | // Values of other types are only equal if identical.
|
18934 | return false;
|
18935 | }
|
18936 |
|
18937 | var keysA = keys(a);
|
18938 | if (keysA.length !== keys(b).length) {
|
18939 | return false;
|
18940 | }
|
18941 |
|
18942 | var idx = stackA.length - 1;
|
18943 | while (idx >= 0) {
|
18944 | if (stackA[idx] === a) {
|
18945 | return stackB[idx] === b;
|
18946 | }
|
18947 | idx -= 1;
|
18948 | }
|
18949 |
|
18950 | stackA.push(a);
|
18951 | stackB.push(b);
|
18952 | idx = keysA.length - 1;
|
18953 | while (idx >= 0) {
|
18954 | var key = keysA[idx];
|
18955 | if (!(_has(key, b) && _equals(b[key], a[key], stackA, stackB))) {
|
18956 | return false;
|
18957 | }
|
18958 | idx -= 1;
|
18959 | }
|
18960 | stackA.pop();
|
18961 | stackB.pop();
|
18962 | return true;
|
18963 | };
|
18964 |
|
18965 | /**
|
18966 | * Returns `true` if its arguments are equivalent, `false` otherwise. Handles
|
18967 | * cyclical data structures.
|
18968 | *
|
18969 | * Dispatches symmetrically to the `equals` methods of both arguments, if
|
18970 | * present.
|
18971 | *
|
18972 | * @func
|
18973 | * @memberOf R
|
18974 | * @since v0.15.0
|
18975 | * @category Relation
|
18976 | * @sig a -> b -> Boolean
|
18977 | * @param {*} a
|
18978 | * @param {*} b
|
18979 | * @return {Boolean}
|
18980 | * @example
|
18981 | *
|
18982 | * R.equals(1, 1); //=> true
|
18983 | * R.equals(1, '1'); //=> false
|
18984 | * R.equals([1, 2, 3], [1, 2, 3]); //=> true
|
18985 | *
|
18986 | * var a = {}; a.v = a;
|
18987 | * var b = {}; b.v = b;
|
18988 | * R.equals(a, b); //=> true
|
18989 | */
|
18990 | var equals = _curry2(function equals(a, b) {
|
18991 | return _equals(a, b, [], []);
|
18992 | });
|
18993 |
|
18994 | var _indexOf = function _indexOf(list, a, idx) {
|
18995 | var inf, item;
|
18996 | // Array.prototype.indexOf doesn't exist below IE9
|
18997 | if (typeof list.indexOf === 'function') {
|
18998 | switch (typeof a) {
|
18999 | case 'number':
|
19000 | if (a === 0) {
|
19001 | // manually crawl the list to distinguish between +0 and -0
|
19002 | inf = 1 / a;
|
19003 | while (idx < list.length) {
|
19004 | item = list[idx];
|
19005 | if (item === 0 && 1 / item === inf) {
|
19006 | return idx;
|
19007 | }
|
19008 | idx += 1;
|
19009 | }
|
19010 | return -1;
|
19011 | } else if (a !== a) {
|
19012 | // NaN
|
19013 | while (idx < list.length) {
|
19014 | item = list[idx];
|
19015 | if (typeof item === 'number' && item !== item) {
|
19016 | return idx;
|
19017 | }
|
19018 | idx += 1;
|
19019 | }
|
19020 | return -1;
|
19021 | }
|
19022 | // non-zero numbers can utilise Set
|
19023 | return list.indexOf(a, idx);
|
19024 |
|
19025 | // all these types can utilise Set
|
19026 | case 'string':
|
19027 | case 'boolean':
|
19028 | case 'function':
|
19029 | case 'undefined':
|
19030 | return list.indexOf(a, idx);
|
19031 |
|
19032 | case 'object':
|
19033 | if (a === null) {
|
19034 | // null can utilise Set
|
19035 | return list.indexOf(a, idx);
|
19036 | }
|
19037 | }
|
19038 | }
|
19039 | // anything else not covered above, defer to R.equals
|
19040 | while (idx < list.length) {
|
19041 | if (equals(list[idx], a)) {
|
19042 | return idx;
|
19043 | }
|
19044 | idx += 1;
|
19045 | }
|
19046 | return -1;
|
19047 | };
|
19048 |
|
19049 | var _contains = function _contains(a, list) {
|
19050 | return _indexOf(list, a, 0) >= 0;
|
19051 | };
|
19052 |
|
19053 | var _quote = function _quote(s) {
|
19054 | var escaped = s
|
19055 | .replace(/\\/g, '\\\\')
|
19056 | .replace(/[\b]/g, '\\b') // \b matches word boundary; [\b] matches backspace
|
19057 | .replace(/\f/g, '\\f')
|
19058 | .replace(/\n/g, '\\n')
|
19059 | .replace(/\r/g, '\\r')
|
19060 | .replace(/\t/g, '\\t')
|
19061 | .replace(/\v/g, '\\v')
|
19062 | .replace(/\0/g, '\\0');
|
19063 |
|
19064 | return '"' + escaped.replace(/"/g, '\\"') + '"';
|
19065 | };
|
19066 |
|
19067 | /**
|
19068 | * Polyfill from <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString>.
|
19069 | */
|
19070 | var _toISOString = (function() {
|
19071 | var pad = function pad(n) { return (n < 10 ? '0' : '') + n; };
|
19072 |
|
19073 | return typeof Date.prototype.toISOString === 'function' ?
|
19074 | function _toISOString(d) {
|
19075 | return d.toISOString();
|
19076 | } :
|
19077 | function _toISOString(d) {
|
19078 | return (
|
19079 | d.getUTCFullYear() + '-' +
|
19080 | pad(d.getUTCMonth() + 1) + '-' +
|
19081 | pad(d.getUTCDate()) + 'T' +
|
19082 | pad(d.getUTCHours()) + ':' +
|
19083 | pad(d.getUTCMinutes()) + ':' +
|
19084 | pad(d.getUTCSeconds()) + '.' +
|
19085 | (d.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) + 'Z'
|
19086 | );
|
19087 | };
|
19088 | }());
|
19089 |
|
19090 | var _complement = function _complement(f) {
|
19091 | return function() {
|
19092 | return !f.apply(this, arguments);
|
19093 | };
|
19094 | };
|
19095 |
|
19096 | var _filter = function _filter(fn, list) {
|
19097 | var idx = 0;
|
19098 | var len = list.length;
|
19099 | var result = [];
|
19100 |
|
19101 | while (idx < len) {
|
19102 | if (fn(list[idx])) {
|
19103 | result[result.length] = list[idx];
|
19104 | }
|
19105 | idx += 1;
|
19106 | }
|
19107 | return result;
|
19108 | };
|
19109 |
|
19110 | var _isObject = function _isObject(x) {
|
19111 | return Object.prototype.toString.call(x) === '[object Object]';
|
19112 | };
|
19113 |
|
19114 | var _xfilter = (function() {
|
19115 | function XFilter(f, xf) {
|
19116 | this.xf = xf;
|
19117 | this.f = f;
|
19118 | }
|
19119 | XFilter.prototype['@@transducer/init'] = _xfBase.init;
|
19120 | XFilter.prototype['@@transducer/result'] = _xfBase.result;
|
19121 | XFilter.prototype['@@transducer/step'] = function(result, input) {
|
19122 | return this.f(input) ? this.xf['@@transducer/step'](result, input) : result;
|
19123 | };
|
19124 |
|
19125 | return _curry2(function _xfilter(f, xf) { return new XFilter(f, xf); });
|
19126 | }());
|
19127 |
|
19128 | /**
|
19129 | * Takes a predicate and a "filterable", and returns a new filterable of the
|
19130 | * same type containing the members of the given filterable which satisfy the
|
19131 | * given predicate.
|
19132 | *
|
19133 | * Dispatches to the `filter` method of the second argument, if present.
|
19134 | *
|
19135 | * Acts as a transducer if a transformer is given in list position.
|
19136 | *
|
19137 | * @func
|
19138 | * @memberOf R
|
19139 | * @since v0.1.0
|
19140 | * @category List
|
19141 | * @sig Filterable f => (a -> Boolean) -> f a -> f a
|
19142 | * @param {Function} pred
|
19143 | * @param {Array} filterable
|
19144 | * @return {Array}
|
19145 | * @see R.reject, R.transduce, R.addIndex
|
19146 | * @example
|
19147 | *
|
19148 | * var isEven = n => n % 2 === 0;
|
19149 | *
|
19150 | * R.filter(isEven, [1, 2, 3, 4]); //=> [2, 4]
|
19151 | *
|
19152 | * R.filter(isEven, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4}
|
19153 | */
|
19154 | var filter = _curry2(_dispatchable(['filter'], _xfilter, function(pred, filterable) {
|
19155 | return (
|
19156 | _isObject(filterable) ?
|
19157 | _reduce(function(acc, key) {
|
19158 | if (pred(filterable[key])) {
|
19159 | acc[key] = filterable[key];
|
19160 | }
|
19161 | return acc;
|
19162 | }, {}, keys(filterable)) :
|
19163 | // else
|
19164 | _filter(pred, filterable)
|
19165 | );
|
19166 | }));
|
19167 |
|
19168 | /**
|
19169 | * The complement of `filter`.
|
19170 | *
|
19171 | * Acts as a transducer if a transformer is given in list position.
|
19172 | *
|
19173 | * @func
|
19174 | * @memberOf R
|
19175 | * @since v0.1.0
|
19176 | * @category List
|
19177 | * @sig Filterable f => (a -> Boolean) -> f a -> f a
|
19178 | * @param {Function} pred
|
19179 | * @param {Array} filterable
|
19180 | * @return {Array}
|
19181 | * @see R.filter, R.transduce, R.addIndex
|
19182 | * @example
|
19183 | *
|
19184 | * var isOdd = (n) => n % 2 === 1;
|
19185 | *
|
19186 | * R.reject(isOdd, [1, 2, 3, 4]); //=> [2, 4]
|
19187 | *
|
19188 | * R.reject(isOdd, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4}
|
19189 | */
|
19190 | var reject = _curry2(function reject(pred, filterable) {
|
19191 | return filter(_complement(pred), filterable);
|
19192 | });
|
19193 |
|
19194 | var _toString = function _toString(x, seen) {
|
19195 | var recur = function recur(y) {
|
19196 | var xs = seen.concat([x]);
|
19197 | return _contains(y, xs) ? '<Circular>' : _toString(y, xs);
|
19198 | };
|
19199 |
|
19200 | // mapPairs :: (Object, [String]) -> [String]
|
19201 | var mapPairs = function(obj, keys$$1) {
|
19202 | return _map(function(k) { return _quote(k) + ': ' + recur(obj[k]); }, keys$$1.slice().sort());
|
19203 | };
|
19204 |
|
19205 | switch (Object.prototype.toString.call(x)) {
|
19206 | case '[object Arguments]':
|
19207 | return '(function() { return arguments; }(' + _map(recur, x).join(', ') + '))';
|
19208 | case '[object Array]':
|
19209 | return '[' + _map(recur, x).concat(mapPairs(x, reject(function(k) { return /^\d+$/.test(k); }, keys(x)))).join(', ') + ']';
|
19210 | case '[object Boolean]':
|
19211 | return typeof x === 'object' ? 'new Boolean(' + recur(x.valueOf()) + ')' : x.toString();
|
19212 | case '[object Date]':
|
19213 | return 'new Date(' + (isNaN(x.valueOf()) ? recur(NaN) : _quote(_toISOString(x))) + ')';
|
19214 | case '[object Null]':
|
19215 | return 'null';
|
19216 | case '[object Number]':
|
19217 | return typeof x === 'object' ? 'new Number(' + recur(x.valueOf()) + ')' : 1 / x === -Infinity ? '-0' : x.toString(10);
|
19218 | case '[object String]':
|
19219 | return typeof x === 'object' ? 'new String(' + recur(x.valueOf()) + ')' : _quote(x);
|
19220 | case '[object Undefined]':
|
19221 | return 'undefined';
|
19222 | default:
|
19223 | if (typeof x.toString === 'function') {
|
19224 | var repr = x.toString();
|
19225 | if (repr !== '[object Object]') {
|
19226 | return repr;
|
19227 | }
|
19228 | }
|
19229 | return '{' + mapPairs(x, keys(x)).join(', ') + '}';
|
19230 | }
|
19231 | };
|
19232 |
|
19233 | /**
|
19234 | * Returns the string representation of the given value. `eval`'ing the output
|
19235 | * should result in a value equivalent to the input value. Many of the built-in
|
19236 | * `toString` methods do not satisfy this requirement.
|
19237 | *
|
19238 | * If the given value is an `[object Object]` with a `toString` method other
|
19239 | * than `Object.prototype.toString`, this method is invoked with no arguments
|
19240 | * to produce the return value. This means user-defined constructor functions
|
19241 | * can provide a suitable `toString` method. For example:
|
19242 | *
|
19243 | * function Point(x, y) {
|
19244 | * this.x = x;
|
19245 | * this.y = y;
|
19246 | * }
|
19247 | *
|
19248 | * Point.prototype.toString = function() {
|
19249 | * return 'new Point(' + this.x + ', ' + this.y + ')';
|
19250 | * };
|
19251 | *
|
19252 | * R.toString(new Point(1, 2)); //=> 'new Point(1, 2)'
|
19253 | *
|
19254 | * @func
|
19255 | * @memberOf R
|
19256 | * @since v0.14.0
|
19257 | * @category String
|
19258 | * @sig * -> String
|
19259 | * @param {*} val
|
19260 | * @return {String}
|
19261 | * @example
|
19262 | *
|
19263 | * R.toString(42); //=> '42'
|
19264 | * R.toString('abc'); //=> '"abc"'
|
19265 | * R.toString([1, 2, 3]); //=> '[1, 2, 3]'
|
19266 | * R.toString({foo: 1, bar: 2, baz: 3}); //=> '{"bar": 2, "baz": 3, "foo": 1}'
|
19267 | * R.toString(new Date('2001-02-03T04:05:06Z')); //=> 'new Date("2001-02-03T04:05:06.000Z")'
|
19268 | */
|
19269 | var toString_1 = _curry1(function toString(val) { return _toString(val, []); });
|
19270 |
|
19271 | /**
|
19272 | * Returns the result of concatenating the given lists or strings.
|
19273 | *
|
19274 | * Note: `R.concat` expects both arguments to be of the same type,
|
19275 | * unlike the native `Array.prototype.concat` method. It will throw
|
19276 | * an error if you `concat` an Array with a non-Array value.
|
19277 | *
|
19278 | * Dispatches to the `concat` method of the first argument, if present.
|
19279 | *
|
19280 | * @func
|
19281 | * @memberOf R
|
19282 | * @since v0.1.0
|
19283 | * @category List
|
19284 | * @sig [a] -> [a] -> [a]
|
19285 | * @sig String -> String -> String
|
19286 | * @param {Array|String} firstList The first list
|
19287 | * @param {Array|String} secondList The second list
|
19288 | * @return {Array|String} A list consisting of the elements of `firstList` followed by the elements of
|
19289 | * `secondList`.
|
19290 | *
|
19291 | * @example
|
19292 | *
|
19293 | * R.concat('ABC', 'DEF'); // 'ABCDEF'
|
19294 | * R.concat([4, 5, 6], [1, 2, 3]); //=> [4, 5, 6, 1, 2, 3]
|
19295 | * R.concat([], []); //=> []
|
19296 | */
|
19297 | var concat = _curry2(function concat(a, b) {
|
19298 | if (a == null || !_isFunction(a.concat)) {
|
19299 | throw new TypeError(toString_1(a) + ' does not have a method named "concat"');
|
19300 | }
|
19301 | if (_isArray(a) && !_isArray(b)) {
|
19302 | throw new TypeError(toString_1(b) + ' is not an array');
|
19303 | }
|
19304 | return a.concat(b);
|
19305 | });
|
19306 |
|
19307 | /**
|
19308 | * Returns a function, `fn`, which encapsulates `if/else, if/else, ...` logic.
|
19309 | * `R.cond` takes a list of [predicate, transformer] pairs. All of the arguments
|
19310 | * to `fn` are applied to each of the predicates in turn until one returns a
|
19311 | * "truthy" value, at which point `fn` returns the result of applying its
|
19312 | * arguments to the corresponding transformer. If none of the predicates
|
19313 | * matches, `fn` returns undefined.
|
19314 | *
|
19315 | * @func
|
19316 | * @memberOf R
|
19317 | * @since v0.6.0
|
19318 | * @category Logic
|
19319 | * @sig [[(*... -> Boolean),(*... -> *)]] -> (*... -> *)
|
19320 | * @param {Array} pairs A list of [predicate, transformer]
|
19321 | * @return {Function}
|
19322 | * @example
|
19323 | *
|
19324 | * var fn = R.cond([
|
19325 | * [R.equals(0), R.always('water freezes at 0°C')],
|
19326 | * [R.equals(100), R.always('water boils at 100°C')],
|
19327 | * [R.T, temp => 'nothing special happens at ' + temp + '°C']
|
19328 | * ]);
|
19329 | * fn(0); //=> 'water freezes at 0°C'
|
19330 | * fn(50); //=> 'nothing special happens at 50°C'
|
19331 | * fn(100); //=> 'water boils at 100°C'
|
19332 | */
|
19333 | var cond = _curry1(function cond(pairs) {
|
19334 | var arity = reduce(max,
|
19335 | 0,
|
19336 | map$1(function(pair) { return pair[0].length; }, pairs));
|
19337 | return _arity(arity, function() {
|
19338 | var idx = 0;
|
19339 | while (idx < pairs.length) {
|
19340 | if (pairs[idx][0].apply(this, arguments)) {
|
19341 | return pairs[idx][1].apply(this, arguments);
|
19342 | }
|
19343 | idx += 1;
|
19344 | }
|
19345 | });
|
19346 | });
|
19347 |
|
19348 | /**
|
19349 | * Wraps a constructor function inside a curried function that can be called
|
19350 | * with the same arguments and returns the same type. The arity of the function
|
19351 | * returned is specified to allow using variadic constructor functions.
|
19352 | *
|
19353 | * @func
|
19354 | * @memberOf R
|
19355 | * @since v0.4.0
|
19356 | * @category Function
|
19357 | * @sig Number -> (* -> {*}) -> (* -> {*})
|
19358 | * @param {Number} n The arity of the constructor function.
|
19359 | * @param {Function} Fn The constructor function to wrap.
|
19360 | * @return {Function} A wrapped, curried constructor function.
|
19361 | * @example
|
19362 | *
|
19363 | * // Variadic Constructor function
|
19364 | * function Salad() {
|
19365 | * this.ingredients = arguments;
|
19366 | * };
|
19367 | * Salad.prototype.recipe = function() {
|
19368 | * var instructions = R.map((ingredient) => (
|
19369 | * 'Add a whollop of ' + ingredient, this.ingredients)
|
19370 | * )
|
19371 | * return R.join('\n', instructions)
|
19372 | * }
|
19373 | *
|
19374 | * var ThreeLayerSalad = R.constructN(3, Salad)
|
19375 | *
|
19376 | * // Notice we no longer need the 'new' keyword, and the constructor is curried for 3 arguments.
|
19377 | * var salad = ThreeLayerSalad('Mayonnaise')('Potato Chips')('Ketchup')
|
19378 | * console.log(salad.recipe());
|
19379 | * // Add a whollop of Mayonnaise
|
19380 | * // Add a whollop of Potato Chips
|
19381 | * // Add a whollop of Potato Ketchup
|
19382 | */
|
19383 | var constructN = _curry2(function constructN(n, Fn) {
|
19384 | if (n > 10) {
|
19385 | throw new Error('Constructor with greater than ten arguments');
|
19386 | }
|
19387 | if (n === 0) {
|
19388 | return function() { return new Fn(); };
|
19389 | }
|
19390 | return curry(nAry(n, function($0, $1, $2, $3, $4, $5, $6, $7, $8, $9) {
|
19391 | switch (arguments.length) {
|
19392 | case 1: return new Fn($0);
|
19393 | case 2: return new Fn($0, $1);
|
19394 | case 3: return new Fn($0, $1, $2);
|
19395 | case 4: return new Fn($0, $1, $2, $3);
|
19396 | case 5: return new Fn($0, $1, $2, $3, $4);
|
19397 | case 6: return new Fn($0, $1, $2, $3, $4, $5);
|
19398 | case 7: return new Fn($0, $1, $2, $3, $4, $5, $6);
|
19399 | case 8: return new Fn($0, $1, $2, $3, $4, $5, $6, $7);
|
19400 | case 9: return new Fn($0, $1, $2, $3, $4, $5, $6, $7, $8);
|
19401 | case 10: return new Fn($0, $1, $2, $3, $4, $5, $6, $7, $8, $9);
|
19402 | }
|
19403 | }));
|
19404 | });
|
19405 |
|
19406 | /**
|
19407 | * Wraps a constructor function inside a curried function that can be called
|
19408 | * with the same arguments and returns the same type.
|
19409 | *
|
19410 | * @func
|
19411 | * @memberOf R
|
19412 | * @since v0.1.0
|
19413 | * @category Function
|
19414 | * @sig (* -> {*}) -> (* -> {*})
|
19415 | * @param {Function} fn The constructor function to wrap.
|
19416 | * @return {Function} A wrapped, curried constructor function.
|
19417 | * @example
|
19418 | *
|
19419 | * // Constructor function
|
19420 | * function Animal(kind) {
|
19421 | * this.kind = kind;
|
19422 | * };
|
19423 | * Animal.prototype.sighting = function() {
|
19424 | * return "It's a " + this.kind + "!";
|
19425 | * }
|
19426 | *
|
19427 | * var AnimalConstructor = R.construct(Animal)
|
19428 | *
|
19429 | * // Notice we no longer need the 'new' keyword:
|
19430 | * AnimalConstructor('Pig'); //=> {"kind": "Pig", "sighting": function (){...}};
|
19431 | *
|
19432 | * var animalTypes = ["Lion", "Tiger", "Bear"];
|
19433 | * var animalSighting = R.invoker(0, 'sighting');
|
19434 | * var sightNewAnimal = R.compose(animalSighting, AnimalConstructor);
|
19435 | * R.map(sightNewAnimal, animalTypes); //=> ["It's a Lion!", "It's a Tiger!", "It's a Bear!"]
|
19436 | */
|
19437 | var construct = _curry1(function construct(Fn) {
|
19438 | return constructN(Fn.length, Fn);
|
19439 | });
|
19440 |
|
19441 | /**
|
19442 | * Returns `true` if the specified value is equal, in `R.equals` terms, to at
|
19443 | * least one element of the given list; `false` otherwise.
|
19444 | *
|
19445 | * @func
|
19446 | * @memberOf R
|
19447 | * @since v0.1.0
|
19448 | * @category List
|
19449 | * @sig a -> [a] -> Boolean
|
19450 | * @param {Object} a The item to compare against.
|
19451 | * @param {Array} list The array to consider.
|
19452 | * @return {Boolean} `true` if an equivalent item is in the list, `false` otherwise.
|
19453 | * @see R.any
|
19454 | * @example
|
19455 | *
|
19456 | * R.contains(3, [1, 2, 3]); //=> true
|
19457 | * R.contains(4, [1, 2, 3]); //=> false
|
19458 | * R.contains({ name: 'Fred' }, [{ name: 'Fred' }]); //=> true
|
19459 | * R.contains([42], [[42]]); //=> true
|
19460 | */
|
19461 | var contains = _curry2(_contains);
|
19462 |
|
19463 | /**
|
19464 | * Accepts a converging function and a list of branching functions and returns
|
19465 | * a new function. When invoked, this new function is applied to some
|
19466 | * arguments, each branching function is applied to those same arguments. The
|
19467 | * results of each branching function are passed as arguments to the converging
|
19468 | * function to produce the return value.
|
19469 | *
|
19470 | * @func
|
19471 | * @memberOf R
|
19472 | * @since v0.4.2
|
19473 | * @category Function
|
19474 | * @sig (x1 -> x2 -> ... -> z) -> [(a -> b -> ... -> x1), (a -> b -> ... -> x2), ...] -> (a -> b -> ... -> z)
|
19475 | * @param {Function} after A function. `after` will be invoked with the return values of
|
19476 | * `fn1` and `fn2` as its arguments.
|
19477 | * @param {Array} functions A list of functions.
|
19478 | * @return {Function} A new function.
|
19479 | * @see R.useWith
|
19480 | * @example
|
19481 | *
|
19482 | * var average = R.converge(R.divide, [R.sum, R.length])
|
19483 | * average([1, 2, 3, 4, 5, 6, 7]) //=> 4
|
19484 | *
|
19485 | * var strangeConcat = R.converge(R.concat, [R.toUpper, R.toLower])
|
19486 | * strangeConcat("Yodel") //=> "YODELyodel"
|
19487 | *
|
19488 | * @symb R.converge(f, [g, h])(a, b) = f(g(a, b), h(a, b))
|
19489 | */
|
19490 | var converge = _curry2(function converge(after, fns) {
|
19491 | return curryN(reduce(max, 0, pluck('length', fns)), function() {
|
19492 | var args = arguments;
|
19493 | var context = this;
|
19494 | return after.apply(context, _map(function(fn) {
|
19495 | return fn.apply(context, args);
|
19496 | }, fns));
|
19497 | });
|
19498 | });
|
19499 |
|
19500 | var _xreduceBy = (function() {
|
19501 | function XReduceBy(valueFn, valueAcc, keyFn, xf) {
|
19502 | this.valueFn = valueFn;
|
19503 | this.valueAcc = valueAcc;
|
19504 | this.keyFn = keyFn;
|
19505 | this.xf = xf;
|
19506 | this.inputs = {};
|
19507 | }
|
19508 | XReduceBy.prototype['@@transducer/init'] = _xfBase.init;
|
19509 | XReduceBy.prototype['@@transducer/result'] = function(result) {
|
19510 | var key;
|
19511 | for (key in this.inputs) {
|
19512 | if (_has(key, this.inputs)) {
|
19513 | result = this.xf['@@transducer/step'](result, this.inputs[key]);
|
19514 | if (result['@@transducer/reduced']) {
|
19515 | result = result['@@transducer/value'];
|
19516 | break;
|
19517 | }
|
19518 | }
|
19519 | }
|
19520 | this.inputs = null;
|
19521 | return this.xf['@@transducer/result'](result);
|
19522 | };
|
19523 | XReduceBy.prototype['@@transducer/step'] = function(result, input) {
|
19524 | var key = this.keyFn(input);
|
19525 | this.inputs[key] = this.inputs[key] || [key, this.valueAcc];
|
19526 | this.inputs[key][1] = this.valueFn(this.inputs[key][1], input);
|
19527 | return result;
|
19528 | };
|
19529 |
|
19530 | return _curryN(4, [],
|
19531 | function _xreduceBy(valueFn, valueAcc, keyFn, xf) {
|
19532 | return new XReduceBy(valueFn, valueAcc, keyFn, xf);
|
19533 | });
|
19534 | }());
|
19535 |
|
19536 | /**
|
19537 | * Groups the elements of the list according to the result of calling
|
19538 | * the String-returning function `keyFn` on each element and reduces the elements
|
19539 | * of each group to a single value via the reducer function `valueFn`.
|
19540 | *
|
19541 | * This function is basically a more general `groupBy` function.
|
19542 | *
|
19543 | * Acts as a transducer if a transformer is given in list position.
|
19544 | *
|
19545 | * @func
|
19546 | * @memberOf R
|
19547 | * @since v0.20.0
|
19548 | * @category List
|
19549 | * @sig ((a, b) -> a) -> a -> (b -> String) -> [b] -> {String: a}
|
19550 | * @param {Function} valueFn The function that reduces the elements of each group to a single
|
19551 | * value. Receives two values, accumulator for a particular group and the current element.
|
19552 | * @param {*} acc The (initial) accumulator value for each group.
|
19553 | * @param {Function} keyFn The function that maps the list's element into a key.
|
19554 | * @param {Array} list The array to group.
|
19555 | * @return {Object} An object with the output of `keyFn` for keys, mapped to the output of
|
19556 | * `valueFn` for elements which produced that key when passed to `keyFn`.
|
19557 | * @see R.groupBy, R.reduce
|
19558 | * @example
|
19559 | *
|
19560 | * var reduceToNamesBy = R.reduceBy((acc, student) => acc.concat(student.name), []);
|
19561 | * var namesByGrade = reduceToNamesBy(function(student) {
|
19562 | * var score = student.score;
|
19563 | * return score < 65 ? 'F' :
|
19564 | * score < 70 ? 'D' :
|
19565 | * score < 80 ? 'C' :
|
19566 | * score < 90 ? 'B' : 'A';
|
19567 | * });
|
19568 | * var students = [{name: 'Lucy', score: 92},
|
19569 | * {name: 'Drew', score: 85},
|
19570 | * // ...
|
19571 | * {name: 'Bart', score: 62}];
|
19572 | * namesByGrade(students);
|
19573 | * // {
|
19574 | * // 'A': ['Lucy'],
|
19575 | * // 'B': ['Drew']
|
19576 | * // // ...,
|
19577 | * // 'F': ['Bart']
|
19578 | * // }
|
19579 | */
|
19580 | var reduceBy = _curryN(4, [], _dispatchable([], _xreduceBy,
|
19581 | function reduceBy(valueFn, valueAcc, keyFn, list) {
|
19582 | return _reduce(function(acc, elt) {
|
19583 | var key = keyFn(elt);
|
19584 | acc[key] = valueFn(_has(key, acc) ? acc[key] : valueAcc, elt);
|
19585 | return acc;
|
19586 | }, {}, list);
|
19587 | }));
|
19588 |
|
19589 | /**
|
19590 | * Counts the elements of a list according to how many match each value of a
|
19591 | * key generated by the supplied function. Returns an object mapping the keys
|
19592 | * produced by `fn` to the number of occurrences in the list. Note that all
|
19593 | * keys are coerced to strings because of how JavaScript objects work.
|
19594 | *
|
19595 | * Acts as a transducer if a transformer is given in list position.
|
19596 | *
|
19597 | * @func
|
19598 | * @memberOf R
|
19599 | * @since v0.1.0
|
19600 | * @category Relation
|
19601 | * @sig (a -> String) -> [a] -> {*}
|
19602 | * @param {Function} fn The function used to map values to keys.
|
19603 | * @param {Array} list The list to count elements from.
|
19604 | * @return {Object} An object mapping keys to number of occurrences in the list.
|
19605 | * @example
|
19606 | *
|
19607 | * var numbers = [1.0, 1.1, 1.2, 2.0, 3.0, 2.2];
|
19608 | * R.countBy(Math.floor)(numbers); //=> {'1': 3, '2': 2, '3': 1}
|
19609 | *
|
19610 | * var letters = ['a', 'b', 'A', 'a', 'B', 'c'];
|
19611 | * R.countBy(R.toLower)(letters); //=> {'a': 3, 'b': 2, 'c': 1}
|
19612 | */
|
19613 | var countBy = reduceBy(function(acc, elem) { return acc + 1; }, 0);
|
19614 |
|
19615 | /**
|
19616 | * Decrements its argument.
|
19617 | *
|
19618 | * @func
|
19619 | * @memberOf R
|
19620 | * @since v0.9.0
|
19621 | * @category Math
|
19622 | * @sig Number -> Number
|
19623 | * @param {Number} n
|
19624 | * @return {Number} n - 1
|
19625 | * @see R.inc
|
19626 | * @example
|
19627 | *
|
19628 | * R.dec(42); //=> 41
|
19629 | */
|
19630 | var dec = add(-1);
|
19631 |
|
19632 | /**
|
19633 | * Makes a descending comparator function out of a function that returns a value
|
19634 | * that can be compared with `<` and `>`.
|
19635 | *
|
19636 | * @func
|
19637 | * @memberOf R
|
19638 | * @since v0.23.0
|
19639 | * @category Function
|
19640 | * @sig Ord b => (a -> b) -> a -> a -> Number
|
19641 | * @param {Function} fn A function of arity one that returns a value that can be compared
|
19642 | * @param {*} a The first item to be compared.
|
19643 | * @param {*} b The second item to be compared.
|
19644 | * @return {Number} `-1` if fn(a) > fn(b), `1` if fn(b) > fn(a), otherwise `0`
|
19645 | * @example
|
19646 | *
|
19647 | * var byAge = R.descend(R.prop('age'));
|
19648 | * var people = [
|
19649 | * // ...
|
19650 | * ];
|
19651 | * var peopleByOldestFirst = R.sort(byAge, people);
|
19652 | */
|
19653 | var descend = _curry3(function descend(fn, a, b) {
|
19654 | var aa = fn(a);
|
19655 | var bb = fn(b);
|
19656 | return aa > bb ? -1 : aa < bb ? 1 : 0;
|
19657 | });
|
19658 |
|
19659 | /**
|
19660 | * Returns the second argument if it is not `null`, `undefined` or `NaN`
|
19661 | * otherwise the first argument is returned.
|
19662 | *
|
19663 | * @func
|
19664 | * @memberOf R
|
19665 | * @since v0.10.0
|
19666 | * @category Logic
|
19667 | * @sig a -> b -> a | b
|
19668 | * @param {a} default The default value.
|
19669 | * @param {b} val `val` will be returned instead of `default` unless `val` is `null`, `undefined` or `NaN`.
|
19670 | * @return {*} The second value if it is not `null`, `undefined` or `NaN`, otherwise the default value
|
19671 | * @example
|
19672 | *
|
19673 | * var defaultTo42 = R.defaultTo(42);
|
19674 | *
|
19675 | * defaultTo42(null); //=> 42
|
19676 | * defaultTo42(undefined); //=> 42
|
19677 | * defaultTo42('Ramda'); //=> 'Ramda'
|
19678 | * // parseInt('string') results in NaN
|
19679 | * defaultTo42(parseInt('string')); //=> 42
|
19680 | */
|
19681 | var defaultTo = _curry2(function defaultTo(d, v) {
|
19682 | return v == null || v !== v ? d : v;
|
19683 | });
|
19684 |
|
19685 | /**
|
19686 | * Finds the set (i.e. no duplicates) of all elements in the first list not
|
19687 | * contained in the second list. Objects and Arrays are compared are compared
|
19688 | * in terms of value equality, not reference equality.
|
19689 | *
|
19690 | * @func
|
19691 | * @memberOf R
|
19692 | * @since v0.1.0
|
19693 | * @category Relation
|
19694 | * @sig [*] -> [*] -> [*]
|
19695 | * @param {Array} list1 The first list.
|
19696 | * @param {Array} list2 The second list.
|
19697 | * @return {Array} The elements in `list1` that are not in `list2`.
|
19698 | * @see R.differenceWith, R.symmetricDifference, R.symmetricDifferenceWith
|
19699 | * @example
|
19700 | *
|
19701 | * R.difference([1,2,3,4], [7,6,5,4,3]); //=> [1,2]
|
19702 | * R.difference([7,6,5,4,3], [1,2,3,4]); //=> [7,6,5]
|
19703 | * R.difference([{a: 1}, {b: 2}], [{a: 1}, {c: 3}]) //=> [{b: 2}]
|
19704 | */
|
19705 | var difference = _curry2(function difference(first, second) {
|
19706 | var out = [];
|
19707 | var idx = 0;
|
19708 | var firstLen = first.length;
|
19709 | while (idx < firstLen) {
|
19710 | if (!_contains(first[idx], second) && !_contains(first[idx], out)) {
|
19711 | out[out.length] = first[idx];
|
19712 | }
|
19713 | idx += 1;
|
19714 | }
|
19715 | return out;
|
19716 | });
|
19717 |
|
19718 | var _containsWith = function _containsWith(pred, x, list) {
|
19719 | var idx = 0;
|
19720 | var len = list.length;
|
19721 |
|
19722 | while (idx < len) {
|
19723 | if (pred(x, list[idx])) {
|
19724 | return true;
|
19725 | }
|
19726 | idx += 1;
|
19727 | }
|
19728 | return false;
|
19729 | };
|
19730 |
|
19731 | /**
|
19732 | * Finds the set (i.e. no duplicates) of all elements in the first list not
|
19733 | * contained in the second list. Duplication is determined according to the
|
19734 | * value returned by applying the supplied predicate to two list elements.
|
19735 | *
|
19736 | * @func
|
19737 | * @memberOf R
|
19738 | * @since v0.1.0
|
19739 | * @category Relation
|
19740 | * @sig ((a, a) -> Boolean) -> [a] -> [a] -> [a]
|
19741 | * @param {Function} pred A predicate used to test whether two items are equal.
|
19742 | * @param {Array} list1 The first list.
|
19743 | * @param {Array} list2 The second list.
|
19744 | * @return {Array} The elements in `list1` that are not in `list2`.
|
19745 | * @see R.difference, R.symmetricDifference, R.symmetricDifferenceWith
|
19746 | * @example
|
19747 | *
|
19748 | * var cmp = (x, y) => x.a === y.a;
|
19749 | * var l1 = [{a: 1}, {a: 2}, {a: 3}];
|
19750 | * var l2 = [{a: 3}, {a: 4}];
|
19751 | * R.differenceWith(cmp, l1, l2); //=> [{a: 1}, {a: 2}]
|
19752 | */
|
19753 | var differenceWith = _curry3(function differenceWith(pred, first, second) {
|
19754 | var out = [];
|
19755 | var idx = 0;
|
19756 | var firstLen = first.length;
|
19757 | while (idx < firstLen) {
|
19758 | if (!_containsWith(pred, first[idx], second) &&
|
19759 | !_containsWith(pred, first[idx], out)) {
|
19760 | out.push(first[idx]);
|
19761 | }
|
19762 | idx += 1;
|
19763 | }
|
19764 | return out;
|
19765 | });
|
19766 |
|
19767 | /**
|
19768 | * Returns a new object that does not contain a `prop` property.
|
19769 | *
|
19770 | * @func
|
19771 | * @memberOf R
|
19772 | * @since v0.10.0
|
19773 | * @category Object
|
19774 | * @sig String -> {k: v} -> {k: v}
|
19775 | * @param {String} prop The name of the property to dissociate
|
19776 | * @param {Object} obj The object to clone
|
19777 | * @return {Object} A new object equivalent to the original but without the specified property
|
19778 | * @see R.assoc
|
19779 | * @example
|
19780 | *
|
19781 | * R.dissoc('b', {a: 1, b: 2, c: 3}); //=> {a: 1, c: 3}
|
19782 | */
|
19783 | var dissoc = _curry2(function dissoc(prop, obj) {
|
19784 | var result = {};
|
19785 | for (var p in obj) {
|
19786 | result[p] = obj[p];
|
19787 | }
|
19788 | delete result[prop];
|
19789 | return result;
|
19790 | });
|
19791 |
|
19792 | /**
|
19793 | * Makes a shallow clone of an object, omitting the property at the given path.
|
19794 | * Note that this copies and flattens prototype properties onto the new object
|
19795 | * as well. All non-primitive properties are copied by reference.
|
19796 | *
|
19797 | * @func
|
19798 | * @memberOf R
|
19799 | * @since v0.11.0
|
19800 | * @category Object
|
19801 | * @sig [String] -> {k: v} -> {k: v}
|
19802 | * @param {Array} path The path to the value to omit
|
19803 | * @param {Object} obj The object to clone
|
19804 | * @return {Object} A new object without the property at path
|
19805 | * @see R.assocPath
|
19806 | * @example
|
19807 | *
|
19808 | * R.dissocPath(['a', 'b', 'c'], {a: {b: {c: 42}}}); //=> {a: {b: {}}}
|
19809 | */
|
19810 | var dissocPath = _curry2(function dissocPath(path, obj) {
|
19811 | switch (path.length) {
|
19812 | case 0:
|
19813 | return obj;
|
19814 | case 1:
|
19815 | return dissoc(path[0], obj);
|
19816 | default:
|
19817 | var head = path[0];
|
19818 | var tail = Array.prototype.slice.call(path, 1);
|
19819 | return obj[head] == null ? obj : assoc(head, dissocPath(tail, obj[head]), obj);
|
19820 | }
|
19821 | });
|
19822 |
|
19823 | /**
|
19824 | * Divides two numbers. Equivalent to `a / b`.
|
19825 | *
|
19826 | * @func
|
19827 | * @memberOf R
|
19828 | * @since v0.1.0
|
19829 | * @category Math
|
19830 | * @sig Number -> Number -> Number
|
19831 | * @param {Number} a The first value.
|
19832 | * @param {Number} b The second value.
|
19833 | * @return {Number} The result of `a / b`.
|
19834 | * @see R.multiply
|
19835 | * @example
|
19836 | *
|
19837 | * R.divide(71, 100); //=> 0.71
|
19838 | *
|
19839 | * var half = R.divide(R.__, 2);
|
19840 | * half(42); //=> 21
|
19841 | *
|
19842 | * var reciprocal = R.divide(1);
|
19843 | * reciprocal(4); //=> 0.25
|
19844 | */
|
19845 | var divide = _curry2(function divide(a, b) { return a / b; });
|
19846 |
|
19847 | var _xdrop = (function() {
|
19848 | function XDrop(n, xf) {
|
19849 | this.xf = xf;
|
19850 | this.n = n;
|
19851 | }
|
19852 | XDrop.prototype['@@transducer/init'] = _xfBase.init;
|
19853 | XDrop.prototype['@@transducer/result'] = _xfBase.result;
|
19854 | XDrop.prototype['@@transducer/step'] = function(result, input) {
|
19855 | if (this.n > 0) {
|
19856 | this.n -= 1;
|
19857 | return result;
|
19858 | }
|
19859 | return this.xf['@@transducer/step'](result, input);
|
19860 | };
|
19861 |
|
19862 | return _curry2(function _xdrop(n, xf) { return new XDrop(n, xf); });
|
19863 | }());
|
19864 |
|
19865 | /**
|
19866 | * Returns all but the first `n` elements of the given list, string, or
|
19867 | * transducer/transformer (or object with a `drop` method).
|
19868 | *
|
19869 | * Dispatches to the `drop` method of the second argument, if present.
|
19870 | *
|
19871 | * @func
|
19872 | * @memberOf R
|
19873 | * @since v0.1.0
|
19874 | * @category List
|
19875 | * @sig Number -> [a] -> [a]
|
19876 | * @sig Number -> String -> String
|
19877 | * @param {Number} n
|
19878 | * @param {[a]} list
|
19879 | * @return {[a]} A copy of list without the first `n` elements
|
19880 | * @see R.take, R.transduce, R.dropLast, R.dropWhile
|
19881 | * @example
|
19882 | *
|
19883 | * R.drop(1, ['foo', 'bar', 'baz']); //=> ['bar', 'baz']
|
19884 | * R.drop(2, ['foo', 'bar', 'baz']); //=> ['baz']
|
19885 | * R.drop(3, ['foo', 'bar', 'baz']); //=> []
|
19886 | * R.drop(4, ['foo', 'bar', 'baz']); //=> []
|
19887 | * R.drop(3, 'ramda'); //=> 'da'
|
19888 | */
|
19889 | var drop = _curry2(_dispatchable(['drop'], _xdrop, function drop(n, xs) {
|
19890 | return slice(Math.max(0, n), Infinity, xs);
|
19891 | }));
|
19892 |
|
19893 | var _xtake = (function() {
|
19894 | function XTake(n, xf) {
|
19895 | this.xf = xf;
|
19896 | this.n = n;
|
19897 | this.i = 0;
|
19898 | }
|
19899 | XTake.prototype['@@transducer/init'] = _xfBase.init;
|
19900 | XTake.prototype['@@transducer/result'] = _xfBase.result;
|
19901 | XTake.prototype['@@transducer/step'] = function(result, input) {
|
19902 | this.i += 1;
|
19903 | var ret = this.n === 0 ? result : this.xf['@@transducer/step'](result, input);
|
19904 | return this.i >= this.n ? _reduced(ret) : ret;
|
19905 | };
|
19906 |
|
19907 | return _curry2(function _xtake(n, xf) { return new XTake(n, xf); });
|
19908 | }());
|
19909 |
|
19910 | /**
|
19911 | * Returns the first `n` elements of the given list, string, or
|
19912 | * transducer/transformer (or object with a `take` method).
|
19913 | *
|
19914 | * Dispatches to the `take` method of the second argument, if present.
|
19915 | *
|
19916 | * @func
|
19917 | * @memberOf R
|
19918 | * @since v0.1.0
|
19919 | * @category List
|
19920 | * @sig Number -> [a] -> [a]
|
19921 | * @sig Number -> String -> String
|
19922 | * @param {Number} n
|
19923 | * @param {*} list
|
19924 | * @return {*}
|
19925 | * @see R.drop
|
19926 | * @example
|
19927 | *
|
19928 | * R.take(1, ['foo', 'bar', 'baz']); //=> ['foo']
|
19929 | * R.take(2, ['foo', 'bar', 'baz']); //=> ['foo', 'bar']
|
19930 | * R.take(3, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz']
|
19931 | * R.take(4, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz']
|
19932 | * R.take(3, 'ramda'); //=> 'ram'
|
19933 | *
|
19934 | * var personnel = [
|
19935 | * 'Dave Brubeck',
|
19936 | * 'Paul Desmond',
|
19937 | * 'Eugene Wright',
|
19938 | * 'Joe Morello',
|
19939 | * 'Gerry Mulligan',
|
19940 | * 'Bob Bates',
|
19941 | * 'Joe Dodge',
|
19942 | * 'Ron Crotty'
|
19943 | * ];
|
19944 | *
|
19945 | * var takeFive = R.take(5);
|
19946 | * takeFive(personnel);
|
19947 | * //=> ['Dave Brubeck', 'Paul Desmond', 'Eugene Wright', 'Joe Morello', 'Gerry Mulligan']
|
19948 | * @symb R.take(-1, [a, b]) = [a, b]
|
19949 | * @symb R.take(0, [a, b]) = []
|
19950 | * @symb R.take(1, [a, b]) = [a]
|
19951 | * @symb R.take(2, [a, b]) = [a, b]
|
19952 | */
|
19953 | var take = _curry2(_dispatchable(['take'], _xtake, function take(n, xs) {
|
19954 | return slice(0, n < 0 ? Infinity : n, xs);
|
19955 | }));
|
19956 |
|
19957 | var _dropLast = function dropLast(n, xs) {
|
19958 | return take(n < xs.length ? xs.length - n : 0, xs);
|
19959 | };
|
19960 |
|
19961 | var _xdropLast = (function() {
|
19962 | function XDropLast(n, xf) {
|
19963 | this.xf = xf;
|
19964 | this.pos = 0;
|
19965 | this.full = false;
|
19966 | this.acc = new Array(n);
|
19967 | }
|
19968 | XDropLast.prototype['@@transducer/init'] = _xfBase.init;
|
19969 | XDropLast.prototype['@@transducer/result'] = function(result) {
|
19970 | this.acc = null;
|
19971 | return this.xf['@@transducer/result'](result);
|
19972 | };
|
19973 | XDropLast.prototype['@@transducer/step'] = function(result, input) {
|
19974 | if (this.full) {
|
19975 | result = this.xf['@@transducer/step'](result, this.acc[this.pos]);
|
19976 | }
|
19977 | this.store(input);
|
19978 | return result;
|
19979 | };
|
19980 | XDropLast.prototype.store = function(input) {
|
19981 | this.acc[this.pos] = input;
|
19982 | this.pos += 1;
|
19983 | if (this.pos === this.acc.length) {
|
19984 | this.pos = 0;
|
19985 | this.full = true;
|
19986 | }
|
19987 | };
|
19988 |
|
19989 | return _curry2(function _xdropLast(n, xf) { return new XDropLast(n, xf); });
|
19990 | }());
|
19991 |
|
19992 | /**
|
19993 | * Returns a list containing all but the last `n` elements of the given `list`.
|
19994 | *
|
19995 | * @func
|
19996 | * @memberOf R
|
19997 | * @since v0.16.0
|
19998 | * @category List
|
19999 | * @sig Number -> [a] -> [a]
|
20000 | * @sig Number -> String -> String
|
20001 | * @param {Number} n The number of elements of `list` to skip.
|
20002 | * @param {Array} list The list of elements to consider.
|
20003 | * @return {Array} A copy of the list with only the first `list.length - n` elements
|
20004 | * @see R.takeLast, R.drop, R.dropWhile, R.dropLastWhile
|
20005 | * @example
|
20006 | *
|
20007 | * R.dropLast(1, ['foo', 'bar', 'baz']); //=> ['foo', 'bar']
|
20008 | * R.dropLast(2, ['foo', 'bar', 'baz']); //=> ['foo']
|
20009 | * R.dropLast(3, ['foo', 'bar', 'baz']); //=> []
|
20010 | * R.dropLast(4, ['foo', 'bar', 'baz']); //=> []
|
20011 | * R.dropLast(3, 'ramda'); //=> 'ra'
|
20012 | */
|
20013 | var dropLast = _curry2(_dispatchable([], _xdropLast, _dropLast));
|
20014 |
|
20015 | var _dropLastWhile = function dropLastWhile(pred, list) {
|
20016 | var idx = list.length - 1;
|
20017 | while (idx >= 0 && pred(list[idx])) {
|
20018 | idx -= 1;
|
20019 | }
|
20020 | return Array.prototype.slice.call(list, 0, idx + 1);
|
20021 | };
|
20022 |
|
20023 | var _xdropLastWhile = (function() {
|
20024 | function XDropLastWhile(fn, xf) {
|
20025 | this.f = fn;
|
20026 | this.retained = [];
|
20027 | this.xf = xf;
|
20028 | }
|
20029 | XDropLastWhile.prototype['@@transducer/init'] = _xfBase.init;
|
20030 | XDropLastWhile.prototype['@@transducer/result'] = function(result) {
|
20031 | this.retained = null;
|
20032 | return this.xf['@@transducer/result'](result);
|
20033 | };
|
20034 | XDropLastWhile.prototype['@@transducer/step'] = function(result, input) {
|
20035 | return this.f(input) ? this.retain(result, input)
|
20036 | : this.flush(result, input);
|
20037 | };
|
20038 | XDropLastWhile.prototype.flush = function(result, input) {
|
20039 | result = _reduce(
|
20040 | this.xf['@@transducer/step'],
|
20041 | result,
|
20042 | this.retained
|
20043 | );
|
20044 | this.retained = [];
|
20045 | return this.xf['@@transducer/step'](result, input);
|
20046 | };
|
20047 | XDropLastWhile.prototype.retain = function(result, input) {
|
20048 | this.retained.push(input);
|
20049 | return result;
|
20050 | };
|
20051 |
|
20052 | return _curry2(function _xdropLastWhile(fn, xf) { return new XDropLastWhile(fn, xf); });
|
20053 | }());
|
20054 |
|
20055 | /**
|
20056 | * Returns a new list excluding all the tailing elements of a given list which
|
20057 | * satisfy the supplied predicate function. It passes each value from the right
|
20058 | * to the supplied predicate function, skipping elements until the predicate
|
20059 | * function returns a `falsy` value. The predicate function is applied to one argument:
|
20060 | * *(value)*.
|
20061 | *
|
20062 | * @func
|
20063 | * @memberOf R
|
20064 | * @since v0.16.0
|
20065 | * @category List
|
20066 | * @sig (a -> Boolean) -> [a] -> [a]
|
20067 | * @param {Function} predicate The function to be called on each element
|
20068 | * @param {Array} list The collection to iterate over.
|
20069 | * @return {Array} A new array without any trailing elements that return `falsy` values from the `predicate`.
|
20070 | * @see R.takeLastWhile, R.addIndex, R.drop, R.dropWhile
|
20071 | * @example
|
20072 | *
|
20073 | * var lteThree = x => x <= 3;
|
20074 | *
|
20075 | * R.dropLastWhile(lteThree, [1, 2, 3, 4, 3, 2, 1]); //=> [1, 2, 3, 4]
|
20076 | */
|
20077 | var dropLastWhile = _curry2(_dispatchable([], _xdropLastWhile, _dropLastWhile));
|
20078 |
|
20079 | var _xdropRepeatsWith = (function() {
|
20080 | function XDropRepeatsWith(pred, xf) {
|
20081 | this.xf = xf;
|
20082 | this.pred = pred;
|
20083 | this.lastValue = undefined;
|
20084 | this.seenFirstValue = false;
|
20085 | }
|
20086 |
|
20087 | XDropRepeatsWith.prototype['@@transducer/init'] = _xfBase.init;
|
20088 | XDropRepeatsWith.prototype['@@transducer/result'] = _xfBase.result;
|
20089 | XDropRepeatsWith.prototype['@@transducer/step'] = function(result, input) {
|
20090 | var sameAsLast = false;
|
20091 | if (!this.seenFirstValue) {
|
20092 | this.seenFirstValue = true;
|
20093 | } else if (this.pred(this.lastValue, input)) {
|
20094 | sameAsLast = true;
|
20095 | }
|
20096 | this.lastValue = input;
|
20097 | return sameAsLast ? result : this.xf['@@transducer/step'](result, input);
|
20098 | };
|
20099 |
|
20100 | return _curry2(function _xdropRepeatsWith(pred, xf) { return new XDropRepeatsWith(pred, xf); });
|
20101 | }());
|
20102 |
|
20103 | /**
|
20104 | * Returns the nth element of the given list or string. If n is negative the
|
20105 | * element at index length + n is returned.
|
20106 | *
|
20107 | * @func
|
20108 | * @memberOf R
|
20109 | * @since v0.1.0
|
20110 | * @category List
|
20111 | * @sig Number -> [a] -> a | Undefined
|
20112 | * @sig Number -> String -> String
|
20113 | * @param {Number} offset
|
20114 | * @param {*} list
|
20115 | * @return {*}
|
20116 | * @example
|
20117 | *
|
20118 | * var list = ['foo', 'bar', 'baz', 'quux'];
|
20119 | * R.nth(1, list); //=> 'bar'
|
20120 | * R.nth(-1, list); //=> 'quux'
|
20121 | * R.nth(-99, list); //=> undefined
|
20122 | *
|
20123 | * R.nth(2, 'abc'); //=> 'c'
|
20124 | * R.nth(3, 'abc'); //=> ''
|
20125 | * @symb R.nth(-1, [a, b, c]) = c
|
20126 | * @symb R.nth(0, [a, b, c]) = a
|
20127 | * @symb R.nth(1, [a, b, c]) = b
|
20128 | */
|
20129 | var nth = _curry2(function nth(offset, list) {
|
20130 | var idx = offset < 0 ? list.length + offset : offset;
|
20131 | return _isString(list) ? list.charAt(idx) : list[idx];
|
20132 | });
|
20133 |
|
20134 | /**
|
20135 | * Returns the last element of the given list or string.
|
20136 | *
|
20137 | * @func
|
20138 | * @memberOf R
|
20139 | * @since v0.1.4
|
20140 | * @category List
|
20141 | * @sig [a] -> a | Undefined
|
20142 | * @sig String -> String
|
20143 | * @param {*} list
|
20144 | * @return {*}
|
20145 | * @see R.init, R.head, R.tail
|
20146 | * @example
|
20147 | *
|
20148 | * R.last(['fi', 'fo', 'fum']); //=> 'fum'
|
20149 | * R.last([]); //=> undefined
|
20150 | *
|
20151 | * R.last('abc'); //=> 'c'
|
20152 | * R.last(''); //=> ''
|
20153 | */
|
20154 | var last = nth(-1);
|
20155 |
|
20156 | /**
|
20157 | * Returns a new list without any consecutively repeating elements. Equality is
|
20158 | * determined by applying the supplied predicate to each pair of consecutive elements. The
|
20159 | * first element in a series of equal elements will be preserved.
|
20160 | *
|
20161 | * Acts as a transducer if a transformer is given in list position.
|
20162 | *
|
20163 | * @func
|
20164 | * @memberOf R
|
20165 | * @since v0.14.0
|
20166 | * @category List
|
20167 | * @sig (a, a -> Boolean) -> [a] -> [a]
|
20168 | * @param {Function} pred A predicate used to test whether two items are equal.
|
20169 | * @param {Array} list The array to consider.
|
20170 | * @return {Array} `list` without repeating elements.
|
20171 | * @see R.transduce
|
20172 | * @example
|
20173 | *
|
20174 | * var l = [1, -1, 1, 3, 4, -4, -4, -5, 5, 3, 3];
|
20175 | * R.dropRepeatsWith(R.eqBy(Math.abs), l); //=> [1, 3, 4, -5, 3]
|
20176 | */
|
20177 | var dropRepeatsWith = _curry2(_dispatchable([], _xdropRepeatsWith, function dropRepeatsWith(pred, list) {
|
20178 | var result = [];
|
20179 | var idx = 1;
|
20180 | var len = list.length;
|
20181 | if (len !== 0) {
|
20182 | result[0] = list[0];
|
20183 | while (idx < len) {
|
20184 | if (!pred(last(result), list[idx])) {
|
20185 | result[result.length] = list[idx];
|
20186 | }
|
20187 | idx += 1;
|
20188 | }
|
20189 | }
|
20190 | return result;
|
20191 | }));
|
20192 |
|
20193 | /**
|
20194 | * Returns a new list without any consecutively repeating elements. `R.equals`
|
20195 | * is used to determine equality.
|
20196 | *
|
20197 | * Acts as a transducer if a transformer is given in list position.
|
20198 | *
|
20199 | * @func
|
20200 | * @memberOf R
|
20201 | * @since v0.14.0
|
20202 | * @category List
|
20203 | * @sig [a] -> [a]
|
20204 | * @param {Array} list The array to consider.
|
20205 | * @return {Array} `list` without repeating elements.
|
20206 | * @see R.transduce
|
20207 | * @example
|
20208 | *
|
20209 | * R.dropRepeats([1, 1, 1, 2, 3, 4, 4, 2, 2]); //=> [1, 2, 3, 4, 2]
|
20210 | */
|
20211 | var dropRepeats = _curry1(_dispatchable([], _xdropRepeatsWith(equals), dropRepeatsWith(equals)));
|
20212 |
|
20213 | var _xdropWhile = (function() {
|
20214 | function XDropWhile(f, xf) {
|
20215 | this.xf = xf;
|
20216 | this.f = f;
|
20217 | }
|
20218 | XDropWhile.prototype['@@transducer/init'] = _xfBase.init;
|
20219 | XDropWhile.prototype['@@transducer/result'] = _xfBase.result;
|
20220 | XDropWhile.prototype['@@transducer/step'] = function(result, input) {
|
20221 | if (this.f) {
|
20222 | if (this.f(input)) {
|
20223 | return result;
|
20224 | }
|
20225 | this.f = null;
|
20226 | }
|
20227 | return this.xf['@@transducer/step'](result, input);
|
20228 | };
|
20229 |
|
20230 | return _curry2(function _xdropWhile(f, xf) { return new XDropWhile(f, xf); });
|
20231 | }());
|
20232 |
|
20233 | /**
|
20234 | * Returns a new list excluding the leading elements of a given list which
|
20235 | * satisfy the supplied predicate function. It passes each value to the supplied
|
20236 | * predicate function, skipping elements while the predicate function returns
|
20237 | * `true`. The predicate function is applied to one argument: *(value)*.
|
20238 | *
|
20239 | * Dispatches to the `dropWhile` method of the second argument, if present.
|
20240 | *
|
20241 | * Acts as a transducer if a transformer is given in list position.
|
20242 | *
|
20243 | * @func
|
20244 | * @memberOf R
|
20245 | * @since v0.9.0
|
20246 | * @category List
|
20247 | * @sig (a -> Boolean) -> [a] -> [a]
|
20248 | * @param {Function} fn The function called per iteration.
|
20249 | * @param {Array} list The collection to iterate over.
|
20250 | * @return {Array} A new array.
|
20251 | * @see R.takeWhile, R.transduce, R.addIndex
|
20252 | * @example
|
20253 | *
|
20254 | * var lteTwo = x => x <= 2;
|
20255 | *
|
20256 | * R.dropWhile(lteTwo, [1, 2, 3, 4, 3, 2, 1]); //=> [3, 4, 3, 2, 1]
|
20257 | */
|
20258 | var dropWhile = _curry2(_dispatchable(['dropWhile'], _xdropWhile, function dropWhile(pred, list) {
|
20259 | var idx = 0;
|
20260 | var len = list.length;
|
20261 | while (idx < len && pred(list[idx])) {
|
20262 | idx += 1;
|
20263 | }
|
20264 | return Array.prototype.slice.call(list, idx);
|
20265 | }));
|
20266 |
|
20267 | /**
|
20268 | * Returns `true` if one or both of its arguments are `true`. Returns `false`
|
20269 | * if both arguments are `false`.
|
20270 | *
|
20271 | * @func
|
20272 | * @memberOf R
|
20273 | * @since v0.1.0
|
20274 | * @category Logic
|
20275 | * @sig a -> b -> a | b
|
20276 | * @param {Any} a
|
20277 | * @param {Any} b
|
20278 | * @return {Any} the first argument if truthy, otherwise the second argument.
|
20279 | * @see R.either
|
20280 | * @example
|
20281 | *
|
20282 | * R.or(true, true); //=> true
|
20283 | * R.or(true, false); //=> true
|
20284 | * R.or(false, true); //=> true
|
20285 | * R.or(false, false); //=> false
|
20286 | */
|
20287 | var or = _curry2(function or(a, b) {
|
20288 | return a || b;
|
20289 | });
|
20290 |
|
20291 | /**
|
20292 | * A function wrapping calls to the two functions in an `||` operation,
|
20293 | * returning the result of the first function if it is truth-y and the result
|
20294 | * of the second function otherwise. Note that this is short-circuited,
|
20295 | * meaning that the second function will not be invoked if the first returns a
|
20296 | * truth-y value.
|
20297 | *
|
20298 | * In addition to functions, `R.either` also accepts any fantasy-land compatible
|
20299 | * applicative functor.
|
20300 | *
|
20301 | * @func
|
20302 | * @memberOf R
|
20303 | * @since v0.12.0
|
20304 | * @category Logic
|
20305 | * @sig (*... -> Boolean) -> (*... -> Boolean) -> (*... -> Boolean)
|
20306 | * @param {Function} f a predicate
|
20307 | * @param {Function} g another predicate
|
20308 | * @return {Function} a function that applies its arguments to `f` and `g` and `||`s their outputs together.
|
20309 | * @see R.or
|
20310 | * @example
|
20311 | *
|
20312 | * var gt10 = x => x > 10;
|
20313 | * var even = x => x % 2 === 0;
|
20314 | * var f = R.either(gt10, even);
|
20315 | * f(101); //=> true
|
20316 | * f(8); //=> true
|
20317 | */
|
20318 | var either = _curry2(function either(f, g) {
|
20319 | return _isFunction(f) ?
|
20320 | function _either() {
|
20321 | return f.apply(this, arguments) || g.apply(this, arguments);
|
20322 | } :
|
20323 | lift(or)(f, g);
|
20324 | });
|
20325 |
|
20326 | /**
|
20327 | * Returns the empty value of its argument's type. Ramda defines the empty
|
20328 | * value of Array (`[]`), Object (`{}`), String (`''`), and Arguments. Other
|
20329 | * types are supported if they define `<Type>.empty` and/or
|
20330 | * `<Type>.prototype.empty`.
|
20331 | *
|
20332 | * Dispatches to the `empty` method of the first argument, if present.
|
20333 | *
|
20334 | * @func
|
20335 | * @memberOf R
|
20336 | * @since v0.3.0
|
20337 | * @category Function
|
20338 | * @sig a -> a
|
20339 | * @param {*} x
|
20340 | * @return {*}
|
20341 | * @example
|
20342 | *
|
20343 | * R.empty(Just(42)); //=> Nothing()
|
20344 | * R.empty([1, 2, 3]); //=> []
|
20345 | * R.empty('unicorns'); //=> ''
|
20346 | * R.empty({x: 1, y: 2}); //=> {}
|
20347 | */
|
20348 | var empty = _curry1(function empty(x) {
|
20349 | return (
|
20350 | (x != null && typeof x.empty === 'function') ?
|
20351 | x.empty() :
|
20352 | (x != null && x.constructor != null && typeof x.constructor.empty === 'function') ?
|
20353 | x.constructor.empty() :
|
20354 | _isArray(x) ?
|
20355 | [] :
|
20356 | _isString(x) ?
|
20357 | '' :
|
20358 | _isObject(x) ?
|
20359 | {} :
|
20360 | _isArguments(x) ?
|
20361 | (function() { return arguments; }()) :
|
20362 | // else
|
20363 | void 0
|
20364 | );
|
20365 | });
|
20366 |
|
20367 | /**
|
20368 | * Takes a function and two values in its domain and returns `true` if the
|
20369 | * values map to the same value in the codomain; `false` otherwise.
|
20370 | *
|
20371 | * @func
|
20372 | * @memberOf R
|
20373 | * @since v0.18.0
|
20374 | * @category Relation
|
20375 | * @sig (a -> b) -> a -> a -> Boolean
|
20376 | * @param {Function} f
|
20377 | * @param {*} x
|
20378 | * @param {*} y
|
20379 | * @return {Boolean}
|
20380 | * @example
|
20381 | *
|
20382 | * R.eqBy(Math.abs, 5, -5); //=> true
|
20383 | */
|
20384 | var eqBy = _curry3(function eqBy(f, x, y) {
|
20385 | return equals(f(x), f(y));
|
20386 | });
|
20387 |
|
20388 | /**
|
20389 | * Reports whether two objects have the same value, in `R.equals` terms, for
|
20390 | * the specified property. Useful as a curried predicate.
|
20391 | *
|
20392 | * @func
|
20393 | * @memberOf R
|
20394 | * @since v0.1.0
|
20395 | * @category Object
|
20396 | * @sig k -> {k: v} -> {k: v} -> Boolean
|
20397 | * @param {String} prop The name of the property to compare
|
20398 | * @param {Object} obj1
|
20399 | * @param {Object} obj2
|
20400 | * @return {Boolean}
|
20401 | *
|
20402 | * @example
|
20403 | *
|
20404 | * var o1 = { a: 1, b: 2, c: 3, d: 4 };
|
20405 | * var o2 = { a: 10, b: 20, c: 3, d: 40 };
|
20406 | * R.eqProps('a', o1, o2); //=> false
|
20407 | * R.eqProps('c', o1, o2); //=> true
|
20408 | */
|
20409 | var eqProps = _curry3(function eqProps(prop, obj1, obj2) {
|
20410 | return equals(obj1[prop], obj2[prop]);
|
20411 | });
|
20412 |
|
20413 | /**
|
20414 | * Creates a new object by recursively evolving a shallow copy of `object`,
|
20415 | * according to the `transformation` functions. All non-primitive properties
|
20416 | * are copied by reference.
|
20417 | *
|
20418 | * A `transformation` function will not be invoked if its corresponding key
|
20419 | * does not exist in the evolved object.
|
20420 | *
|
20421 | * @func
|
20422 | * @memberOf R
|
20423 | * @since v0.9.0
|
20424 | * @category Object
|
20425 | * @sig {k: (v -> v)} -> {k: v} -> {k: v}
|
20426 | * @param {Object} transformations The object specifying transformation functions to apply
|
20427 | * to the object.
|
20428 | * @param {Object} object The object to be transformed.
|
20429 | * @return {Object} The transformed object.
|
20430 | * @example
|
20431 | *
|
20432 | * var tomato = {firstName: ' Tomato ', data: {elapsed: 100, remaining: 1400}, id:123};
|
20433 | * var transformations = {
|
20434 | * firstName: R.trim,
|
20435 | * lastName: R.trim, // Will not get invoked.
|
20436 | * data: {elapsed: R.add(1), remaining: R.add(-1)}
|
20437 | * };
|
20438 | * R.evolve(transformations, tomato); //=> {firstName: 'Tomato', data: {elapsed: 101, remaining: 1399}, id:123}
|
20439 | */
|
20440 | var evolve = _curry2(function evolve(transformations, object) {
|
20441 | var result = {};
|
20442 | var transformation, key, type;
|
20443 | for (key in object) {
|
20444 | transformation = transformations[key];
|
20445 | type = typeof transformation;
|
20446 | result[key] = type === 'function' ? transformation(object[key])
|
20447 | : transformation && type === 'object' ? evolve(transformation, object[key])
|
20448 | : object[key];
|
20449 | }
|
20450 | return result;
|
20451 | });
|
20452 |
|
20453 | var _xfind = (function() {
|
20454 | function XFind(f, xf) {
|
20455 | this.xf = xf;
|
20456 | this.f = f;
|
20457 | this.found = false;
|
20458 | }
|
20459 | XFind.prototype['@@transducer/init'] = _xfBase.init;
|
20460 | XFind.prototype['@@transducer/result'] = function(result) {
|
20461 | if (!this.found) {
|
20462 | result = this.xf['@@transducer/step'](result, void 0);
|
20463 | }
|
20464 | return this.xf['@@transducer/result'](result);
|
20465 | };
|
20466 | XFind.prototype['@@transducer/step'] = function(result, input) {
|
20467 | if (this.f(input)) {
|
20468 | this.found = true;
|
20469 | result = _reduced(this.xf['@@transducer/step'](result, input));
|
20470 | }
|
20471 | return result;
|
20472 | };
|
20473 |
|
20474 | return _curry2(function _xfind(f, xf) { return new XFind(f, xf); });
|
20475 | }());
|
20476 |
|
20477 | /**
|
20478 | * Returns the first element of the list which matches the predicate, or
|
20479 | * `undefined` if no element matches.
|
20480 | *
|
20481 | * Dispatches to the `find` method of the second argument, if present.
|
20482 | *
|
20483 | * Acts as a transducer if a transformer is given in list position.
|
20484 | *
|
20485 | * @func
|
20486 | * @memberOf R
|
20487 | * @since v0.1.0
|
20488 | * @category List
|
20489 | * @sig (a -> Boolean) -> [a] -> a | undefined
|
20490 | * @param {Function} fn The predicate function used to determine if the element is the
|
20491 | * desired one.
|
20492 | * @param {Array} list The array to consider.
|
20493 | * @return {Object} The element found, or `undefined`.
|
20494 | * @see R.transduce
|
20495 | * @example
|
20496 | *
|
20497 | * var xs = [{a: 1}, {a: 2}, {a: 3}];
|
20498 | * R.find(R.propEq('a', 2))(xs); //=> {a: 2}
|
20499 | * R.find(R.propEq('a', 4))(xs); //=> undefined
|
20500 | */
|
20501 | var find = _curry2(_dispatchable(['find'], _xfind, function find(fn, list) {
|
20502 | var idx = 0;
|
20503 | var len = list.length;
|
20504 | while (idx < len) {
|
20505 | if (fn(list[idx])) {
|
20506 | return list[idx];
|
20507 | }
|
20508 | idx += 1;
|
20509 | }
|
20510 | }));
|
20511 |
|
20512 | var _xfindIndex = (function() {
|
20513 | function XFindIndex(f, xf) {
|
20514 | this.xf = xf;
|
20515 | this.f = f;
|
20516 | this.idx = -1;
|
20517 | this.found = false;
|
20518 | }
|
20519 | XFindIndex.prototype['@@transducer/init'] = _xfBase.init;
|
20520 | XFindIndex.prototype['@@transducer/result'] = function(result) {
|
20521 | if (!this.found) {
|
20522 | result = this.xf['@@transducer/step'](result, -1);
|
20523 | }
|
20524 | return this.xf['@@transducer/result'](result);
|
20525 | };
|
20526 | XFindIndex.prototype['@@transducer/step'] = function(result, input) {
|
20527 | this.idx += 1;
|
20528 | if (this.f(input)) {
|
20529 | this.found = true;
|
20530 | result = _reduced(this.xf['@@transducer/step'](result, this.idx));
|
20531 | }
|
20532 | return result;
|
20533 | };
|
20534 |
|
20535 | return _curry2(function _xfindIndex(f, xf) { return new XFindIndex(f, xf); });
|
20536 | }());
|
20537 |
|
20538 | /**
|
20539 | * Returns the index of the first element of the list which matches the
|
20540 | * predicate, or `-1` if no element matches.
|
20541 | *
|
20542 | * Acts as a transducer if a transformer is given in list position.
|
20543 | *
|
20544 | * @func
|
20545 | * @memberOf R
|
20546 | * @since v0.1.1
|
20547 | * @category List
|
20548 | * @sig (a -> Boolean) -> [a] -> Number
|
20549 | * @param {Function} fn The predicate function used to determine if the element is the
|
20550 | * desired one.
|
20551 | * @param {Array} list The array to consider.
|
20552 | * @return {Number} The index of the element found, or `-1`.
|
20553 | * @see R.transduce
|
20554 | * @example
|
20555 | *
|
20556 | * var xs = [{a: 1}, {a: 2}, {a: 3}];
|
20557 | * R.findIndex(R.propEq('a', 2))(xs); //=> 1
|
20558 | * R.findIndex(R.propEq('a', 4))(xs); //=> -1
|
20559 | */
|
20560 | var findIndex = _curry2(_dispatchable([], _xfindIndex, function findIndex(fn, list) {
|
20561 | var idx = 0;
|
20562 | var len = list.length;
|
20563 | while (idx < len) {
|
20564 | if (fn(list[idx])) {
|
20565 | return idx;
|
20566 | }
|
20567 | idx += 1;
|
20568 | }
|
20569 | return -1;
|
20570 | }));
|
20571 |
|
20572 | var _xfindLast = (function() {
|
20573 | function XFindLast(f, xf) {
|
20574 | this.xf = xf;
|
20575 | this.f = f;
|
20576 | }
|
20577 | XFindLast.prototype['@@transducer/init'] = _xfBase.init;
|
20578 | XFindLast.prototype['@@transducer/result'] = function(result) {
|
20579 | return this.xf['@@transducer/result'](this.xf['@@transducer/step'](result, this.last));
|
20580 | };
|
20581 | XFindLast.prototype['@@transducer/step'] = function(result, input) {
|
20582 | if (this.f(input)) {
|
20583 | this.last = input;
|
20584 | }
|
20585 | return result;
|
20586 | };
|
20587 |
|
20588 | return _curry2(function _xfindLast(f, xf) { return new XFindLast(f, xf); });
|
20589 | }());
|
20590 |
|
20591 | /**
|
20592 | * Returns the last element of the list which matches the predicate, or
|
20593 | * `undefined` if no element matches.
|
20594 | *
|
20595 | * Acts as a transducer if a transformer is given in list position.
|
20596 | *
|
20597 | * @func
|
20598 | * @memberOf R
|
20599 | * @since v0.1.1
|
20600 | * @category List
|
20601 | * @sig (a -> Boolean) -> [a] -> a | undefined
|
20602 | * @param {Function} fn The predicate function used to determine if the element is the
|
20603 | * desired one.
|
20604 | * @param {Array} list The array to consider.
|
20605 | * @return {Object} The element found, or `undefined`.
|
20606 | * @see R.transduce
|
20607 | * @example
|
20608 | *
|
20609 | * var xs = [{a: 1, b: 0}, {a:1, b: 1}];
|
20610 | * R.findLast(R.propEq('a', 1))(xs); //=> {a: 1, b: 1}
|
20611 | * R.findLast(R.propEq('a', 4))(xs); //=> undefined
|
20612 | */
|
20613 | var findLast = _curry2(_dispatchable([], _xfindLast, function findLast(fn, list) {
|
20614 | var idx = list.length - 1;
|
20615 | while (idx >= 0) {
|
20616 | if (fn(list[idx])) {
|
20617 | return list[idx];
|
20618 | }
|
20619 | idx -= 1;
|
20620 | }
|
20621 | }));
|
20622 |
|
20623 | var _xfindLastIndex = (function() {
|
20624 | function XFindLastIndex(f, xf) {
|
20625 | this.xf = xf;
|
20626 | this.f = f;
|
20627 | this.idx = -1;
|
20628 | this.lastIdx = -1;
|
20629 | }
|
20630 | XFindLastIndex.prototype['@@transducer/init'] = _xfBase.init;
|
20631 | XFindLastIndex.prototype['@@transducer/result'] = function(result) {
|
20632 | return this.xf['@@transducer/result'](this.xf['@@transducer/step'](result, this.lastIdx));
|
20633 | };
|
20634 | XFindLastIndex.prototype['@@transducer/step'] = function(result, input) {
|
20635 | this.idx += 1;
|
20636 | if (this.f(input)) {
|
20637 | this.lastIdx = this.idx;
|
20638 | }
|
20639 | return result;
|
20640 | };
|
20641 |
|
20642 | return _curry2(function _xfindLastIndex(f, xf) { return new XFindLastIndex(f, xf); });
|
20643 | }());
|
20644 |
|
20645 | /**
|
20646 | * Returns the index of the last element of the list which matches the
|
20647 | * predicate, or `-1` if no element matches.
|
20648 | *
|
20649 | * Acts as a transducer if a transformer is given in list position.
|
20650 | *
|
20651 | * @func
|
20652 | * @memberOf R
|
20653 | * @since v0.1.1
|
20654 | * @category List
|
20655 | * @sig (a -> Boolean) -> [a] -> Number
|
20656 | * @param {Function} fn The predicate function used to determine if the element is the
|
20657 | * desired one.
|
20658 | * @param {Array} list The array to consider.
|
20659 | * @return {Number} The index of the element found, or `-1`.
|
20660 | * @see R.transduce
|
20661 | * @example
|
20662 | *
|
20663 | * var xs = [{a: 1, b: 0}, {a:1, b: 1}];
|
20664 | * R.findLastIndex(R.propEq('a', 1))(xs); //=> 1
|
20665 | * R.findLastIndex(R.propEq('a', 4))(xs); //=> -1
|
20666 | */
|
20667 | var findLastIndex = _curry2(_dispatchable([], _xfindLastIndex, function findLastIndex(fn, list) {
|
20668 | var idx = list.length - 1;
|
20669 | while (idx >= 0) {
|
20670 | if (fn(list[idx])) {
|
20671 | return idx;
|
20672 | }
|
20673 | idx -= 1;
|
20674 | }
|
20675 | return -1;
|
20676 | }));
|
20677 |
|
20678 | /**
|
20679 | * Returns a new list by pulling every item out of it (and all its sub-arrays)
|
20680 | * and putting them in a new array, depth-first.
|
20681 | *
|
20682 | * @func
|
20683 | * @memberOf R
|
20684 | * @since v0.1.0
|
20685 | * @category List
|
20686 | * @sig [a] -> [b]
|
20687 | * @param {Array} list The array to consider.
|
20688 | * @return {Array} The flattened list.
|
20689 | * @see R.unnest
|
20690 | * @example
|
20691 | *
|
20692 | * R.flatten([1, 2, [3, 4], 5, [6, [7, 8, [9, [10, 11], 12]]]]);
|
20693 | * //=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
|
20694 | */
|
20695 | var flatten = _curry1(_makeFlat(true));
|
20696 |
|
20697 | /**
|
20698 | * Returns a new function much like the supplied one, except that the first two
|
20699 | * arguments' order is reversed.
|
20700 | *
|
20701 | * @func
|
20702 | * @memberOf R
|
20703 | * @since v0.1.0
|
20704 | * @category Function
|
20705 | * @sig (a -> b -> c -> ... -> z) -> (b -> a -> c -> ... -> z)
|
20706 | * @param {Function} fn The function to invoke with its first two parameters reversed.
|
20707 | * @return {*} The result of invoking `fn` with its first two parameters' order reversed.
|
20708 | * @example
|
20709 | *
|
20710 | * var mergeThree = (a, b, c) => [].concat(a, b, c);
|
20711 | *
|
20712 | * mergeThree(1, 2, 3); //=> [1, 2, 3]
|
20713 | *
|
20714 | * R.flip(mergeThree)(1, 2, 3); //=> [2, 1, 3]
|
20715 | * @symb R.flip(f)(a, b, c) = f(b, a, c)
|
20716 | */
|
20717 | var flip = _curry1(function flip(fn) {
|
20718 | return curry(function(a, b) {
|
20719 | var args = Array.prototype.slice.call(arguments, 0);
|
20720 | args[0] = b;
|
20721 | args[1] = a;
|
20722 | return fn.apply(this, args);
|
20723 | });
|
20724 | });
|
20725 |
|
20726 | /**
|
20727 | * Iterate over an input `list`, calling a provided function `fn` for each
|
20728 | * element in the list.
|
20729 | *
|
20730 | * `fn` receives one argument: *(value)*.
|
20731 | *
|
20732 | * Note: `R.forEach` does not skip deleted or unassigned indices (sparse
|
20733 | * arrays), unlike the native `Array.prototype.forEach` method. For more
|
20734 | * details on this behavior, see:
|
20735 | * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Description
|
20736 | *
|
20737 | * Also note that, unlike `Array.prototype.forEach`, Ramda's `forEach` returns
|
20738 | * the original array. In some libraries this function is named `each`.
|
20739 | *
|
20740 | * Dispatches to the `forEach` method of the second argument, if present.
|
20741 | *
|
20742 | * @func
|
20743 | * @memberOf R
|
20744 | * @since v0.1.1
|
20745 | * @category List
|
20746 | * @sig (a -> *) -> [a] -> [a]
|
20747 | * @param {Function} fn The function to invoke. Receives one argument, `value`.
|
20748 | * @param {Array} list The list to iterate over.
|
20749 | * @return {Array} The original list.
|
20750 | * @see R.addIndex
|
20751 | * @example
|
20752 | *
|
20753 | * var printXPlusFive = x => console.log(x + 5);
|
20754 | * R.forEach(printXPlusFive, [1, 2, 3]); //=> [1, 2, 3]
|
20755 | * // logs 6
|
20756 | * // logs 7
|
20757 | * // logs 8
|
20758 | * @symb R.forEach(f, [a, b, c]) = [a, b, c]
|
20759 | */
|
20760 | var forEach = _curry2(_checkForMethod('forEach', function forEach(fn, list) {
|
20761 | var len = list.length;
|
20762 | var idx = 0;
|
20763 | while (idx < len) {
|
20764 | fn(list[idx]);
|
20765 | idx += 1;
|
20766 | }
|
20767 | return list;
|
20768 | }));
|
20769 |
|
20770 | /**
|
20771 | * Iterate over an input `object`, calling a provided function `fn` for each
|
20772 | * key and value in the object.
|
20773 | *
|
20774 | * `fn` receives three argument: *(value, key, obj)*.
|
20775 | *
|
20776 | * @func
|
20777 | * @memberOf R
|
20778 | * @since v0.23.0
|
20779 | * @category Object
|
20780 | * @sig ((a, String, StrMap a) -> Any) -> StrMap a -> StrMap a
|
20781 | * @param {Function} fn The function to invoke. Receives three argument, `value`, `key`, `obj`.
|
20782 | * @param {Object} obj The object to iterate over.
|
20783 | * @return {Object} The original object.
|
20784 | * @example
|
20785 | *
|
20786 | * var printKeyConcatValue = (value, key) => console.log(key + ':' + value);
|
20787 | * R.forEachObjIndexed(printKeyConcatValue, {x: 1, y: 2}); //=> {x: 1, y: 2}
|
20788 | * // logs x:1
|
20789 | * // logs y:2
|
20790 | * @symb R.forEachObjIndexed(f, {x: a, y: b}) = {x: a, y: b}
|
20791 | */
|
20792 | var forEachObjIndexed = _curry2(function forEachObjIndexed(fn, obj) {
|
20793 | var keyList = keys(obj);
|
20794 | var idx = 0;
|
20795 | while (idx < keyList.length) {
|
20796 | var key = keyList[idx];
|
20797 | fn(obj[key], key, obj);
|
20798 | idx += 1;
|
20799 | }
|
20800 | return obj;
|
20801 | });
|
20802 |
|
20803 | /**
|
20804 | * Creates a new object from a list key-value pairs. If a key appears in
|
20805 | * multiple pairs, the rightmost pair is included in the object.
|
20806 | *
|
20807 | * @func
|
20808 | * @memberOf R
|
20809 | * @since v0.3.0
|
20810 | * @category List
|
20811 | * @sig [[k,v]] -> {k: v}
|
20812 | * @param {Array} pairs An array of two-element arrays that will be the keys and values of the output object.
|
20813 | * @return {Object} The object made by pairing up `keys` and `values`.
|
20814 | * @see R.toPairs, R.pair
|
20815 | * @example
|
20816 | *
|
20817 | * R.fromPairs([['a', 1], ['b', 2], ['c', 3]]); //=> {a: 1, b: 2, c: 3}
|
20818 | */
|
20819 | var fromPairs = _curry1(function fromPairs(pairs) {
|
20820 | var result = {};
|
20821 | var idx = 0;
|
20822 | while (idx < pairs.length) {
|
20823 | result[pairs[idx][0]] = pairs[idx][1];
|
20824 | idx += 1;
|
20825 | }
|
20826 | return result;
|
20827 | });
|
20828 |
|
20829 | /**
|
20830 | * Splits a list into sub-lists stored in an object, based on the result of
|
20831 | * calling a String-returning function on each element, and grouping the
|
20832 | * results according to values returned.
|
20833 | *
|
20834 | * Dispatches to the `groupBy` method of the second argument, if present.
|
20835 | *
|
20836 | * Acts as a transducer if a transformer is given in list position.
|
20837 | *
|
20838 | * @func
|
20839 | * @memberOf R
|
20840 | * @since v0.1.0
|
20841 | * @category List
|
20842 | * @sig (a -> String) -> [a] -> {String: [a]}
|
20843 | * @param {Function} fn Function :: a -> String
|
20844 | * @param {Array} list The array to group
|
20845 | * @return {Object} An object with the output of `fn` for keys, mapped to arrays of elements
|
20846 | * that produced that key when passed to `fn`.
|
20847 | * @see R.transduce
|
20848 | * @example
|
20849 | *
|
20850 | * var byGrade = R.groupBy(function(student) {
|
20851 | * var score = student.score;
|
20852 | * return score < 65 ? 'F' :
|
20853 | * score < 70 ? 'D' :
|
20854 | * score < 80 ? 'C' :
|
20855 | * score < 90 ? 'B' : 'A';
|
20856 | * });
|
20857 | * var students = [{name: 'Abby', score: 84},
|
20858 | * {name: 'Eddy', score: 58},
|
20859 | * // ...
|
20860 | * {name: 'Jack', score: 69}];
|
20861 | * byGrade(students);
|
20862 | * // {
|
20863 | * // 'A': [{name: 'Dianne', score: 99}],
|
20864 | * // 'B': [{name: 'Abby', score: 84}]
|
20865 | * // // ...,
|
20866 | * // 'F': [{name: 'Eddy', score: 58}]
|
20867 | * // }
|
20868 | */
|
20869 | var groupBy = _curry2(_checkForMethod('groupBy', reduceBy(function(acc, item) {
|
20870 | if (acc == null) {
|
20871 | acc = [];
|
20872 | }
|
20873 | acc.push(item);
|
20874 | return acc;
|
20875 | }, null)));
|
20876 |
|
20877 | /**
|
20878 | * Takes a list and returns a list of lists where each sublist's elements are
|
20879 | * all "equal" according to the provided equality function.
|
20880 | *
|
20881 | * @func
|
20882 | * @memberOf R
|
20883 | * @since v0.21.0
|
20884 | * @category List
|
20885 | * @sig ((a, a) → Boolean) → [a] → [[a]]
|
20886 | * @param {Function} fn Function for determining whether two given (adjacent)
|
20887 | * elements should be in the same group
|
20888 | * @param {Array} list The array to group. Also accepts a string, which will be
|
20889 | * treated as a list of characters.
|
20890 | * @return {List} A list that contains sublists of equal elements,
|
20891 | * whose concatenations are equal to the original list.
|
20892 | * @example
|
20893 | *
|
20894 | * R.groupWith(R.equals, [0, 1, 1, 2, 3, 5, 8, 13, 21])
|
20895 | * //=> [[0], [1, 1], [2], [3], [5], [8], [13], [21]]
|
20896 | *
|
20897 | * R.groupWith((a, b) => a % 2 === b % 2, [0, 1, 1, 2, 3, 5, 8, 13, 21])
|
20898 | * //=> [[0], [1, 1], [2], [3, 5], [8], [13, 21]]
|
20899 | *
|
20900 | * R.groupWith(R.eqBy(isVowel), 'aestiou')
|
20901 | * //=> ['ae', 'st', 'iou']
|
20902 | */
|
20903 | var groupWith = _curry2(function(fn, list) {
|
20904 | var res = [];
|
20905 | var idx = 0;
|
20906 | var len = list.length;
|
20907 | while (idx < len) {
|
20908 | var nextidx = idx + 1;
|
20909 | while (nextidx < len && fn(list[idx], list[nextidx])) {
|
20910 | nextidx += 1;
|
20911 | }
|
20912 | res.push(list.slice(idx, nextidx));
|
20913 | idx = nextidx;
|
20914 | }
|
20915 | return res;
|
20916 | });
|
20917 |
|
20918 | /**
|
20919 | * Returns `true` if the first argument is greater than the second; `false`
|
20920 | * otherwise.
|
20921 | *
|
20922 | * @func
|
20923 | * @memberOf R
|
20924 | * @since v0.1.0
|
20925 | * @category Relation
|
20926 | * @sig Ord a => a -> a -> Boolean
|
20927 | * @param {*} a
|
20928 | * @param {*} b
|
20929 | * @return {Boolean}
|
20930 | * @see R.lt
|
20931 | * @example
|
20932 | *
|
20933 | * R.gt(2, 1); //=> true
|
20934 | * R.gt(2, 2); //=> false
|
20935 | * R.gt(2, 3); //=> false
|
20936 | * R.gt('a', 'z'); //=> false
|
20937 | * R.gt('z', 'a'); //=> true
|
20938 | */
|
20939 | var gt = _curry2(function gt(a, b) { return a > b; });
|
20940 |
|
20941 | /**
|
20942 | * Returns `true` if the first argument is greater than or equal to the second;
|
20943 | * `false` otherwise.
|
20944 | *
|
20945 | * @func
|
20946 | * @memberOf R
|
20947 | * @since v0.1.0
|
20948 | * @category Relation
|
20949 | * @sig Ord a => a -> a -> Boolean
|
20950 | * @param {Number} a
|
20951 | * @param {Number} b
|
20952 | * @return {Boolean}
|
20953 | * @see R.lte
|
20954 | * @example
|
20955 | *
|
20956 | * R.gte(2, 1); //=> true
|
20957 | * R.gte(2, 2); //=> true
|
20958 | * R.gte(2, 3); //=> false
|
20959 | * R.gte('a', 'z'); //=> false
|
20960 | * R.gte('z', 'a'); //=> true
|
20961 | */
|
20962 | var gte = _curry2(function gte(a, b) { return a >= b; });
|
20963 |
|
20964 | /**
|
20965 | * Returns whether or not an object has an own property with the specified name
|
20966 | *
|
20967 | * @func
|
20968 | * @memberOf R
|
20969 | * @since v0.7.0
|
20970 | * @category Object
|
20971 | * @sig s -> {s: x} -> Boolean
|
20972 | * @param {String} prop The name of the property to check for.
|
20973 | * @param {Object} obj The object to query.
|
20974 | * @return {Boolean} Whether the property exists.
|
20975 | * @example
|
20976 | *
|
20977 | * var hasName = R.has('name');
|
20978 | * hasName({name: 'alice'}); //=> true
|
20979 | * hasName({name: 'bob'}); //=> true
|
20980 | * hasName({}); //=> false
|
20981 | *
|
20982 | * var point = {x: 0, y: 0};
|
20983 | * var pointHas = R.has(R.__, point);
|
20984 | * pointHas('x'); //=> true
|
20985 | * pointHas('y'); //=> true
|
20986 | * pointHas('z'); //=> false
|
20987 | */
|
20988 | var has = _curry2(_has);
|
20989 |
|
20990 | /**
|
20991 | * Returns whether or not an object or its prototype chain has a property with
|
20992 | * the specified name
|
20993 | *
|
20994 | * @func
|
20995 | * @memberOf R
|
20996 | * @since v0.7.0
|
20997 | * @category Object
|
20998 | * @sig s -> {s: x} -> Boolean
|
20999 | * @param {String} prop The name of the property to check for.
|
21000 | * @param {Object} obj The object to query.
|
21001 | * @return {Boolean} Whether the property exists.
|
21002 | * @example
|
21003 | *
|
21004 | * function Rectangle(width, height) {
|
21005 | * this.width = width;
|
21006 | * this.height = height;
|
21007 | * }
|
21008 | * Rectangle.prototype.area = function() {
|
21009 | * return this.width * this.height;
|
21010 | * };
|
21011 | *
|
21012 | * var square = new Rectangle(2, 2);
|
21013 | * R.hasIn('width', square); //=> true
|
21014 | * R.hasIn('area', square); //=> true
|
21015 | */
|
21016 | var hasIn = _curry2(function hasIn(prop, obj) {
|
21017 | return prop in obj;
|
21018 | });
|
21019 |
|
21020 | /**
|
21021 | * Returns the first element of the given list or string. In some libraries
|
21022 | * this function is named `first`.
|
21023 | *
|
21024 | * @func
|
21025 | * @memberOf R
|
21026 | * @since v0.1.0
|
21027 | * @category List
|
21028 | * @sig [a] -> a | Undefined
|
21029 | * @sig String -> String
|
21030 | * @param {Array|String} list
|
21031 | * @return {*}
|
21032 | * @see R.tail, R.init, R.last
|
21033 | * @example
|
21034 | *
|
21035 | * R.head(['fi', 'fo', 'fum']); //=> 'fi'
|
21036 | * R.head([]); //=> undefined
|
21037 | *
|
21038 | * R.head('abc'); //=> 'a'
|
21039 | * R.head(''); //=> ''
|
21040 | */
|
21041 | var head = nth(0);
|
21042 |
|
21043 | var _identity = function _identity(x) { return x; };
|
21044 |
|
21045 | /**
|
21046 | * A function that does nothing but return the parameter supplied to it. Good
|
21047 | * as a default or placeholder function.
|
21048 | *
|
21049 | * @func
|
21050 | * @memberOf R
|
21051 | * @since v0.1.0
|
21052 | * @category Function
|
21053 | * @sig a -> a
|
21054 | * @param {*} x The value to return.
|
21055 | * @return {*} The input value, `x`.
|
21056 | * @example
|
21057 | *
|
21058 | * R.identity(1); //=> 1
|
21059 | *
|
21060 | * var obj = {};
|
21061 | * R.identity(obj) === obj; //=> true
|
21062 | * @symb R.identity(a) = a
|
21063 | */
|
21064 | var identity$1 = _curry1(_identity);
|
21065 |
|
21066 | /**
|
21067 | * Creates a function that will process either the `onTrue` or the `onFalse`
|
21068 | * function depending upon the result of the `condition` predicate.
|
21069 | *
|
21070 | * @func
|
21071 | * @memberOf R
|
21072 | * @since v0.8.0
|
21073 | * @category Logic
|
21074 | * @sig (*... -> Boolean) -> (*... -> *) -> (*... -> *) -> (*... -> *)
|
21075 | * @param {Function} condition A predicate function
|
21076 | * @param {Function} onTrue A function to invoke when the `condition` evaluates to a truthy value.
|
21077 | * @param {Function} onFalse A function to invoke when the `condition` evaluates to a falsy value.
|
21078 | * @return {Function} A new unary function that will process either the `onTrue` or the `onFalse`
|
21079 | * function depending upon the result of the `condition` predicate.
|
21080 | * @see R.unless, R.when
|
21081 | * @example
|
21082 | *
|
21083 | * var incCount = R.ifElse(
|
21084 | * R.has('count'),
|
21085 | * R.over(R.lensProp('count'), R.inc),
|
21086 | * R.assoc('count', 1)
|
21087 | * );
|
21088 | * incCount({}); //=> { count: 1 }
|
21089 | * incCount({ count: 1 }); //=> { count: 2 }
|
21090 | */
|
21091 | var ifElse = _curry3(function ifElse(condition, onTrue, onFalse) {
|
21092 | return curryN(Math.max(condition.length, onTrue.length, onFalse.length),
|
21093 | function _ifElse() {
|
21094 | return condition.apply(this, arguments) ? onTrue.apply(this, arguments) : onFalse.apply(this, arguments);
|
21095 | }
|
21096 | );
|
21097 | });
|
21098 |
|
21099 | /**
|
21100 | * Increments its argument.
|
21101 | *
|
21102 | * @func
|
21103 | * @memberOf R
|
21104 | * @since v0.9.0
|
21105 | * @category Math
|
21106 | * @sig Number -> Number
|
21107 | * @param {Number} n
|
21108 | * @return {Number} n + 1
|
21109 | * @see R.dec
|
21110 | * @example
|
21111 | *
|
21112 | * R.inc(42); //=> 43
|
21113 | */
|
21114 | var inc = add(1);
|
21115 |
|
21116 | /**
|
21117 | * Given a function that generates a key, turns a list of objects into an
|
21118 | * object indexing the objects by the given key. Note that if multiple
|
21119 | * objects generate the same value for the indexing key only the last value
|
21120 | * will be included in the generated object.
|
21121 | *
|
21122 | * Acts as a transducer if a transformer is given in list position.
|
21123 | *
|
21124 | * @func
|
21125 | * @memberOf R
|
21126 | * @since v0.19.0
|
21127 | * @category List
|
21128 | * @sig (a -> String) -> [{k: v}] -> {k: {k: v}}
|
21129 | * @param {Function} fn Function :: a -> String
|
21130 | * @param {Array} array The array of objects to index
|
21131 | * @return {Object} An object indexing each array element by the given property.
|
21132 | * @example
|
21133 | *
|
21134 | * var list = [{id: 'xyz', title: 'A'}, {id: 'abc', title: 'B'}];
|
21135 | * R.indexBy(R.prop('id'), list);
|
21136 | * //=> {abc: {id: 'abc', title: 'B'}, xyz: {id: 'xyz', title: 'A'}}
|
21137 | */
|
21138 | var indexBy = reduceBy(function(acc, elem) { return elem; }, null);
|
21139 |
|
21140 | /**
|
21141 | * Returns the position of the first occurrence of an item in an array, or -1
|
21142 | * if the item is not included in the array. `R.equals` is used to determine
|
21143 | * equality.
|
21144 | *
|
21145 | * @func
|
21146 | * @memberOf R
|
21147 | * @since v0.1.0
|
21148 | * @category List
|
21149 | * @sig a -> [a] -> Number
|
21150 | * @param {*} target The item to find.
|
21151 | * @param {Array} xs The array to search in.
|
21152 | * @return {Number} the index of the target, or -1 if the target is not found.
|
21153 | * @see R.lastIndexOf
|
21154 | * @example
|
21155 | *
|
21156 | * R.indexOf(3, [1,2,3,4]); //=> 2
|
21157 | * R.indexOf(10, [1,2,3,4]); //=> -1
|
21158 | */
|
21159 | var indexOf = _curry2(function indexOf(target, xs) {
|
21160 | return typeof xs.indexOf === 'function' && !_isArray(xs) ?
|
21161 | xs.indexOf(target) :
|
21162 | _indexOf(xs, target, 0);
|
21163 | });
|
21164 |
|
21165 | /**
|
21166 | * Returns all but the last element of the given list or string.
|
21167 | *
|
21168 | * @func
|
21169 | * @memberOf R
|
21170 | * @since v0.9.0
|
21171 | * @category List
|
21172 | * @sig [a] -> [a]
|
21173 | * @sig String -> String
|
21174 | * @param {*} list
|
21175 | * @return {*}
|
21176 | * @see R.last, R.head, R.tail
|
21177 | * @example
|
21178 | *
|
21179 | * R.init([1, 2, 3]); //=> [1, 2]
|
21180 | * R.init([1, 2]); //=> [1]
|
21181 | * R.init([1]); //=> []
|
21182 | * R.init([]); //=> []
|
21183 | *
|
21184 | * R.init('abc'); //=> 'ab'
|
21185 | * R.init('ab'); //=> 'a'
|
21186 | * R.init('a'); //=> ''
|
21187 | * R.init(''); //=> ''
|
21188 | */
|
21189 | var init = slice(0, -1);
|
21190 |
|
21191 | /**
|
21192 | * Inserts the supplied element into the list, at index `index`. _Note that
|
21193 | * this is not destructive_: it returns a copy of the list with the changes.
|
21194 | * <small>No lists have been harmed in the application of this function.</small>
|
21195 | *
|
21196 | * @func
|
21197 | * @memberOf R
|
21198 | * @since v0.2.2
|
21199 | * @category List
|
21200 | * @sig Number -> a -> [a] -> [a]
|
21201 | * @param {Number} index The position to insert the element
|
21202 | * @param {*} elt The element to insert into the Array
|
21203 | * @param {Array} list The list to insert into
|
21204 | * @return {Array} A new Array with `elt` inserted at `index`.
|
21205 | * @example
|
21206 | *
|
21207 | * R.insert(2, 'x', [1,2,3,4]); //=> [1,2,'x',3,4]
|
21208 | */
|
21209 | var insert = _curry3(function insert(idx, elt, list) {
|
21210 | idx = idx < list.length && idx >= 0 ? idx : list.length;
|
21211 | var result = Array.prototype.slice.call(list, 0);
|
21212 | result.splice(idx, 0, elt);
|
21213 | return result;
|
21214 | });
|
21215 |
|
21216 | /**
|
21217 | * Inserts the sub-list into the list, at index `index`. _Note that this is not
|
21218 | * destructive_: it returns a copy of the list with the changes.
|
21219 | * <small>No lists have been harmed in the application of this function.</small>
|
21220 | *
|
21221 | * @func
|
21222 | * @memberOf R
|
21223 | * @since v0.9.0
|
21224 | * @category List
|
21225 | * @sig Number -> [a] -> [a] -> [a]
|
21226 | * @param {Number} index The position to insert the sub-list
|
21227 | * @param {Array} elts The sub-list to insert into the Array
|
21228 | * @param {Array} list The list to insert the sub-list into
|
21229 | * @return {Array} A new Array with `elts` inserted starting at `index`.
|
21230 | * @example
|
21231 | *
|
21232 | * R.insertAll(2, ['x','y','z'], [1,2,3,4]); //=> [1,2,'x','y','z',3,4]
|
21233 | */
|
21234 | var insertAll = _curry3(function insertAll(idx, elts, list) {
|
21235 | idx = idx < list.length && idx >= 0 ? idx : list.length;
|
21236 | return [].concat(Array.prototype.slice.call(list, 0, idx),
|
21237 | elts,
|
21238 | Array.prototype.slice.call(list, idx));
|
21239 | });
|
21240 |
|
21241 | // A simple Set type that honours R.equals semantics
|
21242 | var _Set = (function() {
|
21243 | function _Set() {
|
21244 | /* globals Set */
|
21245 | this._nativeSet = typeof Set === 'function' ? new Set() : null;
|
21246 | this._items = {};
|
21247 | }
|
21248 |
|
21249 | // until we figure out why jsdoc chokes on this
|
21250 | // @param item The item to add to the Set
|
21251 | // @returns {boolean} true if the item did not exist prior, otherwise false
|
21252 | //
|
21253 | _Set.prototype.add = function(item) {
|
21254 | return !hasOrAdd(item, true, this);
|
21255 | };
|
21256 |
|
21257 | //
|
21258 | // @param item The item to check for existence in the Set
|
21259 | // @returns {boolean} true if the item exists in the Set, otherwise false
|
21260 | //
|
21261 | _Set.prototype.has = function(item) {
|
21262 | return hasOrAdd(item, false, this);
|
21263 | };
|
21264 |
|
21265 | //
|
21266 | // Combines the logic for checking whether an item is a member of the set and
|
21267 | // for adding a new item to the set.
|
21268 | //
|
21269 | // @param item The item to check or add to the Set instance.
|
21270 | // @param shouldAdd If true, the item will be added to the set if it doesn't
|
21271 | // already exist.
|
21272 | // @param set The set instance to check or add to.
|
21273 | // @return {boolean} true if the item already existed, otherwise false.
|
21274 | //
|
21275 | function hasOrAdd(item, shouldAdd, set) {
|
21276 | var type = typeof item;
|
21277 | var prevSize, newSize;
|
21278 | switch (type) {
|
21279 | case 'string':
|
21280 | case 'number':
|
21281 | // distinguish between +0 and -0
|
21282 | if (item === 0 && 1 / item === -Infinity) {
|
21283 | if (set._items['-0']) {
|
21284 | return true;
|
21285 | } else {
|
21286 | if (shouldAdd) {
|
21287 | set._items['-0'] = true;
|
21288 | }
|
21289 | return false;
|
21290 | }
|
21291 | }
|
21292 | // these types can all utilise the native Set
|
21293 | if (set._nativeSet !== null) {
|
21294 | if (shouldAdd) {
|
21295 | prevSize = set._nativeSet.size;
|
21296 | set._nativeSet.add(item);
|
21297 | newSize = set._nativeSet.size;
|
21298 | return newSize === prevSize;
|
21299 | } else {
|
21300 | return set._nativeSet.has(item);
|
21301 | }
|
21302 | } else {
|
21303 | if (!(type in set._items)) {
|
21304 | if (shouldAdd) {
|
21305 | set._items[type] = {};
|
21306 | set._items[type][item] = true;
|
21307 | }
|
21308 | return false;
|
21309 | } else if (item in set._items[type]) {
|
21310 | return true;
|
21311 | } else {
|
21312 | if (shouldAdd) {
|
21313 | set._items[type][item] = true;
|
21314 | }
|
21315 | return false;
|
21316 | }
|
21317 | }
|
21318 |
|
21319 | case 'boolean':
|
21320 | // set._items['boolean'] holds a two element array
|
21321 | // representing [ falseExists, trueExists ]
|
21322 | if (type in set._items) {
|
21323 | var bIdx = item ? 1 : 0;
|
21324 | if (set._items[type][bIdx]) {
|
21325 | return true;
|
21326 | } else {
|
21327 | if (shouldAdd) {
|
21328 | set._items[type][bIdx] = true;
|
21329 | }
|
21330 | return false;
|
21331 | }
|
21332 | } else {
|
21333 | if (shouldAdd) {
|
21334 | set._items[type] = item ? [false, true] : [true, false];
|
21335 | }
|
21336 | return false;
|
21337 | }
|
21338 |
|
21339 | case 'function':
|
21340 | // compare functions for reference equality
|
21341 | if (set._nativeSet !== null) {
|
21342 | if (shouldAdd) {
|
21343 | prevSize = set._nativeSet.size;
|
21344 | set._nativeSet.add(item);
|
21345 | newSize = set._nativeSet.size;
|
21346 | return newSize === prevSize;
|
21347 | } else {
|
21348 | return set._nativeSet.has(item);
|
21349 | }
|
21350 | } else {
|
21351 | if (!(type in set._items)) {
|
21352 | if (shouldAdd) {
|
21353 | set._items[type] = [item];
|
21354 | }
|
21355 | return false;
|
21356 | }
|
21357 | if (!_contains(item, set._items[type])) {
|
21358 | if (shouldAdd) {
|
21359 | set._items[type].push(item);
|
21360 | }
|
21361 | return false;
|
21362 | }
|
21363 | return true;
|
21364 | }
|
21365 |
|
21366 | case 'undefined':
|
21367 | if (set._items[type]) {
|
21368 | return true;
|
21369 | } else {
|
21370 | if (shouldAdd) {
|
21371 | set._items[type] = true;
|
21372 | }
|
21373 | return false;
|
21374 | }
|
21375 |
|
21376 | case 'object':
|
21377 | if (item === null) {
|
21378 | if (!set._items['null']) {
|
21379 | if (shouldAdd) {
|
21380 | set._items['null'] = true;
|
21381 | }
|
21382 | return false;
|
21383 | }
|
21384 | return true;
|
21385 | }
|
21386 | /* falls through */
|
21387 | default:
|
21388 | // reduce the search size of heterogeneous sets by creating buckets
|
21389 | // for each type.
|
21390 | type = Object.prototype.toString.call(item);
|
21391 | if (!(type in set._items)) {
|
21392 | if (shouldAdd) {
|
21393 | set._items[type] = [item];
|
21394 | }
|
21395 | return false;
|
21396 | }
|
21397 | // scan through all previously applied items
|
21398 | if (!_contains(item, set._items[type])) {
|
21399 | if (shouldAdd) {
|
21400 | set._items[type].push(item);
|
21401 | }
|
21402 | return false;
|
21403 | }
|
21404 | return true;
|
21405 | }
|
21406 | }
|
21407 | return _Set;
|
21408 | }());
|
21409 |
|
21410 | /**
|
21411 | * Returns a new list containing only one copy of each element in the original
|
21412 | * list, based upon the value returned by applying the supplied function to
|
21413 | * each list element. Prefers the first item if the supplied function produces
|
21414 | * the same value on two items. `R.equals` is used for comparison.
|
21415 | *
|
21416 | * @func
|
21417 | * @memberOf R
|
21418 | * @since v0.16.0
|
21419 | * @category List
|
21420 | * @sig (a -> b) -> [a] -> [a]
|
21421 | * @param {Function} fn A function used to produce a value to use during comparisons.
|
21422 | * @param {Array} list The array to consider.
|
21423 | * @return {Array} The list of unique items.
|
21424 | * @example
|
21425 | *
|
21426 | * R.uniqBy(Math.abs, [-1, -5, 2, 10, 1, 2]); //=> [-1, -5, 2, 10]
|
21427 | */
|
21428 | var uniqBy = _curry2(function uniqBy(fn, list) {
|
21429 | var set = new _Set();
|
21430 | var result = [];
|
21431 | var idx = 0;
|
21432 | var appliedItem, item;
|
21433 |
|
21434 | while (idx < list.length) {
|
21435 | item = list[idx];
|
21436 | appliedItem = fn(item);
|
21437 | if (set.add(appliedItem)) {
|
21438 | result.push(item);
|
21439 | }
|
21440 | idx += 1;
|
21441 | }
|
21442 | return result;
|
21443 | });
|
21444 |
|
21445 | /**
|
21446 | * Returns a new list containing only one copy of each element in the original
|
21447 | * list. `R.equals` is used to determine equality.
|
21448 | *
|
21449 | * @func
|
21450 | * @memberOf R
|
21451 | * @since v0.1.0
|
21452 | * @category List
|
21453 | * @sig [a] -> [a]
|
21454 | * @param {Array} list The array to consider.
|
21455 | * @return {Array} The list of unique items.
|
21456 | * @example
|
21457 | *
|
21458 | * R.uniq([1, 1, 2, 1]); //=> [1, 2]
|
21459 | * R.uniq([1, '1']); //=> [1, '1']
|
21460 | * R.uniq([[42], [42]]); //=> [[42]]
|
21461 | */
|
21462 | var uniq = uniqBy(identity$1);
|
21463 |
|
21464 | /**
|
21465 | * Combines two lists into a set (i.e. no duplicates) composed of those
|
21466 | * elements common to both lists.
|
21467 | *
|
21468 | * @func
|
21469 | * @memberOf R
|
21470 | * @since v0.1.0
|
21471 | * @category Relation
|
21472 | * @sig [*] -> [*] -> [*]
|
21473 | * @param {Array} list1 The first list.
|
21474 | * @param {Array} list2 The second list.
|
21475 | * @return {Array} The list of elements found in both `list1` and `list2`.
|
21476 | * @see R.intersectionWith
|
21477 | * @example
|
21478 | *
|
21479 | * R.intersection([1,2,3,4], [7,6,5,4,3]); //=> [4, 3]
|
21480 | */
|
21481 | var intersection = _curry2(function intersection(list1, list2) {
|
21482 | var lookupList, filteredList;
|
21483 | if (list1.length > list2.length) {
|
21484 | lookupList = list1;
|
21485 | filteredList = list2;
|
21486 | } else {
|
21487 | lookupList = list2;
|
21488 | filteredList = list1;
|
21489 | }
|
21490 | return uniq(_filter(flip(_contains)(lookupList), filteredList));
|
21491 | });
|
21492 |
|
21493 | /**
|
21494 | * Returns a new list containing only one copy of each element in the original
|
21495 | * list, based upon the value returned by applying the supplied predicate to
|
21496 | * two list elements. Prefers the first item if two items compare equal based
|
21497 | * on the predicate.
|
21498 | *
|
21499 | * @func
|
21500 | * @memberOf R
|
21501 | * @since v0.2.0
|
21502 | * @category List
|
21503 | * @sig (a, a -> Boolean) -> [a] -> [a]
|
21504 | * @param {Function} pred A predicate used to test whether two items are equal.
|
21505 | * @param {Array} list The array to consider.
|
21506 | * @return {Array} The list of unique items.
|
21507 | * @example
|
21508 | *
|
21509 | * var strEq = R.eqBy(String);
|
21510 | * R.uniqWith(strEq)([1, '1', 2, 1]); //=> [1, 2]
|
21511 | * R.uniqWith(strEq)([{}, {}]); //=> [{}]
|
21512 | * R.uniqWith(strEq)([1, '1', 1]); //=> [1]
|
21513 | * R.uniqWith(strEq)(['1', 1, 1]); //=> ['1']
|
21514 | */
|
21515 | var uniqWith = _curry2(function uniqWith(pred, list) {
|
21516 | var idx = 0;
|
21517 | var len = list.length;
|
21518 | var result = [];
|
21519 | var item;
|
21520 | while (idx < len) {
|
21521 | item = list[idx];
|
21522 | if (!_containsWith(pred, item, result)) {
|
21523 | result[result.length] = item;
|
21524 | }
|
21525 | idx += 1;
|
21526 | }
|
21527 | return result;
|
21528 | });
|
21529 |
|
21530 | /**
|
21531 | * Combines two lists into a set (i.e. no duplicates) composed of those
|
21532 | * elements common to both lists. Duplication is determined according to the
|
21533 | * value returned by applying the supplied predicate to two list elements.
|
21534 | *
|
21535 | * @func
|
21536 | * @memberOf R
|
21537 | * @since v0.1.0
|
21538 | * @category Relation
|
21539 | * @sig ((a, a) -> Boolean) -> [a] -> [a] -> [a]
|
21540 | * @param {Function} pred A predicate function that determines whether
|
21541 | * the two supplied elements are equal.
|
21542 | * @param {Array} list1 One list of items to compare
|
21543 | * @param {Array} list2 A second list of items to compare
|
21544 | * @return {Array} A new list containing those elements common to both lists.
|
21545 | * @see R.intersection
|
21546 | * @example
|
21547 | *
|
21548 | * var buffaloSpringfield = [
|
21549 | * {id: 824, name: 'Richie Furay'},
|
21550 | * {id: 956, name: 'Dewey Martin'},
|
21551 | * {id: 313, name: 'Bruce Palmer'},
|
21552 | * {id: 456, name: 'Stephen Stills'},
|
21553 | * {id: 177, name: 'Neil Young'}
|
21554 | * ];
|
21555 | * var csny = [
|
21556 | * {id: 204, name: 'David Crosby'},
|
21557 | * {id: 456, name: 'Stephen Stills'},
|
21558 | * {id: 539, name: 'Graham Nash'},
|
21559 | * {id: 177, name: 'Neil Young'}
|
21560 | * ];
|
21561 | *
|
21562 | * R.intersectionWith(R.eqBy(R.prop('id')), buffaloSpringfield, csny);
|
21563 | * //=> [{id: 456, name: 'Stephen Stills'}, {id: 177, name: 'Neil Young'}]
|
21564 | */
|
21565 | var intersectionWith = _curry3(function intersectionWith(pred, list1, list2) {
|
21566 | var lookupList, filteredList;
|
21567 | if (list1.length > list2.length) {
|
21568 | lookupList = list1;
|
21569 | filteredList = list2;
|
21570 | } else {
|
21571 | lookupList = list2;
|
21572 | filteredList = list1;
|
21573 | }
|
21574 | var results = [];
|
21575 | var idx = 0;
|
21576 | while (idx < filteredList.length) {
|
21577 | if (_containsWith(pred, filteredList[idx], lookupList)) {
|
21578 | results[results.length] = filteredList[idx];
|
21579 | }
|
21580 | idx += 1;
|
21581 | }
|
21582 | return uniqWith(pred, results);
|
21583 | });
|
21584 |
|
21585 | /**
|
21586 | * Creates a new list with the separator interposed between elements.
|
21587 | *
|
21588 | * Dispatches to the `intersperse` method of the second argument, if present.
|
21589 | *
|
21590 | * @func
|
21591 | * @memberOf R
|
21592 | * @since v0.14.0
|
21593 | * @category List
|
21594 | * @sig a -> [a] -> [a]
|
21595 | * @param {*} separator The element to add to the list.
|
21596 | * @param {Array} list The list to be interposed.
|
21597 | * @return {Array} The new list.
|
21598 | * @example
|
21599 | *
|
21600 | * R.intersperse('n', ['ba', 'a', 'a']); //=> ['ba', 'n', 'a', 'n', 'a']
|
21601 | */
|
21602 | var intersperse = _curry2(_checkForMethod('intersperse', function intersperse(separator, list) {
|
21603 | var out = [];
|
21604 | var idx = 0;
|
21605 | var length = list.length;
|
21606 | while (idx < length) {
|
21607 | if (idx === length - 1) {
|
21608 | out.push(list[idx]);
|
21609 | } else {
|
21610 | out.push(list[idx], separator);
|
21611 | }
|
21612 | idx += 1;
|
21613 | }
|
21614 | return out;
|
21615 | }));
|
21616 |
|
21617 | // Based on https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
|
21618 | var _objectAssign = function _objectAssign(target) {
|
21619 | if (target == null) {
|
21620 | throw new TypeError('Cannot convert undefined or null to object');
|
21621 | }
|
21622 |
|
21623 | var output = Object(target);
|
21624 | var idx = 1;
|
21625 | var length = arguments.length;
|
21626 | while (idx < length) {
|
21627 | var source = arguments[idx];
|
21628 | if (source != null) {
|
21629 | for (var nextKey in source) {
|
21630 | if (_has(nextKey, source)) {
|
21631 | output[nextKey] = source[nextKey];
|
21632 | }
|
21633 | }
|
21634 | }
|
21635 | idx += 1;
|
21636 | }
|
21637 | return output;
|
21638 | };
|
21639 |
|
21640 | var _assign$1 =
|
21641 | typeof Object.assign === 'function' ? Object.assign : _objectAssign;
|
21642 |
|
21643 | /**
|
21644 | * Creates an object containing a single key:value pair.
|
21645 | *
|
21646 | * @func
|
21647 | * @memberOf R
|
21648 | * @since v0.18.0
|
21649 | * @category Object
|
21650 | * @sig String -> a -> {String:a}
|
21651 | * @param {String} key
|
21652 | * @param {*} val
|
21653 | * @return {Object}
|
21654 | * @see R.pair
|
21655 | * @example
|
21656 | *
|
21657 | * var matchPhrases = R.compose(
|
21658 | * R.objOf('must'),
|
21659 | * R.map(R.objOf('match_phrase'))
|
21660 | * );
|
21661 | * matchPhrases(['foo', 'bar', 'baz']); //=> {must: [{match_phrase: 'foo'}, {match_phrase: 'bar'}, {match_phrase: 'baz'}]}
|
21662 | */
|
21663 | var objOf = _curry2(function objOf(key, val) {
|
21664 | var obj = {};
|
21665 | obj[key] = val;
|
21666 | return obj;
|
21667 | });
|
21668 |
|
21669 | var _stepCat = (function() {
|
21670 | var _stepCatArray = {
|
21671 | '@@transducer/init': Array,
|
21672 | '@@transducer/step': function(xs, x) {
|
21673 | xs.push(x);
|
21674 | return xs;
|
21675 | },
|
21676 | '@@transducer/result': _identity
|
21677 | };
|
21678 | var _stepCatString = {
|
21679 | '@@transducer/init': String,
|
21680 | '@@transducer/step': function(a, b) { return a + b; },
|
21681 | '@@transducer/result': _identity
|
21682 | };
|
21683 | var _stepCatObject = {
|
21684 | '@@transducer/init': Object,
|
21685 | '@@transducer/step': function(result, input) {
|
21686 | return _assign$1(
|
21687 | result,
|
21688 | isArrayLike(input) ? objOf(input[0], input[1]) : input
|
21689 | );
|
21690 | },
|
21691 | '@@transducer/result': _identity
|
21692 | };
|
21693 |
|
21694 | return function _stepCat(obj) {
|
21695 | if (_isTransformer(obj)) {
|
21696 | return obj;
|
21697 | }
|
21698 | if (isArrayLike(obj)) {
|
21699 | return _stepCatArray;
|
21700 | }
|
21701 | if (typeof obj === 'string') {
|
21702 | return _stepCatString;
|
21703 | }
|
21704 | if (typeof obj === 'object') {
|
21705 | return _stepCatObject;
|
21706 | }
|
21707 | throw new Error('Cannot create transformer for ' + obj);
|
21708 | };
|
21709 | }());
|
21710 |
|
21711 | /**
|
21712 | * Transforms the items of the list with the transducer and appends the
|
21713 | * transformed items to the accumulator using an appropriate iterator function
|
21714 | * based on the accumulator type.
|
21715 | *
|
21716 | * The accumulator can be an array, string, object or a transformer. Iterated
|
21717 | * items will be appended to arrays and concatenated to strings. Objects will
|
21718 | * be merged directly or 2-item arrays will be merged as key, value pairs.
|
21719 | *
|
21720 | * The accumulator can also be a transformer object that provides a 2-arity
|
21721 | * reducing iterator function, step, 0-arity initial value function, init, and
|
21722 | * 1-arity result extraction function result. The step function is used as the
|
21723 | * iterator function in reduce. The result function is used to convert the
|
21724 | * final accumulator into the return type and in most cases is R.identity. The
|
21725 | * init function is used to provide the initial accumulator.
|
21726 | *
|
21727 | * The iteration is performed with R.reduce after initializing the transducer.
|
21728 | *
|
21729 | * @func
|
21730 | * @memberOf R
|
21731 | * @since v0.12.0
|
21732 | * @category List
|
21733 | * @sig a -> (b -> b) -> [c] -> a
|
21734 | * @param {*} acc The initial accumulator value.
|
21735 | * @param {Function} xf The transducer function. Receives a transformer and returns a transformer.
|
21736 | * @param {Array} list The list to iterate over.
|
21737 | * @return {*} The final, accumulated value.
|
21738 | * @example
|
21739 | *
|
21740 | * var numbers = [1, 2, 3, 4];
|
21741 | * var transducer = R.compose(R.map(R.add(1)), R.take(2));
|
21742 | *
|
21743 | * R.into([], transducer, numbers); //=> [2, 3]
|
21744 | *
|
21745 | * var intoArray = R.into([]);
|
21746 | * intoArray(transducer, numbers); //=> [2, 3]
|
21747 | */
|
21748 | var into = _curry3(function into(acc, xf, list) {
|
21749 | return _isTransformer(acc) ?
|
21750 | _reduce(xf(acc), acc['@@transducer/init'](), list) :
|
21751 | _reduce(xf(_stepCat(acc)), _clone(acc, [], [], false), list);
|
21752 | });
|
21753 |
|
21754 | /**
|
21755 | * Same as R.invertObj, however this accounts for objects with duplicate values
|
21756 | * by putting the values into an array.
|
21757 | *
|
21758 | * @func
|
21759 | * @memberOf R
|
21760 | * @since v0.9.0
|
21761 | * @category Object
|
21762 | * @sig {s: x} -> {x: [ s, ... ]}
|
21763 | * @param {Object} obj The object or array to invert
|
21764 | * @return {Object} out A new object with keys
|
21765 | * in an array.
|
21766 | * @example
|
21767 | *
|
21768 | * var raceResultsByFirstName = {
|
21769 | * first: 'alice',
|
21770 | * second: 'jake',
|
21771 | * third: 'alice',
|
21772 | * };
|
21773 | * R.invert(raceResultsByFirstName);
|
21774 | * //=> { 'alice': ['first', 'third'], 'jake':['second'] }
|
21775 | */
|
21776 | var invert = _curry1(function invert(obj) {
|
21777 | var props = keys(obj);
|
21778 | var len = props.length;
|
21779 | var idx = 0;
|
21780 | var out = {};
|
21781 |
|
21782 | while (idx < len) {
|
21783 | var key = props[idx];
|
21784 | var val = obj[key];
|
21785 | var list = _has(val, out) ? out[val] : (out[val] = []);
|
21786 | list[list.length] = key;
|
21787 | idx += 1;
|
21788 | }
|
21789 | return out;
|
21790 | });
|
21791 |
|
21792 | /**
|
21793 | * Returns a new object with the keys of the given object as values, and the
|
21794 | * values of the given object, which are coerced to strings, as keys. Note
|
21795 | * that the last key found is preferred when handling the same value.
|
21796 | *
|
21797 | * @func
|
21798 | * @memberOf R
|
21799 | * @since v0.9.0
|
21800 | * @category Object
|
21801 | * @sig {s: x} -> {x: s}
|
21802 | * @param {Object} obj The object or array to invert
|
21803 | * @return {Object} out A new object
|
21804 | * @example
|
21805 | *
|
21806 | * var raceResults = {
|
21807 | * first: 'alice',
|
21808 | * second: 'jake'
|
21809 | * };
|
21810 | * R.invertObj(raceResults);
|
21811 | * //=> { 'alice': 'first', 'jake':'second' }
|
21812 | *
|
21813 | * // Alternatively:
|
21814 | * var raceResults = ['alice', 'jake'];
|
21815 | * R.invertObj(raceResults);
|
21816 | * //=> { 'alice': '0', 'jake':'1' }
|
21817 | */
|
21818 | var invertObj = _curry1(function invertObj(obj) {
|
21819 | var props = keys(obj);
|
21820 | var len = props.length;
|
21821 | var idx = 0;
|
21822 | var out = {};
|
21823 |
|
21824 | while (idx < len) {
|
21825 | var key = props[idx];
|
21826 | out[obj[key]] = key;
|
21827 | idx += 1;
|
21828 | }
|
21829 | return out;
|
21830 | });
|
21831 |
|
21832 | /**
|
21833 | * Turns a named method with a specified arity into a function that can be
|
21834 | * called directly supplied with arguments and a target object.
|
21835 | *
|
21836 | * The returned function is curried and accepts `arity + 1` parameters where
|
21837 | * the final parameter is the target object.
|
21838 | *
|
21839 | * @func
|
21840 | * @memberOf R
|
21841 | * @since v0.1.0
|
21842 | * @category Function
|
21843 | * @sig Number -> String -> (a -> b -> ... -> n -> Object -> *)
|
21844 | * @param {Number} arity Number of arguments the returned function should take
|
21845 | * before the target object.
|
21846 | * @param {String} method Name of the method to call.
|
21847 | * @return {Function} A new curried function.
|
21848 | * @example
|
21849 | *
|
21850 | * var sliceFrom = R.invoker(1, 'slice');
|
21851 | * sliceFrom(6, 'abcdefghijklm'); //=> 'ghijklm'
|
21852 | * var sliceFrom6 = R.invoker(2, 'slice')(6);
|
21853 | * sliceFrom6(8, 'abcdefghijklm'); //=> 'gh'
|
21854 | * @symb R.invoker(0, 'method')(o) = o['method']()
|
21855 | * @symb R.invoker(1, 'method')(a, o) = o['method'](a)
|
21856 | * @symb R.invoker(2, 'method')(a, b, o) = o['method'](a, b)
|
21857 | */
|
21858 | var invoker = _curry2(function invoker(arity, method) {
|
21859 | return curryN(arity + 1, function() {
|
21860 | var target = arguments[arity];
|
21861 | if (target != null && _isFunction(target[method])) {
|
21862 | return target[method].apply(target, Array.prototype.slice.call(arguments, 0, arity));
|
21863 | }
|
21864 | throw new TypeError(toString_1(target) + ' does not have a method named "' + method + '"');
|
21865 | });
|
21866 | });
|
21867 |
|
21868 | /**
|
21869 | * See if an object (`val`) is an instance of the supplied constructor. This
|
21870 | * function will check up the inheritance chain, if any.
|
21871 | *
|
21872 | * @func
|
21873 | * @memberOf R
|
21874 | * @since v0.3.0
|
21875 | * @category Type
|
21876 | * @sig (* -> {*}) -> a -> Boolean
|
21877 | * @param {Object} ctor A constructor
|
21878 | * @param {*} val The value to test
|
21879 | * @return {Boolean}
|
21880 | * @example
|
21881 | *
|
21882 | * R.is(Object, {}); //=> true
|
21883 | * R.is(Number, 1); //=> true
|
21884 | * R.is(Object, 1); //=> false
|
21885 | * R.is(String, 's'); //=> true
|
21886 | * R.is(String, new String('')); //=> true
|
21887 | * R.is(Object, new String('')); //=> true
|
21888 | * R.is(Object, 's'); //=> false
|
21889 | * R.is(Number, {}); //=> false
|
21890 | */
|
21891 | var is$1 = _curry2(function is(Ctor, val) {
|
21892 | return val != null && val.constructor === Ctor || val instanceof Ctor;
|
21893 | });
|
21894 |
|
21895 | /**
|
21896 | * Returns `true` if the given value is its type's empty value; `false`
|
21897 | * otherwise.
|
21898 | *
|
21899 | * @func
|
21900 | * @memberOf R
|
21901 | * @since v0.1.0
|
21902 | * @category Logic
|
21903 | * @sig a -> Boolean
|
21904 | * @param {*} x
|
21905 | * @return {Boolean}
|
21906 | * @see R.empty
|
21907 | * @example
|
21908 | *
|
21909 | * R.isEmpty([1, 2, 3]); //=> false
|
21910 | * R.isEmpty([]); //=> true
|
21911 | * R.isEmpty(''); //=> true
|
21912 | * R.isEmpty(null); //=> false
|
21913 | * R.isEmpty({}); //=> true
|
21914 | * R.isEmpty({length: 0}); //=> false
|
21915 | */
|
21916 | var isEmpty = _curry1(function isEmpty(x) {
|
21917 | return x != null && equals(x, empty(x));
|
21918 | });
|
21919 |
|
21920 | /**
|
21921 | * Checks if the input value is `null` or `undefined`.
|
21922 | *
|
21923 | * @func
|
21924 | * @memberOf R
|
21925 | * @since v0.9.0
|
21926 | * @category Type
|
21927 | * @sig * -> Boolean
|
21928 | * @param {*} x The value to test.
|
21929 | * @return {Boolean} `true` if `x` is `undefined` or `null`, otherwise `false`.
|
21930 | * @example
|
21931 | *
|
21932 | * R.isNil(null); //=> true
|
21933 | * R.isNil(undefined); //=> true
|
21934 | * R.isNil(0); //=> false
|
21935 | * R.isNil([]); //=> false
|
21936 | */
|
21937 | var isNil = _curry1(function isNil(x) { return x == null; });
|
21938 |
|
21939 | /**
|
21940 | * Returns a string made by inserting the `separator` between each element and
|
21941 | * concatenating all the elements into a single string.
|
21942 | *
|
21943 | * @func
|
21944 | * @memberOf R
|
21945 | * @since v0.1.0
|
21946 | * @category List
|
21947 | * @sig String -> [a] -> String
|
21948 | * @param {Number|String} separator The string used to separate the elements.
|
21949 | * @param {Array} xs The elements to join into a string.
|
21950 | * @return {String} str The string made by concatenating `xs` with `separator`.
|
21951 | * @see R.split
|
21952 | * @example
|
21953 | *
|
21954 | * var spacer = R.join(' ');
|
21955 | * spacer(['a', 2, 3.4]); //=> 'a 2 3.4'
|
21956 | * R.join('|', [1, 2, 3]); //=> '1|2|3'
|
21957 | */
|
21958 | var join = invoker(1, 'join');
|
21959 |
|
21960 | /**
|
21961 | * juxt applies a list of functions to a list of values.
|
21962 | *
|
21963 | * @func
|
21964 | * @memberOf R
|
21965 | * @since v0.19.0
|
21966 | * @category Function
|
21967 | * @sig [(a, b, ..., m) -> n] -> ((a, b, ..., m) -> [n])
|
21968 | * @param {Array} fns An array of functions
|
21969 | * @return {Function} A function that returns a list of values after applying each of the original `fns` to its parameters.
|
21970 | * @see R.applySpec
|
21971 | * @example
|
21972 | *
|
21973 | * var getRange = R.juxt([Math.min, Math.max]);
|
21974 | * getRange(3, 4, 9, -3); //=> [-3, 9]
|
21975 | * @symb R.juxt([f, g, h])(a, b) = [f(a, b), g(a, b), h(a, b)]
|
21976 | */
|
21977 | var juxt = _curry1(function juxt(fns) {
|
21978 | return converge(function() { return Array.prototype.slice.call(arguments, 0); }, fns);
|
21979 | });
|
21980 |
|
21981 | /**
|
21982 | * Returns a list containing the names of all the properties of the supplied
|
21983 | * object, including prototype properties.
|
21984 | * Note that the order of the output array is not guaranteed to be consistent
|
21985 | * across different JS platforms.
|
21986 | *
|
21987 | * @func
|
21988 | * @memberOf R
|
21989 | * @since v0.2.0
|
21990 | * @category Object
|
21991 | * @sig {k: v} -> [k]
|
21992 | * @param {Object} obj The object to extract properties from
|
21993 | * @return {Array} An array of the object's own and prototype properties.
|
21994 | * @example
|
21995 | *
|
21996 | * var F = function() { this.x = 'X'; };
|
21997 | * F.prototype.y = 'Y';
|
21998 | * var f = new F();
|
21999 | * R.keysIn(f); //=> ['x', 'y']
|
22000 | */
|
22001 | var keysIn = _curry1(function keysIn(obj) {
|
22002 | var prop;
|
22003 | var ks = [];
|
22004 | for (prop in obj) {
|
22005 | ks[ks.length] = prop;
|
22006 | }
|
22007 | return ks;
|
22008 | });
|
22009 |
|
22010 | /**
|
22011 | * Returns the position of the last occurrence of an item in an array, or -1 if
|
22012 | * the item is not included in the array. `R.equals` is used to determine
|
22013 | * equality.
|
22014 | *
|
22015 | * @func
|
22016 | * @memberOf R
|
22017 | * @since v0.1.0
|
22018 | * @category List
|
22019 | * @sig a -> [a] -> Number
|
22020 | * @param {*} target The item to find.
|
22021 | * @param {Array} xs The array to search in.
|
22022 | * @return {Number} the index of the target, or -1 if the target is not found.
|
22023 | * @see R.indexOf
|
22024 | * @example
|
22025 | *
|
22026 | * R.lastIndexOf(3, [-1,3,3,0,1,2,3,4]); //=> 6
|
22027 | * R.lastIndexOf(10, [1,2,3,4]); //=> -1
|
22028 | */
|
22029 | var lastIndexOf = _curry2(function lastIndexOf(target, xs) {
|
22030 | if (typeof xs.lastIndexOf === 'function' && !_isArray(xs)) {
|
22031 | return xs.lastIndexOf(target);
|
22032 | } else {
|
22033 | var idx = xs.length - 1;
|
22034 | while (idx >= 0) {
|
22035 | if (equals(xs[idx], target)) {
|
22036 | return idx;
|
22037 | }
|
22038 | idx -= 1;
|
22039 | }
|
22040 | return -1;
|
22041 | }
|
22042 | });
|
22043 |
|
22044 | var _isNumber = function _isNumber(x) {
|
22045 | return Object.prototype.toString.call(x) === '[object Number]';
|
22046 | };
|
22047 |
|
22048 | /**
|
22049 | * Returns the number of elements in the array by returning `list.length`.
|
22050 | *
|
22051 | * @func
|
22052 | * @memberOf R
|
22053 | * @since v0.3.0
|
22054 | * @category List
|
22055 | * @sig [a] -> Number
|
22056 | * @param {Array} list The array to inspect.
|
22057 | * @return {Number} The length of the array.
|
22058 | * @example
|
22059 | *
|
22060 | * R.length([]); //=> 0
|
22061 | * R.length([1, 2, 3]); //=> 3
|
22062 | */
|
22063 | var length = _curry1(function length(list) {
|
22064 | return list != null && _isNumber(list.length) ? list.length : NaN;
|
22065 | });
|
22066 |
|
22067 | /**
|
22068 | * Returns a lens for the given getter and setter functions. The getter "gets"
|
22069 | * the value of the focus; the setter "sets" the value of the focus. The setter
|
22070 | * should not mutate the data structure.
|
22071 | *
|
22072 | * @func
|
22073 | * @memberOf R
|
22074 | * @since v0.8.0
|
22075 | * @category Object
|
22076 | * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
|
22077 | * @sig (s -> a) -> ((a, s) -> s) -> Lens s a
|
22078 | * @param {Function} getter
|
22079 | * @param {Function} setter
|
22080 | * @return {Lens}
|
22081 | * @see R.view, R.set, R.over, R.lensIndex, R.lensProp
|
22082 | * @example
|
22083 | *
|
22084 | * var xLens = R.lens(R.prop('x'), R.assoc('x'));
|
22085 | *
|
22086 | * R.view(xLens, {x: 1, y: 2}); //=> 1
|
22087 | * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2}
|
22088 | * R.over(xLens, R.negate, {x: 1, y: 2}); //=> {x: -1, y: 2}
|
22089 | */
|
22090 | var lens = _curry2(function lens(getter, setter) {
|
22091 | return function(toFunctorFn) {
|
22092 | return function(target) {
|
22093 | return map$1(
|
22094 | function(focus) {
|
22095 | return setter(focus, target);
|
22096 | },
|
22097 | toFunctorFn(getter(target))
|
22098 | );
|
22099 | };
|
22100 | };
|
22101 | });
|
22102 |
|
22103 | /**
|
22104 | * Returns a new copy of the array with the element at the provided index
|
22105 | * replaced with the given value.
|
22106 | *
|
22107 | * @func
|
22108 | * @memberOf R
|
22109 | * @since v0.14.0
|
22110 | * @category List
|
22111 | * @sig Number -> a -> [a] -> [a]
|
22112 | * @param {Number} idx The index to update.
|
22113 | * @param {*} x The value to exist at the given index of the returned array.
|
22114 | * @param {Array|Arguments} list The source array-like object to be updated.
|
22115 | * @return {Array} A copy of `list` with the value at index `idx` replaced with `x`.
|
22116 | * @see R.adjust
|
22117 | * @example
|
22118 | *
|
22119 | * R.update(1, 11, [0, 1, 2]); //=> [0, 11, 2]
|
22120 | * R.update(1)(11)([0, 1, 2]); //=> [0, 11, 2]
|
22121 | * @symb R.update(-1, a, [b, c]) = [b, a]
|
22122 | * @symb R.update(0, a, [b, c]) = [a, c]
|
22123 | * @symb R.update(1, a, [b, c]) = [b, a]
|
22124 | */
|
22125 | var update = _curry3(function update(idx, x, list) {
|
22126 | return adjust(always(x), idx, list);
|
22127 | });
|
22128 |
|
22129 | /**
|
22130 | * Returns a lens whose focus is the specified index.
|
22131 | *
|
22132 | * @func
|
22133 | * @memberOf R
|
22134 | * @since v0.14.0
|
22135 | * @category Object
|
22136 | * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
|
22137 | * @sig Number -> Lens s a
|
22138 | * @param {Number} n
|
22139 | * @return {Lens}
|
22140 | * @see R.view, R.set, R.over
|
22141 | * @example
|
22142 | *
|
22143 | * var headLens = R.lensIndex(0);
|
22144 | *
|
22145 | * R.view(headLens, ['a', 'b', 'c']); //=> 'a'
|
22146 | * R.set(headLens, 'x', ['a', 'b', 'c']); //=> ['x', 'b', 'c']
|
22147 | * R.over(headLens, R.toUpper, ['a', 'b', 'c']); //=> ['A', 'b', 'c']
|
22148 | */
|
22149 | var lensIndex = _curry1(function lensIndex(n) {
|
22150 | return lens(nth(n), update(n));
|
22151 | });
|
22152 |
|
22153 | /**
|
22154 | * Retrieve the value at a given path.
|
22155 | *
|
22156 | * @func
|
22157 | * @memberOf R
|
22158 | * @since v0.2.0
|
22159 | * @category Object
|
22160 | * @typedefn Idx = String | Int
|
22161 | * @sig [Idx] -> {a} -> a | Undefined
|
22162 | * @param {Array} path The path to use.
|
22163 | * @param {Object} obj The object to retrieve the nested property from.
|
22164 | * @return {*} The data at `path`.
|
22165 | * @see R.prop
|
22166 | * @example
|
22167 | *
|
22168 | * R.path(['a', 'b'], {a: {b: 2}}); //=> 2
|
22169 | * R.path(['a', 'b'], {c: {b: 2}}); //=> undefined
|
22170 | */
|
22171 | var path = _curry2(function path(paths, obj) {
|
22172 | var val = obj;
|
22173 | var idx = 0;
|
22174 | while (idx < paths.length) {
|
22175 | if (val == null) {
|
22176 | return;
|
22177 | }
|
22178 | val = val[paths[idx]];
|
22179 | idx += 1;
|
22180 | }
|
22181 | return val;
|
22182 | });
|
22183 |
|
22184 | /**
|
22185 | * Returns a lens whose focus is the specified path.
|
22186 | *
|
22187 | * @func
|
22188 | * @memberOf R
|
22189 | * @since v0.19.0
|
22190 | * @category Object
|
22191 | * @typedefn Idx = String | Int
|
22192 | * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
|
22193 | * @sig [Idx] -> Lens s a
|
22194 | * @param {Array} path The path to use.
|
22195 | * @return {Lens}
|
22196 | * @see R.view, R.set, R.over
|
22197 | * @example
|
22198 | *
|
22199 | * var xHeadYLens = R.lensPath(['x', 0, 'y']);
|
22200 | *
|
22201 | * R.view(xHeadYLens, {x: [{y: 2, z: 3}, {y: 4, z: 5}]});
|
22202 | * //=> 2
|
22203 | * R.set(xHeadYLens, 1, {x: [{y: 2, z: 3}, {y: 4, z: 5}]});
|
22204 | * //=> {x: [{y: 1, z: 3}, {y: 4, z: 5}]}
|
22205 | * R.over(xHeadYLens, R.negate, {x: [{y: 2, z: 3}, {y: 4, z: 5}]});
|
22206 | * //=> {x: [{y: -2, z: 3}, {y: 4, z: 5}]}
|
22207 | */
|
22208 | var lensPath = _curry1(function lensPath(p) {
|
22209 | return lens(path(p), assocPath(p));
|
22210 | });
|
22211 |
|
22212 | /**
|
22213 | * Returns a lens whose focus is the specified property.
|
22214 | *
|
22215 | * @func
|
22216 | * @memberOf R
|
22217 | * @since v0.14.0
|
22218 | * @category Object
|
22219 | * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
|
22220 | * @sig String -> Lens s a
|
22221 | * @param {String} k
|
22222 | * @return {Lens}
|
22223 | * @see R.view, R.set, R.over
|
22224 | * @example
|
22225 | *
|
22226 | * var xLens = R.lensProp('x');
|
22227 | *
|
22228 | * R.view(xLens, {x: 1, y: 2}); //=> 1
|
22229 | * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2}
|
22230 | * R.over(xLens, R.negate, {x: 1, y: 2}); //=> {x: -1, y: 2}
|
22231 | */
|
22232 | var lensProp = _curry1(function lensProp(k) {
|
22233 | return lens(prop(k), assoc(k));
|
22234 | });
|
22235 |
|
22236 | /**
|
22237 | * Returns `true` if the first argument is less than the second; `false`
|
22238 | * otherwise.
|
22239 | *
|
22240 | * @func
|
22241 | * @memberOf R
|
22242 | * @since v0.1.0
|
22243 | * @category Relation
|
22244 | * @sig Ord a => a -> a -> Boolean
|
22245 | * @param {*} a
|
22246 | * @param {*} b
|
22247 | * @return {Boolean}
|
22248 | * @see R.gt
|
22249 | * @example
|
22250 | *
|
22251 | * R.lt(2, 1); //=> false
|
22252 | * R.lt(2, 2); //=> false
|
22253 | * R.lt(2, 3); //=> true
|
22254 | * R.lt('a', 'z'); //=> true
|
22255 | * R.lt('z', 'a'); //=> false
|
22256 | */
|
22257 | var lt = _curry2(function lt(a, b) { return a < b; });
|
22258 |
|
22259 | /**
|
22260 | * Returns `true` if the first argument is less than or equal to the second;
|
22261 | * `false` otherwise.
|
22262 | *
|
22263 | * @func
|
22264 | * @memberOf R
|
22265 | * @since v0.1.0
|
22266 | * @category Relation
|
22267 | * @sig Ord a => a -> a -> Boolean
|
22268 | * @param {Number} a
|
22269 | * @param {Number} b
|
22270 | * @return {Boolean}
|
22271 | * @see R.gte
|
22272 | * @example
|
22273 | *
|
22274 | * R.lte(2, 1); //=> false
|
22275 | * R.lte(2, 2); //=> true
|
22276 | * R.lte(2, 3); //=> true
|
22277 | * R.lte('a', 'z'); //=> true
|
22278 | * R.lte('z', 'a'); //=> false
|
22279 | */
|
22280 | var lte = _curry2(function lte(a, b) { return a <= b; });
|
22281 |
|
22282 | /**
|
22283 | * The mapAccum function behaves like a combination of map and reduce; it
|
22284 | * applies a function to each element of a list, passing an accumulating
|
22285 | * parameter from left to right, and returning a final value of this
|
22286 | * accumulator together with the new list.
|
22287 | *
|
22288 | * The iterator function receives two arguments, *acc* and *value*, and should
|
22289 | * return a tuple *[acc, value]*.
|
22290 | *
|
22291 | * @func
|
22292 | * @memberOf R
|
22293 | * @since v0.10.0
|
22294 | * @category List
|
22295 | * @sig (acc -> x -> (acc, y)) -> acc -> [x] -> (acc, [y])
|
22296 | * @param {Function} fn The function to be called on every element of the input `list`.
|
22297 | * @param {*} acc The accumulator value.
|
22298 | * @param {Array} list The list to iterate over.
|
22299 | * @return {*} The final, accumulated value.
|
22300 | * @see R.addIndex, R.mapAccumRight
|
22301 | * @example
|
22302 | *
|
22303 | * var digits = ['1', '2', '3', '4'];
|
22304 | * var appender = (a, b) => [a + b, a + b];
|
22305 | *
|
22306 | * R.mapAccum(appender, 0, digits); //=> ['01234', ['01', '012', '0123', '01234']]
|
22307 | * @symb R.mapAccum(f, a, [b, c, d]) = [
|
22308 | * f(f(f(a, b)[0], c)[0], d)[0],
|
22309 | * [
|
22310 | * f(a, b)[1],
|
22311 | * f(f(a, b)[0], c)[1],
|
22312 | * f(f(f(a, b)[0], c)[0], d)[1]
|
22313 | * ]
|
22314 | * ]
|
22315 | */
|
22316 | var mapAccum = _curry3(function mapAccum(fn, acc, list) {
|
22317 | var idx = 0;
|
22318 | var len = list.length;
|
22319 | var result = [];
|
22320 | var tuple = [acc];
|
22321 | while (idx < len) {
|
22322 | tuple = fn(tuple[0], list[idx]);
|
22323 | result[idx] = tuple[1];
|
22324 | idx += 1;
|
22325 | }
|
22326 | return [tuple[0], result];
|
22327 | });
|
22328 |
|
22329 | /**
|
22330 | * The mapAccumRight function behaves like a combination of map and reduce; it
|
22331 | * applies a function to each element of a list, passing an accumulating
|
22332 | * parameter from right to left, and returning a final value of this
|
22333 | * accumulator together with the new list.
|
22334 | *
|
22335 | * Similar to `mapAccum`, except moves through the input list from the right to
|
22336 | * the left.
|
22337 | *
|
22338 | * The iterator function receives two arguments, *value* and *acc*, and should
|
22339 | * return a tuple *[value, acc]*.
|
22340 | *
|
22341 | * @func
|
22342 | * @memberOf R
|
22343 | * @since v0.10.0
|
22344 | * @category List
|
22345 | * @sig (x-> acc -> (y, acc)) -> acc -> [x] -> ([y], acc)
|
22346 | * @param {Function} fn The function to be called on every element of the input `list`.
|
22347 | * @param {*} acc The accumulator value.
|
22348 | * @param {Array} list The list to iterate over.
|
22349 | * @return {*} The final, accumulated value.
|
22350 | * @see R.addIndex, R.mapAccum
|
22351 | * @example
|
22352 | *
|
22353 | * var digits = ['1', '2', '3', '4'];
|
22354 | * var append = (a, b) => [a + b, a + b];
|
22355 | *
|
22356 | * R.mapAccumRight(append, 5, digits); //=> [['12345', '2345', '345', '45'], '12345']
|
22357 | * @symb R.mapAccumRight(f, a, [b, c, d]) = [
|
22358 | * [
|
22359 | * f(b, f(c, f(d, a)[0])[0])[1],
|
22360 | * f(c, f(d, a)[0])[1],
|
22361 | * f(d, a)[1],
|
22362 | * ]
|
22363 | * f(b, f(c, f(d, a)[0])[0])[0],
|
22364 | * ]
|
22365 | */
|
22366 | var mapAccumRight = _curry3(function mapAccumRight(fn, acc, list) {
|
22367 | var idx = list.length - 1;
|
22368 | var result = [];
|
22369 | var tuple = [acc];
|
22370 | while (idx >= 0) {
|
22371 | tuple = fn(list[idx], tuple[0]);
|
22372 | result[idx] = tuple[1];
|
22373 | idx -= 1;
|
22374 | }
|
22375 | return [result, tuple[0]];
|
22376 | });
|
22377 |
|
22378 | /**
|
22379 | * An Object-specific version of `map`. The function is applied to three
|
22380 | * arguments: *(value, key, obj)*. If only the value is significant, use
|
22381 | * `map` instead.
|
22382 | *
|
22383 | * @func
|
22384 | * @memberOf R
|
22385 | * @since v0.9.0
|
22386 | * @category Object
|
22387 | * @sig ((*, String, Object) -> *) -> Object -> Object
|
22388 | * @param {Function} fn
|
22389 | * @param {Object} obj
|
22390 | * @return {Object}
|
22391 | * @see R.map
|
22392 | * @example
|
22393 | *
|
22394 | * var values = { x: 1, y: 2, z: 3 };
|
22395 | * var prependKeyAndDouble = (num, key, obj) => key + (num * 2);
|
22396 | *
|
22397 | * R.mapObjIndexed(prependKeyAndDouble, values); //=> { x: 'x2', y: 'y4', z: 'z6' }
|
22398 | */
|
22399 | var mapObjIndexed = _curry2(function mapObjIndexed(fn, obj) {
|
22400 | return _reduce(function(acc, key) {
|
22401 | acc[key] = fn(obj[key], key, obj);
|
22402 | return acc;
|
22403 | }, {}, keys(obj));
|
22404 | });
|
22405 |
|
22406 | /**
|
22407 | * Tests a regular expression against a String. Note that this function will
|
22408 | * return an empty array when there are no matches. This differs from
|
22409 | * [`String.prototype.match`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match)
|
22410 | * which returns `null` when there are no matches.
|
22411 | *
|
22412 | * @func
|
22413 | * @memberOf R
|
22414 | * @since v0.1.0
|
22415 | * @category String
|
22416 | * @sig RegExp -> String -> [String | Undefined]
|
22417 | * @param {RegExp} rx A regular expression.
|
22418 | * @param {String} str The string to match against
|
22419 | * @return {Array} The list of matches or empty array.
|
22420 | * @see R.test
|
22421 | * @example
|
22422 | *
|
22423 | * R.match(/([a-z]a)/g, 'bananas'); //=> ['ba', 'na', 'na']
|
22424 | * R.match(/a/, 'b'); //=> []
|
22425 | * R.match(/a/, null); //=> TypeError: null does not have a method named "match"
|
22426 | */
|
22427 | var match = _curry2(function match(rx, str) {
|
22428 | return str.match(rx) || [];
|
22429 | });
|
22430 |
|
22431 | /**
|
22432 | * mathMod behaves like the modulo operator should mathematically, unlike the
|
22433 | * `%` operator (and by extension, R.modulo). So while "-17 % 5" is -2,
|
22434 | * mathMod(-17, 5) is 3. mathMod requires Integer arguments, and returns NaN
|
22435 | * when the modulus is zero or negative.
|
22436 | *
|
22437 | * @func
|
22438 | * @memberOf R
|
22439 | * @since v0.3.0
|
22440 | * @category Math
|
22441 | * @sig Number -> Number -> Number
|
22442 | * @param {Number} m The dividend.
|
22443 | * @param {Number} p the modulus.
|
22444 | * @return {Number} The result of `b mod a`.
|
22445 | * @example
|
22446 | *
|
22447 | * R.mathMod(-17, 5); //=> 3
|
22448 | * R.mathMod(17, 5); //=> 2
|
22449 | * R.mathMod(17, -5); //=> NaN
|
22450 | * R.mathMod(17, 0); //=> NaN
|
22451 | * R.mathMod(17.2, 5); //=> NaN
|
22452 | * R.mathMod(17, 5.3); //=> NaN
|
22453 | *
|
22454 | * var clock = R.mathMod(R.__, 12);
|
22455 | * clock(15); //=> 3
|
22456 | * clock(24); //=> 0
|
22457 | *
|
22458 | * var seventeenMod = R.mathMod(17);
|
22459 | * seventeenMod(3); //=> 2
|
22460 | * seventeenMod(4); //=> 1
|
22461 | * seventeenMod(10); //=> 7
|
22462 | */
|
22463 | var mathMod = _curry2(function mathMod(m, p) {
|
22464 | if (!_isInteger(m)) { return NaN; }
|
22465 | if (!_isInteger(p) || p < 1) { return NaN; }
|
22466 | return ((m % p) + p) % p;
|
22467 | });
|
22468 |
|
22469 | /**
|
22470 | * Takes a function and two values, and returns whichever value produces the
|
22471 | * larger result when passed to the provided function.
|
22472 | *
|
22473 | * @func
|
22474 | * @memberOf R
|
22475 | * @since v0.8.0
|
22476 | * @category Relation
|
22477 | * @sig Ord b => (a -> b) -> a -> a -> a
|
22478 | * @param {Function} f
|
22479 | * @param {*} a
|
22480 | * @param {*} b
|
22481 | * @return {*}
|
22482 | * @see R.max, R.minBy
|
22483 | * @example
|
22484 | *
|
22485 | * // square :: Number -> Number
|
22486 | * var square = n => n * n;
|
22487 | *
|
22488 | * R.maxBy(square, -3, 2); //=> -3
|
22489 | *
|
22490 | * R.reduce(R.maxBy(square), 0, [3, -5, 4, 1, -2]); //=> -5
|
22491 | * R.reduce(R.maxBy(square), 0, []); //=> 0
|
22492 | */
|
22493 | var maxBy = _curry3(function maxBy(f, a, b) {
|
22494 | return f(b) > f(a) ? b : a;
|
22495 | });
|
22496 |
|
22497 | /**
|
22498 | * Adds together all the elements of a list.
|
22499 | *
|
22500 | * @func
|
22501 | * @memberOf R
|
22502 | * @since v0.1.0
|
22503 | * @category Math
|
22504 | * @sig [Number] -> Number
|
22505 | * @param {Array} list An array of numbers
|
22506 | * @return {Number} The sum of all the numbers in the list.
|
22507 | * @see R.reduce
|
22508 | * @example
|
22509 | *
|
22510 | * R.sum([2,4,6,8,100,1]); //=> 121
|
22511 | */
|
22512 | var sum = reduce(add, 0);
|
22513 |
|
22514 | /**
|
22515 | * Returns the mean of the given list of numbers.
|
22516 | *
|
22517 | * @func
|
22518 | * @memberOf R
|
22519 | * @since v0.14.0
|
22520 | * @category Math
|
22521 | * @sig [Number] -> Number
|
22522 | * @param {Array} list
|
22523 | * @return {Number}
|
22524 | * @example
|
22525 | *
|
22526 | * R.mean([2, 7, 9]); //=> 6
|
22527 | * R.mean([]); //=> NaN
|
22528 | */
|
22529 | var mean = _curry1(function mean(list) {
|
22530 | return sum(list) / list.length;
|
22531 | });
|
22532 |
|
22533 | /**
|
22534 | * Returns the median of the given list of numbers.
|
22535 | *
|
22536 | * @func
|
22537 | * @memberOf R
|
22538 | * @since v0.14.0
|
22539 | * @category Math
|
22540 | * @sig [Number] -> Number
|
22541 | * @param {Array} list
|
22542 | * @return {Number}
|
22543 | * @example
|
22544 | *
|
22545 | * R.median([2, 9, 7]); //=> 7
|
22546 | * R.median([7, 2, 10, 9]); //=> 8
|
22547 | * R.median([]); //=> NaN
|
22548 | */
|
22549 | var median = _curry1(function median(list) {
|
22550 | var len = list.length;
|
22551 | if (len === 0) {
|
22552 | return NaN;
|
22553 | }
|
22554 | var width = 2 - len % 2;
|
22555 | var idx = (len - width) / 2;
|
22556 | return mean(Array.prototype.slice.call(list, 0).sort(function(a, b) {
|
22557 | return a < b ? -1 : a > b ? 1 : 0;
|
22558 | }).slice(idx, idx + width));
|
22559 | });
|
22560 |
|
22561 | /**
|
22562 | * Creates a new function that, when invoked, caches the result of calling `fn`
|
22563 | * for a given argument set and returns the result. Subsequent calls to the
|
22564 | * memoized `fn` with the same argument set will not result in an additional
|
22565 | * call to `fn`; instead, the cached result for that set of arguments will be
|
22566 | * returned.
|
22567 | *
|
22568 | * @func
|
22569 | * @memberOf R
|
22570 | * @since v0.1.0
|
22571 | * @category Function
|
22572 | * @sig (*... -> a) -> (*... -> a)
|
22573 | * @param {Function} fn The function to memoize.
|
22574 | * @return {Function} Memoized version of `fn`.
|
22575 | * @example
|
22576 | *
|
22577 | * var count = 0;
|
22578 | * var factorial = R.memoize(n => {
|
22579 | * count += 1;
|
22580 | * return R.product(R.range(1, n + 1));
|
22581 | * });
|
22582 | * factorial(5); //=> 120
|
22583 | * factorial(5); //=> 120
|
22584 | * factorial(5); //=> 120
|
22585 | * count; //=> 1
|
22586 | */
|
22587 | var memoize = _curry1(function memoize(fn) {
|
22588 | var cache = {};
|
22589 | return _arity(fn.length, function() {
|
22590 | var key = toString_1(arguments);
|
22591 | if (!_has(key, cache)) {
|
22592 | cache[key] = fn.apply(this, arguments);
|
22593 | }
|
22594 | return cache[key];
|
22595 | });
|
22596 | });
|
22597 |
|
22598 | /**
|
22599 | * Create a new object with the own properties of the first object merged with
|
22600 | * the own properties of the second object. If a key exists in both objects,
|
22601 | * the value from the second object will be used.
|
22602 | *
|
22603 | * @func
|
22604 | * @memberOf R
|
22605 | * @since v0.1.0
|
22606 | * @category Object
|
22607 | * @sig {k: v} -> {k: v} -> {k: v}
|
22608 | * @param {Object} l
|
22609 | * @param {Object} r
|
22610 | * @return {Object}
|
22611 | * @see R.mergeWith, R.mergeWithKey
|
22612 | * @example
|
22613 | *
|
22614 | * R.merge({ 'name': 'fred', 'age': 10 }, { 'age': 40 });
|
22615 | * //=> { 'name': 'fred', 'age': 40 }
|
22616 | *
|
22617 | * var resetToDefault = R.merge(R.__, {x: 0});
|
22618 | * resetToDefault({x: 5, y: 2}); //=> {x: 0, y: 2}
|
22619 | * @symb R.merge({ x: 1, y: 2 }, { y: 5, z: 3 }) = { x: 1, y: 5, z: 3 }
|
22620 | */
|
22621 | var merge = _curry2(function merge(l, r) {
|
22622 | return _assign$1({}, l, r);
|
22623 | });
|
22624 |
|
22625 | /**
|
22626 | * Merges a list of objects together into one object.
|
22627 | *
|
22628 | * @func
|
22629 | * @memberOf R
|
22630 | * @since v0.10.0
|
22631 | * @category List
|
22632 | * @sig [{k: v}] -> {k: v}
|
22633 | * @param {Array} list An array of objects
|
22634 | * @return {Object} A merged object.
|
22635 | * @see R.reduce
|
22636 | * @example
|
22637 | *
|
22638 | * R.mergeAll([{foo:1},{bar:2},{baz:3}]); //=> {foo:1,bar:2,baz:3}
|
22639 | * R.mergeAll([{foo:1},{foo:2},{bar:2}]); //=> {foo:2,bar:2}
|
22640 | * @symb R.mergeAll([{ x: 1 }, { y: 2 }, { z: 3 }]) = { x: 1, y: 2, z: 3 }
|
22641 | */
|
22642 | var mergeAll = _curry1(function mergeAll(list) {
|
22643 | return _assign$1.apply(null, [{}].concat(list));
|
22644 | });
|
22645 |
|
22646 | /**
|
22647 | * Creates a new object with the own properties of the two provided objects. If
|
22648 | * a key exists in both objects, the provided function is applied to the key
|
22649 | * and the values associated with the key in each object, with the result being
|
22650 | * used as the value associated with the key in the returned object. The key
|
22651 | * will be excluded from the returned object if the resulting value is
|
22652 | * `undefined`.
|
22653 | *
|
22654 | * @func
|
22655 | * @memberOf R
|
22656 | * @since v0.19.0
|
22657 | * @category Object
|
22658 | * @sig (String -> a -> a -> a) -> {a} -> {a} -> {a}
|
22659 | * @param {Function} fn
|
22660 | * @param {Object} l
|
22661 | * @param {Object} r
|
22662 | * @return {Object}
|
22663 | * @see R.merge, R.mergeWith
|
22664 | * @example
|
22665 | *
|
22666 | * let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r
|
22667 | * R.mergeWithKey(concatValues,
|
22668 | * { a: true, thing: 'foo', values: [10, 20] },
|
22669 | * { b: true, thing: 'bar', values: [15, 35] });
|
22670 | * //=> { a: true, b: true, thing: 'bar', values: [10, 20, 15, 35] }
|
22671 | * @symb R.mergeWithKey(f, { x: 1, y: 2 }, { y: 5, z: 3 }) = { x: 1, y: f('y', 2, 5), z: 3 }
|
22672 | */
|
22673 | var mergeWithKey = _curry3(function mergeWithKey(fn, l, r) {
|
22674 | var result = {};
|
22675 | var k;
|
22676 |
|
22677 | for (k in l) {
|
22678 | if (_has(k, l)) {
|
22679 | result[k] = _has(k, r) ? fn(k, l[k], r[k]) : l[k];
|
22680 | }
|
22681 | }
|
22682 |
|
22683 | for (k in r) {
|
22684 | if (_has(k, r) && !(_has(k, result))) {
|
22685 | result[k] = r[k];
|
22686 | }
|
22687 | }
|
22688 |
|
22689 | return result;
|
22690 | });
|
22691 |
|
22692 | /**
|
22693 | * Creates a new object with the own properties of the two provided objects. If
|
22694 | * a key exists in both objects, the provided function is applied to the values
|
22695 | * associated with the key in each object, with the result being used as the
|
22696 | * value associated with the key in the returned object. The key will be
|
22697 | * excluded from the returned object if the resulting value is `undefined`.
|
22698 | *
|
22699 | * @func
|
22700 | * @memberOf R
|
22701 | * @since v0.19.0
|
22702 | * @category Object
|
22703 | * @sig (a -> a -> a) -> {a} -> {a} -> {a}
|
22704 | * @param {Function} fn
|
22705 | * @param {Object} l
|
22706 | * @param {Object} r
|
22707 | * @return {Object}
|
22708 | * @see R.merge, R.mergeWithKey
|
22709 | * @example
|
22710 | *
|
22711 | * R.mergeWith(R.concat,
|
22712 | * { a: true, values: [10, 20] },
|
22713 | * { b: true, values: [15, 35] });
|
22714 | * //=> { a: true, b: true, values: [10, 20, 15, 35] }
|
22715 | */
|
22716 | var mergeWith = _curry3(function mergeWith(fn, l, r) {
|
22717 | return mergeWithKey(function(_, _l, _r) {
|
22718 | return fn(_l, _r);
|
22719 | }, l, r);
|
22720 | });
|
22721 |
|
22722 | /**
|
22723 | * Returns the smaller of its two arguments.
|
22724 | *
|
22725 | * @func
|
22726 | * @memberOf R
|
22727 | * @since v0.1.0
|
22728 | * @category Relation
|
22729 | * @sig Ord a => a -> a -> a
|
22730 | * @param {*} a
|
22731 | * @param {*} b
|
22732 | * @return {*}
|
22733 | * @see R.minBy, R.max
|
22734 | * @example
|
22735 | *
|
22736 | * R.min(789, 123); //=> 123
|
22737 | * R.min('a', 'b'); //=> 'a'
|
22738 | */
|
22739 | var min = _curry2(function min(a, b) { return b < a ? b : a; });
|
22740 |
|
22741 | /**
|
22742 | * Takes a function and two values, and returns whichever value produces the
|
22743 | * smaller result when passed to the provided function.
|
22744 | *
|
22745 | * @func
|
22746 | * @memberOf R
|
22747 | * @since v0.8.0
|
22748 | * @category Relation
|
22749 | * @sig Ord b => (a -> b) -> a -> a -> a
|
22750 | * @param {Function} f
|
22751 | * @param {*} a
|
22752 | * @param {*} b
|
22753 | * @return {*}
|
22754 | * @see R.min, R.maxBy
|
22755 | * @example
|
22756 | *
|
22757 | * // square :: Number -> Number
|
22758 | * var square = n => n * n;
|
22759 | *
|
22760 | * R.minBy(square, -3, 2); //=> 2
|
22761 | *
|
22762 | * R.reduce(R.minBy(square), Infinity, [3, -5, 4, 1, -2]); //=> 1
|
22763 | * R.reduce(R.minBy(square), Infinity, []); //=> Infinity
|
22764 | */
|
22765 | var minBy = _curry3(function minBy(f, a, b) {
|
22766 | return f(b) < f(a) ? b : a;
|
22767 | });
|
22768 |
|
22769 | /**
|
22770 | * Divides the first parameter by the second and returns the remainder. Note
|
22771 | * that this function preserves the JavaScript-style behavior for modulo. For
|
22772 | * mathematical modulo see `mathMod`.
|
22773 | *
|
22774 | * @func
|
22775 | * @memberOf R
|
22776 | * @since v0.1.1
|
22777 | * @category Math
|
22778 | * @sig Number -> Number -> Number
|
22779 | * @param {Number} a The value to the divide.
|
22780 | * @param {Number} b The pseudo-modulus
|
22781 | * @return {Number} The result of `b % a`.
|
22782 | * @see R.mathMod
|
22783 | * @example
|
22784 | *
|
22785 | * R.modulo(17, 3); //=> 2
|
22786 | * // JS behavior:
|
22787 | * R.modulo(-17, 3); //=> -2
|
22788 | * R.modulo(17, -3); //=> 2
|
22789 | *
|
22790 | * var isOdd = R.modulo(R.__, 2);
|
22791 | * isOdd(42); //=> 0
|
22792 | * isOdd(21); //=> 1
|
22793 | */
|
22794 | var modulo = _curry2(function modulo(a, b) { return a % b; });
|
22795 |
|
22796 | /**
|
22797 | * Multiplies two numbers. Equivalent to `a * b` but curried.
|
22798 | *
|
22799 | * @func
|
22800 | * @memberOf R
|
22801 | * @since v0.1.0
|
22802 | * @category Math
|
22803 | * @sig Number -> Number -> Number
|
22804 | * @param {Number} a The first value.
|
22805 | * @param {Number} b The second value.
|
22806 | * @return {Number} The result of `a * b`.
|
22807 | * @see R.divide
|
22808 | * @example
|
22809 | *
|
22810 | * var double = R.multiply(2);
|
22811 | * var triple = R.multiply(3);
|
22812 | * double(3); //=> 6
|
22813 | * triple(4); //=> 12
|
22814 | * R.multiply(2, 5); //=> 10
|
22815 | */
|
22816 | var multiply = _curry2(function multiply(a, b) { return a * b; });
|
22817 |
|
22818 | /**
|
22819 | * Negates its argument.
|
22820 | *
|
22821 | * @func
|
22822 | * @memberOf R
|
22823 | * @since v0.9.0
|
22824 | * @category Math
|
22825 | * @sig Number -> Number
|
22826 | * @param {Number} n
|
22827 | * @return {Number}
|
22828 | * @example
|
22829 | *
|
22830 | * R.negate(42); //=> -42
|
22831 | */
|
22832 | var negate = _curry1(function negate(n) { return -n; });
|
22833 |
|
22834 | /**
|
22835 | * Returns `true` if no elements of the list match the predicate, `false`
|
22836 | * otherwise.
|
22837 | *
|
22838 | * Dispatches to the `any` method of the second argument, if present.
|
22839 | *
|
22840 | * @func
|
22841 | * @memberOf R
|
22842 | * @since v0.12.0
|
22843 | * @category List
|
22844 | * @sig (a -> Boolean) -> [a] -> Boolean
|
22845 | * @param {Function} fn The predicate function.
|
22846 | * @param {Array} list The array to consider.
|
22847 | * @return {Boolean} `true` if the predicate is not satisfied by every element, `false` otherwise.
|
22848 | * @see R.all, R.any
|
22849 | * @example
|
22850 | *
|
22851 | * var isEven = n => n % 2 === 0;
|
22852 | *
|
22853 | * R.none(isEven, [1, 3, 5, 7, 9, 11]); //=> true
|
22854 | * R.none(isEven, [1, 3, 5, 7, 8, 11]); //=> false
|
22855 | */
|
22856 | var none = _curry2(_complement(_dispatchable(['any'], _xany, any)));
|
22857 |
|
22858 | /**
|
22859 | * Returns a function which returns its nth argument.
|
22860 | *
|
22861 | * @func
|
22862 | * @memberOf R
|
22863 | * @since v0.9.0
|
22864 | * @category Function
|
22865 | * @sig Number -> *... -> *
|
22866 | * @param {Number} n
|
22867 | * @return {Function}
|
22868 | * @example
|
22869 | *
|
22870 | * R.nthArg(1)('a', 'b', 'c'); //=> 'b'
|
22871 | * R.nthArg(-1)('a', 'b', 'c'); //=> 'c'
|
22872 | * @symb R.nthArg(-1)(a, b, c) = c
|
22873 | * @symb R.nthArg(0)(a, b, c) = a
|
22874 | * @symb R.nthArg(1)(a, b, c) = b
|
22875 | */
|
22876 | var nthArg = _curry1(function nthArg(n) {
|
22877 | var arity = n < 0 ? 1 : n + 1;
|
22878 | return curryN(arity, function() {
|
22879 | return nth(n, arguments);
|
22880 | });
|
22881 | });
|
22882 |
|
22883 | var _of = function _of(x) { return [x]; };
|
22884 |
|
22885 | /**
|
22886 | * Returns a singleton array containing the value provided.
|
22887 | *
|
22888 | * Note this `of` is different from the ES6 `of`; See
|
22889 | * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of
|
22890 | *
|
22891 | * @func
|
22892 | * @memberOf R
|
22893 | * @since v0.3.0
|
22894 | * @category Function
|
22895 | * @sig a -> [a]
|
22896 | * @param {*} x any value
|
22897 | * @return {Array} An array wrapping `x`.
|
22898 | * @example
|
22899 | *
|
22900 | * R.of(null); //=> [null]
|
22901 | * R.of([42]); //=> [[42]]
|
22902 | */
|
22903 | var of = _curry1(_of);
|
22904 |
|
22905 | /**
|
22906 | * Returns a partial copy of an object omitting the keys specified.
|
22907 | *
|
22908 | * @func
|
22909 | * @memberOf R
|
22910 | * @since v0.1.0
|
22911 | * @category Object
|
22912 | * @sig [String] -> {String: *} -> {String: *}
|
22913 | * @param {Array} names an array of String property names to omit from the new object
|
22914 | * @param {Object} obj The object to copy from
|
22915 | * @return {Object} A new object with properties from `names` not on it.
|
22916 | * @see R.pick
|
22917 | * @example
|
22918 | *
|
22919 | * R.omit(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, c: 3}
|
22920 | */
|
22921 | var omit = _curry2(function omit(names, obj) {
|
22922 | var result = {};
|
22923 | for (var prop in obj) {
|
22924 | if (!_contains(prop, names)) {
|
22925 | result[prop] = obj[prop];
|
22926 | }
|
22927 | }
|
22928 | return result;
|
22929 | });
|
22930 |
|
22931 | /**
|
22932 | * Accepts a function `fn` and returns a function that guards invocation of
|
22933 | * `fn` such that `fn` can only ever be called once, no matter how many times
|
22934 | * the returned function is invoked. The first value calculated is returned in
|
22935 | * subsequent invocations.
|
22936 | *
|
22937 | * @func
|
22938 | * @memberOf R
|
22939 | * @since v0.1.0
|
22940 | * @category Function
|
22941 | * @sig (a... -> b) -> (a... -> b)
|
22942 | * @param {Function} fn The function to wrap in a call-only-once wrapper.
|
22943 | * @return {Function} The wrapped function.
|
22944 | * @example
|
22945 | *
|
22946 | * var addOneOnce = R.once(x => x + 1);
|
22947 | * addOneOnce(10); //=> 11
|
22948 | * addOneOnce(addOneOnce(50)); //=> 11
|
22949 | */
|
22950 | var once$1 = _curry1(function once(fn) {
|
22951 | var called = false;
|
22952 | var result;
|
22953 | return _arity(fn.length, function() {
|
22954 | if (called) {
|
22955 | return result;
|
22956 | }
|
22957 | called = true;
|
22958 | result = fn.apply(this, arguments);
|
22959 | return result;
|
22960 | });
|
22961 | });
|
22962 |
|
22963 | /**
|
22964 | * Returns the result of "setting" the portion of the given data structure
|
22965 | * focused by the given lens to the result of applying the given function to
|
22966 | * the focused value.
|
22967 | *
|
22968 | * @func
|
22969 | * @memberOf R
|
22970 | * @since v0.16.0
|
22971 | * @category Object
|
22972 | * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
|
22973 | * @sig Lens s a -> (a -> a) -> s -> s
|
22974 | * @param {Lens} lens
|
22975 | * @param {*} v
|
22976 | * @param {*} x
|
22977 | * @return {*}
|
22978 | * @see R.prop, R.lensIndex, R.lensProp
|
22979 | * @example
|
22980 | *
|
22981 | * var headLens = R.lensIndex(0);
|
22982 | *
|
22983 | * R.over(headLens, R.toUpper, ['foo', 'bar', 'baz']); //=> ['FOO', 'bar', 'baz']
|
22984 | */
|
22985 | var over = (function() {
|
22986 | // `Identity` is a functor that holds a single value, where `map` simply
|
22987 | // transforms the held value with the provided function.
|
22988 | var Identity = function(x) {
|
22989 | return {value: x, map: function(f) { return Identity(f(x)); }};
|
22990 | };
|
22991 |
|
22992 | return _curry3(function over(lens, f, x) {
|
22993 | // The value returned by the getter function is first transformed with `f`,
|
22994 | // then set as the value of an `Identity`. This is then mapped over with the
|
22995 | // setter function of the lens.
|
22996 | return lens(function(y) { return Identity(f(y)); })(x).value;
|
22997 | });
|
22998 | }());
|
22999 |
|
23000 | /**
|
23001 | * Takes two arguments, `fst` and `snd`, and returns `[fst, snd]`.
|
23002 | *
|
23003 | * @func
|
23004 | * @memberOf R
|
23005 | * @since v0.18.0
|
23006 | * @category List
|
23007 | * @sig a -> b -> (a,b)
|
23008 | * @param {*} fst
|
23009 | * @param {*} snd
|
23010 | * @return {Array}
|
23011 | * @see R.objOf, R.of
|
23012 | * @example
|
23013 | *
|
23014 | * R.pair('foo', 'bar'); //=> ['foo', 'bar']
|
23015 | */
|
23016 | var pair = _curry2(function pair(fst, snd) { return [fst, snd]; });
|
23017 |
|
23018 | var _createPartialApplicator = function _createPartialApplicator(concat) {
|
23019 | return _curry2(function(fn, args) {
|
23020 | return _arity(Math.max(0, fn.length - args.length), function() {
|
23021 | return fn.apply(this, concat(args, arguments));
|
23022 | });
|
23023 | });
|
23024 | };
|
23025 |
|
23026 | /**
|
23027 | * Takes a function `f` and a list of arguments, and returns a function `g`.
|
23028 | * When applied, `g` returns the result of applying `f` to the arguments
|
23029 | * provided initially followed by the arguments provided to `g`.
|
23030 | *
|
23031 | * @func
|
23032 | * @memberOf R
|
23033 | * @since v0.10.0
|
23034 | * @category Function
|
23035 | * @sig ((a, b, c, ..., n) -> x) -> [a, b, c, ...] -> ((d, e, f, ..., n) -> x)
|
23036 | * @param {Function} f
|
23037 | * @param {Array} args
|
23038 | * @return {Function}
|
23039 | * @see R.partialRight
|
23040 | * @example
|
23041 | *
|
23042 | * var multiply2 = (a, b) => a * b;
|
23043 | * var double = R.partial(multiply2, [2]);
|
23044 | * double(2); //=> 4
|
23045 | *
|
23046 | * var greet = (salutation, title, firstName, lastName) =>
|
23047 | * salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!';
|
23048 | *
|
23049 | * var sayHello = R.partial(greet, ['Hello']);
|
23050 | * var sayHelloToMs = R.partial(sayHello, ['Ms.']);
|
23051 | * sayHelloToMs('Jane', 'Jones'); //=> 'Hello, Ms. Jane Jones!'
|
23052 | * @symb R.partial(f, [a, b])(c, d) = f(a, b, c, d)
|
23053 | */
|
23054 | var partial = _createPartialApplicator(_concat);
|
23055 |
|
23056 | /**
|
23057 | * Takes a function `f` and a list of arguments, and returns a function `g`.
|
23058 | * When applied, `g` returns the result of applying `f` to the arguments
|
23059 | * provided to `g` followed by the arguments provided initially.
|
23060 | *
|
23061 | * @func
|
23062 | * @memberOf R
|
23063 | * @since v0.10.0
|
23064 | * @category Function
|
23065 | * @sig ((a, b, c, ..., n) -> x) -> [d, e, f, ..., n] -> ((a, b, c, ...) -> x)
|
23066 | * @param {Function} f
|
23067 | * @param {Array} args
|
23068 | * @return {Function}
|
23069 | * @see R.partial
|
23070 | * @example
|
23071 | *
|
23072 | * var greet = (salutation, title, firstName, lastName) =>
|
23073 | * salutation + ', ' + title + ' ' + firstName + ' ' + lastName + '!';
|
23074 | *
|
23075 | * var greetMsJaneJones = R.partialRight(greet, ['Ms.', 'Jane', 'Jones']);
|
23076 | *
|
23077 | * greetMsJaneJones('Hello'); //=> 'Hello, Ms. Jane Jones!'
|
23078 | * @symb R.partialRight(f, [a, b])(c, d) = f(c, d, a, b)
|
23079 | */
|
23080 | var partialRight = _createPartialApplicator(flip(_concat));
|
23081 |
|
23082 | /**
|
23083 | * Takes a predicate and a list or other "filterable" object and returns the
|
23084 | * pair of filterable objects of the same type of elements which do and do not
|
23085 | * satisfy, the predicate, respectively.
|
23086 | *
|
23087 | * @func
|
23088 | * @memberOf R
|
23089 | * @since v0.1.4
|
23090 | * @category List
|
23091 | * @sig Filterable f => (a -> Boolean) -> f a -> [f a, f a]
|
23092 | * @param {Function} pred A predicate to determine which side the element belongs to.
|
23093 | * @param {Array} filterable the list (or other filterable) to partition.
|
23094 | * @return {Array} An array, containing first the subset of elements that satisfy the
|
23095 | * predicate, and second the subset of elements that do not satisfy.
|
23096 | * @see R.filter, R.reject
|
23097 | * @example
|
23098 | *
|
23099 | * R.partition(R.contains('s'), ['sss', 'ttt', 'foo', 'bars']);
|
23100 | * // => [ [ 'sss', 'bars' ], [ 'ttt', 'foo' ] ]
|
23101 | *
|
23102 | * R.partition(R.contains('s'), { a: 'sss', b: 'ttt', foo: 'bars' });
|
23103 | * // => [ { a: 'sss', foo: 'bars' }, { b: 'ttt' } ]
|
23104 | */
|
23105 | var partition = juxt([filter, reject]);
|
23106 |
|
23107 | /**
|
23108 | * Determines whether a nested path on an object has a specific value, in
|
23109 | * `R.equals` terms. Most likely used to filter a list.
|
23110 | *
|
23111 | * @func
|
23112 | * @memberOf R
|
23113 | * @since v0.7.0
|
23114 | * @category Relation
|
23115 | * @typedefn Idx = String | Int
|
23116 | * @sig [Idx] -> a -> {a} -> Boolean
|
23117 | * @param {Array} path The path of the nested property to use
|
23118 | * @param {*} val The value to compare the nested property with
|
23119 | * @param {Object} obj The object to check the nested property in
|
23120 | * @return {Boolean} `true` if the value equals the nested object property,
|
23121 | * `false` otherwise.
|
23122 | * @example
|
23123 | *
|
23124 | * var user1 = { address: { zipCode: 90210 } };
|
23125 | * var user2 = { address: { zipCode: 55555 } };
|
23126 | * var user3 = { name: 'Bob' };
|
23127 | * var users = [ user1, user2, user3 ];
|
23128 | * var isFamous = R.pathEq(['address', 'zipCode'], 90210);
|
23129 | * R.filter(isFamous, users); //=> [ user1 ]
|
23130 | */
|
23131 | var pathEq = _curry3(function pathEq(_path, val, obj) {
|
23132 | return equals(path(_path, obj), val);
|
23133 | });
|
23134 |
|
23135 | /**
|
23136 | * If the given, non-null object has a value at the given path, returns the
|
23137 | * value at that path. Otherwise returns the provided default value.
|
23138 | *
|
23139 | * @func
|
23140 | * @memberOf R
|
23141 | * @since v0.18.0
|
23142 | * @category Object
|
23143 | * @typedefn Idx = String | Int
|
23144 | * @sig a -> [Idx] -> {a} -> a
|
23145 | * @param {*} d The default value.
|
23146 | * @param {Array} p The path to use.
|
23147 | * @param {Object} obj The object to retrieve the nested property from.
|
23148 | * @return {*} The data at `path` of the supplied object or the default value.
|
23149 | * @example
|
23150 | *
|
23151 | * R.pathOr('N/A', ['a', 'b'], {a: {b: 2}}); //=> 2
|
23152 | * R.pathOr('N/A', ['a', 'b'], {c: {b: 2}}); //=> "N/A"
|
23153 | */
|
23154 | var pathOr = _curry3(function pathOr(d, p, obj) {
|
23155 | return defaultTo(d, path(p, obj));
|
23156 | });
|
23157 |
|
23158 | /**
|
23159 | * Returns `true` if the specified object property at given path satisfies the
|
23160 | * given predicate; `false` otherwise.
|
23161 | *
|
23162 | * @func
|
23163 | * @memberOf R
|
23164 | * @since v0.19.0
|
23165 | * @category Logic
|
23166 | * @typedefn Idx = String | Int
|
23167 | * @sig (a -> Boolean) -> [Idx] -> {a} -> Boolean
|
23168 | * @param {Function} pred
|
23169 | * @param {Array} propPath
|
23170 | * @param {*} obj
|
23171 | * @return {Boolean}
|
23172 | * @see R.propSatisfies, R.path
|
23173 | * @example
|
23174 | *
|
23175 | * R.pathSatisfies(y => y > 0, ['x', 'y'], {x: {y: 2}}); //=> true
|
23176 | */
|
23177 | var pathSatisfies = _curry3(function pathSatisfies(pred, propPath, obj) {
|
23178 | return propPath.length > 0 && pred(path(propPath, obj));
|
23179 | });
|
23180 |
|
23181 | /**
|
23182 | * Returns a partial copy of an object containing only the keys specified. If
|
23183 | * the key does not exist, the property is ignored.
|
23184 | *
|
23185 | * @func
|
23186 | * @memberOf R
|
23187 | * @since v0.1.0
|
23188 | * @category Object
|
23189 | * @sig [k] -> {k: v} -> {k: v}
|
23190 | * @param {Array} names an array of String property names to copy onto a new object
|
23191 | * @param {Object} obj The object to copy from
|
23192 | * @return {Object} A new object with only properties from `names` on it.
|
23193 | * @see R.omit, R.props
|
23194 | * @example
|
23195 | *
|
23196 | * R.pick(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, d: 4}
|
23197 | * R.pick(['a', 'e', 'f'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1}
|
23198 | */
|
23199 | var pick = _curry2(function pick(names, obj) {
|
23200 | var result = {};
|
23201 | var idx = 0;
|
23202 | while (idx < names.length) {
|
23203 | if (names[idx] in obj) {
|
23204 | result[names[idx]] = obj[names[idx]];
|
23205 | }
|
23206 | idx += 1;
|
23207 | }
|
23208 | return result;
|
23209 | });
|
23210 |
|
23211 | /**
|
23212 | * Similar to `pick` except that this one includes a `key: undefined` pair for
|
23213 | * properties that don't exist.
|
23214 | *
|
23215 | * @func
|
23216 | * @memberOf R
|
23217 | * @since v0.1.0
|
23218 | * @category Object
|
23219 | * @sig [k] -> {k: v} -> {k: v}
|
23220 | * @param {Array} names an array of String property names to copy onto a new object
|
23221 | * @param {Object} obj The object to copy from
|
23222 | * @return {Object} A new object with only properties from `names` on it.
|
23223 | * @see R.pick
|
23224 | * @example
|
23225 | *
|
23226 | * R.pickAll(['a', 'd'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, d: 4}
|
23227 | * R.pickAll(['a', 'e', 'f'], {a: 1, b: 2, c: 3, d: 4}); //=> {a: 1, e: undefined, f: undefined}
|
23228 | */
|
23229 | var pickAll = _curry2(function pickAll(names, obj) {
|
23230 | var result = {};
|
23231 | var idx = 0;
|
23232 | var len = names.length;
|
23233 | while (idx < len) {
|
23234 | var name = names[idx];
|
23235 | result[name] = obj[name];
|
23236 | idx += 1;
|
23237 | }
|
23238 | return result;
|
23239 | });
|
23240 |
|
23241 | /**
|
23242 | * Returns a partial copy of an object containing only the keys that satisfy
|
23243 | * the supplied predicate.
|
23244 | *
|
23245 | * @func
|
23246 | * @memberOf R
|
23247 | * @since v0.8.0
|
23248 | * @category Object
|
23249 | * @sig (v, k -> Boolean) -> {k: v} -> {k: v}
|
23250 | * @param {Function} pred A predicate to determine whether or not a key
|
23251 | * should be included on the output object.
|
23252 | * @param {Object} obj The object to copy from
|
23253 | * @return {Object} A new object with only properties that satisfy `pred`
|
23254 | * on it.
|
23255 | * @see R.pick, R.filter
|
23256 | * @example
|
23257 | *
|
23258 | * var isUpperCase = (val, key) => key.toUpperCase() === key;
|
23259 | * R.pickBy(isUpperCase, {a: 1, b: 2, A: 3, B: 4}); //=> {A: 3, B: 4}
|
23260 | */
|
23261 | var pickBy = _curry2(function pickBy(test, obj) {
|
23262 | var result = {};
|
23263 | for (var prop in obj) {
|
23264 | if (test(obj[prop], prop, obj)) {
|
23265 | result[prop] = obj[prop];
|
23266 | }
|
23267 | }
|
23268 | return result;
|
23269 | });
|
23270 |
|
23271 | /**
|
23272 | * Returns the left-to-right Kleisli composition of the provided functions,
|
23273 | * each of which must return a value of a type supported by [`chain`](#chain).
|
23274 | *
|
23275 | * `R.pipeK(f, g, h)` is equivalent to `R.pipe(R.chain(f), R.chain(g), R.chain(h))`.
|
23276 | *
|
23277 | * @func
|
23278 | * @memberOf R
|
23279 | * @since v0.16.0
|
23280 | * @category Function
|
23281 | * @sig Chain m => ((a -> m b), (b -> m c), ..., (y -> m z)) -> (a -> m z)
|
23282 | * @param {...Function}
|
23283 | * @return {Function}
|
23284 | * @see R.composeK
|
23285 | * @example
|
23286 | *
|
23287 | * // parseJson :: String -> Maybe *
|
23288 | * // get :: String -> Object -> Maybe *
|
23289 | *
|
23290 | * // getStateCode :: Maybe String -> Maybe String
|
23291 | * var getStateCode = R.pipeK(
|
23292 | * parseJson,
|
23293 | * get('user'),
|
23294 | * get('address'),
|
23295 | * get('state'),
|
23296 | * R.compose(Maybe.of, R.toUpper)
|
23297 | * );
|
23298 | *
|
23299 | * getStateCode('{"user":{"address":{"state":"ny"}}}');
|
23300 | * //=> Just('NY')
|
23301 | * getStateCode('[Invalid JSON]');
|
23302 | * //=> Nothing()
|
23303 | * @symb R.pipeK(f, g, h)(a) = R.chain(h, R.chain(g, f(a)))
|
23304 | */
|
23305 | var pipeK = function pipeK() {
|
23306 | if (arguments.length === 0) {
|
23307 | throw new Error('pipeK requires at least one argument');
|
23308 | }
|
23309 | return composeK.apply(this, reverse(arguments));
|
23310 | };
|
23311 |
|
23312 | /**
|
23313 | * Returns a new list with the given element at the front, followed by the
|
23314 | * contents of the list.
|
23315 | *
|
23316 | * @func
|
23317 | * @memberOf R
|
23318 | * @since v0.1.0
|
23319 | * @category List
|
23320 | * @sig a -> [a] -> [a]
|
23321 | * @param {*} el The item to add to the head of the output list.
|
23322 | * @param {Array} list The array to add to the tail of the output list.
|
23323 | * @return {Array} A new array.
|
23324 | * @see R.append
|
23325 | * @example
|
23326 | *
|
23327 | * R.prepend('fee', ['fi', 'fo', 'fum']); //=> ['fee', 'fi', 'fo', 'fum']
|
23328 | */
|
23329 | var prepend = _curry2(function prepend(el, list) {
|
23330 | return _concat([el], list);
|
23331 | });
|
23332 |
|
23333 | /**
|
23334 | * Multiplies together all the elements of a list.
|
23335 | *
|
23336 | * @func
|
23337 | * @memberOf R
|
23338 | * @since v0.1.0
|
23339 | * @category Math
|
23340 | * @sig [Number] -> Number
|
23341 | * @param {Array} list An array of numbers
|
23342 | * @return {Number} The product of all the numbers in the list.
|
23343 | * @see R.reduce
|
23344 | * @example
|
23345 | *
|
23346 | * R.product([2,4,6,8,100,1]); //=> 38400
|
23347 | */
|
23348 | var product = reduce(multiply, 1);
|
23349 |
|
23350 | /**
|
23351 | * Accepts a function `fn` and a list of transformer functions and returns a
|
23352 | * new curried function. When the new function is invoked, it calls the
|
23353 | * function `fn` with parameters consisting of the result of calling each
|
23354 | * supplied handler on successive arguments to the new function.
|
23355 | *
|
23356 | * If more arguments are passed to the returned function than transformer
|
23357 | * functions, those arguments are passed directly to `fn` as additional
|
23358 | * parameters. If you expect additional arguments that don't need to be
|
23359 | * transformed, although you can ignore them, it's best to pass an identity
|
23360 | * function so that the new function reports the correct arity.
|
23361 | *
|
23362 | * @func
|
23363 | * @memberOf R
|
23364 | * @since v0.1.0
|
23365 | * @category Function
|
23366 | * @sig (x1 -> x2 -> ... -> z) -> [(a -> x1), (b -> x2), ...] -> (a -> b -> ... -> z)
|
23367 | * @param {Function} fn The function to wrap.
|
23368 | * @param {Array} transformers A list of transformer functions
|
23369 | * @return {Function} The wrapped function.
|
23370 | * @see R.converge
|
23371 | * @example
|
23372 | *
|
23373 | * R.useWith(Math.pow, [R.identity, R.identity])(3, 4); //=> 81
|
23374 | * R.useWith(Math.pow, [R.identity, R.identity])(3)(4); //=> 81
|
23375 | * R.useWith(Math.pow, [R.dec, R.inc])(3, 4); //=> 32
|
23376 | * R.useWith(Math.pow, [R.dec, R.inc])(3)(4); //=> 32
|
23377 | * @symb R.useWith(f, [g, h])(a, b) = f(g(a), h(b))
|
23378 | */
|
23379 | var useWith = _curry2(function useWith(fn, transformers) {
|
23380 | return curryN(transformers.length, function() {
|
23381 | var args = [];
|
23382 | var idx = 0;
|
23383 | while (idx < transformers.length) {
|
23384 | args.push(transformers[idx].call(this, arguments[idx]));
|
23385 | idx += 1;
|
23386 | }
|
23387 | return fn.apply(this, args.concat(Array.prototype.slice.call(arguments, transformers.length)));
|
23388 | });
|
23389 | });
|
23390 |
|
23391 | /**
|
23392 | * Reasonable analog to SQL `select` statement.
|
23393 | *
|
23394 | * @func
|
23395 | * @memberOf R
|
23396 | * @since v0.1.0
|
23397 | * @category Object
|
23398 | * @category Relation
|
23399 | * @sig [k] -> [{k: v}] -> [{k: v}]
|
23400 | * @param {Array} props The property names to project
|
23401 | * @param {Array} objs The objects to query
|
23402 | * @return {Array} An array of objects with just the `props` properties.
|
23403 | * @example
|
23404 | *
|
23405 | * var abby = {name: 'Abby', age: 7, hair: 'blond', grade: 2};
|
23406 | * var fred = {name: 'Fred', age: 12, hair: 'brown', grade: 7};
|
23407 | * var kids = [abby, fred];
|
23408 | * R.project(['name', 'grade'], kids); //=> [{name: 'Abby', grade: 2}, {name: 'Fred', grade: 7}]
|
23409 | */
|
23410 | var project = useWith(_map, [pickAll, identity$1]); // passing `identity` gives correct arity
|
23411 |
|
23412 | /**
|
23413 | * Returns `true` if the specified object property is equal, in `R.equals`
|
23414 | * terms, to the given value; `false` otherwise.
|
23415 | *
|
23416 | * @func
|
23417 | * @memberOf R
|
23418 | * @since v0.1.0
|
23419 | * @category Relation
|
23420 | * @sig String -> a -> Object -> Boolean
|
23421 | * @param {String} name
|
23422 | * @param {*} val
|
23423 | * @param {*} obj
|
23424 | * @return {Boolean}
|
23425 | * @see R.equals, R.propSatisfies
|
23426 | * @example
|
23427 | *
|
23428 | * var abby = {name: 'Abby', age: 7, hair: 'blond'};
|
23429 | * var fred = {name: 'Fred', age: 12, hair: 'brown'};
|
23430 | * var rusty = {name: 'Rusty', age: 10, hair: 'brown'};
|
23431 | * var alois = {name: 'Alois', age: 15, disposition: 'surly'};
|
23432 | * var kids = [abby, fred, rusty, alois];
|
23433 | * var hasBrownHair = R.propEq('hair', 'brown');
|
23434 | * R.filter(hasBrownHair, kids); //=> [fred, rusty]
|
23435 | */
|
23436 | var propEq = _curry3(function propEq(name, val, obj) {
|
23437 | return equals(val, obj[name]);
|
23438 | });
|
23439 |
|
23440 | /**
|
23441 | * Returns `true` if the specified object property is of the given type;
|
23442 | * `false` otherwise.
|
23443 | *
|
23444 | * @func
|
23445 | * @memberOf R
|
23446 | * @since v0.16.0
|
23447 | * @category Type
|
23448 | * @sig Type -> String -> Object -> Boolean
|
23449 | * @param {Function} type
|
23450 | * @param {String} name
|
23451 | * @param {*} obj
|
23452 | * @return {Boolean}
|
23453 | * @see R.is, R.propSatisfies
|
23454 | * @example
|
23455 | *
|
23456 | * R.propIs(Number, 'x', {x: 1, y: 2}); //=> true
|
23457 | * R.propIs(Number, 'x', {x: 'foo'}); //=> false
|
23458 | * R.propIs(Number, 'x', {}); //=> false
|
23459 | */
|
23460 | var propIs = _curry3(function propIs(type, name, obj) {
|
23461 | return is$1(type, obj[name]);
|
23462 | });
|
23463 |
|
23464 | /**
|
23465 | * If the given, non-null object has an own property with the specified name,
|
23466 | * returns the value of that property. Otherwise returns the provided default
|
23467 | * value.
|
23468 | *
|
23469 | * @func
|
23470 | * @memberOf R
|
23471 | * @since v0.6.0
|
23472 | * @category Object
|
23473 | * @sig a -> String -> Object -> a
|
23474 | * @param {*} val The default value.
|
23475 | * @param {String} p The name of the property to return.
|
23476 | * @param {Object} obj The object to query.
|
23477 | * @return {*} The value of given property of the supplied object or the default value.
|
23478 | * @example
|
23479 | *
|
23480 | * var alice = {
|
23481 | * name: 'ALICE',
|
23482 | * age: 101
|
23483 | * };
|
23484 | * var favorite = R.prop('favoriteLibrary');
|
23485 | * var favoriteWithDefault = R.propOr('Ramda', 'favoriteLibrary');
|
23486 | *
|
23487 | * favorite(alice); //=> undefined
|
23488 | * favoriteWithDefault(alice); //=> 'Ramda'
|
23489 | */
|
23490 | var propOr = _curry3(function propOr(val, p, obj) {
|
23491 | return (obj != null && _has(p, obj)) ? obj[p] : val;
|
23492 | });
|
23493 |
|
23494 | /**
|
23495 | * Returns `true` if the specified object property satisfies the given
|
23496 | * predicate; `false` otherwise.
|
23497 | *
|
23498 | * @func
|
23499 | * @memberOf R
|
23500 | * @since v0.16.0
|
23501 | * @category Logic
|
23502 | * @sig (a -> Boolean) -> String -> {String: a} -> Boolean
|
23503 | * @param {Function} pred
|
23504 | * @param {String} name
|
23505 | * @param {*} obj
|
23506 | * @return {Boolean}
|
23507 | * @see R.propEq, R.propIs
|
23508 | * @example
|
23509 | *
|
23510 | * R.propSatisfies(x => x > 0, 'x', {x: 1, y: 2}); //=> true
|
23511 | */
|
23512 | var propSatisfies = _curry3(function propSatisfies(pred, name, obj) {
|
23513 | return pred(obj[name]);
|
23514 | });
|
23515 |
|
23516 | /**
|
23517 | * Acts as multiple `prop`: array of keys in, array of values out. Preserves
|
23518 | * order.
|
23519 | *
|
23520 | * @func
|
23521 | * @memberOf R
|
23522 | * @since v0.1.0
|
23523 | * @category Object
|
23524 | * @sig [k] -> {k: v} -> [v]
|
23525 | * @param {Array} ps The property names to fetch
|
23526 | * @param {Object} obj The object to query
|
23527 | * @return {Array} The corresponding values or partially applied function.
|
23528 | * @example
|
23529 | *
|
23530 | * R.props(['x', 'y'], {x: 1, y: 2}); //=> [1, 2]
|
23531 | * R.props(['c', 'a', 'b'], {b: 2, a: 1}); //=> [undefined, 1, 2]
|
23532 | *
|
23533 | * var fullName = R.compose(R.join(' '), R.props(['first', 'last']));
|
23534 | * fullName({last: 'Bullet-Tooth', age: 33, first: 'Tony'}); //=> 'Tony Bullet-Tooth'
|
23535 | */
|
23536 | var props = _curry2(function props(ps, obj) {
|
23537 | var len = ps.length;
|
23538 | var out = [];
|
23539 | var idx = 0;
|
23540 |
|
23541 | while (idx < len) {
|
23542 | out[idx] = obj[ps[idx]];
|
23543 | idx += 1;
|
23544 | }
|
23545 |
|
23546 | return out;
|
23547 | });
|
23548 |
|
23549 | /**
|
23550 | * Returns a list of numbers from `from` (inclusive) to `to` (exclusive).
|
23551 | *
|
23552 | * @func
|
23553 | * @memberOf R
|
23554 | * @since v0.1.0
|
23555 | * @category List
|
23556 | * @sig Number -> Number -> [Number]
|
23557 | * @param {Number} from The first number in the list.
|
23558 | * @param {Number} to One more than the last number in the list.
|
23559 | * @return {Array} The list of numbers in tthe set `[a, b)`.
|
23560 | * @example
|
23561 | *
|
23562 | * R.range(1, 5); //=> [1, 2, 3, 4]
|
23563 | * R.range(50, 53); //=> [50, 51, 52]
|
23564 | */
|
23565 | var range = _curry2(function range(from, to) {
|
23566 | if (!(_isNumber(from) && _isNumber(to))) {
|
23567 | throw new TypeError('Both arguments to range must be numbers');
|
23568 | }
|
23569 | var result = [];
|
23570 | var n = from;
|
23571 | while (n < to) {
|
23572 | result.push(n);
|
23573 | n += 1;
|
23574 | }
|
23575 | return result;
|
23576 | });
|
23577 |
|
23578 | /**
|
23579 | * Returns a single item by iterating through the list, successively calling
|
23580 | * the iterator function and passing it an accumulator value and the current
|
23581 | * value from the array, and then passing the result to the next call.
|
23582 | *
|
23583 | * Similar to `reduce`, except moves through the input list from the right to
|
23584 | * the left.
|
23585 | *
|
23586 | * The iterator function receives two values: *(value, acc)*, while the arguments'
|
23587 | * order of `reduce`'s iterator function is *(acc, value)*.
|
23588 | *
|
23589 | * Note: `R.reduceRight` does not skip deleted or unassigned indices (sparse
|
23590 | * arrays), unlike the native `Array.prototype.reduce` method. For more details
|
23591 | * on this behavior, see:
|
23592 | * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight#Description
|
23593 | *
|
23594 | * @func
|
23595 | * @memberOf R
|
23596 | * @since v0.1.0
|
23597 | * @category List
|
23598 | * @sig (a, b -> b) -> b -> [a] -> b
|
23599 | * @param {Function} fn The iterator function. Receives two values, the current element from the array
|
23600 | * and the accumulator.
|
23601 | * @param {*} acc The accumulator value.
|
23602 | * @param {Array} list The list to iterate over.
|
23603 | * @return {*} The final, accumulated value.
|
23604 | * @see R.reduce, R.addIndex
|
23605 | * @example
|
23606 | *
|
23607 | * R.reduceRight(R.subtract, 0, [1, 2, 3, 4]) // => (1 - (2 - (3 - (4 - 0)))) = -2
|
23608 | * - -2
|
23609 | * / \ / \
|
23610 | * 1 - 1 3
|
23611 | * / \ / \
|
23612 | * 2 - ==> 2 -1
|
23613 | * / \ / \
|
23614 | * 3 - 3 4
|
23615 | * / \ / \
|
23616 | * 4 0 4 0
|
23617 | *
|
23618 | * @symb R.reduceRight(f, a, [b, c, d]) = f(b, f(c, f(d, a)))
|
23619 | */
|
23620 | var reduceRight = _curry3(function reduceRight(fn, acc, list) {
|
23621 | var idx = list.length - 1;
|
23622 | while (idx >= 0) {
|
23623 | acc = fn(list[idx], acc);
|
23624 | idx -= 1;
|
23625 | }
|
23626 | return acc;
|
23627 | });
|
23628 |
|
23629 | /**
|
23630 | * Like `reduce`, `reduceWhile` returns a single item by iterating through
|
23631 | * the list, successively calling the iterator function. `reduceWhile` also
|
23632 | * takes a predicate that is evaluated before each step. If the predicate returns
|
23633 | * `false`, it "short-circuits" the iteration and returns the current value
|
23634 | * of the accumulator.
|
23635 | *
|
23636 | * @func
|
23637 | * @memberOf R
|
23638 | * @since v0.22.0
|
23639 | * @category List
|
23640 | * @sig ((a, b) -> Boolean) -> ((a, b) -> a) -> a -> [b] -> a
|
23641 | * @param {Function} pred The predicate. It is passed the accumulator and the
|
23642 | * current element.
|
23643 | * @param {Function} fn The iterator function. Receives two values, the
|
23644 | * accumulator and the current element.
|
23645 | * @param {*} a The accumulator value.
|
23646 | * @param {Array} list The list to iterate over.
|
23647 | * @return {*} The final, accumulated value.
|
23648 | * @see R.reduce, R.reduced
|
23649 | * @example
|
23650 | *
|
23651 | * var isOdd = (acc, x) => x % 2 === 1;
|
23652 | * var xs = [1, 3, 5, 60, 777, 800];
|
23653 | * R.reduceWhile(isOdd, R.add, 0, xs); //=> 9
|
23654 | *
|
23655 | * var ys = [2, 4, 6]
|
23656 | * R.reduceWhile(isOdd, R.add, 111, ys); //=> 111
|
23657 | */
|
23658 | var reduceWhile = _curryN(4, [], function _reduceWhile(pred, fn, a, list) {
|
23659 | return _reduce(function(acc, x) {
|
23660 | return pred(acc, x) ? fn(acc, x) : _reduced(acc);
|
23661 | }, a, list);
|
23662 | });
|
23663 |
|
23664 | /**
|
23665 | * Returns a value wrapped to indicate that it is the final value of the reduce
|
23666 | * and transduce functions. The returned value should be considered a black
|
23667 | * box: the internal structure is not guaranteed to be stable.
|
23668 | *
|
23669 | * Note: this optimization is unavailable to functions not explicitly listed
|
23670 | * above. For instance, it is not currently supported by reduceRight.
|
23671 | *
|
23672 | * @func
|
23673 | * @memberOf R
|
23674 | * @since v0.15.0
|
23675 | * @category List
|
23676 | * @sig a -> *
|
23677 | * @param {*} x The final value of the reduce.
|
23678 | * @return {*} The wrapped value.
|
23679 | * @see R.reduce, R.transduce
|
23680 | * @example
|
23681 | *
|
23682 | * R.reduce(
|
23683 | * R.pipe(R.add, R.when(R.gte(R.__, 10), R.reduced)),
|
23684 | * 0,
|
23685 | * [1, 2, 3, 4, 5]) // 10
|
23686 | */
|
23687 |
|
23688 | var reduced = _curry1(_reduced);
|
23689 |
|
23690 | /**
|
23691 | * Removes the sub-list of `list` starting at index `start` and containing
|
23692 | * `count` elements. _Note that this is not destructive_: it returns a copy of
|
23693 | * the list with the changes.
|
23694 | * <small>No lists have been harmed in the application of this function.</small>
|
23695 | *
|
23696 | * @func
|
23697 | * @memberOf R
|
23698 | * @since v0.2.2
|
23699 | * @category List
|
23700 | * @sig Number -> Number -> [a] -> [a]
|
23701 | * @param {Number} start The position to start removing elements
|
23702 | * @param {Number} count The number of elements to remove
|
23703 | * @param {Array} list The list to remove from
|
23704 | * @return {Array} A new Array with `count` elements from `start` removed.
|
23705 | * @example
|
23706 | *
|
23707 | * R.remove(2, 3, [1,2,3,4,5,6,7,8]); //=> [1,2,6,7,8]
|
23708 | */
|
23709 | var remove = _curry3(function remove(start, count, list) {
|
23710 | var result = Array.prototype.slice.call(list, 0);
|
23711 | result.splice(start, count);
|
23712 | return result;
|
23713 | });
|
23714 |
|
23715 | /**
|
23716 | * Calls an input function `n` times, returning an array containing the results
|
23717 | * of those function calls.
|
23718 | *
|
23719 | * `fn` is passed one argument: The current value of `n`, which begins at `0`
|
23720 | * and is gradually incremented to `n - 1`.
|
23721 | *
|
23722 | * @func
|
23723 | * @memberOf R
|
23724 | * @since v0.2.3
|
23725 | * @category List
|
23726 | * @sig (Number -> a) -> Number -> [a]
|
23727 | * @param {Function} fn The function to invoke. Passed one argument, the current value of `n`.
|
23728 | * @param {Number} n A value between `0` and `n - 1`. Increments after each function call.
|
23729 | * @return {Array} An array containing the return values of all calls to `fn`.
|
23730 | * @example
|
23731 | *
|
23732 | * R.times(R.identity, 5); //=> [0, 1, 2, 3, 4]
|
23733 | * @symb R.times(f, 0) = []
|
23734 | * @symb R.times(f, 1) = [f(0)]
|
23735 | * @symb R.times(f, 2) = [f(0), f(1)]
|
23736 | */
|
23737 | var times = _curry2(function times(fn, n) {
|
23738 | var len = Number(n);
|
23739 | var idx = 0;
|
23740 | var list;
|
23741 |
|
23742 | if (len < 0 || isNaN(len)) {
|
23743 | throw new RangeError('n must be a non-negative number');
|
23744 | }
|
23745 | list = new Array(len);
|
23746 | while (idx < len) {
|
23747 | list[idx] = fn(idx);
|
23748 | idx += 1;
|
23749 | }
|
23750 | return list;
|
23751 | });
|
23752 |
|
23753 | /**
|
23754 | * Returns a fixed list of size `n` containing a specified identical value.
|
23755 | *
|
23756 | * @func
|
23757 | * @memberOf R
|
23758 | * @since v0.1.1
|
23759 | * @category List
|
23760 | * @sig a -> n -> [a]
|
23761 | * @param {*} value The value to repeat.
|
23762 | * @param {Number} n The desired size of the output list.
|
23763 | * @return {Array} A new array containing `n` `value`s.
|
23764 | * @example
|
23765 | *
|
23766 | * R.repeat('hi', 5); //=> ['hi', 'hi', 'hi', 'hi', 'hi']
|
23767 | *
|
23768 | * var obj = {};
|
23769 | * var repeatedObjs = R.repeat(obj, 5); //=> [{}, {}, {}, {}, {}]
|
23770 | * repeatedObjs[0] === repeatedObjs[1]; //=> true
|
23771 | * @symb R.repeat(a, 0) = []
|
23772 | * @symb R.repeat(a, 1) = [a]
|
23773 | * @symb R.repeat(a, 2) = [a, a]
|
23774 | */
|
23775 | var repeat = _curry2(function repeat(value, n) {
|
23776 | return times(always(value), n);
|
23777 | });
|
23778 |
|
23779 | /**
|
23780 | * Replace a substring or regex match in a string with a replacement.
|
23781 | *
|
23782 | * @func
|
23783 | * @memberOf R
|
23784 | * @since v0.7.0
|
23785 | * @category String
|
23786 | * @sig RegExp|String -> String -> String -> String
|
23787 | * @param {RegExp|String} pattern A regular expression or a substring to match.
|
23788 | * @param {String} replacement The string to replace the matches with.
|
23789 | * @param {String} str The String to do the search and replacement in.
|
23790 | * @return {String} The result.
|
23791 | * @example
|
23792 | *
|
23793 | * R.replace('foo', 'bar', 'foo foo foo'); //=> 'bar foo foo'
|
23794 | * R.replace(/foo/, 'bar', 'foo foo foo'); //=> 'bar foo foo'
|
23795 | *
|
23796 | * // Use the "g" (global) flag to replace all occurrences:
|
23797 | * R.replace(/foo/g, 'bar', 'foo foo foo'); //=> 'bar bar bar'
|
23798 | */
|
23799 | var replace = _curry3(function replace(regex, replacement, str) {
|
23800 | return str.replace(regex, replacement);
|
23801 | });
|
23802 |
|
23803 | /**
|
23804 | * Scan is similar to reduce, but returns a list of successively reduced values
|
23805 | * from the left
|
23806 | *
|
23807 | * @func
|
23808 | * @memberOf R
|
23809 | * @since v0.10.0
|
23810 | * @category List
|
23811 | * @sig (a,b -> a) -> a -> [b] -> [a]
|
23812 | * @param {Function} fn The iterator function. Receives two values, the accumulator and the
|
23813 | * current element from the array
|
23814 | * @param {*} acc The accumulator value.
|
23815 | * @param {Array} list The list to iterate over.
|
23816 | * @return {Array} A list of all intermediately reduced values.
|
23817 | * @example
|
23818 | *
|
23819 | * var numbers = [1, 2, 3, 4];
|
23820 | * var factorials = R.scan(R.multiply, 1, numbers); //=> [1, 1, 2, 6, 24]
|
23821 | * @symb R.scan(f, a, [b, c]) = [a, f(a, b), f(f(a, b), c)]
|
23822 | */
|
23823 | var scan = _curry3(function scan(fn, acc, list) {
|
23824 | var idx = 0;
|
23825 | var len = list.length;
|
23826 | var result = [acc];
|
23827 | while (idx < len) {
|
23828 | acc = fn(acc, list[idx]);
|
23829 | result[idx + 1] = acc;
|
23830 | idx += 1;
|
23831 | }
|
23832 | return result;
|
23833 | });
|
23834 |
|
23835 | /**
|
23836 | * Transforms a [Traversable](https://github.com/fantasyland/fantasy-land#traversable)
|
23837 | * of [Applicative](https://github.com/fantasyland/fantasy-land#applicative) into an
|
23838 | * Applicative of Traversable.
|
23839 | *
|
23840 | * Dispatches to the `sequence` method of the second argument, if present.
|
23841 | *
|
23842 | * @func
|
23843 | * @memberOf R
|
23844 | * @since v0.19.0
|
23845 | * @category List
|
23846 | * @sig (Applicative f, Traversable t) => (a -> f a) -> t (f a) -> f (t a)
|
23847 | * @param {Function} of
|
23848 | * @param {*} traversable
|
23849 | * @return {*}
|
23850 | * @see R.traverse
|
23851 | * @example
|
23852 | *
|
23853 | * R.sequence(Maybe.of, [Just(1), Just(2), Just(3)]); //=> Just([1, 2, 3])
|
23854 | * R.sequence(Maybe.of, [Just(1), Just(2), Nothing()]); //=> Nothing()
|
23855 | *
|
23856 | * R.sequence(R.of, Just([1, 2, 3])); //=> [Just(1), Just(2), Just(3)]
|
23857 | * R.sequence(R.of, Nothing()); //=> [Nothing()]
|
23858 | */
|
23859 | var sequence = _curry2(function sequence(of, traversable) {
|
23860 | return typeof traversable.sequence === 'function' ?
|
23861 | traversable.sequence(of) :
|
23862 | reduceRight(function(x, acc) { return ap(map$1(prepend, x), acc); },
|
23863 | of([]),
|
23864 | traversable);
|
23865 | });
|
23866 |
|
23867 | /**
|
23868 | * Returns the result of "setting" the portion of the given data structure
|
23869 | * focused by the given lens to the given value.
|
23870 | *
|
23871 | * @func
|
23872 | * @memberOf R
|
23873 | * @since v0.16.0
|
23874 | * @category Object
|
23875 | * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
|
23876 | * @sig Lens s a -> a -> s -> s
|
23877 | * @param {Lens} lens
|
23878 | * @param {*} v
|
23879 | * @param {*} x
|
23880 | * @return {*}
|
23881 | * @see R.prop, R.lensIndex, R.lensProp
|
23882 | * @example
|
23883 | *
|
23884 | * var xLens = R.lensProp('x');
|
23885 | *
|
23886 | * R.set(xLens, 4, {x: 1, y: 2}); //=> {x: 4, y: 2}
|
23887 | * R.set(xLens, 8, {x: 1, y: 2}); //=> {x: 8, y: 2}
|
23888 | */
|
23889 | var set = _curry3(function set(lens, v, x) {
|
23890 | return over(lens, always(v), x);
|
23891 | });
|
23892 |
|
23893 | /**
|
23894 | * Returns a copy of the list, sorted according to the comparator function,
|
23895 | * which should accept two values at a time and return a negative number if the
|
23896 | * first value is smaller, a positive number if it's larger, and zero if they
|
23897 | * are equal. Please note that this is a **copy** of the list. It does not
|
23898 | * modify the original.
|
23899 | *
|
23900 | * @func
|
23901 | * @memberOf R
|
23902 | * @since v0.1.0
|
23903 | * @category List
|
23904 | * @sig (a,a -> Number) -> [a] -> [a]
|
23905 | * @param {Function} comparator A sorting function :: a -> b -> Int
|
23906 | * @param {Array} list The list to sort
|
23907 | * @return {Array} a new array with its elements sorted by the comparator function.
|
23908 | * @example
|
23909 | *
|
23910 | * var diff = function(a, b) { return a - b; };
|
23911 | * R.sort(diff, [4,2,7,5]); //=> [2, 4, 5, 7]
|
23912 | */
|
23913 | var sort = _curry2(function sort(comparator, list) {
|
23914 | return Array.prototype.slice.call(list, 0).sort(comparator);
|
23915 | });
|
23916 |
|
23917 | /**
|
23918 | * Sorts the list according to the supplied function.
|
23919 | *
|
23920 | * @func
|
23921 | * @memberOf R
|
23922 | * @since v0.1.0
|
23923 | * @category Relation
|
23924 | * @sig Ord b => (a -> b) -> [a] -> [a]
|
23925 | * @param {Function} fn
|
23926 | * @param {Array} list The list to sort.
|
23927 | * @return {Array} A new list sorted by the keys generated by `fn`.
|
23928 | * @example
|
23929 | *
|
23930 | * var sortByFirstItem = R.sortBy(R.prop(0));
|
23931 | * var sortByNameCaseInsensitive = R.sortBy(R.compose(R.toLower, R.prop('name')));
|
23932 | * var pairs = [[-1, 1], [-2, 2], [-3, 3]];
|
23933 | * sortByFirstItem(pairs); //=> [[-3, 3], [-2, 2], [-1, 1]]
|
23934 | * var alice = {
|
23935 | * name: 'ALICE',
|
23936 | * age: 101
|
23937 | * };
|
23938 | * var bob = {
|
23939 | * name: 'Bob',
|
23940 | * age: -10
|
23941 | * };
|
23942 | * var clara = {
|
23943 | * name: 'clara',
|
23944 | * age: 314.159
|
23945 | * };
|
23946 | * var people = [clara, bob, alice];
|
23947 | * sortByNameCaseInsensitive(people); //=> [alice, bob, clara]
|
23948 | */
|
23949 | var sortBy = _curry2(function sortBy(fn, list) {
|
23950 | return Array.prototype.slice.call(list, 0).sort(function(a, b) {
|
23951 | var aa = fn(a);
|
23952 | var bb = fn(b);
|
23953 | return aa < bb ? -1 : aa > bb ? 1 : 0;
|
23954 | });
|
23955 | });
|
23956 |
|
23957 | /**
|
23958 | * Sorts a list according to a list of comparators.
|
23959 | *
|
23960 | * @func
|
23961 | * @memberOf R
|
23962 | * @since v0.23.0
|
23963 | * @category Relation
|
23964 | * @sig [a -> a -> Number] -> [a] -> [a]
|
23965 | * @param {Array} functions A list of comparator functions.
|
23966 | * @param {Array} list The list to sort.
|
23967 | * @return {Array} A new list sorted according to the comarator functions.
|
23968 | * @example
|
23969 | *
|
23970 | * var alice = {
|
23971 | * name: 'alice',
|
23972 | * age: 40
|
23973 | * };
|
23974 | * var bob = {
|
23975 | * name: 'bob',
|
23976 | * age: 30
|
23977 | * };
|
23978 | * var clara = {
|
23979 | * name: 'clara',
|
23980 | * age: 40
|
23981 | * };
|
23982 | * var people = [clara, bob, alice];
|
23983 | * var ageNameSort = R.sortWith([
|
23984 | * R.descend(R.prop('age')),
|
23985 | * R.ascend(R.prop('name'))
|
23986 | * ]);
|
23987 | * ageNameSort(people); //=> [alice, clara, bob]
|
23988 | */
|
23989 | var sortWith = _curry2(function sortWith(fns, list) {
|
23990 | return Array.prototype.slice.call(list, 0).sort(function(a, b) {
|
23991 | var result = 0;
|
23992 | var i = 0;
|
23993 | while (result === 0 && i < fns.length) {
|
23994 | result = fns[i](a, b);
|
23995 | i += 1;
|
23996 | }
|
23997 | return result;
|
23998 | });
|
23999 | });
|
24000 |
|
24001 | /**
|
24002 | * Splits a string into an array of strings based on the given
|
24003 | * separator.
|
24004 | *
|
24005 | * @func
|
24006 | * @memberOf R
|
24007 | * @since v0.1.0
|
24008 | * @category String
|
24009 | * @sig (String | RegExp) -> String -> [String]
|
24010 | * @param {String|RegExp} sep The pattern.
|
24011 | * @param {String} str The string to separate into an array.
|
24012 | * @return {Array} The array of strings from `str` separated by `str`.
|
24013 | * @see R.join
|
24014 | * @example
|
24015 | *
|
24016 | * var pathComponents = R.split('/');
|
24017 | * R.tail(pathComponents('/usr/local/bin/node')); //=> ['usr', 'local', 'bin', 'node']
|
24018 | *
|
24019 | * R.split('.', 'a.b.c.xyz.d'); //=> ['a', 'b', 'c', 'xyz', 'd']
|
24020 | */
|
24021 | var split = invoker(1, 'split');
|
24022 |
|
24023 | /**
|
24024 | * Splits a given list or string at a given index.
|
24025 | *
|
24026 | * @func
|
24027 | * @memberOf R
|
24028 | * @since v0.19.0
|
24029 | * @category List
|
24030 | * @sig Number -> [a] -> [[a], [a]]
|
24031 | * @sig Number -> String -> [String, String]
|
24032 | * @param {Number} index The index where the array/string is split.
|
24033 | * @param {Array|String} array The array/string to be split.
|
24034 | * @return {Array}
|
24035 | * @example
|
24036 | *
|
24037 | * R.splitAt(1, [1, 2, 3]); //=> [[1], [2, 3]]
|
24038 | * R.splitAt(5, 'hello world'); //=> ['hello', ' world']
|
24039 | * R.splitAt(-1, 'foobar'); //=> ['fooba', 'r']
|
24040 | */
|
24041 | var splitAt = _curry2(function splitAt(index, array) {
|
24042 | return [slice(0, index, array), slice(index, length(array), array)];
|
24043 | });
|
24044 |
|
24045 | /**
|
24046 | * Splits a collection into slices of the specified length.
|
24047 | *
|
24048 | * @func
|
24049 | * @memberOf R
|
24050 | * @since v0.16.0
|
24051 | * @category List
|
24052 | * @sig Number -> [a] -> [[a]]
|
24053 | * @sig Number -> String -> [String]
|
24054 | * @param {Number} n
|
24055 | * @param {Array} list
|
24056 | * @return {Array}
|
24057 | * @example
|
24058 | *
|
24059 | * R.splitEvery(3, [1, 2, 3, 4, 5, 6, 7]); //=> [[1, 2, 3], [4, 5, 6], [7]]
|
24060 | * R.splitEvery(3, 'foobarbaz'); //=> ['foo', 'bar', 'baz']
|
24061 | */
|
24062 | var splitEvery = _curry2(function splitEvery(n, list) {
|
24063 | if (n <= 0) {
|
24064 | throw new Error('First argument to splitEvery must be a positive integer');
|
24065 | }
|
24066 | var result = [];
|
24067 | var idx = 0;
|
24068 | while (idx < list.length) {
|
24069 | result.push(slice(idx, idx += n, list));
|
24070 | }
|
24071 | return result;
|
24072 | });
|
24073 |
|
24074 | /**
|
24075 | * Takes a list and a predicate and returns a pair of lists with the following properties:
|
24076 | *
|
24077 | * - the result of concatenating the two output lists is equivalent to the input list;
|
24078 | * - none of the elements of the first output list satisfies the predicate; and
|
24079 | * - if the second output list is non-empty, its first element satisfies the predicate.
|
24080 | *
|
24081 | * @func
|
24082 | * @memberOf R
|
24083 | * @since v0.19.0
|
24084 | * @category List
|
24085 | * @sig (a -> Boolean) -> [a] -> [[a], [a]]
|
24086 | * @param {Function} pred The predicate that determines where the array is split.
|
24087 | * @param {Array} list The array to be split.
|
24088 | * @return {Array}
|
24089 | * @example
|
24090 | *
|
24091 | * R.splitWhen(R.equals(2), [1, 2, 3, 1, 2, 3]); //=> [[1], [2, 3, 1, 2, 3]]
|
24092 | */
|
24093 | var splitWhen = _curry2(function splitWhen(pred, list) {
|
24094 | var idx = 0;
|
24095 | var len = list.length;
|
24096 | var prefix = [];
|
24097 |
|
24098 | while (idx < len && !pred(list[idx])) {
|
24099 | prefix.push(list[idx]);
|
24100 | idx += 1;
|
24101 | }
|
24102 |
|
24103 | return [prefix, Array.prototype.slice.call(list, idx)];
|
24104 | });
|
24105 |
|
24106 | /**
|
24107 | * Subtracts its second argument from its first argument.
|
24108 | *
|
24109 | * @func
|
24110 | * @memberOf R
|
24111 | * @since v0.1.0
|
24112 | * @category Math
|
24113 | * @sig Number -> Number -> Number
|
24114 | * @param {Number} a The first value.
|
24115 | * @param {Number} b The second value.
|
24116 | * @return {Number} The result of `a - b`.
|
24117 | * @see R.add
|
24118 | * @example
|
24119 | *
|
24120 | * R.subtract(10, 8); //=> 2
|
24121 | *
|
24122 | * var minus5 = R.subtract(R.__, 5);
|
24123 | * minus5(17); //=> 12
|
24124 | *
|
24125 | * var complementaryAngle = R.subtract(90);
|
24126 | * complementaryAngle(30); //=> 60
|
24127 | * complementaryAngle(72); //=> 18
|
24128 | */
|
24129 | var subtract = _curry2(function subtract(a, b) {
|
24130 | return Number(a) - Number(b);
|
24131 | });
|
24132 |
|
24133 | /**
|
24134 | * Finds the set (i.e. no duplicates) of all elements contained in the first or
|
24135 | * second list, but not both.
|
24136 | *
|
24137 | * @func
|
24138 | * @memberOf R
|
24139 | * @since v0.19.0
|
24140 | * @category Relation
|
24141 | * @sig [*] -> [*] -> [*]
|
24142 | * @param {Array} list1 The first list.
|
24143 | * @param {Array} list2 The second list.
|
24144 | * @return {Array} The elements in `list1` or `list2`, but not both.
|
24145 | * @see R.symmetricDifferenceWith, R.difference, R.differenceWith
|
24146 | * @example
|
24147 | *
|
24148 | * R.symmetricDifference([1,2,3,4], [7,6,5,4,3]); //=> [1,2,7,6,5]
|
24149 | * R.symmetricDifference([7,6,5,4,3], [1,2,3,4]); //=> [7,6,5,1,2]
|
24150 | */
|
24151 | var symmetricDifference = _curry2(function symmetricDifference(list1, list2) {
|
24152 | return concat(difference(list1, list2), difference(list2, list1));
|
24153 | });
|
24154 |
|
24155 | /**
|
24156 | * Finds the set (i.e. no duplicates) of all elements contained in the first or
|
24157 | * second list, but not both. Duplication is determined according to the value
|
24158 | * returned by applying the supplied predicate to two list elements.
|
24159 | *
|
24160 | * @func
|
24161 | * @memberOf R
|
24162 | * @since v0.19.0
|
24163 | * @category Relation
|
24164 | * @sig ((a, a) -> Boolean) -> [a] -> [a] -> [a]
|
24165 | * @param {Function} pred A predicate used to test whether two items are equal.
|
24166 | * @param {Array} list1 The first list.
|
24167 | * @param {Array} list2 The second list.
|
24168 | * @return {Array} The elements in `list1` or `list2`, but not both.
|
24169 | * @see R.symmetricDifference, R.difference, R.differenceWith
|
24170 | * @example
|
24171 | *
|
24172 | * var eqA = R.eqBy(R.prop('a'));
|
24173 | * var l1 = [{a: 1}, {a: 2}, {a: 3}, {a: 4}];
|
24174 | * var l2 = [{a: 3}, {a: 4}, {a: 5}, {a: 6}];
|
24175 | * R.symmetricDifferenceWith(eqA, l1, l2); //=> [{a: 1}, {a: 2}, {a: 5}, {a: 6}]
|
24176 | */
|
24177 | var symmetricDifferenceWith = _curry3(function symmetricDifferenceWith(pred, list1, list2) {
|
24178 | return concat(differenceWith(pred, list1, list2), differenceWith(pred, list2, list1));
|
24179 | });
|
24180 |
|
24181 | /**
|
24182 | * Returns a new list containing the last `n` elements of the given list.
|
24183 | * If `n > list.length`, returns a list of `list.length` elements.
|
24184 | *
|
24185 | * @func
|
24186 | * @memberOf R
|
24187 | * @since v0.16.0
|
24188 | * @category List
|
24189 | * @sig Number -> [a] -> [a]
|
24190 | * @sig Number -> String -> String
|
24191 | * @param {Number} n The number of elements to return.
|
24192 | * @param {Array} xs The collection to consider.
|
24193 | * @return {Array}
|
24194 | * @see R.dropLast
|
24195 | * @example
|
24196 | *
|
24197 | * R.takeLast(1, ['foo', 'bar', 'baz']); //=> ['baz']
|
24198 | * R.takeLast(2, ['foo', 'bar', 'baz']); //=> ['bar', 'baz']
|
24199 | * R.takeLast(3, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz']
|
24200 | * R.takeLast(4, ['foo', 'bar', 'baz']); //=> ['foo', 'bar', 'baz']
|
24201 | * R.takeLast(3, 'ramda'); //=> 'mda'
|
24202 | */
|
24203 | var takeLast = _curry2(function takeLast(n, xs) {
|
24204 | return drop(n >= 0 ? xs.length - n : 0, xs);
|
24205 | });
|
24206 |
|
24207 | /**
|
24208 | * Returns a new list containing the last `n` elements of a given list, passing
|
24209 | * each value to the supplied predicate function, and terminating when the
|
24210 | * predicate function returns `false`. Excludes the element that caused the
|
24211 | * predicate function to fail. The predicate function is passed one argument:
|
24212 | * *(value)*.
|
24213 | *
|
24214 | * @func
|
24215 | * @memberOf R
|
24216 | * @since v0.16.0
|
24217 | * @category List
|
24218 | * @sig (a -> Boolean) -> [a] -> [a]
|
24219 | * @param {Function} fn The function called per iteration.
|
24220 | * @param {Array} list The collection to iterate over.
|
24221 | * @return {Array} A new array.
|
24222 | * @see R.dropLastWhile, R.addIndex
|
24223 | * @example
|
24224 | *
|
24225 | * var isNotOne = x => x !== 1;
|
24226 | *
|
24227 | * R.takeLastWhile(isNotOne, [1, 2, 3, 4]); //=> [2, 3, 4]
|
24228 | */
|
24229 | var takeLastWhile = _curry2(function takeLastWhile(fn, list) {
|
24230 | var idx = list.length - 1;
|
24231 | while (idx >= 0 && fn(list[idx])) {
|
24232 | idx -= 1;
|
24233 | }
|
24234 | return Array.prototype.slice.call(list, idx + 1);
|
24235 | });
|
24236 |
|
24237 | var _xtakeWhile = (function() {
|
24238 | function XTakeWhile(f, xf) {
|
24239 | this.xf = xf;
|
24240 | this.f = f;
|
24241 | }
|
24242 | XTakeWhile.prototype['@@transducer/init'] = _xfBase.init;
|
24243 | XTakeWhile.prototype['@@transducer/result'] = _xfBase.result;
|
24244 | XTakeWhile.prototype['@@transducer/step'] = function(result, input) {
|
24245 | return this.f(input) ? this.xf['@@transducer/step'](result, input) : _reduced(result);
|
24246 | };
|
24247 |
|
24248 | return _curry2(function _xtakeWhile(f, xf) { return new XTakeWhile(f, xf); });
|
24249 | }());
|
24250 |
|
24251 | /**
|
24252 | * Returns a new list containing the first `n` elements of a given list,
|
24253 | * passing each value to the supplied predicate function, and terminating when
|
24254 | * the predicate function returns `false`. Excludes the element that caused the
|
24255 | * predicate function to fail. The predicate function is passed one argument:
|
24256 | * *(value)*.
|
24257 | *
|
24258 | * Dispatches to the `takeWhile` method of the second argument, if present.
|
24259 | *
|
24260 | * Acts as a transducer if a transformer is given in list position.
|
24261 | *
|
24262 | * @func
|
24263 | * @memberOf R
|
24264 | * @since v0.1.0
|
24265 | * @category List
|
24266 | * @sig (a -> Boolean) -> [a] -> [a]
|
24267 | * @param {Function} fn The function called per iteration.
|
24268 | * @param {Array} list The collection to iterate over.
|
24269 | * @return {Array} A new array.
|
24270 | * @see R.dropWhile, R.transduce, R.addIndex
|
24271 | * @example
|
24272 | *
|
24273 | * var isNotFour = x => x !== 4;
|
24274 | *
|
24275 | * R.takeWhile(isNotFour, [1, 2, 3, 4, 3, 2, 1]); //=> [1, 2, 3]
|
24276 | */
|
24277 | var takeWhile = _curry2(_dispatchable(['takeWhile'], _xtakeWhile, function takeWhile(fn, list) {
|
24278 | var idx = 0;
|
24279 | var len = list.length;
|
24280 | while (idx < len && fn(list[idx])) {
|
24281 | idx += 1;
|
24282 | }
|
24283 | return Array.prototype.slice.call(list, 0, idx);
|
24284 | }));
|
24285 |
|
24286 | /**
|
24287 | * Runs the given function with the supplied object, then returns the object.
|
24288 | *
|
24289 | * @func
|
24290 | * @memberOf R
|
24291 | * @since v0.1.0
|
24292 | * @category Function
|
24293 | * @sig (a -> *) -> a -> a
|
24294 | * @param {Function} fn The function to call with `x`. The return value of `fn` will be thrown away.
|
24295 | * @param {*} x
|
24296 | * @return {*} `x`.
|
24297 | * @example
|
24298 | *
|
24299 | * var sayX = x => console.log('x is ' + x);
|
24300 | * R.tap(sayX, 100); //=> 100
|
24301 | * // logs 'x is 100'
|
24302 | * @symb R.tap(f, a) = a
|
24303 | */
|
24304 | var tap = _curry2(function tap(fn, x) {
|
24305 | fn(x);
|
24306 | return x;
|
24307 | });
|
24308 |
|
24309 | var _isRegExp = function _isRegExp(x) {
|
24310 | return Object.prototype.toString.call(x) === '[object RegExp]';
|
24311 | };
|
24312 |
|
24313 | /**
|
24314 | * Determines whether a given string matches a given regular expression.
|
24315 | *
|
24316 | * @func
|
24317 | * @memberOf R
|
24318 | * @since v0.12.0
|
24319 | * @category String
|
24320 | * @sig RegExp -> String -> Boolean
|
24321 | * @param {RegExp} pattern
|
24322 | * @param {String} str
|
24323 | * @return {Boolean}
|
24324 | * @see R.match
|
24325 | * @example
|
24326 | *
|
24327 | * R.test(/^x/, 'xyz'); //=> true
|
24328 | * R.test(/^y/, 'xyz'); //=> false
|
24329 | */
|
24330 | var test = _curry2(function test(pattern, str) {
|
24331 | if (!_isRegExp(pattern)) {
|
24332 | throw new TypeError('‘test’ requires a value of type RegExp as its first argument; received ' + toString_1(pattern));
|
24333 | }
|
24334 | return _cloneRegExp(pattern).test(str);
|
24335 | });
|
24336 |
|
24337 | /**
|
24338 | * The lower case version of a string.
|
24339 | *
|
24340 | * @func
|
24341 | * @memberOf R
|
24342 | * @since v0.9.0
|
24343 | * @category String
|
24344 | * @sig String -> String
|
24345 | * @param {String} str The string to lower case.
|
24346 | * @return {String} The lower case version of `str`.
|
24347 | * @see R.toUpper
|
24348 | * @example
|
24349 | *
|
24350 | * R.toLower('XYZ'); //=> 'xyz'
|
24351 | */
|
24352 | var toLower = invoker(0, 'toLowerCase');
|
24353 |
|
24354 | /**
|
24355 | * Converts an object into an array of key, value arrays. Only the object's
|
24356 | * own properties are used.
|
24357 | * Note that the order of the output array is not guaranteed to be consistent
|
24358 | * across different JS platforms.
|
24359 | *
|
24360 | * @func
|
24361 | * @memberOf R
|
24362 | * @since v0.4.0
|
24363 | * @category Object
|
24364 | * @sig {String: *} -> [[String,*]]
|
24365 | * @param {Object} obj The object to extract from
|
24366 | * @return {Array} An array of key, value arrays from the object's own properties.
|
24367 | * @see R.fromPairs
|
24368 | * @example
|
24369 | *
|
24370 | * R.toPairs({a: 1, b: 2, c: 3}); //=> [['a', 1], ['b', 2], ['c', 3]]
|
24371 | */
|
24372 | var toPairs = _curry1(function toPairs(obj) {
|
24373 | var pairs = [];
|
24374 | for (var prop in obj) {
|
24375 | if (_has(prop, obj)) {
|
24376 | pairs[pairs.length] = [prop, obj[prop]];
|
24377 | }
|
24378 | }
|
24379 | return pairs;
|
24380 | });
|
24381 |
|
24382 | /**
|
24383 | * Converts an object into an array of key, value arrays. The object's own
|
24384 | * properties and prototype properties are used. Note that the order of the
|
24385 | * output array is not guaranteed to be consistent across different JS
|
24386 | * platforms.
|
24387 | *
|
24388 | * @func
|
24389 | * @memberOf R
|
24390 | * @since v0.4.0
|
24391 | * @category Object
|
24392 | * @sig {String: *} -> [[String,*]]
|
24393 | * @param {Object} obj The object to extract from
|
24394 | * @return {Array} An array of key, value arrays from the object's own
|
24395 | * and prototype properties.
|
24396 | * @example
|
24397 | *
|
24398 | * var F = function() { this.x = 'X'; };
|
24399 | * F.prototype.y = 'Y';
|
24400 | * var f = new F();
|
24401 | * R.toPairsIn(f); //=> [['x','X'], ['y','Y']]
|
24402 | */
|
24403 | var toPairsIn = _curry1(function toPairsIn(obj) {
|
24404 | var pairs = [];
|
24405 | for (var prop in obj) {
|
24406 | pairs[pairs.length] = [prop, obj[prop]];
|
24407 | }
|
24408 | return pairs;
|
24409 | });
|
24410 |
|
24411 | /**
|
24412 | * The upper case version of a string.
|
24413 | *
|
24414 | * @func
|
24415 | * @memberOf R
|
24416 | * @since v0.9.0
|
24417 | * @category String
|
24418 | * @sig String -> String
|
24419 | * @param {String} str The string to upper case.
|
24420 | * @return {String} The upper case version of `str`.
|
24421 | * @see R.toLower
|
24422 | * @example
|
24423 | *
|
24424 | * R.toUpper('abc'); //=> 'ABC'
|
24425 | */
|
24426 | var toUpper = invoker(0, 'toUpperCase');
|
24427 |
|
24428 | /**
|
24429 | * Initializes a transducer using supplied iterator function. Returns a single
|
24430 | * item by iterating through the list, successively calling the transformed
|
24431 | * iterator function and passing it an accumulator value and the current value
|
24432 | * from the array, and then passing the result to the next call.
|
24433 | *
|
24434 | * The iterator function receives two values: *(acc, value)*. It will be
|
24435 | * wrapped as a transformer to initialize the transducer. A transformer can be
|
24436 | * passed directly in place of an iterator function. In both cases, iteration
|
24437 | * may be stopped early with the `R.reduced` function.
|
24438 | *
|
24439 | * A transducer is a function that accepts a transformer and returns a
|
24440 | * transformer and can be composed directly.
|
24441 | *
|
24442 | * A transformer is an an object that provides a 2-arity reducing iterator
|
24443 | * function, step, 0-arity initial value function, init, and 1-arity result
|
24444 | * extraction function, result. The step function is used as the iterator
|
24445 | * function in reduce. The result function is used to convert the final
|
24446 | * accumulator into the return type and in most cases is R.identity. The init
|
24447 | * function can be used to provide an initial accumulator, but is ignored by
|
24448 | * transduce.
|
24449 | *
|
24450 | * The iteration is performed with R.reduce after initializing the transducer.
|
24451 | *
|
24452 | * @func
|
24453 | * @memberOf R
|
24454 | * @since v0.12.0
|
24455 | * @category List
|
24456 | * @sig (c -> c) -> (a,b -> a) -> a -> [b] -> a
|
24457 | * @param {Function} xf The transducer function. Receives a transformer and returns a transformer.
|
24458 | * @param {Function} fn The iterator function. Receives two values, the accumulator and the
|
24459 | * current element from the array. Wrapped as transformer, if necessary, and used to
|
24460 | * initialize the transducer
|
24461 | * @param {*} acc The initial accumulator value.
|
24462 | * @param {Array} list The list to iterate over.
|
24463 | * @return {*} The final, accumulated value.
|
24464 | * @see R.reduce, R.reduced, R.into
|
24465 | * @example
|
24466 | *
|
24467 | * var numbers = [1, 2, 3, 4];
|
24468 | * var transducer = R.compose(R.map(R.add(1)), R.take(2));
|
24469 | *
|
24470 | * R.transduce(transducer, R.flip(R.append), [], numbers); //=> [2, 3]
|
24471 | */
|
24472 | var transduce = curryN(4, function transduce(xf, fn, acc, list) {
|
24473 | return _reduce(xf(typeof fn === 'function' ? _xwrap(fn) : fn), acc, list);
|
24474 | });
|
24475 |
|
24476 | /**
|
24477 | * Transposes the rows and columns of a 2D list.
|
24478 | * When passed a list of `n` lists of length `x`,
|
24479 | * returns a list of `x` lists of length `n`.
|
24480 | *
|
24481 | *
|
24482 | * @func
|
24483 | * @memberOf R
|
24484 | * @since v0.19.0
|
24485 | * @category List
|
24486 | * @sig [[a]] -> [[a]]
|
24487 | * @param {Array} list A 2D list
|
24488 | * @return {Array} A 2D list
|
24489 | * @example
|
24490 | *
|
24491 | * R.transpose([[1, 'a'], [2, 'b'], [3, 'c']]) //=> [[1, 2, 3], ['a', 'b', 'c']]
|
24492 | * R.transpose([[1, 2, 3], ['a', 'b', 'c']]) //=> [[1, 'a'], [2, 'b'], [3, 'c']]
|
24493 | *
|
24494 | * If some of the rows are shorter than the following rows, their elements are skipped:
|
24495 | *
|
24496 | * R.transpose([[10, 11], [20], [], [30, 31, 32]]) //=> [[10, 20, 30], [11, 31], [32]]
|
24497 | * @symb R.transpose([[a], [b], [c]]) = [a, b, c]
|
24498 | * @symb R.transpose([[a, b], [c, d]]) = [[a, c], [b, d]]
|
24499 | * @symb R.transpose([[a, b], [c]]) = [[a, c], [b]]
|
24500 | */
|
24501 | var transpose = _curry1(function transpose(outerlist) {
|
24502 | var i = 0;
|
24503 | var result = [];
|
24504 | while (i < outerlist.length) {
|
24505 | var innerlist = outerlist[i];
|
24506 | var j = 0;
|
24507 | while (j < innerlist.length) {
|
24508 | if (typeof result[j] === 'undefined') {
|
24509 | result[j] = [];
|
24510 | }
|
24511 | result[j].push(innerlist[j]);
|
24512 | j += 1;
|
24513 | }
|
24514 | i += 1;
|
24515 | }
|
24516 | return result;
|
24517 | });
|
24518 |
|
24519 | /**
|
24520 | * Maps an [Applicative](https://github.com/fantasyland/fantasy-land#applicative)-returning
|
24521 | * function over a [Traversable](https://github.com/fantasyland/fantasy-land#traversable),
|
24522 | * then uses [`sequence`](#sequence) to transform the resulting Traversable of Applicative
|
24523 | * into an Applicative of Traversable.
|
24524 | *
|
24525 | * Dispatches to the `sequence` method of the third argument, if present.
|
24526 | *
|
24527 | * @func
|
24528 | * @memberOf R
|
24529 | * @since v0.19.0
|
24530 | * @category List
|
24531 | * @sig (Applicative f, Traversable t) => (a -> f a) -> (a -> f b) -> t a -> f (t b)
|
24532 | * @param {Function} of
|
24533 | * @param {Function} f
|
24534 | * @param {*} traversable
|
24535 | * @return {*}
|
24536 | * @see R.sequence
|
24537 | * @example
|
24538 | *
|
24539 | * // Returns `Nothing` if the given divisor is `0`
|
24540 | * safeDiv = n => d => d === 0 ? Nothing() : Just(n / d)
|
24541 | *
|
24542 | * R.traverse(Maybe.of, safeDiv(10), [2, 4, 5]); //=> Just([5, 2.5, 2])
|
24543 | * R.traverse(Maybe.of, safeDiv(10), [2, 0, 5]); //=> Nothing
|
24544 | */
|
24545 | var traverse = _curry3(function traverse(of, f, traversable) {
|
24546 | return sequence(of, map$1(f, traversable));
|
24547 | });
|
24548 |
|
24549 | /**
|
24550 | * Removes (strips) whitespace from both ends of the string.
|
24551 | *
|
24552 | * @func
|
24553 | * @memberOf R
|
24554 | * @since v0.6.0
|
24555 | * @category String
|
24556 | * @sig String -> String
|
24557 | * @param {String} str The string to trim.
|
24558 | * @return {String} Trimmed version of `str`.
|
24559 | * @example
|
24560 | *
|
24561 | * R.trim(' xyz '); //=> 'xyz'
|
24562 | * R.map(R.trim, R.split(',', 'x, y, z')); //=> ['x', 'y', 'z']
|
24563 | */
|
24564 | var trim = (function() {
|
24565 | var ws = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' +
|
24566 | '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028' +
|
24567 | '\u2029\uFEFF';
|
24568 | var zeroWidth = '\u200b';
|
24569 | var hasProtoTrim = (typeof String.prototype.trim === 'function');
|
24570 | if (!hasProtoTrim || (ws.trim() || !zeroWidth.trim())) {
|
24571 | return _curry1(function trim(str) {
|
24572 | var beginRx = new RegExp('^[' + ws + '][' + ws + ']*');
|
24573 | var endRx = new RegExp('[' + ws + '][' + ws + ']*$');
|
24574 | return str.replace(beginRx, '').replace(endRx, '');
|
24575 | });
|
24576 | } else {
|
24577 | return _curry1(function trim(str) {
|
24578 | return str.trim();
|
24579 | });
|
24580 | }
|
24581 | }());
|
24582 |
|
24583 | /**
|
24584 | * `tryCatch` takes two functions, a `tryer` and a `catcher`. The returned
|
24585 | * function evaluates the `tryer`; if it does not throw, it simply returns the
|
24586 | * result. If the `tryer` *does* throw, the returned function evaluates the
|
24587 | * `catcher` function and returns its result. Note that for effective
|
24588 | * composition with this function, both the `tryer` and `catcher` functions
|
24589 | * must return the same type of results.
|
24590 | *
|
24591 | * @func
|
24592 | * @memberOf R
|
24593 | * @since v0.20.0
|
24594 | * @category Function
|
24595 | * @sig (...x -> a) -> ((e, ...x) -> a) -> (...x -> a)
|
24596 | * @param {Function} tryer The function that may throw.
|
24597 | * @param {Function} catcher The function that will be evaluated if `tryer` throws.
|
24598 | * @return {Function} A new function that will catch exceptions and send then to the catcher.
|
24599 | * @example
|
24600 | *
|
24601 | * R.tryCatch(R.prop('x'), R.F)({x: true}); //=> true
|
24602 | * R.tryCatch(R.prop('x'), R.F)(null); //=> false
|
24603 | */
|
24604 | var tryCatch = _curry2(function _tryCatch(tryer, catcher) {
|
24605 | return _arity(tryer.length, function() {
|
24606 | try {
|
24607 | return tryer.apply(this, arguments);
|
24608 | } catch (e) {
|
24609 | return catcher.apply(this, _concat([e], arguments));
|
24610 | }
|
24611 | });
|
24612 | });
|
24613 |
|
24614 | /**
|
24615 | * Takes a function `fn`, which takes a single array argument, and returns a
|
24616 | * function which:
|
24617 | *
|
24618 | * - takes any number of positional arguments;
|
24619 | * - passes these arguments to `fn` as an array; and
|
24620 | * - returns the result.
|
24621 | *
|
24622 | * In other words, R.unapply derives a variadic function from a function which
|
24623 | * takes an array. R.unapply is the inverse of R.apply.
|
24624 | *
|
24625 | * @func
|
24626 | * @memberOf R
|
24627 | * @since v0.8.0
|
24628 | * @category Function
|
24629 | * @sig ([*...] -> a) -> (*... -> a)
|
24630 | * @param {Function} fn
|
24631 | * @return {Function}
|
24632 | * @see R.apply
|
24633 | * @example
|
24634 | *
|
24635 | * R.unapply(JSON.stringify)(1, 2, 3); //=> '[1,2,3]'
|
24636 | * @symb R.unapply(f)(a, b) = f([a, b])
|
24637 | */
|
24638 | var unapply = _curry1(function unapply(fn) {
|
24639 | return function() {
|
24640 | return fn(Array.prototype.slice.call(arguments, 0));
|
24641 | };
|
24642 | });
|
24643 |
|
24644 | /**
|
24645 | * Wraps a function of any arity (including nullary) in a function that accepts
|
24646 | * exactly 1 parameter. Any extraneous parameters will not be passed to the
|
24647 | * supplied function.
|
24648 | *
|
24649 | * @func
|
24650 | * @memberOf R
|
24651 | * @since v0.2.0
|
24652 | * @category Function
|
24653 | * @sig (* -> b) -> (a -> b)
|
24654 | * @param {Function} fn The function to wrap.
|
24655 | * @return {Function} A new function wrapping `fn`. The new function is guaranteed to be of
|
24656 | * arity 1.
|
24657 | * @example
|
24658 | *
|
24659 | * var takesTwoArgs = function(a, b) {
|
24660 | * return [a, b];
|
24661 | * };
|
24662 | * takesTwoArgs.length; //=> 2
|
24663 | * takesTwoArgs(1, 2); //=> [1, 2]
|
24664 | *
|
24665 | * var takesOneArg = R.unary(takesTwoArgs);
|
24666 | * takesOneArg.length; //=> 1
|
24667 | * // Only 1 argument is passed to the wrapped function
|
24668 | * takesOneArg(1, 2); //=> [1, undefined]
|
24669 | * @symb R.unary(f)(a, b, c) = f(a)
|
24670 | */
|
24671 | var unary = _curry1(function unary(fn) {
|
24672 | return nAry(1, fn);
|
24673 | });
|
24674 |
|
24675 | /**
|
24676 | * Returns a function of arity `n` from a (manually) curried function.
|
24677 | *
|
24678 | * @func
|
24679 | * @memberOf R
|
24680 | * @since v0.14.0
|
24681 | * @category Function
|
24682 | * @sig Number -> (a -> b) -> (a -> c)
|
24683 | * @param {Number} length The arity for the returned function.
|
24684 | * @param {Function} fn The function to uncurry.
|
24685 | * @return {Function} A new function.
|
24686 | * @see R.curry
|
24687 | * @example
|
24688 | *
|
24689 | * var addFour = a => b => c => d => a + b + c + d;
|
24690 | *
|
24691 | * var uncurriedAddFour = R.uncurryN(4, addFour);
|
24692 | * uncurriedAddFour(1, 2, 3, 4); //=> 10
|
24693 | */
|
24694 | var uncurryN = _curry2(function uncurryN(depth, fn) {
|
24695 | return curryN(depth, function() {
|
24696 | var currentDepth = 1;
|
24697 | var value = fn;
|
24698 | var idx = 0;
|
24699 | var endIdx;
|
24700 | while (currentDepth <= depth && typeof value === 'function') {
|
24701 | endIdx = currentDepth === depth ? arguments.length : idx + value.length;
|
24702 | value = value.apply(this, Array.prototype.slice.call(arguments, idx, endIdx));
|
24703 | currentDepth += 1;
|
24704 | idx = endIdx;
|
24705 | }
|
24706 | return value;
|
24707 | });
|
24708 | });
|
24709 |
|
24710 | /**
|
24711 | * Builds a list from a seed value. Accepts an iterator function, which returns
|
24712 | * either false to stop iteration or an array of length 2 containing the value
|
24713 | * to add to the resulting list and the seed to be used in the next call to the
|
24714 | * iterator function.
|
24715 | *
|
24716 | * The iterator function receives one argument: *(seed)*.
|
24717 | *
|
24718 | * @func
|
24719 | * @memberOf R
|
24720 | * @since v0.10.0
|
24721 | * @category List
|
24722 | * @sig (a -> [b]) -> * -> [b]
|
24723 | * @param {Function} fn The iterator function. receives one argument, `seed`, and returns
|
24724 | * either false to quit iteration or an array of length two to proceed. The element
|
24725 | * at index 0 of this array will be added to the resulting array, and the element
|
24726 | * at index 1 will be passed to the next call to `fn`.
|
24727 | * @param {*} seed The seed value.
|
24728 | * @return {Array} The final list.
|
24729 | * @example
|
24730 | *
|
24731 | * var f = n => n > 50 ? false : [-n, n + 10];
|
24732 | * R.unfold(f, 10); //=> [-10, -20, -30, -40, -50]
|
24733 | * @symb R.unfold(f, x) = [f(x)[0], f(f(x)[1])[0], f(f(f(x)[1])[1])[0], ...]
|
24734 | */
|
24735 | var unfold = _curry2(function unfold(fn, seed) {
|
24736 | var pair = fn(seed);
|
24737 | var result = [];
|
24738 | while (pair && pair.length) {
|
24739 | result[result.length] = pair[0];
|
24740 | pair = fn(pair[1]);
|
24741 | }
|
24742 | return result;
|
24743 | });
|
24744 |
|
24745 | /**
|
24746 | * Combines two lists into a set (i.e. no duplicates) composed of the elements
|
24747 | * of each list.
|
24748 | *
|
24749 | * @func
|
24750 | * @memberOf R
|
24751 | * @since v0.1.0
|
24752 | * @category Relation
|
24753 | * @sig [*] -> [*] -> [*]
|
24754 | * @param {Array} as The first list.
|
24755 | * @param {Array} bs The second list.
|
24756 | * @return {Array} The first and second lists concatenated, with
|
24757 | * duplicates removed.
|
24758 | * @example
|
24759 | *
|
24760 | * R.union([1, 2, 3], [2, 3, 4]); //=> [1, 2, 3, 4]
|
24761 | */
|
24762 | var union = _curry2(compose(uniq, _concat));
|
24763 |
|
24764 | /**
|
24765 | * Combines two lists into a set (i.e. no duplicates) composed of the elements
|
24766 | * of each list. Duplication is determined according to the value returned by
|
24767 | * applying the supplied predicate to two list elements.
|
24768 | *
|
24769 | * @func
|
24770 | * @memberOf R
|
24771 | * @since v0.1.0
|
24772 | * @category Relation
|
24773 | * @sig (a -> a -> Boolean) -> [*] -> [*] -> [*]
|
24774 | * @param {Function} pred A predicate used to test whether two items are equal.
|
24775 | * @param {Array} list1 The first list.
|
24776 | * @param {Array} list2 The second list.
|
24777 | * @return {Array} The first and second lists concatenated, with
|
24778 | * duplicates removed.
|
24779 | * @see R.union
|
24780 | * @example
|
24781 | *
|
24782 | * var l1 = [{a: 1}, {a: 2}];
|
24783 | * var l2 = [{a: 1}, {a: 4}];
|
24784 | * R.unionWith(R.eqBy(R.prop('a')), l1, l2); //=> [{a: 1}, {a: 2}, {a: 4}]
|
24785 | */
|
24786 | var unionWith = _curry3(function unionWith(pred, list1, list2) {
|
24787 | return uniqWith(pred, _concat(list1, list2));
|
24788 | });
|
24789 |
|
24790 | /**
|
24791 | * Tests the final argument by passing it to the given predicate function. If
|
24792 | * the predicate is not satisfied, the function will return the result of
|
24793 | * calling the `whenFalseFn` function with the same argument. If the predicate
|
24794 | * is satisfied, the argument is returned as is.
|
24795 | *
|
24796 | * @func
|
24797 | * @memberOf R
|
24798 | * @since v0.18.0
|
24799 | * @category Logic
|
24800 | * @sig (a -> Boolean) -> (a -> a) -> a -> a
|
24801 | * @param {Function} pred A predicate function
|
24802 | * @param {Function} whenFalseFn A function to invoke when the `pred` evaluates
|
24803 | * to a falsy value.
|
24804 | * @param {*} x An object to test with the `pred` function and
|
24805 | * pass to `whenFalseFn` if necessary.
|
24806 | * @return {*} Either `x` or the result of applying `x` to `whenFalseFn`.
|
24807 | * @see R.ifElse, R.when
|
24808 | * @example
|
24809 | *
|
24810 | * // coerceArray :: (a|[a]) -> [a]
|
24811 | * var coerceArray = R.unless(R.isArrayLike, R.of);
|
24812 | * coerceArray([1, 2, 3]); //=> [1, 2, 3]
|
24813 | * coerceArray(1); //=> [1]
|
24814 | */
|
24815 | var unless = _curry3(function unless(pred, whenFalseFn, x) {
|
24816 | return pred(x) ? x : whenFalseFn(x);
|
24817 | });
|
24818 |
|
24819 | /**
|
24820 | * Shorthand for `R.chain(R.identity)`, which removes one level of nesting from
|
24821 | * any [Chain](https://github.com/fantasyland/fantasy-land#chain).
|
24822 | *
|
24823 | * @func
|
24824 | * @memberOf R
|
24825 | * @since v0.3.0
|
24826 | * @category List
|
24827 | * @sig Chain c => c (c a) -> c a
|
24828 | * @param {*} list
|
24829 | * @return {*}
|
24830 | * @see R.flatten, R.chain
|
24831 | * @example
|
24832 | *
|
24833 | * R.unnest([1, [2], [[3]]]); //=> [1, 2, [3]]
|
24834 | * R.unnest([[1, 2], [3, 4], [5, 6]]); //=> [1, 2, 3, 4, 5, 6]
|
24835 | */
|
24836 | var unnest = chain(_identity);
|
24837 |
|
24838 | /**
|
24839 | * Takes a predicate, a transformation function, and an initial value,
|
24840 | * and returns a value of the same type as the initial value.
|
24841 | * It does so by applying the transformation until the predicate is satisfied,
|
24842 | * at which point it returns the satisfactory value.
|
24843 | *
|
24844 | * @func
|
24845 | * @memberOf R
|
24846 | * @since v0.20.0
|
24847 | * @category Logic
|
24848 | * @sig (a -> Boolean) -> (a -> a) -> a -> a
|
24849 | * @param {Function} pred A predicate function
|
24850 | * @param {Function} fn The iterator function
|
24851 | * @param {*} init Initial value
|
24852 | * @return {*} Final value that satisfies predicate
|
24853 | * @example
|
24854 | *
|
24855 | * R.until(R.gt(R.__, 100), R.multiply(2))(1) // => 128
|
24856 | */
|
24857 | var until = _curry3(function until(pred, fn, init) {
|
24858 | var val = init;
|
24859 | while (!pred(val)) {
|
24860 | val = fn(val);
|
24861 | }
|
24862 | return val;
|
24863 | });
|
24864 |
|
24865 | /**
|
24866 | * Returns a list of all the properties, including prototype properties, of the
|
24867 | * supplied object.
|
24868 | * Note that the order of the output array is not guaranteed to be consistent
|
24869 | * across different JS platforms.
|
24870 | *
|
24871 | * @func
|
24872 | * @memberOf R
|
24873 | * @since v0.2.0
|
24874 | * @category Object
|
24875 | * @sig {k: v} -> [v]
|
24876 | * @param {Object} obj The object to extract values from
|
24877 | * @return {Array} An array of the values of the object's own and prototype properties.
|
24878 | * @example
|
24879 | *
|
24880 | * var F = function() { this.x = 'X'; };
|
24881 | * F.prototype.y = 'Y';
|
24882 | * var f = new F();
|
24883 | * R.valuesIn(f); //=> ['X', 'Y']
|
24884 | */
|
24885 | var valuesIn = _curry1(function valuesIn(obj) {
|
24886 | var prop;
|
24887 | var vs = [];
|
24888 | for (prop in obj) {
|
24889 | vs[vs.length] = obj[prop];
|
24890 | }
|
24891 | return vs;
|
24892 | });
|
24893 |
|
24894 | /**
|
24895 | * Returns a "view" of the given data structure, determined by the given lens.
|
24896 | * The lens's focus determines which portion of the data structure is visible.
|
24897 | *
|
24898 | * @func
|
24899 | * @memberOf R
|
24900 | * @since v0.16.0
|
24901 | * @category Object
|
24902 | * @typedefn Lens s a = Functor f => (a -> f a) -> s -> f s
|
24903 | * @sig Lens s a -> s -> a
|
24904 | * @param {Lens} lens
|
24905 | * @param {*} x
|
24906 | * @return {*}
|
24907 | * @see R.prop, R.lensIndex, R.lensProp
|
24908 | * @example
|
24909 | *
|
24910 | * var xLens = R.lensProp('x');
|
24911 | *
|
24912 | * R.view(xLens, {x: 1, y: 2}); //=> 1
|
24913 | * R.view(xLens, {x: 4, y: 2}); //=> 4
|
24914 | */
|
24915 | var view = (function() {
|
24916 | // `Const` is a functor that effectively ignores the function given to `map`.
|
24917 | var Const = function(x) {
|
24918 | return {value: x, map: function() { return this; }};
|
24919 | };
|
24920 |
|
24921 | return _curry2(function view(lens, x) {
|
24922 | // Using `Const` effectively ignores the setter function of the `lens`,
|
24923 | // leaving the value returned by the getter function unmodified.
|
24924 | return lens(Const)(x).value;
|
24925 | });
|
24926 | }());
|
24927 |
|
24928 | /**
|
24929 | * Tests the final argument by passing it to the given predicate function. If
|
24930 | * the predicate is satisfied, the function will return the result of calling
|
24931 | * the `whenTrueFn` function with the same argument. If the predicate is not
|
24932 | * satisfied, the argument is returned as is.
|
24933 | *
|
24934 | * @func
|
24935 | * @memberOf R
|
24936 | * @since v0.18.0
|
24937 | * @category Logic
|
24938 | * @sig (a -> Boolean) -> (a -> a) -> a -> a
|
24939 | * @param {Function} pred A predicate function
|
24940 | * @param {Function} whenTrueFn A function to invoke when the `condition`
|
24941 | * evaluates to a truthy value.
|
24942 | * @param {*} x An object to test with the `pred` function and
|
24943 | * pass to `whenTrueFn` if necessary.
|
24944 | * @return {*} Either `x` or the result of applying `x` to `whenTrueFn`.
|
24945 | * @see R.ifElse, R.unless
|
24946 | * @example
|
24947 | *
|
24948 | * // truncate :: String -> String
|
24949 | * var truncate = R.when(
|
24950 | * R.propSatisfies(R.gt(R.__, 10), 'length'),
|
24951 | * R.pipe(R.take(10), R.append('…'), R.join(''))
|
24952 | * );
|
24953 | * truncate('12345'); //=> '12345'
|
24954 | * truncate('0123456789ABC'); //=> '0123456789…'
|
24955 | */
|
24956 | var when = _curry3(function when(pred, whenTrueFn, x) {
|
24957 | return pred(x) ? whenTrueFn(x) : x;
|
24958 | });
|
24959 |
|
24960 | /**
|
24961 | * Takes a spec object and a test object; returns true if the test satisfies
|
24962 | * the spec. Each of the spec's own properties must be a predicate function.
|
24963 | * Each predicate is applied to the value of the corresponding property of the
|
24964 | * test object. `where` returns true if all the predicates return true, false
|
24965 | * otherwise.
|
24966 | *
|
24967 | * `where` is well suited to declaratively expressing constraints for other
|
24968 | * functions such as `filter` and `find`.
|
24969 | *
|
24970 | * @func
|
24971 | * @memberOf R
|
24972 | * @since v0.1.1
|
24973 | * @category Object
|
24974 | * @sig {String: (* -> Boolean)} -> {String: *} -> Boolean
|
24975 | * @param {Object} spec
|
24976 | * @param {Object} testObj
|
24977 | * @return {Boolean}
|
24978 | * @example
|
24979 | *
|
24980 | * // pred :: Object -> Boolean
|
24981 | * var pred = R.where({
|
24982 | * a: R.equals('foo'),
|
24983 | * b: R.complement(R.equals('bar')),
|
24984 | * x: R.gt(__, 10),
|
24985 | * y: R.lt(__, 20)
|
24986 | * });
|
24987 | *
|
24988 | * pred({a: 'foo', b: 'xxx', x: 11, y: 19}); //=> true
|
24989 | * pred({a: 'xxx', b: 'xxx', x: 11, y: 19}); //=> false
|
24990 | * pred({a: 'foo', b: 'bar', x: 11, y: 19}); //=> false
|
24991 | * pred({a: 'foo', b: 'xxx', x: 10, y: 19}); //=> false
|
24992 | * pred({a: 'foo', b: 'xxx', x: 11, y: 20}); //=> false
|
24993 | */
|
24994 | var where = _curry2(function where(spec, testObj) {
|
24995 | for (var prop in spec) {
|
24996 | if (_has(prop, spec) && !spec[prop](testObj[prop])) {
|
24997 | return false;
|
24998 | }
|
24999 | }
|
25000 | return true;
|
25001 | });
|
25002 |
|
25003 | /**
|
25004 | * Takes a spec object and a test object; returns true if the test satisfies
|
25005 | * the spec, false otherwise. An object satisfies the spec if, for each of the
|
25006 | * spec's own properties, accessing that property of the object gives the same
|
25007 | * value (in `R.equals` terms) as accessing that property of the spec.
|
25008 | *
|
25009 | * `whereEq` is a specialization of [`where`](#where).
|
25010 | *
|
25011 | * @func
|
25012 | * @memberOf R
|
25013 | * @since v0.14.0
|
25014 | * @category Object
|
25015 | * @sig {String: *} -> {String: *} -> Boolean
|
25016 | * @param {Object} spec
|
25017 | * @param {Object} testObj
|
25018 | * @return {Boolean}
|
25019 | * @see R.where
|
25020 | * @example
|
25021 | *
|
25022 | * // pred :: Object -> Boolean
|
25023 | * var pred = R.whereEq({a: 1, b: 2});
|
25024 | *
|
25025 | * pred({a: 1}); //=> false
|
25026 | * pred({a: 1, b: 2}); //=> true
|
25027 | * pred({a: 1, b: 2, c: 3}); //=> true
|
25028 | * pred({a: 1, b: 1}); //=> false
|
25029 | */
|
25030 | var whereEq = _curry2(function whereEq(spec, testObj) {
|
25031 | return where(map$1(equals, spec), testObj);
|
25032 | });
|
25033 |
|
25034 | /**
|
25035 | * Returns a new list without values in the first argument.
|
25036 | * `R.equals` is used to determine equality.
|
25037 | *
|
25038 | * Acts as a transducer if a transformer is given in list position.
|
25039 | *
|
25040 | * @func
|
25041 | * @memberOf R
|
25042 | * @since v0.19.0
|
25043 | * @category List
|
25044 | * @sig [a] -> [a] -> [a]
|
25045 | * @param {Array} list1 The values to be removed from `list2`.
|
25046 | * @param {Array} list2 The array to remove values from.
|
25047 | * @return {Array} The new array without values in `list1`.
|
25048 | * @see R.transduce
|
25049 | * @example
|
25050 | *
|
25051 | * R.without([1, 2], [1, 2, 1, 3, 4]); //=> [3, 4]
|
25052 | */
|
25053 | var without = _curry2(function(xs, list) {
|
25054 | return reject(flip(_contains)(xs), list);
|
25055 | });
|
25056 |
|
25057 | /**
|
25058 | * Creates a new list out of the two supplied by creating each possible pair
|
25059 | * from the lists.
|
25060 | *
|
25061 | * @func
|
25062 | * @memberOf R
|
25063 | * @since v0.1.0
|
25064 | * @category List
|
25065 | * @sig [a] -> [b] -> [[a,b]]
|
25066 | * @param {Array} as The first list.
|
25067 | * @param {Array} bs The second list.
|
25068 | * @return {Array} The list made by combining each possible pair from
|
25069 | * `as` and `bs` into pairs (`[a, b]`).
|
25070 | * @example
|
25071 | *
|
25072 | * R.xprod([1, 2], ['a', 'b']); //=> [[1, 'a'], [1, 'b'], [2, 'a'], [2, 'b']]
|
25073 | * @symb R.xprod([a, b], [c, d]) = [[a, c], [a, d], [b, c], [b, d]]
|
25074 | */
|
25075 | var xprod = _curry2(function xprod(a, b) { // = xprodWith(prepend); (takes about 3 times as long...)
|
25076 | var idx = 0;
|
25077 | var ilen = a.length;
|
25078 | var j;
|
25079 | var jlen = b.length;
|
25080 | var result = [];
|
25081 | while (idx < ilen) {
|
25082 | j = 0;
|
25083 | while (j < jlen) {
|
25084 | result[result.length] = [a[idx], b[j]];
|
25085 | j += 1;
|
25086 | }
|
25087 | idx += 1;
|
25088 | }
|
25089 | return result;
|
25090 | });
|
25091 |
|
25092 | /**
|
25093 | * Creates a new list out of the two supplied by pairing up equally-positioned
|
25094 | * items from both lists. The returned list is truncated to the length of the
|
25095 | * shorter of the two input lists.
|
25096 | * Note: `zip` is equivalent to `zipWith(function(a, b) { return [a, b] })`.
|
25097 | *
|
25098 | * @func
|
25099 | * @memberOf R
|
25100 | * @since v0.1.0
|
25101 | * @category List
|
25102 | * @sig [a] -> [b] -> [[a,b]]
|
25103 | * @param {Array} list1 The first array to consider.
|
25104 | * @param {Array} list2 The second array to consider.
|
25105 | * @return {Array} The list made by pairing up same-indexed elements of `list1` and `list2`.
|
25106 | * @example
|
25107 | *
|
25108 | * R.zip([1, 2, 3], ['a', 'b', 'c']); //=> [[1, 'a'], [2, 'b'], [3, 'c']]
|
25109 | * @symb R.zip([a, b, c], [d, e, f]) = [[a, d], [b, e], [c, f]]
|
25110 | */
|
25111 | var zip = _curry2(function zip(a, b) {
|
25112 | var rv = [];
|
25113 | var idx = 0;
|
25114 | var len = Math.min(a.length, b.length);
|
25115 | while (idx < len) {
|
25116 | rv[idx] = [a[idx], b[idx]];
|
25117 | idx += 1;
|
25118 | }
|
25119 | return rv;
|
25120 | });
|
25121 |
|
25122 | /**
|
25123 | * Creates a new object out of a list of keys and a list of values.
|
25124 | * Key/value pairing is truncated to the length of the shorter of the two lists.
|
25125 | * Note: `zipObj` is equivalent to `pipe(zipWith(pair), fromPairs)`.
|
25126 | *
|
25127 | * @func
|
25128 | * @memberOf R
|
25129 | * @since v0.3.0
|
25130 | * @category List
|
25131 | * @sig [String] -> [*] -> {String: *}
|
25132 | * @param {Array} keys The array that will be properties on the output object.
|
25133 | * @param {Array} values The list of values on the output object.
|
25134 | * @return {Object} The object made by pairing up same-indexed elements of `keys` and `values`.
|
25135 | * @example
|
25136 | *
|
25137 | * R.zipObj(['a', 'b', 'c'], [1, 2, 3]); //=> {a: 1, b: 2, c: 3}
|
25138 | */
|
25139 | var zipObj = _curry2(function zipObj(keys, values) {
|
25140 | var idx = 0;
|
25141 | var len = Math.min(keys.length, values.length);
|
25142 | var out = {};
|
25143 | while (idx < len) {
|
25144 | out[keys[idx]] = values[idx];
|
25145 | idx += 1;
|
25146 | }
|
25147 | return out;
|
25148 | });
|
25149 |
|
25150 | /**
|
25151 | * Creates a new list out of the two supplied by applying the function to each
|
25152 | * equally-positioned pair in the lists. The returned list is truncated to the
|
25153 | * length of the shorter of the two input lists.
|
25154 | *
|
25155 | * @function
|
25156 | * @memberOf R
|
25157 | * @since v0.1.0
|
25158 | * @category List
|
25159 | * @sig (a,b -> c) -> [a] -> [b] -> [c]
|
25160 | * @param {Function} fn The function used to combine the two elements into one value.
|
25161 | * @param {Array} list1 The first array to consider.
|
25162 | * @param {Array} list2 The second array to consider.
|
25163 | * @return {Array} The list made by combining same-indexed elements of `list1` and `list2`
|
25164 | * using `fn`.
|
25165 | * @example
|
25166 | *
|
25167 | * var f = (x, y) => {
|
25168 | * // ...
|
25169 | * };
|
25170 | * R.zipWith(f, [1, 2, 3], ['a', 'b', 'c']);
|
25171 | * //=> [f(1, 'a'), f(2, 'b'), f(3, 'c')]
|
25172 | * @symb R.zipWith(fn, [a, b, c], [d, e, f]) = [fn(a, d), fn(b, e), fn(c, f)]
|
25173 | */
|
25174 | var zipWith = _curry3(function zipWith(fn, a, b) {
|
25175 | var rv = [];
|
25176 | var idx = 0;
|
25177 | var len = Math.min(a.length, b.length);
|
25178 | while (idx < len) {
|
25179 | rv[idx] = fn(a[idx], b[idx]);
|
25180 | idx += 1;
|
25181 | }
|
25182 | return rv;
|
25183 | });
|
25184 |
|
25185 | var ramda = {
|
25186 | F: F,
|
25187 | T: T,
|
25188 | __: __,
|
25189 | add: add,
|
25190 | addIndex: addIndex,
|
25191 | adjust: adjust,
|
25192 | all: all,
|
25193 | allPass: allPass,
|
25194 | always: always,
|
25195 | and: and,
|
25196 | any: any,
|
25197 | anyPass: anyPass,
|
25198 | ap: ap,
|
25199 | aperture: aperture,
|
25200 | append: append,
|
25201 | apply: apply,
|
25202 | applySpec: applySpec,
|
25203 | ascend: ascend,
|
25204 | assoc: assoc,
|
25205 | assocPath: assocPath,
|
25206 | binary: binary,
|
25207 | bind: bind,
|
25208 | both: both,
|
25209 | call: call,
|
25210 | chain: chain,
|
25211 | clamp: clamp,
|
25212 | clone: clone,
|
25213 | comparator: comparator,
|
25214 | complement: complement,
|
25215 | compose: compose,
|
25216 | composeK: composeK,
|
25217 | composeP: composeP,
|
25218 | concat: concat,
|
25219 | cond: cond,
|
25220 | construct: construct,
|
25221 | constructN: constructN,
|
25222 | contains: contains,
|
25223 | converge: converge,
|
25224 | countBy: countBy,
|
25225 | curry: curry,
|
25226 | curryN: curryN,
|
25227 | dec: dec,
|
25228 | descend: descend,
|
25229 | defaultTo: defaultTo,
|
25230 | difference: difference,
|
25231 | differenceWith: differenceWith,
|
25232 | dissoc: dissoc,
|
25233 | dissocPath: dissocPath,
|
25234 | divide: divide,
|
25235 | drop: drop,
|
25236 | dropLast: dropLast,
|
25237 | dropLastWhile: dropLastWhile,
|
25238 | dropRepeats: dropRepeats,
|
25239 | dropRepeatsWith: dropRepeatsWith,
|
25240 | dropWhile: dropWhile,
|
25241 | either: either,
|
25242 | empty: empty,
|
25243 | eqBy: eqBy,
|
25244 | eqProps: eqProps,
|
25245 | equals: equals,
|
25246 | evolve: evolve,
|
25247 | filter: filter,
|
25248 | find: find,
|
25249 | findIndex: findIndex,
|
25250 | findLast: findLast,
|
25251 | findLastIndex: findLastIndex,
|
25252 | flatten: flatten,
|
25253 | flip: flip,
|
25254 | forEach: forEach,
|
25255 | forEachObjIndexed: forEachObjIndexed,
|
25256 | fromPairs: fromPairs,
|
25257 | groupBy: groupBy,
|
25258 | groupWith: groupWith,
|
25259 | gt: gt,
|
25260 | gte: gte,
|
25261 | has: has,
|
25262 | hasIn: hasIn,
|
25263 | head: head,
|
25264 | identical: identical,
|
25265 | identity: identity$1,
|
25266 | ifElse: ifElse,
|
25267 | inc: inc,
|
25268 | indexBy: indexBy,
|
25269 | indexOf: indexOf,
|
25270 | init: init,
|
25271 | insert: insert,
|
25272 | insertAll: insertAll,
|
25273 | intersection: intersection,
|
25274 | intersectionWith: intersectionWith,
|
25275 | intersperse: intersperse,
|
25276 | into: into,
|
25277 | invert: invert,
|
25278 | invertObj: invertObj,
|
25279 | invoker: invoker,
|
25280 | is: is$1,
|
25281 | isArrayLike: isArrayLike,
|
25282 | isEmpty: isEmpty,
|
25283 | isNil: isNil,
|
25284 | join: join,
|
25285 | juxt: juxt,
|
25286 | keys: keys,
|
25287 | keysIn: keysIn,
|
25288 | last: last,
|
25289 | lastIndexOf: lastIndexOf,
|
25290 | length: length,
|
25291 | lens: lens,
|
25292 | lensIndex: lensIndex,
|
25293 | lensPath: lensPath,
|
25294 | lensProp: lensProp,
|
25295 | lift: lift,
|
25296 | liftN: liftN,
|
25297 | lt: lt,
|
25298 | lte: lte,
|
25299 | map: map$1,
|
25300 | mapAccum: mapAccum,
|
25301 | mapAccumRight: mapAccumRight,
|
25302 | mapObjIndexed: mapObjIndexed,
|
25303 | match: match,
|
25304 | mathMod: mathMod,
|
25305 | max: max,
|
25306 | maxBy: maxBy,
|
25307 | mean: mean,
|
25308 | median: median,
|
25309 | memoize: memoize,
|
25310 | merge: merge,
|
25311 | mergeAll: mergeAll,
|
25312 | mergeWith: mergeWith,
|
25313 | mergeWithKey: mergeWithKey,
|
25314 | min: min,
|
25315 | minBy: minBy,
|
25316 | modulo: modulo,
|
25317 | multiply: multiply,
|
25318 | nAry: nAry,
|
25319 | negate: negate,
|
25320 | none: none,
|
25321 | not: not,
|
25322 | nth: nth,
|
25323 | nthArg: nthArg,
|
25324 | objOf: objOf,
|
25325 | of: of,
|
25326 | omit: omit,
|
25327 | once: once$1,
|
25328 | or: or,
|
25329 | over: over,
|
25330 | pair: pair,
|
25331 | partial: partial,
|
25332 | partialRight: partialRight,
|
25333 | partition: partition,
|
25334 | path: path,
|
25335 | pathEq: pathEq,
|
25336 | pathOr: pathOr,
|
25337 | pathSatisfies: pathSatisfies,
|
25338 | pick: pick,
|
25339 | pickAll: pickAll,
|
25340 | pickBy: pickBy,
|
25341 | pipe: pipe,
|
25342 | pipeK: pipeK,
|
25343 | pipeP: pipeP,
|
25344 | pluck: pluck,
|
25345 | prepend: prepend,
|
25346 | product: product,
|
25347 | project: project,
|
25348 | prop: prop,
|
25349 | propEq: propEq,
|
25350 | propIs: propIs,
|
25351 | propOr: propOr,
|
25352 | propSatisfies: propSatisfies,
|
25353 | props: props,
|
25354 | range: range,
|
25355 | reduce: reduce,
|
25356 | reduceBy: reduceBy,
|
25357 | reduceRight: reduceRight,
|
25358 | reduceWhile: reduceWhile,
|
25359 | reduced: reduced,
|
25360 | reject: reject,
|
25361 | remove: remove,
|
25362 | repeat: repeat,
|
25363 | replace: replace,
|
25364 | reverse: reverse,
|
25365 | scan: scan,
|
25366 | sequence: sequence,
|
25367 | set: set,
|
25368 | slice: slice,
|
25369 | sort: sort,
|
25370 | sortBy: sortBy,
|
25371 | sortWith: sortWith,
|
25372 | split: split,
|
25373 | splitAt: splitAt,
|
25374 | splitEvery: splitEvery,
|
25375 | splitWhen: splitWhen,
|
25376 | subtract: subtract,
|
25377 | sum: sum,
|
25378 | symmetricDifference: symmetricDifference,
|
25379 | symmetricDifferenceWith: symmetricDifferenceWith,
|
25380 | tail: tail,
|
25381 | take: take,
|
25382 | takeLast: takeLast,
|
25383 | takeLastWhile: takeLastWhile,
|
25384 | takeWhile: takeWhile,
|
25385 | tap: tap,
|
25386 | test: test,
|
25387 | times: times,
|
25388 | toLower: toLower,
|
25389 | toPairs: toPairs,
|
25390 | toPairsIn: toPairsIn,
|
25391 | toString: toString_1,
|
25392 | toUpper: toUpper,
|
25393 | transduce: transduce,
|
25394 | transpose: transpose,
|
25395 | traverse: traverse,
|
25396 | trim: trim,
|
25397 | tryCatch: tryCatch,
|
25398 | type: type,
|
25399 | unapply: unapply,
|
25400 | unary: unary,
|
25401 | uncurryN: uncurryN,
|
25402 | unfold: unfold,
|
25403 | union: union,
|
25404 | unionWith: unionWith,
|
25405 | uniq: uniq,
|
25406 | uniqBy: uniqBy,
|
25407 | uniqWith: uniqWith,
|
25408 | unless: unless,
|
25409 | unnest: unnest,
|
25410 | until: until,
|
25411 | update: update,
|
25412 | useWith: useWith,
|
25413 | values: values,
|
25414 | valuesIn: valuesIn,
|
25415 | view: view,
|
25416 | when: when,
|
25417 | where: where,
|
25418 | whereEq: whereEq,
|
25419 | without: without,
|
25420 | xprod: xprod,
|
25421 | zip: zip,
|
25422 | zipObj: zipObj,
|
25423 | zipWith: zipWith
|
25424 | };
|
25425 |
|
25426 | var lookup = [];
|
25427 | var revLookup = [];
|
25428 | var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array;
|
25429 | var inited = false;
|
25430 | function init$2 () {
|
25431 | inited = true;
|
25432 | var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
25433 | for (var i = 0, len = code.length; i < len; ++i) {
|
25434 | lookup[i] = code[i];
|
25435 | revLookup[code.charCodeAt(i)] = i;
|
25436 | }
|
25437 |
|
25438 | revLookup['-'.charCodeAt(0)] = 62;
|
25439 | revLookup['_'.charCodeAt(0)] = 63;
|
25440 | }
|
25441 |
|
25442 | function toByteArray (b64) {
|
25443 | if (!inited) {
|
25444 | init$2();
|
25445 | }
|
25446 | var i, j, l, tmp, placeHolders, arr;
|
25447 | var len = b64.length;
|
25448 |
|
25449 | if (len % 4 > 0) {
|
25450 | throw new Error('Invalid string. Length must be a multiple of 4')
|
25451 | }
|
25452 |
|
25453 | // the number of equal signs (place holders)
|
25454 | // if there are two placeholders, than the two characters before it
|
25455 | // represent one byte
|
25456 | // if there is only one, then the three characters before it represent 2 bytes
|
25457 | // this is just a cheap hack to not do indexOf twice
|
25458 | placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0;
|
25459 |
|
25460 | // base64 is 4/3 + up to two characters of the original data
|
25461 | arr = new Arr(len * 3 / 4 - placeHolders);
|
25462 |
|
25463 | // if there are placeholders, only get up to the last complete 4 chars
|
25464 | l = placeHolders > 0 ? len - 4 : len;
|
25465 |
|
25466 | var L = 0;
|
25467 |
|
25468 | for (i = 0, j = 0; i < l; i += 4, j += 3) {
|
25469 | tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)];
|
25470 | arr[L++] = (tmp >> 16) & 0xFF;
|
25471 | arr[L++] = (tmp >> 8) & 0xFF;
|
25472 | arr[L++] = tmp & 0xFF;
|
25473 | }
|
25474 |
|
25475 | if (placeHolders === 2) {
|
25476 | tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4);
|
25477 | arr[L++] = tmp & 0xFF;
|
25478 | } else if (placeHolders === 1) {
|
25479 | tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2);
|
25480 | arr[L++] = (tmp >> 8) & 0xFF;
|
25481 | arr[L++] = tmp & 0xFF;
|
25482 | }
|
25483 |
|
25484 | return arr
|
25485 | }
|
25486 |
|
25487 | function tripletToBase64 (num) {
|
25488 | return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
|
25489 | }
|
25490 |
|
25491 | function encodeChunk (uint8, start, end) {
|
25492 | var tmp;
|
25493 | var output = [];
|
25494 | for (var i = start; i < end; i += 3) {
|
25495 | tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]);
|
25496 | output.push(tripletToBase64(tmp));
|
25497 | }
|
25498 | return output.join('')
|
25499 | }
|
25500 |
|
25501 | function fromByteArray (uint8) {
|
25502 | if (!inited) {
|
25503 | init$2();
|
25504 | }
|
25505 | var tmp;
|
25506 | var len = uint8.length;
|
25507 | var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes
|
25508 | var output = '';
|
25509 | var parts = [];
|
25510 | var maxChunkLength = 16383; // must be multiple of 3
|
25511 |
|
25512 | // go through the array every three bytes, we'll deal with trailing stuff later
|
25513 | for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
|
25514 | parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)));
|
25515 | }
|
25516 |
|
25517 | // pad the end with zeros, but make sure to not forget the extra bytes
|
25518 | if (extraBytes === 1) {
|
25519 | tmp = uint8[len - 1];
|
25520 | output += lookup[tmp >> 2];
|
25521 | output += lookup[(tmp << 4) & 0x3F];
|
25522 | output += '==';
|
25523 | } else if (extraBytes === 2) {
|
25524 | tmp = (uint8[len - 2] << 8) + (uint8[len - 1]);
|
25525 | output += lookup[tmp >> 10];
|
25526 | output += lookup[(tmp >> 4) & 0x3F];
|
25527 | output += lookup[(tmp << 2) & 0x3F];
|
25528 | output += '=';
|
25529 | }
|
25530 |
|
25531 | parts.push(output);
|
25532 |
|
25533 | return parts.join('')
|
25534 | }
|
25535 |
|
25536 | function read (buffer, offset, isLE, mLen, nBytes) {
|
25537 | var e, m;
|
25538 | var eLen = nBytes * 8 - mLen - 1;
|
25539 | var eMax = (1 << eLen) - 1;
|
25540 | var eBias = eMax >> 1;
|
25541 | var nBits = -7;
|
25542 | var i = isLE ? (nBytes - 1) : 0;
|
25543 | var d = isLE ? -1 : 1;
|
25544 | var s = buffer[offset + i];
|
25545 |
|
25546 | i += d;
|
25547 |
|
25548 | e = s & ((1 << (-nBits)) - 1);
|
25549 | s >>= (-nBits);
|
25550 | nBits += eLen;
|
25551 | for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
|
25552 |
|
25553 | m = e & ((1 << (-nBits)) - 1);
|
25554 | e >>= (-nBits);
|
25555 | nBits += mLen;
|
25556 | for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
|
25557 |
|
25558 | if (e === 0) {
|
25559 | e = 1 - eBias;
|
25560 | } else if (e === eMax) {
|
25561 | return m ? NaN : ((s ? -1 : 1) * Infinity)
|
25562 | } else {
|
25563 | m = m + Math.pow(2, mLen);
|
25564 | e = e - eBias;
|
25565 | }
|
25566 | return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
|
25567 | }
|
25568 |
|
25569 | function write (buffer, value, offset, isLE, mLen, nBytes) {
|
25570 | var e, m, c;
|
25571 | var eLen = nBytes * 8 - mLen - 1;
|
25572 | var eMax = (1 << eLen) - 1;
|
25573 | var eBias = eMax >> 1;
|
25574 | var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);
|
25575 | var i = isLE ? 0 : (nBytes - 1);
|
25576 | var d = isLE ? 1 : -1;
|
25577 | var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
|
25578 |
|
25579 | value = Math.abs(value);
|
25580 |
|
25581 | if (isNaN(value) || value === Infinity) {
|
25582 | m = isNaN(value) ? 1 : 0;
|
25583 | e = eMax;
|
25584 | } else {
|
25585 | e = Math.floor(Math.log(value) / Math.LN2);
|
25586 | if (value * (c = Math.pow(2, -e)) < 1) {
|
25587 | e--;
|
25588 | c *= 2;
|
25589 | }
|
25590 | if (e + eBias >= 1) {
|
25591 | value += rt / c;
|
25592 | } else {
|
25593 | value += rt * Math.pow(2, 1 - eBias);
|
25594 | }
|
25595 | if (value * c >= 2) {
|
25596 | e++;
|
25597 | c /= 2;
|
25598 | }
|
25599 |
|
25600 | if (e + eBias >= eMax) {
|
25601 | m = 0;
|
25602 | e = eMax;
|
25603 | } else if (e + eBias >= 1) {
|
25604 | m = (value * c - 1) * Math.pow(2, mLen);
|
25605 | e = e + eBias;
|
25606 | } else {
|
25607 | m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
|
25608 | e = 0;
|
25609 | }
|
25610 | }
|
25611 |
|
25612 | for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
|
25613 |
|
25614 | e = (e << mLen) | m;
|
25615 | eLen += mLen;
|
25616 | for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
|
25617 |
|
25618 | buffer[offset + i - d] |= s * 128;
|
25619 | }
|
25620 |
|
25621 | var toString$2 = {}.toString;
|
25622 |
|
25623 | var isArray = Array.isArray || function (arr) {
|
25624 | return toString$2.call(arr) == '[object Array]';
|
25625 | };
|
25626 |
|
25627 | /*!
|
25628 | * The buffer module from node.js, for the browser.
|
25629 | *
|
25630 | * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
|
25631 | * @license MIT
|
25632 | */
|
25633 | /* eslint-disable no-proto */
|
25634 |
|
25635 |
|
25636 | var INSPECT_MAX_BYTES = 50;
|
25637 |
|
25638 | /**
|
25639 | * If `Buffer.TYPED_ARRAY_SUPPORT`:
|
25640 | * === true Use Uint8Array implementation (fastest)
|
25641 | * === false Use Object implementation (most compatible, even IE6)
|
25642 | *
|
25643 | * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
|
25644 | * Opera 11.6+, iOS 4.2+.
|
25645 | *
|
25646 | * Due to various browser bugs, sometimes the Object implementation will be used even
|
25647 | * when the browser supports typed arrays.
|
25648 | *
|
25649 | * Note:
|
25650 | *
|
25651 | * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
|
25652 | * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
|
25653 | *
|
25654 | * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
|
25655 | *
|
25656 | * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
|
25657 | * incorrect length in some situations.
|
25658 |
|
25659 | * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
|
25660 | * get the Object implementation, which is slower but behaves correctly.
|
25661 | */
|
25662 | Buffer.TYPED_ARRAY_SUPPORT = global$1.TYPED_ARRAY_SUPPORT !== undefined
|
25663 | ? global$1.TYPED_ARRAY_SUPPORT
|
25664 | : true;
|
25665 |
|
25666 | function kMaxLength () {
|
25667 | return Buffer.TYPED_ARRAY_SUPPORT
|
25668 | ? 0x7fffffff
|
25669 | : 0x3fffffff
|
25670 | }
|
25671 |
|
25672 | function createBuffer (that, length) {
|
25673 | if (kMaxLength() < length) {
|
25674 | throw new RangeError('Invalid typed array length')
|
25675 | }
|
25676 | if (Buffer.TYPED_ARRAY_SUPPORT) {
|
25677 | // Return an augmented `Uint8Array` instance, for best performance
|
25678 | that = new Uint8Array(length);
|
25679 | that.__proto__ = Buffer.prototype;
|
25680 | } else {
|
25681 | // Fallback: Return an object instance of the Buffer class
|
25682 | if (that === null) {
|
25683 | that = new Buffer(length);
|
25684 | }
|
25685 | that.length = length;
|
25686 | }
|
25687 |
|
25688 | return that
|
25689 | }
|
25690 |
|
25691 | /**
|
25692 | * The Buffer constructor returns instances of `Uint8Array` that have their
|
25693 | * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
|
25694 | * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
|
25695 | * and the `Uint8Array` methods. Square bracket notation works as expected -- it
|
25696 | * returns a single octet.
|
25697 | *
|
25698 | * The `Uint8Array` prototype remains unmodified.
|
25699 | */
|
25700 |
|
25701 | function Buffer (arg, encodingOrOffset, length) {
|
25702 | if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {
|
25703 | return new Buffer(arg, encodingOrOffset, length)
|
25704 | }
|
25705 |
|
25706 | // Common case.
|
25707 | if (typeof arg === 'number') {
|
25708 | if (typeof encodingOrOffset === 'string') {
|
25709 | throw new Error(
|
25710 | 'If encoding is specified then the first argument must be a string'
|
25711 | )
|
25712 | }
|
25713 | return allocUnsafe(this, arg)
|
25714 | }
|
25715 | return from(this, arg, encodingOrOffset, length)
|
25716 | }
|
25717 |
|
25718 | Buffer.poolSize = 8192; // not used by this implementation
|
25719 |
|
25720 | // TODO: Legacy, not needed anymore. Remove in next major version.
|
25721 | Buffer._augment = function (arr) {
|
25722 | arr.__proto__ = Buffer.prototype;
|
25723 | return arr
|
25724 | };
|
25725 |
|
25726 | function from (that, value, encodingOrOffset, length) {
|
25727 | if (typeof value === 'number') {
|
25728 | throw new TypeError('"value" argument must not be a number')
|
25729 | }
|
25730 |
|
25731 | if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
|
25732 | return fromArrayBuffer(that, value, encodingOrOffset, length)
|
25733 | }
|
25734 |
|
25735 | if (typeof value === 'string') {
|
25736 | return fromString(that, value, encodingOrOffset)
|
25737 | }
|
25738 |
|
25739 | return fromObject(that, value)
|
25740 | }
|
25741 |
|
25742 | /**
|
25743 | * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
|
25744 | * if value is a number.
|
25745 | * Buffer.from(str[, encoding])
|
25746 | * Buffer.from(array)
|
25747 | * Buffer.from(buffer)
|
25748 | * Buffer.from(arrayBuffer[, byteOffset[, length]])
|
25749 | **/
|
25750 | Buffer.from = function (value, encodingOrOffset, length) {
|
25751 | return from(null, value, encodingOrOffset, length)
|
25752 | };
|
25753 |
|
25754 | if (Buffer.TYPED_ARRAY_SUPPORT) {
|
25755 | Buffer.prototype.__proto__ = Uint8Array.prototype;
|
25756 | Buffer.__proto__ = Uint8Array;
|
25757 | if (typeof Symbol !== 'undefined' && Symbol.species &&
|
25758 | Buffer[Symbol.species] === Buffer) {
|
25759 | // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
|
25760 | // Object.defineProperty(Buffer, Symbol.species, {
|
25761 | // value: null,
|
25762 | // configurable: true
|
25763 | // })
|
25764 | }
|
25765 | }
|
25766 |
|
25767 | function assertSize (size) {
|
25768 | if (typeof size !== 'number') {
|
25769 | throw new TypeError('"size" argument must be a number')
|
25770 | } else if (size < 0) {
|
25771 | throw new RangeError('"size" argument must not be negative')
|
25772 | }
|
25773 | }
|
25774 |
|
25775 | function alloc (that, size, fill, encoding) {
|
25776 | assertSize(size);
|
25777 | if (size <= 0) {
|
25778 | return createBuffer(that, size)
|
25779 | }
|
25780 | if (fill !== undefined) {
|
25781 | // Only pay attention to encoding if it's a string. This
|
25782 | // prevents accidentally sending in a number that would
|
25783 | // be interpretted as a start offset.
|
25784 | return typeof encoding === 'string'
|
25785 | ? createBuffer(that, size).fill(fill, encoding)
|
25786 | : createBuffer(that, size).fill(fill)
|
25787 | }
|
25788 | return createBuffer(that, size)
|
25789 | }
|
25790 |
|
25791 | /**
|
25792 | * Creates a new filled Buffer instance.
|
25793 | * alloc(size[, fill[, encoding]])
|
25794 | **/
|
25795 | Buffer.alloc = function (size, fill, encoding) {
|
25796 | return alloc(null, size, fill, encoding)
|
25797 | };
|
25798 |
|
25799 | function allocUnsafe (that, size) {
|
25800 | assertSize(size);
|
25801 | that = createBuffer(that, size < 0 ? 0 : checked(size) | 0);
|
25802 | if (!Buffer.TYPED_ARRAY_SUPPORT) {
|
25803 | for (var i = 0; i < size; ++i) {
|
25804 | that[i] = 0;
|
25805 | }
|
25806 | }
|
25807 | return that
|
25808 | }
|
25809 |
|
25810 | /**
|
25811 | * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
|
25812 | * */
|
25813 | Buffer.allocUnsafe = function (size) {
|
25814 | return allocUnsafe(null, size)
|
25815 | };
|
25816 | /**
|
25817 | * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
|
25818 | */
|
25819 | Buffer.allocUnsafeSlow = function (size) {
|
25820 | return allocUnsafe(null, size)
|
25821 | };
|
25822 |
|
25823 | function fromString (that, string, encoding) {
|
25824 | if (typeof encoding !== 'string' || encoding === '') {
|
25825 | encoding = 'utf8';
|
25826 | }
|
25827 |
|
25828 | if (!Buffer.isEncoding(encoding)) {
|
25829 | throw new TypeError('"encoding" must be a valid string encoding')
|
25830 | }
|
25831 |
|
25832 | var length = byteLength(string, encoding) | 0;
|
25833 | that = createBuffer(that, length);
|
25834 |
|
25835 | var actual = that.write(string, encoding);
|
25836 |
|
25837 | if (actual !== length) {
|
25838 | // Writing a hex string, for example, that contains invalid characters will
|
25839 | // cause everything after the first invalid character to be ignored. (e.g.
|
25840 | // 'abxxcd' will be treated as 'ab')
|
25841 | that = that.slice(0, actual);
|
25842 | }
|
25843 |
|
25844 | return that
|
25845 | }
|
25846 |
|
25847 | function fromArrayLike (that, array) {
|
25848 | var length = array.length < 0 ? 0 : checked(array.length) | 0;
|
25849 | that = createBuffer(that, length);
|
25850 | for (var i = 0; i < length; i += 1) {
|
25851 | that[i] = array[i] & 255;
|
25852 | }
|
25853 | return that
|
25854 | }
|
25855 |
|
25856 | function fromArrayBuffer (that, array, byteOffset, length) {
|
25857 | array.byteLength; // this throws if `array` is not a valid ArrayBuffer
|
25858 |
|
25859 | if (byteOffset < 0 || array.byteLength < byteOffset) {
|
25860 | throw new RangeError('\'offset\' is out of bounds')
|
25861 | }
|
25862 |
|
25863 | if (array.byteLength < byteOffset + (length || 0)) {
|
25864 | throw new RangeError('\'length\' is out of bounds')
|
25865 | }
|
25866 |
|
25867 | if (byteOffset === undefined && length === undefined) {
|
25868 | array = new Uint8Array(array);
|
25869 | } else if (length === undefined) {
|
25870 | array = new Uint8Array(array, byteOffset);
|
25871 | } else {
|
25872 | array = new Uint8Array(array, byteOffset, length);
|
25873 | }
|
25874 |
|
25875 | if (Buffer.TYPED_ARRAY_SUPPORT) {
|
25876 | // Return an augmented `Uint8Array` instance, for best performance
|
25877 | that = array;
|
25878 | that.__proto__ = Buffer.prototype;
|
25879 | } else {
|
25880 | // Fallback: Return an object instance of the Buffer class
|
25881 | that = fromArrayLike(that, array);
|
25882 | }
|
25883 | return that
|
25884 | }
|
25885 |
|
25886 | function fromObject (that, obj) {
|
25887 | if (internalIsBuffer(obj)) {
|
25888 | var len = checked(obj.length) | 0;
|
25889 | that = createBuffer(that, len);
|
25890 |
|
25891 | if (that.length === 0) {
|
25892 | return that
|
25893 | }
|
25894 |
|
25895 | obj.copy(that, 0, 0, len);
|
25896 | return that
|
25897 | }
|
25898 |
|
25899 | if (obj) {
|
25900 | if ((typeof ArrayBuffer !== 'undefined' &&
|
25901 | obj.buffer instanceof ArrayBuffer) || 'length' in obj) {
|
25902 | if (typeof obj.length !== 'number' || isnan(obj.length)) {
|
25903 | return createBuffer(that, 0)
|
25904 | }
|
25905 | return fromArrayLike(that, obj)
|
25906 | }
|
25907 |
|
25908 | if (obj.type === 'Buffer' && isArray(obj.data)) {
|
25909 | return fromArrayLike(that, obj.data)
|
25910 | }
|
25911 | }
|
25912 |
|
25913 | throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')
|
25914 | }
|
25915 |
|
25916 | function checked (length) {
|
25917 | // Note: cannot use `length < kMaxLength()` here because that fails when
|
25918 | // length is NaN (which is otherwise coerced to zero.)
|
25919 | if (length >= kMaxLength()) {
|
25920 | throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
|
25921 | 'size: 0x' + kMaxLength().toString(16) + ' bytes')
|
25922 | }
|
25923 | return length | 0
|
25924 | }
|
25925 |
|
25926 |
|
25927 | Buffer.isBuffer = isBuffer;
|
25928 | function internalIsBuffer (b) {
|
25929 | return !!(b != null && b._isBuffer)
|
25930 | }
|
25931 |
|
25932 | Buffer.compare = function compare (a, b) {
|
25933 | if (!internalIsBuffer(a) || !internalIsBuffer(b)) {
|
25934 | throw new TypeError('Arguments must be Buffers')
|
25935 | }
|
25936 |
|
25937 | if (a === b) return 0
|
25938 |
|
25939 | var x = a.length;
|
25940 | var y = b.length;
|
25941 |
|
25942 | for (var i = 0, len = Math.min(x, y); i < len; ++i) {
|
25943 | if (a[i] !== b[i]) {
|
25944 | x = a[i];
|
25945 | y = b[i];
|
25946 | break
|
25947 | }
|
25948 | }
|
25949 |
|
25950 | if (x < y) return -1
|
25951 | if (y < x) return 1
|
25952 | return 0
|
25953 | };
|
25954 |
|
25955 | Buffer.isEncoding = function isEncoding (encoding) {
|
25956 | switch (String(encoding).toLowerCase()) {
|
25957 | case 'hex':
|
25958 | case 'utf8':
|
25959 | case 'utf-8':
|
25960 | case 'ascii':
|
25961 | case 'latin1':
|
25962 | case 'binary':
|
25963 | case 'base64':
|
25964 | case 'ucs2':
|
25965 | case 'ucs-2':
|
25966 | case 'utf16le':
|
25967 | case 'utf-16le':
|
25968 | return true
|
25969 | default:
|
25970 | return false
|
25971 | }
|
25972 | };
|
25973 |
|
25974 | Buffer.concat = function concat (list, length) {
|
25975 | if (!isArray(list)) {
|
25976 | throw new TypeError('"list" argument must be an Array of Buffers')
|
25977 | }
|
25978 |
|
25979 | if (list.length === 0) {
|
25980 | return Buffer.alloc(0)
|
25981 | }
|
25982 |
|
25983 | var i;
|
25984 | if (length === undefined) {
|
25985 | length = 0;
|
25986 | for (i = 0; i < list.length; ++i) {
|
25987 | length += list[i].length;
|
25988 | }
|
25989 | }
|
25990 |
|
25991 | var buffer = Buffer.allocUnsafe(length);
|
25992 | var pos = 0;
|
25993 | for (i = 0; i < list.length; ++i) {
|
25994 | var buf = list[i];
|
25995 | if (!internalIsBuffer(buf)) {
|
25996 | throw new TypeError('"list" argument must be an Array of Buffers')
|
25997 | }
|
25998 | buf.copy(buffer, pos);
|
25999 | pos += buf.length;
|
26000 | }
|
26001 | return buffer
|
26002 | };
|
26003 |
|
26004 | function byteLength (string, encoding) {
|
26005 | if (internalIsBuffer(string)) {
|
26006 | return string.length
|
26007 | }
|
26008 | if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&
|
26009 | (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {
|
26010 | return string.byteLength
|
26011 | }
|
26012 | if (typeof string !== 'string') {
|
26013 | string = '' + string;
|
26014 | }
|
26015 |
|
26016 | var len = string.length;
|
26017 | if (len === 0) return 0
|
26018 |
|
26019 | // Use a for loop to avoid recursion
|
26020 | var loweredCase = false;
|
26021 | for (;;) {
|
26022 | switch (encoding) {
|
26023 | case 'ascii':
|
26024 | case 'latin1':
|
26025 | case 'binary':
|
26026 | return len
|
26027 | case 'utf8':
|
26028 | case 'utf-8':
|
26029 | case undefined:
|
26030 | return utf8ToBytes(string).length
|
26031 | case 'ucs2':
|
26032 | case 'ucs-2':
|
26033 | case 'utf16le':
|
26034 | case 'utf-16le':
|
26035 | return len * 2
|
26036 | case 'hex':
|
26037 | return len >>> 1
|
26038 | case 'base64':
|
26039 | return base64ToBytes(string).length
|
26040 | default:
|
26041 | if (loweredCase) return utf8ToBytes(string).length // assume utf8
|
26042 | encoding = ('' + encoding).toLowerCase();
|
26043 | loweredCase = true;
|
26044 | }
|
26045 | }
|
26046 | }
|
26047 | Buffer.byteLength = byteLength;
|
26048 |
|
26049 | function slowToString (encoding, start, end) {
|
26050 | var loweredCase = false;
|
26051 |
|
26052 | // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
|
26053 | // property of a typed array.
|
26054 |
|
26055 | // This behaves neither like String nor Uint8Array in that we set start/end
|
26056 | // to their upper/lower bounds if the value passed is out of range.
|
26057 | // undefined is handled specially as per ECMA-262 6th Edition,
|
26058 | // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
|
26059 | if (start === undefined || start < 0) {
|
26060 | start = 0;
|
26061 | }
|
26062 | // Return early if start > this.length. Done here to prevent potential uint32
|
26063 | // coercion fail below.
|
26064 | if (start > this.length) {
|
26065 | return ''
|
26066 | }
|
26067 |
|
26068 | if (end === undefined || end > this.length) {
|
26069 | end = this.length;
|
26070 | }
|
26071 |
|
26072 | if (end <= 0) {
|
26073 | return ''
|
26074 | }
|
26075 |
|
26076 | // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
|
26077 | end >>>= 0;
|
26078 | start >>>= 0;
|
26079 |
|
26080 | if (end <= start) {
|
26081 | return ''
|
26082 | }
|
26083 |
|
26084 | if (!encoding) encoding = 'utf8';
|
26085 |
|
26086 | while (true) {
|
26087 | switch (encoding) {
|
26088 | case 'hex':
|
26089 | return hexSlice(this, start, end)
|
26090 |
|
26091 | case 'utf8':
|
26092 | case 'utf-8':
|
26093 | return utf8Slice(this, start, end)
|
26094 |
|
26095 | case 'ascii':
|
26096 | return asciiSlice(this, start, end)
|
26097 |
|
26098 | case 'latin1':
|
26099 | case 'binary':
|
26100 | return latin1Slice(this, start, end)
|
26101 |
|
26102 | case 'base64':
|
26103 | return base64Slice(this, start, end)
|
26104 |
|
26105 | case 'ucs2':
|
26106 | case 'ucs-2':
|
26107 | case 'utf16le':
|
26108 | case 'utf-16le':
|
26109 | return utf16leSlice(this, start, end)
|
26110 |
|
26111 | default:
|
26112 | if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
|
26113 | encoding = (encoding + '').toLowerCase();
|
26114 | loweredCase = true;
|
26115 | }
|
26116 | }
|
26117 | }
|
26118 |
|
26119 | // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect
|
26120 | // Buffer instances.
|
26121 | Buffer.prototype._isBuffer = true;
|
26122 |
|
26123 | function swap (b, n, m) {
|
26124 | var i = b[n];
|
26125 | b[n] = b[m];
|
26126 | b[m] = i;
|
26127 | }
|
26128 |
|
26129 | Buffer.prototype.swap16 = function swap16 () {
|
26130 | var len = this.length;
|
26131 | if (len % 2 !== 0) {
|
26132 | throw new RangeError('Buffer size must be a multiple of 16-bits')
|
26133 | }
|
26134 | for (var i = 0; i < len; i += 2) {
|
26135 | swap(this, i, i + 1);
|
26136 | }
|
26137 | return this
|
26138 | };
|
26139 |
|
26140 | Buffer.prototype.swap32 = function swap32 () {
|
26141 | var len = this.length;
|
26142 | if (len % 4 !== 0) {
|
26143 | throw new RangeError('Buffer size must be a multiple of 32-bits')
|
26144 | }
|
26145 | for (var i = 0; i < len; i += 4) {
|
26146 | swap(this, i, i + 3);
|
26147 | swap(this, i + 1, i + 2);
|
26148 | }
|
26149 | return this
|
26150 | };
|
26151 |
|
26152 | Buffer.prototype.swap64 = function swap64 () {
|
26153 | var len = this.length;
|
26154 | if (len % 8 !== 0) {
|
26155 | throw new RangeError('Buffer size must be a multiple of 64-bits')
|
26156 | }
|
26157 | for (var i = 0; i < len; i += 8) {
|
26158 | swap(this, i, i + 7);
|
26159 | swap(this, i + 1, i + 6);
|
26160 | swap(this, i + 2, i + 5);
|
26161 | swap(this, i + 3, i + 4);
|
26162 | }
|
26163 | return this
|
26164 | };
|
26165 |
|
26166 | Buffer.prototype.toString = function toString () {
|
26167 | var length = this.length | 0;
|
26168 | if (length === 0) return ''
|
26169 | if (arguments.length === 0) return utf8Slice(this, 0, length)
|
26170 | return slowToString.apply(this, arguments)
|
26171 | };
|
26172 |
|
26173 | Buffer.prototype.equals = function equals (b) {
|
26174 | if (!internalIsBuffer(b)) throw new TypeError('Argument must be a Buffer')
|
26175 | if (this === b) return true
|
26176 | return Buffer.compare(this, b) === 0
|
26177 | };
|
26178 |
|
26179 | Buffer.prototype.inspect = function inspect () {
|
26180 | var str = '';
|
26181 | var max = INSPECT_MAX_BYTES;
|
26182 | if (this.length > 0) {
|
26183 | str = this.toString('hex', 0, max).match(/.{2}/g).join(' ');
|
26184 | if (this.length > max) str += ' ... ';
|
26185 | }
|
26186 | return '<Buffer ' + str + '>'
|
26187 | };
|
26188 |
|
26189 | Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
|
26190 | if (!internalIsBuffer(target)) {
|
26191 | throw new TypeError('Argument must be a Buffer')
|
26192 | }
|
26193 |
|
26194 | if (start === undefined) {
|
26195 | start = 0;
|
26196 | }
|
26197 | if (end === undefined) {
|
26198 | end = target ? target.length : 0;
|
26199 | }
|
26200 | if (thisStart === undefined) {
|
26201 | thisStart = 0;
|
26202 | }
|
26203 | if (thisEnd === undefined) {
|
26204 | thisEnd = this.length;
|
26205 | }
|
26206 |
|
26207 | if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
|
26208 | throw new RangeError('out of range index')
|
26209 | }
|
26210 |
|
26211 | if (thisStart >= thisEnd && start >= end) {
|
26212 | return 0
|
26213 | }
|
26214 | if (thisStart >= thisEnd) {
|
26215 | return -1
|
26216 | }
|
26217 | if (start >= end) {
|
26218 | return 1
|
26219 | }
|
26220 |
|
26221 | start >>>= 0;
|
26222 | end >>>= 0;
|
26223 | thisStart >>>= 0;
|
26224 | thisEnd >>>= 0;
|
26225 |
|
26226 | if (this === target) return 0
|
26227 |
|
26228 | var x = thisEnd - thisStart;
|
26229 | var y = end - start;
|
26230 | var len = Math.min(x, y);
|
26231 |
|
26232 | var thisCopy = this.slice(thisStart, thisEnd);
|
26233 | var targetCopy = target.slice(start, end);
|
26234 |
|
26235 | for (var i = 0; i < len; ++i) {
|
26236 | if (thisCopy[i] !== targetCopy[i]) {
|
26237 | x = thisCopy[i];
|
26238 | y = targetCopy[i];
|
26239 | break
|
26240 | }
|
26241 | }
|
26242 |
|
26243 | if (x < y) return -1
|
26244 | if (y < x) return 1
|
26245 | return 0
|
26246 | };
|
26247 |
|
26248 | // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
|
26249 | // OR the last index of `val` in `buffer` at offset <= `byteOffset`.
|
26250 | //
|
26251 | // Arguments:
|
26252 | // - buffer - a Buffer to search
|
26253 | // - val - a string, Buffer, or number
|
26254 | // - byteOffset - an index into `buffer`; will be clamped to an int32
|
26255 | // - encoding - an optional encoding, relevant is val is a string
|
26256 | // - dir - true for indexOf, false for lastIndexOf
|
26257 | function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
|
26258 | // Empty buffer means no match
|
26259 | if (buffer.length === 0) return -1
|
26260 |
|
26261 | // Normalize byteOffset
|
26262 | if (typeof byteOffset === 'string') {
|
26263 | encoding = byteOffset;
|
26264 | byteOffset = 0;
|
26265 | } else if (byteOffset > 0x7fffffff) {
|
26266 | byteOffset = 0x7fffffff;
|
26267 | } else if (byteOffset < -0x80000000) {
|
26268 | byteOffset = -0x80000000;
|
26269 | }
|
26270 | byteOffset = +byteOffset; // Coerce to Number.
|
26271 | if (isNaN(byteOffset)) {
|
26272 | // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
|
26273 | byteOffset = dir ? 0 : (buffer.length - 1);
|
26274 | }
|
26275 |
|
26276 | // Normalize byteOffset: negative offsets start from the end of the buffer
|
26277 | if (byteOffset < 0) byteOffset = buffer.length + byteOffset;
|
26278 | if (byteOffset >= buffer.length) {
|
26279 | if (dir) return -1
|
26280 | else byteOffset = buffer.length - 1;
|
26281 | } else if (byteOffset < 0) {
|
26282 | if (dir) byteOffset = 0;
|
26283 | else return -1
|
26284 | }
|
26285 |
|
26286 | // Normalize val
|
26287 | if (typeof val === 'string') {
|
26288 | val = Buffer.from(val, encoding);
|
26289 | }
|
26290 |
|
26291 | // Finally, search either indexOf (if dir is true) or lastIndexOf
|
26292 | if (internalIsBuffer(val)) {
|
26293 | // Special case: looking for empty string/buffer always fails
|
26294 | if (val.length === 0) {
|
26295 | return -1
|
26296 | }
|
26297 | return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
|
26298 | } else if (typeof val === 'number') {
|
26299 | val = val & 0xFF; // Search for a byte value [0-255]
|
26300 | if (Buffer.TYPED_ARRAY_SUPPORT &&
|
26301 | typeof Uint8Array.prototype.indexOf === 'function') {
|
26302 | if (dir) {
|
26303 | return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
|
26304 | } else {
|
26305 | return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
|
26306 | }
|
26307 | }
|
26308 | return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
|
26309 | }
|
26310 |
|
26311 | throw new TypeError('val must be string, number or Buffer')
|
26312 | }
|
26313 |
|
26314 | function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
|
26315 | var indexSize = 1;
|
26316 | var arrLength = arr.length;
|
26317 | var valLength = val.length;
|
26318 |
|
26319 | if (encoding !== undefined) {
|
26320 | encoding = String(encoding).toLowerCase();
|
26321 | if (encoding === 'ucs2' || encoding === 'ucs-2' ||
|
26322 | encoding === 'utf16le' || encoding === 'utf-16le') {
|
26323 | if (arr.length < 2 || val.length < 2) {
|
26324 | return -1
|
26325 | }
|
26326 | indexSize = 2;
|
26327 | arrLength /= 2;
|
26328 | valLength /= 2;
|
26329 | byteOffset /= 2;
|
26330 | }
|
26331 | }
|
26332 |
|
26333 | function read$$1 (buf, i) {
|
26334 | if (indexSize === 1) {
|
26335 | return buf[i]
|
26336 | } else {
|
26337 | return buf.readUInt16BE(i * indexSize)
|
26338 | }
|
26339 | }
|
26340 |
|
26341 | var i;
|
26342 | if (dir) {
|
26343 | var foundIndex = -1;
|
26344 | for (i = byteOffset; i < arrLength; i++) {
|
26345 | if (read$$1(arr, i) === read$$1(val, foundIndex === -1 ? 0 : i - foundIndex)) {
|
26346 | if (foundIndex === -1) foundIndex = i;
|
26347 | if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
|
26348 | } else {
|
26349 | if (foundIndex !== -1) i -= i - foundIndex;
|
26350 | foundIndex = -1;
|
26351 | }
|
26352 | }
|
26353 | } else {
|
26354 | if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength;
|
26355 | for (i = byteOffset; i >= 0; i--) {
|
26356 | var found = true;
|
26357 | for (var j = 0; j < valLength; j++) {
|
26358 | if (read$$1(arr, i + j) !== read$$1(val, j)) {
|
26359 | found = false;
|
26360 | break
|
26361 | }
|
26362 | }
|
26363 | if (found) return i
|
26364 | }
|
26365 | }
|
26366 |
|
26367 | return -1
|
26368 | }
|
26369 |
|
26370 | Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
|
26371 | return this.indexOf(val, byteOffset, encoding) !== -1
|
26372 | };
|
26373 |
|
26374 | Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
|
26375 | return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
|
26376 | };
|
26377 |
|
26378 | Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
|
26379 | return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
|
26380 | };
|
26381 |
|
26382 | function hexWrite (buf, string, offset, length) {
|
26383 | offset = Number(offset) || 0;
|
26384 | var remaining = buf.length - offset;
|
26385 | if (!length) {
|
26386 | length = remaining;
|
26387 | } else {
|
26388 | length = Number(length);
|
26389 | if (length > remaining) {
|
26390 | length = remaining;
|
26391 | }
|
26392 | }
|
26393 |
|
26394 | // must be an even number of digits
|
26395 | var strLen = string.length;
|
26396 | if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')
|
26397 |
|
26398 | if (length > strLen / 2) {
|
26399 | length = strLen / 2;
|
26400 | }
|
26401 | for (var i = 0; i < length; ++i) {
|
26402 | var parsed = parseInt(string.substr(i * 2, 2), 16);
|
26403 | if (isNaN(parsed)) return i
|
26404 | buf[offset + i] = parsed;
|
26405 | }
|
26406 | return i
|
26407 | }
|
26408 |
|
26409 | function utf8Write (buf, string, offset, length) {
|
26410 | return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
|
26411 | }
|
26412 |
|
26413 | function asciiWrite (buf, string, offset, length) {
|
26414 | return blitBuffer(asciiToBytes(string), buf, offset, length)
|
26415 | }
|
26416 |
|
26417 | function latin1Write (buf, string, offset, length) {
|
26418 | return asciiWrite(buf, string, offset, length)
|
26419 | }
|
26420 |
|
26421 | function base64Write (buf, string, offset, length) {
|
26422 | return blitBuffer(base64ToBytes(string), buf, offset, length)
|
26423 | }
|
26424 |
|
26425 | function ucs2Write (buf, string, offset, length) {
|
26426 | return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
|
26427 | }
|
26428 |
|
26429 | Buffer.prototype.write = function write$$1 (string, offset, length, encoding) {
|
26430 | // Buffer#write(string)
|
26431 | if (offset === undefined) {
|
26432 | encoding = 'utf8';
|
26433 | length = this.length;
|
26434 | offset = 0;
|
26435 | // Buffer#write(string, encoding)
|
26436 | } else if (length === undefined && typeof offset === 'string') {
|
26437 | encoding = offset;
|
26438 | length = this.length;
|
26439 | offset = 0;
|
26440 | // Buffer#write(string, offset[, length][, encoding])
|
26441 | } else if (isFinite(offset)) {
|
26442 | offset = offset | 0;
|
26443 | if (isFinite(length)) {
|
26444 | length = length | 0;
|
26445 | if (encoding === undefined) encoding = 'utf8';
|
26446 | } else {
|
26447 | encoding = length;
|
26448 | length = undefined;
|
26449 | }
|
26450 | // legacy write(string, encoding, offset, length) - remove in v0.13
|
26451 | } else {
|
26452 | throw new Error(
|
26453 | 'Buffer.write(string, encoding, offset[, length]) is no longer supported'
|
26454 | )
|
26455 | }
|
26456 |
|
26457 | var remaining = this.length - offset;
|
26458 | if (length === undefined || length > remaining) length = remaining;
|
26459 |
|
26460 | if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
|
26461 | throw new RangeError('Attempt to write outside buffer bounds')
|
26462 | }
|
26463 |
|
26464 | if (!encoding) encoding = 'utf8';
|
26465 |
|
26466 | var loweredCase = false;
|
26467 | for (;;) {
|
26468 | switch (encoding) {
|
26469 | case 'hex':
|
26470 | return hexWrite(this, string, offset, length)
|
26471 |
|
26472 | case 'utf8':
|
26473 | case 'utf-8':
|
26474 | return utf8Write(this, string, offset, length)
|
26475 |
|
26476 | case 'ascii':
|
26477 | return asciiWrite(this, string, offset, length)
|
26478 |
|
26479 | case 'latin1':
|
26480 | case 'binary':
|
26481 | return latin1Write(this, string, offset, length)
|
26482 |
|
26483 | case 'base64':
|
26484 | // Warning: maxLength not taken into account in base64Write
|
26485 | return base64Write(this, string, offset, length)
|
26486 |
|
26487 | case 'ucs2':
|
26488 | case 'ucs-2':
|
26489 | case 'utf16le':
|
26490 | case 'utf-16le':
|
26491 | return ucs2Write(this, string, offset, length)
|
26492 |
|
26493 | default:
|
26494 | if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
|
26495 | encoding = ('' + encoding).toLowerCase();
|
26496 | loweredCase = true;
|
26497 | }
|
26498 | }
|
26499 | };
|
26500 |
|
26501 | Buffer.prototype.toJSON = function toJSON () {
|
26502 | return {
|
26503 | type: 'Buffer',
|
26504 | data: Array.prototype.slice.call(this._arr || this, 0)
|
26505 | }
|
26506 | };
|
26507 |
|
26508 | function base64Slice (buf, start, end) {
|
26509 | if (start === 0 && end === buf.length) {
|
26510 | return fromByteArray(buf)
|
26511 | } else {
|
26512 | return fromByteArray(buf.slice(start, end))
|
26513 | }
|
26514 | }
|
26515 |
|
26516 | function utf8Slice (buf, start, end) {
|
26517 | end = Math.min(buf.length, end);
|
26518 | var res = [];
|
26519 |
|
26520 | var i = start;
|
26521 | while (i < end) {
|
26522 | var firstByte = buf[i];
|
26523 | var codePoint = null;
|
26524 | var bytesPerSequence = (firstByte > 0xEF) ? 4
|
26525 | : (firstByte > 0xDF) ? 3
|
26526 | : (firstByte > 0xBF) ? 2
|
26527 | : 1;
|
26528 |
|
26529 | if (i + bytesPerSequence <= end) {
|
26530 | var secondByte, thirdByte, fourthByte, tempCodePoint;
|
26531 |
|
26532 | switch (bytesPerSequence) {
|
26533 | case 1:
|
26534 | if (firstByte < 0x80) {
|
26535 | codePoint = firstByte;
|
26536 | }
|
26537 | break
|
26538 | case 2:
|
26539 | secondByte = buf[i + 1];
|
26540 | if ((secondByte & 0xC0) === 0x80) {
|
26541 | tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F);
|
26542 | if (tempCodePoint > 0x7F) {
|
26543 | codePoint = tempCodePoint;
|
26544 | }
|
26545 | }
|
26546 | break
|
26547 | case 3:
|
26548 | secondByte = buf[i + 1];
|
26549 | thirdByte = buf[i + 2];
|
26550 | if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
|
26551 | tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F);
|
26552 | if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
|
26553 | codePoint = tempCodePoint;
|
26554 | }
|
26555 | }
|
26556 | break
|
26557 | case 4:
|
26558 | secondByte = buf[i + 1];
|
26559 | thirdByte = buf[i + 2];
|
26560 | fourthByte = buf[i + 3];
|
26561 | if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
|
26562 | tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F);
|
26563 | if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
|
26564 | codePoint = tempCodePoint;
|
26565 | }
|
26566 | }
|
26567 | }
|
26568 | }
|
26569 |
|
26570 | if (codePoint === null) {
|
26571 | // we did not generate a valid codePoint so insert a
|
26572 | // replacement char (U+FFFD) and advance only 1 byte
|
26573 | codePoint = 0xFFFD;
|
26574 | bytesPerSequence = 1;
|
26575 | } else if (codePoint > 0xFFFF) {
|
26576 | // encode to utf16 (surrogate pair dance)
|
26577 | codePoint -= 0x10000;
|
26578 | res.push(codePoint >>> 10 & 0x3FF | 0xD800);
|
26579 | codePoint = 0xDC00 | codePoint & 0x3FF;
|
26580 | }
|
26581 |
|
26582 | res.push(codePoint);
|
26583 | i += bytesPerSequence;
|
26584 | }
|
26585 |
|
26586 | return decodeCodePointsArray(res)
|
26587 | }
|
26588 |
|
26589 | // Based on http://stackoverflow.com/a/22747272/680742, the browser with
|
26590 | // the lowest limit is Chrome, with 0x10000 args.
|
26591 | // We go 1 magnitude less, for safety
|
26592 | var MAX_ARGUMENTS_LENGTH = 0x1000;
|
26593 |
|
26594 | function decodeCodePointsArray (codePoints) {
|
26595 | var len = codePoints.length;
|
26596 | if (len <= MAX_ARGUMENTS_LENGTH) {
|
26597 | return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
|
26598 | }
|
26599 |
|
26600 | // Decode in chunks to avoid "call stack size exceeded".
|
26601 | var res = '';
|
26602 | var i = 0;
|
26603 | while (i < len) {
|
26604 | res += String.fromCharCode.apply(
|
26605 | String,
|
26606 | codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
|
26607 | );
|
26608 | }
|
26609 | return res
|
26610 | }
|
26611 |
|
26612 | function asciiSlice (buf, start, end) {
|
26613 | var ret = '';
|
26614 | end = Math.min(buf.length, end);
|
26615 |
|
26616 | for (var i = start; i < end; ++i) {
|
26617 | ret += String.fromCharCode(buf[i] & 0x7F);
|
26618 | }
|
26619 | return ret
|
26620 | }
|
26621 |
|
26622 | function latin1Slice (buf, start, end) {
|
26623 | var ret = '';
|
26624 | end = Math.min(buf.length, end);
|
26625 |
|
26626 | for (var i = start; i < end; ++i) {
|
26627 | ret += String.fromCharCode(buf[i]);
|
26628 | }
|
26629 | return ret
|
26630 | }
|
26631 |
|
26632 | function hexSlice (buf, start, end) {
|
26633 | var len = buf.length;
|
26634 |
|
26635 | if (!start || start < 0) start = 0;
|
26636 | if (!end || end < 0 || end > len) end = len;
|
26637 |
|
26638 | var out = '';
|
26639 | for (var i = start; i < end; ++i) {
|
26640 | out += toHex(buf[i]);
|
26641 | }
|
26642 | return out
|
26643 | }
|
26644 |
|
26645 | function utf16leSlice (buf, start, end) {
|
26646 | var bytes = buf.slice(start, end);
|
26647 | var res = '';
|
26648 | for (var i = 0; i < bytes.length; i += 2) {
|
26649 | res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256);
|
26650 | }
|
26651 | return res
|
26652 | }
|
26653 |
|
26654 | Buffer.prototype.slice = function slice (start, end) {
|
26655 | var len = this.length;
|
26656 | start = ~~start;
|
26657 | end = end === undefined ? len : ~~end;
|
26658 |
|
26659 | if (start < 0) {
|
26660 | start += len;
|
26661 | if (start < 0) start = 0;
|
26662 | } else if (start > len) {
|
26663 | start = len;
|
26664 | }
|
26665 |
|
26666 | if (end < 0) {
|
26667 | end += len;
|
26668 | if (end < 0) end = 0;
|
26669 | } else if (end > len) {
|
26670 | end = len;
|
26671 | }
|
26672 |
|
26673 | if (end < start) end = start;
|
26674 |
|
26675 | var newBuf;
|
26676 | if (Buffer.TYPED_ARRAY_SUPPORT) {
|
26677 | newBuf = this.subarray(start, end);
|
26678 | newBuf.__proto__ = Buffer.prototype;
|
26679 | } else {
|
26680 | var sliceLen = end - start;
|
26681 | newBuf = new Buffer(sliceLen, undefined);
|
26682 | for (var i = 0; i < sliceLen; ++i) {
|
26683 | newBuf[i] = this[i + start];
|
26684 | }
|
26685 | }
|
26686 |
|
26687 | return newBuf
|
26688 | };
|
26689 |
|
26690 | /*
|
26691 | * Need to make sure that buffer isn't trying to write out of bounds.
|
26692 | */
|
26693 | function checkOffset (offset, ext, length) {
|
26694 | if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
|
26695 | if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
|
26696 | }
|
26697 |
|
26698 | Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
|
26699 | offset = offset | 0;
|
26700 | byteLength = byteLength | 0;
|
26701 | if (!noAssert) checkOffset(offset, byteLength, this.length);
|
26702 |
|
26703 | var val = this[offset];
|
26704 | var mul = 1;
|
26705 | var i = 0;
|
26706 | while (++i < byteLength && (mul *= 0x100)) {
|
26707 | val += this[offset + i] * mul;
|
26708 | }
|
26709 |
|
26710 | return val
|
26711 | };
|
26712 |
|
26713 | Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
|
26714 | offset = offset | 0;
|
26715 | byteLength = byteLength | 0;
|
26716 | if (!noAssert) {
|
26717 | checkOffset(offset, byteLength, this.length);
|
26718 | }
|
26719 |
|
26720 | var val = this[offset + --byteLength];
|
26721 | var mul = 1;
|
26722 | while (byteLength > 0 && (mul *= 0x100)) {
|
26723 | val += this[offset + --byteLength] * mul;
|
26724 | }
|
26725 |
|
26726 | return val
|
26727 | };
|
26728 |
|
26729 | Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
|
26730 | if (!noAssert) checkOffset(offset, 1, this.length);
|
26731 | return this[offset]
|
26732 | };
|
26733 |
|
26734 | Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
|
26735 | if (!noAssert) checkOffset(offset, 2, this.length);
|
26736 | return this[offset] | (this[offset + 1] << 8)
|
26737 | };
|
26738 |
|
26739 | Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
|
26740 | if (!noAssert) checkOffset(offset, 2, this.length);
|
26741 | return (this[offset] << 8) | this[offset + 1]
|
26742 | };
|
26743 |
|
26744 | Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
|
26745 | if (!noAssert) checkOffset(offset, 4, this.length);
|
26746 |
|
26747 | return ((this[offset]) |
|
26748 | (this[offset + 1] << 8) |
|
26749 | (this[offset + 2] << 16)) +
|
26750 | (this[offset + 3] * 0x1000000)
|
26751 | };
|
26752 |
|
26753 | Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
|
26754 | if (!noAssert) checkOffset(offset, 4, this.length);
|
26755 |
|
26756 | return (this[offset] * 0x1000000) +
|
26757 | ((this[offset + 1] << 16) |
|
26758 | (this[offset + 2] << 8) |
|
26759 | this[offset + 3])
|
26760 | };
|
26761 |
|
26762 | Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
|
26763 | offset = offset | 0;
|
26764 | byteLength = byteLength | 0;
|
26765 | if (!noAssert) checkOffset(offset, byteLength, this.length);
|
26766 |
|
26767 | var val = this[offset];
|
26768 | var mul = 1;
|
26769 | var i = 0;
|
26770 | while (++i < byteLength && (mul *= 0x100)) {
|
26771 | val += this[offset + i] * mul;
|
26772 | }
|
26773 | mul *= 0x80;
|
26774 |
|
26775 | if (val >= mul) val -= Math.pow(2, 8 * byteLength);
|
26776 |
|
26777 | return val
|
26778 | };
|
26779 |
|
26780 | Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
|
26781 | offset = offset | 0;
|
26782 | byteLength = byteLength | 0;
|
26783 | if (!noAssert) checkOffset(offset, byteLength, this.length);
|
26784 |
|
26785 | var i = byteLength;
|
26786 | var mul = 1;
|
26787 | var val = this[offset + --i];
|
26788 | while (i > 0 && (mul *= 0x100)) {
|
26789 | val += this[offset + --i] * mul;
|
26790 | }
|
26791 | mul *= 0x80;
|
26792 |
|
26793 | if (val >= mul) val -= Math.pow(2, 8 * byteLength);
|
26794 |
|
26795 | return val
|
26796 | };
|
26797 |
|
26798 | Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
|
26799 | if (!noAssert) checkOffset(offset, 1, this.length);
|
26800 | if (!(this[offset] & 0x80)) return (this[offset])
|
26801 | return ((0xff - this[offset] + 1) * -1)
|
26802 | };
|
26803 |
|
26804 | Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
|
26805 | if (!noAssert) checkOffset(offset, 2, this.length);
|
26806 | var val = this[offset] | (this[offset + 1] << 8);
|
26807 | return (val & 0x8000) ? val | 0xFFFF0000 : val
|
26808 | };
|
26809 |
|
26810 | Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
|
26811 | if (!noAssert) checkOffset(offset, 2, this.length);
|
26812 | var val = this[offset + 1] | (this[offset] << 8);
|
26813 | return (val & 0x8000) ? val | 0xFFFF0000 : val
|
26814 | };
|
26815 |
|
26816 | Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
|
26817 | if (!noAssert) checkOffset(offset, 4, this.length);
|
26818 |
|
26819 | return (this[offset]) |
|
26820 | (this[offset + 1] << 8) |
|
26821 | (this[offset + 2] << 16) |
|
26822 | (this[offset + 3] << 24)
|
26823 | };
|
26824 |
|
26825 | Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
|
26826 | if (!noAssert) checkOffset(offset, 4, this.length);
|
26827 |
|
26828 | return (this[offset] << 24) |
|
26829 | (this[offset + 1] << 16) |
|
26830 | (this[offset + 2] << 8) |
|
26831 | (this[offset + 3])
|
26832 | };
|
26833 |
|
26834 | Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
|
26835 | if (!noAssert) checkOffset(offset, 4, this.length);
|
26836 | return read(this, offset, true, 23, 4)
|
26837 | };
|
26838 |
|
26839 | Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
|
26840 | if (!noAssert) checkOffset(offset, 4, this.length);
|
26841 | return read(this, offset, false, 23, 4)
|
26842 | };
|
26843 |
|
26844 | Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
|
26845 | if (!noAssert) checkOffset(offset, 8, this.length);
|
26846 | return read(this, offset, true, 52, 8)
|
26847 | };
|
26848 |
|
26849 | Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
|
26850 | if (!noAssert) checkOffset(offset, 8, this.length);
|
26851 | return read(this, offset, false, 52, 8)
|
26852 | };
|
26853 |
|
26854 | function checkInt (buf, value, offset, ext, max, min) {
|
26855 | if (!internalIsBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
|
26856 | if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
|
26857 | if (offset + ext > buf.length) throw new RangeError('Index out of range')
|
26858 | }
|
26859 |
|
26860 | Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
|
26861 | value = +value;
|
26862 | offset = offset | 0;
|
26863 | byteLength = byteLength | 0;
|
26864 | if (!noAssert) {
|
26865 | var maxBytes = Math.pow(2, 8 * byteLength) - 1;
|
26866 | checkInt(this, value, offset, byteLength, maxBytes, 0);
|
26867 | }
|
26868 |
|
26869 | var mul = 1;
|
26870 | var i = 0;
|
26871 | this[offset] = value & 0xFF;
|
26872 | while (++i < byteLength && (mul *= 0x100)) {
|
26873 | this[offset + i] = (value / mul) & 0xFF;
|
26874 | }
|
26875 |
|
26876 | return offset + byteLength
|
26877 | };
|
26878 |
|
26879 | Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
|
26880 | value = +value;
|
26881 | offset = offset | 0;
|
26882 | byteLength = byteLength | 0;
|
26883 | if (!noAssert) {
|
26884 | var maxBytes = Math.pow(2, 8 * byteLength) - 1;
|
26885 | checkInt(this, value, offset, byteLength, maxBytes, 0);
|
26886 | }
|
26887 |
|
26888 | var i = byteLength - 1;
|
26889 | var mul = 1;
|
26890 | this[offset + i] = value & 0xFF;
|
26891 | while (--i >= 0 && (mul *= 0x100)) {
|
26892 | this[offset + i] = (value / mul) & 0xFF;
|
26893 | }
|
26894 |
|
26895 | return offset + byteLength
|
26896 | };
|
26897 |
|
26898 | Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
|
26899 | value = +value;
|
26900 | offset = offset | 0;
|
26901 | if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0);
|
26902 | if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value);
|
26903 | this[offset] = (value & 0xff);
|
26904 | return offset + 1
|
26905 | };
|
26906 |
|
26907 | function objectWriteUInt16 (buf, value, offset, littleEndian) {
|
26908 | if (value < 0) value = 0xffff + value + 1;
|
26909 | for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {
|
26910 | buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
|
26911 | (littleEndian ? i : 1 - i) * 8;
|
26912 | }
|
26913 | }
|
26914 |
|
26915 | Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
|
26916 | value = +value;
|
26917 | offset = offset | 0;
|
26918 | if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);
|
26919 | if (Buffer.TYPED_ARRAY_SUPPORT) {
|
26920 | this[offset] = (value & 0xff);
|
26921 | this[offset + 1] = (value >>> 8);
|
26922 | } else {
|
26923 | objectWriteUInt16(this, value, offset, true);
|
26924 | }
|
26925 | return offset + 2
|
26926 | };
|
26927 |
|
26928 | Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
|
26929 | value = +value;
|
26930 | offset = offset | 0;
|
26931 | if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);
|
26932 | if (Buffer.TYPED_ARRAY_SUPPORT) {
|
26933 | this[offset] = (value >>> 8);
|
26934 | this[offset + 1] = (value & 0xff);
|
26935 | } else {
|
26936 | objectWriteUInt16(this, value, offset, false);
|
26937 | }
|
26938 | return offset + 2
|
26939 | };
|
26940 |
|
26941 | function objectWriteUInt32 (buf, value, offset, littleEndian) {
|
26942 | if (value < 0) value = 0xffffffff + value + 1;
|
26943 | for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {
|
26944 | buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff;
|
26945 | }
|
26946 | }
|
26947 |
|
26948 | Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
|
26949 | value = +value;
|
26950 | offset = offset | 0;
|
26951 | if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);
|
26952 | if (Buffer.TYPED_ARRAY_SUPPORT) {
|
26953 | this[offset + 3] = (value >>> 24);
|
26954 | this[offset + 2] = (value >>> 16);
|
26955 | this[offset + 1] = (value >>> 8);
|
26956 | this[offset] = (value & 0xff);
|
26957 | } else {
|
26958 | objectWriteUInt32(this, value, offset, true);
|
26959 | }
|
26960 | return offset + 4
|
26961 | };
|
26962 |
|
26963 | Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
|
26964 | value = +value;
|
26965 | offset = offset | 0;
|
26966 | if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);
|
26967 | if (Buffer.TYPED_ARRAY_SUPPORT) {
|
26968 | this[offset] = (value >>> 24);
|
26969 | this[offset + 1] = (value >>> 16);
|
26970 | this[offset + 2] = (value >>> 8);
|
26971 | this[offset + 3] = (value & 0xff);
|
26972 | } else {
|
26973 | objectWriteUInt32(this, value, offset, false);
|
26974 | }
|
26975 | return offset + 4
|
26976 | };
|
26977 |
|
26978 | Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
|
26979 | value = +value;
|
26980 | offset = offset | 0;
|
26981 | if (!noAssert) {
|
26982 | var limit = Math.pow(2, 8 * byteLength - 1);
|
26983 |
|
26984 | checkInt(this, value, offset, byteLength, limit - 1, -limit);
|
26985 | }
|
26986 |
|
26987 | var i = 0;
|
26988 | var mul = 1;
|
26989 | var sub = 0;
|
26990 | this[offset] = value & 0xFF;
|
26991 | while (++i < byteLength && (mul *= 0x100)) {
|
26992 | if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
|
26993 | sub = 1;
|
26994 | }
|
26995 | this[offset + i] = ((value / mul) >> 0) - sub & 0xFF;
|
26996 | }
|
26997 |
|
26998 | return offset + byteLength
|
26999 | };
|
27000 |
|
27001 | Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
|
27002 | value = +value;
|
27003 | offset = offset | 0;
|
27004 | if (!noAssert) {
|
27005 | var limit = Math.pow(2, 8 * byteLength - 1);
|
27006 |
|
27007 | checkInt(this, value, offset, byteLength, limit - 1, -limit);
|
27008 | }
|
27009 |
|
27010 | var i = byteLength - 1;
|
27011 | var mul = 1;
|
27012 | var sub = 0;
|
27013 | this[offset + i] = value & 0xFF;
|
27014 | while (--i >= 0 && (mul *= 0x100)) {
|
27015 | if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
|
27016 | sub = 1;
|
27017 | }
|
27018 | this[offset + i] = ((value / mul) >> 0) - sub & 0xFF;
|
27019 | }
|
27020 |
|
27021 | return offset + byteLength
|
27022 | };
|
27023 |
|
27024 | Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
|
27025 | value = +value;
|
27026 | offset = offset | 0;
|
27027 | if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80);
|
27028 | if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value);
|
27029 | if (value < 0) value = 0xff + value + 1;
|
27030 | this[offset] = (value & 0xff);
|
27031 | return offset + 1
|
27032 | };
|
27033 |
|
27034 | Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
|
27035 | value = +value;
|
27036 | offset = offset | 0;
|
27037 | if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000);
|
27038 | if (Buffer.TYPED_ARRAY_SUPPORT) {
|
27039 | this[offset] = (value & 0xff);
|
27040 | this[offset + 1] = (value >>> 8);
|
27041 | } else {
|
27042 | objectWriteUInt16(this, value, offset, true);
|
27043 | }
|
27044 | return offset + 2
|
27045 | };
|
27046 |
|
27047 | Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
|
27048 | value = +value;
|
27049 | offset = offset | 0;
|
27050 | if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000);
|
27051 | if (Buffer.TYPED_ARRAY_SUPPORT) {
|
27052 | this[offset] = (value >>> 8);
|
27053 | this[offset + 1] = (value & 0xff);
|
27054 | } else {
|
27055 | objectWriteUInt16(this, value, offset, false);
|
27056 | }
|
27057 | return offset + 2
|
27058 | };
|
27059 |
|
27060 | Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
|
27061 | value = +value;
|
27062 | offset = offset | 0;
|
27063 | if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000);
|
27064 | if (Buffer.TYPED_ARRAY_SUPPORT) {
|
27065 | this[offset] = (value & 0xff);
|
27066 | this[offset + 1] = (value >>> 8);
|
27067 | this[offset + 2] = (value >>> 16);
|
27068 | this[offset + 3] = (value >>> 24);
|
27069 | } else {
|
27070 | objectWriteUInt32(this, value, offset, true);
|
27071 | }
|
27072 | return offset + 4
|
27073 | };
|
27074 |
|
27075 | Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
|
27076 | value = +value;
|
27077 | offset = offset | 0;
|
27078 | if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000);
|
27079 | if (value < 0) value = 0xffffffff + value + 1;
|
27080 | if (Buffer.TYPED_ARRAY_SUPPORT) {
|
27081 | this[offset] = (value >>> 24);
|
27082 | this[offset + 1] = (value >>> 16);
|
27083 | this[offset + 2] = (value >>> 8);
|
27084 | this[offset + 3] = (value & 0xff);
|
27085 | } else {
|
27086 | objectWriteUInt32(this, value, offset, false);
|
27087 | }
|
27088 | return offset + 4
|
27089 | };
|
27090 |
|
27091 | function checkIEEE754 (buf, value, offset, ext, max, min) {
|
27092 | if (offset + ext > buf.length) throw new RangeError('Index out of range')
|
27093 | if (offset < 0) throw new RangeError('Index out of range')
|
27094 | }
|
27095 |
|
27096 | function writeFloat (buf, value, offset, littleEndian, noAssert) {
|
27097 | if (!noAssert) {
|
27098 | checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38);
|
27099 | }
|
27100 | write(buf, value, offset, littleEndian, 23, 4);
|
27101 | return offset + 4
|
27102 | }
|
27103 |
|
27104 | Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
|
27105 | return writeFloat(this, value, offset, true, noAssert)
|
27106 | };
|
27107 |
|
27108 | Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
|
27109 | return writeFloat(this, value, offset, false, noAssert)
|
27110 | };
|
27111 |
|
27112 | function writeDouble (buf, value, offset, littleEndian, noAssert) {
|
27113 | if (!noAssert) {
|
27114 | checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308);
|
27115 | }
|
27116 | write(buf, value, offset, littleEndian, 52, 8);
|
27117 | return offset + 8
|
27118 | }
|
27119 |
|
27120 | Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
|
27121 | return writeDouble(this, value, offset, true, noAssert)
|
27122 | };
|
27123 |
|
27124 | Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
|
27125 | return writeDouble(this, value, offset, false, noAssert)
|
27126 | };
|
27127 |
|
27128 | // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
|
27129 | Buffer.prototype.copy = function copy (target, targetStart, start, end) {
|
27130 | if (!start) start = 0;
|
27131 | if (!end && end !== 0) end = this.length;
|
27132 | if (targetStart >= target.length) targetStart = target.length;
|
27133 | if (!targetStart) targetStart = 0;
|
27134 | if (end > 0 && end < start) end = start;
|
27135 |
|
27136 | // Copy 0 bytes; we're done
|
27137 | if (end === start) return 0
|
27138 | if (target.length === 0 || this.length === 0) return 0
|
27139 |
|
27140 | // Fatal error conditions
|
27141 | if (targetStart < 0) {
|
27142 | throw new RangeError('targetStart out of bounds')
|
27143 | }
|
27144 | if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
|
27145 | if (end < 0) throw new RangeError('sourceEnd out of bounds')
|
27146 |
|
27147 | // Are we oob?
|
27148 | if (end > this.length) end = this.length;
|
27149 | if (target.length - targetStart < end - start) {
|
27150 | end = target.length - targetStart + start;
|
27151 | }
|
27152 |
|
27153 | var len = end - start;
|
27154 | var i;
|
27155 |
|
27156 | if (this === target && start < targetStart && targetStart < end) {
|
27157 | // descending copy from end
|
27158 | for (i = len - 1; i >= 0; --i) {
|
27159 | target[i + targetStart] = this[i + start];
|
27160 | }
|
27161 | } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
|
27162 | // ascending copy from start
|
27163 | for (i = 0; i < len; ++i) {
|
27164 | target[i + targetStart] = this[i + start];
|
27165 | }
|
27166 | } else {
|
27167 | Uint8Array.prototype.set.call(
|
27168 | target,
|
27169 | this.subarray(start, start + len),
|
27170 | targetStart
|
27171 | );
|
27172 | }
|
27173 |
|
27174 | return len
|
27175 | };
|
27176 |
|
27177 | // Usage:
|
27178 | // buffer.fill(number[, offset[, end]])
|
27179 | // buffer.fill(buffer[, offset[, end]])
|
27180 | // buffer.fill(string[, offset[, end]][, encoding])
|
27181 | Buffer.prototype.fill = function fill (val, start, end, encoding) {
|
27182 | // Handle string cases:
|
27183 | if (typeof val === 'string') {
|
27184 | if (typeof start === 'string') {
|
27185 | encoding = start;
|
27186 | start = 0;
|
27187 | end = this.length;
|
27188 | } else if (typeof end === 'string') {
|
27189 | encoding = end;
|
27190 | end = this.length;
|
27191 | }
|
27192 | if (val.length === 1) {
|
27193 | var code = val.charCodeAt(0);
|
27194 | if (code < 256) {
|
27195 | val = code;
|
27196 | }
|
27197 | }
|
27198 | if (encoding !== undefined && typeof encoding !== 'string') {
|
27199 | throw new TypeError('encoding must be a string')
|
27200 | }
|
27201 | if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
|
27202 | throw new TypeError('Unknown encoding: ' + encoding)
|
27203 | }
|
27204 | } else if (typeof val === 'number') {
|
27205 | val = val & 255;
|
27206 | }
|
27207 |
|
27208 | // Invalid ranges are not set to a default, so can range check early.
|
27209 | if (start < 0 || this.length < start || this.length < end) {
|
27210 | throw new RangeError('Out of range index')
|
27211 | }
|
27212 |
|
27213 | if (end <= start) {
|
27214 | return this
|
27215 | }
|
27216 |
|
27217 | start = start >>> 0;
|
27218 | end = end === undefined ? this.length : end >>> 0;
|
27219 |
|
27220 | if (!val) val = 0;
|
27221 |
|
27222 | var i;
|
27223 | if (typeof val === 'number') {
|
27224 | for (i = start; i < end; ++i) {
|
27225 | this[i] = val;
|
27226 | }
|
27227 | } else {
|
27228 | var bytes = internalIsBuffer(val)
|
27229 | ? val
|
27230 | : utf8ToBytes(new Buffer(val, encoding).toString());
|
27231 | var len = bytes.length;
|
27232 | for (i = 0; i < end - start; ++i) {
|
27233 | this[i + start] = bytes[i % len];
|
27234 | }
|
27235 | }
|
27236 |
|
27237 | return this
|
27238 | };
|
27239 |
|
27240 | // HELPER FUNCTIONS
|
27241 | // ================
|
27242 |
|
27243 | var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g;
|
27244 |
|
27245 | function base64clean (str) {
|
27246 | // Node strips out invalid characters like \n and \t from the string, base64-js does not
|
27247 | str = stringtrim(str).replace(INVALID_BASE64_RE, '');
|
27248 | // Node converts strings with length < 2 to ''
|
27249 | if (str.length < 2) return ''
|
27250 | // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
|
27251 | while (str.length % 4 !== 0) {
|
27252 | str = str + '=';
|
27253 | }
|
27254 | return str
|
27255 | }
|
27256 |
|
27257 | function stringtrim (str) {
|
27258 | if (str.trim) return str.trim()
|
27259 | return str.replace(/^\s+|\s+$/g, '')
|
27260 | }
|
27261 |
|
27262 | function toHex (n) {
|
27263 | if (n < 16) return '0' + n.toString(16)
|
27264 | return n.toString(16)
|
27265 | }
|
27266 |
|
27267 | function utf8ToBytes (string, units) {
|
27268 | units = units || Infinity;
|
27269 | var codePoint;
|
27270 | var length = string.length;
|
27271 | var leadSurrogate = null;
|
27272 | var bytes = [];
|
27273 |
|
27274 | for (var i = 0; i < length; ++i) {
|
27275 | codePoint = string.charCodeAt(i);
|
27276 |
|
27277 | // is surrogate component
|
27278 | if (codePoint > 0xD7FF && codePoint < 0xE000) {
|
27279 | // last char was a lead
|
27280 | if (!leadSurrogate) {
|
27281 | // no lead yet
|
27282 | if (codePoint > 0xDBFF) {
|
27283 | // unexpected trail
|
27284 | if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
|
27285 | continue
|
27286 | } else if (i + 1 === length) {
|
27287 | // unpaired lead
|
27288 | if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
|
27289 | continue
|
27290 | }
|
27291 |
|
27292 | // valid lead
|
27293 | leadSurrogate = codePoint;
|
27294 |
|
27295 | continue
|
27296 | }
|
27297 |
|
27298 | // 2 leads in a row
|
27299 | if (codePoint < 0xDC00) {
|
27300 | if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
|
27301 | leadSurrogate = codePoint;
|
27302 | continue
|
27303 | }
|
27304 |
|
27305 | // valid surrogate pair
|
27306 | codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000;
|
27307 | } else if (leadSurrogate) {
|
27308 | // valid bmp char, but last char was a lead
|
27309 | if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
|
27310 | }
|
27311 |
|
27312 | leadSurrogate = null;
|
27313 |
|
27314 | // encode utf8
|
27315 | if (codePoint < 0x80) {
|
27316 | if ((units -= 1) < 0) break
|
27317 | bytes.push(codePoint);
|
27318 | } else if (codePoint < 0x800) {
|
27319 | if ((units -= 2) < 0) break
|
27320 | bytes.push(
|
27321 | codePoint >> 0x6 | 0xC0,
|
27322 | codePoint & 0x3F | 0x80
|
27323 | );
|
27324 | } else if (codePoint < 0x10000) {
|
27325 | if ((units -= 3) < 0) break
|
27326 | bytes.push(
|
27327 | codePoint >> 0xC | 0xE0,
|
27328 | codePoint >> 0x6 & 0x3F | 0x80,
|
27329 | codePoint & 0x3F | 0x80
|
27330 | );
|
27331 | } else if (codePoint < 0x110000) {
|
27332 | if ((units -= 4) < 0) break
|
27333 | bytes.push(
|
27334 | codePoint >> 0x12 | 0xF0,
|
27335 | codePoint >> 0xC & 0x3F | 0x80,
|
27336 | codePoint >> 0x6 & 0x3F | 0x80,
|
27337 | codePoint & 0x3F | 0x80
|
27338 | );
|
27339 | } else {
|
27340 | throw new Error('Invalid code point')
|
27341 | }
|
27342 | }
|
27343 |
|
27344 | return bytes
|
27345 | }
|
27346 |
|
27347 | function asciiToBytes (str) {
|
27348 | var byteArray = [];
|
27349 | for (var i = 0; i < str.length; ++i) {
|
27350 | // Node's code seems to be doing this and not & 0x7F..
|
27351 | byteArray.push(str.charCodeAt(i) & 0xFF);
|
27352 | }
|
27353 | return byteArray
|
27354 | }
|
27355 |
|
27356 | function utf16leToBytes (str, units) {
|
27357 | var c, hi, lo;
|
27358 | var byteArray = [];
|
27359 | for (var i = 0; i < str.length; ++i) {
|
27360 | if ((units -= 2) < 0) break
|
27361 |
|
27362 | c = str.charCodeAt(i);
|
27363 | hi = c >> 8;
|
27364 | lo = c % 256;
|
27365 | byteArray.push(lo);
|
27366 | byteArray.push(hi);
|
27367 | }
|
27368 |
|
27369 | return byteArray
|
27370 | }
|
27371 |
|
27372 |
|
27373 | function base64ToBytes (str) {
|
27374 | return toByteArray(base64clean(str))
|
27375 | }
|
27376 |
|
27377 | function blitBuffer (src, dst, offset, length) {
|
27378 | for (var i = 0; i < length; ++i) {
|
27379 | if ((i + offset >= dst.length) || (i >= src.length)) break
|
27380 | dst[i + offset] = src[i];
|
27381 | }
|
27382 | return i
|
27383 | }
|
27384 |
|
27385 | function isnan (val) {
|
27386 | return val !== val // eslint-disable-line no-self-compare
|
27387 | }
|
27388 |
|
27389 |
|
27390 | // the following is from is-buffer, also by Feross Aboukhadijeh and with same lisence
|
27391 | // The _isBuffer check is for Safari 5-7 support, because it's missing
|
27392 | // Object.prototype.constructor. Remove this eventually
|
27393 | function isBuffer(obj) {
|
27394 | return obj != null && (!!obj._isBuffer || isFastBuffer(obj) || isSlowBuffer(obj))
|
27395 | }
|
27396 |
|
27397 | function isFastBuffer (obj) {
|
27398 | return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
|
27399 | }
|
27400 |
|
27401 | // For Node v0.10 support. Remove this eventually.
|
27402 | function isSlowBuffer (obj) {
|
27403 | return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isFastBuffer(obj.slice(0, 0))
|
27404 | }
|
27405 |
|
27406 | var inherits;
|
27407 | if (typeof Object.create === 'function'){
|
27408 | inherits = function inherits(ctor, superCtor) {
|
27409 | // implementation from standard node.js 'util' module
|
27410 | ctor.super_ = superCtor;
|
27411 | ctor.prototype = Object.create(superCtor.prototype, {
|
27412 | constructor: {
|
27413 | value: ctor,
|
27414 | enumerable: false,
|
27415 | writable: true,
|
27416 | configurable: true
|
27417 | }
|
27418 | });
|
27419 | };
|
27420 | } else {
|
27421 | inherits = function inherits(ctor, superCtor) {
|
27422 | ctor.super_ = superCtor;
|
27423 | var TempCtor = function () {};
|
27424 | TempCtor.prototype = superCtor.prototype;
|
27425 | ctor.prototype = new TempCtor();
|
27426 | ctor.prototype.constructor = ctor;
|
27427 | };
|
27428 | }
|
27429 | var inherits$1 = inherits;
|
27430 |
|
27431 | // Copyright Joyent, Inc. and other Node contributors.
|
27432 | //
|
27433 | // Permission is hereby granted, free of charge, to any person obtaining a
|
27434 | // copy of this software and associated documentation files (the
|
27435 | // "Software"), to deal in the Software without restriction, including
|
27436 | // without limitation the rights to use, copy, modify, merge, publish,
|
27437 | // distribute, sublicense, and/or sell copies of the Software, and to permit
|
27438 | // persons to whom the Software is furnished to do so, subject to the
|
27439 | // following conditions:
|
27440 | //
|
27441 | // The above copyright notice and this permission notice shall be included
|
27442 | // in all copies or substantial portions of the Software.
|
27443 | //
|
27444 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
27445 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
27446 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
27447 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
27448 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
27449 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
27450 | // USE OR OTHER DEALINGS IN THE SOFTWARE.
|
27451 | var formatRegExp = /%[sdj%]/g;
|
27452 | function format(f) {
|
27453 | if (!isString(f)) {
|
27454 | var objects = [];
|
27455 | for (var i = 0; i < arguments.length; i++) {
|
27456 | objects.push(inspect(arguments[i]));
|
27457 | }
|
27458 | return objects.join(' ');
|
27459 | }
|
27460 |
|
27461 | var i = 1;
|
27462 | var args = arguments;
|
27463 | var len = args.length;
|
27464 | var str = String(f).replace(formatRegExp, function(x) {
|
27465 | if (x === '%%') return '%';
|
27466 | if (i >= len) return x;
|
27467 | switch (x) {
|
27468 | case '%s': return String(args[i++]);
|
27469 | case '%d': return Number(args[i++]);
|
27470 | case '%j':
|
27471 | try {
|
27472 | return JSON.stringify(args[i++]);
|
27473 | } catch (_) {
|
27474 | return '[Circular]';
|
27475 | }
|
27476 | default:
|
27477 | return x;
|
27478 | }
|
27479 | });
|
27480 | for (var x = args[i]; i < len; x = args[++i]) {
|
27481 | if (isNull(x) || !isObject(x)) {
|
27482 | str += ' ' + x;
|
27483 | } else {
|
27484 | str += ' ' + inspect(x);
|
27485 | }
|
27486 | }
|
27487 | return str;
|
27488 | }
|
27489 |
|
27490 |
|
27491 | // Mark that a method should not be used.
|
27492 | // Returns a modified function which warns once by default.
|
27493 | // If --no-deprecation is set, then it is a no-op.
|
27494 | function deprecate(fn, msg) {
|
27495 | // Allow for deprecating things in the process of starting up.
|
27496 | if (isUndefined(global$1.process)) {
|
27497 | return function() {
|
27498 | return deprecate(fn, msg).apply(this, arguments);
|
27499 | };
|
27500 | }
|
27501 |
|
27502 | if (process.noDeprecation === true) {
|
27503 | return fn;
|
27504 | }
|
27505 |
|
27506 | var warned = false;
|
27507 | function deprecated() {
|
27508 | if (!warned) {
|
27509 | if (process.throwDeprecation) {
|
27510 | throw new Error(msg);
|
27511 | } else if (process.traceDeprecation) {
|
27512 | console.trace(msg);
|
27513 | } else {
|
27514 | console.error(msg);
|
27515 | }
|
27516 | warned = true;
|
27517 | }
|
27518 | return fn.apply(this, arguments);
|
27519 | }
|
27520 |
|
27521 | return deprecated;
|
27522 | }
|
27523 |
|
27524 |
|
27525 | var debugs = {};
|
27526 | var debugEnviron;
|
27527 | function debuglog(set) {
|
27528 | if (isUndefined(debugEnviron))
|
27529 | debugEnviron = process.env.NODE_DEBUG || '';
|
27530 | set = set.toUpperCase();
|
27531 | if (!debugs[set]) {
|
27532 | if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
|
27533 | var pid = 0;
|
27534 | debugs[set] = function() {
|
27535 | var msg = format.apply(null, arguments);
|
27536 | console.error('%s %d: %s', set, pid, msg);
|
27537 | };
|
27538 | } else {
|
27539 | debugs[set] = function() {};
|
27540 | }
|
27541 | }
|
27542 | return debugs[set];
|
27543 | }
|
27544 |
|
27545 |
|
27546 | /**
|
27547 | * Echos the value of a value. Trys to print the value out
|
27548 | * in the best way possible given the different types.
|
27549 | *
|
27550 | * @param {Object} obj The object to print out.
|
27551 | * @param {Object} opts Optional options object that alters the output.
|
27552 | */
|
27553 | /* legacy: obj, showHidden, depth, colors*/
|
27554 | function inspect(obj, opts) {
|
27555 | // default options
|
27556 | var ctx = {
|
27557 | seen: [],
|
27558 | stylize: stylizeNoColor
|
27559 | };
|
27560 | // legacy...
|
27561 | if (arguments.length >= 3) ctx.depth = arguments[2];
|
27562 | if (arguments.length >= 4) ctx.colors = arguments[3];
|
27563 | if (isBoolean(opts)) {
|
27564 | // legacy...
|
27565 | ctx.showHidden = opts;
|
27566 | } else if (opts) {
|
27567 | // got an "options" object
|
27568 | _extend(ctx, opts);
|
27569 | }
|
27570 | // set default options
|
27571 | if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
|
27572 | if (isUndefined(ctx.depth)) ctx.depth = 2;
|
27573 | if (isUndefined(ctx.colors)) ctx.colors = false;
|
27574 | if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
|
27575 | if (ctx.colors) ctx.stylize = stylizeWithColor;
|
27576 | return formatValue(ctx, obj, ctx.depth);
|
27577 | }
|
27578 |
|
27579 | // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
|
27580 | inspect.colors = {
|
27581 | 'bold' : [1, 22],
|
27582 | 'italic' : [3, 23],
|
27583 | 'underline' : [4, 24],
|
27584 | 'inverse' : [7, 27],
|
27585 | 'white' : [37, 39],
|
27586 | 'grey' : [90, 39],
|
27587 | 'black' : [30, 39],
|
27588 | 'blue' : [34, 39],
|
27589 | 'cyan' : [36, 39],
|
27590 | 'green' : [32, 39],
|
27591 | 'magenta' : [35, 39],
|
27592 | 'red' : [31, 39],
|
27593 | 'yellow' : [33, 39]
|
27594 | };
|
27595 |
|
27596 | // Don't use 'blue' not visible on cmd.exe
|
27597 | inspect.styles = {
|
27598 | 'special': 'cyan',
|
27599 | 'number': 'yellow',
|
27600 | 'boolean': 'yellow',
|
27601 | 'undefined': 'grey',
|
27602 | 'null': 'bold',
|
27603 | 'string': 'green',
|
27604 | 'date': 'magenta',
|
27605 | // "name": intentionally not styling
|
27606 | 'regexp': 'red'
|
27607 | };
|
27608 |
|
27609 |
|
27610 | function stylizeWithColor(str, styleType) {
|
27611 | var style = inspect.styles[styleType];
|
27612 |
|
27613 | if (style) {
|
27614 | return '\u001b[' + inspect.colors[style][0] + 'm' + str +
|
27615 | '\u001b[' + inspect.colors[style][1] + 'm';
|
27616 | } else {
|
27617 | return str;
|
27618 | }
|
27619 | }
|
27620 |
|
27621 |
|
27622 | function stylizeNoColor(str, styleType) {
|
27623 | return str;
|
27624 | }
|
27625 |
|
27626 |
|
27627 | function arrayToHash(array) {
|
27628 | var hash = {};
|
27629 |
|
27630 | array.forEach(function(val, idx) {
|
27631 | hash[val] = true;
|
27632 | });
|
27633 |
|
27634 | return hash;
|
27635 | }
|
27636 |
|
27637 |
|
27638 | function formatValue(ctx, value, recurseTimes) {
|
27639 | // Provide a hook for user-specified inspect functions.
|
27640 | // Check that value is an object with an inspect function on it
|
27641 | if (ctx.customInspect &&
|
27642 | value &&
|
27643 | isFunction(value.inspect) &&
|
27644 | // Filter out the util module, it's inspect function is special
|
27645 | value.inspect !== inspect &&
|
27646 | // Also filter out any prototype objects using the circular check.
|
27647 | !(value.constructor && value.constructor.prototype === value)) {
|
27648 | var ret = value.inspect(recurseTimes, ctx);
|
27649 | if (!isString(ret)) {
|
27650 | ret = formatValue(ctx, ret, recurseTimes);
|
27651 | }
|
27652 | return ret;
|
27653 | }
|
27654 |
|
27655 | // Primitive types cannot have properties
|
27656 | var primitive = formatPrimitive(ctx, value);
|
27657 | if (primitive) {
|
27658 | return primitive;
|
27659 | }
|
27660 |
|
27661 | // Look up the keys of the object.
|
27662 | var keys = Object.keys(value);
|
27663 | var visibleKeys = arrayToHash(keys);
|
27664 |
|
27665 | if (ctx.showHidden) {
|
27666 | keys = Object.getOwnPropertyNames(value);
|
27667 | }
|
27668 |
|
27669 | // IE doesn't make error fields non-enumerable
|
27670 | // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
|
27671 | if (isError(value)
|
27672 | && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
|
27673 | return formatError(value);
|
27674 | }
|
27675 |
|
27676 | // Some type of object without properties can be shortcutted.
|
27677 | if (keys.length === 0) {
|
27678 | if (isFunction(value)) {
|
27679 | var name = value.name ? ': ' + value.name : '';
|
27680 | return ctx.stylize('[Function' + name + ']', 'special');
|
27681 | }
|
27682 | if (isRegExp(value)) {
|
27683 | return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
|
27684 | }
|
27685 | if (isDate(value)) {
|
27686 | return ctx.stylize(Date.prototype.toString.call(value), 'date');
|
27687 | }
|
27688 | if (isError(value)) {
|
27689 | return formatError(value);
|
27690 | }
|
27691 | }
|
27692 |
|
27693 | var base = '', array = false, braces = ['{', '}'];
|
27694 |
|
27695 | // Make Array say that they are Array
|
27696 | if (isArray$1(value)) {
|
27697 | array = true;
|
27698 | braces = ['[', ']'];
|
27699 | }
|
27700 |
|
27701 | // Make functions say that they are functions
|
27702 | if (isFunction(value)) {
|
27703 | var n = value.name ? ': ' + value.name : '';
|
27704 | base = ' [Function' + n + ']';
|
27705 | }
|
27706 |
|
27707 | // Make RegExps say that they are RegExps
|
27708 | if (isRegExp(value)) {
|
27709 | base = ' ' + RegExp.prototype.toString.call(value);
|
27710 | }
|
27711 |
|
27712 | // Make dates with properties first say the date
|
27713 | if (isDate(value)) {
|
27714 | base = ' ' + Date.prototype.toUTCString.call(value);
|
27715 | }
|
27716 |
|
27717 | // Make error with message first say the error
|
27718 | if (isError(value)) {
|
27719 | base = ' ' + formatError(value);
|
27720 | }
|
27721 |
|
27722 | if (keys.length === 0 && (!array || value.length == 0)) {
|
27723 | return braces[0] + base + braces[1];
|
27724 | }
|
27725 |
|
27726 | if (recurseTimes < 0) {
|
27727 | if (isRegExp(value)) {
|
27728 | return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
|
27729 | } else {
|
27730 | return ctx.stylize('[Object]', 'special');
|
27731 | }
|
27732 | }
|
27733 |
|
27734 | ctx.seen.push(value);
|
27735 |
|
27736 | var output;
|
27737 | if (array) {
|
27738 | output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
|
27739 | } else {
|
27740 | output = keys.map(function(key) {
|
27741 | return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
|
27742 | });
|
27743 | }
|
27744 |
|
27745 | ctx.seen.pop();
|
27746 |
|
27747 | return reduceToSingleString(output, base, braces);
|
27748 | }
|
27749 |
|
27750 |
|
27751 | function formatPrimitive(ctx, value) {
|
27752 | if (isUndefined(value))
|
27753 | return ctx.stylize('undefined', 'undefined');
|
27754 | if (isString(value)) {
|
27755 | var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
|
27756 | .replace(/'/g, "\\'")
|
27757 | .replace(/\\"/g, '"') + '\'';
|
27758 | return ctx.stylize(simple, 'string');
|
27759 | }
|
27760 | if (isNumber(value))
|
27761 | return ctx.stylize('' + value, 'number');
|
27762 | if (isBoolean(value))
|
27763 | return ctx.stylize('' + value, 'boolean');
|
27764 | // For some reason typeof null is "object", so special case here.
|
27765 | if (isNull(value))
|
27766 | return ctx.stylize('null', 'null');
|
27767 | }
|
27768 |
|
27769 |
|
27770 | function formatError(value) {
|
27771 | return '[' + Error.prototype.toString.call(value) + ']';
|
27772 | }
|
27773 |
|
27774 |
|
27775 | function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
|
27776 | var output = [];
|
27777 | for (var i = 0, l = value.length; i < l; ++i) {
|
27778 | if (hasOwnProperty$4(value, String(i))) {
|
27779 | output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
|
27780 | String(i), true));
|
27781 | } else {
|
27782 | output.push('');
|
27783 | }
|
27784 | }
|
27785 | keys.forEach(function(key) {
|
27786 | if (!key.match(/^\d+$/)) {
|
27787 | output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
|
27788 | key, true));
|
27789 | }
|
27790 | });
|
27791 | return output;
|
27792 | }
|
27793 |
|
27794 |
|
27795 | function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
|
27796 | var name, str, desc;
|
27797 | desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
|
27798 | if (desc.get) {
|
27799 | if (desc.set) {
|
27800 | str = ctx.stylize('[Getter/Setter]', 'special');
|
27801 | } else {
|
27802 | str = ctx.stylize('[Getter]', 'special');
|
27803 | }
|
27804 | } else {
|
27805 | if (desc.set) {
|
27806 | str = ctx.stylize('[Setter]', 'special');
|
27807 | }
|
27808 | }
|
27809 | if (!hasOwnProperty$4(visibleKeys, key)) {
|
27810 | name = '[' + key + ']';
|
27811 | }
|
27812 | if (!str) {
|
27813 | if (ctx.seen.indexOf(desc.value) < 0) {
|
27814 | if (isNull(recurseTimes)) {
|
27815 | str = formatValue(ctx, desc.value, null);
|
27816 | } else {
|
27817 | str = formatValue(ctx, desc.value, recurseTimes - 1);
|
27818 | }
|
27819 | if (str.indexOf('\n') > -1) {
|
27820 | if (array) {
|
27821 | str = str.split('\n').map(function(line) {
|
27822 | return ' ' + line;
|
27823 | }).join('\n').substr(2);
|
27824 | } else {
|
27825 | str = '\n' + str.split('\n').map(function(line) {
|
27826 | return ' ' + line;
|
27827 | }).join('\n');
|
27828 | }
|
27829 | }
|
27830 | } else {
|
27831 | str = ctx.stylize('[Circular]', 'special');
|
27832 | }
|
27833 | }
|
27834 | if (isUndefined(name)) {
|
27835 | if (array && key.match(/^\d+$/)) {
|
27836 | return str;
|
27837 | }
|
27838 | name = JSON.stringify('' + key);
|
27839 | if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
|
27840 | name = name.substr(1, name.length - 2);
|
27841 | name = ctx.stylize(name, 'name');
|
27842 | } else {
|
27843 | name = name.replace(/'/g, "\\'")
|
27844 | .replace(/\\"/g, '"')
|
27845 | .replace(/(^"|"$)/g, "'");
|
27846 | name = ctx.stylize(name, 'string');
|
27847 | }
|
27848 | }
|
27849 |
|
27850 | return name + ': ' + str;
|
27851 | }
|
27852 |
|
27853 |
|
27854 | function reduceToSingleString(output, base, braces) {
|
27855 | var numLinesEst = 0;
|
27856 | var length = output.reduce(function(prev, cur) {
|
27857 | numLinesEst++;
|
27858 | if (cur.indexOf('\n') >= 0) numLinesEst++;
|
27859 | return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
|
27860 | }, 0);
|
27861 |
|
27862 | if (length > 60) {
|
27863 | return braces[0] +
|
27864 | (base === '' ? '' : base + '\n ') +
|
27865 | ' ' +
|
27866 | output.join(',\n ') +
|
27867 | ' ' +
|
27868 | braces[1];
|
27869 | }
|
27870 |
|
27871 | return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
|
27872 | }
|
27873 |
|
27874 |
|
27875 | // NOTE: These type checking functions intentionally don't use `instanceof`
|
27876 | // because it is fragile and can be easily faked with `Object.create()`.
|
27877 | function isArray$1(ar) {
|
27878 | return Array.isArray(ar);
|
27879 | }
|
27880 |
|
27881 | function isBoolean(arg) {
|
27882 | return typeof arg === 'boolean';
|
27883 | }
|
27884 |
|
27885 | function isNull(arg) {
|
27886 | return arg === null;
|
27887 | }
|
27888 |
|
27889 |
|
27890 |
|
27891 | function isNumber(arg) {
|
27892 | return typeof arg === 'number';
|
27893 | }
|
27894 |
|
27895 | function isString(arg) {
|
27896 | return typeof arg === 'string';
|
27897 | }
|
27898 |
|
27899 |
|
27900 |
|
27901 | function isUndefined(arg) {
|
27902 | return arg === void 0;
|
27903 | }
|
27904 |
|
27905 | function isRegExp(re) {
|
27906 | return isObject(re) && objectToString(re) === '[object RegExp]';
|
27907 | }
|
27908 |
|
27909 | function isObject(arg) {
|
27910 | return typeof arg === 'object' && arg !== null;
|
27911 | }
|
27912 |
|
27913 | function isDate(d) {
|
27914 | return isObject(d) && objectToString(d) === '[object Date]';
|
27915 | }
|
27916 |
|
27917 | function isError(e) {
|
27918 | return isObject(e) &&
|
27919 | (objectToString(e) === '[object Error]' || e instanceof Error);
|
27920 | }
|
27921 |
|
27922 | function isFunction(arg) {
|
27923 | return typeof arg === 'function';
|
27924 | }
|
27925 |
|
27926 |
|
27927 |
|
27928 |
|
27929 |
|
27930 | function objectToString(o) {
|
27931 | return Object.prototype.toString.call(o);
|
27932 | }
|
27933 |
|
27934 |
|
27935 | // log is just a thin wrapper to console.log that prepends a timestamp
|
27936 |
|
27937 |
|
27938 |
|
27939 | /**
|
27940 | * Inherit the prototype methods from one constructor into another.
|
27941 | *
|
27942 | * The Function.prototype.inherits from lang.js rewritten as a standalone
|
27943 | * function (not on Function.prototype). NOTE: If this file is to be loaded
|
27944 | * during bootstrapping this function needs to be rewritten using some native
|
27945 | * functions as prototype setup using normal JavaScript does not work as
|
27946 | * expected during bootstrapping (see mirror.js in r114903).
|
27947 | *
|
27948 | * @param {function} ctor Constructor function which needs to inherit the
|
27949 | * prototype.
|
27950 | * @param {function} superCtor Constructor function to inherit prototype from.
|
27951 | */
|
27952 | function _extend(origin, add) {
|
27953 | // Don't do anything if add isn't an object
|
27954 | if (!add || !isObject(add)) return origin;
|
27955 |
|
27956 | var keys = Object.keys(add);
|
27957 | var i = keys.length;
|
27958 | while (i--) {
|
27959 | origin[keys[i]] = add[keys[i]];
|
27960 | }
|
27961 | return origin;
|
27962 | }
|
27963 |
|
27964 | function hasOwnProperty$4(obj, prop) {
|
27965 | return Object.prototype.hasOwnProperty.call(obj, prop);
|
27966 | }
|
27967 |
|
27968 | function BufferList$1() {
|
27969 | this.head = null;
|
27970 | this.tail = null;
|
27971 | this.length = 0;
|
27972 | }
|
27973 |
|
27974 | BufferList$1.prototype.push = function (v) {
|
27975 | var entry = { data: v, next: null };
|
27976 | if (this.length > 0) this.tail.next = entry;else this.head = entry;
|
27977 | this.tail = entry;
|
27978 | ++this.length;
|
27979 | };
|
27980 |
|
27981 | BufferList$1.prototype.unshift = function (v) {
|
27982 | var entry = { data: v, next: this.head };
|
27983 | if (this.length === 0) this.tail = entry;
|
27984 | this.head = entry;
|
27985 | ++this.length;
|
27986 | };
|
27987 |
|
27988 | BufferList$1.prototype.shift = function () {
|
27989 | if (this.length === 0) return;
|
27990 | var ret = this.head.data;
|
27991 | if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
|
27992 | --this.length;
|
27993 | return ret;
|
27994 | };
|
27995 |
|
27996 | BufferList$1.prototype.clear = function () {
|
27997 | this.head = this.tail = null;
|
27998 | this.length = 0;
|
27999 | };
|
28000 |
|
28001 | BufferList$1.prototype.join = function (s) {
|
28002 | if (this.length === 0) return '';
|
28003 | var p = this.head;
|
28004 | var ret = '' + p.data;
|
28005 | while (p = p.next) {
|
28006 | ret += s + p.data;
|
28007 | }return ret;
|
28008 | };
|
28009 |
|
28010 | BufferList$1.prototype.concat = function (n) {
|
28011 | if (this.length === 0) return Buffer.alloc(0);
|
28012 | if (this.length === 1) return this.head.data;
|
28013 | var ret = Buffer.allocUnsafe(n >>> 0);
|
28014 | var p = this.head;
|
28015 | var i = 0;
|
28016 | while (p) {
|
28017 | p.data.copy(ret, i);
|
28018 | i += p.data.length;
|
28019 | p = p.next;
|
28020 | }
|
28021 | return ret;
|
28022 | };
|
28023 |
|
28024 | // Copyright Joyent, Inc. and other Node contributors.
|
28025 | //
|
28026 | // Permission is hereby granted, free of charge, to any person obtaining a
|
28027 | // copy of this software and associated documentation files (the
|
28028 | // "Software"), to deal in the Software without restriction, including
|
28029 | // without limitation the rights to use, copy, modify, merge, publish,
|
28030 | // distribute, sublicense, and/or sell copies of the Software, and to permit
|
28031 | // persons to whom the Software is furnished to do so, subject to the
|
28032 | // following conditions:
|
28033 | //
|
28034 | // The above copyright notice and this permission notice shall be included
|
28035 | // in all copies or substantial portions of the Software.
|
28036 | //
|
28037 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
28038 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
28039 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
28040 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
28041 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
28042 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
28043 | // USE OR OTHER DEALINGS IN THE SOFTWARE.
|
28044 |
|
28045 | var isBufferEncoding = Buffer.isEncoding
|
28046 | || function(encoding) {
|
28047 | switch (encoding && encoding.toLowerCase()) {
|
28048 | 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;
|
28049 | default: return false;
|
28050 | }
|
28051 | };
|
28052 |
|
28053 |
|
28054 | function assertEncoding(encoding) {
|
28055 | if (encoding && !isBufferEncoding(encoding)) {
|
28056 | throw new Error('Unknown encoding: ' + encoding);
|
28057 | }
|
28058 | }
|
28059 |
|
28060 | // StringDecoder provides an interface for efficiently splitting a series of
|
28061 | // buffers into a series of JS strings without breaking apart multi-byte
|
28062 | // characters. CESU-8 is handled as part of the UTF-8 encoding.
|
28063 | //
|
28064 | // @TODO Handling all encodings inside a single object makes it very difficult
|
28065 | // to reason about this code, so it should be split up in the future.
|
28066 | // @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code
|
28067 | // points as used by CESU-8.
|
28068 | function StringDecoder(encoding) {
|
28069 | this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');
|
28070 | assertEncoding(encoding);
|
28071 | switch (this.encoding) {
|
28072 | case 'utf8':
|
28073 | // CESU-8 represents each of Surrogate Pair by 3-bytes
|
28074 | this.surrogateSize = 3;
|
28075 | break;
|
28076 | case 'ucs2':
|
28077 | case 'utf16le':
|
28078 | // UTF-16 represents each of Surrogate Pair by 2-bytes
|
28079 | this.surrogateSize = 2;
|
28080 | this.detectIncompleteChar = utf16DetectIncompleteChar;
|
28081 | break;
|
28082 | case 'base64':
|
28083 | // Base-64 stores 3 bytes in 4 chars, and pads the remainder.
|
28084 | this.surrogateSize = 3;
|
28085 | this.detectIncompleteChar = base64DetectIncompleteChar;
|
28086 | break;
|
28087 | default:
|
28088 | this.write = passThroughWrite;
|
28089 | return;
|
28090 | }
|
28091 |
|
28092 | // Enough space to store all bytes of a single character. UTF-8 needs 4
|
28093 | // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).
|
28094 | this.charBuffer = new Buffer(6);
|
28095 | // Number of bytes received for the current incomplete multi-byte character.
|
28096 | this.charReceived = 0;
|
28097 | // Number of bytes expected for the current incomplete multi-byte character.
|
28098 | this.charLength = 0;
|
28099 | }
|
28100 |
|
28101 |
|
28102 | // write decodes the given buffer and returns it as JS string that is
|
28103 | // guaranteed to not contain any partial multi-byte characters. Any partial
|
28104 | // character found at the end of the buffer is buffered up, and will be
|
28105 | // returned when calling write again with the remaining bytes.
|
28106 | //
|
28107 | // Note: Converting a Buffer containing an orphan surrogate to a String
|
28108 | // currently works, but converting a String to a Buffer (via `new Buffer`, or
|
28109 | // Buffer#write) will replace incomplete surrogates with the unicode
|
28110 | // replacement character. See https://codereview.chromium.org/121173009/ .
|
28111 | StringDecoder.prototype.write = function(buffer) {
|
28112 | var charStr = '';
|
28113 | // if our last write ended with an incomplete multibyte character
|
28114 | while (this.charLength) {
|
28115 | // determine how many remaining bytes this buffer has to offer for this char
|
28116 | var available = (buffer.length >= this.charLength - this.charReceived) ?
|
28117 | this.charLength - this.charReceived :
|
28118 | buffer.length;
|
28119 |
|
28120 | // add the new bytes to the char buffer
|
28121 | buffer.copy(this.charBuffer, this.charReceived, 0, available);
|
28122 | this.charReceived += available;
|
28123 |
|
28124 | if (this.charReceived < this.charLength) {
|
28125 | // still not enough chars in this buffer? wait for more ...
|
28126 | return '';
|
28127 | }
|
28128 |
|
28129 | // remove bytes belonging to the current character from the buffer
|
28130 | buffer = buffer.slice(available, buffer.length);
|
28131 |
|
28132 | // get the character that was split
|
28133 | charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);
|
28134 |
|
28135 | // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
|
28136 | var charCode = charStr.charCodeAt(charStr.length - 1);
|
28137 | if (charCode >= 0xD800 && charCode <= 0xDBFF) {
|
28138 | this.charLength += this.surrogateSize;
|
28139 | charStr = '';
|
28140 | continue;
|
28141 | }
|
28142 | this.charReceived = this.charLength = 0;
|
28143 |
|
28144 | // if there are no more bytes in this buffer, just emit our char
|
28145 | if (buffer.length === 0) {
|
28146 | return charStr;
|
28147 | }
|
28148 | break;
|
28149 | }
|
28150 |
|
28151 | // determine and set charLength / charReceived
|
28152 | this.detectIncompleteChar(buffer);
|
28153 |
|
28154 | var end = buffer.length;
|
28155 | if (this.charLength) {
|
28156 | // buffer the incomplete character bytes we got
|
28157 | buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);
|
28158 | end -= this.charReceived;
|
28159 | }
|
28160 |
|
28161 | charStr += buffer.toString(this.encoding, 0, end);
|
28162 |
|
28163 | var end = charStr.length - 1;
|
28164 | var charCode = charStr.charCodeAt(end);
|
28165 | // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
|
28166 | if (charCode >= 0xD800 && charCode <= 0xDBFF) {
|
28167 | var size = this.surrogateSize;
|
28168 | this.charLength += size;
|
28169 | this.charReceived += size;
|
28170 | this.charBuffer.copy(this.charBuffer, size, 0, size);
|
28171 | buffer.copy(this.charBuffer, 0, 0, size);
|
28172 | return charStr.substring(0, end);
|
28173 | }
|
28174 |
|
28175 | // or just emit the charStr
|
28176 | return charStr;
|
28177 | };
|
28178 |
|
28179 | // detectIncompleteChar determines if there is an incomplete UTF-8 character at
|
28180 | // the end of the given buffer. If so, it sets this.charLength to the byte
|
28181 | // length that character, and sets this.charReceived to the number of bytes
|
28182 | // that are available for this character.
|
28183 | StringDecoder.prototype.detectIncompleteChar = function(buffer) {
|
28184 | // determine how many bytes we have to check at the end of this buffer
|
28185 | var i = (buffer.length >= 3) ? 3 : buffer.length;
|
28186 |
|
28187 | // Figure out if one of the last i bytes of our buffer announces an
|
28188 | // incomplete char.
|
28189 | for (; i > 0; i--) {
|
28190 | var c = buffer[buffer.length - i];
|
28191 |
|
28192 | // See http://en.wikipedia.org/wiki/UTF-8#Description
|
28193 |
|
28194 | // 110XXXXX
|
28195 | if (i == 1 && c >> 5 == 0x06) {
|
28196 | this.charLength = 2;
|
28197 | break;
|
28198 | }
|
28199 |
|
28200 | // 1110XXXX
|
28201 | if (i <= 2 && c >> 4 == 0x0E) {
|
28202 | this.charLength = 3;
|
28203 | break;
|
28204 | }
|
28205 |
|
28206 | // 11110XXX
|
28207 | if (i <= 3 && c >> 3 == 0x1E) {
|
28208 | this.charLength = 4;
|
28209 | break;
|
28210 | }
|
28211 | }
|
28212 | this.charReceived = i;
|
28213 | };
|
28214 |
|
28215 | StringDecoder.prototype.end = function(buffer) {
|
28216 | var res = '';
|
28217 | if (buffer && buffer.length)
|
28218 | res = this.write(buffer);
|
28219 |
|
28220 | if (this.charReceived) {
|
28221 | var cr = this.charReceived;
|
28222 | var buf = this.charBuffer;
|
28223 | var enc = this.encoding;
|
28224 | res += buf.slice(0, cr).toString(enc);
|
28225 | }
|
28226 |
|
28227 | return res;
|
28228 | };
|
28229 |
|
28230 | function passThroughWrite(buffer) {
|
28231 | return buffer.toString(this.encoding);
|
28232 | }
|
28233 |
|
28234 | function utf16DetectIncompleteChar(buffer) {
|
28235 | this.charReceived = buffer.length % 2;
|
28236 | this.charLength = this.charReceived ? 2 : 0;
|
28237 | }
|
28238 |
|
28239 | function base64DetectIncompleteChar(buffer) {
|
28240 | this.charReceived = buffer.length % 3;
|
28241 | this.charLength = this.charReceived ? 3 : 0;
|
28242 | }
|
28243 |
|
28244 |
|
28245 | var stringDecoder = Object.freeze({
|
28246 | StringDecoder: StringDecoder
|
28247 | });
|
28248 |
|
28249 | Readable$1.ReadableState = ReadableState;
|
28250 | var debug = debuglog('stream');
|
28251 | inherits$1(Readable$1, EventEmitter);
|
28252 |
|
28253 | function prependListener(emitter, event, fn) {
|
28254 | // Sadly this is not cacheable as some libraries bundle their own
|
28255 | // event emitter implementation with them.
|
28256 | if (typeof emitter.prependListener === 'function') {
|
28257 | return emitter.prependListener(event, fn);
|
28258 | } else {
|
28259 | // This is a hack to make sure that our error handler is attached before any
|
28260 | // userland ones. NEVER DO THIS. This is here only because this code needs
|
28261 | // to continue to work with older versions of Node.js that do not include
|
28262 | // the prependListener() method. The goal is to eventually remove this hack.
|
28263 | if (!emitter._events || !emitter._events[event])
|
28264 | emitter.on(event, fn);
|
28265 | else if (Array.isArray(emitter._events[event]))
|
28266 | emitter._events[event].unshift(fn);
|
28267 | else
|
28268 | emitter._events[event] = [fn, emitter._events[event]];
|
28269 | }
|
28270 | }
|
28271 | function listenerCount$1 (emitter, type) {
|
28272 | return emitter.listeners(type).length;
|
28273 | }
|
28274 | function ReadableState(options, stream) {
|
28275 |
|
28276 | options = options || {};
|
28277 |
|
28278 | // object stream flag. Used to make read(n) ignore n and to
|
28279 | // make all the buffer merging and length checks go away
|
28280 | this.objectMode = !!options.objectMode;
|
28281 |
|
28282 | if (stream instanceof Duplex$1) this.objectMode = this.objectMode || !!options.readableObjectMode;
|
28283 |
|
28284 | // the point at which it stops calling _read() to fill the buffer
|
28285 | // Note: 0 is a valid value, means "don't call _read preemptively ever"
|
28286 | var hwm = options.highWaterMark;
|
28287 | var defaultHwm = this.objectMode ? 16 : 16 * 1024;
|
28288 | this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;
|
28289 |
|
28290 | // cast to ints.
|
28291 | this.highWaterMark = ~ ~this.highWaterMark;
|
28292 |
|
28293 | // A linked list is used to store data chunks instead of an array because the
|
28294 | // linked list can remove elements from the beginning faster than
|
28295 | // array.shift()
|
28296 | this.buffer = new BufferList$1();
|
28297 | this.length = 0;
|
28298 | this.pipes = null;
|
28299 | this.pipesCount = 0;
|
28300 | this.flowing = null;
|
28301 | this.ended = false;
|
28302 | this.endEmitted = false;
|
28303 | this.reading = false;
|
28304 |
|
28305 | // a flag to be able to tell if the onwrite cb is called immediately,
|
28306 | // or on a later tick. We set this to true at first, because any
|
28307 | // actions that shouldn't happen until "later" should generally also
|
28308 | // not happen before the first write call.
|
28309 | this.sync = true;
|
28310 |
|
28311 | // whenever we return null, then we set a flag to say
|
28312 | // that we're awaiting a 'readable' event emission.
|
28313 | this.needReadable = false;
|
28314 | this.emittedReadable = false;
|
28315 | this.readableListening = false;
|
28316 | this.resumeScheduled = false;
|
28317 |
|
28318 | // Crypto is kind of old and crusty. Historically, its default string
|
28319 | // encoding is 'binary' so we have to make this configurable.
|
28320 | // Everything else in the universe uses 'utf8', though.
|
28321 | this.defaultEncoding = options.defaultEncoding || 'utf8';
|
28322 |
|
28323 | // when piping, we only care about 'readable' events that happen
|
28324 | // after read()ing all the bytes and not getting any pushback.
|
28325 | this.ranOut = false;
|
28326 |
|
28327 | // the number of writers that are awaiting a drain event in .pipe()s
|
28328 | this.awaitDrain = 0;
|
28329 |
|
28330 | // if true, a maybeReadMore has been scheduled
|
28331 | this.readingMore = false;
|
28332 |
|
28333 | this.decoder = null;
|
28334 | this.encoding = null;
|
28335 | if (options.encoding) {
|
28336 | this.decoder = new StringDecoder(options.encoding);
|
28337 | this.encoding = options.encoding;
|
28338 | }
|
28339 | }
|
28340 | function Readable$1(options) {
|
28341 |
|
28342 | if (!(this instanceof Readable$1)) return new Readable$1(options);
|
28343 |
|
28344 | this._readableState = new ReadableState(options, this);
|
28345 |
|
28346 | // legacy
|
28347 | this.readable = true;
|
28348 |
|
28349 | if (options && typeof options.read === 'function') this._read = options.read;
|
28350 |
|
28351 | EventEmitter.call(this);
|
28352 | }
|
28353 |
|
28354 | // Manually shove something into the read() buffer.
|
28355 | // This returns true if the highWaterMark has not been hit yet,
|
28356 | // similar to how Writable.write() returns true if you should
|
28357 | // write() some more.
|
28358 | Readable$1.prototype.push = function (chunk, encoding) {
|
28359 | var state = this._readableState;
|
28360 |
|
28361 | if (!state.objectMode && typeof chunk === 'string') {
|
28362 | encoding = encoding || state.defaultEncoding;
|
28363 | if (encoding !== state.encoding) {
|
28364 | chunk = Buffer.from(chunk, encoding);
|
28365 | encoding = '';
|
28366 | }
|
28367 | }
|
28368 |
|
28369 | return readableAddChunk(this, state, chunk, encoding, false);
|
28370 | };
|
28371 |
|
28372 | // Unshift should *always* be something directly out of read()
|
28373 | Readable$1.prototype.unshift = function (chunk) {
|
28374 | var state = this._readableState;
|
28375 | return readableAddChunk(this, state, chunk, '', true);
|
28376 | };
|
28377 |
|
28378 | Readable$1.prototype.isPaused = function () {
|
28379 | return this._readableState.flowing === false;
|
28380 | };
|
28381 |
|
28382 | function readableAddChunk(stream, state, chunk, encoding, addToFront) {
|
28383 | var er = chunkInvalid(state, chunk);
|
28384 | if (er) {
|
28385 | stream.emit('error', er);
|
28386 | } else if (chunk === null) {
|
28387 | state.reading = false;
|
28388 | onEofChunk(stream, state);
|
28389 | } else if (state.objectMode || chunk && chunk.length > 0) {
|
28390 | if (state.ended && !addToFront) {
|
28391 | var e = new Error('stream.push() after EOF');
|
28392 | stream.emit('error', e);
|
28393 | } else if (state.endEmitted && addToFront) {
|
28394 | var _e = new Error('stream.unshift() after end event');
|
28395 | stream.emit('error', _e);
|
28396 | } else {
|
28397 | var skipAdd;
|
28398 | if (state.decoder && !addToFront && !encoding) {
|
28399 | chunk = state.decoder.write(chunk);
|
28400 | skipAdd = !state.objectMode && chunk.length === 0;
|
28401 | }
|
28402 |
|
28403 | if (!addToFront) state.reading = false;
|
28404 |
|
28405 | // Don't add to the buffer if we've decoded to an empty string chunk and
|
28406 | // we're not in object mode
|
28407 | if (!skipAdd) {
|
28408 | // if we want the data now, just emit it.
|
28409 | if (state.flowing && state.length === 0 && !state.sync) {
|
28410 | stream.emit('data', chunk);
|
28411 | stream.read(0);
|
28412 | } else {
|
28413 | // update the buffer info.
|
28414 | state.length += state.objectMode ? 1 : chunk.length;
|
28415 | if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
|
28416 |
|
28417 | if (state.needReadable) emitReadable(stream);
|
28418 | }
|
28419 | }
|
28420 |
|
28421 | maybeReadMore(stream, state);
|
28422 | }
|
28423 | } else if (!addToFront) {
|
28424 | state.reading = false;
|
28425 | }
|
28426 |
|
28427 | return needMoreData(state);
|
28428 | }
|
28429 |
|
28430 | // if it's past the high water mark, we can push in some more.
|
28431 | // Also, if we have no data yet, we can stand some
|
28432 | // more bytes. This is to work around cases where hwm=0,
|
28433 | // such as the repl. Also, if the push() triggered a
|
28434 | // readable event, and the user called read(largeNumber) such that
|
28435 | // needReadable was set, then we ought to push more, so that another
|
28436 | // 'readable' event will be triggered.
|
28437 | function needMoreData(state) {
|
28438 | return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
|
28439 | }
|
28440 |
|
28441 | // backwards compatibility.
|
28442 | Readable$1.prototype.setEncoding = function (enc) {
|
28443 | this._readableState.decoder = new StringDecoder(enc);
|
28444 | this._readableState.encoding = enc;
|
28445 | return this;
|
28446 | };
|
28447 |
|
28448 | // Don't raise the hwm > 8MB
|
28449 | var MAX_HWM = 0x800000;
|
28450 | function computeNewHighWaterMark(n) {
|
28451 | if (n >= MAX_HWM) {
|
28452 | n = MAX_HWM;
|
28453 | } else {
|
28454 | // Get the next highest power of 2 to prevent increasing hwm excessively in
|
28455 | // tiny amounts
|
28456 | n--;
|
28457 | n |= n >>> 1;
|
28458 | n |= n >>> 2;
|
28459 | n |= n >>> 4;
|
28460 | n |= n >>> 8;
|
28461 | n |= n >>> 16;
|
28462 | n++;
|
28463 | }
|
28464 | return n;
|
28465 | }
|
28466 |
|
28467 | // This function is designed to be inlinable, so please take care when making
|
28468 | // changes to the function body.
|
28469 | function howMuchToRead(n, state) {
|
28470 | if (n <= 0 || state.length === 0 && state.ended) return 0;
|
28471 | if (state.objectMode) return 1;
|
28472 | if (n !== n) {
|
28473 | // Only flow one buffer at a time
|
28474 | if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
|
28475 | }
|
28476 | // If we're asking for more than the current hwm, then raise the hwm.
|
28477 | if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
|
28478 | if (n <= state.length) return n;
|
28479 | // Don't have enough
|
28480 | if (!state.ended) {
|
28481 | state.needReadable = true;
|
28482 | return 0;
|
28483 | }
|
28484 | return state.length;
|
28485 | }
|
28486 |
|
28487 | // you can override either this method, or the async _read(n) below.
|
28488 | Readable$1.prototype.read = function (n) {
|
28489 | debug('read', n);
|
28490 | n = parseInt(n, 10);
|
28491 | var state = this._readableState;
|
28492 | var nOrig = n;
|
28493 |
|
28494 | if (n !== 0) state.emittedReadable = false;
|
28495 |
|
28496 | // if we're doing read(0) to trigger a readable event, but we
|
28497 | // already have a bunch of data in the buffer, then just trigger
|
28498 | // the 'readable' event and move on.
|
28499 | if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
|
28500 | debug('read: emitReadable', state.length, state.ended);
|
28501 | if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
|
28502 | return null;
|
28503 | }
|
28504 |
|
28505 | n = howMuchToRead(n, state);
|
28506 |
|
28507 | // if we've ended, and we're now clear, then finish it up.
|
28508 | if (n === 0 && state.ended) {
|
28509 | if (state.length === 0) endReadable(this);
|
28510 | return null;
|
28511 | }
|
28512 |
|
28513 | // All the actual chunk generation logic needs to be
|
28514 | // *below* the call to _read. The reason is that in certain
|
28515 | // synthetic stream cases, such as passthrough streams, _read
|
28516 | // may be a completely synchronous operation which may change
|
28517 | // the state of the read buffer, providing enough data when
|
28518 | // before there was *not* enough.
|
28519 | //
|
28520 | // So, the steps are:
|
28521 | // 1. Figure out what the state of things will be after we do
|
28522 | // a read from the buffer.
|
28523 | //
|
28524 | // 2. If that resulting state will trigger a _read, then call _read.
|
28525 | // Note that this may be asynchronous, or synchronous. Yes, it is
|
28526 | // deeply ugly to write APIs this way, but that still doesn't mean
|
28527 | // that the Readable class should behave improperly, as streams are
|
28528 | // designed to be sync/async agnostic.
|
28529 | // Take note if the _read call is sync or async (ie, if the read call
|
28530 | // has returned yet), so that we know whether or not it's safe to emit
|
28531 | // 'readable' etc.
|
28532 | //
|
28533 | // 3. Actually pull the requested chunks out of the buffer and return.
|
28534 |
|
28535 | // if we need a readable event, then we need to do some reading.
|
28536 | var doRead = state.needReadable;
|
28537 | debug('need readable', doRead);
|
28538 |
|
28539 | // if we currently have less than the highWaterMark, then also read some
|
28540 | if (state.length === 0 || state.length - n < state.highWaterMark) {
|
28541 | doRead = true;
|
28542 | debug('length less than watermark', doRead);
|
28543 | }
|
28544 |
|
28545 | // however, if we've ended, then there's no point, and if we're already
|
28546 | // reading, then it's unnecessary.
|
28547 | if (state.ended || state.reading) {
|
28548 | doRead = false;
|
28549 | debug('reading or ended', doRead);
|
28550 | } else if (doRead) {
|
28551 | debug('do read');
|
28552 | state.reading = true;
|
28553 | state.sync = true;
|
28554 | // if the length is currently zero, then we *need* a readable event.
|
28555 | if (state.length === 0) state.needReadable = true;
|
28556 | // call internal read method
|
28557 | this._read(state.highWaterMark);
|
28558 | state.sync = false;
|
28559 | // If _read pushed data synchronously, then `reading` will be false,
|
28560 | // and we need to re-evaluate how much data we can return to the user.
|
28561 | if (!state.reading) n = howMuchToRead(nOrig, state);
|
28562 | }
|
28563 |
|
28564 | var ret;
|
28565 | if (n > 0) ret = fromList(n, state);else ret = null;
|
28566 |
|
28567 | if (ret === null) {
|
28568 | state.needReadable = true;
|
28569 | n = 0;
|
28570 | } else {
|
28571 | state.length -= n;
|
28572 | }
|
28573 |
|
28574 | if (state.length === 0) {
|
28575 | // If we have nothing in the buffer, then we want to know
|
28576 | // as soon as we *do* get something into the buffer.
|
28577 | if (!state.ended) state.needReadable = true;
|
28578 |
|
28579 | // If we tried to read() past the EOF, then emit end on the next tick.
|
28580 | if (nOrig !== n && state.ended) endReadable(this);
|
28581 | }
|
28582 |
|
28583 | if (ret !== null) this.emit('data', ret);
|
28584 |
|
28585 | return ret;
|
28586 | };
|
28587 |
|
28588 | function chunkInvalid(state, chunk) {
|
28589 | var er = null;
|
28590 | if (!isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) {
|
28591 | er = new TypeError('Invalid non-string/buffer chunk');
|
28592 | }
|
28593 | return er;
|
28594 | }
|
28595 |
|
28596 | function onEofChunk(stream, state) {
|
28597 | if (state.ended) return;
|
28598 | if (state.decoder) {
|
28599 | var chunk = state.decoder.end();
|
28600 | if (chunk && chunk.length) {
|
28601 | state.buffer.push(chunk);
|
28602 | state.length += state.objectMode ? 1 : chunk.length;
|
28603 | }
|
28604 | }
|
28605 | state.ended = true;
|
28606 |
|
28607 | // emit 'readable' now to make sure it gets picked up.
|
28608 | emitReadable(stream);
|
28609 | }
|
28610 |
|
28611 | // Don't emit readable right away in sync mode, because this can trigger
|
28612 | // another read() call => stack overflow. This way, it might trigger
|
28613 | // a nextTick recursion warning, but that's not so bad.
|
28614 | function emitReadable(stream) {
|
28615 | var state = stream._readableState;
|
28616 | state.needReadable = false;
|
28617 | if (!state.emittedReadable) {
|
28618 | debug('emitReadable', state.flowing);
|
28619 | state.emittedReadable = true;
|
28620 | if (state.sync) nextTick(emitReadable_, stream);else emitReadable_(stream);
|
28621 | }
|
28622 | }
|
28623 |
|
28624 | function emitReadable_(stream) {
|
28625 | debug('emit readable');
|
28626 | stream.emit('readable');
|
28627 | flow(stream);
|
28628 | }
|
28629 |
|
28630 | // at this point, the user has presumably seen the 'readable' event,
|
28631 | // and called read() to consume some data. that may have triggered
|
28632 | // in turn another _read(n) call, in which case reading = true if
|
28633 | // it's in progress.
|
28634 | // However, if we're not ended, or reading, and the length < hwm,
|
28635 | // then go ahead and try to read some more preemptively.
|
28636 | function maybeReadMore(stream, state) {
|
28637 | if (!state.readingMore) {
|
28638 | state.readingMore = true;
|
28639 | nextTick(maybeReadMore_, stream, state);
|
28640 | }
|
28641 | }
|
28642 |
|
28643 | function maybeReadMore_(stream, state) {
|
28644 | var len = state.length;
|
28645 | while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
|
28646 | debug('maybeReadMore read 0');
|
28647 | stream.read(0);
|
28648 | if (len === state.length)
|
28649 | // didn't get any data, stop spinning.
|
28650 | break;else len = state.length;
|
28651 | }
|
28652 | state.readingMore = false;
|
28653 | }
|
28654 |
|
28655 | // abstract method. to be overridden in specific implementation classes.
|
28656 | // call cb(er, data) where data is <= n in length.
|
28657 | // for virtual (non-string, non-buffer) streams, "length" is somewhat
|
28658 | // arbitrary, and perhaps not very meaningful.
|
28659 | Readable$1.prototype._read = function (n) {
|
28660 | this.emit('error', new Error('not implemented'));
|
28661 | };
|
28662 |
|
28663 | Readable$1.prototype.pipe = function (dest, pipeOpts) {
|
28664 | var src = this;
|
28665 | var state = this._readableState;
|
28666 |
|
28667 | switch (state.pipesCount) {
|
28668 | case 0:
|
28669 | state.pipes = dest;
|
28670 | break;
|
28671 | case 1:
|
28672 | state.pipes = [state.pipes, dest];
|
28673 | break;
|
28674 | default:
|
28675 | state.pipes.push(dest);
|
28676 | break;
|
28677 | }
|
28678 | state.pipesCount += 1;
|
28679 | debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
|
28680 |
|
28681 | var doEnd = (!pipeOpts || pipeOpts.end !== false);
|
28682 |
|
28683 | var endFn = doEnd ? onend : cleanup;
|
28684 | if (state.endEmitted) nextTick(endFn);else src.once('end', endFn);
|
28685 |
|
28686 | dest.on('unpipe', onunpipe);
|
28687 | function onunpipe(readable) {
|
28688 | debug('onunpipe');
|
28689 | if (readable === src) {
|
28690 | cleanup();
|
28691 | }
|
28692 | }
|
28693 |
|
28694 | function onend() {
|
28695 | debug('onend');
|
28696 | dest.end();
|
28697 | }
|
28698 |
|
28699 | // when the dest drains, it reduces the awaitDrain counter
|
28700 | // on the source. This would be more elegant with a .once()
|
28701 | // handler in flow(), but adding and removing repeatedly is
|
28702 | // too slow.
|
28703 | var ondrain = pipeOnDrain(src);
|
28704 | dest.on('drain', ondrain);
|
28705 |
|
28706 | var cleanedUp = false;
|
28707 | function cleanup() {
|
28708 | debug('cleanup');
|
28709 | // cleanup event handlers once the pipe is broken
|
28710 | dest.removeListener('close', onclose);
|
28711 | dest.removeListener('finish', onfinish);
|
28712 | dest.removeListener('drain', ondrain);
|
28713 | dest.removeListener('error', onerror);
|
28714 | dest.removeListener('unpipe', onunpipe);
|
28715 | src.removeListener('end', onend);
|
28716 | src.removeListener('end', cleanup);
|
28717 | src.removeListener('data', ondata);
|
28718 |
|
28719 | cleanedUp = true;
|
28720 |
|
28721 | // if the reader is waiting for a drain event from this
|
28722 | // specific writer, then it would cause it to never start
|
28723 | // flowing again.
|
28724 | // So, if this is awaiting a drain, then we just call it now.
|
28725 | // If we don't know, then assume that we are waiting for one.
|
28726 | if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
|
28727 | }
|
28728 |
|
28729 | // If the user pushes more data while we're writing to dest then we'll end up
|
28730 | // in ondata again. However, we only want to increase awaitDrain once because
|
28731 | // dest will only emit one 'drain' event for the multiple writes.
|
28732 | // => Introduce a guard on increasing awaitDrain.
|
28733 | var increasedAwaitDrain = false;
|
28734 | src.on('data', ondata);
|
28735 | function ondata(chunk) {
|
28736 | debug('ondata');
|
28737 | increasedAwaitDrain = false;
|
28738 | var ret = dest.write(chunk);
|
28739 | if (false === ret && !increasedAwaitDrain) {
|
28740 | // If the user unpiped during `dest.write()`, it is possible
|
28741 | // to get stuck in a permanently paused state if that write
|
28742 | // also returned false.
|
28743 | // => Check whether `dest` is still a piping destination.
|
28744 | if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf$2(state.pipes, dest) !== -1) && !cleanedUp) {
|
28745 | debug('false write response, pause', src._readableState.awaitDrain);
|
28746 | src._readableState.awaitDrain++;
|
28747 | increasedAwaitDrain = true;
|
28748 | }
|
28749 | src.pause();
|
28750 | }
|
28751 | }
|
28752 |
|
28753 | // if the dest has an error, then stop piping into it.
|
28754 | // however, don't suppress the throwing behavior for this.
|
28755 | function onerror(er) {
|
28756 | debug('onerror', er);
|
28757 | unpipe();
|
28758 | dest.removeListener('error', onerror);
|
28759 | if (listenerCount$1(dest, 'error') === 0) dest.emit('error', er);
|
28760 | }
|
28761 |
|
28762 | // Make sure our error handler is attached before userland ones.
|
28763 | prependListener(dest, 'error', onerror);
|
28764 |
|
28765 | // Both close and finish should trigger unpipe, but only once.
|
28766 | function onclose() {
|
28767 | dest.removeListener('finish', onfinish);
|
28768 | unpipe();
|
28769 | }
|
28770 | dest.once('close', onclose);
|
28771 | function onfinish() {
|
28772 | debug('onfinish');
|
28773 | dest.removeListener('close', onclose);
|
28774 | unpipe();
|
28775 | }
|
28776 | dest.once('finish', onfinish);
|
28777 |
|
28778 | function unpipe() {
|
28779 | debug('unpipe');
|
28780 | src.unpipe(dest);
|
28781 | }
|
28782 |
|
28783 | // tell the dest that it's being piped to
|
28784 | dest.emit('pipe', src);
|
28785 |
|
28786 | // start the flow if it hasn't been started already.
|
28787 | if (!state.flowing) {
|
28788 | debug('pipe resume');
|
28789 | src.resume();
|
28790 | }
|
28791 |
|
28792 | return dest;
|
28793 | };
|
28794 |
|
28795 | function pipeOnDrain(src) {
|
28796 | return function () {
|
28797 | var state = src._readableState;
|
28798 | debug('pipeOnDrain', state.awaitDrain);
|
28799 | if (state.awaitDrain) state.awaitDrain--;
|
28800 | if (state.awaitDrain === 0 && src.listeners('data').length) {
|
28801 | state.flowing = true;
|
28802 | flow(src);
|
28803 | }
|
28804 | };
|
28805 | }
|
28806 |
|
28807 | Readable$1.prototype.unpipe = function (dest) {
|
28808 | var state = this._readableState;
|
28809 |
|
28810 | // if we're not piping anywhere, then do nothing.
|
28811 | if (state.pipesCount === 0) return this;
|
28812 |
|
28813 | // just one destination. most common case.
|
28814 | if (state.pipesCount === 1) {
|
28815 | // passed in one, but it's not the right one.
|
28816 | if (dest && dest !== state.pipes) return this;
|
28817 |
|
28818 | if (!dest) dest = state.pipes;
|
28819 |
|
28820 | // got a match.
|
28821 | state.pipes = null;
|
28822 | state.pipesCount = 0;
|
28823 | state.flowing = false;
|
28824 | if (dest) dest.emit('unpipe', this);
|
28825 | return this;
|
28826 | }
|
28827 |
|
28828 | // slow case. multiple pipe destinations.
|
28829 |
|
28830 | if (!dest) {
|
28831 | // remove all.
|
28832 | var dests = state.pipes;
|
28833 | var len = state.pipesCount;
|
28834 | state.pipes = null;
|
28835 | state.pipesCount = 0;
|
28836 | state.flowing = false;
|
28837 |
|
28838 | for (var _i = 0; _i < len; _i++) {
|
28839 | dests[_i].emit('unpipe', this);
|
28840 | }return this;
|
28841 | }
|
28842 |
|
28843 | // try to find the right one.
|
28844 | var i = indexOf$2(state.pipes, dest);
|
28845 | if (i === -1) return this;
|
28846 |
|
28847 | state.pipes.splice(i, 1);
|
28848 | state.pipesCount -= 1;
|
28849 | if (state.pipesCount === 1) state.pipes = state.pipes[0];
|
28850 |
|
28851 | dest.emit('unpipe', this);
|
28852 |
|
28853 | return this;
|
28854 | };
|
28855 |
|
28856 | // set up data events if they are asked for
|
28857 | // Ensure readable listeners eventually get something
|
28858 | Readable$1.prototype.on = function (ev, fn) {
|
28859 | var res = EventEmitter.prototype.on.call(this, ev, fn);
|
28860 |
|
28861 | if (ev === 'data') {
|
28862 | // Start flowing on next tick if stream isn't explicitly paused
|
28863 | if (this._readableState.flowing !== false) this.resume();
|
28864 | } else if (ev === 'readable') {
|
28865 | var state = this._readableState;
|
28866 | if (!state.endEmitted && !state.readableListening) {
|
28867 | state.readableListening = state.needReadable = true;
|
28868 | state.emittedReadable = false;
|
28869 | if (!state.reading) {
|
28870 | nextTick(nReadingNextTick, this);
|
28871 | } else if (state.length) {
|
28872 | emitReadable(this, state);
|
28873 | }
|
28874 | }
|
28875 | }
|
28876 |
|
28877 | return res;
|
28878 | };
|
28879 | Readable$1.prototype.addListener = Readable$1.prototype.on;
|
28880 |
|
28881 | function nReadingNextTick(self) {
|
28882 | debug('readable nexttick read 0');
|
28883 | self.read(0);
|
28884 | }
|
28885 |
|
28886 | // pause() and resume() are remnants of the legacy readable stream API
|
28887 | // If the user uses them, then switch into old mode.
|
28888 | Readable$1.prototype.resume = function () {
|
28889 | var state = this._readableState;
|
28890 | if (!state.flowing) {
|
28891 | debug('resume');
|
28892 | state.flowing = true;
|
28893 | resume(this, state);
|
28894 | }
|
28895 | return this;
|
28896 | };
|
28897 |
|
28898 | function resume(stream, state) {
|
28899 | if (!state.resumeScheduled) {
|
28900 | state.resumeScheduled = true;
|
28901 | nextTick(resume_, stream, state);
|
28902 | }
|
28903 | }
|
28904 |
|
28905 | function resume_(stream, state) {
|
28906 | if (!state.reading) {
|
28907 | debug('resume read 0');
|
28908 | stream.read(0);
|
28909 | }
|
28910 |
|
28911 | state.resumeScheduled = false;
|
28912 | state.awaitDrain = 0;
|
28913 | stream.emit('resume');
|
28914 | flow(stream);
|
28915 | if (state.flowing && !state.reading) stream.read(0);
|
28916 | }
|
28917 |
|
28918 | Readable$1.prototype.pause = function () {
|
28919 | debug('call pause flowing=%j', this._readableState.flowing);
|
28920 | if (false !== this._readableState.flowing) {
|
28921 | debug('pause');
|
28922 | this._readableState.flowing = false;
|
28923 | this.emit('pause');
|
28924 | }
|
28925 | return this;
|
28926 | };
|
28927 |
|
28928 | function flow(stream) {
|
28929 | var state = stream._readableState;
|
28930 | debug('flow', state.flowing);
|
28931 | while (state.flowing && stream.read() !== null) {}
|
28932 | }
|
28933 |
|
28934 | // wrap an old-style stream as the async data source.
|
28935 | // This is *not* part of the readable stream interface.
|
28936 | // It is an ugly unfortunate mess of history.
|
28937 | Readable$1.prototype.wrap = function (stream) {
|
28938 | var state = this._readableState;
|
28939 | var paused = false;
|
28940 |
|
28941 | var self = this;
|
28942 | stream.on('end', function () {
|
28943 | debug('wrapped end');
|
28944 | if (state.decoder && !state.ended) {
|
28945 | var chunk = state.decoder.end();
|
28946 | if (chunk && chunk.length) self.push(chunk);
|
28947 | }
|
28948 |
|
28949 | self.push(null);
|
28950 | });
|
28951 |
|
28952 | stream.on('data', function (chunk) {
|
28953 | debug('wrapped data');
|
28954 | if (state.decoder) chunk = state.decoder.write(chunk);
|
28955 |
|
28956 | // don't skip over falsy values in objectMode
|
28957 | if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
|
28958 |
|
28959 | var ret = self.push(chunk);
|
28960 | if (!ret) {
|
28961 | paused = true;
|
28962 | stream.pause();
|
28963 | }
|
28964 | });
|
28965 |
|
28966 | // proxy all the other methods.
|
28967 | // important when wrapping filters and duplexes.
|
28968 | for (var i in stream) {
|
28969 | if (this[i] === undefined && typeof stream[i] === 'function') {
|
28970 | this[i] = function (method) {
|
28971 | return function () {
|
28972 | return stream[method].apply(stream, arguments);
|
28973 | };
|
28974 | }(i);
|
28975 | }
|
28976 | }
|
28977 |
|
28978 | // proxy certain important events.
|
28979 | var events = ['error', 'close', 'destroy', 'pause', 'resume'];
|
28980 | forEach$2(events, function (ev) {
|
28981 | stream.on(ev, self.emit.bind(self, ev));
|
28982 | });
|
28983 |
|
28984 | // when we try to consume some more bytes, simply unpause the
|
28985 | // underlying stream.
|
28986 | self._read = function (n) {
|
28987 | debug('wrapped _read', n);
|
28988 | if (paused) {
|
28989 | paused = false;
|
28990 | stream.resume();
|
28991 | }
|
28992 | };
|
28993 |
|
28994 | return self;
|
28995 | };
|
28996 |
|
28997 | // exposed for testing purposes only.
|
28998 | Readable$1._fromList = fromList;
|
28999 |
|
29000 | // Pluck off n bytes from an array of buffers.
|
29001 | // Length is the combined lengths of all the buffers in the list.
|
29002 | // This function is designed to be inlinable, so please take care when making
|
29003 | // changes to the function body.
|
29004 | function fromList(n, state) {
|
29005 | // nothing buffered
|
29006 | if (state.length === 0) return null;
|
29007 |
|
29008 | var ret;
|
29009 | if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
|
29010 | // read it all, truncate the list
|
29011 | 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);
|
29012 | state.buffer.clear();
|
29013 | } else {
|
29014 | // read part of list
|
29015 | ret = fromListPartial(n, state.buffer, state.decoder);
|
29016 | }
|
29017 |
|
29018 | return ret;
|
29019 | }
|
29020 |
|
29021 | // Extracts only enough buffered data to satisfy the amount requested.
|
29022 | // This function is designed to be inlinable, so please take care when making
|
29023 | // changes to the function body.
|
29024 | function fromListPartial(n, list, hasStrings) {
|
29025 | var ret;
|
29026 | if (n < list.head.data.length) {
|
29027 | // slice is the same for buffers and strings
|
29028 | ret = list.head.data.slice(0, n);
|
29029 | list.head.data = list.head.data.slice(n);
|
29030 | } else if (n === list.head.data.length) {
|
29031 | // first chunk is a perfect match
|
29032 | ret = list.shift();
|
29033 | } else {
|
29034 | // result spans more than one buffer
|
29035 | ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);
|
29036 | }
|
29037 | return ret;
|
29038 | }
|
29039 |
|
29040 | // Copies a specified amount of characters from the list of buffered data
|
29041 | // chunks.
|
29042 | // This function is designed to be inlinable, so please take care when making
|
29043 | // changes to the function body.
|
29044 | function copyFromBufferString(n, list) {
|
29045 | var p = list.head;
|
29046 | var c = 1;
|
29047 | var ret = p.data;
|
29048 | n -= ret.length;
|
29049 | while (p = p.next) {
|
29050 | var str = p.data;
|
29051 | var nb = n > str.length ? str.length : n;
|
29052 | if (nb === str.length) ret += str;else ret += str.slice(0, n);
|
29053 | n -= nb;
|
29054 | if (n === 0) {
|
29055 | if (nb === str.length) {
|
29056 | ++c;
|
29057 | if (p.next) list.head = p.next;else list.head = list.tail = null;
|
29058 | } else {
|
29059 | list.head = p;
|
29060 | p.data = str.slice(nb);
|
29061 | }
|
29062 | break;
|
29063 | }
|
29064 | ++c;
|
29065 | }
|
29066 | list.length -= c;
|
29067 | return ret;
|
29068 | }
|
29069 |
|
29070 | // Copies a specified amount of bytes from the list of buffered data chunks.
|
29071 | // This function is designed to be inlinable, so please take care when making
|
29072 | // changes to the function body.
|
29073 | function copyFromBuffer(n, list) {
|
29074 | var ret = Buffer.allocUnsafe(n);
|
29075 | var p = list.head;
|
29076 | var c = 1;
|
29077 | p.data.copy(ret);
|
29078 | n -= p.data.length;
|
29079 | while (p = p.next) {
|
29080 | var buf = p.data;
|
29081 | var nb = n > buf.length ? buf.length : n;
|
29082 | buf.copy(ret, ret.length - n, 0, nb);
|
29083 | n -= nb;
|
29084 | if (n === 0) {
|
29085 | if (nb === buf.length) {
|
29086 | ++c;
|
29087 | if (p.next) list.head = p.next;else list.head = list.tail = null;
|
29088 | } else {
|
29089 | list.head = p;
|
29090 | p.data = buf.slice(nb);
|
29091 | }
|
29092 | break;
|
29093 | }
|
29094 | ++c;
|
29095 | }
|
29096 | list.length -= c;
|
29097 | return ret;
|
29098 | }
|
29099 |
|
29100 | function endReadable(stream) {
|
29101 | var state = stream._readableState;
|
29102 |
|
29103 | // If we get here before consuming all the bytes, then that is a
|
29104 | // bug in node. Should never happen.
|
29105 | if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');
|
29106 |
|
29107 | if (!state.endEmitted) {
|
29108 | state.ended = true;
|
29109 | nextTick(endReadableNT, state, stream);
|
29110 | }
|
29111 | }
|
29112 |
|
29113 | function endReadableNT(state, stream) {
|
29114 | // Check that we didn't get one last unshift.
|
29115 | if (!state.endEmitted && state.length === 0) {
|
29116 | state.endEmitted = true;
|
29117 | stream.readable = false;
|
29118 | stream.emit('end');
|
29119 | }
|
29120 | }
|
29121 |
|
29122 | function forEach$2(xs, f) {
|
29123 | for (var i = 0, l = xs.length; i < l; i++) {
|
29124 | f(xs[i], i);
|
29125 | }
|
29126 | }
|
29127 |
|
29128 | function indexOf$2(xs, x) {
|
29129 | for (var i = 0, l = xs.length; i < l; i++) {
|
29130 | if (xs[i] === x) return i;
|
29131 | }
|
29132 | return -1;
|
29133 | }
|
29134 |
|
29135 | // A bit simpler than readable streams.
|
29136 | // Implement an async ._write(chunk, encoding, cb), and it'll handle all
|
29137 | // the drain event emission and buffering.
|
29138 |
|
29139 |
|
29140 | Writable$1.WritableState = WritableState;
|
29141 | inherits$1(Writable$1, EventEmitter);
|
29142 |
|
29143 | function nop() {}
|
29144 |
|
29145 | function WriteReq(chunk, encoding, cb) {
|
29146 | this.chunk = chunk;
|
29147 | this.encoding = encoding;
|
29148 | this.callback = cb;
|
29149 | this.next = null;
|
29150 | }
|
29151 |
|
29152 | function WritableState(options, stream) {
|
29153 | Object.defineProperty(this, 'buffer', {
|
29154 | get: deprecate(function () {
|
29155 | return this.getBuffer();
|
29156 | }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.')
|
29157 | });
|
29158 | options = options || {};
|
29159 |
|
29160 | // object stream flag to indicate whether or not this stream
|
29161 | // contains buffers or objects.
|
29162 | this.objectMode = !!options.objectMode;
|
29163 |
|
29164 | if (stream instanceof Duplex$1) this.objectMode = this.objectMode || !!options.writableObjectMode;
|
29165 |
|
29166 | // the point at which write() starts returning false
|
29167 | // Note: 0 is a valid value, means that we always return false if
|
29168 | // the entire buffer is not flushed immediately on write()
|
29169 | var hwm = options.highWaterMark;
|
29170 | var defaultHwm = this.objectMode ? 16 : 16 * 1024;
|
29171 | this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;
|
29172 |
|
29173 | // cast to ints.
|
29174 | this.highWaterMark = ~ ~this.highWaterMark;
|
29175 |
|
29176 | this.needDrain = false;
|
29177 | // at the start of calling end()
|
29178 | this.ending = false;
|
29179 | // when end() has been called, and returned
|
29180 | this.ended = false;
|
29181 | // when 'finish' is emitted
|
29182 | this.finished = false;
|
29183 |
|
29184 | // should we decode strings into buffers before passing to _write?
|
29185 | // this is here so that some node-core streams can optimize string
|
29186 | // handling at a lower level.
|
29187 | var noDecode = options.decodeStrings === false;
|
29188 | this.decodeStrings = !noDecode;
|
29189 |
|
29190 | // Crypto is kind of old and crusty. Historically, its default string
|
29191 | // encoding is 'binary' so we have to make this configurable.
|
29192 | // Everything else in the universe uses 'utf8', though.
|
29193 | this.defaultEncoding = options.defaultEncoding || 'utf8';
|
29194 |
|
29195 | // not an actual buffer we keep track of, but a measurement
|
29196 | // of how much we're waiting to get pushed to some underlying
|
29197 | // socket or file.
|
29198 | this.length = 0;
|
29199 |
|
29200 | // a flag to see when we're in the middle of a write.
|
29201 | this.writing = false;
|
29202 |
|
29203 | // when true all writes will be buffered until .uncork() call
|
29204 | this.corked = 0;
|
29205 |
|
29206 | // a flag to be able to tell if the onwrite cb is called immediately,
|
29207 | // or on a later tick. We set this to true at first, because any
|
29208 | // actions that shouldn't happen until "later" should generally also
|
29209 | // not happen before the first write call.
|
29210 | this.sync = true;
|
29211 |
|
29212 | // a flag to know if we're processing previously buffered items, which
|
29213 | // may call the _write() callback in the same tick, so that we don't
|
29214 | // end up in an overlapped onwrite situation.
|
29215 | this.bufferProcessing = false;
|
29216 |
|
29217 | // the callback that's passed to _write(chunk,cb)
|
29218 | this.onwrite = function (er) {
|
29219 | onwrite(stream, er);
|
29220 | };
|
29221 |
|
29222 | // the callback that the user supplies to write(chunk,encoding,cb)
|
29223 | this.writecb = null;
|
29224 |
|
29225 | // the amount that is being written when _write is called.
|
29226 | this.writelen = 0;
|
29227 |
|
29228 | this.bufferedRequest = null;
|
29229 | this.lastBufferedRequest = null;
|
29230 |
|
29231 | // number of pending user-supplied write callbacks
|
29232 | // this must be 0 before 'finish' can be emitted
|
29233 | this.pendingcb = 0;
|
29234 |
|
29235 | // emit prefinish if the only thing we're waiting for is _write cbs
|
29236 | // This is relevant for synchronous Transform streams
|
29237 | this.prefinished = false;
|
29238 |
|
29239 | // True if the error was already emitted and should not be thrown again
|
29240 | this.errorEmitted = false;
|
29241 |
|
29242 | // count buffered requests
|
29243 | this.bufferedRequestCount = 0;
|
29244 |
|
29245 | // allocate the first CorkedRequest, there is always
|
29246 | // one allocated and free to use, and we maintain at most two
|
29247 | this.corkedRequestsFree = new CorkedRequest(this);
|
29248 | }
|
29249 |
|
29250 | WritableState.prototype.getBuffer = function writableStateGetBuffer() {
|
29251 | var current = this.bufferedRequest;
|
29252 | var out = [];
|
29253 | while (current) {
|
29254 | out.push(current);
|
29255 | current = current.next;
|
29256 | }
|
29257 | return out;
|
29258 | };
|
29259 |
|
29260 | function Writable$1(options) {
|
29261 |
|
29262 | // Writable ctor is applied to Duplexes, though they're not
|
29263 | // instanceof Writable, they're instanceof Readable.
|
29264 | if (!(this instanceof Writable$1) && !(this instanceof Duplex$1)) return new Writable$1(options);
|
29265 |
|
29266 | this._writableState = new WritableState(options, this);
|
29267 |
|
29268 | // legacy.
|
29269 | this.writable = true;
|
29270 |
|
29271 | if (options) {
|
29272 | if (typeof options.write === 'function') this._write = options.write;
|
29273 |
|
29274 | if (typeof options.writev === 'function') this._writev = options.writev;
|
29275 | }
|
29276 |
|
29277 | EventEmitter.call(this);
|
29278 | }
|
29279 |
|
29280 | // Otherwise people can pipe Writable streams, which is just wrong.
|
29281 | Writable$1.prototype.pipe = function () {
|
29282 | this.emit('error', new Error('Cannot pipe, not readable'));
|
29283 | };
|
29284 |
|
29285 | function writeAfterEnd(stream, cb) {
|
29286 | var er = new Error('write after end');
|
29287 | // TODO: defer error events consistently everywhere, not just the cb
|
29288 | stream.emit('error', er);
|
29289 | nextTick(cb, er);
|
29290 | }
|
29291 |
|
29292 | // If we get something that is not a buffer, string, null, or undefined,
|
29293 | // and we're not in objectMode, then that's an error.
|
29294 | // Otherwise stream chunks are all considered to be of length=1, and the
|
29295 | // watermarks determine how many objects to keep in the buffer, rather than
|
29296 | // how many bytes or characters.
|
29297 | function validChunk(stream, state, chunk, cb) {
|
29298 | var valid = true;
|
29299 | var er = false;
|
29300 | // Always throw error if a null is written
|
29301 | // if we are not in object mode then throw
|
29302 | // if it is not a buffer, string, or undefined.
|
29303 | if (chunk === null) {
|
29304 | er = new TypeError('May not write null values to stream');
|
29305 | } else if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
|
29306 | er = new TypeError('Invalid non-string/buffer chunk');
|
29307 | }
|
29308 | if (er) {
|
29309 | stream.emit('error', er);
|
29310 | nextTick(cb, er);
|
29311 | valid = false;
|
29312 | }
|
29313 | return valid;
|
29314 | }
|
29315 |
|
29316 | Writable$1.prototype.write = function (chunk, encoding, cb) {
|
29317 | var state = this._writableState;
|
29318 | var ret = false;
|
29319 |
|
29320 | if (typeof encoding === 'function') {
|
29321 | cb = encoding;
|
29322 | encoding = null;
|
29323 | }
|
29324 |
|
29325 | if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
|
29326 |
|
29327 | if (typeof cb !== 'function') cb = nop;
|
29328 |
|
29329 | if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) {
|
29330 | state.pendingcb++;
|
29331 | ret = writeOrBuffer(this, state, chunk, encoding, cb);
|
29332 | }
|
29333 |
|
29334 | return ret;
|
29335 | };
|
29336 |
|
29337 | Writable$1.prototype.cork = function () {
|
29338 | var state = this._writableState;
|
29339 |
|
29340 | state.corked++;
|
29341 | };
|
29342 |
|
29343 | Writable$1.prototype.uncork = function () {
|
29344 | var state = this._writableState;
|
29345 |
|
29346 | if (state.corked) {
|
29347 | state.corked--;
|
29348 |
|
29349 | if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
|
29350 | }
|
29351 | };
|
29352 |
|
29353 | Writable$1.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
|
29354 | // node::ParseEncoding() requires lower case.
|
29355 | if (typeof encoding === 'string') encoding = encoding.toLowerCase();
|
29356 | 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);
|
29357 | this._writableState.defaultEncoding = encoding;
|
29358 | return this;
|
29359 | };
|
29360 |
|
29361 | function decodeChunk(state, chunk, encoding) {
|
29362 | if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
|
29363 | chunk = Buffer.from(chunk, encoding);
|
29364 | }
|
29365 | return chunk;
|
29366 | }
|
29367 |
|
29368 | // if we're already writing something, then just put this
|
29369 | // in the queue, and wait our turn. Otherwise, call _write
|
29370 | // If we return false, then we need a drain event, so set that flag.
|
29371 | function writeOrBuffer(stream, state, chunk, encoding, cb) {
|
29372 | chunk = decodeChunk(state, chunk, encoding);
|
29373 |
|
29374 | if (Buffer.isBuffer(chunk)) encoding = 'buffer';
|
29375 | var len = state.objectMode ? 1 : chunk.length;
|
29376 |
|
29377 | state.length += len;
|
29378 |
|
29379 | var ret = state.length < state.highWaterMark;
|
29380 | // we must ensure that previous needDrain will not be reset to false.
|
29381 | if (!ret) state.needDrain = true;
|
29382 |
|
29383 | if (state.writing || state.corked) {
|
29384 | var last = state.lastBufferedRequest;
|
29385 | state.lastBufferedRequest = new WriteReq(chunk, encoding, cb);
|
29386 | if (last) {
|
29387 | last.next = state.lastBufferedRequest;
|
29388 | } else {
|
29389 | state.bufferedRequest = state.lastBufferedRequest;
|
29390 | }
|
29391 | state.bufferedRequestCount += 1;
|
29392 | } else {
|
29393 | doWrite(stream, state, false, len, chunk, encoding, cb);
|
29394 | }
|
29395 |
|
29396 | return ret;
|
29397 | }
|
29398 |
|
29399 | function doWrite(stream, state, writev, len, chunk, encoding, cb) {
|
29400 | state.writelen = len;
|
29401 | state.writecb = cb;
|
29402 | state.writing = true;
|
29403 | state.sync = true;
|
29404 | if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
|
29405 | state.sync = false;
|
29406 | }
|
29407 |
|
29408 | function onwriteError(stream, state, sync, er, cb) {
|
29409 | --state.pendingcb;
|
29410 | if (sync) nextTick(cb, er);else cb(er);
|
29411 |
|
29412 | stream._writableState.errorEmitted = true;
|
29413 | stream.emit('error', er);
|
29414 | }
|
29415 |
|
29416 | function onwriteStateUpdate(state) {
|
29417 | state.writing = false;
|
29418 | state.writecb = null;
|
29419 | state.length -= state.writelen;
|
29420 | state.writelen = 0;
|
29421 | }
|
29422 |
|
29423 | function onwrite(stream, er) {
|
29424 | var state = stream._writableState;
|
29425 | var sync = state.sync;
|
29426 | var cb = state.writecb;
|
29427 |
|
29428 | onwriteStateUpdate(state);
|
29429 |
|
29430 | if (er) onwriteError(stream, state, sync, er, cb);else {
|
29431 | // Check if we're actually ready to finish, but don't emit yet
|
29432 | var finished = needFinish(state);
|
29433 |
|
29434 | if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
|
29435 | clearBuffer(stream, state);
|
29436 | }
|
29437 |
|
29438 | if (sync) {
|
29439 | /*<replacement>*/
|
29440 | nextTick(afterWrite, stream, state, finished, cb);
|
29441 | /*</replacement>*/
|
29442 | } else {
|
29443 | afterWrite(stream, state, finished, cb);
|
29444 | }
|
29445 | }
|
29446 | }
|
29447 |
|
29448 | function afterWrite(stream, state, finished, cb) {
|
29449 | if (!finished) onwriteDrain(stream, state);
|
29450 | state.pendingcb--;
|
29451 | cb();
|
29452 | finishMaybe(stream, state);
|
29453 | }
|
29454 |
|
29455 | // Must force callback to be called on nextTick, so that we don't
|
29456 | // emit 'drain' before the write() consumer gets the 'false' return
|
29457 | // value, and has a chance to attach a 'drain' listener.
|
29458 | function onwriteDrain(stream, state) {
|
29459 | if (state.length === 0 && state.needDrain) {
|
29460 | state.needDrain = false;
|
29461 | stream.emit('drain');
|
29462 | }
|
29463 | }
|
29464 |
|
29465 | // if there's something in the buffer waiting, then process it
|
29466 | function clearBuffer(stream, state) {
|
29467 | state.bufferProcessing = true;
|
29468 | var entry = state.bufferedRequest;
|
29469 |
|
29470 | if (stream._writev && entry && entry.next) {
|
29471 | // Fast case, write everything using _writev()
|
29472 | var l = state.bufferedRequestCount;
|
29473 | var buffer = new Array(l);
|
29474 | var holder = state.corkedRequestsFree;
|
29475 | holder.entry = entry;
|
29476 |
|
29477 | var count = 0;
|
29478 | while (entry) {
|
29479 | buffer[count] = entry;
|
29480 | entry = entry.next;
|
29481 | count += 1;
|
29482 | }
|
29483 |
|
29484 | doWrite(stream, state, true, state.length, buffer, '', holder.finish);
|
29485 |
|
29486 | // doWrite is almost always async, defer these to save a bit of time
|
29487 | // as the hot path ends with doWrite
|
29488 | state.pendingcb++;
|
29489 | state.lastBufferedRequest = null;
|
29490 | if (holder.next) {
|
29491 | state.corkedRequestsFree = holder.next;
|
29492 | holder.next = null;
|
29493 | } else {
|
29494 | state.corkedRequestsFree = new CorkedRequest(state);
|
29495 | }
|
29496 | } else {
|
29497 | // Slow case, write chunks one-by-one
|
29498 | while (entry) {
|
29499 | var chunk = entry.chunk;
|
29500 | var encoding = entry.encoding;
|
29501 | var cb = entry.callback;
|
29502 | var len = state.objectMode ? 1 : chunk.length;
|
29503 |
|
29504 | doWrite(stream, state, false, len, chunk, encoding, cb);
|
29505 | entry = entry.next;
|
29506 | // if we didn't call the onwrite immediately, then
|
29507 | // it means that we need to wait until it does.
|
29508 | // also, that means that the chunk and cb are currently
|
29509 | // being processed, so move the buffer counter past them.
|
29510 | if (state.writing) {
|
29511 | break;
|
29512 | }
|
29513 | }
|
29514 |
|
29515 | if (entry === null) state.lastBufferedRequest = null;
|
29516 | }
|
29517 |
|
29518 | state.bufferedRequestCount = 0;
|
29519 | state.bufferedRequest = entry;
|
29520 | state.bufferProcessing = false;
|
29521 | }
|
29522 |
|
29523 | Writable$1.prototype._write = function (chunk, encoding, cb) {
|
29524 | cb(new Error('not implemented'));
|
29525 | };
|
29526 |
|
29527 | Writable$1.prototype._writev = null;
|
29528 |
|
29529 | Writable$1.prototype.end = function (chunk, encoding, cb) {
|
29530 | var state = this._writableState;
|
29531 |
|
29532 | if (typeof chunk === 'function') {
|
29533 | cb = chunk;
|
29534 | chunk = null;
|
29535 | encoding = null;
|
29536 | } else if (typeof encoding === 'function') {
|
29537 | cb = encoding;
|
29538 | encoding = null;
|
29539 | }
|
29540 |
|
29541 | if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);
|
29542 |
|
29543 | // .end() fully uncorks
|
29544 | if (state.corked) {
|
29545 | state.corked = 1;
|
29546 | this.uncork();
|
29547 | }
|
29548 |
|
29549 | // ignore unnecessary end() calls.
|
29550 | if (!state.ending && !state.finished) endWritable(this, state, cb);
|
29551 | };
|
29552 |
|
29553 | function needFinish(state) {
|
29554 | return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
|
29555 | }
|
29556 |
|
29557 | function prefinish(stream, state) {
|
29558 | if (!state.prefinished) {
|
29559 | state.prefinished = true;
|
29560 | stream.emit('prefinish');
|
29561 | }
|
29562 | }
|
29563 |
|
29564 | function finishMaybe(stream, state) {
|
29565 | var need = needFinish(state);
|
29566 | if (need) {
|
29567 | if (state.pendingcb === 0) {
|
29568 | prefinish(stream, state);
|
29569 | state.finished = true;
|
29570 | stream.emit('finish');
|
29571 | } else {
|
29572 | prefinish(stream, state);
|
29573 | }
|
29574 | }
|
29575 | return need;
|
29576 | }
|
29577 |
|
29578 | function endWritable(stream, state, cb) {
|
29579 | state.ending = true;
|
29580 | finishMaybe(stream, state);
|
29581 | if (cb) {
|
29582 | if (state.finished) nextTick(cb);else stream.once('finish', cb);
|
29583 | }
|
29584 | state.ended = true;
|
29585 | stream.writable = false;
|
29586 | }
|
29587 |
|
29588 | // It seems a linked list but it is not
|
29589 | // there will be only 2 of these for each stream
|
29590 | function CorkedRequest(state) {
|
29591 | var _this = this;
|
29592 |
|
29593 | this.next = null;
|
29594 | this.entry = null;
|
29595 |
|
29596 | this.finish = function (err) {
|
29597 | var entry = _this.entry;
|
29598 | _this.entry = null;
|
29599 | while (entry) {
|
29600 | var cb = entry.callback;
|
29601 | state.pendingcb--;
|
29602 | cb(err);
|
29603 | entry = entry.next;
|
29604 | }
|
29605 | if (state.corkedRequestsFree) {
|
29606 | state.corkedRequestsFree.next = _this;
|
29607 | } else {
|
29608 | state.corkedRequestsFree = _this;
|
29609 | }
|
29610 | };
|
29611 | }
|
29612 |
|
29613 | inherits$1(Duplex$1, Readable$1);
|
29614 |
|
29615 | var keys$3 = Object.keys(Writable$1.prototype);
|
29616 | for (var v = 0; v < keys$3.length; v++) {
|
29617 | var method = keys$3[v];
|
29618 | if (!Duplex$1.prototype[method]) Duplex$1.prototype[method] = Writable$1.prototype[method];
|
29619 | }
|
29620 | function Duplex$1(options) {
|
29621 | if (!(this instanceof Duplex$1)) return new Duplex$1(options);
|
29622 |
|
29623 | Readable$1.call(this, options);
|
29624 | Writable$1.call(this, options);
|
29625 |
|
29626 | if (options && options.readable === false) this.readable = false;
|
29627 |
|
29628 | if (options && options.writable === false) this.writable = false;
|
29629 |
|
29630 | this.allowHalfOpen = true;
|
29631 | if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;
|
29632 |
|
29633 | this.once('end', onend);
|
29634 | }
|
29635 |
|
29636 | // the no-half-open enforcer
|
29637 | function onend() {
|
29638 | // if we allow half-open state, or if the writable side ended,
|
29639 | // then we're ok.
|
29640 | if (this.allowHalfOpen || this._writableState.ended) return;
|
29641 |
|
29642 | // no more data can be written.
|
29643 | // But allow more writes to happen in this tick.
|
29644 | nextTick(onEndNT, this);
|
29645 | }
|
29646 |
|
29647 | function onEndNT(self) {
|
29648 | self.end();
|
29649 | }
|
29650 |
|
29651 | // a transform stream is a readable/writable stream where you do
|
29652 | // something with the data. Sometimes it's called a "filter",
|
29653 | // but that's not a great name for it, since that implies a thing where
|
29654 | // some bits pass through, and others are simply ignored. (That would
|
29655 | // be a valid example of a transform, of course.)
|
29656 | //
|
29657 | // While the output is causally related to the input, it's not a
|
29658 | // necessarily symmetric or synchronous transformation. For example,
|
29659 | // a zlib stream might take multiple plain-text writes(), and then
|
29660 | // emit a single compressed chunk some time in the future.
|
29661 | //
|
29662 | // Here's how this works:
|
29663 | //
|
29664 | // The Transform stream has all the aspects of the readable and writable
|
29665 | // stream classes. When you write(chunk), that calls _write(chunk,cb)
|
29666 | // internally, and returns false if there's a lot of pending writes
|
29667 | // buffered up. When you call read(), that calls _read(n) until
|
29668 | // there's enough pending readable data buffered up.
|
29669 | //
|
29670 | // In a transform stream, the written data is placed in a buffer. When
|
29671 | // _read(n) is called, it transforms the queued up data, calling the
|
29672 | // buffered _write cb's as it consumes chunks. If consuming a single
|
29673 | // written chunk would result in multiple output chunks, then the first
|
29674 | // outputted bit calls the readcb, and subsequent chunks just go into
|
29675 | // the read buffer, and will cause it to emit 'readable' if necessary.
|
29676 | //
|
29677 | // This way, back-pressure is actually determined by the reading side,
|
29678 | // since _read has to be called to start processing a new chunk. However,
|
29679 | // a pathological inflate type of transform can cause excessive buffering
|
29680 | // here. For example, imagine a stream where every byte of input is
|
29681 | // interpreted as an integer from 0-255, and then results in that many
|
29682 | // bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in
|
29683 | // 1kb of data being output. In this case, you could write a very small
|
29684 | // amount of input, and end up with a very large amount of output. In
|
29685 | // such a pathological inflating mechanism, there'd be no way to tell
|
29686 | // the system to stop doing the transform. A single 4MB write could
|
29687 | // cause the system to run out of memory.
|
29688 | //
|
29689 | // However, even in such a pathological case, only a single written chunk
|
29690 | // would be consumed, and then the rest would wait (un-transformed) until
|
29691 | // the results of the previous transformed chunk were consumed.
|
29692 |
|
29693 |
|
29694 | inherits$1(Transform$1, Duplex$1);
|
29695 |
|
29696 | function TransformState(stream) {
|
29697 | this.afterTransform = function (er, data) {
|
29698 | return afterTransform(stream, er, data);
|
29699 | };
|
29700 |
|
29701 | this.needTransform = false;
|
29702 | this.transforming = false;
|
29703 | this.writecb = null;
|
29704 | this.writechunk = null;
|
29705 | this.writeencoding = null;
|
29706 | }
|
29707 |
|
29708 | function afterTransform(stream, er, data) {
|
29709 | var ts = stream._transformState;
|
29710 | ts.transforming = false;
|
29711 |
|
29712 | var cb = ts.writecb;
|
29713 |
|
29714 | if (!cb) return stream.emit('error', new Error('no writecb in Transform class'));
|
29715 |
|
29716 | ts.writechunk = null;
|
29717 | ts.writecb = null;
|
29718 |
|
29719 | if (data !== null && data !== undefined) stream.push(data);
|
29720 |
|
29721 | cb(er);
|
29722 |
|
29723 | var rs = stream._readableState;
|
29724 | rs.reading = false;
|
29725 | if (rs.needReadable || rs.length < rs.highWaterMark) {
|
29726 | stream._read(rs.highWaterMark);
|
29727 | }
|
29728 | }
|
29729 | function Transform$1(options) {
|
29730 | if (!(this instanceof Transform$1)) return new Transform$1(options);
|
29731 |
|
29732 | Duplex$1.call(this, options);
|
29733 |
|
29734 | this._transformState = new TransformState(this);
|
29735 |
|
29736 | // when the writable side finishes, then flush out anything remaining.
|
29737 | var stream = this;
|
29738 |
|
29739 | // start out asking for a readable event once data is transformed.
|
29740 | this._readableState.needReadable = true;
|
29741 |
|
29742 | // we have implemented the _read method, and done the other things
|
29743 | // that Readable wants before the first _read call, so unset the
|
29744 | // sync guard flag.
|
29745 | this._readableState.sync = false;
|
29746 |
|
29747 | if (options) {
|
29748 | if (typeof options.transform === 'function') this._transform = options.transform;
|
29749 |
|
29750 | if (typeof options.flush === 'function') this._flush = options.flush;
|
29751 | }
|
29752 |
|
29753 | this.once('prefinish', function () {
|
29754 | if (typeof this._flush === 'function') this._flush(function (er) {
|
29755 | done(stream, er);
|
29756 | });else done(stream);
|
29757 | });
|
29758 | }
|
29759 |
|
29760 | Transform$1.prototype.push = function (chunk, encoding) {
|
29761 | this._transformState.needTransform = false;
|
29762 | return Duplex$1.prototype.push.call(this, chunk, encoding);
|
29763 | };
|
29764 |
|
29765 | // This is the part where you do stuff!
|
29766 | // override this function in implementation classes.
|
29767 | // 'chunk' is an input chunk.
|
29768 | //
|
29769 | // Call `push(newChunk)` to pass along transformed output
|
29770 | // to the readable side. You may call 'push' zero or more times.
|
29771 | //
|
29772 | // Call `cb(err)` when you are done with this chunk. If you pass
|
29773 | // an error, then that'll put the hurt on the whole operation. If you
|
29774 | // never call cb(), then you'll never get another chunk.
|
29775 | Transform$1.prototype._transform = function (chunk, encoding, cb) {
|
29776 | throw new Error('Not implemented');
|
29777 | };
|
29778 |
|
29779 | Transform$1.prototype._write = function (chunk, encoding, cb) {
|
29780 | var ts = this._transformState;
|
29781 | ts.writecb = cb;
|
29782 | ts.writechunk = chunk;
|
29783 | ts.writeencoding = encoding;
|
29784 | if (!ts.transforming) {
|
29785 | var rs = this._readableState;
|
29786 | if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
|
29787 | }
|
29788 | };
|
29789 |
|
29790 | // Doesn't matter what the args are here.
|
29791 | // _transform does all the work.
|
29792 | // That we got here means that the readable side wants more data.
|
29793 | Transform$1.prototype._read = function (n) {
|
29794 | var ts = this._transformState;
|
29795 |
|
29796 | if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
|
29797 | ts.transforming = true;
|
29798 | this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
|
29799 | } else {
|
29800 | // mark that we need a transform, so that any data that comes in
|
29801 | // will get processed, now that we've asked for it.
|
29802 | ts.needTransform = true;
|
29803 | }
|
29804 | };
|
29805 |
|
29806 | function done(stream, er) {
|
29807 | if (er) return stream.emit('error', er);
|
29808 |
|
29809 | // if there's nothing in the write buffer, then that means
|
29810 | // that nothing more will ever be provided
|
29811 | var ws = stream._writableState;
|
29812 | var ts = stream._transformState;
|
29813 |
|
29814 | if (ws.length) throw new Error('Calling transform done when ws.length != 0');
|
29815 |
|
29816 | if (ts.transforming) throw new Error('Calling transform done when still transforming');
|
29817 |
|
29818 | return stream.push(null);
|
29819 | }
|
29820 |
|
29821 | inherits$1(PassThrough$1, Transform$1);
|
29822 | function PassThrough$1(options) {
|
29823 | if (!(this instanceof PassThrough$1)) return new PassThrough$1(options);
|
29824 |
|
29825 | Transform$1.call(this, options);
|
29826 | }
|
29827 |
|
29828 | PassThrough$1.prototype._transform = function (chunk, encoding, cb) {
|
29829 | cb(null, chunk);
|
29830 | };
|
29831 |
|
29832 | inherits$1(Stream$1, EventEmitter);
|
29833 | Stream$1.Readable = Readable$1;
|
29834 | Stream$1.Writable = Writable$1;
|
29835 | Stream$1.Duplex = Duplex$1;
|
29836 | Stream$1.Transform = Transform$1;
|
29837 | Stream$1.PassThrough = PassThrough$1;
|
29838 |
|
29839 | // Backwards-compat with node 0.4.x
|
29840 | Stream$1.Stream = Stream$1;
|
29841 |
|
29842 | // old-style streams. Note that the pipe method (the only relevant
|
29843 | // part of this class) is overridden in the Readable class.
|
29844 |
|
29845 | function Stream$1() {
|
29846 | EventEmitter.call(this);
|
29847 | }
|
29848 |
|
29849 | Stream$1.prototype.pipe = function(dest, options) {
|
29850 | var source = this;
|
29851 |
|
29852 | function ondata(chunk) {
|
29853 | if (dest.writable) {
|
29854 | if (false === dest.write(chunk) && source.pause) {
|
29855 | source.pause();
|
29856 | }
|
29857 | }
|
29858 | }
|
29859 |
|
29860 | source.on('data', ondata);
|
29861 |
|
29862 | function ondrain() {
|
29863 | if (source.readable && source.resume) {
|
29864 | source.resume();
|
29865 | }
|
29866 | }
|
29867 |
|
29868 | dest.on('drain', ondrain);
|
29869 |
|
29870 | // If the 'end' option is not supplied, dest.end() will be called when
|
29871 | // source gets the 'end' or 'close' events. Only dest.end() once.
|
29872 | if (!dest._isStdio && (!options || options.end !== false)) {
|
29873 | source.on('end', onend);
|
29874 | source.on('close', onclose);
|
29875 | }
|
29876 |
|
29877 | var didOnEnd = false;
|
29878 | function onend() {
|
29879 | if (didOnEnd) return;
|
29880 | didOnEnd = true;
|
29881 |
|
29882 | dest.end();
|
29883 | }
|
29884 |
|
29885 |
|
29886 | function onclose() {
|
29887 | if (didOnEnd) return;
|
29888 | didOnEnd = true;
|
29889 |
|
29890 | if (typeof dest.destroy === 'function') dest.destroy();
|
29891 | }
|
29892 |
|
29893 | // don't leave dangling pipes when there are errors.
|
29894 | function onerror(er) {
|
29895 | cleanup();
|
29896 | if (EventEmitter.listenerCount(this, 'error') === 0) {
|
29897 | throw er; // Unhandled stream error in pipe.
|
29898 | }
|
29899 | }
|
29900 |
|
29901 | source.on('error', onerror);
|
29902 | dest.on('error', onerror);
|
29903 |
|
29904 | // remove all the event listeners that were added.
|
29905 | function cleanup() {
|
29906 | source.removeListener('data', ondata);
|
29907 | dest.removeListener('drain', ondrain);
|
29908 |
|
29909 | source.removeListener('end', onend);
|
29910 | source.removeListener('close', onclose);
|
29911 |
|
29912 | source.removeListener('error', onerror);
|
29913 | dest.removeListener('error', onerror);
|
29914 |
|
29915 | source.removeListener('end', cleanup);
|
29916 | source.removeListener('close', cleanup);
|
29917 |
|
29918 | dest.removeListener('close', cleanup);
|
29919 | }
|
29920 |
|
29921 | source.on('end', cleanup);
|
29922 | source.on('close', cleanup);
|
29923 |
|
29924 | dest.on('close', cleanup);
|
29925 |
|
29926 | dest.emit('pipe', source);
|
29927 |
|
29928 | // Allow for unix-like usage: A.pipe(B).pipe(C)
|
29929 | return dest;
|
29930 | };
|
29931 |
|
29932 |
|
29933 | var stream = Object.freeze({
|
29934 | default: Stream$1,
|
29935 | Readable: Readable$1,
|
29936 | Writable: Writable$1,
|
29937 | Duplex: Duplex$1,
|
29938 | Transform: Transform$1,
|
29939 | PassThrough: PassThrough$1,
|
29940 | Stream: Stream$1
|
29941 | });
|
29942 |
|
29943 | var require$$0$4 = ( stream && Stream$1 ) || stream;
|
29944 |
|
29945 | var require$$1$1 = ( stringDecoder && undefined ) || stringDecoder;
|
29946 |
|
29947 | var sax = createCommonjsModule(function (module, exports) {
|
29948 | (function (sax) { // wrapper for non-node envs
|
29949 | sax.parser = function (strict, opt) { return new SAXParser(strict, opt) };
|
29950 | sax.SAXParser = SAXParser;
|
29951 | sax.SAXStream = SAXStream;
|
29952 | sax.createStream = createStream;
|
29953 |
|
29954 | // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.
|
29955 | // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),
|
29956 | // since that's the earliest that a buffer overrun could occur. This way, checks are
|
29957 | // as rare as required, but as often as necessary to ensure never crossing this bound.
|
29958 | // Furthermore, buffers are only tested at most once per write(), so passing a very
|
29959 | // large string into write() might have undesirable effects, but this is manageable by
|
29960 | // the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme
|
29961 | // edge case, result in creating at most one complete copy of the string passed in.
|
29962 | // Set to Infinity to have unlimited buffers.
|
29963 | sax.MAX_BUFFER_LENGTH = 64 * 1024;
|
29964 |
|
29965 | var buffers = [
|
29966 | 'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',
|
29967 | 'procInstName', 'procInstBody', 'entity', 'attribName',
|
29968 | 'attribValue', 'cdata', 'script'
|
29969 | ];
|
29970 |
|
29971 | sax.EVENTS = [
|
29972 | 'text',
|
29973 | 'processinginstruction',
|
29974 | 'sgmldeclaration',
|
29975 | 'doctype',
|
29976 | 'comment',
|
29977 | 'opentagstart',
|
29978 | 'attribute',
|
29979 | 'opentag',
|
29980 | 'closetag',
|
29981 | 'opencdata',
|
29982 | 'cdata',
|
29983 | 'closecdata',
|
29984 | 'error',
|
29985 | 'end',
|
29986 | 'ready',
|
29987 | 'script',
|
29988 | 'opennamespace',
|
29989 | 'closenamespace'
|
29990 | ];
|
29991 |
|
29992 | function SAXParser (strict, opt) {
|
29993 | if (!(this instanceof SAXParser)) {
|
29994 | return new SAXParser(strict, opt)
|
29995 | }
|
29996 |
|
29997 | var parser = this;
|
29998 | clearBuffers(parser);
|
29999 | parser.q = parser.c = '';
|
30000 | parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH;
|
30001 | parser.opt = opt || {};
|
30002 | parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags;
|
30003 | parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase';
|
30004 | parser.tags = [];
|
30005 | parser.closed = parser.closedRoot = parser.sawRoot = false;
|
30006 | parser.tag = parser.error = null;
|
30007 | parser.strict = !!strict;
|
30008 | parser.noscript = !!(strict || parser.opt.noscript);
|
30009 | parser.state = S.BEGIN;
|
30010 | parser.strictEntities = parser.opt.strictEntities;
|
30011 | parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES);
|
30012 | parser.attribList = [];
|
30013 |
|
30014 | // namespaces form a prototype chain.
|
30015 | // it always points at the current tag,
|
30016 | // which protos to its parent tag.
|
30017 | if (parser.opt.xmlns) {
|
30018 | parser.ns = Object.create(rootNS);
|
30019 | }
|
30020 |
|
30021 | // mostly just for error reporting
|
30022 | parser.trackPosition = parser.opt.position !== false;
|
30023 | if (parser.trackPosition) {
|
30024 | parser.position = parser.line = parser.column = 0;
|
30025 | }
|
30026 | emit(parser, 'onready');
|
30027 | }
|
30028 |
|
30029 | if (!Object.create) {
|
30030 | Object.create = function (o) {
|
30031 | function F () {}
|
30032 | F.prototype = o;
|
30033 | var newf = new F();
|
30034 | return newf
|
30035 | };
|
30036 | }
|
30037 |
|
30038 | if (!Object.keys) {
|
30039 | Object.keys = function (o) {
|
30040 | var a = [];
|
30041 | for (var i in o) if (o.hasOwnProperty(i)) a.push(i);
|
30042 | return a
|
30043 | };
|
30044 | }
|
30045 |
|
30046 | function checkBufferLength (parser) {
|
30047 | var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10);
|
30048 | var maxActual = 0;
|
30049 | for (var i = 0, l = buffers.length; i < l; i++) {
|
30050 | var len = parser[buffers[i]].length;
|
30051 | if (len > maxAllowed) {
|
30052 | // Text/cdata nodes can get big, and since they're buffered,
|
30053 | // we can get here under normal conditions.
|
30054 | // Avoid issues by emitting the text node now,
|
30055 | // so at least it won't get any bigger.
|
30056 | switch (buffers[i]) {
|
30057 | case 'textNode':
|
30058 | closeText(parser);
|
30059 | break
|
30060 |
|
30061 | case 'cdata':
|
30062 | emitNode(parser, 'oncdata', parser.cdata);
|
30063 | parser.cdata = '';
|
30064 | break
|
30065 |
|
30066 | case 'script':
|
30067 | emitNode(parser, 'onscript', parser.script);
|
30068 | parser.script = '';
|
30069 | break
|
30070 |
|
30071 | default:
|
30072 | error(parser, 'Max buffer length exceeded: ' + buffers[i]);
|
30073 | }
|
30074 | }
|
30075 | maxActual = Math.max(maxActual, len);
|
30076 | }
|
30077 | // schedule the next check for the earliest possible buffer overrun.
|
30078 | var m = sax.MAX_BUFFER_LENGTH - maxActual;
|
30079 | parser.bufferCheckPosition = m + parser.position;
|
30080 | }
|
30081 |
|
30082 | function clearBuffers (parser) {
|
30083 | for (var i = 0, l = buffers.length; i < l; i++) {
|
30084 | parser[buffers[i]] = '';
|
30085 | }
|
30086 | }
|
30087 |
|
30088 | function flushBuffers (parser) {
|
30089 | closeText(parser);
|
30090 | if (parser.cdata !== '') {
|
30091 | emitNode(parser, 'oncdata', parser.cdata);
|
30092 | parser.cdata = '';
|
30093 | }
|
30094 | if (parser.script !== '') {
|
30095 | emitNode(parser, 'onscript', parser.script);
|
30096 | parser.script = '';
|
30097 | }
|
30098 | }
|
30099 |
|
30100 | SAXParser.prototype = {
|
30101 | end: function () { end(this); },
|
30102 | write: write,
|
30103 | resume: function () { this.error = null; return this },
|
30104 | close: function () { return this.write(null) },
|
30105 | flush: function () { flushBuffers(this); }
|
30106 | };
|
30107 |
|
30108 | var Stream;
|
30109 | try {
|
30110 | Stream = require$$0$4.Stream;
|
30111 | } catch (ex) {
|
30112 | Stream = function () {};
|
30113 | }
|
30114 |
|
30115 | var streamWraps = sax.EVENTS.filter(function (ev) {
|
30116 | return ev !== 'error' && ev !== 'end'
|
30117 | });
|
30118 |
|
30119 | function createStream (strict, opt) {
|
30120 | return new SAXStream(strict, opt)
|
30121 | }
|
30122 |
|
30123 | function SAXStream (strict, opt) {
|
30124 | if (!(this instanceof SAXStream)) {
|
30125 | return new SAXStream(strict, opt)
|
30126 | }
|
30127 |
|
30128 | Stream.apply(this);
|
30129 |
|
30130 | this._parser = new SAXParser(strict, opt);
|
30131 | this.writable = true;
|
30132 | this.readable = true;
|
30133 |
|
30134 | var me = this;
|
30135 |
|
30136 | this._parser.onend = function () {
|
30137 | me.emit('end');
|
30138 | };
|
30139 |
|
30140 | this._parser.onerror = function (er) {
|
30141 | me.emit('error', er);
|
30142 |
|
30143 | // if didn't throw, then means error was handled.
|
30144 | // go ahead and clear error, so we can write again.
|
30145 | me._parser.error = null;
|
30146 | };
|
30147 |
|
30148 | this._decoder = null;
|
30149 |
|
30150 | streamWraps.forEach(function (ev) {
|
30151 | Object.defineProperty(me, 'on' + ev, {
|
30152 | get: function () {
|
30153 | return me._parser['on' + ev]
|
30154 | },
|
30155 | set: function (h) {
|
30156 | if (!h) {
|
30157 | me.removeAllListeners(ev);
|
30158 | me._parser['on' + ev] = h;
|
30159 | return h
|
30160 | }
|
30161 | me.on(ev, h);
|
30162 | },
|
30163 | enumerable: true,
|
30164 | configurable: false
|
30165 | });
|
30166 | });
|
30167 | }
|
30168 |
|
30169 | SAXStream.prototype = Object.create(Stream.prototype, {
|
30170 | constructor: {
|
30171 | value: SAXStream
|
30172 | }
|
30173 | });
|
30174 |
|
30175 | SAXStream.prototype.write = function (data) {
|
30176 | if (typeof Buffer === 'function' &&
|
30177 | typeof isBuffer === 'function' &&
|
30178 | isBuffer(data)) {
|
30179 | if (!this._decoder) {
|
30180 | var SD = require$$1$1.StringDecoder;
|
30181 | this._decoder = new SD('utf8');
|
30182 | }
|
30183 | data = this._decoder.write(data);
|
30184 | }
|
30185 |
|
30186 | this._parser.write(data.toString());
|
30187 | this.emit('data', data);
|
30188 | return true
|
30189 | };
|
30190 |
|
30191 | SAXStream.prototype.end = function (chunk) {
|
30192 | if (chunk && chunk.length) {
|
30193 | this.write(chunk);
|
30194 | }
|
30195 | this._parser.end();
|
30196 | return true
|
30197 | };
|
30198 |
|
30199 | SAXStream.prototype.on = function (ev, handler) {
|
30200 | var me = this;
|
30201 | if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {
|
30202 | me._parser['on' + ev] = function () {
|
30203 | var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments);
|
30204 | args.splice(0, 0, ev);
|
30205 | me.emit.apply(me, args);
|
30206 | };
|
30207 | }
|
30208 |
|
30209 | return Stream.prototype.on.call(me, ev, handler)
|
30210 | };
|
30211 |
|
30212 | // this really needs to be replaced with character classes.
|
30213 | // XML allows all manner of ridiculous numbers and digits.
|
30214 | var CDATA = '[CDATA[';
|
30215 | var DOCTYPE = 'DOCTYPE';
|
30216 | var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace';
|
30217 | var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/';
|
30218 | var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE };
|
30219 |
|
30220 | // http://www.w3.org/TR/REC-xml/#NT-NameStartChar
|
30221 | // This implementation works on strings, a single character at a time
|
30222 | // as such, it cannot ever support astral-plane characters (10000-EFFFF)
|
30223 | // without a significant breaking change to either this parser, or the
|
30224 | // JavaScript language. Implementation of an emoji-capable xml parser
|
30225 | // is left as an exercise for the reader.
|
30226 | var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/;
|
30227 |
|
30228 | var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/;
|
30229 |
|
30230 | var entityStart = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/;
|
30231 | var entityBody = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040.\d-]/;
|
30232 |
|
30233 | function isWhitespace (c) {
|
30234 | return c === ' ' || c === '\n' || c === '\r' || c === '\t'
|
30235 | }
|
30236 |
|
30237 | function isQuote (c) {
|
30238 | return c === '"' || c === '\''
|
30239 | }
|
30240 |
|
30241 | function isAttribEnd (c) {
|
30242 | return c === '>' || isWhitespace(c)
|
30243 | }
|
30244 |
|
30245 | function isMatch (regex, c) {
|
30246 | return regex.test(c)
|
30247 | }
|
30248 |
|
30249 | function notMatch (regex, c) {
|
30250 | return !isMatch(regex, c)
|
30251 | }
|
30252 |
|
30253 | var S = 0;
|
30254 | sax.STATE = {
|
30255 | BEGIN: S++, // leading byte order mark or whitespace
|
30256 | BEGIN_WHITESPACE: S++, // leading whitespace
|
30257 | TEXT: S++, // general stuff
|
30258 | TEXT_ENTITY: S++, // & and such.
|
30259 | OPEN_WAKA: S++, // <
|
30260 | SGML_DECL: S++, // <!BLARG
|
30261 | SGML_DECL_QUOTED: S++, // <!BLARG foo "bar
|
30262 | DOCTYPE: S++, // <!DOCTYPE
|
30263 | DOCTYPE_QUOTED: S++, // <!DOCTYPE "//blah
|
30264 | DOCTYPE_DTD: S++, // <!DOCTYPE "//blah" [ ...
|
30265 | DOCTYPE_DTD_QUOTED: S++, // <!DOCTYPE "//blah" [ "foo
|
30266 | COMMENT_STARTING: S++, // <!-
|
30267 | COMMENT: S++, // <!--
|
30268 | COMMENT_ENDING: S++, // <!-- blah -
|
30269 | COMMENT_ENDED: S++, // <!-- blah --
|
30270 | CDATA: S++, // <![CDATA[ something
|
30271 | CDATA_ENDING: S++, // ]
|
30272 | CDATA_ENDING_2: S++, // ]]
|
30273 | PROC_INST: S++, // <?hi
|
30274 | PROC_INST_BODY: S++, // <?hi there
|
30275 | PROC_INST_ENDING: S++, // <?hi "there" ?
|
30276 | OPEN_TAG: S++, // <strong
|
30277 | OPEN_TAG_SLASH: S++, // <strong /
|
30278 | ATTRIB: S++, // <a
|
30279 | ATTRIB_NAME: S++, // <a foo
|
30280 | ATTRIB_NAME_SAW_WHITE: S++, // <a foo _
|
30281 | ATTRIB_VALUE: S++, // <a foo=
|
30282 | ATTRIB_VALUE_QUOTED: S++, // <a foo="bar
|
30283 | ATTRIB_VALUE_CLOSED: S++, // <a foo="bar"
|
30284 | ATTRIB_VALUE_UNQUOTED: S++, // <a foo=bar
|
30285 | ATTRIB_VALUE_ENTITY_Q: S++, // <foo bar="""
|
30286 | ATTRIB_VALUE_ENTITY_U: S++, // <foo bar="
|
30287 | CLOSE_TAG: S++, // </a
|
30288 | CLOSE_TAG_SAW_WHITE: S++, // </a >
|
30289 | SCRIPT: S++, // <script> ...
|
30290 | SCRIPT_ENDING: S++ // <script> ... <
|
30291 | };
|
30292 |
|
30293 | sax.XML_ENTITIES = {
|
30294 | 'amp': '&',
|
30295 | 'gt': '>',
|
30296 | 'lt': '<',
|
30297 | 'quot': '"',
|
30298 | 'apos': "'"
|
30299 | };
|
30300 |
|
30301 | sax.ENTITIES = {
|
30302 | 'amp': '&',
|
30303 | 'gt': '>',
|
30304 | 'lt': '<',
|
30305 | 'quot': '"',
|
30306 | 'apos': "'",
|
30307 | 'AElig': 198,
|
30308 | 'Aacute': 193,
|
30309 | 'Acirc': 194,
|
30310 | 'Agrave': 192,
|
30311 | 'Aring': 197,
|
30312 | 'Atilde': 195,
|
30313 | 'Auml': 196,
|
30314 | 'Ccedil': 199,
|
30315 | 'ETH': 208,
|
30316 | 'Eacute': 201,
|
30317 | 'Ecirc': 202,
|
30318 | 'Egrave': 200,
|
30319 | 'Euml': 203,
|
30320 | 'Iacute': 205,
|
30321 | 'Icirc': 206,
|
30322 | 'Igrave': 204,
|
30323 | 'Iuml': 207,
|
30324 | 'Ntilde': 209,
|
30325 | 'Oacute': 211,
|
30326 | 'Ocirc': 212,
|
30327 | 'Ograve': 210,
|
30328 | 'Oslash': 216,
|
30329 | 'Otilde': 213,
|
30330 | 'Ouml': 214,
|
30331 | 'THORN': 222,
|
30332 | 'Uacute': 218,
|
30333 | 'Ucirc': 219,
|
30334 | 'Ugrave': 217,
|
30335 | 'Uuml': 220,
|
30336 | 'Yacute': 221,
|
30337 | 'aacute': 225,
|
30338 | 'acirc': 226,
|
30339 | 'aelig': 230,
|
30340 | 'agrave': 224,
|
30341 | 'aring': 229,
|
30342 | 'atilde': 227,
|
30343 | 'auml': 228,
|
30344 | 'ccedil': 231,
|
30345 | 'eacute': 233,
|
30346 | 'ecirc': 234,
|
30347 | 'egrave': 232,
|
30348 | 'eth': 240,
|
30349 | 'euml': 235,
|
30350 | 'iacute': 237,
|
30351 | 'icirc': 238,
|
30352 | 'igrave': 236,
|
30353 | 'iuml': 239,
|
30354 | 'ntilde': 241,
|
30355 | 'oacute': 243,
|
30356 | 'ocirc': 244,
|
30357 | 'ograve': 242,
|
30358 | 'oslash': 248,
|
30359 | 'otilde': 245,
|
30360 | 'ouml': 246,
|
30361 | 'szlig': 223,
|
30362 | 'thorn': 254,
|
30363 | 'uacute': 250,
|
30364 | 'ucirc': 251,
|
30365 | 'ugrave': 249,
|
30366 | 'uuml': 252,
|
30367 | 'yacute': 253,
|
30368 | 'yuml': 255,
|
30369 | 'copy': 169,
|
30370 | 'reg': 174,
|
30371 | 'nbsp': 160,
|
30372 | 'iexcl': 161,
|
30373 | 'cent': 162,
|
30374 | 'pound': 163,
|
30375 | 'curren': 164,
|
30376 | 'yen': 165,
|
30377 | 'brvbar': 166,
|
30378 | 'sect': 167,
|
30379 | 'uml': 168,
|
30380 | 'ordf': 170,
|
30381 | 'laquo': 171,
|
30382 | 'not': 172,
|
30383 | 'shy': 173,
|
30384 | 'macr': 175,
|
30385 | 'deg': 176,
|
30386 | 'plusmn': 177,
|
30387 | 'sup1': 185,
|
30388 | 'sup2': 178,
|
30389 | 'sup3': 179,
|
30390 | 'acute': 180,
|
30391 | 'micro': 181,
|
30392 | 'para': 182,
|
30393 | 'middot': 183,
|
30394 | 'cedil': 184,
|
30395 | 'ordm': 186,
|
30396 | 'raquo': 187,
|
30397 | 'frac14': 188,
|
30398 | 'frac12': 189,
|
30399 | 'frac34': 190,
|
30400 | 'iquest': 191,
|
30401 | 'times': 215,
|
30402 | 'divide': 247,
|
30403 | 'OElig': 338,
|
30404 | 'oelig': 339,
|
30405 | 'Scaron': 352,
|
30406 | 'scaron': 353,
|
30407 | 'Yuml': 376,
|
30408 | 'fnof': 402,
|
30409 | 'circ': 710,
|
30410 | 'tilde': 732,
|
30411 | 'Alpha': 913,
|
30412 | 'Beta': 914,
|
30413 | 'Gamma': 915,
|
30414 | 'Delta': 916,
|
30415 | 'Epsilon': 917,
|
30416 | 'Zeta': 918,
|
30417 | 'Eta': 919,
|
30418 | 'Theta': 920,
|
30419 | 'Iota': 921,
|
30420 | 'Kappa': 922,
|
30421 | 'Lambda': 923,
|
30422 | 'Mu': 924,
|
30423 | 'Nu': 925,
|
30424 | 'Xi': 926,
|
30425 | 'Omicron': 927,
|
30426 | 'Pi': 928,
|
30427 | 'Rho': 929,
|
30428 | 'Sigma': 931,
|
30429 | 'Tau': 932,
|
30430 | 'Upsilon': 933,
|
30431 | 'Phi': 934,
|
30432 | 'Chi': 935,
|
30433 | 'Psi': 936,
|
30434 | 'Omega': 937,
|
30435 | 'alpha': 945,
|
30436 | 'beta': 946,
|
30437 | 'gamma': 947,
|
30438 | 'delta': 948,
|
30439 | 'epsilon': 949,
|
30440 | 'zeta': 950,
|
30441 | 'eta': 951,
|
30442 | 'theta': 952,
|
30443 | 'iota': 953,
|
30444 | 'kappa': 954,
|
30445 | 'lambda': 955,
|
30446 | 'mu': 956,
|
30447 | 'nu': 957,
|
30448 | 'xi': 958,
|
30449 | 'omicron': 959,
|
30450 | 'pi': 960,
|
30451 | 'rho': 961,
|
30452 | 'sigmaf': 962,
|
30453 | 'sigma': 963,
|
30454 | 'tau': 964,
|
30455 | 'upsilon': 965,
|
30456 | 'phi': 966,
|
30457 | 'chi': 967,
|
30458 | 'psi': 968,
|
30459 | 'omega': 969,
|
30460 | 'thetasym': 977,
|
30461 | 'upsih': 978,
|
30462 | 'piv': 982,
|
30463 | 'ensp': 8194,
|
30464 | 'emsp': 8195,
|
30465 | 'thinsp': 8201,
|
30466 | 'zwnj': 8204,
|
30467 | 'zwj': 8205,
|
30468 | 'lrm': 8206,
|
30469 | 'rlm': 8207,
|
30470 | 'ndash': 8211,
|
30471 | 'mdash': 8212,
|
30472 | 'lsquo': 8216,
|
30473 | 'rsquo': 8217,
|
30474 | 'sbquo': 8218,
|
30475 | 'ldquo': 8220,
|
30476 | 'rdquo': 8221,
|
30477 | 'bdquo': 8222,
|
30478 | 'dagger': 8224,
|
30479 | 'Dagger': 8225,
|
30480 | 'bull': 8226,
|
30481 | 'hellip': 8230,
|
30482 | 'permil': 8240,
|
30483 | 'prime': 8242,
|
30484 | 'Prime': 8243,
|
30485 | 'lsaquo': 8249,
|
30486 | 'rsaquo': 8250,
|
30487 | 'oline': 8254,
|
30488 | 'frasl': 8260,
|
30489 | 'euro': 8364,
|
30490 | 'image': 8465,
|
30491 | 'weierp': 8472,
|
30492 | 'real': 8476,
|
30493 | 'trade': 8482,
|
30494 | 'alefsym': 8501,
|
30495 | 'larr': 8592,
|
30496 | 'uarr': 8593,
|
30497 | 'rarr': 8594,
|
30498 | 'darr': 8595,
|
30499 | 'harr': 8596,
|
30500 | 'crarr': 8629,
|
30501 | 'lArr': 8656,
|
30502 | 'uArr': 8657,
|
30503 | 'rArr': 8658,
|
30504 | 'dArr': 8659,
|
30505 | 'hArr': 8660,
|
30506 | 'forall': 8704,
|
30507 | 'part': 8706,
|
30508 | 'exist': 8707,
|
30509 | 'empty': 8709,
|
30510 | 'nabla': 8711,
|
30511 | 'isin': 8712,
|
30512 | 'notin': 8713,
|
30513 | 'ni': 8715,
|
30514 | 'prod': 8719,
|
30515 | 'sum': 8721,
|
30516 | 'minus': 8722,
|
30517 | 'lowast': 8727,
|
30518 | 'radic': 8730,
|
30519 | 'prop': 8733,
|
30520 | 'infin': 8734,
|
30521 | 'ang': 8736,
|
30522 | 'and': 8743,
|
30523 | 'or': 8744,
|
30524 | 'cap': 8745,
|
30525 | 'cup': 8746,
|
30526 | 'int': 8747,
|
30527 | 'there4': 8756,
|
30528 | 'sim': 8764,
|
30529 | 'cong': 8773,
|
30530 | 'asymp': 8776,
|
30531 | 'ne': 8800,
|
30532 | 'equiv': 8801,
|
30533 | 'le': 8804,
|
30534 | 'ge': 8805,
|
30535 | 'sub': 8834,
|
30536 | 'sup': 8835,
|
30537 | 'nsub': 8836,
|
30538 | 'sube': 8838,
|
30539 | 'supe': 8839,
|
30540 | 'oplus': 8853,
|
30541 | 'otimes': 8855,
|
30542 | 'perp': 8869,
|
30543 | 'sdot': 8901,
|
30544 | 'lceil': 8968,
|
30545 | 'rceil': 8969,
|
30546 | 'lfloor': 8970,
|
30547 | 'rfloor': 8971,
|
30548 | 'lang': 9001,
|
30549 | 'rang': 9002,
|
30550 | 'loz': 9674,
|
30551 | 'spades': 9824,
|
30552 | 'clubs': 9827,
|
30553 | 'hearts': 9829,
|
30554 | 'diams': 9830
|
30555 | };
|
30556 |
|
30557 | Object.keys(sax.ENTITIES).forEach(function (key) {
|
30558 | var e = sax.ENTITIES[key];
|
30559 | var s = typeof e === 'number' ? String.fromCharCode(e) : e;
|
30560 | sax.ENTITIES[key] = s;
|
30561 | });
|
30562 |
|
30563 | for (var s in sax.STATE) {
|
30564 | sax.STATE[sax.STATE[s]] = s;
|
30565 | }
|
30566 |
|
30567 | // shorthand
|
30568 | S = sax.STATE;
|
30569 |
|
30570 | function emit (parser, event, data) {
|
30571 | parser[event] && parser[event](data);
|
30572 | }
|
30573 |
|
30574 | function emitNode (parser, nodeType, data) {
|
30575 | if (parser.textNode) closeText(parser);
|
30576 | emit(parser, nodeType, data);
|
30577 | }
|
30578 |
|
30579 | function closeText (parser) {
|
30580 | parser.textNode = textopts(parser.opt, parser.textNode);
|
30581 | if (parser.textNode) emit(parser, 'ontext', parser.textNode);
|
30582 | parser.textNode = '';
|
30583 | }
|
30584 |
|
30585 | function textopts (opt, text) {
|
30586 | if (opt.trim) text = text.trim();
|
30587 | if (opt.normalize) text = text.replace(/\s+/g, ' ');
|
30588 | return text
|
30589 | }
|
30590 |
|
30591 | function error (parser, er) {
|
30592 | closeText(parser);
|
30593 | if (parser.trackPosition) {
|
30594 | er += '\nLine: ' + parser.line +
|
30595 | '\nColumn: ' + parser.column +
|
30596 | '\nChar: ' + parser.c;
|
30597 | }
|
30598 | er = new Error(er);
|
30599 | parser.error = er;
|
30600 | emit(parser, 'onerror', er);
|
30601 | return parser
|
30602 | }
|
30603 |
|
30604 | function end (parser) {
|
30605 | if (parser.sawRoot && !parser.closedRoot) strictFail(parser, 'Unclosed root tag');
|
30606 | if ((parser.state !== S.BEGIN) &&
|
30607 | (parser.state !== S.BEGIN_WHITESPACE) &&
|
30608 | (parser.state !== S.TEXT)) {
|
30609 | error(parser, 'Unexpected end');
|
30610 | }
|
30611 | closeText(parser);
|
30612 | parser.c = '';
|
30613 | parser.closed = true;
|
30614 | emit(parser, 'onend');
|
30615 | SAXParser.call(parser, parser.strict, parser.opt);
|
30616 | return parser
|
30617 | }
|
30618 |
|
30619 | function strictFail (parser, message) {
|
30620 | if (typeof parser !== 'object' || !(parser instanceof SAXParser)) {
|
30621 | throw new Error('bad call to strictFail')
|
30622 | }
|
30623 | if (parser.strict) {
|
30624 | error(parser, message);
|
30625 | }
|
30626 | }
|
30627 |
|
30628 | function newTag (parser) {
|
30629 | if (!parser.strict) parser.tagName = parser.tagName[parser.looseCase]();
|
30630 | var parent = parser.tags[parser.tags.length - 1] || parser;
|
30631 | var tag = parser.tag = { name: parser.tagName, attributes: {} };
|
30632 |
|
30633 | // will be overridden if tag contails an xmlns="foo" or xmlns:foo="bar"
|
30634 | if (parser.opt.xmlns) {
|
30635 | tag.ns = parent.ns;
|
30636 | }
|
30637 | parser.attribList.length = 0;
|
30638 | emitNode(parser, 'onopentagstart', tag);
|
30639 | }
|
30640 |
|
30641 | function qname (name, attribute) {
|
30642 | var i = name.indexOf(':');
|
30643 | var qualName = i < 0 ? [ '', name ] : name.split(':');
|
30644 | var prefix = qualName[0];
|
30645 | var local = qualName[1];
|
30646 |
|
30647 | // <x "xmlns"="http://foo">
|
30648 | if (attribute && name === 'xmlns') {
|
30649 | prefix = 'xmlns';
|
30650 | local = '';
|
30651 | }
|
30652 |
|
30653 | return { prefix: prefix, local: local }
|
30654 | }
|
30655 |
|
30656 | function attrib (parser) {
|
30657 | if (!parser.strict) {
|
30658 | parser.attribName = parser.attribName[parser.looseCase]();
|
30659 | }
|
30660 |
|
30661 | if (parser.attribList.indexOf(parser.attribName) !== -1 ||
|
30662 | parser.tag.attributes.hasOwnProperty(parser.attribName)) {
|
30663 | parser.attribName = parser.attribValue = '';
|
30664 | return
|
30665 | }
|
30666 |
|
30667 | if (parser.opt.xmlns) {
|
30668 | var qn = qname(parser.attribName, true);
|
30669 | var prefix = qn.prefix;
|
30670 | var local = qn.local;
|
30671 |
|
30672 | if (prefix === 'xmlns') {
|
30673 | // namespace binding attribute. push the binding into scope
|
30674 | if (local === 'xml' && parser.attribValue !== XML_NAMESPACE) {
|
30675 | strictFail(parser,
|
30676 | 'xml: prefix must be bound to ' + XML_NAMESPACE + '\n' +
|
30677 | 'Actual: ' + parser.attribValue);
|
30678 | } else if (local === 'xmlns' && parser.attribValue !== XMLNS_NAMESPACE) {
|
30679 | strictFail(parser,
|
30680 | 'xmlns: prefix must be bound to ' + XMLNS_NAMESPACE + '\n' +
|
30681 | 'Actual: ' + parser.attribValue);
|
30682 | } else {
|
30683 | var tag = parser.tag;
|
30684 | var parent = parser.tags[parser.tags.length - 1] || parser;
|
30685 | if (tag.ns === parent.ns) {
|
30686 | tag.ns = Object.create(parent.ns);
|
30687 | }
|
30688 | tag.ns[local] = parser.attribValue;
|
30689 | }
|
30690 | }
|
30691 |
|
30692 | // defer onattribute events until all attributes have been seen
|
30693 | // so any new bindings can take effect. preserve attribute order
|
30694 | // so deferred events can be emitted in document order
|
30695 | parser.attribList.push([parser.attribName, parser.attribValue]);
|
30696 | } else {
|
30697 | // in non-xmlns mode, we can emit the event right away
|
30698 | parser.tag.attributes[parser.attribName] = parser.attribValue;
|
30699 | emitNode(parser, 'onattribute', {
|
30700 | name: parser.attribName,
|
30701 | value: parser.attribValue
|
30702 | });
|
30703 | }
|
30704 |
|
30705 | parser.attribName = parser.attribValue = '';
|
30706 | }
|
30707 |
|
30708 | function openTag (parser, selfClosing) {
|
30709 | if (parser.opt.xmlns) {
|
30710 | // emit namespace binding events
|
30711 | var tag = parser.tag;
|
30712 |
|
30713 | // add namespace info to tag
|
30714 | var qn = qname(parser.tagName);
|
30715 | tag.prefix = qn.prefix;
|
30716 | tag.local = qn.local;
|
30717 | tag.uri = tag.ns[qn.prefix] || '';
|
30718 |
|
30719 | if (tag.prefix && !tag.uri) {
|
30720 | strictFail(parser, 'Unbound namespace prefix: ' +
|
30721 | JSON.stringify(parser.tagName));
|
30722 | tag.uri = qn.prefix;
|
30723 | }
|
30724 |
|
30725 | var parent = parser.tags[parser.tags.length - 1] || parser;
|
30726 | if (tag.ns && parent.ns !== tag.ns) {
|
30727 | Object.keys(tag.ns).forEach(function (p) {
|
30728 | emitNode(parser, 'onopennamespace', {
|
30729 | prefix: p,
|
30730 | uri: tag.ns[p]
|
30731 | });
|
30732 | });
|
30733 | }
|
30734 |
|
30735 | // handle deferred onattribute events
|
30736 | // Note: do not apply default ns to attributes:
|
30737 | // http://www.w3.org/TR/REC-xml-names/#defaulting
|
30738 | for (var i = 0, l = parser.attribList.length; i < l; i++) {
|
30739 | var nv = parser.attribList[i];
|
30740 | var name = nv[0];
|
30741 | var value = nv[1];
|
30742 | var qualName = qname(name, true);
|
30743 | var prefix = qualName.prefix;
|
30744 | var local = qualName.local;
|
30745 | var uri = prefix === '' ? '' : (tag.ns[prefix] || '');
|
30746 | var a = {
|
30747 | name: name,
|
30748 | value: value,
|
30749 | prefix: prefix,
|
30750 | local: local,
|
30751 | uri: uri
|
30752 | };
|
30753 |
|
30754 | // if there's any attributes with an undefined namespace,
|
30755 | // then fail on them now.
|
30756 | if (prefix && prefix !== 'xmlns' && !uri) {
|
30757 | strictFail(parser, 'Unbound namespace prefix: ' +
|
30758 | JSON.stringify(prefix));
|
30759 | a.uri = prefix;
|
30760 | }
|
30761 | parser.tag.attributes[name] = a;
|
30762 | emitNode(parser, 'onattribute', a);
|
30763 | }
|
30764 | parser.attribList.length = 0;
|
30765 | }
|
30766 |
|
30767 | parser.tag.isSelfClosing = !!selfClosing;
|
30768 |
|
30769 | // process the tag
|
30770 | parser.sawRoot = true;
|
30771 | parser.tags.push(parser.tag);
|
30772 | emitNode(parser, 'onopentag', parser.tag);
|
30773 | if (!selfClosing) {
|
30774 | // special case for <script> in non-strict mode.
|
30775 | if (!parser.noscript && parser.tagName.toLowerCase() === 'script') {
|
30776 | parser.state = S.SCRIPT;
|
30777 | } else {
|
30778 | parser.state = S.TEXT;
|
30779 | }
|
30780 | parser.tag = null;
|
30781 | parser.tagName = '';
|
30782 | }
|
30783 | parser.attribName = parser.attribValue = '';
|
30784 | parser.attribList.length = 0;
|
30785 | }
|
30786 |
|
30787 | function closeTag (parser) {
|
30788 | if (!parser.tagName) {
|
30789 | strictFail(parser, 'Weird empty close tag.');
|
30790 | parser.textNode += '</>';
|
30791 | parser.state = S.TEXT;
|
30792 | return
|
30793 | }
|
30794 |
|
30795 | if (parser.script) {
|
30796 | if (parser.tagName !== 'script') {
|
30797 | parser.script += '</' + parser.tagName + '>';
|
30798 | parser.tagName = '';
|
30799 | parser.state = S.SCRIPT;
|
30800 | return
|
30801 | }
|
30802 | emitNode(parser, 'onscript', parser.script);
|
30803 | parser.script = '';
|
30804 | }
|
30805 |
|
30806 | // first make sure that the closing tag actually exists.
|
30807 | // <a><b></c></b></a> will close everything, otherwise.
|
30808 | var t = parser.tags.length;
|
30809 | var tagName = parser.tagName;
|
30810 | if (!parser.strict) {
|
30811 | tagName = tagName[parser.looseCase]();
|
30812 | }
|
30813 | var closeTo = tagName;
|
30814 | while (t--) {
|
30815 | var close = parser.tags[t];
|
30816 | if (close.name !== closeTo) {
|
30817 | // fail the first time in strict mode
|
30818 | strictFail(parser, 'Unexpected close tag');
|
30819 | } else {
|
30820 | break
|
30821 | }
|
30822 | }
|
30823 |
|
30824 | // didn't find it. we already failed for strict, so just abort.
|
30825 | if (t < 0) {
|
30826 | strictFail(parser, 'Unmatched closing tag: ' + parser.tagName);
|
30827 | parser.textNode += '</' + parser.tagName + '>';
|
30828 | parser.state = S.TEXT;
|
30829 | return
|
30830 | }
|
30831 | parser.tagName = tagName;
|
30832 | var s = parser.tags.length;
|
30833 | while (s-- > t) {
|
30834 | var tag = parser.tag = parser.tags.pop();
|
30835 | parser.tagName = parser.tag.name;
|
30836 | emitNode(parser, 'onclosetag', parser.tagName);
|
30837 |
|
30838 | var x = {};
|
30839 | for (var i in tag.ns) {
|
30840 | x[i] = tag.ns[i];
|
30841 | }
|
30842 |
|
30843 | var parent = parser.tags[parser.tags.length - 1] || parser;
|
30844 | if (parser.opt.xmlns && tag.ns !== parent.ns) {
|
30845 | // remove namespace bindings introduced by tag
|
30846 | Object.keys(tag.ns).forEach(function (p) {
|
30847 | var n = tag.ns[p];
|
30848 | emitNode(parser, 'onclosenamespace', { prefix: p, uri: n });
|
30849 | });
|
30850 | }
|
30851 | }
|
30852 | if (t === 0) parser.closedRoot = true;
|
30853 | parser.tagName = parser.attribValue = parser.attribName = '';
|
30854 | parser.attribList.length = 0;
|
30855 | parser.state = S.TEXT;
|
30856 | }
|
30857 |
|
30858 | function parseEntity (parser) {
|
30859 | var entity = parser.entity;
|
30860 | var entityLC = entity.toLowerCase();
|
30861 | var num;
|
30862 | var numStr = '';
|
30863 |
|
30864 | if (parser.ENTITIES[entity]) {
|
30865 | return parser.ENTITIES[entity]
|
30866 | }
|
30867 | if (parser.ENTITIES[entityLC]) {
|
30868 | return parser.ENTITIES[entityLC]
|
30869 | }
|
30870 | entity = entityLC;
|
30871 | if (entity.charAt(0) === '#') {
|
30872 | if (entity.charAt(1) === 'x') {
|
30873 | entity = entity.slice(2);
|
30874 | num = parseInt(entity, 16);
|
30875 | numStr = num.toString(16);
|
30876 | } else {
|
30877 | entity = entity.slice(1);
|
30878 | num = parseInt(entity, 10);
|
30879 | numStr = num.toString(10);
|
30880 | }
|
30881 | }
|
30882 | entity = entity.replace(/^0+/, '');
|
30883 | if (isNaN(num) || numStr.toLowerCase() !== entity) {
|
30884 | strictFail(parser, 'Invalid character entity');
|
30885 | return '&' + parser.entity + ';'
|
30886 | }
|
30887 |
|
30888 | return String.fromCodePoint(num)
|
30889 | }
|
30890 |
|
30891 | function beginWhiteSpace (parser, c) {
|
30892 | if (c === '<') {
|
30893 | parser.state = S.OPEN_WAKA;
|
30894 | parser.startTagPosition = parser.position;
|
30895 | } else if (!isWhitespace(c)) {
|
30896 | // have to process this as a text node.
|
30897 | // weird, but happens.
|
30898 | strictFail(parser, 'Non-whitespace before first tag.');
|
30899 | parser.textNode = c;
|
30900 | parser.state = S.TEXT;
|
30901 | }
|
30902 | }
|
30903 |
|
30904 | function charAt (chunk, i) {
|
30905 | var result = '';
|
30906 | if (i < chunk.length) {
|
30907 | result = chunk.charAt(i);
|
30908 | }
|
30909 | return result
|
30910 | }
|
30911 |
|
30912 | function write (chunk) {
|
30913 | var parser = this;
|
30914 | if (this.error) {
|
30915 | throw this.error
|
30916 | }
|
30917 | if (parser.closed) {
|
30918 | return error(parser,
|
30919 | 'Cannot write after close. Assign an onready handler.')
|
30920 | }
|
30921 | if (chunk === null) {
|
30922 | return end(parser)
|
30923 | }
|
30924 | if (typeof chunk === 'object') {
|
30925 | chunk = chunk.toString();
|
30926 | }
|
30927 | var i = 0;
|
30928 | var c = '';
|
30929 | while (true) {
|
30930 | c = charAt(chunk, i++);
|
30931 | parser.c = c;
|
30932 |
|
30933 | if (!c) {
|
30934 | break
|
30935 | }
|
30936 |
|
30937 | if (parser.trackPosition) {
|
30938 | parser.position++;
|
30939 | if (c === '\n') {
|
30940 | parser.line++;
|
30941 | parser.column = 0;
|
30942 | } else {
|
30943 | parser.column++;
|
30944 | }
|
30945 | }
|
30946 |
|
30947 | switch (parser.state) {
|
30948 | case S.BEGIN:
|
30949 | parser.state = S.BEGIN_WHITESPACE;
|
30950 | if (c === '\uFEFF') {
|
30951 | continue
|
30952 | }
|
30953 | beginWhiteSpace(parser, c);
|
30954 | continue
|
30955 |
|
30956 | case S.BEGIN_WHITESPACE:
|
30957 | beginWhiteSpace(parser, c);
|
30958 | continue
|
30959 |
|
30960 | case S.TEXT:
|
30961 | if (parser.sawRoot && !parser.closedRoot) {
|
30962 | var starti = i - 1;
|
30963 | while (c && c !== '<' && c !== '&') {
|
30964 | c = charAt(chunk, i++);
|
30965 | if (c && parser.trackPosition) {
|
30966 | parser.position++;
|
30967 | if (c === '\n') {
|
30968 | parser.line++;
|
30969 | parser.column = 0;
|
30970 | } else {
|
30971 | parser.column++;
|
30972 | }
|
30973 | }
|
30974 | }
|
30975 | parser.textNode += chunk.substring(starti, i - 1);
|
30976 | }
|
30977 | if (c === '<' && !(parser.sawRoot && parser.closedRoot && !parser.strict)) {
|
30978 | parser.state = S.OPEN_WAKA;
|
30979 | parser.startTagPosition = parser.position;
|
30980 | } else {
|
30981 | if (!isWhitespace(c) && (!parser.sawRoot || parser.closedRoot)) {
|
30982 | strictFail(parser, 'Text data outside of root node.');
|
30983 | }
|
30984 | if (c === '&') {
|
30985 | parser.state = S.TEXT_ENTITY;
|
30986 | } else {
|
30987 | parser.textNode += c;
|
30988 | }
|
30989 | }
|
30990 | continue
|
30991 |
|
30992 | case S.SCRIPT:
|
30993 | // only non-strict
|
30994 | if (c === '<') {
|
30995 | parser.state = S.SCRIPT_ENDING;
|
30996 | } else {
|
30997 | parser.script += c;
|
30998 | }
|
30999 | continue
|
31000 |
|
31001 | case S.SCRIPT_ENDING:
|
31002 | if (c === '/') {
|
31003 | parser.state = S.CLOSE_TAG;
|
31004 | } else {
|
31005 | parser.script += '<' + c;
|
31006 | parser.state = S.SCRIPT;
|
31007 | }
|
31008 | continue
|
31009 |
|
31010 | case S.OPEN_WAKA:
|
31011 | // either a /, ?, !, or text is coming next.
|
31012 | if (c === '!') {
|
31013 | parser.state = S.SGML_DECL;
|
31014 | parser.sgmlDecl = '';
|
31015 | } else if (isWhitespace(c)) {
|
31016 | // wait for it...
|
31017 | } else if (isMatch(nameStart, c)) {
|
31018 | parser.state = S.OPEN_TAG;
|
31019 | parser.tagName = c;
|
31020 | } else if (c === '/') {
|
31021 | parser.state = S.CLOSE_TAG;
|
31022 | parser.tagName = '';
|
31023 | } else if (c === '?') {
|
31024 | parser.state = S.PROC_INST;
|
31025 | parser.procInstName = parser.procInstBody = '';
|
31026 | } else {
|
31027 | strictFail(parser, 'Unencoded <');
|
31028 | // if there was some whitespace, then add that in.
|
31029 | if (parser.startTagPosition + 1 < parser.position) {
|
31030 | var pad = parser.position - parser.startTagPosition;
|
31031 | c = new Array(pad).join(' ') + c;
|
31032 | }
|
31033 | parser.textNode += '<' + c;
|
31034 | parser.state = S.TEXT;
|
31035 | }
|
31036 | continue
|
31037 |
|
31038 | case S.SGML_DECL:
|
31039 | if ((parser.sgmlDecl + c).toUpperCase() === CDATA) {
|
31040 | emitNode(parser, 'onopencdata');
|
31041 | parser.state = S.CDATA;
|
31042 | parser.sgmlDecl = '';
|
31043 | parser.cdata = '';
|
31044 | } else if (parser.sgmlDecl + c === '--') {
|
31045 | parser.state = S.COMMENT;
|
31046 | parser.comment = '';
|
31047 | parser.sgmlDecl = '';
|
31048 | } else if ((parser.sgmlDecl + c).toUpperCase() === DOCTYPE) {
|
31049 | parser.state = S.DOCTYPE;
|
31050 | if (parser.doctype || parser.sawRoot) {
|
31051 | strictFail(parser,
|
31052 | 'Inappropriately located doctype declaration');
|
31053 | }
|
31054 | parser.doctype = '';
|
31055 | parser.sgmlDecl = '';
|
31056 | } else if (c === '>') {
|
31057 | emitNode(parser, 'onsgmldeclaration', parser.sgmlDecl);
|
31058 | parser.sgmlDecl = '';
|
31059 | parser.state = S.TEXT;
|
31060 | } else if (isQuote(c)) {
|
31061 | parser.state = S.SGML_DECL_QUOTED;
|
31062 | parser.sgmlDecl += c;
|
31063 | } else {
|
31064 | parser.sgmlDecl += c;
|
31065 | }
|
31066 | continue
|
31067 |
|
31068 | case S.SGML_DECL_QUOTED:
|
31069 | if (c === parser.q) {
|
31070 | parser.state = S.SGML_DECL;
|
31071 | parser.q = '';
|
31072 | }
|
31073 | parser.sgmlDecl += c;
|
31074 | continue
|
31075 |
|
31076 | case S.DOCTYPE:
|
31077 | if (c === '>') {
|
31078 | parser.state = S.TEXT;
|
31079 | emitNode(parser, 'ondoctype', parser.doctype);
|
31080 | parser.doctype = true; // just remember that we saw it.
|
31081 | } else {
|
31082 | parser.doctype += c;
|
31083 | if (c === '[') {
|
31084 | parser.state = S.DOCTYPE_DTD;
|
31085 | } else if (isQuote(c)) {
|
31086 | parser.state = S.DOCTYPE_QUOTED;
|
31087 | parser.q = c;
|
31088 | }
|
31089 | }
|
31090 | continue
|
31091 |
|
31092 | case S.DOCTYPE_QUOTED:
|
31093 | parser.doctype += c;
|
31094 | if (c === parser.q) {
|
31095 | parser.q = '';
|
31096 | parser.state = S.DOCTYPE;
|
31097 | }
|
31098 | continue
|
31099 |
|
31100 | case S.DOCTYPE_DTD:
|
31101 | parser.doctype += c;
|
31102 | if (c === ']') {
|
31103 | parser.state = S.DOCTYPE;
|
31104 | } else if (isQuote(c)) {
|
31105 | parser.state = S.DOCTYPE_DTD_QUOTED;
|
31106 | parser.q = c;
|
31107 | }
|
31108 | continue
|
31109 |
|
31110 | case S.DOCTYPE_DTD_QUOTED:
|
31111 | parser.doctype += c;
|
31112 | if (c === parser.q) {
|
31113 | parser.state = S.DOCTYPE_DTD;
|
31114 | parser.q = '';
|
31115 | }
|
31116 | continue
|
31117 |
|
31118 | case S.COMMENT:
|
31119 | if (c === '-') {
|
31120 | parser.state = S.COMMENT_ENDING;
|
31121 | } else {
|
31122 | parser.comment += c;
|
31123 | }
|
31124 | continue
|
31125 |
|
31126 | case S.COMMENT_ENDING:
|
31127 | if (c === '-') {
|
31128 | parser.state = S.COMMENT_ENDED;
|
31129 | parser.comment = textopts(parser.opt, parser.comment);
|
31130 | if (parser.comment) {
|
31131 | emitNode(parser, 'oncomment', parser.comment);
|
31132 | }
|
31133 | parser.comment = '';
|
31134 | } else {
|
31135 | parser.comment += '-' + c;
|
31136 | parser.state = S.COMMENT;
|
31137 | }
|
31138 | continue
|
31139 |
|
31140 | case S.COMMENT_ENDED:
|
31141 | if (c !== '>') {
|
31142 | strictFail(parser, 'Malformed comment');
|
31143 | // allow <!-- blah -- bloo --> in non-strict mode,
|
31144 | // which is a comment of " blah -- bloo "
|
31145 | parser.comment += '--' + c;
|
31146 | parser.state = S.COMMENT;
|
31147 | } else {
|
31148 | parser.state = S.TEXT;
|
31149 | }
|
31150 | continue
|
31151 |
|
31152 | case S.CDATA:
|
31153 | if (c === ']') {
|
31154 | parser.state = S.CDATA_ENDING;
|
31155 | } else {
|
31156 | parser.cdata += c;
|
31157 | }
|
31158 | continue
|
31159 |
|
31160 | case S.CDATA_ENDING:
|
31161 | if (c === ']') {
|
31162 | parser.state = S.CDATA_ENDING_2;
|
31163 | } else {
|
31164 | parser.cdata += ']' + c;
|
31165 | parser.state = S.CDATA;
|
31166 | }
|
31167 | continue
|
31168 |
|
31169 | case S.CDATA_ENDING_2:
|
31170 | if (c === '>') {
|
31171 | if (parser.cdata) {
|
31172 | emitNode(parser, 'oncdata', parser.cdata);
|
31173 | }
|
31174 | emitNode(parser, 'onclosecdata');
|
31175 | parser.cdata = '';
|
31176 | parser.state = S.TEXT;
|
31177 | } else if (c === ']') {
|
31178 | parser.cdata += ']';
|
31179 | } else {
|
31180 | parser.cdata += ']]' + c;
|
31181 | parser.state = S.CDATA;
|
31182 | }
|
31183 | continue
|
31184 |
|
31185 | case S.PROC_INST:
|
31186 | if (c === '?') {
|
31187 | parser.state = S.PROC_INST_ENDING;
|
31188 | } else if (isWhitespace(c)) {
|
31189 | parser.state = S.PROC_INST_BODY;
|
31190 | } else {
|
31191 | parser.procInstName += c;
|
31192 | }
|
31193 | continue
|
31194 |
|
31195 | case S.PROC_INST_BODY:
|
31196 | if (!parser.procInstBody && isWhitespace(c)) {
|
31197 | continue
|
31198 | } else if (c === '?') {
|
31199 | parser.state = S.PROC_INST_ENDING;
|
31200 | } else {
|
31201 | parser.procInstBody += c;
|
31202 | }
|
31203 | continue
|
31204 |
|
31205 | case S.PROC_INST_ENDING:
|
31206 | if (c === '>') {
|
31207 | emitNode(parser, 'onprocessinginstruction', {
|
31208 | name: parser.procInstName,
|
31209 | body: parser.procInstBody
|
31210 | });
|
31211 | parser.procInstName = parser.procInstBody = '';
|
31212 | parser.state = S.TEXT;
|
31213 | } else {
|
31214 | parser.procInstBody += '?' + c;
|
31215 | parser.state = S.PROC_INST_BODY;
|
31216 | }
|
31217 | continue
|
31218 |
|
31219 | case S.OPEN_TAG:
|
31220 | if (isMatch(nameBody, c)) {
|
31221 | parser.tagName += c;
|
31222 | } else {
|
31223 | newTag(parser);
|
31224 | if (c === '>') {
|
31225 | openTag(parser);
|
31226 | } else if (c === '/') {
|
31227 | parser.state = S.OPEN_TAG_SLASH;
|
31228 | } else {
|
31229 | if (!isWhitespace(c)) {
|
31230 | strictFail(parser, 'Invalid character in tag name');
|
31231 | }
|
31232 | parser.state = S.ATTRIB;
|
31233 | }
|
31234 | }
|
31235 | continue
|
31236 |
|
31237 | case S.OPEN_TAG_SLASH:
|
31238 | if (c === '>') {
|
31239 | openTag(parser, true);
|
31240 | closeTag(parser);
|
31241 | } else {
|
31242 | strictFail(parser, 'Forward-slash in opening tag not followed by >');
|
31243 | parser.state = S.ATTRIB;
|
31244 | }
|
31245 | continue
|
31246 |
|
31247 | case S.ATTRIB:
|
31248 | // haven't read the attribute name yet.
|
31249 | if (isWhitespace(c)) {
|
31250 | continue
|
31251 | } else if (c === '>') {
|
31252 | openTag(parser);
|
31253 | } else if (c === '/') {
|
31254 | parser.state = S.OPEN_TAG_SLASH;
|
31255 | } else if (isMatch(nameStart, c)) {
|
31256 | parser.attribName = c;
|
31257 | parser.attribValue = '';
|
31258 | parser.state = S.ATTRIB_NAME;
|
31259 | } else {
|
31260 | strictFail(parser, 'Invalid attribute name');
|
31261 | }
|
31262 | continue
|
31263 |
|
31264 | case S.ATTRIB_NAME:
|
31265 | if (c === '=') {
|
31266 | parser.state = S.ATTRIB_VALUE;
|
31267 | } else if (c === '>') {
|
31268 | strictFail(parser, 'Attribute without value');
|
31269 | parser.attribValue = parser.attribName;
|
31270 | attrib(parser);
|
31271 | openTag(parser);
|
31272 | } else if (isWhitespace(c)) {
|
31273 | parser.state = S.ATTRIB_NAME_SAW_WHITE;
|
31274 | } else if (isMatch(nameBody, c)) {
|
31275 | parser.attribName += c;
|
31276 | } else {
|
31277 | strictFail(parser, 'Invalid attribute name');
|
31278 | }
|
31279 | continue
|
31280 |
|
31281 | case S.ATTRIB_NAME_SAW_WHITE:
|
31282 | if (c === '=') {
|
31283 | parser.state = S.ATTRIB_VALUE;
|
31284 | } else if (isWhitespace(c)) {
|
31285 | continue
|
31286 | } else {
|
31287 | strictFail(parser, 'Attribute without value');
|
31288 | parser.tag.attributes[parser.attribName] = '';
|
31289 | parser.attribValue = '';
|
31290 | emitNode(parser, 'onattribute', {
|
31291 | name: parser.attribName,
|
31292 | value: ''
|
31293 | });
|
31294 | parser.attribName = '';
|
31295 | if (c === '>') {
|
31296 | openTag(parser);
|
31297 | } else if (isMatch(nameStart, c)) {
|
31298 | parser.attribName = c;
|
31299 | parser.state = S.ATTRIB_NAME;
|
31300 | } else {
|
31301 | strictFail(parser, 'Invalid attribute name');
|
31302 | parser.state = S.ATTRIB;
|
31303 | }
|
31304 | }
|
31305 | continue
|
31306 |
|
31307 | case S.ATTRIB_VALUE:
|
31308 | if (isWhitespace(c)) {
|
31309 | continue
|
31310 | } else if (isQuote(c)) {
|
31311 | parser.q = c;
|
31312 | parser.state = S.ATTRIB_VALUE_QUOTED;
|
31313 | } else {
|
31314 | strictFail(parser, 'Unquoted attribute value');
|
31315 | parser.state = S.ATTRIB_VALUE_UNQUOTED;
|
31316 | parser.attribValue = c;
|
31317 | }
|
31318 | continue
|
31319 |
|
31320 | case S.ATTRIB_VALUE_QUOTED:
|
31321 | if (c !== parser.q) {
|
31322 | if (c === '&') {
|
31323 | parser.state = S.ATTRIB_VALUE_ENTITY_Q;
|
31324 | } else {
|
31325 | parser.attribValue += c;
|
31326 | }
|
31327 | continue
|
31328 | }
|
31329 | attrib(parser);
|
31330 | parser.q = '';
|
31331 | parser.state = S.ATTRIB_VALUE_CLOSED;
|
31332 | continue
|
31333 |
|
31334 | case S.ATTRIB_VALUE_CLOSED:
|
31335 | if (isWhitespace(c)) {
|
31336 | parser.state = S.ATTRIB;
|
31337 | } else if (c === '>') {
|
31338 | openTag(parser);
|
31339 | } else if (c === '/') {
|
31340 | parser.state = S.OPEN_TAG_SLASH;
|
31341 | } else if (isMatch(nameStart, c)) {
|
31342 | strictFail(parser, 'No whitespace between attributes');
|
31343 | parser.attribName = c;
|
31344 | parser.attribValue = '';
|
31345 | parser.state = S.ATTRIB_NAME;
|
31346 | } else {
|
31347 | strictFail(parser, 'Invalid attribute name');
|
31348 | }
|
31349 | continue
|
31350 |
|
31351 | case S.ATTRIB_VALUE_UNQUOTED:
|
31352 | if (!isAttribEnd(c)) {
|
31353 | if (c === '&') {
|
31354 | parser.state = S.ATTRIB_VALUE_ENTITY_U;
|
31355 | } else {
|
31356 | parser.attribValue += c;
|
31357 | }
|
31358 | continue
|
31359 | }
|
31360 | attrib(parser);
|
31361 | if (c === '>') {
|
31362 | openTag(parser);
|
31363 | } else {
|
31364 | parser.state = S.ATTRIB;
|
31365 | }
|
31366 | continue
|
31367 |
|
31368 | case S.CLOSE_TAG:
|
31369 | if (!parser.tagName) {
|
31370 | if (isWhitespace(c)) {
|
31371 | continue
|
31372 | } else if (notMatch(nameStart, c)) {
|
31373 | if (parser.script) {
|
31374 | parser.script += '</' + c;
|
31375 | parser.state = S.SCRIPT;
|
31376 | } else {
|
31377 | strictFail(parser, 'Invalid tagname in closing tag.');
|
31378 | }
|
31379 | } else {
|
31380 | parser.tagName = c;
|
31381 | }
|
31382 | } else if (c === '>') {
|
31383 | closeTag(parser);
|
31384 | } else if (isMatch(nameBody, c)) {
|
31385 | parser.tagName += c;
|
31386 | } else if (parser.script) {
|
31387 | parser.script += '</' + parser.tagName;
|
31388 | parser.tagName = '';
|
31389 | parser.state = S.SCRIPT;
|
31390 | } else {
|
31391 | if (!isWhitespace(c)) {
|
31392 | strictFail(parser, 'Invalid tagname in closing tag');
|
31393 | }
|
31394 | parser.state = S.CLOSE_TAG_SAW_WHITE;
|
31395 | }
|
31396 | continue
|
31397 |
|
31398 | case S.CLOSE_TAG_SAW_WHITE:
|
31399 | if (isWhitespace(c)) {
|
31400 | continue
|
31401 | }
|
31402 | if (c === '>') {
|
31403 | closeTag(parser);
|
31404 | } else {
|
31405 | strictFail(parser, 'Invalid characters in closing tag');
|
31406 | }
|
31407 | continue
|
31408 |
|
31409 | case S.TEXT_ENTITY:
|
31410 | case S.ATTRIB_VALUE_ENTITY_Q:
|
31411 | case S.ATTRIB_VALUE_ENTITY_U:
|
31412 | var returnState;
|
31413 | var buffer;
|
31414 | switch (parser.state) {
|
31415 | case S.TEXT_ENTITY:
|
31416 | returnState = S.TEXT;
|
31417 | buffer = 'textNode';
|
31418 | break
|
31419 |
|
31420 | case S.ATTRIB_VALUE_ENTITY_Q:
|
31421 | returnState = S.ATTRIB_VALUE_QUOTED;
|
31422 | buffer = 'attribValue';
|
31423 | break
|
31424 |
|
31425 | case S.ATTRIB_VALUE_ENTITY_U:
|
31426 | returnState = S.ATTRIB_VALUE_UNQUOTED;
|
31427 | buffer = 'attribValue';
|
31428 | break
|
31429 | }
|
31430 |
|
31431 | if (c === ';') {
|
31432 | parser[buffer] += parseEntity(parser);
|
31433 | parser.entity = '';
|
31434 | parser.state = returnState;
|
31435 | } else if (isMatch(parser.entity.length ? entityBody : entityStart, c)) {
|
31436 | parser.entity += c;
|
31437 | } else {
|
31438 | strictFail(parser, 'Invalid character in entity name');
|
31439 | parser[buffer] += '&' + parser.entity + c;
|
31440 | parser.entity = '';
|
31441 | parser.state = returnState;
|
31442 | }
|
31443 |
|
31444 | continue
|
31445 |
|
31446 | default:
|
31447 | throw new Error(parser, 'Unknown state: ' + parser.state)
|
31448 | }
|
31449 | } // while
|
31450 |
|
31451 | if (parser.position >= parser.bufferCheckPosition) {
|
31452 | checkBufferLength(parser);
|
31453 | }
|
31454 | return parser
|
31455 | }
|
31456 |
|
31457 | /*! http://mths.be/fromcodepoint v0.1.0 by @mathias */
|
31458 | /* istanbul ignore next */
|
31459 | if (!String.fromCodePoint) {
|
31460 | (function () {
|
31461 | var stringFromCharCode = String.fromCharCode;
|
31462 | var floor = Math.floor;
|
31463 | var fromCodePoint = function () {
|
31464 | var MAX_SIZE = 0x4000;
|
31465 | var codeUnits = [];
|
31466 | var highSurrogate;
|
31467 | var lowSurrogate;
|
31468 | var index = -1;
|
31469 | var length = arguments.length;
|
31470 | if (!length) {
|
31471 | return ''
|
31472 | }
|
31473 | var result = '';
|
31474 | while (++index < length) {
|
31475 | var codePoint = Number(arguments[index]);
|
31476 | if (
|
31477 | !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`
|
31478 | codePoint < 0 || // not a valid Unicode code point
|
31479 | codePoint > 0x10FFFF || // not a valid Unicode code point
|
31480 | floor(codePoint) !== codePoint // not an integer
|
31481 | ) {
|
31482 | throw RangeError('Invalid code point: ' + codePoint)
|
31483 | }
|
31484 | if (codePoint <= 0xFFFF) { // BMP code point
|
31485 | codeUnits.push(codePoint);
|
31486 | } else { // Astral code point; split in surrogate halves
|
31487 | // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
|
31488 | codePoint -= 0x10000;
|
31489 | highSurrogate = (codePoint >> 10) + 0xD800;
|
31490 | lowSurrogate = (codePoint % 0x400) + 0xDC00;
|
31491 | codeUnits.push(highSurrogate, lowSurrogate);
|
31492 | }
|
31493 | if (index + 1 === length || codeUnits.length > MAX_SIZE) {
|
31494 | result += stringFromCharCode.apply(null, codeUnits);
|
31495 | codeUnits.length = 0;
|
31496 | }
|
31497 | }
|
31498 | return result
|
31499 | };
|
31500 | /* istanbul ignore next */
|
31501 | if (Object.defineProperty) {
|
31502 | Object.defineProperty(String, 'fromCodePoint', {
|
31503 | value: fromCodePoint,
|
31504 | configurable: true,
|
31505 | writable: true
|
31506 | });
|
31507 | } else {
|
31508 | String.fromCodePoint = fromCodePoint;
|
31509 | }
|
31510 | }());
|
31511 | }
|
31512 | })(exports);
|
31513 | });
|
31514 |
|
31515 | // Returns elements grouped by changeset ID.
|
31516 |
|
31517 | function AugmentedDiffParser (xmlData, changesetsFilter, callback) {
|
31518 | var xmlParser = sax.parser(true, { lowercase: true });
|
31519 | var currentAction = '';
|
31520 | var currentElement = {};
|
31521 | var oldElement = {};
|
31522 | var currentMember = {};
|
31523 | var currentMode = '';
|
31524 | var changesetMap = {};
|
31525 |
|
31526 | function isElement (symbol) {
|
31527 | return (symbol === 'node' || symbol === 'way' || symbol === 'relation');
|
31528 | }
|
31529 |
|
31530 | function endTag (symbol) {
|
31531 | if (symbol === 'action') {
|
31532 | var changeset = currentElement.changeset;
|
31533 | if (changesetsFilter && changesetsFilter.length) {
|
31534 | if (changesetsFilter.indexOf(changeset) !== -1) {
|
31535 | if (changesetMap[changeset]) {
|
31536 | changesetMap[changeset].push(currentElement);
|
31537 | } else {
|
31538 | changesetMap[changeset] = [currentElement];
|
31539 | }
|
31540 | }
|
31541 | } else {
|
31542 | if (changesetMap[changeset]) {
|
31543 | changesetMap[changeset].push(currentElement);
|
31544 | } else {
|
31545 | changesetMap[changeset] = [currentElement];
|
31546 | }
|
31547 | }
|
31548 | }
|
31549 | if (symbol === 'osm') {
|
31550 | callback(null, changesetMap);
|
31551 | }
|
31552 | }
|
31553 |
|
31554 | function startTag (node) {
|
31555 | var symbol = node.name;
|
31556 | var attrs = node.attributes;
|
31557 |
|
31558 | if (symbol === 'action') {
|
31559 | currentAction = attrs.type;
|
31560 | }
|
31561 | if (symbol === 'new' || symbol === 'old') {
|
31562 | currentMode = symbol;
|
31563 | }
|
31564 | if (isElement(symbol)) {
|
31565 | if (currentMode === 'new' && (currentAction === 'modify' ||
|
31566 | currentAction === 'delete')) {
|
31567 | oldElement = ramda.clone(currentElement);
|
31568 | currentElement = attrs;
|
31569 | currentElement.old = oldElement;
|
31570 | } else {
|
31571 | currentElement = attrs;
|
31572 | }
|
31573 | currentElement.action = currentAction;
|
31574 | currentElement.type = symbol;
|
31575 | currentElement.tags = {};
|
31576 | if (symbol === 'way') {currentElement.nodes = []; }
|
31577 | if (symbol === 'relation') {currentElement.members = []; currentMember = {};}
|
31578 | }
|
31579 | if (symbol === 'tag' && currentElement) {
|
31580 | currentElement.tags[attrs.k] = attrs.v;
|
31581 | }
|
31582 |
|
31583 | if (symbol === 'nd' && currentElement && currentElement.type === 'way') {
|
31584 | currentElement.nodes.push(attrs);
|
31585 | }
|
31586 |
|
31587 | if (symbol === 'nd' && currentElement && currentElement.type === 'relation') {
|
31588 | currentMember.nodes.push(attrs);
|
31589 | }
|
31590 |
|
31591 | if (symbol === 'member' && currentElement && currentElement.type === 'relation') {
|
31592 | currentMember = ramda.clone(attrs);
|
31593 | currentMember.nodes = [];
|
31594 | currentElement.members.push(currentMember);
|
31595 | }
|
31596 | }
|
31597 |
|
31598 | xmlParser.onopentag = startTag;
|
31599 | xmlParser.onclosetag = endTag;
|
31600 | xmlParser.onerror = function(err) { callback(err, null); };
|
31601 | xmlParser.write(xmlData);
|
31602 | }
|
31603 |
|
31604 | var osmAdiffParserSaxjs = AugmentedDiffParser;
|
31605 |
|
31606 | /**
|
31607 | * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
|
31608 | *
|
31609 | * @name feature
|
31610 | * @param {Geometry} geometry input geometry
|
31611 | * @param {Object} properties properties
|
31612 | * @returns {FeatureCollection} a FeatureCollection of input features
|
31613 | * @example
|
31614 | * var geometry = {
|
31615 | * "type": "Point",
|
31616 | * "coordinates": [
|
31617 | * 67.5,
|
31618 | * 32.84267363195431
|
31619 | * ]
|
31620 | * }
|
31621 | *
|
31622 | * var feature = turf.feature(geometry);
|
31623 | *
|
31624 | * //=feature
|
31625 | */
|
31626 | function feature(geometry, properties) {
|
31627 | if (!geometry) throw new Error('No geometry passed');
|
31628 |
|
31629 | return {
|
31630 | type: 'Feature',
|
31631 | properties: properties || {},
|
31632 | geometry: geometry
|
31633 | };
|
31634 | }
|
31635 | var feature_1 = feature;
|
31636 |
|
31637 | /**
|
31638 | * Takes coordinates and properties (optional) and returns a new {@link Point} feature.
|
31639 | *
|
31640 | * @name point
|
31641 | * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
|
31642 | * @param {Object=} properties an Object that is used as the {@link Feature}'s
|
31643 | * properties
|
31644 | * @returns {Feature<Point>} a Point feature
|
31645 | * @example
|
31646 | * var pt1 = turf.point([-75.343, 39.984]);
|
31647 | *
|
31648 | * //=pt1
|
31649 | */
|
31650 | var point = function (coordinates, properties) {
|
31651 | if (!coordinates) throw new Error('No coordinates passed');
|
31652 | if (coordinates.length === undefined) throw new Error('Coordinates must be an array');
|
31653 | if (coordinates.length < 2) throw new Error('Coordinates must be at least 2 numbers long');
|
31654 | if (typeof coordinates[0] !== 'number' || typeof coordinates[1] !== 'number') throw new Error('Coordinates must numbers');
|
31655 |
|
31656 | return feature({
|
31657 | type: 'Point',
|
31658 | coordinates: coordinates
|
31659 | }, properties);
|
31660 | };
|
31661 |
|
31662 | /**
|
31663 | * Takes an array of LinearRings and optionally an {@link Object} with properties and returns a {@link Polygon} feature.
|
31664 | *
|
31665 | * @name polygon
|
31666 | * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
|
31667 | * @param {Object=} properties a properties object
|
31668 | * @returns {Feature<Polygon>} a Polygon feature
|
31669 | * @throws {Error} throw an error if a LinearRing of the polygon has too few positions
|
31670 | * or if a LinearRing of the Polygon does not have matching Positions at the
|
31671 | * beginning & end.
|
31672 | * @example
|
31673 | * var polygon = turf.polygon([[
|
31674 | * [-2.275543, 53.464547],
|
31675 | * [-2.275543, 53.489271],
|
31676 | * [-2.215118, 53.489271],
|
31677 | * [-2.215118, 53.464547],
|
31678 | * [-2.275543, 53.464547]
|
31679 | * ]], { name: 'poly1', population: 400});
|
31680 | *
|
31681 | * //=polygon
|
31682 | */
|
31683 | var polygon = function (coordinates, properties) {
|
31684 | if (!coordinates) throw new Error('No coordinates passed');
|
31685 |
|
31686 | for (var i = 0; i < coordinates.length; i++) {
|
31687 | var ring = coordinates[i];
|
31688 | if (ring.length < 4) {
|
31689 | throw new Error('Each LinearRing of a Polygon must have 4 or more Positions.');
|
31690 | }
|
31691 | for (var j = 0; j < ring[ring.length - 1].length; j++) {
|
31692 | if (ring[ring.length - 1][j] !== ring[0][j]) {
|
31693 | throw new Error('First and last Position are not equivalent.');
|
31694 | }
|
31695 | }
|
31696 | }
|
31697 |
|
31698 | return feature({
|
31699 | type: 'Polygon',
|
31700 | coordinates: coordinates
|
31701 | }, properties);
|
31702 | };
|
31703 |
|
31704 | /**
|
31705 | * Creates a {@link LineString} based on a
|
31706 | * coordinate array. Properties can be added optionally.
|
31707 | *
|
31708 | * @name lineString
|
31709 | * @param {Array<Array<number>>} coordinates an array of Positions
|
31710 | * @param {Object=} properties an Object of key-value pairs to add as properties
|
31711 | * @returns {Feature<LineString>} a LineString feature
|
31712 | * @throws {Error} if no coordinates are passed
|
31713 | * @example
|
31714 | * var linestring1 = turf.lineString([
|
31715 | * [-21.964416, 64.148203],
|
31716 | * [-21.956176, 64.141316],
|
31717 | * [-21.93901, 64.135924],
|
31718 | * [-21.927337, 64.136673]
|
31719 | * ]);
|
31720 | * var linestring2 = turf.lineString([
|
31721 | * [-21.929054, 64.127985],
|
31722 | * [-21.912918, 64.134726],
|
31723 | * [-21.916007, 64.141016],
|
31724 | * [-21.930084, 64.14446]
|
31725 | * ], {name: 'line 1', distance: 145});
|
31726 | *
|
31727 | * //=linestring1
|
31728 | *
|
31729 | * //=linestring2
|
31730 | */
|
31731 | var lineString = function (coordinates, properties) {
|
31732 | if (!coordinates) throw new Error('No coordinates passed');
|
31733 |
|
31734 | return feature({
|
31735 | type: 'LineString',
|
31736 | coordinates: coordinates
|
31737 | }, properties);
|
31738 | };
|
31739 |
|
31740 | /**
|
31741 | * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
|
31742 | *
|
31743 | * @name featureCollection
|
31744 | * @param {Feature[]} features input features
|
31745 | * @returns {FeatureCollection} a FeatureCollection of input features
|
31746 | * @example
|
31747 | * var features = [
|
31748 | * turf.point([-75.343, 39.984], {name: 'Location A'}),
|
31749 | * turf.point([-75.833, 39.284], {name: 'Location B'}),
|
31750 | * turf.point([-75.534, 39.123], {name: 'Location C'})
|
31751 | * ];
|
31752 | *
|
31753 | * var fc = turf.featureCollection(features);
|
31754 | *
|
31755 | * //=fc
|
31756 | */
|
31757 | var featureCollection$1 = function (features) {
|
31758 | if (!features) throw new Error('No features passed');
|
31759 |
|
31760 | return {
|
31761 | type: 'FeatureCollection',
|
31762 | features: features
|
31763 | };
|
31764 | };
|
31765 |
|
31766 | /**
|
31767 | * Creates a {@link Feature<MultiLineString>} based on a
|
31768 | * coordinate array. Properties can be added optionally.
|
31769 | *
|
31770 | * @name multiLineString
|
31771 | * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
|
31772 | * @param {Object=} properties an Object of key-value pairs to add as properties
|
31773 | * @returns {Feature<MultiLineString>} a MultiLineString feature
|
31774 | * @throws {Error} if no coordinates are passed
|
31775 | * @example
|
31776 | * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
|
31777 | *
|
31778 | * //=multiLine
|
31779 | *
|
31780 | */
|
31781 | var multiLineString = function (coordinates, properties) {
|
31782 | if (!coordinates) throw new Error('No coordinates passed');
|
31783 |
|
31784 | return feature({
|
31785 | type: 'MultiLineString',
|
31786 | coordinates: coordinates
|
31787 | }, properties);
|
31788 | };
|
31789 |
|
31790 | /**
|
31791 | * Creates a {@link Feature<MultiPoint>} based on a
|
31792 | * coordinate array. Properties can be added optionally.
|
31793 | *
|
31794 | * @name multiPoint
|
31795 | * @param {Array<Array<number>>} coordinates an array of Positions
|
31796 | * @param {Object=} properties an Object of key-value pairs to add as properties
|
31797 | * @returns {Feature<MultiPoint>} a MultiPoint feature
|
31798 | * @throws {Error} if no coordinates are passed
|
31799 | * @example
|
31800 | * var multiPt = turf.multiPoint([[0,0],[10,10]]);
|
31801 | *
|
31802 | * //=multiPt
|
31803 | *
|
31804 | */
|
31805 | var multiPoint = function (coordinates, properties) {
|
31806 | if (!coordinates) throw new Error('No coordinates passed');
|
31807 |
|
31808 | return feature({
|
31809 | type: 'MultiPoint',
|
31810 | coordinates: coordinates
|
31811 | }, properties);
|
31812 | };
|
31813 |
|
31814 |
|
31815 | /**
|
31816 | * Creates a {@link Feature<MultiPolygon>} based on a
|
31817 | * coordinate array. Properties can be added optionally.
|
31818 | *
|
31819 | * @name multiPolygon
|
31820 | * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
|
31821 | * @param {Object=} properties an Object of key-value pairs to add as properties
|
31822 | * @returns {Feature<MultiPolygon>} a multipolygon feature
|
31823 | * @throws {Error} if no coordinates are passed
|
31824 | * @example
|
31825 | * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
|
31826 | *
|
31827 | * //=multiPoly
|
31828 | *
|
31829 | */
|
31830 | var multiPolygon = function (coordinates, properties) {
|
31831 | if (!coordinates) throw new Error('No coordinates passed');
|
31832 |
|
31833 | return feature({
|
31834 | type: 'MultiPolygon',
|
31835 | coordinates: coordinates
|
31836 | }, properties);
|
31837 | };
|
31838 |
|
31839 | /**
|
31840 | * Creates a {@link Feature<GeometryCollection>} based on a
|
31841 | * coordinate array. Properties can be added optionally.
|
31842 | *
|
31843 | * @name geometryCollection
|
31844 | * @param {Array<{Geometry}>} geometries an array of GeoJSON Geometries
|
31845 | * @param {Object=} properties an Object of key-value pairs to add as properties
|
31846 | * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
|
31847 | * @example
|
31848 | * var pt = {
|
31849 | * "type": "Point",
|
31850 | * "coordinates": [100, 0]
|
31851 | * };
|
31852 | * var line = {
|
31853 | * "type": "LineString",
|
31854 | * "coordinates": [ [101, 0], [102, 1] ]
|
31855 | * };
|
31856 | * var collection = turf.geometryCollection([pt, line]);
|
31857 | *
|
31858 | * //=collection
|
31859 | */
|
31860 | var geometryCollection = function (geometries, properties) {
|
31861 | if (!geometries) throw new Error('No geometries passed');
|
31862 |
|
31863 | return feature({
|
31864 | type: 'GeometryCollection',
|
31865 | geometries: geometries
|
31866 | }, properties);
|
31867 | };
|
31868 |
|
31869 | var factors = {
|
31870 | miles: 3960,
|
31871 | nauticalmiles: 3441.145,
|
31872 | degrees: 57.2957795,
|
31873 | radians: 1,
|
31874 | inches: 250905600,
|
31875 | yards: 6969600,
|
31876 | meters: 6373000,
|
31877 | metres: 6373000,
|
31878 | kilometers: 6373,
|
31879 | kilometres: 6373,
|
31880 | feet: 20908792.65
|
31881 | };
|
31882 |
|
31883 | /*
|
31884 | * Convert a distance measurement from radians to a more friendly unit.
|
31885 | *
|
31886 | * @name radiansToDistance
|
31887 | * @param {number} distance in radians across the sphere
|
31888 | * @param {string} [units=kilometers] can be degrees, radians, miles, or kilometers
|
31889 | * inches, yards, metres, meters, kilometres, kilometers.
|
31890 | * @returns {number} distance
|
31891 | */
|
31892 | var radiansToDistance = function (radians, units) {
|
31893 | var factor = factors[units || 'kilometers'];
|
31894 | if (factor === undefined) throw new Error('Invalid unit');
|
31895 |
|
31896 | return radians * factor;
|
31897 | };
|
31898 |
|
31899 | /*
|
31900 | * Convert a distance measurement from a real-world unit into radians
|
31901 | *
|
31902 | * @name distanceToRadians
|
31903 | * @param {number} distance in real units
|
31904 | * @param {string} [units=kilometers] can be degrees, radians, miles, or kilometers
|
31905 | * inches, yards, metres, meters, kilometres, kilometers.
|
31906 | * @returns {number} radians
|
31907 | */
|
31908 | var distanceToRadians = function (distance, units) {
|
31909 | var factor = factors[units || 'kilometers'];
|
31910 | if (factor === undefined) throw new Error('Invalid unit');
|
31911 |
|
31912 | return distance / factor;
|
31913 | };
|
31914 |
|
31915 | /*
|
31916 | * Convert a distance measurement from a real-world unit into degrees
|
31917 | *
|
31918 | * @name distanceToRadians
|
31919 | * @param {number} distance in real units
|
31920 | * @param {string} [units=kilometers] can be degrees, radians, miles, or kilometers
|
31921 | * inches, yards, metres, meters, kilometres, kilometers.
|
31922 | * @returns {number} degrees
|
31923 | */
|
31924 | var distanceToDegrees = function (distance, units) {
|
31925 | var factor = factors[units || 'kilometers'];
|
31926 | if (factor === undefined) throw new Error('Invalid unit');
|
31927 |
|
31928 | return (distance / factor) * 57.2958;
|
31929 | };
|
31930 |
|
31931 | var helpers = {
|
31932 | feature: feature_1,
|
31933 | point: point,
|
31934 | polygon: polygon,
|
31935 | lineString: lineString,
|
31936 | featureCollection: featureCollection$1,
|
31937 | multiLineString: multiLineString,
|
31938 | multiPoint: multiPoint,
|
31939 | multiPolygon: multiPolygon,
|
31940 | geometryCollection: geometryCollection,
|
31941 | radiansToDistance: radiansToDistance,
|
31942 | distanceToRadians: distanceToRadians,
|
31943 | distanceToDegrees: distanceToDegrees
|
31944 | };
|
31945 |
|
31946 | /**
|
31947 | * Callback for coordEach
|
31948 | *
|
31949 | * @private
|
31950 | * @callback coordEachCallback
|
31951 | * @param {[number, number]} currentCoords The current coordinates being processed.
|
31952 | * @param {number} currentIndex The index of the current element being processed in the
|
31953 | * array.Starts at index 0, if an initialValue is provided, and at index 1 otherwise.
|
31954 | */
|
31955 |
|
31956 | /**
|
31957 | * Iterate over coordinates in any GeoJSON object, similar to Array.forEach()
|
31958 | *
|
31959 | * @name coordEach
|
31960 | * @param {Object} layer any GeoJSON object
|
31961 | * @param {Function} callback a method that takes (currentCoords, currentIndex)
|
31962 | * @param {boolean} [excludeWrapCoord=false] whether or not to include
|
31963 | * the final coordinate of LinearRings that wraps the ring in its iteration.
|
31964 | * @example
|
31965 | * var features = {
|
31966 | * "type": "FeatureCollection",
|
31967 | * "features": [
|
31968 | * {
|
31969 | * "type": "Feature",
|
31970 | * "properties": {},
|
31971 | * "geometry": {
|
31972 | * "type": "Point",
|
31973 | * "coordinates": [26, 37]
|
31974 | * }
|
31975 | * },
|
31976 | * {
|
31977 | * "type": "Feature",
|
31978 | * "properties": {},
|
31979 | * "geometry": {
|
31980 | * "type": "Point",
|
31981 | * "coordinates": [36, 53]
|
31982 | * }
|
31983 | * }
|
31984 | * ]
|
31985 | * };
|
31986 | * turf.coordEach(features, function (currentCoords, currentIndex) {
|
31987 | * //=currentCoords
|
31988 | * //=currentIndex
|
31989 | * });
|
31990 | */
|
31991 | function coordEach(layer, callback, excludeWrapCoord) {
|
31992 | var i, j, k, g, l, geometry, stopG, coords,
|
31993 | geometryMaybeCollection,
|
31994 | wrapShrink = 0,
|
31995 | currentIndex = 0,
|
31996 | isGeometryCollection,
|
31997 | isFeatureCollection = layer.type === 'FeatureCollection',
|
31998 | isFeature = layer.type === 'Feature',
|
31999 | stop = isFeatureCollection ? layer.features.length : 1;
|
32000 |
|
32001 | // This logic may look a little weird. The reason why it is that way
|
32002 | // is because it's trying to be fast. GeoJSON supports multiple kinds
|
32003 | // of objects at its root: FeatureCollection, Features, Geometries.
|
32004 | // This function has the responsibility of handling all of them, and that
|
32005 | // means that some of the `for` loops you see below actually just don't apply
|
32006 | // to certain inputs. For instance, if you give this just a
|
32007 | // Point geometry, then both loops are short-circuited and all we do
|
32008 | // is gradually rename the input until it's called 'geometry'.
|
32009 | //
|
32010 | // This also aims to allocate as few resources as possible: just a
|
32011 | // few numbers and booleans, rather than any temporary arrays as would
|
32012 | // be required with the normalization approach.
|
32013 | for (i = 0; i < stop; i++) {
|
32014 |
|
32015 | geometryMaybeCollection = (isFeatureCollection ? layer.features[i].geometry :
|
32016 | (isFeature ? layer.geometry : layer));
|
32017 | isGeometryCollection = geometryMaybeCollection.type === 'GeometryCollection';
|
32018 | stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;
|
32019 |
|
32020 | for (g = 0; g < stopG; g++) {
|
32021 | geometry = isGeometryCollection ?
|
32022 | geometryMaybeCollection.geometries[g] : geometryMaybeCollection;
|
32023 | coords = geometry.coordinates;
|
32024 |
|
32025 | wrapShrink = (excludeWrapCoord &&
|
32026 | (geometry.type === 'Polygon' || geometry.type === 'MultiPolygon')) ?
|
32027 | 1 : 0;
|
32028 |
|
32029 | if (geometry.type === 'Point') {
|
32030 | callback(coords, currentIndex);
|
32031 | currentIndex++;
|
32032 | } else if (geometry.type === 'LineString' || geometry.type === 'MultiPoint') {
|
32033 | for (j = 0; j < coords.length; j++) {
|
32034 | callback(coords[j], currentIndex);
|
32035 | currentIndex++;
|
32036 | }
|
32037 | } else if (geometry.type === 'Polygon' || geometry.type === 'MultiLineString') {
|
32038 | for (j = 0; j < coords.length; j++)
|
32039 | for (k = 0; k < coords[j].length - wrapShrink; k++) {
|
32040 | callback(coords[j][k], currentIndex);
|
32041 | currentIndex++;
|
32042 | }
|
32043 | } else if (geometry.type === 'MultiPolygon') {
|
32044 | for (j = 0; j < coords.length; j++)
|
32045 | for (k = 0; k < coords[j].length; k++)
|
32046 | for (l = 0; l < coords[j][k].length - wrapShrink; l++) {
|
32047 | callback(coords[j][k][l], currentIndex);
|
32048 | currentIndex++;
|
32049 | }
|
32050 | } else if (geometry.type === 'GeometryCollection') {
|
32051 | for (j = 0; j < geometry.geometries.length; j++)
|
32052 | coordEach(geometry.geometries[j], callback, excludeWrapCoord);
|
32053 | } else {
|
32054 | throw new Error('Unknown Geometry Type');
|
32055 | }
|
32056 | }
|
32057 | }
|
32058 | }
|
32059 | var coordEach_1 = coordEach;
|
32060 |
|
32061 | /**
|
32062 | * Callback for coordReduce
|
32063 | *
|
32064 | * The first time the callback function is called, the values provided as arguments depend
|
32065 | * on whether the reduce method has an initialValue argument.
|
32066 | *
|
32067 | * If an initialValue is provided to the reduce method:
|
32068 | * - The previousValue argument is initialValue.
|
32069 | * - The currentValue argument is the value of the first element present in the array.
|
32070 | *
|
32071 | * If an initialValue is not provided:
|
32072 | * - The previousValue argument is the value of the first element present in the array.
|
32073 | * - The currentValue argument is the value of the second element present in the array.
|
32074 | *
|
32075 | * @private
|
32076 | * @callback coordReduceCallback
|
32077 | * @param {*} previousValue The accumulated value previously returned in the last invocation
|
32078 | * of the callback, or initialValue, if supplied.
|
32079 | * @param {[number, number]} currentCoords The current coordinate being processed.
|
32080 | * @param {number} currentIndex The index of the current element being processed in the
|
32081 | * array.Starts at index 0, if an initialValue is provided, and at index 1 otherwise.
|
32082 | */
|
32083 |
|
32084 | /**
|
32085 | * Reduce coordinates in any GeoJSON object, similar to Array.reduce()
|
32086 | *
|
32087 | * @name coordReduce
|
32088 | * @param {Object} layer any GeoJSON object
|
32089 | * @param {Function} callback a method that takes (previousValue, currentCoords, currentIndex)
|
32090 | * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
|
32091 | * @param {boolean} [excludeWrapCoord=false] whether or not to include
|
32092 | * the final coordinate of LinearRings that wraps the ring in its iteration.
|
32093 | * @returns {*} The value that results from the reduction.
|
32094 | * @example
|
32095 | * var features = {
|
32096 | * "type": "FeatureCollection",
|
32097 | * "features": [
|
32098 | * {
|
32099 | * "type": "Feature",
|
32100 | * "properties": {},
|
32101 | * "geometry": {
|
32102 | * "type": "Point",
|
32103 | * "coordinates": [26, 37]
|
32104 | * }
|
32105 | * },
|
32106 | * {
|
32107 | * "type": "Feature",
|
32108 | * "properties": {},
|
32109 | * "geometry": {
|
32110 | * "type": "Point",
|
32111 | * "coordinates": [36, 53]
|
32112 | * }
|
32113 | * }
|
32114 | * ]
|
32115 | * };
|
32116 | * turf.coordReduce(features, function (previousValue, currentCoords, currentIndex) {
|
32117 | * //=previousValue
|
32118 | * //=currentCoords
|
32119 | * //=currentIndex
|
32120 | * return currentCoords;
|
32121 | * });
|
32122 | */
|
32123 | function coordReduce(layer, callback, initialValue, excludeWrapCoord) {
|
32124 | var previousValue = initialValue;
|
32125 | coordEach(layer, function (currentCoords, currentIndex) {
|
32126 | if (currentIndex === 0 && initialValue === undefined) {
|
32127 | previousValue = currentCoords;
|
32128 | } else {
|
32129 | previousValue = callback(previousValue, currentCoords, currentIndex);
|
32130 | }
|
32131 | }, excludeWrapCoord);
|
32132 | return previousValue;
|
32133 | }
|
32134 | var coordReduce_1 = coordReduce;
|
32135 |
|
32136 | /**
|
32137 | * Callback for propEach
|
32138 | *
|
32139 | * @private
|
32140 | * @callback propEachCallback
|
32141 | * @param {*} currentProperties The current properties being processed.
|
32142 | * @param {number} currentIndex The index of the current element being processed in the
|
32143 | * array.Starts at index 0, if an initialValue is provided, and at index 1 otherwise.
|
32144 | */
|
32145 |
|
32146 | /**
|
32147 | * Iterate over properties in any GeoJSON object, similar to Array.forEach()
|
32148 | *
|
32149 | * @name propEach
|
32150 | * @param {Object} layer any GeoJSON object
|
32151 | * @param {Function} callback a method that takes (currentProperties, currentIndex)
|
32152 | * @example
|
32153 | * var features = {
|
32154 | * "type": "FeatureCollection",
|
32155 | * "features": [
|
32156 | * {
|
32157 | * "type": "Feature",
|
32158 | * "properties": {"foo": "bar"},
|
32159 | * "geometry": {
|
32160 | * "type": "Point",
|
32161 | * "coordinates": [26, 37]
|
32162 | * }
|
32163 | * },
|
32164 | * {
|
32165 | * "type": "Feature",
|
32166 | * "properties": {"hello": "world"},
|
32167 | * "geometry": {
|
32168 | * "type": "Point",
|
32169 | * "coordinates": [36, 53]
|
32170 | * }
|
32171 | * }
|
32172 | * ]
|
32173 | * };
|
32174 | * turf.propEach(features, function (currentProperties, currentIndex) {
|
32175 | * //=currentProperties
|
32176 | * //=currentIndex
|
32177 | * });
|
32178 | */
|
32179 | function propEach(layer, callback) {
|
32180 | var i;
|
32181 | switch (layer.type) {
|
32182 | case 'FeatureCollection':
|
32183 | for (i = 0; i < layer.features.length; i++) {
|
32184 | callback(layer.features[i].properties, i);
|
32185 | }
|
32186 | break;
|
32187 | case 'Feature':
|
32188 | callback(layer.properties, 0);
|
32189 | break;
|
32190 | }
|
32191 | }
|
32192 | var propEach_1 = propEach;
|
32193 |
|
32194 |
|
32195 | /**
|
32196 | * Callback for propReduce
|
32197 | *
|
32198 | * The first time the callback function is called, the values provided as arguments depend
|
32199 | * on whether the reduce method has an initialValue argument.
|
32200 | *
|
32201 | * If an initialValue is provided to the reduce method:
|
32202 | * - The previousValue argument is initialValue.
|
32203 | * - The currentValue argument is the value of the first element present in the array.
|
32204 | *
|
32205 | * If an initialValue is not provided:
|
32206 | * - The previousValue argument is the value of the first element present in the array.
|
32207 | * - The currentValue argument is the value of the second element present in the array.
|
32208 | *
|
32209 | * @private
|
32210 | * @callback propReduceCallback
|
32211 | * @param {*} previousValue The accumulated value previously returned in the last invocation
|
32212 | * of the callback, or initialValue, if supplied.
|
32213 | * @param {*} currentProperties The current properties being processed.
|
32214 | * @param {number} currentIndex The index of the current element being processed in the
|
32215 | * array.Starts at index 0, if an initialValue is provided, and at index 1 otherwise.
|
32216 | */
|
32217 |
|
32218 | /**
|
32219 | * Reduce properties in any GeoJSON object into a single value,
|
32220 | * similar to how Array.reduce works. However, in this case we lazily run
|
32221 | * the reduction, so an array of all properties is unnecessary.
|
32222 | *
|
32223 | * @name propReduce
|
32224 | * @param {Object} layer any GeoJSON object
|
32225 | * @param {Function} callback a method that takes (previousValue, currentProperties, currentIndex)
|
32226 | * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
|
32227 | * @returns {*} The value that results from the reduction.
|
32228 | * @example
|
32229 | * var features = {
|
32230 | * "type": "FeatureCollection",
|
32231 | * "features": [
|
32232 | * {
|
32233 | * "type": "Feature",
|
32234 | * "properties": {"foo": "bar"},
|
32235 | * "geometry": {
|
32236 | * "type": "Point",
|
32237 | * "coordinates": [26, 37]
|
32238 | * }
|
32239 | * },
|
32240 | * {
|
32241 | * "type": "Feature",
|
32242 | * "properties": {"hello": "world"},
|
32243 | * "geometry": {
|
32244 | * "type": "Point",
|
32245 | * "coordinates": [36, 53]
|
32246 | * }
|
32247 | * }
|
32248 | * ]
|
32249 | * };
|
32250 | * turf.propReduce(features, function (previousValue, currentProperties, currentIndex) {
|
32251 | * //=previousValue
|
32252 | * //=currentProperties
|
32253 | * //=currentIndex
|
32254 | * return currentProperties
|
32255 | * });
|
32256 | */
|
32257 | function propReduce(layer, callback, initialValue) {
|
32258 | var previousValue = initialValue;
|
32259 | propEach(layer, function (currentProperties, currentIndex) {
|
32260 | if (currentIndex === 0 && initialValue === undefined) {
|
32261 | previousValue = currentProperties;
|
32262 | } else {
|
32263 | previousValue = callback(previousValue, currentProperties, currentIndex);
|
32264 | }
|
32265 | });
|
32266 | return previousValue;
|
32267 | }
|
32268 | var propReduce_1 = propReduce;
|
32269 |
|
32270 | /**
|
32271 | * Callback for featureEach
|
32272 | *
|
32273 | * @private
|
32274 | * @callback featureEachCallback
|
32275 | * @param {Feature<any>} currentFeature The current feature being processed.
|
32276 | * @param {number} currentIndex The index of the current element being processed in the
|
32277 | * array.Starts at index 0, if an initialValue is provided, and at index 1 otherwise.
|
32278 | */
|
32279 |
|
32280 | /**
|
32281 | * Iterate over features in any GeoJSON object, similar to
|
32282 | * Array.forEach.
|
32283 | *
|
32284 | * @name featureEach
|
32285 | * @param {Object} layer any GeoJSON object
|
32286 | * @param {Function} callback a method that takes (currentFeature, currentIndex)
|
32287 | * @example
|
32288 | * var features = {
|
32289 | * "type": "FeatureCollection",
|
32290 | * "features": [
|
32291 | * {
|
32292 | * "type": "Feature",
|
32293 | * "properties": {},
|
32294 | * "geometry": {
|
32295 | * "type": "Point",
|
32296 | * "coordinates": [26, 37]
|
32297 | * }
|
32298 | * },
|
32299 | * {
|
32300 | * "type": "Feature",
|
32301 | * "properties": {},
|
32302 | * "geometry": {
|
32303 | * "type": "Point",
|
32304 | * "coordinates": [36, 53]
|
32305 | * }
|
32306 | * }
|
32307 | * ]
|
32308 | * };
|
32309 | * turf.featureEach(features, function (currentFeature, currentIndex) {
|
32310 | * //=currentFeature
|
32311 | * //=currentIndex
|
32312 | * });
|
32313 | */
|
32314 | function featureEach(layer, callback) {
|
32315 | if (layer.type === 'Feature') {
|
32316 | callback(layer, 0);
|
32317 | } else if (layer.type === 'FeatureCollection') {
|
32318 | for (var i = 0; i < layer.features.length; i++) {
|
32319 | callback(layer.features[i], i);
|
32320 | }
|
32321 | }
|
32322 | }
|
32323 | var featureEach_1 = featureEach;
|
32324 |
|
32325 | /**
|
32326 | * Callback for featureReduce
|
32327 | *
|
32328 | * The first time the callback function is called, the values provided as arguments depend
|
32329 | * on whether the reduce method has an initialValue argument.
|
32330 | *
|
32331 | * If an initialValue is provided to the reduce method:
|
32332 | * - The previousValue argument is initialValue.
|
32333 | * - The currentValue argument is the value of the first element present in the array.
|
32334 | *
|
32335 | * If an initialValue is not provided:
|
32336 | * - The previousValue argument is the value of the first element present in the array.
|
32337 | * - The currentValue argument is the value of the second element present in the array.
|
32338 | *
|
32339 | * @private
|
32340 | * @callback featureReduceCallback
|
32341 | * @param {*} previousValue The accumulated value previously returned in the last invocation
|
32342 | * of the callback, or initialValue, if supplied.
|
32343 | * @param {Feature<any>} currentFeature The current Feature being processed.
|
32344 | * @param {number} currentIndex The index of the current element being processed in the
|
32345 | * array.Starts at index 0, if an initialValue is provided, and at index 1 otherwise.
|
32346 | */
|
32347 |
|
32348 | /**
|
32349 | * Reduce features in any GeoJSON object, similar to Array.reduce().
|
32350 | *
|
32351 | * @name featureReduce
|
32352 | * @param {Object} layer any GeoJSON object
|
32353 | * @param {Function} callback a method that takes (previousValue, currentFeature, currentIndex)
|
32354 | * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
|
32355 | * @returns {*} The value that results from the reduction.
|
32356 | * @example
|
32357 | * var features = {
|
32358 | * "type": "FeatureCollection",
|
32359 | * "features": [
|
32360 | * {
|
32361 | * "type": "Feature",
|
32362 | * "properties": {"foo": "bar"},
|
32363 | * "geometry": {
|
32364 | * "type": "Point",
|
32365 | * "coordinates": [26, 37]
|
32366 | * }
|
32367 | * },
|
32368 | * {
|
32369 | * "type": "Feature",
|
32370 | * "properties": {"hello": "world"},
|
32371 | * "geometry": {
|
32372 | * "type": "Point",
|
32373 | * "coordinates": [36, 53]
|
32374 | * }
|
32375 | * }
|
32376 | * ]
|
32377 | * };
|
32378 | * turf.featureReduce(features, function (previousValue, currentFeature, currentIndex) {
|
32379 | * //=previousValue
|
32380 | * //=currentFeature
|
32381 | * //=currentIndex
|
32382 | * return currentFeature
|
32383 | * });
|
32384 | */
|
32385 | function featureReduce(layer, callback, initialValue) {
|
32386 | var previousValue = initialValue;
|
32387 | featureEach(layer, function (currentFeature, currentIndex) {
|
32388 | if (currentIndex === 0 && initialValue === undefined) {
|
32389 | previousValue = currentFeature;
|
32390 | } else {
|
32391 | previousValue = callback(previousValue, currentFeature, currentIndex);
|
32392 | }
|
32393 | });
|
32394 | return previousValue;
|
32395 | }
|
32396 | var featureReduce_1 = featureReduce;
|
32397 |
|
32398 | /**
|
32399 | * Get all coordinates from any GeoJSON object.
|
32400 | *
|
32401 | * @name coordAll
|
32402 | * @param {Object} layer any GeoJSON object
|
32403 | * @returns {Array<Array<number>>} coordinate position array
|
32404 | * @example
|
32405 | * var features = {
|
32406 | * "type": "FeatureCollection",
|
32407 | * "features": [
|
32408 | * {
|
32409 | * "type": "Feature",
|
32410 | * "properties": {},
|
32411 | * "geometry": {
|
32412 | * "type": "Point",
|
32413 | * "coordinates": [26, 37]
|
32414 | * }
|
32415 | * },
|
32416 | * {
|
32417 | * "type": "Feature",
|
32418 | * "properties": {},
|
32419 | * "geometry": {
|
32420 | * "type": "Point",
|
32421 | * "coordinates": [36, 53]
|
32422 | * }
|
32423 | * }
|
32424 | * ]
|
32425 | * };
|
32426 | * var coords = turf.coordAll(features);
|
32427 | * //=coords
|
32428 | */
|
32429 | function coordAll(layer) {
|
32430 | var coords = [];
|
32431 | coordEach(layer, function (coord) {
|
32432 | coords.push(coord);
|
32433 | });
|
32434 | return coords;
|
32435 | }
|
32436 | var coordAll_1 = coordAll;
|
32437 |
|
32438 | /**
|
32439 | * Iterate over each geometry in any GeoJSON object, similar to Array.forEach()
|
32440 | *
|
32441 | * @name geomEach
|
32442 | * @param {Object} layer any GeoJSON object
|
32443 | * @param {Function} callback a method that takes (currentGeometry, currentIndex)
|
32444 | * @example
|
32445 | * var features = {
|
32446 | * "type": "FeatureCollection",
|
32447 | * "features": [
|
32448 | * {
|
32449 | * "type": "Feature",
|
32450 | * "properties": {},
|
32451 | * "geometry": {
|
32452 | * "type": "Point",
|
32453 | * "coordinates": [26, 37]
|
32454 | * }
|
32455 | * },
|
32456 | * {
|
32457 | * "type": "Feature",
|
32458 | * "properties": {},
|
32459 | * "geometry": {
|
32460 | * "type": "Point",
|
32461 | * "coordinates": [36, 53]
|
32462 | * }
|
32463 | * }
|
32464 | * ]
|
32465 | * };
|
32466 | * turf.geomEach(features, function (currentGeometry, currentIndex) {
|
32467 | * //=currentGeometry
|
32468 | * //=currentIndex
|
32469 | * });
|
32470 | */
|
32471 | function geomEach(layer, callback) {
|
32472 | var i, j, g, geometry, stopG,
|
32473 | geometryMaybeCollection,
|
32474 | isGeometryCollection,
|
32475 | currentIndex = 0,
|
32476 | isFeatureCollection = layer.type === 'FeatureCollection',
|
32477 | isFeature = layer.type === 'Feature',
|
32478 | stop = isFeatureCollection ? layer.features.length : 1;
|
32479 |
|
32480 | // This logic may look a little weird. The reason why it is that way
|
32481 | // is because it's trying to be fast. GeoJSON supports multiple kinds
|
32482 | // of objects at its root: FeatureCollection, Features, Geometries.
|
32483 | // This function has the responsibility of handling all of them, and that
|
32484 | // means that some of the `for` loops you see below actually just don't apply
|
32485 | // to certain inputs. For instance, if you give this just a
|
32486 | // Point geometry, then both loops are short-circuited and all we do
|
32487 | // is gradually rename the input until it's called 'geometry'.
|
32488 | //
|
32489 | // This also aims to allocate as few resources as possible: just a
|
32490 | // few numbers and booleans, rather than any temporary arrays as would
|
32491 | // be required with the normalization approach.
|
32492 | for (i = 0; i < stop; i++) {
|
32493 |
|
32494 | geometryMaybeCollection = (isFeatureCollection ? layer.features[i].geometry :
|
32495 | (isFeature ? layer.geometry : layer));
|
32496 | isGeometryCollection = geometryMaybeCollection.type === 'GeometryCollection';
|
32497 | stopG = isGeometryCollection ? geometryMaybeCollection.geometries.length : 1;
|
32498 |
|
32499 | for (g = 0; g < stopG; g++) {
|
32500 | geometry = isGeometryCollection ?
|
32501 | geometryMaybeCollection.geometries[g] : geometryMaybeCollection;
|
32502 |
|
32503 | if (geometry.type === 'Point' ||
|
32504 | geometry.type === 'LineString' ||
|
32505 | geometry.type === 'MultiPoint' ||
|
32506 | geometry.type === 'Polygon' ||
|
32507 | geometry.type === 'MultiLineString' ||
|
32508 | geometry.type === 'MultiPolygon') {
|
32509 | callback(geometry, currentIndex);
|
32510 | currentIndex++;
|
32511 | } else if (geometry.type === 'GeometryCollection') {
|
32512 | for (j = 0; j < geometry.geometries.length; j++) {
|
32513 | callback(geometry.geometries[j], currentIndex);
|
32514 | currentIndex++;
|
32515 | }
|
32516 | } else {
|
32517 | throw new Error('Unknown Geometry Type');
|
32518 | }
|
32519 | }
|
32520 | }
|
32521 | }
|
32522 | var geomEach_1 = geomEach;
|
32523 |
|
32524 | /**
|
32525 | * Callback for geomReduce
|
32526 | *
|
32527 | * The first time the callback function is called, the values provided as arguments depend
|
32528 | * on whether the reduce method has an initialValue argument.
|
32529 | *
|
32530 | * If an initialValue is provided to the reduce method:
|
32531 | * - The previousValue argument is initialValue.
|
32532 | * - The currentValue argument is the value of the first element present in the array.
|
32533 | *
|
32534 | * If an initialValue is not provided:
|
32535 | * - The previousValue argument is the value of the first element present in the array.
|
32536 | * - The currentValue argument is the value of the second element present in the array.
|
32537 | *
|
32538 | * @private
|
32539 | * @callback geomReduceCallback
|
32540 | * @param {*} previousValue The accumulated value previously returned in the last invocation
|
32541 | * of the callback, or initialValue, if supplied.
|
32542 | * @param {*} currentGeometry The current Feature being processed.
|
32543 | * @param {number} currentIndex The index of the current element being processed in the
|
32544 | * array.Starts at index 0, if an initialValue is provided, and at index 1 otherwise.
|
32545 | */
|
32546 |
|
32547 | /**
|
32548 | * Reduce geometry in any GeoJSON object, similar to Array.reduce().
|
32549 | *
|
32550 | * @name geomReduce
|
32551 | * @param {Object} layer any GeoJSON object
|
32552 | * @param {Function} callback a method that takes (previousValue, currentGeometry, currentIndex)
|
32553 | * @param {*} [initialValue] Value to use as the first argument to the first call of the callback.
|
32554 | * @returns {*} The value that results from the reduction.
|
32555 | * @example
|
32556 | * var features = {
|
32557 | * "type": "FeatureCollection",
|
32558 | * "features": [
|
32559 | * {
|
32560 | * "type": "Feature",
|
32561 | * "properties": {"foo": "bar"},
|
32562 | * "geometry": {
|
32563 | * "type": "Point",
|
32564 | * "coordinates": [26, 37]
|
32565 | * }
|
32566 | * },
|
32567 | * {
|
32568 | * "type": "Feature",
|
32569 | * "properties": {"hello": "world"},
|
32570 | * "geometry": {
|
32571 | * "type": "Point",
|
32572 | * "coordinates": [36, 53]
|
32573 | * }
|
32574 | * }
|
32575 | * ]
|
32576 | * };
|
32577 | * turf.geomReduce(features, function (previousValue, currentGeometry, currentIndex) {
|
32578 | * //=previousValue
|
32579 | * //=currentGeometry
|
32580 | * //=currentIndex
|
32581 | * return currentGeometry
|
32582 | * });
|
32583 | */
|
32584 | function geomReduce(layer, callback, initialValue) {
|
32585 | var previousValue = initialValue;
|
32586 | geomEach(layer, function (currentGeometry, currentIndex) {
|
32587 | if (currentIndex === 0 && initialValue === undefined) {
|
32588 | previousValue = currentGeometry;
|
32589 | } else {
|
32590 | previousValue = callback(previousValue, currentGeometry, currentIndex);
|
32591 | }
|
32592 | });
|
32593 | return previousValue;
|
32594 | }
|
32595 | var geomReduce_1 = geomReduce;
|
32596 |
|
32597 | var meta = {
|
32598 | coordEach: coordEach_1,
|
32599 | coordReduce: coordReduce_1,
|
32600 | propEach: propEach_1,
|
32601 | propReduce: propReduce_1,
|
32602 | featureEach: featureEach_1,
|
32603 | featureReduce: featureReduce_1,
|
32604 | coordAll: coordAll_1,
|
32605 | geomEach: geomEach_1,
|
32606 | geomReduce: geomReduce_1
|
32607 | };
|
32608 |
|
32609 | var each = meta.coordEach;
|
32610 |
|
32611 | /**
|
32612 | * Takes a set of features, calculates the bbox of all input features, and returns a bounding box.
|
32613 | *
|
32614 | * @name bbox
|
32615 | * @param {(Feature|FeatureCollection)} geojson input features
|
32616 | * @returns {Array<number>} bbox extent in [minX, minY, maxX, maxY] order
|
32617 | * @addToMap features, bboxPolygon
|
32618 | * @example
|
32619 | * var pt1 = turf.point([114.175329, 22.2524])
|
32620 | * var pt2 = turf.point([114.170007, 22.267969])
|
32621 | * var pt3 = turf.point([114.200649, 22.274641])
|
32622 | * var pt4 = turf.point([114.200649, 22.274641])
|
32623 | * var pt5 = turf.point([114.186744, 22.265745])
|
32624 | * var features = turf.featureCollection([pt1, pt2, pt3, pt4, pt5])
|
32625 | *
|
32626 | * var bbox = turf.bbox(features);
|
32627 | *
|
32628 | * var bboxPolygon = turf.bboxPolygon(bbox);
|
32629 | *
|
32630 | * //=bbox
|
32631 | *
|
32632 | * //=bboxPolygon
|
32633 | */
|
32634 | var bbox = function (geojson) {
|
32635 | var bbox = [Infinity, Infinity, -Infinity, -Infinity];
|
32636 | each(geojson, function (coord) {
|
32637 | if (bbox[0] > coord[0]) bbox[0] = coord[0];
|
32638 | if (bbox[1] > coord[1]) bbox[1] = coord[1];
|
32639 | if (bbox[2] < coord[0]) bbox[2] = coord[0];
|
32640 | if (bbox[3] < coord[1]) bbox[3] = coord[1];
|
32641 | });
|
32642 | return bbox;
|
32643 | };
|
32644 |
|
32645 | var polygon$1 = helpers.polygon;
|
32646 |
|
32647 | /**
|
32648 | * Takes a bbox and returns an equivalent {@link Polygon|polygon}.
|
32649 | *
|
32650 | * @name bboxPolygon
|
32651 | * @param {Array<number>} bbox extent in [minX, minY, maxX, maxY] order
|
32652 | * @return {Feature<Polygon>} a Polygon representation of the bounding box
|
32653 | * @addToMap poly
|
32654 | * @example
|
32655 | * var bbox = [0, 0, 10, 10];
|
32656 | *
|
32657 | * var poly = turf.bboxPolygon(bbox);
|
32658 | *
|
32659 | * //=poly
|
32660 | */
|
32661 |
|
32662 | var bboxPolygon = function (bbox) {
|
32663 | var lowLeft = [bbox[0], bbox[1]];
|
32664 | var topLeft = [bbox[0], bbox[3]];
|
32665 | var topRight = [bbox[2], bbox[3]];
|
32666 | var lowRight = [bbox[2], bbox[1]];
|
32667 |
|
32668 | return polygon$1([[
|
32669 | lowLeft,
|
32670 | lowRight,
|
32671 | topRight,
|
32672 | topLeft,
|
32673 | lowLeft
|
32674 | ]]);
|
32675 | };
|
32676 |
|
32677 | var index_umd = createCommonjsModule(function (module, exports) {
|
32678 | (function (global, factory) {
|
32679 | factory(exports);
|
32680 | }(commonjsGlobal, (function (exports) { 'use strict';
|
32681 |
|
32682 | var areaKeys = {"aeroway":{"runway":true,"taxiway":true},"amenity":{"bench":true},"area:highway":{},"building":{},"camp_site":{},"club":{},"craft":{},"emergency":{"designated":true,"destination":true,"no":true,"official":true,"private":true,"yes":true},"golf":{"hole":true,"lateral_water_hazard":true,"water_hazard":true},"healthcare":{},"historic":{},"junction":{"roundabout":true},"landuse":{},"leisure":{"slipway":true,"track":true},"man_made":{"breakwater":true,"cutline":true,"embankment":true,"groyne":true,"pier":true,"pipeline":true},"military":{},"natural":{"cliff":true,"coastline":true,"ridge":true,"tree_row":true},"office":{},"piste:type":{},"place":{},"power":{"line":true,"minor_line":true},"public_transport":{"platform":true},"shop":{},"tourism":{},"waterway":{"canal":true,"dam":true,"ditch":true,"drain":true,"river":true,"stream":true,"weir":true}};
|
32683 |
|
32684 | /**
|
32685 | * Test if the given OpenStreetMap tags imply that a
|
32686 | * closed way should be treated as an area.
|
32687 | *
|
32688 | * @param {Object} Object of tags to test
|
32689 | * @returns {boolean} true if tags imply area, false if they do not
|
32690 | * @example
|
32691 | * var ak = require('id-area-keys');
|
32692 | *
|
32693 | * ak.isArea({ 'natural': 'wood' });
|
32694 | * // true - a closed way tagged `natural=wood` is an area filled with trees
|
32695 | *
|
32696 | * ak.isArea({ 'natural': 'tree_row' });
|
32697 | * // false - a closed way tagged `natural=tree_row` is a linear ring of trees
|
32698 | */
|
32699 | function isArea(tags) {
|
32700 | if (typeof tags !== 'object')
|
32701 | return false;
|
32702 |
|
32703 | if (tags.area === 'yes')
|
32704 | return true;
|
32705 | if (tags.area === 'no')
|
32706 | return false;
|
32707 | for (var key in tags)
|
32708 | if (key in areaKeys && !(tags[key] in areaKeys[key]))
|
32709 | return true;
|
32710 |
|
32711 | return false;
|
32712 | }
|
32713 |
|
32714 | exports.areaKeys = areaKeys;
|
32715 | exports.isArea = isArea;
|
32716 |
|
32717 | Object.defineProperty(exports, '__esModule', { value: true });
|
32718 |
|
32719 | })));
|
32720 | });
|
32721 |
|
32722 | function ElementParser(json) {
|
32723 | function createFeature(data) {
|
32724 | switch(data.type) {
|
32725 | case 'node':
|
32726 | return createNode(data);
|
32727 | case 'way':
|
32728 | return createWay(data);
|
32729 | case 'relation':
|
32730 | return createRelation(data);
|
32731 | }
|
32732 | }
|
32733 |
|
32734 | function createNode(data) {
|
32735 | var geometry = [data.lon, data.lat].map(parseFloat);
|
32736 | var properties = ramda.omit(['lon', 'lat'], data);
|
32737 | return helpers.point(geometry, properties);
|
32738 | }
|
32739 |
|
32740 | function createWay(data) {
|
32741 | var geometry = data.nodes.map(function(node) {
|
32742 | return [node.lon, node.lat].map(parseFloat);
|
32743 | });
|
32744 | var properties = ramda.omit(['nodes'], data);
|
32745 |
|
32746 | if (data.tags && index_umd.isArea(data.tags) && isClosedWay(data.nodes)) {
|
32747 | return helpers.polygon([geometry], properties);
|
32748 | } else {
|
32749 | return helpers.lineString(geometry, properties);
|
32750 | }
|
32751 | }
|
32752 |
|
32753 | function createRelation(data) {
|
32754 | if ('members' in data) {
|
32755 | data.relations = data.members.map(createFeature).filter(ramda.complement(ramda.isNil)); // filter out nulls
|
32756 | var feature = bboxPolygon(bbox(helpers.featureCollection(data.relations)));
|
32757 | feature.properties = ramda.omit(['members'], data);
|
32758 | return feature;
|
32759 | }
|
32760 | return null;
|
32761 | }
|
32762 |
|
32763 | // If the feature was deleted, copy its
|
32764 | // geometry from the old feature
|
32765 | if (json.action === 'delete') {
|
32766 | switch(json.type) {
|
32767 | case 'node':
|
32768 | json.lon = json.old.lon;
|
32769 | json.lat = json.old.lat;
|
32770 | break;
|
32771 | case 'way':
|
32772 | json.nodes = json.old.nodes;
|
32773 | break;
|
32774 | case 'relation':
|
32775 | json.members = json.old.members;
|
32776 | break;
|
32777 | }
|
32778 | }
|
32779 |
|
32780 | // Set change type
|
32781 | switch(json.action) {
|
32782 | case 'create':
|
32783 | json.changeType = 'added';
|
32784 | break;
|
32785 | case 'delete':
|
32786 | json.changeType = 'deletedNew';
|
32787 | json.old.changeType = 'deletedOld';
|
32788 | break;
|
32789 | case 'modify':
|
32790 | json.changeType = 'modifiedNew';
|
32791 | json.old.changeType = 'modifiedOld';
|
32792 | break;
|
32793 | }
|
32794 |
|
32795 | return (
|
32796 | 'old' in json
|
32797 | ? [ramda.omit(['old'], json), json.old]
|
32798 | : [json]
|
32799 | ).map(createFeature);
|
32800 | }
|
32801 |
|
32802 | function isClosedWay(nodes) {
|
32803 | // Each LinearRing of a Polygon must have 4 or more Positions
|
32804 | if (nodes.length > 3) {
|
32805 | var firstNode = nodes[0];
|
32806 | var lastNode = nodes[nodes.length - 1];
|
32807 | return (firstNode.lat === lastNode.lat && firstNode.lon === lastNode.lon);
|
32808 | }
|
32809 | return false;
|
32810 | }
|
32811 |
|
32812 | var element = ElementParser;
|
32813 |
|
32814 | var featureCollection = helpers.featureCollection;
|
32815 |
|
32816 |
|
32817 | var changesetParser = ramda.pipe(
|
32818 | ramda.prop(['elements']),
|
32819 | ramda.map(element),
|
32820 | ramda.flatten,
|
32821 | featureCollection
|
32822 | );
|
32823 |
|
32824 | changesetParser.elementParser = element;
|
32825 | var realChangesetsParser = changesetParser;
|
32826 |
|
32827 | var moment = createCommonjsModule(function (module, exports) {
|
32828 | //! moment.js
|
32829 | //! version : 2.18.1
|
32830 | //! authors : Tim Wood, Iskren Chernev, Moment.js contributors
|
32831 | //! license : MIT
|
32832 | //! momentjs.com
|
32833 |
|
32834 | (function (global, factory) {
|
32835 | module.exports = factory();
|
32836 | }(commonjsGlobal, (function () { 'use strict';
|
32837 |
|
32838 | var hookCallback;
|
32839 |
|
32840 | function hooks () {
|
32841 | return hookCallback.apply(null, arguments);
|
32842 | }
|
32843 |
|
32844 | // This is done to register the method called with moment()
|
32845 | // without creating circular dependencies.
|
32846 | function setHookCallback (callback) {
|
32847 | hookCallback = callback;
|
32848 | }
|
32849 |
|
32850 | function isArray(input) {
|
32851 | return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';
|
32852 | }
|
32853 |
|
32854 | function isObject(input) {
|
32855 | // IE8 will treat undefined and null as object if it wasn't for
|
32856 | // input != null
|
32857 | return input != null && Object.prototype.toString.call(input) === '[object Object]';
|
32858 | }
|
32859 |
|
32860 | function isObjectEmpty(obj) {
|
32861 | var k;
|
32862 | for (k in obj) {
|
32863 | // even if its not own property I'd still call it non-empty
|
32864 | return false;
|
32865 | }
|
32866 | return true;
|
32867 | }
|
32868 |
|
32869 | function isUndefined(input) {
|
32870 | return input === void 0;
|
32871 | }
|
32872 |
|
32873 | function isNumber(input) {
|
32874 | return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';
|
32875 | }
|
32876 |
|
32877 | function isDate(input) {
|
32878 | return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';
|
32879 | }
|
32880 |
|
32881 | function map(arr, fn) {
|
32882 | var res = [], i;
|
32883 | for (i = 0; i < arr.length; ++i) {
|
32884 | res.push(fn(arr[i], i));
|
32885 | }
|
32886 | return res;
|
32887 | }
|
32888 |
|
32889 | function hasOwnProp(a, b) {
|
32890 | return Object.prototype.hasOwnProperty.call(a, b);
|
32891 | }
|
32892 |
|
32893 | function extend(a, b) {
|
32894 | for (var i in b) {
|
32895 | if (hasOwnProp(b, i)) {
|
32896 | a[i] = b[i];
|
32897 | }
|
32898 | }
|
32899 |
|
32900 | if (hasOwnProp(b, 'toString')) {
|
32901 | a.toString = b.toString;
|
32902 | }
|
32903 |
|
32904 | if (hasOwnProp(b, 'valueOf')) {
|
32905 | a.valueOf = b.valueOf;
|
32906 | }
|
32907 |
|
32908 | return a;
|
32909 | }
|
32910 |
|
32911 | function createUTC (input, format, locale, strict) {
|
32912 | return createLocalOrUTC(input, format, locale, strict, true).utc();
|
32913 | }
|
32914 |
|
32915 | function defaultParsingFlags() {
|
32916 | // We need to deep clone this object.
|
32917 | return {
|
32918 | empty : false,
|
32919 | unusedTokens : [],
|
32920 | unusedInput : [],
|
32921 | overflow : -2,
|
32922 | charsLeftOver : 0,
|
32923 | nullInput : false,
|
32924 | invalidMonth : null,
|
32925 | invalidFormat : false,
|
32926 | userInvalidated : false,
|
32927 | iso : false,
|
32928 | parsedDateParts : [],
|
32929 | meridiem : null,
|
32930 | rfc2822 : false,
|
32931 | weekdayMismatch : false
|
32932 | };
|
32933 | }
|
32934 |
|
32935 | function getParsingFlags(m) {
|
32936 | if (m._pf == null) {
|
32937 | m._pf = defaultParsingFlags();
|
32938 | }
|
32939 | return m._pf;
|
32940 | }
|
32941 |
|
32942 | var some;
|
32943 | if (Array.prototype.some) {
|
32944 | some = Array.prototype.some;
|
32945 | } else {
|
32946 | some = function (fun) {
|
32947 | var t = Object(this);
|
32948 | var len = t.length >>> 0;
|
32949 |
|
32950 | for (var i = 0; i < len; i++) {
|
32951 | if (i in t && fun.call(this, t[i], i, t)) {
|
32952 | return true;
|
32953 | }
|
32954 | }
|
32955 |
|
32956 | return false;
|
32957 | };
|
32958 | }
|
32959 |
|
32960 | var some$1 = some;
|
32961 |
|
32962 | function isValid(m) {
|
32963 | if (m._isValid == null) {
|
32964 | var flags = getParsingFlags(m);
|
32965 | var parsedParts = some$1.call(flags.parsedDateParts, function (i) {
|
32966 | return i != null;
|
32967 | });
|
32968 | var isNowValid = !isNaN(m._d.getTime()) &&
|
32969 | flags.overflow < 0 &&
|
32970 | !flags.empty &&
|
32971 | !flags.invalidMonth &&
|
32972 | !flags.invalidWeekday &&
|
32973 | !flags.nullInput &&
|
32974 | !flags.invalidFormat &&
|
32975 | !flags.userInvalidated &&
|
32976 | (!flags.meridiem || (flags.meridiem && parsedParts));
|
32977 |
|
32978 | if (m._strict) {
|
32979 | isNowValid = isNowValid &&
|
32980 | flags.charsLeftOver === 0 &&
|
32981 | flags.unusedTokens.length === 0 &&
|
32982 | flags.bigHour === undefined;
|
32983 | }
|
32984 |
|
32985 | if (Object.isFrozen == null || !Object.isFrozen(m)) {
|
32986 | m._isValid = isNowValid;
|
32987 | }
|
32988 | else {
|
32989 | return isNowValid;
|
32990 | }
|
32991 | }
|
32992 | return m._isValid;
|
32993 | }
|
32994 |
|
32995 | function createInvalid (flags) {
|
32996 | var m = createUTC(NaN);
|
32997 | if (flags != null) {
|
32998 | extend(getParsingFlags(m), flags);
|
32999 | }
|
33000 | else {
|
33001 | getParsingFlags(m).userInvalidated = true;
|
33002 | }
|
33003 |
|
33004 | return m;
|
33005 | }
|
33006 |
|
33007 | // Plugins that add properties should also add the key here (null value),
|
33008 | // so we can properly clone ourselves.
|
33009 | var momentProperties = hooks.momentProperties = [];
|
33010 |
|
33011 | function copyConfig(to, from) {
|
33012 | var i, prop, val;
|
33013 |
|
33014 | if (!isUndefined(from._isAMomentObject)) {
|
33015 | to._isAMomentObject = from._isAMomentObject;
|
33016 | }
|
33017 | if (!isUndefined(from._i)) {
|
33018 | to._i = from._i;
|
33019 | }
|
33020 | if (!isUndefined(from._f)) {
|
33021 | to._f = from._f;
|
33022 | }
|
33023 | if (!isUndefined(from._l)) {
|
33024 | to._l = from._l;
|
33025 | }
|
33026 | if (!isUndefined(from._strict)) {
|
33027 | to._strict = from._strict;
|
33028 | }
|
33029 | if (!isUndefined(from._tzm)) {
|
33030 | to._tzm = from._tzm;
|
33031 | }
|
33032 | if (!isUndefined(from._isUTC)) {
|
33033 | to._isUTC = from._isUTC;
|
33034 | }
|
33035 | if (!isUndefined(from._offset)) {
|
33036 | to._offset = from._offset;
|
33037 | }
|
33038 | if (!isUndefined(from._pf)) {
|
33039 | to._pf = getParsingFlags(from);
|
33040 | }
|
33041 | if (!isUndefined(from._locale)) {
|
33042 | to._locale = from._locale;
|
33043 | }
|
33044 |
|
33045 | if (momentProperties.length > 0) {
|
33046 | for (i = 0; i < momentProperties.length; i++) {
|
33047 | prop = momentProperties[i];
|
33048 | val = from[prop];
|
33049 | if (!isUndefined(val)) {
|
33050 | to[prop] = val;
|
33051 | }
|
33052 | }
|
33053 | }
|
33054 |
|
33055 | return to;
|
33056 | }
|
33057 |
|
33058 | var updateInProgress = false;
|
33059 |
|
33060 | // Moment prototype object
|
33061 | function Moment(config) {
|
33062 | copyConfig(this, config);
|
33063 | this._d = new Date(config._d != null ? config._d.getTime() : NaN);
|
33064 | if (!this.isValid()) {
|
33065 | this._d = new Date(NaN);
|
33066 | }
|
33067 | // Prevent infinite loop in case updateOffset creates new moment
|
33068 | // objects.
|
33069 | if (updateInProgress === false) {
|
33070 | updateInProgress = true;
|
33071 | hooks.updateOffset(this);
|
33072 | updateInProgress = false;
|
33073 | }
|
33074 | }
|
33075 |
|
33076 | function isMoment (obj) {
|
33077 | return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);
|
33078 | }
|
33079 |
|
33080 | function absFloor (number) {
|
33081 | if (number < 0) {
|
33082 | // -0 -> 0
|
33083 | return Math.ceil(number) || 0;
|
33084 | } else {
|
33085 | return Math.floor(number);
|
33086 | }
|
33087 | }
|
33088 |
|
33089 | function toInt(argumentForCoercion) {
|
33090 | var coercedNumber = +argumentForCoercion,
|
33091 | value = 0;
|
33092 |
|
33093 | if (coercedNumber !== 0 && isFinite(coercedNumber)) {
|
33094 | value = absFloor(coercedNumber);
|
33095 | }
|
33096 |
|
33097 | return value;
|
33098 | }
|
33099 |
|
33100 | // compare two arrays, return the number of differences
|
33101 | function compareArrays(array1, array2, dontConvert) {
|
33102 | var len = Math.min(array1.length, array2.length),
|
33103 | lengthDiff = Math.abs(array1.length - array2.length),
|
33104 | diffs = 0,
|
33105 | i;
|
33106 | for (i = 0; i < len; i++) {
|
33107 | if ((dontConvert && array1[i] !== array2[i]) ||
|
33108 | (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {
|
33109 | diffs++;
|
33110 | }
|
33111 | }
|
33112 | return diffs + lengthDiff;
|
33113 | }
|
33114 |
|
33115 | function warn(msg) {
|
33116 | if (hooks.suppressDeprecationWarnings === false &&
|
33117 | (typeof console !== 'undefined') && console.warn) {
|
33118 | console.warn('Deprecation warning: ' + msg);
|
33119 | }
|
33120 | }
|
33121 |
|
33122 | function deprecate(msg, fn) {
|
33123 | var firstTime = true;
|
33124 |
|
33125 | return extend(function () {
|
33126 | if (hooks.deprecationHandler != null) {
|
33127 | hooks.deprecationHandler(null, msg);
|
33128 | }
|
33129 | if (firstTime) {
|
33130 | var args = [];
|
33131 | var arg;
|
33132 | for (var i = 0; i < arguments.length; i++) {
|
33133 | arg = '';
|
33134 | if (typeof arguments[i] === 'object') {
|
33135 | arg += '\n[' + i + '] ';
|
33136 | for (var key in arguments[0]) {
|
33137 | arg += key + ': ' + arguments[0][key] + ', ';
|
33138 | }
|
33139 | arg = arg.slice(0, -2); // Remove trailing comma and space
|
33140 | } else {
|
33141 | arg = arguments[i];
|
33142 | }
|
33143 | args.push(arg);
|
33144 | }
|
33145 | warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack);
|
33146 | firstTime = false;
|
33147 | }
|
33148 | return fn.apply(this, arguments);
|
33149 | }, fn);
|
33150 | }
|
33151 |
|
33152 | var deprecations = {};
|
33153 |
|
33154 | function deprecateSimple(name, msg) {
|
33155 | if (hooks.deprecationHandler != null) {
|
33156 | hooks.deprecationHandler(name, msg);
|
33157 | }
|
33158 | if (!deprecations[name]) {
|
33159 | warn(msg);
|
33160 | deprecations[name] = true;
|
33161 | }
|
33162 | }
|
33163 |
|
33164 | hooks.suppressDeprecationWarnings = false;
|
33165 | hooks.deprecationHandler = null;
|
33166 |
|
33167 | function isFunction(input) {
|
33168 | return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';
|
33169 | }
|
33170 |
|
33171 | function set (config) {
|
33172 | var prop, i;
|
33173 | for (i in config) {
|
33174 | prop = config[i];
|
33175 | if (isFunction(prop)) {
|
33176 | this[i] = prop;
|
33177 | } else {
|
33178 | this['_' + i] = prop;
|
33179 | }
|
33180 | }
|
33181 | this._config = config;
|
33182 | // Lenient ordinal parsing accepts just a number in addition to
|
33183 | // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.
|
33184 | // TODO: Remove "ordinalParse" fallback in next major release.
|
33185 | this._dayOfMonthOrdinalParseLenient = new RegExp(
|
33186 | (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +
|
33187 | '|' + (/\d{1,2}/).source);
|
33188 | }
|
33189 |
|
33190 | function mergeConfigs(parentConfig, childConfig) {
|
33191 | var res = extend({}, parentConfig), prop;
|
33192 | for (prop in childConfig) {
|
33193 | if (hasOwnProp(childConfig, prop)) {
|
33194 | if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
|
33195 | res[prop] = {};
|
33196 | extend(res[prop], parentConfig[prop]);
|
33197 | extend(res[prop], childConfig[prop]);
|
33198 | } else if (childConfig[prop] != null) {
|
33199 | res[prop] = childConfig[prop];
|
33200 | } else {
|
33201 | delete res[prop];
|
33202 | }
|
33203 | }
|
33204 | }
|
33205 | for (prop in parentConfig) {
|
33206 | if (hasOwnProp(parentConfig, prop) &&
|
33207 | !hasOwnProp(childConfig, prop) &&
|
33208 | isObject(parentConfig[prop])) {
|
33209 | // make sure changes to properties don't modify parent config
|
33210 | res[prop] = extend({}, res[prop]);
|
33211 | }
|
33212 | }
|
33213 | return res;
|
33214 | }
|
33215 |
|
33216 | function Locale(config) {
|
33217 | if (config != null) {
|
33218 | this.set(config);
|
33219 | }
|
33220 | }
|
33221 |
|
33222 | var keys;
|
33223 |
|
33224 | if (Object.keys) {
|
33225 | keys = Object.keys;
|
33226 | } else {
|
33227 | keys = function (obj) {
|
33228 | var i, res = [];
|
33229 | for (i in obj) {
|
33230 | if (hasOwnProp(obj, i)) {
|
33231 | res.push(i);
|
33232 | }
|
33233 | }
|
33234 | return res;
|
33235 | };
|
33236 | }
|
33237 |
|
33238 | var keys$1 = keys;
|
33239 |
|
33240 | var defaultCalendar = {
|
33241 | sameDay : '[Today at] LT',
|
33242 | nextDay : '[Tomorrow at] LT',
|
33243 | nextWeek : 'dddd [at] LT',
|
33244 | lastDay : '[Yesterday at] LT',
|
33245 | lastWeek : '[Last] dddd [at] LT',
|
33246 | sameElse : 'L'
|
33247 | };
|
33248 |
|
33249 | function calendar (key, mom, now) {
|
33250 | var output = this._calendar[key] || this._calendar['sameElse'];
|
33251 | return isFunction(output) ? output.call(mom, now) : output;
|
33252 | }
|
33253 |
|
33254 | var defaultLongDateFormat = {
|
33255 | LTS : 'h:mm:ss A',
|
33256 | LT : 'h:mm A',
|
33257 | L : 'MM/DD/YYYY',
|
33258 | LL : 'MMMM D, YYYY',
|
33259 | LLL : 'MMMM D, YYYY h:mm A',
|
33260 | LLLL : 'dddd, MMMM D, YYYY h:mm A'
|
33261 | };
|
33262 |
|
33263 | function longDateFormat (key) {
|
33264 | var format = this._longDateFormat[key],
|
33265 | formatUpper = this._longDateFormat[key.toUpperCase()];
|
33266 |
|
33267 | if (format || !formatUpper) {
|
33268 | return format;
|
33269 | }
|
33270 |
|
33271 | this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {
|
33272 | return val.slice(1);
|
33273 | });
|
33274 |
|
33275 | return this._longDateFormat[key];
|
33276 | }
|
33277 |
|
33278 | var defaultInvalidDate = 'Invalid date';
|
33279 |
|
33280 | function invalidDate () {
|
33281 | return this._invalidDate;
|
33282 | }
|
33283 |
|
33284 | var defaultOrdinal = '%d';
|
33285 | var defaultDayOfMonthOrdinalParse = /\d{1,2}/;
|
33286 |
|
33287 | function ordinal (number) {
|
33288 | return this._ordinal.replace('%d', number);
|
33289 | }
|
33290 |
|
33291 | var defaultRelativeTime = {
|
33292 | future : 'in %s',
|
33293 | past : '%s ago',
|
33294 | s : 'a few seconds',
|
33295 | ss : '%d seconds',
|
33296 | m : 'a minute',
|
33297 | mm : '%d minutes',
|
33298 | h : 'an hour',
|
33299 | hh : '%d hours',
|
33300 | d : 'a day',
|
33301 | dd : '%d days',
|
33302 | M : 'a month',
|
33303 | MM : '%d months',
|
33304 | y : 'a year',
|
33305 | yy : '%d years'
|
33306 | };
|
33307 |
|
33308 | function relativeTime (number, withoutSuffix, string, isFuture) {
|
33309 | var output = this._relativeTime[string];
|
33310 | return (isFunction(output)) ?
|
33311 | output(number, withoutSuffix, string, isFuture) :
|
33312 | output.replace(/%d/i, number);
|
33313 | }
|
33314 |
|
33315 | function pastFuture (diff, output) {
|
33316 | var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
|
33317 | return isFunction(format) ? format(output) : format.replace(/%s/i, output);
|
33318 | }
|
33319 |
|
33320 | var aliases = {};
|
33321 |
|
33322 | function addUnitAlias (unit, shorthand) {
|
33323 | var lowerCase = unit.toLowerCase();
|
33324 | aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
|
33325 | }
|
33326 |
|
33327 | function normalizeUnits(units) {
|
33328 | return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;
|
33329 | }
|
33330 |
|
33331 | function normalizeObjectUnits(inputObject) {
|
33332 | var normalizedInput = {},
|
33333 | normalizedProp,
|
33334 | prop;
|
33335 |
|
33336 | for (prop in inputObject) {
|
33337 | if (hasOwnProp(inputObject, prop)) {
|
33338 | normalizedProp = normalizeUnits(prop);
|
33339 | if (normalizedProp) {
|
33340 | normalizedInput[normalizedProp] = inputObject[prop];
|
33341 | }
|
33342 | }
|
33343 | }
|
33344 |
|
33345 | return normalizedInput;
|
33346 | }
|
33347 |
|
33348 | var priorities = {};
|
33349 |
|
33350 | function addUnitPriority(unit, priority) {
|
33351 | priorities[unit] = priority;
|
33352 | }
|
33353 |
|
33354 | function getPrioritizedUnits(unitsObj) {
|
33355 | var units = [];
|
33356 | for (var u in unitsObj) {
|
33357 | units.push({unit: u, priority: priorities[u]});
|
33358 | }
|
33359 | units.sort(function (a, b) {
|
33360 | return a.priority - b.priority;
|
33361 | });
|
33362 | return units;
|
33363 | }
|
33364 |
|
33365 | function makeGetSet (unit, keepTime) {
|
33366 | return function (value) {
|
33367 | if (value != null) {
|
33368 | set$1(this, unit, value);
|
33369 | hooks.updateOffset(this, keepTime);
|
33370 | return this;
|
33371 | } else {
|
33372 | return get(this, unit);
|
33373 | }
|
33374 | };
|
33375 | }
|
33376 |
|
33377 | function get (mom, unit) {
|
33378 | return mom.isValid() ?
|
33379 | mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;
|
33380 | }
|
33381 |
|
33382 | function set$1 (mom, unit, value) {
|
33383 | if (mom.isValid()) {
|
33384 | mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
|
33385 | }
|
33386 | }
|
33387 |
|
33388 | // MOMENTS
|
33389 |
|
33390 | function stringGet (units) {
|
33391 | units = normalizeUnits(units);
|
33392 | if (isFunction(this[units])) {
|
33393 | return this[units]();
|
33394 | }
|
33395 | return this;
|
33396 | }
|
33397 |
|
33398 |
|
33399 | function stringSet (units, value) {
|
33400 | if (typeof units === 'object') {
|
33401 | units = normalizeObjectUnits(units);
|
33402 | var prioritized = getPrioritizedUnits(units);
|
33403 | for (var i = 0; i < prioritized.length; i++) {
|
33404 | this[prioritized[i].unit](units[prioritized[i].unit]);
|
33405 | }
|
33406 | } else {
|
33407 | units = normalizeUnits(units);
|
33408 | if (isFunction(this[units])) {
|
33409 | return this[units](value);
|
33410 | }
|
33411 | }
|
33412 | return this;
|
33413 | }
|
33414 |
|
33415 | function zeroFill(number, targetLength, forceSign) {
|
33416 | var absNumber = '' + Math.abs(number),
|
33417 | zerosToFill = targetLength - absNumber.length,
|
33418 | sign = number >= 0;
|
33419 | return (sign ? (forceSign ? '+' : '') : '-') +
|
33420 | Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;
|
33421 | }
|
33422 |
|
33423 | var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;
|
33424 |
|
33425 | var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g;
|
33426 |
|
33427 | var formatFunctions = {};
|
33428 |
|
33429 | var formatTokenFunctions = {};
|
33430 |
|
33431 | // token: 'M'
|
33432 | // padded: ['MM', 2]
|
33433 | // ordinal: 'Mo'
|
33434 | // callback: function () { this.month() + 1 }
|
33435 | function addFormatToken (token, padded, ordinal, callback) {
|
33436 | var func = callback;
|
33437 | if (typeof callback === 'string') {
|
33438 | func = function () {
|
33439 | return this[callback]();
|
33440 | };
|
33441 | }
|
33442 | if (token) {
|
33443 | formatTokenFunctions[token] = func;
|
33444 | }
|
33445 | if (padded) {
|
33446 | formatTokenFunctions[padded[0]] = function () {
|
33447 | return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
|
33448 | };
|
33449 | }
|
33450 | if (ordinal) {
|
33451 | formatTokenFunctions[ordinal] = function () {
|
33452 | return this.localeData().ordinal(func.apply(this, arguments), token);
|
33453 | };
|
33454 | }
|
33455 | }
|
33456 |
|
33457 | function removeFormattingTokens(input) {
|
33458 | if (input.match(/\[[\s\S]/)) {
|
33459 | return input.replace(/^\[|\]$/g, '');
|
33460 | }
|
33461 | return input.replace(/\\/g, '');
|
33462 | }
|
33463 |
|
33464 | function makeFormatFunction(format) {
|
33465 | var array = format.match(formattingTokens), i, length;
|
33466 |
|
33467 | for (i = 0, length = array.length; i < length; i++) {
|
33468 | if (formatTokenFunctions[array[i]]) {
|
33469 | array[i] = formatTokenFunctions[array[i]];
|
33470 | } else {
|
33471 | array[i] = removeFormattingTokens(array[i]);
|
33472 | }
|
33473 | }
|
33474 |
|
33475 | return function (mom) {
|
33476 | var output = '', i;
|
33477 | for (i = 0; i < length; i++) {
|
33478 | output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];
|
33479 | }
|
33480 | return output;
|
33481 | };
|
33482 | }
|
33483 |
|
33484 | // format date using native date object
|
33485 | function formatMoment(m, format) {
|
33486 | if (!m.isValid()) {
|
33487 | return m.localeData().invalidDate();
|
33488 | }
|
33489 |
|
33490 | format = expandFormat(format, m.localeData());
|
33491 | formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);
|
33492 |
|
33493 | return formatFunctions[format](m);
|
33494 | }
|
33495 |
|
33496 | function expandFormat(format, locale) {
|
33497 | var i = 5;
|
33498 |
|
33499 | function replaceLongDateFormatTokens(input) {
|
33500 | return locale.longDateFormat(input) || input;
|
33501 | }
|
33502 |
|
33503 | localFormattingTokens.lastIndex = 0;
|
33504 | while (i >= 0 && localFormattingTokens.test(format)) {
|
33505 | format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
|
33506 | localFormattingTokens.lastIndex = 0;
|
33507 | i -= 1;
|
33508 | }
|
33509 |
|
33510 | return format;
|
33511 | }
|
33512 |
|
33513 | var match1 = /\d/; // 0 - 9
|
33514 | var match2 = /\d\d/; // 00 - 99
|
33515 | var match3 = /\d{3}/; // 000 - 999
|
33516 | var match4 = /\d{4}/; // 0000 - 9999
|
33517 | var match6 = /[+-]?\d{6}/; // -999999 - 999999
|
33518 | var match1to2 = /\d\d?/; // 0 - 99
|
33519 | var match3to4 = /\d\d\d\d?/; // 999 - 9999
|
33520 | var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999
|
33521 | var match1to3 = /\d{1,3}/; // 0 - 999
|
33522 | var match1to4 = /\d{1,4}/; // 0 - 9999
|
33523 | var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999
|
33524 |
|
33525 | var matchUnsigned = /\d+/; // 0 - inf
|
33526 | var matchSigned = /[+-]?\d+/; // -inf - inf
|
33527 |
|
33528 | var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z
|
33529 | var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z
|
33530 |
|
33531 | var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123
|
33532 |
|
33533 | // any word (or two) characters or numbers including two/three word month in arabic.
|
33534 | // includes scottish gaelic two word and hyphenated months
|
33535 | var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i;
|
33536 |
|
33537 |
|
33538 | var regexes = {};
|
33539 |
|
33540 | function addRegexToken (token, regex, strictRegex) {
|
33541 | regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {
|
33542 | return (isStrict && strictRegex) ? strictRegex : regex;
|
33543 | };
|
33544 | }
|
33545 |
|
33546 | function getParseRegexForToken (token, config) {
|
33547 | if (!hasOwnProp(regexes, token)) {
|
33548 | return new RegExp(unescapeFormat(token));
|
33549 | }
|
33550 |
|
33551 | return regexes[token](config._strict, config._locale);
|
33552 | }
|
33553 |
|
33554 | // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
|
33555 | function unescapeFormat(s) {
|
33556 | return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
|
33557 | return p1 || p2 || p3 || p4;
|
33558 | }));
|
33559 | }
|
33560 |
|
33561 | function regexEscape(s) {
|
33562 | return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
|
33563 | }
|
33564 |
|
33565 | var tokens = {};
|
33566 |
|
33567 | function addParseToken (token, callback) {
|
33568 | var i, func = callback;
|
33569 | if (typeof token === 'string') {
|
33570 | token = [token];
|
33571 | }
|
33572 | if (isNumber(callback)) {
|
33573 | func = function (input, array) {
|
33574 | array[callback] = toInt(input);
|
33575 | };
|
33576 | }
|
33577 | for (i = 0; i < token.length; i++) {
|
33578 | tokens[token[i]] = func;
|
33579 | }
|
33580 | }
|
33581 |
|
33582 | function addWeekParseToken (token, callback) {
|
33583 | addParseToken(token, function (input, array, config, token) {
|
33584 | config._w = config._w || {};
|
33585 | callback(input, config._w, config, token);
|
33586 | });
|
33587 | }
|
33588 |
|
33589 | function addTimeToArrayFromToken(token, input, config) {
|
33590 | if (input != null && hasOwnProp(tokens, token)) {
|
33591 | tokens[token](input, config._a, config, token);
|
33592 | }
|
33593 | }
|
33594 |
|
33595 | var YEAR = 0;
|
33596 | var MONTH = 1;
|
33597 | var DATE = 2;
|
33598 | var HOUR = 3;
|
33599 | var MINUTE = 4;
|
33600 | var SECOND = 5;
|
33601 | var MILLISECOND = 6;
|
33602 | var WEEK = 7;
|
33603 | var WEEKDAY = 8;
|
33604 |
|
33605 | var indexOf;
|
33606 |
|
33607 | if (Array.prototype.indexOf) {
|
33608 | indexOf = Array.prototype.indexOf;
|
33609 | } else {
|
33610 | indexOf = function (o) {
|
33611 | // I know
|
33612 | var i;
|
33613 | for (i = 0; i < this.length; ++i) {
|
33614 | if (this[i] === o) {
|
33615 | return i;
|
33616 | }
|
33617 | }
|
33618 | return -1;
|
33619 | };
|
33620 | }
|
33621 |
|
33622 | var indexOf$1 = indexOf;
|
33623 |
|
33624 | function daysInMonth(year, month) {
|
33625 | return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
|
33626 | }
|
33627 |
|
33628 | // FORMATTING
|
33629 |
|
33630 | addFormatToken('M', ['MM', 2], 'Mo', function () {
|
33631 | return this.month() + 1;
|
33632 | });
|
33633 |
|
33634 | addFormatToken('MMM', 0, 0, function (format) {
|
33635 | return this.localeData().monthsShort(this, format);
|
33636 | });
|
33637 |
|
33638 | addFormatToken('MMMM', 0, 0, function (format) {
|
33639 | return this.localeData().months(this, format);
|
33640 | });
|
33641 |
|
33642 | // ALIASES
|
33643 |
|
33644 | addUnitAlias('month', 'M');
|
33645 |
|
33646 | // PRIORITY
|
33647 |
|
33648 | addUnitPriority('month', 8);
|
33649 |
|
33650 | // PARSING
|
33651 |
|
33652 | addRegexToken('M', match1to2);
|
33653 | addRegexToken('MM', match1to2, match2);
|
33654 | addRegexToken('MMM', function (isStrict, locale) {
|
33655 | return locale.monthsShortRegex(isStrict);
|
33656 | });
|
33657 | addRegexToken('MMMM', function (isStrict, locale) {
|
33658 | return locale.monthsRegex(isStrict);
|
33659 | });
|
33660 |
|
33661 | addParseToken(['M', 'MM'], function (input, array) {
|
33662 | array[MONTH] = toInt(input) - 1;
|
33663 | });
|
33664 |
|
33665 | addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
|
33666 | var month = config._locale.monthsParse(input, token, config._strict);
|
33667 | // if we didn't find a month name, mark the date as invalid.
|
33668 | if (month != null) {
|
33669 | array[MONTH] = month;
|
33670 | } else {
|
33671 | getParsingFlags(config).invalidMonth = input;
|
33672 | }
|
33673 | });
|
33674 |
|
33675 | // LOCALES
|
33676 |
|
33677 | var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/;
|
33678 | var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');
|
33679 | function localeMonths (m, format) {
|
33680 | if (!m) {
|
33681 | return isArray(this._months) ? this._months :
|
33682 | this._months['standalone'];
|
33683 | }
|
33684 | return isArray(this._months) ? this._months[m.month()] :
|
33685 | this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];
|
33686 | }
|
33687 |
|
33688 | var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');
|
33689 | function localeMonthsShort (m, format) {
|
33690 | if (!m) {
|
33691 | return isArray(this._monthsShort) ? this._monthsShort :
|
33692 | this._monthsShort['standalone'];
|
33693 | }
|
33694 | return isArray(this._monthsShort) ? this._monthsShort[m.month()] :
|
33695 | this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];
|
33696 | }
|
33697 |
|
33698 | function handleStrictParse(monthName, format, strict) {
|
33699 | var i, ii, mom, llc = monthName.toLocaleLowerCase();
|
33700 | if (!this._monthsParse) {
|
33701 | // this is not used
|
33702 | this._monthsParse = [];
|
33703 | this._longMonthsParse = [];
|
33704 | this._shortMonthsParse = [];
|
33705 | for (i = 0; i < 12; ++i) {
|
33706 | mom = createUTC([2000, i]);
|
33707 | this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();
|
33708 | this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();
|
33709 | }
|
33710 | }
|
33711 |
|
33712 | if (strict) {
|
33713 | if (format === 'MMM') {
|
33714 | ii = indexOf$1.call(this._shortMonthsParse, llc);
|
33715 | return ii !== -1 ? ii : null;
|
33716 | } else {
|
33717 | ii = indexOf$1.call(this._longMonthsParse, llc);
|
33718 | return ii !== -1 ? ii : null;
|
33719 | }
|
33720 | } else {
|
33721 | if (format === 'MMM') {
|
33722 | ii = indexOf$1.call(this._shortMonthsParse, llc);
|
33723 | if (ii !== -1) {
|
33724 | return ii;
|
33725 | }
|
33726 | ii = indexOf$1.call(this._longMonthsParse, llc);
|
33727 | return ii !== -1 ? ii : null;
|
33728 | } else {
|
33729 | ii = indexOf$1.call(this._longMonthsParse, llc);
|
33730 | if (ii !== -1) {
|
33731 | return ii;
|
33732 | }
|
33733 | ii = indexOf$1.call(this._shortMonthsParse, llc);
|
33734 | return ii !== -1 ? ii : null;
|
33735 | }
|
33736 | }
|
33737 | }
|
33738 |
|
33739 | function localeMonthsParse (monthName, format, strict) {
|
33740 | var i, mom, regex;
|
33741 |
|
33742 | if (this._monthsParseExact) {
|
33743 | return handleStrictParse.call(this, monthName, format, strict);
|
33744 | }
|
33745 |
|
33746 | if (!this._monthsParse) {
|
33747 | this._monthsParse = [];
|
33748 | this._longMonthsParse = [];
|
33749 | this._shortMonthsParse = [];
|
33750 | }
|
33751 |
|
33752 | // TODO: add sorting
|
33753 | // Sorting makes sure if one month (or abbr) is a prefix of another
|
33754 | // see sorting in computeMonthsParse
|
33755 | for (i = 0; i < 12; i++) {
|
33756 | // make the regex if we don't have it already
|
33757 | mom = createUTC([2000, i]);
|
33758 | if (strict && !this._longMonthsParse[i]) {
|
33759 | this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');
|
33760 | this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');
|
33761 | }
|
33762 | if (!strict && !this._monthsParse[i]) {
|
33763 | regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
|
33764 | this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
|
33765 | }
|
33766 | // test the regex
|
33767 | if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {
|
33768 | return i;
|
33769 | } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {
|
33770 | return i;
|
33771 | } else if (!strict && this._monthsParse[i].test(monthName)) {
|
33772 | return i;
|
33773 | }
|
33774 | }
|
33775 | }
|
33776 |
|
33777 | // MOMENTS
|
33778 |
|
33779 | function setMonth (mom, value) {
|
33780 | var dayOfMonth;
|
33781 |
|
33782 | if (!mom.isValid()) {
|
33783 | // No op
|
33784 | return mom;
|
33785 | }
|
33786 |
|
33787 | if (typeof value === 'string') {
|
33788 | if (/^\d+$/.test(value)) {
|
33789 | value = toInt(value);
|
33790 | } else {
|
33791 | value = mom.localeData().monthsParse(value);
|
33792 | // TODO: Another silent failure?
|
33793 | if (!isNumber(value)) {
|
33794 | return mom;
|
33795 | }
|
33796 | }
|
33797 | }
|
33798 |
|
33799 | dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
|
33800 | mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
|
33801 | return mom;
|
33802 | }
|
33803 |
|
33804 | function getSetMonth (value) {
|
33805 | if (value != null) {
|
33806 | setMonth(this, value);
|
33807 | hooks.updateOffset(this, true);
|
33808 | return this;
|
33809 | } else {
|
33810 | return get(this, 'Month');
|
33811 | }
|
33812 | }
|
33813 |
|
33814 | function getDaysInMonth () {
|
33815 | return daysInMonth(this.year(), this.month());
|
33816 | }
|
33817 |
|
33818 | var defaultMonthsShortRegex = matchWord;
|
33819 | function monthsShortRegex (isStrict) {
|
33820 | if (this._monthsParseExact) {
|
33821 | if (!hasOwnProp(this, '_monthsRegex')) {
|
33822 | computeMonthsParse.call(this);
|
33823 | }
|
33824 | if (isStrict) {
|
33825 | return this._monthsShortStrictRegex;
|
33826 | } else {
|
33827 | return this._monthsShortRegex;
|
33828 | }
|
33829 | } else {
|
33830 | if (!hasOwnProp(this, '_monthsShortRegex')) {
|
33831 | this._monthsShortRegex = defaultMonthsShortRegex;
|
33832 | }
|
33833 | return this._monthsShortStrictRegex && isStrict ?
|
33834 | this._monthsShortStrictRegex : this._monthsShortRegex;
|
33835 | }
|
33836 | }
|
33837 |
|
33838 | var defaultMonthsRegex = matchWord;
|
33839 | function monthsRegex (isStrict) {
|
33840 | if (this._monthsParseExact) {
|
33841 | if (!hasOwnProp(this, '_monthsRegex')) {
|
33842 | computeMonthsParse.call(this);
|
33843 | }
|
33844 | if (isStrict) {
|
33845 | return this._monthsStrictRegex;
|
33846 | } else {
|
33847 | return this._monthsRegex;
|
33848 | }
|
33849 | } else {
|
33850 | if (!hasOwnProp(this, '_monthsRegex')) {
|
33851 | this._monthsRegex = defaultMonthsRegex;
|
33852 | }
|
33853 | return this._monthsStrictRegex && isStrict ?
|
33854 | this._monthsStrictRegex : this._monthsRegex;
|
33855 | }
|
33856 | }
|
33857 |
|
33858 | function computeMonthsParse () {
|
33859 | function cmpLenRev(a, b) {
|
33860 | return b.length - a.length;
|
33861 | }
|
33862 |
|
33863 | var shortPieces = [], longPieces = [], mixedPieces = [],
|
33864 | i, mom;
|
33865 | for (i = 0; i < 12; i++) {
|
33866 | // make the regex if we don't have it already
|
33867 | mom = createUTC([2000, i]);
|
33868 | shortPieces.push(this.monthsShort(mom, ''));
|
33869 | longPieces.push(this.months(mom, ''));
|
33870 | mixedPieces.push(this.months(mom, ''));
|
33871 | mixedPieces.push(this.monthsShort(mom, ''));
|
33872 | }
|
33873 | // Sorting makes sure if one month (or abbr) is a prefix of another it
|
33874 | // will match the longer piece.
|
33875 | shortPieces.sort(cmpLenRev);
|
33876 | longPieces.sort(cmpLenRev);
|
33877 | mixedPieces.sort(cmpLenRev);
|
33878 | for (i = 0; i < 12; i++) {
|
33879 | shortPieces[i] = regexEscape(shortPieces[i]);
|
33880 | longPieces[i] = regexEscape(longPieces[i]);
|
33881 | }
|
33882 | for (i = 0; i < 24; i++) {
|
33883 | mixedPieces[i] = regexEscape(mixedPieces[i]);
|
33884 | }
|
33885 |
|
33886 | this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
|
33887 | this._monthsShortRegex = this._monthsRegex;
|
33888 | this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
|
33889 | this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
|
33890 | }
|
33891 |
|
33892 | // FORMATTING
|
33893 |
|
33894 | addFormatToken('Y', 0, 0, function () {
|
33895 | var y = this.year();
|
33896 | return y <= 9999 ? '' + y : '+' + y;
|
33897 | });
|
33898 |
|
33899 | addFormatToken(0, ['YY', 2], 0, function () {
|
33900 | return this.year() % 100;
|
33901 | });
|
33902 |
|
33903 | addFormatToken(0, ['YYYY', 4], 0, 'year');
|
33904 | addFormatToken(0, ['YYYYY', 5], 0, 'year');
|
33905 | addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
|
33906 |
|
33907 | // ALIASES
|
33908 |
|
33909 | addUnitAlias('year', 'y');
|
33910 |
|
33911 | // PRIORITIES
|
33912 |
|
33913 | addUnitPriority('year', 1);
|
33914 |
|
33915 | // PARSING
|
33916 |
|
33917 | addRegexToken('Y', matchSigned);
|
33918 | addRegexToken('YY', match1to2, match2);
|
33919 | addRegexToken('YYYY', match1to4, match4);
|
33920 | addRegexToken('YYYYY', match1to6, match6);
|
33921 | addRegexToken('YYYYYY', match1to6, match6);
|
33922 |
|
33923 | addParseToken(['YYYYY', 'YYYYYY'], YEAR);
|
33924 | addParseToken('YYYY', function (input, array) {
|
33925 | array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
|
33926 | });
|
33927 | addParseToken('YY', function (input, array) {
|
33928 | array[YEAR] = hooks.parseTwoDigitYear(input);
|
33929 | });
|
33930 | addParseToken('Y', function (input, array) {
|
33931 | array[YEAR] = parseInt(input, 10);
|
33932 | });
|
33933 |
|
33934 | // HELPERS
|
33935 |
|
33936 | function daysInYear(year) {
|
33937 | return isLeapYear(year) ? 366 : 365;
|
33938 | }
|
33939 |
|
33940 | function isLeapYear(year) {
|
33941 | return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
|
33942 | }
|
33943 |
|
33944 | // HOOKS
|
33945 |
|
33946 | hooks.parseTwoDigitYear = function (input) {
|
33947 | return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
|
33948 | };
|
33949 |
|
33950 | // MOMENTS
|
33951 |
|
33952 | var getSetYear = makeGetSet('FullYear', true);
|
33953 |
|
33954 | function getIsLeapYear () {
|
33955 | return isLeapYear(this.year());
|
33956 | }
|
33957 |
|
33958 | function createDate (y, m, d, h, M, s, ms) {
|
33959 | // can't just apply() to create a date:
|
33960 | // https://stackoverflow.com/q/181348
|
33961 | var date = new Date(y, m, d, h, M, s, ms);
|
33962 |
|
33963 | // the date constructor remaps years 0-99 to 1900-1999
|
33964 | if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {
|
33965 | date.setFullYear(y);
|
33966 | }
|
33967 | return date;
|
33968 | }
|
33969 |
|
33970 | function createUTCDate (y) {
|
33971 | var date = new Date(Date.UTC.apply(null, arguments));
|
33972 |
|
33973 | // the Date.UTC function remaps years 0-99 to 1900-1999
|
33974 | if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {
|
33975 | date.setUTCFullYear(y);
|
33976 | }
|
33977 | return date;
|
33978 | }
|
33979 |
|
33980 | // start-of-first-week - start-of-year
|
33981 | function firstWeekOffset(year, dow, doy) {
|
33982 | var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
|
33983 | fwd = 7 + dow - doy,
|
33984 | // first-week day local weekday -- which local weekday is fwd
|
33985 | fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;
|
33986 |
|
33987 | return -fwdlw + fwd - 1;
|
33988 | }
|
33989 |
|
33990 | // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
|
33991 | function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
|
33992 | var localWeekday = (7 + weekday - dow) % 7,
|
33993 | weekOffset = firstWeekOffset(year, dow, doy),
|
33994 | dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
|
33995 | resYear, resDayOfYear;
|
33996 |
|
33997 | if (dayOfYear <= 0) {
|
33998 | resYear = year - 1;
|
33999 | resDayOfYear = daysInYear(resYear) + dayOfYear;
|
34000 | } else if (dayOfYear > daysInYear(year)) {
|
34001 | resYear = year + 1;
|
34002 | resDayOfYear = dayOfYear - daysInYear(year);
|
34003 | } else {
|
34004 | resYear = year;
|
34005 | resDayOfYear = dayOfYear;
|
34006 | }
|
34007 |
|
34008 | return {
|
34009 | year: resYear,
|
34010 | dayOfYear: resDayOfYear
|
34011 | };
|
34012 | }
|
34013 |
|
34014 | function weekOfYear(mom, dow, doy) {
|
34015 | var weekOffset = firstWeekOffset(mom.year(), dow, doy),
|
34016 | week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
|
34017 | resWeek, resYear;
|
34018 |
|
34019 | if (week < 1) {
|
34020 | resYear = mom.year() - 1;
|
34021 | resWeek = week + weeksInYear(resYear, dow, doy);
|
34022 | } else if (week > weeksInYear(mom.year(), dow, doy)) {
|
34023 | resWeek = week - weeksInYear(mom.year(), dow, doy);
|
34024 | resYear = mom.year() + 1;
|
34025 | } else {
|
34026 | resYear = mom.year();
|
34027 | resWeek = week;
|
34028 | }
|
34029 |
|
34030 | return {
|
34031 | week: resWeek,
|
34032 | year: resYear
|
34033 | };
|
34034 | }
|
34035 |
|
34036 | function weeksInYear(year, dow, doy) {
|
34037 | var weekOffset = firstWeekOffset(year, dow, doy),
|
34038 | weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
|
34039 | return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
|
34040 | }
|
34041 |
|
34042 | // FORMATTING
|
34043 |
|
34044 | addFormatToken('w', ['ww', 2], 'wo', 'week');
|
34045 | addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');
|
34046 |
|
34047 | // ALIASES
|
34048 |
|
34049 | addUnitAlias('week', 'w');
|
34050 | addUnitAlias('isoWeek', 'W');
|
34051 |
|
34052 | // PRIORITIES
|
34053 |
|
34054 | addUnitPriority('week', 5);
|
34055 | addUnitPriority('isoWeek', 5);
|
34056 |
|
34057 | // PARSING
|
34058 |
|
34059 | addRegexToken('w', match1to2);
|
34060 | addRegexToken('ww', match1to2, match2);
|
34061 | addRegexToken('W', match1to2);
|
34062 | addRegexToken('WW', match1to2, match2);
|
34063 |
|
34064 | addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {
|
34065 | week[token.substr(0, 1)] = toInt(input);
|
34066 | });
|
34067 |
|
34068 | // HELPERS
|
34069 |
|
34070 | // LOCALES
|
34071 |
|
34072 | function localeWeek (mom) {
|
34073 | return weekOfYear(mom, this._week.dow, this._week.doy).week;
|
34074 | }
|
34075 |
|
34076 | var defaultLocaleWeek = {
|
34077 | dow : 0, // Sunday is the first day of the week.
|
34078 | doy : 6 // The week that contains Jan 1st is the first week of the year.
|
34079 | };
|
34080 |
|
34081 | function localeFirstDayOfWeek () {
|
34082 | return this._week.dow;
|
34083 | }
|
34084 |
|
34085 | function localeFirstDayOfYear () {
|
34086 | return this._week.doy;
|
34087 | }
|
34088 |
|
34089 | // MOMENTS
|
34090 |
|
34091 | function getSetWeek (input) {
|
34092 | var week = this.localeData().week(this);
|
34093 | return input == null ? week : this.add((input - week) * 7, 'd');
|
34094 | }
|
34095 |
|
34096 | function getSetISOWeek (input) {
|
34097 | var week = weekOfYear(this, 1, 4).week;
|
34098 | return input == null ? week : this.add((input - week) * 7, 'd');
|
34099 | }
|
34100 |
|
34101 | // FORMATTING
|
34102 |
|
34103 | addFormatToken('d', 0, 'do', 'day');
|
34104 |
|
34105 | addFormatToken('dd', 0, 0, function (format) {
|
34106 | return this.localeData().weekdaysMin(this, format);
|
34107 | });
|
34108 |
|
34109 | addFormatToken('ddd', 0, 0, function (format) {
|
34110 | return this.localeData().weekdaysShort(this, format);
|
34111 | });
|
34112 |
|
34113 | addFormatToken('dddd', 0, 0, function (format) {
|
34114 | return this.localeData().weekdays(this, format);
|
34115 | });
|
34116 |
|
34117 | addFormatToken('e', 0, 0, 'weekday');
|
34118 | addFormatToken('E', 0, 0, 'isoWeekday');
|
34119 |
|
34120 | // ALIASES
|
34121 |
|
34122 | addUnitAlias('day', 'd');
|
34123 | addUnitAlias('weekday', 'e');
|
34124 | addUnitAlias('isoWeekday', 'E');
|
34125 |
|
34126 | // PRIORITY
|
34127 | addUnitPriority('day', 11);
|
34128 | addUnitPriority('weekday', 11);
|
34129 | addUnitPriority('isoWeekday', 11);
|
34130 |
|
34131 | // PARSING
|
34132 |
|
34133 | addRegexToken('d', match1to2);
|
34134 | addRegexToken('e', match1to2);
|
34135 | addRegexToken('E', match1to2);
|
34136 | addRegexToken('dd', function (isStrict, locale) {
|
34137 | return locale.weekdaysMinRegex(isStrict);
|
34138 | });
|
34139 | addRegexToken('ddd', function (isStrict, locale) {
|
34140 | return locale.weekdaysShortRegex(isStrict);
|
34141 | });
|
34142 | addRegexToken('dddd', function (isStrict, locale) {
|
34143 | return locale.weekdaysRegex(isStrict);
|
34144 | });
|
34145 |
|
34146 | addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
|
34147 | var weekday = config._locale.weekdaysParse(input, token, config._strict);
|
34148 | // if we didn't get a weekday name, mark the date as invalid
|
34149 | if (weekday != null) {
|
34150 | week.d = weekday;
|
34151 | } else {
|
34152 | getParsingFlags(config).invalidWeekday = input;
|
34153 | }
|
34154 | });
|
34155 |
|
34156 | addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
|
34157 | week[token] = toInt(input);
|
34158 | });
|
34159 |
|
34160 | // HELPERS
|
34161 |
|
34162 | function parseWeekday(input, locale) {
|
34163 | if (typeof input !== 'string') {
|
34164 | return input;
|
34165 | }
|
34166 |
|
34167 | if (!isNaN(input)) {
|
34168 | return parseInt(input, 10);
|
34169 | }
|
34170 |
|
34171 | input = locale.weekdaysParse(input);
|
34172 | if (typeof input === 'number') {
|
34173 | return input;
|
34174 | }
|
34175 |
|
34176 | return null;
|
34177 | }
|
34178 |
|
34179 | function parseIsoWeekday(input, locale) {
|
34180 | if (typeof input === 'string') {
|
34181 | return locale.weekdaysParse(input) % 7 || 7;
|
34182 | }
|
34183 | return isNaN(input) ? null : input;
|
34184 | }
|
34185 |
|
34186 | // LOCALES
|
34187 |
|
34188 | var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');
|
34189 | function localeWeekdays (m, format) {
|
34190 | if (!m) {
|
34191 | return isArray(this._weekdays) ? this._weekdays :
|
34192 | this._weekdays['standalone'];
|
34193 | }
|
34194 | return isArray(this._weekdays) ? this._weekdays[m.day()] :
|
34195 | this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];
|
34196 | }
|
34197 |
|
34198 | var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');
|
34199 | function localeWeekdaysShort (m) {
|
34200 | return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;
|
34201 | }
|
34202 |
|
34203 | var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');
|
34204 | function localeWeekdaysMin (m) {
|
34205 | return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;
|
34206 | }
|
34207 |
|
34208 | function handleStrictParse$1(weekdayName, format, strict) {
|
34209 | var i, ii, mom, llc = weekdayName.toLocaleLowerCase();
|
34210 | if (!this._weekdaysParse) {
|
34211 | this._weekdaysParse = [];
|
34212 | this._shortWeekdaysParse = [];
|
34213 | this._minWeekdaysParse = [];
|
34214 |
|
34215 | for (i = 0; i < 7; ++i) {
|
34216 | mom = createUTC([2000, 1]).day(i);
|
34217 | this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();
|
34218 | this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();
|
34219 | this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
|
34220 | }
|
34221 | }
|
34222 |
|
34223 | if (strict) {
|
34224 | if (format === 'dddd') {
|
34225 | ii = indexOf$1.call(this._weekdaysParse, llc);
|
34226 | return ii !== -1 ? ii : null;
|
34227 | } else if (format === 'ddd') {
|
34228 | ii = indexOf$1.call(this._shortWeekdaysParse, llc);
|
34229 | return ii !== -1 ? ii : null;
|
34230 | } else {
|
34231 | ii = indexOf$1.call(this._minWeekdaysParse, llc);
|
34232 | return ii !== -1 ? ii : null;
|
34233 | }
|
34234 | } else {
|
34235 | if (format === 'dddd') {
|
34236 | ii = indexOf$1.call(this._weekdaysParse, llc);
|
34237 | if (ii !== -1) {
|
34238 | return ii;
|
34239 | }
|
34240 | ii = indexOf$1.call(this._shortWeekdaysParse, llc);
|
34241 | if (ii !== -1) {
|
34242 | return ii;
|
34243 | }
|
34244 | ii = indexOf$1.call(this._minWeekdaysParse, llc);
|
34245 | return ii !== -1 ? ii : null;
|
34246 | } else if (format === 'ddd') {
|
34247 | ii = indexOf$1.call(this._shortWeekdaysParse, llc);
|
34248 | if (ii !== -1) {
|
34249 | return ii;
|
34250 | }
|
34251 | ii = indexOf$1.call(this._weekdaysParse, llc);
|
34252 | if (ii !== -1) {
|
34253 | return ii;
|
34254 | }
|
34255 | ii = indexOf$1.call(this._minWeekdaysParse, llc);
|
34256 | return ii !== -1 ? ii : null;
|
34257 | } else {
|
34258 | ii = indexOf$1.call(this._minWeekdaysParse, llc);
|
34259 | if (ii !== -1) {
|
34260 | return ii;
|
34261 | }
|
34262 | ii = indexOf$1.call(this._weekdaysParse, llc);
|
34263 | if (ii !== -1) {
|
34264 | return ii;
|
34265 | }
|
34266 | ii = indexOf$1.call(this._shortWeekdaysParse, llc);
|
34267 | return ii !== -1 ? ii : null;
|
34268 | }
|
34269 | }
|
34270 | }
|
34271 |
|
34272 | function localeWeekdaysParse (weekdayName, format, strict) {
|
34273 | var i, mom, regex;
|
34274 |
|
34275 | if (this._weekdaysParseExact) {
|
34276 | return handleStrictParse$1.call(this, weekdayName, format, strict);
|
34277 | }
|
34278 |
|
34279 | if (!this._weekdaysParse) {
|
34280 | this._weekdaysParse = [];
|
34281 | this._minWeekdaysParse = [];
|
34282 | this._shortWeekdaysParse = [];
|
34283 | this._fullWeekdaysParse = [];
|
34284 | }
|
34285 |
|
34286 | for (i = 0; i < 7; i++) {
|
34287 | // make the regex if we don't have it already
|
34288 |
|
34289 | mom = createUTC([2000, 1]).day(i);
|
34290 | if (strict && !this._fullWeekdaysParse[i]) {
|
34291 | this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i');
|
34292 | this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i');
|
34293 | this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i');
|
34294 | }
|
34295 | if (!this._weekdaysParse[i]) {
|
34296 | regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
|
34297 | this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
|
34298 | }
|
34299 | // test the regex
|
34300 | if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {
|
34301 | return i;
|
34302 | } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {
|
34303 | return i;
|
34304 | } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {
|
34305 | return i;
|
34306 | } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
|
34307 | return i;
|
34308 | }
|
34309 | }
|
34310 | }
|
34311 |
|
34312 | // MOMENTS
|
34313 |
|
34314 | function getSetDayOfWeek (input) {
|
34315 | if (!this.isValid()) {
|
34316 | return input != null ? this : NaN;
|
34317 | }
|
34318 | var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
|
34319 | if (input != null) {
|
34320 | input = parseWeekday(input, this.localeData());
|
34321 | return this.add(input - day, 'd');
|
34322 | } else {
|
34323 | return day;
|
34324 | }
|
34325 | }
|
34326 |
|
34327 | function getSetLocaleDayOfWeek (input) {
|
34328 | if (!this.isValid()) {
|
34329 | return input != null ? this : NaN;
|
34330 | }
|
34331 | var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
|
34332 | return input == null ? weekday : this.add(input - weekday, 'd');
|
34333 | }
|
34334 |
|
34335 | function getSetISODayOfWeek (input) {
|
34336 | if (!this.isValid()) {
|
34337 | return input != null ? this : NaN;
|
34338 | }
|
34339 |
|
34340 | // behaves the same as moment#day except
|
34341 | // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
|
34342 | // as a setter, sunday should belong to the previous week.
|
34343 |
|
34344 | if (input != null) {
|
34345 | var weekday = parseIsoWeekday(input, this.localeData());
|
34346 | return this.day(this.day() % 7 ? weekday : weekday - 7);
|
34347 | } else {
|
34348 | return this.day() || 7;
|
34349 | }
|
34350 | }
|
34351 |
|
34352 | var defaultWeekdaysRegex = matchWord;
|
34353 | function weekdaysRegex (isStrict) {
|
34354 | if (this._weekdaysParseExact) {
|
34355 | if (!hasOwnProp(this, '_weekdaysRegex')) {
|
34356 | computeWeekdaysParse.call(this);
|
34357 | }
|
34358 | if (isStrict) {
|
34359 | return this._weekdaysStrictRegex;
|
34360 | } else {
|
34361 | return this._weekdaysRegex;
|
34362 | }
|
34363 | } else {
|
34364 | if (!hasOwnProp(this, '_weekdaysRegex')) {
|
34365 | this._weekdaysRegex = defaultWeekdaysRegex;
|
34366 | }
|
34367 | return this._weekdaysStrictRegex && isStrict ?
|
34368 | this._weekdaysStrictRegex : this._weekdaysRegex;
|
34369 | }
|
34370 | }
|
34371 |
|
34372 | var defaultWeekdaysShortRegex = matchWord;
|
34373 | function weekdaysShortRegex (isStrict) {
|
34374 | if (this._weekdaysParseExact) {
|
34375 | if (!hasOwnProp(this, '_weekdaysRegex')) {
|
34376 | computeWeekdaysParse.call(this);
|
34377 | }
|
34378 | if (isStrict) {
|
34379 | return this._weekdaysShortStrictRegex;
|
34380 | } else {
|
34381 | return this._weekdaysShortRegex;
|
34382 | }
|
34383 | } else {
|
34384 | if (!hasOwnProp(this, '_weekdaysShortRegex')) {
|
34385 | this._weekdaysShortRegex = defaultWeekdaysShortRegex;
|
34386 | }
|
34387 | return this._weekdaysShortStrictRegex && isStrict ?
|
34388 | this._weekdaysShortStrictRegex : this._weekdaysShortRegex;
|
34389 | }
|
34390 | }
|
34391 |
|
34392 | var defaultWeekdaysMinRegex = matchWord;
|
34393 | function weekdaysMinRegex (isStrict) {
|
34394 | if (this._weekdaysParseExact) {
|
34395 | if (!hasOwnProp(this, '_weekdaysRegex')) {
|
34396 | computeWeekdaysParse.call(this);
|
34397 | }
|
34398 | if (isStrict) {
|
34399 | return this._weekdaysMinStrictRegex;
|
34400 | } else {
|
34401 | return this._weekdaysMinRegex;
|
34402 | }
|
34403 | } else {
|
34404 | if (!hasOwnProp(this, '_weekdaysMinRegex')) {
|
34405 | this._weekdaysMinRegex = defaultWeekdaysMinRegex;
|
34406 | }
|
34407 | return this._weekdaysMinStrictRegex && isStrict ?
|
34408 | this._weekdaysMinStrictRegex : this._weekdaysMinRegex;
|
34409 | }
|
34410 | }
|
34411 |
|
34412 |
|
34413 | function computeWeekdaysParse () {
|
34414 | function cmpLenRev(a, b) {
|
34415 | return b.length - a.length;
|
34416 | }
|
34417 |
|
34418 | var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],
|
34419 | i, mom, minp, shortp, longp;
|
34420 | for (i = 0; i < 7; i++) {
|
34421 | // make the regex if we don't have it already
|
34422 | mom = createUTC([2000, 1]).day(i);
|
34423 | minp = this.weekdaysMin(mom, '');
|
34424 | shortp = this.weekdaysShort(mom, '');
|
34425 | longp = this.weekdays(mom, '');
|
34426 | minPieces.push(minp);
|
34427 | shortPieces.push(shortp);
|
34428 | longPieces.push(longp);
|
34429 | mixedPieces.push(minp);
|
34430 | mixedPieces.push(shortp);
|
34431 | mixedPieces.push(longp);
|
34432 | }
|
34433 | // Sorting makes sure if one weekday (or abbr) is a prefix of another it
|
34434 | // will match the longer piece.
|
34435 | minPieces.sort(cmpLenRev);
|
34436 | shortPieces.sort(cmpLenRev);
|
34437 | longPieces.sort(cmpLenRev);
|
34438 | mixedPieces.sort(cmpLenRev);
|
34439 | for (i = 0; i < 7; i++) {
|
34440 | shortPieces[i] = regexEscape(shortPieces[i]);
|
34441 | longPieces[i] = regexEscape(longPieces[i]);
|
34442 | mixedPieces[i] = regexEscape(mixedPieces[i]);
|
34443 | }
|
34444 |
|
34445 | this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
|
34446 | this._weekdaysShortRegex = this._weekdaysRegex;
|
34447 | this._weekdaysMinRegex = this._weekdaysRegex;
|
34448 |
|
34449 | this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
|
34450 | this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
|
34451 | this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');
|
34452 | }
|
34453 |
|
34454 | // FORMATTING
|
34455 |
|
34456 | function hFormat() {
|
34457 | return this.hours() % 12 || 12;
|
34458 | }
|
34459 |
|
34460 | function kFormat() {
|
34461 | return this.hours() || 24;
|
34462 | }
|
34463 |
|
34464 | addFormatToken('H', ['HH', 2], 0, 'hour');
|
34465 | addFormatToken('h', ['hh', 2], 0, hFormat);
|
34466 | addFormatToken('k', ['kk', 2], 0, kFormat);
|
34467 |
|
34468 | addFormatToken('hmm', 0, 0, function () {
|
34469 | return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
|
34470 | });
|
34471 |
|
34472 | addFormatToken('hmmss', 0, 0, function () {
|
34473 | return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +
|
34474 | zeroFill(this.seconds(), 2);
|
34475 | });
|
34476 |
|
34477 | addFormatToken('Hmm', 0, 0, function () {
|
34478 | return '' + this.hours() + zeroFill(this.minutes(), 2);
|
34479 | });
|
34480 |
|
34481 | addFormatToken('Hmmss', 0, 0, function () {
|
34482 | return '' + this.hours() + zeroFill(this.minutes(), 2) +
|
34483 | zeroFill(this.seconds(), 2);
|
34484 | });
|
34485 |
|
34486 | function meridiem (token, lowercase) {
|
34487 | addFormatToken(token, 0, 0, function () {
|
34488 | return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);
|
34489 | });
|
34490 | }
|
34491 |
|
34492 | meridiem('a', true);
|
34493 | meridiem('A', false);
|
34494 |
|
34495 | // ALIASES
|
34496 |
|
34497 | addUnitAlias('hour', 'h');
|
34498 |
|
34499 | // PRIORITY
|
34500 | addUnitPriority('hour', 13);
|
34501 |
|
34502 | // PARSING
|
34503 |
|
34504 | function matchMeridiem (isStrict, locale) {
|
34505 | return locale._meridiemParse;
|
34506 | }
|
34507 |
|
34508 | addRegexToken('a', matchMeridiem);
|
34509 | addRegexToken('A', matchMeridiem);
|
34510 | addRegexToken('H', match1to2);
|
34511 | addRegexToken('h', match1to2);
|
34512 | addRegexToken('k', match1to2);
|
34513 | addRegexToken('HH', match1to2, match2);
|
34514 | addRegexToken('hh', match1to2, match2);
|
34515 | addRegexToken('kk', match1to2, match2);
|
34516 |
|
34517 | addRegexToken('hmm', match3to4);
|
34518 | addRegexToken('hmmss', match5to6);
|
34519 | addRegexToken('Hmm', match3to4);
|
34520 | addRegexToken('Hmmss', match5to6);
|
34521 |
|
34522 | addParseToken(['H', 'HH'], HOUR);
|
34523 | addParseToken(['k', 'kk'], function (input, array, config) {
|
34524 | var kInput = toInt(input);
|
34525 | array[HOUR] = kInput === 24 ? 0 : kInput;
|
34526 | });
|
34527 | addParseToken(['a', 'A'], function (input, array, config) {
|
34528 | config._isPm = config._locale.isPM(input);
|
34529 | config._meridiem = input;
|
34530 | });
|
34531 | addParseToken(['h', 'hh'], function (input, array, config) {
|
34532 | array[HOUR] = toInt(input);
|
34533 | getParsingFlags(config).bigHour = true;
|
34534 | });
|
34535 | addParseToken('hmm', function (input, array, config) {
|
34536 | var pos = input.length - 2;
|
34537 | array[HOUR] = toInt(input.substr(0, pos));
|
34538 | array[MINUTE] = toInt(input.substr(pos));
|
34539 | getParsingFlags(config).bigHour = true;
|
34540 | });
|
34541 | addParseToken('hmmss', function (input, array, config) {
|
34542 | var pos1 = input.length - 4;
|
34543 | var pos2 = input.length - 2;
|
34544 | array[HOUR] = toInt(input.substr(0, pos1));
|
34545 | array[MINUTE] = toInt(input.substr(pos1, 2));
|
34546 | array[SECOND] = toInt(input.substr(pos2));
|
34547 | getParsingFlags(config).bigHour = true;
|
34548 | });
|
34549 | addParseToken('Hmm', function (input, array, config) {
|
34550 | var pos = input.length - 2;
|
34551 | array[HOUR] = toInt(input.substr(0, pos));
|
34552 | array[MINUTE] = toInt(input.substr(pos));
|
34553 | });
|
34554 | addParseToken('Hmmss', function (input, array, config) {
|
34555 | var pos1 = input.length - 4;
|
34556 | var pos2 = input.length - 2;
|
34557 | array[HOUR] = toInt(input.substr(0, pos1));
|
34558 | array[MINUTE] = toInt(input.substr(pos1, 2));
|
34559 | array[SECOND] = toInt(input.substr(pos2));
|
34560 | });
|
34561 |
|
34562 | // LOCALES
|
34563 |
|
34564 | function localeIsPM (input) {
|
34565 | // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
|
34566 | // Using charAt should be more compatible.
|
34567 | return ((input + '').toLowerCase().charAt(0) === 'p');
|
34568 | }
|
34569 |
|
34570 | var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i;
|
34571 | function localeMeridiem (hours, minutes, isLower) {
|
34572 | if (hours > 11) {
|
34573 | return isLower ? 'pm' : 'PM';
|
34574 | } else {
|
34575 | return isLower ? 'am' : 'AM';
|
34576 | }
|
34577 | }
|
34578 |
|
34579 |
|
34580 | // MOMENTS
|
34581 |
|
34582 | // Setting the hour should keep the time, because the user explicitly
|
34583 | // specified which hour he wants. So trying to maintain the same hour (in
|
34584 | // a new timezone) makes sense. Adding/subtracting hours does not follow
|
34585 | // this rule.
|
34586 | var getSetHour = makeGetSet('Hours', true);
|
34587 |
|
34588 | // months
|
34589 | // week
|
34590 | // weekdays
|
34591 | // meridiem
|
34592 | var baseConfig = {
|
34593 | calendar: defaultCalendar,
|
34594 | longDateFormat: defaultLongDateFormat,
|
34595 | invalidDate: defaultInvalidDate,
|
34596 | ordinal: defaultOrdinal,
|
34597 | dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,
|
34598 | relativeTime: defaultRelativeTime,
|
34599 |
|
34600 | months: defaultLocaleMonths,
|
34601 | monthsShort: defaultLocaleMonthsShort,
|
34602 |
|
34603 | week: defaultLocaleWeek,
|
34604 |
|
34605 | weekdays: defaultLocaleWeekdays,
|
34606 | weekdaysMin: defaultLocaleWeekdaysMin,
|
34607 | weekdaysShort: defaultLocaleWeekdaysShort,
|
34608 |
|
34609 | meridiemParse: defaultLocaleMeridiemParse
|
34610 | };
|
34611 |
|
34612 | // internal storage for locale config files
|
34613 | var locales = {};
|
34614 | var localeFamilies = {};
|
34615 | var globalLocale;
|
34616 |
|
34617 | function normalizeLocale(key) {
|
34618 | return key ? key.toLowerCase().replace('_', '-') : key;
|
34619 | }
|
34620 |
|
34621 | // pick the locale from the array
|
34622 | // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
|
34623 | // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
|
34624 | function chooseLocale(names) {
|
34625 | var i = 0, j, next, locale, split;
|
34626 |
|
34627 | while (i < names.length) {
|
34628 | split = normalizeLocale(names[i]).split('-');
|
34629 | j = split.length;
|
34630 | next = normalizeLocale(names[i + 1]);
|
34631 | next = next ? next.split('-') : null;
|
34632 | while (j > 0) {
|
34633 | locale = loadLocale(split.slice(0, j).join('-'));
|
34634 | if (locale) {
|
34635 | return locale;
|
34636 | }
|
34637 | if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
|
34638 | //the next array item is better than a shallower substring of this one
|
34639 | break;
|
34640 | }
|
34641 | j--;
|
34642 | }
|
34643 | i++;
|
34644 | }
|
34645 | return null;
|
34646 | }
|
34647 |
|
34648 | function loadLocale(name) {
|
34649 | var oldLocale = null;
|
34650 | // TODO: Find a better way to register and load all the locales in Node
|
34651 | if (!locales[name] && ('object' !== 'undefined') &&
|
34652 | module && module.exports) {
|
34653 | try {
|
34654 | oldLocale = globalLocale._abbr;
|
34655 | commonjsRequire('./locale/' + name);
|
34656 | // because defineLocale currently also sets the global locale, we
|
34657 | // want to undo that for lazy loaded locales
|
34658 | getSetGlobalLocale(oldLocale);
|
34659 | } catch (e) { }
|
34660 | }
|
34661 | return locales[name];
|
34662 | }
|
34663 |
|
34664 | // This function will load locale and then set the global locale. If
|
34665 | // no arguments are passed in, it will simply return the current global
|
34666 | // locale key.
|
34667 | function getSetGlobalLocale (key, values) {
|
34668 | var data;
|
34669 | if (key) {
|
34670 | if (isUndefined(values)) {
|
34671 | data = getLocale(key);
|
34672 | }
|
34673 | else {
|
34674 | data = defineLocale(key, values);
|
34675 | }
|
34676 |
|
34677 | if (data) {
|
34678 | // moment.duration._locale = moment._locale = data;
|
34679 | globalLocale = data;
|
34680 | }
|
34681 | }
|
34682 |
|
34683 | return globalLocale._abbr;
|
34684 | }
|
34685 |
|
34686 | function defineLocale (name, config) {
|
34687 | if (config !== null) {
|
34688 | var parentConfig = baseConfig;
|
34689 | config.abbr = name;
|
34690 | if (locales[name] != null) {
|
34691 | deprecateSimple('defineLocaleOverride',
|
34692 | 'use moment.updateLocale(localeName, config) to change ' +
|
34693 | 'an existing locale. moment.defineLocale(localeName, ' +
|
34694 | 'config) should only be used for creating a new locale ' +
|
34695 | 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');
|
34696 | parentConfig = locales[name]._config;
|
34697 | } else if (config.parentLocale != null) {
|
34698 | if (locales[config.parentLocale] != null) {
|
34699 | parentConfig = locales[config.parentLocale]._config;
|
34700 | } else {
|
34701 | if (!localeFamilies[config.parentLocale]) {
|
34702 | localeFamilies[config.parentLocale] = [];
|
34703 | }
|
34704 | localeFamilies[config.parentLocale].push({
|
34705 | name: name,
|
34706 | config: config
|
34707 | });
|
34708 | return null;
|
34709 | }
|
34710 | }
|
34711 | locales[name] = new Locale(mergeConfigs(parentConfig, config));
|
34712 |
|
34713 | if (localeFamilies[name]) {
|
34714 | localeFamilies[name].forEach(function (x) {
|
34715 | defineLocale(x.name, x.config);
|
34716 | });
|
34717 | }
|
34718 |
|
34719 | // backwards compat for now: also set the locale
|
34720 | // make sure we set the locale AFTER all child locales have been
|
34721 | // created, so we won't end up with the child locale set.
|
34722 | getSetGlobalLocale(name);
|
34723 |
|
34724 |
|
34725 | return locales[name];
|
34726 | } else {
|
34727 | // useful for testing
|
34728 | delete locales[name];
|
34729 | return null;
|
34730 | }
|
34731 | }
|
34732 |
|
34733 | function updateLocale(name, config) {
|
34734 | if (config != null) {
|
34735 | var locale, parentConfig = baseConfig;
|
34736 | // MERGE
|
34737 | if (locales[name] != null) {
|
34738 | parentConfig = locales[name]._config;
|
34739 | }
|
34740 | config = mergeConfigs(parentConfig, config);
|
34741 | locale = new Locale(config);
|
34742 | locale.parentLocale = locales[name];
|
34743 | locales[name] = locale;
|
34744 |
|
34745 | // backwards compat for now: also set the locale
|
34746 | getSetGlobalLocale(name);
|
34747 | } else {
|
34748 | // pass null for config to unupdate, useful for tests
|
34749 | if (locales[name] != null) {
|
34750 | if (locales[name].parentLocale != null) {
|
34751 | locales[name] = locales[name].parentLocale;
|
34752 | } else if (locales[name] != null) {
|
34753 | delete locales[name];
|
34754 | }
|
34755 | }
|
34756 | }
|
34757 | return locales[name];
|
34758 | }
|
34759 |
|
34760 | // returns locale data
|
34761 | function getLocale (key) {
|
34762 | var locale;
|
34763 |
|
34764 | if (key && key._locale && key._locale._abbr) {
|
34765 | key = key._locale._abbr;
|
34766 | }
|
34767 |
|
34768 | if (!key) {
|
34769 | return globalLocale;
|
34770 | }
|
34771 |
|
34772 | if (!isArray(key)) {
|
34773 | //short-circuit everything else
|
34774 | locale = loadLocale(key);
|
34775 | if (locale) {
|
34776 | return locale;
|
34777 | }
|
34778 | key = [key];
|
34779 | }
|
34780 |
|
34781 | return chooseLocale(key);
|
34782 | }
|
34783 |
|
34784 | function listLocales() {
|
34785 | return keys$1(locales);
|
34786 | }
|
34787 |
|
34788 | function checkOverflow (m) {
|
34789 | var overflow;
|
34790 | var a = m._a;
|
34791 |
|
34792 | if (a && getParsingFlags(m).overflow === -2) {
|
34793 | overflow =
|
34794 | a[MONTH] < 0 || a[MONTH] > 11 ? MONTH :
|
34795 | a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE :
|
34796 | a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :
|
34797 | a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE :
|
34798 | a[SECOND] < 0 || a[SECOND] > 59 ? SECOND :
|
34799 | a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :
|
34800 | -1;
|
34801 |
|
34802 | if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
|
34803 | overflow = DATE;
|
34804 | }
|
34805 | if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
|
34806 | overflow = WEEK;
|
34807 | }
|
34808 | if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
|
34809 | overflow = WEEKDAY;
|
34810 | }
|
34811 |
|
34812 | getParsingFlags(m).overflow = overflow;
|
34813 | }
|
34814 |
|
34815 | return m;
|
34816 | }
|
34817 |
|
34818 | // iso 8601 regex
|
34819 | // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
|
34820 | var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
|
34821 | var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
|
34822 |
|
34823 | var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/;
|
34824 |
|
34825 | var isoDates = [
|
34826 | ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
|
34827 | ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
|
34828 | ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
|
34829 | ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
|
34830 | ['YYYY-DDD', /\d{4}-\d{3}/],
|
34831 | ['YYYY-MM', /\d{4}-\d\d/, false],
|
34832 | ['YYYYYYMMDD', /[+-]\d{10}/],
|
34833 | ['YYYYMMDD', /\d{8}/],
|
34834 | // YYYYMM is NOT allowed by the standard
|
34835 | ['GGGG[W]WWE', /\d{4}W\d{3}/],
|
34836 | ['GGGG[W]WW', /\d{4}W\d{2}/, false],
|
34837 | ['YYYYDDD', /\d{7}/]
|
34838 | ];
|
34839 |
|
34840 | // iso time formats and regexes
|
34841 | var isoTimes = [
|
34842 | ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
|
34843 | ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
|
34844 | ['HH:mm:ss', /\d\d:\d\d:\d\d/],
|
34845 | ['HH:mm', /\d\d:\d\d/],
|
34846 | ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
|
34847 | ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
|
34848 | ['HHmmss', /\d\d\d\d\d\d/],
|
34849 | ['HHmm', /\d\d\d\d/],
|
34850 | ['HH', /\d\d/]
|
34851 | ];
|
34852 |
|
34853 | var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i;
|
34854 |
|
34855 | // date from iso format
|
34856 | function configFromISO(config) {
|
34857 | var i, l,
|
34858 | string = config._i,
|
34859 | match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
|
34860 | allowTime, dateFormat, timeFormat, tzFormat;
|
34861 |
|
34862 | if (match) {
|
34863 | getParsingFlags(config).iso = true;
|
34864 |
|
34865 | for (i = 0, l = isoDates.length; i < l; i++) {
|
34866 | if (isoDates[i][1].exec(match[1])) {
|
34867 | dateFormat = isoDates[i][0];
|
34868 | allowTime = isoDates[i][2] !== false;
|
34869 | break;
|
34870 | }
|
34871 | }
|
34872 | if (dateFormat == null) {
|
34873 | config._isValid = false;
|
34874 | return;
|
34875 | }
|
34876 | if (match[3]) {
|
34877 | for (i = 0, l = isoTimes.length; i < l; i++) {
|
34878 | if (isoTimes[i][1].exec(match[3])) {
|
34879 | // match[2] should be 'T' or space
|
34880 | timeFormat = (match[2] || ' ') + isoTimes[i][0];
|
34881 | break;
|
34882 | }
|
34883 | }
|
34884 | if (timeFormat == null) {
|
34885 | config._isValid = false;
|
34886 | return;
|
34887 | }
|
34888 | }
|
34889 | if (!allowTime && timeFormat != null) {
|
34890 | config._isValid = false;
|
34891 | return;
|
34892 | }
|
34893 | if (match[4]) {
|
34894 | if (tzRegex.exec(match[4])) {
|
34895 | tzFormat = 'Z';
|
34896 | } else {
|
34897 | config._isValid = false;
|
34898 | return;
|
34899 | }
|
34900 | }
|
34901 | config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
|
34902 | configFromStringAndFormat(config);
|
34903 | } else {
|
34904 | config._isValid = false;
|
34905 | }
|
34906 | }
|
34907 |
|
34908 | // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3
|
34909 | var basicRfcRegex = /^((?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d?\d\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(?:\d\d)?\d\d\s)(\d\d:\d\d)(\:\d\d)?(\s(?:UT|GMT|[ECMP][SD]T|[A-IK-Za-ik-z]|[+-]\d{4}))$/;
|
34910 |
|
34911 | // date and time from ref 2822 format
|
34912 | function configFromRFC2822(config) {
|
34913 | var string, match, dayFormat,
|
34914 | dateFormat, timeFormat, tzFormat;
|
34915 | var timezones = {
|
34916 | ' GMT': ' +0000',
|
34917 | ' EDT': ' -0400',
|
34918 | ' EST': ' -0500',
|
34919 | ' CDT': ' -0500',
|
34920 | ' CST': ' -0600',
|
34921 | ' MDT': ' -0600',
|
34922 | ' MST': ' -0700',
|
34923 | ' PDT': ' -0700',
|
34924 | ' PST': ' -0800'
|
34925 | };
|
34926 | var military = 'YXWVUTSRQPONZABCDEFGHIKLM';
|
34927 | var timezone, timezoneIndex;
|
34928 |
|
34929 | string = config._i
|
34930 | .replace(/\([^\)]*\)|[\n\t]/g, ' ') // Remove comments and folding whitespace
|
34931 | .replace(/(\s\s+)/g, ' ') // Replace multiple-spaces with a single space
|
34932 | .replace(/^\s|\s$/g, ''); // Remove leading and trailing spaces
|
34933 | match = basicRfcRegex.exec(string);
|
34934 |
|
34935 | if (match) {
|
34936 | dayFormat = match[1] ? 'ddd' + ((match[1].length === 5) ? ', ' : ' ') : '';
|
34937 | dateFormat = 'D MMM ' + ((match[2].length > 10) ? 'YYYY ' : 'YY ');
|
34938 | timeFormat = 'HH:mm' + (match[4] ? ':ss' : '');
|
34939 |
|
34940 | // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.
|
34941 | if (match[1]) { // day of week given
|
34942 | var momentDate = new Date(match[2]);
|
34943 | var momentDay = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'][momentDate.getDay()];
|
34944 |
|
34945 | if (match[1].substr(0,3) !== momentDay) {
|
34946 | getParsingFlags(config).weekdayMismatch = true;
|
34947 | config._isValid = false;
|
34948 | return;
|
34949 | }
|
34950 | }
|
34951 |
|
34952 | switch (match[5].length) {
|
34953 | case 2: // military
|
34954 | if (timezoneIndex === 0) {
|
34955 | timezone = ' +0000';
|
34956 | } else {
|
34957 | timezoneIndex = military.indexOf(match[5][1].toUpperCase()) - 12;
|
34958 | timezone = ((timezoneIndex < 0) ? ' -' : ' +') +
|
34959 | (('' + timezoneIndex).replace(/^-?/, '0')).match(/..$/)[0] + '00';
|
34960 | }
|
34961 | break;
|
34962 | case 4: // Zone
|
34963 | timezone = timezones[match[5]];
|
34964 | break;
|
34965 | default: // UT or +/-9999
|
34966 | timezone = timezones[' GMT'];
|
34967 | }
|
34968 | match[5] = timezone;
|
34969 | config._i = match.splice(1).join('');
|
34970 | tzFormat = ' ZZ';
|
34971 | config._f = dayFormat + dateFormat + timeFormat + tzFormat;
|
34972 | configFromStringAndFormat(config);
|
34973 | getParsingFlags(config).rfc2822 = true;
|
34974 | } else {
|
34975 | config._isValid = false;
|
34976 | }
|
34977 | }
|
34978 |
|
34979 | // date from iso format or fallback
|
34980 | function configFromString(config) {
|
34981 | var matched = aspNetJsonRegex.exec(config._i);
|
34982 |
|
34983 | if (matched !== null) {
|
34984 | config._d = new Date(+matched[1]);
|
34985 | return;
|
34986 | }
|
34987 |
|
34988 | configFromISO(config);
|
34989 | if (config._isValid === false) {
|
34990 | delete config._isValid;
|
34991 | } else {
|
34992 | return;
|
34993 | }
|
34994 |
|
34995 | configFromRFC2822(config);
|
34996 | if (config._isValid === false) {
|
34997 | delete config._isValid;
|
34998 | } else {
|
34999 | return;
|
35000 | }
|
35001 |
|
35002 | // Final attempt, use Input Fallback
|
35003 | hooks.createFromInputFallback(config);
|
35004 | }
|
35005 |
|
35006 | hooks.createFromInputFallback = deprecate(
|
35007 | 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +
|
35008 | 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +
|
35009 | 'discouraged and will be removed in an upcoming major release. Please refer to ' +
|
35010 | 'http://momentjs.com/guides/#/warnings/js-date/ for more info.',
|
35011 | function (config) {
|
35012 | config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
|
35013 | }
|
35014 | );
|
35015 |
|
35016 | // Pick the first defined of two or three arguments.
|
35017 | function defaults(a, b, c) {
|
35018 | if (a != null) {
|
35019 | return a;
|
35020 | }
|
35021 | if (b != null) {
|
35022 | return b;
|
35023 | }
|
35024 | return c;
|
35025 | }
|
35026 |
|
35027 | function currentDateArray(config) {
|
35028 | // hooks is actually the exported moment object
|
35029 | var nowValue = new Date(hooks.now());
|
35030 | if (config._useUTC) {
|
35031 | return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];
|
35032 | }
|
35033 | return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
|
35034 | }
|
35035 |
|
35036 | // convert an array to a date.
|
35037 | // the array should mirror the parameters below
|
35038 | // note: all values past the year are optional and will default to the lowest possible value.
|
35039 | // [year, month, day , hour, minute, second, millisecond]
|
35040 | function configFromArray (config) {
|
35041 | var i, date, input = [], currentDate, yearToUse;
|
35042 |
|
35043 | if (config._d) {
|
35044 | return;
|
35045 | }
|
35046 |
|
35047 | currentDate = currentDateArray(config);
|
35048 |
|
35049 | //compute day of the year from weeks and weekdays
|
35050 | if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
|
35051 | dayOfYearFromWeekInfo(config);
|
35052 | }
|
35053 |
|
35054 | //if the day of the year is set, figure out what it is
|
35055 | if (config._dayOfYear != null) {
|
35056 | yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);
|
35057 |
|
35058 | if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {
|
35059 | getParsingFlags(config)._overflowDayOfYear = true;
|
35060 | }
|
35061 |
|
35062 | date = createUTCDate(yearToUse, 0, config._dayOfYear);
|
35063 | config._a[MONTH] = date.getUTCMonth();
|
35064 | config._a[DATE] = date.getUTCDate();
|
35065 | }
|
35066 |
|
35067 | // Default to current date.
|
35068 | // * if no year, month, day of month are given, default to today
|
35069 | // * if day of month is given, default month and year
|
35070 | // * if month is given, default only year
|
35071 | // * if year is given, don't default anything
|
35072 | for (i = 0; i < 3 && config._a[i] == null; ++i) {
|
35073 | config._a[i] = input[i] = currentDate[i];
|
35074 | }
|
35075 |
|
35076 | // Zero out whatever was not defaulted, including time
|
35077 | for (; i < 7; i++) {
|
35078 | config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
|
35079 | }
|
35080 |
|
35081 | // Check for 24:00:00.000
|
35082 | if (config._a[HOUR] === 24 &&
|
35083 | config._a[MINUTE] === 0 &&
|
35084 | config._a[SECOND] === 0 &&
|
35085 | config._a[MILLISECOND] === 0) {
|
35086 | config._nextDay = true;
|
35087 | config._a[HOUR] = 0;
|
35088 | }
|
35089 |
|
35090 | config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);
|
35091 | // Apply timezone offset from input. The actual utcOffset can be changed
|
35092 | // with parseZone.
|
35093 | if (config._tzm != null) {
|
35094 | config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
|
35095 | }
|
35096 |
|
35097 | if (config._nextDay) {
|
35098 | config._a[HOUR] = 24;
|
35099 | }
|
35100 | }
|
35101 |
|
35102 | function dayOfYearFromWeekInfo(config) {
|
35103 | var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;
|
35104 |
|
35105 | w = config._w;
|
35106 | if (w.GG != null || w.W != null || w.E != null) {
|
35107 | dow = 1;
|
35108 | doy = 4;
|
35109 |
|
35110 | // TODO: We need to take the current isoWeekYear, but that depends on
|
35111 | // how we interpret now (local, utc, fixed offset). So create
|
35112 | // a now version of current config (take local/utc/offset flags, and
|
35113 | // create now).
|
35114 | weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);
|
35115 | week = defaults(w.W, 1);
|
35116 | weekday = defaults(w.E, 1);
|
35117 | if (weekday < 1 || weekday > 7) {
|
35118 | weekdayOverflow = true;
|
35119 | }
|
35120 | } else {
|
35121 | dow = config._locale._week.dow;
|
35122 | doy = config._locale._week.doy;
|
35123 |
|
35124 | var curWeek = weekOfYear(createLocal(), dow, doy);
|
35125 |
|
35126 | weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);
|
35127 |
|
35128 | // Default to current week.
|
35129 | week = defaults(w.w, curWeek.week);
|
35130 |
|
35131 | if (w.d != null) {
|
35132 | // weekday -- low day numbers are considered next week
|
35133 | weekday = w.d;
|
35134 | if (weekday < 0 || weekday > 6) {
|
35135 | weekdayOverflow = true;
|
35136 | }
|
35137 | } else if (w.e != null) {
|
35138 | // local weekday -- counting starts from begining of week
|
35139 | weekday = w.e + dow;
|
35140 | if (w.e < 0 || w.e > 6) {
|
35141 | weekdayOverflow = true;
|
35142 | }
|
35143 | } else {
|
35144 | // default to begining of week
|
35145 | weekday = dow;
|
35146 | }
|
35147 | }
|
35148 | if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
|
35149 | getParsingFlags(config)._overflowWeeks = true;
|
35150 | } else if (weekdayOverflow != null) {
|
35151 | getParsingFlags(config)._overflowWeekday = true;
|
35152 | } else {
|
35153 | temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
|
35154 | config._a[YEAR] = temp.year;
|
35155 | config._dayOfYear = temp.dayOfYear;
|
35156 | }
|
35157 | }
|
35158 |
|
35159 | // constant that refers to the ISO standard
|
35160 | hooks.ISO_8601 = function () {};
|
35161 |
|
35162 | // constant that refers to the RFC 2822 form
|
35163 | hooks.RFC_2822 = function () {};
|
35164 |
|
35165 | // date from string and format string
|
35166 | function configFromStringAndFormat(config) {
|
35167 | // TODO: Move this to another part of the creation flow to prevent circular deps
|
35168 | if (config._f === hooks.ISO_8601) {
|
35169 | configFromISO(config);
|
35170 | return;
|
35171 | }
|
35172 | if (config._f === hooks.RFC_2822) {
|
35173 | configFromRFC2822(config);
|
35174 | return;
|
35175 | }
|
35176 | config._a = [];
|
35177 | getParsingFlags(config).empty = true;
|
35178 |
|
35179 | // This array is used to make a Date, either with `new Date` or `Date.UTC`
|
35180 | var string = '' + config._i,
|
35181 | i, parsedInput, tokens, token, skipped,
|
35182 | stringLength = string.length,
|
35183 | totalParsedInputLength = 0;
|
35184 |
|
35185 | tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];
|
35186 |
|
35187 | for (i = 0; i < tokens.length; i++) {
|
35188 | token = tokens[i];
|
35189 | parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
|
35190 | // console.log('token', token, 'parsedInput', parsedInput,
|
35191 | // 'regex', getParseRegexForToken(token, config));
|
35192 | if (parsedInput) {
|
35193 | skipped = string.substr(0, string.indexOf(parsedInput));
|
35194 | if (skipped.length > 0) {
|
35195 | getParsingFlags(config).unusedInput.push(skipped);
|
35196 | }
|
35197 | string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
|
35198 | totalParsedInputLength += parsedInput.length;
|
35199 | }
|
35200 | // don't parse if it's not a known token
|
35201 | if (formatTokenFunctions[token]) {
|
35202 | if (parsedInput) {
|
35203 | getParsingFlags(config).empty = false;
|
35204 | }
|
35205 | else {
|
35206 | getParsingFlags(config).unusedTokens.push(token);
|
35207 | }
|
35208 | addTimeToArrayFromToken(token, parsedInput, config);
|
35209 | }
|
35210 | else if (config._strict && !parsedInput) {
|
35211 | getParsingFlags(config).unusedTokens.push(token);
|
35212 | }
|
35213 | }
|
35214 |
|
35215 | // add remaining unparsed input length to the string
|
35216 | getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;
|
35217 | if (string.length > 0) {
|
35218 | getParsingFlags(config).unusedInput.push(string);
|
35219 | }
|
35220 |
|
35221 | // clear _12h flag if hour is <= 12
|
35222 | if (config._a[HOUR] <= 12 &&
|
35223 | getParsingFlags(config).bigHour === true &&
|
35224 | config._a[HOUR] > 0) {
|
35225 | getParsingFlags(config).bigHour = undefined;
|
35226 | }
|
35227 |
|
35228 | getParsingFlags(config).parsedDateParts = config._a.slice(0);
|
35229 | getParsingFlags(config).meridiem = config._meridiem;
|
35230 | // handle meridiem
|
35231 | config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);
|
35232 |
|
35233 | configFromArray(config);
|
35234 | checkOverflow(config);
|
35235 | }
|
35236 |
|
35237 |
|
35238 | function meridiemFixWrap (locale, hour, meridiem) {
|
35239 | var isPm;
|
35240 |
|
35241 | if (meridiem == null) {
|
35242 | // nothing to do
|
35243 | return hour;
|
35244 | }
|
35245 | if (locale.meridiemHour != null) {
|
35246 | return locale.meridiemHour(hour, meridiem);
|
35247 | } else if (locale.isPM != null) {
|
35248 | // Fallback
|
35249 | isPm = locale.isPM(meridiem);
|
35250 | if (isPm && hour < 12) {
|
35251 | hour += 12;
|
35252 | }
|
35253 | if (!isPm && hour === 12) {
|
35254 | hour = 0;
|
35255 | }
|
35256 | return hour;
|
35257 | } else {
|
35258 | // this is not supposed to happen
|
35259 | return hour;
|
35260 | }
|
35261 | }
|
35262 |
|
35263 | // date from string and array of format strings
|
35264 | function configFromStringAndArray(config) {
|
35265 | var tempConfig,
|
35266 | bestMoment,
|
35267 |
|
35268 | scoreToBeat,
|
35269 | i,
|
35270 | currentScore;
|
35271 |
|
35272 | if (config._f.length === 0) {
|
35273 | getParsingFlags(config).invalidFormat = true;
|
35274 | config._d = new Date(NaN);
|
35275 | return;
|
35276 | }
|
35277 |
|
35278 | for (i = 0; i < config._f.length; i++) {
|
35279 | currentScore = 0;
|
35280 | tempConfig = copyConfig({}, config);
|
35281 | if (config._useUTC != null) {
|
35282 | tempConfig._useUTC = config._useUTC;
|
35283 | }
|
35284 | tempConfig._f = config._f[i];
|
35285 | configFromStringAndFormat(tempConfig);
|
35286 |
|
35287 | if (!isValid(tempConfig)) {
|
35288 | continue;
|
35289 | }
|
35290 |
|
35291 | // if there is any input that was not parsed add a penalty for that format
|
35292 | currentScore += getParsingFlags(tempConfig).charsLeftOver;
|
35293 |
|
35294 | //or tokens
|
35295 | currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;
|
35296 |
|
35297 | getParsingFlags(tempConfig).score = currentScore;
|
35298 |
|
35299 | if (scoreToBeat == null || currentScore < scoreToBeat) {
|
35300 | scoreToBeat = currentScore;
|
35301 | bestMoment = tempConfig;
|
35302 | }
|
35303 | }
|
35304 |
|
35305 | extend(config, bestMoment || tempConfig);
|
35306 | }
|
35307 |
|
35308 | function configFromObject(config) {
|
35309 | if (config._d) {
|
35310 | return;
|
35311 | }
|
35312 |
|
35313 | var i = normalizeObjectUnits(config._i);
|
35314 | config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {
|
35315 | return obj && parseInt(obj, 10);
|
35316 | });
|
35317 |
|
35318 | configFromArray(config);
|
35319 | }
|
35320 |
|
35321 | function createFromConfig (config) {
|
35322 | var res = new Moment(checkOverflow(prepareConfig(config)));
|
35323 | if (res._nextDay) {
|
35324 | // Adding is smart enough around DST
|
35325 | res.add(1, 'd');
|
35326 | res._nextDay = undefined;
|
35327 | }
|
35328 |
|
35329 | return res;
|
35330 | }
|
35331 |
|
35332 | function prepareConfig (config) {
|
35333 | var input = config._i,
|
35334 | format = config._f;
|
35335 |
|
35336 | config._locale = config._locale || getLocale(config._l);
|
35337 |
|
35338 | if (input === null || (format === undefined && input === '')) {
|
35339 | return createInvalid({nullInput: true});
|
35340 | }
|
35341 |
|
35342 | if (typeof input === 'string') {
|
35343 | config._i = input = config._locale.preparse(input);
|
35344 | }
|
35345 |
|
35346 | if (isMoment(input)) {
|
35347 | return new Moment(checkOverflow(input));
|
35348 | } else if (isDate(input)) {
|
35349 | config._d = input;
|
35350 | } else if (isArray(format)) {
|
35351 | configFromStringAndArray(config);
|
35352 | } else if (format) {
|
35353 | configFromStringAndFormat(config);
|
35354 | } else {
|
35355 | configFromInput(config);
|
35356 | }
|
35357 |
|
35358 | if (!isValid(config)) {
|
35359 | config._d = null;
|
35360 | }
|
35361 |
|
35362 | return config;
|
35363 | }
|
35364 |
|
35365 | function configFromInput(config) {
|
35366 | var input = config._i;
|
35367 | if (isUndefined(input)) {
|
35368 | config._d = new Date(hooks.now());
|
35369 | } else if (isDate(input)) {
|
35370 | config._d = new Date(input.valueOf());
|
35371 | } else if (typeof input === 'string') {
|
35372 | configFromString(config);
|
35373 | } else if (isArray(input)) {
|
35374 | config._a = map(input.slice(0), function (obj) {
|
35375 | return parseInt(obj, 10);
|
35376 | });
|
35377 | configFromArray(config);
|
35378 | } else if (isObject(input)) {
|
35379 | configFromObject(config);
|
35380 | } else if (isNumber(input)) {
|
35381 | // from milliseconds
|
35382 | config._d = new Date(input);
|
35383 | } else {
|
35384 | hooks.createFromInputFallback(config);
|
35385 | }
|
35386 | }
|
35387 |
|
35388 | function createLocalOrUTC (input, format, locale, strict, isUTC) {
|
35389 | var c = {};
|
35390 |
|
35391 | if (locale === true || locale === false) {
|
35392 | strict = locale;
|
35393 | locale = undefined;
|
35394 | }
|
35395 |
|
35396 | if ((isObject(input) && isObjectEmpty(input)) ||
|
35397 | (isArray(input) && input.length === 0)) {
|
35398 | input = undefined;
|
35399 | }
|
35400 | // object construction must be done this way.
|
35401 | // https://github.com/moment/moment/issues/1423
|
35402 | c._isAMomentObject = true;
|
35403 | c._useUTC = c._isUTC = isUTC;
|
35404 | c._l = locale;
|
35405 | c._i = input;
|
35406 | c._f = format;
|
35407 | c._strict = strict;
|
35408 |
|
35409 | return createFromConfig(c);
|
35410 | }
|
35411 |
|
35412 | function createLocal (input, format, locale, strict) {
|
35413 | return createLocalOrUTC(input, format, locale, strict, false);
|
35414 | }
|
35415 |
|
35416 | var prototypeMin = deprecate(
|
35417 | 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
|
35418 | function () {
|
35419 | var other = createLocal.apply(null, arguments);
|
35420 | if (this.isValid() && other.isValid()) {
|
35421 | return other < this ? this : other;
|
35422 | } else {
|
35423 | return createInvalid();
|
35424 | }
|
35425 | }
|
35426 | );
|
35427 |
|
35428 | var prototypeMax = deprecate(
|
35429 | 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
|
35430 | function () {
|
35431 | var other = createLocal.apply(null, arguments);
|
35432 | if (this.isValid() && other.isValid()) {
|
35433 | return other > this ? this : other;
|
35434 | } else {
|
35435 | return createInvalid();
|
35436 | }
|
35437 | }
|
35438 | );
|
35439 |
|
35440 | // Pick a moment m from moments so that m[fn](other) is true for all
|
35441 | // other. This relies on the function fn to be transitive.
|
35442 | //
|
35443 | // moments should either be an array of moment objects or an array, whose
|
35444 | // first element is an array of moment objects.
|
35445 | function pickBy(fn, moments) {
|
35446 | var res, i;
|
35447 | if (moments.length === 1 && isArray(moments[0])) {
|
35448 | moments = moments[0];
|
35449 | }
|
35450 | if (!moments.length) {
|
35451 | return createLocal();
|
35452 | }
|
35453 | res = moments[0];
|
35454 | for (i = 1; i < moments.length; ++i) {
|
35455 | if (!moments[i].isValid() || moments[i][fn](res)) {
|
35456 | res = moments[i];
|
35457 | }
|
35458 | }
|
35459 | return res;
|
35460 | }
|
35461 |
|
35462 | // TODO: Use [].sort instead?
|
35463 | function min () {
|
35464 | var args = [].slice.call(arguments, 0);
|
35465 |
|
35466 | return pickBy('isBefore', args);
|
35467 | }
|
35468 |
|
35469 | function max () {
|
35470 | var args = [].slice.call(arguments, 0);
|
35471 |
|
35472 | return pickBy('isAfter', args);
|
35473 | }
|
35474 |
|
35475 | var now = function () {
|
35476 | return Date.now ? Date.now() : +(new Date());
|
35477 | };
|
35478 |
|
35479 | var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];
|
35480 |
|
35481 | function isDurationValid(m) {
|
35482 | for (var key in m) {
|
35483 | if (!(ordering.indexOf(key) !== -1 && (m[key] == null || !isNaN(m[key])))) {
|
35484 | return false;
|
35485 | }
|
35486 | }
|
35487 |
|
35488 | var unitHasDecimal = false;
|
35489 | for (var i = 0; i < ordering.length; ++i) {
|
35490 | if (m[ordering[i]]) {
|
35491 | if (unitHasDecimal) {
|
35492 | return false; // only allow non-integers for smallest unit
|
35493 | }
|
35494 | if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {
|
35495 | unitHasDecimal = true;
|
35496 | }
|
35497 | }
|
35498 | }
|
35499 |
|
35500 | return true;
|
35501 | }
|
35502 |
|
35503 | function isValid$1() {
|
35504 | return this._isValid;
|
35505 | }
|
35506 |
|
35507 | function createInvalid$1() {
|
35508 | return createDuration(NaN);
|
35509 | }
|
35510 |
|
35511 | function Duration (duration) {
|
35512 | var normalizedInput = normalizeObjectUnits(duration),
|
35513 | years = normalizedInput.year || 0,
|
35514 | quarters = normalizedInput.quarter || 0,
|
35515 | months = normalizedInput.month || 0,
|
35516 | weeks = normalizedInput.week || 0,
|
35517 | days = normalizedInput.day || 0,
|
35518 | hours = normalizedInput.hour || 0,
|
35519 | minutes = normalizedInput.minute || 0,
|
35520 | seconds = normalizedInput.second || 0,
|
35521 | milliseconds = normalizedInput.millisecond || 0;
|
35522 |
|
35523 | this._isValid = isDurationValid(normalizedInput);
|
35524 |
|
35525 | // representation for dateAddRemove
|
35526 | this._milliseconds = +milliseconds +
|
35527 | seconds * 1e3 + // 1000
|
35528 | minutes * 6e4 + // 1000 * 60
|
35529 | hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
|
35530 | // Because of dateAddRemove treats 24 hours as different from a
|
35531 | // day when working around DST, we need to store them separately
|
35532 | this._days = +days +
|
35533 | weeks * 7;
|
35534 | // It is impossible translate months into days without knowing
|
35535 | // which months you are are talking about, so we have to store
|
35536 | // it separately.
|
35537 | this._months = +months +
|
35538 | quarters * 3 +
|
35539 | years * 12;
|
35540 |
|
35541 | this._data = {};
|
35542 |
|
35543 | this._locale = getLocale();
|
35544 |
|
35545 | this._bubble();
|
35546 | }
|
35547 |
|
35548 | function isDuration (obj) {
|
35549 | return obj instanceof Duration;
|
35550 | }
|
35551 |
|
35552 | function absRound (number) {
|
35553 | if (number < 0) {
|
35554 | return Math.round(-1 * number) * -1;
|
35555 | } else {
|
35556 | return Math.round(number);
|
35557 | }
|
35558 | }
|
35559 |
|
35560 | // FORMATTING
|
35561 |
|
35562 | function offset (token, separator) {
|
35563 | addFormatToken(token, 0, 0, function () {
|
35564 | var offset = this.utcOffset();
|
35565 | var sign = '+';
|
35566 | if (offset < 0) {
|
35567 | offset = -offset;
|
35568 | sign = '-';
|
35569 | }
|
35570 | return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);
|
35571 | });
|
35572 | }
|
35573 |
|
35574 | offset('Z', ':');
|
35575 | offset('ZZ', '');
|
35576 |
|
35577 | // PARSING
|
35578 |
|
35579 | addRegexToken('Z', matchShortOffset);
|
35580 | addRegexToken('ZZ', matchShortOffset);
|
35581 | addParseToken(['Z', 'ZZ'], function (input, array, config) {
|
35582 | config._useUTC = true;
|
35583 | config._tzm = offsetFromString(matchShortOffset, input);
|
35584 | });
|
35585 |
|
35586 | // HELPERS
|
35587 |
|
35588 | // timezone chunker
|
35589 | // '+10:00' > ['10', '00']
|
35590 | // '-1530' > ['-15', '30']
|
35591 | var chunkOffset = /([\+\-]|\d\d)/gi;
|
35592 |
|
35593 | function offsetFromString(matcher, string) {
|
35594 | var matches = (string || '').match(matcher);
|
35595 |
|
35596 | if (matches === null) {
|
35597 | return null;
|
35598 | }
|
35599 |
|
35600 | var chunk = matches[matches.length - 1] || [];
|
35601 | var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];
|
35602 | var minutes = +(parts[1] * 60) + toInt(parts[2]);
|
35603 |
|
35604 | return minutes === 0 ?
|
35605 | 0 :
|
35606 | parts[0] === '+' ? minutes : -minutes;
|
35607 | }
|
35608 |
|
35609 | // Return a moment from input, that is local/utc/zone equivalent to model.
|
35610 | function cloneWithOffset(input, model) {
|
35611 | var res, diff;
|
35612 | if (model._isUTC) {
|
35613 | res = model.clone();
|
35614 | diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();
|
35615 | // Use low-level api, because this fn is low-level api.
|
35616 | res._d.setTime(res._d.valueOf() + diff);
|
35617 | hooks.updateOffset(res, false);
|
35618 | return res;
|
35619 | } else {
|
35620 | return createLocal(input).local();
|
35621 | }
|
35622 | }
|
35623 |
|
35624 | function getDateOffset (m) {
|
35625 | // On Firefox.24 Date#getTimezoneOffset returns a floating point.
|
35626 | // https://github.com/moment/moment/pull/1871
|
35627 | return -Math.round(m._d.getTimezoneOffset() / 15) * 15;
|
35628 | }
|
35629 |
|
35630 | // HOOKS
|
35631 |
|
35632 | // This function will be called whenever a moment is mutated.
|
35633 | // It is intended to keep the offset in sync with the timezone.
|
35634 | hooks.updateOffset = function () {};
|
35635 |
|
35636 | // MOMENTS
|
35637 |
|
35638 | // keepLocalTime = true means only change the timezone, without
|
35639 | // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
|
35640 | // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
|
35641 | // +0200, so we adjust the time as needed, to be valid.
|
35642 | //
|
35643 | // Keeping the time actually adds/subtracts (one hour)
|
35644 | // from the actual represented time. That is why we call updateOffset
|
35645 | // a second time. In case it wants us to change the offset again
|
35646 | // _changeInProgress == true case, then we have to adjust, because
|
35647 | // there is no such time in the given timezone.
|
35648 | function getSetOffset (input, keepLocalTime, keepMinutes) {
|
35649 | var offset = this._offset || 0,
|
35650 | localAdjust;
|
35651 | if (!this.isValid()) {
|
35652 | return input != null ? this : NaN;
|
35653 | }
|
35654 | if (input != null) {
|
35655 | if (typeof input === 'string') {
|
35656 | input = offsetFromString(matchShortOffset, input);
|
35657 | if (input === null) {
|
35658 | return this;
|
35659 | }
|
35660 | } else if (Math.abs(input) < 16 && !keepMinutes) {
|
35661 | input = input * 60;
|
35662 | }
|
35663 | if (!this._isUTC && keepLocalTime) {
|
35664 | localAdjust = getDateOffset(this);
|
35665 | }
|
35666 | this._offset = input;
|
35667 | this._isUTC = true;
|
35668 | if (localAdjust != null) {
|
35669 | this.add(localAdjust, 'm');
|
35670 | }
|
35671 | if (offset !== input) {
|
35672 | if (!keepLocalTime || this._changeInProgress) {
|
35673 | addSubtract(this, createDuration(input - offset, 'm'), 1, false);
|
35674 | } else if (!this._changeInProgress) {
|
35675 | this._changeInProgress = true;
|
35676 | hooks.updateOffset(this, true);
|
35677 | this._changeInProgress = null;
|
35678 | }
|
35679 | }
|
35680 | return this;
|
35681 | } else {
|
35682 | return this._isUTC ? offset : getDateOffset(this);
|
35683 | }
|
35684 | }
|
35685 |
|
35686 | function getSetZone (input, keepLocalTime) {
|
35687 | if (input != null) {
|
35688 | if (typeof input !== 'string') {
|
35689 | input = -input;
|
35690 | }
|
35691 |
|
35692 | this.utcOffset(input, keepLocalTime);
|
35693 |
|
35694 | return this;
|
35695 | } else {
|
35696 | return -this.utcOffset();
|
35697 | }
|
35698 | }
|
35699 |
|
35700 | function setOffsetToUTC (keepLocalTime) {
|
35701 | return this.utcOffset(0, keepLocalTime);
|
35702 | }
|
35703 |
|
35704 | function setOffsetToLocal (keepLocalTime) {
|
35705 | if (this._isUTC) {
|
35706 | this.utcOffset(0, keepLocalTime);
|
35707 | this._isUTC = false;
|
35708 |
|
35709 | if (keepLocalTime) {
|
35710 | this.subtract(getDateOffset(this), 'm');
|
35711 | }
|
35712 | }
|
35713 | return this;
|
35714 | }
|
35715 |
|
35716 | function setOffsetToParsedOffset () {
|
35717 | if (this._tzm != null) {
|
35718 | this.utcOffset(this._tzm, false, true);
|
35719 | } else if (typeof this._i === 'string') {
|
35720 | var tZone = offsetFromString(matchOffset, this._i);
|
35721 | if (tZone != null) {
|
35722 | this.utcOffset(tZone);
|
35723 | }
|
35724 | else {
|
35725 | this.utcOffset(0, true);
|
35726 | }
|
35727 | }
|
35728 | return this;
|
35729 | }
|
35730 |
|
35731 | function hasAlignedHourOffset (input) {
|
35732 | if (!this.isValid()) {
|
35733 | return false;
|
35734 | }
|
35735 | input = input ? createLocal(input).utcOffset() : 0;
|
35736 |
|
35737 | return (this.utcOffset() - input) % 60 === 0;
|
35738 | }
|
35739 |
|
35740 | function isDaylightSavingTime () {
|
35741 | return (
|
35742 | this.utcOffset() > this.clone().month(0).utcOffset() ||
|
35743 | this.utcOffset() > this.clone().month(5).utcOffset()
|
35744 | );
|
35745 | }
|
35746 |
|
35747 | function isDaylightSavingTimeShifted () {
|
35748 | if (!isUndefined(this._isDSTShifted)) {
|
35749 | return this._isDSTShifted;
|
35750 | }
|
35751 |
|
35752 | var c = {};
|
35753 |
|
35754 | copyConfig(c, this);
|
35755 | c = prepareConfig(c);
|
35756 |
|
35757 | if (c._a) {
|
35758 | var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);
|
35759 | this._isDSTShifted = this.isValid() &&
|
35760 | compareArrays(c._a, other.toArray()) > 0;
|
35761 | } else {
|
35762 | this._isDSTShifted = false;
|
35763 | }
|
35764 |
|
35765 | return this._isDSTShifted;
|
35766 | }
|
35767 |
|
35768 | function isLocal () {
|
35769 | return this.isValid() ? !this._isUTC : false;
|
35770 | }
|
35771 |
|
35772 | function isUtcOffset () {
|
35773 | return this.isValid() ? this._isUTC : false;
|
35774 | }
|
35775 |
|
35776 | function isUtc () {
|
35777 | return this.isValid() ? this._isUTC && this._offset === 0 : false;
|
35778 | }
|
35779 |
|
35780 | // ASP.NET json date format regex
|
35781 | var aspNetRegex = /^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/;
|
35782 |
|
35783 | // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
|
35784 | // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
|
35785 | // and further modified to allow for strings containing both week and day
|
35786 | var isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;
|
35787 |
|
35788 | function createDuration (input, key) {
|
35789 | var duration = input,
|
35790 | // matching against regexp is expensive, do it on demand
|
35791 | match = null,
|
35792 | sign,
|
35793 | ret,
|
35794 | diffRes;
|
35795 |
|
35796 | if (isDuration(input)) {
|
35797 | duration = {
|
35798 | ms : input._milliseconds,
|
35799 | d : input._days,
|
35800 | M : input._months
|
35801 | };
|
35802 | } else if (isNumber(input)) {
|
35803 | duration = {};
|
35804 | if (key) {
|
35805 | duration[key] = input;
|
35806 | } else {
|
35807 | duration.milliseconds = input;
|
35808 | }
|
35809 | } else if (!!(match = aspNetRegex.exec(input))) {
|
35810 | sign = (match[1] === '-') ? -1 : 1;
|
35811 | duration = {
|
35812 | y : 0,
|
35813 | d : toInt(match[DATE]) * sign,
|
35814 | h : toInt(match[HOUR]) * sign,
|
35815 | m : toInt(match[MINUTE]) * sign,
|
35816 | s : toInt(match[SECOND]) * sign,
|
35817 | ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match
|
35818 | };
|
35819 | } else if (!!(match = isoRegex.exec(input))) {
|
35820 | sign = (match[1] === '-') ? -1 : 1;
|
35821 | duration = {
|
35822 | y : parseIso(match[2], sign),
|
35823 | M : parseIso(match[3], sign),
|
35824 | w : parseIso(match[4], sign),
|
35825 | d : parseIso(match[5], sign),
|
35826 | h : parseIso(match[6], sign),
|
35827 | m : parseIso(match[7], sign),
|
35828 | s : parseIso(match[8], sign)
|
35829 | };
|
35830 | } else if (duration == null) {// checks for null or undefined
|
35831 | duration = {};
|
35832 | } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {
|
35833 | diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));
|
35834 |
|
35835 | duration = {};
|
35836 | duration.ms = diffRes.milliseconds;
|
35837 | duration.M = diffRes.months;
|
35838 | }
|
35839 |
|
35840 | ret = new Duration(duration);
|
35841 |
|
35842 | if (isDuration(input) && hasOwnProp(input, '_locale')) {
|
35843 | ret._locale = input._locale;
|
35844 | }
|
35845 |
|
35846 | return ret;
|
35847 | }
|
35848 |
|
35849 | createDuration.fn = Duration.prototype;
|
35850 | createDuration.invalid = createInvalid$1;
|
35851 |
|
35852 | function parseIso (inp, sign) {
|
35853 | // We'd normally use ~~inp for this, but unfortunately it also
|
35854 | // converts floats to ints.
|
35855 | // inp may be undefined, so careful calling replace on it.
|
35856 | var res = inp && parseFloat(inp.replace(',', '.'));
|
35857 | // apply sign while we're at it
|
35858 | return (isNaN(res) ? 0 : res) * sign;
|
35859 | }
|
35860 |
|
35861 | function positiveMomentsDifference(base, other) {
|
35862 | var res = {milliseconds: 0, months: 0};
|
35863 |
|
35864 | res.months = other.month() - base.month() +
|
35865 | (other.year() - base.year()) * 12;
|
35866 | if (base.clone().add(res.months, 'M').isAfter(other)) {
|
35867 | --res.months;
|
35868 | }
|
35869 |
|
35870 | res.milliseconds = +other - +(base.clone().add(res.months, 'M'));
|
35871 |
|
35872 | return res;
|
35873 | }
|
35874 |
|
35875 | function momentsDifference(base, other) {
|
35876 | var res;
|
35877 | if (!(base.isValid() && other.isValid())) {
|
35878 | return {milliseconds: 0, months: 0};
|
35879 | }
|
35880 |
|
35881 | other = cloneWithOffset(other, base);
|
35882 | if (base.isBefore(other)) {
|
35883 | res = positiveMomentsDifference(base, other);
|
35884 | } else {
|
35885 | res = positiveMomentsDifference(other, base);
|
35886 | res.milliseconds = -res.milliseconds;
|
35887 | res.months = -res.months;
|
35888 | }
|
35889 |
|
35890 | return res;
|
35891 | }
|
35892 |
|
35893 | // TODO: remove 'name' arg after deprecation is removed
|
35894 | function createAdder(direction, name) {
|
35895 | return function (val, period) {
|
35896 | var dur, tmp;
|
35897 | //invert the arguments, but complain about it
|
35898 | if (period !== null && !isNaN(+period)) {
|
35899 | deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +
|
35900 | 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');
|
35901 | tmp = val; val = period; period = tmp;
|
35902 | }
|
35903 |
|
35904 | val = typeof val === 'string' ? +val : val;
|
35905 | dur = createDuration(val, period);
|
35906 | addSubtract(this, dur, direction);
|
35907 | return this;
|
35908 | };
|
35909 | }
|
35910 |
|
35911 | function addSubtract (mom, duration, isAdding, updateOffset) {
|
35912 | var milliseconds = duration._milliseconds,
|
35913 | days = absRound(duration._days),
|
35914 | months = absRound(duration._months);
|
35915 |
|
35916 | if (!mom.isValid()) {
|
35917 | // No op
|
35918 | return;
|
35919 | }
|
35920 |
|
35921 | updateOffset = updateOffset == null ? true : updateOffset;
|
35922 |
|
35923 | if (milliseconds) {
|
35924 | mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
|
35925 | }
|
35926 | if (days) {
|
35927 | set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);
|
35928 | }
|
35929 | if (months) {
|
35930 | setMonth(mom, get(mom, 'Month') + months * isAdding);
|
35931 | }
|
35932 | if (updateOffset) {
|
35933 | hooks.updateOffset(mom, days || months);
|
35934 | }
|
35935 | }
|
35936 |
|
35937 | var add = createAdder(1, 'add');
|
35938 | var subtract = createAdder(-1, 'subtract');
|
35939 |
|
35940 | function getCalendarFormat(myMoment, now) {
|
35941 | var diff = myMoment.diff(now, 'days', true);
|
35942 | return diff < -6 ? 'sameElse' :
|
35943 | diff < -1 ? 'lastWeek' :
|
35944 | diff < 0 ? 'lastDay' :
|
35945 | diff < 1 ? 'sameDay' :
|
35946 | diff < 2 ? 'nextDay' :
|
35947 | diff < 7 ? 'nextWeek' : 'sameElse';
|
35948 | }
|
35949 |
|
35950 | function calendar$1 (time, formats) {
|
35951 | // We want to compare the start of today, vs this.
|
35952 | // Getting start-of-today depends on whether we're local/utc/offset or not.
|
35953 | var now = time || createLocal(),
|
35954 | sod = cloneWithOffset(now, this).startOf('day'),
|
35955 | format = hooks.calendarFormat(this, sod) || 'sameElse';
|
35956 |
|
35957 | var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);
|
35958 |
|
35959 | return this.format(output || this.localeData().calendar(format, this, createLocal(now)));
|
35960 | }
|
35961 |
|
35962 | function clone () {
|
35963 | return new Moment(this);
|
35964 | }
|
35965 |
|
35966 | function isAfter (input, units) {
|
35967 | var localInput = isMoment(input) ? input : createLocal(input);
|
35968 | if (!(this.isValid() && localInput.isValid())) {
|
35969 | return false;
|
35970 | }
|
35971 | units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');
|
35972 | if (units === 'millisecond') {
|
35973 | return this.valueOf() > localInput.valueOf();
|
35974 | } else {
|
35975 | return localInput.valueOf() < this.clone().startOf(units).valueOf();
|
35976 | }
|
35977 | }
|
35978 |
|
35979 | function isBefore (input, units) {
|
35980 | var localInput = isMoment(input) ? input : createLocal(input);
|
35981 | if (!(this.isValid() && localInput.isValid())) {
|
35982 | return false;
|
35983 | }
|
35984 | units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');
|
35985 | if (units === 'millisecond') {
|
35986 | return this.valueOf() < localInput.valueOf();
|
35987 | } else {
|
35988 | return this.clone().endOf(units).valueOf() < localInput.valueOf();
|
35989 | }
|
35990 | }
|
35991 |
|
35992 | function isBetween (from, to, units, inclusivity) {
|
35993 | inclusivity = inclusivity || '()';
|
35994 | return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&
|
35995 | (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));
|
35996 | }
|
35997 |
|
35998 | function isSame (input, units) {
|
35999 | var localInput = isMoment(input) ? input : createLocal(input),
|
36000 | inputMs;
|
36001 | if (!(this.isValid() && localInput.isValid())) {
|
36002 | return false;
|
36003 | }
|
36004 | units = normalizeUnits(units || 'millisecond');
|
36005 | if (units === 'millisecond') {
|
36006 | return this.valueOf() === localInput.valueOf();
|
36007 | } else {
|
36008 | inputMs = localInput.valueOf();
|
36009 | return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();
|
36010 | }
|
36011 | }
|
36012 |
|
36013 | function isSameOrAfter (input, units) {
|
36014 | return this.isSame(input, units) || this.isAfter(input,units);
|
36015 | }
|
36016 |
|
36017 | function isSameOrBefore (input, units) {
|
36018 | return this.isSame(input, units) || this.isBefore(input,units);
|
36019 | }
|
36020 |
|
36021 | function diff (input, units, asFloat) {
|
36022 | var that,
|
36023 | zoneDelta,
|
36024 | delta, output;
|
36025 |
|
36026 | if (!this.isValid()) {
|
36027 | return NaN;
|
36028 | }
|
36029 |
|
36030 | that = cloneWithOffset(input, this);
|
36031 |
|
36032 | if (!that.isValid()) {
|
36033 | return NaN;
|
36034 | }
|
36035 |
|
36036 | zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;
|
36037 |
|
36038 | units = normalizeUnits(units);
|
36039 |
|
36040 | if (units === 'year' || units === 'month' || units === 'quarter') {
|
36041 | output = monthDiff(this, that);
|
36042 | if (units === 'quarter') {
|
36043 | output = output / 3;
|
36044 | } else if (units === 'year') {
|
36045 | output = output / 12;
|
36046 | }
|
36047 | } else {
|
36048 | delta = this - that;
|
36049 | output = units === 'second' ? delta / 1e3 : // 1000
|
36050 | units === 'minute' ? delta / 6e4 : // 1000 * 60
|
36051 | units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60
|
36052 | units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
|
36053 | units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
|
36054 | delta;
|
36055 | }
|
36056 | return asFloat ? output : absFloor(output);
|
36057 | }
|
36058 |
|
36059 | function monthDiff (a, b) {
|
36060 | // difference in months
|
36061 | var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),
|
36062 | // b is in (anchor - 1 month, anchor + 1 month)
|
36063 | anchor = a.clone().add(wholeMonthDiff, 'months'),
|
36064 | anchor2, adjust;
|
36065 |
|
36066 | if (b - anchor < 0) {
|
36067 | anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
|
36068 | // linear across the month
|
36069 | adjust = (b - anchor) / (anchor - anchor2);
|
36070 | } else {
|
36071 | anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
|
36072 | // linear across the month
|
36073 | adjust = (b - anchor) / (anchor2 - anchor);
|
36074 | }
|
36075 |
|
36076 | //check for negative zero, return zero if negative zero
|
36077 | return -(wholeMonthDiff + adjust) || 0;
|
36078 | }
|
36079 |
|
36080 | hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
|
36081 | hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';
|
36082 |
|
36083 | function toString () {
|
36084 | return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
|
36085 | }
|
36086 |
|
36087 | function toISOString() {
|
36088 | if (!this.isValid()) {
|
36089 | return null;
|
36090 | }
|
36091 | var m = this.clone().utc();
|
36092 | if (m.year() < 0 || m.year() > 9999) {
|
36093 | return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
|
36094 | }
|
36095 | if (isFunction(Date.prototype.toISOString)) {
|
36096 | // native implementation is ~50x faster, use it when we can
|
36097 | return this.toDate().toISOString();
|
36098 | }
|
36099 | return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
|
36100 | }
|
36101 |
|
36102 | /**
|
36103 | * Return a human readable representation of a moment that can
|
36104 | * also be evaluated to get a new moment which is the same
|
36105 | *
|
36106 | * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
|
36107 | */
|
36108 | function inspect () {
|
36109 | if (!this.isValid()) {
|
36110 | return 'moment.invalid(/* ' + this._i + ' */)';
|
36111 | }
|
36112 | var func = 'moment';
|
36113 | var zone = '';
|
36114 | if (!this.isLocal()) {
|
36115 | func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
|
36116 | zone = 'Z';
|
36117 | }
|
36118 | var prefix = '[' + func + '("]';
|
36119 | var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';
|
36120 | var datetime = '-MM-DD[T]HH:mm:ss.SSS';
|
36121 | var suffix = zone + '[")]';
|
36122 |
|
36123 | return this.format(prefix + year + datetime + suffix);
|
36124 | }
|
36125 |
|
36126 | function format (inputString) {
|
36127 | if (!inputString) {
|
36128 | inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;
|
36129 | }
|
36130 | var output = formatMoment(this, inputString);
|
36131 | return this.localeData().postformat(output);
|
36132 | }
|
36133 |
|
36134 | function from (time, withoutSuffix) {
|
36135 | if (this.isValid() &&
|
36136 | ((isMoment(time) && time.isValid()) ||
|
36137 | createLocal(time).isValid())) {
|
36138 | return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);
|
36139 | } else {
|
36140 | return this.localeData().invalidDate();
|
36141 | }
|
36142 | }
|
36143 |
|
36144 | function fromNow (withoutSuffix) {
|
36145 | return this.from(createLocal(), withoutSuffix);
|
36146 | }
|
36147 |
|
36148 | function to (time, withoutSuffix) {
|
36149 | if (this.isValid() &&
|
36150 | ((isMoment(time) && time.isValid()) ||
|
36151 | createLocal(time).isValid())) {
|
36152 | return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);
|
36153 | } else {
|
36154 | return this.localeData().invalidDate();
|
36155 | }
|
36156 | }
|
36157 |
|
36158 | function toNow (withoutSuffix) {
|
36159 | return this.to(createLocal(), withoutSuffix);
|
36160 | }
|
36161 |
|
36162 | // If passed a locale key, it will set the locale for this
|
36163 | // instance. Otherwise, it will return the locale configuration
|
36164 | // variables for this instance.
|
36165 | function locale (key) {
|
36166 | var newLocaleData;
|
36167 |
|
36168 | if (key === undefined) {
|
36169 | return this._locale._abbr;
|
36170 | } else {
|
36171 | newLocaleData = getLocale(key);
|
36172 | if (newLocaleData != null) {
|
36173 | this._locale = newLocaleData;
|
36174 | }
|
36175 | return this;
|
36176 | }
|
36177 | }
|
36178 |
|
36179 | var lang = deprecate(
|
36180 | 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
|
36181 | function (key) {
|
36182 | if (key === undefined) {
|
36183 | return this.localeData();
|
36184 | } else {
|
36185 | return this.locale(key);
|
36186 | }
|
36187 | }
|
36188 | );
|
36189 |
|
36190 | function localeData () {
|
36191 | return this._locale;
|
36192 | }
|
36193 |
|
36194 | function startOf (units) {
|
36195 | units = normalizeUnits(units);
|
36196 | // the following switch intentionally omits break keywords
|
36197 | // to utilize falling through the cases.
|
36198 | switch (units) {
|
36199 | case 'year':
|
36200 | this.month(0);
|
36201 | /* falls through */
|
36202 | case 'quarter':
|
36203 | case 'month':
|
36204 | this.date(1);
|
36205 | /* falls through */
|
36206 | case 'week':
|
36207 | case 'isoWeek':
|
36208 | case 'day':
|
36209 | case 'date':
|
36210 | this.hours(0);
|
36211 | /* falls through */
|
36212 | case 'hour':
|
36213 | this.minutes(0);
|
36214 | /* falls through */
|
36215 | case 'minute':
|
36216 | this.seconds(0);
|
36217 | /* falls through */
|
36218 | case 'second':
|
36219 | this.milliseconds(0);
|
36220 | }
|
36221 |
|
36222 | // weeks are a special case
|
36223 | if (units === 'week') {
|
36224 | this.weekday(0);
|
36225 | }
|
36226 | if (units === 'isoWeek') {
|
36227 | this.isoWeekday(1);
|
36228 | }
|
36229 |
|
36230 | // quarters are also special
|
36231 | if (units === 'quarter') {
|
36232 | this.month(Math.floor(this.month() / 3) * 3);
|
36233 | }
|
36234 |
|
36235 | return this;
|
36236 | }
|
36237 |
|
36238 | function endOf (units) {
|
36239 | units = normalizeUnits(units);
|
36240 | if (units === undefined || units === 'millisecond') {
|
36241 | return this;
|
36242 | }
|
36243 |
|
36244 | // 'date' is an alias for 'day', so it should be considered as such.
|
36245 | if (units === 'date') {
|
36246 | units = 'day';
|
36247 | }
|
36248 |
|
36249 | return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');
|
36250 | }
|
36251 |
|
36252 | function valueOf () {
|
36253 | return this._d.valueOf() - ((this._offset || 0) * 60000);
|
36254 | }
|
36255 |
|
36256 | function unix () {
|
36257 | return Math.floor(this.valueOf() / 1000);
|
36258 | }
|
36259 |
|
36260 | function toDate () {
|
36261 | return new Date(this.valueOf());
|
36262 | }
|
36263 |
|
36264 | function toArray () {
|
36265 | var m = this;
|
36266 | return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];
|
36267 | }
|
36268 |
|
36269 | function toObject () {
|
36270 | var m = this;
|
36271 | return {
|
36272 | years: m.year(),
|
36273 | months: m.month(),
|
36274 | date: m.date(),
|
36275 | hours: m.hours(),
|
36276 | minutes: m.minutes(),
|
36277 | seconds: m.seconds(),
|
36278 | milliseconds: m.milliseconds()
|
36279 | };
|
36280 | }
|
36281 |
|
36282 | function toJSON () {
|
36283 | // new Date(NaN).toJSON() === null
|
36284 | return this.isValid() ? this.toISOString() : null;
|
36285 | }
|
36286 |
|
36287 | function isValid$2 () {
|
36288 | return isValid(this);
|
36289 | }
|
36290 |
|
36291 | function parsingFlags () {
|
36292 | return extend({}, getParsingFlags(this));
|
36293 | }
|
36294 |
|
36295 | function invalidAt () {
|
36296 | return getParsingFlags(this).overflow;
|
36297 | }
|
36298 |
|
36299 | function creationData() {
|
36300 | return {
|
36301 | input: this._i,
|
36302 | format: this._f,
|
36303 | locale: this._locale,
|
36304 | isUTC: this._isUTC,
|
36305 | strict: this._strict
|
36306 | };
|
36307 | }
|
36308 |
|
36309 | // FORMATTING
|
36310 |
|
36311 | addFormatToken(0, ['gg', 2], 0, function () {
|
36312 | return this.weekYear() % 100;
|
36313 | });
|
36314 |
|
36315 | addFormatToken(0, ['GG', 2], 0, function () {
|
36316 | return this.isoWeekYear() % 100;
|
36317 | });
|
36318 |
|
36319 | function addWeekYearFormatToken (token, getter) {
|
36320 | addFormatToken(0, [token, token.length], 0, getter);
|
36321 | }
|
36322 |
|
36323 | addWeekYearFormatToken('gggg', 'weekYear');
|
36324 | addWeekYearFormatToken('ggggg', 'weekYear');
|
36325 | addWeekYearFormatToken('GGGG', 'isoWeekYear');
|
36326 | addWeekYearFormatToken('GGGGG', 'isoWeekYear');
|
36327 |
|
36328 | // ALIASES
|
36329 |
|
36330 | addUnitAlias('weekYear', 'gg');
|
36331 | addUnitAlias('isoWeekYear', 'GG');
|
36332 |
|
36333 | // PRIORITY
|
36334 |
|
36335 | addUnitPriority('weekYear', 1);
|
36336 | addUnitPriority('isoWeekYear', 1);
|
36337 |
|
36338 |
|
36339 | // PARSING
|
36340 |
|
36341 | addRegexToken('G', matchSigned);
|
36342 | addRegexToken('g', matchSigned);
|
36343 | addRegexToken('GG', match1to2, match2);
|
36344 | addRegexToken('gg', match1to2, match2);
|
36345 | addRegexToken('GGGG', match1to4, match4);
|
36346 | addRegexToken('gggg', match1to4, match4);
|
36347 | addRegexToken('GGGGG', match1to6, match6);
|
36348 | addRegexToken('ggggg', match1to6, match6);
|
36349 |
|
36350 | addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {
|
36351 | week[token.substr(0, 2)] = toInt(input);
|
36352 | });
|
36353 |
|
36354 | addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
|
36355 | week[token] = hooks.parseTwoDigitYear(input);
|
36356 | });
|
36357 |
|
36358 | // MOMENTS
|
36359 |
|
36360 | function getSetWeekYear (input) {
|
36361 | return getSetWeekYearHelper.call(this,
|
36362 | input,
|
36363 | this.week(),
|
36364 | this.weekday(),
|
36365 | this.localeData()._week.dow,
|
36366 | this.localeData()._week.doy);
|
36367 | }
|
36368 |
|
36369 | function getSetISOWeekYear (input) {
|
36370 | return getSetWeekYearHelper.call(this,
|
36371 | input, this.isoWeek(), this.isoWeekday(), 1, 4);
|
36372 | }
|
36373 |
|
36374 | function getISOWeeksInYear () {
|
36375 | return weeksInYear(this.year(), 1, 4);
|
36376 | }
|
36377 |
|
36378 | function getWeeksInYear () {
|
36379 | var weekInfo = this.localeData()._week;
|
36380 | return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
|
36381 | }
|
36382 |
|
36383 | function getSetWeekYearHelper(input, week, weekday, dow, doy) {
|
36384 | var weeksTarget;
|
36385 | if (input == null) {
|
36386 | return weekOfYear(this, dow, doy).year;
|
36387 | } else {
|
36388 | weeksTarget = weeksInYear(input, dow, doy);
|
36389 | if (week > weeksTarget) {
|
36390 | week = weeksTarget;
|
36391 | }
|
36392 | return setWeekAll.call(this, input, week, weekday, dow, doy);
|
36393 | }
|
36394 | }
|
36395 |
|
36396 | function setWeekAll(weekYear, week, weekday, dow, doy) {
|
36397 | var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
|
36398 | date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);
|
36399 |
|
36400 | this.year(date.getUTCFullYear());
|
36401 | this.month(date.getUTCMonth());
|
36402 | this.date(date.getUTCDate());
|
36403 | return this;
|
36404 | }
|
36405 |
|
36406 | // FORMATTING
|
36407 |
|
36408 | addFormatToken('Q', 0, 'Qo', 'quarter');
|
36409 |
|
36410 | // ALIASES
|
36411 |
|
36412 | addUnitAlias('quarter', 'Q');
|
36413 |
|
36414 | // PRIORITY
|
36415 |
|
36416 | addUnitPriority('quarter', 7);
|
36417 |
|
36418 | // PARSING
|
36419 |
|
36420 | addRegexToken('Q', match1);
|
36421 | addParseToken('Q', function (input, array) {
|
36422 | array[MONTH] = (toInt(input) - 1) * 3;
|
36423 | });
|
36424 |
|
36425 | // MOMENTS
|
36426 |
|
36427 | function getSetQuarter (input) {
|
36428 | return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
|
36429 | }
|
36430 |
|
36431 | // FORMATTING
|
36432 |
|
36433 | addFormatToken('D', ['DD', 2], 'Do', 'date');
|
36434 |
|
36435 | // ALIASES
|
36436 |
|
36437 | addUnitAlias('date', 'D');
|
36438 |
|
36439 | // PRIOROITY
|
36440 | addUnitPriority('date', 9);
|
36441 |
|
36442 | // PARSING
|
36443 |
|
36444 | addRegexToken('D', match1to2);
|
36445 | addRegexToken('DD', match1to2, match2);
|
36446 | addRegexToken('Do', function (isStrict, locale) {
|
36447 | // TODO: Remove "ordinalParse" fallback in next major release.
|
36448 | return isStrict ?
|
36449 | (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :
|
36450 | locale._dayOfMonthOrdinalParseLenient;
|
36451 | });
|
36452 |
|
36453 | addParseToken(['D', 'DD'], DATE);
|
36454 | addParseToken('Do', function (input, array) {
|
36455 | array[DATE] = toInt(input.match(match1to2)[0], 10);
|
36456 | });
|
36457 |
|
36458 | // MOMENTS
|
36459 |
|
36460 | var getSetDayOfMonth = makeGetSet('Date', true);
|
36461 |
|
36462 | // FORMATTING
|
36463 |
|
36464 | addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');
|
36465 |
|
36466 | // ALIASES
|
36467 |
|
36468 | addUnitAlias('dayOfYear', 'DDD');
|
36469 |
|
36470 | // PRIORITY
|
36471 | addUnitPriority('dayOfYear', 4);
|
36472 |
|
36473 | // PARSING
|
36474 |
|
36475 | addRegexToken('DDD', match1to3);
|
36476 | addRegexToken('DDDD', match3);
|
36477 | addParseToken(['DDD', 'DDDD'], function (input, array, config) {
|
36478 | config._dayOfYear = toInt(input);
|
36479 | });
|
36480 |
|
36481 | // HELPERS
|
36482 |
|
36483 | // MOMENTS
|
36484 |
|
36485 | function getSetDayOfYear (input) {
|
36486 | var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;
|
36487 | return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');
|
36488 | }
|
36489 |
|
36490 | // FORMATTING
|
36491 |
|
36492 | addFormatToken('m', ['mm', 2], 0, 'minute');
|
36493 |
|
36494 | // ALIASES
|
36495 |
|
36496 | addUnitAlias('minute', 'm');
|
36497 |
|
36498 | // PRIORITY
|
36499 |
|
36500 | addUnitPriority('minute', 14);
|
36501 |
|
36502 | // PARSING
|
36503 |
|
36504 | addRegexToken('m', match1to2);
|
36505 | addRegexToken('mm', match1to2, match2);
|
36506 | addParseToken(['m', 'mm'], MINUTE);
|
36507 |
|
36508 | // MOMENTS
|
36509 |
|
36510 | var getSetMinute = makeGetSet('Minutes', false);
|
36511 |
|
36512 | // FORMATTING
|
36513 |
|
36514 | addFormatToken('s', ['ss', 2], 0, 'second');
|
36515 |
|
36516 | // ALIASES
|
36517 |
|
36518 | addUnitAlias('second', 's');
|
36519 |
|
36520 | // PRIORITY
|
36521 |
|
36522 | addUnitPriority('second', 15);
|
36523 |
|
36524 | // PARSING
|
36525 |
|
36526 | addRegexToken('s', match1to2);
|
36527 | addRegexToken('ss', match1to2, match2);
|
36528 | addParseToken(['s', 'ss'], SECOND);
|
36529 |
|
36530 | // MOMENTS
|
36531 |
|
36532 | var getSetSecond = makeGetSet('Seconds', false);
|
36533 |
|
36534 | // FORMATTING
|
36535 |
|
36536 | addFormatToken('S', 0, 0, function () {
|
36537 | return ~~(this.millisecond() / 100);
|
36538 | });
|
36539 |
|
36540 | addFormatToken(0, ['SS', 2], 0, function () {
|
36541 | return ~~(this.millisecond() / 10);
|
36542 | });
|
36543 |
|
36544 | addFormatToken(0, ['SSS', 3], 0, 'millisecond');
|
36545 | addFormatToken(0, ['SSSS', 4], 0, function () {
|
36546 | return this.millisecond() * 10;
|
36547 | });
|
36548 | addFormatToken(0, ['SSSSS', 5], 0, function () {
|
36549 | return this.millisecond() * 100;
|
36550 | });
|
36551 | addFormatToken(0, ['SSSSSS', 6], 0, function () {
|
36552 | return this.millisecond() * 1000;
|
36553 | });
|
36554 | addFormatToken(0, ['SSSSSSS', 7], 0, function () {
|
36555 | return this.millisecond() * 10000;
|
36556 | });
|
36557 | addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
|
36558 | return this.millisecond() * 100000;
|
36559 | });
|
36560 | addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
|
36561 | return this.millisecond() * 1000000;
|
36562 | });
|
36563 |
|
36564 |
|
36565 | // ALIASES
|
36566 |
|
36567 | addUnitAlias('millisecond', 'ms');
|
36568 |
|
36569 | // PRIORITY
|
36570 |
|
36571 | addUnitPriority('millisecond', 16);
|
36572 |
|
36573 | // PARSING
|
36574 |
|
36575 | addRegexToken('S', match1to3, match1);
|
36576 | addRegexToken('SS', match1to3, match2);
|
36577 | addRegexToken('SSS', match1to3, match3);
|
36578 |
|
36579 | var token;
|
36580 | for (token = 'SSSS'; token.length <= 9; token += 'S') {
|
36581 | addRegexToken(token, matchUnsigned);
|
36582 | }
|
36583 |
|
36584 | function parseMs(input, array) {
|
36585 | array[MILLISECOND] = toInt(('0.' + input) * 1000);
|
36586 | }
|
36587 |
|
36588 | for (token = 'S'; token.length <= 9; token += 'S') {
|
36589 | addParseToken(token, parseMs);
|
36590 | }
|
36591 | // MOMENTS
|
36592 |
|
36593 | var getSetMillisecond = makeGetSet('Milliseconds', false);
|
36594 |
|
36595 | // FORMATTING
|
36596 |
|
36597 | addFormatToken('z', 0, 0, 'zoneAbbr');
|
36598 | addFormatToken('zz', 0, 0, 'zoneName');
|
36599 |
|
36600 | // MOMENTS
|
36601 |
|
36602 | function getZoneAbbr () {
|
36603 | return this._isUTC ? 'UTC' : '';
|
36604 | }
|
36605 |
|
36606 | function getZoneName () {
|
36607 | return this._isUTC ? 'Coordinated Universal Time' : '';
|
36608 | }
|
36609 |
|
36610 | var proto = Moment.prototype;
|
36611 |
|
36612 | proto.add = add;
|
36613 | proto.calendar = calendar$1;
|
36614 | proto.clone = clone;
|
36615 | proto.diff = diff;
|
36616 | proto.endOf = endOf;
|
36617 | proto.format = format;
|
36618 | proto.from = from;
|
36619 | proto.fromNow = fromNow;
|
36620 | proto.to = to;
|
36621 | proto.toNow = toNow;
|
36622 | proto.get = stringGet;
|
36623 | proto.invalidAt = invalidAt;
|
36624 | proto.isAfter = isAfter;
|
36625 | proto.isBefore = isBefore;
|
36626 | proto.isBetween = isBetween;
|
36627 | proto.isSame = isSame;
|
36628 | proto.isSameOrAfter = isSameOrAfter;
|
36629 | proto.isSameOrBefore = isSameOrBefore;
|
36630 | proto.isValid = isValid$2;
|
36631 | proto.lang = lang;
|
36632 | proto.locale = locale;
|
36633 | proto.localeData = localeData;
|
36634 | proto.max = prototypeMax;
|
36635 | proto.min = prototypeMin;
|
36636 | proto.parsingFlags = parsingFlags;
|
36637 | proto.set = stringSet;
|
36638 | proto.startOf = startOf;
|
36639 | proto.subtract = subtract;
|
36640 | proto.toArray = toArray;
|
36641 | proto.toObject = toObject;
|
36642 | proto.toDate = toDate;
|
36643 | proto.toISOString = toISOString;
|
36644 | proto.inspect = inspect;
|
36645 | proto.toJSON = toJSON;
|
36646 | proto.toString = toString;
|
36647 | proto.unix = unix;
|
36648 | proto.valueOf = valueOf;
|
36649 | proto.creationData = creationData;
|
36650 |
|
36651 | // Year
|
36652 | proto.year = getSetYear;
|
36653 | proto.isLeapYear = getIsLeapYear;
|
36654 |
|
36655 | // Week Year
|
36656 | proto.weekYear = getSetWeekYear;
|
36657 | proto.isoWeekYear = getSetISOWeekYear;
|
36658 |
|
36659 | // Quarter
|
36660 | proto.quarter = proto.quarters = getSetQuarter;
|
36661 |
|
36662 | // Month
|
36663 | proto.month = getSetMonth;
|
36664 | proto.daysInMonth = getDaysInMonth;
|
36665 |
|
36666 | // Week
|
36667 | proto.week = proto.weeks = getSetWeek;
|
36668 | proto.isoWeek = proto.isoWeeks = getSetISOWeek;
|
36669 | proto.weeksInYear = getWeeksInYear;
|
36670 | proto.isoWeeksInYear = getISOWeeksInYear;
|
36671 |
|
36672 | // Day
|
36673 | proto.date = getSetDayOfMonth;
|
36674 | proto.day = proto.days = getSetDayOfWeek;
|
36675 | proto.weekday = getSetLocaleDayOfWeek;
|
36676 | proto.isoWeekday = getSetISODayOfWeek;
|
36677 | proto.dayOfYear = getSetDayOfYear;
|
36678 |
|
36679 | // Hour
|
36680 | proto.hour = proto.hours = getSetHour;
|
36681 |
|
36682 | // Minute
|
36683 | proto.minute = proto.minutes = getSetMinute;
|
36684 |
|
36685 | // Second
|
36686 | proto.second = proto.seconds = getSetSecond;
|
36687 |
|
36688 | // Millisecond
|
36689 | proto.millisecond = proto.milliseconds = getSetMillisecond;
|
36690 |
|
36691 | // Offset
|
36692 | proto.utcOffset = getSetOffset;
|
36693 | proto.utc = setOffsetToUTC;
|
36694 | proto.local = setOffsetToLocal;
|
36695 | proto.parseZone = setOffsetToParsedOffset;
|
36696 | proto.hasAlignedHourOffset = hasAlignedHourOffset;
|
36697 | proto.isDST = isDaylightSavingTime;
|
36698 | proto.isLocal = isLocal;
|
36699 | proto.isUtcOffset = isUtcOffset;
|
36700 | proto.isUtc = isUtc;
|
36701 | proto.isUTC = isUtc;
|
36702 |
|
36703 | // Timezone
|
36704 | proto.zoneAbbr = getZoneAbbr;
|
36705 | proto.zoneName = getZoneName;
|
36706 |
|
36707 | // Deprecations
|
36708 | proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);
|
36709 | proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);
|
36710 | proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);
|
36711 | proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);
|
36712 | proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);
|
36713 |
|
36714 | function createUnix (input) {
|
36715 | return createLocal(input * 1000);
|
36716 | }
|
36717 |
|
36718 | function createInZone () {
|
36719 | return createLocal.apply(null, arguments).parseZone();
|
36720 | }
|
36721 |
|
36722 | function preParsePostFormat (string) {
|
36723 | return string;
|
36724 | }
|
36725 |
|
36726 | var proto$1 = Locale.prototype;
|
36727 |
|
36728 | proto$1.calendar = calendar;
|
36729 | proto$1.longDateFormat = longDateFormat;
|
36730 | proto$1.invalidDate = invalidDate;
|
36731 | proto$1.ordinal = ordinal;
|
36732 | proto$1.preparse = preParsePostFormat;
|
36733 | proto$1.postformat = preParsePostFormat;
|
36734 | proto$1.relativeTime = relativeTime;
|
36735 | proto$1.pastFuture = pastFuture;
|
36736 | proto$1.set = set;
|
36737 |
|
36738 | // Month
|
36739 | proto$1.months = localeMonths;
|
36740 | proto$1.monthsShort = localeMonthsShort;
|
36741 | proto$1.monthsParse = localeMonthsParse;
|
36742 | proto$1.monthsRegex = monthsRegex;
|
36743 | proto$1.monthsShortRegex = monthsShortRegex;
|
36744 |
|
36745 | // Week
|
36746 | proto$1.week = localeWeek;
|
36747 | proto$1.firstDayOfYear = localeFirstDayOfYear;
|
36748 | proto$1.firstDayOfWeek = localeFirstDayOfWeek;
|
36749 |
|
36750 | // Day of Week
|
36751 | proto$1.weekdays = localeWeekdays;
|
36752 | proto$1.weekdaysMin = localeWeekdaysMin;
|
36753 | proto$1.weekdaysShort = localeWeekdaysShort;
|
36754 | proto$1.weekdaysParse = localeWeekdaysParse;
|
36755 |
|
36756 | proto$1.weekdaysRegex = weekdaysRegex;
|
36757 | proto$1.weekdaysShortRegex = weekdaysShortRegex;
|
36758 | proto$1.weekdaysMinRegex = weekdaysMinRegex;
|
36759 |
|
36760 | // Hours
|
36761 | proto$1.isPM = localeIsPM;
|
36762 | proto$1.meridiem = localeMeridiem;
|
36763 |
|
36764 | function get$1 (format, index, field, setter) {
|
36765 | var locale = getLocale();
|
36766 | var utc = createUTC().set(setter, index);
|
36767 | return locale[field](utc, format);
|
36768 | }
|
36769 |
|
36770 | function listMonthsImpl (format, index, field) {
|
36771 | if (isNumber(format)) {
|
36772 | index = format;
|
36773 | format = undefined;
|
36774 | }
|
36775 |
|
36776 | format = format || '';
|
36777 |
|
36778 | if (index != null) {
|
36779 | return get$1(format, index, field, 'month');
|
36780 | }
|
36781 |
|
36782 | var i;
|
36783 | var out = [];
|
36784 | for (i = 0; i < 12; i++) {
|
36785 | out[i] = get$1(format, i, field, 'month');
|
36786 | }
|
36787 | return out;
|
36788 | }
|
36789 |
|
36790 | // ()
|
36791 | // (5)
|
36792 | // (fmt, 5)
|
36793 | // (fmt)
|
36794 | // (true)
|
36795 | // (true, 5)
|
36796 | // (true, fmt, 5)
|
36797 | // (true, fmt)
|
36798 | function listWeekdaysImpl (localeSorted, format, index, field) {
|
36799 | if (typeof localeSorted === 'boolean') {
|
36800 | if (isNumber(format)) {
|
36801 | index = format;
|
36802 | format = undefined;
|
36803 | }
|
36804 |
|
36805 | format = format || '';
|
36806 | } else {
|
36807 | format = localeSorted;
|
36808 | index = format;
|
36809 | localeSorted = false;
|
36810 |
|
36811 | if (isNumber(format)) {
|
36812 | index = format;
|
36813 | format = undefined;
|
36814 | }
|
36815 |
|
36816 | format = format || '';
|
36817 | }
|
36818 |
|
36819 | var locale = getLocale(),
|
36820 | shift = localeSorted ? locale._week.dow : 0;
|
36821 |
|
36822 | if (index != null) {
|
36823 | return get$1(format, (index + shift) % 7, field, 'day');
|
36824 | }
|
36825 |
|
36826 | var i;
|
36827 | var out = [];
|
36828 | for (i = 0; i < 7; i++) {
|
36829 | out[i] = get$1(format, (i + shift) % 7, field, 'day');
|
36830 | }
|
36831 | return out;
|
36832 | }
|
36833 |
|
36834 | function listMonths (format, index) {
|
36835 | return listMonthsImpl(format, index, 'months');
|
36836 | }
|
36837 |
|
36838 | function listMonthsShort (format, index) {
|
36839 | return listMonthsImpl(format, index, 'monthsShort');
|
36840 | }
|
36841 |
|
36842 | function listWeekdays (localeSorted, format, index) {
|
36843 | return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
|
36844 | }
|
36845 |
|
36846 | function listWeekdaysShort (localeSorted, format, index) {
|
36847 | return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
|
36848 | }
|
36849 |
|
36850 | function listWeekdaysMin (localeSorted, format, index) {
|
36851 | return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
|
36852 | }
|
36853 |
|
36854 | getSetGlobalLocale('en', {
|
36855 | dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
|
36856 | ordinal : function (number) {
|
36857 | var b = number % 10,
|
36858 | output = (toInt(number % 100 / 10) === 1) ? 'th' :
|
36859 | (b === 1) ? 'st' :
|
36860 | (b === 2) ? 'nd' :
|
36861 | (b === 3) ? 'rd' : 'th';
|
36862 | return number + output;
|
36863 | }
|
36864 | });
|
36865 |
|
36866 | // Side effect imports
|
36867 | hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);
|
36868 | hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);
|
36869 |
|
36870 | var mathAbs = Math.abs;
|
36871 |
|
36872 | function abs () {
|
36873 | var data = this._data;
|
36874 |
|
36875 | this._milliseconds = mathAbs(this._milliseconds);
|
36876 | this._days = mathAbs(this._days);
|
36877 | this._months = mathAbs(this._months);
|
36878 |
|
36879 | data.milliseconds = mathAbs(data.milliseconds);
|
36880 | data.seconds = mathAbs(data.seconds);
|
36881 | data.minutes = mathAbs(data.minutes);
|
36882 | data.hours = mathAbs(data.hours);
|
36883 | data.months = mathAbs(data.months);
|
36884 | data.years = mathAbs(data.years);
|
36885 |
|
36886 | return this;
|
36887 | }
|
36888 |
|
36889 | function addSubtract$1 (duration, input, value, direction) {
|
36890 | var other = createDuration(input, value);
|
36891 |
|
36892 | duration._milliseconds += direction * other._milliseconds;
|
36893 | duration._days += direction * other._days;
|
36894 | duration._months += direction * other._months;
|
36895 |
|
36896 | return duration._bubble();
|
36897 | }
|
36898 |
|
36899 | // supports only 2.0-style add(1, 's') or add(duration)
|
36900 | function add$1 (input, value) {
|
36901 | return addSubtract$1(this, input, value, 1);
|
36902 | }
|
36903 |
|
36904 | // supports only 2.0-style subtract(1, 's') or subtract(duration)
|
36905 | function subtract$1 (input, value) {
|
36906 | return addSubtract$1(this, input, value, -1);
|
36907 | }
|
36908 |
|
36909 | function absCeil (number) {
|
36910 | if (number < 0) {
|
36911 | return Math.floor(number);
|
36912 | } else {
|
36913 | return Math.ceil(number);
|
36914 | }
|
36915 | }
|
36916 |
|
36917 | function bubble () {
|
36918 | var milliseconds = this._milliseconds;
|
36919 | var days = this._days;
|
36920 | var months = this._months;
|
36921 | var data = this._data;
|
36922 | var seconds, minutes, hours, years, monthsFromDays;
|
36923 |
|
36924 | // if we have a mix of positive and negative values, bubble down first
|
36925 | // check: https://github.com/moment/moment/issues/2166
|
36926 | if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||
|
36927 | (milliseconds <= 0 && days <= 0 && months <= 0))) {
|
36928 | milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
|
36929 | days = 0;
|
36930 | months = 0;
|
36931 | }
|
36932 |
|
36933 | // The following code bubbles up values, see the tests for
|
36934 | // examples of what that means.
|
36935 | data.milliseconds = milliseconds % 1000;
|
36936 |
|
36937 | seconds = absFloor(milliseconds / 1000);
|
36938 | data.seconds = seconds % 60;
|
36939 |
|
36940 | minutes = absFloor(seconds / 60);
|
36941 | data.minutes = minutes % 60;
|
36942 |
|
36943 | hours = absFloor(minutes / 60);
|
36944 | data.hours = hours % 24;
|
36945 |
|
36946 | days += absFloor(hours / 24);
|
36947 |
|
36948 | // convert days to months
|
36949 | monthsFromDays = absFloor(daysToMonths(days));
|
36950 | months += monthsFromDays;
|
36951 | days -= absCeil(monthsToDays(monthsFromDays));
|
36952 |
|
36953 | // 12 months -> 1 year
|
36954 | years = absFloor(months / 12);
|
36955 | months %= 12;
|
36956 |
|
36957 | data.days = days;
|
36958 | data.months = months;
|
36959 | data.years = years;
|
36960 |
|
36961 | return this;
|
36962 | }
|
36963 |
|
36964 | function daysToMonths (days) {
|
36965 | // 400 years have 146097 days (taking into account leap year rules)
|
36966 | // 400 years have 12 months === 4800
|
36967 | return days * 4800 / 146097;
|
36968 | }
|
36969 |
|
36970 | function monthsToDays (months) {
|
36971 | // the reverse of daysToMonths
|
36972 | return months * 146097 / 4800;
|
36973 | }
|
36974 |
|
36975 | function as (units) {
|
36976 | if (!this.isValid()) {
|
36977 | return NaN;
|
36978 | }
|
36979 | var days;
|
36980 | var months;
|
36981 | var milliseconds = this._milliseconds;
|
36982 |
|
36983 | units = normalizeUnits(units);
|
36984 |
|
36985 | if (units === 'month' || units === 'year') {
|
36986 | days = this._days + milliseconds / 864e5;
|
36987 | months = this._months + daysToMonths(days);
|
36988 | return units === 'month' ? months : months / 12;
|
36989 | } else {
|
36990 | // handle milliseconds separately because of floating point math errors (issue #1867)
|
36991 | days = this._days + Math.round(monthsToDays(this._months));
|
36992 | switch (units) {
|
36993 | case 'week' : return days / 7 + milliseconds / 6048e5;
|
36994 | case 'day' : return days + milliseconds / 864e5;
|
36995 | case 'hour' : return days * 24 + milliseconds / 36e5;
|
36996 | case 'minute' : return days * 1440 + milliseconds / 6e4;
|
36997 | case 'second' : return days * 86400 + milliseconds / 1000;
|
36998 | // Math.floor prevents floating point math errors here
|
36999 | case 'millisecond': return Math.floor(days * 864e5) + milliseconds;
|
37000 | default: throw new Error('Unknown unit ' + units);
|
37001 | }
|
37002 | }
|
37003 | }
|
37004 |
|
37005 | // TODO: Use this.as('ms')?
|
37006 | function valueOf$1 () {
|
37007 | if (!this.isValid()) {
|
37008 | return NaN;
|
37009 | }
|
37010 | return (
|
37011 | this._milliseconds +
|
37012 | this._days * 864e5 +
|
37013 | (this._months % 12) * 2592e6 +
|
37014 | toInt(this._months / 12) * 31536e6
|
37015 | );
|
37016 | }
|
37017 |
|
37018 | function makeAs (alias) {
|
37019 | return function () {
|
37020 | return this.as(alias);
|
37021 | };
|
37022 | }
|
37023 |
|
37024 | var asMilliseconds = makeAs('ms');
|
37025 | var asSeconds = makeAs('s');
|
37026 | var asMinutes = makeAs('m');
|
37027 | var asHours = makeAs('h');
|
37028 | var asDays = makeAs('d');
|
37029 | var asWeeks = makeAs('w');
|
37030 | var asMonths = makeAs('M');
|
37031 | var asYears = makeAs('y');
|
37032 |
|
37033 | function get$2 (units) {
|
37034 | units = normalizeUnits(units);
|
37035 | return this.isValid() ? this[units + 's']() : NaN;
|
37036 | }
|
37037 |
|
37038 | function makeGetter(name) {
|
37039 | return function () {
|
37040 | return this.isValid() ? this._data[name] : NaN;
|
37041 | };
|
37042 | }
|
37043 |
|
37044 | var milliseconds = makeGetter('milliseconds');
|
37045 | var seconds = makeGetter('seconds');
|
37046 | var minutes = makeGetter('minutes');
|
37047 | var hours = makeGetter('hours');
|
37048 | var days = makeGetter('days');
|
37049 | var months = makeGetter('months');
|
37050 | var years = makeGetter('years');
|
37051 |
|
37052 | function weeks () {
|
37053 | return absFloor(this.days() / 7);
|
37054 | }
|
37055 |
|
37056 | var round = Math.round;
|
37057 | var thresholds = {
|
37058 | ss: 44, // a few seconds to seconds
|
37059 | s : 45, // seconds to minute
|
37060 | m : 45, // minutes to hour
|
37061 | h : 22, // hours to day
|
37062 | d : 26, // days to month
|
37063 | M : 11 // months to year
|
37064 | };
|
37065 |
|
37066 | // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
|
37067 | function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
|
37068 | return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
|
37069 | }
|
37070 |
|
37071 | function relativeTime$1 (posNegDuration, withoutSuffix, locale) {
|
37072 | var duration = createDuration(posNegDuration).abs();
|
37073 | var seconds = round(duration.as('s'));
|
37074 | var minutes = round(duration.as('m'));
|
37075 | var hours = round(duration.as('h'));
|
37076 | var days = round(duration.as('d'));
|
37077 | var months = round(duration.as('M'));
|
37078 | var years = round(duration.as('y'));
|
37079 |
|
37080 | var a = seconds <= thresholds.ss && ['s', seconds] ||
|
37081 | seconds < thresholds.s && ['ss', seconds] ||
|
37082 | minutes <= 1 && ['m'] ||
|
37083 | minutes < thresholds.m && ['mm', minutes] ||
|
37084 | hours <= 1 && ['h'] ||
|
37085 | hours < thresholds.h && ['hh', hours] ||
|
37086 | days <= 1 && ['d'] ||
|
37087 | days < thresholds.d && ['dd', days] ||
|
37088 | months <= 1 && ['M'] ||
|
37089 | months < thresholds.M && ['MM', months] ||
|
37090 | years <= 1 && ['y'] || ['yy', years];
|
37091 |
|
37092 | a[2] = withoutSuffix;
|
37093 | a[3] = +posNegDuration > 0;
|
37094 | a[4] = locale;
|
37095 | return substituteTimeAgo.apply(null, a);
|
37096 | }
|
37097 |
|
37098 | // This function allows you to set the rounding function for relative time strings
|
37099 | function getSetRelativeTimeRounding (roundingFunction) {
|
37100 | if (roundingFunction === undefined) {
|
37101 | return round;
|
37102 | }
|
37103 | if (typeof(roundingFunction) === 'function') {
|
37104 | round = roundingFunction;
|
37105 | return true;
|
37106 | }
|
37107 | return false;
|
37108 | }
|
37109 |
|
37110 | // This function allows you to set a threshold for relative time strings
|
37111 | function getSetRelativeTimeThreshold (threshold, limit) {
|
37112 | if (thresholds[threshold] === undefined) {
|
37113 | return false;
|
37114 | }
|
37115 | if (limit === undefined) {
|
37116 | return thresholds[threshold];
|
37117 | }
|
37118 | thresholds[threshold] = limit;
|
37119 | if (threshold === 's') {
|
37120 | thresholds.ss = limit - 1;
|
37121 | }
|
37122 | return true;
|
37123 | }
|
37124 |
|
37125 | function humanize (withSuffix) {
|
37126 | if (!this.isValid()) {
|
37127 | return this.localeData().invalidDate();
|
37128 | }
|
37129 |
|
37130 | var locale = this.localeData();
|
37131 | var output = relativeTime$1(this, !withSuffix, locale);
|
37132 |
|
37133 | if (withSuffix) {
|
37134 | output = locale.pastFuture(+this, output);
|
37135 | }
|
37136 |
|
37137 | return locale.postformat(output);
|
37138 | }
|
37139 |
|
37140 | var abs$1 = Math.abs;
|
37141 |
|
37142 | function toISOString$1() {
|
37143 | // for ISO strings we do not use the normal bubbling rules:
|
37144 | // * milliseconds bubble up until they become hours
|
37145 | // * days do not bubble at all
|
37146 | // * months bubble up until they become years
|
37147 | // This is because there is no context-free conversion between hours and days
|
37148 | // (think of clock changes)
|
37149 | // and also not between days and months (28-31 days per month)
|
37150 | if (!this.isValid()) {
|
37151 | return this.localeData().invalidDate();
|
37152 | }
|
37153 |
|
37154 | var seconds = abs$1(this._milliseconds) / 1000;
|
37155 | var days = abs$1(this._days);
|
37156 | var months = abs$1(this._months);
|
37157 | var minutes, hours, years;
|
37158 |
|
37159 | // 3600 seconds -> 60 minutes -> 1 hour
|
37160 | minutes = absFloor(seconds / 60);
|
37161 | hours = absFloor(minutes / 60);
|
37162 | seconds %= 60;
|
37163 | minutes %= 60;
|
37164 |
|
37165 | // 12 months -> 1 year
|
37166 | years = absFloor(months / 12);
|
37167 | months %= 12;
|
37168 |
|
37169 |
|
37170 | // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
|
37171 | var Y = years;
|
37172 | var M = months;
|
37173 | var D = days;
|
37174 | var h = hours;
|
37175 | var m = minutes;
|
37176 | var s = seconds;
|
37177 | var total = this.asSeconds();
|
37178 |
|
37179 | if (!total) {
|
37180 | // this is the same as C#'s (Noda) and python (isodate)...
|
37181 | // but not other JS (goog.date)
|
37182 | return 'P0D';
|
37183 | }
|
37184 |
|
37185 | return (total < 0 ? '-' : '') +
|
37186 | 'P' +
|
37187 | (Y ? Y + 'Y' : '') +
|
37188 | (M ? M + 'M' : '') +
|
37189 | (D ? D + 'D' : '') +
|
37190 | ((h || m || s) ? 'T' : '') +
|
37191 | (h ? h + 'H' : '') +
|
37192 | (m ? m + 'M' : '') +
|
37193 | (s ? s + 'S' : '');
|
37194 | }
|
37195 |
|
37196 | var proto$2 = Duration.prototype;
|
37197 |
|
37198 | proto$2.isValid = isValid$1;
|
37199 | proto$2.abs = abs;
|
37200 | proto$2.add = add$1;
|
37201 | proto$2.subtract = subtract$1;
|
37202 | proto$2.as = as;
|
37203 | proto$2.asMilliseconds = asMilliseconds;
|
37204 | proto$2.asSeconds = asSeconds;
|
37205 | proto$2.asMinutes = asMinutes;
|
37206 | proto$2.asHours = asHours;
|
37207 | proto$2.asDays = asDays;
|
37208 | proto$2.asWeeks = asWeeks;
|
37209 | proto$2.asMonths = asMonths;
|
37210 | proto$2.asYears = asYears;
|
37211 | proto$2.valueOf = valueOf$1;
|
37212 | proto$2._bubble = bubble;
|
37213 | proto$2.get = get$2;
|
37214 | proto$2.milliseconds = milliseconds;
|
37215 | proto$2.seconds = seconds;
|
37216 | proto$2.minutes = minutes;
|
37217 | proto$2.hours = hours;
|
37218 | proto$2.days = days;
|
37219 | proto$2.weeks = weeks;
|
37220 | proto$2.months = months;
|
37221 | proto$2.years = years;
|
37222 | proto$2.humanize = humanize;
|
37223 | proto$2.toISOString = toISOString$1;
|
37224 | proto$2.toString = toISOString$1;
|
37225 | proto$2.toJSON = toISOString$1;
|
37226 | proto$2.locale = locale;
|
37227 | proto$2.localeData = localeData;
|
37228 |
|
37229 | // Deprecations
|
37230 | proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);
|
37231 | proto$2.lang = lang;
|
37232 |
|
37233 | // Side effect imports
|
37234 |
|
37235 | // FORMATTING
|
37236 |
|
37237 | addFormatToken('X', 0, 0, 'unix');
|
37238 | addFormatToken('x', 0, 0, 'valueOf');
|
37239 |
|
37240 | // PARSING
|
37241 |
|
37242 | addRegexToken('x', matchSigned);
|
37243 | addRegexToken('X', matchTimestamp);
|
37244 | addParseToken('X', function (input, array, config) {
|
37245 | config._d = new Date(parseFloat(input, 10) * 1000);
|
37246 | });
|
37247 | addParseToken('x', function (input, array, config) {
|
37248 | config._d = new Date(toInt(input));
|
37249 | });
|
37250 |
|
37251 | // Side effect imports
|
37252 |
|
37253 |
|
37254 | hooks.version = '2.18.1';
|
37255 |
|
37256 | setHookCallback(createLocal);
|
37257 |
|
37258 | hooks.fn = proto;
|
37259 | hooks.min = min;
|
37260 | hooks.max = max;
|
37261 | hooks.now = now;
|
37262 | hooks.utc = createUTC;
|
37263 | hooks.unix = createUnix;
|
37264 | hooks.months = listMonths;
|
37265 | hooks.isDate = isDate;
|
37266 | hooks.locale = getSetGlobalLocale;
|
37267 | hooks.invalid = createInvalid;
|
37268 | hooks.duration = createDuration;
|
37269 | hooks.isMoment = isMoment;
|
37270 | hooks.weekdays = listWeekdays;
|
37271 | hooks.parseZone = createInZone;
|
37272 | hooks.localeData = getLocale;
|
37273 | hooks.isDuration = isDuration;
|
37274 | hooks.monthsShort = listMonthsShort;
|
37275 | hooks.weekdaysMin = listWeekdaysMin;
|
37276 | hooks.defineLocale = defineLocale;
|
37277 | hooks.updateLocale = updateLocale;
|
37278 | hooks.locales = listLocales;
|
37279 | hooks.weekdaysShort = listWeekdaysShort;
|
37280 | hooks.normalizeUnits = normalizeUnits;
|
37281 | hooks.relativeTimeRounding = getSetRelativeTimeRounding;
|
37282 | hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;
|
37283 | hooks.calendarFormat = getCalendarFormat;
|
37284 | hooks.prototype = proto;
|
37285 |
|
37286 | return hooks;
|
37287 |
|
37288 | })));
|
37289 | });
|
37290 |
|
37291 | var config$1 = {
|
37292 | overpassBase: 'https://overpass.maptime.in/api/interpreter',
|
37293 | osmBase: 'https://www.openstreetmap.org/api/0.6/',
|
37294 | mapboxAccessToken: 'pk.eyJ1IjoicmFzYWd5IiwiYSI6ImNpejVrMjc4eTAwNGczM2thNWozYnJ1OHkifQ.yFRr3Sd39TJiwEguQpIkWQ',
|
37295 | S3_URL: 'https://s3.amazonaws.com/mapbox/real-changesets/production/'
|
37296 | };
|
37297 |
|
37298 | function query(changesetID) {
|
37299 | var url = config$1.osmBase + 'changeset/' + changesetID;
|
37300 | var options = {
|
37301 | 'Response-Type': 'document'
|
37302 | };
|
37303 | return fetch(url, options).then(function (r) {
|
37304 | return r.text();
|
37305 | }).then(function (r) {
|
37306 | var parser = new DOMParser();
|
37307 | var xml = void 0;
|
37308 | try {
|
37309 | xml = parser.parseFromString(r, 'text/xml');
|
37310 | } catch (e) {
|
37311 | throw e;
|
37312 | }
|
37313 | var csFeature = xml.getElementsByTagName('changeset')[0];
|
37314 | var cs = csFeature.attributes;
|
37315 | var uid = cs.uid.textContent;
|
37316 | var user = cs.user.textContent;
|
37317 | var from = moment(cs.created_at.textContent, 'YYYY-MM-DDTHH:mm:ss\\Z').subtract(1, 'seconds').format('YYYY-MM-DDTHH:mm:ss\\Z');
|
37318 | var to = cs.closed_at ? cs.closed_at.textContent : null;
|
37319 | var left = cs.min_lon ? cs.min_lon.textContent : -180;
|
37320 | var bottom = cs.min_lat ? cs.min_lat.textContent : -90;
|
37321 | var right = cs.max_lon ? cs.max_lon.textContent : 180;
|
37322 | var top = cs.max_lat ? cs.max_lat.textContent : 90;
|
37323 | return {
|
37324 | id: changesetID,
|
37325 | uid: uid,
|
37326 | user: user,
|
37327 | from: from,
|
37328 | to: to,
|
37329 | bbox: {
|
37330 | left: left,
|
37331 | bottom: bottom,
|
37332 | right: right,
|
37333 | top: top
|
37334 | }
|
37335 | };
|
37336 | });
|
37337 | }
|
37338 |
|
37339 | var x$1 = react.createElement(
|
37340 | 'section',
|
37341 | { className: 'cmap-filter-type-section' },
|
37342 | react.createElement(
|
37343 | 'h6',
|
37344 | { className: 'cmap-heading' },
|
37345 | 'Filter by type'
|
37346 | ),
|
37347 | react.createElement(
|
37348 | 'ul',
|
37349 | { className: 'cmap-hlist' },
|
37350 | react.createElement(
|
37351 | 'li',
|
37352 | null,
|
37353 | react.createElement(
|
37354 | 'label',
|
37355 | { className: 'cmap-hlist-item cmap-noselect cmap-pointer' },
|
37356 | react.createElement('className', {
|
37357 | type: 'checkbox',
|
37358 | value: 'nodes',
|
37359 | checked: 'true',
|
37360 | id: 'cmap-type-selector-nodes'
|
37361 | }),
|
37362 | react.createElement(
|
37363 | 'span',
|
37364 | { className: 'cmap-label-text' },
|
37365 | 'Nodes'
|
37366 | )
|
37367 | )
|
37368 | ),
|
37369 | react.createElement(
|
37370 | 'li',
|
37371 | null,
|
37372 | react.createElement(
|
37373 | 'label',
|
37374 | { className: 'cmap-hlist-item cmap-noselect cmap-pointer' },
|
37375 | react.createElement('className', {
|
37376 | type: 'checkbox',
|
37377 | value: 'ways',
|
37378 | checked: 'true',
|
37379 | id: 'cmap-type-selector-ways'
|
37380 | }),
|
37381 | react.createElement(
|
37382 | 'span',
|
37383 | { className: 'cmap-label-text' },
|
37384 | 'Ways'
|
37385 | )
|
37386 | )
|
37387 | ),
|
37388 | react.createElement(
|
37389 | 'li',
|
37390 | null,
|
37391 | react.createElement(
|
37392 | 'label',
|
37393 | { className: 'cmap-hlist-item cmap-noselect cmap-pointer' },
|
37394 | react.createElement('className', {
|
37395 | type: 'checkbox',
|
37396 | value: 'relations',
|
37397 | checked: 'true',
|
37398 | id: 'cmap-type-selector-relations'
|
37399 | }),
|
37400 | react.createElement(
|
37401 | 'span',
|
37402 | { className: 'cmap-label-text' },
|
37403 | 'Relations'
|
37404 | )
|
37405 | )
|
37406 | )
|
37407 | )
|
37408 | );
|
37409 |
|
37410 | function getChangeset(changesetID) {
|
37411 | var overpassBase = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : config$1.overpassBase;
|
37412 |
|
37413 | return query(changesetID).then(function (changeset) {
|
37414 | var url = config$1.S3_URL + changesetID + '.json';
|
37415 | return fetch(url).then(function (r) {
|
37416 | if (r.ok) return r.json();
|
37417 | // Fallback to overpass
|
37418 | return Promise.reject();
|
37419 | }).then(function (r) {
|
37420 | var geojson = realChangesetsParser(r);
|
37421 | var featureMap = getFeatureMap(geojson);
|
37422 | var ret = {
|
37423 | geojson: geojson,
|
37424 | featureMap: featureMap,
|
37425 | changeset: changeset
|
37426 | };
|
37427 | return ret;
|
37428 | }).catch(function () {
|
37429 | return fetchFromOverPass(changesetID, changeset, overpassBase);
|
37430 | });
|
37431 | });
|
37432 | }
|
37433 |
|
37434 | function fetchFromOverPass(changesetID, changeset, overpassBase) {
|
37435 | var data = getDataParam(changeset);
|
37436 | var bbox = getBboxParam(changeset.bbox);
|
37437 | var url = overpassBase + '?data=' + data + '&bbox=' + bbox;
|
37438 |
|
37439 | return fetch(url, {
|
37440 | 'Response-Type': 'application/osm3s+xml'
|
37441 | }).then(function (r) {
|
37442 | return r.text();
|
37443 | }).then(function (response) {
|
37444 | return new Promise(function (res, rej) {
|
37445 | osmAdiffParserSaxjs(response, null, function (err, json) {
|
37446 | if (err) {
|
37447 | return rej({
|
37448 | msg: 'Failed to parser adiff xml.',
|
37449 | error: err
|
37450 | });
|
37451 | }
|
37452 | var geojson = realChangesetsParser({
|
37453 | elements: json[changesetID]
|
37454 | });
|
37455 | var featureMap = getFeatureMap(geojson);
|
37456 |
|
37457 | var ret = {
|
37458 | geojson: geojson,
|
37459 | featureMap: featureMap,
|
37460 | changeset: changeset
|
37461 | };
|
37462 | return res(ret);
|
37463 | });
|
37464 | });
|
37465 | }).catch(function (err) {
|
37466 | return Promise.reject({
|
37467 | msg: 'Overpass query failed.',
|
37468 | error: err
|
37469 | });
|
37470 | });
|
37471 | }
|
37472 |
|
37473 | function getDataParam(c) {
|
37474 | return '[out:xml][adiff:%22' + c.from.toString() + ',%22,%22' + c.to.toString() + '%22];(node(bbox)(changed);way(bbox)(changed);relation(bbox)(changed));out%20meta%20geom(bbox);';
|
37475 | }
|
37476 |
|
37477 | function getBboxParam(bbox) {
|
37478 | return [bbox.left, bbox.bottom, bbox.right, bbox.top].join(',');
|
37479 | }
|
37480 |
|
37481 | function getFeatureMap(geojson) {
|
37482 | var features = geojson.features;
|
37483 | var featureMap = {};
|
37484 |
|
37485 | for (var i = 0, len = features.length; i < len; i++) {
|
37486 | var id = features[i].properties.id;
|
37487 | featureMap[id] = featureMap[id] || [];
|
37488 | featureMap[id].push(features[i]);
|
37489 | }
|
37490 |
|
37491 | return featureMap;
|
37492 | }
|
37493 |
|
37494 | /**
|
37495 | * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
|
37496 | *
|
37497 | * @name feature
|
37498 | * @param {Geometry} geometry input geometry
|
37499 | * @param {Object} [properties={}] an Object of key-value pairs to add as properties
|
37500 | * @param {Array<number>} [bbox] BBox [west, south, east, north]
|
37501 | * @param {string|number} [id] Identifier
|
37502 | * @returns {Feature} a GeoJSON Feature
|
37503 | * @example
|
37504 | * var geometry = {
|
37505 | * "type": "Point",
|
37506 | * "coordinates": [110, 50]
|
37507 | * };
|
37508 | *
|
37509 | * var feature = turf.feature(geometry);
|
37510 | *
|
37511 | * //=feature
|
37512 | */
|
37513 | function feature$1(geometry, properties, bbox, id) {
|
37514 | if (geometry === undefined) throw new Error('geometry is required');
|
37515 | if (properties && properties.constructor !== Object) throw new Error('properties must be an Object');
|
37516 | if (bbox && bbox.length !== 4) throw new Error('bbox must be an Array of 4 numbers');
|
37517 | if (id && ['string', 'number'].indexOf(typeof id) === -1) throw new Error('id must be a number or a string');
|
37518 |
|
37519 | var feat = {type: 'Feature'};
|
37520 | if (id) feat.id = id;
|
37521 | if (bbox) feat.bbox = bbox;
|
37522 | feat.properties = properties || {};
|
37523 | feat.geometry = geometry;
|
37524 | return feat;
|
37525 | }
|
37526 |
|
37527 | /**
|
37528 | * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
|
37529 | * For GeometryCollection type use `helpers.geometryCollection`
|
37530 | *
|
37531 | * @name geometry
|
37532 | * @param {string} type Geometry Type
|
37533 | * @param {Array<number>} coordinates Coordinates
|
37534 | * @param {Array<number>} [bbox] BBox [west, south, east, north]
|
37535 | * @returns {Geometry} a GeoJSON Geometry
|
37536 | * @example
|
37537 | * var type = 'Point';
|
37538 | * var coordinates = [110, 50];
|
37539 | *
|
37540 | * var geometry = turf.geometry(type, coordinates);
|
37541 | *
|
37542 | * //=geometry
|
37543 | */
|
37544 | function geometry(type, coordinates, bbox) {
|
37545 | // Validation
|
37546 | if (!type) throw new Error('type is required');
|
37547 | if (!coordinates) throw new Error('coordinates is required');
|
37548 | if (!Array.isArray(coordinates)) throw new Error('coordinates must be an Array');
|
37549 | if (bbox && bbox.length !== 4) throw new Error('bbox must be an Array of 4 numbers');
|
37550 |
|
37551 | var geom;
|
37552 | switch (type) {
|
37553 | case 'Point': geom = point$1(coordinates).geometry; break;
|
37554 | case 'LineString': geom = lineString$1(coordinates).geometry; break;
|
37555 | case 'Polygon': geom = polygon$2(coordinates).geometry; break;
|
37556 | case 'MultiPoint': geom = multiPoint$1(coordinates).geometry; break;
|
37557 | case 'MultiLineString': geom = multiLineString$1(coordinates).geometry; break;
|
37558 | case 'MultiPolygon': geom = multiPolygon$1(coordinates).geometry; break;
|
37559 | default: throw new Error(type + ' is invalid');
|
37560 | }
|
37561 | if (bbox) geom.bbox = bbox;
|
37562 | return geom;
|
37563 | }
|
37564 |
|
37565 | /**
|
37566 | * Takes coordinates and properties (optional) and returns a new {@link Point} feature.
|
37567 | *
|
37568 | * @name point
|
37569 | * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
|
37570 | * @param {Object} [properties={}] an Object of key-value pairs to add as properties
|
37571 | * @param {Array<number>} [bbox] BBox [west, south, east, north]
|
37572 | * @param {string|number} [id] Identifier
|
37573 | * @returns {Feature<Point>} a Point feature
|
37574 | * @example
|
37575 | * var point = turf.point([-75.343, 39.984]);
|
37576 | *
|
37577 | * //=point
|
37578 | */
|
37579 | function point$1(coordinates, properties, bbox, id) {
|
37580 | if (!coordinates) throw new Error('No coordinates passed');
|
37581 | if (coordinates.length === undefined) throw new Error('Coordinates must be an array');
|
37582 | if (coordinates.length < 2) throw new Error('Coordinates must be at least 2 numbers long');
|
37583 | if (!isNumber$1(coordinates[0]) || !isNumber$1(coordinates[1])) throw new Error('Coordinates must contain numbers');
|
37584 |
|
37585 | return feature$1({
|
37586 | type: 'Point',
|
37587 | coordinates: coordinates
|
37588 | }, properties, bbox, id);
|
37589 | }
|
37590 |
|
37591 | /**
|
37592 | * Takes an array of LinearRings and optionally an {@link Object} with properties and returns a {@link Polygon} feature.
|
37593 | *
|
37594 | * @name polygon
|
37595 | * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
|
37596 | * @param {Object} [properties={}] an Object of key-value pairs to add as properties
|
37597 | * @param {Array<number>} [bbox] BBox [west, south, east, north]
|
37598 | * @param {string|number} [id] Identifier
|
37599 | * @returns {Feature<Polygon>} a Polygon feature
|
37600 | * @throws {Error} throw an error if a LinearRing of the polygon has too few positions
|
37601 | * or if a LinearRing of the Polygon does not have matching Positions at the beginning & end.
|
37602 | * @example
|
37603 | * var polygon = turf.polygon([[
|
37604 | * [-2.275543, 53.464547],
|
37605 | * [-2.275543, 53.489271],
|
37606 | * [-2.215118, 53.489271],
|
37607 | * [-2.215118, 53.464547],
|
37608 | * [-2.275543, 53.464547]
|
37609 | * ]], { name: 'poly1', population: 400});
|
37610 | *
|
37611 | * //=polygon
|
37612 | */
|
37613 | function polygon$2(coordinates, properties, bbox, id) {
|
37614 | if (!coordinates) throw new Error('No coordinates passed');
|
37615 |
|
37616 | for (var i = 0; i < coordinates.length; i++) {
|
37617 | var ring = coordinates[i];
|
37618 | if (ring.length < 4) {
|
37619 | throw new Error('Each LinearRing of a Polygon must have 4 or more Positions.');
|
37620 | }
|
37621 | for (var j = 0; j < ring[ring.length - 1].length; j++) {
|
37622 | // Check if first point of Polygon contains two numbers
|
37623 | if (i === 0 && j === 0 && !isNumber$1(ring[0][0]) || !isNumber$1(ring[0][1])) throw new Error('Coordinates must contain numbers');
|
37624 | if (ring[ring.length - 1][j] !== ring[0][j]) {
|
37625 | throw new Error('First and last Position are not equivalent.');
|
37626 | }
|
37627 | }
|
37628 | }
|
37629 |
|
37630 | return feature$1({
|
37631 | type: 'Polygon',
|
37632 | coordinates: coordinates
|
37633 | }, properties, bbox, id);
|
37634 | }
|
37635 |
|
37636 | /**
|
37637 | * Creates a {@link LineString} based on a
|
37638 | * coordinate array. Properties can be added optionally.
|
37639 | *
|
37640 | * @name lineString
|
37641 | * @param {Array<Array<number>>} coordinates an array of Positions
|
37642 | * @param {Object} [properties={}] an Object of key-value pairs to add as properties
|
37643 | * @param {Array<number>} [bbox] BBox [west, south, east, north]
|
37644 | * @param {string|number} [id] Identifier
|
37645 | * @returns {Feature<LineString>} a LineString feature
|
37646 | * @throws {Error} if no coordinates are passed
|
37647 | * @example
|
37648 | * var linestring1 = turf.lineString([
|
37649 | * [-21.964416, 64.148203],
|
37650 | * [-21.956176, 64.141316],
|
37651 | * [-21.93901, 64.135924],
|
37652 | * [-21.927337, 64.136673]
|
37653 | * ]);
|
37654 | * var linestring2 = turf.lineString([
|
37655 | * [-21.929054, 64.127985],
|
37656 | * [-21.912918, 64.134726],
|
37657 | * [-21.916007, 64.141016],
|
37658 | * [-21.930084, 64.14446]
|
37659 | * ], {name: 'line 1', distance: 145});
|
37660 | *
|
37661 | * //=linestring1
|
37662 | *
|
37663 | * //=linestring2
|
37664 | */
|
37665 | function lineString$1(coordinates, properties, bbox, id) {
|
37666 | if (!coordinates) throw new Error('No coordinates passed');
|
37667 | if (coordinates.length < 2) throw new Error('Coordinates must be an array of two or more positions');
|
37668 | // Check if first point of LineString contains two numbers
|
37669 | if (!isNumber$1(coordinates[0][1]) || !isNumber$1(coordinates[0][1])) throw new Error('Coordinates must contain numbers');
|
37670 |
|
37671 | return feature$1({
|
37672 | type: 'LineString',
|
37673 | coordinates: coordinates
|
37674 | }, properties, bbox, id);
|
37675 | }
|
37676 |
|
37677 | /**
|
37678 | * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
|
37679 | *
|
37680 | * @name featureCollection
|
37681 | * @param {Feature[]} features input features
|
37682 | * @param {Array<number>} [bbox] BBox [west, south, east, north]
|
37683 | * @param {string|number} [id] Identifier
|
37684 | * @returns {FeatureCollection} a FeatureCollection of input features
|
37685 | * @example
|
37686 | * var features = [
|
37687 | * turf.point([-75.343, 39.984], {name: 'Location A'}),
|
37688 | * turf.point([-75.833, 39.284], {name: 'Location B'}),
|
37689 | * turf.point([-75.534, 39.123], {name: 'Location C'})
|
37690 | * ];
|
37691 | *
|
37692 | * var collection = turf.featureCollection(features);
|
37693 | *
|
37694 | * //=collection
|
37695 | */
|
37696 | function featureCollection$3(features, bbox, id) {
|
37697 | if (!features) throw new Error('No features passed');
|
37698 | if (!Array.isArray(features)) throw new Error('features must be an Array');
|
37699 | if (bbox && bbox.length !== 4) throw new Error('bbox must be an Array of 4 numbers');
|
37700 | if (id && ['string', 'number'].indexOf(typeof id) === -1) throw new Error('id must be a number or a string');
|
37701 |
|
37702 | var fc = {type: 'FeatureCollection'};
|
37703 | if (id) fc.id = id;
|
37704 | if (bbox) fc.bbox = bbox;
|
37705 | fc.features = features;
|
37706 | return fc;
|
37707 | }
|
37708 |
|
37709 | /**
|
37710 | * Creates a {@link Feature<MultiLineString>} based on a
|
37711 | * coordinate array. Properties can be added optionally.
|
37712 | *
|
37713 | * @name multiLineString
|
37714 | * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
|
37715 | * @param {Object} [properties={}] an Object of key-value pairs to add as properties
|
37716 | * @param {Array<number>} [bbox] BBox [west, south, east, north]
|
37717 | * @param {string|number} [id] Identifier
|
37718 | * @returns {Feature<MultiLineString>} a MultiLineString feature
|
37719 | * @throws {Error} if no coordinates are passed
|
37720 | * @example
|
37721 | * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
|
37722 | *
|
37723 | * //=multiLine
|
37724 | */
|
37725 | function multiLineString$1(coordinates, properties, bbox, id) {
|
37726 | if (!coordinates) throw new Error('No coordinates passed');
|
37727 |
|
37728 | return feature$1({
|
37729 | type: 'MultiLineString',
|
37730 | coordinates: coordinates
|
37731 | }, properties, bbox, id);
|
37732 | }
|
37733 |
|
37734 | /**
|
37735 | * Creates a {@link Feature<MultiPoint>} based on a
|
37736 | * coordinate array. Properties can be added optionally.
|
37737 | *
|
37738 | * @name multiPoint
|
37739 | * @param {Array<Array<number>>} coordinates an array of Positions
|
37740 | * @param {Object} [properties={}] an Object of key-value pairs to add as properties
|
37741 | * @param {Array<number>} [bbox] BBox [west, south, east, north]
|
37742 | * @param {string|number} [id] Identifier
|
37743 | * @returns {Feature<MultiPoint>} a MultiPoint feature
|
37744 | * @throws {Error} if no coordinates are passed
|
37745 | * @example
|
37746 | * var multiPt = turf.multiPoint([[0,0],[10,10]]);
|
37747 | *
|
37748 | * //=multiPt
|
37749 | */
|
37750 | function multiPoint$1(coordinates, properties, bbox, id) {
|
37751 | if (!coordinates) throw new Error('No coordinates passed');
|
37752 |
|
37753 | return feature$1({
|
37754 | type: 'MultiPoint',
|
37755 | coordinates: coordinates
|
37756 | }, properties, bbox, id);
|
37757 | }
|
37758 |
|
37759 | /**
|
37760 | * Creates a {@link Feature<MultiPolygon>} based on a
|
37761 | * coordinate array. Properties can be added optionally.
|
37762 | *
|
37763 | * @name multiPolygon
|
37764 | * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
|
37765 | * @param {Object} [properties={}] an Object of key-value pairs to add as properties
|
37766 | * @param {Array<number>} [bbox] BBox [west, south, east, north]
|
37767 | * @param {string|number} [id] Identifier
|
37768 | * @returns {Feature<MultiPolygon>} a multipolygon feature
|
37769 | * @throws {Error} if no coordinates are passed
|
37770 | * @example
|
37771 | * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
|
37772 | *
|
37773 | * //=multiPoly
|
37774 | *
|
37775 | */
|
37776 | function multiPolygon$1(coordinates, properties, bbox, id) {
|
37777 | if (!coordinates) throw new Error('No coordinates passed');
|
37778 |
|
37779 | return feature$1({
|
37780 | type: 'MultiPolygon',
|
37781 | coordinates: coordinates
|
37782 | }, properties, bbox, id);
|
37783 | }
|
37784 |
|
37785 | /**
|
37786 | * Creates a {@link Feature<GeometryCollection>} based on a
|
37787 | * coordinate array. Properties can be added optionally.
|
37788 | *
|
37789 | * @name geometryCollection
|
37790 | * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
|
37791 | * @param {Object} [properties={}] an Object of key-value pairs to add as properties
|
37792 | * @param {Array<number>} [bbox] BBox [west, south, east, north]
|
37793 | * @param {string|number} [id] Identifier
|
37794 | * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
|
37795 | * @example
|
37796 | * var pt = {
|
37797 | * "type": "Point",
|
37798 | * "coordinates": [100, 0]
|
37799 | * };
|
37800 | * var line = {
|
37801 | * "type": "LineString",
|
37802 | * "coordinates": [ [101, 0], [102, 1] ]
|
37803 | * };
|
37804 | * var collection = turf.geometryCollection([pt, line]);
|
37805 | *
|
37806 | * //=collection
|
37807 | */
|
37808 | function geometryCollection$1(geometries, properties, bbox, id) {
|
37809 | if (!geometries) throw new Error('geometries is required');
|
37810 | if (!Array.isArray(geometries)) throw new Error('geometries must be an Array');
|
37811 |
|
37812 | return feature$1({
|
37813 | type: 'GeometryCollection',
|
37814 | geometries: geometries
|
37815 | }, properties, bbox, id);
|
37816 | }
|
37817 |
|
37818 | // https://en.wikipedia.org/wiki/Great-circle_distance#Radius_for_spherical_Earth
|
37819 | var factors$1 = {
|
37820 | miles: 3960,
|
37821 | nauticalmiles: 3441.145,
|
37822 | degrees: 57.2957795,
|
37823 | radians: 1,
|
37824 | inches: 250905600,
|
37825 | yards: 6969600,
|
37826 | meters: 6373000,
|
37827 | metres: 6373000,
|
37828 | centimeters: 6.373e+8,
|
37829 | centimetres: 6.373e+8,
|
37830 | kilometers: 6373,
|
37831 | kilometres: 6373,
|
37832 | feet: 20908792.65
|
37833 | };
|
37834 |
|
37835 | var areaFactors = {
|
37836 | kilometers: 0.000001,
|
37837 | kilometres: 0.000001,
|
37838 | meters: 1,
|
37839 | metres: 1,
|
37840 | centimetres: 10000,
|
37841 | millimeter: 1000000,
|
37842 | acres: 0.000247105,
|
37843 | miles: 3.86e-7,
|
37844 | yards: 1.195990046,
|
37845 | feet: 10.763910417,
|
37846 | inches: 1550.003100006
|
37847 | };
|
37848 | /**
|
37849 | * Round number to precision
|
37850 | *
|
37851 | * @param {number} num Number
|
37852 | * @param {number} [precision=0] Precision
|
37853 | * @returns {number} rounded number
|
37854 | * @example
|
37855 | * turf.round(120.4321)
|
37856 | * //=120
|
37857 | *
|
37858 | * turf.round(120.4321, 2)
|
37859 | * //=120.43
|
37860 | */
|
37861 | function round(num, precision) {
|
37862 | if (num === undefined || num === null || isNaN(num)) throw new Error('num is required');
|
37863 | if (precision && !(precision >= 0)) throw new Error('precision must be a positive number');
|
37864 | var multiplier = Math.pow(10, precision || 0);
|
37865 | return Math.round(num * multiplier) / multiplier;
|
37866 | }
|
37867 |
|
37868 | /**
|
37869 | * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
|
37870 | * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
|
37871 | *
|
37872 | * @name radiansToDistance
|
37873 | * @param {number} radians in radians across the sphere
|
37874 | * @param {string} [units=kilometers] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
|
37875 | * @returns {number} distance
|
37876 | */
|
37877 | function radiansToDistance$1(radians, units) {
|
37878 | if (radians === undefined || radians === null) throw new Error('radians is required');
|
37879 |
|
37880 | var factor = factors$1[units || 'kilometers'];
|
37881 | if (!factor) throw new Error('units is invalid');
|
37882 | return radians * factor;
|
37883 | }
|
37884 |
|
37885 | /**
|
37886 | * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
|
37887 | * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
|
37888 | *
|
37889 | * @name distanceToRadians
|
37890 | * @param {number} distance in real units
|
37891 | * @param {string} [units=kilometers] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
|
37892 | * @returns {number} radians
|
37893 | */
|
37894 | function distanceToRadians$1(distance, units) {
|
37895 | if (distance === undefined || distance === null) throw new Error('distance is required');
|
37896 |
|
37897 | var factor = factors$1[units || 'kilometers'];
|
37898 | if (!factor) throw new Error('units is invalid');
|
37899 | return distance / factor;
|
37900 | }
|
37901 |
|
37902 | /**
|
37903 | * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
|
37904 | * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
|
37905 | *
|
37906 | * @name distanceToDegrees
|
37907 | * @param {number} distance in real units
|
37908 | * @param {string} [units=kilometers] can be degrees, radians, miles, or kilometers inches, yards, metres, meters, kilometres, kilometers.
|
37909 | * @returns {number} degrees
|
37910 | */
|
37911 | function distanceToDegrees$1(distance, units) {
|
37912 | return radians2degrees(distanceToRadians$1(distance, units));
|
37913 | }
|
37914 |
|
37915 | /**
|
37916 | * Converts any bearing angle from the north line direction (positive clockwise)
|
37917 | * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
|
37918 | *
|
37919 | * @name bearingToAngle
|
37920 | * @param {number} bearing angle, between -180 and +180 degrees
|
37921 | * @returns {number} angle between 0 and 360 degrees
|
37922 | */
|
37923 | function bearingToAngle(bearing) {
|
37924 | if (bearing === null || bearing === undefined) throw new Error('bearing is required');
|
37925 |
|
37926 | var angle = bearing % 360;
|
37927 | if (angle < 0) angle += 360;
|
37928 | return angle;
|
37929 | }
|
37930 |
|
37931 | /**
|
37932 | * Converts an angle in radians to degrees
|
37933 | *
|
37934 | * @name radians2degrees
|
37935 | * @param {number} radians angle in radians
|
37936 | * @returns {number} degrees between 0 and 360 degrees
|
37937 | */
|
37938 | function radians2degrees(radians) {
|
37939 | if (radians === null || radians === undefined) throw new Error('radians is required');
|
37940 |
|
37941 | var degrees = radians % (2 * Math.PI);
|
37942 | return degrees * 180 / Math.PI;
|
37943 | }
|
37944 |
|
37945 | /**
|
37946 | * Converts an angle in degrees to radians
|
37947 | *
|
37948 | * @name degrees2radians
|
37949 | * @param {number} degrees angle between 0 and 360 degrees
|
37950 | * @returns {number} angle in radians
|
37951 | */
|
37952 | function degrees2radians(degrees) {
|
37953 | if (degrees === null || degrees === undefined) throw new Error('degrees is required');
|
37954 |
|
37955 | var radians = degrees % 360;
|
37956 | return radians * Math.PI / 180;
|
37957 | }
|
37958 |
|
37959 |
|
37960 | /**
|
37961 | * Converts a distance to the requested unit.
|
37962 | * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
|
37963 | *
|
37964 | * @param {number} distance to be converted
|
37965 | * @param {string} originalUnit of the distance
|
37966 | * @param {string} [finalUnit=kilometers] returned unit
|
37967 | * @returns {number} the converted distance
|
37968 | */
|
37969 | function convertDistance(distance, originalUnit, finalUnit) {
|
37970 | if (distance === null || distance === undefined) throw new Error('distance is required');
|
37971 | if (!(distance >= 0)) throw new Error('distance must be a positive number');
|
37972 |
|
37973 | var convertedDistance = radiansToDistance$1(distanceToRadians$1(distance, originalUnit), finalUnit || 'kilometers');
|
37974 | return convertedDistance;
|
37975 | }
|
37976 |
|
37977 | /**
|
37978 | * Converts a area to the requested unit.
|
37979 | * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeter, acre, mile, yard, foot, inch
|
37980 | * @param {number} area to be converted
|
37981 | * @param {string} [originalUnit=meters] of the distance
|
37982 | * @param {string} [finalUnit=kilometers] returned unit
|
37983 | * @returns {number} the converted distance
|
37984 | */
|
37985 | function convertArea(area, originalUnit, finalUnit) {
|
37986 | if (area === null || area === undefined) throw new Error('area is required');
|
37987 | if (!(area >= 0)) throw new Error('area must be a positive number');
|
37988 |
|
37989 | var startFactor = areaFactors[originalUnit || 'meters'];
|
37990 | if (!startFactor) throw new Error('invalid original units');
|
37991 |
|
37992 | var finalFactor = areaFactors[finalUnit || 'kilometers'];
|
37993 | if (!finalFactor) throw new Error('invalid final units');
|
37994 |
|
37995 | return (area / startFactor) * finalFactor;
|
37996 | }
|
37997 |
|
37998 | /**
|
37999 | * isNumber
|
38000 | *
|
38001 | * @param {*} num Number to validate
|
38002 | * @returns {boolean} true/false
|
38003 | * @example
|
38004 | * turf.isNumber(123)
|
38005 | * //=true
|
38006 | * turf.isNumber('foo')
|
38007 | * //=false
|
38008 | */
|
38009 | function isNumber$1(num) {
|
38010 | return !isNaN(num) && num !== null && !Array.isArray(num);
|
38011 | }
|
38012 |
|
38013 | var helpers$2 = {
|
38014 | feature: feature$1,
|
38015 | geometry: geometry,
|
38016 | featureCollection: featureCollection$3,
|
38017 | geometryCollection: geometryCollection$1,
|
38018 | point: point$1,
|
38019 | multiPoint: multiPoint$1,
|
38020 | lineString: lineString$1,
|
38021 | multiLineString: multiLineString$1,
|
38022 | polygon: polygon$2,
|
38023 | multiPolygon: multiPolygon$1,
|
38024 | radiansToDistance: radiansToDistance$1,
|
38025 | distanceToRadians: distanceToRadians$1,
|
38026 | distanceToDegrees: distanceToDegrees$1,
|
38027 | radians2degrees: radians2degrees,
|
38028 | degrees2radians: degrees2radians,
|
38029 | bearingToAngle: bearingToAngle,
|
38030 | convertDistance: convertDistance,
|
38031 | convertArea: convertArea,
|
38032 | round: round,
|
38033 | isNumber: isNumber$1
|
38034 | };
|
38035 |
|
38036 | var polygon$3 = helpers$2.polygon;
|
38037 |
|
38038 | /**
|
38039 | * Takes a bbox and returns an equivalent {@link Polygon|polygon}.
|
38040 | *
|
38041 | * @name bboxPolygon
|
38042 | * @param {Array<number>} bbox extent in [minX, minY, maxX, maxY] order
|
38043 | * @returns {Feature<Polygon>} a Polygon representation of the bounding box
|
38044 | * @example
|
38045 | * var bbox = [0, 0, 10, 10];
|
38046 | *
|
38047 | * var poly = turf.bboxPolygon(bbox);
|
38048 | *
|
38049 | * //addToMap
|
38050 | * var addToMap = [poly]
|
38051 | */
|
38052 | var bboxPolygon$2 = function (bbox) {
|
38053 | var lowLeft = [bbox[0], bbox[1]];
|
38054 | var topLeft = [bbox[0], bbox[3]];
|
38055 | var topRight = [bbox[2], bbox[3]];
|
38056 | var lowRight = [bbox[2], bbox[1]];
|
38057 |
|
38058 | return polygon$3([[
|
38059 | lowLeft,
|
38060 | lowRight,
|
38061 | topRight,
|
38062 | topLeft,
|
38063 | lowLeft
|
38064 | ]]);
|
38065 | };
|
38066 |
|
38067 | var featureCollection$2 = helpers$2.featureCollection;
|
38068 |
|
38069 | function getBounds(bbox) {
|
38070 | var left = +bbox.left,
|
38071 | right = +bbox.right,
|
38072 | top = +bbox.top,
|
38073 | bottom = +bbox.bottom;
|
38074 |
|
38075 | return new mapboxgl.LngLatBounds(new mapboxgl.LngLat(left, bottom), new mapboxgl.LngLat(right, top));
|
38076 | }
|
38077 |
|
38078 | function getBoundingBox(bounds) {
|
38079 | var left = bounds.getWest(),
|
38080 | right = bounds.getEast(),
|
38081 | top = bounds.getNorth(),
|
38082 | bottom = bounds.getSouth();
|
38083 |
|
38084 | var padX = 0;
|
38085 | var padY = 0;
|
38086 | if (!(left === -180 && right === 180 && top === 90 && bottom === -90)) {
|
38087 | padX = Math.max((right - left) / 5, 0.0001);
|
38088 | padY = Math.max((top - bottom) / 5, 0.0001);
|
38089 | }
|
38090 |
|
38091 | var bboxPolygon = bboxPolygon$2([left - padX, bottom - padY, right + padX, top + padY]);
|
38092 |
|
38093 | return featureCollection$2([bboxPolygon]);
|
38094 | }
|
38095 |
|
38096 | var classCallCheck = function (instance, Constructor) {
|
38097 | if (!(instance instanceof Constructor)) {
|
38098 | throw new TypeError("Cannot call a class as a function");
|
38099 | }
|
38100 | };
|
38101 |
|
38102 | var createClass$2 = function () {
|
38103 | function defineProperties(target, props) {
|
38104 | for (var i = 0; i < props.length; i++) {
|
38105 | var descriptor = props[i];
|
38106 | descriptor.enumerable = descriptor.enumerable || false;
|
38107 | descriptor.configurable = true;
|
38108 | if ("value" in descriptor) descriptor.writable = true;
|
38109 | Object.defineProperty(target, descriptor.key, descriptor);
|
38110 | }
|
38111 | }
|
38112 |
|
38113 | return function (Constructor, protoProps, staticProps) {
|
38114 | if (protoProps) defineProperties(Constructor.prototype, protoProps);
|
38115 | if (staticProps) defineProperties(Constructor, staticProps);
|
38116 | return Constructor;
|
38117 | };
|
38118 | }();
|
38119 |
|
38120 |
|
38121 |
|
38122 |
|
38123 |
|
38124 |
|
38125 |
|
38126 |
|
38127 |
|
38128 | var inherits$2 = function (subClass, superClass) {
|
38129 | if (typeof superClass !== "function" && superClass !== null) {
|
38130 | throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
|
38131 | }
|
38132 |
|
38133 | subClass.prototype = Object.create(superClass && superClass.prototype, {
|
38134 | constructor: {
|
38135 | value: subClass,
|
38136 | enumerable: false,
|
38137 | writable: true,
|
38138 | configurable: true
|
38139 | }
|
38140 | });
|
38141 | if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
|
38142 | };
|
38143 |
|
38144 |
|
38145 |
|
38146 |
|
38147 |
|
38148 |
|
38149 |
|
38150 |
|
38151 |
|
38152 |
|
38153 |
|
38154 | var possibleConstructorReturn = function (self, call) {
|
38155 | if (!self) {
|
38156 | throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
38157 | }
|
38158 |
|
38159 | return call && (typeof call === "object" || typeof call === "function") ? call : self;
|
38160 | };
|
38161 |
|
38162 |
|
38163 |
|
38164 |
|
38165 |
|
38166 | var slicedToArray = function () {
|
38167 | function sliceIterator(arr, i) {
|
38168 | var _arr = [];
|
38169 | var _n = true;
|
38170 | var _d = false;
|
38171 | var _e = undefined;
|
38172 |
|
38173 | try {
|
38174 | for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
|
38175 | _arr.push(_s.value);
|
38176 |
|
38177 | if (i && _arr.length === i) break;
|
38178 | }
|
38179 | } catch (err) {
|
38180 | _d = true;
|
38181 | _e = err;
|
38182 | } finally {
|
38183 | try {
|
38184 | if (!_n && _i["return"]) _i["return"]();
|
38185 | } finally {
|
38186 | if (_d) throw _e;
|
38187 | }
|
38188 | }
|
38189 |
|
38190 | return _arr;
|
38191 | }
|
38192 |
|
38193 | return function (arr, i) {
|
38194 | if (Array.isArray(arr)) {
|
38195 | return arr;
|
38196 | } else if (Symbol.iterator in Object(arr)) {
|
38197 | return sliceIterator(arr, i);
|
38198 | } else {
|
38199 | throw new TypeError("Invalid attempt to destructure non-iterable instance");
|
38200 | }
|
38201 | };
|
38202 | }();
|
38203 |
|
38204 | function getFeatures(features) {
|
38205 | var keys = Object.keys(features);
|
38206 | return keys.map(function (item) {
|
38207 | return features[item];
|
38208 | });
|
38209 | }
|
38210 |
|
38211 | function processFeatures(features) {
|
38212 | var finalReport = new Map();
|
38213 | var analyzedFeatures = features.map(function (feature) {
|
38214 | return analyzeFeature(feature[0], feature[1]);
|
38215 | });
|
38216 | var keys = ['addedTags', 'changedValues', 'deletedTags'];
|
38217 | analyzedFeatures.map(function (item) {
|
38218 | return keys.map(function (key) {
|
38219 | return item.get(key).forEach(function (tag) {
|
38220 | if (finalReport.get(tag)) {
|
38221 | finalReport.set(tag, finalReport.get(tag).concat([item.get('id')]));
|
38222 | } else {
|
38223 | finalReport.set(tag, [item.get('id')]);
|
38224 | }
|
38225 | });
|
38226 | });
|
38227 | });
|
38228 | return finalReport;
|
38229 | }
|
38230 |
|
38231 | function analyzeFeature(newVersion, oldVersion) {
|
38232 | var oldVersionKeys = Object.keys(oldVersion.properties.tags);
|
38233 | var newVersionKeys = Object.keys(newVersion.properties.tags);
|
38234 | var addedTags = newVersionKeys.filter(function (tag) {
|
38235 | return oldVersionKeys.indexOf(tag) === -1;
|
38236 | });
|
38237 | var deletedTags = oldVersionKeys.filter(function (tag) {
|
38238 | return newVersionKeys.indexOf(tag) === -1;
|
38239 | });
|
38240 | var changedValues = newVersionKeys.filter(function (tag) {
|
38241 | return addedTags.indexOf(tag) === -1 && deletedTags.indexOf(tag) === -1;
|
38242 | }).filter(function (tag) {
|
38243 | return newVersion.properties.tags[tag] !== oldVersion.properties.tags[tag];
|
38244 | });
|
38245 | var result = new Map();
|
38246 | result.set('id', newVersion.properties.id).set('addedTags', addedTags.map(function (tag) {
|
38247 | return 'Added tag ' + tag;
|
38248 | })).set('deletedTags', deletedTags.map(function (tag) {
|
38249 | return 'Deleted tag ' + tag;
|
38250 | })).set('changedValues', changedValues.map(function (tag) {
|
38251 | return 'Changed value of tag ' + tag;
|
38252 | }));
|
38253 | return result;
|
38254 | }
|
38255 |
|
38256 | function selectFeature(id) {
|
38257 | if (!id || !cmap) return;
|
38258 | cmap.emit('selectFeature', 'node|way', id);
|
38259 | }
|
38260 |
|
38261 | function FeatureListItem(props) {
|
38262 | return react.createElement(
|
38263 | 'li',
|
38264 | null,
|
38265 | react.createElement(
|
38266 | 'span',
|
38267 | { className: 'cmap-pointer ', onClick: function onClick() {
|
38268 | return selectFeature(props.id);
|
38269 | } },
|
38270 | props.id
|
38271 | )
|
38272 | );
|
38273 | }
|
38274 |
|
38275 | var ChangeItem = function (_React$PureComponent) {
|
38276 | inherits$2(ChangeItem, _React$PureComponent);
|
38277 |
|
38278 | function ChangeItem(props) {
|
38279 | classCallCheck(this, ChangeItem);
|
38280 |
|
38281 | var _this = possibleConstructorReturn(this, (ChangeItem.__proto__ || Object.getPrototypeOf(ChangeItem)).call(this, props));
|
38282 |
|
38283 | _this.state = {
|
38284 | opened: false
|
38285 | };
|
38286 | _this.tag = props.change[0];
|
38287 | _this.value = props.change[1];
|
38288 | _this.handleChange = _this.handleChange.bind(_this);
|
38289 | return _this;
|
38290 | }
|
38291 |
|
38292 | createClass$2(ChangeItem, [{
|
38293 | key: 'handleChange',
|
38294 | value: function handleChange() {
|
38295 | this.setState({ opened: !this.state.opened });
|
38296 | }
|
38297 | }, {
|
38298 | key: 'render',
|
38299 | value: function render$$1() {
|
38300 | return react.createElement(
|
38301 | 'div',
|
38302 | null,
|
38303 | react.createElement(
|
38304 | 'h7',
|
38305 | {
|
38306 | className: 'cmap-sub-heading cmap-pointer',
|
38307 | onClick: this.handleChange
|
38308 | },
|
38309 | this.state.opened ? '▼' : '▶',
|
38310 | this.tag
|
38311 | ),
|
38312 | react.createElement(
|
38313 | 'ul',
|
38314 | {
|
38315 | className: 'cmap-vlist',
|
38316 | style: {
|
38317 | display: this.state.opened ? 'block' : 'none'
|
38318 | }
|
38319 | },
|
38320 | this.value.map(function (id, k) {
|
38321 | return react.createElement(FeatureListItem, { id: id, key: k });
|
38322 | })
|
38323 | )
|
38324 | );
|
38325 | }
|
38326 | }]);
|
38327 | return ChangeItem;
|
38328 | }(react.PureComponent);
|
38329 |
|
38330 | var Sidebar = function (_React$PureComponent2) {
|
38331 | inherits$2(Sidebar, _React$PureComponent2);
|
38332 |
|
38333 | function Sidebar(props) {
|
38334 | classCallCheck(this, Sidebar);
|
38335 |
|
38336 | var _this2 = possibleConstructorReturn(this, (Sidebar.__proto__ || Object.getPrototypeOf(Sidebar)).call(this, props));
|
38337 |
|
38338 | _this2.state = {
|
38339 | actions: true,
|
38340 | type: false,
|
38341 | changes: false,
|
38342 | mapStyle: false,
|
38343 | user: false
|
38344 | };
|
38345 | _this2.changeReport = [];
|
38346 | _this2.changedFeatures = processFeatures(getFeatures(_this2.props.result.featureMap).filter(function (item) {
|
38347 | return item.length === 2 && item[0].properties.action === 'modify';
|
38348 | })).forEach(function (featureIDs, tag) {
|
38349 | return _this2.changeReport.push([tag, featureIDs]);
|
38350 | });
|
38351 |
|
38352 | _this2.toggleUser = _this2.toggleUser.bind(_this2);
|
38353 | _this2.toggleActions = _this2.toggleActions.bind(_this2);
|
38354 | _this2.toggleType = _this2.toggleType.bind(_this2);
|
38355 | _this2.toggleChanges = _this2.toggleChanges.bind(_this2);
|
38356 | _this2.toggleMapStyle = _this2.toggleMapStyle.bind(_this2);
|
38357 | return _this2;
|
38358 | }
|
38359 |
|
38360 | createClass$2(Sidebar, [{
|
38361 | key: 'toggleUser',
|
38362 | value: function toggleUser() {
|
38363 | this.setState({
|
38364 | user: !this.state.user
|
38365 | });
|
38366 | }
|
38367 | }, {
|
38368 | key: 'toggleActions',
|
38369 | value: function toggleActions() {
|
38370 | this.setState({
|
38371 | actions: !this.state.actions
|
38372 | });
|
38373 | }
|
38374 | }, {
|
38375 | key: 'toggleType',
|
38376 | value: function toggleType() {
|
38377 | this.setState({
|
38378 | type: !this.state.type
|
38379 | });
|
38380 | }
|
38381 | }, {
|
38382 | key: 'toggleChanges',
|
38383 | value: function toggleChanges() {
|
38384 | this.setState({
|
38385 | changes: !this.state.changes
|
38386 | });
|
38387 | }
|
38388 | }, {
|
38389 | key: 'toggleMapStyle',
|
38390 | value: function toggleMapStyle() {
|
38391 | this.setState({
|
38392 | mapStyle: !this.state.mapStyle
|
38393 | });
|
38394 | }
|
38395 | }, {
|
38396 | key: 'render',
|
38397 | value: function render$$1() {
|
38398 | var result = this.props.result;
|
38399 | var changesetId = this.props.changesetId;
|
38400 | var filterLayers = this.props.filterLayers;
|
38401 | var date = new Date(result.changeset.to ? result.changeset.to : result.changeset.from);
|
38402 |
|
38403 | var bbox = result.changeset.bbox;
|
38404 | var bounds = getBounds(bbox);
|
38405 | var center = bounds.getCenter();
|
38406 | var userName = result.changeset.user;
|
38407 | var userId = result.changeset.uid;
|
38408 | return react.createElement(
|
38409 | 'div',
|
38410 | { className: 'cmap-sidebar' },
|
38411 | react.createElement(
|
38412 | 'section',
|
38413 | { className: 'cmap-changeset-section cmap-fill-light cmap-pt3' },
|
38414 | react.createElement(
|
38415 | 'h6',
|
38416 | { className: 'cmap-heading' },
|
38417 | 'Changeset:',
|
38418 | react.createElement(
|
38419 | 'em',
|
38420 | { className: 'cmap-changeset-id' },
|
38421 | changesetId
|
38422 | ),
|
38423 | react.createElement(
|
38424 | 'small',
|
38425 | { className: 'cmap-time', title: date },
|
38426 | '(',
|
38427 | moment(date).fromNow(),
|
38428 | ')'
|
38429 | )
|
38430 | ),
|
38431 | react.createElement(
|
38432 | 'ul',
|
38433 | { className: 'cmap-hlist' },
|
38434 | react.createElement(
|
38435 | 'li',
|
38436 | null,
|
38437 | react.createElement(
|
38438 | 'a',
|
38439 | {
|
38440 | target: '_blank',
|
38441 | className: 'cmap-hlist-item cmap-noselect cmap-pointer cmap-c-link-osm',
|
38442 | href: 'https://openstreetmap.org/changeset/' + changesetId
|
38443 | },
|
38444 | 'OSM'
|
38445 | )
|
38446 | ),
|
38447 | react.createElement(
|
38448 | 'li',
|
38449 | null,
|
38450 | react.createElement(
|
38451 | 'a',
|
38452 | {
|
38453 | target: '_blank',
|
38454 | className: 'cmap-hlist-item cmap-noselect cmap-pointer cmap-c-link-osmcha',
|
38455 | href: 'https://osmcha.mapbox.com/' + changesetId + '/'
|
38456 | },
|
38457 | 'OSMCha'
|
38458 | )
|
38459 | ),
|
38460 | react.createElement(
|
38461 | 'li',
|
38462 | null,
|
38463 | react.createElement(
|
38464 | 'a',
|
38465 | {
|
38466 | target: '_blank',
|
38467 | className: 'cmap-hlist-item cmap-noselect cmap-pointer cmap-c-link-achavi',
|
38468 | href: 'https://overpass-api.de/achavi/?changeset=' + changesetId
|
38469 | },
|
38470 | 'Achavi'
|
38471 | )
|
38472 | ),
|
38473 | react.createElement(
|
38474 | 'li',
|
38475 | null,
|
38476 | react.createElement(
|
38477 | 'a',
|
38478 | {
|
38479 | target: '_blank',
|
38480 | className: 'cmap-hlist-item cmap-noselect cmap-pointer cmap-c-link-osmhv',
|
38481 | href: 'http://osmhv.openstreetmap.de/changeset.jsp?id=' + changesetId
|
38482 | },
|
38483 | 'OSM HV'
|
38484 | )
|
38485 | ),
|
38486 | react.createElement(
|
38487 | 'li',
|
38488 | null,
|
38489 | react.createElement(
|
38490 | 'a',
|
38491 | {
|
38492 | target: '_blank',
|
38493 | className: 'cmap-hlist-item cmap-noselect cmap-pointer cmap-c-link-josm',
|
38494 | href: 'http://127.0.0.1:8111/import?url=http://www.openstreetmap.org/api/0.6/changeset/' + changesetId + '/download'
|
38495 | },
|
38496 | 'JOSM'
|
38497 | )
|
38498 | ),
|
38499 | react.createElement(
|
38500 | 'li',
|
38501 | null,
|
38502 | react.createElement(
|
38503 | 'a',
|
38504 | {
|
38505 | target: '_blank',
|
38506 | className: 'cmap-hlist-item cmap-noselect cmap-pointer cmap-c-link-id',
|
38507 | href: 'http://preview.ideditor.com/release#map=15/' + center.lat + '/' + center.lng
|
38508 | },
|
38509 | 'iD'
|
38510 | )
|
38511 | )
|
38512 | )
|
38513 | ),
|
38514 | react.createElement(
|
38515 | 'section',
|
38516 | { className: 'cmap-user-section cmap-fill-light cmap-pb3' },
|
38517 | react.createElement(
|
38518 | 'h6',
|
38519 | { className: 'cmap-heading', onClick: this.toggleUser },
|
38520 | this.state.user ? '▼' : '▶',
|
38521 | 'User: ',
|
38522 | react.createElement(
|
38523 | 'em',
|
38524 | { className: 'cmap-user-id' },
|
38525 | userName
|
38526 | )
|
38527 | ),
|
38528 | react.createElement(
|
38529 | 'ul',
|
38530 | {
|
38531 | className: 'cmap-hlist',
|
38532 | style: {
|
38533 | display: this.state.user ? 'block' : 'none'
|
38534 | }
|
38535 | },
|
38536 | react.createElement(
|
38537 | 'li',
|
38538 | null,
|
38539 | react.createElement(
|
38540 | 'a',
|
38541 | {
|
38542 | target: '_blank',
|
38543 | className: 'cmap-hlist-item cmap-noselect cmap-pointer cmap-u-link-osm',
|
38544 | href: 'https://openstreetmap.org/user/' + userName
|
38545 | },
|
38546 | 'OSM'
|
38547 | )
|
38548 | ),
|
38549 | react.createElement(
|
38550 | 'li',
|
38551 | null,
|
38552 | react.createElement(
|
38553 | 'a',
|
38554 | {
|
38555 | target: '_blank',
|
38556 | className: 'cmap-hlist-item cmap-noselect cmap-pointer cmap-u-link-hdyc',
|
38557 | href: 'http://hdyc.neis-one.org/?' + userName
|
38558 | },
|
38559 | 'HDYC'
|
38560 | )
|
38561 | ),
|
38562 | react.createElement(
|
38563 | 'li',
|
38564 | null,
|
38565 | react.createElement(
|
38566 | 'a',
|
38567 | {
|
38568 | target: '_blank',
|
38569 | className: 'cmap-hlist-item cmap-noselect cmap-pointer cmap-u-link-disc',
|
38570 | href: 'http://resultmaps.neis-one.org/osm-discussion-comments?uid=' + userId
|
38571 | },
|
38572 | 'Discussions'
|
38573 | )
|
38574 | ),
|
38575 | react.createElement(
|
38576 | 'li',
|
38577 | null,
|
38578 | react.createElement(
|
38579 | 'a',
|
38580 | {
|
38581 | target: '_blank',
|
38582 | className: 'cmap-hlist-item cmap-noselect cmap-pointer cmap-u-link-comm',
|
38583 | href: 'http://resultmaps.neis-one.org/osm-discussion-comments?uid=115894' + userId + '&commented'
|
38584 | },
|
38585 | 'Comments'
|
38586 | )
|
38587 | )
|
38588 | )
|
38589 | ),
|
38590 | react.createElement(
|
38591 | 'section',
|
38592 | { className: 'cmap-filter-action-section cmap-pt3' },
|
38593 | react.createElement(
|
38594 | 'h6',
|
38595 | { className: 'cmap-heading pointer', onClick: this.toggleActions },
|
38596 | this.state.actions ? '▼' : '▶',
|
38597 | 'Filter by actions'
|
38598 | ),
|
38599 | react.createElement(
|
38600 | 'ul',
|
38601 | {
|
38602 | style: {
|
38603 | display: this.state.actions ? 'block' : 'none'
|
38604 | },
|
38605 | className: 'cmap-hlist'
|
38606 | },
|
38607 | react.createElement(
|
38608 | 'li',
|
38609 | null,
|
38610 | react.createElement(
|
38611 | 'label',
|
38612 | { className: 'cmap-hlist-item cmap-noselect cmap-pointer' },
|
38613 | react.createElement('input', {
|
38614 | type: 'checkbox',
|
38615 | value: 'added',
|
38616 | defaultChecked: 'true',
|
38617 | id: 'cmap-layer-selector-added',
|
38618 | onChange: filterLayers
|
38619 | }),
|
38620 | react.createElement(
|
38621 | 'span',
|
38622 | { className: 'cmap-label-text' },
|
38623 | 'Added'
|
38624 | ),
|
38625 | react.createElement('span', { className: 'cmap-color-box cmap-color-added' })
|
38626 | )
|
38627 | ),
|
38628 | react.createElement(
|
38629 | 'li',
|
38630 | null,
|
38631 | react.createElement(
|
38632 | 'label',
|
38633 | { className: 'cmap-hlist-item cmap-noselect cmap-pointer' },
|
38634 | react.createElement('input', {
|
38635 | type: 'checkbox',
|
38636 | value: 'modified',
|
38637 | defaultChecked: 'true',
|
38638 | id: 'cmap-layer-selector-modified',
|
38639 | onChange: filterLayers
|
38640 | }),
|
38641 | react.createElement(
|
38642 | 'span',
|
38643 | { className: 'cmap-label-text' },
|
38644 | 'Modified'
|
38645 | ),
|
38646 | react.createElement('span', { className: 'cmap-color-box cmap-color-modified-old' }),
|
38647 | react.createElement(
|
38648 | 'span',
|
38649 | { className: 'cmap-unicode' },
|
38650 | '\u2192'
|
38651 | ),
|
38652 | react.createElement('span', { className: 'cmap-color-box cmap-color-modified-new' })
|
38653 | )
|
38654 | ),
|
38655 | react.createElement(
|
38656 | 'li',
|
38657 | null,
|
38658 | react.createElement(
|
38659 | 'label',
|
38660 | { className: 'cmap-hlist-item cmap-noselect cmap-pointer' },
|
38661 | react.createElement('input', {
|
38662 | type: 'checkbox',
|
38663 | value: 'deleted',
|
38664 | defaultChecked: 'true',
|
38665 | id: 'cmap-layer-selector-deleted',
|
38666 | onChange: filterLayers
|
38667 | }),
|
38668 | react.createElement(
|
38669 | 'span',
|
38670 | { className: 'cmap-label-text' },
|
38671 | 'Deleted'
|
38672 | ),
|
38673 | react.createElement('span', { className: 'cmap-color-box cmap-color-deleted' })
|
38674 | )
|
38675 | )
|
38676 | )
|
38677 | ),
|
38678 | react.createElement(
|
38679 | 'section',
|
38680 | { className: 'cmap-filter-type-section' },
|
38681 | react.createElement(
|
38682 | 'h6',
|
38683 | { className: 'cmap-heading pointer', onClick: this.toggleType },
|
38684 | this.state.type ? '▼' : '▶',
|
38685 | 'Filter by type'
|
38686 | ),
|
38687 | react.createElement(
|
38688 | 'ul',
|
38689 | {
|
38690 | className: 'cmap-hlist',
|
38691 | style: {
|
38692 | display: this.state.type ? 'block' : 'none'
|
38693 | }
|
38694 | },
|
38695 | react.createElement(
|
38696 | 'li',
|
38697 | null,
|
38698 | react.createElement(
|
38699 | 'label',
|
38700 | { className: 'cmap-hlist-item cmap-noselect cmap-pointer' },
|
38701 | react.createElement('input', {
|
38702 | type: 'checkbox',
|
38703 | value: 'nodes',
|
38704 | defaultChecked: 'true',
|
38705 | id: 'cmap-type-selector-nodes',
|
38706 | onClick: filterLayers
|
38707 | }),
|
38708 | react.createElement(
|
38709 | 'span',
|
38710 | { className: 'cmap-label-text' },
|
38711 | 'Nodes'
|
38712 | )
|
38713 | )
|
38714 | ),
|
38715 | react.createElement(
|
38716 | 'li',
|
38717 | null,
|
38718 | react.createElement(
|
38719 | 'label',
|
38720 | { className: 'cmap-hlist-item cmap-noselect cmap-pointer' },
|
38721 | react.createElement('input', {
|
38722 | type: 'checkbox',
|
38723 | value: 'ways',
|
38724 | defaultChecked: 'true',
|
38725 | id: 'cmap-type-selector-ways',
|
38726 | onChange: filterLayers
|
38727 | }),
|
38728 | react.createElement(
|
38729 | 'span',
|
38730 | { className: 'cmap-label-text' },
|
38731 | 'Ways'
|
38732 | )
|
38733 | )
|
38734 | ),
|
38735 | react.createElement(
|
38736 | 'li',
|
38737 | null,
|
38738 | react.createElement(
|
38739 | 'label',
|
38740 | { className: 'cmap-hlist-item cmap-noselect cmap-pointer' },
|
38741 | react.createElement('input', {
|
38742 | type: 'checkbox',
|
38743 | value: 'relations',
|
38744 | defaultChecked: 'true',
|
38745 | id: 'cmap-type-selector-relations',
|
38746 | onChange: filterLayers
|
38747 | }),
|
38748 | react.createElement(
|
38749 | 'span',
|
38750 | { className: 'cmap-label-text' },
|
38751 | 'Relations'
|
38752 | )
|
38753 | )
|
38754 | )
|
38755 | )
|
38756 | ),
|
38757 | react.createElement(
|
38758 | 'section',
|
38759 | { className: 'cmap-filter-changes-section cmap-pb3' },
|
38760 | react.createElement(
|
38761 | 'h6',
|
38762 | { className: 'cmap-heading pointer', onClick: this.toggleChanges },
|
38763 | this.state.changes ? '▼' : '▶',
|
38764 | 'Tags added / updated / deleted'
|
38765 | ),
|
38766 | react.createElement(
|
38767 | 'ul',
|
38768 | {
|
38769 | className: 'cmap-sub-hlist',
|
38770 | style: { display: this.state.changes ? 'block' : 'none' }
|
38771 | },
|
38772 | this.changeReport.sort().map(function (change, k) {
|
38773 | return react.createElement(ChangeItem, { key: k, change: change });
|
38774 | })
|
38775 | )
|
38776 | ),
|
38777 | react.createElement(
|
38778 | 'section',
|
38779 | { className: 'cmap-map-style-section cmap-pb3' },
|
38780 | react.createElement(
|
38781 | 'h6',
|
38782 | { className: 'cmap-heading pointer', onClick: this.toggleMapStyle },
|
38783 | this.state.mapStyle ? '▼' : '▶',
|
38784 | 'Map style'
|
38785 | ),
|
38786 | react.createElement(
|
38787 | 'ul',
|
38788 | {
|
38789 | className: 'cmap-hlist',
|
38790 | style: {
|
38791 | display: this.state.mapStyle ? 'block' : 'none'
|
38792 | }
|
38793 | },
|
38794 | react.createElement(
|
38795 | 'li',
|
38796 | null,
|
38797 | react.createElement(
|
38798 | 'label',
|
38799 | { className: 'cmap-hlist-item cmap-noselect cmap-pointer' },
|
38800 | react.createElement('input', {
|
38801 | type: 'radio',
|
38802 | value: 'satellite',
|
38803 | defaultChecked: 'true',
|
38804 | name: 'baselayer',
|
38805 | id: 'cmap-baselayer-satellite',
|
38806 | onChange: this.props.toggleLayer
|
38807 | }),
|
38808 | react.createElement(
|
38809 | 'span',
|
38810 | { className: 'cmap-label-text' },
|
38811 | 'Satellite'
|
38812 | )
|
38813 | )
|
38814 | ),
|
38815 | react.createElement(
|
38816 | 'li',
|
38817 | null,
|
38818 | react.createElement(
|
38819 | 'label',
|
38820 | { className: 'cmap-hlist-item cmap-noselect cmap-pointer' },
|
38821 | react.createElement('input', {
|
38822 | type: 'radio',
|
38823 | value: 'streets',
|
38824 | name: 'baselayer',
|
38825 | id: 'cmap-baselayer-streets',
|
38826 | onChange: this.props.toggleLayer
|
38827 | }),
|
38828 | react.createElement(
|
38829 | 'span',
|
38830 | { className: 'cmap-label-text' },
|
38831 | 'Streets'
|
38832 | )
|
38833 | )
|
38834 | ),
|
38835 | react.createElement(
|
38836 | 'li',
|
38837 | null,
|
38838 | react.createElement(
|
38839 | 'label',
|
38840 | { className: 'cmap-hlist-item cmap-noselect cmap-pointer' },
|
38841 | react.createElement('input', {
|
38842 | type: 'radio',
|
38843 | value: 'dark',
|
38844 | name: 'baselayer',
|
38845 | id: 'cmap-baselayer-dark',
|
38846 | onChange: this.props.toggleLayer
|
38847 | }),
|
38848 | react.createElement(
|
38849 | 'span',
|
38850 | { className: 'cmap-label-text' },
|
38851 | 'Dark'
|
38852 | )
|
38853 | )
|
38854 | )
|
38855 | )
|
38856 | )
|
38857 | );
|
38858 | }
|
38859 | }]);
|
38860 | return Sidebar;
|
38861 | }(react.PureComponent);
|
38862 |
|
38863 | function propsDiff(propsArray) {
|
38864 | // Edge case: features may be duplicated. See issue #122.
|
38865 | // If the changeType is `added` ignore the second feature.
|
38866 | if (propsArray.length === 1 || propsArray[0].changeType === 'added') {
|
38867 | var changeType = propsArray[0].changeType;
|
38868 | if (changeType === 'added') {
|
38869 | return getAdded(propsArray[0]);
|
38870 | } else {
|
38871 | throw new Error('only 1 element but neither added nor deleted');
|
38872 | }
|
38873 | } else {
|
38874 | var oldProps = getOld(propsArray);
|
38875 | var newProps = getNew(propsArray);
|
38876 | return getDiff(oldProps, newProps);
|
38877 | }
|
38878 | }
|
38879 |
|
38880 | function getDiff(oldProps, newProps) {
|
38881 | var ret = {};
|
38882 | for (var prop in newProps) {
|
38883 | ret[prop] = {};
|
38884 | if (!oldProps.hasOwnProperty(prop)) {
|
38885 | ret[prop]['added'] = newProps[prop];
|
38886 | } else {
|
38887 | var oldValue = oldProps[prop];
|
38888 | var newValue = newProps[prop];
|
38889 | if (oldValue === newValue) {
|
38890 | ret[prop]['unchanged'] = newValue;
|
38891 | } else {
|
38892 | ret[prop]['modifiedOld'] = oldValue;
|
38893 | ret[prop]['modifiedNew'] = newValue;
|
38894 | }
|
38895 | }
|
38896 | }
|
38897 | for (var oldProp in oldProps) {
|
38898 | if (!ret.hasOwnProperty(oldProp)) {
|
38899 | ret[oldProp] = {
|
38900 | deleted: oldProps[oldProp]
|
38901 | };
|
38902 | }
|
38903 | }
|
38904 | return ret;
|
38905 | }
|
38906 |
|
38907 | function getAdded(props) {
|
38908 | var ret = {};
|
38909 | for (var prop in props) {
|
38910 | ret[prop] = {
|
38911 | added: props[prop]
|
38912 | };
|
38913 | }
|
38914 | return ret;
|
38915 | }
|
38916 |
|
38917 | function getOld(propsArray) {
|
38918 | for (var i = 0; i < propsArray.length; i++) {
|
38919 | var changeType = propsArray[i].changeType;
|
38920 | if (changeType === 'modifiedOld' || changeType === 'deletedOld') {
|
38921 | return propsArray[i];
|
38922 | }
|
38923 | }
|
38924 | }
|
38925 |
|
38926 | function getNew(propsArray) {
|
38927 | for (var i = 0; i < propsArray.length; i++) {
|
38928 | var changeType = propsArray[i].changeType;
|
38929 | if (changeType === 'modifiedNew' || changeType === 'deletedNew') {
|
38930 | return propsArray[i];
|
38931 | }
|
38932 | }
|
38933 | }
|
38934 |
|
38935 | var Map$1 = function () {
|
38936 | function Map() {
|
38937 | classCallCheck(this, Map);
|
38938 |
|
38939 | this.map = null;
|
38940 | this.queue = [];
|
38941 | this.filterLayers = this.filterLayers.bind(this);
|
38942 | }
|
38943 |
|
38944 | createClass$2(Map, [{
|
38945 | key: 'filterLayers',
|
38946 | value: function filterLayers() {
|
38947 | var _this = this;
|
38948 |
|
38949 | var layersKey = {
|
38950 | 'added-line': { added: true, ways: true },
|
38951 | 'added-point-tagged': { added: true, nodes: true },
|
38952 | 'added-point-untagged': { added: true, nodes: true },
|
38953 | 'added-relation': { added: true, relations: true },
|
38954 | 'modified-old-line': { modified: true, ways: true },
|
38955 | 'modified-old-point-tagged': { modified: true, nodes: true },
|
38956 | 'modified-old-point-untagged': { modified: true, nodes: true },
|
38957 | 'modified-old-point-on-way': { modified: true, nodes: true },
|
38958 | 'modified-new-line': { modified: true, ways: true },
|
38959 | 'modified-old-relation': { modified: true, relations: true },
|
38960 | 'modified-new-point-tagged': { modified: true, nodes: true },
|
38961 | 'modified-new-point-untagged': { modified: true, nodes: true },
|
38962 | 'modified-new-point-on-way': { modified: true, nodes: true },
|
38963 | 'modified-new-relation': { modified: true, relations: true },
|
38964 | 'deleted-line': { deleted: true, ways: true },
|
38965 | 'deleted-point-tagged': { deleted: true, nodes: true },
|
38966 | 'deleted-point-untagged': { deleted: true, nodes: true },
|
38967 | 'deleted-relation': { deleted: true, relations: true }
|
38968 | };
|
38969 |
|
38970 | var selectedActions = [];
|
38971 | var selectedTypes = [];
|
38972 | document.querySelectorAll('.cmap-filter-action-section input:checked').forEach(function (checkedElement) {
|
38973 | selectedActions.push(checkedElement.value);
|
38974 | });
|
38975 |
|
38976 | document.querySelectorAll('.cmap-filter-type-section input:checked').forEach(function (checkedElement) {
|
38977 | selectedTypes.push(checkedElement.value);
|
38978 | });
|
38979 |
|
38980 | var layers = Object.keys(layersKey);
|
38981 |
|
38982 | layers.forEach(function (layer) {
|
38983 | var isSelectedAction = selectedActions.reduce(function (accum, action) {
|
38984 | return layersKey[layer][action] || accum;
|
38985 | }, false);
|
38986 | var isSelectedType = selectedTypes.reduce(function (accum, type) {
|
38987 | return layersKey[layer][type] || accum;
|
38988 | }, false);
|
38989 |
|
38990 | if (isSelectedAction && isSelectedType) {
|
38991 | _this.map.setLayoutProperty(layer, 'visibility', 'visible');
|
38992 | } else {
|
38993 | _this.map.setLayoutProperty(layer, 'visibility', 'none');
|
38994 | }
|
38995 |
|
38996 | if (selectedActions.length === 0 || selectedTypes.length === 0) {
|
38997 | _this.map.setLayoutProperty('bg-point', 'visibility', 'none');
|
38998 | _this.map.setLayoutProperty('bg-line', 'visibility', 'none');
|
38999 | } else {
|
39000 | _this.map.setLayoutProperty('bg-point', 'visibility', 'visible');
|
39001 | _this.map.setLayoutProperty('bg-line', 'visibility', 'visible');
|
39002 | }
|
39003 | });
|
39004 | }
|
39005 | }, {
|
39006 | key: 'getMapInstance',
|
39007 | value: function getMapInstance$$1() {
|
39008 | return this.map;
|
39009 | }
|
39010 | }, {
|
39011 | key: 'getResult',
|
39012 | value: function getResult() {
|
39013 | return this.result;
|
39014 | }
|
39015 | }, {
|
39016 | key: 'remove',
|
39017 | value: function remove() {
|
39018 | if (this.map) {
|
39019 | this.map.remove();
|
39020 | this.mapLoaded = false;
|
39021 | this.map = undefined;
|
39022 | }
|
39023 | }
|
39024 | }, {
|
39025 | key: 'addMapSource',
|
39026 | value: function addMapSource(result, bounds) {
|
39027 | if (this.map.getSource('changeset')) {
|
39028 | this.map.getSource('changeset').setData(result.geojson);
|
39029 | } else {
|
39030 | this.map.addSource('changeset', {
|
39031 | type: 'geojson',
|
39032 | data: result.geojson
|
39033 | });
|
39034 | }
|
39035 |
|
39036 | if (this.map.getSource('bbox')) {
|
39037 | this.map.getSource('bbox').setData(getBoundingBox(bounds));
|
39038 | } else {
|
39039 | this.map.addSource('bbox', {
|
39040 | type: 'geojson',
|
39041 | data: getBoundingBox(bounds)
|
39042 | });
|
39043 | }
|
39044 | }
|
39045 | }, {
|
39046 | key: 'addMapLayers',
|
39047 | value: function addMapLayers() {
|
39048 | this.map.addLayer({
|
39049 | id: 'bbox-line',
|
39050 | type: 'line',
|
39051 | source: 'bbox',
|
39052 | paint: {
|
39053 | 'line-color': '#A58CF2',
|
39054 | 'line-opacity': 0.75,
|
39055 | 'line-width': 2
|
39056 | }
|
39057 | });
|
39058 |
|
39059 | this.map.addLayer({
|
39060 | id: 'bg-line',
|
39061 | source: 'changeset',
|
39062 | type: 'line',
|
39063 | layout: {
|
39064 | 'line-cap': 'round',
|
39065 | 'line-join': 'round'
|
39066 | },
|
39067 | paint: {
|
39068 | 'line-color': 'hsl(0, 0%, 15%)',
|
39069 | 'line-width': 12,
|
39070 | 'line-blur': 0.2,
|
39071 | 'line-opacity': {
|
39072 | base: 1.5,
|
39073 | stops: [[12, 0.5], [18, 0.2]]
|
39074 | }
|
39075 | },
|
39076 | filter: ['all', ['==', 'type', 'way']]
|
39077 | });
|
39078 |
|
39079 | this.map.addLayer({
|
39080 | id: 'bg-point',
|
39081 | source: 'changeset',
|
39082 | type: 'circle',
|
39083 | paint: {
|
39084 | 'circle-color': 'hsl(0, 0%, 15%)',
|
39085 | 'circle-blur': 0.2,
|
39086 | 'circle-opacity': {
|
39087 | base: 1.5,
|
39088 | stops: [[12, 0.5], [18, 0.2]]
|
39089 | },
|
39090 | 'circle-radius': {
|
39091 | base: 1.5,
|
39092 | stops: [[10, 12], [16, 10]]
|
39093 | }
|
39094 | },
|
39095 | filter: ['all', ['==', '$type', 'Point']]
|
39096 | });
|
39097 |
|
39098 | this.map.addLayer({
|
39099 | id: 'highlight-line',
|
39100 | source: 'changeset',
|
39101 | type: 'line',
|
39102 | layout: {
|
39103 | 'line-join': 'round',
|
39104 | 'line-cap': 'round'
|
39105 | },
|
39106 | paint: {
|
39107 | 'line-color': 'hsl(0, 0%, 75%)',
|
39108 | 'line-width': {
|
39109 | base: 1,
|
39110 | stops: [[10, 15], [16, 10]]
|
39111 | },
|
39112 | 'line-opacity': {
|
39113 | base: 1.5,
|
39114 | stops: [[12, 0.75], [18, 0.75]]
|
39115 | }
|
39116 | },
|
39117 | filter: ['all', ['==', 'id', ''], ['==', '$type', 'LineString']]
|
39118 | });
|
39119 |
|
39120 | this.map.addLayer({
|
39121 | id: 'highlight-point',
|
39122 | source: 'changeset',
|
39123 | type: 'circle',
|
39124 | paint: {
|
39125 | 'circle-color': 'hsl(0, 0%, 75%)',
|
39126 | 'circle-radius': {
|
39127 | base: 1,
|
39128 | stops: [[10, 10], [16, 11]]
|
39129 | },
|
39130 | 'circle-opacity': 0.8
|
39131 | },
|
39132 | filter: ['all', ['==', 'id', ''], ['==', '$type', 'Point']]
|
39133 | });
|
39134 |
|
39135 | // Relations
|
39136 |
|
39137 | this.map.addLayer({
|
39138 | id: 'deleted-relation',
|
39139 | source: 'changeset',
|
39140 | type: 'line',
|
39141 | paint: {
|
39142 | 'line-color': '#CC2C47',
|
39143 | 'line-width': {
|
39144 | base: 1,
|
39145 | stops: [[8, 1.5], [12, 1.5]]
|
39146 | },
|
39147 | 'line-dasharray': [0.1, 0.1],
|
39148 | 'line-opacity': 0.8
|
39149 | },
|
39150 | filter: ['all', ['==', 'type', 'relation'], ['==', 'changeType', 'deletedNew']]
|
39151 | });
|
39152 |
|
39153 | this.map.addLayer({
|
39154 | id: 'modified-old-relation',
|
39155 | source: 'changeset',
|
39156 | type: 'line',
|
39157 | layout: {
|
39158 | 'line-join': 'round',
|
39159 | 'line-cap': 'round'
|
39160 | },
|
39161 | paint: {
|
39162 | 'line-color': '#DB950A',
|
39163 | 'line-width': {
|
39164 | base: 1,
|
39165 | stops: [[8, 1.75], [12, 1.75]]
|
39166 | },
|
39167 | 'line-blur': 0.25,
|
39168 | 'line-opacity': 0.8
|
39169 | },
|
39170 | filter: ['all', ['==', 'type', 'relation'], ['==', 'changeType', 'modifiedOld']]
|
39171 | });
|
39172 |
|
39173 | this.map.addLayer({
|
39174 | id: 'modified-new-relation',
|
39175 | source: 'changeset',
|
39176 | type: 'line',
|
39177 | layout: {
|
39178 | 'line-join': 'round',
|
39179 | 'line-cap': 'round'
|
39180 | },
|
39181 | paint: {
|
39182 | 'line-color': '#E8E845',
|
39183 | 'line-width': {
|
39184 | base: 1,
|
39185 | stops: [[8, 1.25], [12, 1.25]]
|
39186 | },
|
39187 | 'line-opacity': 0.8
|
39188 | },
|
39189 | filter: ['all', ['==', 'type', 'relation'], ['==', 'changeType', 'modifiedNew']]
|
39190 | });
|
39191 |
|
39192 | this.map.addLayer({
|
39193 | id: 'added-relation',
|
39194 | source: 'changeset',
|
39195 | type: 'line',
|
39196 | interactive: true,
|
39197 | layout: {
|
39198 | 'line-join': 'round',
|
39199 | 'line-cap': 'round'
|
39200 | },
|
39201 | paint: {
|
39202 | 'line-color': '#39DBC0',
|
39203 | 'line-width': {
|
39204 | base: 1,
|
39205 | stops: [[8, 1], [12, 1]]
|
39206 | },
|
39207 | 'line-opacity': 0.8
|
39208 | },
|
39209 | filter: ['all', ['==', 'type', 'relation'], ['==', 'changeType', 'added']]
|
39210 | });
|
39211 |
|
39212 | this.map.addLayer({
|
39213 | id: 'deleted-line',
|
39214 | source: 'changeset',
|
39215 | type: 'line',
|
39216 | paint: {
|
39217 | 'line-color': '#CC2C47',
|
39218 | 'line-width': {
|
39219 | base: 1,
|
39220 | stops: [[8, 3], [12, 5]]
|
39221 | },
|
39222 | 'line-dasharray': [0.1, 0.25],
|
39223 | 'line-opacity': 0.8
|
39224 | },
|
39225 | filter: ['all', ['==', 'type', 'way'], ['==', 'changeType', 'deletedNew']]
|
39226 | });
|
39227 |
|
39228 | this.map.addLayer({
|
39229 | id: 'modified-old-point-on-way',
|
39230 | source: 'changeset',
|
39231 | type: 'circle',
|
39232 | paint: {
|
39233 | 'circle-color': '#DB950A',
|
39234 | 'circle-opacity': {
|
39235 | base: 1.5,
|
39236 | stops: [[10, 0.25], [14, 0.5]]
|
39237 | },
|
39238 | 'circle-blur': 0.25,
|
39239 | 'circle-radius': {
|
39240 | base: 1.5,
|
39241 | stops: [[10, 2.5], [16, 3.5]]
|
39242 | }
|
39243 | },
|
39244 | filter: ['all', ['==', '$type', 'LineString'], ['==', 'changeType', 'modifiedOld']]
|
39245 | });
|
39246 |
|
39247 | this.map.addLayer({
|
39248 | id: 'modified-old-line',
|
39249 | source: 'changeset',
|
39250 | type: 'line',
|
39251 | layout: {
|
39252 | 'line-join': 'round',
|
39253 | 'line-cap': 'round'
|
39254 | },
|
39255 | paint: {
|
39256 | 'line-color': '#DB950A',
|
39257 | 'line-width': {
|
39258 | base: 1,
|
39259 | stops: [[8, 3], [12, 6]]
|
39260 | },
|
39261 | 'line-blur': {
|
39262 | base: 1,
|
39263 | stops: [[8, 0.25], [12, 0.5]]
|
39264 | },
|
39265 | 'line-opacity': 0.6
|
39266 | },
|
39267 | filter: ['all', ['==', 'type', 'way'], ['==', 'changeType', 'modifiedOld']]
|
39268 | });
|
39269 |
|
39270 | this.map.addLayer({
|
39271 | id: 'modified-new-point-on-way',
|
39272 | source: 'changeset',
|
39273 | type: 'circle',
|
39274 | paint: {
|
39275 | 'circle-color': '#E8E845',
|
39276 | 'circle-opacity': {
|
39277 | base: 1.5,
|
39278 | stops: [[10, 0.25], [14, 0.25]]
|
39279 | },
|
39280 | 'circle-radius': {
|
39281 | base: 1.5,
|
39282 | stops: [[10, 1.25], [16, 2.25]]
|
39283 | }
|
39284 | },
|
39285 | filter: ['all', ['==', '$type', 'LineString'], ['==', 'changeType', 'modifiedNew']]
|
39286 | });
|
39287 |
|
39288 | this.map.addLayer({
|
39289 | id: 'modified-new-line',
|
39290 | source: 'changeset',
|
39291 | type: 'line',
|
39292 | layout: {
|
39293 | 'line-join': 'round',
|
39294 | 'line-cap': 'round'
|
39295 | },
|
39296 | paint: {
|
39297 | 'line-color': '#E8E845',
|
39298 | 'line-width': {
|
39299 | base: 1,
|
39300 | stops: [[8, 1], [12, 2]]
|
39301 | },
|
39302 | 'line-opacity': 0.6
|
39303 | },
|
39304 | filter: ['all', ['==', 'type', 'way'], ['==', 'changeType', 'modifiedNew']]
|
39305 | });
|
39306 |
|
39307 | this.map.addLayer({
|
39308 | id: 'added-line',
|
39309 | source: 'changeset',
|
39310 | type: 'line',
|
39311 | interactive: true,
|
39312 | layout: {
|
39313 | 'line-join': 'round',
|
39314 | 'line-cap': 'round'
|
39315 | },
|
39316 | paint: {
|
39317 | 'line-color': '#39DBC0',
|
39318 | 'line-width': {
|
39319 | base: 1,
|
39320 | stops: [[8, 1], [12, 1.5]]
|
39321 | },
|
39322 | 'line-opacity': 0.8
|
39323 | },
|
39324 | filter: ['all', ['==', 'type', 'way'], ['==', 'changeType', 'added']]
|
39325 | });
|
39326 |
|
39327 | this.map.addLayer({
|
39328 | id: 'deleted-point-untagged',
|
39329 | source: 'changeset',
|
39330 | type: 'circle',
|
39331 | paint: {
|
39332 | 'circle-color': '#CC2C47',
|
39333 | 'circle-radius': {
|
39334 | base: 1.5,
|
39335 | stops: [[10, 2], [16, 3]]
|
39336 | },
|
39337 | 'circle-opacity': {
|
39338 | base: 1.5,
|
39339 | stops: [[10, 0.25], [14, 0.5]]
|
39340 | }
|
39341 | },
|
39342 | filter: ['all', ['==', 'changeType', 'deletedOld'], ['any', ['==', 'tagsCount', 0], ['==', '$type', 'LineString']]]
|
39343 | });
|
39344 |
|
39345 | this.map.addLayer({
|
39346 | id: 'modified-old-point-untagged',
|
39347 | source: 'changeset',
|
39348 | type: 'circle',
|
39349 | paint: {
|
39350 | 'circle-color': '#DB950A',
|
39351 | 'circle-opacity': {
|
39352 | base: 1.5,
|
39353 | stops: [[10, 0.25], [14, 0.5]]
|
39354 | },
|
39355 | 'circle-radius': {
|
39356 | base: 1.5,
|
39357 | stops: [[10, 1.75], [16, 3]]
|
39358 | },
|
39359 | 'circle-stroke-width': 1,
|
39360 | 'circle-stroke-opacity': 0.9,
|
39361 | 'circle-stroke-color': '#DB950A'
|
39362 | },
|
39363 | filter: ['all', ['==', 'type', 'node'], ['==', 'changeType', 'modifiedOld'], ['==', 'tagsCount', 0]]
|
39364 | });
|
39365 |
|
39366 | this.map.addLayer({
|
39367 | id: 'modified-new-point-untagged',
|
39368 | source: 'changeset',
|
39369 | type: 'circle',
|
39370 | paint: {
|
39371 | 'circle-color': '#E8E845',
|
39372 | 'circle-opacity': {
|
39373 | base: 1.5,
|
39374 | stops: [[10, 0.25], [14, 0.5]]
|
39375 | },
|
39376 | 'circle-radius': {
|
39377 | base: 1.5,
|
39378 | stops: [[10, 0.75], [16, 2]]
|
39379 | },
|
39380 | 'circle-stroke-width': 1,
|
39381 | 'circle-stroke-opacity': 0.9,
|
39382 | 'circle-stroke-color': '#E8E845'
|
39383 | },
|
39384 | filter: ['all', ['==', 'type', 'node'], ['==', 'changeType', 'modifiedNew'], ['==', 'tagsCount', 0]]
|
39385 | });
|
39386 |
|
39387 | this.map.addLayer({
|
39388 | id: 'added-point-untagged',
|
39389 | source: 'changeset',
|
39390 | type: 'circle',
|
39391 | paint: {
|
39392 | 'circle-color': '#39DBC0',
|
39393 | 'circle-opacity': {
|
39394 | base: 1.5,
|
39395 | stops: [[10, 0.3], [14, 0.75]]
|
39396 | },
|
39397 | 'circle-radius': {
|
39398 | base: 1.5,
|
39399 | stops: [[10, 1.25], [16, 1.9]]
|
39400 | }
|
39401 | },
|
39402 | filter: ['all', ['==', 'type', 'node'], ['==', 'changeType', 'added'], ['==', 'tagsCount', 0]]
|
39403 | });
|
39404 |
|
39405 | this.map.addLayer({
|
39406 | id: 'deleted-point-tagged',
|
39407 | source: 'changeset',
|
39408 | type: 'circle',
|
39409 | paint: {
|
39410 | 'circle-color': '#CC2C47',
|
39411 | 'circle-radius': {
|
39412 | base: 1.5,
|
39413 | stops: [[10, 4], [16, 7]]
|
39414 | },
|
39415 | 'circle-opacity': {
|
39416 | base: 1.5,
|
39417 | stops: [[10, 0.25], [14, 0.5]]
|
39418 | },
|
39419 | 'circle-stroke-width': 1,
|
39420 | 'circle-stroke-opacity': 0.75,
|
39421 | 'circle-stroke-color': '#CC2C47'
|
39422 | },
|
39423 | filter: ['all', ['==', 'type', 'node'], ['==', 'changeType', 'deletedOld'], ['!=', 'tagsCount', 0]]
|
39424 | });
|
39425 |
|
39426 | this.map.addLayer({
|
39427 | id: 'modified-old-point-tagged',
|
39428 | source: 'changeset',
|
39429 | type: 'circle',
|
39430 | paint: {
|
39431 | 'circle-color': '#DB950A',
|
39432 | 'circle-opacity': {
|
39433 | base: 1.5,
|
39434 | stops: [[10, 0.25], [14, 0.75]]
|
39435 | },
|
39436 | 'circle-radius': {
|
39437 | base: 1.5,
|
39438 | stops: [[10, 2.5], [16, 9]]
|
39439 | },
|
39440 | 'circle-stroke-width': 1,
|
39441 | 'circle-stroke-opacity': 0.9,
|
39442 | 'circle-stroke-color': '#DB950A'
|
39443 | },
|
39444 | filter: ['all', ['==', 'type', 'node'], ['==', 'changeType', 'modifiedOld'], ['!=', 'tagsCount', 0]]
|
39445 | });
|
39446 |
|
39447 | this.map.addLayer({
|
39448 | id: 'modified-new-point-tagged',
|
39449 | source: 'changeset',
|
39450 | type: 'circle',
|
39451 | paint: {
|
39452 | 'circle-color': '#E8E845',
|
39453 | 'circle-opacity': {
|
39454 | base: 1.5,
|
39455 | stops: [[10, 0.25], [14, 0.75]]
|
39456 | },
|
39457 | 'circle-radius': {
|
39458 | base: 1.5,
|
39459 | stops: [[10, 2], [16, 7]]
|
39460 | },
|
39461 | 'circle-stroke-width': 1,
|
39462 | 'circle-stroke-opacity': 0.9,
|
39463 | 'circle-stroke-color': '#E8E845'
|
39464 | },
|
39465 | filter: ['all', ['==', 'type', 'node'], ['==', 'changeType', 'modifiedNew'], ['!=', 'tagsCount', 0]]
|
39466 | });
|
39467 |
|
39468 | this.map.addLayer({
|
39469 | id: 'added-point-tagged',
|
39470 | source: 'changeset',
|
39471 | type: 'circle',
|
39472 | paint: {
|
39473 | 'circle-color': '#39DBC0',
|
39474 | 'circle-opacity': {
|
39475 | base: 1.5,
|
39476 | stops: [[10, 0.3], [14, 0.75]]
|
39477 | },
|
39478 | 'circle-radius': {
|
39479 | base: 1.5,
|
39480 | stops: [[10, 1], [16, 5]]
|
39481 | },
|
39482 | 'circle-stroke-width': 1,
|
39483 | 'circle-stroke-opacity': 0.9,
|
39484 | 'circle-stroke-color': '#39DBC0'
|
39485 | },
|
39486 | filter: ['all', ['==', 'type', 'node'], ['==', 'changeType', 'added'], ['!=', 'tagsCount', 0]]
|
39487 | });
|
39488 | }
|
39489 | }, {
|
39490 | key: 'renderMap',
|
39491 | value: function renderMap(baseLayer, result) {
|
39492 | var _this2 = this;
|
39493 |
|
39494 | if (!result) {
|
39495 | if (!this.result) return;
|
39496 | result = this.result;
|
39497 | } else {
|
39498 | this.result = result;
|
39499 | }
|
39500 | var bounds = getBounds(result.changeset.bbox);
|
39501 | if (this.map) {
|
39502 | if (!this.mapLoaded) {
|
39503 | this.queue.push([result, bounds]); // TOFIX use variable instead of array
|
39504 | this.result = result;
|
39505 | return;
|
39506 | }
|
39507 |
|
39508 | if (baseLayer && this.oldBaseLayer !== baseLayer) {
|
39509 | this.map.setStyle(baseLayer);
|
39510 | this.baseLayerData = [result, bounds];
|
39511 | this.oldBaseLayer = baseLayer;
|
39512 | } else {
|
39513 | this.oldBaseLayer = baseLayer;
|
39514 | this.addMapSource(result, bounds);
|
39515 | this.map.fitBounds(bounds, { linear: true, padding: 200 });
|
39516 | this.result = result;
|
39517 | clearDiff();
|
39518 | }
|
39519 |
|
39520 | // why not re attach on('click')
|
39521 | // if the map is still mounted
|
39522 | // it will automatically take the latest
|
39523 | // result thanks to this.result
|
39524 | return;
|
39525 | }
|
39526 |
|
39527 | this.map = new mapboxgl.Map({
|
39528 | container: document.querySelector('.cmap-map'),
|
39529 | style: baseLayer || 'mapbox://styles/rasagy/cizp6lsah00ct2snu6gi3p16q',
|
39530 | center: bounds.getCenter(),
|
39531 | zoom: 14,
|
39532 | dragRotate: false,
|
39533 | touchZoomRotate: false
|
39534 | });
|
39535 | this.map.on('styledata', function () {
|
39536 | if (!_this2.baseLayerData) return;
|
39537 | console.log('style event fired 2');
|
39538 | var bounds = _this2.baseLayerData[1];
|
39539 | var result = _this2.baseLayerData[0];
|
39540 | _this2.baseLayerData = null;
|
39541 | _this2.map.fitBounds(bounds, { linear: true, padding: 200 });
|
39542 | _this2.addMapSource(result, bounds);
|
39543 | _this2.addMapLayers();
|
39544 | cmap.emit('load');
|
39545 | });
|
39546 | this.map.on('load', function () {
|
39547 | _this2.mapLoaded = true;
|
39548 | if (_this2.queue.length > 0) {
|
39549 | var index = _this2.queue.length - 1;
|
39550 | result = _this2.queue[index][0];
|
39551 | bounds = _this2.queue[index][1];
|
39552 | _this2.queue = [];
|
39553 | }
|
39554 | _this2.map.fitBounds(bounds, { linear: true, padding: 200 });
|
39555 | _this2.addMapSource(result, bounds);
|
39556 | _this2.addMapLayers();
|
39557 | cmap.emit('load');
|
39558 | });
|
39559 |
|
39560 | this.map.on('click', function (e) {
|
39561 | var x1y1 = [e.point.x - 5, e.point.y - 5];
|
39562 | var x2y2 = [e.point.x + 5, e.point.y + 5];
|
39563 | var features = _this2.map.queryRenderedFeatures([x1y1, x2y2], {
|
39564 | layers: ['added-line', 'added-point-tagged', 'modified-old-line', 'modified-old-point-tagged', 'modified-old-point-untagged', 'modified-new-line', 'modified-new-point-tagged', 'modified-new-point-untagged', 'deleted-line', 'deleted-point-tagged', 'added-relation', 'modified-old-relation', 'modified-new-relation', 'deleted-relation']
|
39565 | });
|
39566 |
|
39567 | if (features.length) {
|
39568 | _this2.selectFeature(features[0]);
|
39569 | } else {
|
39570 | _this2.clearFeature();
|
39571 | }
|
39572 | });
|
39573 | }
|
39574 | }, {
|
39575 | key: 'selectFeature',
|
39576 | value: function selectFeature(feature) {
|
39577 | var featureMap = this.result.featureMap;
|
39578 | var featureId = feature.properties.id;
|
39579 | var osmType = feature.properties.type;
|
39580 |
|
39581 | this.highlightFeature(featureId);
|
39582 | displayDiff(featureId, featureMap);
|
39583 | cmap.emit('featureChange', osmType, featureId);
|
39584 | }
|
39585 | }, {
|
39586 | key: 'highlightFeature',
|
39587 | value: function highlightFeature(featureId) {
|
39588 | this.map.setFilter('highlight-line', ['==', 'id', featureId]);
|
39589 | this.map.setFilter('highlight-point', ['==', 'id', featureId]);
|
39590 | }
|
39591 | }, {
|
39592 | key: 'clearHighlight',
|
39593 | value: function clearHighlight() {
|
39594 | this.map.setFilter('highlight-line', ['==', 'id', '']);
|
39595 | this.map.setFilter('highlight-point', ['==', 'id', '']);
|
39596 | }
|
39597 | }, {
|
39598 | key: 'clearFeature',
|
39599 | value: function clearFeature() {
|
39600 | this.clearHighlight();
|
39601 | clearDiff();
|
39602 | cmap.emit('featureChange', null, null);
|
39603 | }
|
39604 | }]);
|
39605 | return Map;
|
39606 | }();
|
39607 |
|
39608 | //Calculates the difference in the selected features
|
39609 |
|
39610 | function displayDiff(id, featureMap) {
|
39611 | var featuresWithId = featureMap[id];
|
39612 | var metadataProps = featuresWithId.map(function (f) {
|
39613 | var props = Object.assign({}, f.properties);
|
39614 | delete props.tags;
|
39615 | delete props.tagsCount;
|
39616 | delete props.relations;
|
39617 | delete props.action;
|
39618 | return props;
|
39619 | });
|
39620 | var tagProps = featuresWithId.map(function (f) {
|
39621 | var props = Object.assign({}, f.properties.tags);
|
39622 | props.changeType = f.properties.changeType;
|
39623 | return props;
|
39624 | });
|
39625 |
|
39626 | // Sets headers for two tables
|
39627 |
|
39628 | var type = featuresWithId[0].properties.type;
|
39629 | var metadataHeader = elt('div', {}, elt('span', { class: 'cmap-inline-block' }, type.toUpperCase() + ': ' + id), elt('ul', { class: 'cmap-hlist cmap-inline-block cmap-fr' }, elt('li', {}, elt('a', {
|
39630 | target: '_blank',
|
39631 | class: 'cmap-hlist-item cmap-pointer cmap-noselect',
|
39632 | href: '//www.openstreetmap.org/' + type + '/' + id + '/history'
|
39633 | }, 'OSM')), elt('li', {}, elt('a', {
|
39634 | target: '_blank',
|
39635 | class: 'cmap-hlist-item cmap-pointer cmap-noselect',
|
39636 | href: '//osmlab.github.io/osm-deep-history/#/' + type + '/' + id
|
39637 | }, 'Deep History'))));
|
39638 | var metadataHTML = getDiffHTML(propsDiff(metadataProps), ['id', 'type', 'changeType'], metadataHeader);
|
39639 | var tagHeader = elt('span', { class: 'cmap-inline-block' }, 'Tag details'.toUpperCase());
|
39640 | var tagHTML = getDiffHTML(propsDiff(tagProps), ['id', 'changeType'], tagHeader);
|
39641 |
|
39642 | document.querySelector('.cmap-diff').style.display = 'block';
|
39643 |
|
39644 | document.querySelector('.cmap-diff-metadata').innerHTML = '';
|
39645 | document.querySelector('.cmap-diff-metadata').appendChild(metadataHTML);
|
39646 | document.querySelector('.cmap-diff-metadata').style.display = 'block';
|
39647 |
|
39648 | document.querySelector('.cmap-diff-tags').innerHTML = '';
|
39649 | document.querySelector('.cmap-diff-tags').appendChild(tagHTML);
|
39650 | document.querySelector('.cmap-diff-tags').style.display = 'block';
|
39651 | }
|
39652 |
|
39653 | function clearDiff() {
|
39654 | document.querySelector('.cmap-diff').style.display = 'none';
|
39655 |
|
39656 | document.querySelector('.cmap-diff-metadata').innerHTML = '';
|
39657 | document.querySelector('.cmap-diff-metadata').style.display = 'none';
|
39658 |
|
39659 | document.querySelector('.cmap-diff-tags').innerHTML = '';
|
39660 | document.querySelector('.cmap-diff-tags').style.display = 'none';
|
39661 | }
|
39662 |
|
39663 | //Renders the markup for a table
|
39664 | function getDiffHTML(diff, ignoreList, header) {
|
39665 | var isAddedFeature = diff['changeType'].added === 'added';
|
39666 |
|
39667 | var root = elt('table', { class: 'cmap-diff-table' });
|
39668 | if (isAddedFeature) {
|
39669 | root.style.width = '300px';
|
39670 | }
|
39671 |
|
39672 | if (header) {
|
39673 | root.appendChild(elt('thead', {}, elt('tr', {}, elt('td', {
|
39674 | colspan: isAddedFeature ? '2' : '3',
|
39675 | class: 'cmap-table-head'
|
39676 | }, header))));
|
39677 | }
|
39678 |
|
39679 | var tbody = elt('tbody');
|
39680 |
|
39681 | var types = ['added', 'deleted', 'modifiedOld', 'modifiedNew', 'unchanged'];
|
39682 | var sortedProps = Object.keys(diff).sort(function (keyA, keyB) {
|
39683 | var indexA = types.indexOf(Object.keys(diff[keyA])[0]);
|
39684 | var indexB = types.indexOf(Object.keys(diff[keyB])[0]);
|
39685 | return indexA - indexB;
|
39686 | });
|
39687 |
|
39688 | sortedProps.forEach(function (prop) {
|
39689 | if (ignoreList.indexOf(prop) === -1) {
|
39690 | var tr = elt('tr');
|
39691 |
|
39692 | var th = elt('th', { title: prop, class: 'cmap-strong' }, prop);
|
39693 | tr.appendChild(th);
|
39694 |
|
39695 | types.forEach(function (type) {
|
39696 | if (diff[prop].hasOwnProperty(type)) {
|
39697 | var propClass = 'diff-property cmap-scroll-styled props-diff-' + type;
|
39698 | if (type == 'added' && !isAddedFeature) {
|
39699 | var empty = elt('td', { class: propClass });
|
39700 | tr.appendChild(empty);
|
39701 | }
|
39702 |
|
39703 | if (prop === 'changeset' && type === 'modifiedOld') {
|
39704 | var osmcha_link = elt('a', {
|
39705 | target: '_blank',
|
39706 | class: 'cmap-changeset-link',
|
39707 | href: '//osmcha.mapbox.com/changesets/' + diff[prop][type]
|
39708 | }, diff[prop][type]);
|
39709 | var td = elt('td', { class: propClass }, osmcha_link);
|
39710 | } else {
|
39711 | var td = elt('td', { class: propClass }, diff[prop][type]);
|
39712 | }
|
39713 | tr.appendChild(td);
|
39714 |
|
39715 | if (type == 'deleted') {
|
39716 | var empty = elt('td', { class: propClass });
|
39717 | tr.appendChild(empty);
|
39718 | }
|
39719 |
|
39720 | if (type == 'unchanged') {
|
39721 | tr.appendChild(td.cloneNode(true));
|
39722 | }
|
39723 | }
|
39724 | });
|
39725 |
|
39726 | tbody.appendChild(tr);
|
39727 | }
|
39728 | });
|
39729 |
|
39730 | root.appendChild(tbody);
|
39731 |
|
39732 | return root;
|
39733 | }
|
39734 |
|
39735 | // Recursively adds html elements
|
39736 | function elt(name, attributes) {
|
39737 | var node = document.createElement(name);
|
39738 | if (attributes) {
|
39739 | for (var attr in attributes) {
|
39740 | if (attributes.hasOwnProperty(attr)) node.setAttribute(attr, attributes[attr]);
|
39741 | }
|
39742 | }
|
39743 | for (var i = 2; i < arguments.length; i++) {
|
39744 | var child = arguments[i];
|
39745 | if (typeof child == 'string') child = document.createTextNode(child);
|
39746 | node.appendChild(child);
|
39747 | }
|
39748 | return node;
|
39749 | }
|
39750 |
|
39751 | //filterLayers, renderMap, selectFeature, clearFeature
|
39752 | var cmap = new EventEmitter();
|
39753 |
|
39754 | var map = void 0;
|
39755 |
|
39756 | window.cmap = cmap;
|
39757 |
|
39758 | function render$$1(container, changesetId, options) {
|
39759 | container.style.width = options.width || '1000px';
|
39760 | container.style.height = options.height || '500px';
|
39761 |
|
39762 | options = options || {};
|
39763 | options.overpassBase = options.overpassBase || config$1.overpassBase;
|
39764 | mapboxgl.accessToken = config$1.mapboxAccessToken;
|
39765 | container.classList.add('cmap-loading');
|
39766 | if (!map) {
|
39767 | map = new Map$1();
|
39768 | }
|
39769 |
|
39770 | if (options.data) {
|
39771 | _render(container, changesetId, options.data, options.disableSidebar);
|
39772 | } else {
|
39773 | getChangeset(changesetId, options.overpassBase).then(function (result) {
|
39774 | return _render(container, changesetId, result);
|
39775 | }).catch(function (err) {
|
39776 | errorMessage(err.msg);
|
39777 | });
|
39778 | }
|
39779 |
|
39780 | return cmap;
|
39781 | }
|
39782 |
|
39783 |
|
39784 |
|
39785 | function _render(container, changesetId, result, disableSidebar) {
|
39786 | renderHTML(container, changesetId, result, disableSidebar);
|
39787 |
|
39788 | container.classList.remove('cmap-loading');
|
39789 |
|
39790 | map.renderMap(false, result);
|
39791 |
|
39792 | var featureMap = result.featureMap;
|
39793 |
|
39794 | cmap.removeAllListeners();
|
39795 | cmap.on('remove', function () {
|
39796 | map.remove();
|
39797 | });
|
39798 |
|
39799 | cmap.on('selectFeature', function (geometryType, featureId) {
|
39800 | if (geometryType && featureId) {
|
39801 | map.selectFeature(featureMap[featureId][0], featureMap);
|
39802 | }
|
39803 | });
|
39804 |
|
39805 | cmap.on('clearFeature', function () {
|
39806 | map.clearFeature();
|
39807 | });
|
39808 | }
|
39809 |
|
39810 | // Sets initial markup for info box and map container
|
39811 | function renderHTML(container, changesetId, result, disableSidebar) {
|
39812 | var info;
|
39813 | if (document.getElementById('seat')) {
|
39814 | info = document.getElementById('seat');
|
39815 | } else {
|
39816 | info = document.createElement('div');
|
39817 | info.id = 'seat';
|
39818 | container.appendChild(info);
|
39819 | }
|
39820 | container.classList.add('cmap-container');
|
39821 |
|
39822 | // Add `tagsCount` to feature properties
|
39823 | result.geojson.features.forEach(function (feature) {
|
39824 | var tags = feature.properties.tags || {};
|
39825 | feature.properties.tagsCount = Object.keys(tags).length;
|
39826 | });
|
39827 |
|
39828 | reactDom_1(react.createElement(
|
39829 | 'div',
|
39830 | null,
|
39831 | react.createElement('div', { className: 'cmap-map' }),
|
39832 | react.createElement(
|
39833 | 'div',
|
39834 | { className: 'cmap-diff', style: { display: 'none' } },
|
39835 | react.createElement('div', {
|
39836 | className: 'cmap-diff-metadata cmap-scroll-styled',
|
39837 | style: { display: 'none' }
|
39838 | }),
|
39839 | react.createElement('div', {
|
39840 | className: 'cmap-diff-tags cmap-scroll-styled',
|
39841 | style: { display: 'none' }
|
39842 | })
|
39843 | ),
|
39844 | !disableSidebar && react.createElement(Sidebar, {
|
39845 | result: result,
|
39846 | changesetId: changesetId,
|
39847 | filterLayers: map.filterLayers,
|
39848 | toggleLayer: function toggleLayer(e) {
|
39849 | var layer = e.target.value;
|
39850 | if (layer === 'satellite') {
|
39851 | map.renderMap('mapbox://styles/rasagy/cizp6lsah00ct2snu6gi3p16q', result);
|
39852 | }
|
39853 |
|
39854 | if (layer === 'dark') {
|
39855 | map.renderMap('mapbox://styles/mapbox/dark-v9', result);
|
39856 | }
|
39857 |
|
39858 | if (layer === 'streets') {
|
39859 | map.renderMap('mapbox://styles/mapbox/streets-v9', result);
|
39860 | }
|
39861 | }
|
39862 | })
|
39863 | ), info);
|
39864 | }
|
39865 |
|
39866 | function errorMessage(message) {
|
39867 | message = message || 'An unexpected error occured';
|
39868 | document.querySelector('.cmap-info').innerHTML = message;
|
39869 | document.querySelector('.cmap-sidebar').style.display = 'block';
|
39870 | document.querySelector('.cmap-layer-selector').style.display = 'none';
|
39871 | document.querySelector('.cmap-type-selector').style.display = 'none';
|
39872 | }
|
39873 |
|
39874 | // import React from 'react';
|
39875 | // import { render } from 'react-dom';
|
39876 |
|
39877 | // render(
|
39878 | // <div>
|
39879 | // <h1 />
|
39880 | // </div>,
|
39881 | // document.getElementById('root')
|
39882 | // );
|
39883 |
|
39884 | var cMap;
|
39885 |
|
39886 | var containerWidth = window.innerWidth + 'px';
|
39887 | var containerHeight = window.innerHeight + 'px';
|
39888 |
|
39889 | if (location.hash !== '') {
|
39890 | document.getElementById('formContainer').style.display = 'none';
|
39891 | var id = location.hash.split('/')[0].replace('#', '');
|
39892 |
|
39893 | var _location$hash$split = location.hash.split('/'),
|
39894 | _location$hash$split2 = slicedToArray(_location$hash$split, 3),
|
39895 | geometryType = _location$hash$split2[1],
|
39896 | featureId = _location$hash$split2[2];
|
39897 |
|
39898 | cMap = render$$1(document.getElementById('container'), id, {
|
39899 | width: containerWidth,
|
39900 | height: containerHeight
|
39901 | });
|
39902 | cMap.on('load', function () {
|
39903 | cMap.emit('selectFeature', geometryType, featureId);
|
39904 | });
|
39905 | }
|
39906 |
|
39907 | document.getElementById('changesetForm').addEventListener('submit', function (e) {
|
39908 | e.preventDefault();
|
39909 | document.getElementById('formContainer').style.display = 'none';
|
39910 | var changesetID = document.getElementById('changesetInput').value;
|
39911 | location.hash = changesetID;
|
39912 | cMap = render$$1(document.getElementById('container'), changesetID, {
|
39913 | hash: location.hash,
|
39914 | width: containerWidth,
|
39915 | height: containerHeight
|
39916 | });
|
39917 | });
|
39918 |
|
39919 | cMap.on('featureChange', function (geometryType, featureId) {
|
39920 | clearHash();
|
39921 | if (geometryType && featureId) {
|
39922 | updateHash(geometryType, featureId);
|
39923 | }
|
39924 | });
|
39925 |
|
39926 | function updateHash(osmType, featureId) {
|
39927 | clearHash();
|
39928 |
|
39929 | location.hash += '/' + osmType;
|
39930 | location.hash += '/' + featureId;
|
39931 | }
|
39932 |
|
39933 | function clearHash() {
|
39934 | var changesetId = location.hash.split('/')[0].replace('#', '');
|
39935 |
|
39936 | location.hash = changesetId;
|
39937 | }
|
39938 |
|
39939 | }());
|
39940 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvbWFwYm94LWdsL2Rpc3QvbWFwYm94LWdsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JvbGx1cC1wbHVnaW4tbm9kZS1idWlsdGlucy9zcmMvZXM2L2V2ZW50cy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL3JlYWN0UHJvZEludmFyaWFudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9pbnZhcmlhbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9ET01Qcm9wZXJ0eS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NQ29tcG9uZW50RmxhZ3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERPTUNvbXBvbmVudFRyZWUuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9BUklBRE9NUHJvcGVydHlDb25maWcuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9FdmVudFBsdWdpblJlZ2lzdHJ5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RFcnJvclV0aWxzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2ZianMvbGliL2VtcHR5RnVuY3Rpb24uanMiLCIuLi9ub2RlX21vZHVsZXMvZmJqcy9saWIvd2FybmluZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0V2ZW50UGx1Z2luVXRpbHMuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9hY2N1bXVsYXRlSW50by5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2ZvckVhY2hBY2N1bXVsYXRlZC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0V2ZW50UGx1Z2luSHViLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvRXZlbnRQcm9wYWdhdG9ycy5qcyIsIi4uL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9vYmplY3QtYXNzaWduL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUG9vbGVkQ2xhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9nZXRUZXh0Q29udGVudEFjY2Vzc29yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvRmFsbGJhY2tDb21wb3NpdGlvblN0YXRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvU3ludGhldGljRXZlbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvU3ludGhldGljSW5wdXRFdmVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0JlZm9yZUlucHV0RXZlbnRQbHVnaW4uanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9DYWxsYmFja1F1ZXVlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RGZWF0dXJlRmxhZ3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdE93bmVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RSZWYuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdEluc3RydW1lbnRhdGlvbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0UmVjb25jaWxlci5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1RyYW5zYWN0aW9uLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RVcGRhdGVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvaW5wdXRWYWx1ZVRyYWNraW5nLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvZ2V0RXZlbnRUYXJnZXQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9pc0V2ZW50U3VwcG9ydGVkLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvaXNUZXh0SW5wdXRFbGVtZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvQ2hhbmdlRXZlbnRQbHVnaW4uanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9EZWZhdWx0RXZlbnRQbHVnaW5PcmRlci5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY1VJRXZlbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9WaWV3cG9ydE1ldHJpY3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9nZXRFdmVudE1vZGlmaWVyU3RhdGUuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNNb3VzZUV2ZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvRW50ZXJMZWF2ZUV2ZW50UGx1Z2luLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvSFRNTERPTVByb3BlcnR5Q29uZmlnLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvRE9NTmFtZXNwYWNlcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2NyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24uanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9zZXRJbm5lckhUTUwuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9lc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9zZXRUZXh0Q29udGVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0RPTUxhenlUcmVlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2ZianMvbGliL2NyZWF0ZUFycmF5RnJvbU1peGVkLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2ZianMvbGliL2dldE1hcmt1cFdyYXAuanMiLCIuLi9ub2RlX21vZHVsZXMvZmJqcy9saWIvY3JlYXRlTm9kZXNGcm9tTWFya3VwLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvRGFuZ2VyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvRE9NQ2hpbGRyZW5PcGVyYXRpb25zLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RET01JRE9wZXJhdGlvbnMuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9mb2N1c05vZGUuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9BdXRvRm9jdXNVdGlscy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0NTU1Byb3BlcnR5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvZGFuZ2Vyb3VzU3R5bGVWYWx1ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9oeXBoZW5hdGUuanMiLCIuLi9ub2RlX21vZHVsZXMvZmJqcy9saWIvaHlwaGVuYXRlU3R5bGVOYW1lLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2ZianMvbGliL21lbW9pemVTdHJpbmdPbmx5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvQ1NTUHJvcGVydHlPcGVyYXRpb25zLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvcXVvdGVBdHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9ET01Qcm9wZXJ0eU9wZXJhdGlvbnMuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdEV2ZW50RW1pdHRlck1peGluLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldC5qcyIsIi4uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2NoZWNrUHJvcFR5cGVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMuanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2xpYi9yZWFjdFByb2RJbnZhcmlhbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QvbGliL1JlYWN0Tm9vcFVwZGF0ZVF1ZXVlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2xpYi9jYW5EZWZpbmVQcm9wZXJ0eS5qcyIsIi4uL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9lbXB0eU9iamVjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvbG93UHJpb3JpdHlXYXJuaW5nLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2xpYi9SZWFjdEJhc2VDbGFzc2VzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2xpYi9Qb29sZWRDbGFzcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RDdXJyZW50T3duZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QvbGliL1JlYWN0RWxlbWVudFN5bWJvbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RFbGVtZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2xpYi9nZXRJdGVyYXRvckZuLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2xpYi9LZXlFc2NhcGVVdGlscy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvdHJhdmVyc2VBbGxDaGlsZHJlbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RDaGlsZHJlbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RET01GYWN0b3JpZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QvbGliL1JlYWN0UHJvcFR5cGVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2xpYi9SZWFjdFZlcnNpb24uanMiLCIuLi9ub2RlX21vZHVsZXMvY3JlYXRlLXJlYWN0LWNsYXNzL2ZhY3RvcnkuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QvbGliL2NyZWF0ZUNsYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2xpYi9vbmx5Q2hpbGQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QvbGliL1JlYWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvTGlua2VkVmFsdWVVdGlscy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NSW5wdXQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERPTVNlbGVjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NT3B0aW9uLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RET01UZXh0YXJlYS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdEluc3RhbmNlTWFwLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JvbGx1cC1wbHVnaW4tbm9kZS1nbG9iYWxzL3NyYy9nbG9iYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy1lczYvYnJvd3Nlci5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0Tm9kZVR5cGVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2ZianMvbGliL3NoYWxsb3dFcXVhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL3Nob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RDb21wb3NpdGVDb21wb25lbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdEVtcHR5Q29tcG9uZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RIb3N0Q29tcG9uZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2xpYi9nZXROZXh0RGVidWdJRC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2luc3RhbnRpYXRlUmVhY3RDb21wb25lbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9LZXlFc2NhcGVVdGlscy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RWxlbWVudFN5bWJvbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2dldEl0ZXJhdG9yRm4uanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi90cmF2ZXJzZUFsbENoaWxkcmVuLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RDaGlsZFJlY29uY2lsZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9mbGF0dGVuQ2hpbGRyZW4uanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdE11bHRpQ2hpbGQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdFVwZGF0ZVF1ZXVlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24uanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERPTUNvbXBvbmVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NRW1wdHlDb21wb25lbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERPTVRyZWVUcmF2ZXJzYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERPTVRleHRDb21wb25lbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2ZianMvbGliL0V2ZW50TGlzdGVuZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvZmJqcy9saWIvZ2V0VW5ib3VuZGVkU2Nyb2xsUG9zaXRpb24uanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdEV2ZW50TGlzdGVuZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdEluamVjdGlvbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2dldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERPTVNlbGVjdGlvbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9pc05vZGUuanMiLCIuLi9ub2RlX21vZHVsZXMvZmJqcy9saWIvaXNUZXh0Tm9kZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9mYmpzL2xpYi9jb250YWluc05vZGUuanMiLCIuLi9ub2RlX21vZHVsZXMvZmJqcy9saWIvZ2V0QWN0aXZlRWxlbWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0SW5wdXRTZWxlY3Rpb24uanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvU1ZHRE9NUHJvcGVydHlDb25maWcuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9TZWxlY3RFdmVudFBsdWdpbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0FuaW1hdGlvbkV2ZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvU3ludGhldGljQ2xpcGJvYXJkRXZlbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNGb2N1c0V2ZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvZ2V0RXZlbnRDaGFyQ29kZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2dldEV2ZW50S2V5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvU3ludGhldGljS2V5Ym9hcmRFdmVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0RyYWdFdmVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY1RvdWNoRXZlbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNXaGVlbEV2ZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvU2ltcGxlRXZlbnRQbHVnaW4uanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERlZmF1bHRJbmplY3Rpb24uanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERPTUNvbnRhaW5lckluZm8uanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERPTUZlYXR1cmVGbGFncy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2FkbGVyMzIuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdE1hcmt1cENoZWNrc3VtLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RNb3VudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0VmVyc2lvbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2dldEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvZmluZERPTU5vZGUuanMiLCIuLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lci5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yZWFjdC9yZWFjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2lzUGxhY2Vob2xkZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19jdXJyeTEuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2Fsd2F5cy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvRi5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvVC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvX18uanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19jdXJyeTIuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2FkZC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2NvbmNhdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2FyaXR5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fY3VycnlOLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9jdXJyeU4uanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2FkZEluZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fY3VycnkzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9hZGp1c3QuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19pc0FycmF5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9faXNUcmFuc2Zvcm1lci5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3JlZHVjZWQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL194ZkJhc2UuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL194YWxsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9hbGwuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL21heC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX21hcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3h3cmFwLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9iaW5kLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9faXNTdHJpbmcuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2lzQXJyYXlMaWtlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fcmVkdWNlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9feG1hcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2hhcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2lzQXJndW1lbnRzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9rZXlzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9tYXAuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3Byb3AuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3BsdWNrLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9yZWR1Y2UuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2FsbFBhc3MuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2FuZC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3hhbnkuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2FueS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvYW55UGFzcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvYXAuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19hcGVydHVyZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3hhcGVydHVyZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvYXBlcnR1cmUuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2FwcGVuZC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvYXBwbHkuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3ZhbHVlcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvYXBwbHlTcGVjLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9hc2NlbmQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2Fzc29jLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9faXNJbnRlZ2VyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9hc3NvY1BhdGguanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL25BcnkuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2JpbmFyeS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2lzRnVuY3Rpb24uanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2xpZnROLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9saWZ0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9ib3RoLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9jdXJyeS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvY2FsbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX21ha2VGbGF0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fZm9yY2VSZWR1Y2VkLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fZmxhdENhdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3hjaGFpbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvY2hhaW4uanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2NsYW1wLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fY2xvbmVSZWdFeHAuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3R5cGUuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19jbG9uZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvY2xvbmUuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2NvbXBhcmF0b3IuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL25vdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvY29tcGxlbWVudC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3BpcGUuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19jaGVja0Zvck1ldGhvZC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvc2xpY2UuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3RhaWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3BpcGUuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3JldmVyc2UuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2NvbXBvc2UuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2NvbXBvc2VLLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fcGlwZVAuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3BpcGVQLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9jb21wb3NlUC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2FycmF5RnJvbUl0ZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fZnVuY3Rpb25OYW1lLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pZGVudGljYWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19lcXVhbHMuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2VxdWFscy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2luZGV4T2YuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19jb250YWlucy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3F1b3RlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fdG9JU09TdHJpbmcuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19jb21wbGVtZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fZmlsdGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9faXNPYmplY3QuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL194ZmlsdGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9maWx0ZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3JlamVjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3RvU3RyaW5nLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy90b1N0cmluZy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvY29uY2F0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9jb25kLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9jb25zdHJ1Y3ROLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9jb25zdHJ1Y3QuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2NvbnRhaW5zLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9jb252ZXJnZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3hyZWR1Y2VCeS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvcmVkdWNlQnkuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2NvdW50QnkuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2RlYy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvZGVzY2VuZC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvZGVmYXVsdFRvLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9kaWZmZXJlbmNlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fY29udGFpbnNXaXRoLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9kaWZmZXJlbmNlV2l0aC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvZGlzc29jLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9kaXNzb2NQYXRoLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9kaXZpZGUuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL194ZHJvcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvZHJvcC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3h0YWtlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy90YWtlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fZHJvcExhc3QuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL194ZHJvcExhc3QuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2Ryb3BMYXN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fZHJvcExhc3RXaGlsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3hkcm9wTGFzdFdoaWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9kcm9wTGFzdFdoaWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9feGRyb3BSZXBlYXRzV2l0aC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvbnRoLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9sYXN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9kcm9wUmVwZWF0c1dpdGguanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2Ryb3BSZXBlYXRzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9feGRyb3BXaGlsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvZHJvcFdoaWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9vci5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvZWl0aGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9lbXB0eS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvZXFCeS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvZXFQcm9wcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvZXZvbHZlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9feGZpbmQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ZpbmQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL194ZmluZEluZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9maW5kSW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL194ZmluZExhc3QuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ZpbmRMYXN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9feGZpbmRMYXN0SW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ZpbmRMYXN0SW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ZsYXR0ZW4uanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ZsaXAuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ZvckVhY2guanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ZvckVhY2hPYmpJbmRleGVkLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9mcm9tUGFpcnMuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2dyb3VwQnkuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2dyb3VwV2l0aC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvZ3QuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2d0ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaGFzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9oYXNJbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaGVhZC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX2lkZW50aXR5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pZGVudGl0eS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaWZFbHNlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbmMuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2luZGV4QnkuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2luZGV4T2YuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2luaXQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2luc2VydC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW5zZXJ0QWxsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fU2V0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy91bmlxQnkuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3VuaXEuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVyc2VjdGlvbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvdW5pcVdpdGguanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVyc2VjdGlvbldpdGguanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVyc3BlcnNlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fb2JqZWN0QXNzaWduLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9fYXNzaWduLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9vYmpPZi5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW50ZXJuYWwvX3N0ZXBDYXQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludG8uanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludmVydC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaW52ZXJ0T2JqLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnZva2VyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaXNFbXB0eS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvaXNOaWwuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2pvaW4uanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2p1eHQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2tleXNJbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvbGFzdEluZGV4T2YuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19pc051bWJlci5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvbGVuZ3RoLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9sZW5zLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy91cGRhdGUuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2xlbnNJbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvcGF0aC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvbGVuc1BhdGguanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2xlbnNQcm9wLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9sdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvbHRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9tYXBBY2N1bS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvbWFwQWNjdW1SaWdodC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvbWFwT2JqSW5kZXhlZC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvbWF0Y2guanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL21hdGhNb2QuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL21heEJ5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9zdW0uanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL21lYW4uanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL21lZGlhbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvbWVtb2l6ZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvbWVyZ2UuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL21lcmdlQWxsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9tZXJnZVdpdGhLZXkuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL21lcmdlV2l0aC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvbWluLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9taW5CeS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvbW9kdWxvLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9tdWx0aXBseS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvbmVnYXRlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9ub25lLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9udGhBcmcuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19vZi5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvb2YuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL29taXQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL29uY2UuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL292ZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3BhaXIuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19jcmVhdGVQYXJ0aWFsQXBwbGljYXRvci5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvcGFydGlhbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvcGFydGlhbFJpZ2h0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9wYXJ0aXRpb24uanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3BhdGhFcS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvcGF0aE9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9wYXRoU2F0aXNmaWVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9waWNrLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9waWNrQWxsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9waWNrQnkuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3BpcGVLLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9wcmVwZW5kLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9wcm9kdWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy91c2VXaXRoLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9wcm9qZWN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9wcm9wRXEuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3Byb3BJcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvcHJvcE9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9wcm9wU2F0aXNmaWVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9wcm9wcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvcmFuZ2UuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3JlZHVjZVJpZ2h0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9yZWR1Y2VXaGlsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvcmVkdWNlZC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvcmVtb3ZlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy90aW1lcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvcmVwZWF0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9yZXBsYWNlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9zY2FuLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9zZXF1ZW5jZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvc2V0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9zb3J0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9zb3J0QnkuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3NvcnRXaXRoLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9zcGxpdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvc3BsaXRBdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvc3BsaXRFdmVyeS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvc3BsaXRXaGVuLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9zdWJ0cmFjdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvc3ltbWV0cmljRGlmZmVyZW5jZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvc3ltbWV0cmljRGlmZmVyZW5jZVdpdGguanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3Rha2VMYXN0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy90YWtlTGFzdFdoaWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy9pbnRlcm5hbC9feHRha2VXaGlsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvdGFrZVdoaWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy90YXAuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL2ludGVybmFsL19pc1JlZ0V4cC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvdGVzdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvdG9Mb3dlci5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvdG9QYWlycy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvdG9QYWlyc0luLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy90b1VwcGVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy90cmFuc2R1Y2UuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3RyYW5zcG9zZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvdHJhdmVyc2UuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3RyaW0uanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3RyeUNhdGNoLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy91bmFwcGx5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy91bmFyeS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvdW5jdXJyeU4uanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3VuZm9sZC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvdW5pb24uanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3VuaW9uV2l0aC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvdW5sZXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy91bm5lc3QuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3VudGlsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy92YWx1ZXNJbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvdmlldy5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvd2hlbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvd2hlcmUuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3doZXJlRXEuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3dpdGhvdXQuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3hwcm9kLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JhbWRhL3NyYy96aXAuanMiLCIuLi9ub2RlX21vZHVsZXMvcmFtZGEvc3JjL3ppcE9iai5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9zcmMvemlwV2l0aC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yYW1kYS9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9idWZmZXItZXM2L2Jhc2U2NC5qcyIsIi4uL25vZGVfbW9kdWxlcy9idWZmZXItZXM2L2llZWU3NTQuanMiLCIuLi9ub2RlX21vZHVsZXMvYnVmZmVyLWVzNi9pc0FycmF5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2J1ZmZlci1lczYvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvcm9sbHVwLXBsdWdpbi1ub2RlLWJ1aWx0aW5zL3NyYy9lczYvaW5oZXJpdHMuanMiLCIuLi9ub2RlX21vZHVsZXMvcm9sbHVwLXBsdWdpbi1ub2RlLWJ1aWx0aW5zL3NyYy9lczYvdXRpbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9yb2xsdXAtcGx1Z2luLW5vZGUtYnVpbHRpbnMvc3JjL2VzNi9yZWFkYWJsZS1zdHJlYW0vYnVmZmVyLWxpc3QuanMiLCIuLi9ub2RlX21vZHVsZXMvcm9sbHVwLXBsdWdpbi1ub2RlLWJ1aWx0aW5zL3NyYy9lczYvc3RyaW5nLWRlY29kZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvcm9sbHVwLXBsdWdpbi1ub2RlLWJ1aWx0aW5zL3NyYy9lczYvcmVhZGFibGUtc3RyZWFtL3JlYWRhYmxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JvbGx1cC1wbHVnaW4tbm9kZS1idWlsdGlucy9zcmMvZXM2L3JlYWRhYmxlLXN0cmVhbS93cml0YWJsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9yb2xsdXAtcGx1Z2luLW5vZGUtYnVpbHRpbnMvc3JjL2VzNi9yZWFkYWJsZS1zdHJlYW0vZHVwbGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JvbGx1cC1wbHVnaW4tbm9kZS1idWlsdGlucy9zcmMvZXM2L3JlYWRhYmxlLXN0cmVhbS90cmFuc2Zvcm0uanMiLCIuLi9ub2RlX21vZHVsZXMvcm9sbHVwLXBsdWdpbi1ub2RlLWJ1aWx0aW5zL3NyYy9lczYvcmVhZGFibGUtc3RyZWFtL3Bhc3N0aHJvdWdoLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JvbGx1cC1wbHVnaW4tbm9kZS1idWlsdGlucy9zcmMvZXM2L3N0cmVhbS5qcyIsIi4uL25vZGVfbW9kdWxlcy9zYXgvbGliL3NheC5qcyIsIi4uL25vZGVfbW9kdWxlcy9vc20tYWRpZmYtcGFyc2VyLXNheGpzL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWwtY2hhbmdlc2V0cy1wYXJzZXIvbm9kZV9tb2R1bGVzL0B0dXJmL2hlbHBlcnMvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvQHR1cmYvbWV0YS9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AdHVyZi9iYm94L2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWwtY2hhbmdlc2V0cy1wYXJzZXIvbm9kZV9tb2R1bGVzL0B0dXJmL2Jib3gtcG9seWdvbi9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9pZC1hcmVhLWtleXMvaW5kZXgudW1kLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWwtY2hhbmdlc2V0cy1wYXJzZXIvcGFyc2Vycy9lbGVtZW50LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3JlYWwtY2hhbmdlc2V0cy1wYXJzZXIvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvbW9tZW50L21vbWVudC5qcyIsIi4uL2xpYi9jb25maWcuanMiLCIuLi9saWIvcXVlcnkuanMiLCIuLi9saWIvZ2V0Q2hhbmdlc2V0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0B0dXJmL2hlbHBlcnMvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvQHR1cmYvYmJveC1wb2x5Z29uL2luZGV4LmpzIiwiLi4vbGliL2hlbHBlcnMuanMiLCIuLi9saWIvc2lkZWJhci5qcyIsIi4uL2xpYi9wcm9wc0RpZmYuanMiLCIuLi9saWIvbWFwLmpzIiwiLi4vbGliL3JlbmRlci5qcyIsIi4uL3d3dy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oZil7aWYodHlwZW9mIGV4cG9ydHM9PT1cIm9iamVjdFwiJiZ0eXBlb2YgbW9kdWxlIT09XCJ1bmRlZmluZWRcIil7bW9kdWxlLmV4cG9ydHM9ZigpfWVsc2UgaWYodHlwZW9mIGRlZmluZT09PVwiZnVuY3Rpb25cIiYmZGVmaW5lLmFtZCl7ZGVmaW5lKFtdLGYpfWVsc2V7dmFyIGc7aWYodHlwZW9mIHdpbmRvdyE9PVwidW5kZWZpbmVkXCIpe2c9d2luZG93fWVsc2UgaWYodHlwZW9mIGdsb2JhbCE9PVwidW5kZWZpbmVkXCIpe2c9Z2xvYmFsfWVsc2UgaWYodHlwZW9mIHNlbGYhPT1cInVuZGVmaW5lZFwiKXtnPXNlbGZ9ZWxzZXtnPXRoaXN9Zy5tYXBib3hnbCA9IGYoKX19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7cmV0dXJuIChmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pKHsxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbiFmdW5jdGlvbih0LHIpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPXIoKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKHIpOnQuZ2xNYXRyaXg9cigpfSh0aGlzLGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdCgpe3ZhciB0PW5ldyBGbG9hdDMyQXJyYXkoMyk7cmV0dXJuIHRbMF09MCx0WzFdPTAsdFsyXT0wLHR9ZnVuY3Rpb24gcih0LHIsbil7dmFyIGU9clswXSxhPXJbMV0sbz1yWzJdO3JldHVybiB0WzBdPWUqblswXSthKm5bM10rbypuWzZdLHRbMV09ZSpuWzFdK2Eqbls0XStvKm5bN10sdFsyXT1lKm5bMl0rYSpuWzVdK28qbls4XSx0fWZ1bmN0aW9uIG4oKXt2YXIgdD1uZXcgRmxvYXQzMkFycmF5KDQpO3JldHVybiB0WzBdPTAsdFsxXT0wLHRbMl09MCx0WzNdPTAsdH1mdW5jdGlvbiBlKHQscixuKXt2YXIgZT1yWzBdLGE9clsxXSxvPXJbMl0sdT1yWzNdO3JldHVybiB0WzBdPW5bMF0qZStuWzRdKmErbls4XSpvK25bMTJdKnUsdFsxXT1uWzFdKmUrbls1XSphK25bOV0qbytuWzEzXSp1LHRbMl09blsyXSplK25bNl0qYStuWzEwXSpvK25bMTRdKnUsdFszXT1uWzNdKmUrbls3XSphK25bMTFdKm8rblsxNV0qdSx0fWZ1bmN0aW9uIGEoKXt2YXIgdD1uZXcgRmxvYXQzMkFycmF5KDQpO3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTEsdH1mdW5jdGlvbiBvKHQscixuKXt2YXIgZT1yWzBdLGE9clsxXSxvPXJbMl0sdT1yWzNdLGk9TWF0aC5zaW4obiksYz1NYXRoLmNvcyhuKTtyZXR1cm4gdFswXT1lKmMrbyppLHRbMV09YSpjK3UqaSx0WzJdPWUqLWkrbypjLHRbM109YSotaSt1KmMsdH1mdW5jdGlvbiB1KHQscixuKXt2YXIgZT1yWzBdLGE9clsxXSxvPXJbMl0sdT1yWzNdLGk9blswXSxjPW5bMV07cmV0dXJuIHRbMF09ZSppLHRbMV09YSppLHRbMl09bypjLHRbM109dSpjLHR9ZnVuY3Rpb24gaSgpe3ZhciB0PW5ldyBGbG9hdDMyQXJyYXkoOSk7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTEsdFs1XT0wLHRbNl09MCx0WzddPTAsdFs4XT0xLHR9ZnVuY3Rpb24gYyh0LHIpe3ZhciBuPU1hdGguc2luKHIpLGU9TWF0aC5jb3Mocik7cmV0dXJuIHRbMF09ZSx0WzFdPW4sdFsyXT0wLHRbM109LW4sdFs0XT1lLHRbNV09MCx0WzZdPTAsdFs3XT0wLHRbOF09MSx0fWZ1bmN0aW9uIGYoKXt2YXIgdD1uZXcgRmxvYXQzMkFycmF5KDE2KTtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPTEsdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTBdPTEsdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9ZnVuY3Rpb24gdih0KXtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPTEsdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTBdPTEsdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9ZnVuY3Rpb24gcyh0LHIpe3ZhciBuPXJbMF0sZT1yWzFdLGE9clsyXSxvPXJbM10sdT1yWzRdLGk9cls1XSxjPXJbNl0sZj1yWzddLHY9cls4XSxzPXJbOV0sbD1yWzEwXSxNPXJbMTFdLGg9clsxMl0sbT1yWzEzXSx5PXJbMTRdLGQ9clsxNV0scD1uKmktZSp1LHc9bipjLWEqdSxBPW4qZi1vKnUsRj1lKmMtYSppLHg9ZSpmLW8qaSxiPWEqZi1vKmMsZz12Km0tcypoLGo9dip5LWwqaCxSPXYqZC1NKmgsWD1zKnktbCptLFo9cypkLU0qbSxrPWwqZC1NKnkscT1wKmstdypaK0EqWCtGKlIteCpqK2IqZztyZXR1cm4gcT8ocT0xL3EsdFswXT0oaSprLWMqWitmKlgpKnEsdFsxXT0oYSpaLWUqay1vKlgpKnEsdFsyXT0obSpiLXkqeCtkKkYpKnEsdFszXT0obCp4LXMqYi1NKkYpKnEsdFs0XT0oYypSLXUqay1mKmopKnEsdFs1XT0obiprLWEqUitvKmopKnEsdFs2XT0oeSpBLWgqYi1kKncpKnEsdFs3XT0odipiLWwqQStNKncpKnEsdFs4XT0odSpaLWkqUitmKmcpKnEsdFs5XT0oZSpSLW4qWi1vKmcpKnEsdFsxMF09KGgqeC1tKkErZCpwKSpxLHRbMTFdPShzKkEtdip4LU0qcCkqcSx0WzEyXT0oaSpqLXUqWC1jKmcpKnEsdFsxM109KG4qWC1lKmorYSpnKSpxLHRbMTRdPShtKnctaCpGLXkqcCkqcSx0WzE1XT0odipGLXMqdytsKnApKnEsdCk6bnVsbH1mdW5jdGlvbiBsKHQscixuKXt2YXIgZT1yWzBdLGE9clsxXSxvPXJbMl0sdT1yWzNdLGk9cls0XSxjPXJbNV0sZj1yWzZdLHY9cls3XSxzPXJbOF0sbD1yWzldLE09clsxMF0saD1yWzExXSxtPXJbMTJdLHk9clsxM10sZD1yWzE0XSxwPXJbMTVdLHc9blswXSxBPW5bMV0sRj1uWzJdLHg9blszXTtyZXR1cm4gdFswXT13KmUrQSppK0Yqcyt4Km0sdFsxXT13KmErQSpjK0YqbCt4KnksdFsyXT13Km8rQSpmK0YqTSt4KmQsdFszXT13KnUrQSp2K0YqaCt4KnAsdz1uWzRdLEE9bls1XSxGPW5bNl0seD1uWzddLHRbNF09dyplK0EqaStGKnMreCptLHRbNV09dyphK0EqYytGKmwreCp5LHRbNl09dypvK0EqZitGKk0reCpkLHRbN109dyp1K0EqditGKmgreCpwLHc9bls4XSxBPW5bOV0sRj1uWzEwXSx4PW5bMTFdLHRbOF09dyplK0EqaStGKnMreCptLHRbOV09dyphK0EqYytGKmwreCp5LHRbMTBdPXcqbytBKmYrRipNK3gqZCx0WzExXT13KnUrQSp2K0YqaCt4KnAsdz1uWzEyXSxBPW5bMTNdLEY9blsxNF0seD1uWzE1XSx0WzEyXT13KmUrQSppK0Yqcyt4Km0sdFsxM109dyphK0EqYytGKmwreCp5LHRbMTRdPXcqbytBKmYrRipNK3gqZCx0WzE1XT13KnUrQSp2K0YqaCt4KnAsdH1mdW5jdGlvbiBNKHQscixuKXt2YXIgZSxhLG8sdSxpLGMsZix2LHMsbCxNLGgsbT1uWzBdLHk9blsxXSxkPW5bMl07cmV0dXJuIHI9PT10Pyh0WzEyXT1yWzBdKm0rcls0XSp5K3JbOF0qZCtyWzEyXSx0WzEzXT1yWzFdKm0rcls1XSp5K3JbOV0qZCtyWzEzXSx0WzE0XT1yWzJdKm0rcls2XSp5K3JbMTBdKmQrclsxNF0sdFsxNV09clszXSptK3JbN10qeStyWzExXSpkK3JbMTVdKTooZT1yWzBdLGE9clsxXSxvPXJbMl0sdT1yWzNdLGk9cls0XSxjPXJbNV0sZj1yWzZdLHY9cls3XSxzPXJbOF0sbD1yWzldLE09clsxMF0saD1yWzExXSx0WzBdPWUsdFsxXT1hLHRbMl09byx0WzNdPXUsdFs0XT1pLHRbNV09Yyx0WzZdPWYsdFs3XT12LHRbOF09cyx0WzldPWwsdFsxMF09TSx0WzExXT1oLHRbMTJdPWUqbStpKnkrcypkK3JbMTJdLHRbMTNdPWEqbStjKnkrbCpkK3JbMTNdLHRbMTRdPW8qbStmKnkrTSpkK3JbMTRdLHRbMTVdPXUqbSt2KnkraCpkK3JbMTVdKSx0fWZ1bmN0aW9uIGgodCxyLG4pe3ZhciBlPW5bMF0sYT1uWzFdLG89blsyXTtyZXR1cm4gdFswXT1yWzBdKmUsdFsxXT1yWzFdKmUsdFsyXT1yWzJdKmUsdFszXT1yWzNdKmUsdFs0XT1yWzRdKmEsdFs1XT1yWzVdKmEsdFs2XT1yWzZdKmEsdFs3XT1yWzddKmEsdFs4XT1yWzhdKm8sdFs5XT1yWzldKm8sdFsxMF09clsxMF0qbyx0WzExXT1yWzExXSpvLHRbMTJdPXJbMTJdLHRbMTNdPXJbMTNdLHRbMTRdPXJbMTRdLHRbMTVdPXJbMTVdLHR9ZnVuY3Rpb24gbSh0LHIsbil7dmFyIGU9TWF0aC5zaW4obiksYT1NYXRoLmNvcyhuKSxvPXJbNF0sdT1yWzVdLGk9cls2XSxjPXJbN10sZj1yWzhdLHY9cls5XSxzPXJbMTBdLGw9clsxMV07cmV0dXJuIHIhPT10JiYodFswXT1yWzBdLHRbMV09clsxXSx0WzJdPXJbMl0sdFszXT1yWzNdLHRbMTJdPXJbMTJdLHRbMTNdPXJbMTNdLHRbMTRdPXJbMTRdLHRbMTVdPXJbMTVdKSx0WzRdPW8qYStmKmUsdFs1XT11KmErdiplLHRbNl09aSphK3MqZSx0WzddPWMqYStsKmUsdFs4XT1mKmEtbyplLHRbOV09diphLXUqZSx0WzEwXT1zKmEtaSplLHRbMTFdPWwqYS1jKmUsdH1mdW5jdGlvbiB5KHQscixuKXt2YXIgZT1NYXRoLnNpbihuKSxhPU1hdGguY29zKG4pLG89clswXSx1PXJbMV0saT1yWzJdLGM9clszXSxmPXJbNF0sdj1yWzVdLHM9cls2XSxsPXJbN107cmV0dXJuIHIhPT10JiYodFs4XT1yWzhdLHRbOV09cls5XSx0WzEwXT1yWzEwXSx0WzExXT1yWzExXSx0WzEyXT1yWzEyXSx0WzEzXT1yWzEzXSx0WzE0XT1yWzE0XSx0WzE1XT1yWzE1XSksdFswXT1vKmErZiplLHRbMV09dSphK3YqZSx0WzJdPWkqYStzKmUsdFszXT1jKmErbCplLHRbNF09ZiphLW8qZSx0WzVdPXYqYS11KmUsdFs2XT1zKmEtaSplLHRbN109bCphLWMqZSx0fWZ1bmN0aW9uIGQodCxyLG4sZSxhKXt2YXIgbz0xL01hdGgudGFuKHIvMiksdT0xLyhlLWEpO3JldHVybiB0WzBdPW8vbix0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT1vLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT0oYStlKSp1LHRbMTFdPS0xLHRbMTJdPTAsdFsxM109MCx0WzE0XT0yKmEqZSp1LHRbMTVdPTAsdH1mdW5jdGlvbiBwKHQscixuLGUsYSxvLHUpe3ZhciBpPTEvKHItbiksYz0xLyhlLWEpLGY9MS8oby11KTtyZXR1cm4gdFswXT0tMippLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPS0yKmMsdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTBdPTIqZix0WzExXT0wLHRbMTJdPShyK24pKmksdFsxM109KGErZSkqYyx0WzE0XT0odStvKSpmLHRbMTVdPTEsdH12YXIgdz0odCgpLG4oKSx7dmVjMzp7dHJhbnNmb3JtTWF0MzpyfSx2ZWM0Ont0cmFuc2Zvcm1NYXQ0OmV9LG1hdDI6e2NyZWF0ZTphLHJvdGF0ZTpvLHNjYWxlOnV9LG1hdDM6e2NyZWF0ZTppLGZyb21Sb3RhdGlvbjpjfSxtYXQ0OntjcmVhdGU6ZixpZGVudGl0eTp2LHRyYW5zbGF0ZTpNLHNjYWxlOmgsbXVsdGlwbHk6bCxwZXJzcGVjdGl2ZTpkLHJvdGF0ZVg6bSxyb3RhdGVaOnksaW52ZXJ0OnMsb3J0aG86cH19KTtyZXR1cm4gd30pO1xufSx7fV0sMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4hZnVuY3Rpb24odCxlKXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShlKTp0LlNoZWxmUGFjaz1lKCl9KHRoaXMsZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxpKXtpPWl8fHt9LHRoaXMudz10fHw2NCx0aGlzLmg9ZXx8NjQsdGhpcy5hdXRvUmVzaXplPSEhaS5hdXRvUmVzaXplLHRoaXMuc2hlbHZlcz1bXSx0aGlzLmZyZWViaW5zPVtdLHRoaXMuc3RhdHM9e30sdGhpcy5iaW5zPXt9LHRoaXMubWF4SWQ9MH1mdW5jdGlvbiBlKHQsZSxpKXt0aGlzLng9MCx0aGlzLnk9dCx0aGlzLnc9dGhpcy5mcmVlPWUsdGhpcy5oPWl9ZnVuY3Rpb24gaSh0LGUsaSxzLGgsbixyKXt0aGlzLmlkPXQsdGhpcy54PWUsdGhpcy55PWksdGhpcy53PXMsdGhpcy5oPWgsdGhpcy5tYXh3PW58fHMsdGhpcy5tYXhoPXJ8fGgsdGhpcy5yZWZjb3VudD0wfXJldHVybiB0LnByb3RvdHlwZS5wYWNrPWZ1bmN0aW9uKHQsZSl7dD1bXS5jb25jYXQodCksZT1lfHx7fTtmb3IodmFyIGkscyxoLG4scj1bXSxmPTA7Zjx0Lmxlbmd0aDtmKyspaWYoaT10W2ZdLnd8fHRbZl0ud2lkdGgscz10W2ZdLmh8fHRbZl0uaGVpZ2h0LGg9dFtmXS5pZCxpJiZzKXtpZihuPXRoaXMucGFja09uZShpLHMsaCksIW4pY29udGludWU7ZS5pblBsYWNlJiYodFtmXS54PW4ueCx0W2ZdLnk9bi55LHRbZl0uaWQ9bi5pZCksci5wdXNoKG4pfWlmKHRoaXMuc2hlbHZlcy5sZW5ndGg+MCl7Zm9yKHZhciBvPTAsYT0wLHU9MDt1PHRoaXMuc2hlbHZlcy5sZW5ndGg7dSsrKXt2YXIgbD10aGlzLnNoZWx2ZXNbdV07YSs9bC5oLG89TWF0aC5tYXgobC53LWwuZnJlZSxvKX10aGlzLnJlc2l6ZShvLGEpfXJldHVybiByfSx0LnByb3RvdHlwZS5wYWNrT25lPWZ1bmN0aW9uKHQsaSxzKXt2YXIgaCxuLHIsZixvPXtmcmVlYmluOi0xLHNoZWxmOi0xLHdhc3RlOjEvMH0sYT0wO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBzfHxcIm51bWJlclwiPT10eXBlb2Ygcyl7aWYoaD10aGlzLmdldEJpbihzKSlyZXR1cm4gdGhpcy5yZWYoaCksaDtcIm51bWJlclwiPT10eXBlb2YgcyYmKHRoaXMubWF4SWQ9TWF0aC5tYXgocyx0aGlzLm1heElkKSl9ZWxzZSBzPSsrdGhpcy5tYXhJZDtmb3IoZj0wO2Y8dGhpcy5mcmVlYmlucy5sZW5ndGg7ZisrKXtpZihoPXRoaXMuZnJlZWJpbnNbZl0saT09PWgubWF4aCYmdD09PWgubWF4dylyZXR1cm4gdGhpcy5hbGxvY0ZyZWViaW4oZix0LGkscyk7aT5oLm1heGh8fHQ+aC5tYXh3fHxpPD1oLm1heGgmJnQ8PWgubWF4dyYmKHI9aC5tYXh3KmgubWF4aC10KmkscjxvLndhc3RlJiYoby53YXN0ZT1yLG8uZnJlZWJpbj1mKSl9Zm9yKGY9MDtmPHRoaXMuc2hlbHZlcy5sZW5ndGg7ZisrKWlmKG49dGhpcy5zaGVsdmVzW2ZdLGErPW4uaCwhKHQ+bi5mcmVlKSl7aWYoaT09PW4uaClyZXR1cm4gdGhpcy5hbGxvY1NoZWxmKGYsdCxpLHMpO2k+bi5ofHxpPG4uaCYmKHI9KG4uaC1pKSp0LHI8by53YXN0ZSYmKG8uZnJlZWJpbj0tMSxvLndhc3RlPXIsby5zaGVsZj1mKSl9aWYoby5mcmVlYmluIT09LTEpcmV0dXJuIHRoaXMuYWxsb2NGcmVlYmluKG8uZnJlZWJpbix0LGkscyk7aWYoby5zaGVsZiE9PS0xKXJldHVybiB0aGlzLmFsbG9jU2hlbGYoby5zaGVsZix0LGkscyk7aWYoaTw9dGhpcy5oLWEmJnQ8PXRoaXMudylyZXR1cm4gbj1uZXcgZShhLHRoaXMudyxpKSx0aGlzLmFsbG9jU2hlbGYodGhpcy5zaGVsdmVzLnB1c2gobiktMSx0LGkscyk7aWYodGhpcy5hdXRvUmVzaXplKXt2YXIgdSxsLGMscDtyZXR1cm4gdT1sPXRoaXMuaCxjPXA9dGhpcy53LChjPD11fHx0PmMpJiYocD0yKk1hdGgubWF4KHQsYykpLCh1PGN8fGk+dSkmJihsPTIqTWF0aC5tYXgoaSx1KSksdGhpcy5yZXNpemUocCxsKSx0aGlzLnBhY2tPbmUodCxpLHMpfXJldHVybiBudWxsfSx0LnByb3RvdHlwZS5hbGxvY0ZyZWViaW49ZnVuY3Rpb24odCxlLGkscyl7dmFyIGg9dGhpcy5mcmVlYmlucy5zcGxpY2UodCwxKVswXTtyZXR1cm4gaC5pZD1zLGgudz1lLGguaD1pLGgucmVmY291bnQ9MCx0aGlzLmJpbnNbc109aCx0aGlzLnJlZihoKSxofSx0LnByb3RvdHlwZS5hbGxvY1NoZWxmPWZ1bmN0aW9uKHQsZSxpLHMpe3ZhciBoPXRoaXMuc2hlbHZlc1t0XSxuPWguYWxsb2MoZSxpLHMpO3JldHVybiB0aGlzLmJpbnNbc109bix0aGlzLnJlZihuKSxufSx0LnByb3RvdHlwZS5nZXRCaW49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYmluc1t0XX0sdC5wcm90b3R5cGUucmVmPWZ1bmN0aW9uKHQpe2lmKDE9PT0rK3QucmVmY291bnQpe3ZhciBlPXQuaDt0aGlzLnN0YXRzW2VdPSgwfHRoaXMuc3RhdHNbZV0pKzF9cmV0dXJuIHQucmVmY291bnR9LHQucHJvdG90eXBlLnVucmVmPWZ1bmN0aW9uKHQpe3JldHVybiAwPT09dC5yZWZjb3VudD8wOigwPT09LS10LnJlZmNvdW50JiYodGhpcy5zdGF0c1t0LmhdLS0sZGVsZXRlIHRoaXMuYmluc1t0LmlkXSx0aGlzLmZyZWViaW5zLnB1c2godCkpLHQucmVmY291bnQpfSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuc2hlbHZlcz1bXSx0aGlzLmZyZWViaW5zPVtdLHRoaXMuc3RhdHM9e30sdGhpcy5iaW5zPXt9LHRoaXMubWF4SWQ9MH0sdC5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKHQsZSl7dGhpcy53PXQsdGhpcy5oPWU7Zm9yKHZhciBpPTA7aTx0aGlzLnNoZWx2ZXMubGVuZ3RoO2krKyl0aGlzLnNoZWx2ZXNbaV0ucmVzaXplKHQpO3JldHVybiEwfSxlLnByb3RvdHlwZS5hbGxvYz1mdW5jdGlvbih0LGUscyl7aWYodD50aGlzLmZyZWV8fGU+dGhpcy5oKXJldHVybiBudWxsO3ZhciBoPXRoaXMueDtyZXR1cm4gdGhpcy54Kz10LHRoaXMuZnJlZS09dCxuZXcgaShzLGgsdGhpcy55LHQsZSx0LHRoaXMuaCl9LGUucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5mcmVlKz10LXRoaXMudyx0aGlzLnc9dCwhMH0sdH0pO1xufSx7fV0sMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5mdW5jdGlvbiBVbml0QmV6aWVyKHQsaSxlLHIpe3RoaXMuY3g9Myp0LHRoaXMuYng9MyooZS10KS10aGlzLmN4LHRoaXMuYXg9MS10aGlzLmN4LXRoaXMuYngsdGhpcy5jeT0zKmksdGhpcy5ieT0zKihyLWkpLXRoaXMuY3ksdGhpcy5heT0xLXRoaXMuY3ktdGhpcy5ieSx0aGlzLnAxeD10LHRoaXMucDF5PXIsdGhpcy5wMng9ZSx0aGlzLnAyeT1yfW1vZHVsZS5leHBvcnRzPVVuaXRCZXppZXIsVW5pdEJlemllci5wcm90b3R5cGUuc2FtcGxlQ3VydmVYPWZ1bmN0aW9uKHQpe3JldHVybigodGhpcy5heCp0K3RoaXMuYngpKnQrdGhpcy5jeCkqdH0sVW5pdEJlemllci5wcm90b3R5cGUuc2FtcGxlQ3VydmVZPWZ1bmN0aW9uKHQpe3JldHVybigodGhpcy5heSp0K3RoaXMuYnkpKnQrdGhpcy5jeSkqdH0sVW5pdEJlemllci5wcm90b3R5cGUuc2FtcGxlQ3VydmVEZXJpdmF0aXZlWD1mdW5jdGlvbih0KXtyZXR1cm4oMyp0aGlzLmF4KnQrMip0aGlzLmJ4KSp0K3RoaXMuY3h9LFVuaXRCZXppZXIucHJvdG90eXBlLnNvbHZlQ3VydmVYPWZ1bmN0aW9uKHQsaSl7XCJ1bmRlZmluZWRcIj09dHlwZW9mIGkmJihpPTFlLTYpO3ZhciBlLHIscyxoLG47Zm9yKHM9dCxuPTA7bjw4O24rKyl7aWYoaD10aGlzLnNhbXBsZUN1cnZlWChzKS10LE1hdGguYWJzKGgpPGkpcmV0dXJuIHM7dmFyIHU9dGhpcy5zYW1wbGVDdXJ2ZURlcml2YXRpdmVYKHMpO2lmKE1hdGguYWJzKHUpPDFlLTYpYnJlYWs7cy09aC91fWlmKGU9MCxyPTEscz10LHM8ZSlyZXR1cm4gZTtpZihzPnIpcmV0dXJuIHI7Zm9yKDtlPHI7KXtpZihoPXRoaXMuc2FtcGxlQ3VydmVYKHMpLE1hdGguYWJzKGgtdCk8aSlyZXR1cm4gczt0Pmg/ZT1zOnI9cyxzPS41KihyLWUpK2V9cmV0dXJuIHN9LFVuaXRCZXppZXIucHJvdG90eXBlLnNvbHZlPWZ1bmN0aW9uKHQsaSl7cmV0dXJuIHRoaXMuc2FtcGxlQ3VydmVZKHRoaXMuc29sdmVDdXJ2ZVgodCxpKSl9O1xufSx7fV0sNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG4hZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZT90KGV4cG9ydHMpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW1wiZXhwb3J0c1wiXSx0KTp0KGUuV2hvb1RTPWUuV2hvb1RTfHx7fSl9KHRoaXMsZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLHQscixuLGkscyl7cz1zfHx7fTt2YXIgZj1lK1wiP1wiK1tcImJib3g9XCIrbyhyLG4saSksXCJmb3JtYXQ9XCIrKHMuZm9ybWF0fHxcImltYWdlL3BuZ1wiKSxcInNlcnZpY2U9XCIrKHMuc2VydmljZXx8XCJXTVNcIiksXCJ2ZXJzaW9uPVwiKyhzLnZlcnNpb258fFwiMS4xLjFcIiksXCJyZXF1ZXN0PVwiKyhzLnJlcXVlc3R8fFwiR2V0TWFwXCIpLFwic3JzPVwiKyhzLnNyc3x8XCJFUFNHOjM4NTdcIiksXCJ3aWR0aD1cIisocy53aWR0aHx8MjU2KSxcImhlaWdodD1cIisocy5oZWlnaHR8fDI1NiksXCJsYXllcnM9XCIrdF0uam9pbihcIiZcIik7cmV0dXJuIGZ9ZnVuY3Rpb24gbyhlLHQsbyl7dD1NYXRoLnBvdygyLG8pLXQtMTt2YXIgbj1yKDI1NiplLDI1Nip0LG8pLGk9cigyNTYqKGUrMSksMjU2Kih0KzEpLG8pO3JldHVybiBuWzBdK1wiLFwiK25bMV0rXCIsXCIraVswXStcIixcIitpWzFdfWZ1bmN0aW9uIHIoZSx0LG8pe3ZhciByPTIqTWF0aC5QSSo2Mzc4MTM3LzI1Ni9NYXRoLnBvdygyLG8pLG49ZSpyLTIqTWF0aC5QSSo2Mzc4MTM3LzIsaT10KnItMipNYXRoLlBJKjYzNzgxMzcvMjtyZXR1cm5bbixpXX1lLmdldFVSTD10LGUuZ2V0VGlsZUJCb3g9byxlLmdldE1lcmNDb29yZHM9cixPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KX0pO1xufSx7fV0sNTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBlYXJjdXQoZSxuLHIpe3I9cnx8Mjt2YXIgdD1uJiZuLmxlbmd0aCxpPXQ/blswXSpyOmUubGVuZ3RoLHg9bGlua2VkTGlzdChlLDAsaSxyLCEwKSxhPVtdO2lmKCF4KXJldHVybiBhO3ZhciBvLGwsdSxzLHYsZix5O2lmKHQmJih4PWVsaW1pbmF0ZUhvbGVzKGUsbix4LHIpKSxlLmxlbmd0aD44MCpyKXtvPXU9ZVswXSxsPXM9ZVsxXTtmb3IodmFyIGQ9cjtkPGk7ZCs9cil2PWVbZF0sZj1lW2QrMV0sdjxvJiYobz12KSxmPGwmJihsPWYpLHY+dSYmKHU9diksZj5zJiYocz1mKTt5PU1hdGgubWF4KHUtbyxzLWwpfXJldHVybiBlYXJjdXRMaW5rZWQoeCxhLHIsbyxsLHkpLGF9ZnVuY3Rpb24gbGlua2VkTGlzdChlLG4scix0LGkpe3ZhciB4LGE7aWYoaT09PXNpZ25lZEFyZWEoZSxuLHIsdCk+MClmb3IoeD1uO3g8cjt4Kz10KWE9aW5zZXJ0Tm9kZSh4LGVbeF0sZVt4KzFdLGEpO2Vsc2UgZm9yKHg9ci10O3g+PW47eC09dClhPWluc2VydE5vZGUoeCxlW3hdLGVbeCsxXSxhKTtyZXR1cm4gYSYmZXF1YWxzKGEsYS5uZXh0KSYmKHJlbW92ZU5vZGUoYSksYT1hLm5leHQpLGF9ZnVuY3Rpb24gZmlsdGVyUG9pbnRzKGUsbil7aWYoIWUpcmV0dXJuIGU7bnx8KG49ZSk7dmFyIHIsdD1lO2RvIGlmKHI9ITEsdC5zdGVpbmVyfHwhZXF1YWxzKHQsdC5uZXh0KSYmMCE9PWFyZWEodC5wcmV2LHQsdC5uZXh0KSl0PXQubmV4dDtlbHNle2lmKHJlbW92ZU5vZGUodCksdD1uPXQucHJldix0PT09dC5uZXh0KXJldHVybiBudWxsO3I9ITB9d2hpbGUocnx8dCE9PW4pO3JldHVybiBufWZ1bmN0aW9uIGVhcmN1dExpbmtlZChlLG4scix0LGkseCxhKXtpZihlKXshYSYmeCYmaW5kZXhDdXJ2ZShlLHQsaSx4KTtmb3IodmFyIG8sbCx1PWU7ZS5wcmV2IT09ZS5uZXh0OylpZihvPWUucHJldixsPWUubmV4dCx4P2lzRWFySGFzaGVkKGUsdCxpLHgpOmlzRWFyKGUpKW4ucHVzaChvLmkvciksbi5wdXNoKGUuaS9yKSxuLnB1c2gobC5pL3IpLHJlbW92ZU5vZGUoZSksZT1sLm5leHQsdT1sLm5leHQ7ZWxzZSBpZihlPWwsZT09PXUpe2E/MT09PWE/KGU9Y3VyZUxvY2FsSW50ZXJzZWN0aW9ucyhlLG4sciksZWFyY3V0TGlua2VkKGUsbixyLHQsaSx4LDIpKToyPT09YSYmc3BsaXRFYXJjdXQoZSxuLHIsdCxpLHgpOmVhcmN1dExpbmtlZChmaWx0ZXJQb2ludHMoZSksbixyLHQsaSx4LDEpO2JyZWFrfX19ZnVuY3Rpb24gaXNFYXIoZSl7dmFyIG49ZS5wcmV2LHI9ZSx0PWUubmV4dDtpZihhcmVhKG4scix0KT49MClyZXR1cm4hMTtmb3IodmFyIGk9ZS5uZXh0Lm5leHQ7aSE9PWUucHJldjspe2lmKHBvaW50SW5UcmlhbmdsZShuLngsbi55LHIueCxyLnksdC54LHQueSxpLngsaS55KSYmYXJlYShpLnByZXYsaSxpLm5leHQpPj0wKXJldHVybiExO2k9aS5uZXh0fXJldHVybiEwfWZ1bmN0aW9uIGlzRWFySGFzaGVkKGUsbixyLHQpe3ZhciBpPWUucHJldix4PWUsYT1lLm5leHQ7aWYoYXJlYShpLHgsYSk+PTApcmV0dXJuITE7Zm9yKHZhciBvPWkueDx4Lng/aS54PGEueD9pLng6YS54OngueDxhLng/eC54OmEueCxsPWkueTx4Lnk/aS55PGEueT9pLnk6YS55OngueTxhLnk/eC55OmEueSx1PWkueD54Lng/aS54PmEueD9pLng6YS54OngueD5hLng/eC54OmEueCxzPWkueT54Lnk/aS55PmEueT9pLnk6YS55OngueT5hLnk/eC55OmEueSx2PXpPcmRlcihvLGwsbixyLHQpLGY9ek9yZGVyKHUscyxuLHIsdCkseT1lLm5leHRaO3kmJnkuejw9Zjspe2lmKHkhPT1lLnByZXYmJnkhPT1lLm5leHQmJnBvaW50SW5UcmlhbmdsZShpLngsaS55LHgueCx4LnksYS54LGEueSx5LngseS55KSYmYXJlYSh5LnByZXYseSx5Lm5leHQpPj0wKXJldHVybiExO3k9eS5uZXh0Wn1mb3IoeT1lLnByZXZaO3kmJnkuej49djspe2lmKHkhPT1lLnByZXYmJnkhPT1lLm5leHQmJnBvaW50SW5UcmlhbmdsZShpLngsaS55LHgueCx4LnksYS54LGEueSx5LngseS55KSYmYXJlYSh5LnByZXYseSx5Lm5leHQpPj0wKXJldHVybiExO3k9eS5wcmV2Wn1yZXR1cm4hMH1mdW5jdGlvbiBjdXJlTG9jYWxJbnRlcnNlY3Rpb25zKGUsbixyKXt2YXIgdD1lO2Rve3ZhciBpPXQucHJldix4PXQubmV4dC5uZXh0OyFlcXVhbHMoaSx4KSYmaW50ZXJzZWN0cyhpLHQsdC5uZXh0LHgpJiZsb2NhbGx5SW5zaWRlKGkseCkmJmxvY2FsbHlJbnNpZGUoeCxpKSYmKG4ucHVzaChpLmkvciksbi5wdXNoKHQuaS9yKSxuLnB1c2goeC5pL3IpLHJlbW92ZU5vZGUodCkscmVtb3ZlTm9kZSh0Lm5leHQpLHQ9ZT14KSx0PXQubmV4dH13aGlsZSh0IT09ZSk7cmV0dXJuIHR9ZnVuY3Rpb24gc3BsaXRFYXJjdXQoZSxuLHIsdCxpLHgpe3ZhciBhPWU7ZG97Zm9yKHZhciBvPWEubmV4dC5uZXh0O28hPT1hLnByZXY7KXtpZihhLmkhPT1vLmkmJmlzVmFsaWREaWFnb25hbChhLG8pKXt2YXIgbD1zcGxpdFBvbHlnb24oYSxvKTtyZXR1cm4gYT1maWx0ZXJQb2ludHMoYSxhLm5leHQpLGw9ZmlsdGVyUG9pbnRzKGwsbC5uZXh0KSxlYXJjdXRMaW5rZWQoYSxuLHIsdCxpLHgpLHZvaWQgZWFyY3V0TGlua2VkKGwsbixyLHQsaSx4KX1vPW8ubmV4dH1hPWEubmV4dH13aGlsZShhIT09ZSl9ZnVuY3Rpb24gZWxpbWluYXRlSG9sZXMoZSxuLHIsdCl7dmFyIGkseCxhLG8sbCx1PVtdO2ZvcihpPTAseD1uLmxlbmd0aDtpPHg7aSsrKWE9bltpXSp0LG89aTx4LTE/bltpKzFdKnQ6ZS5sZW5ndGgsbD1saW5rZWRMaXN0KGUsYSxvLHQsITEpLGw9PT1sLm5leHQmJihsLnN0ZWluZXI9ITApLHUucHVzaChnZXRMZWZ0bW9zdChsKSk7Zm9yKHUuc29ydChjb21wYXJlWCksaT0wO2k8dS5sZW5ndGg7aSsrKWVsaW1pbmF0ZUhvbGUodVtpXSxyKSxyPWZpbHRlclBvaW50cyhyLHIubmV4dCk7cmV0dXJuIHJ9ZnVuY3Rpb24gY29tcGFyZVgoZSxuKXtyZXR1cm4gZS54LW4ueH1mdW5jdGlvbiBlbGltaW5hdGVIb2xlKGUsbil7aWYobj1maW5kSG9sZUJyaWRnZShlLG4pKXt2YXIgcj1zcGxpdFBvbHlnb24obixlKTtmaWx0ZXJQb2ludHMocixyLm5leHQpfX1mdW5jdGlvbiBmaW5kSG9sZUJyaWRnZShlLG4pe3ZhciByLHQ9bixpPWUueCx4PWUueSxhPS0oMS8wKTtkb3tpZih4PD10LnkmJng+PXQubmV4dC55KXt2YXIgbz10LngrKHgtdC55KSoodC5uZXh0LngtdC54KS8odC5uZXh0LnktdC55KTtpZihvPD1pJiZvPmEpe2lmKGE9byxvPT09aSl7aWYoeD09PXQueSlyZXR1cm4gdDtpZih4PT09dC5uZXh0LnkpcmV0dXJuIHQubmV4dH1yPXQueDx0Lm5leHQueD90OnQubmV4dH19dD10Lm5leHR9d2hpbGUodCE9PW4pO2lmKCFyKXJldHVybiBudWxsO2lmKGk9PT1hKXJldHVybiByLnByZXY7dmFyIGwsdT1yLHM9ci54LHY9ci55LGY9MS8wO2Zvcih0PXIubmV4dDt0IT09dTspaT49dC54JiZ0Lng+PXMmJnBvaW50SW5UcmlhbmdsZSh4PHY/aTphLHgscyx2LHg8dj9hOmkseCx0LngsdC55KSYmKGw9TWF0aC5hYnMoeC10LnkpLyhpLXQueCksKGw8Znx8bD09PWYmJnQueD5yLngpJiZsb2NhbGx5SW5zaWRlKHQsZSkmJihyPXQsZj1sKSksdD10Lm5leHQ7cmV0dXJuIHJ9ZnVuY3Rpb24gaW5kZXhDdXJ2ZShlLG4scix0KXt2YXIgaT1lO2RvIG51bGw9PT1pLnomJihpLno9ek9yZGVyKGkueCxpLnksbixyLHQpKSxpLnByZXZaPWkucHJldixpLm5leHRaPWkubmV4dCxpPWkubmV4dDt3aGlsZShpIT09ZSk7aS5wcmV2Wi5uZXh0Wj1udWxsLGkucHJldlo9bnVsbCxzb3J0TGlua2VkKGkpfWZ1bmN0aW9uIHNvcnRMaW5rZWQoZSl7dmFyIG4scix0LGkseCxhLG8sbCx1PTE7ZG97Zm9yKHI9ZSxlPW51bGwseD1udWxsLGE9MDtyOyl7Zm9yKGErKyx0PXIsbz0wLG49MDtuPHUmJihvKyssdD10Lm5leHRaLHQpO24rKyk7Zm9yKGw9dTtvPjB8fGw+MCYmdDspMD09PW8/KGk9dCx0PXQubmV4dFosbC0tKTowIT09bCYmdD9yLno8PXQuej8oaT1yLHI9ci5uZXh0WixvLS0pOihpPXQsdD10Lm5leHRaLGwtLSk6KGk9cixyPXIubmV4dFosby0tKSx4P3gubmV4dFo9aTplPWksaS5wcmV2Wj14LHg9aTtyPXR9eC5uZXh0Wj1udWxsLHUqPTJ9d2hpbGUoYT4xKTtyZXR1cm4gZX1mdW5jdGlvbiB6T3JkZXIoZSxuLHIsdCxpKXtyZXR1cm4gZT0zMjc2NyooZS1yKS9pLG49MzI3NjcqKG4tdCkvaSxlPTE2NzExOTM1JihlfGU8PDgpLGU9MjUyNjQ1MTM1JihlfGU8PDQpLGU9ODU4OTkzNDU5JihlfGU8PDIpLGU9MTQzMTY1NTc2NSYoZXxlPDwxKSxuPTE2NzExOTM1JihufG48PDgpLG49MjUyNjQ1MTM1JihufG48PDQpLG49ODU4OTkzNDU5JihufG48PDIpLG49MTQzMTY1NTc2NSYobnxuPDwxKSxlfG48PDF9ZnVuY3Rpb24gZ2V0TGVmdG1vc3QoZSl7dmFyIG49ZSxyPWU7ZG8gbi54PHIueCYmKHI9biksbj1uLm5leHQ7d2hpbGUobiE9PWUpO3JldHVybiByfWZ1bmN0aW9uIHBvaW50SW5UcmlhbmdsZShlLG4scix0LGkseCxhLG8pe3JldHVybihpLWEpKihuLW8pLShlLWEpKih4LW8pPj0wJiYoZS1hKSoodC1vKS0oci1hKSoobi1vKT49MCYmKHItYSkqKHgtbyktKGktYSkqKHQtbyk+PTB9ZnVuY3Rpb24gaXNWYWxpZERpYWdvbmFsKGUsbil7cmV0dXJuIGUubmV4dC5pIT09bi5pJiZlLnByZXYuaSE9PW4uaSYmIWludGVyc2VjdHNQb2x5Z29uKGUsbikmJmxvY2FsbHlJbnNpZGUoZSxuKSYmbG9jYWxseUluc2lkZShuLGUpJiZtaWRkbGVJbnNpZGUoZSxuKX1mdW5jdGlvbiBhcmVhKGUsbixyKXtyZXR1cm4obi55LWUueSkqKHIueC1uLngpLShuLngtZS54KSooci55LW4ueSl9ZnVuY3Rpb24gZXF1YWxzKGUsbil7cmV0dXJuIGUueD09PW4ueCYmZS55PT09bi55fWZ1bmN0aW9uIGludGVyc2VjdHMoZSxuLHIsdCl7cmV0dXJuISEoZXF1YWxzKGUsbikmJmVxdWFscyhyLHQpfHxlcXVhbHMoZSx0KSYmZXF1YWxzKHIsbikpfHxhcmVhKGUsbixyKT4wIT1hcmVhKGUsbix0KT4wJiZhcmVhKHIsdCxlKT4wIT1hcmVhKHIsdCxuKT4wfWZ1bmN0aW9uIGludGVyc2VjdHNQb2x5Z29uKGUsbil7dmFyIHI9ZTtkb3tpZihyLmkhPT1lLmkmJnIubmV4dC5pIT09ZS5pJiZyLmkhPT1uLmkmJnIubmV4dC5pIT09bi5pJiZpbnRlcnNlY3RzKHIsci5uZXh0LGUsbikpcmV0dXJuITA7cj1yLm5leHR9d2hpbGUociE9PWUpO3JldHVybiExfWZ1bmN0aW9uIGxvY2FsbHlJbnNpZGUoZSxuKXtyZXR1cm4gYXJlYShlLnByZXYsZSxlLm5leHQpPDA/YXJlYShlLG4sZS5uZXh0KT49MCYmYXJlYShlLGUucHJldixuKT49MDphcmVhKGUsbixlLnByZXYpPDB8fGFyZWEoZSxlLm5leHQsbik8MH1mdW5jdGlvbiBtaWRkbGVJbnNpZGUoZSxuKXt2YXIgcj1lLHQ9ITEsaT0oZS54K24ueCkvMix4PShlLnkrbi55KS8yO2RvIHIueT54IT1yLm5leHQueT54JiZpPChyLm5leHQueC1yLngpKih4LXIueSkvKHIubmV4dC55LXIueSkrci54JiYodD0hdCkscj1yLm5leHQ7d2hpbGUociE9PWUpO3JldHVybiB0fWZ1bmN0aW9uIHNwbGl0UG9seWdvbihlLG4pe3ZhciByPW5ldyBOb2RlKGUuaSxlLngsZS55KSx0PW5ldyBOb2RlKG4uaSxuLngsbi55KSxpPWUubmV4dCx4PW4ucHJldjtyZXR1cm4gZS5uZXh0PW4sbi5wcmV2PWUsci5uZXh0PWksaS5wcmV2PXIsdC5uZXh0PXIsci5wcmV2PXQseC5uZXh0PXQsdC5wcmV2PXgsdH1mdW5jdGlvbiBpbnNlcnROb2RlKGUsbixyLHQpe3ZhciBpPW5ldyBOb2RlKGUsbixyKTtyZXR1cm4gdD8oaS5uZXh0PXQubmV4dCxpLnByZXY9dCx0Lm5leHQucHJldj1pLHQubmV4dD1pKTooaS5wcmV2PWksaS5uZXh0PWkpLGl9ZnVuY3Rpb24gcmVtb3ZlTm9kZShlKXtlLm5leHQucHJldj1lLnByZXYsZS5wcmV2Lm5leHQ9ZS5uZXh0LGUucHJldlomJihlLnByZXZaLm5leHRaPWUubmV4dFopLGUubmV4dFomJihlLm5leHRaLnByZXZaPWUucHJldlopfWZ1bmN0aW9uIE5vZGUoZSxuLHIpe3RoaXMuaT1lLHRoaXMueD1uLHRoaXMueT1yLHRoaXMucHJldj1udWxsLHRoaXMubmV4dD1udWxsLHRoaXMuej1udWxsLHRoaXMucHJldlo9bnVsbCx0aGlzLm5leHRaPW51bGwsdGhpcy5zdGVpbmVyPSExfWZ1bmN0aW9uIHNpZ25lZEFyZWEoZSxuLHIsdCl7Zm9yKHZhciBpPTAseD1uLGE9ci10O3g8cjt4Kz10KWkrPShlW2FdLWVbeF0pKihlW3grMV0rZVthKzFdKSxhPXg7cmV0dXJuIGl9bW9kdWxlLmV4cG9ydHM9ZWFyY3V0LGVhcmN1dC5kZXZpYXRpb249ZnVuY3Rpb24oZSxuLHIsdCl7dmFyIGk9biYmbi5sZW5ndGgseD1pP25bMF0qcjplLmxlbmd0aCxhPU1hdGguYWJzKHNpZ25lZEFyZWEoZSwwLHgscikpO2lmKGkpZm9yKHZhciBvPTAsbD1uLmxlbmd0aDtvPGw7bysrKXt2YXIgdT1uW29dKnIscz1vPGwtMT9uW28rMV0qcjplLmxlbmd0aDthLT1NYXRoLmFicyhzaWduZWRBcmVhKGUsdSxzLHIpKX12YXIgdj0wO2ZvcihvPTA7bzx0Lmxlbmd0aDtvKz0zKXt2YXIgZj10W29dKnIseT10W28rMV0qcixkPXRbbysyXSpyO3YrPU1hdGguYWJzKChlW2ZdLWVbZF0pKihlW3krMV0tZVtmKzFdKS0oZVtmXS1lW3ldKSooZVtkKzFdLWVbZisxXSkpfXJldHVybiAwPT09YSYmMD09PXY/MDpNYXRoLmFicygodi1hKS9hKX0sZWFyY3V0LmZsYXR0ZW49ZnVuY3Rpb24oZSl7Zm9yKHZhciBuPWVbMF1bMF0ubGVuZ3RoLHI9e3ZlcnRpY2VzOltdLGhvbGVzOltdLGRpbWVuc2lvbnM6bn0sdD0wLGk9MDtpPGUubGVuZ3RoO2krKyl7Zm9yKHZhciB4PTA7eDxlW2ldLmxlbmd0aDt4KyspZm9yKHZhciBhPTA7YTxuO2ErKylyLnZlcnRpY2VzLnB1c2goZVtpXVt4XVthXSk7aT4wJiYodCs9ZVtpLTFdLmxlbmd0aCxyLmhvbGVzLnB1c2godCkpfXJldHVybiByfTtcbn0se31dLDY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuZnVuY3Rpb24gZ2VvbWV0cnkocil7aWYoXCJQb2x5Z29uXCI9PT1yLnR5cGUpcmV0dXJuIHBvbHlnb25BcmVhKHIuY29vcmRpbmF0ZXMpO2lmKFwiTXVsdGlQb2x5Z29uXCI9PT1yLnR5cGUpe2Zvcih2YXIgZT0wLG49MDtuPHIuY29vcmRpbmF0ZXMubGVuZ3RoO24rKyllKz1wb2x5Z29uQXJlYShyLmNvb3JkaW5hdGVzW25dKTtyZXR1cm4gZX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBwb2x5Z29uQXJlYShyKXt2YXIgZT0wO2lmKHImJnIubGVuZ3RoPjApe2UrPU1hdGguYWJzKHJpbmdBcmVhKHJbMF0pKTtmb3IodmFyIG49MTtuPHIubGVuZ3RoO24rKyllLT1NYXRoLmFicyhyaW5nQXJlYShyW25dKSl9cmV0dXJuIGV9ZnVuY3Rpb24gcmluZ0FyZWEocil7dmFyIGU9MDtpZihyLmxlbmd0aD4yKXtmb3IodmFyIG4sdCxvPTA7bzxyLmxlbmd0aC0xO28rKyluPXJbb10sdD1yW28rMV0sZSs9cmFkKHRbMF0tblswXSkqKDIrTWF0aC5zaW4ocmFkKG5bMV0pKStNYXRoLnNpbihyYWQodFsxXSkpKTtlPWUqd2dzODQuUkFESVVTKndnczg0LlJBRElVUy8yfXJldHVybiBlfWZ1bmN0aW9uIHJhZChyKXtyZXR1cm4gcipNYXRoLlBJLzE4MH12YXIgd2dzODQ9X2RlcmVxXyhcIndnczg0XCIpO21vZHVsZS5leHBvcnRzLmdlb21ldHJ5PWdlb21ldHJ5LG1vZHVsZS5leHBvcnRzLnJpbmc9cmluZ0FyZWE7XG59LHtcIndnczg0XCI6NDJ9XSw3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmZ1bmN0aW9uIHJld2luZChyLGUpe3N3aXRjaChyJiZyLnR5cGV8fG51bGwpe2Nhc2VcIkZlYXR1cmVDb2xsZWN0aW9uXCI6cmV0dXJuIHIuZmVhdHVyZXM9ci5mZWF0dXJlcy5tYXAoY3VycnlPdXRlcihyZXdpbmQsZSkpLHI7Y2FzZVwiRmVhdHVyZVwiOnJldHVybiByLmdlb21ldHJ5PXJld2luZChyLmdlb21ldHJ5LGUpLHI7Y2FzZVwiUG9seWdvblwiOmNhc2VcIk11bHRpUG9seWdvblwiOnJldHVybiBjb3JyZWN0KHIsZSk7ZGVmYXVsdDpyZXR1cm4gcn19ZnVuY3Rpb24gY3VycnlPdXRlcihyLGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gcihuLGUpfX1mdW5jdGlvbiBjb3JyZWN0KHIsZSl7cmV0dXJuXCJQb2x5Z29uXCI9PT1yLnR5cGU/ci5jb29yZGluYXRlcz1jb3JyZWN0UmluZ3Moci5jb29yZGluYXRlcyxlKTpcIk11bHRpUG9seWdvblwiPT09ci50eXBlJiYoci5jb29yZGluYXRlcz1yLmNvb3JkaW5hdGVzLm1hcChjdXJyeU91dGVyKGNvcnJlY3RSaW5ncyxlKSkpLHJ9ZnVuY3Rpb24gY29ycmVjdFJpbmdzKHIsZSl7ZT0hIWUsclswXT13aW5kKHJbMF0sIWUpO2Zvcih2YXIgbj0xO248ci5sZW5ndGg7bisrKXJbbl09d2luZChyW25dLGUpO3JldHVybiByfWZ1bmN0aW9uIHdpbmQocixlKXtyZXR1cm4gY3cocik9PT1lP3I6ci5yZXZlcnNlKCl9ZnVuY3Rpb24gY3cocil7cmV0dXJuIGdlb2pzb25BcmVhLnJpbmcocik+PTB9dmFyIGdlb2pzb25BcmVhPV9kZXJlcV8oXCJnZW9qc29uLWFyZWFcIik7bW9kdWxlLmV4cG9ydHM9cmV3aW5kO1xufSx7XCJnZW9qc29uLWFyZWFcIjo2fV0sODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBjbGlwKGUscix0LG4sdSxpLGwscyl7aWYodC89cixuLz1yLGw+PXQmJnM8PW4pcmV0dXJuIGU7aWYobD5ufHxzPHQpcmV0dXJuIG51bGw7Zm9yKHZhciBoPVtdLHA9MDtwPGUubGVuZ3RoO3ArKyl7dmFyIGEsYyxvPWVbcF0sZj1vLmdlb21ldHJ5LGc9by50eXBlO2lmKGE9by5taW5bdV0sYz1vLm1heFt1XSxhPj10JiZjPD1uKWgucHVzaChvKTtlbHNlIGlmKCEoYT5ufHxjPHQpKXt2YXIgdj0xPT09Zz9jbGlwUG9pbnRzKGYsdCxuLHUpOmNsaXBHZW9tZXRyeShmLHQsbix1LGksMz09PWcpO3YubGVuZ3RoJiZoLnB1c2goY3JlYXRlRmVhdHVyZShvLnRhZ3MsZyx2LG8uaWQpKX19cmV0dXJuIGgubGVuZ3RoP2g6bnVsbH1mdW5jdGlvbiBjbGlwUG9pbnRzKGUscix0LG4pe2Zvcih2YXIgdT1bXSxpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBsPWVbaV0scz1sW25dO3M+PXImJnM8PXQmJnUucHVzaChsKX1yZXR1cm4gdX1mdW5jdGlvbiBjbGlwR2VvbWV0cnkoZSxyLHQsbix1LGkpe2Zvcih2YXIgbD1bXSxzPTA7czxlLmxlbmd0aDtzKyspe3ZhciBoLHAsYSxjPTAsbz0wLGY9bnVsbCxnPWVbc10sdj1nLmFyZWEsbT1nLmRpc3Qsdz1nLm91dGVyLFM9Zy5sZW5ndGgsZD1bXTtmb3IocD0wO3A8Uy0xO3ArKyloPWZ8fGdbcF0sZj1nW3ArMV0sYz1vfHxoW25dLG89ZltuXSxjPHI/bz50PyhkLnB1c2godShoLGYsciksdShoLGYsdCkpLGl8fChkPW5ld1NsaWNlKGwsZCx2LG0sdykpKTpvPj1yJiZkLnB1c2godShoLGYscikpOmM+dD9vPHI/KGQucHVzaCh1KGgsZix0KSx1KGgsZixyKSksaXx8KGQ9bmV3U2xpY2UobCxkLHYsbSx3KSkpOm88PXQmJmQucHVzaCh1KGgsZix0KSk6KGQucHVzaChoKSxvPHI/KGQucHVzaCh1KGgsZixyKSksaXx8KGQ9bmV3U2xpY2UobCxkLHYsbSx3KSkpOm8+dCYmKGQucHVzaCh1KGgsZix0KSksaXx8KGQ9bmV3U2xpY2UobCxkLHYsbSx3KSkpKTtoPWdbUy0xXSxjPWhbbl0sYz49ciYmYzw9dCYmZC5wdXNoKGgpLGE9ZFtkLmxlbmd0aC0xXSxpJiZhJiYoZFswXVswXSE9PWFbMF18fGRbMF1bMV0hPT1hWzFdKSYmZC5wdXNoKGRbMF0pLG5ld1NsaWNlKGwsZCx2LG0sdyl9cmV0dXJuIGx9ZnVuY3Rpb24gbmV3U2xpY2UoZSxyLHQsbix1KXtyZXR1cm4gci5sZW5ndGgmJihyLmFyZWE9dCxyLmRpc3Q9bix2b2lkIDAhPT11JiYoci5vdXRlcj11KSxlLnB1c2gocikpLFtdfW1vZHVsZS5leHBvcnRzPWNsaXA7dmFyIGNyZWF0ZUZlYXR1cmU9X2RlcmVxXyhcIi4vZmVhdHVyZVwiKTtcbn0se1wiLi9mZWF0dXJlXCI6MTB9XSw5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGNvbnZlcnQoZSx0KXt2YXIgcj1bXTtpZihcIkZlYXR1cmVDb2xsZWN0aW9uXCI9PT1lLnR5cGUpZm9yKHZhciBvPTA7bzxlLmZlYXR1cmVzLmxlbmd0aDtvKyspY29udmVydEZlYXR1cmUocixlLmZlYXR1cmVzW29dLHQpO2Vsc2VcIkZlYXR1cmVcIj09PWUudHlwZT9jb252ZXJ0RmVhdHVyZShyLGUsdCk6Y29udmVydEZlYXR1cmUocix7Z2VvbWV0cnk6ZX0sdCk7cmV0dXJuIHJ9ZnVuY3Rpb24gY29udmVydEZlYXR1cmUoZSx0LHIpe2lmKG51bGwhPT10Lmdlb21ldHJ5KXt2YXIgbyxhLGksbix1PXQuZ2VvbWV0cnksYz11LnR5cGUsbD11LmNvb3JkaW5hdGVzLHM9dC5wcm9wZXJ0aWVzLHA9dC5pZDtpZihcIlBvaW50XCI9PT1jKWUucHVzaChjcmVhdGVGZWF0dXJlKHMsMSxbcHJvamVjdFBvaW50KGwpXSxwKSk7ZWxzZSBpZihcIk11bHRpUG9pbnRcIj09PWMpZS5wdXNoKGNyZWF0ZUZlYXR1cmUocywxLHByb2plY3QobCkscCkpO2Vsc2UgaWYoXCJMaW5lU3RyaW5nXCI9PT1jKWUucHVzaChjcmVhdGVGZWF0dXJlKHMsMixbcHJvamVjdChsLHIpXSxwKSk7ZWxzZSBpZihcIk11bHRpTGluZVN0cmluZ1wiPT09Y3x8XCJQb2x5Z29uXCI9PT1jKXtmb3IoaT1bXSxvPTA7bzxsLmxlbmd0aDtvKyspbj1wcm9qZWN0KGxbb10sciksXCJQb2x5Z29uXCI9PT1jJiYobi5vdXRlcj0wPT09byksaS5wdXNoKG4pO2UucHVzaChjcmVhdGVGZWF0dXJlKHMsXCJQb2x5Z29uXCI9PT1jPzM6MixpLHApKX1lbHNlIGlmKFwiTXVsdGlQb2x5Z29uXCI9PT1jKXtmb3IoaT1bXSxvPTA7bzxsLmxlbmd0aDtvKyspZm9yKGE9MDthPGxbb10ubGVuZ3RoO2ErKyluPXByb2plY3QobFtvXVthXSxyKSxuLm91dGVyPTA9PT1hLGkucHVzaChuKTtlLnB1c2goY3JlYXRlRmVhdHVyZShzLDMsaSxwKSl9ZWxzZXtpZihcIkdlb21ldHJ5Q29sbGVjdGlvblwiIT09Yyl0aHJvdyBuZXcgRXJyb3IoXCJJbnB1dCBkYXRhIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04gb2JqZWN0LlwiKTtmb3Iobz0wO288dS5nZW9tZXRyaWVzLmxlbmd0aDtvKyspY29udmVydEZlYXR1cmUoZSx7Z2VvbWV0cnk6dS5nZW9tZXRyaWVzW29dLHByb3BlcnRpZXM6c30scil9fX1mdW5jdGlvbiBwcm9qZWN0KGUsdCl7Zm9yKHZhciByPVtdLG89MDtvPGUubGVuZ3RoO28rKylyLnB1c2gocHJvamVjdFBvaW50KGVbb10pKTtyZXR1cm4gdCYmKHNpbXBsaWZ5KHIsdCksY2FsY1NpemUocikpLHJ9ZnVuY3Rpb24gcHJvamVjdFBvaW50KGUpe3ZhciB0PU1hdGguc2luKGVbMV0qTWF0aC5QSS8xODApLHI9ZVswXS8zNjArLjUsbz0uNS0uMjUqTWF0aC5sb2coKDErdCkvKDEtdCkpL01hdGguUEk7cmV0dXJuIG89bzwwPzA6bz4xPzE6byxbcixvLDBdfWZ1bmN0aW9uIGNhbGNTaXplKGUpe2Zvcih2YXIgdCxyLG89MCxhPTAsaT0wO2k8ZS5sZW5ndGgtMTtpKyspdD1yfHxlW2ldLHI9ZVtpKzFdLG8rPXRbMF0qclsxXS1yWzBdKnRbMV0sYSs9TWF0aC5hYnMoclswXS10WzBdKStNYXRoLmFicyhyWzFdLXRbMV0pO2UuYXJlYT1NYXRoLmFicyhvLzIpLGUuZGlzdD1hfW1vZHVsZS5leHBvcnRzPWNvbnZlcnQ7dmFyIHNpbXBsaWZ5PV9kZXJlcV8oXCIuL3NpbXBsaWZ5XCIpLGNyZWF0ZUZlYXR1cmU9X2RlcmVxXyhcIi4vZmVhdHVyZVwiKTtcbn0se1wiLi9mZWF0dXJlXCI6MTAsXCIuL3NpbXBsaWZ5XCI6MTJ9XSwxMDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBjcmVhdGVGZWF0dXJlKGUsdCxhLG4pe3ZhciByPXtpZDpufHxudWxsLHR5cGU6dCxnZW9tZXRyeTphLHRhZ3M6ZXx8bnVsbCxtaW46WzEvMCwxLzBdLG1heDpbLSgxLzApLC0oMS8wKV19O3JldHVybiBjYWxjQkJveChyKSxyfWZ1bmN0aW9uIGNhbGNCQm94KGUpe3ZhciB0PWUuZ2VvbWV0cnksYT1lLm1pbixuPWUubWF4O2lmKDE9PT1lLnR5cGUpY2FsY1JpbmdCQm94KGEsbix0KTtlbHNlIGZvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKWNhbGNSaW5nQkJveChhLG4sdFtyXSk7cmV0dXJuIGV9ZnVuY3Rpb24gY2FsY1JpbmdCQm94KGUsdCxhKXtmb3IodmFyIG4scj0wO3I8YS5sZW5ndGg7cisrKW49YVtyXSxlWzBdPU1hdGgubWluKG5bMF0sZVswXSksdFswXT1NYXRoLm1heChuWzBdLHRbMF0pLGVbMV09TWF0aC5taW4oblsxXSxlWzFdKSx0WzFdPU1hdGgubWF4KG5bMV0sdFsxXSl9bW9kdWxlLmV4cG9ydHM9Y3JlYXRlRmVhdHVyZTtcbn0se31dLDExOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGdlb2pzb252dChlLHQpe3JldHVybiBuZXcgR2VvSlNPTlZUKGUsdCl9ZnVuY3Rpb24gR2VvSlNPTlZUKGUsdCl7dD10aGlzLm9wdGlvbnM9ZXh0ZW5kKE9iamVjdC5jcmVhdGUodGhpcy5vcHRpb25zKSx0KTt2YXIgaT10LmRlYnVnO2kmJmNvbnNvbGUudGltZShcInByZXByb2Nlc3MgZGF0YVwiKTt2YXIgbz0xPDx0Lm1heFpvb20sbj1jb252ZXJ0KGUsdC50b2xlcmFuY2UvKG8qdC5leHRlbnQpKTt0aGlzLnRpbGVzPXt9LHRoaXMudGlsZUNvb3Jkcz1bXSxpJiYoY29uc29sZS50aW1lRW5kKFwicHJlcHJvY2VzcyBkYXRhXCIpLGNvbnNvbGUubG9nKFwiaW5kZXg6IG1heFpvb206ICVkLCBtYXhQb2ludHM6ICVkXCIsdC5pbmRleE1heFpvb20sdC5pbmRleE1heFBvaW50cyksY29uc29sZS50aW1lKFwiZ2VuZXJhdGUgdGlsZXNcIiksdGhpcy5zdGF0cz17fSx0aGlzLnRvdGFsPTApLG49d3JhcChuLHQuYnVmZmVyL3QuZXh0ZW50LGludGVyc2VjdFgpLG4ubGVuZ3RoJiZ0aGlzLnNwbGl0VGlsZShuLDAsMCwwKSxpJiYobi5sZW5ndGgmJmNvbnNvbGUubG9nKFwiZmVhdHVyZXM6ICVkLCBwb2ludHM6ICVkXCIsdGhpcy50aWxlc1swXS5udW1GZWF0dXJlcyx0aGlzLnRpbGVzWzBdLm51bVBvaW50cyksY29uc29sZS50aW1lRW5kKFwiZ2VuZXJhdGUgdGlsZXNcIiksY29uc29sZS5sb2coXCJ0aWxlcyBnZW5lcmF0ZWQ6XCIsdGhpcy50b3RhbCxKU09OLnN0cmluZ2lmeSh0aGlzLnN0YXRzKSkpfWZ1bmN0aW9uIHRvSUQoZSx0LGkpe3JldHVybiAzMiooKDE8PGUpKmkrdCkrZX1mdW5jdGlvbiBpbnRlcnNlY3RYKGUsdCxpKXtyZXR1cm5baSwoaS1lWzBdKSoodFsxXS1lWzFdKS8odFswXS1lWzBdKStlWzFdLDFdfWZ1bmN0aW9uIGludGVyc2VjdFkoZSx0LGkpe3JldHVyblsoaS1lWzFdKSoodFswXS1lWzBdKS8odFsxXS1lWzFdKStlWzBdLGksMV19ZnVuY3Rpb24gZXh0ZW5kKGUsdCl7Zm9yKHZhciBpIGluIHQpZVtpXT10W2ldO3JldHVybiBlfWZ1bmN0aW9uIGlzQ2xpcHBlZFNxdWFyZShlLHQsaSl7dmFyIG89ZS5zb3VyY2U7aWYoMSE9PW8ubGVuZ3RoKXJldHVybiExO3ZhciBuPW9bMF07aWYoMyE9PW4udHlwZXx8bi5nZW9tZXRyeS5sZW5ndGg+MSlyZXR1cm4hMTt2YXIgcj1uLmdlb21ldHJ5WzBdLmxlbmd0aDtpZig1IT09cilyZXR1cm4hMTtmb3IodmFyIHM9MDtzPHI7cysrKXt2YXIgbD10cmFuc2Zvcm0ucG9pbnQobi5nZW9tZXRyeVswXVtzXSx0LGUuejIsZS54LGUueSk7aWYobFswXSE9PS1pJiZsWzBdIT09dCtpfHxsWzFdIT09LWkmJmxbMV0hPT10K2kpcmV0dXJuITF9cmV0dXJuITB9bW9kdWxlLmV4cG9ydHM9Z2VvanNvbnZ0O3ZhciBjb252ZXJ0PV9kZXJlcV8oXCIuL2NvbnZlcnRcIiksdHJhbnNmb3JtPV9kZXJlcV8oXCIuL3RyYW5zZm9ybVwiKSxjbGlwPV9kZXJlcV8oXCIuL2NsaXBcIiksd3JhcD1fZGVyZXFfKFwiLi93cmFwXCIpLGNyZWF0ZVRpbGU9X2RlcmVxXyhcIi4vdGlsZVwiKTtHZW9KU09OVlQucHJvdG90eXBlLm9wdGlvbnM9e21heFpvb206MTQsaW5kZXhNYXhab29tOjUsaW5kZXhNYXhQb2ludHM6MWU1LHNvbGlkQ2hpbGRyZW46ITEsdG9sZXJhbmNlOjMsZXh0ZW50OjQwOTYsYnVmZmVyOjY0LGRlYnVnOjB9LEdlb0pTT05WVC5wcm90b3R5cGUuc3BsaXRUaWxlPWZ1bmN0aW9uKGUsdCxpLG8sbixyLHMpe2Zvcih2YXIgbD1bZSx0LGksb10sYT10aGlzLm9wdGlvbnMsdT1hLmRlYnVnLGM9bnVsbDtsLmxlbmd0aDspe289bC5wb3AoKSxpPWwucG9wKCksdD1sLnBvcCgpLGU9bC5wb3AoKTt2YXIgcD0xPDx0LGQ9dG9JRCh0LGksbyksbT10aGlzLnRpbGVzW2RdLGY9dD09PWEubWF4Wm9vbT8wOmEudG9sZXJhbmNlLyhwKmEuZXh0ZW50KTtpZighbSYmKHU+MSYmY29uc29sZS50aW1lKFwiY3JlYXRpb25cIiksbT10aGlzLnRpbGVzW2RdPWNyZWF0ZVRpbGUoZSxwLGksbyxmLHQ9PT1hLm1heFpvb20pLHRoaXMudGlsZUNvb3Jkcy5wdXNoKHt6OnQseDppLHk6b30pLHUpKXt1PjEmJihjb25zb2xlLmxvZyhcInRpbGUgeiVkLSVkLSVkIChmZWF0dXJlczogJWQsIHBvaW50czogJWQsIHNpbXBsaWZpZWQ6ICVkKVwiLHQsaSxvLG0ubnVtRmVhdHVyZXMsbS5udW1Qb2ludHMsbS5udW1TaW1wbGlmaWVkKSxjb25zb2xlLnRpbWVFbmQoXCJjcmVhdGlvblwiKSk7dmFyIGg9XCJ6XCIrdDt0aGlzLnN0YXRzW2hdPSh0aGlzLnN0YXRzW2hdfHwwKSsxLHRoaXMudG90YWwrK31pZihtLnNvdXJjZT1lLG4pe2lmKHQ9PT1hLm1heFpvb218fHQ9PT1uKWNvbnRpbnVlO3ZhciB4PTE8PG4tdDtpZihpIT09TWF0aC5mbG9vcihyL3gpfHxvIT09TWF0aC5mbG9vcihzL3gpKWNvbnRpbnVlfWVsc2UgaWYodD09PWEuaW5kZXhNYXhab29tfHxtLm51bVBvaW50czw9YS5pbmRleE1heFBvaW50cyljb250aW51ZTtpZihhLnNvbGlkQ2hpbGRyZW58fCFpc0NsaXBwZWRTcXVhcmUobSxhLmV4dGVudCxhLmJ1ZmZlcikpe20uc291cmNlPW51bGwsdT4xJiZjb25zb2xlLnRpbWUoXCJjbGlwcGluZ1wiKTt2YXIgZyx2LE0sVCxiLHksUz0uNSphLmJ1ZmZlci9hLmV4dGVudCxaPS41LVMscT0uNStTLHc9MStTO2c9dj1NPVQ9bnVsbCxiPWNsaXAoZSxwLGktUyxpK3EsMCxpbnRlcnNlY3RYLG0ubWluWzBdLG0ubWF4WzBdKSx5PWNsaXAoZSxwLGkrWixpK3csMCxpbnRlcnNlY3RYLG0ubWluWzBdLG0ubWF4WzBdKSxiJiYoZz1jbGlwKGIscCxvLVMsbytxLDEsaW50ZXJzZWN0WSxtLm1pblsxXSxtLm1heFsxXSksdj1jbGlwKGIscCxvK1osbyt3LDEsaW50ZXJzZWN0WSxtLm1pblsxXSxtLm1heFsxXSkpLHkmJihNPWNsaXAoeSxwLG8tUyxvK3EsMSxpbnRlcnNlY3RZLG0ubWluWzFdLG0ubWF4WzFdKSxUPWNsaXAoeSxwLG8rWixvK3csMSxpbnRlcnNlY3RZLG0ubWluWzFdLG0ubWF4WzFdKSksdT4xJiZjb25zb2xlLnRpbWVFbmQoXCJjbGlwcGluZ1wiKSxlLmxlbmd0aCYmKGwucHVzaChnfHxbXSx0KzEsMippLDIqbyksbC5wdXNoKHZ8fFtdLHQrMSwyKmksMipvKzEpLGwucHVzaChNfHxbXSx0KzEsMippKzEsMipvKSxsLnB1c2goVHx8W10sdCsxLDIqaSsxLDIqbysxKSl9ZWxzZSBuJiYoYz10KX1yZXR1cm4gY30sR2VvSlNPTlZULnByb3RvdHlwZS5nZXRUaWxlPWZ1bmN0aW9uKGUsdCxpKXt2YXIgbz10aGlzLm9wdGlvbnMsbj1vLmV4dGVudCxyPW8uZGVidWcscz0xPDxlO3Q9KHQlcytzKSVzO3ZhciBsPXRvSUQoZSx0LGkpO2lmKHRoaXMudGlsZXNbbF0pcmV0dXJuIHRyYW5zZm9ybS50aWxlKHRoaXMudGlsZXNbbF0sbik7cj4xJiZjb25zb2xlLmxvZyhcImRyaWxsaW5nIGRvd24gdG8geiVkLSVkLSVkXCIsZSx0LGkpO2Zvcih2YXIgYSx1PWUsYz10LHA9aTshYSYmdT4wOyl1LS0sYz1NYXRoLmZsb29yKGMvMikscD1NYXRoLmZsb29yKHAvMiksYT10aGlzLnRpbGVzW3RvSUQodSxjLHApXTtpZighYXx8IWEuc291cmNlKXJldHVybiBudWxsO2lmKHI+MSYmY29uc29sZS5sb2coXCJmb3VuZCBwYXJlbnQgdGlsZSB6JWQtJWQtJWRcIix1LGMscCksaXNDbGlwcGVkU3F1YXJlKGEsbixvLmJ1ZmZlcikpcmV0dXJuIHRyYW5zZm9ybS50aWxlKGEsbik7cj4xJiZjb25zb2xlLnRpbWUoXCJkcmlsbGluZyBkb3duXCIpO3ZhciBkPXRoaXMuc3BsaXRUaWxlKGEuc291cmNlLHUsYyxwLGUsdCxpKTtpZihyPjEmJmNvbnNvbGUudGltZUVuZChcImRyaWxsaW5nIGRvd25cIiksbnVsbCE9PWQpe3ZhciBtPTE8PGUtZDtsPXRvSUQoZCxNYXRoLmZsb29yKHQvbSksTWF0aC5mbG9vcihpL20pKX1yZXR1cm4gdGhpcy50aWxlc1tsXT90cmFuc2Zvcm0udGlsZSh0aGlzLnRpbGVzW2xdLG4pOm51bGx9O1xufSx7XCIuL2NsaXBcIjo4LFwiLi9jb252ZXJ0XCI6OSxcIi4vdGlsZVwiOjEzLFwiLi90cmFuc2Zvcm1cIjoxNCxcIi4vd3JhcFwiOjE1fV0sMTI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gc2ltcGxpZnkodCxpKXt2YXIgZSxwLHIscyxvPWkqaSxmPXQubGVuZ3RoLHU9MCxuPWYtMSxnPVtdO2Zvcih0W3VdWzJdPTEsdFtuXVsyXT0xO247KXtmb3IocD0wLGU9dSsxO2U8bjtlKyspcj1nZXRTcVNlZ0Rpc3QodFtlXSx0W3VdLHRbbl0pLHI+cCYmKHM9ZSxwPXIpO3A+bz8odFtzXVsyXT1wLGcucHVzaCh1KSxnLnB1c2gocyksdT1zKToobj1nLnBvcCgpLHU9Zy5wb3AoKSl9fWZ1bmN0aW9uIGdldFNxU2VnRGlzdCh0LGksZSl7dmFyIHA9aVswXSxyPWlbMV0scz1lWzBdLG89ZVsxXSxmPXRbMF0sdT10WzFdLG49cy1wLGc9by1yO2lmKDAhPT1ufHwwIT09Zyl7dmFyIGw9KChmLXApKm4rKHUtcikqZykvKG4qbitnKmcpO2w+MT8ocD1zLHI9byk6bD4wJiYocCs9bipsLHIrPWcqbCl9cmV0dXJuIG49Zi1wLGc9dS1yLG4qbitnKmd9bW9kdWxlLmV4cG9ydHM9c2ltcGxpZnk7XG59LHt9XSwxMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBjcmVhdGVUaWxlKGUsbixyLGksdCx1KXtmb3IodmFyIGE9e2ZlYXR1cmVzOltdLG51bVBvaW50czowLG51bVNpbXBsaWZpZWQ6MCxudW1GZWF0dXJlczowLHNvdXJjZTpudWxsLHg6cix5OmksejI6bix0cmFuc2Zvcm1lZDohMSxtaW46WzIsMV0sbWF4OlstMSwwXX0sbT0wO208ZS5sZW5ndGg7bSsrKXthLm51bUZlYXR1cmVzKyssYWRkRmVhdHVyZShhLGVbbV0sdCx1KTt2YXIgcz1lW21dLm1pbixsPWVbbV0ubWF4O3NbMF08YS5taW5bMF0mJihhLm1pblswXT1zWzBdKSxzWzFdPGEubWluWzFdJiYoYS5taW5bMV09c1sxXSksbFswXT5hLm1heFswXSYmKGEubWF4WzBdPWxbMF0pLGxbMV0+YS5tYXhbMV0mJihhLm1heFsxXT1sWzFdKX1yZXR1cm4gYX1mdW5jdGlvbiBhZGRGZWF0dXJlKGUsbixyLGkpe3ZhciB0LHUsYSxtLHM9bi5nZW9tZXRyeSxsPW4udHlwZSxvPVtdLGY9cipyO2lmKDE9PT1sKWZvcih0PTA7dDxzLmxlbmd0aDt0Kyspby5wdXNoKHNbdF0pLGUubnVtUG9pbnRzKyssZS5udW1TaW1wbGlmaWVkKys7ZWxzZSBmb3IodD0wO3Q8cy5sZW5ndGg7dCsrKWlmKGE9c1t0XSxpfHwhKDI9PT1sJiZhLmRpc3Q8cnx8Mz09PWwmJmEuYXJlYTxmKSl7dmFyIGQ9W107Zm9yKHU9MDt1PGEubGVuZ3RoO3UrKyltPWFbdV0sKGl8fG1bMl0+ZikmJihkLnB1c2gobSksZS5udW1TaW1wbGlmaWVkKyspLGUubnVtUG9pbnRzKys7Mz09PWwmJnJld2luZChkLGEub3V0ZXIpLG8ucHVzaChkKX1lbHNlIGUubnVtUG9pbnRzKz1hLmxlbmd0aDtpZihvLmxlbmd0aCl7dmFyIGc9e2dlb21ldHJ5Om8sdHlwZTpsLHRhZ3M6bi50YWdzfHxudWxsfTtudWxsIT09bi5pZCYmKGcuaWQ9bi5pZCksZS5mZWF0dXJlcy5wdXNoKGcpfX1mdW5jdGlvbiByZXdpbmQoZSxuKXt2YXIgcj1zaWduZWRBcmVhKGUpO3I8MD09PW4mJmUucmV2ZXJzZSgpfWZ1bmN0aW9uIHNpZ25lZEFyZWEoZSl7Zm9yKHZhciBuLHIsaT0wLHQ9MCx1PWUubGVuZ3RoLGE9dS0xO3Q8dTthPXQrKyluPWVbdF0scj1lW2FdLGkrPShyWzBdLW5bMF0pKihuWzFdK3JbMV0pO3JldHVybiBpfW1vZHVsZS5leHBvcnRzPWNyZWF0ZVRpbGU7XG59LHt9XSwxNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0cmFuc2Zvcm1UaWxlKHIsdCl7aWYoci50cmFuc2Zvcm1lZClyZXR1cm4gcjt2YXIgbixlLG8sZj1yLnoyLGE9ci54LHM9ci55O2ZvcihuPTA7bjxyLmZlYXR1cmVzLmxlbmd0aDtuKyspe3ZhciBpPXIuZmVhdHVyZXNbbl0sdT1pLmdlb21ldHJ5LG09aS50eXBlO2lmKDE9PT1tKWZvcihlPTA7ZTx1Lmxlbmd0aDtlKyspdVtlXT10cmFuc2Zvcm1Qb2ludCh1W2VdLHQsZixhLHMpO2Vsc2UgZm9yKGU9MDtlPHUubGVuZ3RoO2UrKyl7dmFyIGw9dVtlXTtmb3Iobz0wO288bC5sZW5ndGg7bysrKWxbb109dHJhbnNmb3JtUG9pbnQobFtvXSx0LGYsYSxzKX19cmV0dXJuIHIudHJhbnNmb3JtZWQ9ITAscn1mdW5jdGlvbiB0cmFuc2Zvcm1Qb2ludChyLHQsbixlLG8pe3ZhciBmPU1hdGgucm91bmQodCooclswXSpuLWUpKSxhPU1hdGgucm91bmQodCooclsxXSpuLW8pKTtyZXR1cm5bZixhXX1leHBvcnRzLnRpbGU9dHJhbnNmb3JtVGlsZSxleHBvcnRzLnBvaW50PXRyYW5zZm9ybVBvaW50O1xufSx7fV0sMTU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gd3JhcChyLGUsdCl7dmFyIG89cixhPWNsaXAociwxLC0xLWUsZSwwLHQsLTEsMikscz1jbGlwKHIsMSwxLWUsMitlLDAsdCwtMSwyKTtyZXR1cm4oYXx8cykmJihvPWNsaXAociwxLC1lLDErZSwwLHQsLTEsMil8fFtdLGEmJihvPXNoaWZ0RmVhdHVyZUNvb3JkcyhhLDEpLmNvbmNhdChvKSkscyYmKG89by5jb25jYXQoc2hpZnRGZWF0dXJlQ29vcmRzKHMsLTEpKSkpLG99ZnVuY3Rpb24gc2hpZnRGZWF0dXJlQ29vcmRzKHIsZSl7Zm9yKHZhciB0PVtdLG89MDtvPHIubGVuZ3RoO28rKyl7dmFyIGEscz1yW29dLGk9cy50eXBlO2lmKDE9PT1pKWE9c2hpZnRDb29yZHMocy5nZW9tZXRyeSxlKTtlbHNle2E9W107Zm9yKHZhciB1PTA7dTxzLmdlb21ldHJ5Lmxlbmd0aDt1KyspYS5wdXNoKHNoaWZ0Q29vcmRzKHMuZ2VvbWV0cnlbdV0sZSkpfXQucHVzaChjcmVhdGVGZWF0dXJlKHMudGFncyxpLGEscy5pZCkpfXJldHVybiB0fWZ1bmN0aW9uIHNoaWZ0Q29vcmRzKHIsZSl7dmFyIHQ9W107dC5hcmVhPXIuYXJlYSx0LmRpc3Q9ci5kaXN0O2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXQucHVzaChbcltvXVswXStlLHJbb11bMV0scltvXVsyXV0pO3JldHVybiB0fXZhciBjbGlwPV9kZXJlcV8oXCIuL2NsaXBcIiksY3JlYXRlRmVhdHVyZT1fZGVyZXFfKFwiLi9mZWF0dXJlXCIpO21vZHVsZS5leHBvcnRzPXdyYXA7XG59LHtcIi4vY2xpcFwiOjgsXCIuL2ZlYXR1cmVcIjoxMH1dLDE2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIEdyaWRJbmRleCh0LHIsZSl7dmFyIHM9dGhpcy5jZWxscz1bXTtpZih0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpe3RoaXMuYXJyYXlCdWZmZXI9dDt2YXIgaT1uZXcgSW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTt0PWlbMF0scj1pWzFdLGU9aVsyXSx0aGlzLmQ9cisyKmU7Zm9yKHZhciBoPTA7aDx0aGlzLmQqdGhpcy5kO2grKyl7dmFyIG49aVtOVU1fUEFSQU1TK2hdLG89aVtOVU1fUEFSQU1TK2grMV07cy5wdXNoKG49PT1vP251bGw6aS5zdWJhcnJheShuLG8pKX12YXIgbD1pW05VTV9QQVJBTVMrcy5sZW5ndGhdLGE9aVtOVU1fUEFSQU1TK3MubGVuZ3RoKzFdO3RoaXMua2V5cz1pLnN1YmFycmF5KGwsYSksdGhpcy5iYm94ZXM9aS5zdWJhcnJheShhKSx0aGlzLmluc2VydD10aGlzLl9pbnNlcnRSZWFkb25seX1lbHNle3RoaXMuZD1yKzIqZTtmb3IodmFyIGQ9MDtkPHRoaXMuZCp0aGlzLmQ7ZCsrKXMucHVzaChbXSk7dGhpcy5rZXlzPVtdLHRoaXMuYmJveGVzPVtdfXRoaXMubj1yLHRoaXMuZXh0ZW50PXQsdGhpcy5wYWRkaW5nPWUsdGhpcy5zY2FsZT1yL3QsdGhpcy51aWQ9MDt2YXIgZj1lL3IqdDt0aGlzLm1pbj0tZix0aGlzLm1heD10K2Z9bW9kdWxlLmV4cG9ydHM9R3JpZEluZGV4O3ZhciBOVU1fUEFSQU1TPTM7R3JpZEluZGV4LnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24odCxyLGUscyxpKXt0aGlzLl9mb3JFYWNoQ2VsbChyLGUscyxpLHRoaXMuX2luc2VydENlbGwsdGhpcy51aWQrKyksdGhpcy5rZXlzLnB1c2godCksdGhpcy5iYm94ZXMucHVzaChyKSx0aGlzLmJib3hlcy5wdXNoKGUpLHRoaXMuYmJveGVzLnB1c2gocyksdGhpcy5iYm94ZXMucHVzaChpKX0sR3JpZEluZGV4LnByb3RvdHlwZS5faW5zZXJ0UmVhZG9ubHk9ZnVuY3Rpb24oKXt0aHJvd1wiQ2Fubm90IGluc2VydCBpbnRvIGEgR3JpZEluZGV4IGNyZWF0ZWQgZnJvbSBhbiBBcnJheUJ1ZmZlci5cIn0sR3JpZEluZGV4LnByb3RvdHlwZS5faW5zZXJ0Q2VsbD1mdW5jdGlvbih0LHIsZSxzLGksaCl7dGhpcy5jZWxsc1tpXS5wdXNoKGgpfSxHcmlkSW5kZXgucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKHQscixlLHMpe3ZhciBpPXRoaXMubWluLGg9dGhpcy5tYXg7aWYodDw9aSYmcjw9aSYmaDw9ZSYmaDw9cylyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5rZXlzKTt2YXIgbj1bXSxvPXt9O3JldHVybiB0aGlzLl9mb3JFYWNoQ2VsbCh0LHIsZSxzLHRoaXMuX3F1ZXJ5Q2VsbCxuLG8pLG59LEdyaWRJbmRleC5wcm90b3R5cGUuX3F1ZXJ5Q2VsbD1mdW5jdGlvbih0LHIsZSxzLGksaCxuKXt2YXIgbz10aGlzLmNlbGxzW2ldO2lmKG51bGwhPT1vKWZvcih2YXIgbD10aGlzLmtleXMsYT10aGlzLmJib3hlcyxkPTA7ZDxvLmxlbmd0aDtkKyspe3ZhciBmPW9bZF07aWYodm9pZCAwPT09bltmXSl7dmFyIHU9NCpmO3Q8PWFbdSsyXSYmcjw9YVt1KzNdJiZlPj1hW3UrMF0mJnM+PWFbdSsxXT8obltmXT0hMCxoLnB1c2gobFtmXSkpOm5bZl09ITF9fX0sR3JpZEluZGV4LnByb3RvdHlwZS5fZm9yRWFjaENlbGw9ZnVuY3Rpb24odCxyLGUscyxpLGgsbil7Zm9yKHZhciBvPXRoaXMuX2NvbnZlcnRUb0NlbGxDb29yZCh0KSxsPXRoaXMuX2NvbnZlcnRUb0NlbGxDb29yZChyKSxhPXRoaXMuX2NvbnZlcnRUb0NlbGxDb29yZChlKSxkPXRoaXMuX2NvbnZlcnRUb0NlbGxDb29yZChzKSxmPW87Zjw9YTtmKyspZm9yKHZhciB1PWw7dTw9ZDt1Kyspe3ZhciB5PXRoaXMuZCp1K2Y7aWYoaS5jYWxsKHRoaXMsdCxyLGUscyx5LGgsbikpcmV0dXJufX0sR3JpZEluZGV4LnByb3RvdHlwZS5fY29udmVydFRvQ2VsbENvb3JkPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKHRoaXMuZC0xLE1hdGguZmxvb3IodCp0aGlzLnNjYWxlKSt0aGlzLnBhZGRpbmcpKX0sR3JpZEluZGV4LnByb3RvdHlwZS50b0FycmF5QnVmZmVyPWZ1bmN0aW9uKCl7aWYodGhpcy5hcnJheUJ1ZmZlcilyZXR1cm4gdGhpcy5hcnJheUJ1ZmZlcjtmb3IodmFyIHQ9dGhpcy5jZWxscyxyPU5VTV9QQVJBTVMrdGhpcy5jZWxscy5sZW5ndGgrMSsxLGU9MCxzPTA7czx0aGlzLmNlbGxzLmxlbmd0aDtzKyspZSs9dGhpcy5jZWxsc1tzXS5sZW5ndGg7dmFyIGk9bmV3IEludDMyQXJyYXkocitlK3RoaXMua2V5cy5sZW5ndGgrdGhpcy5iYm94ZXMubGVuZ3RoKTtpWzBdPXRoaXMuZXh0ZW50LGlbMV09dGhpcy5uLGlbMl09dGhpcy5wYWRkaW5nO2Zvcih2YXIgaD1yLG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIG89dFtuXTtpW05VTV9QQVJBTVMrbl09aCxpLnNldChvLGgpLGgrPW8ubGVuZ3RofXJldHVybiBpW05VTV9QQVJBTVMrdC5sZW5ndGhdPWgsaS5zZXQodGhpcy5rZXlzLGgpLGgrPXRoaXMua2V5cy5sZW5ndGgsaVtOVU1fUEFSQU1TK3QubGVuZ3RoKzFdPWgsaS5zZXQodGhpcy5iYm94ZXMsaCksaCs9dGhpcy5iYm94ZXMubGVuZ3RoLGkuYnVmZmVyfTtcbn0se31dLDE3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmV4cG9ydHMucmVhZD1mdW5jdGlvbihhLG8sdCxyLGgpe3ZhciBNLHAsdz04Kmgtci0xLGY9KDE8PHcpLTEsZT1mPj4xLGk9LTcsTj10P2gtMTowLG49dD8tMToxLHM9YVtvK05dO2ZvcihOKz1uLE09cyYoMTw8LWkpLTEscz4+PS1pLGkrPXc7aT4wO009MjU2Kk0rYVtvK05dLE4rPW4saS09OCk7Zm9yKHA9TSYoMTw8LWkpLTEsTT4+PS1pLGkrPXI7aT4wO3A9MjU2KnArYVtvK05dLE4rPW4saS09OCk7aWYoMD09PU0pTT0xLWU7ZWxzZXtpZihNPT09ZilyZXR1cm4gcD9OYU46KHM/LTE6MSkqKDEvMCk7cCs9TWF0aC5wb3coMixyKSxNLT1lfXJldHVybihzPy0xOjEpKnAqTWF0aC5wb3coMixNLXIpfSxleHBvcnRzLndyaXRlPWZ1bmN0aW9uKGEsbyx0LHIsaCxNKXt2YXIgcCx3LGYsZT04Kk0taC0xLGk9KDE8PGUpLTEsTj1pPj4xLG49MjM9PT1oP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxzPXI/MDpNLTEsdT1yPzE6LTEsbD1vPDB8fDA9PT1vJiYxL288MD8xOjA7Zm9yKG89TWF0aC5hYnMobyksaXNOYU4obyl8fG89PT0xLzA/KHc9aXNOYU4obyk/MTowLHA9aSk6KHA9TWF0aC5mbG9vcihNYXRoLmxvZyhvKS9NYXRoLkxOMiksbyooZj1NYXRoLnBvdygyLC1wKSk8MSYmKHAtLSxmKj0yKSxvKz1wK04+PTE/bi9mOm4qTWF0aC5wb3coMiwxLU4pLG8qZj49MiYmKHArKyxmLz0yKSxwK04+PWk/KHc9MCxwPWkpOnArTj49MT8odz0obypmLTEpKk1hdGgucG93KDIsaCkscCs9Tik6KHc9bypNYXRoLnBvdygyLE4tMSkqTWF0aC5wb3coMixoKSxwPTApKTtoPj04O2FbdCtzXT0yNTUmdyxzKz11LHcvPTI1NixoLT04KTtmb3IocD1wPDxofHcsZSs9aDtlPjA7YVt0K3NdPTI1NSZwLHMrPXUscC89MjU2LGUtPTgpO2FbdCtzLXVdfD0xMjgqbH07XG59LHt9XSwxODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBrZGJ1c2godCxpLGUscyxuKXtyZXR1cm4gbmV3IEtEQnVzaCh0LGksZSxzLG4pfWZ1bmN0aW9uIEtEQnVzaCh0LGksZSxzLG4pe2k9aXx8ZGVmYXVsdEdldFgsZT1lfHxkZWZhdWx0R2V0WSxuPW58fEFycmF5LHRoaXMubm9kZVNpemU9c3x8NjQsdGhpcy5wb2ludHM9dCx0aGlzLmlkcz1uZXcgbih0Lmxlbmd0aCksdGhpcy5jb29yZHM9bmV3IG4oMip0Lmxlbmd0aCk7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspdGhpcy5pZHNbcl09cix0aGlzLmNvb3Jkc1syKnJdPWkodFtyXSksdGhpcy5jb29yZHNbMipyKzFdPWUodFtyXSk7c29ydCh0aGlzLmlkcyx0aGlzLmNvb3Jkcyx0aGlzLm5vZGVTaXplLDAsdGhpcy5pZHMubGVuZ3RoLTEsMCl9ZnVuY3Rpb24gZGVmYXVsdEdldFgodCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gZGVmYXVsdEdldFkodCl7cmV0dXJuIHRbMV19dmFyIHNvcnQ9X2RlcmVxXyhcIi4vc29ydFwiKSxyYW5nZT1fZGVyZXFfKFwiLi9yYW5nZVwiKSx3aXRoaW49X2RlcmVxXyhcIi4vd2l0aGluXCIpO21vZHVsZS5leHBvcnRzPWtkYnVzaCxLREJ1c2gucHJvdG90eXBlPXtyYW5nZTpmdW5jdGlvbih0LGksZSxzKXtyZXR1cm4gcmFuZ2UodGhpcy5pZHMsdGhpcy5jb29yZHMsdCxpLGUscyx0aGlzLm5vZGVTaXplKX0sd2l0aGluOmZ1bmN0aW9uKHQsaSxlKXtyZXR1cm4gd2l0aGluKHRoaXMuaWRzLHRoaXMuY29vcmRzLHQsaSxlLHRoaXMubm9kZVNpemUpfX07XG59LHtcIi4vcmFuZ2VcIjoxOSxcIi4vc29ydFwiOjIwLFwiLi93aXRoaW5cIjoyMX1dLDE5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIHJhbmdlKHAscixzLHUsaCxlLG8pe2Zvcih2YXIgYSx0LG49WzAscC5sZW5ndGgtMSwwXSxmPVtdO24ubGVuZ3RoOyl7dmFyIGw9bi5wb3AoKSx2PW4ucG9wKCksZz1uLnBvcCgpO2lmKHYtZzw9bylmb3IodmFyIGk9ZztpPD12O2krKylhPXJbMippXSx0PXJbMippKzFdLGE+PXMmJmE8PWgmJnQ+PXUmJnQ8PWUmJmYucHVzaChwW2ldKTtlbHNle3ZhciBjPU1hdGguZmxvb3IoKGcrdikvMik7YT1yWzIqY10sdD1yWzIqYysxXSxhPj1zJiZhPD1oJiZ0Pj11JiZ0PD1lJiZmLnB1c2gocFtjXSk7dmFyIGQ9KGwrMSklMjsoMD09PWw/czw9YTp1PD10KSYmKG4ucHVzaChnKSxuLnB1c2goYy0xKSxuLnB1c2goZCkpLCgwPT09bD9oPj1hOmU+PXQpJiYobi5wdXNoKGMrMSksbi5wdXNoKHYpLG4ucHVzaChkKSl9fXJldHVybiBmfW1vZHVsZS5leHBvcnRzPXJhbmdlO1xufSx7fV0sMjA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gc29ydEtEKHQsYSxvLHMscixlKXtpZighKHItczw9bykpe3ZhciBmPU1hdGguZmxvb3IoKHMrcikvMik7c2VsZWN0KHQsYSxmLHMscixlJTIpLHNvcnRLRCh0LGEsbyxzLGYtMSxlKzEpLHNvcnRLRCh0LGEsbyxmKzEscixlKzEpfX1mdW5jdGlvbiBzZWxlY3QodCxhLG8scyxyLGUpe2Zvcig7cj5zOyl7aWYoci1zPjYwMCl7dmFyIGY9ci1zKzEscD1vLXMrMSx3PU1hdGgubG9nKGYpLG09LjUqTWF0aC5leHAoMip3LzMpLG49LjUqTWF0aC5zcXJ0KHcqbSooZi1tKS9mKSoocC1mLzI8MD8tMToxKSxjPU1hdGgubWF4KHMsTWF0aC5mbG9vcihvLXAqbS9mK24pKSxoPU1hdGgubWluKHIsTWF0aC5mbG9vcihvKyhmLXApKm0vZituKSk7c2VsZWN0KHQsYSxvLGMsaCxlKX12YXIgaT1hWzIqbytlXSxsPXMsTT1yO2Zvcihzd2FwSXRlbSh0LGEscyxvKSxhWzIqcitlXT5pJiZzd2FwSXRlbSh0LGEscyxyKTtsPE07KXtmb3Ioc3dhcEl0ZW0odCxhLGwsTSksbCsrLE0tLTthWzIqbCtlXTxpOylsKys7Zm9yKDthWzIqTStlXT5pOylNLS19YVsyKnMrZV09PT1pP3N3YXBJdGVtKHQsYSxzLE0pOihNKyssc3dhcEl0ZW0odCxhLE0scikpLE08PW8mJihzPU0rMSksbzw9TSYmKHI9TS0xKX19ZnVuY3Rpb24gc3dhcEl0ZW0odCxhLG8scyl7c3dhcCh0LG8scyksc3dhcChhLDIqbywyKnMpLHN3YXAoYSwyKm8rMSwyKnMrMSl9ZnVuY3Rpb24gc3dhcCh0LGEsbyl7dmFyIHM9dFthXTt0W2FdPXRbb10sdFtvXT1zfW1vZHVsZS5leHBvcnRzPXNvcnRLRDtcbn0se31dLDIxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIHdpdGhpbihzLHAscix0LHUsaCl7Zm9yKHZhciBpPVswLHMubGVuZ3RoLTEsMF0sbz1bXSxuPXUqdTtpLmxlbmd0aDspe3ZhciBlPWkucG9wKCksYT1pLnBvcCgpLGY9aS5wb3AoKTtpZihhLWY8PWgpZm9yKHZhciB2PWY7djw9YTt2Kyspc3FEaXN0KHBbMip2XSxwWzIqdisxXSxyLHQpPD1uJiZvLnB1c2goc1t2XSk7ZWxzZXt2YXIgbD1NYXRoLmZsb29yKChmK2EpLzIpLGM9cFsyKmxdLHE9cFsyKmwrMV07c3FEaXN0KGMscSxyLHQpPD1uJiZvLnB1c2goc1tsXSk7dmFyIEQ9KGUrMSklMjsoMD09PWU/ci11PD1jOnQtdTw9cSkmJihpLnB1c2goZiksaS5wdXNoKGwtMSksaS5wdXNoKEQpKSwoMD09PWU/cit1Pj1jOnQrdT49cSkmJihpLnB1c2gobCsxKSxpLnB1c2goYSksaS5wdXNoKEQpKX19cmV0dXJuIG99ZnVuY3Rpb24gc3FEaXN0KHMscCxyLHQpe3ZhciB1PXMtcixoPXAtdDtyZXR1cm4gdSp1K2gqaH1tb2R1bGUuZXhwb3J0cz13aXRoaW47XG59LHt9XSwyMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBpc1N1cHBvcnRlZChlKXtyZXR1cm4hIShpc0Jyb3dzZXIoKSYmaXNBcnJheVN1cHBvcnRlZCgpJiZpc0Z1bmN0aW9uU3VwcG9ydGVkKCkmJmlzT2JqZWN0U3VwcG9ydGVkKCkmJmlzSlNPTlN1cHBvcnRlZCgpJiZpc1dvcmtlclN1cHBvcnRlZCgpJiZpc1VpbnQ4Q2xhbXBlZEFycmF5U3VwcG9ydGVkKCkmJmlzV2ViR0xTdXBwb3J0ZWRDYWNoZWQoZSYmZS5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0KSl9ZnVuY3Rpb24gaXNCcm93c2VyKCl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGRvY3VtZW50fWZ1bmN0aW9uIGlzQXJyYXlTdXBwb3J0ZWQoKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlJiZBcnJheS5wcm90b3R5cGUuZXZlcnkmJkFycmF5LnByb3RvdHlwZS5maWx0ZXImJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoJiZBcnJheS5wcm90b3R5cGUuaW5kZXhPZiYmQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mJiZBcnJheS5wcm90b3R5cGUubWFwJiZBcnJheS5wcm90b3R5cGUuc29tZSYmQXJyYXkucHJvdG90eXBlLnJlZHVjZSYmQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0JiZBcnJheS5pc0FycmF5fWZ1bmN0aW9uIGlzRnVuY3Rpb25TdXBwb3J0ZWQoKXtyZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlJiZGdW5jdGlvbi5wcm90b3R5cGUuYmluZH1mdW5jdGlvbiBpc09iamVjdFN1cHBvcnRlZCgpe3JldHVybiBPYmplY3Qua2V5cyYmT2JqZWN0LmNyZWF0ZSYmT2JqZWN0LmdldFByb3RvdHlwZU9mJiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyYmT2JqZWN0LmlzU2VhbGVkJiZPYmplY3QuaXNGcm96ZW4mJk9iamVjdC5pc0V4dGVuc2libGUmJk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3ImJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSYmT2JqZWN0LmRlZmluZVByb3BlcnRpZXMmJk9iamVjdC5zZWFsJiZPYmplY3QuZnJlZXplJiZPYmplY3QucHJldmVudEV4dGVuc2lvbnN9ZnVuY3Rpb24gaXNKU09OU3VwcG9ydGVkKCl7cmV0dXJuXCJKU09OXCJpbiB3aW5kb3cmJlwicGFyc2VcImluIEpTT04mJlwic3RyaW5naWZ5XCJpbiBKU09OfWZ1bmN0aW9uIGlzV29ya2VyU3VwcG9ydGVkKCl7cmV0dXJuXCJXb3JrZXJcImluIHdpbmRvd31mdW5jdGlvbiBpc1VpbnQ4Q2xhbXBlZEFycmF5U3VwcG9ydGVkKCl7cmV0dXJuXCJVaW50OENsYW1wZWRBcnJheVwiaW4gd2luZG93fWZ1bmN0aW9uIGlzV2ViR0xTdXBwb3J0ZWRDYWNoZWQoZSl7cmV0dXJuIHZvaWQgMD09PWlzV2ViR0xTdXBwb3J0ZWRDYWNoZVtlXSYmKGlzV2ViR0xTdXBwb3J0ZWRDYWNoZVtlXT1pc1dlYkdMU3VwcG9ydGVkKGUpKSxpc1dlYkdMU3VwcG9ydGVkQ2FjaGVbZV19ZnVuY3Rpb24gaXNXZWJHTFN1cHBvcnRlZChlKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLHI9T2JqZWN0LmNyZWF0ZShpc1N1cHBvcnRlZC53ZWJHTENvbnRleHRBdHRyaWJ1dGVzKTtyZXR1cm4gci5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0PWUsdC5wcm9iYWJseVN1cHBvcnRzQ29udGV4dD90LnByb2JhYmx5U3VwcG9ydHNDb250ZXh0KFwid2ViZ2xcIixyKXx8dC5wcm9iYWJseVN1cHBvcnRzQ29udGV4dChcImV4cGVyaW1lbnRhbC13ZWJnbFwiLHIpOnQuc3VwcG9ydHNDb250ZXh0P3Quc3VwcG9ydHNDb250ZXh0KFwid2ViZ2xcIixyKXx8dC5zdXBwb3J0c0NvbnRleHQoXCJleHBlcmltZW50YWwtd2ViZ2xcIixyKTp0LmdldENvbnRleHQoXCJ3ZWJnbFwiLHIpfHx0LmdldENvbnRleHQoXCJleHBlcmltZW50YWwtd2ViZ2xcIixyKX1cInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1pc1N1cHBvcnRlZDp3aW5kb3cmJih3aW5kb3cubWFwYm94Z2w9d2luZG93Lm1hcGJveGdsfHx7fSx3aW5kb3cubWFwYm94Z2wuc3VwcG9ydGVkPWlzU3VwcG9ydGVkKTt2YXIgaXNXZWJHTFN1cHBvcnRlZENhY2hlPXt9O2lzU3VwcG9ydGVkLndlYkdMQ29udGV4dEF0dHJpYnV0ZXM9e2FudGlhbGlhczohMSxhbHBoYTohMCxzdGVuY2lsOiEwLGRlcHRoOiEwfTtcbn0se31dLDIzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbihmdW5jdGlvbiAocHJvY2Vzcyl7XG5mdW5jdGlvbiBub3JtYWxpemVBcnJheShyLHQpe2Zvcih2YXIgZT0wLG49ci5sZW5ndGgtMTtuPj0wO24tLSl7dmFyIHM9cltuXTtcIi5cIj09PXM/ci5zcGxpY2UobiwxKTpcIi4uXCI9PT1zPyhyLnNwbGljZShuLDEpLGUrKyk6ZSYmKHIuc3BsaWNlKG4sMSksZS0tKX1pZih0KWZvcig7ZS0tO2Upci51bnNoaWZ0KFwiLi5cIik7cmV0dXJuIHJ9ZnVuY3Rpb24gZmlsdGVyKHIsdCl7aWYoci5maWx0ZXIpcmV0dXJuIHIuZmlsdGVyKHQpO2Zvcih2YXIgZT1bXSxuPTA7bjxyLmxlbmd0aDtuKyspdChyW25dLG4scikmJmUucHVzaChyW25dKTtyZXR1cm4gZX12YXIgc3BsaXRQYXRoUmU9L14oXFwvP3wpKFtcXHNcXFNdKj8pKCg/OlxcLnsxLDJ9fFteXFwvXSs/fCkoXFwuW14uXFwvXSp8KSkoPzpbXFwvXSopJC8sc3BsaXRQYXRoPWZ1bmN0aW9uKHIpe3JldHVybiBzcGxpdFBhdGhSZS5leGVjKHIpLnNsaWNlKDEpfTtleHBvcnRzLnJlc29sdmU9ZnVuY3Rpb24oKXtmb3IodmFyIHI9XCJcIix0PSExLGU9YXJndW1lbnRzLmxlbmd0aC0xO2U+PS0xJiYhdDtlLS0pe3ZhciBuPWU+PTA/YXJndW1lbnRzW2VdOnByb2Nlc3MuY3dkKCk7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50cyB0byBwYXRoLnJlc29sdmUgbXVzdCBiZSBzdHJpbmdzXCIpO24mJihyPW4rXCIvXCIrcix0PVwiL1wiPT09bi5jaGFyQXQoMCkpfXJldHVybiByPW5vcm1hbGl6ZUFycmF5KGZpbHRlcihyLnNwbGl0KFwiL1wiKSxmdW5jdGlvbihyKXtyZXR1cm4hIXJ9KSwhdCkuam9pbihcIi9cIiksKHQ/XCIvXCI6XCJcIikrcnx8XCIuXCJ9LGV4cG9ydHMubm9ybWFsaXplPWZ1bmN0aW9uKHIpe3ZhciB0PWV4cG9ydHMuaXNBYnNvbHV0ZShyKSxlPVwiL1wiPT09c3Vic3RyKHIsLTEpO3JldHVybiByPW5vcm1hbGl6ZUFycmF5KGZpbHRlcihyLnNwbGl0KFwiL1wiKSxmdW5jdGlvbihyKXtyZXR1cm4hIXJ9KSwhdCkuam9pbihcIi9cIikscnx8dHx8KHI9XCIuXCIpLHImJmUmJihyKz1cIi9cIiksKHQ/XCIvXCI6XCJcIikrcn0sZXhwb3J0cy5pc0Fic29sdXRlPWZ1bmN0aW9uKHIpe3JldHVyblwiL1wiPT09ci5jaGFyQXQoMCl9LGV4cG9ydHMuam9pbj1mdW5jdGlvbigpe3ZhciByPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTtyZXR1cm4gZXhwb3J0cy5ub3JtYWxpemUoZmlsdGVyKHIsZnVuY3Rpb24ocix0KXtpZihcInN0cmluZ1wiIT10eXBlb2Ygcil0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnRzIHRvIHBhdGguam9pbiBtdXN0IGJlIHN0cmluZ3NcIik7cmV0dXJuIHJ9KS5qb2luKFwiL1wiKSl9LGV4cG9ydHMucmVsYXRpdmU9ZnVuY3Rpb24ocix0KXtmdW5jdGlvbiBlKHIpe2Zvcih2YXIgdD0wO3Q8ci5sZW5ndGgmJlwiXCI9PT1yW3RdO3QrKyk7Zm9yKHZhciBlPXIubGVuZ3RoLTE7ZT49MCYmXCJcIj09PXJbZV07ZS0tKTtyZXR1cm4gdD5lP1tdOnIuc2xpY2UodCxlLXQrMSl9cj1leHBvcnRzLnJlc29sdmUocikuc3Vic3RyKDEpLHQ9ZXhwb3J0cy5yZXNvbHZlKHQpLnN1YnN0cigxKTtmb3IodmFyIG49ZShyLnNwbGl0KFwiL1wiKSkscz1lKHQuc3BsaXQoXCIvXCIpKSxpPU1hdGgubWluKG4ubGVuZ3RoLHMubGVuZ3RoKSxvPWksdT0wO3U8aTt1KyspaWYoblt1XSE9PXNbdV0pe289dTticmVha31mb3IodmFyIGw9W10sdT1vO3U8bi5sZW5ndGg7dSsrKWwucHVzaChcIi4uXCIpO3JldHVybiBsPWwuY29uY2F0KHMuc2xpY2UobykpLGwuam9pbihcIi9cIil9LGV4cG9ydHMuc2VwPVwiL1wiLGV4cG9ydHMuZGVsaW1pdGVyPVwiOlwiLGV4cG9ydHMuZGlybmFtZT1mdW5jdGlvbihyKXt2YXIgdD1zcGxpdFBhdGgociksZT10WzBdLG49dFsxXTtyZXR1cm4gZXx8bj8obiYmKG49bi5zdWJzdHIoMCxuLmxlbmd0aC0xKSksZStuKTpcIi5cIn0sZXhwb3J0cy5iYXNlbmFtZT1mdW5jdGlvbihyLHQpe3ZhciBlPXNwbGl0UGF0aChyKVsyXTtyZXR1cm4gdCYmZS5zdWJzdHIoLTEqdC5sZW5ndGgpPT09dCYmKGU9ZS5zdWJzdHIoMCxlLmxlbmd0aC10Lmxlbmd0aCkpLGV9LGV4cG9ydHMuZXh0bmFtZT1mdW5jdGlvbihyKXtyZXR1cm4gc3BsaXRQYXRoKHIpWzNdfTt2YXIgc3Vic3RyPVwiYlwiPT09XCJhYlwiLnN1YnN0cigtMSk/ZnVuY3Rpb24ocix0LGUpe3JldHVybiByLnN1YnN0cih0LGUpfTpmdW5jdGlvbihyLHQsZSl7cmV0dXJuIHQ8MCYmKHQ9ci5sZW5ndGgrdCksci5zdWJzdHIodCxlKX07XG59KS5jYWxsKHRoaXMsX2RlcmVxXygnX3Byb2Nlc3MnKSlcblxufSx7XCJfcHJvY2Vzc1wiOjI3fV0sMjQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gQnVmZmVyKHQpe3ZhciBlO3QmJnQubGVuZ3RoJiYoZT10LHQ9ZS5sZW5ndGgpO3ZhciByPW5ldyBVaW50OEFycmF5KHR8fDApO3JldHVybiBlJiZyLnNldChlKSxyLnJlYWRVSW50MzJMRT1CdWZmZXJNZXRob2RzLnJlYWRVSW50MzJMRSxyLndyaXRlVUludDMyTEU9QnVmZmVyTWV0aG9kcy53cml0ZVVJbnQzMkxFLHIucmVhZEludDMyTEU9QnVmZmVyTWV0aG9kcy5yZWFkSW50MzJMRSxyLndyaXRlSW50MzJMRT1CdWZmZXJNZXRob2RzLndyaXRlSW50MzJMRSxyLnJlYWRGbG9hdExFPUJ1ZmZlck1ldGhvZHMucmVhZEZsb2F0TEUsci53cml0ZUZsb2F0TEU9QnVmZmVyTWV0aG9kcy53cml0ZUZsb2F0TEUsci5yZWFkRG91YmxlTEU9QnVmZmVyTWV0aG9kcy5yZWFkRG91YmxlTEUsci53cml0ZURvdWJsZUxFPUJ1ZmZlck1ldGhvZHMud3JpdGVEb3VibGVMRSxyLnRvU3RyaW5nPUJ1ZmZlck1ldGhvZHMudG9TdHJpbmcsci53cml0ZT1CdWZmZXJNZXRob2RzLndyaXRlLHIuc2xpY2U9QnVmZmVyTWV0aG9kcy5zbGljZSxyLmNvcHk9QnVmZmVyTWV0aG9kcy5jb3B5LHIuX2lzQnVmZmVyPSEwLHJ9ZnVuY3Rpb24gZW5jb2RlU3RyaW5nKHQpe2Zvcih2YXIgZSxyLG49dC5sZW5ndGgsaT1bXSxvPTA7bzxuO28rKyl7aWYoZT10LmNoYXJDb2RlQXQobyksZT41NTI5NSYmZTw1NzM0NCl7aWYoIXIpe2U+NTYzMTl8fG8rMT09PW4/aS5wdXNoKDIzOSwxOTEsMTg5KTpyPWU7Y29udGludWV9aWYoZTw1NjMyMCl7aS5wdXNoKDIzOSwxOTEsMTg5KSxyPWU7Y29udGludWV9ZT1yLTU1Mjk2PDwxMHxlLTU2MzIwfDY1NTM2LHI9bnVsbH1lbHNlIHImJihpLnB1c2goMjM5LDE5MSwxODkpLHI9bnVsbCk7ZTwxMjg/aS5wdXNoKGUpOmU8MjA0OD9pLnB1c2goZT4+NnwxOTIsNjMmZXwxMjgpOmU8NjU1MzY/aS5wdXNoKGU+PjEyfDIyNCxlPj42JjYzfDEyOCw2MyZlfDEyOCk6aS5wdXNoKGU+PjE4fDI0MCxlPj4xMiY2M3wxMjgsZT4+NiY2M3wxMjgsNjMmZXwxMjgpfXJldHVybiBpfW1vZHVsZS5leHBvcnRzPUJ1ZmZlcjt2YXIgaWVlZTc1ND1fZGVyZXFfKFwiaWVlZTc1NFwiKSxCdWZmZXJNZXRob2RzLGxhc3RTdHIsbGFzdFN0ckVuY29kZWQ7QnVmZmVyTWV0aG9kcz17cmVhZFVJbnQzMkxFOmZ1bmN0aW9uKHQpe3JldHVybih0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2KSsxNjc3NzIxNip0aGlzW3QrM119LHdyaXRlVUludDMyTEU6ZnVuY3Rpb24odCxlKXt0aGlzW2VdPXQsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzNdPXQ+Pj4yNH0scmVhZEludDMyTEU6ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTYpKyh0aGlzW3QrM108PDI0KX0scmVhZEZsb2F0TEU6ZnVuY3Rpb24odCl7cmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLHQsITAsMjMsNCl9LHJlYWREb3VibGVMRTpmdW5jdGlvbih0KXtyZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsdCwhMCw1Miw4KX0sd3JpdGVGbG9hdExFOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGllZWU3NTQud3JpdGUodGhpcyx0LGUsITAsMjMsNCl9LHdyaXRlRG91YmxlTEU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gaWVlZTc1NC53cml0ZSh0aGlzLHQsZSwhMCw1Miw4KX0sdG9TdHJpbmc6ZnVuY3Rpb24odCxlLHIpe3ZhciBuPVwiXCIsaT1cIlwiO2U9ZXx8MCxyPU1hdGgubWluKHRoaXMubGVuZ3RoLHJ8fHRoaXMubGVuZ3RoKTtmb3IodmFyIG89ZTtvPHI7bysrKXt2YXIgdT10aGlzW29dO3U8PTEyNz8obis9ZGVjb2RlVVJJQ29tcG9uZW50KGkpK1N0cmluZy5mcm9tQ2hhckNvZGUodSksaT1cIlwiKTppKz1cIiVcIit1LnRvU3RyaW5nKDE2KX1yZXR1cm4gbis9ZGVjb2RlVVJJQ29tcG9uZW50KGkpfSx3cml0ZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10PT09bGFzdFN0cj9sYXN0U3RyRW5jb2RlZDplbmNvZGVTdHJpbmcodCksbj0wO248ci5sZW5ndGg7bisrKXRoaXNbZStuXT1yW25dfSxzbGljZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnN1YmFycmF5KHQsZSl9LGNvcHk6ZnVuY3Rpb24odCxlKXtlPWV8fDA7Zm9yKHZhciByPTA7cjx0aGlzLmxlbmd0aDtyKyspdFtlK3JdPXRoaXNbcl19fSxCdWZmZXJNZXRob2RzLndyaXRlSW50MzJMRT1CdWZmZXJNZXRob2RzLndyaXRlVUludDMyTEUsQnVmZmVyLmJ5dGVMZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGxhc3RTdHI9dCxsYXN0U3RyRW5jb2RlZD1lbmNvZGVTdHJpbmcodCksbGFzdFN0ckVuY29kZWQubGVuZ3RofSxCdWZmZXIuaXNCdWZmZXI9ZnVuY3Rpb24odCl7cmV0dXJuISghdHx8IXQuX2lzQnVmZmVyKX07XG59LHtcImllZWU3NTRcIjoxN31dLDI1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbihmdW5jdGlvbiAoZ2xvYmFsKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFBiZih0KXt0aGlzLmJ1Zj1CdWZmZXIuaXNCdWZmZXIodCk/dDpuZXcgQnVmZmVyKHR8fDApLHRoaXMucG9zPTAsdGhpcy5sZW5ndGg9dGhpcy5idWYubGVuZ3RofWZ1bmN0aW9uIHJlYWRWYXJpbnRSZW1haW5kZXIodCxpKXt2YXIgZSxyPWkuYnVmO2lmKGU9cltpLnBvcysrXSx0Kz0yNjg0MzU0NTYqKDEyNyZlKSxlPDEyOClyZXR1cm4gdDtpZihlPXJbaS5wb3MrK10sdCs9MzQzNTk3MzgzNjgqKDEyNyZlKSxlPDEyOClyZXR1cm4gdDtpZihlPXJbaS5wb3MrK10sdCs9NDM5ODA0NjUxMTEwNCooMTI3JmUpLGU8MTI4KXJldHVybiB0O2lmKGU9cltpLnBvcysrXSx0Kz01NjI5NDk5NTM0MjEzMTIqKDEyNyZlKSxlPDEyOClyZXR1cm4gdDtpZihlPXJbaS5wb3MrK10sdCs9NzIwNTc1OTQwMzc5Mjc5NDAqKDEyNyZlKSxlPDEyOClyZXR1cm4gdDtpZihlPXJbaS5wb3MrK10sdCs9MHg4MDAwMDAwMDAwMDAwMDAwKigxMjcmZSksZTwxMjgpcmV0dXJuIHQ7dGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgdmFyaW50IG5vdCBtb3JlIHRoYW4gMTAgYnl0ZXNcIil9ZnVuY3Rpb24gd3JpdGVCaWdWYXJpbnQodCxpKXtpLnJlYWxsb2MoMTApO2Zvcih2YXIgZT1pLnBvcysxMDt0Pj0xOyl7aWYoaS5wb3M+PWUpdGhyb3cgbmV3IEVycm9yKFwiR2l2ZW4gdmFyaW50IGRvZXNuJ3QgZml0IGludG8gMTAgYnl0ZXNcIik7dmFyIHI9MjU1JnQ7aS5idWZbaS5wb3MrK109cnwodD49MTI4PzEyODowKSx0Lz0xMjh9fWZ1bmN0aW9uIHJlYWxsb2NGb3JSYXdNZXNzYWdlKHQsaSxlKXt2YXIgcj1pPD0xNjM4Mz8xOmk8PTIwOTcxNTE/MjppPD0yNjg0MzU0NTU/MzpNYXRoLmNlaWwoTWF0aC5sb2coaSkvKDcqTWF0aC5MTjIpKTtlLnJlYWxsb2Mocik7Zm9yKHZhciBzPWUucG9zLTE7cz49dDtzLS0pZS5idWZbcytyXT1lLmJ1ZltzXX1mdW5jdGlvbiB3cml0ZVBhY2tlZFZhcmludCh0LGkpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWkud3JpdGVWYXJpbnQodFtlXSl9ZnVuY3Rpb24gd3JpdGVQYWNrZWRTVmFyaW50KHQsaSl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspaS53cml0ZVNWYXJpbnQodFtlXSl9ZnVuY3Rpb24gd3JpdGVQYWNrZWRGbG9hdCh0LGkpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWkud3JpdGVGbG9hdCh0W2VdKX1mdW5jdGlvbiB3cml0ZVBhY2tlZERvdWJsZSh0LGkpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWkud3JpdGVEb3VibGUodFtlXSl9ZnVuY3Rpb24gd3JpdGVQYWNrZWRCb29sZWFuKHQsaSl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspaS53cml0ZUJvb2xlYW4odFtlXSl9ZnVuY3Rpb24gd3JpdGVQYWNrZWRGaXhlZDMyKHQsaSl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspaS53cml0ZUZpeGVkMzIodFtlXSl9ZnVuY3Rpb24gd3JpdGVQYWNrZWRTRml4ZWQzMih0LGkpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWkud3JpdGVTRml4ZWQzMih0W2VdKX1mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkNjQodCxpKXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKylpLndyaXRlRml4ZWQ2NCh0W2VdKX1mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDY0KHQsaSl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspaS53cml0ZVNGaXhlZDY0KHRbZV0pfW1vZHVsZS5leHBvcnRzPVBiZjt2YXIgQnVmZmVyPWdsb2JhbC5CdWZmZXJ8fF9kZXJlcV8oXCIuL2J1ZmZlclwiKTtQYmYuVmFyaW50PTAsUGJmLkZpeGVkNjQ9MSxQYmYuQnl0ZXM9MixQYmYuRml4ZWQzMj01O3ZhciBTSElGVF9MRUZUXzMyPTQyOTQ5NjcyOTYsU0hJRlRfUklHSFRfMzI9MS9TSElGVF9MRUZUXzMyLFBPV18yXzYzPU1hdGgucG93KDIsNjMpO1BiZi5wcm90b3R5cGU9e2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmJ1Zj1udWxsfSxyZWFkRmllbGRzOmZ1bmN0aW9uKHQsaSxlKXtmb3IoZT1lfHx0aGlzLmxlbmd0aDt0aGlzLnBvczxlOyl7dmFyIHI9dGhpcy5yZWFkVmFyaW50KCkscz1yPj4zLG49dGhpcy5wb3M7dChzLGksdGhpcyksdGhpcy5wb3M9PT1uJiZ0aGlzLnNraXAocil9cmV0dXJuIGl9LHJlYWRNZXNzYWdlOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIHRoaXMucmVhZEZpZWxkcyh0LGksdGhpcy5yZWFkVmFyaW50KCkrdGhpcy5wb3MpfSxyZWFkRml4ZWQzMjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYnVmLnJlYWRVSW50MzJMRSh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz00LHR9LHJlYWRTRml4ZWQzMjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYnVmLnJlYWRJbnQzMkxFKHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTQsdH0scmVhZEZpeGVkNjQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MpK3RoaXMuYnVmLnJlYWRVSW50MzJMRSh0aGlzLnBvcys0KSpTSElGVF9MRUZUXzMyO3JldHVybiB0aGlzLnBvcys9OCx0fSxyZWFkU0ZpeGVkNjQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MpK3RoaXMuYnVmLnJlYWRJbnQzMkxFKHRoaXMucG9zKzQpKlNISUZUX0xFRlRfMzI7cmV0dXJuIHRoaXMucG9zKz04LHR9LHJlYWRGbG9hdDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYnVmLnJlYWRGbG9hdExFKHRoaXMucG9zKTtyZXR1cm4gdGhpcy5wb3MrPTQsdH0scmVhZERvdWJsZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYnVmLnJlYWREb3VibGVMRSh0aGlzLnBvcyk7cmV0dXJuIHRoaXMucG9zKz04LHR9LHJlYWRWYXJpbnQ6ZnVuY3Rpb24oKXt2YXIgdCxpLGU9dGhpcy5idWY7cmV0dXJuIGk9ZVt0aGlzLnBvcysrXSx0PTEyNyZpLGk8MTI4P3Q6KGk9ZVt0aGlzLnBvcysrXSx0fD0oMTI3JmkpPDw3LGk8MTI4P3Q6KGk9ZVt0aGlzLnBvcysrXSx0fD0oMTI3JmkpPDwxNCxpPDEyOD90OihpPWVbdGhpcy5wb3MrK10sdHw9KDEyNyZpKTw8MjEsaTwxMjg/dDpyZWFkVmFyaW50UmVtYWluZGVyKHQsdGhpcykpKSl9LHJlYWRWYXJpbnQ2NDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucG9zLGk9dGhpcy5yZWFkVmFyaW50KCk7aWYoaTxQT1dfMl82MylyZXR1cm4gaTtmb3IodmFyIGU9dGhpcy5wb3MtMjsyNTU9PT10aGlzLmJ1ZltlXTspZS0tO2U8dCYmKGU9dCksaT0wO2Zvcih2YXIgcj0wO3I8ZS10KzE7cisrKXt2YXIgcz0xMjcmfnRoaXMuYnVmW3Qrcl07aSs9cjw0P3M8PDcqcjpzKk1hdGgucG93KDIsNypyKX1yZXR1cm4taS0xfSxyZWFkU1ZhcmludDpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmVhZFZhcmludCgpO3JldHVybiB0JTI9PT0xPyh0KzEpLy0yOnQvMn0scmVhZEJvb2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbih0aGlzLnJlYWRWYXJpbnQoKSl9LHJlYWRTdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxpPXRoaXMuYnVmLnRvU3RyaW5nKFwidXRmOFwiLHRoaXMucG9zLHQpO3JldHVybiB0aGlzLnBvcz10LGl9LHJlYWRCeXRlczpmdW5jdGlvbigpe3ZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGk9dGhpcy5idWYuc2xpY2UodGhpcy5wb3MsdCk7cmV0dXJuIHRoaXMucG9zPXQsaX0scmVhZFBhY2tlZFZhcmludDpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxpPVtdO3RoaXMucG9zPHQ7KWkucHVzaCh0aGlzLnJlYWRWYXJpbnQoKSk7cmV0dXJuIGl9LHJlYWRQYWNrZWRTVmFyaW50OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGk9W107dGhpcy5wb3M8dDspaS5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7cmV0dXJuIGl9LHJlYWRQYWNrZWRCb29sZWFuOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGk9W107dGhpcy5wb3M8dDspaS5wdXNoKHRoaXMucmVhZEJvb2xlYW4oKSk7cmV0dXJuIGl9LHJlYWRQYWNrZWRGbG9hdDpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxpPVtdO3RoaXMucG9zPHQ7KWkucHVzaCh0aGlzLnJlYWRGbG9hdCgpKTtyZXR1cm4gaX0scmVhZFBhY2tlZERvdWJsZTpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxpPVtdO3RoaXMucG9zPHQ7KWkucHVzaCh0aGlzLnJlYWREb3VibGUoKSk7cmV0dXJuIGl9LHJlYWRQYWNrZWRGaXhlZDMyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGk9W107dGhpcy5wb3M8dDspaS5wdXNoKHRoaXMucmVhZEZpeGVkMzIoKSk7cmV0dXJuIGl9LHJlYWRQYWNrZWRTRml4ZWQzMjpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcyxpPVtdO3RoaXMucG9zPHQ7KWkucHVzaCh0aGlzLnJlYWRTRml4ZWQzMigpKTtyZXR1cm4gaX0scmVhZFBhY2tlZEZpeGVkNjQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5yZWFkVmFyaW50KCkrdGhpcy5wb3MsaT1bXTt0aGlzLnBvczx0OylpLnB1c2godGhpcy5yZWFkRml4ZWQ2NCgpKTtyZXR1cm4gaX0scmVhZFBhY2tlZFNGaXhlZDY0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMucmVhZFZhcmludCgpK3RoaXMucG9zLGk9W107dGhpcy5wb3M8dDspaS5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO3JldHVybiBpfSxza2lwOmZ1bmN0aW9uKHQpe3ZhciBpPTcmdDtpZihpPT09UGJmLlZhcmludClmb3IoO3RoaXMuYnVmW3RoaXMucG9zKytdPjEyNzspO2Vsc2UgaWYoaT09PVBiZi5CeXRlcyl0aGlzLnBvcz10aGlzLnJlYWRWYXJpbnQoKSt0aGlzLnBvcztlbHNlIGlmKGk9PT1QYmYuRml4ZWQzMil0aGlzLnBvcys9NDtlbHNle2lmKGkhPT1QYmYuRml4ZWQ2NCl0aHJvdyBuZXcgRXJyb3IoXCJVbmltcGxlbWVudGVkIHR5cGU6IFwiK2kpO3RoaXMucG9zKz04fX0sd3JpdGVUYWc6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlVmFyaW50KHQ8PDN8aSl9LHJlYWxsb2M6ZnVuY3Rpb24odCl7Zm9yKHZhciBpPXRoaXMubGVuZ3RofHwxNjtpPHRoaXMucG9zK3Q7KWkqPTI7aWYoaSE9PXRoaXMubGVuZ3RoKXt2YXIgZT1uZXcgQnVmZmVyKGkpO3RoaXMuYnVmLmNvcHkoZSksdGhpcy5idWY9ZSx0aGlzLmxlbmd0aD1pfX0sZmluaXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RoPXRoaXMucG9zLHRoaXMucG9zPTAsdGhpcy5idWYuc2xpY2UoMCx0aGlzLmxlbmd0aCl9LHdyaXRlRml4ZWQzMjpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCksdGhpcy5idWYud3JpdGVVSW50MzJMRSh0LHRoaXMucG9zKSx0aGlzLnBvcys9NH0sd3JpdGVTRml4ZWQzMjpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCksdGhpcy5idWYud3JpdGVJbnQzMkxFKHQsdGhpcy5wb3MpLHRoaXMucG9zKz00fSx3cml0ZUZpeGVkNjQ6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLHRoaXMuYnVmLndyaXRlSW50MzJMRSh0Ji0xLHRoaXMucG9zKSx0aGlzLmJ1Zi53cml0ZVVJbnQzMkxFKE1hdGguZmxvb3IodCpTSElGVF9SSUdIVF8zMiksdGhpcy5wb3MrNCksdGhpcy5wb3MrPTh9LHdyaXRlU0ZpeGVkNjQ6ZnVuY3Rpb24odCl7dGhpcy5yZWFsbG9jKDgpLHRoaXMuYnVmLndyaXRlSW50MzJMRSh0Ji0xLHRoaXMucG9zKSx0aGlzLmJ1Zi53cml0ZUludDMyTEUoTWF0aC5mbG9vcih0KlNISUZUX1JJR0hUXzMyKSx0aGlzLnBvcys0KSx0aGlzLnBvcys9OH0sd3JpdGVWYXJpbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9K3QsdD4yNjg0MzU0NTU/dm9pZCB3cml0ZUJpZ1ZhcmludCh0LHRoaXMpOih0aGlzLnJlYWxsb2MoNCksdGhpcy5idWZbdGhpcy5wb3MrK109MTI3JnR8KHQ+MTI3PzEyODowKSx2b2lkKHQ8PTEyN3x8KHRoaXMuYnVmW3RoaXMucG9zKytdPTEyNyYodD4+Pj03KXwodD4xMjc/MTI4OjApLHQ8PTEyN3x8KHRoaXMuYnVmW3RoaXMucG9zKytdPTEyNyYodD4+Pj03KXwodD4xMjc/MTI4OjApLHQ8PTEyN3x8KHRoaXMuYnVmW3RoaXMucG9zKytdPXQ+Pj43JjEyNykpKSkpfSx3cml0ZVNWYXJpbnQ6ZnVuY3Rpb24odCl7dGhpcy53cml0ZVZhcmludCh0PDA/MiotdC0xOjIqdCl9LHdyaXRlQm9vbGVhbjpmdW5jdGlvbih0KXt0aGlzLndyaXRlVmFyaW50KEJvb2xlYW4odCkpfSx3cml0ZVN0cmluZzpmdW5jdGlvbih0KXt0PVN0cmluZyh0KTt2YXIgaT1CdWZmZXIuYnl0ZUxlbmd0aCh0KTt0aGlzLndyaXRlVmFyaW50KGkpLHRoaXMucmVhbGxvYyhpKSx0aGlzLmJ1Zi53cml0ZSh0LHRoaXMucG9zKSx0aGlzLnBvcys9aX0sd3JpdGVGbG9hdDpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoNCksdGhpcy5idWYud3JpdGVGbG9hdExFKHQsdGhpcy5wb3MpLHRoaXMucG9zKz00fSx3cml0ZURvdWJsZTpmdW5jdGlvbih0KXt0aGlzLnJlYWxsb2MoOCksdGhpcy5idWYud3JpdGVEb3VibGVMRSh0LHRoaXMucG9zKSx0aGlzLnBvcys9OH0sd3JpdGVCeXRlczpmdW5jdGlvbih0KXt2YXIgaT10Lmxlbmd0aDt0aGlzLndyaXRlVmFyaW50KGkpLHRoaXMucmVhbGxvYyhpKTtmb3IodmFyIGU9MDtlPGk7ZSsrKXRoaXMuYnVmW3RoaXMucG9zKytdPXRbZV19LHdyaXRlUmF3TWVzc2FnZTpmdW5jdGlvbih0LGkpe3RoaXMucG9zKys7dmFyIGU9dGhpcy5wb3M7dChpLHRoaXMpO3ZhciByPXRoaXMucG9zLWU7cj49MTI4JiZyZWFsbG9jRm9yUmF3TWVzc2FnZShlLHIsdGhpcyksdGhpcy5wb3M9ZS0xLHRoaXMud3JpdGVWYXJpbnQociksdGhpcy5wb3MrPXJ9LHdyaXRlTWVzc2FnZTpmdW5jdGlvbih0LGksZSl7dGhpcy53cml0ZVRhZyh0LFBiZi5CeXRlcyksdGhpcy53cml0ZVJhd01lc3NhZ2UoaSxlKX0sd3JpdGVQYWNrZWRWYXJpbnQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlTWVzc2FnZSh0LHdyaXRlUGFja2VkVmFyaW50LGkpfSx3cml0ZVBhY2tlZFNWYXJpbnQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlTWVzc2FnZSh0LHdyaXRlUGFja2VkU1ZhcmludCxpKX0sd3JpdGVQYWNrZWRCb29sZWFuOmZ1bmN0aW9uKHQsaSl7dGhpcy53cml0ZU1lc3NhZ2UodCx3cml0ZVBhY2tlZEJvb2xlYW4saSl9LHdyaXRlUGFja2VkRmxvYXQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlTWVzc2FnZSh0LHdyaXRlUGFja2VkRmxvYXQsaSl9LHdyaXRlUGFja2VkRG91YmxlOmZ1bmN0aW9uKHQsaSl7dGhpcy53cml0ZU1lc3NhZ2UodCx3cml0ZVBhY2tlZERvdWJsZSxpKX0sd3JpdGVQYWNrZWRGaXhlZDMyOmZ1bmN0aW9uKHQsaSl7dGhpcy53cml0ZU1lc3NhZ2UodCx3cml0ZVBhY2tlZEZpeGVkMzIsaSl9LHdyaXRlUGFja2VkU0ZpeGVkMzI6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlTWVzc2FnZSh0LHdyaXRlUGFja2VkU0ZpeGVkMzIsaSl9LHdyaXRlUGFja2VkRml4ZWQ2NDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVNZXNzYWdlKHQsd3JpdGVQYWNrZWRGaXhlZDY0LGkpfSx3cml0ZVBhY2tlZFNGaXhlZDY0OmZ1bmN0aW9uKHQsaSl7dGhpcy53cml0ZU1lc3NhZ2UodCx3cml0ZVBhY2tlZFNGaXhlZDY0LGkpfSx3cml0ZUJ5dGVzRmllbGQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlVGFnKHQsUGJmLkJ5dGVzKSx0aGlzLndyaXRlQnl0ZXMoaSl9LHdyaXRlRml4ZWQzMkZpZWxkOmZ1bmN0aW9uKHQsaSl7dGhpcy53cml0ZVRhZyh0LFBiZi5GaXhlZDMyKSx0aGlzLndyaXRlRml4ZWQzMihpKX0sd3JpdGVTRml4ZWQzMkZpZWxkOmZ1bmN0aW9uKHQsaSl7dGhpcy53cml0ZVRhZyh0LFBiZi5GaXhlZDMyKSx0aGlzLndyaXRlU0ZpeGVkMzIoaSl9LHdyaXRlRml4ZWQ2NEZpZWxkOmZ1bmN0aW9uKHQsaSl7dGhpcy53cml0ZVRhZyh0LFBiZi5GaXhlZDY0KSx0aGlzLndyaXRlRml4ZWQ2NChpKX0sd3JpdGVTRml4ZWQ2NEZpZWxkOmZ1bmN0aW9uKHQsaSl7dGhpcy53cml0ZVRhZyh0LFBiZi5GaXhlZDY0KSx0aGlzLndyaXRlU0ZpeGVkNjQoaSl9LHdyaXRlVmFyaW50RmllbGQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlVGFnKHQsUGJmLlZhcmludCksdGhpcy53cml0ZVZhcmludChpKX0sd3JpdGVTVmFyaW50RmllbGQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlVGFnKHQsUGJmLlZhcmludCksdGhpcy53cml0ZVNWYXJpbnQoaSl9LHdyaXRlU3RyaW5nRmllbGQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlVGFnKHQsUGJmLkJ5dGVzKSx0aGlzLndyaXRlU3RyaW5nKGkpfSx3cml0ZUZsb2F0RmllbGQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlVGFnKHQsUGJmLkZpeGVkMzIpLHRoaXMud3JpdGVGbG9hdChpKX0sd3JpdGVEb3VibGVGaWVsZDpmdW5jdGlvbih0LGkpe3RoaXMud3JpdGVUYWcodCxQYmYuRml4ZWQ2NCksdGhpcy53cml0ZURvdWJsZShpKX0sd3JpdGVCb29sZWFuRmllbGQ6ZnVuY3Rpb24odCxpKXt0aGlzLndyaXRlVmFyaW50RmllbGQodCxCb29sZWFuKGkpKX19O1xufSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDoge30pXG5cbn0se1wiLi9idWZmZXJcIjoyNH1dLDI2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFBvaW50KHQsbil7dGhpcy54PXQsdGhpcy55PW59bW9kdWxlLmV4cG9ydHM9UG9pbnQsUG9pbnQucHJvdG90eXBlPXtjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgUG9pbnQodGhpcy54LHRoaXMueSl9LGFkZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9hZGQodCl9LHN1YjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9zdWIodCl9LG11bHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fbXVsdCh0KX0sZGl2OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX2Rpdih0KX0scm90YXRlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuX3JvdGF0ZSh0KX0sbWF0TXVsdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9tYXRNdWx0KHQpfSx1bml0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fdW5pdCgpfSxwZXJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5fcGVycCgpfSxyb3VuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuX3JvdW5kKCl9LG1hZzpmdW5jdGlvbigpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55KX0sZXF1YWxzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLng9PT10LngmJnRoaXMueT09PXQueX0sZGlzdDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdFNxcih0KSl9LGRpc3RTcXI6ZnVuY3Rpb24odCl7dmFyIG49dC54LXRoaXMueCxpPXQueS10aGlzLnk7cmV0dXJuIG4qbitpKml9LGFuZ2xlOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYXRhbjIodGhpcy55LHRoaXMueCl9LGFuZ2xlVG86ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguYXRhbjIodGhpcy55LXQueSx0aGlzLngtdC54KX0sYW5nbGVXaXRoOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFuZ2xlV2l0aFNlcCh0LngsdC55KX0sYW5nbGVXaXRoU2VwOmZ1bmN0aW9uKHQsbil7cmV0dXJuIE1hdGguYXRhbjIodGhpcy54Km4tdGhpcy55KnQsdGhpcy54KnQrdGhpcy55Km4pfSxfbWF0TXVsdDpmdW5jdGlvbih0KXt2YXIgbj10WzBdKnRoaXMueCt0WzFdKnRoaXMueSxpPXRbMl0qdGhpcy54K3RbM10qdGhpcy55O3JldHVybiB0aGlzLng9bix0aGlzLnk9aSx0aGlzfSxfYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzfSxfc3ViOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzfSxfbXVsdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzfSxfZGl2OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngvPXQsdGhpcy55Lz10LHRoaXN9LF91bml0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpdih0aGlzLm1hZygpKSx0aGlzfSxfcGVycDpmdW5jdGlvbigpe3ZhciB0PXRoaXMueTtyZXR1cm4gdGhpcy55PXRoaXMueCx0aGlzLng9LXQsdGhpc30sX3JvdGF0ZTpmdW5jdGlvbih0KXt2YXIgbj1NYXRoLmNvcyh0KSxpPU1hdGguc2luKHQpLHM9bip0aGlzLngtaSp0aGlzLnkscj1pKnRoaXMueCtuKnRoaXMueTtyZXR1cm4gdGhpcy54PXMsdGhpcy55PXIsdGhpc30sX3JvdW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzfX0sUG9pbnQuY29udmVydD1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIFBvaW50P3Q6QXJyYXkuaXNBcnJheSh0KT9uZXcgUG9pbnQodFswXSx0WzFdKTp0fTtcbn0se31dLDI3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKXt0aHJvdyBuZXcgRXJyb3IoXCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkXCIpfWZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQoKXt0aHJvdyBuZXcgRXJyb3IoXCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWRcIil9ZnVuY3Rpb24gcnVuVGltZW91dChlKXtpZihjYWNoZWRTZXRUaW1lb3V0PT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dChlLDApO2lmKChjYWNoZWRTZXRUaW1lb3V0PT09ZGVmYXVsdFNldFRpbW91dHx8IWNhY2hlZFNldFRpbWVvdXQpJiZzZXRUaW1lb3V0KXJldHVybiBjYWNoZWRTZXRUaW1lb3V0PXNldFRpbWVvdXQsc2V0VGltZW91dChlLDApO3RyeXtyZXR1cm4gY2FjaGVkU2V0VGltZW91dChlLDApfWNhdGNoKHQpe3RyeXtyZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsZSwwKX1jYXRjaCh0KXtyZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsZSwwKX19fWZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChlKXtpZihjYWNoZWRDbGVhclRpbWVvdXQ9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChlKTtpZigoY2FjaGVkQ2xlYXJUaW1lb3V0PT09ZGVmYXVsdENsZWFyVGltZW91dHx8IWNhY2hlZENsZWFyVGltZW91dCkmJmNsZWFyVGltZW91dClyZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0PWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoZSk7dHJ5e3JldHVybiBjYWNoZWRDbGVhclRpbWVvdXQoZSl9Y2F0Y2godCl7dHJ5e3JldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLGUpfWNhdGNoKHQpe3JldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLGUpfX19ZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCl7ZHJhaW5pbmcmJmN1cnJlbnRRdWV1ZSYmKGRyYWluaW5nPSExLGN1cnJlbnRRdWV1ZS5sZW5ndGg/cXVldWU9Y3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk6cXVldWVJbmRleD0tMSxxdWV1ZS5sZW5ndGgmJmRyYWluUXVldWUoKSl9ZnVuY3Rpb24gZHJhaW5RdWV1ZSgpe2lmKCFkcmFpbmluZyl7dmFyIGU9cnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO2RyYWluaW5nPSEwO2Zvcih2YXIgdD1xdWV1ZS5sZW5ndGg7dDspe2ZvcihjdXJyZW50UXVldWU9cXVldWUscXVldWU9W107KytxdWV1ZUluZGV4PHQ7KWN1cnJlbnRRdWV1ZSYmY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO3F1ZXVlSW5kZXg9LTEsdD1xdWV1ZS5sZW5ndGh9Y3VycmVudFF1ZXVlPW51bGwsZHJhaW5pbmc9ITEscnVuQ2xlYXJUaW1lb3V0KGUpfX1mdW5jdGlvbiBJdGVtKGUsdCl7dGhpcy5mdW49ZSx0aGlzLmFycmF5PXR9ZnVuY3Rpb24gbm9vcCgpe312YXIgcHJvY2Vzcz1tb2R1bGUuZXhwb3J0cz17fSxjYWNoZWRTZXRUaW1lb3V0LGNhY2hlZENsZWFyVGltZW91dDshZnVuY3Rpb24oKXt0cnl7Y2FjaGVkU2V0VGltZW91dD1cImZ1bmN0aW9uXCI9PXR5cGVvZiBzZXRUaW1lb3V0P3NldFRpbWVvdXQ6ZGVmYXVsdFNldFRpbW91dH1jYXRjaChlKXtjYWNoZWRTZXRUaW1lb3V0PWRlZmF1bHRTZXRUaW1vdXR9dHJ5e2NhY2hlZENsZWFyVGltZW91dD1cImZ1bmN0aW9uXCI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OmRlZmF1bHRDbGVhclRpbWVvdXR9Y2F0Y2goZSl7Y2FjaGVkQ2xlYXJUaW1lb3V0PWRlZmF1bHRDbGVhclRpbWVvdXR9fSgpO3ZhciBxdWV1ZT1bXSxkcmFpbmluZz0hMSxjdXJyZW50UXVldWUscXVldWVJbmRleD0tMTtwcm9jZXNzLm5leHRUaWNrPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlmb3IodmFyIHU9MTt1PGFyZ3VtZW50cy5sZW5ndGg7dSsrKXRbdS0xXT1hcmd1bWVudHNbdV07cXVldWUucHVzaChuZXcgSXRlbShlLHQpKSwxIT09cXVldWUubGVuZ3RofHxkcmFpbmluZ3x8cnVuVGltZW91dChkcmFpblF1ZXVlKX0sSXRlbS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0scHJvY2Vzcy50aXRsZT1cImJyb3dzZXJcIixwcm9jZXNzLmJyb3dzZXI9ITAscHJvY2Vzcy5lbnY9e30scHJvY2Vzcy5hcmd2PVtdLHByb2Nlc3MudmVyc2lvbj1cIlwiLHByb2Nlc3MudmVyc2lvbnM9e30scHJvY2Vzcy5vbj1ub29wLHByb2Nlc3MuYWRkTGlzdGVuZXI9bm9vcCxwcm9jZXNzLm9uY2U9bm9vcCxwcm9jZXNzLm9mZj1ub29wLHByb2Nlc3MucmVtb3ZlTGlzdGVuZXI9bm9vcCxwcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycz1ub29wLHByb2Nlc3MuZW1pdD1ub29wLHByb2Nlc3MuYmluZGluZz1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoXCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZFwiKX0scHJvY2Vzcy5jd2Q9ZnVuY3Rpb24oKXtyZXR1cm5cIi9cIn0scHJvY2Vzcy5jaGRpcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoXCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWRcIil9LHByb2Nlc3MudW1hc2s9ZnVuY3Rpb24oKXtyZXR1cm4gMH07XG59LHt9XSwyODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBwYXJ0aWFsU29ydChhLHQscixvLHApe2ZvcihyPXJ8fDAsbz1vfHxhLmxlbmd0aC0xLHA9cHx8ZGVmYXVsdENvbXBhcmU7bz5yOyl7aWYoby1yPjYwMCl7dmFyIGY9by1yKzEsZT10LXIrMSxsPU1hdGgubG9nKGYpLHM9LjUqTWF0aC5leHAoMipsLzMpLGk9LjUqTWF0aC5zcXJ0KGwqcyooZi1zKS9mKSooZS1mLzI8MD8tMToxKSxuPU1hdGgubWF4KHIsTWF0aC5mbG9vcih0LWUqcy9mK2kpKSxoPU1hdGgubWluKG8sTWF0aC5mbG9vcih0KyhmLWUpKnMvZitpKSk7cGFydGlhbFNvcnQoYSx0LG4saCxwKX12YXIgdT1hW3RdLE09cix3PW87Zm9yKHN3YXAoYSxyLHQpLHAoYVtvXSx1KT4wJiZzd2FwKGEscixvKTtNPHc7KXtmb3Ioc3dhcChhLE0sdyksTSsrLHctLTtwKGFbTV0sdSk8MDspTSsrO2Zvcig7cChhW3ddLHUpPjA7KXctLX0wPT09cChhW3JdLHUpP3N3YXAoYSxyLHcpOih3Kyssc3dhcChhLHcsbykpLHc8PXQmJihyPXcrMSksdDw9dyYmKG89dy0xKX19ZnVuY3Rpb24gc3dhcChhLHQscil7dmFyIG89YVt0XTthW3RdPWFbcl0sYVtyXT1vfWZ1bmN0aW9uIGRlZmF1bHRDb21wYXJlKGEsdCl7cmV0dXJuIGE8dD8tMTphPnQ/MTowfW1vZHVsZS5leHBvcnRzPXBhcnRpYWxTb3J0O1xufSx7fV0sMjk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gc3VwZXJjbHVzdGVyKHQpe3JldHVybiBuZXcgU3VwZXJDbHVzdGVyKHQpfWZ1bmN0aW9uIFN1cGVyQ2x1c3Rlcih0KXt0aGlzLm9wdGlvbnM9ZXh0ZW5kKE9iamVjdC5jcmVhdGUodGhpcy5vcHRpb25zKSx0KSx0aGlzLnRyZWVzPW5ldyBBcnJheSh0aGlzLm9wdGlvbnMubWF4Wm9vbSsxKX1mdW5jdGlvbiBjcmVhdGVDbHVzdGVyKHQsZSxvLG4pe3JldHVybnt4OnQseTplLHpvb206MS8wLGlkOm4sbnVtUG9pbnRzOm99fWZ1bmN0aW9uIGNyZWF0ZVBvaW50Q2x1c3Rlcih0LGUpe3ZhciBvPXQuZ2VvbWV0cnkuY29vcmRpbmF0ZXM7cmV0dXJuIGNyZWF0ZUNsdXN0ZXIobG5nWChvWzBdKSxsYXRZKG9bMV0pLDEsZSl9ZnVuY3Rpb24gZ2V0Q2x1c3RlckpTT04odCl7cmV0dXJue3R5cGU6XCJGZWF0dXJlXCIscHJvcGVydGllczpnZXRDbHVzdGVyUHJvcGVydGllcyh0KSxnZW9tZXRyeTp7dHlwZTpcIlBvaW50XCIsY29vcmRpbmF0ZXM6W3hMbmcodC54KSx5TGF0KHQueSldfX19ZnVuY3Rpb24gZ2V0Q2x1c3RlclByb3BlcnRpZXModCl7dmFyIGU9dC5udW1Qb2ludHMsbz1lPj0xZTQ/TWF0aC5yb3VuZChlLzFlMykrXCJrXCI6ZT49MWUzP01hdGgucm91bmQoZS8xMDApLzEwK1wia1wiOmU7cmV0dXJue2NsdXN0ZXI6ITAscG9pbnRfY291bnQ6ZSxwb2ludF9jb3VudF9hYmJyZXZpYXRlZDpvfX1mdW5jdGlvbiBsbmdYKHQpe3JldHVybiB0LzM2MCsuNX1mdW5jdGlvbiBsYXRZKHQpe3ZhciBlPU1hdGguc2luKHQqTWF0aC5QSS8xODApLG89LjUtLjI1Kk1hdGgubG9nKCgxK2UpLygxLWUpKS9NYXRoLlBJO3JldHVybiBvPDA/MDpvPjE/MTpvfWZ1bmN0aW9uIHhMbmcodCl7cmV0dXJuIDM2MCoodC0uNSl9ZnVuY3Rpb24geUxhdCh0KXt2YXIgZT0oMTgwLTM2MCp0KSpNYXRoLlBJLzE4MDtyZXR1cm4gMzYwKk1hdGguYXRhbihNYXRoLmV4cChlKSkvTWF0aC5QSS05MH1mdW5jdGlvbiBleHRlbmQodCxlKXtmb3IodmFyIG8gaW4gZSl0W29dPWVbb107cmV0dXJuIHR9ZnVuY3Rpb24gZ2V0WCh0KXtyZXR1cm4gdC54fWZ1bmN0aW9uIGdldFkodCl7cmV0dXJuIHQueX12YXIga2RidXNoPV9kZXJlcV8oXCJrZGJ1c2hcIik7bW9kdWxlLmV4cG9ydHM9c3VwZXJjbHVzdGVyLFN1cGVyQ2x1c3Rlci5wcm90b3R5cGU9e29wdGlvbnM6e21pblpvb206MCxtYXhab29tOjE2LHJhZGl1czo0MCxleHRlbnQ6NTEyLG5vZGVTaXplOjY0LGxvZzohMX0sbG9hZDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMubG9nO2UmJmNvbnNvbGUudGltZShcInRvdGFsIHRpbWVcIik7dmFyIG89XCJwcmVwYXJlIFwiK3QubGVuZ3RoK1wiIHBvaW50c1wiO2UmJmNvbnNvbGUudGltZShvKSx0aGlzLnBvaW50cz10O3ZhciBuPXQubWFwKGNyZWF0ZVBvaW50Q2x1c3Rlcik7ZSYmY29uc29sZS50aW1lRW5kKG8pO2Zvcih2YXIgcj10aGlzLm9wdGlvbnMubWF4Wm9vbTtyPj10aGlzLm9wdGlvbnMubWluWm9vbTtyLS0pe3ZhciBpPStEYXRlLm5vdygpO3RoaXMudHJlZXNbcisxXT1rZGJ1c2gobixnZXRYLGdldFksdGhpcy5vcHRpb25zLm5vZGVTaXplLEZsb2F0MzJBcnJheSksbj10aGlzLl9jbHVzdGVyKG4sciksZSYmY29uc29sZS5sb2coXCJ6JWQ6ICVkIGNsdXN0ZXJzIGluICVkbXNcIixyLG4ubGVuZ3RoLCtEYXRlLm5vdygpLWkpfXJldHVybiB0aGlzLnRyZWVzW3RoaXMub3B0aW9ucy5taW5ab29tXT1rZGJ1c2gobixnZXRYLGdldFksdGhpcy5vcHRpb25zLm5vZGVTaXplLEZsb2F0MzJBcnJheSksZSYmY29uc29sZS50aW1lRW5kKFwidG90YWwgdGltZVwiKSx0aGlzfSxnZXRDbHVzdGVyczpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbz10aGlzLnRyZWVzW3RoaXMuX2xpbWl0Wm9vbShlKV0sbj1vLnJhbmdlKGxuZ1godFswXSksbGF0WSh0WzNdKSxsbmdYKHRbMl0pLGxhdFkodFsxXSkpLHI9W10saT0wO2k8bi5sZW5ndGg7aSsrKXt2YXIgcz1vLnBvaW50c1tuW2ldXTtyLnB1c2gocy5pZCE9PS0xP3RoaXMucG9pbnRzW3MuaWRdOmdldENsdXN0ZXJKU09OKHMpKX1yZXR1cm4gcn0sZ2V0VGlsZTpmdW5jdGlvbih0LGUsbyl7dmFyIG49dGhpcy50cmVlc1t0aGlzLl9saW1pdFpvb20odCldLHI9TWF0aC5wb3coMix0KSxpPXRoaXMub3B0aW9ucy5leHRlbnQscz10aGlzLm9wdGlvbnMucmFkaXVzLHU9cy9pLGE9KG8tdSkvcixoPShvKzErdSkvcixsPXtmZWF0dXJlczpbXX07cmV0dXJuIHRoaXMuX2FkZFRpbGVGZWF0dXJlcyhuLnJhbmdlKChlLXUpL3IsYSwoZSsxK3UpL3IsaCksbi5wb2ludHMsZSxvLHIsbCksMD09PWUmJnRoaXMuX2FkZFRpbGVGZWF0dXJlcyhuLnJhbmdlKDEtdS9yLGEsMSxoKSxuLnBvaW50cyxyLG8scixsKSxlPT09ci0xJiZ0aGlzLl9hZGRUaWxlRmVhdHVyZXMobi5yYW5nZSgwLGEsdS9yLGgpLG4ucG9pbnRzLC0xLG8scixsKSxsLmZlYXR1cmVzLmxlbmd0aD9sOm51bGx9LF9hZGRUaWxlRmVhdHVyZXM6ZnVuY3Rpb24odCxlLG8sbixyLGkpe2Zvcih2YXIgcz0wO3M8dC5sZW5ndGg7cysrKXt2YXIgdT1lW3Rbc11dO2kuZmVhdHVyZXMucHVzaCh7dHlwZToxLGdlb21ldHJ5OltbTWF0aC5yb3VuZCh0aGlzLm9wdGlvbnMuZXh0ZW50Kih1Lngqci1vKSksTWF0aC5yb3VuZCh0aGlzLm9wdGlvbnMuZXh0ZW50Kih1Lnkqci1uKSldXSx0YWdzOnUuaWQhPT0tMT90aGlzLnBvaW50c1t1LmlkXS5wcm9wZXJ0aWVzOmdldENsdXN0ZXJQcm9wZXJ0aWVzKHUpfSl9fSxfbGltaXRab29tOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLm1heCh0aGlzLm9wdGlvbnMubWluWm9vbSxNYXRoLm1pbih0LHRoaXMub3B0aW9ucy5tYXhab29tKzEpKX0sX2NsdXN0ZXI6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG89W10sbj10aGlzLm9wdGlvbnMucmFkaXVzLyh0aGlzLm9wdGlvbnMuZXh0ZW50Kk1hdGgucG93KDIsZSkpLHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIGk9dFtyXTtpZighKGkuem9vbTw9ZSkpe2kuem9vbT1lO2Zvcih2YXIgcz10aGlzLnRyZWVzW2UrMV0sdT1zLndpdGhpbihpLngsaS55LG4pLGE9ITEsaD1pLm51bVBvaW50cyxsPWkueCpoLHA9aS55KmgsbT0wO208dS5sZW5ndGg7bSsrKXt2YXIgYz1zLnBvaW50c1t1W21dXTtlPGMuem9vbSYmKGE9ITAsYy56b29tPWUsbCs9Yy54KmMubnVtUG9pbnRzLHArPWMueSpjLm51bVBvaW50cyxoKz1jLm51bVBvaW50cyl9by5wdXNoKGE/Y3JlYXRlQ2x1c3RlcihsL2gscC9oLGgsLTEpOmkpfX1yZXR1cm4gb319O1xufSx7XCJrZGJ1c2hcIjoxOH1dLDMwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFRpbnlRdWV1ZSh0LGkpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFRpbnlRdWV1ZSkpcmV0dXJuIG5ldyBUaW55UXVldWUodCxpKTtpZih0aGlzLmRhdGE9dHx8W10sdGhpcy5sZW5ndGg9dGhpcy5kYXRhLmxlbmd0aCx0aGlzLmNvbXBhcmU9aXx8ZGVmYXVsdENvbXBhcmUsdClmb3IodmFyIGE9TWF0aC5mbG9vcih0aGlzLmxlbmd0aC8yKTthPj0wO2EtLSl0aGlzLl9kb3duKGEpfWZ1bmN0aW9uIGRlZmF1bHRDb21wYXJlKHQsaSl7cmV0dXJuIHQ8aT8tMTp0Pmk/MTowfWZ1bmN0aW9uIHN3YXAodCxpLGEpe3ZhciBuPXRbaV07dFtpXT10W2FdLHRbYV09bn1tb2R1bGUuZXhwb3J0cz1UaW55UXVldWUsVGlueVF1ZXVlLnByb3RvdHlwZT17cHVzaDpmdW5jdGlvbih0KXt0aGlzLmRhdGEucHVzaCh0KSx0aGlzLmxlbmd0aCsrLHRoaXMuX3VwKHRoaXMubGVuZ3RoLTEpfSxwb3A6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmRhdGFbMF07cmV0dXJuIHRoaXMuZGF0YVswXT10aGlzLmRhdGFbdGhpcy5sZW5ndGgtMV0sdGhpcy5sZW5ndGgtLSx0aGlzLmRhdGEucG9wKCksdGhpcy5fZG93bigwKSx0fSxwZWVrOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YVswXX0sX3VwOmZ1bmN0aW9uKHQpe2Zvcih2YXIgaT10aGlzLmRhdGEsYT10aGlzLmNvbXBhcmU7dD4wOyl7dmFyIG49TWF0aC5mbG9vcigodC0xKS8yKTtpZighKGEoaVt0XSxpW25dKTwwKSlicmVhaztzd2FwKGksbix0KSx0PW59fSxfZG93bjpmdW5jdGlvbih0KXtmb3IodmFyIGk9dGhpcy5kYXRhLGE9dGhpcy5jb21wYXJlLG49dGhpcy5sZW5ndGg7Oyl7dmFyIGU9Mip0KzEsaD1lKzEscz10O2lmKGU8biYmYShpW2VdLGlbc10pPDAmJihzPWUpLGg8biYmYShpW2hdLGlbc10pPDAmJihzPWgpLHM9PT10KXJldHVybjtzd2FwKGkscyx0KSx0PXN9fX07XG59LHt9XSwzMTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuY3JlYXRlP21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dC5zdXBlcl89ZSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KX06bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt0LnN1cGVyXz1lO3ZhciBvPWZ1bmN0aW9uKCl7fTtvLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgbyx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10fTtcbn0se31dLDMyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbm1vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKG8pe3JldHVybiBvJiZcIm9iamVjdFwiPT10eXBlb2YgbyYmXCJmdW5jdGlvblwiPT10eXBlb2Ygby5jb3B5JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBvLmZpbGwmJlwiZnVuY3Rpb25cIj09dHlwZW9mIG8ucmVhZFVJbnQ4fTtcbn0se31dLDMzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbihmdW5jdGlvbiAocHJvY2VzcyxnbG9iYWwpe1xuZnVuY3Rpb24gaW5zcGVjdChlLHIpe3ZhciB0PXtzZWVuOltdLHN0eWxpemU6c3R5bGl6ZU5vQ29sb3J9O3JldHVybiBhcmd1bWVudHMubGVuZ3RoPj0zJiYodC5kZXB0aD1hcmd1bWVudHNbMl0pLGFyZ3VtZW50cy5sZW5ndGg+PTQmJih0LmNvbG9ycz1hcmd1bWVudHNbM10pLGlzQm9vbGVhbihyKT90LnNob3dIaWRkZW49cjpyJiZleHBvcnRzLl9leHRlbmQodCxyKSxpc1VuZGVmaW5lZCh0LnNob3dIaWRkZW4pJiYodC5zaG93SGlkZGVuPSExKSxpc1VuZGVmaW5lZCh0LmRlcHRoKSYmKHQuZGVwdGg9MiksaXNVbmRlZmluZWQodC5jb2xvcnMpJiYodC5jb2xvcnM9ITEpLGlzVW5kZWZpbmVkKHQuY3VzdG9tSW5zcGVjdCkmJih0LmN1c3RvbUluc3BlY3Q9ITApLHQuY29sb3JzJiYodC5zdHlsaXplPXN0eWxpemVXaXRoQ29sb3IpLGZvcm1hdFZhbHVlKHQsZSx0LmRlcHRoKX1mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKGUscil7dmFyIHQ9aW5zcGVjdC5zdHlsZXNbcl07cmV0dXJuIHQ/XCJcdTAwMWJbXCIraW5zcGVjdC5jb2xvcnNbdF1bMF0rXCJtXCIrZStcIlx1MDAxYltcIitpbnNwZWN0LmNvbG9yc1t0XVsxXStcIm1cIjplfWZ1bmN0aW9uIHN0eWxpemVOb0NvbG9yKGUscil7cmV0dXJuIGV9ZnVuY3Rpb24gYXJyYXlUb0hhc2goZSl7dmFyIHI9e307cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbihlLHQpe3JbZV09ITB9KSxyfWZ1bmN0aW9uIGZvcm1hdFZhbHVlKGUscix0KXtpZihlLmN1c3RvbUluc3BlY3QmJnImJmlzRnVuY3Rpb24oci5pbnNwZWN0KSYmci5pbnNwZWN0IT09ZXhwb3J0cy5pbnNwZWN0JiYoIXIuY29uc3RydWN0b3J8fHIuY29uc3RydWN0b3IucHJvdG90eXBlIT09cikpe3ZhciBuPXIuaW5zcGVjdCh0LGUpO3JldHVybiBpc1N0cmluZyhuKXx8KG49Zm9ybWF0VmFsdWUoZSxuLHQpKSxufXZhciBpPWZvcm1hdFByaW1pdGl2ZShlLHIpO2lmKGkpcmV0dXJuIGk7dmFyIG89T2JqZWN0LmtleXMocikscz1hcnJheVRvSGFzaChvKTtpZihlLnNob3dIaWRkZW4mJihvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHIpKSxpc0Vycm9yKHIpJiYoby5pbmRleE9mKFwibWVzc2FnZVwiKT49MHx8by5pbmRleE9mKFwiZGVzY3JpcHRpb25cIik+PTApKXJldHVybiBmb3JtYXRFcnJvcihyKTtpZigwPT09by5sZW5ndGgpe2lmKGlzRnVuY3Rpb24ocikpe3ZhciB1PXIubmFtZT9cIjogXCIrci5uYW1lOlwiXCI7cmV0dXJuIGUuc3R5bGl6ZShcIltGdW5jdGlvblwiK3UrXCJdXCIsXCJzcGVjaWFsXCIpfWlmKGlzUmVnRXhwKHIpKXJldHVybiBlLnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHIpLFwicmVnZXhwXCIpO2lmKGlzRGF0ZShyKSlyZXR1cm4gZS5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwociksXCJkYXRlXCIpO2lmKGlzRXJyb3IocikpcmV0dXJuIGZvcm1hdEVycm9yKHIpfXZhciBjPVwiXCIsYT0hMSxsPVtcIntcIixcIn1cIl07aWYoaXNBcnJheShyKSYmKGE9ITAsbD1bXCJbXCIsXCJdXCJdKSxpc0Z1bmN0aW9uKHIpKXt2YXIgcD1yLm5hbWU/XCI6IFwiK3IubmFtZTpcIlwiO2M9XCIgW0Z1bmN0aW9uXCIrcCtcIl1cIn1pZihpc1JlZ0V4cChyKSYmKGM9XCIgXCIrUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHIpKSxpc0RhdGUocikmJihjPVwiIFwiK0RhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwocikpLGlzRXJyb3IocikmJihjPVwiIFwiK2Zvcm1hdEVycm9yKHIpKSwwPT09by5sZW5ndGgmJighYXx8MD09ci5sZW5ndGgpKXJldHVybiBsWzBdK2MrbFsxXTtpZih0PDApcmV0dXJuIGlzUmVnRXhwKHIpP2Uuc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwociksXCJyZWdleHBcIik6ZS5zdHlsaXplKFwiW09iamVjdF1cIixcInNwZWNpYWxcIik7ZS5zZWVuLnB1c2gocik7dmFyIGY7cmV0dXJuIGY9YT9mb3JtYXRBcnJheShlLHIsdCxzLG8pOm8ubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBmb3JtYXRQcm9wZXJ0eShlLHIsdCxzLG4sYSl9KSxlLnNlZW4ucG9wKCkscmVkdWNlVG9TaW5nbGVTdHJpbmcoZixjLGwpfWZ1bmN0aW9uIGZvcm1hdFByaW1pdGl2ZShlLHIpe2lmKGlzVW5kZWZpbmVkKHIpKXJldHVybiBlLnN0eWxpemUoXCJ1bmRlZmluZWRcIixcInVuZGVmaW5lZFwiKTtpZihpc1N0cmluZyhyKSl7dmFyIHQ9XCInXCIrSlNPTi5zdHJpbmdpZnkocikucmVwbGFjZSgvXlwifFwiJC9nLFwiXCIpLnJlcGxhY2UoLycvZyxcIlxcXFwnXCIpLnJlcGxhY2UoL1xcXFxcIi9nLCdcIicpK1wiJ1wiO3JldHVybiBlLnN0eWxpemUodCxcInN0cmluZ1wiKX1yZXR1cm4gaXNOdW1iZXIocik/ZS5zdHlsaXplKFwiXCIrcixcIm51bWJlclwiKTppc0Jvb2xlYW4ocik/ZS5zdHlsaXplKFwiXCIrcixcImJvb2xlYW5cIik6aXNOdWxsKHIpP2Uuc3R5bGl6ZShcIm51bGxcIixcIm51bGxcIik6dm9pZCAwfWZ1bmN0aW9uIGZvcm1hdEVycm9yKGUpe3JldHVyblwiW1wiK0Vycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpK1wiXVwifWZ1bmN0aW9uIGZvcm1hdEFycmF5KGUscix0LG4saSl7Zm9yKHZhciBvPVtdLHM9MCx1PXIubGVuZ3RoO3M8dTsrK3MpaGFzT3duUHJvcGVydHkocixTdHJpbmcocykpP28ucHVzaChmb3JtYXRQcm9wZXJ0eShlLHIsdCxuLFN0cmluZyhzKSwhMCkpOm8ucHVzaChcIlwiKTtyZXR1cm4gaS5mb3JFYWNoKGZ1bmN0aW9uKGkpe2kubWF0Y2goL15cXGQrJC8pfHxvLnB1c2goZm9ybWF0UHJvcGVydHkoZSxyLHQsbixpLCEwKSl9KSxvfWZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGUscix0LG4saSxvKXt2YXIgcyx1LGM7aWYoYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsaSl8fHt2YWx1ZTpyW2ldfSxjLmdldD91PWMuc2V0P2Uuc3R5bGl6ZShcIltHZXR0ZXIvU2V0dGVyXVwiLFwic3BlY2lhbFwiKTplLnN0eWxpemUoXCJbR2V0dGVyXVwiLFwic3BlY2lhbFwiKTpjLnNldCYmKHU9ZS5zdHlsaXplKFwiW1NldHRlcl1cIixcInNwZWNpYWxcIikpLGhhc093blByb3BlcnR5KG4saSl8fChzPVwiW1wiK2krXCJdXCIpLHV8fChlLnNlZW4uaW5kZXhPZihjLnZhbHVlKTwwPyh1PWlzTnVsbCh0KT9mb3JtYXRWYWx1ZShlLGMudmFsdWUsbnVsbCk6Zm9ybWF0VmFsdWUoZSxjLnZhbHVlLHQtMSksdS5pbmRleE9mKFwiXFxuXCIpPi0xJiYodT1vP3Uuc3BsaXQoXCJcXG5cIikubWFwKGZ1bmN0aW9uKGUpe3JldHVyblwiICBcIitlfSkuam9pbihcIlxcblwiKS5zdWJzdHIoMik6XCJcXG5cIit1LnNwbGl0KFwiXFxuXCIpLm1hcChmdW5jdGlvbihlKXtyZXR1cm5cIiAgIFwiK2V9KS5qb2luKFwiXFxuXCIpKSk6dT1lLnN0eWxpemUoXCJbQ2lyY3VsYXJdXCIsXCJzcGVjaWFsXCIpKSxpc1VuZGVmaW5lZChzKSl7aWYobyYmaS5tYXRjaCgvXlxcZCskLykpcmV0dXJuIHU7cz1KU09OLnN0cmluZ2lmeShcIlwiK2kpLHMubWF0Y2goL15cIihbYS16QS1aX11bYS16QS1aXzAtOV0qKVwiJC8pPyhzPXMuc3Vic3RyKDEscy5sZW5ndGgtMikscz1lLnN0eWxpemUocyxcIm5hbWVcIikpOihzPXMucmVwbGFjZSgvJy9nLFwiXFxcXCdcIikucmVwbGFjZSgvXFxcXFwiL2csJ1wiJykucmVwbGFjZSgvKF5cInxcIiQpL2csXCInXCIpLHM9ZS5zdHlsaXplKHMsXCJzdHJpbmdcIikpfXJldHVybiBzK1wiOiBcIit1fWZ1bmN0aW9uIHJlZHVjZVRvU2luZ2xlU3RyaW5nKGUscix0KXt2YXIgbj0wLGk9ZS5yZWR1Y2UoZnVuY3Rpb24oZSxyKXtyZXR1cm4gbisrLHIuaW5kZXhPZihcIlxcblwiKT49MCYmbisrLGUrci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZyxcIlwiKS5sZW5ndGgrMX0sMCk7cmV0dXJuIGk+NjA/dFswXSsoXCJcIj09PXI/XCJcIjpyK1wiXFxuIFwiKStcIiBcIitlLmpvaW4oXCIsXFxuICBcIikrXCIgXCIrdFsxXTp0WzBdK3IrXCIgXCIrZS5qb2luKFwiLCBcIikrXCIgXCIrdFsxXX1mdW5jdGlvbiBpc0FycmF5KGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpfWZ1bmN0aW9uIGlzQm9vbGVhbihlKXtyZXR1cm5cImJvb2xlYW5cIj09dHlwZW9mIGV9ZnVuY3Rpb24gaXNOdWxsKGUpe3JldHVybiBudWxsPT09ZX1mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChlKXtyZXR1cm4gbnVsbD09ZX1mdW5jdGlvbiBpc051bWJlcihlKXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgZX1mdW5jdGlvbiBpc1N0cmluZyhlKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgZX1mdW5jdGlvbiBpc1N5bWJvbChlKXtyZXR1cm5cInN5bWJvbFwiPT10eXBlb2YgZX1mdW5jdGlvbiBpc1VuZGVmaW5lZChlKXtyZXR1cm4gdm9pZCAwPT09ZX1mdW5jdGlvbiBpc1JlZ0V4cChlKXtyZXR1cm4gaXNPYmplY3QoZSkmJlwiW29iamVjdCBSZWdFeHBdXCI9PT1vYmplY3RUb1N0cmluZyhlKX1mdW5jdGlvbiBpc09iamVjdChlKXtyZXR1cm5cIm9iamVjdFwiPT10eXBlb2YgZSYmbnVsbCE9PWV9ZnVuY3Rpb24gaXNEYXRlKGUpe3JldHVybiBpc09iamVjdChlKSYmXCJbb2JqZWN0IERhdGVdXCI9PT1vYmplY3RUb1N0cmluZyhlKX1mdW5jdGlvbiBpc0Vycm9yKGUpe3JldHVybiBpc09iamVjdChlKSYmKFwiW29iamVjdCBFcnJvcl1cIj09PW9iamVjdFRvU3RyaW5nKGUpfHxlIGluc3RhbmNlb2YgRXJyb3IpfWZ1bmN0aW9uIGlzRnVuY3Rpb24oZSl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgZX1mdW5jdGlvbiBpc1ByaW1pdGl2ZShlKXtyZXR1cm4gbnVsbD09PWV8fFwiYm9vbGVhblwiPT10eXBlb2YgZXx8XCJudW1iZXJcIj09dHlwZW9mIGV8fFwic3RyaW5nXCI9PXR5cGVvZiBlfHxcInN5bWJvbFwiPT10eXBlb2YgZXx8XCJ1bmRlZmluZWRcIj09dHlwZW9mIGV9ZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcoZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiBwYWQoZSl7cmV0dXJuIGU8MTA/XCIwXCIrZS50b1N0cmluZygxMCk6ZS50b1N0cmluZygxMCl9ZnVuY3Rpb24gdGltZXN0YW1wKCl7dmFyIGU9bmV3IERhdGUscj1bcGFkKGUuZ2V0SG91cnMoKSkscGFkKGUuZ2V0TWludXRlcygpKSxwYWQoZS5nZXRTZWNvbmRzKCkpXS5qb2luKFwiOlwiKTtyZXR1cm5bZS5nZXREYXRlKCksbW9udGhzW2UuZ2V0TW9udGgoKV0scl0uam9pbihcIiBcIil9ZnVuY3Rpb24gaGFzT3duUHJvcGVydHkoZSxyKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscil9dmFyIGZvcm1hdFJlZ0V4cD0vJVtzZGolXS9nO2V4cG9ydHMuZm9ybWF0PWZ1bmN0aW9uKGUpe2lmKCFpc1N0cmluZyhlKSl7Zm9yKHZhciByPVtdLHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXIucHVzaChpbnNwZWN0KGFyZ3VtZW50c1t0XSkpO3JldHVybiByLmpvaW4oXCIgXCIpfWZvcih2YXIgdD0xLG49YXJndW1lbnRzLGk9bi5sZW5ndGgsbz1TdHJpbmcoZSkucmVwbGFjZShmb3JtYXRSZWdFeHAsZnVuY3Rpb24oZSl7aWYoXCIlJVwiPT09ZSlyZXR1cm5cIiVcIjtpZih0Pj1pKXJldHVybiBlO3N3aXRjaChlKXtjYXNlXCIlc1wiOnJldHVybiBTdHJpbmcoblt0KytdKTtjYXNlXCIlZFwiOnJldHVybiBOdW1iZXIoblt0KytdKTtjYXNlXCIlalwiOnRyeXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoblt0KytdKX1jYXRjaChlKXtyZXR1cm5cIltDaXJjdWxhcl1cIn1kZWZhdWx0OnJldHVybiBlfX0pLHM9blt0XTt0PGk7cz1uWysrdF0pbys9aXNOdWxsKHMpfHwhaXNPYmplY3Qocyk/XCIgXCIrczpcIiBcIitpbnNwZWN0KHMpO3JldHVybiBvfSxleHBvcnRzLmRlcHJlY2F0ZT1mdW5jdGlvbihlLHIpe2Z1bmN0aW9uIHQoKXtpZighbil7aWYocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKXRocm93IG5ldyBFcnJvcihyKTtwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24/Y29uc29sZS50cmFjZShyKTpjb25zb2xlLmVycm9yKHIpLG49ITB9cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfWlmKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSlyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZXhwb3J0cy5kZXByZWNhdGUoZSxyKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2lmKHByb2Nlc3Mubm9EZXByZWNhdGlvbj09PSEwKXJldHVybiBlO3ZhciBuPSExO3JldHVybiB0fTt2YXIgZGVidWdzPXt9LGRlYnVnRW52aXJvbjtleHBvcnRzLmRlYnVnbG9nPWZ1bmN0aW9uKGUpe2lmKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikmJihkZWJ1Z0Vudmlyb249cHJvY2Vzcy5lbnYuTk9ERV9ERUJVR3x8XCJcIiksZT1lLnRvVXBwZXJDYXNlKCksIWRlYnVnc1tlXSlpZihuZXcgUmVnRXhwKFwiXFxcXGJcIitlK1wiXFxcXGJcIixcImlcIikudGVzdChkZWJ1Z0Vudmlyb24pKXt2YXIgcj1wcm9jZXNzLnBpZDtkZWJ1Z3NbZV09ZnVuY3Rpb24oKXt2YXIgdD1leHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLGFyZ3VtZW50cyk7Y29uc29sZS5lcnJvcihcIiVzICVkOiAlc1wiLGUscix0KX19ZWxzZSBkZWJ1Z3NbZV09ZnVuY3Rpb24oKXt9O3JldHVybiBkZWJ1Z3NbZV19LGV4cG9ydHMuaW5zcGVjdD1pbnNwZWN0LGluc3BlY3QuY29sb3JzPXtib2xkOlsxLDIyXSxpdGFsaWM6WzMsMjNdLHVuZGVybGluZTpbNCwyNF0saW52ZXJzZTpbNywyN10sd2hpdGU6WzM3LDM5XSxncmV5Ols5MCwzOV0sYmxhY2s6WzMwLDM5XSxibHVlOlszNCwzOV0sY3lhbjpbMzYsMzldLGdyZWVuOlszMiwzOV0sbWFnZW50YTpbMzUsMzldLHJlZDpbMzEsMzldLHllbGxvdzpbMzMsMzldfSxpbnNwZWN0LnN0eWxlcz17c3BlY2lhbDpcImN5YW5cIixudW1iZXI6XCJ5ZWxsb3dcIixib29sZWFuOlwieWVsbG93XCIsdW5kZWZpbmVkOlwiZ3JleVwiLG51bGw6XCJib2xkXCIsc3RyaW5nOlwiZ3JlZW5cIixkYXRlOlwibWFnZW50YVwiLHJlZ2V4cDpcInJlZFwifSxleHBvcnRzLmlzQXJyYXk9aXNBcnJheSxleHBvcnRzLmlzQm9vbGVhbj1pc0Jvb2xlYW4sZXhwb3J0cy5pc051bGw9aXNOdWxsLGV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQ9aXNOdWxsT3JVbmRlZmluZWQsZXhwb3J0cy5pc051bWJlcj1pc051bWJlcixleHBvcnRzLmlzU3RyaW5nPWlzU3RyaW5nLGV4cG9ydHMuaXNTeW1ib2w9aXNTeW1ib2wsZXhwb3J0cy5pc1VuZGVmaW5lZD1pc1VuZGVmaW5lZCxleHBvcnRzLmlzUmVnRXhwPWlzUmVnRXhwLGV4cG9ydHMuaXNPYmplY3Q9aXNPYmplY3QsZXhwb3J0cy5pc0RhdGU9aXNEYXRlLGV4cG9ydHMuaXNFcnJvcj1pc0Vycm9yLGV4cG9ydHMuaXNGdW5jdGlvbj1pc0Z1bmN0aW9uLGV4cG9ydHMuaXNQcmltaXRpdmU9aXNQcmltaXRpdmUsZXhwb3J0cy5pc0J1ZmZlcj1fZGVyZXFfKFwiLi9zdXBwb3J0L2lzQnVmZmVyXCIpO3ZhciBtb250aHM9W1wiSmFuXCIsXCJGZWJcIixcIk1hclwiLFwiQXByXCIsXCJNYXlcIixcIkp1blwiLFwiSnVsXCIsXCJBdWdcIixcIlNlcFwiLFwiT2N0XCIsXCJOb3ZcIixcIkRlY1wiXTtleHBvcnRzLmxvZz1mdW5jdGlvbigpe2NvbnNvbGUubG9nKFwiJXMgLSAlc1wiLHRpbWVzdGFtcCgpLGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKSl9LGV4cG9ydHMuaW5oZXJpdHM9X2RlcmVxXyhcImluaGVyaXRzXCIpLGV4cG9ydHMuX2V4dGVuZD1mdW5jdGlvbihlLHIpe2lmKCFyfHwhaXNPYmplY3QocikpcmV0dXJuIGU7Zm9yKHZhciB0PU9iamVjdC5rZXlzKHIpLG49dC5sZW5ndGg7bi0tOyllW3Rbbl1dPXJbdFtuXV07cmV0dXJuIGV9O1xufSkuY2FsbCh0aGlzLF9kZXJlcV8oJ19wcm9jZXNzJyksdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcblxufSx7XCIuL3N1cHBvcnQvaXNCdWZmZXJcIjozMixcIl9wcm9jZXNzXCI6MjcsXCJpbmhlcml0c1wiOjMxfV0sMzQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xubW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZT1fZGVyZXFfKFwiLi9saWIvdmVjdG9ydGlsZS5qc1wiKSxtb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlRmVhdHVyZT1fZGVyZXFfKFwiLi9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanNcIiksbW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZUxheWVyPV9kZXJlcV8oXCIuL2xpYi92ZWN0b3J0aWxlbGF5ZXIuanNcIik7XG59LHtcIi4vbGliL3ZlY3RvcnRpbGUuanNcIjozNSxcIi4vbGliL3ZlY3RvcnRpbGVmZWF0dXJlLmpzXCI6MzYsXCIuL2xpYi92ZWN0b3J0aWxlbGF5ZXIuanNcIjozN31dLDM1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFZlY3RvclRpbGUoZSxyKXt0aGlzLmxheWVycz1lLnJlYWRGaWVsZHMocmVhZFRpbGUse30scil9ZnVuY3Rpb24gcmVhZFRpbGUoZSxyLGkpe2lmKDM9PT1lKXt2YXIgdD1uZXcgVmVjdG9yVGlsZUxheWVyKGksaS5yZWFkVmFyaW50KCkraS5wb3MpO3QubGVuZ3RoJiYoclt0Lm5hbWVdPXQpfX12YXIgVmVjdG9yVGlsZUxheWVyPV9kZXJlcV8oXCIuL3ZlY3RvcnRpbGVsYXllclwiKTttb2R1bGUuZXhwb3J0cz1WZWN0b3JUaWxlO1xufSx7XCIuL3ZlY3RvcnRpbGVsYXllclwiOjM3fV0sMzY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gVmVjdG9yVGlsZUZlYXR1cmUoZSx0LHIsaSxhKXt0aGlzLnByb3BlcnRpZXM9e30sdGhpcy5leHRlbnQ9cix0aGlzLnR5cGU9MCx0aGlzLl9wYmY9ZSx0aGlzLl9nZW9tZXRyeT0tMSx0aGlzLl9rZXlzPWksdGhpcy5fdmFsdWVzPWEsZS5yZWFkRmllbGRzKHJlYWRGZWF0dXJlLHRoaXMsdCl9ZnVuY3Rpb24gcmVhZEZlYXR1cmUoZSx0LHIpezE9PWU/dC5pZD1yLnJlYWRWYXJpbnQoKToyPT1lP3JlYWRUYWcocix0KTozPT1lP3QudHlwZT1yLnJlYWRWYXJpbnQoKTo0PT1lJiYodC5fZ2VvbWV0cnk9ci5wb3MpfWZ1bmN0aW9uIHJlYWRUYWcoZSx0KXtmb3IodmFyIHI9ZS5yZWFkVmFyaW50KCkrZS5wb3M7ZS5wb3M8cjspe3ZhciBpPXQuX2tleXNbZS5yZWFkVmFyaW50KCldLGE9dC5fdmFsdWVzW2UucmVhZFZhcmludCgpXTt0LnByb3BlcnRpZXNbaV09YX19ZnVuY3Rpb24gY2xhc3NpZnlSaW5ncyhlKXt2YXIgdD1lLmxlbmd0aDtpZih0PD0xKXJldHVybltlXTtmb3IodmFyIHIsaSxhPVtdLG89MDtvPHQ7bysrKXt2YXIgbj1zaWduZWRBcmVhKGVbb10pOzAhPT1uJiYodm9pZCAwPT09aSYmKGk9bjwwKSxpPT09bjwwPyhyJiZhLnB1c2gocikscj1bZVtvXV0pOnIucHVzaChlW29dKSl9cmV0dXJuIHImJmEucHVzaChyKSxhfWZ1bmN0aW9uIHNpZ25lZEFyZWEoZSl7Zm9yKHZhciB0LHIsaT0wLGE9MCxvPWUubGVuZ3RoLG49by0xO2E8bztuPWErKyl0PWVbYV0scj1lW25dLGkrPShyLngtdC54KSoodC55K3IueSk7cmV0dXJuIGl9dmFyIFBvaW50PV9kZXJlcV8oXCJwb2ludC1nZW9tZXRyeVwiKTttb2R1bGUuZXhwb3J0cz1WZWN0b3JUaWxlRmVhdHVyZSxWZWN0b3JUaWxlRmVhdHVyZS50eXBlcz1bXCJVbmtub3duXCIsXCJQb2ludFwiLFwiTGluZVN0cmluZ1wiLFwiUG9seWdvblwiXSxWZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUubG9hZEdlb21ldHJ5PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fcGJmO2UucG9zPXRoaXMuX2dlb21ldHJ5O2Zvcih2YXIgdCxyPWUucmVhZFZhcmludCgpK2UucG9zLGk9MSxhPTAsbz0wLG49MCxzPVtdO2UucG9zPHI7KXtpZighYSl7dmFyIHA9ZS5yZWFkVmFyaW50KCk7aT03JnAsYT1wPj4zfWlmKGEtLSwxPT09aXx8Mj09PWkpbys9ZS5yZWFkU1ZhcmludCgpLG4rPWUucmVhZFNWYXJpbnQoKSwxPT09aSYmKHQmJnMucHVzaCh0KSx0PVtdKSx0LnB1c2gobmV3IFBvaW50KG8sbikpO2Vsc2V7aWYoNyE9PWkpdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biBjb21tYW5kIFwiK2kpO3QmJnQucHVzaCh0WzBdLmNsb25lKCkpfX1yZXR1cm4gdCYmcy5wdXNoKHQpLHN9LFZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS5iYm94PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fcGJmO2UucG9zPXRoaXMuX2dlb21ldHJ5O2Zvcih2YXIgdD1lLnJlYWRWYXJpbnQoKStlLnBvcyxyPTEsaT0wLGE9MCxvPTAsbj0xLzAscz0tKDEvMCkscD0xLzAsaD0tKDEvMCk7ZS5wb3M8dDspe2lmKCFpKXt2YXIgdT1lLnJlYWRWYXJpbnQoKTtyPTcmdSxpPXU+PjN9aWYoaS0tLDE9PT1yfHwyPT09cilhKz1lLnJlYWRTVmFyaW50KCksbys9ZS5yZWFkU1ZhcmludCgpLGE8biYmKG49YSksYT5zJiYocz1hKSxvPHAmJihwPW8pLG8+aCYmKGg9byk7ZWxzZSBpZig3IT09cil0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIGNvbW1hbmQgXCIrcil9cmV0dXJuW24scCxzLGhdfSxWZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUudG9HZW9KU09OPWZ1bmN0aW9uKGUsdCxyKXtmdW5jdGlvbiBpKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgcj1lW3RdLGk9MTgwLTM2MCooci55K3ApL247ZVt0XT1bMzYwKihyLngrcykvbi0xODAsMzYwL01hdGguUEkqTWF0aC5hdGFuKE1hdGguZXhwKGkqTWF0aC5QSS8xODApKS05MF19fXZhciBhLG8sbj10aGlzLmV4dGVudCpNYXRoLnBvdygyLHIpLHM9dGhpcy5leHRlbnQqZSxwPXRoaXMuZXh0ZW50KnQsaD10aGlzLmxvYWRHZW9tZXRyeSgpLHU9VmVjdG9yVGlsZUZlYXR1cmUudHlwZXNbdGhpcy50eXBlXTtzd2l0Y2godGhpcy50eXBlKXtjYXNlIDE6dmFyIGQ9W107Zm9yKGE9MDthPGgubGVuZ3RoO2ErKylkW2FdPWhbYV1bMF07aD1kLGkoaCk7YnJlYWs7Y2FzZSAyOmZvcihhPTA7YTxoLmxlbmd0aDthKyspaShoW2FdKTticmVhaztjYXNlIDM6Zm9yKGg9Y2xhc3NpZnlSaW5ncyhoKSxhPTA7YTxoLmxlbmd0aDthKyspZm9yKG89MDtvPGhbYV0ubGVuZ3RoO28rKylpKGhbYV1bb10pfTE9PT1oLmxlbmd0aD9oPWhbMF06dT1cIk11bHRpXCIrdTt2YXIgZj17dHlwZTpcIkZlYXR1cmVcIixnZW9tZXRyeTp7dHlwZTp1LGNvb3JkaW5hdGVzOmh9LHByb3BlcnRpZXM6dGhpcy5wcm9wZXJ0aWVzfTtyZXR1cm5cImlkXCJpbiB0aGlzJiYoZi5pZD10aGlzLmlkKSxmfTtcbn0se1wicG9pbnQtZ2VvbWV0cnlcIjoyNn1dLDM3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFZlY3RvclRpbGVMYXllcihlLHQpe3RoaXMudmVyc2lvbj0xLHRoaXMubmFtZT1udWxsLHRoaXMuZXh0ZW50PTQwOTYsdGhpcy5sZW5ndGg9MCx0aGlzLl9wYmY9ZSx0aGlzLl9rZXlzPVtdLHRoaXMuX3ZhbHVlcz1bXSx0aGlzLl9mZWF0dXJlcz1bXSxlLnJlYWRGaWVsZHMocmVhZExheWVyLHRoaXMsdCksdGhpcy5sZW5ndGg9dGhpcy5fZmVhdHVyZXMubGVuZ3RofWZ1bmN0aW9uIHJlYWRMYXllcihlLHQscil7MTU9PT1lP3QudmVyc2lvbj1yLnJlYWRWYXJpbnQoKToxPT09ZT90Lm5hbWU9ci5yZWFkU3RyaW5nKCk6NT09PWU/dC5leHRlbnQ9ci5yZWFkVmFyaW50KCk6Mj09PWU/dC5fZmVhdHVyZXMucHVzaChyLnBvcyk6Mz09PWU/dC5fa2V5cy5wdXNoKHIucmVhZFN0cmluZygpKTo0PT09ZSYmdC5fdmFsdWVzLnB1c2gocmVhZFZhbHVlTWVzc2FnZShyKSl9ZnVuY3Rpb24gcmVhZFZhbHVlTWVzc2FnZShlKXtmb3IodmFyIHQ9bnVsbCxyPWUucmVhZFZhcmludCgpK2UucG9zO2UucG9zPHI7KXt2YXIgYT1lLnJlYWRWYXJpbnQoKT4+Mzt0PTE9PT1hP2UucmVhZFN0cmluZygpOjI9PT1hP2UucmVhZEZsb2F0KCk6Mz09PWE/ZS5yZWFkRG91YmxlKCk6ND09PWE/ZS5yZWFkVmFyaW50NjQoKTo1PT09YT9lLnJlYWRWYXJpbnQoKTo2PT09YT9lLnJlYWRTVmFyaW50KCk6Nz09PWE/ZS5yZWFkQm9vbGVhbigpOm51bGx9cmV0dXJuIHR9dmFyIFZlY3RvclRpbGVGZWF0dXJlPV9kZXJlcV8oXCIuL3ZlY3RvcnRpbGVmZWF0dXJlLmpzXCIpO21vZHVsZS5leHBvcnRzPVZlY3RvclRpbGVMYXllcixWZWN0b3JUaWxlTGF5ZXIucHJvdG90eXBlLmZlYXR1cmU9ZnVuY3Rpb24oZSl7aWYoZTwwfHxlPj10aGlzLl9mZWF0dXJlcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwiZmVhdHVyZSBpbmRleCBvdXQgb2YgYm91bmRzXCIpO3RoaXMuX3BiZi5wb3M9dGhpcy5fZmVhdHVyZXNbZV07dmFyIHQ9dGhpcy5fcGJmLnJlYWRWYXJpbnQoKSt0aGlzLl9wYmYucG9zO3JldHVybiBuZXcgVmVjdG9yVGlsZUZlYXR1cmUodGhpcy5fcGJmLHQsdGhpcy5leHRlbnQsdGhpcy5fa2V5cyx0aGlzLl92YWx1ZXMpfTtcbn0se1wiLi92ZWN0b3J0aWxlZmVhdHVyZS5qc1wiOjM2fV0sMzg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuZnVuY3Rpb24gZnJvbVZlY3RvclRpbGVKcyhlKXt2YXIgcj1bXTtmb3IodmFyIG8gaW4gZS5sYXllcnMpci5wdXNoKHByZXBhcmVMYXllcihlLmxheWVyc1tvXSkpO3ZhciB0PW5ldyBQYmY7cmV0dXJuIHZ0cGIudGlsZS53cml0ZSh7bGF5ZXJzOnJ9LHQpLHQuZmluaXNoKCl9ZnVuY3Rpb24gZnJvbUdlb2pzb25WdChlKXt2YXIgcj17fTtmb3IodmFyIG8gaW4gZSlyW29dPW5ldyBHZW9KU09OV3JhcHBlcihlW29dLmZlYXR1cmVzKSxyW29dLm5hbWU9bztyZXR1cm4gZnJvbVZlY3RvclRpbGVKcyh7bGF5ZXJzOnJ9KX1mdW5jdGlvbiBwcmVwYXJlTGF5ZXIoZSl7Zm9yKHZhciByPXtuYW1lOmUubmFtZXx8XCJcIix2ZXJzaW9uOmUudmVyc2lvbnx8MSxleHRlbnQ6ZS5leHRlbnR8fDQwOTYsa2V5czpbXSx2YWx1ZXM6W10sZmVhdHVyZXM6W119LG89e30sdD17fSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBhPWUuZmVhdHVyZShuKTthLmdlb21ldHJ5PWVuY29kZUdlb21ldHJ5KGEubG9hZEdlb21ldHJ5KCkpO3ZhciB1PVtdO2Zvcih2YXIgcyBpbiBhLnByb3BlcnRpZXMpe3ZhciBpPW9bc107XCJ1bmRlZmluZWRcIj09dHlwZW9mIGkmJihyLmtleXMucHVzaChzKSxpPXIua2V5cy5sZW5ndGgtMSxvW3NdPWkpO3ZhciBwPXdyYXBWYWx1ZShhLnByb3BlcnRpZXNbc10pLGw9dFtwLmtleV07XCJ1bmRlZmluZWRcIj09dHlwZW9mIGwmJihyLnZhbHVlcy5wdXNoKHApLGw9ci52YWx1ZXMubGVuZ3RoLTEsdFtwLmtleV09bCksdS5wdXNoKGkpLHUucHVzaChsKX1hLnRhZ3M9dSxyLmZlYXR1cmVzLnB1c2goYSl9cmV0dXJuIHJ9ZnVuY3Rpb24gY29tbWFuZChlLHIpe3JldHVybihyPDwzKSsoNyZlKX1mdW5jdGlvbiB6aWd6YWcoZSl7cmV0dXJuIGU8PDFeZT4+MzF9ZnVuY3Rpb24gZW5jb2RlR2VvbWV0cnkoZSl7Zm9yKHZhciByPVtdLG89MCx0PTAsbj1lLmxlbmd0aCxhPTA7YTxuO2ErKyl7dmFyIHU9ZVthXTtyLnB1c2goY29tbWFuZCgxLDEpKTtmb3IodmFyIHM9MDtzPHUubGVuZ3RoO3MrKyl7MT09PXMmJnIucHVzaChjb21tYW5kKDIsdS5sZW5ndGgtMSkpO3ZhciBpPXVbc10ueC1vLHA9dVtzXS55LXQ7ci5wdXNoKHppZ3phZyhpKSx6aWd6YWcocCkpLG8rPWksdCs9cH19cmV0dXJuIHJ9ZnVuY3Rpb24gd3JhcFZhbHVlKGUpe3ZhciByLG89dHlwZW9mIGU7cmV0dXJuXCJzdHJpbmdcIj09PW8/cj17c3RyaW5nX3ZhbHVlOmV9OlwiYm9vbGVhblwiPT09bz9yPXtib29sX3ZhbHVlOmV9OlwibnVtYmVyXCI9PT1vP3I9ZSUxIT09MD97ZG91YmxlX3ZhbHVlOmV9OmU8MD97c2ludF92YWx1ZTplfTp7dWludF92YWx1ZTplfTooZT1KU09OLnN0cmluZ2lmeShlKSxyPXtzdHJpbmdfdmFsdWU6ZX0pLHIua2V5PW8rXCI6XCIrZSxyfXZhciBQYmY9X2RlcmVxXyhcInBiZlwiKSx2dHBiPV9kZXJlcV8oXCIuL3ZlY3Rvci10aWxlLXBiXCIpLEdlb0pTT05XcmFwcGVyPV9kZXJlcV8oXCIuL2xpYi9nZW9qc29uX3dyYXBwZXJcIik7bW9kdWxlLmV4cG9ydHM9ZnJvbVZlY3RvclRpbGVKcyxtb2R1bGUuZXhwb3J0cy5mcm9tVmVjdG9yVGlsZUpzPWZyb21WZWN0b3JUaWxlSnMsbW9kdWxlLmV4cG9ydHMuZnJvbUdlb2pzb25WdD1mcm9tR2VvanNvblZ0LG1vZHVsZS5leHBvcnRzLkdlb0pTT05XcmFwcGVyPUdlb0pTT05XcmFwcGVyO1xufSx7XCIuL2xpYi9nZW9qc29uX3dyYXBwZXJcIjozOSxcIi4vdmVjdG9yLXRpbGUtcGJcIjo0MCxcInBiZlwiOjI1fV0sMzk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gR2VvSlNPTldyYXBwZXIoZSl7dGhpcy5mZWF0dXJlcz1lLHRoaXMubGVuZ3RoPWUubGVuZ3RofWZ1bmN0aW9uIEZlYXR1cmVXcmFwcGVyKGUpe3RoaXMuaWQ9XCJudW1iZXJcIj09dHlwZW9mIGUuaWQ/ZS5pZDp2b2lkIDAsdGhpcy50eXBlPWUudHlwZSx0aGlzLnJhd0dlb21ldHJ5PTE9PT1lLnR5cGU/W2UuZ2VvbWV0cnldOmUuZ2VvbWV0cnksdGhpcy5wcm9wZXJ0aWVzPWUudGFncyx0aGlzLmV4dGVudD00MDk2fXZhciBQb2ludD1fZGVyZXFfKFwicG9pbnQtZ2VvbWV0cnlcIiksVmVjdG9yVGlsZUZlYXR1cmU9X2RlcmVxXyhcInZlY3Rvci10aWxlXCIpLlZlY3RvclRpbGVGZWF0dXJlO21vZHVsZS5leHBvcnRzPUdlb0pTT05XcmFwcGVyLEdlb0pTT05XcmFwcGVyLnByb3RvdHlwZS5mZWF0dXJlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgRmVhdHVyZVdyYXBwZXIodGhpcy5mZWF0dXJlc1tlXSl9LEZlYXR1cmVXcmFwcGVyLnByb3RvdHlwZS5sb2FkR2VvbWV0cnk9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJhd0dlb21ldHJ5O3RoaXMuZ2VvbWV0cnk9W107Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe2Zvcih2YXIgcj1lW3RdLG89W10sYT0wO2E8ci5sZW5ndGg7YSsrKW8ucHVzaChuZXcgUG9pbnQoclthXVswXSxyW2FdWzFdKSk7dGhpcy5nZW9tZXRyeS5wdXNoKG8pfXJldHVybiB0aGlzLmdlb21ldHJ5fSxGZWF0dXJlV3JhcHBlci5wcm90b3R5cGUuYmJveD1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnl8fHRoaXMubG9hZEdlb21ldHJ5KCk7Zm9yKHZhciBlPXRoaXMuZ2VvbWV0cnksdD0xLzAscj0tKDEvMCksbz0xLzAsYT0tKDEvMCksaT0wO2k8ZS5sZW5ndGg7aSsrKWZvcih2YXIgcD1lW2ldLG49MDtuPHAubGVuZ3RoO24rKyl7dmFyIGg9cFtuXTt0PU1hdGgubWluKHQsaC54KSxyPU1hdGgubWF4KHIsaC54KSxvPU1hdGgubWluKG8saC55KSxhPU1hdGgubWF4KGEsaC55KX1yZXR1cm5bdCxvLHIsYV19LEZlYXR1cmVXcmFwcGVyLnByb3RvdHlwZS50b0dlb0pTT049VmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTjtcbn0se1wicG9pbnQtZ2VvbWV0cnlcIjoyNixcInZlY3Rvci10aWxlXCI6MzR9XSw0MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiByZWFkVGlsZShlLHIpe3JldHVybiBlLnJlYWRGaWVsZHMocmVhZFRpbGVGaWVsZCx7bGF5ZXJzOltdfSxyKX1mdW5jdGlvbiByZWFkVGlsZUZpZWxkKGUscixpKXszPT09ZSYmci5sYXllcnMucHVzaChyZWFkTGF5ZXIoaSxpLnJlYWRWYXJpbnQoKStpLnBvcykpfWZ1bmN0aW9uIHdyaXRlVGlsZShlLHIpe3ZhciBpO2lmKHZvaWQgMCE9PWUubGF5ZXJzKWZvcihpPTA7aTxlLmxheWVycy5sZW5ndGg7aSsrKXIud3JpdGVNZXNzYWdlKDMsd3JpdGVMYXllcixlLmxheWVyc1tpXSl9ZnVuY3Rpb24gcmVhZFZhbHVlKGUscil7cmV0dXJuIGUucmVhZEZpZWxkcyhyZWFkVmFsdWVGaWVsZCx7fSxyKX1mdW5jdGlvbiByZWFkVmFsdWVGaWVsZChlLHIsaSl7MT09PWU/ci5zdHJpbmdfdmFsdWU9aS5yZWFkU3RyaW5nKCk6Mj09PWU/ci5mbG9hdF92YWx1ZT1pLnJlYWRGbG9hdCgpOjM9PT1lP3IuZG91YmxlX3ZhbHVlPWkucmVhZERvdWJsZSgpOjQ9PT1lP3IuaW50X3ZhbHVlPWkucmVhZFZhcmludCgpOjU9PT1lP3IudWludF92YWx1ZT1pLnJlYWRWYXJpbnQoKTo2PT09ZT9yLnNpbnRfdmFsdWU9aS5yZWFkU1ZhcmludCgpOjc9PT1lJiYoci5ib29sX3ZhbHVlPWkucmVhZEJvb2xlYW4oKSl9ZnVuY3Rpb24gd3JpdGVWYWx1ZShlLHIpe3ZvaWQgMCE9PWUuc3RyaW5nX3ZhbHVlJiZyLndyaXRlU3RyaW5nRmllbGQoMSxlLnN0cmluZ192YWx1ZSksdm9pZCAwIT09ZS5mbG9hdF92YWx1ZSYmci53cml0ZUZsb2F0RmllbGQoMixlLmZsb2F0X3ZhbHVlKSx2b2lkIDAhPT1lLmRvdWJsZV92YWx1ZSYmci53cml0ZURvdWJsZUZpZWxkKDMsZS5kb3VibGVfdmFsdWUpLHZvaWQgMCE9PWUuaW50X3ZhbHVlJiZyLndyaXRlVmFyaW50RmllbGQoNCxlLmludF92YWx1ZSksdm9pZCAwIT09ZS51aW50X3ZhbHVlJiZyLndyaXRlVmFyaW50RmllbGQoNSxlLnVpbnRfdmFsdWUpLHZvaWQgMCE9PWUuc2ludF92YWx1ZSYmci53cml0ZVNWYXJpbnRGaWVsZCg2LGUuc2ludF92YWx1ZSksdm9pZCAwIT09ZS5ib29sX3ZhbHVlJiZyLndyaXRlQm9vbGVhbkZpZWxkKDcsZS5ib29sX3ZhbHVlKX1mdW5jdGlvbiByZWFkRmVhdHVyZShlLHIpe3ZhciBpPWUucmVhZEZpZWxkcyhyZWFkRmVhdHVyZUZpZWxkLHt9LHIpO3JldHVybiB2b2lkIDA9PT1pLnR5cGUmJihpLnR5cGU9XCJVbmtub3duXCIpLGl9ZnVuY3Rpb24gcmVhZEZlYXR1cmVGaWVsZChlLHIsaSl7MT09PWU/ci5pZD1pLnJlYWRWYXJpbnQoKToyPT09ZT9yLnRhZ3M9aS5yZWFkUGFja2VkVmFyaW50KCk6Mz09PWU/ci50eXBlPWkucmVhZFZhcmludCgpOjQ9PT1lJiYoci5nZW9tZXRyeT1pLnJlYWRQYWNrZWRWYXJpbnQoKSl9ZnVuY3Rpb24gd3JpdGVGZWF0dXJlKGUscil7dm9pZCAwIT09ZS5pZCYmci53cml0ZVZhcmludEZpZWxkKDEsZS5pZCksdm9pZCAwIT09ZS50YWdzJiZyLndyaXRlUGFja2VkVmFyaW50KDIsZS50YWdzKSx2b2lkIDAhPT1lLnR5cGUmJnIud3JpdGVWYXJpbnRGaWVsZCgzLGUudHlwZSksdm9pZCAwIT09ZS5nZW9tZXRyeSYmci53cml0ZVBhY2tlZFZhcmludCg0LGUuZ2VvbWV0cnkpfWZ1bmN0aW9uIHJlYWRMYXllcihlLHIpe3JldHVybiBlLnJlYWRGaWVsZHMocmVhZExheWVyRmllbGQse2ZlYXR1cmVzOltdLGtleXM6W10sdmFsdWVzOltdfSxyKX1mdW5jdGlvbiByZWFkTGF5ZXJGaWVsZChlLHIsaSl7MTU9PT1lP3IudmVyc2lvbj1pLnJlYWRWYXJpbnQoKToxPT09ZT9yLm5hbWU9aS5yZWFkU3RyaW5nKCk6Mj09PWU/ci5mZWF0dXJlcy5wdXNoKHJlYWRGZWF0dXJlKGksaS5yZWFkVmFyaW50KCkraS5wb3MpKTozPT09ZT9yLmtleXMucHVzaChpLnJlYWRTdHJpbmcoKSk6ND09PWU/ci52YWx1ZXMucHVzaChyZWFkVmFsdWUoaSxpLnJlYWRWYXJpbnQoKStpLnBvcykpOjU9PT1lJiYoci5leHRlbnQ9aS5yZWFkVmFyaW50KCkpfWZ1bmN0aW9uIHdyaXRlTGF5ZXIoZSxyKXt2b2lkIDAhPT1lLnZlcnNpb24mJnIud3JpdGVWYXJpbnRGaWVsZCgxNSxlLnZlcnNpb24pLHZvaWQgMCE9PWUubmFtZSYmci53cml0ZVN0cmluZ0ZpZWxkKDEsZS5uYW1lKTt2YXIgaTtpZih2b2lkIDAhPT1lLmZlYXR1cmVzKWZvcihpPTA7aTxlLmZlYXR1cmVzLmxlbmd0aDtpKyspci53cml0ZU1lc3NhZ2UoMix3cml0ZUZlYXR1cmUsZS5mZWF0dXJlc1tpXSk7aWYodm9pZCAwIT09ZS5rZXlzKWZvcihpPTA7aTxlLmtleXMubGVuZ3RoO2krKylyLndyaXRlU3RyaW5nRmllbGQoMyxlLmtleXNbaV0pO2lmKHZvaWQgMCE9PWUudmFsdWVzKWZvcihpPTA7aTxlLnZhbHVlcy5sZW5ndGg7aSsrKXIud3JpdGVNZXNzYWdlKDQsd3JpdGVWYWx1ZSxlLnZhbHVlc1tpXSk7dm9pZCAwIT09ZS5leHRlbnQmJnIud3JpdGVWYXJpbnRGaWVsZCg1LGUuZXh0ZW50KX12YXIgdGlsZT1leHBvcnRzLnRpbGU9e3JlYWQ6cmVhZFRpbGUsd3JpdGU6d3JpdGVUaWxlfTt0aWxlLkdlb21UeXBlPXtVbmtub3duOjAsUG9pbnQ6MSxMaW5lU3RyaW5nOjIsUG9seWdvbjozfSx0aWxlLnZhbHVlPXtyZWFkOnJlYWRWYWx1ZSx3cml0ZTp3cml0ZVZhbHVlfSx0aWxlLmZlYXR1cmU9e3JlYWQ6cmVhZEZlYXR1cmUsd3JpdGU6d3JpdGVGZWF0dXJlfSx0aWxlLmxheWVyPXtyZWFkOnJlYWRMYXllcix3cml0ZTp3cml0ZUxheWVyfTtcbn0se31dLDQxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbnZhciBidW5kbGVGbj1hcmd1bWVudHNbM10sc291cmNlcz1hcmd1bWVudHNbNF0sY2FjaGU9YXJndW1lbnRzWzVdLHN0cmluZ2lmeT1KU09OLnN0cmluZ2lmeTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihyLGUpe2Z1bmN0aW9uIHQocil7ZFtyXT0hMDtmb3IodmFyIGUgaW4gc291cmNlc1tyXVsxXSl7dmFyIG49c291cmNlc1tyXVsxXVtlXTtkW25dfHx0KG4pfX1mb3IodmFyIG4sbz1PYmplY3Qua2V5cyhjYWNoZSksYT0wLGk9by5sZW5ndGg7YTxpO2ErKyl7dmFyIHM9b1thXSx1PWNhY2hlW3NdLmV4cG9ydHM7aWYodT09PXJ8fHUmJnUuZGVmYXVsdD09PXIpe249czticmVha319aWYoIW4pe249TWF0aC5mbG9vcihNYXRoLnBvdygxNiw4KSpNYXRoLnJhbmRvbSgpKS50b1N0cmluZygxNik7Zm9yKHZhciBmPXt9LGE9MCxpPW8ubGVuZ3RoO2E8aTthKyspe3ZhciBzPW9bYV07ZltzXT1zfXNvdXJjZXNbbl09W0Z1bmN0aW9uKFtcInJlcXVpcmVcIixcIm1vZHVsZVwiLFwiZXhwb3J0c1wiXSxcIihcIityK1wiKShzZWxmKVwiKSxmXX12YXIgYz1NYXRoLmZsb29yKE1hdGgucG93KDE2LDgpKk1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKDE2KSxsPXt9O2xbbl09bixzb3VyY2VzW2NdPVtGdW5jdGlvbihbXCJyZXF1aXJlXCJdLFwidmFyIGYgPSByZXF1aXJlKFwiK3N0cmluZ2lmeShuKStcIik7KGYuZGVmYXVsdCA/IGYuZGVmYXVsdCA6IGYpKHNlbGYpO1wiKSxsXTt2YXIgZD17fTt0KGMpO3ZhciBnPVwiKFwiK2J1bmRsZUZuK1wiKSh7XCIrT2JqZWN0LmtleXMoZCkubWFwKGZ1bmN0aW9uKHIpe3JldHVybiBzdHJpbmdpZnkocikrXCI6W1wiK3NvdXJjZXNbcl1bMF0rXCIsXCIrc3RyaW5naWZ5KHNvdXJjZXNbcl1bMV0pK1wiXVwifSkuam9pbihcIixcIikrXCJ9LHt9LFtcIitzdHJpbmdpZnkoYykrXCJdKVwiLHY9d2luZG93LlVSTHx8d2luZG93LndlYmtpdFVSTHx8d2luZG93Lm1velVSTHx8d2luZG93Lm1zVVJMLHc9bmV3IEJsb2IoW2ddLHt0eXBlOlwidGV4dC9qYXZhc2NyaXB0XCJ9KTtpZihlJiZlLmJhcmUpcmV0dXJuIHc7dmFyIGg9di5jcmVhdGVPYmplY3RVUkwodyksYj1uZXcgV29ya2VyKGgpO3JldHVybiBiLm9iamVjdFVSTD1oLGJ9O1xufSx7fV0sNDI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xubW9kdWxlLmV4cG9ydHMuUkFESVVTPTYzNzgxMzcsbW9kdWxlLmV4cG9ydHMuRkxBVFRFTklORz0xLzI5OC4yNTcyMjM1NjMsbW9kdWxlLmV4cG9ydHMuUE9MQVJfUkFESVVTPTYzNTY3NTIuMzE0Mjtcbn0se31dLDQzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbm1vZHVsZS5leHBvcnRzPXtcInZlcnNpb25cIjpcIjAuMzcuMFwifVxufSx7fV0sNDQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gc2VyaWFsaXplUGFpbnRWZXJ0ZXhBcnJheXMocixlKXt2YXIgdD17fTtmb3IodmFyIGEgaW4gcil7dmFyIGk9clthXS5wYWludFZlcnRleEFycmF5O2lmKDAhPT1pLmxlbmd0aCl7dmFyIG49aS5zZXJpYWxpemUoZSkscz1pLmNvbnN0cnVjdG9yLnNlcmlhbGl6ZSgpO3RbYV09e2FycmF5Om4sdHlwZTpzfX19cmV0dXJuIHR9dmFyIFByb2dyYW1Db25maWd1cmF0aW9uPV9kZXJlcV8oXCIuL3Byb2dyYW1fY29uZmlndXJhdGlvblwiKSxjcmVhdGVWZXJ0ZXhBcnJheVR5cGU9X2RlcmVxXyhcIi4vdmVydGV4X2FycmF5X3R5cGVcIiksU2VnbWVudD1mdW5jdGlvbihyLGUpe3RoaXMudmVydGV4T2Zmc2V0PXIsdGhpcy5wcmltaXRpdmVPZmZzZXQ9ZSx0aGlzLnZlcnRleExlbmd0aD0wLHRoaXMucHJpbWl0aXZlTGVuZ3RoPTB9LEFycmF5R3JvdXA9ZnVuY3Rpb24ocixlLHQpe3ZhciBhPXRoaXM7dGhpcy5nbG9iYWxQcm9wZXJ0aWVzPXt6b29tOnR9O3ZhciBpPWNyZWF0ZVZlcnRleEFycmF5VHlwZShyLmxheW91dEF0dHJpYnV0ZXMpO3RoaXMubGF5b3V0VmVydGV4QXJyYXk9bmV3IGk7dmFyIG49ci5lbGVtZW50QXJyYXlUeXBlO24mJih0aGlzLmVsZW1lbnRBcnJheT1uZXcgbik7dmFyIHM9ci5lbGVtZW50QXJyYXlUeXBlMjtzJiYodGhpcy5lbGVtZW50QXJyYXkyPW5ldyBzKSx0aGlzLmxheWVyRGF0YT17fTtmb3IodmFyIHk9MCxvPWU7eTxvLmxlbmd0aDt5Kz0xKXt2YXIgcD1vW3ldLGw9UHJvZ3JhbUNvbmZpZ3VyYXRpb24uY3JlYXRlRHluYW1pYyhyLnBhaW50QXR0cmlidXRlc3x8W10scCx0KTthLmxheWVyRGF0YVtwLmlkXT17bGF5ZXI6cCxwcm9ncmFtQ29uZmlndXJhdGlvbjpsLHBhaW50VmVydGV4QXJyYXk6bmV3IGwuUGFpbnRWZXJ0ZXhBcnJheSxwYWludFByb3BlcnR5U3RhdGlzdGljczpsLmNyZWF0ZVBhaW50UHJvcGVydHlTdGF0aXN0aWNzKCl9fXRoaXMuc2VnbWVudHM9W10sdGhpcy5zZWdtZW50czI9W119O0FycmF5R3JvdXAucHJvdG90eXBlLnByZXBhcmVTZWdtZW50PWZ1bmN0aW9uKHIpe3ZhciBlPXRoaXMuc2VnbWVudHNbdGhpcy5zZWdtZW50cy5sZW5ndGgtMV07cmV0dXJuKCFlfHxlLnZlcnRleExlbmd0aCtyPkFycmF5R3JvdXAuTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEgpJiYoZT1uZXcgU2VnbWVudCh0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCx0aGlzLmVsZW1lbnRBcnJheS5sZW5ndGgpLHRoaXMuc2VnbWVudHMucHVzaChlKSksZX0sQXJyYXlHcm91cC5wcm90b3R5cGUucHJlcGFyZVNlZ21lbnQyPWZ1bmN0aW9uKHIpe3ZhciBlPXRoaXMuc2VnbWVudHMyW3RoaXMuc2VnbWVudHMyLmxlbmd0aC0xXTtyZXR1cm4oIWV8fGUudmVydGV4TGVuZ3RoK3I+QXJyYXlHcm91cC5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSCkmJihlPW5ldyBTZWdtZW50KHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLHRoaXMuZWxlbWVudEFycmF5Mi5sZW5ndGgpLHRoaXMuc2VnbWVudHMyLnB1c2goZSkpLGV9LEFycmF5R3JvdXAucHJvdG90eXBlLnBvcHVsYXRlUGFpbnRBcnJheXM9ZnVuY3Rpb24ocil7dmFyIGU9dGhpcztmb3IodmFyIHQgaW4gZS5sYXllckRhdGEpe3ZhciBhPWUubGF5ZXJEYXRhW3RdOzAhPT1hLnBhaW50VmVydGV4QXJyYXkuYnl0ZXNQZXJFbGVtZW50JiZhLnByb2dyYW1Db25maWd1cmF0aW9uLnBvcHVsYXRlUGFpbnRBcnJheShhLmxheWVyLGEucGFpbnRWZXJ0ZXhBcnJheSxhLnBhaW50UHJvcGVydHlTdGF0aXN0aWNzLGUubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLGUuZ2xvYmFsUHJvcGVydGllcyxyKX19LEFycmF5R3JvdXAucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RofSxBcnJheUdyb3VwLnByb3RvdHlwZS5zZXJpYWxpemU9ZnVuY3Rpb24ocil7cmV0dXJue2xheW91dFZlcnRleEFycmF5OnRoaXMubGF5b3V0VmVydGV4QXJyYXkuc2VyaWFsaXplKHIpLGVsZW1lbnRBcnJheTp0aGlzLmVsZW1lbnRBcnJheSYmdGhpcy5lbGVtZW50QXJyYXkuc2VyaWFsaXplKHIpLGVsZW1lbnRBcnJheTI6dGhpcy5lbGVtZW50QXJyYXkyJiZ0aGlzLmVsZW1lbnRBcnJheTIuc2VyaWFsaXplKHIpLHBhaW50VmVydGV4QXJyYXlzOnNlcmlhbGl6ZVBhaW50VmVydGV4QXJyYXlzKHRoaXMubGF5ZXJEYXRhLHIpLHNlZ21lbnRzOnRoaXMuc2VnbWVudHMsc2VnbWVudHMyOnRoaXMuc2VnbWVudHMyfX0sQXJyYXlHcm91cC5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSD1NYXRoLnBvdygyLDE2KS0xLG1vZHVsZS5leHBvcnRzPUFycmF5R3JvdXA7XG59LHtcIi4vcHJvZ3JhbV9jb25maWd1cmF0aW9uXCI6NTgsXCIuL3ZlcnRleF9hcnJheV90eXBlXCI6NjB9XSw0NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgQXJyYXlHcm91cD1fZGVyZXFfKFwiLi9hcnJheV9ncm91cFwiKSxCdWZmZXJHcm91cD1fZGVyZXFfKFwiLi9idWZmZXJfZ3JvdXBcIiksdXRpbD1fZGVyZXFfKFwiLi4vdXRpbC91dGlsXCIpLEJ1Y2tldD1mdW5jdGlvbihyLHQpe3RoaXMuem9vbT1yLnpvb20sdGhpcy5vdmVyc2NhbGluZz1yLm92ZXJzY2FsaW5nLHRoaXMubGF5ZXJzPXIubGF5ZXJzLHRoaXMuaW5kZXg9ci5pbmRleCxyLmFycmF5cz90aGlzLmJ1ZmZlcnM9bmV3IEJ1ZmZlckdyb3VwKHQsci5sYXllcnMsci56b29tLHIuYXJyYXlzKTp0aGlzLmFycmF5cz1uZXcgQXJyYXlHcm91cCh0LHIubGF5ZXJzLHIuem9vbSl9O0J1Y2tldC5wcm90b3R5cGUucG9wdWxhdGU9ZnVuY3Rpb24ocix0KXtmb3IodmFyIGU9dGhpcyxpPTAsYT1yO2k8YS5sZW5ndGg7aSs9MSl7dmFyIHU9YVtpXTtlLmxheWVyc1swXS5maWx0ZXIodSkmJihlLmFkZEZlYXR1cmUodSksdC5mZWF0dXJlSW5kZXguaW5zZXJ0KHUsZS5pbmRleCkpfX0sQnVja2V0LnByb3RvdHlwZS5nZXRQYWludFByb3BlcnR5U3RhdGlzdGljcz1mdW5jdGlvbigpe3JldHVybiB1dGlsLm1hcE9iamVjdCh0aGlzLmFycmF5cy5sYXllckRhdGEsZnVuY3Rpb24ocil7cmV0dXJuIHIucGFpbnRQcm9wZXJ0eVN0YXRpc3RpY3N9KX0sQnVja2V0LnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXJyYXlzLmlzRW1wdHkoKX0sQnVja2V0LnByb3RvdHlwZS5zZXJpYWxpemU9ZnVuY3Rpb24ocil7cmV0dXJue3pvb206dGhpcy56b29tLGxheWVySWRzOnRoaXMubGF5ZXJzLm1hcChmdW5jdGlvbihyKXtyZXR1cm4gci5pZH0pLGFycmF5czp0aGlzLmFycmF5cy5zZXJpYWxpemUocil9fSxCdWNrZXQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmJ1ZmZlcnMmJih0aGlzLmJ1ZmZlcnMuZGVzdHJveSgpLHRoaXMuYnVmZmVycz1udWxsKX0sbW9kdWxlLmV4cG9ydHM9QnVja2V0LEJ1Y2tldC5kZXNlcmlhbGl6ZT1mdW5jdGlvbihyLHQpe2lmKHQpe2Zvcih2YXIgZT17fSxpPTAsYT1yO2k8YS5sZW5ndGg7aSs9MSl7dmFyIHU9YVtpXSxvPXUubGF5ZXJJZHMubWFwKGZ1bmN0aW9uKHIpe3JldHVybiB0LmdldExheWVyKHIpfSkuZmlsdGVyKEJvb2xlYW4pO2lmKDAhPT1vLmxlbmd0aClmb3IodmFyIHM9b1swXS5jcmVhdGVCdWNrZXQodXRpbC5leHRlbmQoe2xheWVyczpvfSx1KSksbj0wLGY9bztuPGYubGVuZ3RoO24rPTEpe3ZhciB5PWZbbl07ZVt5LmlkXT1zfX1yZXR1cm4gZX19O1xufSx7XCIuLi91dGlsL3V0aWxcIjoyMTUsXCIuL2FycmF5X2dyb3VwXCI6NDQsXCIuL2J1ZmZlcl9ncm91cFwiOjUyfV0sNDY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gYWRkQ2lyY2xlVmVydGV4KGUscix0LGMsaSl7ZS5lbXBsYWNlQmFjaygyKnIrKGMrMSkvMiwyKnQrKGkrMSkvMil9dmFyIEJ1Y2tldD1fZGVyZXFfKFwiLi4vYnVja2V0XCIpLGNyZWF0ZUVsZW1lbnRBcnJheVR5cGU9X2RlcmVxXyhcIi4uL2VsZW1lbnRfYXJyYXlfdHlwZVwiKSxsb2FkR2VvbWV0cnk9X2RlcmVxXyhcIi4uL2xvYWRfZ2VvbWV0cnlcIiksRVhURU5UPV9kZXJlcV8oXCIuLi9leHRlbnRcIiksY2lyY2xlSW50ZXJmYWNlPXtsYXlvdXRBdHRyaWJ1dGVzOlt7bmFtZTpcImFfcG9zXCIsY29tcG9uZW50czoyLHR5cGU6XCJJbnQxNlwifV0sZWxlbWVudEFycmF5VHlwZTpjcmVhdGVFbGVtZW50QXJyYXlUeXBlKCkscGFpbnRBdHRyaWJ1dGVzOlt7cHJvcGVydHk6XCJjaXJjbGUtY29sb3JcIix0eXBlOlwiVWludDhcIn0se3Byb3BlcnR5OlwiY2lyY2xlLXJhZGl1c1wiLHR5cGU6XCJVaW50MTZcIixtdWx0aXBsaWVyOjEwfSx7cHJvcGVydHk6XCJjaXJjbGUtYmx1clwiLHR5cGU6XCJVaW50MTZcIixtdWx0aXBsaWVyOjEwfSx7cHJvcGVydHk6XCJjaXJjbGUtb3BhY2l0eVwiLHR5cGU6XCJVaW50OFwiLG11bHRpcGxpZXI6MjU1fSx7cHJvcGVydHk6XCJjaXJjbGUtc3Ryb2tlLWNvbG9yXCIsdHlwZTpcIlVpbnQ4XCJ9LHtwcm9wZXJ0eTpcImNpcmNsZS1zdHJva2Utd2lkdGhcIix0eXBlOlwiVWludDE2XCIsbXVsdGlwbGllcjoxMH0se3Byb3BlcnR5OlwiY2lyY2xlLXN0cm9rZS1vcGFjaXR5XCIsdHlwZTpcIlVpbnQ4XCIsbXVsdGlwbGllcjoyNTV9XX0sQ2lyY2xlQnVja2V0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIocil7ZS5jYWxsKHRoaXMscixjaXJjbGVJbnRlcmZhY2UpfXJldHVybiBlJiYoci5fX3Byb3RvX189ZSksci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSksci5wcm90b3R5cGUuY29uc3RydWN0b3I9cixyLnByb3RvdHlwZS5hZGRGZWF0dXJlPWZ1bmN0aW9uKGUpe2Zvcih2YXIgcj10aGlzLmFycmF5cyx0PTAsYz1sb2FkR2VvbWV0cnkoZSk7dDxjLmxlbmd0aDt0Kz0xKWZvcih2YXIgaT1jW3RdLGE9MCxwPWk7YTxwLmxlbmd0aDthKz0xKXt2YXIgbD1wW2FdLG89bC54LHk9bC55O2lmKCEobzwwfHxvPj1FWFRFTlR8fHk8MHx8eT49RVhURU5UKSl7dmFyIG49ci5wcmVwYXJlU2VnbWVudCg0KSx1PW4udmVydGV4TGVuZ3RoO2FkZENpcmNsZVZlcnRleChyLmxheW91dFZlcnRleEFycmF5LG8seSwtMSwtMSksYWRkQ2lyY2xlVmVydGV4KHIubGF5b3V0VmVydGV4QXJyYXksbyx5LDEsLTEpLGFkZENpcmNsZVZlcnRleChyLmxheW91dFZlcnRleEFycmF5LG8seSwxLDEpLGFkZENpcmNsZVZlcnRleChyLmxheW91dFZlcnRleEFycmF5LG8seSwtMSwxKSxyLmVsZW1lbnRBcnJheS5lbXBsYWNlQmFjayh1LHUrMSx1KzIpLHIuZWxlbWVudEFycmF5LmVtcGxhY2VCYWNrKHUsdSszLHUrMiksbi52ZXJ0ZXhMZW5ndGgrPTQsbi5wcmltaXRpdmVMZW5ndGgrPTJ9fXIucG9wdWxhdGVQYWludEFycmF5cyhlLnByb3BlcnRpZXMpfSxyfShCdWNrZXQpO0NpcmNsZUJ1Y2tldC5wcm9ncmFtSW50ZXJmYWNlPWNpcmNsZUludGVyZmFjZSxtb2R1bGUuZXhwb3J0cz1DaXJjbGVCdWNrZXQ7XG59LHtcIi4uL2J1Y2tldFwiOjQ1LFwiLi4vZWxlbWVudF9hcnJheV90eXBlXCI6NTMsXCIuLi9leHRlbnRcIjo1NCxcIi4uL2xvYWRfZ2VvbWV0cnlcIjo1Nn1dLDQ3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBCdWNrZXQ9X2RlcmVxXyhcIi4uL2J1Y2tldFwiKSxjcmVhdGVFbGVtZW50QXJyYXlUeXBlPV9kZXJlcV8oXCIuLi9lbGVtZW50X2FycmF5X3R5cGVcIiksbG9hZEdlb21ldHJ5PV9kZXJlcV8oXCIuLi9sb2FkX2dlb21ldHJ5XCIpLGVhcmN1dD1fZGVyZXFfKFwiZWFyY3V0XCIpLGNsYXNzaWZ5UmluZ3M9X2RlcmVxXyhcIi4uLy4uL3V0aWwvY2xhc3NpZnlfcmluZ3NcIiksRUFSQ1VUX01BWF9SSU5HUz01MDAsZmlsbEludGVyZmFjZT17bGF5b3V0QXR0cmlidXRlczpbe25hbWU6XCJhX3Bvc1wiLGNvbXBvbmVudHM6Mix0eXBlOlwiSW50MTZcIn1dLGVsZW1lbnRBcnJheVR5cGU6Y3JlYXRlRWxlbWVudEFycmF5VHlwZSgzKSxlbGVtZW50QXJyYXlUeXBlMjpjcmVhdGVFbGVtZW50QXJyYXlUeXBlKDIpLHBhaW50QXR0cmlidXRlczpbe3Byb3BlcnR5OlwiZmlsbC1jb2xvclwiLHR5cGU6XCJVaW50OFwifSx7cHJvcGVydHk6XCJmaWxsLW91dGxpbmUtY29sb3JcIix0eXBlOlwiVWludDhcIn0se3Byb3BlcnR5OlwiZmlsbC1vcGFjaXR5XCIsdHlwZTpcIlVpbnQ4XCIsbXVsdGlwbGllcjoyNTV9XX0sRmlsbEJ1Y2tldD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe2UuY2FsbCh0aGlzLHQsZmlsbEludGVyZmFjZSl9cmV0dXJuIGUmJih0Ll9fcHJvdG9fXz1lKSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlKSx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10LHQucHJvdG90eXBlLmFkZEZlYXR1cmU9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMuYXJyYXlzLHI9MCxhPWNsYXNzaWZ5UmluZ3MobG9hZEdlb21ldHJ5KGUpLEVBUkNVVF9NQVhfUklOR1MpO3I8YS5sZW5ndGg7cis9MSl7Zm9yKHZhciBsPWFbcl0sbj0wLHA9MCxpPWw7cDxpLmxlbmd0aDtwKz0xKXt2YXIgbz1pW3BdO24rPW8ubGVuZ3RofWZvcih2YXIgeT10LnByZXBhcmVTZWdtZW50KG4pLGM9eS52ZXJ0ZXhMZW5ndGgsdT1bXSxzPVtdLGc9MCxoPWw7ZzxoLmxlbmd0aDtnKz0xKXt2YXIgbT1oW2ddO2lmKDAhPT1tLmxlbmd0aCl7bSE9PWxbMF0mJnMucHVzaCh1Lmxlbmd0aC8yKTt2YXIgZj10LnByZXBhcmVTZWdtZW50MihtLmxlbmd0aCksQT1mLnZlcnRleExlbmd0aDt0LmxheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKG1bMF0ueCxtWzBdLnkpLHQuZWxlbWVudEFycmF5Mi5lbXBsYWNlQmFjayhBK20ubGVuZ3RoLTEsQSksdS5wdXNoKG1bMF0ueCksdS5wdXNoKG1bMF0ueSk7Zm9yKHZhciB2PTE7djxtLmxlbmd0aDt2KyspdC5sYXlvdXRWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhtW3ZdLngsbVt2XS55KSx0LmVsZW1lbnRBcnJheTIuZW1wbGFjZUJhY2soQSt2LTEsQSt2KSx1LnB1c2gobVt2XS54KSx1LnB1c2gobVt2XS55KTtmLnZlcnRleExlbmd0aCs9bS5sZW5ndGgsZi5wcmltaXRpdmVMZW5ndGgrPW0ubGVuZ3RofX1mb3IodmFyIF89ZWFyY3V0KHUscyksaz0wO2s8Xy5sZW5ndGg7ays9Myl0LmVsZW1lbnRBcnJheS5lbXBsYWNlQmFjayhjK19ba10sYytfW2srMV0sYytfW2srMl0pO3kudmVydGV4TGVuZ3RoKz1uLHkucHJpbWl0aXZlTGVuZ3RoKz1fLmxlbmd0aC8zfXQucG9wdWxhdGVQYWludEFycmF5cyhlLnByb3BlcnRpZXMpfSx0fShCdWNrZXQpO0ZpbGxCdWNrZXQucHJvZ3JhbUludGVyZmFjZT1maWxsSW50ZXJmYWNlLG1vZHVsZS5leHBvcnRzPUZpbGxCdWNrZXQ7XG59LHtcIi4uLy4uL3V0aWwvY2xhc3NpZnlfcmluZ3NcIjoxOTgsXCIuLi9idWNrZXRcIjo0NSxcIi4uL2VsZW1lbnRfYXJyYXlfdHlwZVwiOjUzLFwiLi4vbG9hZF9nZW9tZXRyeVwiOjU2LFwiZWFyY3V0XCI6NX1dLDQ4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGFkZFZlcnRleChlLHQscixhLG4sbyxpLHkpe2UuZW1wbGFjZUJhY2sodCxyLDIqTWF0aC5mbG9vcihhKkZBQ1RPUikraSxuKkZBQ1RPUioyLG8qRkFDVE9SKjIsTWF0aC5yb3VuZCh5KSl9ZnVuY3Rpb24gaXNCb3VuZGFyeUVkZ2UoZSx0KXtyZXR1cm4gZS54PT09dC54JiYoZS54PDB8fGUueD5FWFRFTlQpfHxlLnk9PT10LnkmJihlLnk8MHx8ZS55PkVYVEVOVCl9dmFyIEJ1Y2tldD1fZGVyZXFfKFwiLi4vYnVja2V0XCIpLGNyZWF0ZUVsZW1lbnRBcnJheVR5cGU9X2RlcmVxXyhcIi4uL2VsZW1lbnRfYXJyYXlfdHlwZVwiKSxsb2FkR2VvbWV0cnk9X2RlcmVxXyhcIi4uL2xvYWRfZ2VvbWV0cnlcIiksRVhURU5UPV9kZXJlcV8oXCIuLi9leHRlbnRcIiksZWFyY3V0PV9kZXJlcV8oXCJlYXJjdXRcIiksY2xhc3NpZnlSaW5ncz1fZGVyZXFfKFwiLi4vLi4vdXRpbC9jbGFzc2lmeV9yaW5nc1wiKSxFQVJDVVRfTUFYX1JJTkdTPTUwMCxmaWxsRXh0cnVzaW9uSW50ZXJmYWNlPXtsYXlvdXRBdHRyaWJ1dGVzOlt7bmFtZTpcImFfcG9zXCIsY29tcG9uZW50czoyLHR5cGU6XCJJbnQxNlwifSx7bmFtZTpcImFfbm9ybWFsXCIsY29tcG9uZW50czozLHR5cGU6XCJJbnQxNlwifSx7bmFtZTpcImFfZWRnZWRpc3RhbmNlXCIsY29tcG9uZW50czoxLHR5cGU6XCJJbnQxNlwifV0sZWxlbWVudEFycmF5VHlwZTpjcmVhdGVFbGVtZW50QXJyYXlUeXBlKDMpLHBhaW50QXR0cmlidXRlczpbe3Byb3BlcnR5OlwiZmlsbC1leHRydXNpb24tYmFzZVwiLHR5cGU6XCJVaW50MTZcIn0se3Byb3BlcnR5OlwiZmlsbC1leHRydXNpb24taGVpZ2h0XCIsdHlwZTpcIlVpbnQxNlwifSx7cHJvcGVydHk6XCJmaWxsLWV4dHJ1c2lvbi1jb2xvclwiLHR5cGU6XCJVaW50OFwifV19LEZBQ1RPUj1NYXRoLnBvdygyLDEzKSxGaWxsRXh0cnVzaW9uQnVja2V0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7ZS5jYWxsKHRoaXMsdCxmaWxsRXh0cnVzaW9uSW50ZXJmYWNlKX1yZXR1cm4gZSYmKHQuX19wcm90b19fPWUpLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUpLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXQsdC5wcm90b3R5cGUuYWRkRmVhdHVyZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy5hcnJheXMscj0wLGE9Y2xhc3NpZnlSaW5ncyhsb2FkR2VvbWV0cnkoZSksRUFSQ1VUX01BWF9SSU5HUyk7cjxhLmxlbmd0aDtyKz0xKXtmb3IodmFyIG49YVtyXSxvPTAsaT0wLHk9bjtpPHkubGVuZ3RoO2krPTEpe3ZhciBsPXlbaV07bys9bC5sZW5ndGh9Zm9yKHZhciB1PXQucHJlcGFyZVNlZ21lbnQoNSpvKSxwPVtdLHM9W10sYz1bXSx4PTAsZj1uO3g8Zi5sZW5ndGg7eCs9MSl7dmFyIGQ9Zlt4XTtpZigwIT09ZC5sZW5ndGgpe2QhPT1uWzBdJiZzLnB1c2gocC5sZW5ndGgvMik7Zm9yKHZhciBtPTAsaD0wO2g8ZC5sZW5ndGg7aCsrKXt2YXIgZz1kW2hdO2lmKGFkZFZlcnRleCh0LmxheW91dFZlcnRleEFycmF5LGcueCxnLnksMCwwLDEsMSwwKSxjLnB1c2godS52ZXJ0ZXhMZW5ndGgrKyksaD49MSl7dmFyIEE9ZFtoLTFdO2lmKCFpc0JvdW5kYXJ5RWRnZShnLEEpKXt2YXIgRT1nLnN1YihBKS5fcGVycCgpLl91bml0KCk7YWRkVmVydGV4KHQubGF5b3V0VmVydGV4QXJyYXksZy54LGcueSxFLngsRS55LDAsMCxtKSxhZGRWZXJ0ZXgodC5sYXlvdXRWZXJ0ZXhBcnJheSxnLngsZy55LEUueCxFLnksMCwxLG0pLG0rPUEuZGlzdChnKSxhZGRWZXJ0ZXgodC5sYXlvdXRWZXJ0ZXhBcnJheSxBLngsQS55LEUueCxFLnksMCwwLG0pLGFkZFZlcnRleCh0LmxheW91dFZlcnRleEFycmF5LEEueCxBLnksRS54LEUueSwwLDEsbSk7dmFyIHY9dS52ZXJ0ZXhMZW5ndGg7dC5lbGVtZW50QXJyYXkuZW1wbGFjZUJhY2sodix2KzEsdisyKSx0LmVsZW1lbnRBcnJheS5lbXBsYWNlQmFjayh2KzEsdisyLHYrMyksdS52ZXJ0ZXhMZW5ndGgrPTQsdS5wcmltaXRpdmVMZW5ndGgrPTJ9fXAucHVzaChnLngpLHAucHVzaChnLnkpfX19Zm9yKHZhciBfPWVhcmN1dChwLHMpLFQ9MDtUPF8ubGVuZ3RoO1QrPTMpdC5lbGVtZW50QXJyYXkuZW1wbGFjZUJhY2soY1tfW1RdXSxjW19bVCsxXV0sY1tfW1QrMl1dKTt1LnByaW1pdGl2ZUxlbmd0aCs9Xy5sZW5ndGgvM310LnBvcHVsYXRlUGFpbnRBcnJheXMoZS5wcm9wZXJ0aWVzKX0sdH0oQnVja2V0KTtGaWxsRXh0cnVzaW9uQnVja2V0LnByb2dyYW1JbnRlcmZhY2U9ZmlsbEV4dHJ1c2lvbkludGVyZmFjZSxtb2R1bGUuZXhwb3J0cz1GaWxsRXh0cnVzaW9uQnVja2V0O1xufSx7XCIuLi8uLi91dGlsL2NsYXNzaWZ5X3JpbmdzXCI6MTk4LFwiLi4vYnVja2V0XCI6NDUsXCIuLi9lbGVtZW50X2FycmF5X3R5cGVcIjo1MyxcIi4uL2V4dGVudFwiOjU0LFwiLi4vbG9hZF9nZW9tZXRyeVwiOjU2LFwiZWFyY3V0XCI6NX1dLDQ5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGFkZExpbmVWZXJ0ZXgoZSx0LHIsaSxhLG4sZCl7ZS5lbXBsYWNlQmFjayh0Lng8PDF8aSx0Lnk8PDF8YSxNYXRoLnJvdW5kKEVYVFJVREVfU0NBTEUqci54KSsxMjgsTWF0aC5yb3VuZChFWFRSVURFX1NDQUxFKnIueSkrMTI4LCgwPT09bj8wOm48MD8tMToxKSsxfChkKkxJTkVfRElTVEFOQ0VfU0NBTEUmNjMpPDwyLGQqTElORV9ESVNUQU5DRV9TQ0FMRT4+Nil9dmFyIEJ1Y2tldD1fZGVyZXFfKFwiLi4vYnVja2V0XCIpLGNyZWF0ZUVsZW1lbnRBcnJheVR5cGU9X2RlcmVxXyhcIi4uL2VsZW1lbnRfYXJyYXlfdHlwZVwiKSxsb2FkR2VvbWV0cnk9X2RlcmVxXyhcIi4uL2xvYWRfZ2VvbWV0cnlcIiksRVhURU5UPV9kZXJlcV8oXCIuLi9leHRlbnRcIiksVmVjdG9yVGlsZUZlYXR1cmU9X2RlcmVxXyhcInZlY3Rvci10aWxlXCIpLlZlY3RvclRpbGVGZWF0dXJlLEVYVFJVREVfU0NBTEU9NjMsQ09TX0hBTEZfU0hBUlBfQ09STkVSPU1hdGguY29zKDM3LjUqKE1hdGguUEkvMTgwKSksU0hBUlBfQ09STkVSX09GRlNFVD0xNSxMSU5FX0RJU1RBTkNFX0JVRkZFUl9CSVRTPTE1LExJTkVfRElTVEFOQ0VfU0NBTEU9LjUsTUFYX0xJTkVfRElTVEFOQ0U9TWF0aC5wb3coMixMSU5FX0RJU1RBTkNFX0JVRkZFUl9CSVRTLTEpL0xJTkVfRElTVEFOQ0VfU0NBTEUsbGluZUludGVyZmFjZT17bGF5b3V0QXR0cmlidXRlczpbe25hbWU6XCJhX3Bvc1wiLGNvbXBvbmVudHM6Mix0eXBlOlwiSW50MTZcIn0se25hbWU6XCJhX2RhdGFcIixjb21wb25lbnRzOjQsdHlwZTpcIlVpbnQ4XCJ9XSxwYWludEF0dHJpYnV0ZXM6W3twcm9wZXJ0eTpcImxpbmUtY29sb3JcIix0eXBlOlwiVWludDhcIn0se3Byb3BlcnR5OlwibGluZS1ibHVyXCIsbXVsdGlwbGllcjoxMCx0eXBlOlwiVWludDhcIn0se3Byb3BlcnR5OlwibGluZS1vcGFjaXR5XCIsbXVsdGlwbGllcjoxMCx0eXBlOlwiVWludDhcIn0se3Byb3BlcnR5OlwibGluZS1nYXAtd2lkdGhcIixtdWx0aXBsaWVyOjEwLHR5cGU6XCJVaW50OFwiLG5hbWU6XCJhX2dhcHdpZHRoXCJ9LHtwcm9wZXJ0eTpcImxpbmUtb2Zmc2V0XCIsbXVsdGlwbGllcjoxLHR5cGU6XCJJbnQ4XCJ9XSxlbGVtZW50QXJyYXlUeXBlOmNyZWF0ZUVsZW1lbnRBcnJheVR5cGUoKX0sTGluZUJ1Y2tldD1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe2UuY2FsbCh0aGlzLHQsbGluZUludGVyZmFjZSl9cmV0dXJuIGUmJih0Ll9fcHJvdG9fXz1lKSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlKSx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10LHQucHJvdG90eXBlLmFkZEZlYXR1cmU9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMscj10aGlzLmxheWVyc1swXS5sYXlvdXQsaT1yW1wibGluZS1qb2luXCJdLGE9cltcImxpbmUtY2FwXCJdLG49cltcImxpbmUtbWl0ZXItbGltaXRcIl0sZD1yW1wibGluZS1yb3VuZC1saW1pdFwiXSxzPTAsdT1sb2FkR2VvbWV0cnkoZSxMSU5FX0RJU1RBTkNFX0JVRkZFUl9CSVRTKTtzPHUubGVuZ3RoO3MrPTEpe3ZhciBsPXVbc107dC5hZGRMaW5lKGwsZSxpLGEsbixkKX19LHQucHJvdG90eXBlLmFkZExpbmU9ZnVuY3Rpb24oZSx0LHIsaSxhLG4pe2Zvcih2YXIgZD10aGlzLHM9dC5wcm9wZXJ0aWVzLHU9XCJQb2x5Z29uXCI9PT1WZWN0b3JUaWxlRmVhdHVyZS50eXBlc1t0LnR5cGVdLGw9ZS5sZW5ndGg7bD49MiYmZVtsLTFdLmVxdWFscyhlW2wtMl0pOylsLS07Zm9yKHZhciBvPTA7bzxsLTEmJmVbb10uZXF1YWxzKGVbbysxXSk7KW8rKztpZighKGw8KHU/MzoyKSkpe1wiYmV2ZWxcIj09PXImJihhPTEuMDUpO3ZhciBwPVNIQVJQX0NPUk5FUl9PRkZTRVQqKEVYVEVOVC8oNTEyKnRoaXMub3ZlcnNjYWxpbmcpKSxjPWVbb10sXz10aGlzLmFycmF5cyxoPV8ucHJlcGFyZVNlZ21lbnQoMTAqbCk7dGhpcy5kaXN0YW5jZT0wO3ZhciB5LG0sRSx4LEMsdixmLEE9aSxMPXU/XCJidXR0XCI6aSxTPSEwO3RoaXMuZTE9dGhpcy5lMj10aGlzLmUzPS0xLHUmJih5PWVbbC0yXSxDPWMuc3ViKHkpLl91bml0KCkuX3BlcnAoKSk7Zm9yKHZhciBWPW87VjxsO1YrKylpZihFPXUmJlY9PT1sLTE/ZVtvKzFdOmVbVisxXSwhRXx8IWVbVl0uZXF1YWxzKEUpKXtDJiYoeD1DKSx5JiYobT15KSx5PWVbVl0sQz1FP0Uuc3ViKHkpLl91bml0KCkuX3BlcnAoKTp4LHg9eHx8Qzt2YXIgST14LmFkZChDKTswPT09SS54JiYwPT09SS55fHxJLl91bml0KCk7dmFyIFQ9SS54KkMueCtJLnkqQy55LE49MCE9PVQ/MS9UOjEvMCxiPVQ8Q09TX0hBTEZfU0hBUlBfQ09STkVSJiZtJiZFO2lmKGImJlY+byl7dmFyIFI9eS5kaXN0KG0pO2lmKFI+MipwKXt2YXIgZz15LnN1Yih5LnN1YihtKS5fbXVsdChwL1IpLl9yb3VuZCgpKTtkLmRpc3RhbmNlKz1nLmRpc3QobSksZC5hZGRDdXJyZW50VmVydGV4KGcsZC5kaXN0YW5jZSx4Lm11bHQoMSksMCwwLCExLGgpLG09Z319dmFyIEY9bSYmRSxCPUY/cjpFP0E6TDtpZihGJiZcInJvdW5kXCI9PT1CJiYoTjxuP0I9XCJtaXRlclwiOk48PTImJihCPVwiZmFrZXJvdW5kXCIpKSxcIm1pdGVyXCI9PT1CJiZOPmEmJihCPVwiYmV2ZWxcIiksXCJiZXZlbFwiPT09QiYmKE4+MiYmKEI9XCJmbGlwYmV2ZWxcIiksTjxhJiYoQj1cIm1pdGVyXCIpKSxtJiYoZC5kaXN0YW5jZSs9eS5kaXN0KG0pKSxcIm1pdGVyXCI9PT1CKUkuX211bHQoTiksZC5hZGRDdXJyZW50VmVydGV4KHksZC5kaXN0YW5jZSxJLDAsMCwhMSxoKTtlbHNlIGlmKFwiZmxpcGJldmVsXCI9PT1CKXtpZihOPjEwMClJPUMuY2xvbmUoKS5tdWx0KC0xKTtlbHNle3ZhciBrPXgueCpDLnkteC55KkMueD4wPy0xOjEsRD1OKnguYWRkKEMpLm1hZygpL3guc3ViKEMpLm1hZygpO0kuX3BlcnAoKS5fbXVsdChEKmspfWQuYWRkQ3VycmVudFZlcnRleCh5LGQuZGlzdGFuY2UsSSwwLDAsITEsaCksZC5hZGRDdXJyZW50VmVydGV4KHksZC5kaXN0YW5jZSxJLm11bHQoLTEpLDAsMCwhMSxoKX1lbHNlIGlmKFwiYmV2ZWxcIj09PUJ8fFwiZmFrZXJvdW5kXCI9PT1CKXt2YXIgUD14LngqQy55LXgueSpDLng+MCxVPS1NYXRoLnNxcnQoTipOLTEpO2lmKFA/KGY9MCx2PVUpOih2PTAsZj1VKSxTfHxkLmFkZEN1cnJlbnRWZXJ0ZXgoeSxkLmRpc3RhbmNlLHgsdixmLCExLGgpLFwiZmFrZXJvdW5kXCI9PT1CKXtmb3IodmFyIHE9TWF0aC5mbG9vcig4KiguNS0oVC0uNSkpKSxNPXZvaWQgMCxPPTA7TzxxO08rKylNPUMubXVsdCgoTysxKS8ocSsxKSkuX2FkZCh4KS5fdW5pdCgpLGQuYWRkUGllU2xpY2VWZXJ0ZXgoeSxkLmRpc3RhbmNlLE0sUCxoKTtkLmFkZFBpZVNsaWNlVmVydGV4KHksZC5kaXN0YW5jZSxJLFAsaCk7Zm9yKHZhciBYPXEtMTtYPj0wO1gtLSlNPXgubXVsdCgoWCsxKS8ocSsxKSkuX2FkZChDKS5fdW5pdCgpLGQuYWRkUGllU2xpY2VWZXJ0ZXgoeSxkLmRpc3RhbmNlLE0sUCxoKX1FJiZkLmFkZEN1cnJlbnRWZXJ0ZXgoeSxkLmRpc3RhbmNlLEMsLXYsLWYsITEsaCl9ZWxzZVwiYnV0dFwiPT09Qj8oU3x8ZC5hZGRDdXJyZW50VmVydGV4KHksZC5kaXN0YW5jZSx4LDAsMCwhMSxoKSxFJiZkLmFkZEN1cnJlbnRWZXJ0ZXgoeSxkLmRpc3RhbmNlLEMsMCwwLCExLGgpKTpcInNxdWFyZVwiPT09Qj8oU3x8KGQuYWRkQ3VycmVudFZlcnRleCh5LGQuZGlzdGFuY2UseCwxLDEsITEsaCksZC5lMT1kLmUyPS0xKSxFJiZkLmFkZEN1cnJlbnRWZXJ0ZXgoeSxkLmRpc3RhbmNlLEMsLTEsLTEsITEsaCkpOlwicm91bmRcIj09PUImJihTfHwoZC5hZGRDdXJyZW50VmVydGV4KHksZC5kaXN0YW5jZSx4LDAsMCwhMSxoKSxkLmFkZEN1cnJlbnRWZXJ0ZXgoeSxkLmRpc3RhbmNlLHgsMSwxLCEwLGgpLGQuZTE9ZC5lMj0tMSksRSYmKGQuYWRkQ3VycmVudFZlcnRleCh5LGQuZGlzdGFuY2UsQywtMSwtMSwhMCxoKSxkLmFkZEN1cnJlbnRWZXJ0ZXgoeSxkLmRpc3RhbmNlLEMsMCwwLCExLGgpKSk7aWYoYiYmVjxsLTEpe3ZhciBIPXkuZGlzdChFKTtpZihIPjIqcCl7dmFyIHc9eS5hZGQoRS5zdWIoeSkuX211bHQocC9IKS5fcm91bmQoKSk7ZC5kaXN0YW5jZSs9dy5kaXN0KHkpLGQuYWRkQ3VycmVudFZlcnRleCh3LGQuZGlzdGFuY2UsQy5tdWx0KDEpLDAsMCwhMSxoKSx5PXd9fVM9ITF9Xy5wb3B1bGF0ZVBhaW50QXJyYXlzKHMpfX0sdC5wcm90b3R5cGUuYWRkQ3VycmVudFZlcnRleD1mdW5jdGlvbihlLHQscixpLGEsbixkKXt2YXIgcyx1PW4/MTowLGw9dGhpcy5hcnJheXMsbz1sLmxheW91dFZlcnRleEFycmF5LHA9bC5lbGVtZW50QXJyYXk7cz1yLmNsb25lKCksaSYmcy5fc3ViKHIucGVycCgpLl9tdWx0KGkpKSxhZGRMaW5lVmVydGV4KG8sZSxzLHUsMCxpLHQpLHRoaXMuZTM9ZC52ZXJ0ZXhMZW5ndGgrKyx0aGlzLmUxPj0wJiZ0aGlzLmUyPj0wJiYocC5lbXBsYWNlQmFjayh0aGlzLmUxLHRoaXMuZTIsdGhpcy5lMyksZC5wcmltaXRpdmVMZW5ndGgrKyksdGhpcy5lMT10aGlzLmUyLHRoaXMuZTI9dGhpcy5lMyxzPXIubXVsdCgtMSksYSYmcy5fc3ViKHIucGVycCgpLl9tdWx0KGEpKSxhZGRMaW5lVmVydGV4KG8sZSxzLHUsMSwtYSx0KSx0aGlzLmUzPWQudmVydGV4TGVuZ3RoKyssdGhpcy5lMT49MCYmdGhpcy5lMj49MCYmKHAuZW1wbGFjZUJhY2sodGhpcy5lMSx0aGlzLmUyLHRoaXMuZTMpLGQucHJpbWl0aXZlTGVuZ3RoKyspLHRoaXMuZTE9dGhpcy5lMix0aGlzLmUyPXRoaXMuZTMsdD5NQVhfTElORV9ESVNUQU5DRS8yJiYodGhpcy5kaXN0YW5jZT0wLHRoaXMuYWRkQ3VycmVudFZlcnRleChlLHRoaXMuZGlzdGFuY2UscixpLGEsbixkKSl9LHQucHJvdG90eXBlLmFkZFBpZVNsaWNlVmVydGV4PWZ1bmN0aW9uKGUsdCxyLGksYSl7dmFyIG49aT8xOjA7cj1yLm11bHQoaT8tMToxKTt2YXIgZD10aGlzLmFycmF5cyxzPWQubGF5b3V0VmVydGV4QXJyYXksdT1kLmVsZW1lbnRBcnJheTthZGRMaW5lVmVydGV4KHMsZSxyLDAsbiwwLHQpLHRoaXMuZTM9YS52ZXJ0ZXhMZW5ndGgrKyx0aGlzLmUxPj0wJiZ0aGlzLmUyPj0wJiYodS5lbXBsYWNlQmFjayh0aGlzLmUxLHRoaXMuZTIsdGhpcy5lMyksYS5wcmltaXRpdmVMZW5ndGgrKyksaT90aGlzLmUyPXRoaXMuZTM6dGhpcy5lMT10aGlzLmUzfSx0fShCdWNrZXQpO0xpbmVCdWNrZXQucHJvZ3JhbUludGVyZmFjZT1saW5lSW50ZXJmYWNlLG1vZHVsZS5leHBvcnRzPUxpbmVCdWNrZXQ7XG59LHtcIi4uL2J1Y2tldFwiOjQ1LFwiLi4vZWxlbWVudF9hcnJheV90eXBlXCI6NTMsXCIuLi9leHRlbnRcIjo1NCxcIi4uL2xvYWRfZ2VvbWV0cnlcIjo1NixcInZlY3Rvci10aWxlXCI6MzR9XSw1MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBhZGRWZXJ0ZXgoZSx0LG8sYSxpLHIsbixzLGwsYyx1LHkpe2UuZW1wbGFjZUJhY2sodCxvLE1hdGgucm91bmQoNjQqYSksTWF0aC5yb3VuZCg2NCppKSxyLzQsbi80LHBhY2tVaW50OFRvRmxvYXQoMTAqKHV8fDApLHklMjU2KSxwYWNrVWludDhUb0Zsb2F0KDEwKihsfHwwKSwxMCpNYXRoLm1pbihjfHwyNSwyNSkpLHM/c1swXTp2b2lkIDAscz9zWzFdOnZvaWQgMCxzP3NbMl06dm9pZCAwKX1mdW5jdGlvbiBhZGRDb2xsaXNpb25Cb3hWZXJ0ZXgoZSx0LG8sYSxpKXtyZXR1cm4gZS5lbXBsYWNlQmFjayh0LngsdC55LE1hdGgucm91bmQoby54KSxNYXRoLnJvdW5kKG8ueSksMTAqYSwxMCppKX1mdW5jdGlvbiBnZXRTaXplRGF0YShlLHQsbyl7dmFyIGE9e2lzRmVhdHVyZUNvbnN0YW50OnQuaXNMYXlvdXRWYWx1ZUZlYXR1cmVDb25zdGFudChvKSxpc1pvb21Db25zdGFudDp0LmlzTGF5b3V0VmFsdWVab29tQ29uc3RhbnQobyl9O2lmKGEuaXNGZWF0dXJlQ29uc3RhbnQmJihhLmxheW91dFNpemU9dC5nZXRMYXlvdXRWYWx1ZShvLHt6b29tOmUrMX0pKSwhYS5pc1pvb21Db25zdGFudCl7Zm9yKHZhciBpPXQuZ2V0TGF5b3V0VmFsdWVTdG9wWm9vbUxldmVscyhvKSxyPTA7cjxpLmxlbmd0aCYmaVtyXTw9ZTspcisrO3I9TWF0aC5tYXgoMCxyLTEpO2Zvcih2YXIgbj1yO248aS5sZW5ndGgmJmlbbl08ZSsxOyluKys7bj1NYXRoLm1pbihpLmxlbmd0aC0xLG4pLGEuY292ZXJpbmdab29tUmFuZ2U9W2lbcl0saVtuXV0sdC5pc0xheW91dFZhbHVlRmVhdHVyZUNvbnN0YW50KG8pJiYoYS5jb3ZlcmluZ1N0b3BWYWx1ZXM9W3QuZ2V0TGF5b3V0VmFsdWUobyx7em9vbTppW3JdfSksdC5nZXRMYXlvdXRWYWx1ZShvLHt6b29tOmlbbl19KV0pLGEuZnVuY3Rpb25CYXNlPXQuZ2V0TGF5b3V0UHJvcGVydHkobykuYmFzZSxcInVuZGVmaW5lZFwiPT10eXBlb2YgYS5mdW5jdGlvbkJhc2UmJihhLmZ1bmN0aW9uQmFzZT0xKSxhLmZ1bmN0aW9uVHlwZT10LmdldExheW91dFByb3BlcnR5KG8pLnR5cGV8fFwiZXhwb25lbnRpYWxcIn1yZXR1cm4gYX1mdW5jdGlvbiBnZXRTaXplQXR0cmlidXRlRGVjbGFyYXRpb25zKGUsdCl7cmV0dXJuIGUuaXNMYXlvdXRWYWx1ZVpvb21Db25zdGFudCh0KSYmIWUuaXNMYXlvdXRWYWx1ZUZlYXR1cmVDb25zdGFudCh0KT9be25hbWU6XCJhX3NpemVcIixjb21wb25lbnRzOjEsdHlwZTpcIlVpbnQxNlwifV06ZS5pc0xheW91dFZhbHVlWm9vbUNvbnN0YW50KHQpfHxlLmlzTGF5b3V0VmFsdWVGZWF0dXJlQ29uc3RhbnQodCk/W106W3tuYW1lOlwiYV9zaXplXCIsY29tcG9uZW50czozLHR5cGU6XCJVaW50MTZcIn1dfWZ1bmN0aW9uIGdldFNpemVWZXJ0ZXhEYXRhKGUsdCxvLGEsaSl7cmV0dXJuIGUuaXNMYXlvdXRWYWx1ZVpvb21Db25zdGFudChhKSYmIWUuaXNMYXlvdXRWYWx1ZUZlYXR1cmVDb25zdGFudChhKT9bMTAqZS5nZXRMYXlvdXRWYWx1ZShhLHt9LGkpXTplLmlzTGF5b3V0VmFsdWVab29tQ29uc3RhbnQoYSl8fGUuaXNMYXlvdXRWYWx1ZUZlYXR1cmVDb25zdGFudChhKT9udWxsOlsxMCplLmdldExheW91dFZhbHVlKGEse3pvb206b1swXX0saSksMTAqZS5nZXRMYXlvdXRWYWx1ZShhLHt6b29tOm9bMV19LGkpLDEwKmUuZ2V0TGF5b3V0VmFsdWUoYSx7em9vbToxK3R9LGkpXX12YXIgUG9pbnQ9X2RlcmVxXyhcInBvaW50LWdlb21ldHJ5XCIpLEFycmF5R3JvdXA9X2RlcmVxXyhcIi4uL2FycmF5X2dyb3VwXCIpLEJ1ZmZlckdyb3VwPV9kZXJlcV8oXCIuLi9idWZmZXJfZ3JvdXBcIiksY3JlYXRlRWxlbWVudEFycmF5VHlwZT1fZGVyZXFfKFwiLi4vZWxlbWVudF9hcnJheV90eXBlXCIpLEVYVEVOVD1fZGVyZXFfKFwiLi4vZXh0ZW50XCIpLHBhY2tVaW50OFRvRmxvYXQ9X2RlcmVxXyhcIi4uLy4uL3NoYWRlcnMvZW5jb2RlX2F0dHJpYnV0ZVwiKS5wYWNrVWludDhUb0Zsb2F0LEFuY2hvcj1fZGVyZXFfKFwiLi4vLi4vc3ltYm9sL2FuY2hvclwiKSxnZXRBbmNob3JzPV9kZXJlcV8oXCIuLi8uLi9zeW1ib2wvZ2V0X2FuY2hvcnNcIikscmVzb2x2ZVRva2Vucz1fZGVyZXFfKFwiLi4vLi4vdXRpbC90b2tlblwiKSxRdWFkcz1fZGVyZXFfKFwiLi4vLi4vc3ltYm9sL3F1YWRzXCIpLFNoYXBpbmc9X2RlcmVxXyhcIi4uLy4uL3N5bWJvbC9zaGFwaW5nXCIpLHRyYW5zZm9ybVRleHQ9X2RlcmVxXyhcIi4uLy4uL3N5bWJvbC90cmFuc2Zvcm1fdGV4dFwiKSxtZXJnZUxpbmVzPV9kZXJlcV8oXCIuLi8uLi9zeW1ib2wvbWVyZ2VsaW5lc1wiKSxjbGlwTGluZT1fZGVyZXFfKFwiLi4vLi4vc3ltYm9sL2NsaXBfbGluZVwiKSx1dGlsPV9kZXJlcV8oXCIuLi8uLi91dGlsL3V0aWxcIiksc2NyaXB0RGV0ZWN0aW9uPV9kZXJlcV8oXCIuLi8uLi91dGlsL3NjcmlwdF9kZXRlY3Rpb25cIiksbG9hZEdlb21ldHJ5PV9kZXJlcV8oXCIuLi9sb2FkX2dlb21ldHJ5XCIpLENvbGxpc2lvbkZlYXR1cmU9X2RlcmVxXyhcIi4uLy4uL3N5bWJvbC9jb2xsaXNpb25fZmVhdHVyZVwiKSxmaW5kUG9sZU9mSW5hY2Nlc3NpYmlsaXR5PV9kZXJlcV8oXCIuLi8uLi91dGlsL2ZpbmRfcG9sZV9vZl9pbmFjY2Vzc2liaWxpdHlcIiksY2xhc3NpZnlSaW5ncz1fZGVyZXFfKFwiLi4vLi4vdXRpbC9jbGFzc2lmeV9yaW5nc1wiKSxWZWN0b3JUaWxlRmVhdHVyZT1fZGVyZXFfKFwidmVjdG9yLXRpbGVcIikuVmVjdG9yVGlsZUZlYXR1cmUsc2hhcGVUZXh0PVNoYXBpbmcuc2hhcGVUZXh0LHNoYXBlSWNvbj1TaGFwaW5nLnNoYXBlSWNvbixXcml0aW5nTW9kZT1TaGFwaW5nLldyaXRpbmdNb2RlLGdldEdseXBoUXVhZHM9UXVhZHMuZ2V0R2x5cGhRdWFkcyxnZXRJY29uUXVhZHM9UXVhZHMuZ2V0SWNvblF1YWRzLGVsZW1lbnRBcnJheVR5cGU9Y3JlYXRlRWxlbWVudEFycmF5VHlwZSgpLGxheW91dEF0dHJpYnV0ZXM9W3tuYW1lOlwiYV9wb3Nfb2Zmc2V0XCIsY29tcG9uZW50czo0LHR5cGU6XCJJbnQxNlwifSx7bmFtZTpcImFfZGF0YVwiLGNvbXBvbmVudHM6NCx0eXBlOlwiVWludDE2XCJ9XSxzeW1ib2xJbnRlcmZhY2VzPXtnbHlwaDp7bGF5b3V0QXR0cmlidXRlczpsYXlvdXRBdHRyaWJ1dGVzLGVsZW1lbnRBcnJheVR5cGU6ZWxlbWVudEFycmF5VHlwZSxwYWludEF0dHJpYnV0ZXM6W3tuYW1lOlwiYV9maWxsX2NvbG9yXCIscHJvcGVydHk6XCJ0ZXh0LWNvbG9yXCIsdHlwZTpcIlVpbnQ4XCJ9LHtuYW1lOlwiYV9oYWxvX2NvbG9yXCIscHJvcGVydHk6XCJ0ZXh0LWhhbG8tY29sb3JcIix0eXBlOlwiVWludDhcIn0se25hbWU6XCJhX2hhbG9fd2lkdGhcIixwcm9wZXJ0eTpcInRleHQtaGFsby13aWR0aFwiLHR5cGU6XCJVaW50MTZcIixtdWx0aXBsaWVyOjEwfSx7bmFtZTpcImFfaGFsb19ibHVyXCIscHJvcGVydHk6XCJ0ZXh0LWhhbG8tYmx1clwiLHR5cGU6XCJVaW50MTZcIixtdWx0aXBsaWVyOjEwfSx7bmFtZTpcImFfb3BhY2l0eVwiLHByb3BlcnR5OlwidGV4dC1vcGFjaXR5XCIsdHlwZTpcIlVpbnQ4XCIsbXVsdGlwbGllcjoyNTV9XX0saWNvbjp7bGF5b3V0QXR0cmlidXRlczpsYXlvdXRBdHRyaWJ1dGVzLGVsZW1lbnRBcnJheVR5cGU6ZWxlbWVudEFycmF5VHlwZSxwYWludEF0dHJpYnV0ZXM6W3tuYW1lOlwiYV9maWxsX2NvbG9yXCIscHJvcGVydHk6XCJpY29uLWNvbG9yXCIsdHlwZTpcIlVpbnQ4XCJ9LHtuYW1lOlwiYV9oYWxvX2NvbG9yXCIscHJvcGVydHk6XCJpY29uLWhhbG8tY29sb3JcIix0eXBlOlwiVWludDhcIn0se25hbWU6XCJhX2hhbG9fd2lkdGhcIixwcm9wZXJ0eTpcImljb24taGFsby13aWR0aFwiLHR5cGU6XCJVaW50MTZcIixtdWx0aXBsaWVyOjEwfSx7bmFtZTpcImFfaGFsb19ibHVyXCIscHJvcGVydHk6XCJpY29uLWhhbG8tYmx1clwiLHR5cGU6XCJVaW50MTZcIixtdWx0aXBsaWVyOjEwfSx7bmFtZTpcImFfb3BhY2l0eVwiLHByb3BlcnR5OlwiaWNvbi1vcGFjaXR5XCIsdHlwZTpcIlVpbnQ4XCIsbXVsdGlwbGllcjoyNTV9XX0sY29sbGlzaW9uQm94OntsYXlvdXRBdHRyaWJ1dGVzOlt7bmFtZTpcImFfcG9zXCIsY29tcG9uZW50czoyLHR5cGU6XCJJbnQxNlwifSx7bmFtZTpcImFfZXh0cnVkZVwiLGNvbXBvbmVudHM6Mix0eXBlOlwiSW50MTZcIn0se25hbWU6XCJhX2RhdGFcIixjb21wb25lbnRzOjIsdHlwZTpcIlVpbnQ4XCJ9XSxlbGVtZW50QXJyYXlUeXBlOmNyZWF0ZUVsZW1lbnRBcnJheVR5cGUoMil9fSxTeW1ib2xCdWNrZXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLmNvbGxpc2lvbkJveEFycmF5PWUuY29sbGlzaW9uQm94QXJyYXksdGhpcy56b29tPWUuem9vbSx0aGlzLm92ZXJzY2FsaW5nPWUub3ZlcnNjYWxpbmcsdGhpcy5sYXllcnM9ZS5sYXllcnMsdGhpcy5pbmRleD1lLmluZGV4LHRoaXMuc2RmSWNvbnM9ZS5zZGZJY29ucyx0aGlzLmljb25zTmVlZExpbmVhcj1lLmljb25zTmVlZExpbmVhcix0aGlzLmZvbnRzdGFjaz1lLmZvbnRzdGFjazt2YXIgbz10aGlzLmxheWVyc1swXTtpZih0aGlzLnN5bWJvbEludGVyZmFjZXM9e2dseXBoOnV0aWwuZXh0ZW5kKHt9LHN5bWJvbEludGVyZmFjZXMuZ2x5cGgse2xheW91dEF0dHJpYnV0ZXM6W10uY29uY2F0KHN5bWJvbEludGVyZmFjZXMuZ2x5cGgubGF5b3V0QXR0cmlidXRlcyxnZXRTaXplQXR0cmlidXRlRGVjbGFyYXRpb25zKG8sXCJ0ZXh0LXNpemVcIikpfSksaWNvbjp1dGlsLmV4dGVuZCh7fSxzeW1ib2xJbnRlcmZhY2VzLmljb24se2xheW91dEF0dHJpYnV0ZXM6W10uY29uY2F0KHN5bWJvbEludGVyZmFjZXMuaWNvbi5sYXlvdXRBdHRyaWJ1dGVzLGdldFNpemVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMobyxcImljb24tc2l6ZVwiKSl9KSxjb2xsaXNpb25Cb3g6dXRpbC5leHRlbmQoe30sc3ltYm9sSW50ZXJmYWNlcy5jb2xsaXNpb25Cb3gse2xheW91dEF0dHJpYnV0ZXM6W10uY29uY2F0KHN5bWJvbEludGVyZmFjZXMuY29sbGlzaW9uQm94LmxheW91dEF0dHJpYnV0ZXMpfSl9LGUuYXJyYXlzKXt0aGlzLmJ1ZmZlcnM9e307Zm9yKHZhciBhIGluIGUuYXJyYXlzKWUuYXJyYXlzW2FdJiYodC5idWZmZXJzW2FdPW5ldyBCdWZmZXJHcm91cCh0LnN5bWJvbEludGVyZmFjZXNbYV0sZS5sYXllcnMsZS56b29tLGUuYXJyYXlzW2FdKSk7dGhpcy50ZXh0U2l6ZURhdGE9ZS50ZXh0U2l6ZURhdGEsdGhpcy5pY29uU2l6ZURhdGE9ZS5pY29uU2l6ZURhdGF9ZWxzZSB0aGlzLnRleHRTaXplRGF0YT1nZXRTaXplRGF0YSh0aGlzLnpvb20sbyxcInRleHQtc2l6ZVwiKSx0aGlzLmljb25TaXplRGF0YT1nZXRTaXplRGF0YSh0aGlzLnpvb20sbyxcImljb24tc2l6ZVwiKX07U3ltYm9sQnVja2V0LnByb3RvdHlwZS5wb3B1bGF0ZT1mdW5jdGlvbihlLHQpe3ZhciBvPXRoaXMsYT10aGlzLmxheWVyc1swXSxpPWEubGF5b3V0LHI9aVtcInRleHQtZm9udFwiXSxuPSghYS5pc0xheW91dFZhbHVlRmVhdHVyZUNvbnN0YW50KFwidGV4dC1maWVsZFwiKXx8aVtcInRleHQtZmllbGRcIl0pJiZyLHM9IWEuaXNMYXlvdXRWYWx1ZUZlYXR1cmVDb25zdGFudChcImljb24taW1hZ2VcIil8fGlbXCJpY29uLWltYWdlXCJdO2lmKHRoaXMuZmVhdHVyZXM9W10sbnx8cyl7Zm9yKHZhciBsPXQuaWNvbkRlcGVuZGVuY2llcyxjPXQuZ2x5cGhEZXBlbmRlbmNpZXMsdT1jW3JdPWNbcl18fHt9LHk9e3pvb206dGhpcy56b29tfSxwPTA7cDxlLmxlbmd0aDtwKyspe3ZhciBtPWVbcF07aWYoYS5maWx0ZXIobSkpe3ZhciBoPXZvaWQgMDtuJiYoaD1hLmdldExheW91dFZhbHVlKFwidGV4dC1maWVsZFwiLHksbS5wcm9wZXJ0aWVzKSxhLmlzTGF5b3V0VmFsdWVGZWF0dXJlQ29uc3RhbnQoXCJ0ZXh0LWZpZWxkXCIpJiYoaD1yZXNvbHZlVG9rZW5zKG0ucHJvcGVydGllcyxoKSksaD10cmFuc2Zvcm1UZXh0KGgsYSx5LG0ucHJvcGVydGllcykpO3ZhciB4PXZvaWQgMDtpZihzJiYoeD1hLmdldExheW91dFZhbHVlKFwiaWNvbi1pbWFnZVwiLHksbS5wcm9wZXJ0aWVzKSxhLmlzTGF5b3V0VmFsdWVGZWF0dXJlQ29uc3RhbnQoXCJpY29uLWltYWdlXCIpJiYoeD1yZXNvbHZlVG9rZW5zKG0ucHJvcGVydGllcyx4KSkpLChofHx4KSYmKG8uZmVhdHVyZXMucHVzaCh7dGV4dDpoLGljb246eCxpbmRleDpwLHNvdXJjZUxheWVySW5kZXg6bS5zb3VyY2VMYXllckluZGV4LGdlb21ldHJ5OmxvYWRHZW9tZXRyeShtKSxwcm9wZXJ0aWVzOm0ucHJvcGVydGllcyx0eXBlOlZlY3RvclRpbGVGZWF0dXJlLnR5cGVzW20udHlwZV19KSx4JiYobFt4XT0hMCksaCkpZm9yKHZhciBkPTA7ZDxoLmxlbmd0aDtkKyspdVtoLmNoYXJDb2RlQXQoZCldPSEwfX1cImxpbmVcIj09PWlbXCJzeW1ib2wtcGxhY2VtZW50XCJdJiYodGhpcy5mZWF0dXJlcz1tZXJnZUxpbmVzKHRoaXMuZmVhdHVyZXMpKX19LFN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFycmF5cy5pY29uLmlzRW1wdHkoKSYmdGhpcy5hcnJheXMuZ2x5cGguaXNFbXB0eSgpJiZ0aGlzLmFycmF5cy5jb2xsaXNpb25Cb3guaXNFbXB0eSgpfSxTeW1ib2xCdWNrZXQucHJvdG90eXBlLmdldFBhaW50UHJvcGVydHlTdGF0aXN0aWNzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMsdD17fSxvPTAsYT1lLmxheWVycztvPGEubGVuZ3RoO28rPTEpe3ZhciBpPWFbb107dFtpLmlkXT11dGlsLmV4dGVuZCh7fSxlLmFycmF5cy5pY29uLmxheWVyRGF0YVtpLmlkXS5wYWludFByb3BlcnR5U3RhdGlzdGljcyxlLmFycmF5cy5nbHlwaC5sYXllckRhdGFbaS5pZF0ucGFpbnRQcm9wZXJ0eVN0YXRpc3RpY3MpfXJldHVybiB0fSxTeW1ib2xCdWNrZXQucHJvdG90eXBlLnNlcmlhbGl6ZT1mdW5jdGlvbihlKXtyZXR1cm57em9vbTp0aGlzLnpvb20sbGF5ZXJJZHM6dGhpcy5sYXllcnMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlkfSksc2RmSWNvbnM6dGhpcy5zZGZJY29ucyxpY29uc05lZWRMaW5lYXI6dGhpcy5pY29uc05lZWRMaW5lYXIsdGV4dFNpemVEYXRhOnRoaXMudGV4dFNpemVEYXRhLGljb25TaXplRGF0YTp0aGlzLmljb25TaXplRGF0YSxmb250c3RhY2s6dGhpcy5mb250c3RhY2ssYXJyYXlzOnV0aWwubWFwT2JqZWN0KHRoaXMuYXJyYXlzLGZ1bmN0aW9uKHQpe3JldHVybiB0LmlzRW1wdHkoKT9udWxsOnQuc2VyaWFsaXplKGUpfSl9fSxTeW1ib2xCdWNrZXQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmJ1ZmZlcnMmJih0aGlzLmJ1ZmZlcnMuaWNvbiYmdGhpcy5idWZmZXJzLmljb24uZGVzdHJveSgpLHRoaXMuYnVmZmVycy5nbHlwaCYmdGhpcy5idWZmZXJzLmdseXBoLmRlc3Ryb3koKSx0aGlzLmJ1ZmZlcnMuY29sbGlzaW9uQm94JiZ0aGlzLmJ1ZmZlcnMuY29sbGlzaW9uQm94LmRlc3Ryb3koKSx0aGlzLmJ1ZmZlcnM9bnVsbCl9LFN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuY3JlYXRlQXJyYXlzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmFycmF5cz11dGlsLm1hcE9iamVjdCh0aGlzLnN5bWJvbEludGVyZmFjZXMsZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBBcnJheUdyb3VwKHQsZS5sYXllcnMsZS56b29tKX0pfSxTeW1ib2xCdWNrZXQucHJvdG90eXBlLnByZXBhcmU9ZnVuY3Rpb24oZSx0KXt2YXIgbz10aGlzO3RoaXMuc3ltYm9sSW5zdGFuY2VzPVtdO3ZhciBhPTUxMip0aGlzLm92ZXJzY2FsaW5nO3RoaXMudGlsZVBpeGVsUmF0aW89RVhURU5UL2EsdGhpcy5jb21wYXJlVGV4dD17fSx0aGlzLmljb25zTmVlZExpbmVhcj0hMTt2YXIgaT10aGlzLmxheWVyc1swXS5sYXlvdXQscj0uNSxuPS41O3N3aXRjaChpW1widGV4dC1hbmNob3JcIl0pe2Nhc2VcInJpZ2h0XCI6Y2FzZVwidG9wLXJpZ2h0XCI6Y2FzZVwiYm90dG9tLXJpZ2h0XCI6cj0xO2JyZWFrO2Nhc2VcImxlZnRcIjpjYXNlXCJ0b3AtbGVmdFwiOmNhc2VcImJvdHRvbS1sZWZ0XCI6cj0wfXN3aXRjaChpW1widGV4dC1hbmNob3JcIl0pe2Nhc2VcImJvdHRvbVwiOmNhc2VcImJvdHRvbS1yaWdodFwiOmNhc2VcImJvdHRvbS1sZWZ0XCI6bj0xO2JyZWFrO2Nhc2VcInRvcFwiOmNhc2VcInRvcC1yaWdodFwiOmNhc2VcInRvcC1sZWZ0XCI6bj0wfWZvcih2YXIgcz1cInJpZ2h0XCI9PT1pW1widGV4dC1qdXN0aWZ5XCJdPzE6XCJsZWZ0XCI9PT1pW1widGV4dC1qdXN0aWZ5XCJdPzA6LjUsbD0yNCxjPWlbXCJ0ZXh0LWxpbmUtaGVpZ2h0XCJdKmwsdT1cImxpbmVcIiE9PWlbXCJzeW1ib2wtcGxhY2VtZW50XCJdP2lbXCJ0ZXh0LW1heC13aWR0aFwiXSpsOjAseT1pW1widGV4dC1sZXR0ZXItc3BhY2luZ1wiXSpsLHA9dGhpcy5mb250c3RhY2s9aVtcInRleHQtZm9udFwiXS5qb2luKFwiLFwiKSxtPVwibWFwXCI9PT1pW1widGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIl0mJlwibGluZVwiPT09aVtcInN5bWJvbC1wbGFjZW1lbnRcIl0saD0wLHg9by5mZWF0dXJlcztoPHgubGVuZ3RoO2grPTEpe3ZhciBkPXhbaF0sZz12b2lkIDA7aWYoZC50ZXh0KXt2YXIgZj1zY3JpcHREZXRlY3Rpb24uYWxsb3dzVmVydGljYWxXcml0aW5nTW9kZShkLnRleHQpLGI9by5sYXllcnNbMF0uZ2V0TGF5b3V0VmFsdWUoXCJ0ZXh0LW9mZnNldFwiLHt6b29tOm8uem9vbX0sZC5wcm9wZXJ0aWVzKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUqbH0pO2c9e30sZ1tXcml0aW5nTW9kZS5ob3Jpem9udGFsXT1zaGFwZVRleHQoZC50ZXh0LGVbcF0sdSxjLHIsbixzLHksYixsLFdyaXRpbmdNb2RlLmhvcml6b250YWwpLGdbV3JpdGluZ01vZGUudmVydGljYWxdPWYmJm0mJnNoYXBlVGV4dChkLnRleHQsZVtwXSx1LGMscixuLHMseSxiLGwsV3JpdGluZ01vZGUudmVydGljYWwpfWVsc2UgZz17fTt2YXIgdj12b2lkIDA7aWYoZC5pY29uKXt2YXIgUz10W2QuaWNvbl0sST1vLmxheWVyc1swXS5nZXRMYXlvdXRWYWx1ZShcImljb24tb2Zmc2V0XCIse3pvb206by56b29tfSxkLnByb3BlcnRpZXMpO3Y9c2hhcGVJY29uKFMsSSksUyYmKHZvaWQgMD09PW8uc2RmSWNvbnM/by5zZGZJY29ucz1TLnNkZjpvLnNkZkljb25zIT09Uy5zZGYmJnV0aWwud2Fybk9uY2UoXCJTdHlsZSBzaGVldCB3YXJuaW5nOiBDYW5ub3QgbWl4IFNERiBhbmQgbm9uLVNERiBpY29ucyBpbiBvbmUgYnVmZmVyXCIpLDEhPT1TLnBpeGVsUmF0aW8/by5pY29uc05lZWRMaW5lYXI9ITA6MD09PWlbXCJpY29uLXJvdGF0ZVwiXSYmby5sYXllcnNbMF0uaXNMYXlvdXRWYWx1ZUZlYXR1cmVDb25zdGFudChcImljb24tcm90YXRlXCIpfHwoby5pY29uc05lZWRMaW5lYXI9ITApKX0oZ1tXcml0aW5nTW9kZS5ob3Jpem9udGFsXXx8dikmJm8uYWRkRmVhdHVyZShkLGcsdil9fSxTeW1ib2xCdWNrZXQucHJvdG90eXBlLmFkZEZlYXR1cmU9ZnVuY3Rpb24oZSx0LG8pe3ZhciBhPXRoaXMsaT10aGlzLmxheWVyc1swXS5nZXRMYXlvdXRWYWx1ZShcInRleHQtc2l6ZVwiLHt6b29tOnRoaXMuem9vbSsxfSxlLnByb3BlcnRpZXMpLHI9dGhpcy5sYXllcnNbMF0uZ2V0TGF5b3V0VmFsdWUoXCJpY29uLXNpemVcIix7em9vbTp0aGlzLnpvb20rMX0sZS5wcm9wZXJ0aWVzKSxuPXRoaXMubGF5ZXJzWzBdLmdldExheW91dFZhbHVlKFwidGV4dC1zaXplXCIse3pvb206MTh9LGUucHJvcGVydGllcyk7dm9pZCAwPT09biYmKG49aSk7dmFyIHM9dGhpcy5sYXllcnNbMF0ubGF5b3V0LGw9MjQsYz1pL2wsdT10aGlzLnRpbGVQaXhlbFJhdGlvKmMseT10aGlzLnRpbGVQaXhlbFJhdGlvKm4vbCxwPXRoaXMudGlsZVBpeGVsUmF0aW8qcixtPXRoaXMudGlsZVBpeGVsUmF0aW8qc1tcInN5bWJvbC1zcGFjaW5nXCJdLGg9c1tcInN5bWJvbC1hdm9pZC1lZGdlc1wiXSx4PXNbXCJ0ZXh0LXBhZGRpbmdcIl0qdGhpcy50aWxlUGl4ZWxSYXRpbyxkPXNbXCJpY29uLXBhZGRpbmdcIl0qdGhpcy50aWxlUGl4ZWxSYXRpbyxnPXNbXCJ0ZXh0LW1heC1hbmdsZVwiXS8xODAqTWF0aC5QSSxmPVwibWFwXCI9PT1zW1widGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIl0mJlwibGluZVwiPT09c1tcInN5bWJvbC1wbGFjZW1lbnRcIl0sYj1cIm1hcFwiPT09c1tcImljb24tcm90YXRpb24tYWxpZ25tZW50XCJdJiZcImxpbmVcIj09PXNbXCJzeW1ib2wtcGxhY2VtZW50XCJdLHY9c1tcInRleHQtYWxsb3ctb3ZlcmxhcFwiXXx8c1tcImljb24tYWxsb3ctb3ZlcmxhcFwiXXx8c1tcInRleHQtaWdub3JlLXBsYWNlbWVudFwiXXx8c1tcImljb24taWdub3JlLXBsYWNlbWVudFwiXSxTPXNbXCJzeW1ib2wtcGxhY2VtZW50XCJdLEk9bS8yLHo9ZnVuY3Rpb24oaSxyKXt2YXIgbj0hKHIueDwwfHxyLng+RVhURU5UfHxyLnk8MHx8ci55PkVYVEVOVCk7aWYoIWh8fG4pe3ZhciBzPW58fHY7YS5hZGRTeW1ib2xJbnN0YW5jZShyLGksdCxvLGEubGF5ZXJzWzBdLHMsYS5jb2xsaXNpb25Cb3hBcnJheSxlLmluZGV4LGUuc291cmNlTGF5ZXJJbmRleCxhLmluZGV4LHUseCxmLHAsZCxiLHt6b29tOmEuem9vbX0sZS5wcm9wZXJ0aWVzKX19O2lmKFwibGluZVwiPT09Uylmb3IodmFyIEI9MCxNPWNsaXBMaW5lKGUuZ2VvbWV0cnksMCwwLEVYVEVOVCxFWFRFTlQpO0I8TS5sZW5ndGg7Qis9MSlmb3IodmFyIEw9TVtCXSxBPWdldEFuY2hvcnMoTCxtLGcsdFtXcml0aW5nTW9kZS52ZXJ0aWNhbF18fHRbV3JpdGluZ01vZGUuaG9yaXpvbnRhbF0sbyxsLHksYS5vdmVyc2NhbGluZyxFWFRFTlQpLFQ9MCxWPUE7VDxWLmxlbmd0aDtUKz0xKXt2YXIgXz1WW1RdLGs9dFtXcml0aW5nTW9kZS5ob3Jpem9udGFsXTtrJiZhLmFuY2hvcklzVG9vQ2xvc2Uoay50ZXh0LEksXyl8fHooTCxfKX1lbHNlIGlmKFwiUG9seWdvblwiPT09ZS50eXBlKWZvcih2YXIgQz0wLEU9Y2xhc3NpZnlSaW5ncyhlLmdlb21ldHJ5LDApO0M8RS5sZW5ndGg7Qys9MSl7dmFyIFA9RVtDXSxGPWZpbmRQb2xlT2ZJbmFjY2Vzc2liaWxpdHkoUCwxNik7eihQWzBdLG5ldyBBbmNob3IoRi54LEYueSwwKSl9ZWxzZSBpZihcIkxpbmVTdHJpbmdcIj09PWUudHlwZSlmb3IodmFyIHc9MCxEPWUuZ2VvbWV0cnk7dzxELmxlbmd0aDt3Kz0xKXt2YXIgTj1EW3ddO3ooTixuZXcgQW5jaG9yKE5bMF0ueCxOWzBdLnksMCkpfWVsc2UgaWYoXCJQb2ludFwiPT09ZS50eXBlKWZvcih2YXIgcT0wLFU9ZS5nZW9tZXRyeTtxPFUubGVuZ3RoO3ErPTEpZm9yKHZhciBXPVVbcV0sUT0wLFI9VztRPFIubGVuZ3RoO1ErPTEpe3ZhciBaPVJbUV07eihbWl0sbmV3IEFuY2hvcihaLngsWi55LDApKX19LFN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuYW5jaG9ySXNUb29DbG9zZT1mdW5jdGlvbihlLHQsbyl7dmFyIGE9dGhpcy5jb21wYXJlVGV4dDtpZihlIGluIGEpe2Zvcih2YXIgaT1hW2VdLHI9aS5sZW5ndGgtMTtyPj0wO3ItLSlpZihvLmRpc3QoaVtyXSk8dClyZXR1cm4hMH1lbHNlIGFbZV09W107cmV0dXJuIGFbZV0ucHVzaChvKSwhMX0sU3ltYm9sQnVja2V0LnByb3RvdHlwZS5wbGFjZT1mdW5jdGlvbihlLHQpe3ZhciBvPXRoaXM7dGhpcy5jcmVhdGVBcnJheXMoKTt2YXIgYT10aGlzLmxheWVyc1swXSxpPWEubGF5b3V0LHI9ZS5tYXhTY2FsZSxuPVwibWFwXCI9PT1pW1widGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIl0mJlwibGluZVwiPT09aVtcInN5bWJvbC1wbGFjZW1lbnRcIl0scz1cIm1hcFwiPT09aVtcImljb24tcm90YXRpb24tYWxpZ25tZW50XCJdJiZcImxpbmVcIj09PWlbXCJzeW1ib2wtcGxhY2VtZW50XCJdLGw9aVtcInRleHQtYWxsb3ctb3ZlcmxhcFwiXXx8aVtcImljb24tYWxsb3ctb3ZlcmxhcFwiXXx8aVtcInRleHQtaWdub3JlLXBsYWNlbWVudFwiXXx8aVtcImljb24taWdub3JlLXBsYWNlbWVudFwiXTtpZihsKXt2YXIgYz1lLmFuZ2xlLHU9TWF0aC5zaW4oYykseT1NYXRoLmNvcyhjKTt0aGlzLnN5bWJvbEluc3RhbmNlcy5zb3J0KGZ1bmN0aW9uKGUsdCl7dmFyIG89dSplLmFuY2hvci54K3kqZS5hbmNob3IueXwwLGE9dSp0LmFuY2hvci54K3kqdC5hbmNob3IueXwwO3JldHVybiBvLWF8fHQuZmVhdHVyZUluZGV4LWUuZmVhdHVyZUluZGV4fSl9Zm9yKHZhciBwPTAsbT1vLnN5bWJvbEluc3RhbmNlcztwPG0ubGVuZ3RoO3ArPTEpe3ZhciBoPW1bcF0seD17Ym94U3RhcnRJbmRleDpoLnRleHRCb3hTdGFydEluZGV4LGJveEVuZEluZGV4OmgudGV4dEJveEVuZEluZGV4fSxkPXtib3hTdGFydEluZGV4OmguaWNvbkJveFN0YXJ0SW5kZXgsYm94RW5kSW5kZXg6aC5pY29uQm94RW5kSW5kZXh9LGc9IShoLnRleHRCb3hTdGFydEluZGV4PT09aC50ZXh0Qm94RW5kSW5kZXgpLGY9IShoLmljb25Cb3hTdGFydEluZGV4PT09aC5pY29uQm94RW5kSW5kZXgpLGI9aVtcInRleHQtb3B0aW9uYWxcIl18fCFnLHY9aVtcImljb24tb3B0aW9uYWxcIl18fCFmLFM9Zz9lLnBsYWNlQ29sbGlzaW9uRmVhdHVyZSh4LGlbXCJ0ZXh0LWFsbG93LW92ZXJsYXBcIl0saVtcInN5bWJvbC1hdm9pZC1lZGdlc1wiXSk6ZS5taW5TY2FsZSxJPWY/ZS5wbGFjZUNvbGxpc2lvbkZlYXR1cmUoZCxpW1wiaWNvbi1hbGxvdy1vdmVybGFwXCJdLGlbXCJzeW1ib2wtYXZvaWQtZWRnZXNcIl0pOmUubWluU2NhbGU7aWYoYnx8dj8hdiYmUz9TPU1hdGgubWF4KEksUyk6IWImJkkmJihJPU1hdGgubWF4KEksUykpOkk9Uz1NYXRoLm1heChJLFMpLGcmJihlLmluc2VydENvbGxpc2lvbkZlYXR1cmUoeCxTLGlbXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIl0pLFM8PXIpKXt2YXIgej1nZXRTaXplVmVydGV4RGF0YShhLG8uem9vbSxvLnRleHRTaXplRGF0YS5jb3ZlcmluZ1pvb21SYW5nZSxcInRleHQtc2l6ZVwiLGguZmVhdHVyZVByb3BlcnRpZXMpO28uYWRkU3ltYm9scyhvLmFycmF5cy5nbHlwaCxoLmdseXBoUXVhZHMsUyx6LGlbXCJ0ZXh0LWtlZXAtdXByaWdodFwiXSxuLGUuYW5nbGUsaC5mZWF0dXJlUHJvcGVydGllcyxoLndyaXRpbmdNb2Rlcyl9aWYoZiYmKGUuaW5zZXJ0Q29sbGlzaW9uRmVhdHVyZShkLEksaVtcImljb24taWdub3JlLXBsYWNlbWVudFwiXSksSTw9cikpe3ZhciBCPWdldFNpemVWZXJ0ZXhEYXRhKGEsby56b29tLG8uaWNvblNpemVEYXRhLmNvdmVyaW5nWm9vbVJhbmdlLFwiaWNvbi1zaXplXCIsaC5mZWF0dXJlUHJvcGVydGllcyk7by5hZGRTeW1ib2xzKG8uYXJyYXlzLmljb24saC5pY29uUXVhZHMsSSxCLGlbXCJpY29uLWtlZXAtdXByaWdodFwiXSxzLGUuYW5nbGUsaC5mZWF0dXJlUHJvcGVydGllcyl9fXQmJnRoaXMuYWRkVG9EZWJ1Z0J1ZmZlcnMoZSl9LFN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuYWRkU3ltYm9scz1mdW5jdGlvbihlLHQsbyxhLGkscixuLHMsbCl7Zm9yKHZhciBjPWUuZWxlbWVudEFycmF5LHU9ZS5sYXlvdXRWZXJ0ZXhBcnJheSx5PXRoaXMuem9vbSxwPU1hdGgubWF4KE1hdGgubG9nKG8pL01hdGguTE4yK3ksMCksbT0wLGg9dDttPGgubGVuZ3RoO20rPTEpe3ZhciB4PWhbbV0sZD0oeC5hbmNob3JBbmdsZStuK01hdGguUEkpJSgyKk1hdGguUEkpO2lmKGwmV3JpdGluZ01vZGUudmVydGljYWwpe2lmKHImJngud3JpdGluZ01vZGU9PT1Xcml0aW5nTW9kZS52ZXJ0aWNhbCl7aWYoaSYmciYmZDw9NSpNYXRoLlBJLzR8fGQ+NypNYXRoLlBJLzQpY29udGludWV9ZWxzZSBpZihpJiZyJiZkPD0zKk1hdGguUEkvNHx8ZD41Kk1hdGguUEkvNCljb250aW51ZX1lbHNlIGlmKGkmJnImJihkPD1NYXRoLlBJLzJ8fGQ+MypNYXRoLlBJLzIpKWNvbnRpbnVlO3ZhciBnPXgudGwsZj14LnRyLGI9eC5ibCx2PXguYnIsUz14LnRleCxJPXguYW5jaG9yUG9pbnQsej1NYXRoLm1heCh5K01hdGgubG9nKHgubWluU2NhbGUpL01hdGguTE4yLHApLEI9TWF0aC5taW4oeStNYXRoLmxvZyh4Lm1heFNjYWxlKS9NYXRoLkxOMiwyNSk7aWYoIShCPD16KSl7ej09PXAmJih6PTApO3ZhciBNPU1hdGgucm91bmQoeC5nbHlwaEFuZ2xlLygyKk1hdGguUEkpKjI1NiksTD1lLnByZXBhcmVTZWdtZW50KDQpLEE9TC52ZXJ0ZXhMZW5ndGg7YWRkVmVydGV4KHUsSS54LEkueSxnLngsZy55LFMueCxTLnksYSx6LEIscCxNKSxhZGRWZXJ0ZXgodSxJLngsSS55LGYueCxmLnksUy54K1MudyxTLnksYSx6LEIscCxNKSxhZGRWZXJ0ZXgodSxJLngsSS55LGIueCxiLnksUy54LFMueStTLmgsYSx6LEIscCxNKSxhZGRWZXJ0ZXgodSxJLngsSS55LHYueCx2LnksUy54K1MudyxTLnkrUy5oLGEseixCLHAsTSksYy5lbXBsYWNlQmFjayhBLEErMSxBKzIpLGMuZW1wbGFjZUJhY2soQSsxLEErMixBKzMpLEwudmVydGV4TGVuZ3RoKz00LEwucHJpbWl0aXZlTGVuZ3RoKz0yfX1lLnBvcHVsYXRlUGFpbnRBcnJheXMocyl9LFN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuYWRkVG9EZWJ1Z0J1ZmZlcnM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMsbz10aGlzLmFycmF5cy5jb2xsaXNpb25Cb3gsYT1vLmxheW91dFZlcnRleEFycmF5LGk9by5lbGVtZW50QXJyYXkscj0tZS5hbmdsZSxuPWUueVN0cmV0Y2gscz0wLGw9dC5zeW1ib2xJbnN0YW5jZXM7czxsLmxlbmd0aDtzKz0xKXt2YXIgYz1sW3NdO2MudGV4dENvbGxpc2lvbkZlYXR1cmU9e2JveFN0YXJ0SW5kZXg6Yy50ZXh0Qm94U3RhcnRJbmRleCxib3hFbmRJbmRleDpjLnRleHRCb3hFbmRJbmRleH0sYy5pY29uQ29sbGlzaW9uRmVhdHVyZT17Ym94U3RhcnRJbmRleDpjLmljb25Cb3hTdGFydEluZGV4LGJveEVuZEluZGV4OmMuaWNvbkJveEVuZEluZGV4fTtmb3IodmFyIHU9MDt1PDI7dSsrKXt2YXIgeT1jWzA9PT11P1widGV4dENvbGxpc2lvbkZlYXR1cmVcIjpcImljb25Db2xsaXNpb25GZWF0dXJlXCJdO2lmKHkpZm9yKHZhciBwPXkuYm94U3RhcnRJbmRleDtwPHkuYm94RW5kSW5kZXg7cCsrKXt2YXIgbT10LmNvbGxpc2lvbkJveEFycmF5LmdldChwKSxoPW0uYW5jaG9yUG9pbnQseD1uZXcgUG9pbnQobS54MSxtLnkxKm4pLl9yb3RhdGUociksZD1uZXcgUG9pbnQobS54MixtLnkxKm4pLl9yb3RhdGUociksZz1uZXcgUG9pbnQobS54MSxtLnkyKm4pLl9yb3RhdGUociksZj1uZXcgUG9pbnQobS54MixtLnkyKm4pLl9yb3RhdGUociksYj1NYXRoLm1heCgwLE1hdGgubWluKDI1LHQuem9vbStNYXRoLmxvZyhtLm1heFNjYWxlKS9NYXRoLkxOMikpLHY9TWF0aC5tYXgoMCxNYXRoLm1pbigyNSx0Lnpvb20rTWF0aC5sb2cobS5wbGFjZW1lbnRTY2FsZSkvTWF0aC5MTjIpKSxTPW8ucHJlcGFyZVNlZ21lbnQoNCksST1TLnZlcnRleExlbmd0aDthZGRDb2xsaXNpb25Cb3hWZXJ0ZXgoYSxoLHgsYix2KSxhZGRDb2xsaXNpb25Cb3hWZXJ0ZXgoYSxoLGQsYix2KSxhZGRDb2xsaXNpb25Cb3hWZXJ0ZXgoYSxoLGYsYix2KSxhZGRDb2xsaXNpb25Cb3hWZXJ0ZXgoYSxoLGcsYix2KSxpLmVtcGxhY2VCYWNrKEksSSsxKSxpLmVtcGxhY2VCYWNrKEkrMSxJKzIpLGkuZW1wbGFjZUJhY2soSSsyLEkrMyksaS5lbXBsYWNlQmFjayhJKzMsSSksUy52ZXJ0ZXhMZW5ndGgrPTQsUy5wcmltaXRpdmVMZW5ndGgrPTR9fX19LFN5bWJvbEJ1Y2tldC5wcm90b3R5cGUuYWRkU3ltYm9sSW5zdGFuY2U9ZnVuY3Rpb24oZSx0LG8sYSxpLHIsbixzLGwsYyx1LHkscCxtLGgseCxkLGcpe3ZhciBmLGIsdj1bXSxTPVtdO2Zvcih2YXIgSSBpbiBvKXt2YXIgej1wYXJzZUludChJLDEwKTtvW3pdJiYoUz1TLmNvbmNhdChyP2dldEdseXBoUXVhZHMoZSxvW3pdLHUsdCxpLHAsZCxnKTpbXSksZj1uZXcgQ29sbGlzaW9uRmVhdHVyZShuLHQsZSxzLGwsYyxvW3pdLHUseSxwLCExKSl9dmFyIEI9Zj9mLmJveFN0YXJ0SW5kZXg6dGhpcy5jb2xsaXNpb25Cb3hBcnJheS5sZW5ndGgsTT1mP2YuYm94RW5kSW5kZXg6dGhpcy5jb2xsaXNpb25Cb3hBcnJheS5sZW5ndGg7YSYmKHY9cj9nZXRJY29uUXVhZHMoZSxhLG0sdCxpLHgsb1tXcml0aW5nTW9kZS5ob3Jpem9udGFsXSxkLGcpOltdLGI9bmV3IENvbGxpc2lvbkZlYXR1cmUobix0LGUscyxsLGMsYSxtLGgseCwhMCkpO3ZhciBMPWI/Yi5ib3hTdGFydEluZGV4OnRoaXMuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoLEE9Yj9iLmJveEVuZEluZGV4OnRoaXMuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoO00+U3ltYm9sQnVja2V0Lk1BWF9JTlNUQU5DRVMmJnV0aWwud2Fybk9uY2UoXCJUb28gbWFueSBzeW1ib2xzIGJlaW5nIHJlbmRlcmVkIGluIGEgdGlsZS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8yOTA3XCIpLEE+U3ltYm9sQnVja2V0Lk1BWF9JTlNUQU5DRVMmJnV0aWwud2Fybk9uY2UoXCJUb28gbWFueSBnbHlwaHMgYmVpbmcgcmVuZGVyZWQgaW4gYSB0aWxlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzI5MDdcIik7dmFyIFQ9KG9bV3JpdGluZ01vZGUudmVydGljYWxdP1dyaXRpbmdNb2RlLnZlcnRpY2FsOjApfChvW1dyaXRpbmdNb2RlLmhvcml6b250YWxdP1dyaXRpbmdNb2RlLmhvcml6b250YWw6MCk7dGhpcy5zeW1ib2xJbnN0YW5jZXMucHVzaCh7dGV4dEJveFN0YXJ0SW5kZXg6Qix0ZXh0Qm94RW5kSW5kZXg6TSxpY29uQm94U3RhcnRJbmRleDpMLGljb25Cb3hFbmRJbmRleDpBLGdseXBoUXVhZHM6UyxpY29uUXVhZHM6dixhbmNob3I6ZSxmZWF0dXJlSW5kZXg6cyxmZWF0dXJlUHJvcGVydGllczpnLHdyaXRpbmdNb2RlczpUfSl9LFN5bWJvbEJ1Y2tldC5wcm9ncmFtSW50ZXJmYWNlcz1zeW1ib2xJbnRlcmZhY2VzLFN5bWJvbEJ1Y2tldC5NQVhfSU5TVEFOQ0VTPTY1NTM1LG1vZHVsZS5leHBvcnRzPVN5bWJvbEJ1Y2tldDtcbn0se1wiLi4vLi4vc2hhZGVycy9lbmNvZGVfYXR0cmlidXRlXCI6ODEsXCIuLi8uLi9zeW1ib2wvYW5jaG9yXCI6MTYwLFwiLi4vLi4vc3ltYm9sL2NsaXBfbGluZVwiOjE2MixcIi4uLy4uL3N5bWJvbC9jb2xsaXNpb25fZmVhdHVyZVwiOjE2NCxcIi4uLy4uL3N5bWJvbC9nZXRfYW5jaG9yc1wiOjE2NixcIi4uLy4uL3N5bWJvbC9tZXJnZWxpbmVzXCI6MTY5LFwiLi4vLi4vc3ltYm9sL3F1YWRzXCI6MTcwLFwiLi4vLi4vc3ltYm9sL3NoYXBpbmdcIjoxNzEsXCIuLi8uLi9zeW1ib2wvdHJhbnNmb3JtX3RleHRcIjoxNzMsXCIuLi8uLi91dGlsL2NsYXNzaWZ5X3JpbmdzXCI6MTk4LFwiLi4vLi4vdXRpbC9maW5kX3BvbGVfb2ZfaW5hY2Nlc3NpYmlsaXR5XCI6MjA0LFwiLi4vLi4vdXRpbC9zY3JpcHRfZGV0ZWN0aW9uXCI6MjExLFwiLi4vLi4vdXRpbC90b2tlblwiOjIxNCxcIi4uLy4uL3V0aWwvdXRpbFwiOjIxNSxcIi4uL2FycmF5X2dyb3VwXCI6NDQsXCIuLi9idWZmZXJfZ3JvdXBcIjo1MixcIi4uL2VsZW1lbnRfYXJyYXlfdHlwZVwiOjUzLFwiLi4vZXh0ZW50XCI6NTQsXCIuLi9sb2FkX2dlb21ldHJ5XCI6NTYsXCJwb2ludC1nZW9tZXRyeVwiOjI2LFwidmVjdG9yLXRpbGVcIjozNH1dLDUxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBBdHRyaWJ1dGVUeXBlPXtJbnQ4OlwiQllURVwiLFVpbnQ4OlwiVU5TSUdORURfQllURVwiLEludDE2OlwiU0hPUlRcIixVaW50MTY6XCJVTlNJR05FRF9TSE9SVFwifSxCdWZmZXI9ZnVuY3Rpb24odCxlLHIpe3RoaXMuYXJyYXlCdWZmZXI9dC5hcnJheUJ1ZmZlcix0aGlzLmxlbmd0aD10Lmxlbmd0aCx0aGlzLmF0dHJpYnV0ZXM9ZS5tZW1iZXJzLHRoaXMuaXRlbVNpemU9ZS5ieXRlc1BlckVsZW1lbnQsdGhpcy50eXBlPXIsdGhpcy5hcnJheVR5cGU9ZX07QnVmZmVyLmZyb21TdHJ1Y3RBcnJheT1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgQnVmZmVyKHQuc2VyaWFsaXplKCksdC5jb25zdHJ1Y3Rvci5zZXJpYWxpemUoKSxlKX0sQnVmZmVyLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXRbdGhpcy50eXBlXTt0aGlzLmJ1ZmZlcj90LmJpbmRCdWZmZXIoZSx0aGlzLmJ1ZmZlcik6KHRoaXMuZ2w9dCx0aGlzLmJ1ZmZlcj10LmNyZWF0ZUJ1ZmZlcigpLHQuYmluZEJ1ZmZlcihlLHRoaXMuYnVmZmVyKSx0LmJ1ZmZlckRhdGEoZSx0aGlzLmFycmF5QnVmZmVyLHQuU1RBVElDX0RSQVcpLHRoaXMuYXJyYXlCdWZmZXI9bnVsbCl9LEJ1ZmZlci5wcm90b3R5cGUuZW5hYmxlQXR0cmlidXRlcz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10aGlzLGY9MDtmPHRoaXMuYXR0cmlidXRlcy5sZW5ndGg7ZisrKXt2YXIgaT1yLmF0dHJpYnV0ZXNbZl0sdT1lW2kubmFtZV07dm9pZCAwIT09dSYmdC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh1KX19LEJ1ZmZlci5wcm90b3R5cGUuc2V0VmVydGV4QXR0cmliUG9pbnRlcnM9ZnVuY3Rpb24odCxlLHIpe2Zvcih2YXIgZj10aGlzLGk9MDtpPHRoaXMuYXR0cmlidXRlcy5sZW5ndGg7aSsrKXt2YXIgdT1mLmF0dHJpYnV0ZXNbaV0scz1lW3UubmFtZV07dm9pZCAwIT09cyYmdC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHMsdS5jb21wb25lbnRzLHRbQXR0cmlidXRlVHlwZVt1LnR5cGVdXSwhMSxmLmFycmF5VHlwZS5ieXRlc1BlckVsZW1lbnQsdS5vZmZzZXQrKGYuYXJyYXlUeXBlLmJ5dGVzUGVyRWxlbWVudCpyfHwwKSl9fSxCdWZmZXIucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmJ1ZmZlciYmdGhpcy5nbC5kZWxldGVCdWZmZXIodGhpcy5idWZmZXIpfSxCdWZmZXIuQnVmZmVyVHlwZT17VkVSVEVYOlwiQVJSQVlfQlVGRkVSXCIsRUxFTUVOVDpcIkVMRU1FTlRfQVJSQVlfQlVGRkVSXCJ9LG1vZHVsZS5leHBvcnRzPUJ1ZmZlcjtcbn0se31dLDUyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciB1dGlsPV9kZXJlcV8oXCIuLi91dGlsL3V0aWxcIiksQnVmZmVyPV9kZXJlcV8oXCIuL2J1ZmZlclwiKSxQcm9ncmFtQ29uZmlndXJhdGlvbj1fZGVyZXFfKFwiLi9wcm9ncmFtX2NvbmZpZ3VyYXRpb25cIiksY3JlYXRlVmVydGV4QXJyYXlUeXBlPV9kZXJlcV8oXCIuL3ZlcnRleF9hcnJheV90eXBlXCIpLFZlcnRleEFycmF5T2JqZWN0PV9kZXJlcV8oXCIuLi9yZW5kZXIvdmVydGV4X2FycmF5X29iamVjdFwiKSxCdWZmZXJHcm91cD1mdW5jdGlvbihlLHIsdCxhKXt2YXIgZj10aGlzLHU9Y3JlYXRlVmVydGV4QXJyYXlUeXBlKGUubGF5b3V0QXR0cmlidXRlcyk7dGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXI9bmV3IEJ1ZmZlcihhLmxheW91dFZlcnRleEFycmF5LHUuc2VyaWFsaXplKCksQnVmZmVyLkJ1ZmZlclR5cGUuVkVSVEVYKSxhLmVsZW1lbnRBcnJheSYmKHRoaXMuZWxlbWVudEJ1ZmZlcj1uZXcgQnVmZmVyKGEuZWxlbWVudEFycmF5LGUuZWxlbWVudEFycmF5VHlwZS5zZXJpYWxpemUoKSxCdWZmZXIuQnVmZmVyVHlwZS5FTEVNRU5UKSksYS5lbGVtZW50QXJyYXkyJiYodGhpcy5lbGVtZW50QnVmZmVyMj1uZXcgQnVmZmVyKGEuZWxlbWVudEFycmF5MixlLmVsZW1lbnRBcnJheVR5cGUyLnNlcmlhbGl6ZSgpLEJ1ZmZlci5CdWZmZXJUeXBlLkVMRU1FTlQpKSx0aGlzLmxheWVyRGF0YT17fTtmb3IodmFyIG49MCxpPXI7bjxpLmxlbmd0aDtuKz0xKXt2YXIgcz1pW25dLG89YS5wYWludFZlcnRleEFycmF5cyYmYS5wYWludFZlcnRleEFycmF5c1tzLmlkXSx5PVByb2dyYW1Db25maWd1cmF0aW9uLmNyZWF0ZUR5bmFtaWMoZS5wYWludEF0dHJpYnV0ZXN8fFtdLHMsdCksbD1vP25ldyBCdWZmZXIoby5hcnJheSxvLnR5cGUsQnVmZmVyLkJ1ZmZlclR5cGUuVkVSVEVYKTpudWxsO2YubGF5ZXJEYXRhW3MuaWRdPXtwcm9ncmFtQ29uZmlndXJhdGlvbjp5LHBhaW50VmVydGV4QnVmZmVyOmx9fXRoaXMuc2VnbWVudHM9YS5zZWdtZW50cyx0aGlzLnNlZ21lbnRzMj1hLnNlZ21lbnRzMjtmb3IodmFyIG09MCxCPVtmLnNlZ21lbnRzLGYuc2VnbWVudHMyXTttPEIubGVuZ3RoO20rPTEpZm9yKHZhciBwPUJbbV0sZz0wLHY9cHx8W107Zzx2Lmxlbmd0aDtnKz0xKXt2YXIgaD12W2ddO2gudmFvcz11dGlsLm1hcE9iamVjdChmLmxheWVyRGF0YSxmdW5jdGlvbigpe3JldHVybiBuZXcgVmVydGV4QXJyYXlPYmplY3R9KX19O0J1ZmZlckdyb3VwLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmxheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCksdGhpcy5lbGVtZW50QnVmZmVyJiZ0aGlzLmVsZW1lbnRCdWZmZXIuZGVzdHJveSgpLHRoaXMuZWxlbWVudEJ1ZmZlcjImJnRoaXMuZWxlbWVudEJ1ZmZlcjIuZGVzdHJveSgpO2Zvcih2YXIgciBpbiBlLmxheWVyRGF0YSl7dmFyIHQ9ZS5sYXllckRhdGFbcl0ucGFpbnRWZXJ0ZXhCdWZmZXI7dCYmdC5kZXN0cm95KCl9Zm9yKHZhciBhPTAsZj1bZS5zZWdtZW50cyxlLnNlZ21lbnRzMl07YTxmLmxlbmd0aDthKz0xKWZvcih2YXIgdT1mW2FdLG49MCxpPXV8fFtdO248aS5sZW5ndGg7bis9MSl7dmFyIHM9aVtuXTtmb3IodmFyIG8gaW4gcy52YW9zKXMudmFvc1tvXS5kZXN0cm95KCl9fSxtb2R1bGUuZXhwb3J0cz1CdWZmZXJHcm91cDtcbn0se1wiLi4vcmVuZGVyL3ZlcnRleF9hcnJheV9vYmplY3RcIjo4MCxcIi4uL3V0aWwvdXRpbFwiOjIxNSxcIi4vYnVmZmVyXCI6NTEsXCIuL3Byb2dyYW1fY29uZmlndXJhdGlvblwiOjU4LFwiLi92ZXJ0ZXhfYXJyYXlfdHlwZVwiOjYwfV0sNTM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gY3JlYXRlRWxlbWVudEFycmF5VHlwZShlKXtyZXR1cm4gY3JlYXRlU3RydWN0QXJyYXlUeXBlKHttZW1iZXJzOlt7dHlwZTpcIlVpbnQxNlwiLG5hbWU6XCJ2ZXJ0aWNlc1wiLGNvbXBvbmVudHM6ZXx8M31dfSl9dmFyIGNyZWF0ZVN0cnVjdEFycmF5VHlwZT1fZGVyZXFfKFwiLi4vdXRpbC9zdHJ1Y3RfYXJyYXlcIik7bW9kdWxlLmV4cG9ydHM9Y3JlYXRlRWxlbWVudEFycmF5VHlwZTtcbn0se1wiLi4vdXRpbC9zdHJ1Y3RfYXJyYXlcIjoyMTN9XSw1NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjttb2R1bGUuZXhwb3J0cz04MTkyO1xufSx7fV0sNTU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdHJhbnNsYXRlRGlzdGFuY2UoZSl7cmV0dXJuIE1hdGguc3FydChlWzBdKmVbMF0rZVsxXSplWzFdKX1mdW5jdGlvbiB0b3BEb3duRmVhdHVyZUNvbXBhcmF0b3IoZSx0KXtyZXR1cm4gdC1lfWZ1bmN0aW9uIGdldExpbmVXaWR0aChlLHQpe3JldHVybiB0PjA/dCsyKmU6ZX1mdW5jdGlvbiB0cmFuc2xhdGUoZSx0LHIsaSxhKXtpZighdFswXSYmIXRbMV0pcmV0dXJuIGU7dD1Qb2ludC5jb252ZXJ0KHQpLFwidmlld3BvcnRcIj09PXImJnQuX3JvdGF0ZSgtaSk7Zm9yKHZhciBuPVtdLHM9MDtzPGUubGVuZ3RoO3MrKyl7Zm9yKHZhciBvPWVbc10sbD1bXSx1PTA7dTxvLmxlbmd0aDt1KyspbC5wdXNoKG9bdV0uc3ViKHQuX211bHQoYSkpKTtuLnB1c2gobCl9cmV0dXJuIG59ZnVuY3Rpb24gb2Zmc2V0TGluZShlLHQpe2Zvcih2YXIgcj1bXSxpPW5ldyBQb2ludCgwLDApLGE9MDthPGUubGVuZ3RoO2ErKyl7Zm9yKHZhciBuPWVbYV0scz1bXSxvPTA7bzxuLmxlbmd0aDtvKyspe3ZhciBsPW5bby0xXSx1PW5bb10sYz1uW28rMV0seT0wPT09bz9pOnUuc3ViKGwpLl91bml0KCkuX3BlcnAoKSxmPW89PT1uLmxlbmd0aC0xP2k6Yy5zdWIodSkuX3VuaXQoKS5fcGVycCgpLGg9eS5fYWRkKGYpLl91bml0KCksZD1oLngqZi54K2gueSpmLnk7aC5fbXVsdCgxL2QpLHMucHVzaChoLl9tdWx0KHQpLl9hZGQodSkpfXIucHVzaChzKX1yZXR1cm4gcn12YXIgUG9pbnQ9X2RlcmVxXyhcInBvaW50LWdlb21ldHJ5XCIpLGxvYWRHZW9tZXRyeT1fZGVyZXFfKFwiLi9sb2FkX2dlb21ldHJ5XCIpLEVYVEVOVD1fZGVyZXFfKFwiLi9leHRlbnRcIiksZmVhdHVyZUZpbHRlcj1fZGVyZXFfKFwiLi4vc3R5bGUtc3BlYy9mZWF0dXJlX2ZpbHRlclwiKSxjcmVhdGVTdHJ1Y3RBcnJheVR5cGU9X2RlcmVxXyhcIi4uL3V0aWwvc3RydWN0X2FycmF5XCIpLEdyaWQ9X2RlcmVxXyhcImdyaWQtaW5kZXhcIiksRGljdGlvbmFyeUNvZGVyPV9kZXJlcV8oXCIuLi91dGlsL2RpY3Rpb25hcnlfY29kZXJcIiksdnQ9X2RlcmVxXyhcInZlY3Rvci10aWxlXCIpLFByb3RvYnVmPV9kZXJlcV8oXCJwYmZcIiksR2VvSlNPTkZlYXR1cmU9X2RlcmVxXyhcIi4uL3V0aWwvdmVjdG9ydGlsZV90b19nZW9qc29uXCIpLGFycmF5c0ludGVyc2VjdD1fZGVyZXFfKFwiLi4vdXRpbC91dGlsXCIpLmFycmF5c0ludGVyc2VjdCxpbnRlcnNlY3Rpb249X2RlcmVxXyhcIi4uL3V0aWwvaW50ZXJzZWN0aW9uX3Rlc3RzXCIpLG11bHRpUG9seWdvbkludGVyc2VjdHNCdWZmZXJlZE11bHRpUG9pbnQ9aW50ZXJzZWN0aW9uLm11bHRpUG9seWdvbkludGVyc2VjdHNCdWZmZXJlZE11bHRpUG9pbnQsbXVsdGlQb2x5Z29uSW50ZXJzZWN0c011bHRpUG9seWdvbj1pbnRlcnNlY3Rpb24ubXVsdGlQb2x5Z29uSW50ZXJzZWN0c011bHRpUG9seWdvbixtdWx0aVBvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRNdWx0aUxpbmU9aW50ZXJzZWN0aW9uLm11bHRpUG9seWdvbkludGVyc2VjdHNCdWZmZXJlZE11bHRpTGluZSxGZWF0dXJlSW5kZXhBcnJheT1jcmVhdGVTdHJ1Y3RBcnJheVR5cGUoe21lbWJlcnM6W3t0eXBlOlwiVWludDMyXCIsbmFtZTpcImZlYXR1cmVJbmRleFwifSx7dHlwZTpcIlVpbnQxNlwiLG5hbWU6XCJzb3VyY2VMYXllckluZGV4XCJ9LHt0eXBlOlwiVWludDE2XCIsbmFtZTpcImJ1Y2tldEluZGV4XCJ9XX0pLEZlYXR1cmVJbmRleD1mdW5jdGlvbihlLHQscil7aWYoZS5ncmlkKXt2YXIgaT1lLGE9dDtlPWkuY29vcmQsdD1pLm92ZXJzY2FsaW5nLHRoaXMuZ3JpZD1uZXcgR3JpZChpLmdyaWQpLHRoaXMuZmVhdHVyZUluZGV4QXJyYXk9bmV3IEZlYXR1cmVJbmRleEFycmF5KGkuZmVhdHVyZUluZGV4QXJyYXkpLHRoaXMucmF3VGlsZURhdGE9YSx0aGlzLmJ1Y2tldExheWVySURzPWkuYnVja2V0TGF5ZXJJRHMsdGhpcy5wYWludFByb3BlcnR5U3RhdGlzdGljcz1pLnBhaW50UHJvcGVydHlTdGF0aXN0aWNzfWVsc2UgdGhpcy5ncmlkPW5ldyBHcmlkKEVYVEVOVCwxNiwwKSx0aGlzLmZlYXR1cmVJbmRleEFycmF5PW5ldyBGZWF0dXJlSW5kZXhBcnJheTt0aGlzLmNvb3JkPWUsdGhpcy5vdmVyc2NhbGluZz10LHRoaXMueD1lLngsdGhpcy55PWUueSx0aGlzLno9ZS56LU1hdGgubG9nKHQpL01hdGguTE4yLHRoaXMuc2V0Q29sbGlzaW9uVGlsZShyKX07RmVhdHVyZUluZGV4LnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24oZSx0KXt2YXIgcj10aGlzLGk9dGhpcy5mZWF0dXJlSW5kZXhBcnJheS5sZW5ndGg7dGhpcy5mZWF0dXJlSW5kZXhBcnJheS5lbXBsYWNlQmFjayhlLmluZGV4LGUuc291cmNlTGF5ZXJJbmRleCx0KTtmb3IodmFyIGE9bG9hZEdlb21ldHJ5KGUpLG49MDtuPGEubGVuZ3RoO24rKyl7Zm9yKHZhciBzPWFbbl0sbz1bMS8wLDEvMCwtKDEvMCksLSgxLzApXSxsPTA7bDxzLmxlbmd0aDtsKyspe3ZhciB1PXNbbF07b1swXT1NYXRoLm1pbihvWzBdLHUueCksb1sxXT1NYXRoLm1pbihvWzFdLHUueSksb1syXT1NYXRoLm1heChvWzJdLHUueCksb1szXT1NYXRoLm1heChvWzNdLHUueSl9ci5ncmlkLmluc2VydChpLG9bMF0sb1sxXSxvWzJdLG9bM10pfX0sRmVhdHVyZUluZGV4LnByb3RvdHlwZS5zZXRDb2xsaXNpb25UaWxlPWZ1bmN0aW9uKGUpe3RoaXMuY29sbGlzaW9uVGlsZT1lfSxGZWF0dXJlSW5kZXgucHJvdG90eXBlLnNlcmlhbGl6ZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmdyaWQudG9BcnJheUJ1ZmZlcigpO3JldHVybiBlJiZlLnB1c2godCkse2Nvb3JkOnRoaXMuY29vcmQsb3ZlcnNjYWxpbmc6dGhpcy5vdmVyc2NhbGluZyxncmlkOnQsZmVhdHVyZUluZGV4QXJyYXk6dGhpcy5mZWF0dXJlSW5kZXhBcnJheS5zZXJpYWxpemUoZSksYnVja2V0TGF5ZXJJRHM6dGhpcy5idWNrZXRMYXllcklEcyxwYWludFByb3BlcnR5U3RhdGlzdGljczp0aGlzLnBhaW50UHJvcGVydHlTdGF0aXN0aWNzfX0sRmVhdHVyZUluZGV4LnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbihlLHQpe3ZhciByPXRoaXM7dGhpcy52dExheWVyc3x8KHRoaXMudnRMYXllcnM9bmV3IHZ0LlZlY3RvclRpbGUobmV3IFByb3RvYnVmKHRoaXMucmF3VGlsZURhdGEpKS5sYXllcnMsdGhpcy5zb3VyY2VMYXllckNvZGVyPW5ldyBEaWN0aW9uYXJ5Q29kZXIodGhpcy52dExheWVycz9PYmplY3Qua2V5cyh0aGlzLnZ0TGF5ZXJzKS5zb3J0KCk6W1wiX2dlb2pzb25UaWxlTGF5ZXJcIl0pKTt2YXIgaT17fSxhPWUucGFyYW1zfHx7fSxuPUVYVEVOVC9lLnRpbGVTaXplL2Uuc2NhbGUscz1mZWF0dXJlRmlsdGVyKGEuZmlsdGVyKSxvPTA7Zm9yKHZhciBsIGluIHQpaWYoci5oYXNMYXllcihsKSl7dmFyIHU9dFtsXSxjPTA7aWYoXCJsaW5lXCI9PT11LnR5cGUpe3ZhciB5PWdldExpbmVXaWR0aChyLmdldFBhaW50VmFsdWUoXCJsaW5lLXdpZHRoXCIsdSksci5nZXRQYWludFZhbHVlKFwibGluZS1nYXAtd2lkdGhcIix1KSksZj1yLmdldFBhaW50VmFsdWUoXCJsaW5lLW9mZnNldFwiLHUpLGg9ci5nZXRQYWludFZhbHVlKFwibGluZS10cmFuc2xhdGVcIix1KTtjPXkvMitNYXRoLmFicyhmKSt0cmFuc2xhdGVEaXN0YW5jZShoKX1lbHNlXCJmaWxsXCI9PT11LnR5cGU/Yz10cmFuc2xhdGVEaXN0YW5jZShyLmdldFBhaW50VmFsdWUoXCJmaWxsLXRyYW5zbGF0ZVwiLHUpKTpcImZpbGwtZXh0cnVzaW9uXCI9PT11LnR5cGU/Yz10cmFuc2xhdGVEaXN0YW5jZShyLmdldFBhaW50VmFsdWUoXCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGVcIix1KSk6XCJjaXJjbGVcIj09PXUudHlwZSYmKGM9ci5nZXRQYWludFZhbHVlKFwiY2lyY2xlLXJhZGl1c1wiLHUpK3RyYW5zbGF0ZURpc3RhbmNlKHIuZ2V0UGFpbnRWYWx1ZShcImNpcmNsZS10cmFuc2xhdGVcIix1KSkpO289TWF0aC5tYXgobyxjKm4pfWZvcih2YXIgZD1lLnF1ZXJ5R2VvbWV0cnkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gbmV3IFBvaW50KGUueCxlLnkpfSl9KSxnPTEvMCxwPTEvMCx2PS0oMS8wKSx4PS0oMS8wKSxQPTA7UDxkLmxlbmd0aDtQKyspZm9yKHZhciBJPWRbUF0sbT0wO208SS5sZW5ndGg7bSsrKXt2YXIgTD1JW21dO2c9TWF0aC5taW4oZyxMLngpLHA9TWF0aC5taW4ocCxMLnkpLHY9TWF0aC5tYXgodixMLngpLHg9TWF0aC5tYXgoeCxMLnkpfXZhciBNPXRoaXMuZ3JpZC5xdWVyeShnLW8scC1vLHYrbyx4K28pO00uc29ydCh0b3BEb3duRmVhdHVyZUNvbXBhcmF0b3IpLHRoaXMuZmlsdGVyTWF0Y2hpbmcoaSxNLHRoaXMuZmVhdHVyZUluZGV4QXJyYXksZCxzLGEubGF5ZXJzLHQsZS5iZWFyaW5nLG4pO3ZhciBiPXRoaXMuY29sbGlzaW9uVGlsZS5xdWVyeVJlbmRlcmVkU3ltYm9scyhkLGUuc2NhbGUpO3JldHVybiBiLnNvcnQoKSx0aGlzLmZpbHRlck1hdGNoaW5nKGksYix0aGlzLmNvbGxpc2lvblRpbGUuY29sbGlzaW9uQm94QXJyYXksZCxzLGEubGF5ZXJzLHQsZS5iZWFyaW5nLG4pLGl9LEZlYXR1cmVJbmRleC5wcm90b3R5cGUuZmlsdGVyTWF0Y2hpbmc9ZnVuY3Rpb24oZSx0LHIsaSxhLG4scyxvLGwpe2Zvcih2YXIgdSxjPXRoaXMseT0wO3k8dC5sZW5ndGg7eSsrKXt2YXIgZj10W3ldO2lmKGYhPT11KXt1PWY7dmFyIGg9ci5nZXQoZiksZD1jLmJ1Y2tldExheWVySURzW2guYnVja2V0SW5kZXhdO2lmKCFufHxhcnJheXNJbnRlcnNlY3QobixkKSl7dmFyIGc9Yy5zb3VyY2VMYXllckNvZGVyLmRlY29kZShoLnNvdXJjZUxheWVySW5kZXgpLHA9Yy52dExheWVyc1tnXSx2PXAuZmVhdHVyZShoLmZlYXR1cmVJbmRleCk7aWYoYSh2KSlmb3IodmFyIHg9bnVsbCxQPTA7UDxkLmxlbmd0aDtQKyspe3ZhciBJPWRbUF07aWYoIShuJiZuLmluZGV4T2YoSSk8MCkpe3ZhciBtPXNbSV07aWYobSl7dmFyIEw9dm9pZCAwO2lmKFwic3ltYm9sXCIhPT1tLnR5cGUpaWYoeHx8KHg9bG9hZEdlb21ldHJ5KHYpKSxcImxpbmVcIj09PW0udHlwZSl7TD10cmFuc2xhdGUoaSxjLmdldFBhaW50VmFsdWUoXCJsaW5lLXRyYW5zbGF0ZVwiLG0sdiksYy5nZXRQYWludFZhbHVlKFwibGluZS10cmFuc2xhdGUtYW5jaG9yXCIsbSx2KSxvLGwpO3ZhciBNPWwvMipnZXRMaW5lV2lkdGgoYy5nZXRQYWludFZhbHVlKFwibGluZS13aWR0aFwiLG0sdiksYy5nZXRQYWludFZhbHVlKFwibGluZS1nYXAtd2lkdGhcIixtLHYpKSxiPWMuZ2V0UGFpbnRWYWx1ZShcImxpbmUtb2Zmc2V0XCIsbSx2KTtpZihiJiYoeD1vZmZzZXRMaW5lKHgsYipsKSksIW11bHRpUG9seWdvbkludGVyc2VjdHNCdWZmZXJlZE11bHRpTGluZShMLHgsTSkpY29udGludWV9ZWxzZSBpZihcImZpbGxcIj09PW0udHlwZXx8XCJmaWxsLWV4dHJ1c2lvblwiPT09bS50eXBlKXt2YXIgVj1tLnR5cGU7aWYoTD10cmFuc2xhdGUoaSxjLmdldFBhaW50VmFsdWUoVitcIi10cmFuc2xhdGVcIixtLHYpLGMuZ2V0UGFpbnRWYWx1ZShWK1wiLXRyYW5zbGF0ZS1hbmNob3JcIixtLHYpLG8sbCksIW11bHRpUG9seWdvbkludGVyc2VjdHNNdWx0aVBvbHlnb24oTCx4KSljb250aW51ZX1lbHNlIGlmKFwiY2lyY2xlXCI9PT1tLnR5cGUpe0w9dHJhbnNsYXRlKGksYy5nZXRQYWludFZhbHVlKFwiY2lyY2xlLXRyYW5zbGF0ZVwiLG0sdiksYy5nZXRQYWludFZhbHVlKFwiY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3JcIixtLHYpLG8sbCk7dmFyIHc9Yy5nZXRQYWludFZhbHVlKFwiY2lyY2xlLXJhZGl1c1wiLG0sdikqbDtpZighbXVsdGlQb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkTXVsdGlQb2ludChMLHgsdykpY29udGludWV9dmFyIEY9bmV3IEdlb0pTT05GZWF0dXJlKHYsYy56LGMueCxjLnkpO0YubGF5ZXI9bS5zZXJpYWxpemUoKTt2YXIgXz1lW0ldO3ZvaWQgMD09PV8mJihfPWVbSV09W10pLF8ucHVzaChGKX19fX19fX0sRmVhdHVyZUluZGV4LnByb3RvdHlwZS5oYXNMYXllcj1mdW5jdGlvbihlKXt2YXIgdD10aGlzO2Zvcih2YXIgciBpbiB0LmJ1Y2tldExheWVySURzKWZvcih2YXIgaT0wLGE9dC5idWNrZXRMYXllcklEc1tyXTtpPGEubGVuZ3RoO2krPTEpe3ZhciBuPWFbaV07aWYoZT09PW4pcmV0dXJuITB9cmV0dXJuITF9LEZlYXR1cmVJbmRleC5wcm90b3R5cGUuZ2V0UGFpbnRWYWx1ZT1mdW5jdGlvbihlLHQscil7dmFyIGk9dC5pc1BhaW50VmFsdWVGZWF0dXJlQ29uc3RhbnQoZSk7aWYoaXx8cil7dmFyIGE9cj9yLnByb3BlcnRpZXM6e307cmV0dXJuIHQuZ2V0UGFpbnRWYWx1ZShlLHt6b29tOnRoaXMuen0sYSl9cmV0dXJuIHRoaXMucGFpbnRQcm9wZXJ0eVN0YXRpc3RpY3NbdC5pZF1bZV0ubWF4fSxtb2R1bGUuZXhwb3J0cz1GZWF0dXJlSW5kZXg7XG59LHtcIi4uL3N0eWxlLXNwZWMvZmVhdHVyZV9maWx0ZXJcIjoxMDUsXCIuLi91dGlsL2RpY3Rpb25hcnlfY29kZXJcIjoyMDAsXCIuLi91dGlsL2ludGVyc2VjdGlvbl90ZXN0c1wiOjIwNyxcIi4uL3V0aWwvc3RydWN0X2FycmF5XCI6MjEzLFwiLi4vdXRpbC91dGlsXCI6MjE1LFwiLi4vdXRpbC92ZWN0b3J0aWxlX3RvX2dlb2pzb25cIjoyMTYsXCIuL2V4dGVudFwiOjU0LFwiLi9sb2FkX2dlb21ldHJ5XCI6NTYsXCJncmlkLWluZGV4XCI6MTYsXCJwYmZcIjoyNSxcInBvaW50LWdlb21ldHJ5XCI6MjYsXCJ2ZWN0b3ItdGlsZVwiOjM0fV0sNTY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gY3JlYXRlQm91bmRzKGUpe3JldHVybnttaW46LTEqTWF0aC5wb3coMixlLTEpLG1heDpNYXRoLnBvdygyLGUtMSktMX19dmFyIHV0aWw9X2RlcmVxXyhcIi4uL3V0aWwvdXRpbFwiKSxFWFRFTlQ9X2RlcmVxXyhcIi4vZXh0ZW50XCIpLGJvdW5kc0xvb2t1cD17MTU6Y3JlYXRlQm91bmRzKDE1KSwxNjpjcmVhdGVCb3VuZHMoMTYpfTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgcj1ib3VuZHNMb29rdXBbdHx8MTZdLG89RVhURU5UL2UuZXh0ZW50LHU9ZS5sb2FkR2VvbWV0cnkoKSxuPTA7bjx1Lmxlbmd0aDtuKyspZm9yKHZhciBhPXVbbl0saT0wO2k8YS5sZW5ndGg7aSsrKXt2YXIgZD1hW2ldO2QueD1NYXRoLnJvdW5kKGQueCpvKSxkLnk9TWF0aC5yb3VuZChkLnkqbyksKGQueDxyLm1pbnx8ZC54PnIubWF4fHxkLnk8ci5taW58fGQueT5yLm1heCkmJnV0aWwud2Fybk9uY2UoXCJHZW9tZXRyeSBleGNlZWRzIGFsbG93ZWQgZXh0ZW50LCByZWR1Y2UgeW91ciB2ZWN0b3IgdGlsZSBidWZmZXIgc2l6ZVwiKX1yZXR1cm4gdX07XG59LHtcIi4uL3V0aWwvdXRpbFwiOjIxNSxcIi4vZXh0ZW50XCI6NTR9XSw1NzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgY3JlYXRlU3RydWN0QXJyYXlUeXBlPV9kZXJlcV8oXCIuLi91dGlsL3N0cnVjdF9hcnJheVwiKSxQb3NBcnJheT1jcmVhdGVTdHJ1Y3RBcnJheVR5cGUoe21lbWJlcnM6W3tuYW1lOlwiYV9wb3NcIix0eXBlOlwiSW50MTZcIixjb21wb25lbnRzOjJ9XX0pO21vZHVsZS5leHBvcnRzPVBvc0FycmF5O1xufSx7XCIuLi91dGlsL3N0cnVjdF9hcnJheVwiOjIxM31dLDU4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGdldFBhaW50QXR0cmlidXRlVmFsdWUodCxyLGUsaSl7aWYoIXQuem9vbVN0b3BzKXJldHVybiByLmdldFBhaW50VmFsdWUodC5wcm9wZXJ0eSxlLGkpO3ZhciBhPXQuem9vbVN0b3BzLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gci5nZXRQYWludFZhbHVlKHQucHJvcGVydHksdXRpbC5leHRlbmQoe30sZSx7em9vbTphfSksaSl9KTtyZXR1cm4gMT09PWEubGVuZ3RoP2FbMF06YX1mdW5jdGlvbiBub3JtYWxpemVQYWludEF0dHJpYnV0ZSh0LHIpe3ZhciBlPXQubmFtZTtlfHwoZT10LnByb3BlcnR5LnJlcGxhY2Uoci50eXBlK1wiLVwiLFwiXCIpLnJlcGxhY2UoLy0vZyxcIl9cIikpO3ZhciBpPVwiY29sb3JcIj09PXIuX3BhaW50U3BlY2lmaWNhdGlvbnNbdC5wcm9wZXJ0eV0udHlwZTtyZXR1cm4gdXRpbC5leHRlbmQoe25hbWU6XCJhX1wiK2UsY29tcG9uZW50czppPzQ6MSxtdWx0aXBsaWVyOmk/MjU1OjEsZGltZW5zaW9uczppPzQ6MX0sdCl9dmFyIGNyZWF0ZVZlcnRleEFycmF5VHlwZT1fZGVyZXFfKFwiLi92ZXJ0ZXhfYXJyYXlfdHlwZVwiKSx1dGlsPV9kZXJlcV8oXCIuLi91dGlsL3V0aWxcIiksUHJvZ3JhbUNvbmZpZ3VyYXRpb249ZnVuY3Rpb24oKXt0aGlzLmF0dHJpYnV0ZXM9W10sdGhpcy51bmlmb3Jtcz1bXSx0aGlzLmludGVycG9sYXRpb25Vbmlmb3Jtcz1bXSx0aGlzLnByYWdtYXM9e3ZlcnRleDp7fSxmcmFnbWVudDp7fX0sdGhpcy5jYWNoZUtleT1cIlwifTtQcm9ncmFtQ29uZmlndXJhdGlvbi5jcmVhdGVEeW5hbWljPWZ1bmN0aW9uKHQscixlKXtmb3IodmFyIGk9bmV3IFByb2dyYW1Db25maWd1cmF0aW9uLGE9MCxuPXQ7YTxuLmxlbmd0aDthKz0xKXt2YXIgbz1uW2FdLHA9bm9ybWFsaXplUGFpbnRBdHRyaWJ1dGUobyxyKSx1PXAubmFtZS5zbGljZSgyKTtyLmlzUGFpbnRWYWx1ZUZlYXR1cmVDb25zdGFudChwLnByb3BlcnR5KT9pLmFkZFpvb21BdHRyaWJ1dGUodSxwKTpyLmlzUGFpbnRWYWx1ZVpvb21Db25zdGFudChwLnByb3BlcnR5KT9pLmFkZFByb3BlcnR5QXR0cmlidXRlKHUscCk6aS5hZGRab29tQW5kUHJvcGVydHlBdHRyaWJ1dGUodSxwLHIsZSl9cmV0dXJuIGkuUGFpbnRWZXJ0ZXhBcnJheT1jcmVhdGVWZXJ0ZXhBcnJheVR5cGUoaS5hdHRyaWJ1dGVzKSxpfSxQcm9ncmFtQ29uZmlndXJhdGlvbi5jcmVhdGVTdGF0aWM9ZnVuY3Rpb24odCl7Zm9yKHZhciByPW5ldyBQcm9ncmFtQ29uZmlndXJhdGlvbixlPTAsaT10O2U8aS5sZW5ndGg7ZSs9MSl7dmFyIGE9aVtlXTtyLmFkZFVuaWZvcm0oYSxcInVfXCIrYSl9cmV0dXJuIHJ9LFByb2dyYW1Db25maWd1cmF0aW9uLnByb3RvdHlwZS5hZGRVbmlmb3JtPWZ1bmN0aW9uKHQscil7dmFyIGU9dGhpcy5nZXRQcmFnbWFzKHQpO2UuZGVmaW5lLnB1c2goXCJ1bmlmb3JtIHtwcmVjaXNpb259IHt0eXBlfSBcIityK1wiO1wiKSxlLmluaXRpYWxpemUucHVzaChcIntwcmVjaXNpb259IHt0eXBlfSBcIit0K1wiID0gXCIrcitcIjtcIiksdGhpcy5jYWNoZUtleSs9XCIvdV9cIit0fSxQcm9ncmFtQ29uZmlndXJhdGlvbi5wcm90b3R5cGUuYWRkWm9vbUF0dHJpYnV0ZT1mdW5jdGlvbih0LHIpe3RoaXMudW5pZm9ybXMucHVzaChyKSx0aGlzLmFkZFVuaWZvcm0odCxyLm5hbWUpfSxQcm9ncmFtQ29uZmlndXJhdGlvbi5wcm90b3R5cGUuYWRkUHJvcGVydHlBdHRyaWJ1dGU9ZnVuY3Rpb24odCxyKXt2YXIgZT10aGlzLmdldFByYWdtYXModCk7dGhpcy5hdHRyaWJ1dGVzLnB1c2gociksZS5kZWZpbmUucHVzaChcInZhcnlpbmcge3ByZWNpc2lvbn0ge3R5cGV9IFwiK3QrXCI7XCIpLGUudmVydGV4LmRlZmluZS5wdXNoKFwiYXR0cmlidXRlIHtwcmVjaXNpb259IHt0eXBlfSBcIityLm5hbWUrXCI7XCIpLGUudmVydGV4LmluaXRpYWxpemUucHVzaCh0K1wiID0gXCIrci5uYW1lK1wiIC8gXCIrci5tdWx0aXBsaWVyK1wiLjA7XCIpLHRoaXMuY2FjaGVLZXkrPVwiL2FfXCIrdH0sUHJvZ3JhbUNvbmZpZ3VyYXRpb24ucHJvdG90eXBlLmFkZFpvb21BbmRQcm9wZXJ0eUF0dHJpYnV0ZT1mdW5jdGlvbih0LHIsZSxpKXt2YXIgYT10aGlzLG49dGhpcy5nZXRQcmFnbWFzKHQpO24uZGVmaW5lLnB1c2goXCJ2YXJ5aW5nIHtwcmVjaXNpb259IHt0eXBlfSBcIit0K1wiO1wiKTt2YXIgbz1lLmdldFBhaW50VmFsdWVTdG9wWm9vbUxldmVscyhyLnByb3BlcnR5KSxwPTA7aWYoby5sZW5ndGg+NClmb3IoO3A8by5sZW5ndGgtMiYmb1twXTxpOylwKys7dmFyIHU9XCJ1X1wiK3QrXCJfdFwiO24udmVydGV4LmRlZmluZS5wdXNoKFwidW5pZm9ybSBsb3dwIGZsb2F0IFwiK3UrXCI7XCIpLHRoaXMuaW50ZXJwb2xhdGlvblVuaWZvcm1zLnB1c2goe25hbWU6dSxwcm9wZXJ0eTpyLnByb3BlcnR5LHN0b3BPZmZzZXQ6cH0pO2Zvcih2YXIgcz1bXSxtPTA7bTw0O20rKylzLnB1c2gob1tNYXRoLm1pbihwK20sby5sZW5ndGgtMSldKTt2YXIgZj1bXTtpZigxPT09ci5jb21wb25lbnRzKXRoaXMuYXR0cmlidXRlcy5wdXNoKHV0aWwuZXh0ZW5kKHt9LHIse2NvbXBvbmVudHM6NCx6b29tU3RvcHM6c30pKSxuLnZlcnRleC5kZWZpbmUucHVzaChcImF0dHJpYnV0ZSB7cHJlY2lzaW9ufSB2ZWM0IFwiK3IubmFtZStcIjtcIiksZi5wdXNoKHIubmFtZSk7ZWxzZSBmb3IodmFyIGc9MDtnPDQ7ZysrKXt2YXIgaD1yLm5hbWUrZztmLnB1c2goaCksYS5hdHRyaWJ1dGVzLnB1c2godXRpbC5leHRlbmQoe30scix7bmFtZTpoLHpvb21TdG9wczpbc1tnXV19KSksbi52ZXJ0ZXguZGVmaW5lLnB1c2goXCJhdHRyaWJ1dGUge3ByZWNpc2lvbn0ge3R5cGV9IFwiK2grXCI7XCIpfW4udmVydGV4LmluaXRpYWxpemUucHVzaCh0K1wiID0gZXZhbHVhdGVfem9vbV9mdW5jdGlvbl9cIityLmNvbXBvbmVudHMrXCIoICAgICAgICAgICAgXCIrZi5qb2luKFwiLCBcIikrXCIsIFwiK3UrXCIpIC8gXCIrci5tdWx0aXBsaWVyK1wiLjA7XCIpLHRoaXMuY2FjaGVLZXkrPVwiL3pfXCIrdH0sUHJvZ3JhbUNvbmZpZ3VyYXRpb24ucHJvdG90eXBlLmdldFByYWdtYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHJhZ21hc1t0XXx8KHRoaXMucHJhZ21hc1t0XT17ZGVmaW5lOltdLGluaXRpYWxpemU6W119LHRoaXMucHJhZ21hc1t0XS5mcmFnbWVudD17ZGVmaW5lOltdLGluaXRpYWxpemU6W119LHRoaXMucHJhZ21hc1t0XS52ZXJ0ZXg9e2RlZmluZTpbXSxpbml0aWFsaXplOltdfSksdGhpcy5wcmFnbWFzW3RdfSxQcm9ncmFtQ29uZmlndXJhdGlvbi5wcm90b3R5cGUuYXBwbHlQcmFnbWFzPWZ1bmN0aW9uKHQscil7dmFyIGU9dGhpcztyZXR1cm4gdC5yZXBsYWNlKC8jcHJhZ21hIG1hcGJveDogKFtcXHddKykgKFtcXHddKykgKFtcXHddKykgKFtcXHddKykvZyxmdW5jdGlvbih0LGksYSxuLG8pe3JldHVybiBlLnByYWdtYXNbb11baV0uY29uY2F0KGUucHJhZ21hc1tvXVtyXVtpXSkuam9pbihcIlxcblwiKS5yZXBsYWNlKC97dHlwZX0vZyxuKS5yZXBsYWNlKC97cHJlY2lzaW9ufS9nLGEpfSl9LFByb2dyYW1Db25maWd1cmF0aW9uLnByb3RvdHlwZS5jcmVhdGVQYWludFByb3BlcnR5U3RhdGlzdGljcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLHI9e30sZT0wLGk9dC5hdHRyaWJ1dGVzO2U8aS5sZW5ndGg7ZSs9MSl7dmFyIGE9aVtlXTsxPT09YS5kaW1lbnNpb25zJiYoclthLnByb3BlcnR5XT17bWF4Oi0oMS8wKX0pfXJldHVybiByfSxQcm9ncmFtQ29uZmlndXJhdGlvbi5wcm90b3R5cGUucG9wdWxhdGVQYWludEFycmF5PWZ1bmN0aW9uKHQscixlLGksYSxuKXt2YXIgbz10aGlzLHA9ci5sZW5ndGg7ci5yZXNpemUoaSk7Zm9yKHZhciB1PTAscz1vLmF0dHJpYnV0ZXM7dTxzLmxlbmd0aDt1Kz0xKWZvcih2YXIgbT1zW3VdLGY9Z2V0UGFpbnRBdHRyaWJ1dGVWYWx1ZShtLHQsYSxuKSxnPXA7ZzxpO2crKyl7dmFyIGg9ci5nZXQoZyk7aWYoND09PW0uY29tcG9uZW50cylmb3IodmFyIGw9MDtsPDQ7bCsrKWhbbS5uYW1lK2xdPWZbbF0qbS5tdWx0aXBsaWVyO2Vsc2UgaFttLm5hbWVdPWYqbS5tdWx0aXBsaWVyO2lmKDE9PT1tLmRpbWVuc2lvbnMpe3ZhciBjPWVbbS5wcm9wZXJ0eV07Yy5tYXg9TWF0aC5tYXgoYy5tYXgsMT09PW0uY29tcG9uZW50cz9mOk1hdGgubWF4LmFwcGx5KE1hdGgsZikpfX19LFByb2dyYW1Db25maWd1cmF0aW9uLnByb3RvdHlwZS5zZXRVbmlmb3Jtcz1mdW5jdGlvbih0LHIsZSxpKXtmb3IodmFyIGE9dGhpcyxuPTAsbz1hLnVuaWZvcm1zO248by5sZW5ndGg7bis9MSl7dmFyIHA9b1tuXSx1PWUuZ2V0UGFpbnRWYWx1ZShwLnByb3BlcnR5LGkpOzQ9PT1wLmNvbXBvbmVudHM/dC51bmlmb3JtNGZ2KHJbcC5uYW1lXSx1KTp0LnVuaWZvcm0xZihyW3AubmFtZV0sdSl9Zm9yKHZhciBzPTAsbT1hLmludGVycG9sYXRpb25Vbmlmb3JtcztzPG0ubGVuZ3RoO3MrPTEpe3ZhciBmPW1bc10sZz1lLmdldFBhaW50SW50ZXJwb2xhdGlvblQoZi5wcm9wZXJ0eSxpKTt0LnVuaWZvcm0xZihyW2YubmFtZV0sTWF0aC5tYXgoMCxNYXRoLm1pbigzLGctZi5zdG9wT2Zmc2V0KSkpfX0sbW9kdWxlLmV4cG9ydHM9UHJvZ3JhbUNvbmZpZ3VyYXRpb247XG59LHtcIi4uL3V0aWwvdXRpbFwiOjIxNSxcIi4vdmVydGV4X2FycmF5X3R5cGVcIjo2MH1dLDU5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBjcmVhdGVTdHJ1Y3RBcnJheVR5cGU9X2RlcmVxXyhcIi4uL3V0aWwvc3RydWN0X2FycmF5XCIpLFJhc3RlckJvdW5kc0FycmF5PWNyZWF0ZVN0cnVjdEFycmF5VHlwZSh7bWVtYmVyczpbe25hbWU6XCJhX3Bvc1wiLHR5cGU6XCJJbnQxNlwiLGNvbXBvbmVudHM6Mn0se25hbWU6XCJhX3RleHR1cmVfcG9zXCIsdHlwZTpcIkludDE2XCIsY29tcG9uZW50czoyfV19KTttb2R1bGUuZXhwb3J0cz1SYXN0ZXJCb3VuZHNBcnJheTtcbn0se1wiLi4vdXRpbC9zdHJ1Y3RfYXJyYXlcIjoyMTN9XSw2MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBjcmVhdGVWZXJ0ZXhBcnJheVR5cGUocil7cmV0dXJuIGNyZWF0ZVN0cnVjdEFycmF5VHlwZSh7bWVtYmVyczpyLGFsaWdubWVudDo0fSl9dmFyIGNyZWF0ZVN0cnVjdEFycmF5VHlwZT1fZGVyZXFfKFwiLi4vdXRpbC9zdHJ1Y3RfYXJyYXlcIik7bW9kdWxlLmV4cG9ydHM9Y3JlYXRlVmVydGV4QXJyYXlUeXBlO1xufSx7XCIuLi91dGlsL3N0cnVjdF9hcnJheVwiOjIxM31dLDYxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBDb29yZGluYXRlPWZ1bmN0aW9uKG8sdCxuKXt0aGlzLmNvbHVtbj1vLHRoaXMucm93PXQsdGhpcy56b29tPW59O0Nvb3JkaW5hdGUucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBDb29yZGluYXRlKHRoaXMuY29sdW1uLHRoaXMucm93LHRoaXMuem9vbSl9LENvb3JkaW5hdGUucHJvdG90eXBlLnpvb21Ubz1mdW5jdGlvbihvKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl96b29tVG8obyl9LENvb3JkaW5hdGUucHJvdG90eXBlLnN1Yj1mdW5jdGlvbihvKXtyZXR1cm4gdGhpcy5jbG9uZSgpLl9zdWIobyl9LENvb3JkaW5hdGUucHJvdG90eXBlLl96b29tVG89ZnVuY3Rpb24obyl7dmFyIHQ9TWF0aC5wb3coMixvLXRoaXMuem9vbSk7cmV0dXJuIHRoaXMuY29sdW1uKj10LHRoaXMucm93Kj10LHRoaXMuem9vbT1vLHRoaXN9LENvb3JkaW5hdGUucHJvdG90eXBlLl9zdWI9ZnVuY3Rpb24obyl7cmV0dXJuIG89by56b29tVG8odGhpcy56b29tKSx0aGlzLmNvbHVtbi09by5jb2x1bW4sdGhpcy5yb3ctPW8ucm93LHRoaXN9LG1vZHVsZS5leHBvcnRzPUNvb3JkaW5hdGU7XG59LHt9XSw2MjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgd3JhcD1fZGVyZXFfKFwiLi4vdXRpbC91dGlsXCIpLndyYXAsTG5nTGF0PWZ1bmN0aW9uKHQsbil7aWYoaXNOYU4odCl8fGlzTmFOKG4pKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgTG5nTGF0IG9iamVjdDogKFwiK3QrXCIsIFwiK24rXCIpXCIpO2lmKHRoaXMubG5nPSt0LHRoaXMubGF0PStuLHRoaXMubGF0PjkwfHx0aGlzLmxhdDwtOTApdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBMbmdMYXQgbGF0aXR1ZGUgdmFsdWU6IG11c3QgYmUgYmV0d2VlbiAtOTAgYW5kIDkwXCIpfTtMbmdMYXQucHJvdG90eXBlLndyYXA9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IExuZ0xhdCh3cmFwKHRoaXMubG5nLC0xODAsMTgwKSx0aGlzLmxhdCl9LExuZ0xhdC5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3JldHVyblt0aGlzLmxuZyx0aGlzLmxhdF19LExuZ0xhdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5cIkxuZ0xhdChcIit0aGlzLmxuZytcIiwgXCIrdGhpcy5sYXQrXCIpXCJ9LExuZ0xhdC5jb252ZXJ0PWZ1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBMbmdMYXQpcmV0dXJuIHQ7aWYoQXJyYXkuaXNBcnJheSh0KSYmMj09PXQubGVuZ3RoKXJldHVybiBuZXcgTG5nTGF0KE51bWJlcih0WzBdKSxOdW1iZXIodFsxXSkpO2lmKCFBcnJheS5pc0FycmF5KHQpJiZcIm9iamVjdFwiPT10eXBlb2YgdCYmbnVsbCE9PXQpcmV0dXJuIG5ldyBMbmdMYXQoTnVtYmVyKHQubG5nKSxOdW1iZXIodC5sYXQpKTt0aHJvdyBuZXcgRXJyb3IoXCJgTG5nTGF0TGlrZWAgYXJndW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYSBMbmdMYXQgaW5zdGFuY2UsIGFuIG9iamVjdCB7bG5nOiA8bG5nPiwgbGF0OiA8bGF0Pn0sIG9yIGFuIGFycmF5IG9mIFs8bG5nPiwgPGxhdD5dXCIpfSxtb2R1bGUuZXhwb3J0cz1MbmdMYXQ7XG59LHtcIi4uL3V0aWwvdXRpbFwiOjIxNX1dLDYzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBMbmdMYXQ9X2RlcmVxXyhcIi4vbG5nX2xhdFwiKSxMbmdMYXRCb3VuZHM9ZnVuY3Rpb24odCxuKXt0JiYobj90aGlzLnNldFNvdXRoV2VzdCh0KS5zZXROb3J0aEVhc3Qobik6ND09PXQubGVuZ3RoP3RoaXMuc2V0U291dGhXZXN0KFt0WzBdLHRbMV1dKS5zZXROb3J0aEVhc3QoW3RbMl0sdFszXV0pOnRoaXMuc2V0U291dGhXZXN0KHRbMF0pLnNldE5vcnRoRWFzdCh0WzFdKSl9O0xuZ0xhdEJvdW5kcy5wcm90b3R5cGUuc2V0Tm9ydGhFYXN0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9uZT1MbmdMYXQuY29udmVydCh0KSx0aGlzfSxMbmdMYXRCb3VuZHMucHJvdG90eXBlLnNldFNvdXRoV2VzdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fc3c9TG5nTGF0LmNvbnZlcnQodCksdGhpc30sTG5nTGF0Qm91bmRzLnByb3RvdHlwZS5leHRlbmQ9ZnVuY3Rpb24odCl7dmFyIG4sZSxzPXRoaXMuX3N3LG89dGhpcy5fbmU7aWYodCBpbnN0YW5jZW9mIExuZ0xhdCluPXQsZT10O2Vsc2V7aWYoISh0IGluc3RhbmNlb2YgTG5nTGF0Qm91bmRzKSlyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT90LmV2ZXJ5KEFycmF5LmlzQXJyYXkpP3RoaXMuZXh0ZW5kKExuZ0xhdEJvdW5kcy5jb252ZXJ0KHQpKTp0aGlzLmV4dGVuZChMbmdMYXQuY29udmVydCh0KSk6dGhpcztpZihuPXQuX3N3LGU9dC5fbmUsIW58fCFlKXJldHVybiB0aGlzfXJldHVybiBzfHxvPyhzLmxuZz1NYXRoLm1pbihuLmxuZyxzLmxuZykscy5sYXQ9TWF0aC5taW4obi5sYXQscy5sYXQpLG8ubG5nPU1hdGgubWF4KGUubG5nLG8ubG5nKSxvLmxhdD1NYXRoLm1heChlLmxhdCxvLmxhdCkpOih0aGlzLl9zdz1uZXcgTG5nTGF0KG4ubG5nLG4ubGF0KSx0aGlzLl9uZT1uZXcgTG5nTGF0KGUubG5nLGUubGF0KSksdGhpc30sTG5nTGF0Qm91bmRzLnByb3RvdHlwZS5nZXRDZW50ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IExuZ0xhdCgodGhpcy5fc3cubG5nK3RoaXMuX25lLmxuZykvMiwodGhpcy5fc3cubGF0K3RoaXMuX25lLmxhdCkvMil9LExuZ0xhdEJvdW5kcy5wcm90b3R5cGUuZ2V0U291dGhXZXN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N3fSxMbmdMYXRCb3VuZHMucHJvdG90eXBlLmdldE5vcnRoRWFzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9uZX0sTG5nTGF0Qm91bmRzLnByb3RvdHlwZS5nZXROb3J0aFdlc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IExuZ0xhdCh0aGlzLmdldFdlc3QoKSx0aGlzLmdldE5vcnRoKCkpfSxMbmdMYXRCb3VuZHMucHJvdG90eXBlLmdldFNvdXRoRWFzdD1mdW5jdGlvbigpe3JldHVybiBuZXcgTG5nTGF0KHRoaXMuZ2V0RWFzdCgpLHRoaXMuZ2V0U291dGgoKSl9LExuZ0xhdEJvdW5kcy5wcm90b3R5cGUuZ2V0V2VzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdy5sbmd9LExuZ0xhdEJvdW5kcy5wcm90b3R5cGUuZ2V0U291dGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3cubGF0fSxMbmdMYXRCb3VuZHMucHJvdG90eXBlLmdldEVhc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbmUubG5nfSxMbmdMYXRCb3VuZHMucHJvdG90eXBlLmdldE5vcnRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25lLmxhdH0sTG5nTGF0Qm91bmRzLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMuX3N3LnRvQXJyYXkoKSx0aGlzLl9uZS50b0FycmF5KCldfSxMbmdMYXRCb3VuZHMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJMbmdMYXRCb3VuZHMoXCIrdGhpcy5fc3cudG9TdHJpbmcoKStcIiwgXCIrdGhpcy5fbmUudG9TdHJpbmcoKStcIilcIn0sTG5nTGF0Qm91bmRzLmNvbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIXR8fHQgaW5zdGFuY2VvZiBMbmdMYXRCb3VuZHM/dDpuZXcgTG5nTGF0Qm91bmRzKHQpfSxtb2R1bGUuZXhwb3J0cz1MbmdMYXRCb3VuZHM7XG59LHtcIi4vbG5nX2xhdFwiOjYyfV0sNjQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIExuZ0xhdD1fZGVyZXFfKFwiLi9sbmdfbGF0XCIpLFBvaW50PV9kZXJlcV8oXCJwb2ludC1nZW9tZXRyeVwiKSxDb29yZGluYXRlPV9kZXJlcV8oXCIuL2Nvb3JkaW5hdGVcIiksdXRpbD1fZGVyZXFfKFwiLi4vdXRpbC91dGlsXCIpLGludGVycD1fZGVyZXFfKFwiLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlXCIpLFRpbGVDb29yZD1fZGVyZXFfKFwiLi4vc291cmNlL3RpbGVfY29vcmRcIiksRVhURU5UPV9kZXJlcV8oXCIuLi9kYXRhL2V4dGVudFwiKSxnbG1hdHJpeD1fZGVyZXFfKFwiQG1hcGJveC9nbC1tYXRyaXhcIiksdmVjND1nbG1hdHJpeC52ZWM0LG1hdDQ9Z2xtYXRyaXgubWF0NCxtYXQyPWdsbWF0cml4Lm1hdDIsVHJhbnNmb3JtPWZ1bmN0aW9uKHQsaSxvKXt0aGlzLnRpbGVTaXplPTUxMix0aGlzLl9yZW5kZXJXb3JsZENvcGllcz12b2lkIDA9PT1vfHxvLHRoaXMuX21pblpvb209dHx8MCx0aGlzLl9tYXhab29tPWl8fDIyLHRoaXMubGF0UmFuZ2U9Wy04NS4wNTExMyw4NS4wNTExM10sdGhpcy53aWR0aD0wLHRoaXMuaGVpZ2h0PTAsdGhpcy5fY2VudGVyPW5ldyBMbmdMYXQoMCwwKSx0aGlzLnpvb209MCx0aGlzLmFuZ2xlPTAsdGhpcy5fZm92PS42NDM1MDExMDg3OTMyODQ0LHRoaXMuX3BpdGNoPTAsdGhpcy5fdW5tb2RpZmllZD0hMH0scHJvdG90eXBlQWNjZXNzb3JzPXttaW5ab29tOnt9LG1heFpvb206e30scmVuZGVyV29ybGRDb3BpZXM6e30sd29ybGRTaXplOnt9LGNlbnRlclBvaW50Ont9LHNpemU6e30sYmVhcmluZzp7fSxwaXRjaDp7fSxmb3Y6e30sem9vbTp7fSxjZW50ZXI6e30sdW5tb2RpZmllZDp7fSx4Ont9LHk6e30scG9pbnQ6e319O3Byb3RvdHlwZUFjY2Vzc29ycy5taW5ab29tLmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9taW5ab29tfSxwcm90b3R5cGVBY2Nlc3NvcnMubWluWm9vbS5zZXQ9ZnVuY3Rpb24odCl7dGhpcy5fbWluWm9vbSE9PXQmJih0aGlzLl9taW5ab29tPXQsdGhpcy56b29tPU1hdGgubWF4KHRoaXMuem9vbSx0KSl9LHByb3RvdHlwZUFjY2Vzc29ycy5tYXhab29tLmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhab29tfSxwcm90b3R5cGVBY2Nlc3NvcnMubWF4Wm9vbS5zZXQ9ZnVuY3Rpb24odCl7dGhpcy5fbWF4Wm9vbSE9PXQmJih0aGlzLl9tYXhab29tPXQsdGhpcy56b29tPU1hdGgubWluKHRoaXMuem9vbSx0KSl9LHByb3RvdHlwZUFjY2Vzc29ycy5yZW5kZXJXb3JsZENvcGllcy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVuZGVyV29ybGRDb3BpZXN9LHByb3RvdHlwZUFjY2Vzc29ycy53b3JsZFNpemUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGlsZVNpemUqdGhpcy5zY2FsZX0scHJvdG90eXBlQWNjZXNzb3JzLmNlbnRlclBvaW50LmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNpemUuX2RpdigyKX0scHJvdG90eXBlQWNjZXNzb3JzLnNpemUuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQb2ludCh0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KX0scHJvdG90eXBlQWNjZXNzb3JzLmJlYXJpbmcuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuLXRoaXMuYW5nbGUvTWF0aC5QSSoxODB9LHByb3RvdHlwZUFjY2Vzc29ycy5iZWFyaW5nLnNldD1mdW5jdGlvbih0KXt2YXIgaT0tdXRpbC53cmFwKHQsLTE4MCwxODApKk1hdGguUEkvMTgwO3RoaXMuYW5nbGUhPT1pJiYodGhpcy5fdW5tb2RpZmllZD0hMSx0aGlzLmFuZ2xlPWksdGhpcy5fY2FsY01hdHJpY2VzKCksdGhpcy5yb3RhdGlvbk1hdHJpeD1tYXQyLmNyZWF0ZSgpLG1hdDIucm90YXRlKHRoaXMucm90YXRpb25NYXRyaXgsdGhpcy5yb3RhdGlvbk1hdHJpeCx0aGlzLmFuZ2xlKSl9LHByb3RvdHlwZUFjY2Vzc29ycy5waXRjaC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGl0Y2gvTWF0aC5QSSoxODB9LHByb3RvdHlwZUFjY2Vzc29ycy5waXRjaC5zZXQ9ZnVuY3Rpb24odCl7dmFyIGk9dXRpbC5jbGFtcCh0LDAsNjApLzE4MCpNYXRoLlBJO3RoaXMuX3BpdGNoIT09aSYmKHRoaXMuX3VubW9kaWZpZWQ9ITEsdGhpcy5fcGl0Y2g9aSx0aGlzLl9jYWxjTWF0cmljZXMoKSl9LHByb3RvdHlwZUFjY2Vzc29ycy5mb3YuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Zvdi9NYXRoLlBJKjE4MH0scHJvdG90eXBlQWNjZXNzb3JzLmZvdi5zZXQ9ZnVuY3Rpb24odCl7dD1NYXRoLm1heCguMDEsTWF0aC5taW4oNjAsdCkpLHRoaXMuX2ZvdiE9PXQmJih0aGlzLl91bm1vZGlmaWVkPSExLHRoaXMuX2Zvdj10LzE4MCpNYXRoLlBJLHRoaXMuX2NhbGNNYXRyaWNlcygpKX0scHJvdG90eXBlQWNjZXNzb3JzLnpvb20uZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3pvb219LHByb3RvdHlwZUFjY2Vzc29ycy56b29tLnNldD1mdW5jdGlvbih0KXt2YXIgaT1NYXRoLm1pbihNYXRoLm1heCh0LHRoaXMubWluWm9vbSksdGhpcy5tYXhab29tKTt0aGlzLl96b29tIT09aSYmKHRoaXMuX3VubW9kaWZpZWQ9ITEsdGhpcy5fem9vbT1pLHRoaXMuc2NhbGU9dGhpcy56b29tU2NhbGUoaSksdGhpcy50aWxlWm9vbT1NYXRoLmZsb29yKGkpLHRoaXMuem9vbUZyYWN0aW9uPWktdGhpcy50aWxlWm9vbSx0aGlzLl9jb25zdHJhaW4oKSx0aGlzLl9jYWxjTWF0cmljZXMoKSl9LHByb3RvdHlwZUFjY2Vzc29ycy5jZW50ZXIuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NlbnRlcn0scHJvdG90eXBlQWNjZXNzb3JzLmNlbnRlci5zZXQ9ZnVuY3Rpb24odCl7dC5sYXQ9PT10aGlzLl9jZW50ZXIubGF0JiZ0LmxuZz09PXRoaXMuX2NlbnRlci5sbmd8fCh0aGlzLl91bm1vZGlmaWVkPSExLHRoaXMuX2NlbnRlcj10LHRoaXMuX2NvbnN0cmFpbigpLHRoaXMuX2NhbGNNYXRyaWNlcygpKX0sVHJhbnNmb3JtLnByb3RvdHlwZS5jb3ZlcmluZ1pvb21MZXZlbD1mdW5jdGlvbih0KXtyZXR1cm4odC5yb3VuZFpvb20/TWF0aC5yb3VuZDpNYXRoLmZsb29yKSh0aGlzLnpvb20rdGhpcy5zY2FsZVpvb20odGhpcy50aWxlU2l6ZS90LnRpbGVTaXplKSl9LFRyYW5zZm9ybS5wcm90b3R5cGUuZ2V0VmlzaWJsZVdyYXBwZWRDb29yZGluYXRlcz1mdW5jdGlvbih0KXtmb3IodmFyIGk9dGhpcy5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KDAsMCksMCksbz10aGlzLnBvaW50Q29vcmRpbmF0ZShuZXcgUG9pbnQodGhpcy53aWR0aCwwKSwwKSxlPU1hdGguZmxvb3IoaS5jb2x1bW4pLHI9TWF0aC5mbG9vcihvLmNvbHVtbiksbj1bdF0scz1lO3M8PXI7cysrKTAhPT1zJiZuLnB1c2gobmV3IFRpbGVDb29yZCh0LnosdC54LHQueSxzKSk7cmV0dXJuIG59LFRyYW5zZm9ybS5wcm90b3R5cGUuY292ZXJpbmdUaWxlcz1mdW5jdGlvbih0KXt2YXIgaT10aGlzLmNvdmVyaW5nWm9vbUxldmVsKHQpLG89aTtpZihpPHQubWluem9vbSlyZXR1cm5bXTtpPnQubWF4em9vbSYmKGk9dC5tYXh6b29tKTt2YXIgZT10aGlzLnBvaW50Q29vcmRpbmF0ZSh0aGlzLmNlbnRlclBvaW50LGkpLHI9bmV3IFBvaW50KGUuY29sdW1uLS41LGUucm93LS41KSxuPVt0aGlzLnBvaW50Q29vcmRpbmF0ZShuZXcgUG9pbnQoMCwwKSxpKSx0aGlzLnBvaW50Q29vcmRpbmF0ZShuZXcgUG9pbnQodGhpcy53aWR0aCwwKSxpKSx0aGlzLnBvaW50Q29vcmRpbmF0ZShuZXcgUG9pbnQodGhpcy53aWR0aCx0aGlzLmhlaWdodCksaSksdGhpcy5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KDAsdGhpcy5oZWlnaHQpLGkpXTtyZXR1cm4gVGlsZUNvb3JkLmNvdmVyKGksbix0LnJlcGFyc2VPdmVyc2NhbGVkP286aSx0aGlzLl9yZW5kZXJXb3JsZENvcGllcykuc29ydChmdW5jdGlvbih0LGkpe3JldHVybiByLmRpc3QodCktci5kaXN0KGkpfSl9LFRyYW5zZm9ybS5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKHQsaSl7dGhpcy53aWR0aD10LHRoaXMuaGVpZ2h0PWksdGhpcy5waXhlbHNUb0dMVW5pdHM9WzIvdCwtMi9pXSx0aGlzLl9jb25zdHJhaW4oKSx0aGlzLl9jYWxjTWF0cmljZXMoKX0scHJvdG90eXBlQWNjZXNzb3JzLnVubW9kaWZpZWQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VubW9kaWZpZWR9LFRyYW5zZm9ybS5wcm90b3R5cGUuem9vbVNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdygyLHQpfSxUcmFuc2Zvcm0ucHJvdG90eXBlLnNjYWxlWm9vbT1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5sb2codCkvTWF0aC5MTjJ9LFRyYW5zZm9ybS5wcm90b3R5cGUucHJvamVjdD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFBvaW50KHRoaXMubG5nWCh0LmxuZyksdGhpcy5sYXRZKHQubGF0KSl9LFRyYW5zZm9ybS5wcm90b3R5cGUudW5wcm9qZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgTG5nTGF0KHRoaXMueExuZyh0LngpLHRoaXMueUxhdCh0LnkpKX0scHJvdG90eXBlQWNjZXNzb3JzLnguZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG5nWCh0aGlzLmNlbnRlci5sbmcpfSxwcm90b3R5cGVBY2Nlc3NvcnMueS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXRZKHRoaXMuY2VudGVyLmxhdCl9LHByb3RvdHlwZUFjY2Vzc29ycy5wb2ludC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFBvaW50KHRoaXMueCx0aGlzLnkpfSxUcmFuc2Zvcm0ucHJvdG90eXBlLmxuZ1g9ZnVuY3Rpb24odCl7cmV0dXJuKDE4MCt0KSp0aGlzLndvcmxkU2l6ZS8zNjB9LFRyYW5zZm9ybS5wcm90b3R5cGUubGF0WT1mdW5jdGlvbih0KXt2YXIgaT0xODAvTWF0aC5QSSpNYXRoLmxvZyhNYXRoLnRhbihNYXRoLlBJLzQrdCpNYXRoLlBJLzM2MCkpO3JldHVybigxODAtaSkqdGhpcy53b3JsZFNpemUvMzYwfSxUcmFuc2Zvcm0ucHJvdG90eXBlLnhMbmc9ZnVuY3Rpb24odCl7cmV0dXJuIDM2MCp0L3RoaXMud29ybGRTaXplLTE4MH0sVHJhbnNmb3JtLnByb3RvdHlwZS55TGF0PWZ1bmN0aW9uKHQpe3ZhciBpPTE4MC0zNjAqdC90aGlzLndvcmxkU2l6ZTtyZXR1cm4gMzYwL01hdGguUEkqTWF0aC5hdGFuKE1hdGguZXhwKGkqTWF0aC5QSS8xODApKS05MH0sVHJhbnNmb3JtLnByb3RvdHlwZS5zZXRMb2NhdGlvbkF0UG9pbnQ9ZnVuY3Rpb24odCxpKXt2YXIgbz10aGlzLnBvaW50Q29vcmRpbmF0ZShpKS5fc3ViKHRoaXMucG9pbnRDb29yZGluYXRlKHRoaXMuY2VudGVyUG9pbnQpKTt0aGlzLmNlbnRlcj10aGlzLmNvb3JkaW5hdGVMb2NhdGlvbih0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZSh0KS5fc3ViKG8pKSx0aGlzLl9yZW5kZXJXb3JsZENvcGllcyYmKHRoaXMuY2VudGVyPXRoaXMuY2VudGVyLndyYXAoKSl9LFRyYW5zZm9ybS5wcm90b3R5cGUubG9jYXRpb25Qb2ludD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jb29yZGluYXRlUG9pbnQodGhpcy5sb2NhdGlvbkNvb3JkaW5hdGUodCkpfSxUcmFuc2Zvcm0ucHJvdG90eXBlLnBvaW50TG9jYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29vcmRpbmF0ZUxvY2F0aW9uKHRoaXMucG9pbnRDb29yZGluYXRlKHQpKX0sVHJhbnNmb3JtLnByb3RvdHlwZS5sb2NhdGlvbkNvb3JkaW5hdGU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBDb29yZGluYXRlKHRoaXMubG5nWCh0LmxuZykvdGhpcy50aWxlU2l6ZSx0aGlzLmxhdFkodC5sYXQpL3RoaXMudGlsZVNpemUsdGhpcy56b29tKS56b29tVG8odGhpcy50aWxlWm9vbSl9LFRyYW5zZm9ybS5wcm90b3R5cGUuY29vcmRpbmF0ZUxvY2F0aW9uPWZ1bmN0aW9uKHQpe3ZhciBpPXQuem9vbVRvKHRoaXMuem9vbSk7cmV0dXJuIG5ldyBMbmdMYXQodGhpcy54TG5nKGkuY29sdW1uKnRoaXMudGlsZVNpemUpLHRoaXMueUxhdChpLnJvdyp0aGlzLnRpbGVTaXplKSl9LFRyYW5zZm9ybS5wcm90b3R5cGUucG9pbnRDb29yZGluYXRlPWZ1bmN0aW9uKHQsaSl7dm9pZCAwPT09aSYmKGk9dGhpcy50aWxlWm9vbSk7dmFyIG89MCxlPVt0LngsdC55LDAsMV0scj1bdC54LHQueSwxLDFdO3ZlYzQudHJhbnNmb3JtTWF0NChlLGUsdGhpcy5waXhlbE1hdHJpeEludmVyc2UpLHZlYzQudHJhbnNmb3JtTWF0NChyLHIsdGhpcy5waXhlbE1hdHJpeEludmVyc2UpO3ZhciBuPWVbM10scz1yWzNdLGE9ZVswXS9uLGg9clswXS9zLGM9ZVsxXS9uLG09clsxXS9zLHA9ZVsyXS9uLGw9clsyXS9zLHU9cD09PWw/MDooby1wKS8obC1wKTtyZXR1cm4gbmV3IENvb3JkaW5hdGUoaW50ZXJwKGEsaCx1KS90aGlzLnRpbGVTaXplLGludGVycChjLG0sdSkvdGhpcy50aWxlU2l6ZSx0aGlzLnpvb20pLl96b29tVG8oaSl9LFRyYW5zZm9ybS5wcm90b3R5cGUuY29vcmRpbmF0ZVBvaW50PWZ1bmN0aW9uKHQpe3ZhciBpPXQuem9vbVRvKHRoaXMuem9vbSksbz1baS5jb2x1bW4qdGhpcy50aWxlU2l6ZSxpLnJvdyp0aGlzLnRpbGVTaXplLDAsMV07cmV0dXJuIHZlYzQudHJhbnNmb3JtTWF0NChvLG8sdGhpcy5waXhlbE1hdHJpeCksbmV3IFBvaW50KG9bMF0vb1szXSxvWzFdL29bM10pfSxUcmFuc2Zvcm0ucHJvdG90eXBlLmNhbGN1bGF0ZVBvc01hdHJpeD1mdW5jdGlvbih0LGkpe3ZhciBvPXQudG9Db29yZGluYXRlKGkpLGU9dGhpcy53b3JsZFNpemUvdGhpcy56b29tU2NhbGUoby56b29tKSxyPW1hdDQuaWRlbnRpdHkobmV3IEZsb2F0NjRBcnJheSgxNikpO3JldHVybiBtYXQ0LnRyYW5zbGF0ZShyLHIsW28uY29sdW1uKmUsby5yb3cqZSwwXSksbWF0NC5zY2FsZShyLHIsW2UvRVhURU5ULGUvRVhURU5ULDFdKSxtYXQ0Lm11bHRpcGx5KHIsdGhpcy5wcm9qTWF0cml4LHIpLG5ldyBGbG9hdDMyQXJyYXkocil9LFRyYW5zZm9ybS5wcm90b3R5cGUuX2NvbnN0cmFpbj1mdW5jdGlvbigpe2lmKHRoaXMuY2VudGVyJiZ0aGlzLndpZHRoJiZ0aGlzLmhlaWdodCYmIXRoaXMuX2NvbnN0cmFpbmluZyl7dGhpcy5fY29uc3RyYWluaW5nPSEwO3ZhciB0LGksbyxlLHI9LTkwLG49OTAscz0tMTgwLGE9MTgwLGg9dGhpcy5zaXplLGM9dGhpcy5fdW5tb2RpZmllZDtpZih0aGlzLmxhdFJhbmdlKXt2YXIgbT10aGlzLmxhdFJhbmdlO3I9dGhpcy5sYXRZKG1bMV0pLG49dGhpcy5sYXRZKG1bMF0pLHQ9bi1yPGgueT9oLnkvKG4tcik6MH1pZih0aGlzLmxuZ1JhbmdlKXt2YXIgcD10aGlzLmxuZ1JhbmdlO3M9dGhpcy5sbmdYKHBbMF0pLGE9dGhpcy5sbmdYKHBbMV0pLGk9YS1zPGgueD9oLngvKGEtcyk6MH12YXIgbD1NYXRoLm1heChpfHwwLHR8fDApO2lmKGwpcmV0dXJuIHRoaXMuY2VudGVyPXRoaXMudW5wcm9qZWN0KG5ldyBQb2ludChpPyhhK3MpLzI6dGhpcy54LHQ/KG4rcikvMjp0aGlzLnkpKSx0aGlzLnpvb20rPXRoaXMuc2NhbGVab29tKGwpLHRoaXMuX3VubW9kaWZpZWQ9Yyx2b2lkKHRoaXMuX2NvbnN0cmFpbmluZz0hMSk7aWYodGhpcy5sYXRSYW5nZSl7dmFyIHU9dGhpcy55LGY9aC55LzI7dS1mPHImJihlPXIrZiksdStmPm4mJihlPW4tZil9aWYodGhpcy5sbmdSYW5nZSl7dmFyIGQ9dGhpcy54LGc9aC54LzI7ZC1nPHMmJihvPXMrZyksZCtnPmEmJihvPWEtZyl9dm9pZCAwPT09byYmdm9pZCAwPT09ZXx8KHRoaXMuY2VudGVyPXRoaXMudW5wcm9qZWN0KG5ldyBQb2ludCh2b2lkIDAhPT1vP286dGhpcy54LHZvaWQgMCE9PWU/ZTp0aGlzLnkpKSksdGhpcy5fdW5tb2RpZmllZD1jLHRoaXMuX2NvbnN0cmFpbmluZz0hMX19LFRyYW5zZm9ybS5wcm90b3R5cGUuX2NhbGNNYXRyaWNlcz1mdW5jdGlvbigpe2lmKHRoaXMuaGVpZ2h0KXt0aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2U9LjUvTWF0aC50YW4odGhpcy5fZm92LzIpKnRoaXMuaGVpZ2h0O3ZhciB0PXRoaXMuX2Zvdi8yLGk9TWF0aC5QSS8yK3RoaXMuX3BpdGNoLG89TWF0aC5zaW4odCkqdGhpcy5jYW1lcmFUb0NlbnRlckRpc3RhbmNlL01hdGguc2luKE1hdGguUEktaS10KSxlPU1hdGguY29zKE1hdGguUEkvMi10aGlzLl9waXRjaCkqbyt0aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2Uscj0xLjAxKmUsbj1uZXcgRmxvYXQ2NEFycmF5KDE2KTttYXQ0LnBlcnNwZWN0aXZlKG4sdGhpcy5fZm92LHRoaXMud2lkdGgvdGhpcy5oZWlnaHQsMSxyKSxtYXQ0LnNjYWxlKG4sbixbMSwtMSwxXSksbWF0NC50cmFuc2xhdGUobixuLFswLDAsLXRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZV0pLG1hdDQucm90YXRlWChuLG4sdGhpcy5fcGl0Y2gpLG1hdDQucm90YXRlWihuLG4sdGhpcy5hbmdsZSksbWF0NC50cmFuc2xhdGUobixuLFstdGhpcy54LC10aGlzLnksMF0pO3ZhciBzPXRoaXMud29ybGRTaXplLygyKk1hdGguUEkqNjM3ODEzNypNYXRoLmFicyhNYXRoLmNvcyh0aGlzLmNlbnRlci5sYXQqKE1hdGguUEkvMTgwKSkpKTtpZihtYXQ0LnNjYWxlKG4sbixbMSwxLHMsMV0pLHRoaXMucHJvak1hdHJpeD1uLG49bWF0NC5jcmVhdGUoKSxtYXQ0LnNjYWxlKG4sbixbdGhpcy53aWR0aC8yLC10aGlzLmhlaWdodC8yLDFdKSxtYXQ0LnRyYW5zbGF0ZShuLG4sWzEsLTEsMF0pLHRoaXMucGl4ZWxNYXRyaXg9bWF0NC5tdWx0aXBseShuZXcgRmxvYXQ2NEFycmF5KDE2KSxuLHRoaXMucHJvak1hdHJpeCksbj1tYXQ0LmludmVydChuZXcgRmxvYXQ2NEFycmF5KDE2KSx0aGlzLnBpeGVsTWF0cml4KSwhbil0aHJvdyBuZXcgRXJyb3IoXCJmYWlsZWQgdG8gaW52ZXJ0IG1hdHJpeFwiKTt0aGlzLnBpeGVsTWF0cml4SW52ZXJzZT1ufX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoVHJhbnNmb3JtLnByb3RvdHlwZSxwcm90b3R5cGVBY2Nlc3NvcnMpLG1vZHVsZS5leHBvcnRzPVRyYW5zZm9ybTtcbn0se1wiLi4vZGF0YS9leHRlbnRcIjo1NCxcIi4uL3NvdXJjZS90aWxlX2Nvb3JkXCI6OTYsXCIuLi9zdHlsZS1zcGVjL3V0aWwvaW50ZXJwb2xhdGVcIjoxMjMsXCIuLi91dGlsL3V0aWxcIjoyMTUsXCIuL2Nvb3JkaW5hdGVcIjo2MSxcIi4vbG5nX2xhdFwiOjYyLFwiQG1hcGJveC9nbC1tYXRyaXhcIjoxLFwicG9pbnQtZ2VvbWV0cnlcIjoyNn1dLDY1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBicm93c2VyPV9kZXJlcV8oXCIuL3V0aWwvYnJvd3NlclwiKSxtYXBib3hnbD1tb2R1bGUuZXhwb3J0cz17fTttYXBib3hnbC52ZXJzaW9uPV9kZXJlcV8oXCIuLi9wYWNrYWdlLmpzb25cIikudmVyc2lvbixtYXBib3hnbC53b3JrZXJDb3VudD1NYXRoLm1heChNYXRoLmZsb29yKGJyb3dzZXIuaGFyZHdhcmVDb25jdXJyZW5jeS8yKSwxKSxtYXBib3hnbC5NYXA9X2RlcmVxXyhcIi4vdWkvbWFwXCIpLG1hcGJveGdsLk5hdmlnYXRpb25Db250cm9sPV9kZXJlcV8oXCIuL3VpL2NvbnRyb2wvbmF2aWdhdGlvbl9jb250cm9sXCIpLG1hcGJveGdsLkdlb2xvY2F0ZUNvbnRyb2w9X2RlcmVxXyhcIi4vdWkvY29udHJvbC9nZW9sb2NhdGVfY29udHJvbFwiKSxtYXBib3hnbC5BdHRyaWJ1dGlvbkNvbnRyb2w9X2RlcmVxXyhcIi4vdWkvY29udHJvbC9hdHRyaWJ1dGlvbl9jb250cm9sXCIpLG1hcGJveGdsLlNjYWxlQ29udHJvbD1fZGVyZXFfKFwiLi91aS9jb250cm9sL3NjYWxlX2NvbnRyb2xcIiksbWFwYm94Z2wuRnVsbHNjcmVlbkNvbnRyb2w9X2RlcmVxXyhcIi4vdWkvY29udHJvbC9mdWxsc2NyZWVuX2NvbnRyb2xcIiksbWFwYm94Z2wuUG9wdXA9X2RlcmVxXyhcIi4vdWkvcG9wdXBcIiksbWFwYm94Z2wuTWFya2VyPV9kZXJlcV8oXCIuL3VpL21hcmtlclwiKSxtYXBib3hnbC5TdHlsZT1fZGVyZXFfKFwiLi9zdHlsZS9zdHlsZVwiKSxtYXBib3hnbC5MbmdMYXQ9X2RlcmVxXyhcIi4vZ2VvL2xuZ19sYXRcIiksbWFwYm94Z2wuTG5nTGF0Qm91bmRzPV9kZXJlcV8oXCIuL2dlby9sbmdfbGF0X2JvdW5kc1wiKSxtYXBib3hnbC5Qb2ludD1fZGVyZXFfKFwicG9pbnQtZ2VvbWV0cnlcIiksbWFwYm94Z2wuRXZlbnRlZD1fZGVyZXFfKFwiLi91dGlsL2V2ZW50ZWRcIiksbWFwYm94Z2wuc3VwcG9ydGVkPV9kZXJlcV8oXCIuL3V0aWwvYnJvd3NlclwiKS5zdXBwb3J0ZWQ7dmFyIGNvbmZpZz1fZGVyZXFfKFwiLi91dGlsL2NvbmZpZ1wiKTttYXBib3hnbC5jb25maWc9Y29uZmlnO3ZhciBydGxUZXh0UGx1Z2luPV9kZXJlcV8oXCIuL3NvdXJjZS9ydGxfdGV4dF9wbHVnaW5cIik7bWFwYm94Z2wuc2V0UlRMVGV4dFBsdWdpbj1ydGxUZXh0UGx1Z2luLnNldFJUTFRleHRQbHVnaW4sT2JqZWN0LmRlZmluZVByb3BlcnR5KG1hcGJveGdsLFwiYWNjZXNzVG9rZW5cIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbmZpZy5BQ0NFU1NfVE9LRU59LHNldDpmdW5jdGlvbihvKXtjb25maWcuQUNDRVNTX1RPS0VOPW99fSk7XG59LHtcIi4uL3BhY2thZ2UuanNvblwiOjQzLFwiLi9nZW8vbG5nX2xhdFwiOjYyLFwiLi9nZW8vbG5nX2xhdF9ib3VuZHNcIjo2MyxcIi4vc291cmNlL3J0bF90ZXh0X3BsdWdpblwiOjkxLFwiLi9zdHlsZS9zdHlsZVwiOjE0OSxcIi4vdWkvY29udHJvbC9hdHRyaWJ1dGlvbl9jb250cm9sXCI6MTc2LFwiLi91aS9jb250cm9sL2Z1bGxzY3JlZW5fY29udHJvbFwiOjE3NyxcIi4vdWkvY29udHJvbC9nZW9sb2NhdGVfY29udHJvbFwiOjE3OCxcIi4vdWkvY29udHJvbC9uYXZpZ2F0aW9uX2NvbnRyb2xcIjoxODAsXCIuL3VpL2NvbnRyb2wvc2NhbGVfY29udHJvbFwiOjE4MSxcIi4vdWkvbWFwXCI6MTkwLFwiLi91aS9tYXJrZXJcIjoxOTEsXCIuL3VpL3BvcHVwXCI6MTkyLFwiLi91dGlsL2Jyb3dzZXJcIjoxOTUsXCIuL3V0aWwvY29uZmlnXCI6MTk5LFwiLi91dGlsL2V2ZW50ZWRcIjoyMDMsXCJwb2ludC1nZW9tZXRyeVwiOjI2fV0sNjY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZHJhd0JhY2tncm91bmQocix0LGUpe3ZhciBhPXIuZ2wsaT1yLnRyYW5zZm9ybSxuPWkudGlsZVNpemUsbz1lLnBhaW50W1wiYmFja2dyb3VuZC1jb2xvclwiXSxsPWUucGFpbnRbXCJiYWNrZ3JvdW5kLXBhdHRlcm5cIl0sdT1lLnBhaW50W1wiYmFja2dyb3VuZC1vcGFjaXR5XCJdLGY9IWwmJjE9PT1vWzNdJiYxPT09dTtpZihyLmlzT3BhcXVlUGFzcz09PWYpe2EuZGlzYWJsZShhLlNURU5DSUxfVEVTVCksci5zZXREZXB0aFN1YmxheWVyKDApO3ZhciBzO2w/KHM9ci51c2VQcm9ncmFtKFwiZmlsbFBhdHRlcm5cIixyLmJhc2ljRmlsbFByb2dyYW1Db25maWd1cmF0aW9uKSxwYXR0ZXJuLnByZXBhcmUobCxyLHMpLHIudGlsZUV4dGVudFBhdHRlcm5WQU8uYmluZChhLHMsci50aWxlRXh0ZW50QnVmZmVyKSk6KHM9ci51c2VQcm9ncmFtKFwiZmlsbFwiLHIuYmFzaWNGaWxsUHJvZ3JhbUNvbmZpZ3VyYXRpb24pLGEudW5pZm9ybTRmdihzLnVfY29sb3Isbyksci50aWxlRXh0ZW50VkFPLmJpbmQoYSxzLHIudGlsZUV4dGVudEJ1ZmZlcikpLGEudW5pZm9ybTFmKHMudV9vcGFjaXR5LHUpO2Zvcih2YXIgYz1pLmNvdmVyaW5nVGlsZXMoe3RpbGVTaXplOm59KSxnPTAscD1jO2c8cC5sZW5ndGg7Zys9MSl7dmFyIGQ9cFtnXTtsJiZwYXR0ZXJuLnNldFRpbGUoe2Nvb3JkOmQsdGlsZVNpemU6bn0scixzKSxhLnVuaWZvcm1NYXRyaXg0ZnYocy51X21hdHJpeCwhMSxyLnRyYW5zZm9ybS5jYWxjdWxhdGVQb3NNYXRyaXgoZCkpLGEuZHJhd0FycmF5cyhhLlRSSUFOR0xFX1NUUklQLDAsci50aWxlRXh0ZW50QnVmZmVyLmxlbmd0aCl9fX12YXIgcGF0dGVybj1fZGVyZXFfKFwiLi9wYXR0ZXJuXCIpO21vZHVsZS5leHBvcnRzPWRyYXdCYWNrZ3JvdW5kO1xufSx7XCIuL3BhdHRlcm5cIjo3OH1dLDY3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGRyYXdDaXJjbGVzKGUscix0LGEpe2lmKCFlLmlzT3BhcXVlUGFzcyl7dmFyIGk9ZS5nbDtlLnNldERlcHRoU3VibGF5ZXIoMCksZS5kZXB0aE1hc2soITEpLGkuZGlzYWJsZShpLlNURU5DSUxfVEVTVCk7Zm9yKHZhciBzPTA7czxhLmxlbmd0aDtzKyspe3ZhciBvPWFbc10sbj1yLmdldFRpbGUobyksZj1uLmdldEJ1Y2tldCh0KTtpZihmKXt2YXIgbD1mLmJ1ZmZlcnMsbT1sLmxheWVyRGF0YVt0LmlkXSx1PW0ucHJvZ3JhbUNvbmZpZ3VyYXRpb24sYz1lLnVzZVByb2dyYW0oXCJjaXJjbGVcIix1KTt1LnNldFVuaWZvcm1zKGksYyx0LHt6b29tOmUudHJhbnNmb3JtLnpvb219KSxcIm1hcFwiPT09dC5wYWludFtcImNpcmNsZS1waXRjaC1zY2FsZVwiXT8oaS51bmlmb3JtMWkoYy51X3NjYWxlX3dpdGhfbWFwLCEwKSxpLnVuaWZvcm0yZihjLnVfZXh0cnVkZV9zY2FsZSxlLnRyYW5zZm9ybS5waXhlbHNUb0dMVW5pdHNbMF0qZS50cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSxlLnRyYW5zZm9ybS5waXhlbHNUb0dMVW5pdHNbMV0qZS50cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSkpOihpLnVuaWZvcm0xaShjLnVfc2NhbGVfd2l0aF9tYXAsITEpLGkudW5pZm9ybTJmdihjLnVfZXh0cnVkZV9zY2FsZSxlLnRyYW5zZm9ybS5waXhlbHNUb0dMVW5pdHMpKSxpLnVuaWZvcm0xZihjLnVfZGV2aWNlcGl4ZWxyYXRpbyxicm93c2VyLmRldmljZVBpeGVsUmF0aW8pLGkudW5pZm9ybU1hdHJpeDRmdihjLnVfbWF0cml4LCExLGUudHJhbnNsYXRlUG9zTWF0cml4KG8ucG9zTWF0cml4LG4sdC5wYWludFtcImNpcmNsZS10cmFuc2xhdGVcIl0sdC5wYWludFtcImNpcmNsZS10cmFuc2xhdGUtYW5jaG9yXCJdKSk7Zm9yKHZhciBwPTAsdj1sLnNlZ21lbnRzO3A8di5sZW5ndGg7cCs9MSl7dmFyIHg9dltwXTt4LnZhb3NbdC5pZF0uYmluZChpLGMsbC5sYXlvdXRWZXJ0ZXhCdWZmZXIsbC5lbGVtZW50QnVmZmVyLG0ucGFpbnRWZXJ0ZXhCdWZmZXIseC52ZXJ0ZXhPZmZzZXQpLGkuZHJhd0VsZW1lbnRzKGkuVFJJQU5HTEVTLDMqeC5wcmltaXRpdmVMZW5ndGgsaS5VTlNJR05FRF9TSE9SVCwzKngucHJpbWl0aXZlT2Zmc2V0KjIpfX19fX12YXIgYnJvd3Nlcj1fZGVyZXFfKFwiLi4vdXRpbC9icm93c2VyXCIpO21vZHVsZS5leHBvcnRzPWRyYXdDaXJjbGVzO1xufSx7XCIuLi91dGlsL2Jyb3dzZXJcIjoxOTV9XSw2ODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBkcmF3Q29sbGlzaW9uRGVidWcoZSxvLHIsaSl7dmFyIHQ9ZS5nbDt0LmVuYWJsZSh0LlNURU5DSUxfVEVTVCk7Zm9yKHZhciBmPWUudXNlUHJvZ3JhbShcImNvbGxpc2lvbkJveFwiKSxsPTA7bDxpLmxlbmd0aDtsKyspe3ZhciBuPWlbbF0sYT1vLmdldFRpbGUobikscz1hLmdldEJ1Y2tldChyKTtpZihzKXt2YXIgdT1zLmJ1ZmZlcnMuY29sbGlzaW9uQm94O2lmKHUpe3QudW5pZm9ybU1hdHJpeDRmdihmLnVfbWF0cml4LCExLG4ucG9zTWF0cml4KSxlLmVuYWJsZVRpbGVDbGlwcGluZ01hc2sobiksZS5saW5lV2lkdGgoMSksdC51bmlmb3JtMWYoZi51X3NjYWxlLE1hdGgucG93KDIsZS50cmFuc2Zvcm0uem9vbS1hLmNvb3JkLnopKSx0LnVuaWZvcm0xZihmLnVfem9vbSwxMCplLnRyYW5zZm9ybS56b29tKSx0LnVuaWZvcm0xZihmLnVfbWF4em9vbSwxMCooYS5jb29yZC56KzEpKTtmb3IodmFyIG09MCxnPXUuc2VnbWVudHM7bTxnLmxlbmd0aDttKz0xKXt2YXIgdj1nW21dO3YudmFvc1tyLmlkXS5iaW5kKHQsZix1LmxheW91dFZlcnRleEJ1ZmZlcix1LmVsZW1lbnRCdWZmZXIsbnVsbCx2LnZlcnRleE9mZnNldCksdC5kcmF3RWxlbWVudHModC5MSU5FUywyKnYucHJpbWl0aXZlTGVuZ3RoLHQuVU5TSUdORURfU0hPUlQsMip2LnByaW1pdGl2ZU9mZnNldCoyKX19fX19bW9kdWxlLmV4cG9ydHM9ZHJhd0NvbGxpc2lvbkRlYnVnO1xufSx7fV0sNjk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZHJhd0RlYnVnKHIsZSxhKXtmb3IodmFyIHQ9MDt0PGEubGVuZ3RoO3QrKylkcmF3RGVidWdUaWxlKHIsZSxhW3RdKX1mdW5jdGlvbiBkcmF3RGVidWdUaWxlKHIsZSxhKXt2YXIgdD1yLmdsO3QuZGlzYWJsZSh0LlNURU5DSUxfVEVTVCksci5saW5lV2lkdGgoMSpicm93c2VyLmRldmljZVBpeGVsUmF0aW8pO3ZhciBpPWEucG9zTWF0cml4LHU9ci51c2VQcm9ncmFtKFwiZGVidWdcIik7dC51bmlmb3JtTWF0cml4NGZ2KHUudV9tYXRyaXgsITEsaSksdC51bmlmb3JtNGYodS51X2NvbG9yLDEsMCwwLDEpLHIuZGVidWdWQU8uYmluZCh0LHUsci5kZWJ1Z0J1ZmZlciksdC5kcmF3QXJyYXlzKHQuTElORV9TVFJJUCwwLHIuZGVidWdCdWZmZXIubGVuZ3RoKTtmb3IodmFyIG89Y3JlYXRlVGV4dFZlcnRpY2llcyhhLnRvU3RyaW5nKCksNTAsMjAwLDUpLGY9bmV3IFBvc0FycmF5LG49MDtuPG8ubGVuZ3RoO24rPTIpZi5lbXBsYWNlQmFjayhvW25dLG9bbisxXSk7dmFyIGw9QnVmZmVyLmZyb21TdHJ1Y3RBcnJheShmLEJ1ZmZlci5CdWZmZXJUeXBlLlZFUlRFWCksbT1uZXcgVmVydGV4QXJyYXlPYmplY3Q7bS5iaW5kKHQsdSxsKSx0LnVuaWZvcm00Zih1LnVfY29sb3IsMSwxLDEsMSk7Zm9yKHZhciBzPWUuZ2V0VGlsZShhKS50aWxlU2l6ZSxnPUVYVEVOVC8oTWF0aC5wb3coMixyLnRyYW5zZm9ybS56b29tLWEueikqcykseD1bWy0xLC0xXSxbLTEsMV0sWzEsLTFdLFsxLDFdXSxkPTA7ZDx4Lmxlbmd0aDtkKyspe3ZhciBiPXhbZF07dC51bmlmb3JtTWF0cml4NGZ2KHUudV9tYXRyaXgsITEsbWF0NC50cmFuc2xhdGUoW10saSxbZypiWzBdLGcqYlsxXSwwXSkpLHQuZHJhd0FycmF5cyh0LkxJTkVTLDAsbC5sZW5ndGgpfXQudW5pZm9ybTRmKHUudV9jb2xvciwwLDAsMCwxKSx0LnVuaWZvcm1NYXRyaXg0ZnYodS51X21hdHJpeCwhMSxpKSx0LmRyYXdBcnJheXModC5MSU5FUywwLGwubGVuZ3RoKX1mdW5jdGlvbiBjcmVhdGVUZXh0VmVydGljaWVzKHIsZSxhLHQpe3Q9dHx8MTt2YXIgaSx1LG8sZixuLGwsbSxzLGc9W107Zm9yKGk9MCx1PXIubGVuZ3RoO2k8dTtpKyspaWYobj1zaW1wbGV4Rm9udFtyW2ldXSl7Zm9yKHM9bnVsbCxvPTAsZj1uWzFdLmxlbmd0aDtvPGY7bys9MiluWzFdW29dPT09LTEmJm5bMV1bbysxXT09PS0xP3M9bnVsbDoobD1lK25bMV1bb10qdCxtPWEtblsxXVtvKzFdKnQscyYmZy5wdXNoKHMueCxzLnksbCxtKSxzPXt4OmwseTptfSk7ZSs9blswXSp0fXJldHVybiBnfXZhciBicm93c2VyPV9kZXJlcV8oXCIuLi91dGlsL2Jyb3dzZXJcIiksbWF0ND1fZGVyZXFfKFwiQG1hcGJveC9nbC1tYXRyaXhcIikubWF0NCxFWFRFTlQ9X2RlcmVxXyhcIi4uL2RhdGEvZXh0ZW50XCIpLEJ1ZmZlcj1fZGVyZXFfKFwiLi4vZGF0YS9idWZmZXJcIiksVmVydGV4QXJyYXlPYmplY3Q9X2RlcmVxXyhcIi4vdmVydGV4X2FycmF5X29iamVjdFwiKSxQb3NBcnJheT1fZGVyZXFfKFwiLi4vZGF0YS9wb3NfYXJyYXlcIik7bW9kdWxlLmV4cG9ydHM9ZHJhd0RlYnVnO3ZhciBzaW1wbGV4Rm9udD17XCIgXCI6WzE2LFtdXSxcIiFcIjpbMTAsWzUsMjEsNSw3LC0xLC0xLDUsMiw0LDEsNSwwLDYsMSw1LDJdXSwnXCInOlsxNixbNCwyMSw0LDE0LC0xLC0xLDEyLDIxLDEyLDE0XV0sXCIjXCI6WzIxLFsxMSwyNSw0LC03LC0xLC0xLDE3LDI1LDEwLC03LC0xLC0xLDQsMTIsMTgsMTIsLTEsLTEsMyw2LDE3LDZdXSwkOlsyMCxbOCwyNSw4LC00LC0xLC0xLDEyLDI1LDEyLC00LC0xLC0xLDE3LDE4LDE1LDIwLDEyLDIxLDgsMjEsNSwyMCwzLDE4LDMsMTYsNCwxNCw1LDEzLDcsMTIsMTMsMTAsMTUsOSwxNiw4LDE3LDYsMTcsMywxNSwxLDEyLDAsOCwwLDUsMSwzLDNdXSxcIiVcIjpbMjQsWzIxLDIxLDMsMCwtMSwtMSw4LDIxLDEwLDE5LDEwLDE3LDksMTUsNywxNCw1LDE0LDMsMTYsMywxOCw0LDIwLDYsMjEsOCwyMSwxMCwyMCwxMywxOSwxNiwxOSwxOSwyMCwyMSwyMSwtMSwtMSwxNyw3LDE1LDYsMTQsNCwxNCwyLDE2LDAsMTgsMCwyMCwxLDIxLDMsMjEsNSwxOSw3LDE3LDddXSxcIiZcIjpbMjYsWzIzLDEyLDIzLDEzLDIyLDE0LDIxLDE0LDIwLDEzLDE5LDExLDE3LDYsMTUsMywxMywxLDExLDAsNywwLDUsMSw0LDIsMyw0LDMsNiw0LDgsNSw5LDEyLDEzLDEzLDE0LDE0LDE2LDE0LDE4LDEzLDIwLDExLDIxLDksMjAsOCwxOCw4LDE2LDksMTMsMTEsMTAsMTYsMywxOCwxLDIwLDAsMjIsMCwyMywxLDIzLDJdXSxcIidcIjpbMTAsWzUsMTksNCwyMCw1LDIxLDYsMjAsNiwxOCw1LDE2LDQsMTVdXSxcIihcIjpbMTQsWzExLDI1LDksMjMsNywyMCw1LDE2LDQsMTEsNCw3LDUsMiw3LC0yLDksLTUsMTEsLTddXSxcIilcIjpbMTQsWzMsMjUsNSwyMyw3LDIwLDksMTYsMTAsMTEsMTAsNyw5LDIsNywtMiw1LC01LDMsLTddXSxcIipcIjpbMTYsWzgsMjEsOCw5LC0xLC0xLDMsMTgsMTMsMTIsLTEsLTEsMTMsMTgsMywxMl1dLFwiK1wiOlsyNixbMTMsMTgsMTMsMCwtMSwtMSw0LDksMjIsOV1dLFwiLFwiOlsxMCxbNiwxLDUsMCw0LDEsNSwyLDYsMSw2LC0xLDUsLTMsNCwtNF1dLFwiLVwiOlsyNixbNCw5LDIyLDldXSxcIi5cIjpbMTAsWzUsMiw0LDEsNSwwLDYsMSw1LDJdXSxcIi9cIjpbMjIsWzIwLDI1LDIsLTddXSwwOlsyMCxbOSwyMSw2LDIwLDQsMTcsMywxMiwzLDksNCw0LDYsMSw5LDAsMTEsMCwxNCwxLDE2LDQsMTcsOSwxNywxMiwxNiwxNywxNCwyMCwxMSwyMSw5LDIxXV0sMTpbMjAsWzYsMTcsOCwxOCwxMSwyMSwxMSwwXV0sMjpbMjAsWzQsMTYsNCwxNyw1LDE5LDYsMjAsOCwyMSwxMiwyMSwxNCwyMCwxNSwxOSwxNiwxNywxNiwxNSwxNSwxMywxMywxMCwzLDAsMTcsMF1dLDM6WzIwLFs1LDIxLDE2LDIxLDEwLDEzLDEzLDEzLDE1LDEyLDE2LDExLDE3LDgsMTcsNiwxNiwzLDE0LDEsMTEsMCw4LDAsNSwxLDQsMiwzLDRdXSw0OlsyMCxbMTMsMjEsMyw3LDE4LDcsLTEsLTEsMTMsMjEsMTMsMF1dLDU6WzIwLFsxNSwyMSw1LDIxLDQsMTIsNSwxMyw4LDE0LDExLDE0LDE0LDEzLDE2LDExLDE3LDgsMTcsNiwxNiwzLDE0LDEsMTEsMCw4LDAsNSwxLDQsMiwzLDRdXSw2OlsyMCxbMTYsMTgsMTUsMjAsMTIsMjEsMTAsMjEsNywyMCw1LDE3LDQsMTIsNCw3LDUsMyw3LDEsMTAsMCwxMSwwLDE0LDEsMTYsMywxNyw2LDE3LDcsMTYsMTAsMTQsMTIsMTEsMTMsMTAsMTMsNywxMiw1LDEwLDQsN11dLDc6WzIwLFsxNywyMSw3LDAsLTEsLTEsMywyMSwxNywyMV1dLDg6WzIwLFs4LDIxLDUsMjAsNCwxOCw0LDE2LDUsMTQsNywxMywxMSwxMiwxNCwxMSwxNiw5LDE3LDcsMTcsNCwxNiwyLDE1LDEsMTIsMCw4LDAsNSwxLDQsMiwzLDQsMyw3LDQsOSw2LDExLDksMTIsMTMsMTMsMTUsMTQsMTYsMTYsMTYsMTgsMTUsMjAsMTIsMjEsOCwyMV1dLDk6WzIwLFsxNiwxNCwxNSwxMSwxMyw5LDEwLDgsOSw4LDYsOSw0LDExLDMsMTQsMywxNSw0LDE4LDYsMjAsOSwyMSwxMCwyMSwxMywyMCwxNSwxOCwxNiwxNCwxNiw5LDE1LDQsMTMsMSwxMCwwLDgsMCw1LDEsNCwzXV0sXCI6XCI6WzEwLFs1LDE0LDQsMTMsNSwxMiw2LDEzLDUsMTQsLTEsLTEsNSwyLDQsMSw1LDAsNiwxLDUsMl1dLFwiO1wiOlsxMCxbNSwxNCw0LDEzLDUsMTIsNiwxMyw1LDE0LC0xLC0xLDYsMSw1LDAsNCwxLDUsMiw2LDEsNiwtMSw1LC0zLDQsLTRdXSxcIjxcIjpbMjQsWzIwLDE4LDQsOSwyMCwwXV0sXCI9XCI6WzI2LFs0LDEyLDIyLDEyLC0xLC0xLDQsNiwyMiw2XV0sXCI+XCI6WzI0LFs0LDE4LDIwLDksNCwwXV0sXCI/XCI6WzE4LFszLDE2LDMsMTcsNCwxOSw1LDIwLDcsMjEsMTEsMjEsMTMsMjAsMTQsMTksMTUsMTcsMTUsMTUsMTQsMTMsMTMsMTIsOSwxMCw5LDcsLTEsLTEsOSwyLDgsMSw5LDAsMTAsMSw5LDJdXSxcIkBcIjpbMjcsWzE4LDEzLDE3LDE1LDE1LDE2LDEyLDE2LDEwLDE1LDksMTQsOCwxMSw4LDgsOSw2LDExLDUsMTQsNSwxNiw2LDE3LDgsLTEsLTEsMTIsMTYsMTAsMTQsOSwxMSw5LDgsMTAsNiwxMSw1LC0xLC0xLDE4LDE2LDE3LDgsMTcsNiwxOSw1LDIxLDUsMjMsNywyNCwxMCwyNCwxMiwyMywxNSwyMiwxNywyMCwxOSwxOCwyMCwxNSwyMSwxMiwyMSw5LDIwLDcsMTksNSwxNyw0LDE1LDMsMTIsMyw5LDQsNiw1LDQsNywyLDksMSwxMiwwLDE1LDAsMTgsMSwyMCwyLDIxLDMsLTEsLTEsMTksMTYsMTgsOCwxOCw2LDE5LDVdXSxBOlsxOCxbOSwyMSwxLDAsLTEsLTEsOSwyMSwxNywwLC0xLC0xLDQsNywxNCw3XV0sQjpbMjEsWzQsMjEsNCwwLC0xLC0xLDQsMjEsMTMsMjEsMTYsMjAsMTcsMTksMTgsMTcsMTgsMTUsMTcsMTMsMTYsMTIsMTMsMTEsLTEsLTEsNCwxMSwxMywxMSwxNiwxMCwxNyw5LDE4LDcsMTgsNCwxNywyLDE2LDEsMTMsMCw0LDBdXSxDOlsyMSxbMTgsMTYsMTcsMTgsMTUsMjAsMTMsMjEsOSwyMSw3LDIwLDUsMTgsNCwxNiwzLDEzLDMsOCw0LDUsNSwzLDcsMSw5LDAsMTMsMCwxNSwxLDE3LDMsMTgsNV1dLEQ6WzIxLFs0LDIxLDQsMCwtMSwtMSw0LDIxLDExLDIxLDE0LDIwLDE2LDE4LDE3LDE2LDE4LDEzLDE4LDgsMTcsNSwxNiwzLDE0LDEsMTEsMCw0LDBdXSxFOlsxOSxbNCwyMSw0LDAsLTEsLTEsNCwyMSwxNywyMSwtMSwtMSw0LDExLDEyLDExLC0xLC0xLDQsMCwxNywwXV0sRjpbMTgsWzQsMjEsNCwwLC0xLC0xLDQsMjEsMTcsMjEsLTEsLTEsNCwxMSwxMiwxMV1dLEc6WzIxLFsxOCwxNiwxNywxOCwxNSwyMCwxMywyMSw5LDIxLDcsMjAsNSwxOCw0LDE2LDMsMTMsMyw4LDQsNSw1LDMsNywxLDksMCwxMywwLDE1LDEsMTcsMywxOCw1LDE4LDgsLTEsLTEsMTMsOCwxOCw4XV0sSDpbMjIsWzQsMjEsNCwwLC0xLC0xLDE4LDIxLDE4LDAsLTEsLTEsNCwxMSwxOCwxMV1dLEk6WzgsWzQsMjEsNCwwXV0sSjpbMTYsWzEyLDIxLDEyLDUsMTEsMiwxMCwxLDgsMCw2LDAsNCwxLDMsMiwyLDUsMiw3XV0sSzpbMjEsWzQsMjEsNCwwLC0xLC0xLDE4LDIxLDQsNywtMSwtMSw5LDEyLDE4LDBdXSxMOlsxNyxbNCwyMSw0LDAsLTEsLTEsNCwwLDE2LDBdXSxNOlsyNCxbNCwyMSw0LDAsLTEsLTEsNCwyMSwxMiwwLC0xLC0xLDIwLDIxLDEyLDAsLTEsLTEsMjAsMjEsMjAsMF1dLE46WzIyLFs0LDIxLDQsMCwtMSwtMSw0LDIxLDE4LDAsLTEsLTEsMTgsMjEsMTgsMF1dLE86WzIyLFs5LDIxLDcsMjAsNSwxOCw0LDE2LDMsMTMsMyw4LDQsNSw1LDMsNywxLDksMCwxMywwLDE1LDEsMTcsMywxOCw1LDE5LDgsMTksMTMsMTgsMTYsMTcsMTgsMTUsMjAsMTMsMjEsOSwyMV1dLFA6WzIxLFs0LDIxLDQsMCwtMSwtMSw0LDIxLDEzLDIxLDE2LDIwLDE3LDE5LDE4LDE3LDE4LDE0LDE3LDEyLDE2LDExLDEzLDEwLDQsMTBdXSxROlsyMixbOSwyMSw3LDIwLDUsMTgsNCwxNiwzLDEzLDMsOCw0LDUsNSwzLDcsMSw5LDAsMTMsMCwxNSwxLDE3LDMsMTgsNSwxOSw4LDE5LDEzLDE4LDE2LDE3LDE4LDE1LDIwLDEzLDIxLDksMjEsLTEsLTEsMTIsNCwxOCwtMl1dLFI6WzIxLFs0LDIxLDQsMCwtMSwtMSw0LDIxLDEzLDIxLDE2LDIwLDE3LDE5LDE4LDE3LDE4LDE1LDE3LDEzLDE2LDEyLDEzLDExLDQsMTEsLTEsLTEsMTEsMTEsMTgsMF1dLFM6WzIwLFsxNywxOCwxNSwyMCwxMiwyMSw4LDIxLDUsMjAsMywxOCwzLDE2LDQsMTQsNSwxMyw3LDEyLDEzLDEwLDE1LDksMTYsOCwxNyw2LDE3LDMsMTUsMSwxMiwwLDgsMCw1LDEsMywzXV0sVDpbMTYsWzgsMjEsOCwwLC0xLC0xLDEsMjEsMTUsMjFdXSxVOlsyMixbNCwyMSw0LDYsNSwzLDcsMSwxMCwwLDEyLDAsMTUsMSwxNywzLDE4LDYsMTgsMjFdXSxWOlsxOCxbMSwyMSw5LDAsLTEsLTEsMTcsMjEsOSwwXV0sVzpbMjQsWzIsMjEsNywwLC0xLC0xLDEyLDIxLDcsMCwtMSwtMSwxMiwyMSwxNywwLC0xLC0xLDIyLDIxLDE3LDBdXSxYOlsyMCxbMywyMSwxNywwLC0xLC0xLDE3LDIxLDMsMF1dLFk6WzE4LFsxLDIxLDksMTEsOSwwLC0xLC0xLDE3LDIxLDksMTFdXSxaOlsyMCxbMTcsMjEsMywwLC0xLC0xLDMsMjEsMTcsMjEsLTEsLTEsMywwLDE3LDBdXSxcIltcIjpbMTQsWzQsMjUsNCwtNywtMSwtMSw1LDI1LDUsLTcsLTEsLTEsNCwyNSwxMSwyNSwtMSwtMSw0LC03LDExLC03XV0sXCJcXFxcXCI6WzE0LFswLDIxLDE0LC0zXV0sXCJdXCI6WzE0LFs5LDI1LDksLTcsLTEsLTEsMTAsMjUsMTAsLTcsLTEsLTEsMywyNSwxMCwyNSwtMSwtMSwzLC03LDEwLC03XV0sXCJeXCI6WzE2LFs2LDE1LDgsMTgsMTAsMTUsLTEsLTEsMywxMiw4LDE3LDEzLDEyLC0xLC0xLDgsMTcsOCwwXV0sXzpbMTYsWzAsLTIsMTYsLTJdXSxcImBcIjpbMTAsWzYsMjEsNSwyMCw0LDE4LDQsMTYsNSwxNSw2LDE2LDUsMTddXSxhOlsxOSxbMTUsMTQsMTUsMCwtMSwtMSwxNSwxMSwxMywxMywxMSwxNCw4LDE0LDYsMTMsNCwxMSwzLDgsMyw2LDQsMyw2LDEsOCwwLDExLDAsMTMsMSwxNSwzXV0sYjpbMTksWzQsMjEsNCwwLC0xLC0xLDQsMTEsNiwxMyw4LDE0LDExLDE0LDEzLDEzLDE1LDExLDE2LDgsMTYsNiwxNSwzLDEzLDEsMTEsMCw4LDAsNiwxLDQsM11dLGM6WzE4LFsxNSwxMSwxMywxMywxMSwxNCw4LDE0LDYsMTMsNCwxMSwzLDgsMyw2LDQsMyw2LDEsOCwwLDExLDAsMTMsMSwxNSwzXV0sZDpbMTksWzE1LDIxLDE1LDAsLTEsLTEsMTUsMTEsMTMsMTMsMTEsMTQsOCwxNCw2LDEzLDQsMTEsMyw4LDMsNiw0LDMsNiwxLDgsMCwxMSwwLDEzLDEsMTUsM11dLGU6WzE4LFszLDgsMTUsOCwxNSwxMCwxNCwxMiwxMywxMywxMSwxNCw4LDE0LDYsMTMsNCwxMSwzLDgsMyw2LDQsMyw2LDEsOCwwLDExLDAsMTMsMSwxNSwzXV0sZjpbMTIsWzEwLDIxLDgsMjEsNiwyMCw1LDE3LDUsMCwtMSwtMSwyLDE0LDksMTRdXSxnOlsxOSxbMTUsMTQsMTUsLTIsMTQsLTUsMTMsLTYsMTEsLTcsOCwtNyw2LC02LC0xLC0xLDE1LDExLDEzLDEzLDExLDE0LDgsMTQsNiwxMyw0LDExLDMsOCwzLDYsNCwzLDYsMSw4LDAsMTEsMCwxMywxLDE1LDNdXSxoOlsxOSxbNCwyMSw0LDAsLTEsLTEsNCwxMCw3LDEzLDksMTQsMTIsMTQsMTQsMTMsMTUsMTAsMTUsMF1dLGk6WzgsWzMsMjEsNCwyMCw1LDIxLDQsMjIsMywyMSwtMSwtMSw0LDE0LDQsMF1dLGo6WzEwLFs1LDIxLDYsMjAsNywyMSw2LDIyLDUsMjEsLTEsLTEsNiwxNCw2LC0zLDUsLTYsMywtNywxLC03XV0sazpbMTcsWzQsMjEsNCwwLC0xLC0xLDE0LDE0LDQsNCwtMSwtMSw4LDgsMTUsMF1dLGw6WzgsWzQsMjEsNCwwXV0sbTpbMzAsWzQsMTQsNCwwLC0xLC0xLDQsMTAsNywxMyw5LDE0LDEyLDE0LDE0LDEzLDE1LDEwLDE1LDAsLTEsLTEsMTUsMTAsMTgsMTMsMjAsMTQsMjMsMTQsMjUsMTMsMjYsMTAsMjYsMF1dLG46WzE5LFs0LDE0LDQsMCwtMSwtMSw0LDEwLDcsMTMsOSwxNCwxMiwxNCwxNCwxMywxNSwxMCwxNSwwXV0sbzpbMTksWzgsMTQsNiwxMyw0LDExLDMsOCwzLDYsNCwzLDYsMSw4LDAsMTEsMCwxMywxLDE1LDMsMTYsNiwxNiw4LDE1LDExLDEzLDEzLDExLDE0LDgsMTRdXSxwOlsxOSxbNCwxNCw0LC03LC0xLC0xLDQsMTEsNiwxMyw4LDE0LDExLDE0LDEzLDEzLDE1LDExLDE2LDgsMTYsNiwxNSwzLDEzLDEsMTEsMCw4LDAsNiwxLDQsM11dLHE6WzE5LFsxNSwxNCwxNSwtNywtMSwtMSwxNSwxMSwxMywxMywxMSwxNCw4LDE0LDYsMTMsNCwxMSwzLDgsMyw2LDQsMyw2LDEsOCwwLDExLDAsMTMsMSwxNSwzXV0scjpbMTMsWzQsMTQsNCwwLC0xLC0xLDQsOCw1LDExLDcsMTMsOSwxNCwxMiwxNF1dLHM6WzE3LFsxNCwxMSwxMywxMywxMCwxNCw3LDE0LDQsMTMsMywxMSw0LDksNiw4LDExLDcsMTMsNiwxNCw0LDE0LDMsMTMsMSwxMCwwLDcsMCw0LDEsMywzXV0sdDpbMTIsWzUsMjEsNSw0LDYsMSw4LDAsMTAsMCwtMSwtMSwyLDE0LDksMTRdXSx1OlsxOSxbNCwxNCw0LDQsNSwxLDcsMCwxMCwwLDEyLDEsMTUsNCwtMSwtMSwxNSwxNCwxNSwwXV0sdjpbMTYsWzIsMTQsOCwwLC0xLC0xLDE0LDE0LDgsMF1dLHc6WzIyLFszLDE0LDcsMCwtMSwtMSwxMSwxNCw3LDAsLTEsLTEsMTEsMTQsMTUsMCwtMSwtMSwxOSwxNCwxNSwwXV0seDpbMTcsWzMsMTQsMTQsMCwtMSwtMSwxNCwxNCwzLDBdXSx5OlsxNixbMiwxNCw4LDAsLTEsLTEsMTQsMTQsOCwwLDYsLTQsNCwtNiwyLC03LDEsLTddXSx6OlsxNyxbMTQsMTQsMywwLC0xLC0xLDMsMTQsMTQsMTQsLTEsLTEsMywwLDE0LDBdXSxcIntcIjpbMTQsWzksMjUsNywyNCw2LDIzLDUsMjEsNSwxOSw2LDE3LDcsMTYsOCwxNCw4LDEyLDYsMTAsLTEsLTEsNywyNCw2LDIyLDYsMjAsNywxOCw4LDE3LDksMTUsOSwxMyw4LDExLDQsOSw4LDcsOSw1LDksMyw4LDEsNywwLDYsLTIsNiwtNCw3LC02LC0xLC0xLDYsOCw4LDYsOCw0LDcsMiw2LDEsNSwtMSw1LC0zLDYsLTUsNywtNiw5LC03XV0sXCJ8XCI6WzgsWzQsMjUsNCwtN11dLFwifVwiOlsxNCxbNSwyNSw3LDI0LDgsMjMsOSwyMSw5LDE5LDgsMTcsNywxNiw2LDE0LDYsMTIsOCwxMCwtMSwtMSw3LDI0LDgsMjIsOCwyMCw3LDE4LDYsMTcsNSwxNSw1LDEzLDYsMTEsMTAsOSw2LDcsNSw1LDUsMyw2LDEsNywwLDgsLTIsOCwtNCw3LC02LC0xLC0xLDgsOCw2LDYsNiw0LDcsMiw4LDEsOSwtMSw5LC0zLDgsLTUsNywtNiw1LC03XV0sXCJ+XCI6WzI0LFszLDYsMyw4LDQsMTEsNiwxMiw4LDEyLDEwLDExLDE0LDgsMTYsNywxOCw3LDIwLDgsMjEsMTAsLTEsLTEsMyw4LDQsMTAsNiwxMSw4LDExLDEwLDEwLDE0LDcsMTYsNiwxOCw2LDIwLDcsMjEsMTAsMjEsMTJdXX07XG59LHtcIi4uL2RhdGEvYnVmZmVyXCI6NTEsXCIuLi9kYXRhL2V4dGVudFwiOjU0LFwiLi4vZGF0YS9wb3NfYXJyYXlcIjo1NyxcIi4uL3V0aWwvYnJvd3NlclwiOjE5NSxcIi4vdmVydGV4X2FycmF5X29iamVjdFwiOjgwLFwiQG1hcGJveC9nbC1tYXRyaXhcIjoxfV0sNzA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZHJhd0ZpbGwodCxlLHIsaSl7dmFyIGE9dC5nbDthLmVuYWJsZShhLlNURU5DSUxfVEVTVCk7dmFyIGw9IXIucGFpbnRbXCJmaWxsLXBhdHRlcm5cIl0mJnIuaXNQYWludFZhbHVlRmVhdHVyZUNvbnN0YW50KFwiZmlsbC1jb2xvclwiKSYmci5pc1BhaW50VmFsdWVGZWF0dXJlQ29uc3RhbnQoXCJmaWxsLW9wYWNpdHlcIikmJjE9PT1yLnBhaW50W1wiZmlsbC1jb2xvclwiXVszXSYmMT09PXIucGFpbnRbXCJmaWxsLW9wYWNpdHlcIl07dC5pc09wYXF1ZVBhc3M9PT1sJiYodC5zZXREZXB0aFN1YmxheWVyKDEpLGRyYXdGaWxsVGlsZXModCxlLHIsaSxkcmF3RmlsbFRpbGUpKSwhdC5pc09wYXF1ZVBhc3MmJnIucGFpbnRbXCJmaWxsLWFudGlhbGlhc1wiXSYmKHQubGluZVdpZHRoKDIpLHQuZGVwdGhNYXNrKCExKSx0LnNldERlcHRoU3VibGF5ZXIoci5nZXRQYWludFByb3BlcnR5KFwiZmlsbC1vdXRsaW5lLWNvbG9yXCIpPzI6MCksZHJhd0ZpbGxUaWxlcyh0LGUscixpLGRyYXdTdHJva2VUaWxlKSl9ZnVuY3Rpb24gZHJhd0ZpbGxUaWxlcyh0LGUscixpLGEpe2Zvcih2YXIgbD0hMCxuPTAsbz1pO248by5sZW5ndGg7bis9MSl7dmFyIGY9b1tuXSxzPWUuZ2V0VGlsZShmKSx1PXMuZ2V0QnVja2V0KHIpO3UmJih0LmVuYWJsZVRpbGVDbGlwcGluZ01hc2soZiksYSh0LGUscixzLGYsdS5idWZmZXJzLGwpLGw9ITEpfX1mdW5jdGlvbiBkcmF3RmlsbFRpbGUodCxlLHIsaSxhLGwsbil7Zm9yKHZhciBvPXQuZ2wsZj1sLmxheWVyRGF0YVtyLmlkXSxzPXNldEZpbGxQcm9ncmFtKFwiZmlsbFwiLHIucGFpbnRbXCJmaWxsLXBhdHRlcm5cIl0sdCxmLHIsaSxhLG4pLHU9MCxwPWwuc2VnbWVudHM7dTxwLmxlbmd0aDt1Kz0xKXt2YXIgZz1wW3VdO2cudmFvc1tyLmlkXS5iaW5kKG8scyxsLmxheW91dFZlcnRleEJ1ZmZlcixsLmVsZW1lbnRCdWZmZXIsZi5wYWludFZlcnRleEJ1ZmZlcixnLnZlcnRleE9mZnNldCksby5kcmF3RWxlbWVudHMoby5UUklBTkdMRVMsMypnLnByaW1pdGl2ZUxlbmd0aCxvLlVOU0lHTkVEX1NIT1JULDMqZy5wcmltaXRpdmVPZmZzZXQqMil9fWZ1bmN0aW9uIGRyYXdTdHJva2VUaWxlKHQsZSxyLGksYSxsLG4pe3ZhciBvPXQuZ2wsZj1sLmxheWVyRGF0YVtyLmlkXSxzPXIucGFpbnRbXCJmaWxsLXBhdHRlcm5cIl0mJiFyLmdldFBhaW50UHJvcGVydHkoXCJmaWxsLW91dGxpbmUtY29sb3JcIiksdT1zZXRGaWxsUHJvZ3JhbShcImZpbGxPdXRsaW5lXCIscyx0LGYscixpLGEsbik7by51bmlmb3JtMmYodS51X3dvcmxkLG8uZHJhd2luZ0J1ZmZlcldpZHRoLG8uZHJhd2luZ0J1ZmZlckhlaWdodCk7Zm9yKHZhciBwPTAsZz1sLnNlZ21lbnRzMjtwPGcubGVuZ3RoO3ArPTEpe3ZhciBtPWdbcF07bS52YW9zW3IuaWRdLmJpbmQobyx1LGwubGF5b3V0VmVydGV4QnVmZmVyLGwuZWxlbWVudEJ1ZmZlcjIsZi5wYWludFZlcnRleEJ1ZmZlcixtLnZlcnRleE9mZnNldCksby5kcmF3RWxlbWVudHMoby5MSU5FUywyKm0ucHJpbWl0aXZlTGVuZ3RoLG8uVU5TSUdORURfU0hPUlQsMiptLnByaW1pdGl2ZU9mZnNldCoyKX19ZnVuY3Rpb24gc2V0RmlsbFByb2dyYW0odCxlLHIsaSxhLGwsbixvKXt2YXIgZixzPXIuY3VycmVudFByb2dyYW07cmV0dXJuIGU/KGY9ci51c2VQcm9ncmFtKHQrXCJQYXR0ZXJuXCIsaS5wcm9ncmFtQ29uZmlndXJhdGlvbiksKG98fGYhPT1zKSYmKGkucHJvZ3JhbUNvbmZpZ3VyYXRpb24uc2V0VW5pZm9ybXMoci5nbCxmLGEse3pvb206ci50cmFuc2Zvcm0uem9vbX0pLHBhdHRlcm4ucHJlcGFyZShhLnBhaW50W1wiZmlsbC1wYXR0ZXJuXCJdLHIsZikpLHBhdHRlcm4uc2V0VGlsZShsLHIsZikpOihmPXIudXNlUHJvZ3JhbSh0LGkucHJvZ3JhbUNvbmZpZ3VyYXRpb24pLChvfHxmIT09cykmJmkucHJvZ3JhbUNvbmZpZ3VyYXRpb24uc2V0VW5pZm9ybXMoci5nbCxmLGEse3pvb206ci50cmFuc2Zvcm0uem9vbX0pKSxyLmdsLnVuaWZvcm1NYXRyaXg0ZnYoZi51X21hdHJpeCwhMSxyLnRyYW5zbGF0ZVBvc01hdHJpeChuLnBvc01hdHJpeCxsLGEucGFpbnRbXCJmaWxsLXRyYW5zbGF0ZVwiXSxhLnBhaW50W1wiZmlsbC10cmFuc2xhdGUtYW5jaG9yXCJdKSksZn12YXIgcGF0dGVybj1fZGVyZXFfKFwiLi9wYXR0ZXJuXCIpO21vZHVsZS5leHBvcnRzPWRyYXdGaWxsO1xufSx7XCIuL3BhdHRlcm5cIjo3OH1dLDcxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGRyYXcodCxlLHIsaSl7aWYoMCE9PXIucGFpbnRbXCJmaWxsLWV4dHJ1c2lvbi1vcGFjaXR5XCJdKXt2YXIgYT10LmdsO2EuZGlzYWJsZShhLlNURU5DSUxfVEVTVCksYS5lbmFibGUoYS5ERVBUSF9URVNUKSx0LmRlcHRoTWFzayghMCk7dmFyIHM9bmV3IEV4dHJ1c2lvblRleHR1cmUoYSx0LHIpO3MuYmluZEZyYW1lYnVmZmVyKCksYS5jbGVhckNvbG9yKDAsMCwwLDApLGEuY2xlYXIoYS5DT0xPUl9CVUZGRVJfQklUfGEuREVQVEhfQlVGRkVSX0JJVCk7Zm9yKHZhciB1PTA7dTxpLmxlbmd0aDt1KyspZHJhd0V4dHJ1c2lvbih0LGUscixpW3VdKTtzLnVuYmluZEZyYW1lYnVmZmVyKCkscy5yZW5kZXJUb01hcCgpfX1mdW5jdGlvbiBFeHRydXNpb25UZXh0dXJlKHQsZSxyKXt0aGlzLmdsPXQsdGhpcy53aWR0aD1lLndpZHRoLHRoaXMuaGVpZ2h0PWUuaGVpZ2h0LHRoaXMucGFpbnRlcj1lLHRoaXMubGF5ZXI9cix0aGlzLnRleHR1cmU9bnVsbCx0aGlzLmZibz1udWxsLHRoaXMuZmJvcz10aGlzLnBhaW50ZXIucHJlRmJvc1t0aGlzLndpZHRoXSYmdGhpcy5wYWludGVyLnByZUZib3NbdGhpcy53aWR0aF1bdGhpcy5oZWlnaHRdfWZ1bmN0aW9uIGRyYXdFeHRydXNpb24odCxlLHIsaSl7aWYoIXQuaXNPcGFxdWVQYXNzKXt2YXIgYT1lLmdldFRpbGUoaSkscz1hLmdldEJ1Y2tldChyKTtpZihzKXt2YXIgdT1zLmJ1ZmZlcnMsZj10LmdsLG49ci5wYWludFtcImZpbGwtZXh0cnVzaW9uLXBhdHRlcm5cIl0sbz11LmxheWVyRGF0YVtyLmlkXSxoPW8ucHJvZ3JhbUNvbmZpZ3VyYXRpb24sRT10LnVzZVByb2dyYW0obj9cImZpbGxFeHRydXNpb25QYXR0ZXJuXCI6XCJmaWxsRXh0cnVzaW9uXCIsaCk7aC5zZXRVbmlmb3JtcyhmLEUscix7em9vbTp0LnRyYW5zZm9ybS56b29tfSksbiYmKHBhdHRlcm4ucHJlcGFyZShuLHQsRSkscGF0dGVybi5zZXRUaWxlKGEsdCxFKSxmLnVuaWZvcm0xZihFLnVfaGVpZ2h0X2ZhY3RvciwtTWF0aC5wb3coMixpLnopL2EudGlsZVNpemUvOCkpLHQuZ2wudW5pZm9ybU1hdHJpeDRmdihFLnVfbWF0cml4LCExLHQudHJhbnNsYXRlUG9zTWF0cml4KGkucG9zTWF0cml4LGEsci5wYWludFtcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZVwiXSxyLnBhaW50W1wiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlLWFuY2hvclwiXSkpLHNldExpZ2h0KEUsdCk7Zm9yKHZhciBUPTAsbD11LnNlZ21lbnRzO1Q8bC5sZW5ndGg7VCs9MSl7dmFyIHg9bFtUXTt4LnZhb3Nbci5pZF0uYmluZChmLEUsdS5sYXlvdXRWZXJ0ZXhCdWZmZXIsdS5lbGVtZW50QnVmZmVyLG8ucGFpbnRWZXJ0ZXhCdWZmZXIseC52ZXJ0ZXhPZmZzZXQpLGYuZHJhd0VsZW1lbnRzKGYuVFJJQU5HTEVTLDMqeC5wcmltaXRpdmVMZW5ndGgsZi5VTlNJR05FRF9TSE9SVCwzKngucHJpbWl0aXZlT2Zmc2V0KjIpfX19fWZ1bmN0aW9uIHNldExpZ2h0KHQsZSl7dmFyIHI9ZS5nbCxpPWUuc3R5bGUubGlnaHQsYT1pLmNhbGN1bGF0ZWQucG9zaXRpb24scz1bYS54LGEueSxhLnpdLHU9bWF0My5jcmVhdGUoKTtcInZpZXdwb3J0XCI9PT1pLmNhbGN1bGF0ZWQuYW5jaG9yJiZtYXQzLmZyb21Sb3RhdGlvbih1LC1lLnRyYW5zZm9ybS5hbmdsZSksdmVjMy50cmFuc2Zvcm1NYXQzKHMscyx1KSxyLnVuaWZvcm0zZnYodC51X2xpZ2h0cG9zLHMpLHIudW5pZm9ybTFmKHQudV9saWdodGludGVuc2l0eSxpLmNhbGN1bGF0ZWQuaW50ZW5zaXR5KSxyLnVuaWZvcm0zZnYodC51X2xpZ2h0Y29sb3IsaS5jYWxjdWxhdGVkLmNvbG9yLnNsaWNlKDAsMykpfXZhciBnbE1hdHJpeD1fZGVyZXFfKFwiQG1hcGJveC9nbC1tYXRyaXhcIiksQnVmZmVyPV9kZXJlcV8oXCIuLi9kYXRhL2J1ZmZlclwiKSxWZXJ0ZXhBcnJheU9iamVjdD1fZGVyZXFfKFwiLi92ZXJ0ZXhfYXJyYXlfb2JqZWN0XCIpLFBvc0FycmF5PV9kZXJlcV8oXCIuLi9kYXRhL3Bvc19hcnJheVwiKSxwYXR0ZXJuPV9kZXJlcV8oXCIuL3BhdHRlcm5cIiksbWF0Mz1nbE1hdHJpeC5tYXQzLG1hdDQ9Z2xNYXRyaXgubWF0NCx2ZWMzPWdsTWF0cml4LnZlYzM7bW9kdWxlLmV4cG9ydHM9ZHJhdyxFeHRydXNpb25UZXh0dXJlLnByb3RvdHlwZS5iaW5kRnJhbWVidWZmZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdsO2lmKHRoaXMudGV4dHVyZT10aGlzLnBhaW50ZXIuZ2V0Vmlld3BvcnRUZXh0dXJlKHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLHQuYWN0aXZlVGV4dHVyZSh0LlRFWFRVUkUxKSx0aGlzLnRleHR1cmU/dC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsdGhpcy50ZXh0dXJlKToodGhpcy50ZXh0dXJlPXQuY3JlYXRlVGV4dHVyZSgpLHQuYmluZFRleHR1cmUodC5URVhUVVJFXzJELHRoaXMudGV4dHVyZSksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfV1JBUF9TLHQuQ0xBTVBfVE9fRURHRSksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfV1JBUF9ULHQuQ0xBTVBfVE9fRURHRSksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUlOX0ZJTFRFUix0LkxJTkVBUiksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUFHX0ZJTFRFUix0LkxJTkVBUiksdC50ZXhJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLHQuUkdCQSx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0LDAsdC5SR0JBLHQuVU5TSUdORURfQllURSxudWxsKSx0aGlzLnRleHR1cmUud2lkdGg9dGhpcy53aWR0aCx0aGlzLnRleHR1cmUuaGVpZ2h0PXRoaXMuaGVpZ2h0KSx0aGlzLmZib3MpdGhpcy5mYm89dGhpcy5mYm9zLnBvcCgpLHQuYmluZEZyYW1lYnVmZmVyKHQuRlJBTUVCVUZGRVIsdGhpcy5mYm8pLHQuZnJhbWVidWZmZXJUZXh0dXJlMkQodC5GUkFNRUJVRkZFUix0LkNPTE9SX0FUVEFDSE1FTlQwLHQuVEVYVFVSRV8yRCx0aGlzLnRleHR1cmUsMCk7ZWxzZXt0aGlzLmZibz10LmNyZWF0ZUZyYW1lYnVmZmVyKCksdC5iaW5kRnJhbWVidWZmZXIodC5GUkFNRUJVRkZFUix0aGlzLmZibyk7dmFyIGU9dC5jcmVhdGVSZW5kZXJidWZmZXIoKTt0LmJpbmRSZW5kZXJidWZmZXIodC5SRU5ERVJCVUZGRVIsZSksdC5yZW5kZXJidWZmZXJTdG9yYWdlKHQuUkVOREVSQlVGRkVSLHQuREVQVEhfQ09NUE9ORU5UMTYsdGhpcy53aWR0aCx0aGlzLmhlaWdodCksdC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcih0LkZSQU1FQlVGRkVSLHQuREVQVEhfQVRUQUNITUVOVCx0LlJFTkRFUkJVRkZFUixlKSx0LmZyYW1lYnVmZmVyVGV4dHVyZTJEKHQuRlJBTUVCVUZGRVIsdC5DT0xPUl9BVFRBQ0hNRU5UMCx0LlRFWFRVUkVfMkQsdGhpcy50ZXh0dXJlLDApfX0sRXh0cnVzaW9uVGV4dHVyZS5wcm90b3R5cGUudW5iaW5kRnJhbWVidWZmZXI9ZnVuY3Rpb24oKXt0aGlzLnBhaW50ZXIuYmluZERlZmF1bHRGcmFtZWJ1ZmZlcigpLHRoaXMuZmJvcz90aGlzLmZib3MucHVzaCh0aGlzLmZibyk6KHRoaXMucGFpbnRlci5wcmVGYm9zW3RoaXMud2lkdGhdfHwodGhpcy5wYWludGVyLnByZUZib3NbdGhpcy53aWR0aF09e30pLHRoaXMucGFpbnRlci5wcmVGYm9zW3RoaXMud2lkdGhdW3RoaXMuaGVpZ2h0XT1bdGhpcy5mYm9dKSx0aGlzLnBhaW50ZXIuc2F2ZVZpZXdwb3J0VGV4dHVyZSh0aGlzLnRleHR1cmUpfSxFeHRydXNpb25UZXh0dXJlLnByb3RvdHlwZS5yZW5kZXJUb01hcD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2wsZT10aGlzLnBhaW50ZXIscj1lLnVzZVByb2dyYW0oXCJleHRydXNpb25UZXh0dXJlXCIpO3QuYWN0aXZlVGV4dHVyZSh0LlRFWFRVUkUwKSx0LmJpbmRUZXh0dXJlKHQuVEVYVFVSRV8yRCx0aGlzLnRleHR1cmUpLHQudW5pZm9ybTFmKHIudV9vcGFjaXR5LHRoaXMubGF5ZXIucGFpbnRbXCJmaWxsLWV4dHJ1c2lvbi1vcGFjaXR5XCJdKSx0LnVuaWZvcm0xaShyLnVfaW1hZ2UsMSksdC51bmlmb3JtTWF0cml4NGZ2KHIudV9tYXRyaXgsITEsbWF0NC5vcnRobyhtYXQ0LmNyZWF0ZSgpLDAsZS53aWR0aCxlLmhlaWdodCwwLDAsMSkpLHQuZGlzYWJsZSh0LkRFUFRIX1RFU1QpLHQudW5pZm9ybTJmKHIudV93b3JsZCx0LmRyYXdpbmdCdWZmZXJXaWR0aCx0LmRyYXdpbmdCdWZmZXJIZWlnaHQpO3ZhciBpPW5ldyBQb3NBcnJheTtpLmVtcGxhY2VCYWNrKDAsMCksaS5lbXBsYWNlQmFjaygxLDApLGkuZW1wbGFjZUJhY2soMCwxKSxpLmVtcGxhY2VCYWNrKDEsMSk7dmFyIGE9QnVmZmVyLmZyb21TdHJ1Y3RBcnJheShpLEJ1ZmZlci5CdWZmZXJUeXBlLlZFUlRFWCkscz1uZXcgVmVydGV4QXJyYXlPYmplY3Q7cy5iaW5kKHQscixhKSx0LmRyYXdBcnJheXModC5UUklBTkdMRV9TVFJJUCwwLDQpLHQuZW5hYmxlKHQuREVQVEhfVEVTVCl9O1xufSx7XCIuLi9kYXRhL2J1ZmZlclwiOjUxLFwiLi4vZGF0YS9wb3NfYXJyYXlcIjo1NyxcIi4vcGF0dGVyblwiOjc4LFwiLi92ZXJ0ZXhfYXJyYXlfb2JqZWN0XCI6ODAsXCJAbWFwYm94L2dsLW1hdHJpeFwiOjF9XSw3MjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBkcmF3TGluZVRpbGUoZSxpLHQscixhLG4sbyxmLHMpe3ZhciBsLHUsbSxfLHA9aS5nbCxnPWEucGFpbnRbXCJsaW5lLWRhc2hhcnJheVwiXSxkPWEucGFpbnRbXCJsaW5lLXBhdHRlcm5cIl07aWYoZnx8cyl7dmFyIHY9MS9waXhlbHNUb1RpbGVVbml0cyh0LDEsaS50cmFuc2Zvcm0udGlsZVpvb20pO2lmKGcpe2w9aS5saW5lQXRsYXMuZ2V0RGFzaChnLmZyb20sXCJyb3VuZFwiPT09YS5sYXlvdXRbXCJsaW5lLWNhcFwiXSksdT1pLmxpbmVBdGxhcy5nZXREYXNoKGcudG8sXCJyb3VuZFwiPT09YS5sYXlvdXRbXCJsaW5lLWNhcFwiXSk7dmFyIFQ9bC53aWR0aCpnLmZyb21TY2FsZSxoPXUud2lkdGgqZy50b1NjYWxlO3AudW5pZm9ybTJmKGUudV9wYXR0ZXJuc2NhbGVfYSx2L1QsLWwuaGVpZ2h0LzIpLHAudW5pZm9ybTJmKGUudV9wYXR0ZXJuc2NhbGVfYix2L2gsLXUuaGVpZ2h0LzIpLHAudW5pZm9ybTFmKGUudV9zZGZnYW1tYSxpLmxpbmVBdGxhcy53aWR0aC8oMjU2Kk1hdGgubWluKFQsaCkqYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvKS8yKX1lbHNlIGlmKGQpe2lmKG09aS5zcHJpdGVBdGxhcy5nZXRQb3NpdGlvbihkLmZyb20sITApLF89aS5zcHJpdGVBdGxhcy5nZXRQb3NpdGlvbihkLnRvLCEwKSwhbXx8IV8pcmV0dXJuO3AudW5pZm9ybTJmKGUudV9wYXR0ZXJuX3NpemVfYSxtLnNpemVbMF0qZC5mcm9tU2NhbGUvdixfLnNpemVbMV0pLHAudW5pZm9ybTJmKGUudV9wYXR0ZXJuX3NpemVfYixfLnNpemVbMF0qZC50b1NjYWxlL3YsXy5zaXplWzFdKX1wLnVuaWZvcm0yZihlLnVfZ2xfdW5pdHNfdG9fcGl4ZWxzLDEvaS50cmFuc2Zvcm0ucGl4ZWxzVG9HTFVuaXRzWzBdLDEvaS50cmFuc2Zvcm0ucGl4ZWxzVG9HTFVuaXRzWzFdKX1mJiYoZz8ocC51bmlmb3JtMWkoZS51X2ltYWdlLDApLHAuYWN0aXZlVGV4dHVyZShwLlRFWFRVUkUwKSxpLmxpbmVBdGxhcy5iaW5kKHApLHAudW5pZm9ybTFmKGUudV90ZXhfeV9hLGwueSkscC51bmlmb3JtMWYoZS51X3RleF95X2IsdS55KSxwLnVuaWZvcm0xZihlLnVfbWl4LGcudCkpOmQmJihwLnVuaWZvcm0xaShlLnVfaW1hZ2UsMCkscC5hY3RpdmVUZXh0dXJlKHAuVEVYVFVSRTApLGkuc3ByaXRlQXRsYXMuYmluZChwLCEwKSxwLnVuaWZvcm0yZnYoZS51X3BhdHRlcm5fdGxfYSxtLnRsKSxwLnVuaWZvcm0yZnYoZS51X3BhdHRlcm5fYnJfYSxtLmJyKSxwLnVuaWZvcm0yZnYoZS51X3BhdHRlcm5fdGxfYixfLnRsKSxwLnVuaWZvcm0yZnYoZS51X3BhdHRlcm5fYnJfYixfLmJyKSxwLnVuaWZvcm0xZihlLnVfZmFkZSxkLnQpKSxwLnVuaWZvcm0xZihlLnVfd2lkdGgsYS5wYWludFtcImxpbmUtd2lkdGhcIl0pKSxpLmVuYWJsZVRpbGVDbGlwcGluZ01hc2sobik7dmFyIHg9aS50cmFuc2xhdGVQb3NNYXRyaXgobi5wb3NNYXRyaXgsdCxhLnBhaW50W1wibGluZS10cmFuc2xhdGVcIl0sYS5wYWludFtcImxpbmUtdHJhbnNsYXRlLWFuY2hvclwiXSk7cC51bmlmb3JtTWF0cml4NGZ2KGUudV9tYXRyaXgsITEseCkscC51bmlmb3JtMWYoZS51X3JhdGlvLDEvcGl4ZWxzVG9UaWxlVW5pdHModCwxLGkudHJhbnNmb3JtLnpvb20pKTtmb3IodmFyIGI9MCxjPXIuc2VnbWVudHM7YjxjLmxlbmd0aDtiKz0xKXt2YXIgdz1jW2JdO3cudmFvc1thLmlkXS5iaW5kKHAsZSxyLmxheW91dFZlcnRleEJ1ZmZlcixyLmVsZW1lbnRCdWZmZXIsby5wYWludFZlcnRleEJ1ZmZlcix3LnZlcnRleE9mZnNldCkscC5kcmF3RWxlbWVudHMocC5UUklBTkdMRVMsMyp3LnByaW1pdGl2ZUxlbmd0aCxwLlVOU0lHTkVEX1NIT1JULDMqdy5wcmltaXRpdmVPZmZzZXQqMil9fXZhciBicm93c2VyPV9kZXJlcV8oXCIuLi91dGlsL2Jyb3dzZXJcIikscGl4ZWxzVG9UaWxlVW5pdHM9X2RlcmVxXyhcIi4uL3NvdXJjZS9waXhlbHNfdG9fdGlsZV91bml0c1wiKTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihlLGksdCxyKXtpZighZS5pc09wYXF1ZVBhc3Mpe2Uuc2V0RGVwdGhTdWJsYXllcigwKSxlLmRlcHRoTWFzayghMSk7dmFyIGE9ZS5nbDtpZihhLmVuYWJsZShhLlNURU5DSUxfVEVTVCksISh0LnBhaW50W1wibGluZS13aWR0aFwiXTw9MCkpZm9yKHZhciBuLG89dC5wYWludFtcImxpbmUtZGFzaGFycmF5XCJdP1wibGluZVNERlwiOnQucGFpbnRbXCJsaW5lLXBhdHRlcm5cIl0/XCJsaW5lUGF0dGVyblwiOlwibGluZVwiLGY9ITAscz0wLGw9cjtzPGwubGVuZ3RoO3MrPTEpe3ZhciB1PWxbc10sbT1pLmdldFRpbGUodSksXz1tLmdldEJ1Y2tldCh0KTtpZihfKXt2YXIgcD1fLmJ1ZmZlcnMubGF5ZXJEYXRhW3QuaWRdLGc9ZS5jdXJyZW50UHJvZ3JhbSxkPWUudXNlUHJvZ3JhbShvLHAucHJvZ3JhbUNvbmZpZ3VyYXRpb24pLHY9Znx8ZCE9PWcsVD1uIT09bS5jb29yZC56O3YmJnAucHJvZ3JhbUNvbmZpZ3VyYXRpb24uc2V0VW5pZm9ybXMoZS5nbCxkLHQse3pvb206ZS50cmFuc2Zvcm0uem9vbX0pLGRyYXdMaW5lVGlsZShkLGUsbSxfLmJ1ZmZlcnMsdCx1LHAsdixUKSxuPW0uY29vcmQueixmPSExfX19fTtcbn0se1wiLi4vc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzXCI6ODgsXCIuLi91dGlsL2Jyb3dzZXJcIjoxOTV9XSw3MzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBkcmF3UmFzdGVyKHIsdCxlLGEpe2lmKCFyLmlzT3BhcXVlUGFzcyl7dmFyIGk9ci5nbDtpLmVuYWJsZShpLkRFUFRIX1RFU1QpLHIuZGVwdGhNYXNrKCEwKSxpLmRlcHRoRnVuYyhpLkxFU1MpO2Zvcih2YXIgbz1hLmxlbmd0aCYmYVswXS56LG49MDtuPGEubGVuZ3RoO24rKyl7dmFyIHU9YVtuXTtyLnNldERlcHRoU3VibGF5ZXIodS56LW8pLGRyYXdSYXN0ZXJUaWxlKHIsdCxlLHUpfWkuZGVwdGhGdW5jKGkuTEVRVUFMKX19ZnVuY3Rpb24gZHJhd1Jhc3RlclRpbGUocix0LGUsYSl7dmFyIGk9ci5nbDtpLmRpc2FibGUoaS5TVEVOQ0lMX1RFU1QpO3ZhciBvPXQuZ2V0VGlsZShhKSxuPXIudHJhbnNmb3JtLmNhbGN1bGF0ZVBvc01hdHJpeChhLHQuZ2V0U291cmNlKCkubWF4em9vbSk7by5yZWdpc3RlckZhZGVEdXJhdGlvbihyLnN0eWxlLmFuaW1hdGlvbkxvb3AsZS5wYWludFtcInJhc3Rlci1mYWRlLWR1cmF0aW9uXCJdKTt2YXIgdT1yLnVzZVByb2dyYW0oXCJyYXN0ZXJcIik7aS51bmlmb3JtTWF0cml4NGZ2KHUudV9tYXRyaXgsITEsbiksaS51bmlmb3JtMWYodS51X2JyaWdodG5lc3NfbG93LGUucGFpbnRbXCJyYXN0ZXItYnJpZ2h0bmVzcy1taW5cIl0pLGkudW5pZm9ybTFmKHUudV9icmlnaHRuZXNzX2hpZ2gsZS5wYWludFtcInJhc3Rlci1icmlnaHRuZXNzLW1heFwiXSksaS51bmlmb3JtMWYodS51X3NhdHVyYXRpb25fZmFjdG9yLHNhdHVyYXRpb25GYWN0b3IoZS5wYWludFtcInJhc3Rlci1zYXR1cmF0aW9uXCJdKSksaS51bmlmb3JtMWYodS51X2NvbnRyYXN0X2ZhY3Rvcixjb250cmFzdEZhY3RvcihlLnBhaW50W1wicmFzdGVyLWNvbnRyYXN0XCJdKSksaS51bmlmb3JtM2Z2KHUudV9zcGluX3dlaWdodHMsc3BpbldlaWdodHMoZS5wYWludFtcInJhc3Rlci1odWUtcm90YXRlXCJdKSk7dmFyIHMsYyxmPW8uc291cmNlQ2FjaGUmJm8uc291cmNlQ2FjaGUuZmluZExvYWRlZFBhcmVudChhLDAse30pLGQ9Z2V0RmFkZVZhbHVlcyhvLGYsZSxyLnRyYW5zZm9ybSk7aS5hY3RpdmVUZXh0dXJlKGkuVEVYVFVSRTApLGkuYmluZFRleHR1cmUoaS5URVhUVVJFXzJELG8udGV4dHVyZSksaS5hY3RpdmVUZXh0dXJlKGkuVEVYVFVSRTEpLGY/KGkuYmluZFRleHR1cmUoaS5URVhUVVJFXzJELGYudGV4dHVyZSkscz1NYXRoLnBvdygyLGYuY29vcmQuei1vLmNvb3JkLnopLGM9W28uY29vcmQueCpzJTEsby5jb29yZC55KnMlMV0pOmkuYmluZFRleHR1cmUoaS5URVhUVVJFXzJELG8udGV4dHVyZSksaS51bmlmb3JtMmZ2KHUudV90bF9wYXJlbnQsY3x8WzAsMF0pLGkudW5pZm9ybTFmKHUudV9zY2FsZV9wYXJlbnQsc3x8MSksaS51bmlmb3JtMWYodS51X2J1ZmZlcl9zY2FsZSwxKSxpLnVuaWZvcm0xZih1LnVfZmFkZV90LGQubWl4KSxpLnVuaWZvcm0xZih1LnVfb3BhY2l0eSxkLm9wYWNpdHkqZS5wYWludFtcInJhc3Rlci1vcGFjaXR5XCJdKSxpLnVuaWZvcm0xaSh1LnVfaW1hZ2UwLDApLGkudW5pZm9ybTFpKHUudV9pbWFnZTEsMSk7dmFyIG09by5ib3VuZHNCdWZmZXJ8fHIucmFzdGVyQm91bmRzQnVmZmVyLHA9by5ib3VuZHNWQU98fHIucmFzdGVyQm91bmRzVkFPO3AuYmluZChpLHUsbSksaS5kcmF3QXJyYXlzKGkuVFJJQU5HTEVfU1RSSVAsMCxtLmxlbmd0aCl9ZnVuY3Rpb24gc3BpbldlaWdodHMocil7cio9TWF0aC5QSS8xODA7dmFyIHQ9TWF0aC5zaW4ociksZT1NYXRoLmNvcyhyKTtyZXR1cm5bKDIqZSsxKS8zLCgtTWF0aC5zcXJ0KDMpKnQtZSsxKS8zLChNYXRoLnNxcnQoMykqdC1lKzEpLzNdfWZ1bmN0aW9uIGNvbnRyYXN0RmFjdG9yKHIpe3JldHVybiByPjA/MS8oMS1yKToxK3J9ZnVuY3Rpb24gc2F0dXJhdGlvbkZhY3RvcihyKXtyZXR1cm4gcj4wPzEtMS8oMS4wMDEtcik6LXJ9ZnVuY3Rpb24gZ2V0RmFkZVZhbHVlcyhyLHQsZSxhKXt2YXIgaT1lLnBhaW50W1wicmFzdGVyLWZhZGUtZHVyYXRpb25cIl07aWYoci5zb3VyY2VDYWNoZSYmaT4wKXt2YXIgbz1EYXRlLm5vdygpLG49KG8tci50aW1lQWRkZWQpL2ksdT10PyhvLXQudGltZUFkZGVkKS9pOi0xLHM9ci5zb3VyY2VDYWNoZS5nZXRTb3VyY2UoKSxjPWEuY292ZXJpbmdab29tTGV2ZWwoe3RpbGVTaXplOnMudGlsZVNpemUscm91bmRab29tOnMucm91bmRab29tfSksZj0hdHx8TWF0aC5hYnModC5jb29yZC56LWMpPk1hdGguYWJzKHIuY29vcmQuei1jKSxkPWYmJnIucmVmcmVzaGVkVXBvbkV4cGlyYXRpb24/MTp1dGlsLmNsYW1wKGY/bjoxLXUsMCwxKTtyZXR1cm4gci5yZWZyZXNoZWRVcG9uRXhwaXJhdGlvbiYmbj49MSYmKHIucmVmcmVzaGVkVXBvbkV4cGlyYXRpb249ITEpLHQ/e29wYWNpdHk6MSxtaXg6MS1kfTp7b3BhY2l0eTpkLG1peDowfX1yZXR1cm57b3BhY2l0eToxLG1peDowfX12YXIgdXRpbD1fZGVyZXFfKFwiLi4vdXRpbC91dGlsXCIpO21vZHVsZS5leHBvcnRzPWRyYXdSYXN0ZXI7XG59LHtcIi4uL3V0aWwvdXRpbFwiOjIxNX1dLDc0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGRyYXdTeW1ib2xzKHQsZSxpLG8pe2lmKCF0LmlzT3BhcXVlUGFzcyl7dmFyIGE9IShpLmxheW91dFtcInRleHQtYWxsb3ctb3ZlcmxhcFwiXXx8aS5sYXlvdXRbXCJpY29uLWFsbG93LW92ZXJsYXBcIl18fGkubGF5b3V0W1widGV4dC1pZ25vcmUtcGxhY2VtZW50XCJdfHxpLmxheW91dFtcImljb24taWdub3JlLXBsYWNlbWVudFwiXSksbj10LmdsO2E/bi5kaXNhYmxlKG4uU1RFTkNJTF9URVNUKTpuLmVuYWJsZShuLlNURU5DSUxfVEVTVCksdC5zZXREZXB0aFN1YmxheWVyKDApLHQuZGVwdGhNYXNrKCExKSxkcmF3TGF5ZXJTeW1ib2xzKHQsZSxpLG8sITEsaS5wYWludFtcImljb24tdHJhbnNsYXRlXCJdLGkucGFpbnRbXCJpY29uLXRyYW5zbGF0ZS1hbmNob3JcIl0saS5sYXlvdXRbXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiXSxpLmxheW91dFtcImljb24tcm90YXRpb24tYWxpZ25tZW50XCJdKSxkcmF3TGF5ZXJTeW1ib2xzKHQsZSxpLG8sITAsaS5wYWludFtcInRleHQtdHJhbnNsYXRlXCJdLGkucGFpbnRbXCJ0ZXh0LXRyYW5zbGF0ZS1hbmNob3JcIl0saS5sYXlvdXRbXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiXSxpLmxheW91dFtcInRleHQtcGl0Y2gtYWxpZ25tZW50XCJdKSxlLm1hcC5zaG93Q29sbGlzaW9uQm94ZXMmJmRyYXdDb2xsaXNpb25EZWJ1Zyh0LGUsaSxvKX19ZnVuY3Rpb24gZHJhd0xheWVyU3ltYm9scyh0LGUsaSxvLGEsbixyLHMsbCl7aWYoYXx8IXQuc3R5bGUuc3ByaXRlfHx0LnN0eWxlLnNwcml0ZS5sb2FkZWQoKSl7dmFyIHU9dC5nbCxtPVwibWFwXCI9PT1zLGY9XCJtYXBcIj09PWwsYz1mO2M/dS5lbmFibGUodS5ERVBUSF9URVNUKTp1LmRpc2FibGUodS5ERVBUSF9URVNUKTtmb3IodmFyIHAsXyxnPTAseT1vO2c8eS5sZW5ndGg7Zys9MSl7dmFyIGQ9eVtnXSxUPWUuZ2V0VGlsZShkKSx2PVQuZ2V0QnVja2V0KGkpO2lmKHYpe3ZhciBoPWE/di5idWZmZXJzLmdseXBoOnYuYnVmZmVycy5pY29uO2lmKGgmJmguc2VnbWVudHMubGVuZ3RoKXt2YXIgeD1oLmxheWVyRGF0YVtpLmlkXSxiPXgucHJvZ3JhbUNvbmZpZ3VyYXRpb24sUz1hfHx2LnNkZkljb25zLHo9YT92LnRleHRTaXplRGF0YTp2Lmljb25TaXplRGF0YTtwJiZ2LmZvbnRzdGFjaz09PV98fChwPXQudXNlUHJvZ3JhbShTP1wic3ltYm9sU0RGXCI6XCJzeW1ib2xJY29uXCIsYiksYi5zZXRVbmlmb3Jtcyh1LHAsaSx7em9vbTp0LnRyYW5zZm9ybS56b29tfSksc2V0U3ltYm9sRHJhd1N0YXRlKHAsdCxpLGQueixhLFMsbSxmLHYuZm9udHN0YWNrLHYuaWNvbnNOZWVkTGluZWFyLHopKSx0LmVuYWJsZVRpbGVDbGlwcGluZ01hc2soZCksdS51bmlmb3JtTWF0cml4NGZ2KHAudV9tYXRyaXgsITEsdC50cmFuc2xhdGVQb3NNYXRyaXgoZC5wb3NNYXRyaXgsVCxuLHIpKSxkcmF3VGlsZVN5bWJvbHMocCxiLHQsaSxULGgsYSxTLGYpLF89di5mb250c3RhY2t9fX1jfHx1LmVuYWJsZSh1LkRFUFRIX1RFU1QpfX1mdW5jdGlvbiBzZXRTeW1ib2xEcmF3U3RhdGUodCxlLGksbyxhLG4scixzLGwsdSxtKXt2YXIgZj1lLmdsLGM9ZS50cmFuc2Zvcm07aWYoZi51bmlmb3JtMWkodC51X3JvdGF0ZV93aXRoX21hcCxyKSxmLnVuaWZvcm0xaSh0LnVfcGl0Y2hfd2l0aF9tYXAscyksZi5hY3RpdmVUZXh0dXJlKGYuVEVYVFVSRTApLGYudW5pZm9ybTFpKHQudV90ZXh0dXJlLDApLGYudW5pZm9ybTFmKHQudV9pc190ZXh0LGE/MTowKSxhKXt2YXIgcD1sJiZlLmdseXBoU291cmNlLmdldEdseXBoQXRsYXMobCk7aWYoIXApcmV0dXJuO3AudXBkYXRlVGV4dHVyZShmKSxmLnVuaWZvcm0yZih0LnVfdGV4c2l6ZSxwLndpZHRoLzQscC5oZWlnaHQvNCl9ZWxzZXt2YXIgXz1lLm9wdGlvbnMucm90YXRpbmd8fGUub3B0aW9ucy56b29taW5nLGc9IWkuaXNMYXlvdXRWYWx1ZUZlYXR1cmVDb25zdGFudChcImljb24tc2l6ZVwiKXx8IWkuaXNMYXlvdXRWYWx1ZVpvb21Db25zdGFudChcImljb24tc2l6ZVwiKXx8MSE9PWkuZ2V0TGF5b3V0VmFsdWUoXCJpY29uLXNpemVcIix7em9vbTpjLnpvb219KSx5PWd8fGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyE9PWUuc3ByaXRlQXRsYXMucGl4ZWxSYXRpb3x8dSxkPXN8fGMucGl0Y2g7ZS5zcHJpdGVBdGxhcy5iaW5kKGYsbnx8X3x8eXx8ZCksZi51bmlmb3JtMmYodC51X3RleHNpemUsZS5zcHJpdGVBdGxhcy53aWR0aC80LGUuc3ByaXRlQXRsYXMuaGVpZ2h0LzQpfWlmKGYuYWN0aXZlVGV4dHVyZShmLlRFWFRVUkUxKSxlLmZyYW1lSGlzdG9yeS5iaW5kKGYpLGYudW5pZm9ybTFpKHQudV9mYWRldGV4dHVyZSwxKSxmLnVuaWZvcm0xZih0LnVfem9vbSxjLnpvb20pLGYudW5pZm9ybTFmKHQudV9waXRjaCxjLnBpdGNoLzM2MCoyKk1hdGguUEkpLGYudW5pZm9ybTFmKHQudV9iZWFyaW5nLGMuYmVhcmluZy8zNjAqMipNYXRoLlBJKSxmLnVuaWZvcm0xZih0LnVfYXNwZWN0X3JhdGlvLGMud2lkdGgvYy5oZWlnaHQpLGYudW5pZm9ybTFpKHQudV9pc19zaXplX3pvb21fY29uc3RhbnQsbS5pc1pvb21Db25zdGFudD8xOjApLGYudW5pZm9ybTFpKHQudV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQsbS5pc0ZlYXR1cmVDb25zdGFudD8xOjApLG0uaXNab29tQ29uc3RhbnR8fG0uaXNGZWF0dXJlQ29uc3RhbnQpaWYobS5pc0ZlYXR1cmVDb25zdGFudCYmIW0uaXNab29tQ29uc3RhbnQpe3ZhciBUO2lmKFwiaW50ZXJ2YWxcIj09PW0uZnVuY3Rpb25UeXBlKVQ9aS5nZXRMYXlvdXRWYWx1ZShhP1widGV4dC1zaXplXCI6XCJpY29uLXNpemVcIix7em9vbTpjLnpvb219KTtlbHNle3ZhciB2PVwiaW50ZXJ2YWxcIj09PW0uZnVuY3Rpb25UeXBlPzA6aW50ZXJwb2xhdGlvbkZhY3RvcihjLnpvb20sbS5mdW5jdGlvbkJhc2UsbS5jb3ZlcmluZ1pvb21SYW5nZVswXSxtLmNvdmVyaW5nWm9vbVJhbmdlWzFdKSxoPW0uY292ZXJpbmdTdG9wVmFsdWVzWzBdLHg9bS5jb3ZlcmluZ1N0b3BWYWx1ZXNbMV07VD1oKyh4LWgpKnV0aWwuY2xhbXAodiwwLDEpfWYudW5pZm9ybTFmKHQudV9zaXplLFQpLGYudW5pZm9ybTFmKHQudV9sYXlvdXRfc2l6ZSxtLmxheW91dFNpemUpfWVsc2UgbS5pc0ZlYXR1cmVDb25zdGFudCYmbS5pc1pvb21Db25zdGFudCYmZi51bmlmb3JtMWYodC51X3NpemUsbS5sYXlvdXRTaXplKTtlbHNle3ZhciBiPWludGVycG9sYXRpb25GYWN0b3IoYy56b29tLG0uZnVuY3Rpb25CYXNlLG0uY292ZXJpbmdab29tUmFuZ2VbMF0sbS5jb3ZlcmluZ1pvb21SYW5nZVsxXSk7Zi51bmlmb3JtMWYodC51X3NpemVfdCx1dGlsLmNsYW1wKGIsMCwxKSl9fWZ1bmN0aW9uIGRyYXdUaWxlU3ltYm9scyh0LGUsaSxvLGEsbixyLHMsbCl7dmFyIHU9aS5nbCxtPWkudHJhbnNmb3JtO2lmKGwpe3ZhciBmPXBpeGVsc1RvVGlsZVVuaXRzKGEsMSxtLnpvb20pO3UudW5pZm9ybTJmKHQudV9leHRydWRlX3NjYWxlLGYsZil9ZWxzZXt2YXIgYz1tLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2U7dS51bmlmb3JtMmYodC51X2V4dHJ1ZGVfc2NhbGUsbS5waXhlbHNUb0dMVW5pdHNbMF0qYyxtLnBpeGVsc1RvR0xVbml0c1sxXSpjKX1pZihzKXt2YXIgcD0ocj9cInRleHRcIjpcImljb25cIikrXCItaGFsby13aWR0aFwiLF89IW8uaXNQYWludFZhbHVlRmVhdHVyZUNvbnN0YW50KHApfHxvLnBhaW50W3BdLGc9KGw/TWF0aC5jb3MobS5fcGl0Y2gpOjEpKm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZTt1LnVuaWZvcm0xZih0LnVfZ2FtbWFfc2NhbGUsZyksXyYmKHUudW5pZm9ybTFmKHQudV9pc19oYWxvLDEpLGRyYXdTeW1ib2xFbGVtZW50cyhuLG8sdSx0KSksdS51bmlmb3JtMWYodC51X2lzX2hhbG8sMCl9ZHJhd1N5bWJvbEVsZW1lbnRzKG4sbyx1LHQpfWZ1bmN0aW9uIGRyYXdTeW1ib2xFbGVtZW50cyh0LGUsaSxvKXtmb3IodmFyIGE9dC5sYXllckRhdGFbZS5pZF0sbj1hJiZhLnBhaW50VmVydGV4QnVmZmVyLHI9MCxzPXQuc2VnbWVudHM7cjxzLmxlbmd0aDtyKz0xKXt2YXIgbD1zW3JdO2wudmFvc1tlLmlkXS5iaW5kKGksbyx0LmxheW91dFZlcnRleEJ1ZmZlcix0LmVsZW1lbnRCdWZmZXIsbixsLnZlcnRleE9mZnNldCksaS5kcmF3RWxlbWVudHMoaS5UUklBTkdMRVMsMypsLnByaW1pdGl2ZUxlbmd0aCxpLlVOU0lHTkVEX1NIT1JULDMqbC5wcmltaXRpdmVPZmZzZXQqMil9fXZhciB1dGlsPV9kZXJlcV8oXCIuLi91dGlsL3V0aWxcIiksYnJvd3Nlcj1fZGVyZXFfKFwiLi4vdXRpbC9icm93c2VyXCIpLGRyYXdDb2xsaXNpb25EZWJ1Zz1fZGVyZXFfKFwiLi9kcmF3X2NvbGxpc2lvbl9kZWJ1Z1wiKSxwaXhlbHNUb1RpbGVVbml0cz1fZGVyZXFfKFwiLi4vc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzXCIpLGludGVycG9sYXRpb25GYWN0b3I9X2RlcmVxXyhcIi4uL3N0eWxlLXNwZWMvZnVuY3Rpb25cIikuaW50ZXJwb2xhdGlvbkZhY3Rvcjttb2R1bGUuZXhwb3J0cz1kcmF3U3ltYm9scztcbn0se1wiLi4vc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzXCI6ODgsXCIuLi9zdHlsZS1zcGVjL2Z1bmN0aW9uXCI6MTA3LFwiLi4vdXRpbC9icm93c2VyXCI6MTk1LFwiLi4vdXRpbC91dGlsXCI6MjE1LFwiLi9kcmF3X2NvbGxpc2lvbl9kZWJ1Z1wiOjY4fV0sNzU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIEZyYW1lSGlzdG9yeT1mdW5jdGlvbigpe3RoaXMuY2hhbmdlVGltZXM9bmV3IEZsb2F0NjRBcnJheSgyNTYpLHRoaXMuY2hhbmdlT3BhY2l0aWVzPW5ldyBVaW50OEFycmF5KDI1NiksdGhpcy5vcGFjaXRpZXM9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDI1NiksdGhpcy5hcnJheT1uZXcgVWludDhBcnJheSh0aGlzLm9wYWNpdGllcy5idWZmZXIpLHRoaXMucHJldmlvdXNab29tPTAsdGhpcy5maXJzdEZyYW1lPSEwfTtGcmFtZUhpc3RvcnkucHJvdG90eXBlLnJlY29yZD1mdW5jdGlvbihlLHQsaSl7dmFyIHI9dGhpczt0aGlzLmZpcnN0RnJhbWUmJihlPTAsdGhpcy5maXJzdEZyYW1lPSExKSx0PU1hdGguZmxvb3IoMTAqdCk7dmFyIGE7aWYodDx0aGlzLnByZXZpb3VzWm9vbSlmb3IoYT10KzE7YTw9dGhpcy5wcmV2aW91c1pvb207YSsrKXIuY2hhbmdlVGltZXNbYV09ZSxyLmNoYW5nZU9wYWNpdGllc1thXT1yLm9wYWNpdGllc1thXTtlbHNlIGZvcihhPXQ7YT50aGlzLnByZXZpb3VzWm9vbTthLS0pci5jaGFuZ2VUaW1lc1thXT1lLHIuY2hhbmdlT3BhY2l0aWVzW2FdPXIub3BhY2l0aWVzW2FdO2ZvcihhPTA7YTwyNTY7YSsrKXt2YXIgcz1lLXIuY2hhbmdlVGltZXNbYV0sbz0yNTUqKGk/cy9pOjEpO2E8PXQ/ci5vcGFjaXRpZXNbYV09ci5jaGFuZ2VPcGFjaXRpZXNbYV0rbzpyLm9wYWNpdGllc1thXT1yLmNoYW5nZU9wYWNpdGllc1thXS1vfXRoaXMuY2hhbmdlZD0hMCx0aGlzLnByZXZpb3VzWm9vbT10fSxGcmFtZUhpc3RvcnkucHJvdG90eXBlLmJpbmQ9ZnVuY3Rpb24oZSl7dGhpcy50ZXh0dXJlPyhlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCx0aGlzLnRleHR1cmUpLHRoaXMuY2hhbmdlZCYmKGUudGV4U3ViSW1hZ2UyRChlLlRFWFRVUkVfMkQsMCwwLDAsMjU2LDEsZS5BTFBIQSxlLlVOU0lHTkVEX0JZVEUsdGhpcy5hcnJheSksdGhpcy5jaGFuZ2VkPSExKSk6KHRoaXMudGV4dHVyZT1lLmNyZWF0ZVRleHR1cmUoKSxlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCx0aGlzLnRleHR1cmUpLGUudGV4UGFyYW1ldGVyaShlLlRFWFRVUkVfMkQsZS5URVhUVVJFX1dSQVBfUyxlLkNMQU1QX1RPX0VER0UpLGUudGV4UGFyYW1ldGVyaShlLlRFWFRVUkVfMkQsZS5URVhUVVJFX1dSQVBfVCxlLkNMQU1QX1RPX0VER0UpLGUudGV4UGFyYW1ldGVyaShlLlRFWFRVUkVfMkQsZS5URVhUVVJFX01JTl9GSUxURVIsZS5ORUFSRVNUKSxlLnRleFBhcmFtZXRlcmkoZS5URVhUVVJFXzJELGUuVEVYVFVSRV9NQUdfRklMVEVSLGUuTkVBUkVTVCksZS50ZXhJbWFnZTJEKGUuVEVYVFVSRV8yRCwwLGUuQUxQSEEsMjU2LDEsMCxlLkFMUEhBLGUuVU5TSUdORURfQllURSx0aGlzLmFycmF5KSl9LG1vZHVsZS5leHBvcnRzPUZyYW1lSGlzdG9yeTtcbn0se31dLDc2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciB1dGlsPV9kZXJlcV8oXCIuLi91dGlsL3V0aWxcIiksTGluZUF0bGFzPWZ1bmN0aW9uKHQsaSl7dGhpcy53aWR0aD10LHRoaXMuaGVpZ2h0PWksdGhpcy5uZXh0Um93PTAsdGhpcy5ieXRlcz00LHRoaXMuZGF0YT1uZXcgVWludDhBcnJheSh0aGlzLndpZHRoKnRoaXMuaGVpZ2h0KnRoaXMuYnl0ZXMpLHRoaXMucG9zaXRpb25zPXt9fTtMaW5lQXRsYXMucHJvdG90eXBlLnNldFNwcml0ZT1mdW5jdGlvbih0KXt0aGlzLnNwcml0ZT10fSxMaW5lQXRsYXMucHJvdG90eXBlLmdldERhc2g9ZnVuY3Rpb24odCxpKXt2YXIgZT10LmpvaW4oXCIsXCIpK2k7cmV0dXJuIHRoaXMucG9zaXRpb25zW2VdfHwodGhpcy5wb3NpdGlvbnNbZV09dGhpcy5hZGREYXNoKHQsaSkpLHRoaXMucG9zaXRpb25zW2VdfSxMaW5lQXRsYXMucHJvdG90eXBlLmFkZERhc2g9ZnVuY3Rpb24odCxpKXt2YXIgZT10aGlzLGg9aT83OjAscz0yKmgrMSxhPTEyODtpZih0aGlzLm5leHRSb3crcz50aGlzLmhlaWdodClyZXR1cm4gdXRpbC53YXJuT25jZShcIkxpbmVBdGxhcyBvdXQgb2Ygc3BhY2VcIiksbnVsbDtmb3IodmFyIHI9MCxuPTA7bjx0Lmxlbmd0aDtuKyspcis9dFtuXTtmb3IodmFyIG89dGhpcy53aWR0aC9yLEU9by8yLFQ9dC5sZW5ndGglMj09PTEsUj0taDtSPD1oO1IrKylmb3IodmFyIHU9ZS5uZXh0Um93K2grUixkPWUud2lkdGgqdSxsPVQ/LXRbdC5sZW5ndGgtMV06MCx4PXRbMF0sQT0xLF89MDtfPHRoaXMud2lkdGg7XysrKXtmb3IoO3g8Xy9vOylsPXgseCs9dFtBXSxUJiZBPT09dC5sZW5ndGgtMSYmKHgrPXRbMF0pLEErKzt2YXIgcD1NYXRoLmFicyhfLWwqbyksZz1NYXRoLmFicyhfLXgqbyksdz1NYXRoLm1pbihwLGcpLEQ9QSUyPT09MSxVPXZvaWQgMDtpZihpKXt2YXIgZj1oP1IvaCooRSsxKTowO2lmKEQpe3ZhciBYPUUtTWF0aC5hYnMoZik7VT1NYXRoLnNxcnQodyp3K1gqWCl9ZWxzZSBVPUUtTWF0aC5zcXJ0KHcqdytmKmYpfWVsc2UgVT0oRD8xOi0xKSp3O2UuZGF0YVszKzQqKGQrXyldPU1hdGgubWF4KDAsTWF0aC5taW4oMjU1LFUrYSkpfXZhciB2PXt5Oih0aGlzLm5leHRSb3craCsuNSkvdGhpcy5oZWlnaHQsaGVpZ2h0OjIqaC90aGlzLmhlaWdodCx3aWR0aDpyfTtyZXR1cm4gdGhpcy5uZXh0Um93Kz1zLHRoaXMuZGlydHk9ITAsdn0sTGluZUF0bGFzLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKHQpe3RoaXMudGV4dHVyZT8odC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsdGhpcy50ZXh0dXJlKSx0aGlzLmRpcnR5JiYodGhpcy5kaXJ0eT0hMSx0LnRleFN1YkltYWdlMkQodC5URVhUVVJFXzJELDAsMCwwLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQsdC5SR0JBLHQuVU5TSUdORURfQllURSx0aGlzLmRhdGEpKSk6KHRoaXMudGV4dHVyZT10LmNyZWF0ZVRleHR1cmUoKSx0LmJpbmRUZXh0dXJlKHQuVEVYVFVSRV8yRCx0aGlzLnRleHR1cmUpLHQudGV4UGFyYW1ldGVyaSh0LlRFWFRVUkVfMkQsdC5URVhUVVJFX1dSQVBfUyx0LlJFUEVBVCksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfV1JBUF9ULHQuUkVQRUFUKSx0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9NSU5fRklMVEVSLHQuTElORUFSKSx0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9NQUdfRklMVEVSLHQuTElORUFSKSx0LnRleEltYWdlMkQodC5URVhUVVJFXzJELDAsdC5SR0JBLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQsMCx0LlJHQkEsdC5VTlNJR05FRF9CWVRFLHRoaXMuZGF0YSkpfSxtb2R1bGUuZXhwb3J0cz1MaW5lQXRsYXM7XG59LHtcIi4uL3V0aWwvdXRpbFwiOjIxNX1dLDc3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBicm93c2VyPV9kZXJlcV8oXCIuLi91dGlsL2Jyb3dzZXJcIiksbWF0ND1fZGVyZXFfKFwiQG1hcGJveC9nbC1tYXRyaXhcIikubWF0NCxGcmFtZUhpc3Rvcnk9X2RlcmVxXyhcIi4vZnJhbWVfaGlzdG9yeVwiKSxTb3VyY2VDYWNoZT1fZGVyZXFfKFwiLi4vc291cmNlL3NvdXJjZV9jYWNoZVwiKSxFWFRFTlQ9X2RlcmVxXyhcIi4uL2RhdGEvZXh0ZW50XCIpLHBpeGVsc1RvVGlsZVVuaXRzPV9kZXJlcV8oXCIuLi9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHNcIiksdXRpbD1fZGVyZXFfKFwiLi4vdXRpbC91dGlsXCIpLEJ1ZmZlcj1fZGVyZXFfKFwiLi4vZGF0YS9idWZmZXJcIiksVmVydGV4QXJyYXlPYmplY3Q9X2RlcmVxXyhcIi4vdmVydGV4X2FycmF5X29iamVjdFwiKSxSYXN0ZXJCb3VuZHNBcnJheT1fZGVyZXFfKFwiLi4vZGF0YS9yYXN0ZXJfYm91bmRzX2FycmF5XCIpLFBvc0FycmF5PV9kZXJlcV8oXCIuLi9kYXRhL3Bvc19hcnJheVwiKSxQcm9ncmFtQ29uZmlndXJhdGlvbj1fZGVyZXFfKFwiLi4vZGF0YS9wcm9ncmFtX2NvbmZpZ3VyYXRpb25cIiksc2hhZGVycz1fZGVyZXFfKFwiLi9zaGFkZXJzXCIpLGRyYXc9e3N5bWJvbDpfZGVyZXFfKFwiLi9kcmF3X3N5bWJvbFwiKSxjaXJjbGU6X2RlcmVxXyhcIi4vZHJhd19jaXJjbGVcIiksbGluZTpfZGVyZXFfKFwiLi9kcmF3X2xpbmVcIiksZmlsbDpfZGVyZXFfKFwiLi9kcmF3X2ZpbGxcIiksXCJmaWxsLWV4dHJ1c2lvblwiOl9kZXJlcV8oXCIuL2RyYXdfZmlsbF9leHRydXNpb25cIikscmFzdGVyOl9kZXJlcV8oXCIuL2RyYXdfcmFzdGVyXCIpLGJhY2tncm91bmQ6X2RlcmVxXyhcIi4vZHJhd19iYWNrZ3JvdW5kXCIpLGRlYnVnOl9kZXJlcV8oXCIuL2RyYXdfZGVidWdcIil9LFBhaW50ZXI9ZnVuY3Rpb24oZSxyKXt0aGlzLmdsPWUsdGhpcy50cmFuc2Zvcm09cix0aGlzLnJldXNhYmxlVGV4dHVyZXM9e3RpbGVzOnt9LHZpZXdwb3J0Om51bGx9LHRoaXMucHJlRmJvcz17fSx0aGlzLmZyYW1lSGlzdG9yeT1uZXcgRnJhbWVIaXN0b3J5LHRoaXMuc2V0dXAoKSx0aGlzLm51bVN1YmxheWVycz1Tb3VyY2VDYWNoZS5tYXhVbmRlcnpvb21pbmcrU291cmNlQ2FjaGUubWF4T3Zlcnpvb21pbmcrMSx0aGlzLmRlcHRoRXBzaWxvbj0xL01hdGgucG93KDIsMTYpLHRoaXMubGluZVdpZHRoUmFuZ2U9ZS5nZXRQYXJhbWV0ZXIoZS5BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UpLHRoaXMuYmFzaWNGaWxsUHJvZ3JhbUNvbmZpZ3VyYXRpb249UHJvZ3JhbUNvbmZpZ3VyYXRpb24uY3JlYXRlU3RhdGljKFtcImNvbG9yXCIsXCJvcGFjaXR5XCJdKSx0aGlzLmVtcHR5UHJvZ3JhbUNvbmZpZ3VyYXRpb249bmV3IFByb2dyYW1Db25maWd1cmF0aW9ufTtQYWludGVyLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oZSxyKXt2YXIgdD10aGlzLmdsO3RoaXMud2lkdGg9ZSpicm93c2VyLmRldmljZVBpeGVsUmF0aW8sdGhpcy5oZWlnaHQ9cipicm93c2VyLmRldmljZVBpeGVsUmF0aW8sdC52aWV3cG9ydCgwLDAsdGhpcy53aWR0aCx0aGlzLmhlaWdodCl9LFBhaW50ZXIucHJvdG90eXBlLnNldHVwPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nbDtlLnZlcmJvc2U9ITAsZS5lbmFibGUoZS5CTEVORCksZS5ibGVuZEZ1bmMoZS5PTkUsZS5PTkVfTUlOVVNfU1JDX0FMUEhBKSxlLmVuYWJsZShlLlNURU5DSUxfVEVTVCksZS5lbmFibGUoZS5ERVBUSF9URVNUKSxlLmRlcHRoRnVuYyhlLkxFUVVBTCksdGhpcy5fZGVwdGhNYXNrPSExLGUuZGVwdGhNYXNrKCExKTt2YXIgcj1uZXcgUG9zQXJyYXk7ci5lbXBsYWNlQmFjaygwLDApLHIuZW1wbGFjZUJhY2soRVhURU5ULDApLHIuZW1wbGFjZUJhY2soMCxFWFRFTlQpLHIuZW1wbGFjZUJhY2soRVhURU5ULEVYVEVOVCksdGhpcy50aWxlRXh0ZW50QnVmZmVyPUJ1ZmZlci5mcm9tU3RydWN0QXJyYXkocixCdWZmZXIuQnVmZmVyVHlwZS5WRVJURVgpLHRoaXMudGlsZUV4dGVudFZBTz1uZXcgVmVydGV4QXJyYXlPYmplY3QsdGhpcy50aWxlRXh0ZW50UGF0dGVyblZBTz1uZXcgVmVydGV4QXJyYXlPYmplY3Q7dmFyIHQ9bmV3IFBvc0FycmF5O3QuZW1wbGFjZUJhY2soMCwwKSx0LmVtcGxhY2VCYWNrKEVYVEVOVCwwKSx0LmVtcGxhY2VCYWNrKEVYVEVOVCxFWFRFTlQpLHQuZW1wbGFjZUJhY2soMCxFWFRFTlQpLHQuZW1wbGFjZUJhY2soMCwwKSx0aGlzLmRlYnVnQnVmZmVyPUJ1ZmZlci5mcm9tU3RydWN0QXJyYXkodCxCdWZmZXIuQnVmZmVyVHlwZS5WRVJURVgpLHRoaXMuZGVidWdWQU89bmV3IFZlcnRleEFycmF5T2JqZWN0O3ZhciBpPW5ldyBSYXN0ZXJCb3VuZHNBcnJheTtpLmVtcGxhY2VCYWNrKDAsMCwwLDApLGkuZW1wbGFjZUJhY2soRVhURU5ULDAsMzI3NjcsMCksaS5lbXBsYWNlQmFjaygwLEVYVEVOVCwwLDMyNzY3KSxpLmVtcGxhY2VCYWNrKEVYVEVOVCxFWFRFTlQsMzI3NjcsMzI3NjcpLHRoaXMucmFzdGVyQm91bmRzQnVmZmVyPUJ1ZmZlci5mcm9tU3RydWN0QXJyYXkoaSxCdWZmZXIuQnVmZmVyVHlwZS5WRVJURVgpLHRoaXMucmFzdGVyQm91bmRzVkFPPW5ldyBWZXJ0ZXhBcnJheU9iamVjdCx0aGlzLmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYz1lLmdldEV4dGVuc2lvbihcIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpY1wiKXx8ZS5nZXRFeHRlbnNpb24oXCJNT1pfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljXCIpfHxlLmdldEV4dGVuc2lvbihcIldFQktJVF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWNcIiksdGhpcy5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWMmJih0aGlzLmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpY01heD1lLmdldFBhcmFtZXRlcih0aGlzLmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYy5NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQpKX0sUGFpbnRlci5wcm90b3R5cGUuY2xlYXJDb2xvcj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2w7ZS5jbGVhckNvbG9yKDAsMCwwLDApLGUuY2xlYXIoZS5DT0xPUl9CVUZGRVJfQklUKX0sUGFpbnRlci5wcm90b3R5cGUuY2xlYXJTdGVuY2lsPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nbDtlLmNsZWFyU3RlbmNpbCgwKSxlLnN0ZW5jaWxNYXNrKDI1NSksZS5jbGVhcihlLlNURU5DSUxfQlVGRkVSX0JJVCl9LFBhaW50ZXIucHJvdG90eXBlLmNsZWFyRGVwdGg9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdsO2UuY2xlYXJEZXB0aCgxKSx0aGlzLmRlcHRoTWFzayghMCksZS5jbGVhcihlLkRFUFRIX0JVRkZFUl9CSVQpfSxQYWludGVyLnByb3RvdHlwZS5fcmVuZGVyVGlsZUNsaXBwaW5nTWFza3M9ZnVuY3Rpb24oZSl7dmFyIHI9dGhpcyx0PXRoaXMuZ2w7dC5jb2xvck1hc2soITEsITEsITEsITEpLHRoaXMuZGVwdGhNYXNrKCExKSx0LmRpc2FibGUodC5ERVBUSF9URVNUKSx0LmVuYWJsZSh0LlNURU5DSUxfVEVTVCksdC5zdGVuY2lsTWFzaygyNTUpLHQuc3RlbmNpbE9wKHQuS0VFUCx0LktFRVAsdC5SRVBMQUNFKTt2YXIgaT0xO3RoaXMuX3RpbGVDbGlwcGluZ01hc2tJRHM9e307Zm9yKHZhciBhPTAscz1lO2E8cy5sZW5ndGg7YSs9MSl7dmFyIG89c1thXSxuPXIuX3RpbGVDbGlwcGluZ01hc2tJRHNbby5pZF09aSsrO3Quc3RlbmNpbEZ1bmModC5BTFdBWVMsbiwyNTUpO3ZhciBsPXIudXNlUHJvZ3JhbShcImZpbGxcIixyLmJhc2ljRmlsbFByb2dyYW1Db25maWd1cmF0aW9uKTt0LnVuaWZvcm1NYXRyaXg0ZnYobC51X21hdHJpeCwhMSxvLnBvc01hdHJpeCksci50aWxlRXh0ZW50VkFPLmJpbmQodCxsLHIudGlsZUV4dGVudEJ1ZmZlciksdC5kcmF3QXJyYXlzKHQuVFJJQU5HTEVfU1RSSVAsMCxyLnRpbGVFeHRlbnRCdWZmZXIubGVuZ3RoKX10LnN0ZW5jaWxNYXNrKDApLHQuY29sb3JNYXNrKCEwLCEwLCEwLCEwKSx0aGlzLmRlcHRoTWFzayghMCksdC5lbmFibGUodC5ERVBUSF9URVNUKX0sUGFpbnRlci5wcm90b3R5cGUuZW5hYmxlVGlsZUNsaXBwaW5nTWFzaz1mdW5jdGlvbihlKXt2YXIgcj10aGlzLmdsO3Iuc3RlbmNpbEZ1bmMoci5FUVVBTCx0aGlzLl90aWxlQ2xpcHBpbmdNYXNrSURzW2UuaWRdLDI1NSl9LFBhaW50ZXIucHJvdG90eXBlLnByZXBhcmVCdWZmZXJzPWZ1bmN0aW9uKCl7fSxQYWludGVyLnByb3RvdHlwZS5iaW5kRGVmYXVsdEZyYW1lYnVmZmVyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nbDtlLmJpbmRGcmFtZWJ1ZmZlcihlLkZSQU1FQlVGRkVSLG51bGwpfSxQYWludGVyLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oZSxyKXtpZih0aGlzLnN0eWxlPWUsdGhpcy5vcHRpb25zPXIsdGhpcy5saW5lQXRsYXM9ZS5saW5lQXRsYXMsdGhpcy5zcHJpdGVBdGxhcz1lLnNwcml0ZUF0bGFzLHRoaXMuc3ByaXRlQXRsYXMuc2V0U3ByaXRlKGUuc3ByaXRlKSx0aGlzLmdseXBoU291cmNlPWUuZ2x5cGhTb3VyY2UsdGhpcy5mcmFtZUhpc3RvcnkucmVjb3JkKERhdGUubm93KCksdGhpcy50cmFuc2Zvcm0uem9vbSxlLmdldFRyYW5zaXRpb24oKS5kdXJhdGlvbiksdGhpcy5wcmVwYXJlQnVmZmVycygpLHRoaXMuY2xlYXJDb2xvcigpLHRoaXMuY2xlYXJEZXB0aCgpLHRoaXMuc2hvd092ZXJkcmF3SW5zcGVjdG9yKHIuc2hvd092ZXJkcmF3SW5zcGVjdG9yKSx0aGlzLmRlcHRoUmFuZ2U9KGUuX29yZGVyLmxlbmd0aCsyKSp0aGlzLm51bVN1YmxheWVycyp0aGlzLmRlcHRoRXBzaWxvbix0aGlzLmlzT3BhcXVlUGFzcz0hMCx0aGlzLnJlbmRlclBhc3MoKSx0aGlzLmlzT3BhcXVlUGFzcz0hMSx0aGlzLnJlbmRlclBhc3MoKSx0aGlzLm9wdGlvbnMuc2hvd1RpbGVCb3VuZGFyaWVzKXt2YXIgdD10aGlzLnN0eWxlLnNvdXJjZUNhY2hlc1tPYmplY3Qua2V5cyh0aGlzLnN0eWxlLnNvdXJjZUNhY2hlcylbMF1dO3QmJmRyYXcuZGVidWcodGhpcyx0LHQuZ2V0VmlzaWJsZUNvb3JkaW5hdGVzKCkpfX0sUGFpbnRlci5wcm90b3R5cGUucmVuZGVyUGFzcz1mdW5jdGlvbigpe3ZhciBlLHIsdD10aGlzLGk9dGhpcy5zdHlsZS5fb3JkZXI7dGhpcy5jdXJyZW50TGF5ZXI9dGhpcy5pc09wYXF1ZVBhc3M/aS5sZW5ndGgtMTowLHRoaXMuaXNPcGFxdWVQYXNzP3RoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3Rvcnx8dGhpcy5nbC5kaXNhYmxlKHRoaXMuZ2wuQkxFTkQpOnRoaXMuZ2wuZW5hYmxlKHRoaXMuZ2wuQkxFTkQpO2Zvcih2YXIgYT0wO2E8aS5sZW5ndGg7YSsrKXt2YXIgcz10LnN0eWxlLl9sYXllcnNbaVt0LmN1cnJlbnRMYXllcl1dO3Muc291cmNlIT09KGUmJmUuaWQpJiYoZT10LnN0eWxlLnNvdXJjZUNhY2hlc1tzLnNvdXJjZV0scj1bXSxlJiYoZS5wcmVwYXJlJiZlLnByZXBhcmUoKSx0LmNsZWFyU3RlbmNpbCgpLHI9ZS5nZXRWaXNpYmxlQ29vcmRpbmF0ZXMoKSxlLmdldFNvdXJjZSgpLmlzVGlsZUNsaXBwZWQmJnQuX3JlbmRlclRpbGVDbGlwcGluZ01hc2tzKHIpKSx0LmlzT3BhcXVlUGFzc3x8ci5yZXZlcnNlKCkpLHQucmVuZGVyTGF5ZXIodCxlLHMsciksdC5jdXJyZW50TGF5ZXIrPXQuaXNPcGFxdWVQYXNzPy0xOjF9fSxQYWludGVyLnByb3RvdHlwZS5kZXB0aE1hc2s9ZnVuY3Rpb24oZSl7ZSE9PXRoaXMuX2RlcHRoTWFzayYmKHRoaXMuX2RlcHRoTWFzaz1lLHRoaXMuZ2wuZGVwdGhNYXNrKGUpKX0sUGFpbnRlci5wcm90b3R5cGUucmVuZGVyTGF5ZXI9ZnVuY3Rpb24oZSxyLHQsaSl7dC5pc0hpZGRlbih0aGlzLnRyYW5zZm9ybS56b29tKXx8KFwiYmFja2dyb3VuZFwiPT09dC50eXBlfHxpLmxlbmd0aCkmJih0aGlzLmlkPXQuaWQsZHJhd1t0LnR5cGVdKGUscix0LGkpKX0sUGFpbnRlci5wcm90b3R5cGUuc2V0RGVwdGhTdWJsYXllcj1mdW5jdGlvbihlKXt2YXIgcj0xLSgoMSt0aGlzLmN1cnJlbnRMYXllcikqdGhpcy5udW1TdWJsYXllcnMrZSkqdGhpcy5kZXB0aEVwc2lsb24sdD1yLTErdGhpcy5kZXB0aFJhbmdlO3RoaXMuZ2wuZGVwdGhSYW5nZSh0LHIpfSxQYWludGVyLnByb3RvdHlwZS50cmFuc2xhdGVQb3NNYXRyaXg9ZnVuY3Rpb24oZSxyLHQsaSl7aWYoIXRbMF0mJiF0WzFdKXJldHVybiBlO2lmKFwidmlld3BvcnRcIj09PWkpe3ZhciBhPU1hdGguc2luKC10aGlzLnRyYW5zZm9ybS5hbmdsZSkscz1NYXRoLmNvcygtdGhpcy50cmFuc2Zvcm0uYW5nbGUpO3Q9W3RbMF0qcy10WzFdKmEsdFswXSphK3RbMV0qc119dmFyIG89W3BpeGVsc1RvVGlsZVVuaXRzKHIsdFswXSx0aGlzLnRyYW5zZm9ybS56b29tKSxwaXhlbHNUb1RpbGVVbml0cyhyLHRbMV0sdGhpcy50cmFuc2Zvcm0uem9vbSksMF0sbj1uZXcgRmxvYXQzMkFycmF5KDE2KTtyZXR1cm4gbWF0NC50cmFuc2xhdGUobixlLG8pLG59LFBhaW50ZXIucHJvdG90eXBlLnNhdmVUaWxlVGV4dHVyZT1mdW5jdGlvbihlKXt2YXIgcj10aGlzLnJldXNhYmxlVGV4dHVyZXMudGlsZXNbZS5zaXplXTtyP3IucHVzaChlKTp0aGlzLnJldXNhYmxlVGV4dHVyZXMudGlsZXNbZS5zaXplXT1bZV19LFBhaW50ZXIucHJvdG90eXBlLnNhdmVWaWV3cG9ydFRleHR1cmU9ZnVuY3Rpb24oZSl7dGhpcy5yZXVzYWJsZVRleHR1cmVzLnZpZXdwb3J0PWV9LFBhaW50ZXIucHJvdG90eXBlLmdldFRpbGVUZXh0dXJlPWZ1bmN0aW9uKGUpe3ZhciByPXRoaXMucmV1c2FibGVUZXh0dXJlcy50aWxlc1tlXTtyZXR1cm4gciYmci5sZW5ndGg+MD9yLnBvcCgpOm51bGx9LFBhaW50ZXIucHJvdG90eXBlLmdldFZpZXdwb3J0VGV4dHVyZT1mdW5jdGlvbihlLHIpe3ZhciB0PXRoaXMucmV1c2FibGVUZXh0dXJlcy52aWV3cG9ydDtpZih0KXJldHVybiB0LndpZHRoPT09ZSYmdC5oZWlnaHQ9PT1yP3Q6KHRoaXMuZ2wuZGVsZXRlVGV4dHVyZSh0KSx2b2lkKHRoaXMucmV1c2FibGVUZXh0dXJlcy52aWV3cG9ydD1udWxsKSl9LFBhaW50ZXIucHJvdG90eXBlLmxpbmVXaWR0aD1mdW5jdGlvbihlKXt0aGlzLmdsLmxpbmVXaWR0aCh1dGlsLmNsYW1wKGUsdGhpcy5saW5lV2lkdGhSYW5nZVswXSx0aGlzLmxpbmVXaWR0aFJhbmdlWzFdKSl9LFBhaW50ZXIucHJvdG90eXBlLnNob3dPdmVyZHJhd0luc3BlY3Rvcj1mdW5jdGlvbihlKXtpZihlfHx0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3Ipe3RoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3Rvcj1lO3ZhciByPXRoaXMuZ2w7aWYoZSl7ci5ibGVuZEZ1bmMoci5DT05TVEFOVF9DT0xPUixyLk9ORSk7dmFyIHQ9OCxpPTEvdDtyLmJsZW5kQ29sb3IoaSxpLGksMCksci5jbGVhckNvbG9yKDAsMCwwLDEpLHIuY2xlYXIoci5DT0xPUl9CVUZGRVJfQklUKX1lbHNlIHIuYmxlbmRGdW5jKHIuT05FLHIuT05FX01JTlVTX1NSQ19BTFBIQSl9fSxQYWludGVyLnByb3RvdHlwZS5jcmVhdGVQcm9ncmFtPWZ1bmN0aW9uKGUscil7dmFyIHQ9dGhpcy5nbCxpPXQuY3JlYXRlUHJvZ3JhbSgpLGE9c2hhZGVyc1tlXSxzPVwiI2RlZmluZSBNQVBCT1hfR0xfSlNcXG4jZGVmaW5lIERFVklDRV9QSVhFTF9SQVRJTyBcIiticm93c2VyLmRldmljZVBpeGVsUmF0aW8udG9GaXhlZCgxKStcIlxcblwiO3RoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3RvciYmKHMrPVwiI2RlZmluZSBPVkVSRFJBV19JTlNQRUNUT1I7XFxuXCIpO3ZhciBvPXIuYXBwbHlQcmFnbWFzKHMrc2hhZGVycy5wcmVsdWRlLmZyYWdtZW50U291cmNlK2EuZnJhZ21lbnRTb3VyY2UsXCJmcmFnbWVudFwiKSxuPXIuYXBwbHlQcmFnbWFzKHMrc2hhZGVycy5wcmVsdWRlLnZlcnRleFNvdXJjZSthLnZlcnRleFNvdXJjZSxcInZlcnRleFwiKSxsPXQuY3JlYXRlU2hhZGVyKHQuRlJBR01FTlRfU0hBREVSKTt0LnNoYWRlclNvdXJjZShsLG8pLHQuY29tcGlsZVNoYWRlcihsKSx0LmF0dGFjaFNoYWRlcihpLGwpO3ZhciBoPXQuY3JlYXRlU2hhZGVyKHQuVkVSVEVYX1NIQURFUik7dC5zaGFkZXJTb3VyY2UoaCxuKSx0LmNvbXBpbGVTaGFkZXIoaCksdC5hdHRhY2hTaGFkZXIoaSxoKSx0LmxpbmtQcm9ncmFtKGkpO2Zvcih2YXIgdT10LmdldFByb2dyYW1QYXJhbWV0ZXIoaSx0LkFDVElWRV9BVFRSSUJVVEVTKSxjPXtwcm9ncmFtOmksbnVtQXR0cmlidXRlczp1fSxwPTA7cDx1O3ArKyl7dmFyIGQ9dC5nZXRBY3RpdmVBdHRyaWIoaSxwKTtjW2QubmFtZV09dC5nZXRBdHRyaWJMb2NhdGlvbihpLGQubmFtZSl9Zm9yKHZhciBmPXQuZ2V0UHJvZ3JhbVBhcmFtZXRlcihpLHQuQUNUSVZFX1VOSUZPUk1TKSxnPTA7ZzxmO2crKyl7dmFyIFQ9dC5nZXRBY3RpdmVVbmlmb3JtKGksZyk7Y1tULm5hbWVdPXQuZ2V0VW5pZm9ybUxvY2F0aW9uKGksVC5uYW1lKX1yZXR1cm4gY30sUGFpbnRlci5wcm90b3R5cGUuX2NyZWF0ZVByb2dyYW1DYWNoZWQ9ZnVuY3Rpb24oZSxyKXt0aGlzLmNhY2hlPXRoaXMuY2FjaGV8fHt9O3ZhciB0PVwiXCIrZSsoci5jYWNoZUtleXx8XCJcIikrKHRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3Rvcj9cIi9vdmVyZHJhd1wiOlwiXCIpO3JldHVybiB0aGlzLmNhY2hlW3RdfHwodGhpcy5jYWNoZVt0XT10aGlzLmNyZWF0ZVByb2dyYW0oZSxyKSksdGhpcy5jYWNoZVt0XX0sUGFpbnRlci5wcm90b3R5cGUudXNlUHJvZ3JhbT1mdW5jdGlvbihlLHIpe3ZhciB0PXRoaXMuZ2wsaT10aGlzLl9jcmVhdGVQcm9ncmFtQ2FjaGVkKGUscnx8dGhpcy5lbXB0eVByb2dyYW1Db25maWd1cmF0aW9uKTtyZXR1cm4gdGhpcy5jdXJyZW50UHJvZ3JhbSE9PWkmJih0LnVzZVByb2dyYW0oaS5wcm9ncmFtKSx0aGlzLmN1cnJlbnRQcm9ncmFtPWkpLGl9LG1vZHVsZS5leHBvcnRzPVBhaW50ZXI7XG59LHtcIi4uL2RhdGEvYnVmZmVyXCI6NTEsXCIuLi9kYXRhL2V4dGVudFwiOjU0LFwiLi4vZGF0YS9wb3NfYXJyYXlcIjo1NyxcIi4uL2RhdGEvcHJvZ3JhbV9jb25maWd1cmF0aW9uXCI6NTgsXCIuLi9kYXRhL3Jhc3Rlcl9ib3VuZHNfYXJyYXlcIjo1OSxcIi4uL3NvdXJjZS9waXhlbHNfdG9fdGlsZV91bml0c1wiOjg4LFwiLi4vc291cmNlL3NvdXJjZV9jYWNoZVwiOjkzLFwiLi4vdXRpbC9icm93c2VyXCI6MTk1LFwiLi4vdXRpbC91dGlsXCI6MjE1LFwiLi9kcmF3X2JhY2tncm91bmRcIjo2NixcIi4vZHJhd19jaXJjbGVcIjo2NyxcIi4vZHJhd19kZWJ1Z1wiOjY5LFwiLi9kcmF3X2ZpbGxcIjo3MCxcIi4vZHJhd19maWxsX2V4dHJ1c2lvblwiOjcxLFwiLi9kcmF3X2xpbmVcIjo3MixcIi4vZHJhd19yYXN0ZXJcIjo3MyxcIi4vZHJhd19zeW1ib2xcIjo3NCxcIi4vZnJhbWVfaGlzdG9yeVwiOjc1LFwiLi9zaGFkZXJzXCI6NzksXCIuL3ZlcnRleF9hcnJheV9vYmplY3RcIjo4MCxcIkBtYXBib3gvZ2wtbWF0cml4XCI6MX1dLDc4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBwaXhlbHNUb1RpbGVVbml0cz1fZGVyZXFfKFwiLi4vc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzXCIpO2V4cG9ydHMucHJlcGFyZT1mdW5jdGlvbihyLHQsaSl7dmFyIG89dC5nbCxlPXQuc3ByaXRlQXRsYXMuZ2V0UG9zaXRpb24oci5mcm9tLCEwKSxfPXQuc3ByaXRlQXRsYXMuZ2V0UG9zaXRpb24oci50bywhMCk7ZSYmXyYmKG8udW5pZm9ybTFpKGkudV9pbWFnZSwwKSxvLnVuaWZvcm0yZnYoaS51X3BhdHRlcm5fdGxfYSxlLnRsKSxvLnVuaWZvcm0yZnYoaS51X3BhdHRlcm5fYnJfYSxlLmJyKSxvLnVuaWZvcm0yZnYoaS51X3BhdHRlcm5fdGxfYixfLnRsKSxvLnVuaWZvcm0yZnYoaS51X3BhdHRlcm5fYnJfYixfLmJyKSxvLnVuaWZvcm0xZihpLnVfbWl4LHIudCksby51bmlmb3JtMmZ2KGkudV9wYXR0ZXJuX3NpemVfYSxlLnNpemUpLG8udW5pZm9ybTJmdihpLnVfcGF0dGVybl9zaXplX2IsXy5zaXplKSxvLnVuaWZvcm0xZihpLnVfc2NhbGVfYSxyLmZyb21TY2FsZSksby51bmlmb3JtMWYoaS51X3NjYWxlX2Isci50b1NjYWxlKSxvLmFjdGl2ZVRleHR1cmUoby5URVhUVVJFMCksdC5zcHJpdGVBdGxhcy5iaW5kKG8sITApKX0sZXhwb3J0cy5zZXRUaWxlPWZ1bmN0aW9uKHIsdCxpKXt2YXIgbz10LmdsO28udW5pZm9ybTFmKGkudV90aWxlX3VuaXRzX3RvX3BpeGVscywxL3BpeGVsc1RvVGlsZVVuaXRzKHIsMSx0LnRyYW5zZm9ybS50aWxlWm9vbSkpO3ZhciBlPU1hdGgucG93KDIsci5jb29yZC56KSxfPXIudGlsZVNpemUqTWF0aC5wb3coMix0LnRyYW5zZm9ybS50aWxlWm9vbSkvZSx1PV8qKHIuY29vcmQueCtyLmNvb3JkLncqZSksbj1fKnIuY29vcmQueTtvLnVuaWZvcm0yZihpLnVfcGl4ZWxfY29vcmRfdXBwZXIsdT4+MTYsbj4+MTYpLG8udW5pZm9ybTJmKGkudV9waXhlbF9jb29yZF9sb3dlciw2NTUzNSZ1LDY1NTM1Jm4pfTtcbn0se1wiLi4vc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzXCI6ODh9XSw3OTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgcGF0aD1fZGVyZXFfKFwicGF0aFwiKTttb2R1bGUuZXhwb3J0cz17cHJlbHVkZTp7ZnJhZ21lbnRTb3VyY2U6XCIjaWZkZWYgR0xfRVNcXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcXG4jZWxzZVxcblxcbiNpZiAhZGVmaW5lZChsb3dwKVxcbiNkZWZpbmUgbG93cFxcbiNlbmRpZlxcblxcbiNpZiAhZGVmaW5lZChtZWRpdW1wKVxcbiNkZWZpbmUgbWVkaXVtcFxcbiNlbmRpZlxcblxcbiNpZiAhZGVmaW5lZChoaWdocClcXG4jZGVmaW5lIGhpZ2hwXFxuI2VuZGlmXFxuXFxuI2VuZGlmXFxuXCIsdmVydGV4U291cmNlOlwiI2lmZGVmIEdMX0VTXFxucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbiNlbHNlXFxuXFxuI2lmICFkZWZpbmVkKGxvd3ApXFxuI2RlZmluZSBsb3dwXFxuI2VuZGlmXFxuXFxuI2lmICFkZWZpbmVkKG1lZGl1bXApXFxuI2RlZmluZSBtZWRpdW1wXFxuI2VuZGlmXFxuXFxuI2lmICFkZWZpbmVkKGhpZ2hwKVxcbiNkZWZpbmUgaGlnaHBcXG4jZW5kaWZcXG5cXG4jZW5kaWZcXG5cXG5mbG9hdCBldmFsdWF0ZV96b29tX2Z1bmN0aW9uXzEoY29uc3QgdmVjNCB2YWx1ZXMsIGNvbnN0IGZsb2F0IHQpIHtcXG4gICAgaWYgKHQgPCAxLjApIHtcXG4gICAgICAgIHJldHVybiBtaXgodmFsdWVzWzBdLCB2YWx1ZXNbMV0sIHQpO1xcbiAgICB9IGVsc2UgaWYgKHQgPCAyLjApIHtcXG4gICAgICAgIHJldHVybiBtaXgodmFsdWVzWzFdLCB2YWx1ZXNbMl0sIHQgLSAxLjApO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgcmV0dXJuIG1peCh2YWx1ZXNbMl0sIHZhbHVlc1szXSwgdCAtIDIuMCk7XFxuICAgIH1cXG59XFxudmVjNCBldmFsdWF0ZV96b29tX2Z1bmN0aW9uXzQoY29uc3QgdmVjNCB2YWx1ZTAsIGNvbnN0IHZlYzQgdmFsdWUxLCBjb25zdCB2ZWM0IHZhbHVlMiwgY29uc3QgdmVjNCB2YWx1ZTMsIGNvbnN0IGZsb2F0IHQpIHtcXG4gICAgaWYgKHQgPCAxLjApIHtcXG4gICAgICAgIHJldHVybiBtaXgodmFsdWUwLCB2YWx1ZTEsIHQpO1xcbiAgICB9IGVsc2UgaWYgKHQgPCAyLjApIHtcXG4gICAgICAgIHJldHVybiBtaXgodmFsdWUxLCB2YWx1ZTIsIHQgLSAxLjApO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgcmV0dXJuIG1peCh2YWx1ZTIsIHZhbHVlMywgdCAtIDIuMCk7XFxuICAgIH1cXG59XFxuXFxuLy8gVW5wYWNrIGEgcGFpciBvZiB2YWx1ZXMgdGhhdCBoYXZlIGJlZW4gcGFja2VkIGludG8gYSBzaW5nbGUgZmxvYXQuXFxuLy8gVGhlIHBhY2tlZCB2YWx1ZXMgYXJlIGFzc3VtZWQgdG8gYmUgOC1iaXQgdW5zaWduZWQgaW50ZWdlcnMsIGFuZCBhcmVcXG4vLyBwYWNrZWQgbGlrZSBzbzpcXG4vLyBwYWNrZWRWYWx1ZSA9IGZsb29yKGlucHV0WzBdKSAqIDI1NiArIGlucHV0WzFdLFxcbnZlYzIgdW5wYWNrX2Zsb2F0KGNvbnN0IGZsb2F0IHBhY2tlZFZhbHVlKSB7XFxuICAgIGludCBwYWNrZWRJbnRWYWx1ZSA9IGludChwYWNrZWRWYWx1ZSk7XFxuICAgIGludCB2MCA9IHBhY2tlZEludFZhbHVlIC8gMjU2O1xcbiAgICByZXR1cm4gdmVjMih2MCwgcGFja2VkSW50VmFsdWUgLSB2MCAqIDI1Nik7XFxufVxcblxcblxcbi8vIFRvIG1pbmltaXplIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlcyBuZWVkZWQgaW4gdGhlIG1hcGJveC1nbC1uYXRpdmUgc2hhZGVycyxcXG4vLyB3ZSBlbmNvZGUgYSA0LWNvbXBvbmVudCBjb2xvciBpbnRvIGEgcGFpciBvZiBmbG9hdHMgKGkuZS4gYSB2ZWMyKSBhcyBmb2xsb3dzOlxcbi8vIFsgZmxvb3IoY29sb3IuciAqIDI1NSkgKiAyNTYgKyBjb2xvci5nICogMjU1LFxcbi8vICAgZmxvb3IoY29sb3IuYiAqIDI1NSkgKiAyNTYgKyBjb2xvci5nICogMjU1IF1cXG52ZWM0IGRlY29kZV9jb2xvcihjb25zdCB2ZWMyIGVuY29kZWRDb2xvcikge1xcbiAgICByZXR1cm4gdmVjNChcXG4gICAgICAgIHVucGFja19mbG9hdChlbmNvZGVkQ29sb3JbMF0pIC8gMjU1LjAsXFxuICAgICAgICB1bnBhY2tfZmxvYXQoZW5jb2RlZENvbG9yWzFdKSAvIDI1NS4wXFxuICAgICk7XFxufVxcblxcbi8vIFVucGFjayBhIHBhaXIgb2YgcGFpbnQgdmFsdWVzIGFuZCBpbnRlcnBvbGF0ZSBiZXR3ZWVuIHRoZW0uXFxuZmxvYXQgdW5wYWNrX21peF92ZWMyKGNvbnN0IHZlYzIgcGFja2VkVmFsdWUsIGNvbnN0IGZsb2F0IHQpIHtcXG4gICAgcmV0dXJuIG1peChwYWNrZWRWYWx1ZVswXSwgcGFja2VkVmFsdWVbMV0sIHQpO1xcbn1cXG5cXG4vLyBVbnBhY2sgYSBwYWlyIG9mIHBhaW50IHZhbHVlcyBhbmQgaW50ZXJwb2xhdGUgYmV0d2VlbiB0aGVtLlxcbnZlYzQgdW5wYWNrX21peF92ZWM0KGNvbnN0IHZlYzQgcGFja2VkQ29sb3JzLCBjb25zdCBmbG9hdCB0KSB7XFxuICAgIHZlYzQgbWluQ29sb3IgPSBkZWNvZGVfY29sb3IodmVjMihwYWNrZWRDb2xvcnNbMF0sIHBhY2tlZENvbG9yc1sxXSkpO1xcbiAgICB2ZWM0IG1heENvbG9yID0gZGVjb2RlX2NvbG9yKHZlYzIocGFja2VkQ29sb3JzWzJdLCBwYWNrZWRDb2xvcnNbM10pKTtcXG4gICAgcmV0dXJuIG1peChtaW5Db2xvciwgbWF4Q29sb3IsIHQpO1xcbn1cXG5cXG4vLyBUaGUgb2Zmc2V0IGRlcGVuZHMgb24gaG93IG1hbnkgcGl4ZWxzIGFyZSBiZXR3ZWVuIHRoZSB3b3JsZCBvcmlnaW4gYW5kIHRoZSBlZGdlIG9mIHRoZSB0aWxlOlxcbi8vIHZlYzIgb2Zmc2V0ID0gbW9kKHBpeGVsX2Nvb3JkLCBzaXplKVxcbi8vXFxuLy8gQXQgaGlnaCB6b29tIGxldmVscyB0aGVyZSBhcmUgYSB0b24gb2YgcGl4ZWxzIGJldHdlZW4gdGhlIHdvcmxkIG9yaWdpbiBhbmQgdGhlIGVkZ2Ugb2YgdGhlIHRpbGUuXFxuLy8gVGhlIGdsc2wgc3BlYyBvbmx5IGd1YXJhbnRlZXMgMTYgYml0cyBvZiBwcmVjaXNpb24gZm9yIGhpZ2hwIGZsb2F0cy4gV2UgbmVlZCBtb3JlIHRoYW4gdGhhdC5cXG4vL1xcbi8vIFRoZSBwaXhlbF9jb29yZCBpcyBwYXNzZWQgaW4gYXMgdHdvIDE2IGJpdCB2YWx1ZXM6XFxuLy8gcGl4ZWxfY29vcmRfdXBwZXIgPSBmbG9vcihwaXhlbF9jb29yZCAvIDJeMTYpXFxuLy8gcGl4ZWxfY29vcmRfbG93ZXIgPSBtb2QocGl4ZWxfY29vcmQsIDJeMTYpXFxuLy9cXG4vLyBUaGUgb2Zmc2V0IGlzIGNhbGN1bGF0ZWQgaW4gYSBzZXJpZXMgb2Ygc3RlcHMgdGhhdCBzaG91bGQgcHJlc2VydmUgdGhpcyBwcmVjaXNpb246XFxudmVjMiBnZXRfcGF0dGVybl9wb3MoY29uc3QgdmVjMiBwaXhlbF9jb29yZF91cHBlciwgY29uc3QgdmVjMiBwaXhlbF9jb29yZF9sb3dlcixcXG4gICAgY29uc3QgdmVjMiBwYXR0ZXJuX3NpemUsIGNvbnN0IGZsb2F0IHRpbGVfdW5pdHNfdG9fcGl4ZWxzLCBjb25zdCB2ZWMyIHBvcykge1xcblxcbiAgICB2ZWMyIG9mZnNldCA9IG1vZChtb2QobW9kKHBpeGVsX2Nvb3JkX3VwcGVyLCBwYXR0ZXJuX3NpemUpICogMjU2LjAsIHBhdHRlcm5fc2l6ZSkgKiAyNTYuMCArIHBpeGVsX2Nvb3JkX2xvd2VyLCBwYXR0ZXJuX3NpemUpO1xcbiAgICByZXR1cm4gKHRpbGVfdW5pdHNfdG9fcGl4ZWxzICogcG9zICsgb2Zmc2V0KSAvIHBhdHRlcm5fc2l6ZTtcXG59XFxuXCJ9LGNpcmNsZTp7ZnJhZ21lbnRTb3VyY2U6XCIjcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgY29sb3JcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgcmFkaXVzXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBzdHJva2VfY29sb3JcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgc3Ryb2tlX3dpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IHN0cm9rZV9vcGFjaXR5XFxuXFxudmFyeWluZyB2ZWMyIHZfZXh0cnVkZTtcXG52YXJ5aW5nIGxvd3AgZmxvYXQgdl9hbnRpYWxpYXNibHVyO1xcblxcbnZvaWQgbWFpbigpIHtcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBjb2xvclxcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIGZsb2F0IHJhZGl1c1xcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGJsdXJcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgc3Ryb2tlX2NvbG9yXFxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgZmxvYXQgc3Ryb2tlX3dpZHRoXFxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgc3Ryb2tlX29wYWNpdHlcXG5cXG4gICAgZmxvYXQgZXh0cnVkZV9sZW5ndGggPSBsZW5ndGgodl9leHRydWRlKTtcXG4gICAgZmxvYXQgYW50aWFsaWFzZWRfYmx1ciA9IC1tYXgoYmx1ciwgdl9hbnRpYWxpYXNibHVyKTtcXG5cXG4gICAgZmxvYXQgb3BhY2l0eV90ID0gc21vb3Roc3RlcCgwLjAsIGFudGlhbGlhc2VkX2JsdXIsIGV4dHJ1ZGVfbGVuZ3RoIC0gMS4wKTtcXG5cXG4gICAgZmxvYXQgY29sb3JfdCA9IHN0cm9rZV93aWR0aCA8IDAuMDEgPyAwLjAgOiBzbW9vdGhzdGVwKFxcbiAgICAgICAgYW50aWFsaWFzZWRfYmx1cixcXG4gICAgICAgIDAuMCxcXG4gICAgICAgIGV4dHJ1ZGVfbGVuZ3RoIC0gcmFkaXVzIC8gKHJhZGl1cyArIHN0cm9rZV93aWR0aClcXG4gICAgKTtcXG5cXG4gICAgZ2xfRnJhZ0NvbG9yID0gb3BhY2l0eV90ICogbWl4KGNvbG9yICogb3BhY2l0eSwgc3Ryb2tlX2NvbG9yICogc3Ryb2tlX29wYWNpdHksIGNvbG9yX3QpO1xcblxcbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcXG4gICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgxLjApO1xcbiNlbmRpZlxcbn1cXG5cIix2ZXJ0ZXhTb3VyY2U6XCJ1bmlmb3JtIG1hdDQgdV9tYXRyaXg7XFxudW5pZm9ybSBib29sIHVfc2NhbGVfd2l0aF9tYXA7XFxudW5pZm9ybSB2ZWMyIHVfZXh0cnVkZV9zY2FsZTtcXG5cXG5hdHRyaWJ1dGUgdmVjMiBhX3BvcztcXG5cXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgY29sb3JcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgcmFkaXVzXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBzdHJva2VfY29sb3JcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgc3Ryb2tlX3dpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IHN0cm9rZV9vcGFjaXR5XFxuXFxudmFyeWluZyB2ZWMyIHZfZXh0cnVkZTtcXG52YXJ5aW5nIGxvd3AgZmxvYXQgdl9hbnRpYWxpYXNibHVyO1xcblxcbnZvaWQgbWFpbih2b2lkKSB7XFxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgY29sb3JcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCBmbG9hdCByYWRpdXNcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBibHVyXFxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCB2ZWM0IHN0cm9rZV9jb2xvclxcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIGZsb2F0IHN0cm9rZV93aWR0aFxcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IHN0cm9rZV9vcGFjaXR5XFxuXFxuICAgIC8vIHVuZW5jb2RlIHRoZSBleHRydXNpb24gdmVjdG9yIHRoYXQgd2Ugc251Y2sgaW50byB0aGUgYV9wb3MgdmVjdG9yXFxuICAgIHZfZXh0cnVkZSA9IHZlYzIobW9kKGFfcG9zLCAyLjApICogMi4wIC0gMS4wKTtcXG5cXG4gICAgdmVjMiBleHRydWRlID0gdl9leHRydWRlICogKHJhZGl1cyArIHN0cm9rZV93aWR0aCkgKiB1X2V4dHJ1ZGVfc2NhbGU7XFxuICAgIC8vIG11bHRpcGx5IGFfcG9zIGJ5IDAuNSwgc2luY2Ugd2UgaGFkIGl0ICogMiBpbiBvcmRlciB0byBzbmVha1xcbiAgICAvLyBpbiBleHRydXNpb24gZGF0YVxcbiAgICBnbF9Qb3NpdGlvbiA9IHVfbWF0cml4ICogdmVjNChmbG9vcihhX3BvcyAqIDAuNSksIDAsIDEpO1xcblxcbiAgICBpZiAodV9zY2FsZV93aXRoX21hcCkge1xcbiAgICAgICAgZ2xfUG9zaXRpb24ueHkgKz0gZXh0cnVkZTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIGdsX1Bvc2l0aW9uLnh5ICs9IGV4dHJ1ZGUgKiBnbF9Qb3NpdGlvbi53O1xcbiAgICB9XFxuXFxuICAgIC8vIFRoaXMgaXMgYSBtaW5pbXVtIGJsdXIgZGlzdGFuY2UgdGhhdCBzZXJ2ZXMgYXMgYSBmYXV4LWFudGlhbGlhc2luZyBmb3JcXG4gICAgLy8gdGhlIGNpcmNsZS4gc2luY2UgYmx1ciBpcyBhIHJhdGlvIG9mIHRoZSBjaXJjbGUncyBzaXplIGFuZCB0aGUgaW50ZW50IGlzXFxuICAgIC8vIHRvIGtlZXAgdGhlIGJsdXIgYXQgcm91Z2hseSAxcHgsIHRoZSB0d28gYXJlIGludmVyc2VseSByZWxhdGVkLlxcbiAgICB2X2FudGlhbGlhc2JsdXIgPSAxLjAgLyBERVZJQ0VfUElYRUxfUkFUSU8gLyAocmFkaXVzICsgc3Ryb2tlX3dpZHRoKTtcXG59XFxuXCJ9LGNvbGxpc2lvbkJveDp7ZnJhZ21lbnRTb3VyY2U6XCJ1bmlmb3JtIGZsb2F0IHVfem9vbTtcXG51bmlmb3JtIGZsb2F0IHVfbWF4em9vbTtcXG5cXG52YXJ5aW5nIGZsb2F0IHZfbWF4X3pvb207XFxudmFyeWluZyBmbG9hdCB2X3BsYWNlbWVudF96b29tO1xcblxcbnZvaWQgbWFpbigpIHtcXG5cXG4gICAgZmxvYXQgYWxwaGEgPSAwLjU7XFxuXFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMC4wLCAxLjAsIDAuMCwgMS4wKSAqIGFscGhhO1xcblxcbiAgICBpZiAodl9wbGFjZW1lbnRfem9vbSA+IHVfem9vbSkge1xcbiAgICAgICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgxLjAsIDAuMCwgMC4wLCAxLjApICogYWxwaGE7XFxuICAgIH1cXG5cXG4gICAgaWYgKHVfem9vbSA+PSB2X21heF96b29tKSB7XFxuICAgICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuMCwgMC4wLCAwLjAsIDEuMCkgKiBhbHBoYSAqIDAuMjU7XFxuICAgIH1cXG5cXG4gICAgaWYgKHZfcGxhY2VtZW50X3pvb20gPj0gdV9tYXh6b29tKSB7XFxuICAgICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuMCwgMC4wLCAxLjAsIDEuMCkgKiBhbHBoYSAqIDAuMjtcXG4gICAgfVxcbn1cXG5cIix2ZXJ0ZXhTb3VyY2U6XCJhdHRyaWJ1dGUgdmVjMiBhX3BvcztcXG5hdHRyaWJ1dGUgdmVjMiBhX2V4dHJ1ZGU7XFxuYXR0cmlidXRlIHZlYzIgYV9kYXRhO1xcblxcbnVuaWZvcm0gbWF0NCB1X21hdHJpeDtcXG51bmlmb3JtIGZsb2F0IHVfc2NhbGU7XFxuXFxudmFyeWluZyBmbG9hdCB2X21heF96b29tO1xcbnZhcnlpbmcgZmxvYXQgdl9wbGFjZW1lbnRfem9vbTtcXG5cXG52b2lkIG1haW4oKSB7XFxuICAgIGdsX1Bvc2l0aW9uID0gdV9tYXRyaXggKiB2ZWM0KGFfcG9zICsgYV9leHRydWRlIC8gdV9zY2FsZSwgMC4wLCAxLjApO1xcblxcbiAgICB2X21heF96b29tID0gYV9kYXRhLng7XFxuICAgIHZfcGxhY2VtZW50X3pvb20gPSBhX2RhdGEueTtcXG59XFxuXCJ9LGRlYnVnOntmcmFnbWVudFNvdXJjZTpcInVuaWZvcm0gaGlnaHAgdmVjNCB1X2NvbG9yO1xcblxcbnZvaWQgbWFpbigpIHtcXG4gICAgZ2xfRnJhZ0NvbG9yID0gdV9jb2xvcjtcXG59XFxuXCIsdmVydGV4U291cmNlOlwiYXR0cmlidXRlIHZlYzIgYV9wb3M7XFxuXFxudW5pZm9ybSBtYXQ0IHVfbWF0cml4O1xcblxcbnZvaWQgbWFpbigpIHtcXG4gICAgZ2xfUG9zaXRpb24gPSB1X21hdHJpeCAqIHZlYzQoYV9wb3MsIHN0ZXAoMzI3NjcuMCwgYV9wb3MueCksIDEpO1xcbn1cXG5cIn0sZmlsbDp7ZnJhZ21lbnRTb3VyY2U6XCIjcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgY29sb3JcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcblxcbnZvaWQgbWFpbigpIHtcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBjb2xvclxcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG5cXG4gICAgZ2xfRnJhZ0NvbG9yID0gY29sb3IgKiBvcGFjaXR5O1xcblxcbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcXG4gICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgxLjApO1xcbiNlbmRpZlxcbn1cXG5cIix2ZXJ0ZXhTb3VyY2U6XCJhdHRyaWJ1dGUgdmVjMiBhX3BvcztcXG5cXG51bmlmb3JtIG1hdDQgdV9tYXRyaXg7XFxuXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG5cXG52b2lkIG1haW4oKSB7XFxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgY29sb3JcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuXFxuICAgIGdsX1Bvc2l0aW9uID0gdV9tYXRyaXggKiB2ZWM0KGFfcG9zLCAwLCAxKTtcXG59XFxuXCJ9LGZpbGxPdXRsaW5lOntmcmFnbWVudFNvdXJjZTpcIiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBvdXRsaW5lX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG5cXG52YXJ5aW5nIHZlYzIgdl9wb3M7XFxuXFxudm9pZCBtYWluKCkge1xcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCB2ZWM0IG91dGxpbmVfY29sb3JcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuXFxuICAgIGZsb2F0IGRpc3QgPSBsZW5ndGgodl9wb3MgLSBnbF9GcmFnQ29vcmQueHkpO1xcbiAgICBmbG9hdCBhbHBoYSA9IDEuMCAtIHNtb290aHN0ZXAoMC4wLCAxLjAsIGRpc3QpO1xcbiAgICBnbF9GcmFnQ29sb3IgPSBvdXRsaW5lX2NvbG9yICogKGFscGhhICogb3BhY2l0eSk7XFxuXFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDEuMCk7XFxuI2VuZGlmXFxufVxcblwiLHZlcnRleFNvdXJjZTpcImF0dHJpYnV0ZSB2ZWMyIGFfcG9zO1xcblxcbnVuaWZvcm0gbWF0NCB1X21hdHJpeDtcXG51bmlmb3JtIHZlYzIgdV93b3JsZDtcXG5cXG52YXJ5aW5nIHZlYzIgdl9wb3M7XFxuXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IG91dGxpbmVfY29sb3JcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcblxcbnZvaWQgbWFpbigpIHtcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBvdXRsaW5lX2NvbG9yXFxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcblxcbiAgICBnbF9Qb3NpdGlvbiA9IHVfbWF0cml4ICogdmVjNChhX3BvcywgMCwgMSk7XFxuICAgIHZfcG9zID0gKGdsX1Bvc2l0aW9uLnh5IC8gZ2xfUG9zaXRpb24udyArIDEuMCkgLyAyLjAgKiB1X3dvcmxkO1xcbn1cXG5cIn0sZmlsbE91dGxpbmVQYXR0ZXJuOntmcmFnbWVudFNvdXJjZTpcInVuaWZvcm0gdmVjMiB1X3BhdHRlcm5fdGxfYTtcXG51bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX2JyX2E7XFxudW5pZm9ybSB2ZWMyIHVfcGF0dGVybl90bF9iO1xcbnVuaWZvcm0gdmVjMiB1X3BhdHRlcm5fYnJfYjtcXG51bmlmb3JtIGZsb2F0IHVfbWl4O1xcblxcbnVuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7XFxuXFxudmFyeWluZyB2ZWMyIHZfcG9zX2E7XFxudmFyeWluZyB2ZWMyIHZfcG9zX2I7XFxudmFyeWluZyB2ZWMyIHZfcG9zO1xcblxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuXFxudm9pZCBtYWluKCkge1xcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG5cXG4gICAgdmVjMiBpbWFnZWNvb3JkID0gbW9kKHZfcG9zX2EsIDEuMCk7XFxuICAgIHZlYzIgcG9zID0gbWl4KHVfcGF0dGVybl90bF9hLCB1X3BhdHRlcm5fYnJfYSwgaW1hZ2Vjb29yZCk7XFxuICAgIHZlYzQgY29sb3IxID0gdGV4dHVyZTJEKHVfaW1hZ2UsIHBvcyk7XFxuXFxuICAgIHZlYzIgaW1hZ2Vjb29yZF9iID0gbW9kKHZfcG9zX2IsIDEuMCk7XFxuICAgIHZlYzIgcG9zMiA9IG1peCh1X3BhdHRlcm5fdGxfYiwgdV9wYXR0ZXJuX2JyX2IsIGltYWdlY29vcmRfYik7XFxuICAgIHZlYzQgY29sb3IyID0gdGV4dHVyZTJEKHVfaW1hZ2UsIHBvczIpO1xcblxcbiAgICAvLyBmaW5kIGRpc3RhbmNlIHRvIG91dGxpbmUgZm9yIGFscGhhIGludGVycG9sYXRpb25cXG5cXG4gICAgZmxvYXQgZGlzdCA9IGxlbmd0aCh2X3BvcyAtIGdsX0ZyYWdDb29yZC54eSk7XFxuICAgIGZsb2F0IGFscGhhID0gMS4wIC0gc21vb3Roc3RlcCgwLjAsIDEuMCwgZGlzdCk7XFxuXFxuXFxuICAgIGdsX0ZyYWdDb2xvciA9IG1peChjb2xvcjEsIGNvbG9yMiwgdV9taXgpICogYWxwaGEgKiBvcGFjaXR5O1xcblxcbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcXG4gICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgxLjApO1xcbiNlbmRpZlxcbn1cXG5cIix2ZXJ0ZXhTb3VyY2U6XCJ1bmlmb3JtIG1hdDQgdV9tYXRyaXg7XFxudW5pZm9ybSB2ZWMyIHVfd29ybGQ7XFxudW5pZm9ybSB2ZWMyIHVfcGF0dGVybl9zaXplX2E7XFxudW5pZm9ybSB2ZWMyIHVfcGF0dGVybl9zaXplX2I7XFxudW5pZm9ybSB2ZWMyIHVfcGl4ZWxfY29vcmRfdXBwZXI7XFxudW5pZm9ybSB2ZWMyIHVfcGl4ZWxfY29vcmRfbG93ZXI7XFxudW5pZm9ybSBmbG9hdCB1X3NjYWxlX2E7XFxudW5pZm9ybSBmbG9hdCB1X3NjYWxlX2I7XFxudW5pZm9ybSBmbG9hdCB1X3RpbGVfdW5pdHNfdG9fcGl4ZWxzO1xcblxcbmF0dHJpYnV0ZSB2ZWMyIGFfcG9zO1xcblxcbnZhcnlpbmcgdmVjMiB2X3Bvc19hO1xcbnZhcnlpbmcgdmVjMiB2X3Bvc19iO1xcbnZhcnlpbmcgdmVjMiB2X3BvcztcXG5cXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcblxcbnZvaWQgbWFpbigpIHtcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuXFxuICAgIGdsX1Bvc2l0aW9uID0gdV9tYXRyaXggKiB2ZWM0KGFfcG9zLCAwLCAxKTtcXG5cXG4gICAgdl9wb3NfYSA9IGdldF9wYXR0ZXJuX3Bvcyh1X3BpeGVsX2Nvb3JkX3VwcGVyLCB1X3BpeGVsX2Nvb3JkX2xvd2VyLCB1X3NjYWxlX2EgKiB1X3BhdHRlcm5fc2l6ZV9hLCB1X3RpbGVfdW5pdHNfdG9fcGl4ZWxzLCBhX3Bvcyk7XFxuICAgIHZfcG9zX2IgPSBnZXRfcGF0dGVybl9wb3ModV9waXhlbF9jb29yZF91cHBlciwgdV9waXhlbF9jb29yZF9sb3dlciwgdV9zY2FsZV9iICogdV9wYXR0ZXJuX3NpemVfYiwgdV90aWxlX3VuaXRzX3RvX3BpeGVscywgYV9wb3MpO1xcblxcbiAgICB2X3BvcyA9IChnbF9Qb3NpdGlvbi54eSAvIGdsX1Bvc2l0aW9uLncgKyAxLjApIC8gMi4wICogdV93b3JsZDtcXG59XFxuXCJ9LGZpbGxQYXR0ZXJuOntmcmFnbWVudFNvdXJjZTpcInVuaWZvcm0gdmVjMiB1X3BhdHRlcm5fdGxfYTtcXG51bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX2JyX2E7XFxudW5pZm9ybSB2ZWMyIHVfcGF0dGVybl90bF9iO1xcbnVuaWZvcm0gdmVjMiB1X3BhdHRlcm5fYnJfYjtcXG51bmlmb3JtIGZsb2F0IHVfbWl4O1xcblxcbnVuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7XFxuXFxudmFyeWluZyB2ZWMyIHZfcG9zX2E7XFxudmFyeWluZyB2ZWMyIHZfcG9zX2I7XFxuXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG5cXG52b2lkIG1haW4oKSB7XFxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcblxcbiAgICB2ZWMyIGltYWdlY29vcmQgPSBtb2Qodl9wb3NfYSwgMS4wKTtcXG4gICAgdmVjMiBwb3MgPSBtaXgodV9wYXR0ZXJuX3RsX2EsIHVfcGF0dGVybl9icl9hLCBpbWFnZWNvb3JkKTtcXG4gICAgdmVjNCBjb2xvcjEgPSB0ZXh0dXJlMkQodV9pbWFnZSwgcG9zKTtcXG5cXG4gICAgdmVjMiBpbWFnZWNvb3JkX2IgPSBtb2Qodl9wb3NfYiwgMS4wKTtcXG4gICAgdmVjMiBwb3MyID0gbWl4KHVfcGF0dGVybl90bF9iLCB1X3BhdHRlcm5fYnJfYiwgaW1hZ2Vjb29yZF9iKTtcXG4gICAgdmVjNCBjb2xvcjIgPSB0ZXh0dXJlMkQodV9pbWFnZSwgcG9zMik7XFxuXFxuICAgIGdsX0ZyYWdDb2xvciA9IG1peChjb2xvcjEsIGNvbG9yMiwgdV9taXgpICogb3BhY2l0eTtcXG5cXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XFxuXCIsdmVydGV4U291cmNlOlwidW5pZm9ybSBtYXQ0IHVfbWF0cml4O1xcbnVuaWZvcm0gdmVjMiB1X3BhdHRlcm5fc2l6ZV9hO1xcbnVuaWZvcm0gdmVjMiB1X3BhdHRlcm5fc2l6ZV9iO1xcbnVuaWZvcm0gdmVjMiB1X3BpeGVsX2Nvb3JkX3VwcGVyO1xcbnVuaWZvcm0gdmVjMiB1X3BpeGVsX2Nvb3JkX2xvd2VyO1xcbnVuaWZvcm0gZmxvYXQgdV9zY2FsZV9hO1xcbnVuaWZvcm0gZmxvYXQgdV9zY2FsZV9iO1xcbnVuaWZvcm0gZmxvYXQgdV90aWxlX3VuaXRzX3RvX3BpeGVscztcXG5cXG5hdHRyaWJ1dGUgdmVjMiBhX3BvcztcXG5cXG52YXJ5aW5nIHZlYzIgdl9wb3NfYTtcXG52YXJ5aW5nIHZlYzIgdl9wb3NfYjtcXG5cXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcblxcbnZvaWQgbWFpbigpIHtcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuXFxuICAgIGdsX1Bvc2l0aW9uID0gdV9tYXRyaXggKiB2ZWM0KGFfcG9zLCAwLCAxKTtcXG5cXG4gICAgdl9wb3NfYSA9IGdldF9wYXR0ZXJuX3Bvcyh1X3BpeGVsX2Nvb3JkX3VwcGVyLCB1X3BpeGVsX2Nvb3JkX2xvd2VyLCB1X3NjYWxlX2EgKiB1X3BhdHRlcm5fc2l6ZV9hLCB1X3RpbGVfdW5pdHNfdG9fcGl4ZWxzLCBhX3Bvcyk7XFxuICAgIHZfcG9zX2IgPSBnZXRfcGF0dGVybl9wb3ModV9waXhlbF9jb29yZF91cHBlciwgdV9waXhlbF9jb29yZF9sb3dlciwgdV9zY2FsZV9iICogdV9wYXR0ZXJuX3NpemVfYiwgdV90aWxlX3VuaXRzX3RvX3BpeGVscywgYV9wb3MpO1xcbn1cXG5cIn0sZmlsbEV4dHJ1c2lvbjp7ZnJhZ21lbnRTb3VyY2U6XCJ2YXJ5aW5nIHZlYzQgdl9jb2xvcjtcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgYmFzZVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBoZWlnaHRcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgY29sb3JcXG5cXG52b2lkIG1haW4oKSB7XFxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgYmFzZVxcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGhlaWdodFxcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCB2ZWM0IGNvbG9yXFxuXFxuICAgIGdsX0ZyYWdDb2xvciA9IHZfY29sb3I7XFxuXFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDEuMCk7XFxuI2VuZGlmXFxufVxcblwiLHZlcnRleFNvdXJjZTpcInVuaWZvcm0gbWF0NCB1X21hdHJpeDtcXG51bmlmb3JtIHZlYzMgdV9saWdodGNvbG9yO1xcbnVuaWZvcm0gbG93cCB2ZWMzIHVfbGlnaHRwb3M7XFxudW5pZm9ybSBsb3dwIGZsb2F0IHVfbGlnaHRpbnRlbnNpdHk7XFxuXFxuYXR0cmlidXRlIHZlYzIgYV9wb3M7XFxuYXR0cmlidXRlIHZlYzMgYV9ub3JtYWw7XFxuYXR0cmlidXRlIGZsb2F0IGFfZWRnZWRpc3RhbmNlO1xcblxcbnZhcnlpbmcgdmVjNCB2X2NvbG9yO1xcblxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBiYXNlXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGhlaWdodFxcblxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBjb2xvclxcblxcbnZvaWQgbWFpbigpIHtcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBiYXNlXFxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgaGVpZ2h0XFxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgY29sb3JcXG5cXG4gICAgYmFzZSA9IG1heCgwLjAsIGJhc2UpO1xcbiAgICBoZWlnaHQgPSBtYXgoMC4wLCBoZWlnaHQpO1xcblxcbiAgICBmbG9hdCBlZCA9IGFfZWRnZWRpc3RhbmNlOyAvLyB1c2UgZWFjaCBhdHRyaWIgaW4gb3JkZXIgdG8gbm90IHRyaXAgYSBWQU8gYXNzZXJ0XFxuICAgIGZsb2F0IHQgPSBtb2QoYV9ub3JtYWwueCwgMi4wKTtcXG5cXG4gICAgZ2xfUG9zaXRpb24gPSB1X21hdHJpeCAqIHZlYzQoYV9wb3MsIHQgPiAwLjAgPyBoZWlnaHQgOiBiYXNlLCAxKTtcXG5cXG4gICAgLy8gUmVsYXRpdmUgbHVtaW5hbmNlIChob3cgZGFyay9icmlnaHQgaXMgdGhlIHN1cmZhY2UgY29sb3I/KVxcbiAgICBmbG9hdCBjb2xvcnZhbHVlID0gY29sb3IuciAqIDAuMjEyNiArIGNvbG9yLmcgKiAwLjcxNTIgKyBjb2xvci5iICogMC4wNzIyO1xcblxcbiAgICB2X2NvbG9yID0gdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApO1xcblxcbiAgICAvLyBBZGQgc2xpZ2h0IGFtYmllbnQgbGlnaHRpbmcgc28gbm8gZXh0cnVzaW9ucyBhcmUgdG90YWxseSBibGFja1xcbiAgICB2ZWM0IGFtYmllbnRsaWdodCA9IHZlYzQoMC4wMywgMC4wMywgMC4wMywgMS4wKTtcXG4gICAgY29sb3IgKz0gYW1iaWVudGxpZ2h0O1xcblxcbiAgICAvLyBDYWxjdWxhdGUgY29zKHRoZXRhKSwgd2hlcmUgdGhldGEgaXMgdGhlIGFuZ2xlIGJldHdlZW4gc3VyZmFjZSBub3JtYWwgYW5kIGRpZmZ1c2UgbGlnaHQgcmF5XFxuICAgIGZsb2F0IGRpcmVjdGlvbmFsID0gY2xhbXAoZG90KGFfbm9ybWFsIC8gMTYzODQuMCwgdV9saWdodHBvcyksIDAuMCwgMS4wKTtcXG5cXG4gICAgLy8gQWRqdXN0IGRpcmVjdGlvbmFsIHNvIHRoYXRcXG4gICAgLy8gdGhlIHJhbmdlIG9mIHZhbHVlcyBmb3IgaGlnaGxpZ2h0L3NoYWRpbmcgaXMgbmFycm93ZXJcXG4gICAgLy8gd2l0aCBsb3dlciBsaWdodCBpbnRlbnNpdHlcXG4gICAgLy8gYW5kIHdpdGggbGlnaHRlci9icmlnaHRlciBzdXJmYWNlIGNvbG9yc1xcbiAgICBkaXJlY3Rpb25hbCA9IG1peCgoMS4wIC0gdV9saWdodGludGVuc2l0eSksIG1heCgoMS4wIC0gY29sb3J2YWx1ZSArIHVfbGlnaHRpbnRlbnNpdHkpLCAxLjApLCBkaXJlY3Rpb25hbCk7XFxuXFxuICAgIC8vIEFkZCBncmFkaWVudCBhbG9uZyB6IGF4aXMgb2Ygc2lkZSBzdXJmYWNlc1xcbiAgICBpZiAoYV9ub3JtYWwueSAhPSAwLjApIHtcXG4gICAgICAgIGRpcmVjdGlvbmFsICo9IGNsYW1wKCh0ICsgYmFzZSkgKiBwb3coaGVpZ2h0IC8gMTUwLjAsIDAuNSksIG1peCgwLjcsIDAuOTgsIDEuMCAtIHVfbGlnaHRpbnRlbnNpdHkpLCAxLjApO1xcbiAgICB9XFxuXFxuICAgIC8vIEFzc2lnbiBmaW5hbCBjb2xvciBiYXNlZCBvbiBzdXJmYWNlICsgYW1iaWVudCBsaWdodCBjb2xvciwgZGlmZnVzZSBsaWdodCBkaXJlY3Rpb25hbCwgYW5kIGxpZ2h0IGNvbG9yXFxuICAgIC8vIHdpdGggbG93ZXIgYm91bmRzIGFkanVzdGVkIHRvIGh1ZSBvZiBsaWdodFxcbiAgICAvLyBzbyB0aGF0IHNoYWRpbmcgaXMgdGludGVkIHdpdGggdGhlIGNvbXBsZW1lbnRhcnkgKG9wcG9zaXRlKSBjb2xvciB0byB0aGUgbGlnaHQgY29sb3JcXG4gICAgdl9jb2xvci5yICs9IGNsYW1wKGNvbG9yLnIgKiBkaXJlY3Rpb25hbCAqIHVfbGlnaHRjb2xvci5yLCBtaXgoMC4wLCAwLjMsIDEuMCAtIHVfbGlnaHRjb2xvci5yKSwgMS4wKTtcXG4gICAgdl9jb2xvci5nICs9IGNsYW1wKGNvbG9yLmcgKiBkaXJlY3Rpb25hbCAqIHVfbGlnaHRjb2xvci5nLCBtaXgoMC4wLCAwLjMsIDEuMCAtIHVfbGlnaHRjb2xvci5nKSwgMS4wKTtcXG4gICAgdl9jb2xvci5iICs9IGNsYW1wKGNvbG9yLmIgKiBkaXJlY3Rpb25hbCAqIHVfbGlnaHRjb2xvci5iLCBtaXgoMC4wLCAwLjMsIDEuMCAtIHVfbGlnaHRjb2xvci5iKSwgMS4wKTtcXG59XFxuXCJ9LGZpbGxFeHRydXNpb25QYXR0ZXJuOntmcmFnbWVudFNvdXJjZTpcInVuaWZvcm0gdmVjMiB1X3BhdHRlcm5fdGxfYTtcXG51bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX2JyX2E7XFxudW5pZm9ybSB2ZWMyIHVfcGF0dGVybl90bF9iO1xcbnVuaWZvcm0gdmVjMiB1X3BhdHRlcm5fYnJfYjtcXG51bmlmb3JtIGZsb2F0IHVfbWl4O1xcblxcbnVuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7XFxuXFxudmFyeWluZyB2ZWMyIHZfcG9zX2E7XFxudmFyeWluZyB2ZWMyIHZfcG9zX2I7XFxudmFyeWluZyB2ZWM0IHZfbGlnaHRpbmc7XFxuXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJhc2VcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgaGVpZ2h0XFxuXFxudm9pZCBtYWluKCkge1xcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGJhc2VcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBoZWlnaHRcXG5cXG4gICAgdmVjMiBpbWFnZWNvb3JkID0gbW9kKHZfcG9zX2EsIDEuMCk7XFxuICAgIHZlYzIgcG9zID0gbWl4KHVfcGF0dGVybl90bF9hLCB1X3BhdHRlcm5fYnJfYSwgaW1hZ2Vjb29yZCk7XFxuICAgIHZlYzQgY29sb3IxID0gdGV4dHVyZTJEKHVfaW1hZ2UsIHBvcyk7XFxuXFxuICAgIHZlYzIgaW1hZ2Vjb29yZF9iID0gbW9kKHZfcG9zX2IsIDEuMCk7XFxuICAgIHZlYzIgcG9zMiA9IG1peCh1X3BhdHRlcm5fdGxfYiwgdV9wYXR0ZXJuX2JyX2IsIGltYWdlY29vcmRfYik7XFxuICAgIHZlYzQgY29sb3IyID0gdGV4dHVyZTJEKHVfaW1hZ2UsIHBvczIpO1xcblxcbiAgICB2ZWM0IG1peGVkQ29sb3IgPSBtaXgoY29sb3IxLCBjb2xvcjIsIHVfbWl4KTtcXG5cXG4gICAgZ2xfRnJhZ0NvbG9yID0gbWl4ZWRDb2xvciAqIHZfbGlnaHRpbmc7XFxuXFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDEuMCk7XFxuI2VuZGlmXFxufVxcblwiLHZlcnRleFNvdXJjZTpcInVuaWZvcm0gbWF0NCB1X21hdHJpeDtcXG51bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX3NpemVfYTtcXG51bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX3NpemVfYjtcXG51bmlmb3JtIHZlYzIgdV9waXhlbF9jb29yZF91cHBlcjtcXG51bmlmb3JtIHZlYzIgdV9waXhlbF9jb29yZF9sb3dlcjtcXG51bmlmb3JtIGZsb2F0IHVfc2NhbGVfYTtcXG51bmlmb3JtIGZsb2F0IHVfc2NhbGVfYjtcXG51bmlmb3JtIGZsb2F0IHVfdGlsZV91bml0c190b19waXhlbHM7XFxudW5pZm9ybSBmbG9hdCB1X2hlaWdodF9mYWN0b3I7XFxuXFxudW5pZm9ybSB2ZWMzIHVfbGlnaHRjb2xvcjtcXG51bmlmb3JtIGxvd3AgdmVjMyB1X2xpZ2h0cG9zO1xcbnVuaWZvcm0gbG93cCBmbG9hdCB1X2xpZ2h0aW50ZW5zaXR5O1xcblxcbmF0dHJpYnV0ZSB2ZWMyIGFfcG9zO1xcbmF0dHJpYnV0ZSB2ZWMzIGFfbm9ybWFsO1xcbmF0dHJpYnV0ZSBmbG9hdCBhX2VkZ2VkaXN0YW5jZTtcXG5cXG52YXJ5aW5nIHZlYzIgdl9wb3NfYTtcXG52YXJ5aW5nIHZlYzIgdl9wb3NfYjtcXG52YXJ5aW5nIHZlYzQgdl9saWdodGluZztcXG52YXJ5aW5nIGZsb2F0IHZfZGlyZWN0aW9uYWw7XFxuXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJhc2VcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgaGVpZ2h0XFxuXFxudm9pZCBtYWluKCkge1xcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGJhc2VcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBoZWlnaHRcXG5cXG4gICAgYmFzZSA9IG1heCgwLjAsIGJhc2UpO1xcbiAgICBoZWlnaHQgPSBtYXgoMC4wLCBoZWlnaHQpO1xcblxcbiAgICBmbG9hdCB0ID0gbW9kKGFfbm9ybWFsLngsIDIuMCk7XFxuICAgIGZsb2F0IHogPSB0ID4gMC4wID8gaGVpZ2h0IDogYmFzZTtcXG5cXG4gICAgZ2xfUG9zaXRpb24gPSB1X21hdHJpeCAqIHZlYzQoYV9wb3MsIHosIDEpO1xcblxcbiAgICB2ZWMyIHBvcyA9IGFfbm9ybWFsLnggPT0gMS4wICYmIGFfbm9ybWFsLnkgPT0gMC4wICYmIGFfbm9ybWFsLnogPT0gMTYzODQuMFxcbiAgICAgICAgPyBhX3BvcyAvLyBleHRydXNpb24gdG9wXFxuICAgICAgICA6IHZlYzIoYV9lZGdlZGlzdGFuY2UsIHogKiB1X2hlaWdodF9mYWN0b3IpOyAvLyBleHRydXNpb24gc2lkZVxcblxcbiAgICB2X3Bvc19hID0gZ2V0X3BhdHRlcm5fcG9zKHVfcGl4ZWxfY29vcmRfdXBwZXIsIHVfcGl4ZWxfY29vcmRfbG93ZXIsIHVfc2NhbGVfYSAqIHVfcGF0dGVybl9zaXplX2EsIHVfdGlsZV91bml0c190b19waXhlbHMsIHBvcyk7XFxuICAgIHZfcG9zX2IgPSBnZXRfcGF0dGVybl9wb3ModV9waXhlbF9jb29yZF91cHBlciwgdV9waXhlbF9jb29yZF9sb3dlciwgdV9zY2FsZV9iICogdV9wYXR0ZXJuX3NpemVfYiwgdV90aWxlX3VuaXRzX3RvX3BpeGVscywgcG9zKTtcXG5cXG4gICAgdl9saWdodGluZyA9IHZlYzQoMC4wLCAwLjAsIDAuMCwgMS4wKTtcXG4gICAgZmxvYXQgZGlyZWN0aW9uYWwgPSBjbGFtcChkb3QoYV9ub3JtYWwgLyAxNjM4My4wLCB1X2xpZ2h0cG9zKSwgMC4wLCAxLjApO1xcbiAgICBkaXJlY3Rpb25hbCA9IG1peCgoMS4wIC0gdV9saWdodGludGVuc2l0eSksIG1heCgoMC41ICsgdV9saWdodGludGVuc2l0eSksIDEuMCksIGRpcmVjdGlvbmFsKTtcXG5cXG4gICAgaWYgKGFfbm9ybWFsLnkgIT0gMC4wKSB7XFxuICAgICAgICBkaXJlY3Rpb25hbCAqPSBjbGFtcCgodCArIGJhc2UpICogcG93KGhlaWdodCAvIDE1MC4wLCAwLjUpLCBtaXgoMC43LCAwLjk4LCAxLjAgLSB1X2xpZ2h0aW50ZW5zaXR5KSwgMS4wKTtcXG4gICAgfVxcblxcbiAgICB2X2xpZ2h0aW5nLnJnYiArPSBjbGFtcChkaXJlY3Rpb25hbCAqIHVfbGlnaHRjb2xvciwgbWl4KHZlYzMoMC4wKSwgdmVjMygwLjMpLCAxLjAgLSB1X2xpZ2h0Y29sb3IpLCB2ZWMzKDEuMCkpO1xcbn1cXG5cIn0sZXh0cnVzaW9uVGV4dHVyZTp7ZnJhZ21lbnRTb3VyY2U6XCJ1bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlO1xcbnVuaWZvcm0gZmxvYXQgdV9vcGFjaXR5O1xcbnZhcnlpbmcgdmVjMiB2X3BvcztcXG5cXG52b2lkIG1haW4oKSB7XFxuICAgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh1X2ltYWdlLCB2X3BvcykgKiB1X29wYWNpdHk7XFxuXFxuI2lmZGVmIE9WRVJEUkFXX0lOU1BFQ1RPUlxcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuMCk7XFxuI2VuZGlmXFxufVxcblwiLHZlcnRleFNvdXJjZTpcInVuaWZvcm0gbWF0NCB1X21hdHJpeDtcXG51bmlmb3JtIHZlYzIgdV93b3JsZDtcXG5hdHRyaWJ1dGUgdmVjMiBhX3BvcztcXG52YXJ5aW5nIHZlYzIgdl9wb3M7XFxuXFxudm9pZCBtYWluKCkge1xcbiAgICBnbF9Qb3NpdGlvbiA9IHVfbWF0cml4ICogdmVjNChhX3BvcyAqIHVfd29ybGQsIDAsIDEpO1xcblxcbiAgICB2X3Bvcy54ID0gYV9wb3MueDtcXG4gICAgdl9wb3MueSA9IDEuMCAtIGFfcG9zLnk7XFxufVxcblwifSxsaW5lOntmcmFnbWVudFNvdXJjZTpcIiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBjb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG5cXG52YXJ5aW5nIHZlYzIgdl93aWR0aDI7XFxudmFyeWluZyB2ZWMyIHZfbm9ybWFsO1xcbnZhcnlpbmcgZmxvYXQgdl9nYW1tYV9zY2FsZTtcXG5cXG52b2lkIG1haW4oKSB7XFxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgY29sb3JcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBibHVyXFxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxcblxcbiAgICAvLyBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIG9mIHRoZSBwaXhlbCBmcm9tIHRoZSBsaW5lIGluIHBpeGVscy5cXG4gICAgZmxvYXQgZGlzdCA9IGxlbmd0aCh2X25vcm1hbCkgKiB2X3dpZHRoMi5zO1xcblxcbiAgICAvLyBDYWxjdWxhdGUgdGhlIGFudGlhbGlhc2luZyBmYWRlIGZhY3Rvci4gVGhpcyBpcyBlaXRoZXIgd2hlbiBmYWRpbmcgaW5cXG4gICAgLy8gdGhlIGxpbmUgaW4gY2FzZSBvZiBhbiBvZmZzZXQgbGluZSAodl93aWR0aDIudCkgb3Igd2hlbiBmYWRpbmcgb3V0XFxuICAgIC8vICh2X3dpZHRoMi5zKVxcbiAgICBmbG9hdCBibHVyMiA9IChibHVyICsgMS4wIC8gREVWSUNFX1BJWEVMX1JBVElPKSAqIHZfZ2FtbWFfc2NhbGU7XFxuICAgIGZsb2F0IGFscGhhID0gY2xhbXAobWluKGRpc3QgLSAodl93aWR0aDIudCAtIGJsdXIyKSwgdl93aWR0aDIucyAtIGRpc3QpIC8gYmx1cjIsIDAuMCwgMS4wKTtcXG5cXG4gICAgZ2xfRnJhZ0NvbG9yID0gY29sb3IgKiAoYWxwaGEgKiBvcGFjaXR5KTtcXG5cXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XFxuXCIsdmVydGV4U291cmNlOlwiXFxuXFxuLy8gdGhlIGRpc3RhbmNlIG92ZXIgd2hpY2ggdGhlIGxpbmUgZWRnZSBmYWRlcyBvdXQuXFxuLy8gUmV0aW5hIGRldmljZXMgbmVlZCBhIHNtYWxsZXIgZGlzdGFuY2UgdG8gYXZvaWQgYWxpYXNpbmcuXFxuI2RlZmluZSBBTlRJQUxJQVNJTkcgMS4wIC8gREVWSUNFX1BJWEVMX1JBVElPIC8gMi4wXFxuXFxuLy8gZmxvb3IoMTI3IC8gMikgPT0gNjMuMFxcbi8vIHRoZSBtYXhpbXVtIGFsbG93ZWQgbWl0ZXIgbGltaXQgaXMgMi4wIGF0IHRoZSBtb21lbnQuIHRoZSBleHRydWRlIG5vcm1hbCBpc1xcbi8vIHN0b3JlZCBpbiBhIGJ5dGUgKC0xMjguLjEyNykuIHdlIHNjYWxlIHJlZ3VsYXIgbm9ybWFscyB1cCB0byBsZW5ndGggNjMsIGJ1dFxcbi8vIHRoZXJlIGFyZSBhbHNvIFxcXCJzcGVjaWFsXFxcIiBub3JtYWxzIHRoYXQgaGF2ZSBhIGJpZ2dlciBsZW5ndGggKG9mIHVwIHRvIDEyNiBpblxcbi8vIHRoaXMgY2FzZSkuXFxuLy8gI2RlZmluZSBzY2FsZSA2My4wXFxuI2RlZmluZSBzY2FsZSAwLjAxNTg3MzAxNlxcblxcbmF0dHJpYnV0ZSB2ZWMyIGFfcG9zO1xcbmF0dHJpYnV0ZSB2ZWM0IGFfZGF0YTtcXG5cXG51bmlmb3JtIG1hdDQgdV9tYXRyaXg7XFxudW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfcmF0aW87XFxudW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfd2lkdGg7XFxudW5pZm9ybSB2ZWMyIHVfZ2xfdW5pdHNfdG9fcGl4ZWxzO1xcblxcbnZhcnlpbmcgdmVjMiB2X25vcm1hbDtcXG52YXJ5aW5nIHZlYzIgdl93aWR0aDI7XFxudmFyeWluZyBmbG9hdCB2X2dhbW1hX3NjYWxlO1xcblxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBjb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIG1lZGl1bXAgZmxvYXQgZ2Fwd2lkdGhcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb2Zmc2V0XFxuXFxudm9pZCBtYWluKCkge1xcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCB2ZWM0IGNvbG9yXFxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgYmx1clxcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbWVkaXVtcCBmbG9hdCBnYXB3aWR0aFxcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9mZnNldFxcblxcbiAgICB2ZWMyIGFfZXh0cnVkZSA9IGFfZGF0YS54eSAtIDEyOC4wO1xcbiAgICBmbG9hdCBhX2RpcmVjdGlvbiA9IG1vZChhX2RhdGEueiwgNC4wKSAtIDEuMDtcXG5cXG4gICAgLy8gV2Ugc3RvcmUgdGhlIHRleHR1cmUgbm9ybWFscyBpbiB0aGUgbW9zdCBpbnNpZ25pZmljYW50IGJpdFxcbiAgICAvLyB0cmFuc2Zvcm0geSBzbyB0aGF0IDAgPT4gLTEgYW5kIDEgPT4gMVxcbiAgICAvLyBJbiB0aGUgdGV4dHVyZSBub3JtYWwsIHggaXMgMCBpZiB0aGUgbm9ybWFsIHBvaW50cyBzdHJhaWdodCB1cC9kb3duIGFuZCAxIGlmIGl0J3MgYSByb3VuZCBjYXBcXG4gICAgLy8geSBpcyAxIGlmIHRoZSBub3JtYWwgcG9pbnRzIHVwLCBhbmQgLTEgaWYgaXQgcG9pbnRzIGRvd25cXG4gICAgbWVkaXVtcCB2ZWMyIG5vcm1hbCA9IG1vZChhX3BvcywgMi4wKTtcXG4gICAgbm9ybWFsLnkgPSBzaWduKG5vcm1hbC55IC0gMC41KTtcXG4gICAgdl9ub3JtYWwgPSBub3JtYWw7XFxuXFxuXFxuICAgIC8vIHRoZXNlIHRyYW5zZm9ybWF0aW9ucyB1c2VkIHRvIGJlIGFwcGxpZWQgaW4gdGhlIEpTIGFuZCBuYXRpdmUgY29kZSBiYXNlcy4gXFxuICAgIC8vIG1vdmVkIHRoZW0gaW50byB0aGUgc2hhZGVyIGZvciBjbGFyaXR5IGFuZCBzaW1wbGljaXR5LiBcXG4gICAgZ2Fwd2lkdGggPSBnYXB3aWR0aCAvIDIuMDtcXG4gICAgZmxvYXQgd2lkdGggPSB1X3dpZHRoIC8gMi4wO1xcbiAgICBvZmZzZXQgPSAtMS4wICogb2Zmc2V0OyBcXG5cXG4gICAgZmxvYXQgaW5zZXQgPSBnYXB3aWR0aCArIChnYXB3aWR0aCA+IDAuMCA/IEFOVElBTElBU0lORyA6IDAuMCk7XFxuICAgIGZsb2F0IG91dHNldCA9IGdhcHdpZHRoICsgd2lkdGggKiAoZ2Fwd2lkdGggPiAwLjAgPyAyLjAgOiAxLjApICsgQU5USUFMSUFTSU5HO1xcblxcbiAgICAvLyBTY2FsZSB0aGUgZXh0cnVzaW9uIHZlY3RvciBkb3duIHRvIGEgbm9ybWFsIGFuZCB0aGVuIHVwIGJ5IHRoZSBsaW5lIHdpZHRoXFxuICAgIC8vIG9mIHRoaXMgdmVydGV4LlxcbiAgICBtZWRpdW1wIHZlYzIgZGlzdCA9IG91dHNldCAqIGFfZXh0cnVkZSAqIHNjYWxlO1xcblxcbiAgICAvLyBDYWxjdWxhdGUgdGhlIG9mZnNldCB3aGVuIGRyYXdpbmcgYSBsaW5lIHRoYXQgaXMgdG8gdGhlIHNpZGUgb2YgdGhlIGFjdHVhbCBsaW5lLlxcbiAgICAvLyBXZSBkbyB0aGlzIGJ5IGNyZWF0aW5nIGEgdmVjdG9yIHRoYXQgcG9pbnRzIHRvd2FyZHMgdGhlIGV4dHJ1ZGUsIGJ1dCByb3RhdGVcXG4gICAgLy8gaXQgd2hlbiB3ZSdyZSBkcmF3aW5nIHJvdW5kIGVuZCBwb2ludHMgKGFfZGlyZWN0aW9uID0gLTEgb3IgMSkgc2luY2UgdGhlaXJcXG4gICAgLy8gZXh0cnVkZSB2ZWN0b3IgcG9pbnRzIGluIGFub3RoZXIgZGlyZWN0aW9uLlxcbiAgICBtZWRpdW1wIGZsb2F0IHUgPSAwLjUgKiBhX2RpcmVjdGlvbjtcXG4gICAgbWVkaXVtcCBmbG9hdCB0ID0gMS4wIC0gYWJzKHUpO1xcbiAgICBtZWRpdW1wIHZlYzIgb2Zmc2V0MiA9IG9mZnNldCAqIGFfZXh0cnVkZSAqIHNjYWxlICogbm9ybWFsLnkgKiBtYXQyKHQsIC11LCB1LCB0KTtcXG5cXG4gICAgLy8gUmVtb3ZlIHRoZSB0ZXh0dXJlIG5vcm1hbCBiaXQgdG8gZ2V0IHRoZSBwb3NpdGlvblxcbiAgICB2ZWMyIHBvcyA9IGZsb29yKGFfcG9zICogMC41KTtcXG5cXG4gICAgdmVjNCBwcm9qZWN0ZWRfZXh0cnVkZSA9IHVfbWF0cml4ICogdmVjNChkaXN0IC8gdV9yYXRpbywgMC4wLCAwLjApO1xcbiAgICBnbF9Qb3NpdGlvbiA9IHVfbWF0cml4ICogdmVjNChwb3MgKyBvZmZzZXQyIC8gdV9yYXRpbywgMC4wLCAxLjApICsgcHJvamVjdGVkX2V4dHJ1ZGU7XFxuXFxuICAgIC8vIGNhbGN1bGF0ZSBob3cgbXVjaCB0aGUgcGVyc3BlY3RpdmUgdmlldyBzcXVpc2hlcyBvciBzdHJldGNoZXMgdGhlIGV4dHJ1ZGVcXG4gICAgZmxvYXQgZXh0cnVkZV9sZW5ndGhfd2l0aG91dF9wZXJzcGVjdGl2ZSA9IGxlbmd0aChkaXN0KTtcXG4gICAgZmxvYXQgZXh0cnVkZV9sZW5ndGhfd2l0aF9wZXJzcGVjdGl2ZSA9IGxlbmd0aChwcm9qZWN0ZWRfZXh0cnVkZS54eSAvIGdsX1Bvc2l0aW9uLncgKiB1X2dsX3VuaXRzX3RvX3BpeGVscyk7XFxuICAgIHZfZ2FtbWFfc2NhbGUgPSBleHRydWRlX2xlbmd0aF93aXRob3V0X3BlcnNwZWN0aXZlIC8gZXh0cnVkZV9sZW5ndGhfd2l0aF9wZXJzcGVjdGl2ZTtcXG5cXG4gICAgdl93aWR0aDIgPSB2ZWMyKG91dHNldCwgaW5zZXQpO1xcbn1cXG5cIn0sbGluZVBhdHRlcm46e2ZyYWdtZW50U291cmNlOlwidW5pZm9ybSB2ZWMyIHVfcGF0dGVybl9zaXplX2E7XFxudW5pZm9ybSB2ZWMyIHVfcGF0dGVybl9zaXplX2I7XFxudW5pZm9ybSB2ZWMyIHVfcGF0dGVybl90bF9hO1xcbnVuaWZvcm0gdmVjMiB1X3BhdHRlcm5fYnJfYTtcXG51bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX3RsX2I7XFxudW5pZm9ybSB2ZWMyIHVfcGF0dGVybl9icl9iO1xcbnVuaWZvcm0gZmxvYXQgdV9mYWRlO1xcblxcbnVuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7XFxuXFxudmFyeWluZyB2ZWMyIHZfbm9ybWFsO1xcbnZhcnlpbmcgdmVjMiB2X3dpZHRoMjtcXG52YXJ5aW5nIGZsb2F0IHZfbGluZXNvZmFyO1xcbnZhcnlpbmcgZmxvYXQgdl9nYW1tYV9zY2FsZTtcXG5cXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgYmx1clxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuXFxudm9pZCBtYWluKCkge1xcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGJsdXJcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuXFxuICAgIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2Ugb2YgdGhlIHBpeGVsIGZyb20gdGhlIGxpbmUgaW4gcGl4ZWxzLlxcbiAgICBmbG9hdCBkaXN0ID0gbGVuZ3RoKHZfbm9ybWFsKSAqIHZfd2lkdGgyLnM7XFxuXFxuICAgIC8vIENhbGN1bGF0ZSB0aGUgYW50aWFsaWFzaW5nIGZhZGUgZmFjdG9yLiBUaGlzIGlzIGVpdGhlciB3aGVuIGZhZGluZyBpblxcbiAgICAvLyB0aGUgbGluZSBpbiBjYXNlIG9mIGFuIG9mZnNldCBsaW5lICh2X3dpZHRoMi50KSBvciB3aGVuIGZhZGluZyBvdXRcXG4gICAgLy8gKHZfd2lkdGgyLnMpXFxuICAgIGZsb2F0IGJsdXIyID0gKGJsdXIgKyAxLjAgLyBERVZJQ0VfUElYRUxfUkFUSU8pICogdl9nYW1tYV9zY2FsZTtcXG4gICAgZmxvYXQgYWxwaGEgPSBjbGFtcChtaW4oZGlzdCAtICh2X3dpZHRoMi50IC0gYmx1cjIpLCB2X3dpZHRoMi5zIC0gZGlzdCkgLyBibHVyMiwgMC4wLCAxLjApO1xcblxcbiAgICBmbG9hdCB4X2EgPSBtb2Qodl9saW5lc29mYXIgLyB1X3BhdHRlcm5fc2l6ZV9hLngsIDEuMCk7XFxuICAgIGZsb2F0IHhfYiA9IG1vZCh2X2xpbmVzb2ZhciAvIHVfcGF0dGVybl9zaXplX2IueCwgMS4wKTtcXG4gICAgZmxvYXQgeV9hID0gMC41ICsgKHZfbm9ybWFsLnkgKiB2X3dpZHRoMi5zIC8gdV9wYXR0ZXJuX3NpemVfYS55KTtcXG4gICAgZmxvYXQgeV9iID0gMC41ICsgKHZfbm9ybWFsLnkgKiB2X3dpZHRoMi5zIC8gdV9wYXR0ZXJuX3NpemVfYi55KTtcXG4gICAgdmVjMiBwb3NfYSA9IG1peCh1X3BhdHRlcm5fdGxfYSwgdV9wYXR0ZXJuX2JyX2EsIHZlYzIoeF9hLCB5X2EpKTtcXG4gICAgdmVjMiBwb3NfYiA9IG1peCh1X3BhdHRlcm5fdGxfYiwgdV9wYXR0ZXJuX2JyX2IsIHZlYzIoeF9iLCB5X2IpKTtcXG5cXG4gICAgdmVjNCBjb2xvciA9IG1peCh0ZXh0dXJlMkQodV9pbWFnZSwgcG9zX2EpLCB0ZXh0dXJlMkQodV9pbWFnZSwgcG9zX2IpLCB1X2ZhZGUpO1xcblxcbiAgICBnbF9GcmFnQ29sb3IgPSBjb2xvciAqIGFscGhhICogb3BhY2l0eTtcXG5cXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XFxuXCIsdmVydGV4U291cmNlOlwiLy8gZmxvb3IoMTI3IC8gMikgPT0gNjMuMFxcbi8vIHRoZSBtYXhpbXVtIGFsbG93ZWQgbWl0ZXIgbGltaXQgaXMgMi4wIGF0IHRoZSBtb21lbnQuIHRoZSBleHRydWRlIG5vcm1hbCBpc1xcbi8vIHN0b3JlZCBpbiBhIGJ5dGUgKC0xMjguLjEyNykuIHdlIHNjYWxlIHJlZ3VsYXIgbm9ybWFscyB1cCB0byBsZW5ndGggNjMsIGJ1dFxcbi8vIHRoZXJlIGFyZSBhbHNvIFxcXCJzcGVjaWFsXFxcIiBub3JtYWxzIHRoYXQgaGF2ZSBhIGJpZ2dlciBsZW5ndGggKG9mIHVwIHRvIDEyNiBpblxcbi8vIHRoaXMgY2FzZSkuXFxuLy8gI2RlZmluZSBzY2FsZSA2My4wXFxuI2RlZmluZSBzY2FsZSAwLjAxNTg3MzAxNlxcblxcbi8vIFdlIHNjYWxlIHRoZSBkaXN0YW5jZSBiZWZvcmUgYWRkaW5nIGl0IHRvIHRoZSBidWZmZXJzIHNvIHRoYXQgd2UgY2FuIHN0b3JlXFxuLy8gbG9uZyBkaXN0YW5jZXMgZm9yIGxvbmcgc2VnbWVudHMuIFVzZSB0aGlzIHZhbHVlIHRvIHVuc2NhbGUgdGhlIGRpc3RhbmNlLlxcbiNkZWZpbmUgTElORV9ESVNUQU5DRV9TQ0FMRSAyLjBcXG5cXG4vLyB0aGUgZGlzdGFuY2Ugb3ZlciB3aGljaCB0aGUgbGluZSBlZGdlIGZhZGVzIG91dC5cXG4vLyBSZXRpbmEgZGV2aWNlcyBuZWVkIGEgc21hbGxlciBkaXN0YW5jZSB0byBhdm9pZCBhbGlhc2luZy5cXG4jZGVmaW5lIEFOVElBTElBU0lORyAxLjAgLyBERVZJQ0VfUElYRUxfUkFUSU8gLyAyLjBcXG5cXG5hdHRyaWJ1dGUgdmVjMiBhX3BvcztcXG5hdHRyaWJ1dGUgdmVjNCBhX2RhdGE7XFxuXFxudW5pZm9ybSBtYXQ0IHVfbWF0cml4O1xcbnVuaWZvcm0gbWVkaXVtcCBmbG9hdCB1X3JhdGlvO1xcbnVuaWZvcm0gbWVkaXVtcCBmbG9hdCB1X3dpZHRoO1xcbnVuaWZvcm0gdmVjMiB1X2dsX3VuaXRzX3RvX3BpeGVscztcXG5cXG52YXJ5aW5nIHZlYzIgdl9ub3JtYWw7XFxudmFyeWluZyB2ZWMyIHZfd2lkdGgyO1xcbnZhcnlpbmcgZmxvYXQgdl9saW5lc29mYXI7XFxudmFyeWluZyBmbG9hdCB2X2dhbW1hX3NjYWxlO1xcblxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBibHVyXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb2Zmc2V0XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBtZWRpdW1wIGZsb2F0IGdhcHdpZHRoXFxuXFxudm9pZCBtYWluKCkge1xcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGJsdXJcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb2Zmc2V0XFxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgZmxvYXQgZ2Fwd2lkdGhcXG5cXG4gICAgdmVjMiBhX2V4dHJ1ZGUgPSBhX2RhdGEueHkgLSAxMjguMDtcXG4gICAgZmxvYXQgYV9kaXJlY3Rpb24gPSBtb2QoYV9kYXRhLnosIDQuMCkgLSAxLjA7XFxuICAgIGZsb2F0IGFfbGluZXNvZmFyID0gKGZsb29yKGFfZGF0YS56IC8gNC4wKSArIGFfZGF0YS53ICogNjQuMCkgKiBMSU5FX0RJU1RBTkNFX1NDQUxFO1xcblxcbiAgICAvLyBXZSBzdG9yZSB0aGUgdGV4dHVyZSBub3JtYWxzIGluIHRoZSBtb3N0IGluc2lnbmlmaWNhbnQgYml0XFxuICAgIC8vIHRyYW5zZm9ybSB5IHNvIHRoYXQgMCA9PiAtMSBhbmQgMSA9PiAxXFxuICAgIC8vIEluIHRoZSB0ZXh0dXJlIG5vcm1hbCwgeCBpcyAwIGlmIHRoZSBub3JtYWwgcG9pbnRzIHN0cmFpZ2h0IHVwL2Rvd24gYW5kIDEgaWYgaXQncyBhIHJvdW5kIGNhcFxcbiAgICAvLyB5IGlzIDEgaWYgdGhlIG5vcm1hbCBwb2ludHMgdXAsIGFuZCAtMSBpZiBpdCBwb2ludHMgZG93blxcbiAgICBtZWRpdW1wIHZlYzIgbm9ybWFsID0gbW9kKGFfcG9zLCAyLjApO1xcbiAgICBub3JtYWwueSA9IHNpZ24obm9ybWFsLnkgLSAwLjUpO1xcbiAgICB2X25vcm1hbCA9IG5vcm1hbDtcXG5cXG4gICAgLy8gdGhlc2UgdHJhbnNmb3JtYXRpb25zIHVzZWQgdG8gYmUgYXBwbGllZCBpbiB0aGUgSlMgYW5kIG5hdGl2ZSBjb2RlIGJhc2VzLiBcXG4gICAgLy8gbW92ZWQgdGhlbSBpbnRvIHRoZSBzaGFkZXIgZm9yIGNsYXJpdHkgYW5kIHNpbXBsaWNpdHkuIFxcbiAgICBnYXB3aWR0aCA9IGdhcHdpZHRoIC8gMi4wO1xcbiAgICBmbG9hdCB3aWR0aCA9IHVfd2lkdGggLyAyLjA7XFxuICAgIG9mZnNldCA9IC0xLjAgKiBvZmZzZXQ7IFxcblxcbiAgICBmbG9hdCBpbnNldCA9IGdhcHdpZHRoICsgKGdhcHdpZHRoID4gMC4wID8gQU5USUFMSUFTSU5HIDogMC4wKTtcXG4gICAgZmxvYXQgb3V0c2V0ID0gZ2Fwd2lkdGggKyB3aWR0aCAqIChnYXB3aWR0aCA+IDAuMCA/IDIuMCA6IDEuMCkgKyBBTlRJQUxJQVNJTkc7XFxuXFxuICAgIC8vIFNjYWxlIHRoZSBleHRydXNpb24gdmVjdG9yIGRvd24gdG8gYSBub3JtYWwgYW5kIHRoZW4gdXAgYnkgdGhlIGxpbmUgd2lkdGhcXG4gICAgLy8gb2YgdGhpcyB2ZXJ0ZXguXFxuICAgIG1lZGl1bXAgdmVjMiBkaXN0ID0gb3V0c2V0ICogYV9leHRydWRlICogc2NhbGU7XFxuXFxuICAgIC8vIENhbGN1bGF0ZSB0aGUgb2Zmc2V0IHdoZW4gZHJhd2luZyBhIGxpbmUgdGhhdCBpcyB0byB0aGUgc2lkZSBvZiB0aGUgYWN0dWFsIGxpbmUuXFxuICAgIC8vIFdlIGRvIHRoaXMgYnkgY3JlYXRpbmcgYSB2ZWN0b3IgdGhhdCBwb2ludHMgdG93YXJkcyB0aGUgZXh0cnVkZSwgYnV0IHJvdGF0ZVxcbiAgICAvLyBpdCB3aGVuIHdlJ3JlIGRyYXdpbmcgcm91bmQgZW5kIHBvaW50cyAoYV9kaXJlY3Rpb24gPSAtMSBvciAxKSBzaW5jZSB0aGVpclxcbiAgICAvLyBleHRydWRlIHZlY3RvciBwb2ludHMgaW4gYW5vdGhlciBkaXJlY3Rpb24uXFxuICAgIG1lZGl1bXAgZmxvYXQgdSA9IDAuNSAqIGFfZGlyZWN0aW9uO1xcbiAgICBtZWRpdW1wIGZsb2F0IHQgPSAxLjAgLSBhYnModSk7XFxuICAgIG1lZGl1bXAgdmVjMiBvZmZzZXQyID0gb2Zmc2V0ICogYV9leHRydWRlICogc2NhbGUgKiBub3JtYWwueSAqIG1hdDIodCwgLXUsIHUsIHQpO1xcblxcbiAgICAvLyBSZW1vdmUgdGhlIHRleHR1cmUgbm9ybWFsIGJpdCB0byBnZXQgdGhlIHBvc2l0aW9uXFxuICAgIHZlYzIgcG9zID0gZmxvb3IoYV9wb3MgKiAwLjUpO1xcblxcbiAgICB2ZWM0IHByb2plY3RlZF9leHRydWRlID0gdV9tYXRyaXggKiB2ZWM0KGRpc3QgLyB1X3JhdGlvLCAwLjAsIDAuMCk7XFxuICAgIGdsX1Bvc2l0aW9uID0gdV9tYXRyaXggKiB2ZWM0KHBvcyArIG9mZnNldDIgLyB1X3JhdGlvLCAwLjAsIDEuMCkgKyBwcm9qZWN0ZWRfZXh0cnVkZTtcXG5cXG4gICAgLy8gY2FsY3VsYXRlIGhvdyBtdWNoIHRoZSBwZXJzcGVjdGl2ZSB2aWV3IHNxdWlzaGVzIG9yIHN0cmV0Y2hlcyB0aGUgZXh0cnVkZVxcbiAgICBmbG9hdCBleHRydWRlX2xlbmd0aF93aXRob3V0X3BlcnNwZWN0aXZlID0gbGVuZ3RoKGRpc3QpO1xcbiAgICBmbG9hdCBleHRydWRlX2xlbmd0aF93aXRoX3BlcnNwZWN0aXZlID0gbGVuZ3RoKHByb2plY3RlZF9leHRydWRlLnh5IC8gZ2xfUG9zaXRpb24udyAqIHVfZ2xfdW5pdHNfdG9fcGl4ZWxzKTtcXG4gICAgdl9nYW1tYV9zY2FsZSA9IGV4dHJ1ZGVfbGVuZ3RoX3dpdGhvdXRfcGVyc3BlY3RpdmUgLyBleHRydWRlX2xlbmd0aF93aXRoX3BlcnNwZWN0aXZlO1xcblxcbiAgICB2X2xpbmVzb2ZhciA9IGFfbGluZXNvZmFyO1xcbiAgICB2X3dpZHRoMiA9IHZlYzIob3V0c2V0LCBpbnNldCk7XFxufVxcblwifSxsaW5lU0RGOntmcmFnbWVudFNvdXJjZTpcIlxcbnVuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7XFxudW5pZm9ybSBmbG9hdCB1X3NkZmdhbW1hO1xcbnVuaWZvcm0gZmxvYXQgdV9taXg7XFxuXFxudmFyeWluZyB2ZWMyIHZfbm9ybWFsO1xcbnZhcnlpbmcgdmVjMiB2X3dpZHRoMjtcXG52YXJ5aW5nIHZlYzIgdl90ZXhfYTtcXG52YXJ5aW5nIHZlYzIgdl90ZXhfYjtcXG52YXJ5aW5nIGZsb2F0IHZfZ2FtbWFfc2NhbGU7XFxuXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGNvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGJsdXJcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcblxcbnZvaWQgbWFpbigpIHtcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBjb2xvclxcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGJsdXJcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuXFxuICAgIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2Ugb2YgdGhlIHBpeGVsIGZyb20gdGhlIGxpbmUgaW4gcGl4ZWxzLlxcbiAgICBmbG9hdCBkaXN0ID0gbGVuZ3RoKHZfbm9ybWFsKSAqIHZfd2lkdGgyLnM7XFxuXFxuICAgIC8vIENhbGN1bGF0ZSB0aGUgYW50aWFsaWFzaW5nIGZhZGUgZmFjdG9yLiBUaGlzIGlzIGVpdGhlciB3aGVuIGZhZGluZyBpblxcbiAgICAvLyB0aGUgbGluZSBpbiBjYXNlIG9mIGFuIG9mZnNldCBsaW5lICh2X3dpZHRoMi50KSBvciB3aGVuIGZhZGluZyBvdXRcXG4gICAgLy8gKHZfd2lkdGgyLnMpXFxuICAgIGZsb2F0IGJsdXIyID0gKGJsdXIgKyAxLjAgLyBERVZJQ0VfUElYRUxfUkFUSU8pICogdl9nYW1tYV9zY2FsZTtcXG4gICAgZmxvYXQgYWxwaGEgPSBjbGFtcChtaW4oZGlzdCAtICh2X3dpZHRoMi50IC0gYmx1cjIpLCB2X3dpZHRoMi5zIC0gZGlzdCkgLyBibHVyMiwgMC4wLCAxLjApO1xcblxcbiAgICBmbG9hdCBzZGZkaXN0X2EgPSB0ZXh0dXJlMkQodV9pbWFnZSwgdl90ZXhfYSkuYTtcXG4gICAgZmxvYXQgc2RmZGlzdF9iID0gdGV4dHVyZTJEKHVfaW1hZ2UsIHZfdGV4X2IpLmE7XFxuICAgIGZsb2F0IHNkZmRpc3QgPSBtaXgoc2RmZGlzdF9hLCBzZGZkaXN0X2IsIHVfbWl4KTtcXG4gICAgYWxwaGEgKj0gc21vb3Roc3RlcCgwLjUgLSB1X3NkZmdhbW1hLCAwLjUgKyB1X3NkZmdhbW1hLCBzZGZkaXN0KTtcXG5cXG4gICAgZ2xfRnJhZ0NvbG9yID0gY29sb3IgKiAoYWxwaGEgKiBvcGFjaXR5KTtcXG5cXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XFxuXCIsdmVydGV4U291cmNlOlwiLy8gZmxvb3IoMTI3IC8gMikgPT0gNjMuMFxcbi8vIHRoZSBtYXhpbXVtIGFsbG93ZWQgbWl0ZXIgbGltaXQgaXMgMi4wIGF0IHRoZSBtb21lbnQuIHRoZSBleHRydWRlIG5vcm1hbCBpc1xcbi8vIHN0b3JlZCBpbiBhIGJ5dGUgKC0xMjguLjEyNykuIHdlIHNjYWxlIHJlZ3VsYXIgbm9ybWFscyB1cCB0byBsZW5ndGggNjMsIGJ1dFxcbi8vIHRoZXJlIGFyZSBhbHNvIFxcXCJzcGVjaWFsXFxcIiBub3JtYWxzIHRoYXQgaGF2ZSBhIGJpZ2dlciBsZW5ndGggKG9mIHVwIHRvIDEyNiBpblxcbi8vIHRoaXMgY2FzZSkuXFxuLy8gI2RlZmluZSBzY2FsZSA2My4wXFxuI2RlZmluZSBzY2FsZSAwLjAxNTg3MzAxNlxcblxcbi8vIFdlIHNjYWxlIHRoZSBkaXN0YW5jZSBiZWZvcmUgYWRkaW5nIGl0IHRvIHRoZSBidWZmZXJzIHNvIHRoYXQgd2UgY2FuIHN0b3JlXFxuLy8gbG9uZyBkaXN0YW5jZXMgZm9yIGxvbmcgc2VnbWVudHMuIFVzZSB0aGlzIHZhbHVlIHRvIHVuc2NhbGUgdGhlIGRpc3RhbmNlLlxcbiNkZWZpbmUgTElORV9ESVNUQU5DRV9TQ0FMRSAyLjBcXG5cXG4vLyB0aGUgZGlzdGFuY2Ugb3ZlciB3aGljaCB0aGUgbGluZSBlZGdlIGZhZGVzIG91dC5cXG4vLyBSZXRpbmEgZGV2aWNlcyBuZWVkIGEgc21hbGxlciBkaXN0YW5jZSB0byBhdm9pZCBhbGlhc2luZy5cXG4jZGVmaW5lIEFOVElBTElBU0lORyAxLjAgLyBERVZJQ0VfUElYRUxfUkFUSU8gLyAyLjBcXG5cXG5hdHRyaWJ1dGUgdmVjMiBhX3BvcztcXG5hdHRyaWJ1dGUgdmVjNCBhX2RhdGE7XFxuXFxudW5pZm9ybSBtYXQ0IHVfbWF0cml4O1xcbnVuaWZvcm0gbWVkaXVtcCBmbG9hdCB1X3JhdGlvO1xcbnVuaWZvcm0gdmVjMiB1X3BhdHRlcm5zY2FsZV9hO1xcbnVuaWZvcm0gZmxvYXQgdV90ZXhfeV9hO1xcbnVuaWZvcm0gdmVjMiB1X3BhdHRlcm5zY2FsZV9iO1xcbnVuaWZvcm0gZmxvYXQgdV90ZXhfeV9iO1xcbnVuaWZvcm0gdmVjMiB1X2dsX3VuaXRzX3RvX3BpeGVscztcXG51bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV93aWR0aDtcXG5cXG52YXJ5aW5nIHZlYzIgdl9ub3JtYWw7XFxudmFyeWluZyB2ZWMyIHZfd2lkdGgyO1xcbnZhcnlpbmcgdmVjMiB2X3RleF9hO1xcbnZhcnlpbmcgdmVjMiB2X3RleF9iO1xcbnZhcnlpbmcgZmxvYXQgdl9nYW1tYV9zY2FsZTtcXG5cXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgY29sb3JcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgYmx1clxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBtZWRpdW1wIGZsb2F0IGdhcHdpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9mZnNldFxcblxcbnZvaWQgbWFpbigpIHtcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBjb2xvclxcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGJsdXJcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIG1lZGl1bXAgZmxvYXQgZ2Fwd2lkdGhcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvZmZzZXRcXG5cXG4gICAgdmVjMiBhX2V4dHJ1ZGUgPSBhX2RhdGEueHkgLSAxMjguMDtcXG4gICAgZmxvYXQgYV9kaXJlY3Rpb24gPSBtb2QoYV9kYXRhLnosIDQuMCkgLSAxLjA7XFxuICAgIGZsb2F0IGFfbGluZXNvZmFyID0gKGZsb29yKGFfZGF0YS56IC8gNC4wKSArIGFfZGF0YS53ICogNjQuMCkgKiBMSU5FX0RJU1RBTkNFX1NDQUxFO1xcblxcbiAgICAvLyBXZSBzdG9yZSB0aGUgdGV4dHVyZSBub3JtYWxzIGluIHRoZSBtb3N0IGluc2lnbmlmaWNhbnQgYml0XFxuICAgIC8vIHRyYW5zZm9ybSB5IHNvIHRoYXQgMCA9PiAtMSBhbmQgMSA9PiAxXFxuICAgIC8vIEluIHRoZSB0ZXh0dXJlIG5vcm1hbCwgeCBpcyAwIGlmIHRoZSBub3JtYWwgcG9pbnRzIHN0cmFpZ2h0IHVwL2Rvd24gYW5kIDEgaWYgaXQncyBhIHJvdW5kIGNhcFxcbiAgICAvLyB5IGlzIDEgaWYgdGhlIG5vcm1hbCBwb2ludHMgdXAsIGFuZCAtMSBpZiBpdCBwb2ludHMgZG93blxcbiAgICBtZWRpdW1wIHZlYzIgbm9ybWFsID0gbW9kKGFfcG9zLCAyLjApO1xcbiAgICBub3JtYWwueSA9IHNpZ24obm9ybWFsLnkgLSAwLjUpO1xcbiAgICB2X25vcm1hbCA9IG5vcm1hbDtcXG5cXG4gICAgLy8gdGhlc2UgdHJhbnNmb3JtYXRpb25zIHVzZWQgdG8gYmUgYXBwbGllZCBpbiB0aGUgSlMgYW5kIG5hdGl2ZSBjb2RlIGJhc2VzLiBcXG4gICAgLy8gbW92ZWQgdGhlbSBpbnRvIHRoZSBzaGFkZXIgZm9yIGNsYXJpdHkgYW5kIHNpbXBsaWNpdHkuIFxcbiAgICBnYXB3aWR0aCA9IGdhcHdpZHRoIC8gMi4wO1xcbiAgICBmbG9hdCB3aWR0aCA9IHVfd2lkdGggLyAyLjA7XFxuICAgIG9mZnNldCA9IC0xLjAgKiBvZmZzZXQ7XFxuIFxcbiAgICBmbG9hdCBpbnNldCA9IGdhcHdpZHRoICsgKGdhcHdpZHRoID4gMC4wID8gQU5USUFMSUFTSU5HIDogMC4wKTtcXG4gICAgZmxvYXQgb3V0c2V0ID0gZ2Fwd2lkdGggKyB3aWR0aCAqIChnYXB3aWR0aCA+IDAuMCA/IDIuMCA6IDEuMCkgKyBBTlRJQUxJQVNJTkc7XFxuXFxuICAgIC8vIFNjYWxlIHRoZSBleHRydXNpb24gdmVjdG9yIGRvd24gdG8gYSBub3JtYWwgYW5kIHRoZW4gdXAgYnkgdGhlIGxpbmUgd2lkdGhcXG4gICAgLy8gb2YgdGhpcyB2ZXJ0ZXguXFxuICAgIG1lZGl1bXAgdmVjMiBkaXN0ID1vdXRzZXQgKiBhX2V4dHJ1ZGUgKiBzY2FsZTtcXG5cXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBvZmZzZXQgd2hlbiBkcmF3aW5nIGEgbGluZSB0aGF0IGlzIHRvIHRoZSBzaWRlIG9mIHRoZSBhY3R1YWwgbGluZS5cXG4gICAgLy8gV2UgZG8gdGhpcyBieSBjcmVhdGluZyBhIHZlY3RvciB0aGF0IHBvaW50cyB0b3dhcmRzIHRoZSBleHRydWRlLCBidXQgcm90YXRlXFxuICAgIC8vIGl0IHdoZW4gd2UncmUgZHJhd2luZyByb3VuZCBlbmQgcG9pbnRzIChhX2RpcmVjdGlvbiA9IC0xIG9yIDEpIHNpbmNlIHRoZWlyXFxuICAgIC8vIGV4dHJ1ZGUgdmVjdG9yIHBvaW50cyBpbiBhbm90aGVyIGRpcmVjdGlvbi5cXG4gICAgbWVkaXVtcCBmbG9hdCB1ID0gMC41ICogYV9kaXJlY3Rpb247XFxuICAgIG1lZGl1bXAgZmxvYXQgdCA9IDEuMCAtIGFicyh1KTtcXG4gICAgbWVkaXVtcCB2ZWMyIG9mZnNldDIgPSBvZmZzZXQgKiBhX2V4dHJ1ZGUgKiBzY2FsZSAqIG5vcm1hbC55ICogbWF0Mih0LCAtdSwgdSwgdCk7XFxuXFxuICAgIC8vIFJlbW92ZSB0aGUgdGV4dHVyZSBub3JtYWwgYml0IHRvIGdldCB0aGUgcG9zaXRpb25cXG4gICAgdmVjMiBwb3MgPSBmbG9vcihhX3BvcyAqIDAuNSk7XFxuXFxuICAgIHZlYzQgcHJvamVjdGVkX2V4dHJ1ZGUgPSB1X21hdHJpeCAqIHZlYzQoZGlzdCAvIHVfcmF0aW8sIDAuMCwgMC4wKTtcXG4gICAgZ2xfUG9zaXRpb24gPSB1X21hdHJpeCAqIHZlYzQocG9zICsgb2Zmc2V0MiAvIHVfcmF0aW8sIDAuMCwgMS4wKSArIHByb2plY3RlZF9leHRydWRlO1xcblxcbiAgICAvLyBjYWxjdWxhdGUgaG93IG11Y2ggdGhlIHBlcnNwZWN0aXZlIHZpZXcgc3F1aXNoZXMgb3Igc3RyZXRjaGVzIHRoZSBleHRydWRlXFxuICAgIGZsb2F0IGV4dHJ1ZGVfbGVuZ3RoX3dpdGhvdXRfcGVyc3BlY3RpdmUgPSBsZW5ndGgoZGlzdCk7XFxuICAgIGZsb2F0IGV4dHJ1ZGVfbGVuZ3RoX3dpdGhfcGVyc3BlY3RpdmUgPSBsZW5ndGgocHJvamVjdGVkX2V4dHJ1ZGUueHkgLyBnbF9Qb3NpdGlvbi53ICogdV9nbF91bml0c190b19waXhlbHMpO1xcbiAgICB2X2dhbW1hX3NjYWxlID0gZXh0cnVkZV9sZW5ndGhfd2l0aG91dF9wZXJzcGVjdGl2ZSAvIGV4dHJ1ZGVfbGVuZ3RoX3dpdGhfcGVyc3BlY3RpdmU7XFxuXFxuICAgIHZfdGV4X2EgPSB2ZWMyKGFfbGluZXNvZmFyICogdV9wYXR0ZXJuc2NhbGVfYS54LCBub3JtYWwueSAqIHVfcGF0dGVybnNjYWxlX2EueSArIHVfdGV4X3lfYSk7XFxuICAgIHZfdGV4X2IgPSB2ZWMyKGFfbGluZXNvZmFyICogdV9wYXR0ZXJuc2NhbGVfYi54LCBub3JtYWwueSAqIHVfcGF0dGVybnNjYWxlX2IueSArIHVfdGV4X3lfYik7XFxuXFxuICAgIHZfd2lkdGgyID0gdmVjMihvdXRzZXQsIGluc2V0KTtcXG59XFxuXCJcbn0scmFzdGVyOntmcmFnbWVudFNvdXJjZTpcInVuaWZvcm0gZmxvYXQgdV9mYWRlX3Q7XFxudW5pZm9ybSBmbG9hdCB1X29wYWNpdHk7XFxudW5pZm9ybSBzYW1wbGVyMkQgdV9pbWFnZTA7XFxudW5pZm9ybSBzYW1wbGVyMkQgdV9pbWFnZTE7XFxudmFyeWluZyB2ZWMyIHZfcG9zMDtcXG52YXJ5aW5nIHZlYzIgdl9wb3MxO1xcblxcbnVuaWZvcm0gZmxvYXQgdV9icmlnaHRuZXNzX2xvdztcXG51bmlmb3JtIGZsb2F0IHVfYnJpZ2h0bmVzc19oaWdoO1xcblxcbnVuaWZvcm0gZmxvYXQgdV9zYXR1cmF0aW9uX2ZhY3RvcjtcXG51bmlmb3JtIGZsb2F0IHVfY29udHJhc3RfZmFjdG9yO1xcbnVuaWZvcm0gdmVjMyB1X3NwaW5fd2VpZ2h0cztcXG5cXG52b2lkIG1haW4oKSB7XFxuXFxuICAgIC8vIHJlYWQgYW5kIGNyb3NzLWZhZGUgY29sb3JzIGZyb20gdGhlIG1haW4gYW5kIHBhcmVudCB0aWxlc1xcbiAgICB2ZWM0IGNvbG9yMCA9IHRleHR1cmUyRCh1X2ltYWdlMCwgdl9wb3MwKTtcXG4gICAgdmVjNCBjb2xvcjEgPSB0ZXh0dXJlMkQodV9pbWFnZTEsIHZfcG9zMSk7XFxuICAgIHZlYzQgY29sb3IgPSBtaXgoY29sb3IwLCBjb2xvcjEsIHVfZmFkZV90KTtcXG4gICAgY29sb3IuYSAqPSB1X29wYWNpdHk7XFxuICAgIHZlYzMgcmdiID0gY29sb3IucmdiO1xcblxcbiAgICAvLyBzcGluXFxuICAgIHJnYiA9IHZlYzMoXFxuICAgICAgICBkb3QocmdiLCB1X3NwaW5fd2VpZ2h0cy54eXopLFxcbiAgICAgICAgZG90KHJnYiwgdV9zcGluX3dlaWdodHMuenh5KSxcXG4gICAgICAgIGRvdChyZ2IsIHVfc3Bpbl93ZWlnaHRzLnl6eCkpO1xcblxcbiAgICAvLyBzYXR1cmF0aW9uXFxuICAgIGZsb2F0IGF2ZXJhZ2UgPSAoY29sb3IuciArIGNvbG9yLmcgKyBjb2xvci5iKSAvIDMuMDtcXG4gICAgcmdiICs9IChhdmVyYWdlIC0gcmdiKSAqIHVfc2F0dXJhdGlvbl9mYWN0b3I7XFxuXFxuICAgIC8vIGNvbnRyYXN0XFxuICAgIHJnYiA9IChyZ2IgLSAwLjUpICogdV9jb250cmFzdF9mYWN0b3IgKyAwLjU7XFxuXFxuICAgIC8vIGJyaWdodG5lc3NcXG4gICAgdmVjMyB1X2hpZ2hfdmVjID0gdmVjMyh1X2JyaWdodG5lc3NfbG93LCB1X2JyaWdodG5lc3NfbG93LCB1X2JyaWdodG5lc3NfbG93KTtcXG4gICAgdmVjMyB1X2xvd192ZWMgPSB2ZWMzKHVfYnJpZ2h0bmVzc19oaWdoLCB1X2JyaWdodG5lc3NfaGlnaCwgdV9icmlnaHRuZXNzX2hpZ2gpO1xcblxcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KG1peCh1X2hpZ2hfdmVjLCB1X2xvd192ZWMsIHJnYikgKiBjb2xvci5hLCBjb2xvci5hKTtcXG5cXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XFxuXCIsdmVydGV4U291cmNlOlwidW5pZm9ybSBtYXQ0IHVfbWF0cml4O1xcbnVuaWZvcm0gdmVjMiB1X3RsX3BhcmVudDtcXG51bmlmb3JtIGZsb2F0IHVfc2NhbGVfcGFyZW50O1xcbnVuaWZvcm0gZmxvYXQgdV9idWZmZXJfc2NhbGU7XFxuXFxuYXR0cmlidXRlIHZlYzIgYV9wb3M7XFxuYXR0cmlidXRlIHZlYzIgYV90ZXh0dXJlX3BvcztcXG5cXG52YXJ5aW5nIHZlYzIgdl9wb3MwO1xcbnZhcnlpbmcgdmVjMiB2X3BvczE7XFxuXFxudm9pZCBtYWluKCkge1xcbiAgICBnbF9Qb3NpdGlvbiA9IHVfbWF0cml4ICogdmVjNChhX3BvcywgMCwgMSk7XFxuICAgIHZfcG9zMCA9ICgoKGFfdGV4dHVyZV9wb3MgLyAzMjc2Ny4wKSAtIDAuNSkgLyB1X2J1ZmZlcl9zY2FsZSApICsgMC41O1xcbiAgICB2X3BvczEgPSAodl9wb3MwICogdV9zY2FsZV9wYXJlbnQpICsgdV90bF9wYXJlbnQ7XFxufVxcblwifSxzeW1ib2xJY29uOntmcmFnbWVudFNvdXJjZTpcInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTtcXG51bmlmb3JtIHNhbXBsZXIyRCB1X2ZhZGV0ZXh0dXJlO1xcblxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBvcGFjaXR5XFxuXFxudmFyeWluZyB2ZWMyIHZfdGV4O1xcbnZhcnlpbmcgdmVjMiB2X2ZhZGVfdGV4O1xcblxcbnZvaWQgbWFpbigpIHtcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuXFxuICAgIGxvd3AgZmxvYXQgYWxwaGEgPSB0ZXh0dXJlMkQodV9mYWRldGV4dHVyZSwgdl9mYWRlX3RleCkuYSAqIG9wYWNpdHk7XFxuICAgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh1X3RleHR1cmUsIHZfdGV4KSAqIGFscGhhO1xcblxcbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcXG4gICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgxLjApO1xcbiNlbmRpZlxcbn1cXG5cIix2ZXJ0ZXhTb3VyY2U6J1xcbmF0dHJpYnV0ZSB2ZWM0IGFfcG9zX29mZnNldDtcXG5hdHRyaWJ1dGUgdmVjNCBhX2RhdGE7XFxuXFxuLy8gaWNvbi1zaXplIGRhdGEgKHNlZSBzeW1ib2xfc2RmLnZlcnRleC5nbHNsIGZvciBtb3JlKVxcbmF0dHJpYnV0ZSB2ZWMzIGFfc2l6ZTtcXG51bmlmb3JtIGJvb2wgdV9pc19zaXplX3pvb21fY29uc3RhbnQ7XFxudW5pZm9ybSBib29sIHVfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50O1xcbnVuaWZvcm0gbWVkaXVtcCBmbG9hdCB1X3NpemVfdDsgLy8gdXNlZCB0byBpbnRlcnBvbGF0ZSBiZXR3ZWVuIHpvb20gc3RvcHMgd2hlbiBzaXplIGlzIGEgY29tcG9zaXRlIGZ1bmN0aW9uXFxudW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfc2l6ZTsgLy8gdXNlZCB3aGVuIHNpemUgaXMgYm90aCB6b29tIGFuZCBmZWF0dXJlIGNvbnN0YW50XFxudW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfbGF5b3V0X3NpemU7IC8vIHVzZWQgd2hlbiBzaXplIGlzIGZlYXR1cmUgY29uc3RhbnRcXG5cXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcblxcbi8vIG1hdHJpeCBpcyBmb3IgdGhlIHZlcnRleCBwb3NpdGlvbi5cXG51bmlmb3JtIG1hdDQgdV9tYXRyaXg7XFxuXFxudW5pZm9ybSBib29sIHVfaXNfdGV4dDtcXG51bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV96b29tO1xcbnVuaWZvcm0gYm9vbCB1X3JvdGF0ZV93aXRoX21hcDtcXG51bmlmb3JtIHZlYzIgdV9leHRydWRlX3NjYWxlO1xcblxcbnVuaWZvcm0gdmVjMiB1X3RleHNpemU7XFxuXFxudmFyeWluZyB2ZWMyIHZfdGV4O1xcbnZhcnlpbmcgdmVjMiB2X2ZhZGVfdGV4O1xcblxcbnZvaWQgbWFpbigpIHtcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuXFxuICAgIHZlYzIgYV9wb3MgPSBhX3Bvc19vZmZzZXQueHk7XFxuICAgIHZlYzIgYV9vZmZzZXQgPSBhX3Bvc19vZmZzZXQuenc7XFxuXFxuICAgIHZlYzIgYV90ZXggPSBhX2RhdGEueHk7XFxuICAgIG1lZGl1bXAgdmVjMiBsYWJlbF9kYXRhID0gdW5wYWNrX2Zsb2F0KGFfZGF0YVsyXSk7XFxuICAgIG1lZGl1bXAgZmxvYXQgYV9sYWJlbG1pbnpvb20gPSBsYWJlbF9kYXRhWzBdO1xcbiAgICBtZWRpdW1wIHZlYzIgYV96b29tID0gdW5wYWNrX2Zsb2F0KGFfZGF0YVszXSk7XFxuICAgIG1lZGl1bXAgZmxvYXQgYV9taW56b29tID0gYV96b29tWzBdO1xcbiAgICBtZWRpdW1wIGZsb2F0IGFfbWF4em9vbSA9IGFfem9vbVsxXTtcXG5cXG4gICAgZmxvYXQgc2l6ZTtcXG4gICAgLy8gSW4gb3JkZXIgdG8gYWNjb21tb2RhdGUgcGxhY2luZyBsYWJlbHMgYXJvdW5kIGNvcm5lcnMgaW5cXG4gICAgLy8gc3ltYm9sLXBsYWNlbWVudDogbGluZSwgZWFjaCBnbHlwaCBpbiBhIGxhYmVsIGNvdWxkIGhhdmUgbXVsdGlwbGVcXG4gICAgLy8gXCJxdWFkXCJzIG9ubHkgb25lIG9mIHdoaWNoIHNob3VsZCBiZSBzaG93biBhdCBhIGdpdmVuIHpvb20gbGV2ZWwuXFxuICAgIC8vIFRoZSBtaW4vbWF4IHpvb20gYXNzaWduZWQgdG8gZWFjaCBxdWFkIGlzIGJhc2VkIG9uIHRoZSBmb250IHNpemUgYXRcXG4gICAgLy8gdGhlIHZlY3RvciB0aWxlXFwncyB6b29tIGxldmVsLCB3aGljaCBtaWdodCBiZSBkaWZmZXJlbnQgdGhhbiBhdCB0aGVcXG4gICAgLy8gY3VycmVudGx5IHJlbmRlcmVkIHpvb20gbGV2ZWwgaWYgdGV4dC1zaXplIGlzIHpvb20tZGVwZW5kZW50LlxcbiAgICAvLyBUaHVzLCB3ZSBjb21wZW5zYXRlIGZvciB0aGlzIGRpZmZlcmVuY2UgYnkgY2FsY3VsYXRpbmcgYW4gYWRqdXN0bWVudFxcbiAgICAvLyBiYXNlZCBvbiB0aGUgc2NhbGUgb2YgcmVuZGVyZWQgdGV4dCBzaXplIHJlbGF0aXZlIHRvIGxheW91dCB0ZXh0IHNpemUuXFxuICAgIG1lZGl1bXAgZmxvYXQgbGF5b3V0U2l6ZTtcXG4gICAgaWYgKCF1X2lzX3NpemVfem9vbV9jb25zdGFudCAmJiAhdV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQpIHtcXG4gICAgICAgIHNpemUgPSBtaXgoYV9zaXplWzBdLCBhX3NpemVbMV0sIHVfc2l6ZV90KSAvIDEwLjA7XFxuICAgICAgICBsYXlvdXRTaXplID0gYV9zaXplWzJdIC8gMTAuMDtcXG4gICAgfSBlbHNlIGlmICh1X2lzX3NpemVfem9vbV9jb25zdGFudCAmJiAhdV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQpIHtcXG4gICAgICAgIHNpemUgPSBhX3NpemVbMF0gLyAxMC4wO1xcbiAgICAgICAgbGF5b3V0U2l6ZSA9IHNpemU7XFxuICAgIH0gZWxzZSBpZiAoIXVfaXNfc2l6ZV96b29tX2NvbnN0YW50ICYmIHVfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50KSB7XFxuICAgICAgICBzaXplID0gdV9zaXplO1xcbiAgICAgICAgbGF5b3V0U2l6ZSA9IHVfbGF5b3V0X3NpemU7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBzaXplID0gdV9zaXplO1xcbiAgICAgICAgbGF5b3V0U2l6ZSA9IHVfc2l6ZTtcXG4gICAgfVxcblxcbiAgICBmbG9hdCBmb250U2NhbGUgPSB1X2lzX3RleHQgPyBzaXplIC8gMjQuMCA6IHNpemU7XFxuXFxuICAgIG1lZGl1bXAgZmxvYXQgem9vbUFkanVzdCA9IGxvZzIoc2l6ZSAvIGxheW91dFNpemUpO1xcbiAgICBtZWRpdW1wIGZsb2F0IGFkanVzdGVkWm9vbSA9ICh1X3pvb20gLSB6b29tQWRqdXN0KSAqIDEwLjA7XFxuICAgIC8vIHJlc3VsdDogeiA9IDAgaWYgYV9taW56b29tIDw9IGFkanVzdGVkWm9vbSA8IGFfbWF4em9vbSwgYW5kIDEgb3RoZXJ3aXNlXFxuICAgIG1lZGl1bXAgZmxvYXQgeiA9IDIuMCAtIHN0ZXAoYV9taW56b29tLCBhZGp1c3RlZFpvb20pIC0gKDEuMCAtIHN0ZXAoYV9tYXh6b29tLCBhZGp1c3RlZFpvb20pKTtcXG5cXG4gICAgdmVjMiBleHRydWRlID0gZm9udFNjYWxlICogdV9leHRydWRlX3NjYWxlICogKGFfb2Zmc2V0IC8gNjQuMCk7XFxuICAgIGlmICh1X3JvdGF0ZV93aXRoX21hcCkge1xcbiAgICAgICAgZ2xfUG9zaXRpb24gPSB1X21hdHJpeCAqIHZlYzQoYV9wb3MgKyBleHRydWRlLCAwLCAxKTtcXG4gICAgICAgIGdsX1Bvc2l0aW9uLnogKz0geiAqIGdsX1Bvc2l0aW9uLnc7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBnbF9Qb3NpdGlvbiA9IHVfbWF0cml4ICogdmVjNChhX3BvcywgMCwgMSkgKyB2ZWM0KGV4dHJ1ZGUsIDAsIDApO1xcbiAgICB9XFxuXFxuICAgIHZfdGV4ID0gYV90ZXggLyB1X3RleHNpemU7XFxuICAgIHZfZmFkZV90ZXggPSB2ZWMyKGFfbGFiZWxtaW56b29tIC8gMjU1LjAsIDAuMCk7XFxufVxcbid9LHN5bWJvbFNERjp7ZnJhZ21lbnRTb3VyY2U6XCIjZGVmaW5lIFNERl9QWCA4LjBcXG4jZGVmaW5lIEVER0VfR0FNTUEgMC4xMDUvREVWSUNFX1BJWEVMX1JBVElPXFxuXFxudW5pZm9ybSBib29sIHVfaXNfaGFsbztcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGhpZ2hwIHZlYzQgZmlsbF9jb2xvclxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBoYWxvX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgaGFsb193aWR0aFxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBoYWxvX2JsdXJcXG5cXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XFxudW5pZm9ybSBzYW1wbGVyMkQgdV9mYWRldGV4dHVyZTtcXG51bmlmb3JtIGhpZ2hwIGZsb2F0IHVfZ2FtbWFfc2NhbGU7XFxudW5pZm9ybSBib29sIHVfaXNfdGV4dDtcXG5cXG52YXJ5aW5nIHZlYzIgdl90ZXg7XFxudmFyeWluZyB2ZWMyIHZfZmFkZV90ZXg7XFxudmFyeWluZyBmbG9hdCB2X2dhbW1hX3NjYWxlO1xcbnZhcnlpbmcgZmxvYXQgdl9zaXplO1xcblxcbnZvaWQgbWFpbigpIHtcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgaGlnaHAgdmVjNCBmaWxsX2NvbG9yXFxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgaGFsb19jb2xvclxcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBoYWxvX3dpZHRoXFxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgaGFsb19ibHVyXFxuXFxuICAgIGZsb2F0IGZvbnRTY2FsZSA9IHVfaXNfdGV4dCA/IHZfc2l6ZSAvIDI0LjAgOiB2X3NpemU7XFxuXFxuICAgIGxvd3AgdmVjNCBjb2xvciA9IGZpbGxfY29sb3I7XFxuICAgIGhpZ2hwIGZsb2F0IGdhbW1hID0gRURHRV9HQU1NQSAvIChmb250U2NhbGUgKiB1X2dhbW1hX3NjYWxlKTtcXG4gICAgbG93cCBmbG9hdCBidWZmID0gKDI1Ni4wIC0gNjQuMCkgLyAyNTYuMDtcXG4gICAgaWYgKHVfaXNfaGFsbykge1xcbiAgICAgICAgY29sb3IgPSBoYWxvX2NvbG9yO1xcbiAgICAgICAgZ2FtbWEgPSAoaGFsb19ibHVyICogMS4xOSAvIFNERl9QWCArIEVER0VfR0FNTUEpIC8gKGZvbnRTY2FsZSAqIHVfZ2FtbWFfc2NhbGUpO1xcbiAgICAgICAgYnVmZiA9ICg2LjAgLSBoYWxvX3dpZHRoIC8gZm9udFNjYWxlKSAvIFNERl9QWDtcXG4gICAgfVxcblxcbiAgICBsb3dwIGZsb2F0IGRpc3QgPSB0ZXh0dXJlMkQodV90ZXh0dXJlLCB2X3RleCkuYTtcXG4gICAgbG93cCBmbG9hdCBmYWRlX2FscGhhID0gdGV4dHVyZTJEKHVfZmFkZXRleHR1cmUsIHZfZmFkZV90ZXgpLmE7XFxuICAgIGhpZ2hwIGZsb2F0IGdhbW1hX3NjYWxlZCA9IGdhbW1hICogdl9nYW1tYV9zY2FsZTtcXG4gICAgaGlnaHAgZmxvYXQgYWxwaGEgPSBzbW9vdGhzdGVwKGJ1ZmYgLSBnYW1tYV9zY2FsZWQsIGJ1ZmYgKyBnYW1tYV9zY2FsZWQsIGRpc3QpICogZmFkZV9hbHBoYTtcXG5cXG4gICAgZ2xfRnJhZ0NvbG9yID0gY29sb3IgKiAoYWxwaGEgKiBvcGFjaXR5KTtcXG5cXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXFxuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMS4wKTtcXG4jZW5kaWZcXG59XFxuXCIsdmVydGV4U291cmNlOlwiY29uc3QgZmxvYXQgUEkgPSAzLjE0MTU5MjY1MzU4OTc5MztcXG5cXG5hdHRyaWJ1dGUgdmVjNCBhX3Bvc19vZmZzZXQ7XFxuYXR0cmlidXRlIHZlYzQgYV9kYXRhO1xcblxcbi8vIGNvbnRlbnRzIG9mIGFfc2l6ZSB2YXJ5IGJhc2VkIG9uIHRoZSB0eXBlIG9mIHByb3BlcnR5IHZhbHVlXFxuLy8gdXNlZCBmb3Ige3RleHQsaWNvbn0tc2l6ZS5cXG4vLyBGb3IgY29uc3RhbnRzLCBhX3NpemUgaXMgZGlzYWJsZWQuXFxuLy8gRm9yIHNvdXJjZSBmdW5jdGlvbnMsIHdlIGJpbmQgb25seSBvbmUgdmFsdWUgcGVyIHZlcnRleDogdGhlIHZhbHVlIG9mIHt0ZXh0LGljb259LXNpemUgZXZhbHVhdGVkIGZvciB0aGUgY3VycmVudCBmZWF0dXJlLlxcbi8vIEZvciBjb21wb3NpdGUgZnVuY3Rpb25zOlxcbi8vIFsgdGV4dC1zaXplKGxvd2VyWm9vbVN0b3AsIGZlYXR1cmUpLFxcbi8vICAgdGV4dC1zaXplKHVwcGVyWm9vbVN0b3AsIGZlYXR1cmUpLFxcbi8vICAgbGF5b3V0U2l6ZSA9PSB0ZXh0LXNpemUobGF5b3V0Wm9vbUxldmVsLCBmZWF0dXJlKSBdXFxuYXR0cmlidXRlIHZlYzMgYV9zaXplO1xcbnVuaWZvcm0gYm9vbCB1X2lzX3NpemVfem9vbV9jb25zdGFudDtcXG51bmlmb3JtIGJvb2wgdV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQ7XFxudW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfc2l6ZV90OyAvLyB1c2VkIHRvIGludGVycG9sYXRlIGJldHdlZW4gem9vbSBzdG9wcyB3aGVuIHNpemUgaXMgYSBjb21wb3NpdGUgZnVuY3Rpb25cXG51bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9zaXplOyAvLyB1c2VkIHdoZW4gc2l6ZSBpcyBib3RoIHpvb20gYW5kIGZlYXR1cmUgY29uc3RhbnRcXG51bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9sYXlvdXRfc2l6ZTsgLy8gdXNlZCB3aGVuIHNpemUgaXMgZmVhdHVyZSBjb25zdGFudFxcblxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgaGlnaHAgdmVjNCBmaWxsX2NvbG9yXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBoaWdocCB2ZWM0IGhhbG9fY29sb3JcXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBoYWxvX3dpZHRoXFxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IGhhbG9fYmx1clxcblxcbi8vIG1hdHJpeCBpcyBmb3IgdGhlIHZlcnRleCBwb3NpdGlvbi5cXG51bmlmb3JtIG1hdDQgdV9tYXRyaXg7XFxuXFxudW5pZm9ybSBib29sIHVfaXNfdGV4dDtcXG51bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV96b29tO1xcbnVuaWZvcm0gYm9vbCB1X3JvdGF0ZV93aXRoX21hcDtcXG51bmlmb3JtIGJvb2wgdV9waXRjaF93aXRoX21hcDtcXG51bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9waXRjaDtcXG51bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9iZWFyaW5nO1xcbnVuaWZvcm0gbWVkaXVtcCBmbG9hdCB1X2FzcGVjdF9yYXRpbztcXG51bmlmb3JtIHZlYzIgdV9leHRydWRlX3NjYWxlO1xcblxcbnVuaWZvcm0gdmVjMiB1X3RleHNpemU7XFxuXFxudmFyeWluZyB2ZWMyIHZfdGV4O1xcbnZhcnlpbmcgdmVjMiB2X2ZhZGVfdGV4O1xcbnZhcnlpbmcgZmxvYXQgdl9nYW1tYV9zY2FsZTtcXG52YXJ5aW5nIGZsb2F0IHZfc2l6ZTtcXG5cXG52b2lkIG1haW4oKSB7XFxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGhpZ2hwIHZlYzQgZmlsbF9jb2xvclxcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBoaWdocCB2ZWM0IGhhbG9fY29sb3JcXG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCBmbG9hdCBvcGFjaXR5XFxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgaGFsb193aWR0aFxcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGhhbG9fYmx1clxcblxcbiAgICB2ZWMyIGFfcG9zID0gYV9wb3Nfb2Zmc2V0Lnh5O1xcbiAgICB2ZWMyIGFfb2Zmc2V0ID0gYV9wb3Nfb2Zmc2V0Lnp3O1xcblxcbiAgICB2ZWMyIGFfdGV4ID0gYV9kYXRhLnh5O1xcblxcbiAgICBtZWRpdW1wIHZlYzIgbGFiZWxfZGF0YSA9IHVucGFja19mbG9hdChhX2RhdGFbMl0pO1xcbiAgICBtZWRpdW1wIGZsb2F0IGFfbGFiZWxtaW56b29tID0gbGFiZWxfZGF0YVswXTtcXG4gICAgbWVkaXVtcCBmbG9hdCBhX2xhYmVsYW5nbGUgPSBsYWJlbF9kYXRhWzFdO1xcblxcbiAgICBtZWRpdW1wIHZlYzIgYV96b29tID0gdW5wYWNrX2Zsb2F0KGFfZGF0YVszXSk7XFxuICAgIG1lZGl1bXAgZmxvYXQgYV9taW56b29tID0gYV96b29tWzBdO1xcbiAgICBtZWRpdW1wIGZsb2F0IGFfbWF4em9vbSA9IGFfem9vbVsxXTtcXG5cXG4gICAgLy8gSW4gb3JkZXIgdG8gYWNjb21tb2RhdGUgcGxhY2luZyBsYWJlbHMgYXJvdW5kIGNvcm5lcnMgaW5cXG4gICAgLy8gc3ltYm9sLXBsYWNlbWVudDogbGluZSwgZWFjaCBnbHlwaCBpbiBhIGxhYmVsIGNvdWxkIGhhdmUgbXVsdGlwbGVcXG4gICAgLy8gXFxcInF1YWRcXFwicyBvbmx5IG9uZSBvZiB3aGljaCBzaG91bGQgYmUgc2hvd24gYXQgYSBnaXZlbiB6b29tIGxldmVsLlxcbiAgICAvLyBUaGUgbWluL21heCB6b29tIGFzc2lnbmVkIHRvIGVhY2ggcXVhZCBpcyBiYXNlZCBvbiB0aGUgZm9udCBzaXplIGF0XFxuICAgIC8vIHRoZSB2ZWN0b3IgdGlsZSdzIHpvb20gbGV2ZWwsIHdoaWNoIG1pZ2h0IGJlIGRpZmZlcmVudCB0aGFuIGF0IHRoZVxcbiAgICAvLyBjdXJyZW50bHkgcmVuZGVyZWQgem9vbSBsZXZlbCBpZiB0ZXh0LXNpemUgaXMgem9vbS1kZXBlbmRlbnQuXFxuICAgIC8vIFRodXMsIHdlIGNvbXBlbnNhdGUgZm9yIHRoaXMgZGlmZmVyZW5jZSBieSBjYWxjdWxhdGluZyBhbiBhZGp1c3RtZW50XFxuICAgIC8vIGJhc2VkIG9uIHRoZSBzY2FsZSBvZiByZW5kZXJlZCB0ZXh0IHNpemUgcmVsYXRpdmUgdG8gbGF5b3V0IHRleHQgc2l6ZS5cXG4gICAgbWVkaXVtcCBmbG9hdCBsYXlvdXRTaXplO1xcbiAgICBpZiAoIXVfaXNfc2l6ZV96b29tX2NvbnN0YW50ICYmICF1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCkge1xcbiAgICAgICAgdl9zaXplID0gbWl4KGFfc2l6ZVswXSwgYV9zaXplWzFdLCB1X3NpemVfdCkgLyAxMC4wO1xcbiAgICAgICAgbGF5b3V0U2l6ZSA9IGFfc2l6ZVsyXSAvIDEwLjA7XFxuICAgIH0gZWxzZSBpZiAodV9pc19zaXplX3pvb21fY29uc3RhbnQgJiYgIXVfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50KSB7XFxuICAgICAgICB2X3NpemUgPSBhX3NpemVbMF0gLyAxMC4wO1xcbiAgICAgICAgbGF5b3V0U2l6ZSA9IHZfc2l6ZTtcXG4gICAgfSBlbHNlIGlmICghdV9pc19zaXplX3pvb21fY29uc3RhbnQgJiYgdV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQpIHtcXG4gICAgICAgIHZfc2l6ZSA9IHVfc2l6ZTtcXG4gICAgICAgIGxheW91dFNpemUgPSB1X2xheW91dF9zaXplO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgdl9zaXplID0gdV9zaXplO1xcbiAgICAgICAgbGF5b3V0U2l6ZSA9IHVfc2l6ZTtcXG4gICAgfVxcblxcbiAgICBmbG9hdCBmb250U2NhbGUgPSB1X2lzX3RleHQgPyB2X3NpemUgLyAyNC4wIDogdl9zaXplO1xcblxcbiAgICBtZWRpdW1wIGZsb2F0IHpvb21BZGp1c3QgPSBsb2cyKHZfc2l6ZSAvIGxheW91dFNpemUpO1xcbiAgICBtZWRpdW1wIGZsb2F0IGFkanVzdGVkWm9vbSA9ICh1X3pvb20gLSB6b29tQWRqdXN0KSAqIDEwLjA7XFxuICAgIC8vIHJlc3VsdDogeiA9IDAgaWYgYV9taW56b29tIDw9IGFkanVzdGVkWm9vbSA8IGFfbWF4em9vbSwgYW5kIDEgb3RoZXJ3aXNlXFxuICAgIC8vIFVzZWQgYmVsb3cgdG8gbW92ZSB0aGUgdmVydGV4IG91dCBvZiB0aGUgY2xpcCBzcGFjZSBmb3Igd2hlbiB0aGUgY3VycmVudFxcbiAgICAvLyB6b29tIGlzIG91dCBvZiB0aGUgZ2x5cGgncyB6b29tIHJhbmdlLlxcbiAgICBtZWRpdW1wIGZsb2F0IHogPSAyLjAgLSBzdGVwKGFfbWluem9vbSwgYWRqdXN0ZWRab29tKSAtICgxLjAgLSBzdGVwKGFfbWF4em9vbSwgYWRqdXN0ZWRab29tKSk7XFxuXFxuICAgIC8vIHBpdGNoLWFsaWdubWVudDogbWFwXFxuICAgIC8vIHJvdGF0aW9uLWFsaWdubWVudDogbWFwIHwgdmlld3BvcnRcXG4gICAgaWYgKHVfcGl0Y2hfd2l0aF9tYXApIHtcXG4gICAgICAgIGxvd3AgZmxvYXQgYW5nbGUgPSB1X3JvdGF0ZV93aXRoX21hcCA/IChhX2xhYmVsYW5nbGUgLyAyNTYuMCAqIDIuMCAqIFBJKSA6IHVfYmVhcmluZztcXG4gICAgICAgIGxvd3AgZmxvYXQgYXNpbiA9IHNpbihhbmdsZSk7XFxuICAgICAgICBsb3dwIGZsb2F0IGFjb3MgPSBjb3MoYW5nbGUpO1xcbiAgICAgICAgbWF0MiBSb3RhdGlvbk1hdHJpeCA9IG1hdDIoYWNvcywgYXNpbiwgLTEuMCAqIGFzaW4sIGFjb3MpO1xcbiAgICAgICAgdmVjMiBvZmZzZXQgPSBSb3RhdGlvbk1hdHJpeCAqIGFfb2Zmc2V0O1xcbiAgICAgICAgdmVjMiBleHRydWRlID0gZm9udFNjYWxlICogdV9leHRydWRlX3NjYWxlICogKG9mZnNldCAvIDY0LjApO1xcbiAgICAgICAgZ2xfUG9zaXRpb24gPSB1X21hdHJpeCAqIHZlYzQoYV9wb3MgKyBleHRydWRlLCAwLCAxKTtcXG4gICAgICAgIGdsX1Bvc2l0aW9uLnogKz0geiAqIGdsX1Bvc2l0aW9uLnc7XFxuICAgIC8vIHBpdGNoLWFsaWdubWVudDogdmlld3BvcnRcXG4gICAgLy8gcm90YXRpb24tYWxpZ25tZW50OiBtYXBcXG4gICAgfSBlbHNlIGlmICh1X3JvdGF0ZV93aXRoX21hcCkge1xcbiAgICAgICAgLy8gZm9yZXNob3J0ZW5pbmcgZmFjdG9yIHRvIGFwcGx5IG9uIHBpdGNoZWQgbWFwc1xcbiAgICAgICAgLy8gYXMgYSBsYWJlbCBnb2VzIGZyb20gaG9yaXpvbnRhbCA8PT4gdmVydGljYWwgaW4gYW5nbGVcXG4gICAgICAgIC8vIGl0IGdvZXMgZnJvbSAwJSBmb3Jlc2hvcnRlbmluZyB0byB1cCB0byBhcm91bmQgNzAlIGZvcmVzaG9ydGVuaW5nXFxuICAgICAgICBsb3dwIGZsb2F0IHBpdGNoZmFjdG9yID0gMS4wIC0gY29zKHVfcGl0Y2ggKiBzaW4odV9waXRjaCAqIDAuNzUpKTtcXG5cXG4gICAgICAgIGxvd3AgZmxvYXQgbGluZWFuZ2xlID0gYV9sYWJlbGFuZ2xlIC8gMjU2LjAgKiAyLjAgKiBQSTtcXG5cXG4gICAgICAgIC8vIHVzZSB0aGUgbGluZWFuZ2xlIHRvIHBvc2l0aW9uIHBvaW50cyBhLGIgYWxvbmcgdGhlIGxpbmVcXG4gICAgICAgIC8vIHByb2plY3QgdGhlIHBvaW50cyBhbmQgY2FsY3VsYXRlIHRoZSBsYWJlbCBhbmdsZSBpbiBwcm9qZWN0ZWQgc3BhY2VcXG4gICAgICAgIC8vIHRoaXMgY2FsY3VsYXRpb24gYWxsb3dzIGxhYmVscyB0byBiZSByZW5kZXJlZCB1bnNrZXdlZCBvbiBwaXRjaGVkIG1hcHNcXG4gICAgICAgIHZlYzQgYSA9IHVfbWF0cml4ICogdmVjNChhX3BvcywgMCwgMSk7XFxuICAgICAgICB2ZWM0IGIgPSB1X21hdHJpeCAqIHZlYzQoYV9wb3MgKyB2ZWMyKGNvcyhsaW5lYW5nbGUpLHNpbihsaW5lYW5nbGUpKSwgMCwgMSk7XFxuICAgICAgICBsb3dwIGZsb2F0IGFuZ2xlID0gYXRhbigoYlsxXS9iWzNdIC0gYVsxXS9hWzNdKS91X2FzcGVjdF9yYXRpbywgYlswXS9iWzNdIC0gYVswXS9hWzNdKTtcXG4gICAgICAgIGxvd3AgZmxvYXQgYXNpbiA9IHNpbihhbmdsZSk7XFxuICAgICAgICBsb3dwIGZsb2F0IGFjb3MgPSBjb3MoYW5nbGUpO1xcbiAgICAgICAgbWF0MiBSb3RhdGlvbk1hdHJpeCA9IG1hdDIoYWNvcywgLTEuMCAqIGFzaW4sIGFzaW4sIGFjb3MpO1xcblxcbiAgICAgICAgdmVjMiBvZmZzZXQgPSBSb3RhdGlvbk1hdHJpeCAqICh2ZWMyKCgxLjAtcGl0Y2hmYWN0b3IpKyhwaXRjaGZhY3Rvcipjb3MoYW5nbGUqMi4wKSksIDEuMCkgKiBhX29mZnNldCk7XFxuICAgICAgICB2ZWMyIGV4dHJ1ZGUgPSBmb250U2NhbGUgKiB1X2V4dHJ1ZGVfc2NhbGUgKiAob2Zmc2V0IC8gNjQuMCk7XFxuICAgICAgICBnbF9Qb3NpdGlvbiA9IHVfbWF0cml4ICogdmVjNChhX3BvcywgMCwgMSkgKyB2ZWM0KGV4dHJ1ZGUsIDAsIDApO1xcbiAgICAgICAgZ2xfUG9zaXRpb24ueiArPSB6ICogZ2xfUG9zaXRpb24udztcXG4gICAgLy8gcGl0Y2gtYWxpZ25tZW50OiB2aWV3cG9ydFxcbiAgICAvLyByb3RhdGlvbi1hbGlnbm1lbnQ6IHZpZXdwb3J0XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICB2ZWMyIGV4dHJ1ZGUgPSBmb250U2NhbGUgKiB1X2V4dHJ1ZGVfc2NhbGUgKiAoYV9vZmZzZXQgLyA2NC4wKTtcXG4gICAgICAgIGdsX1Bvc2l0aW9uID0gdV9tYXRyaXggKiB2ZWM0KGFfcG9zLCAwLCAxKSArIHZlYzQoZXh0cnVkZSwgMCwgMCk7XFxuICAgIH1cXG5cXG4gICAgdl9nYW1tYV9zY2FsZSA9IGdsX1Bvc2l0aW9uLnc7XFxuXFxuICAgIHZfdGV4ID0gYV90ZXggLyB1X3RleHNpemU7XFxuICAgIHZfZmFkZV90ZXggPSB2ZWMyKGFfbGFiZWxtaW56b29tIC8gMjU1LjAsIDAuMCk7XFxufVxcblwifX07XG59LHtcInBhdGhcIjoyM31dLDgwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBWZXJ0ZXhBcnJheU9iamVjdD1mdW5jdGlvbigpe3RoaXMuYm91bmRQcm9ncmFtPW51bGwsdGhpcy5ib3VuZFZlcnRleEJ1ZmZlcj1udWxsLHRoaXMuYm91bmRWZXJ0ZXhCdWZmZXIyPW51bGwsdGhpcy5ib3VuZEVsZW1lbnRCdWZmZXI9bnVsbCx0aGlzLmJvdW5kVmVydGV4T2Zmc2V0PW51bGwsdGhpcy52YW89bnVsbH07VmVydGV4QXJyYXlPYmplY3QucHJvdG90eXBlLmJpbmQ9ZnVuY3Rpb24oZSx0LHIsaSxuLHMpe3ZvaWQgMD09PWUuZXh0VmVydGV4QXJyYXlPYmplY3QmJihlLmV4dFZlcnRleEFycmF5T2JqZWN0PWUuZ2V0RXh0ZW5zaW9uKFwiT0VTX3ZlcnRleF9hcnJheV9vYmplY3RcIikpO3ZhciBvPSF0aGlzLnZhb3x8dGhpcy5ib3VuZFByb2dyYW0hPT10fHx0aGlzLmJvdW5kVmVydGV4QnVmZmVyIT09cnx8dGhpcy5ib3VuZFZlcnRleEJ1ZmZlcjIhPT1ufHx0aGlzLmJvdW5kRWxlbWVudEJ1ZmZlciE9PWl8fHRoaXMuYm91bmRWZXJ0ZXhPZmZzZXQhPT1zOyFlLmV4dFZlcnRleEFycmF5T2JqZWN0fHxvPyh0aGlzLmZyZXNoQmluZChlLHQscixpLG4scyksdGhpcy5nbD1lKTplLmV4dFZlcnRleEFycmF5T2JqZWN0LmJpbmRWZXJ0ZXhBcnJheU9FUyh0aGlzLnZhbyl9LFZlcnRleEFycmF5T2JqZWN0LnByb3RvdHlwZS5mcmVzaEJpbmQ9ZnVuY3Rpb24oZSx0LHIsaSxuLHMpe3ZhciBvLHU9dC5udW1BdHRyaWJ1dGVzO2lmKGUuZXh0VmVydGV4QXJyYXlPYmplY3QpdGhpcy52YW8mJnRoaXMuZGVzdHJveSgpLHRoaXMudmFvPWUuZXh0VmVydGV4QXJyYXlPYmplY3QuY3JlYXRlVmVydGV4QXJyYXlPRVMoKSxlLmV4dFZlcnRleEFycmF5T2JqZWN0LmJpbmRWZXJ0ZXhBcnJheU9FUyh0aGlzLnZhbyksbz0wLHRoaXMuYm91bmRQcm9ncmFtPXQsdGhpcy5ib3VuZFZlcnRleEJ1ZmZlcj1yLHRoaXMuYm91bmRWZXJ0ZXhCdWZmZXIyPW4sdGhpcy5ib3VuZEVsZW1lbnRCdWZmZXI9aSx0aGlzLmJvdW5kVmVydGV4T2Zmc2V0PXM7ZWxzZXtvPWUuY3VycmVudE51bUF0dHJpYnV0ZXN8fDA7Zm9yKHZhciBiPXU7YjxvO2IrKyllLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShiKX1yLmVuYWJsZUF0dHJpYnV0ZXMoZSx0KSxuJiZuLmVuYWJsZUF0dHJpYnV0ZXMoZSx0KSxyLmJpbmQoZSksci5zZXRWZXJ0ZXhBdHRyaWJQb2ludGVycyhlLHQscyksbiYmKG4uYmluZChlKSxuLnNldFZlcnRleEF0dHJpYlBvaW50ZXJzKGUsdCxzKSksaSYmaS5iaW5kKGUpLGUuY3VycmVudE51bUF0dHJpYnV0ZXM9dX0sVmVydGV4QXJyYXlPYmplY3QucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLnZhbyYmKHRoaXMuZ2wuZXh0VmVydGV4QXJyYXlPYmplY3QuZGVsZXRlVmVydGV4QXJyYXlPRVModGhpcy52YW8pLHRoaXMudmFvPW51bGwpfSxtb2R1bGUuZXhwb3J0cz1WZXJ0ZXhBcnJheU9iamVjdDtcbn0se31dLDgxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciB1dGlsPV9kZXJlcV8oXCIuLi91dGlsL3V0aWxcIik7ZXhwb3J0cy5wYWNrVWludDhUb0Zsb2F0PWZ1bmN0aW9uKHQsbCl7cmV0dXJuIHQ9dXRpbC5jbGFtcChNYXRoLmZsb29yKHQpLDAsMjU1KSxsPXV0aWwuY2xhbXAoTWF0aC5mbG9vcihsKSwwLDI1NSksMjU2KnQrbH07XG59LHtcIi4uL3V0aWwvdXRpbFwiOjIxNX1dLDgyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBJbWFnZVNvdXJjZT1fZGVyZXFfKFwiLi9pbWFnZV9zb3VyY2VcIiksd2luZG93PV9kZXJlcV8oXCIuLi91dGlsL3dpbmRvd1wiKSxDYW52YXNTb3VyY2U9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gaShpLGEscyxuKXt0LmNhbGwodGhpcyxpLGEscyxuKSx0aGlzLm9wdGlvbnM9YSx0aGlzLmFuaW1hdGU9IWEuaGFzT3duUHJvcGVydHkoXCJhbmltYXRlXCIpfHxhLmFuaW1hdGV9cmV0dXJuIHQmJihpLl9fcHJvdG9fXz10KSxpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxpLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1pLGkucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXtpZih0aGlzLmNhbnZhcz10aGlzLmNhbnZhc3x8d2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMub3B0aW9ucy5jYW52YXMpLHRoaXMud2lkdGg9dGhpcy5jYW52YXMud2lkdGgsdGhpcy5oZWlnaHQ9dGhpcy5jYW52YXMuaGVpZ2h0LHRoaXMuX2hhc0ludmFsaWREaW1lbnNpb25zKCkpcmV0dXJuIHRoaXMuZmlyZShcImVycm9yXCIsbmV3IEVycm9yKFwiQ2FudmFzIGRpbWVuc2lvbnMgY2Fubm90IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB6ZXJvLlwiKSk7dmFyIHQ7dGhpcy5wbGF5PWZ1bmN0aW9uKCl7dD10aGlzLm1hcC5zdHlsZS5hbmltYXRpb25Mb29wLnNldCgxLzApLHRoaXMubWFwLl9yZXJlbmRlcigpfSx0aGlzLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5tYXAuc3R5bGUuYW5pbWF0aW9uTG9vcC5jYW5jZWwodCl9LHRoaXMuX2ZpbmlzaExvYWRpbmcoKX0saS5wcm90b3R5cGUuZ2V0Q2FudmFzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FudmFzfSxpLnByb3RvdHlwZS5vbkFkZD1mdW5jdGlvbih0KXt0aGlzLm1hcHx8KHRoaXMubWFwPXQsdGhpcy5sb2FkKCksdGhpcy5jYW52YXMmJnRoaXMuYW5pbWF0ZSYmdGhpcy5wbGF5KCkpfSxpLnByb3RvdHlwZS5wcmVwYXJlPWZ1bmN0aW9uKCl7dmFyIHQ9ITE7dGhpcy5jYW52YXMud2lkdGghPT10aGlzLndpZHRoJiYodGhpcy53aWR0aD10aGlzLmNhbnZhcy53aWR0aCx0PSEwKSx0aGlzLmNhbnZhcy5oZWlnaHQhPT10aGlzLmhlaWdodCYmKHRoaXMuaGVpZ2h0PXRoaXMuY2FudmFzLmhlaWdodCx0PSEwKSx0aGlzLl9oYXNJbnZhbGlkRGltZW5zaW9ucygpfHx0aGlzLnRpbGUmJnRoaXMuX3ByZXBhcmVJbWFnZSh0aGlzLm1hcC5wYWludGVyLmdsLHRoaXMuY2FudmFzLHQpfSxpLnByb3RvdHlwZS5zZXJpYWxpemU9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTpcImNhbnZhc1wiLGNhbnZhczp0aGlzLmNhbnZhcyxjb29yZGluYXRlczp0aGlzLmNvb3JkaW5hdGVzfX0saS5wcm90b3R5cGUuX2hhc0ludmFsaWREaW1lbnNpb25zPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMsaT0wLGE9W3QuY2FudmFzLndpZHRoLHQuY2FudmFzLmhlaWdodF07aTxhLmxlbmd0aDtpKz0xKXt2YXIgcz1hW2ldO2lmKGlzTmFOKHMpfHxzPD0wKXJldHVybiEwfXJldHVybiExfSxpfShJbWFnZVNvdXJjZSk7bW9kdWxlLmV4cG9ydHM9Q2FudmFzU291cmNlO1xufSx7XCIuLi91dGlsL3dpbmRvd1wiOjE5NyxcIi4vaW1hZ2Vfc291cmNlXCI6ODZ9XSw4MzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiByZXNvbHZlVVJMKHQpe3ZhciBlPXdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtyZXR1cm4gZS5ocmVmPXQsZS5ocmVmfXZhciBFdmVudGVkPV9kZXJlcV8oXCIuLi91dGlsL2V2ZW50ZWRcIiksdXRpbD1fZGVyZXFfKFwiLi4vdXRpbC91dGlsXCIpLHdpbmRvdz1fZGVyZXFfKFwiLi4vdXRpbC93aW5kb3dcIiksRVhURU5UPV9kZXJlcV8oXCIuLi9kYXRhL2V4dGVudFwiKSxHZW9KU09OU291cmNlPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxvLGkscil7dC5jYWxsKHRoaXMpLG89b3x8e30sdGhpcy5pZD1lLHRoaXMudHlwZT1cImdlb2pzb25cIix0aGlzLm1pbnpvb209MCx0aGlzLm1heHpvb209MTgsdGhpcy50aWxlU2l6ZT01MTIsdGhpcy5pc1RpbGVDbGlwcGVkPSEwLHRoaXMucmVwYXJzZU92ZXJzY2FsZWQ9ITAsdGhpcy5kaXNwYXRjaGVyPWksdGhpcy5zZXRFdmVudGVkUGFyZW50KHIpLHRoaXMuX2RhdGE9by5kYXRhLHZvaWQgMCE9PW8ubWF4em9vbSYmKHRoaXMubWF4em9vbT1vLm1heHpvb20pLG8udHlwZSYmKHRoaXMudHlwZT1vLnR5cGUpO3ZhciBhPUVYVEVOVC90aGlzLnRpbGVTaXplO3RoaXMud29ya2VyT3B0aW9ucz11dGlsLmV4dGVuZCh7c291cmNlOnRoaXMuaWQsY2x1c3RlcjpvLmNsdXN0ZXJ8fCExLGdlb2pzb25WdE9wdGlvbnM6e2J1ZmZlcjoodm9pZCAwIT09by5idWZmZXI/by5idWZmZXI6MTI4KSphLHRvbGVyYW5jZToodm9pZCAwIT09by50b2xlcmFuY2U/by50b2xlcmFuY2U6LjM3NSkqYSxleHRlbnQ6RVhURU5ULG1heFpvb206dGhpcy5tYXh6b29tfSxzdXBlcmNsdXN0ZXJPcHRpb25zOnttYXhab29tOk1hdGgubWluKG8uY2x1c3Rlck1heFpvb20sdGhpcy5tYXh6b29tLTEpfHx0aGlzLm1heHpvb20tMSxleHRlbnQ6RVhURU5ULHJhZGl1czooby5jbHVzdGVyUmFkaXVzfHw1MCkqYSxsb2c6ITF9fSxvLndvcmtlck9wdGlvbnMpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmZpcmUoXCJkYXRhbG9hZGluZ1wiLHtkYXRhVHlwZTpcInNvdXJjZVwifSksdGhpcy5fdXBkYXRlV29ya2VyRGF0YShmdW5jdGlvbihlKXtyZXR1cm4gZT92b2lkIHQuZmlyZShcImVycm9yXCIse2Vycm9yOmV9KTp2b2lkIHQuZmlyZShcImRhdGFcIix7ZGF0YVR5cGU6XCJzb3VyY2VcIixzb3VyY2VEYXRhVHlwZTpcIm1ldGFkYXRhXCJ9KX0pfSxlLnByb3RvdHlwZS5vbkFkZD1mdW5jdGlvbih0KXt0aGlzLmxvYWQoKSx0aGlzLm1hcD10fSxlLnByb3RvdHlwZS5zZXREYXRhPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7cmV0dXJuIHRoaXMuX2RhdGE9dCx0aGlzLmZpcmUoXCJkYXRhbG9hZGluZ1wiLHtkYXRhVHlwZTpcInNvdXJjZVwifSksdGhpcy5fdXBkYXRlV29ya2VyRGF0YShmdW5jdGlvbih0KXtyZXR1cm4gdD9lLmZpcmUoXCJlcnJvclwiLHtlcnJvcjp0fSk6dm9pZCBlLmZpcmUoXCJkYXRhXCIse2RhdGFUeXBlOlwic291cmNlXCIsc291cmNlRGF0YVR5cGU6XCJjb250ZW50XCJ9KX0pLHRoaXN9LGUucHJvdG90eXBlLl91cGRhdGVXb3JrZXJEYXRhPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbz11dGlsLmV4dGVuZCh7fSx0aGlzLndvcmtlck9wdGlvbnMpLGk9dGhpcy5fZGF0YTtcInN0cmluZ1wiPT10eXBlb2YgaT9vLnVybD1yZXNvbHZlVVJMKGkpOm8uZGF0YT1KU09OLnN0cmluZ2lmeShpKSx0aGlzLndvcmtlcklEPXRoaXMuZGlzcGF0Y2hlci5zZW5kKHRoaXMudHlwZStcIi5sb2FkRGF0YVwiLG8sZnVuY3Rpb24obyl7ZS5fbG9hZGVkPSEwLHQobyl9KX0sZS5wcm90b3R5cGUubG9hZFRpbGU9ZnVuY3Rpb24odCxlKXt2YXIgbz10aGlzLGk9dC5jb29yZC56PnRoaXMubWF4em9vbT9NYXRoLnBvdygyLHQuY29vcmQuei10aGlzLm1heHpvb20pOjEscj17dHlwZTp0aGlzLnR5cGUsdWlkOnQudWlkLGNvb3JkOnQuY29vcmQsem9vbTp0LmNvb3JkLnosbWF4Wm9vbTp0aGlzLm1heHpvb20sdGlsZVNpemU6dGhpcy50aWxlU2l6ZSxzb3VyY2U6dGhpcy5pZCxvdmVyc2NhbGluZzppLGFuZ2xlOnRoaXMubWFwLnRyYW5zZm9ybS5hbmdsZSxwaXRjaDp0aGlzLm1hcC50cmFuc2Zvcm0ucGl0Y2gsc2hvd0NvbGxpc2lvbkJveGVzOnRoaXMubWFwLnNob3dDb2xsaXNpb25Cb3hlc307dC53b3JrZXJJRD10aGlzLmRpc3BhdGNoZXIuc2VuZChcImxvYWRUaWxlXCIscixmdW5jdGlvbihpLHIpe2lmKHQudW5sb2FkVmVjdG9yRGF0YSgpLCF0LmFib3J0ZWQpcmV0dXJuIGk/ZShpKToodC5sb2FkVmVjdG9yRGF0YShyLG8ubWFwLnBhaW50ZXIpLHQucmVkb1doZW5Eb25lJiYodC5yZWRvV2hlbkRvbmU9ITEsdC5yZWRvUGxhY2VtZW50KG8pKSxlKG51bGwpKX0sdGhpcy53b3JrZXJJRCl9LGUucHJvdG90eXBlLmFib3J0VGlsZT1mdW5jdGlvbih0KXt0LmFib3J0ZWQ9ITB9LGUucHJvdG90eXBlLnVubG9hZFRpbGU9ZnVuY3Rpb24odCl7dC51bmxvYWRWZWN0b3JEYXRhKCksdGhpcy5kaXNwYXRjaGVyLnNlbmQoXCJyZW1vdmVUaWxlXCIse3VpZDp0LnVpZCx0eXBlOnRoaXMudHlwZSxzb3VyY2U6dGhpcy5pZH0sZnVuY3Rpb24oKXt9LHQud29ya2VySUQpfSxlLnByb3RvdHlwZS5vblJlbW92ZT1mdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoXCJyZW1vdmVTb3VyY2VcIix7dHlwZTp0aGlzLnR5cGUsc291cmNlOnRoaXMuaWR9LGZ1bmN0aW9uKCl7fSl9LGUucHJvdG90eXBlLnNlcmlhbGl6ZT1mdW5jdGlvbigpe3JldHVybnt0eXBlOnRoaXMudHlwZSxkYXRhOnRoaXMuX2RhdGF9fSxlfShFdmVudGVkKTttb2R1bGUuZXhwb3J0cz1HZW9KU09OU291cmNlO1xufSx7XCIuLi9kYXRhL2V4dGVudFwiOjU0LFwiLi4vdXRpbC9ldmVudGVkXCI6MjAzLFwiLi4vdXRpbC91dGlsXCI6MjE1LFwiLi4vdXRpbC93aW5kb3dcIjoxOTd9XSw4NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgYWpheD1fZGVyZXFfKFwiLi4vdXRpbC9hamF4XCIpLHJld2luZD1fZGVyZXFfKFwiZ2VvanNvbi1yZXdpbmRcIiksR2VvSlNPTldyYXBwZXI9X2RlcmVxXyhcIi4vZ2VvanNvbl93cmFwcGVyXCIpLHZ0cGJmPV9kZXJlcV8oXCJ2dC1wYmZcIiksc3VwZXJjbHVzdGVyPV9kZXJlcV8oXCJzdXBlcmNsdXN0ZXJcIiksZ2VvanNvbnZ0PV9kZXJlcV8oXCJnZW9qc29uLXZ0XCIpLFZlY3RvclRpbGVXb3JrZXJTb3VyY2U9X2RlcmVxXyhcIi4vdmVjdG9yX3RpbGVfd29ya2VyX3NvdXJjZVwiKSxHZW9KU09OV29ya2VyU291cmNlPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHIocix0LG8pe2UuY2FsbCh0aGlzLHIsdCksbyYmKHRoaXMubG9hZEdlb0pTT049byksdGhpcy5fZ2VvSlNPTkluZGV4ZXM9e319cmV0dXJuIGUmJihyLl9fcHJvdG9fXz1lKSxyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlKSxyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1yLHIucHJvdG90eXBlLmxvYWRWZWN0b3JEYXRhPWZ1bmN0aW9uKGUscil7dmFyIHQ9ZS5zb3VyY2Usbz1lLmNvb3JkO2lmKCF0aGlzLl9nZW9KU09OSW5kZXhlc1t0XSlyZXR1cm4gcihudWxsLG51bGwpO3ZhciBuPXRoaXMuX2dlb0pTT05JbmRleGVzW3RdLmdldFRpbGUoTWF0aC5taW4oby56LGUubWF4Wm9vbSksby54LG8ueSk7aWYoIW4pcmV0dXJuIHIobnVsbCxudWxsKTt2YXIgdT1uZXcgR2VvSlNPTldyYXBwZXIobi5mZWF0dXJlcyk7dS5uYW1lPVwiX2dlb2pzb25UaWxlTGF5ZXJcIjt2YXIgYT12dHBiZih7bGF5ZXJzOntfZ2VvanNvblRpbGVMYXllcjp1fX0pOzA9PT1hLmJ5dGVPZmZzZXQmJmEuYnl0ZUxlbmd0aD09PWEuYnVmZmVyLmJ5dGVMZW5ndGh8fChhPW5ldyBVaW50OEFycmF5KGEpKSx1LnJhd0RhdGE9YS5idWZmZXIscihudWxsLHUpfSxyLnByb3RvdHlwZS5sb2FkRGF0YT1mdW5jdGlvbihlLHIpe3ZhciB0PWZ1bmN0aW9uKHQsbyl7dmFyIG49dGhpcztyZXR1cm4gdD9yKHQpOlwib2JqZWN0XCIhPXR5cGVvZiBvP3IobmV3IEVycm9yKFwiSW5wdXQgZGF0YSBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC5cIikpOihyZXdpbmQobywhMCksdm9pZCB0aGlzLl9pbmRleERhdGEobyxlLGZ1bmN0aW9uKHQsbyl7cmV0dXJuIHQ/cih0KToobi5fZ2VvSlNPTkluZGV4ZXNbZS5zb3VyY2VdPW8sdm9pZCByKG51bGwpKX0pKX0uYmluZCh0aGlzKTt0aGlzLmxvYWRHZW9KU09OKGUsdCl9LHIucHJvdG90eXBlLmxvYWRHZW9KU09OPWZ1bmN0aW9uKGUscil7aWYoZS51cmwpYWpheC5nZXRKU09OKGUudXJsLHIpO2Vsc2V7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIGUuZGF0YSlyZXR1cm4gcihuZXcgRXJyb3IoXCJJbnB1dCBkYXRhIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04gb2JqZWN0LlwiKSk7dHJ5e3JldHVybiByKG51bGwsSlNPTi5wYXJzZShlLmRhdGEpKX1jYXRjaChlKXtyZXR1cm4gcihuZXcgRXJyb3IoXCJJbnB1dCBkYXRhIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04gb2JqZWN0LlwiKSl9fX0sci5wcm90b3R5cGUucmVtb3ZlU291cmNlPWZ1bmN0aW9uKGUpe3RoaXMuX2dlb0pTT05JbmRleGVzW2Uuc291cmNlXSYmZGVsZXRlIHRoaXMuX2dlb0pTT05JbmRleGVzW2Uuc291cmNlXX0sci5wcm90b3R5cGUuX2luZGV4RGF0YT1mdW5jdGlvbihlLHIsdCl7dHJ5e3IuY2x1c3Rlcj90KG51bGwsc3VwZXJjbHVzdGVyKHIuc3VwZXJjbHVzdGVyT3B0aW9ucykubG9hZChlLmZlYXR1cmVzKSk6dChudWxsLGdlb2pzb252dChlLHIuZ2VvanNvblZ0T3B0aW9ucykpfWNhdGNoKGUpe3JldHVybiB0KGUpfX0scn0oVmVjdG9yVGlsZVdvcmtlclNvdXJjZSk7bW9kdWxlLmV4cG9ydHM9R2VvSlNPTldvcmtlclNvdXJjZTtcbn0se1wiLi4vdXRpbC9hamF4XCI6MTk0LFwiLi9nZW9qc29uX3dyYXBwZXJcIjo4NSxcIi4vdmVjdG9yX3RpbGVfd29ya2VyX3NvdXJjZVwiOjk4LFwiZ2VvanNvbi1yZXdpbmRcIjo3LFwiZ2VvanNvbi12dFwiOjExLFwic3VwZXJjbHVzdGVyXCI6MjksXCJ2dC1wYmZcIjozOH1dLDg1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBQb2ludD1fZGVyZXFfKFwicG9pbnQtZ2VvbWV0cnlcIiksVmVjdG9yVGlsZUZlYXR1cmU9X2RlcmVxXyhcInZlY3Rvci10aWxlXCIpLlZlY3RvclRpbGVGZWF0dXJlLEVYVEVOVD1fZGVyZXFfKFwiLi4vZGF0YS9leHRlbnRcIiksRmVhdHVyZVdyYXBwZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZih0aGlzLnR5cGU9ZS50eXBlLDE9PT1lLnR5cGUpe3RoaXMucmF3R2VvbWV0cnk9W107Zm9yKHZhciByPTA7cjxlLmdlb21ldHJ5Lmxlbmd0aDtyKyspdC5yYXdHZW9tZXRyeS5wdXNoKFtlLmdlb21ldHJ5W3JdXSl9ZWxzZSB0aGlzLnJhd0dlb21ldHJ5PWUuZ2VvbWV0cnk7dGhpcy5wcm9wZXJ0aWVzPWUudGFncyxcImlkXCJpbiBlJiYhaXNOYU4oZS5pZCkmJih0aGlzLmlkPXBhcnNlSW50KGUuaWQsMTApKSx0aGlzLmV4dGVudD1FWFRFTlR9O0ZlYXR1cmVXcmFwcGVyLnByb3RvdHlwZS5sb2FkR2VvbWV0cnk9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5yYXdHZW9tZXRyeTt0aGlzLmdlb21ldHJ5PVtdO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXtmb3IodmFyIG89dFtyXSxhPVtdLGk9MDtpPG8ubGVuZ3RoO2krKylhLnB1c2gobmV3IFBvaW50KG9baV1bMF0sb1tpXVsxXSkpO2UuZ2VvbWV0cnkucHVzaChhKX1yZXR1cm4gdGhpcy5nZW9tZXRyeX0sRmVhdHVyZVdyYXBwZXIucHJvdG90eXBlLmJib3g9ZnVuY3Rpb24oKXt0aGlzLmdlb21ldHJ5fHx0aGlzLmxvYWRHZW9tZXRyeSgpO2Zvcih2YXIgZT10aGlzLmdlb21ldHJ5LHQ9MS8wLHI9LSgxLzApLG89MS8wLGE9LSgxLzApLGk9MDtpPGUubGVuZ3RoO2krKylmb3IodmFyIHA9ZVtpXSxuPTA7bjxwLmxlbmd0aDtuKyspe3ZhciBoPXBbbl07dD1NYXRoLm1pbih0LGgueCkscj1NYXRoLm1heChyLGgueCksbz1NYXRoLm1pbihvLGgueSksYT1NYXRoLm1heChhLGgueSl9cmV0dXJuW3QsbyxyLGFdfSxGZWF0dXJlV3JhcHBlci5wcm90b3R5cGUudG9HZW9KU09OPWZ1bmN0aW9uKCl7VmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTi5jYWxsKHRoaXMpfTt2YXIgR2VvSlNPTldyYXBwZXI9ZnVuY3Rpb24oZSl7dGhpcy5mZWF0dXJlcz1lLHRoaXMubGVuZ3RoPWUubGVuZ3RoLHRoaXMuZXh0ZW50PUVYVEVOVH07R2VvSlNPTldyYXBwZXIucHJvdG90eXBlLmZlYXR1cmU9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBGZWF0dXJlV3JhcHBlcih0aGlzLmZlYXR1cmVzW2VdKX0sbW9kdWxlLmV4cG9ydHM9R2VvSlNPTldyYXBwZXI7XG59LHtcIi4uL2RhdGEvZXh0ZW50XCI6NTQsXCJwb2ludC1nZW9tZXRyeVwiOjI2LFwidmVjdG9yLXRpbGVcIjozNH1dLDg2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciB1dGlsPV9kZXJlcV8oXCIuLi91dGlsL3V0aWxcIiksd2luZG93PV9kZXJlcV8oXCIuLi91dGlsL3dpbmRvd1wiKSxUaWxlQ29vcmQ9X2RlcmVxXyhcIi4vdGlsZV9jb29yZFwiKSxMbmdMYXQ9X2RlcmVxXyhcIi4uL2dlby9sbmdfbGF0XCIpLFBvaW50PV9kZXJlcV8oXCJwb2ludC1nZW9tZXRyeVwiKSxFdmVudGVkPV9kZXJlcV8oXCIuLi91dGlsL2V2ZW50ZWRcIiksYWpheD1fZGVyZXFfKFwiLi4vdXRpbC9hamF4XCIpLEVYVEVOVD1fZGVyZXFfKFwiLi4vZGF0YS9leHRlbnRcIiksUmFzdGVyQm91bmRzQXJyYXk9X2RlcmVxXyhcIi4uL2RhdGEvcmFzdGVyX2JvdW5kc19hcnJheVwiKSxCdWZmZXI9X2RlcmVxXyhcIi4uL2RhdGEvYnVmZmVyXCIpLFZlcnRleEFycmF5T2JqZWN0PV9kZXJlcV8oXCIuLi9yZW5kZXIvdmVydGV4X2FycmF5X29iamVjdFwiKSxJbWFnZVNvdXJjZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbyxyLGkpe3QuY2FsbCh0aGlzKSx0aGlzLmlkPWUsdGhpcy5kaXNwYXRjaGVyPXIsdGhpcy5jb29yZGluYXRlcz1vLmNvb3JkaW5hdGVzLHRoaXMudHlwZT1cImltYWdlXCIsdGhpcy5taW56b29tPTAsdGhpcy5tYXh6b29tPTIyLHRoaXMudGlsZVNpemU9NTEyLHRoaXMuc2V0RXZlbnRlZFBhcmVudChpKSx0aGlzLm9wdGlvbnM9b31yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5maXJlKFwiZGF0YWxvYWRpbmdcIix7ZGF0YVR5cGU6XCJzb3VyY2VcIn0pLHRoaXMudXJsPXRoaXMub3B0aW9ucy51cmwsYWpheC5nZXRJbWFnZSh0aGlzLm9wdGlvbnMudXJsLGZ1bmN0aW9uKGUsbyl7cmV0dXJuIGU/dC5maXJlKFwiZXJyb3JcIix7ZXJyb3I6ZX0pOih0LmltYWdlPW8sdm9pZCB0Ll9maW5pc2hMb2FkaW5nKCkpfSl9LGUucHJvdG90eXBlLl9maW5pc2hMb2FkaW5nPWZ1bmN0aW9uKCl7dGhpcy5tYXAmJih0aGlzLnNldENvb3JkaW5hdGVzKHRoaXMuY29vcmRpbmF0ZXMpLHRoaXMuZmlyZShcImRhdGFcIix7ZGF0YVR5cGU6XCJzb3VyY2VcIixzb3VyY2VEYXRhVHlwZTpcIm1ldGFkYXRhXCJ9KSl9LGUucHJvdG90eXBlLm9uQWRkPWZ1bmN0aW9uKHQpe3RoaXMubG9hZCgpLHRoaXMubWFwPXQsdGhpcy5pbWFnZSYmdGhpcy5zZXRDb29yZGluYXRlcyh0aGlzLmNvb3JkaW5hdGVzKX0sZS5wcm90b3R5cGUuc2V0Q29vcmRpbmF0ZXM9ZnVuY3Rpb24odCl7dGhpcy5jb29yZGluYXRlcz10O3ZhciBlPXRoaXMubWFwLG89dC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGUudHJhbnNmb3JtLmxvY2F0aW9uQ29vcmRpbmF0ZShMbmdMYXQuY29udmVydCh0KSkuem9vbVRvKDApfSkscj10aGlzLmNlbnRlckNvb3JkPXV0aWwuZ2V0Q29vcmRpbmF0ZXNDZW50ZXIobyk7cmV0dXJuIHIuY29sdW1uPU1hdGguZmxvb3Ioci5jb2x1bW4pLHIucm93PU1hdGguZmxvb3Ioci5yb3cpLHRoaXMuY29vcmQ9bmV3IFRpbGVDb29yZChyLnpvb20sci5jb2x1bW4sci5yb3cpLHRoaXMubWluem9vbT10aGlzLm1heHpvb209ci56b29tLHRoaXMuX3RpbGVDb29yZHM9by5tYXAoZnVuY3Rpb24odCl7dmFyIGU9dC56b29tVG8oci56b29tKTtyZXR1cm4gbmV3IFBvaW50KE1hdGgucm91bmQoKGUuY29sdW1uLXIuY29sdW1uKSpFWFRFTlQpLE1hdGgucm91bmQoKGUucm93LXIucm93KSpFWFRFTlQpKX0pLHRoaXMuZmlyZShcImRhdGFcIix7ZGF0YVR5cGU6XCJzb3VyY2VcIixzb3VyY2VEYXRhVHlwZTpcImNvbnRlbnRcIn0pLHRoaXN9LGUucHJvdG90eXBlLl9zZXRUaWxlPWZ1bmN0aW9uKHQpe3RoaXMudGlsZT10O3ZhciBlPTMyNzY3LG89bmV3IFJhc3RlckJvdW5kc0FycmF5O28uZW1wbGFjZUJhY2sodGhpcy5fdGlsZUNvb3Jkc1swXS54LHRoaXMuX3RpbGVDb29yZHNbMF0ueSwwLDApLG8uZW1wbGFjZUJhY2sodGhpcy5fdGlsZUNvb3Jkc1sxXS54LHRoaXMuX3RpbGVDb29yZHNbMV0ueSxlLDApLG8uZW1wbGFjZUJhY2sodGhpcy5fdGlsZUNvb3Jkc1szXS54LHRoaXMuX3RpbGVDb29yZHNbM10ueSwwLGUpLG8uZW1wbGFjZUJhY2sodGhpcy5fdGlsZUNvb3Jkc1syXS54LHRoaXMuX3RpbGVDb29yZHNbMl0ueSxlLGUpLHRoaXMudGlsZS5idWNrZXRzPXt9LHRoaXMudGlsZS5ib3VuZHNCdWZmZXI9QnVmZmVyLmZyb21TdHJ1Y3RBcnJheShvLEJ1ZmZlci5CdWZmZXJUeXBlLlZFUlRFWCksdGhpcy50aWxlLmJvdW5kc1ZBTz1uZXcgVmVydGV4QXJyYXlPYmplY3R9LGUucHJvdG90eXBlLnByZXBhcmU9ZnVuY3Rpb24oKXt0aGlzLnRpbGUmJnRoaXMuaW1hZ2UmJnRoaXMuX3ByZXBhcmVJbWFnZSh0aGlzLm1hcC5wYWludGVyLmdsLHRoaXMuaW1hZ2UpfSxlLnByb3RvdHlwZS5fcHJlcGFyZUltYWdlPWZ1bmN0aW9uKHQsZSxvKXtcImxvYWRlZFwiIT09dGhpcy50aWxlLnN0YXRlPyh0aGlzLnRpbGUuc3RhdGU9XCJsb2FkZWRcIix0aGlzLnRpbGUudGV4dHVyZT10LmNyZWF0ZVRleHR1cmUoKSx0LmJpbmRUZXh0dXJlKHQuVEVYVFVSRV8yRCx0aGlzLnRpbGUudGV4dHVyZSksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfV1JBUF9TLHQuQ0xBTVBfVE9fRURHRSksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfV1JBUF9ULHQuQ0xBTVBfVE9fRURHRSksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUlOX0ZJTFRFUix0LkxJTkVBUiksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUFHX0ZJTFRFUix0LkxJTkVBUiksdC50ZXhJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLHQuUkdCQSx0LlJHQkEsdC5VTlNJR05FRF9CWVRFLGUpKTpvP3QudGV4SW1hZ2UyRCh0LlRFWFRVUkVfMkQsMCx0LlJHQkEsdC5SR0JBLHQuVU5TSUdORURfQllURSxlKTooZSBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MVmlkZW9FbGVtZW50fHxlIGluc3RhbmNlb2Ygd2luZG93LkltYWdlRGF0YXx8ZSBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MQ2FudmFzRWxlbWVudCkmJih0LmJpbmRUZXh0dXJlKHQuVEVYVFVSRV8yRCx0aGlzLnRpbGUudGV4dHVyZSksdC50ZXhTdWJJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLDAsMCx0LlJHQkEsdC5VTlNJR05FRF9CWVRFLGUpKX0sZS5wcm90b3R5cGUubG9hZFRpbGU9ZnVuY3Rpb24odCxlKXt0aGlzLmNvb3JkJiZ0aGlzLmNvb3JkLnRvU3RyaW5nKCk9PT10LmNvb3JkLnRvU3RyaW5nKCk/KHRoaXMuX3NldFRpbGUodCksZShudWxsKSk6KHQuc3RhdGU9XCJlcnJvcmVkXCIsZShudWxsKSl9LGUucHJvdG90eXBlLnNlcmlhbGl6ZT1mdW5jdGlvbigpe3JldHVybnt0eXBlOlwiaW1hZ2VcIix1cmxzOnRoaXMudXJsLGNvb3JkaW5hdGVzOnRoaXMuY29vcmRpbmF0ZXN9fSxlfShFdmVudGVkKTttb2R1bGUuZXhwb3J0cz1JbWFnZVNvdXJjZTtcbn0se1wiLi4vZGF0YS9idWZmZXJcIjo1MSxcIi4uL2RhdGEvZXh0ZW50XCI6NTQsXCIuLi9kYXRhL3Jhc3Rlcl9ib3VuZHNfYXJyYXlcIjo1OSxcIi4uL2dlby9sbmdfbGF0XCI6NjIsXCIuLi9yZW5kZXIvdmVydGV4X2FycmF5X29iamVjdFwiOjgwLFwiLi4vdXRpbC9hamF4XCI6MTk0LFwiLi4vdXRpbC9ldmVudGVkXCI6MjAzLFwiLi4vdXRpbC91dGlsXCI6MjE1LFwiLi4vdXRpbC93aW5kb3dcIjoxOTcsXCIuL3RpbGVfY29vcmRcIjo5NixcInBvaW50LWdlb21ldHJ5XCI6MjZ9XSw4NzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgdXRpbD1fZGVyZXFfKFwiLi4vdXRpbC91dGlsXCIpLGFqYXg9X2RlcmVxXyhcIi4uL3V0aWwvYWpheFwiKSxicm93c2VyPV9kZXJlcV8oXCIuLi91dGlsL2Jyb3dzZXJcIiksbm9ybWFsaXplVVJMPV9kZXJlcV8oXCIuLi91dGlsL21hcGJveFwiKS5ub3JtYWxpemVTb3VyY2VVUkw7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24ocixlKXt2YXIgbz1mdW5jdGlvbihyLG8pe2lmKHIpcmV0dXJuIGUocik7dmFyIGk9dXRpbC5waWNrKG8sW1widGlsZXNcIixcIm1pbnpvb21cIixcIm1heHpvb21cIixcImF0dHJpYnV0aW9uXCIsXCJtYXBib3hfbG9nb1wiLFwiYm91bmRzXCJdKTtvLnZlY3Rvcl9sYXllcnMmJihpLnZlY3RvckxheWVycz1vLnZlY3Rvcl9sYXllcnMsaS52ZWN0b3JMYXllcklkcz1pLnZlY3RvckxheWVycy5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIHIuaWR9KSksZShudWxsLGkpfTtyLnVybD9hamF4LmdldEpTT04obm9ybWFsaXplVVJMKHIudXJsKSxvKTpicm93c2VyLmZyYW1lKG8uYmluZChudWxsLG51bGwscikpfTtcbn0se1wiLi4vdXRpbC9hamF4XCI6MTk0LFwiLi4vdXRpbC9icm93c2VyXCI6MTk1LFwiLi4vdXRpbC9tYXBib3hcIjoyMTAsXCIuLi91dGlsL3V0aWxcIjoyMTV9XSw4ODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgRVhURU5UPV9kZXJlcV8oXCIuLi9kYXRhL2V4dGVudFwiKTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihlLHQscil7cmV0dXJuIHQqKEVYVEVOVC8oZS50aWxlU2l6ZSpNYXRoLnBvdygyLHItZS5jb29yZC56KSkpfTtcbn0se1wiLi4vZGF0YS9leHRlbnRcIjo1NH1dLDg5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIHNvcnRUaWxlc0luKGUscil7dmFyIG89ZS5jb29yZCx0PXIuY29vcmQ7cmV0dXJuIG8uei10Lnp8fG8ueS10Lnl8fG8udy10Lnd8fG8ueC10Lnh9ZnVuY3Rpb24gbWVyZ2VSZW5kZXJlZEZlYXR1cmVMYXllcnMoZSl7Zm9yKHZhciByPWVbMF18fHt9LG89MTtvPGUubGVuZ3RoO28rKyl7dmFyIHQ9ZVtvXTtmb3IodmFyIG4gaW4gdCl7dmFyIGE9dFtuXSxpPXJbbl07aWYodm9pZCAwPT09aSlpPXJbbl09YTtlbHNlIGZvcih2YXIgdT0wO3U8YS5sZW5ndGg7dSsrKWkucHVzaChhW3VdKX19cmV0dXJuIHJ9dmFyIFRpbGVDb29yZD1fZGVyZXFfKFwiLi90aWxlX2Nvb3JkXCIpO2V4cG9ydHMucmVuZGVyZWQ9ZnVuY3Rpb24oZSxyLG8sdCxuLGEpe3ZhciBpPWUudGlsZXNJbihvKTtpLnNvcnQoc29ydFRpbGVzSW4pO2Zvcih2YXIgdT1bXSxzPTA7czxpLmxlbmd0aDtzKyspe3ZhciBkPWlbc107ZC50aWxlLmZlYXR1cmVJbmRleCYmdS5wdXNoKGQudGlsZS5mZWF0dXJlSW5kZXgucXVlcnkoe3F1ZXJ5R2VvbWV0cnk6ZC5xdWVyeUdlb21ldHJ5LHNjYWxlOmQuc2NhbGUsdGlsZVNpemU6ZC50aWxlLnRpbGVTaXplLGJlYXJpbmc6YSxwYXJhbXM6dH0scikpfXJldHVybiBtZXJnZVJlbmRlcmVkRmVhdHVyZUxheWVycyh1KX0sZXhwb3J0cy5zb3VyY2U9ZnVuY3Rpb24oZSxyKXtmb3IodmFyIG89ZS5nZXRSZW5kZXJhYmxlSWRzKCkubWFwKGZ1bmN0aW9uKHIpe3JldHVybiBlLmdldFRpbGVCeUlEKHIpfSksdD1bXSxuPXt9LGE9MDthPG8ubGVuZ3RoO2ErKyl7dmFyIGk9b1thXSx1PW5ldyBUaWxlQ29vcmQoTWF0aC5taW4oaS5zb3VyY2VNYXhab29tLGkuY29vcmQueiksaS5jb29yZC54LGkuY29vcmQueSwwKS5pZDtuW3VdfHwoblt1XT0hMCxpLnF1ZXJ5U291cmNlRmVhdHVyZXModCxyKSl9cmV0dXJuIHR9O1xufSx7XCIuL3RpbGVfY29vcmRcIjo5Nn1dLDkwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciB1dGlsPV9kZXJlcV8oXCIuLi91dGlsL3V0aWxcIiksYWpheD1fZGVyZXFfKFwiLi4vdXRpbC9hamF4XCIpLEV2ZW50ZWQ9X2RlcmVxXyhcIi4uL3V0aWwvZXZlbnRlZFwiKSxsb2FkVGlsZUpTT049X2RlcmVxXyhcIi4vbG9hZF90aWxlanNvblwiKSxub3JtYWxpemVVUkw9X2RlcmVxXyhcIi4uL3V0aWwvbWFwYm94XCIpLm5vcm1hbGl6ZVRpbGVVUkwsVGlsZUJvdW5kcz1fZGVyZXFfKFwiLi90aWxlX2JvdW5kc1wiKSxSYXN0ZXJUaWxlU291cmNlPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCxpLHIsbyl7ZS5jYWxsKHRoaXMpLHRoaXMuaWQ9dCx0aGlzLmRpc3BhdGNoZXI9cix0aGlzLnNldEV2ZW50ZWRQYXJlbnQobyksdGhpcy50eXBlPVwicmFzdGVyXCIsdGhpcy5taW56b29tPTAsdGhpcy5tYXh6b29tPTIyLHRoaXMucm91bmRab29tPSEwLHRoaXMuc2NoZW1lPVwieHl6XCIsdGhpcy50aWxlU2l6ZT01MTIsdGhpcy5fbG9hZGVkPSExLHRoaXMub3B0aW9ucz1pLHV0aWwuZXh0ZW5kKHRoaXMsdXRpbC5waWNrKGksW1widXJsXCIsXCJzY2hlbWVcIixcInRpbGVTaXplXCJdKSl9cmV0dXJuIGUmJih0Ll9fcHJvdG9fXz1lKSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlKSx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10LHQucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuZmlyZShcImRhdGFsb2FkaW5nXCIse2RhdGFUeXBlOlwic291cmNlXCJ9KSxsb2FkVGlsZUpTT04odGhpcy5vcHRpb25zLGZ1bmN0aW9uKHQsaSl7cmV0dXJuIHQ/ZS5maXJlKFwiZXJyb3JcIix0KToodXRpbC5leHRlbmQoZSxpKSxlLnNldEJvdW5kcyhpLmJvdW5kcyksZS5maXJlKFwiZGF0YVwiLHtkYXRhVHlwZTpcInNvdXJjZVwiLHNvdXJjZURhdGFUeXBlOlwibWV0YWRhdGFcIn0pLHZvaWQgZS5maXJlKFwiZGF0YVwiLHtkYXRhVHlwZTpcInNvdXJjZVwiLHNvdXJjZURhdGFUeXBlOlwiY29udGVudFwifSkpfSl9LHQucHJvdG90eXBlLm9uQWRkPWZ1bmN0aW9uKGUpe3RoaXMubG9hZCgpLHRoaXMubWFwPWV9LHQucHJvdG90eXBlLnNldEJvdW5kcz1mdW5jdGlvbihlKXt0aGlzLmJvdW5kcz1lLGUmJih0aGlzLnRpbGVCb3VuZHM9bmV3IFRpbGVCb3VuZHMoZSx0aGlzLm1pbnpvb20sdGhpcy5tYXh6b29tKSl9LHQucHJvdG90eXBlLnNlcmlhbGl6ZT1mdW5jdGlvbigpe3JldHVybnt0eXBlOlwicmFzdGVyXCIsdXJsOnRoaXMudXJsLHRpbGVTaXplOnRoaXMudGlsZVNpemUsdGlsZXM6dGhpcy50aWxlcyxib3VuZHM6dGhpcy5ib3VuZHN9fSx0LnByb3RvdHlwZS5oYXNUaWxlPWZ1bmN0aW9uKGUpe3JldHVybiF0aGlzLnRpbGVCb3VuZHN8fHRoaXMudGlsZUJvdW5kcy5jb250YWlucyhlLHRoaXMubWF4em9vbSl9LHQucHJvdG90eXBlLmxvYWRUaWxlPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gaShpLHIpe2lmKGRlbGV0ZSBlLnJlcXVlc3QsZS5hYm9ydGVkKXJldHVybiB0aGlzLnN0YXRlPVwidW5sb2FkZWRcIix0KG51bGwpO2lmKGkpcmV0dXJuIHRoaXMuc3RhdGU9XCJlcnJvcmVkXCIsdChpKTt0aGlzLm1hcC5fcmVmcmVzaEV4cGlyZWRUaWxlcyYmZS5zZXRFeHBpcnlEYXRhKHIpLGRlbGV0ZSByLmNhY2hlQ29udHJvbCxkZWxldGUgci5leHBpcmVzO3ZhciBvPXRoaXMubWFwLnBhaW50ZXIuZ2w7ZS50ZXh0dXJlPXRoaXMubWFwLnBhaW50ZXIuZ2V0VGlsZVRleHR1cmUoci53aWR0aCksZS50ZXh0dXJlPyhvLmJpbmRUZXh0dXJlKG8uVEVYVFVSRV8yRCxlLnRleHR1cmUpLG8udGV4U3ViSW1hZ2UyRChvLlRFWFRVUkVfMkQsMCwwLDAsby5SR0JBLG8uVU5TSUdORURfQllURSxyKSk6KGUudGV4dHVyZT1vLmNyZWF0ZVRleHR1cmUoKSxvLmJpbmRUZXh0dXJlKG8uVEVYVFVSRV8yRCxlLnRleHR1cmUpLG8udGV4UGFyYW1ldGVyaShvLlRFWFRVUkVfMkQsby5URVhUVVJFX01JTl9GSUxURVIsby5MSU5FQVJfTUlQTUFQX05FQVJFU1QpLG8udGV4UGFyYW1ldGVyaShvLlRFWFRVUkVfMkQsby5URVhUVVJFX01BR19GSUxURVIsby5MSU5FQVIpLG8udGV4UGFyYW1ldGVyaShvLlRFWFRVUkVfMkQsby5URVhUVVJFX1dSQVBfUyxvLkNMQU1QX1RPX0VER0UpLG8udGV4UGFyYW1ldGVyaShvLlRFWFRVUkVfMkQsby5URVhUVVJFX1dSQVBfVCxvLkNMQU1QX1RPX0VER0UpLHRoaXMubWFwLnBhaW50ZXIuZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljJiZvLnRleFBhcmFtZXRlcmYoby5URVhUVVJFXzJELHRoaXMubWFwLnBhaW50ZXIuZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljLlRFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhULHRoaXMubWFwLnBhaW50ZXIuZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljTWF4KSxvLnRleEltYWdlMkQoby5URVhUVVJFXzJELDAsby5SR0JBLG8uUkdCQSxvLlVOU0lHTkVEX0JZVEUsciksZS50ZXh0dXJlLnNpemU9ci53aWR0aCksby5nZW5lcmF0ZU1pcG1hcChvLlRFWFRVUkVfMkQpLGUuc3RhdGU9XCJsb2FkZWRcIix0KG51bGwpfXZhciByPW5vcm1hbGl6ZVVSTChlLmNvb3JkLnVybCh0aGlzLnRpbGVzLG51bGwsdGhpcy5zY2hlbWUpLHRoaXMudXJsLHRoaXMudGlsZVNpemUpO2UucmVxdWVzdD1hamF4LmdldEltYWdlKHIsaS5iaW5kKHRoaXMpKX0sdC5wcm90b3R5cGUuYWJvcnRUaWxlPWZ1bmN0aW9uKGUpe2UucmVxdWVzdCYmKGUucmVxdWVzdC5hYm9ydCgpLGRlbGV0ZSBlLnJlcXVlc3QpfSx0LnByb3RvdHlwZS51bmxvYWRUaWxlPWZ1bmN0aW9uKGUpe2UudGV4dHVyZSYmdGhpcy5tYXAucGFpbnRlci5zYXZlVGlsZVRleHR1cmUoZS50ZXh0dXJlKX0sdH0oRXZlbnRlZCk7bW9kdWxlLmV4cG9ydHM9UmFzdGVyVGlsZVNvdXJjZTtcbn0se1wiLi4vdXRpbC9hamF4XCI6MTk0LFwiLi4vdXRpbC9ldmVudGVkXCI6MjAzLFwiLi4vdXRpbC9tYXBib3hcIjoyMTAsXCIuLi91dGlsL3V0aWxcIjoyMTUsXCIuL2xvYWRfdGlsZWpzb25cIjo4NyxcIi4vdGlsZV9ib3VuZHNcIjo5NX1dLDkxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBhamF4PV9kZXJlcV8oXCIuLi91dGlsL2FqYXhcIiksRXZlbnRlZD1fZGVyZXFfKFwiLi4vdXRpbC9ldmVudGVkXCIpLHdpbmRvdz1fZGVyZXFfKFwiLi4vdXRpbC93aW5kb3dcIikscGx1Z2luUmVxdWVzdGVkPSExLHBsdWdpbkJsb2JVUkw9bnVsbDttb2R1bGUuZXhwb3J0cy5ldmVudGVkPW5ldyBFdmVudGVkLG1vZHVsZS5leHBvcnRzLnJlZ2lzdGVyRm9yUGx1Z2luQXZhaWxhYmlsaXR5PWZ1bmN0aW9uKGUpe3JldHVybiBwbHVnaW5CbG9iVVJMP2UocGx1Z2luQmxvYlVSTCxtb2R1bGUuZXhwb3J0cy5lcnJvckNhbGxiYWNrKTptb2R1bGUuZXhwb3J0cy5ldmVudGVkLm9uY2UoXCJwbHVnaW5BdmFpbGFibGVcIixlKSxlfSxtb2R1bGUuZXhwb3J0cy5zZXRSVExUZXh0UGx1Z2luPWZ1bmN0aW9uKGUsbCl7aWYocGx1Z2luUmVxdWVzdGVkKXRocm93IG5ldyBFcnJvcihcInNldFJUTFRleHRQbHVnaW4gY2Fubm90IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy5cIik7cGx1Z2luUmVxdWVzdGVkPSEwLG1vZHVsZS5leHBvcnRzLmVycm9yQ2FsbGJhY2s9bCxhamF4LmdldEFycmF5QnVmZmVyKGUsZnVuY3Rpb24oZSx0KXtlP2woZSk6KHBsdWdpbkJsb2JVUkw9d2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwobmV3IHdpbmRvdy5CbG9iKFt0LmRhdGFdKSx7dHlwZTpcInRleHQvamF2YXNjcmlwdFwifSksbW9kdWxlLmV4cG9ydHMuZXZlbnRlZC5maXJlKFwicGx1Z2luQXZhaWxhYmxlXCIse3BsdWdpbkJsb2JVUkw6cGx1Z2luQmxvYlVSTCxlcnJvckNhbGxiYWNrOmx9KSl9KX07XG59LHtcIi4uL3V0aWwvYWpheFwiOjE5NCxcIi4uL3V0aWwvZXZlbnRlZFwiOjIwMyxcIi4uL3V0aWwvd2luZG93XCI6MTk3fV0sOTI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIHV0aWw9X2RlcmVxXyhcIi4uL3V0aWwvdXRpbFwiKSxzb3VyY2VUeXBlcz17dmVjdG9yOl9kZXJlcV8oXCIuLi9zb3VyY2UvdmVjdG9yX3RpbGVfc291cmNlXCIpLHJhc3RlcjpfZGVyZXFfKFwiLi4vc291cmNlL3Jhc3Rlcl90aWxlX3NvdXJjZVwiKSxnZW9qc29uOl9kZXJlcV8oXCIuLi9zb3VyY2UvZ2VvanNvbl9zb3VyY2VcIiksdmlkZW86X2RlcmVxXyhcIi4uL3NvdXJjZS92aWRlb19zb3VyY2VcIiksaW1hZ2U6X2RlcmVxXyhcIi4uL3NvdXJjZS9pbWFnZV9zb3VyY2VcIiksY2FudmFzOl9kZXJlcV8oXCIuLi9zb3VyY2UvY2FudmFzX3NvdXJjZVwiKX07ZXhwb3J0cy5jcmVhdGU9ZnVuY3Rpb24oZSxyLG8sdSl7aWYocj1uZXcgc291cmNlVHlwZXNbci50eXBlXShlLHIsbyx1KSxyLmlkIT09ZSl0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBTb3VyY2UgaWQgdG8gYmUgXCIrZStcIiBpbnN0ZWFkIG9mIFwiK3IuaWQpO3JldHVybiB1dGlsLmJpbmRBbGwoW1wibG9hZFwiLFwiYWJvcnRcIixcInVubG9hZFwiLFwic2VyaWFsaXplXCIsXCJwcmVwYXJlXCJdLHIpLHJ9LGV4cG9ydHMuZ2V0VHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gc291cmNlVHlwZXNbZV19LGV4cG9ydHMuc2V0VHlwZT1mdW5jdGlvbihlLHIpe3NvdXJjZVR5cGVzW2VdPXJ9O1xufSx7XCIuLi9zb3VyY2UvY2FudmFzX3NvdXJjZVwiOjgyLFwiLi4vc291cmNlL2dlb2pzb25fc291cmNlXCI6ODMsXCIuLi9zb3VyY2UvaW1hZ2Vfc291cmNlXCI6ODYsXCIuLi9zb3VyY2UvcmFzdGVyX3RpbGVfc291cmNlXCI6OTAsXCIuLi9zb3VyY2UvdmVjdG9yX3RpbGVfc291cmNlXCI6OTcsXCIuLi9zb3VyY2UvdmlkZW9fc291cmNlXCI6OTksXCIuLi91dGlsL3V0aWxcIjoyMTV9XSw5MzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBjb29yZGluYXRlVG9UaWxlUG9pbnQoZSx0LG8pe3ZhciBpPW8uem9vbVRvKE1hdGgubWluKGUueix0KSk7cmV0dXJue3g6KGkuY29sdW1uLShlLngrZS53Kk1hdGgucG93KDIsZS56KSkpKkVYVEVOVCx5OihpLnJvdy1lLnkpKkVYVEVOVH19ZnVuY3Rpb24gY29tcGFyZUtleVpvb20oZSx0KXtyZXR1cm4gZSUzMi10JTMyfWZ1bmN0aW9uIGlzUmFzdGVyVHlwZShlKXtyZXR1cm5cInJhc3RlclwiPT09ZXx8XCJpbWFnZVwiPT09ZXx8XCJ2aWRlb1wiPT09ZX12YXIgU291cmNlPV9kZXJlcV8oXCIuL3NvdXJjZVwiKSxUaWxlPV9kZXJlcV8oXCIuL3RpbGVcIiksRXZlbnRlZD1fZGVyZXFfKFwiLi4vdXRpbC9ldmVudGVkXCIpLFRpbGVDb29yZD1fZGVyZXFfKFwiLi90aWxlX2Nvb3JkXCIpLENhY2hlPV9kZXJlcV8oXCIuLi91dGlsL2xydV9jYWNoZVwiKSxDb29yZGluYXRlPV9kZXJlcV8oXCIuLi9nZW8vY29vcmRpbmF0ZVwiKSx1dGlsPV9kZXJlcV8oXCIuLi91dGlsL3V0aWxcIiksRVhURU5UPV9kZXJlcV8oXCIuLi9kYXRhL2V4dGVudFwiKSxTb3VyY2VDYWNoZT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQsbyxpKXtlLmNhbGwodGhpcyksdGhpcy5pZD10LHRoaXMuZGlzcGF0Y2hlcj1pLHRoaXMub24oXCJkYXRhXCIsZnVuY3Rpb24oZSl7XCJzb3VyY2VcIj09PWUuZGF0YVR5cGUmJlwibWV0YWRhdGFcIj09PWUuc291cmNlRGF0YVR5cGUmJih0aGlzLl9zb3VyY2VMb2FkZWQ9ITApLHRoaXMuX3NvdXJjZUxvYWRlZCYmXCJzb3VyY2VcIj09PWUuZGF0YVR5cGUmJlwiY29udGVudFwiPT09ZS5zb3VyY2VEYXRhVHlwZSYmKHRoaXMucmVsb2FkKCksdGhpcy50cmFuc2Zvcm0mJnRoaXMudXBkYXRlKHRoaXMudHJhbnNmb3JtKSl9KSx0aGlzLm9uKFwiZXJyb3JcIixmdW5jdGlvbigpe3RoaXMuX3NvdXJjZUVycm9yZWQ9ITB9KSx0aGlzLl9zb3VyY2U9U291cmNlLmNyZWF0ZSh0LG8saSx0aGlzKSx0aGlzLl90aWxlcz17fSx0aGlzLl9jYWNoZT1uZXcgQ2FjaGUoMCx0aGlzLnVubG9hZFRpbGUuYmluZCh0aGlzKSksdGhpcy5fdGltZXJzPXt9LHRoaXMuX2NhY2hlVGltZXJzPXt9LHRoaXMuX2lzSWRSZW5kZXJhYmxlPXRoaXMuX2lzSWRSZW5kZXJhYmxlLmJpbmQodGhpcyl9cmV0dXJuIGUmJih0Ll9fcHJvdG9fXz1lKSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlKSx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10LHQucHJvdG90eXBlLm9uQWRkPWZ1bmN0aW9uKGUpe3RoaXMubWFwPWUsdGhpcy5fc291cmNlJiZ0aGlzLl9zb3VyY2Uub25BZGQmJnRoaXMuX3NvdXJjZS5vbkFkZChlKX0sdC5wcm90b3R5cGUub25SZW1vdmU9ZnVuY3Rpb24oZSl7dGhpcy5fc291cmNlJiZ0aGlzLl9zb3VyY2Uub25SZW1vdmUmJnRoaXMuX3NvdXJjZS5vblJlbW92ZShlKX0sdC5wcm90b3R5cGUubG9hZGVkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZih0aGlzLl9zb3VyY2VFcnJvcmVkKXJldHVybiEwO2lmKCF0aGlzLl9zb3VyY2VMb2FkZWQpcmV0dXJuITE7Zm9yKHZhciB0IGluIGUuX3RpbGVzKXt2YXIgbz1lLl90aWxlc1t0XTtpZihcImxvYWRlZFwiIT09by5zdGF0ZSYmXCJlcnJvcmVkXCIhPT1vLnN0YXRlKXJldHVybiExfXJldHVybiEwfSx0LnByb3RvdHlwZS5nZXRTb3VyY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc291cmNlfSx0LnByb3RvdHlwZS5sb2FkVGlsZT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9zb3VyY2UubG9hZFRpbGUoZSx0KX0sdC5wcm90b3R5cGUudW5sb2FkVGlsZT1mdW5jdGlvbihlKXtpZih0aGlzLl9zb3VyY2UudW5sb2FkVGlsZSlyZXR1cm4gdGhpcy5fc291cmNlLnVubG9hZFRpbGUoZSl9LHQucHJvdG90eXBlLmFib3J0VGlsZT1mdW5jdGlvbihlKXtpZih0aGlzLl9zb3VyY2UuYWJvcnRUaWxlKXJldHVybiB0aGlzLl9zb3VyY2UuYWJvcnRUaWxlKGUpfSx0LnByb3RvdHlwZS5zZXJpYWxpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc291cmNlLnNlcmlhbGl6ZSgpfSx0LnByb3RvdHlwZS5wcmVwYXJlPWZ1bmN0aW9uKCl7aWYodGhpcy5fc291cmNlTG9hZGVkJiZ0aGlzLl9zb3VyY2UucHJlcGFyZSlyZXR1cm4gdGhpcy5fc291cmNlLnByZXBhcmUoKX0sdC5wcm90b3R5cGUuZ2V0SWRzPWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX3RpbGVzKS5tYXAoTnVtYmVyKS5zb3J0KGNvbXBhcmVLZXlab29tKX0sdC5wcm90b3R5cGUuZ2V0UmVuZGVyYWJsZUlkcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldElkcygpLmZpbHRlcih0aGlzLl9pc0lkUmVuZGVyYWJsZSl9LHQucHJvdG90eXBlLl9pc0lkUmVuZGVyYWJsZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fdGlsZXNbZV0uaGFzRGF0YSgpJiYhdGhpcy5fY292ZXJlZFRpbGVzW2VdfSx0LnByb3RvdHlwZS5yZWxvYWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuX2NhY2hlLnJlc2V0KCk7Zm9yKHZhciB0IGluIGUuX3RpbGVzKWUucmVsb2FkVGlsZSh0LFwicmVsb2FkaW5nXCIpfSx0LnByb3RvdHlwZS5yZWxvYWRUaWxlPWZ1bmN0aW9uKGUsdCl7dmFyIG89dGhpcy5fdGlsZXNbZV07byYmKFwibG9hZGluZ1wiIT09by5zdGF0ZSYmKG8uc3RhdGU9dCksdGhpcy5sb2FkVGlsZShvLHRoaXMuX3RpbGVMb2FkZWQuYmluZCh0aGlzLG8sZSx0KSkpfSx0LnByb3RvdHlwZS5fdGlsZUxvYWRlZD1mdW5jdGlvbihlLHQsbyxpKXtyZXR1cm4gaT8oZS5zdGF0ZT1cImVycm9yZWRcIix2b2lkKDQwNCE9PWkuc3RhdHVzJiZ0aGlzLl9zb3VyY2UuZmlyZShcImVycm9yXCIse3RpbGU6ZSxlcnJvcjppfSkpKTooZS5zb3VyY2VDYWNoZT10aGlzLGUudGltZUFkZGVkPShuZXcgRGF0ZSkuZ2V0VGltZSgpLFwiZXhwaXJlZFwiPT09byYmKGUucmVmcmVzaGVkVXBvbkV4cGlyYXRpb249ITApLHRoaXMuX3NldFRpbGVSZWxvYWRUaW1lcih0LGUpLHRoaXMuX3NvdXJjZS5maXJlKFwiZGF0YVwiLHtkYXRhVHlwZTpcInNvdXJjZVwiLHRpbGU6ZSxjb29yZDplLmNvb3JkfSksdm9pZCh0aGlzLm1hcCYmKHRoaXMubWFwLnBhaW50ZXIudGlsZUV4dGVudFZBTy52YW89bnVsbCkpKX0sdC5wcm90b3R5cGUuZ2V0VGlsZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5nZXRUaWxlQnlJRChlLmlkKX0sdC5wcm90b3R5cGUuZ2V0VGlsZUJ5SUQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3RpbGVzW2VdfSx0LnByb3RvdHlwZS5nZXRab29tPWZ1bmN0aW9uKGUpe3JldHVybiBlLnpvb20rZS5zY2FsZVpvb20oZS50aWxlU2l6ZS90aGlzLl9zb3VyY2UudGlsZVNpemUpfSx0LnByb3RvdHlwZS5maW5kTG9hZGVkQ2hpbGRyZW49ZnVuY3Rpb24oZSx0LG8pe3ZhciBpPXRoaXMscj0hMTtmb3IodmFyIHMgaW4gaS5fdGlsZXMpe3ZhciBhPWkuX3RpbGVzW3NdO2lmKCEob1tzXXx8IWEuaGFzRGF0YSgpfHxhLmNvb3JkLno8PWUuenx8YS5jb29yZC56PnQpKXt2YXIgbj1NYXRoLnBvdygyLE1hdGgubWluKGEuY29vcmQueixpLl9zb3VyY2UubWF4em9vbSktTWF0aC5taW4oZS56LGkuX3NvdXJjZS5tYXh6b29tKSk7aWYoTWF0aC5mbG9vcihhLmNvb3JkLngvbik9PT1lLngmJk1hdGguZmxvb3IoYS5jb29yZC55L24pPT09ZS55KWZvcihvW3NdPSEwLHI9ITA7YSYmYS5jb29yZC56LTE+ZS56Oyl7dmFyIGQ9YS5jb29yZC5wYXJlbnQoaS5fc291cmNlLm1heHpvb20pLmlkO2E9aS5fdGlsZXNbZF0sYSYmYS5oYXNEYXRhKCkmJihkZWxldGUgb1tzXSxvW2RdPSEwKX19fXJldHVybiByfSx0LnByb3RvdHlwZS5maW5kTG9hZGVkUGFyZW50PWZ1bmN0aW9uKGUsdCxvKXtmb3IodmFyIGk9dGhpcyxyPWUuei0xO3I+PXQ7ci0tKXtlPWUucGFyZW50KGkuX3NvdXJjZS5tYXh6b29tKTt2YXIgcz1pLl90aWxlc1tlLmlkXTtpZihzJiZzLmhhc0RhdGEoKSlyZXR1cm4gb1tlLmlkXT0hMCxzO2lmKGkuX2NhY2hlLmhhcyhlLmlkKSlyZXR1cm4gb1tlLmlkXT0hMCxpLl9jYWNoZS5nZXRXaXRob3V0UmVtb3ZpbmcoZS5pZCl9fSx0LnByb3RvdHlwZS51cGRhdGVDYWNoZVNpemU9ZnVuY3Rpb24oZSl7dmFyIHQ9TWF0aC5jZWlsKGUud2lkdGgvZS50aWxlU2l6ZSkrMSxvPU1hdGguY2VpbChlLmhlaWdodC9lLnRpbGVTaXplKSsxLGk9dCpvLHI9NTt0aGlzLl9jYWNoZS5zZXRNYXhTaXplKE1hdGguZmxvb3IoaSpyKSl9LHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlKXt2YXIgbz10aGlzO2lmKHRoaXMudHJhbnNmb3JtPWUsdGhpcy5fc291cmNlTG9hZGVkKXt2YXIgaSxyLHMsYTt0aGlzLnVwZGF0ZUNhY2hlU2l6ZShlKTt2YXIgbj0odGhpcy5fc291cmNlLnJvdW5kWm9vbT9NYXRoLnJvdW5kOk1hdGguZmxvb3IpKHRoaXMuZ2V0Wm9vbShlKSksZD1NYXRoLm1heChuLXQubWF4T3Zlcnpvb21pbmcsdGhpcy5fc291cmNlLm1pbnpvb20pLGM9TWF0aC5tYXgobit0Lm1heFVuZGVyem9vbWluZyx0aGlzLl9zb3VyY2UubWluem9vbSksaD17fTt0aGlzLl9jb3ZlcmVkVGlsZXM9e307dmFyIHU7Zm9yKHRoaXMudXNlZD90aGlzLl9zb3VyY2UuY29vcmQ/dT1lLmdldFZpc2libGVXcmFwcGVkQ29vcmRpbmF0ZXModGhpcy5fc291cmNlLmNvb3JkKToodT1lLmNvdmVyaW5nVGlsZXMoe3RpbGVTaXplOnRoaXMuX3NvdXJjZS50aWxlU2l6ZSxtaW56b29tOnRoaXMuX3NvdXJjZS5taW56b29tLG1heHpvb206dGhpcy5fc291cmNlLm1heHpvb20scm91bmRab29tOnRoaXMuX3NvdXJjZS5yb3VuZFpvb20scmVwYXJzZU92ZXJzY2FsZWQ6dGhpcy5fc291cmNlLnJlcGFyc2VPdmVyc2NhbGVkfSksdGhpcy5fc291cmNlLmhhc1RpbGUmJih1PXUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBvLl9zb3VyY2UuaGFzVGlsZShlKX0pKSk6dT1bXSxpPTA7aTx1Lmxlbmd0aDtpKyspcj11W2ldLHM9by5hZGRUaWxlKHIpLGhbci5pZF09ITAscy5oYXNEYXRhKCl8fG8uZmluZExvYWRlZENoaWxkcmVuKHIsYyxoKXx8KGE9by5maW5kTG9hZGVkUGFyZW50KHIsZCxoKSxhJiZvLmFkZFRpbGUoYS5jb29yZCkpO3ZhciBsPXt9O2lmKGlzUmFzdGVyVHlwZSh0aGlzLl9zb3VyY2UudHlwZSkpZm9yKHZhciBtPU9iamVjdC5rZXlzKGgpLHA9MDtwPG0ubGVuZ3RoO3ArKyl7dmFyIF89bVtwXTtyPVRpbGVDb29yZC5mcm9tSUQoXykscz1vLl90aWxlc1tfXSxzJiYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIHMuZmFkZUVuZFRpbWV8fHMuZmFkZUVuZFRpbWU+PURhdGUubm93KCkpJiYoby5maW5kTG9hZGVkQ2hpbGRyZW4ocixjLGgpJiYoaFtfXT0hMCksYT1vLmZpbmRMb2FkZWRQYXJlbnQocixkLGwpLGEmJm8uYWRkVGlsZShhLmNvb3JkKSl9dmFyIGY7Zm9yKGYgaW4gbCloW2ZdfHwoby5fY292ZXJlZFRpbGVzW2ZdPSEwKTtmb3IoZiBpbiBsKWhbZl09ITA7dmFyIFQ9dXRpbC5rZXlzRGlmZmVyZW5jZSh0aGlzLl90aWxlcyxoKTtmb3IoaT0wO2k8VC5sZW5ndGg7aSsrKW8ucmVtb3ZlVGlsZSgrVFtpXSl9fSx0LnByb3RvdHlwZS5hZGRUaWxlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX3RpbGVzW2UuaWRdO2lmKHQpcmV0dXJuIHQ7dmFyIG89ZS53cmFwcGVkKCk7dD10aGlzLl90aWxlc1tvLmlkXSx0fHwodD10aGlzLl9jYWNoZS5nZXQoby5pZCksdCYmKHQucmVkb1BsYWNlbWVudCh0aGlzLl9zb3VyY2UpLHRoaXMuX2NhY2hlVGltZXJzW28uaWRdJiYoY2xlYXJUaW1lb3V0KHRoaXMuX2NhY2hlVGltZXJzW28uaWRdKSx0aGlzLl9jYWNoZVRpbWVyc1tvLmlkXT12b2lkIDAsdGhpcy5fc2V0VGlsZVJlbG9hZFRpbWVyKG8uaWQsdCkpKSk7dmFyIGk9Qm9vbGVhbih0KTtpZighaSl7dmFyIHI9ZS56LHM9cj50aGlzLl9zb3VyY2UubWF4em9vbT9NYXRoLnBvdygyLHItdGhpcy5fc291cmNlLm1heHpvb20pOjE7dD1uZXcgVGlsZShvLHRoaXMuX3NvdXJjZS50aWxlU2l6ZSpzLHRoaXMuX3NvdXJjZS5tYXh6b29tKSx0aGlzLmxvYWRUaWxlKHQsdGhpcy5fdGlsZUxvYWRlZC5iaW5kKHRoaXMsdCxlLmlkLHQuc3RhdGUpKX1yZXR1cm4gdC51c2VzKyssdGhpcy5fdGlsZXNbZS5pZF09dCxpfHx0aGlzLl9zb3VyY2UuZmlyZShcImRhdGFsb2FkaW5nXCIse3RpbGU6dCxjb29yZDp0LmNvb3JkLGRhdGFUeXBlOlwic291cmNlXCJ9KSx0fSx0LnByb3RvdHlwZS5fc2V0VGlsZVJlbG9hZFRpbWVyPWZ1bmN0aW9uKGUsdCl7dmFyIG89dGhpcyxpPXQuZ2V0RXhwaXJ5VGltZW91dCgpO2kmJih0aGlzLl90aW1lcnNbZV09c2V0VGltZW91dChmdW5jdGlvbigpe28ucmVsb2FkVGlsZShlLFwiZXhwaXJlZFwiKSxvLl90aW1lcnNbZV09dm9pZCAwfSxpKSl9LHQucHJvdG90eXBlLl9zZXRDYWNoZUludmFsaWRhdGlvblRpbWVyPWZ1bmN0aW9uKGUsdCl7dmFyIG89dGhpcyxpPXQuZ2V0RXhwaXJ5VGltZW91dCgpO2kmJih0aGlzLl9jYWNoZVRpbWVyc1tlXT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7by5fY2FjaGUucmVtb3ZlKGUpLG8uX2NhY2hlVGltZXJzW2VdPXZvaWQgMH0saSkpfSx0LnByb3RvdHlwZS5yZW1vdmVUaWxlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX3RpbGVzW2VdO2lmKHQmJih0LnVzZXMtLSxkZWxldGUgdGhpcy5fdGlsZXNbZV0sdGhpcy5fdGltZXJzW2VdJiYoY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyc1tlXSksdGhpcy5fdGltZXJzW2VdPXZvaWQgMCksISh0LnVzZXM+MCkpKWlmKHQuaGFzRGF0YSgpKXt2YXIgbz10LmNvb3JkLndyYXBwZWQoKS5pZDt0aGlzLl9jYWNoZS5hZGQobyx0KSx0aGlzLl9zZXRDYWNoZUludmFsaWRhdGlvblRpbWVyKG8sdCl9ZWxzZSB0LmFib3J0ZWQ9ITAsdGhpcy5hYm9ydFRpbGUodCksdGhpcy51bmxvYWRUaWxlKHQpfSx0LnByb3RvdHlwZS5jbGVhclRpbGVzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztmb3IodmFyIHQgaW4gZS5fdGlsZXMpZS5yZW1vdmVUaWxlKHQpO3RoaXMuX2NhY2hlLnJlc2V0KCl9LHQucHJvdG90eXBlLnRpbGVzSW49ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMsbz17fSxpPXRoaXMuZ2V0SWRzKCkscj0xLzAscz0xLzAsYT0tKDEvMCksbj0tKDEvMCksZD1lWzBdLnpvb20sYz0wO2M8ZS5sZW5ndGg7YysrKXt2YXIgaD1lW2NdO3I9TWF0aC5taW4ocixoLmNvbHVtbikscz1NYXRoLm1pbihzLGgucm93KSxhPU1hdGgubWF4KGEsaC5jb2x1bW4pLG49TWF0aC5tYXgobixoLnJvdyl9Zm9yKHZhciB1PTA7dTxpLmxlbmd0aDt1Kyspe3ZhciBsPXQuX3RpbGVzW2lbdV1dLG09VGlsZUNvb3JkLmZyb21JRChpW3VdKSxwPVtjb29yZGluYXRlVG9UaWxlUG9pbnQobSxsLnNvdXJjZU1heFpvb20sbmV3IENvb3JkaW5hdGUocixzLGQpKSxjb29yZGluYXRlVG9UaWxlUG9pbnQobSxsLnNvdXJjZU1heFpvb20sbmV3IENvb3JkaW5hdGUoYSxuLGQpKV07aWYocFswXS54PEVYVEVOVCYmcFswXS55PEVYVEVOVCYmcFsxXS54Pj0wJiZwWzFdLnk+PTApe2Zvcih2YXIgXz1bXSxmPTA7ZjxlLmxlbmd0aDtmKyspXy5wdXNoKGNvb3JkaW5hdGVUb1RpbGVQb2ludChtLGwuc291cmNlTWF4Wm9vbSxlW2ZdKSk7dmFyIFQ9b1tsLmNvb3JkLmlkXTt2b2lkIDA9PT1UJiYoVD1vW2wuY29vcmQuaWRdPXt0aWxlOmwsY29vcmQ6bSxxdWVyeUdlb21ldHJ5OltdLHNjYWxlOk1hdGgucG93KDIsdC50cmFuc2Zvcm0uem9vbS1sLmNvb3JkLnopfSksVC5xdWVyeUdlb21ldHJ5LnB1c2goXyl9fXZhciB2PVtdO2Zvcih2YXIgeSBpbiBvKXYucHVzaChvW3ldKTtyZXR1cm4gdn0sdC5wcm90b3R5cGUucmVkb1BsYWNlbWVudD1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLHQ9dGhpcy5nZXRJZHMoKSxvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciBpPWUuZ2V0VGlsZUJ5SUQodFtvXSk7aS5yZWRvUGxhY2VtZW50KGUuX3NvdXJjZSl9fSx0LnByb3RvdHlwZS5nZXRWaXNpYmxlQ29vcmRpbmF0ZXM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcyx0PXRoaXMuZ2V0UmVuZGVyYWJsZUlkcygpLm1hcChUaWxlQ29vcmQuZnJvbUlEKSxvPTAsaT10O288aS5sZW5ndGg7bys9MSl7dmFyIHI9aVtvXTtyLnBvc01hdHJpeD1lLnRyYW5zZm9ybS5jYWxjdWxhdGVQb3NNYXRyaXgocixlLl9zb3VyY2UubWF4em9vbSl9cmV0dXJuIHR9LHR9KEV2ZW50ZWQpO1NvdXJjZUNhY2hlLm1heE92ZXJ6b29taW5nPTEwLFNvdXJjZUNhY2hlLm1heFVuZGVyem9vbWluZz0zLG1vZHVsZS5leHBvcnRzPVNvdXJjZUNhY2hlO1xufSx7XCIuLi9kYXRhL2V4dGVudFwiOjU0LFwiLi4vZ2VvL2Nvb3JkaW5hdGVcIjo2MSxcIi4uL3V0aWwvZXZlbnRlZFwiOjIwMyxcIi4uL3V0aWwvbHJ1X2NhY2hlXCI6MjA5LFwiLi4vdXRpbC91dGlsXCI6MjE1LFwiLi9zb3VyY2VcIjo5MixcIi4vdGlsZVwiOjk0LFwiLi90aWxlX2Nvb3JkXCI6OTZ9XSw5NDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgdXRpbD1fZGVyZXFfKFwiLi4vdXRpbC91dGlsXCIpLEJ1Y2tldD1fZGVyZXFfKFwiLi4vZGF0YS9idWNrZXRcIiksRmVhdHVyZUluZGV4PV9kZXJlcV8oXCIuLi9kYXRhL2ZlYXR1cmVfaW5kZXhcIiksdnQ9X2RlcmVxXyhcInZlY3Rvci10aWxlXCIpLFByb3RvYnVmPV9kZXJlcV8oXCJwYmZcIiksR2VvSlNPTkZlYXR1cmU9X2RlcmVxXyhcIi4uL3V0aWwvdmVjdG9ydGlsZV90b19nZW9qc29uXCIpLGZlYXR1cmVGaWx0ZXI9X2RlcmVxXyhcIi4uL3N0eWxlLXNwZWMvZmVhdHVyZV9maWx0ZXJcIiksQ29sbGlzaW9uVGlsZT1fZGVyZXFfKFwiLi4vc3ltYm9sL2NvbGxpc2lvbl90aWxlXCIpLENvbGxpc2lvbkJveEFycmF5PV9kZXJlcV8oXCIuLi9zeW1ib2wvY29sbGlzaW9uX2JveFwiKSxDTE9DS19TS0VXX1JFVFJZX1RJTUVPVVQ9M2U0LFRpbGU9ZnVuY3Rpb24oZSx0LGkpe3RoaXMuY29vcmQ9ZSx0aGlzLnVpZD11dGlsLnVuaXF1ZUlkKCksdGhpcy51c2VzPTAsdGhpcy50aWxlU2l6ZT10LHRoaXMuc291cmNlTWF4Wm9vbT1pLHRoaXMuYnVja2V0cz17fSx0aGlzLmV4cGlyYXRpb25UaW1lPW51bGwsdGhpcy5leHBpcmVkUmVxdWVzdENvdW50PTAsdGhpcy5zdGF0ZT1cImxvYWRpbmdcIn07VGlsZS5wcm90b3R5cGUucmVnaXN0ZXJGYWRlRHVyYXRpb249ZnVuY3Rpb24oZSx0KXt2YXIgaT10K3RoaXMudGltZUFkZGVkO2k8RGF0ZS5ub3coKXx8dGhpcy5mYWRlRW5kVGltZSYmaTx0aGlzLmZhZGVFbmRUaW1lfHwodGhpcy5mYWRlRW5kVGltZT1pLGUuc2V0KHRoaXMuZmFkZUVuZFRpbWUtRGF0ZS5ub3coKSkpfSxUaWxlLnByb3RvdHlwZS5sb2FkVmVjdG9yRGF0YT1mdW5jdGlvbihlLHQpe3RoaXMuaGFzRGF0YSgpJiZ0aGlzLnVubG9hZFZlY3RvckRhdGEoKSx0aGlzLnN0YXRlPVwibG9hZGVkXCIsZSYmKGUucmF3VGlsZURhdGEmJih0aGlzLnJhd1RpbGVEYXRhPWUucmF3VGlsZURhdGEpLHRoaXMuY29sbGlzaW9uQm94QXJyYXk9bmV3IENvbGxpc2lvbkJveEFycmF5KGUuY29sbGlzaW9uQm94QXJyYXkpLHRoaXMuY29sbGlzaW9uVGlsZT1uZXcgQ29sbGlzaW9uVGlsZShlLmNvbGxpc2lvblRpbGUsdGhpcy5jb2xsaXNpb25Cb3hBcnJheSksdGhpcy5mZWF0dXJlSW5kZXg9bmV3IEZlYXR1cmVJbmRleChlLmZlYXR1cmVJbmRleCx0aGlzLnJhd1RpbGVEYXRhLHRoaXMuY29sbGlzaW9uVGlsZSksdGhpcy5idWNrZXRzPUJ1Y2tldC5kZXNlcmlhbGl6ZShlLmJ1Y2tldHMsdC5zdHlsZSkpfSxUaWxlLnByb3RvdHlwZS5yZWxvYWRTeW1ib2xEYXRhPWZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcztpZihcInVubG9hZGVkXCIhPT10aGlzLnN0YXRlKXt0aGlzLmNvbGxpc2lvblRpbGU9bmV3IENvbGxpc2lvblRpbGUoZS5jb2xsaXNpb25UaWxlLHRoaXMuY29sbGlzaW9uQm94QXJyYXkpLHRoaXMuZmVhdHVyZUluZGV4LnNldENvbGxpc2lvblRpbGUodGhpcy5jb2xsaXNpb25UaWxlKTtmb3IodmFyIG8gaW4gaS5idWNrZXRzKXt2YXIgcj1pLmJ1Y2tldHNbb107XCJzeW1ib2xcIj09PXIubGF5ZXJzWzBdLnR5cGUmJihyLmRlc3Ryb3koKSxkZWxldGUgaS5idWNrZXRzW29dKX11dGlsLmV4dGVuZCh0aGlzLmJ1Y2tldHMsQnVja2V0LmRlc2VyaWFsaXplKGUuYnVja2V0cyx0KSl9fSxUaWxlLnByb3RvdHlwZS51bmxvYWRWZWN0b3JEYXRhPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztmb3IodmFyIHQgaW4gZS5idWNrZXRzKWUuYnVja2V0c1t0XS5kZXN0cm95KCk7dGhpcy5idWNrZXRzPXt9LHRoaXMuY29sbGlzaW9uQm94QXJyYXk9bnVsbCx0aGlzLmNvbGxpc2lvblRpbGU9bnVsbCx0aGlzLmZlYXR1cmVJbmRleD1udWxsLHRoaXMuc3RhdGU9XCJ1bmxvYWRlZFwifSxUaWxlLnByb3RvdHlwZS5yZWRvUGxhY2VtZW50PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYoXCJ2ZWN0b3JcIj09PWUudHlwZXx8XCJnZW9qc29uXCI9PT1lLnR5cGUpcmV0dXJuXCJsb2FkZWRcIiE9PXRoaXMuc3RhdGU/dm9pZCh0aGlzLnJlZG9XaGVuRG9uZT0hMCk6dm9pZCh0aGlzLmNvbGxpc2lvblRpbGUmJih0aGlzLnN0YXRlPVwicmVsb2FkaW5nXCIsZS5kaXNwYXRjaGVyLnNlbmQoXCJyZWRvUGxhY2VtZW50XCIse3R5cGU6ZS50eXBlLHVpZDp0aGlzLnVpZCxzb3VyY2U6ZS5pZCxhbmdsZTplLm1hcC50cmFuc2Zvcm0uYW5nbGUscGl0Y2g6ZS5tYXAudHJhbnNmb3JtLnBpdGNoLHNob3dDb2xsaXNpb25Cb3hlczplLm1hcC5zaG93Q29sbGlzaW9uQm94ZXN9LGZ1bmN0aW9uKGksbyl7dC5yZWxvYWRTeW1ib2xEYXRhKG8sZS5tYXAuc3R5bGUpLGUubWFwJiYoZS5tYXAucGFpbnRlci50aWxlRXh0ZW50VkFPLnZhbz1udWxsKSx0LnN0YXRlPVwibG9hZGVkXCIsdC5yZWRvV2hlbkRvbmUmJih0LnJlZG9XaGVuRG9uZT0hMSx0LnJlZG9QbGFjZW1lbnQoZSkpfSx0aGlzLndvcmtlcklEKSkpfSxUaWxlLnByb3RvdHlwZS5nZXRCdWNrZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYnVja2V0c1tlLmlkXX0sVGlsZS5wcm90b3R5cGUucXVlcnlTb3VyY2VGZWF0dXJlcz1mdW5jdGlvbihlLHQpe3ZhciBpPXRoaXM7aWYodGhpcy5yYXdUaWxlRGF0YSl7dGhpcy52dExheWVyc3x8KHRoaXMudnRMYXllcnM9bmV3IHZ0LlZlY3RvclRpbGUobmV3IFByb3RvYnVmKHRoaXMucmF3VGlsZURhdGEpKS5sYXllcnMpO3ZhciBvPXRoaXMudnRMYXllcnMuX2dlb2pzb25UaWxlTGF5ZXJ8fHRoaXMudnRMYXllcnNbdC5zb3VyY2VMYXllcl07aWYobylmb3IodmFyIHI9ZmVhdHVyZUZpbHRlcih0JiZ0LmZpbHRlcikscz17ejp0aGlzLmNvb3JkLnoseDp0aGlzLmNvb3JkLngseTp0aGlzLmNvb3JkLnl9LGE9MDthPG8ubGVuZ3RoO2ErKyl7dmFyIGw9by5mZWF0dXJlKGEpO2lmKHIobCkpe3ZhciBuPW5ldyBHZW9KU09ORmVhdHVyZShsLGkuY29vcmQueixpLmNvb3JkLngsaS5jb29yZC55KTtuLnRpbGU9cyxlLnB1c2gobil9fX19LFRpbGUucHJvdG90eXBlLmhhc0RhdGE9ZnVuY3Rpb24oKXtyZXR1cm5cImxvYWRlZFwiPT09dGhpcy5zdGF0ZXx8XCJyZWxvYWRpbmdcIj09PXRoaXMuc3RhdGV8fFwiZXhwaXJlZFwiPT09dGhpcy5zdGF0ZX0sVGlsZS5wcm90b3R5cGUuc2V0RXhwaXJ5RGF0YT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmV4cGlyYXRpb25UaW1lO2lmKGUuY2FjaGVDb250cm9sKXt2YXIgaT11dGlsLnBhcnNlQ2FjaGVDb250cm9sKGUuY2FjaGVDb250cm9sKTtpW1wibWF4LWFnZVwiXSYmKHRoaXMuZXhwaXJhdGlvblRpbWU9RGF0ZS5ub3coKSsxZTMqaVtcIm1heC1hZ2VcIl0pfWVsc2UgZS5leHBpcmVzJiYodGhpcy5leHBpcmF0aW9uVGltZT1uZXcgRGF0ZShlLmV4cGlyZXMpLmdldFRpbWUoKSk7aWYodGhpcy5leHBpcmF0aW9uVGltZSl7dmFyIG89RGF0ZS5ub3coKSxyPSExO2lmKHRoaXMuZXhwaXJhdGlvblRpbWU+bylyPSExO2Vsc2UgaWYodClpZih0aGlzLmV4cGlyYXRpb25UaW1lPHQpcj0hMDtlbHNle3ZhciBzPXRoaXMuZXhwaXJhdGlvblRpbWUtdDtzP3RoaXMuZXhwaXJhdGlvblRpbWU9bytNYXRoLm1heChzLENMT0NLX1NLRVdfUkVUUllfVElNRU9VVCk6cj0hMH1lbHNlIHI9ITA7cj8odGhpcy5leHBpcmVkUmVxdWVzdENvdW50KyssdGhpcy5zdGF0ZT1cImV4cGlyZWRcIik6dGhpcy5leHBpcmVkUmVxdWVzdENvdW50PTB9fSxUaWxlLnByb3RvdHlwZS5nZXRFeHBpcnlUaW1lb3V0PWZ1bmN0aW9uKCl7aWYodGhpcy5leHBpcmF0aW9uVGltZSlyZXR1cm4gdGhpcy5leHBpcmVkUmVxdWVzdENvdW50PzFlMyooMTw8TWF0aC5taW4odGhpcy5leHBpcmVkUmVxdWVzdENvdW50LTEsMzEpKTpNYXRoLm1pbih0aGlzLmV4cGlyYXRpb25UaW1lLShuZXcgRGF0ZSkuZ2V0VGltZSgpLE1hdGgucG93KDIsMzEpLTEpfSxtb2R1bGUuZXhwb3J0cz1UaWxlO1xufSx7XCIuLi9kYXRhL2J1Y2tldFwiOjQ1LFwiLi4vZGF0YS9mZWF0dXJlX2luZGV4XCI6NTUsXCIuLi9zdHlsZS1zcGVjL2ZlYXR1cmVfZmlsdGVyXCI6MTA1LFwiLi4vc3ltYm9sL2NvbGxpc2lvbl9ib3hcIjoxNjMsXCIuLi9zeW1ib2wvY29sbGlzaW9uX3RpbGVcIjoxNjUsXCIuLi91dGlsL3V0aWxcIjoyMTUsXCIuLi91dGlsL3ZlY3RvcnRpbGVfdG9fZ2VvanNvblwiOjIxNixcInBiZlwiOjI1LFwidmVjdG9yLXRpbGVcIjozNH1dLDk1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBMbmdMYXRCb3VuZHM9X2RlcmVxXyhcIi4uL2dlby9sbmdfbGF0X2JvdW5kc1wiKSxjbGFtcD1fZGVyZXFfKFwiLi4vdXRpbC91dGlsXCIpLmNsYW1wLFRpbGVCb3VuZHM9ZnVuY3Rpb24odCxuLG8pe3RoaXMuYm91bmRzPUxuZ0xhdEJvdW5kcy5jb252ZXJ0KHRoaXMudmFsaWRhdGVCb3VuZHModCkpLHRoaXMubWluem9vbT1ufHwwLHRoaXMubWF4em9vbT1vfHwyNH07VGlsZUJvdW5kcy5wcm90b3R5cGUudmFsaWRhdGVCb3VuZHM9ZnVuY3Rpb24odCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJjQ9PT10Lmxlbmd0aD9bTWF0aC5tYXgoLTE4MCx0WzBdKSxNYXRoLm1heCgtOTAsdFsxXSksTWF0aC5taW4oMTgwLHRbMl0pLE1hdGgubWluKDkwLHRbM10pXTpbLTE4MCwtOTAsMTgwLDkwXX0sVGlsZUJvdW5kcy5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24odCxuKXt2YXIgbz1uP01hdGgubWluKHQueixuKTp0LnosYT17bWluWDpNYXRoLmZsb29yKHRoaXMubG5nWCh0aGlzLmJvdW5kcy5nZXRXZXN0KCksbykpLG1pblk6TWF0aC5mbG9vcih0aGlzLmxhdFkodGhpcy5ib3VuZHMuZ2V0Tm9ydGgoKSxvKSksbWF4WDpNYXRoLmNlaWwodGhpcy5sbmdYKHRoaXMuYm91bmRzLmdldEVhc3QoKSxvKSksbWF4WTpNYXRoLmNlaWwodGhpcy5sYXRZKHRoaXMuYm91bmRzLmdldFNvdXRoKCksbykpfSxpPXQueD49YS5taW5YJiZ0Lng8YS5tYXhYJiZ0Lnk+PWEubWluWSYmdC55PGEubWF4WTtyZXR1cm4gaX0sVGlsZUJvdW5kcy5wcm90b3R5cGUubG5nWD1mdW5jdGlvbih0LG4pe3JldHVybih0KzE4MCkqKE1hdGgucG93KDIsbikvMzYwKX0sVGlsZUJvdW5kcy5wcm90b3R5cGUubGF0WT1mdW5jdGlvbih0LG4pe3ZhciBvPWNsYW1wKE1hdGguc2luKE1hdGguUEkvMTgwKnQpLC0uOTk5OSwuOTk5OSksYT1NYXRoLnBvdygyLG4pLygyKk1hdGguUEkpO3JldHVybiBNYXRoLnBvdygyLG4tMSkrLjUqTWF0aC5sb2coKDErbykvKDEtbykpKi1hfSxtb2R1bGUuZXhwb3J0cz1UaWxlQm91bmRzO1xufSx7XCIuLi9nZW8vbG5nX2xhdF9ib3VuZHNcIjo2MyxcIi4uL3V0aWwvdXRpbFwiOjIxNX1dLDk2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGVkZ2UodCxpKXtpZih0LnJvdz5pLnJvdyl7dmFyIG89dDt0PWksaT1vfXJldHVybnt4MDp0LmNvbHVtbix5MDp0LnJvdyx4MTppLmNvbHVtbix5MTppLnJvdyxkeDppLmNvbHVtbi10LmNvbHVtbixkeTppLnJvdy10LnJvd319ZnVuY3Rpb24gc2NhblNwYW5zKHQsaSxvLHIsZSl7dmFyIG49TWF0aC5tYXgobyxNYXRoLmZsb29yKGkueTApKSxoPU1hdGgubWluKHIsTWF0aC5jZWlsKGkueTEpKTtpZih0LngwPT09aS54MCYmdC55MD09PWkueTA/dC54MCtpLmR5L3QuZHkqdC5keDxpLngxOnQueDEtaS5keS90LmR5KnQuZHg8aS54MCl7dmFyIHM9dDt0PWksaT1zfWZvcih2YXIgYT10LmR4L3QuZHksZD1pLmR4L2kuZHkseT10LmR4PjAsbD1pLmR4PDAsdT1uO3U8aDt1Kyspe3ZhciB4PWEqTWF0aC5tYXgoMCxNYXRoLm1pbih0LmR5LHUreS10LnkwKSkrdC54MCxjPWQqTWF0aC5tYXgoMCxNYXRoLm1pbihpLmR5LHUrbC1pLnkwKSkraS54MDtlKE1hdGguZmxvb3IoYyksTWF0aC5jZWlsKHgpLHUpfX1mdW5jdGlvbiBzY2FuVHJpYW5nbGUodCxpLG8scixlLG4pe3ZhciBoLHM9ZWRnZSh0LGkpLGE9ZWRnZShpLG8pLGQ9ZWRnZShvLHQpO3MuZHk+YS5keSYmKGg9cyxzPWEsYT1oKSxzLmR5PmQuZHkmJihoPXMscz1kLGQ9aCksYS5keT5kLmR5JiYoaD1hLGE9ZCxkPWgpLHMuZHkmJnNjYW5TcGFucyhkLHMscixlLG4pLGEuZHkmJnNjYW5TcGFucyhkLGEscixlLG4pfWZ1bmN0aW9uIGdldFF1YWRrZXkodCxpLG8pe2Zvcih2YXIgcixlPVwiXCIsbj10O24+MDtuLS0pcj0xPDxuLTEsZSs9KGkmcj8xOjApKyhvJnI/MjowKTtyZXR1cm4gZX12YXIgV2hvb1RTPV9kZXJlcV8oXCJAbWFwYm94L3dob290cy1qc1wiKSxDb29yZGluYXRlPV9kZXJlcV8oXCIuLi9nZW8vY29vcmRpbmF0ZVwiKSxUaWxlQ29vcmQ9ZnVuY3Rpb24odCxpLG8scil7aXNOYU4ocikmJihyPTApLHRoaXMuej0rdCx0aGlzLng9K2ksdGhpcy55PStvLHRoaXMudz0rcixyKj0yLHI8MCYmKHI9ciotMS0xKTt2YXIgZT0xPDx0aGlzLno7dGhpcy5pZD0zMiooZSplKnIrZSp0aGlzLnkrdGhpcy54KSt0aGlzLnosdGhpcy5wb3NNYXRyaXg9bnVsbH07VGlsZUNvb3JkLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnorXCIvXCIrdGhpcy54K1wiL1wiK3RoaXMueX0sVGlsZUNvb3JkLnByb3RvdHlwZS50b0Nvb3JkaW5hdGU9ZnVuY3Rpb24odCl7dmFyIGk9TWF0aC5taW4odGhpcy56LHZvaWQgMD09PXQ/dGhpcy56OnQpLG89TWF0aC5wb3coMixpKSxyPXRoaXMueSxlPXRoaXMueCtvKnRoaXMudztyZXR1cm4gbmV3IENvb3JkaW5hdGUoZSxyLGkpfSxUaWxlQ29vcmQucHJvdG90eXBlLnVybD1mdW5jdGlvbih0LGksbyl7dmFyIHI9V2hvb1RTLmdldFRpbGVCQm94KHRoaXMueCx0aGlzLnksdGhpcy56KSxlPWdldFF1YWRrZXkodGhpcy56LHRoaXMueCx0aGlzLnkpO3JldHVybiB0Wyh0aGlzLngrdGhpcy55KSV0Lmxlbmd0aF0ucmVwbGFjZShcIntwcmVmaXh9XCIsKHRoaXMueCUxNikudG9TdHJpbmcoMTYpKyh0aGlzLnklMTYpLnRvU3RyaW5nKDE2KSkucmVwbGFjZShcInt6fVwiLE1hdGgubWluKHRoaXMueixpfHx0aGlzLnopKS5yZXBsYWNlKFwie3h9XCIsdGhpcy54KS5yZXBsYWNlKFwie3l9XCIsXCJ0bXNcIj09PW8/TWF0aC5wb3coMix0aGlzLnopLXRoaXMueS0xOnRoaXMueSkucmVwbGFjZShcIntxdWFka2V5fVwiLGUpLnJlcGxhY2UoXCJ7YmJveC1lcHNnLTM4NTd9XCIscil9LFRpbGVDb29yZC5wcm90b3R5cGUucGFyZW50PWZ1bmN0aW9uKHQpe3JldHVybiAwPT09dGhpcy56P251bGw6dGhpcy56PnQ/bmV3IFRpbGVDb29yZCh0aGlzLnotMSx0aGlzLngsdGhpcy55LHRoaXMudyk6bmV3IFRpbGVDb29yZCh0aGlzLnotMSxNYXRoLmZsb29yKHRoaXMueC8yKSxNYXRoLmZsb29yKHRoaXMueS8yKSx0aGlzLncpfSxUaWxlQ29vcmQucHJvdG90eXBlLndyYXBwZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFRpbGVDb29yZCh0aGlzLnosdGhpcy54LHRoaXMueSwwKX0sVGlsZUNvb3JkLnByb3RvdHlwZS5jaGlsZHJlbj1mdW5jdGlvbih0KXtpZih0aGlzLno+PXQpcmV0dXJuW25ldyBUaWxlQ29vcmQodGhpcy56KzEsdGhpcy54LHRoaXMueSx0aGlzLncpXTt2YXIgaT10aGlzLnorMSxvPTIqdGhpcy54LHI9Mip0aGlzLnk7cmV0dXJuW25ldyBUaWxlQ29vcmQoaSxvLHIsdGhpcy53KSxuZXcgVGlsZUNvb3JkKGksbysxLHIsdGhpcy53KSxuZXcgVGlsZUNvb3JkKGksbyxyKzEsdGhpcy53KSxuZXcgVGlsZUNvb3JkKGksbysxLHIrMSx0aGlzLncpXX0sVGlsZUNvb3JkLmNvdmVyPWZ1bmN0aW9uKHQsaSxvLHIpe2Z1bmN0aW9uIGUodCxpLGUpe3ZhciBzLGEsZCx5O2lmKGU+PTAmJmU8PW4pZm9yKHM9dDtzPGk7cysrKWE9TWF0aC5mbG9vcihzL24pLGQ9KHMlbituKSVuLDAhPT1hJiZyIT09ITB8fCh5PW5ldyBUaWxlQ29vcmQobyxkLGUsYSksaFt5LmlkXT15KX12b2lkIDA9PT1yJiYocj0hMCk7dmFyIG49MTw8dCxoPXt9O3JldHVybiBzY2FuVHJpYW5nbGUoaVswXSxpWzFdLGlbMl0sMCxuLGUpLHNjYW5UcmlhbmdsZShpWzJdLGlbM10saVswXSwwLG4sZSksT2JqZWN0LmtleXMoaCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBoW3RdfSl9LFRpbGVDb29yZC5mcm9tSUQ9ZnVuY3Rpb24odCl7dmFyIGk9dCUzMixvPTE8PGkscj0odC1pKS8zMixlPXIlbyxuPShyLWUpL28lbyxoPU1hdGguZmxvb3Ioci8obypvKSk7cmV0dXJuIGglMiE9PTAmJihoPWgqLTEtMSksaC89MixuZXcgVGlsZUNvb3JkKGksZSxuLGgpfSxtb2R1bGUuZXhwb3J0cz1UaWxlQ29vcmQ7XG59LHtcIi4uL2dlby9jb29yZGluYXRlXCI6NjEsXCJAbWFwYm94L3dob290cy1qc1wiOjR9XSw5NzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgRXZlbnRlZD1fZGVyZXFfKFwiLi4vdXRpbC9ldmVudGVkXCIpLHV0aWw9X2RlcmVxXyhcIi4uL3V0aWwvdXRpbFwiKSxsb2FkVGlsZUpTT049X2RlcmVxXyhcIi4vbG9hZF90aWxlanNvblwiKSxub3JtYWxpemVVUkw9X2RlcmVxXyhcIi4uL3V0aWwvbWFwYm94XCIpLm5vcm1hbGl6ZVRpbGVVUkwsVGlsZUJvdW5kcz1fZGVyZXFfKFwiLi90aWxlX2JvdW5kc1wiKSxWZWN0b3JUaWxlU291cmNlPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCxpLG8scil7aWYoZS5jYWxsKHRoaXMpLHRoaXMuaWQ9dCx0aGlzLmRpc3BhdGNoZXI9byx0aGlzLnR5cGU9XCJ2ZWN0b3JcIix0aGlzLm1pbnpvb209MCx0aGlzLm1heHpvb209MjIsdGhpcy5zY2hlbWU9XCJ4eXpcIix0aGlzLnRpbGVTaXplPTUxMix0aGlzLnJlcGFyc2VPdmVyc2NhbGVkPSEwLHRoaXMuaXNUaWxlQ2xpcHBlZD0hMCx1dGlsLmV4dGVuZCh0aGlzLHV0aWwucGljayhpLFtcInVybFwiLFwic2NoZW1lXCIsXCJ0aWxlU2l6ZVwiXSkpLHRoaXMuX29wdGlvbnM9dXRpbC5leHRlbmQoe3R5cGU6XCJ2ZWN0b3JcIn0saSksNTEyIT09dGhpcy50aWxlU2l6ZSl0aHJvdyBuZXcgRXJyb3IoXCJ2ZWN0b3IgdGlsZSBzb3VyY2VzIG11c3QgaGF2ZSBhIHRpbGVTaXplIG9mIDUxMlwiKTt0aGlzLnNldEV2ZW50ZWRQYXJlbnQocil9cmV0dXJuIGUmJih0Ll9fcHJvdG9fXz1lKSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlKSx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10LHQucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuZmlyZShcImRhdGFsb2FkaW5nXCIse2RhdGFUeXBlOlwic291cmNlXCJ9KSxsb2FkVGlsZUpTT04odGhpcy5fb3B0aW9ucyxmdW5jdGlvbih0LGkpe3JldHVybiB0P3ZvaWQgZS5maXJlKFwiZXJyb3JcIix0KToodXRpbC5leHRlbmQoZSxpKSxlLnNldEJvdW5kcyhpLmJvdW5kcyksZS5maXJlKFwiZGF0YVwiLHtkYXRhVHlwZTpcInNvdXJjZVwiLHNvdXJjZURhdGFUeXBlOlwibWV0YWRhdGFcIn0pLHZvaWQgZS5maXJlKFwiZGF0YVwiLHtkYXRhVHlwZTpcInNvdXJjZVwiLHNvdXJjZURhdGFUeXBlOlwiY29udGVudFwifSkpfSl9LHQucHJvdG90eXBlLnNldEJvdW5kcz1mdW5jdGlvbihlKXt0aGlzLmJvdW5kcz1lLGUmJih0aGlzLnRpbGVCb3VuZHM9bmV3IFRpbGVCb3VuZHMoZSx0aGlzLm1pbnpvb20sdGhpcy5tYXh6b29tKSl9LHQucHJvdG90eXBlLmhhc1RpbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIXRoaXMudGlsZUJvdW5kc3x8dGhpcy50aWxlQm91bmRzLmNvbnRhaW5zKGUsdGhpcy5tYXh6b29tKX0sdC5wcm90b3R5cGUub25BZGQ9ZnVuY3Rpb24oZSl7dGhpcy5sb2FkKCksdGhpcy5tYXA9ZX0sdC5wcm90b3R5cGUuc2VyaWFsaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHV0aWwuZXh0ZW5kKHt9LHRoaXMuX29wdGlvbnMpfSx0LnByb3RvdHlwZS5sb2FkVGlsZT1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGkoaSxvKXtpZighZS5hYm9ydGVkKXtpZihpKXJldHVybiB0KGkpO3RoaXMubWFwLl9yZWZyZXNoRXhwaXJlZFRpbGVzJiZlLnNldEV4cGlyeURhdGEobyksZS5sb2FkVmVjdG9yRGF0YShvLHRoaXMubWFwLnBhaW50ZXIpLGUucmVkb1doZW5Eb25lJiYoZS5yZWRvV2hlbkRvbmU9ITEsZS5yZWRvUGxhY2VtZW50KHRoaXMpKSx0KG51bGwpLGUucmVsb2FkQ2FsbGJhY2smJih0aGlzLmxvYWRUaWxlKGUsZS5yZWxvYWRDYWxsYmFjayksZS5yZWxvYWRDYWxsYmFjaz1udWxsKX19dmFyIG89ZS5jb29yZC56PnRoaXMubWF4em9vbT9NYXRoLnBvdygyLGUuY29vcmQuei10aGlzLm1heHpvb20pOjEscj17dXJsOm5vcm1hbGl6ZVVSTChlLmNvb3JkLnVybCh0aGlzLnRpbGVzLHRoaXMubWF4em9vbSx0aGlzLnNjaGVtZSksdGhpcy51cmwpLHVpZDplLnVpZCxjb29yZDplLmNvb3JkLHpvb206ZS5jb29yZC56LHRpbGVTaXplOnRoaXMudGlsZVNpemUqbyx0eXBlOnRoaXMudHlwZSxzb3VyY2U6dGhpcy5pZCxvdmVyc2NhbGluZzpvLGFuZ2xlOnRoaXMubWFwLnRyYW5zZm9ybS5hbmdsZSxwaXRjaDp0aGlzLm1hcC50cmFuc2Zvcm0ucGl0Y2gsc2hvd0NvbGxpc2lvbkJveGVzOnRoaXMubWFwLnNob3dDb2xsaXNpb25Cb3hlc307ZS53b3JrZXJJRCYmXCJleHBpcmVkXCIhPT1lLnN0YXRlP1wibG9hZGluZ1wiPT09ZS5zdGF0ZT9lLnJlbG9hZENhbGxiYWNrPXQ6dGhpcy5kaXNwYXRjaGVyLnNlbmQoXCJyZWxvYWRUaWxlXCIscixpLmJpbmQodGhpcyksZS53b3JrZXJJRCk6ZS53b3JrZXJJRD10aGlzLmRpc3BhdGNoZXIuc2VuZChcImxvYWRUaWxlXCIscixpLmJpbmQodGhpcykpfSx0LnByb3RvdHlwZS5hYm9ydFRpbGU9ZnVuY3Rpb24oZSl7dGhpcy5kaXNwYXRjaGVyLnNlbmQoXCJhYm9ydFRpbGVcIix7dWlkOmUudWlkLHR5cGU6dGhpcy50eXBlLHNvdXJjZTp0aGlzLmlkfSxudWxsLGUud29ya2VySUQpfSx0LnByb3RvdHlwZS51bmxvYWRUaWxlPWZ1bmN0aW9uKGUpe2UudW5sb2FkVmVjdG9yRGF0YSgpLHRoaXMuZGlzcGF0Y2hlci5zZW5kKFwicmVtb3ZlVGlsZVwiLHt1aWQ6ZS51aWQsdHlwZTp0aGlzLnR5cGUsc291cmNlOnRoaXMuaWR9LG51bGwsZS53b3JrZXJJRCl9LHR9KEV2ZW50ZWQpO21vZHVsZS5leHBvcnRzPVZlY3RvclRpbGVTb3VyY2U7XG59LHtcIi4uL3V0aWwvZXZlbnRlZFwiOjIwMyxcIi4uL3V0aWwvbWFwYm94XCI6MjEwLFwiLi4vdXRpbC91dGlsXCI6MjE1LFwiLi9sb2FkX3RpbGVqc29uXCI6ODcsXCIuL3RpbGVfYm91bmRzXCI6OTV9XSw5ODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgYWpheD1fZGVyZXFfKFwiLi4vdXRpbC9hamF4XCIpLHZ0PV9kZXJlcV8oXCJ2ZWN0b3ItdGlsZVwiKSxQcm90b2J1Zj1fZGVyZXFfKFwicGJmXCIpLFdvcmtlclRpbGU9X2RlcmVxXyhcIi4vd29ya2VyX3RpbGVcIiksdXRpbD1fZGVyZXFfKFwiLi4vdXRpbC91dGlsXCIpLFZlY3RvclRpbGVXb3JrZXJTb3VyY2U9ZnVuY3Rpb24oZSxyLHQpe3RoaXMuYWN0b3I9ZSx0aGlzLmxheWVySW5kZXg9cix0JiYodGhpcy5sb2FkVmVjdG9yRGF0YT10KSx0aGlzLmxvYWRpbmc9e30sdGhpcy5sb2FkZWQ9e319O1ZlY3RvclRpbGVXb3JrZXJTb3VyY2UucHJvdG90eXBlLmxvYWRUaWxlPWZ1bmN0aW9uKGUscil7ZnVuY3Rpb24gdChlLHQpe3JldHVybiBkZWxldGUgdGhpcy5sb2FkaW5nW29dW2ldLGU/cihlKTp0PyhhLnZlY3RvclRpbGU9dCxhLnBhcnNlKHQsdGhpcy5sYXllckluZGV4LHRoaXMuYWN0b3IsZnVuY3Rpb24oZSxvLGkpe2lmKGUpcmV0dXJuIHIoZSk7dmFyIGE9e307dC5leHBpcmVzJiYoYS5leHBpcmVzPXQuZXhwaXJlcyksdC5jYWNoZUNvbnRyb2wmJihhLmNhY2hlQ29udHJvbD10LmNhY2hlQ29udHJvbCkscihudWxsLHV0aWwuZXh0ZW5kKHtyYXdUaWxlRGF0YTp0LnJhd0RhdGF9LG8sYSksaSl9KSx0aGlzLmxvYWRlZFtvXT10aGlzLmxvYWRlZFtvXXx8e30sdm9pZCh0aGlzLmxvYWRlZFtvXVtpXT1hKSk6cihudWxsLG51bGwpfXZhciBvPWUuc291cmNlLGk9ZS51aWQ7dGhpcy5sb2FkaW5nW29dfHwodGhpcy5sb2FkaW5nW29dPXt9KTt2YXIgYT10aGlzLmxvYWRpbmdbb11baV09bmV3IFdvcmtlclRpbGUoZSk7YS5hYm9ydD10aGlzLmxvYWRWZWN0b3JEYXRhKGUsdC5iaW5kKHRoaXMpKX0sVmVjdG9yVGlsZVdvcmtlclNvdXJjZS5wcm90b3R5cGUucmVsb2FkVGlsZT1mdW5jdGlvbihlLHIpe2Z1bmN0aW9uIHQoZSx0KXtpZih0aGlzLnJlbG9hZENhbGxiYWNrKXt2YXIgbz10aGlzLnJlbG9hZENhbGxiYWNrO2RlbGV0ZSB0aGlzLnJlbG9hZENhbGxiYWNrLHRoaXMucGFyc2UodGhpcy52ZWN0b3JUaWxlLGEubGF5ZXJJbmRleCxhLmFjdG9yLG8pfXIoZSx0KX12YXIgbz10aGlzLmxvYWRlZFtlLnNvdXJjZV0saT1lLnVpZCxhPXRoaXM7aWYobyYmb1tpXSl7dmFyIGw9b1tpXTtcInBhcnNpbmdcIj09PWwuc3RhdHVzP2wucmVsb2FkQ2FsbGJhY2s9cjpcImRvbmVcIj09PWwuc3RhdHVzJiZsLnBhcnNlKGwudmVjdG9yVGlsZSx0aGlzLmxheWVySW5kZXgsdGhpcy5hY3Rvcix0LmJpbmQobCkpfX0sVmVjdG9yVGlsZVdvcmtlclNvdXJjZS5wcm90b3R5cGUuYWJvcnRUaWxlPWZ1bmN0aW9uKGUpe3ZhciByPXRoaXMubG9hZGluZ1tlLnNvdXJjZV0sdD1lLnVpZDtyJiZyW3RdJiZyW3RdLmFib3J0JiYoclt0XS5hYm9ydCgpLGRlbGV0ZSByW3RdKX0sVmVjdG9yVGlsZVdvcmtlclNvdXJjZS5wcm90b3R5cGUucmVtb3ZlVGlsZT1mdW5jdGlvbihlKXt2YXIgcj10aGlzLmxvYWRlZFtlLnNvdXJjZV0sdD1lLnVpZDtyJiZyW3RdJiZkZWxldGUgclt0XX0sVmVjdG9yVGlsZVdvcmtlclNvdXJjZS5wcm90b3R5cGUubG9hZFZlY3RvckRhdGE9ZnVuY3Rpb24oZSxyKXtmdW5jdGlvbiB0KGUsdCl7aWYoZSlyZXR1cm4gcihlKTt2YXIgbz1uZXcgdnQuVmVjdG9yVGlsZShuZXcgUHJvdG9idWYodC5kYXRhKSk7by5yYXdEYXRhPXQuZGF0YSxvLmNhY2hlQ29udHJvbD10LmNhY2hlQ29udHJvbCxvLmV4cGlyZXM9dC5leHBpcmVzLHIoZSxvKX12YXIgbz1hamF4LmdldEFycmF5QnVmZmVyKGUudXJsLHQuYmluZCh0aGlzKSk7cmV0dXJuIGZ1bmN0aW9uKCl7by5hYm9ydCgpfX0sVmVjdG9yVGlsZVdvcmtlclNvdXJjZS5wcm90b3R5cGUucmVkb1BsYWNlbWVudD1mdW5jdGlvbihlLHIpe3ZhciB0PXRoaXMubG9hZGVkW2Uuc291cmNlXSxvPXRoaXMubG9hZGluZ1tlLnNvdXJjZV0saT1lLnVpZDtpZih0JiZ0W2ldKXt2YXIgYT10W2ldLGw9YS5yZWRvUGxhY2VtZW50KGUuYW5nbGUsZS5waXRjaCxlLnNob3dDb2xsaXNpb25Cb3hlcyk7bC5yZXN1bHQmJnIobnVsbCxsLnJlc3VsdCxsLnRyYW5zZmVyYWJsZXMpfWVsc2UgbyYmb1tpXSYmKG9baV0uYW5nbGU9ZS5hbmdsZSl9LG1vZHVsZS5leHBvcnRzPVZlY3RvclRpbGVXb3JrZXJTb3VyY2U7XG59LHtcIi4uL3V0aWwvYWpheFwiOjE5NCxcIi4uL3V0aWwvdXRpbFwiOjIxNSxcIi4vd29ya2VyX3RpbGVcIjoxMDEsXCJwYmZcIjoyNSxcInZlY3Rvci10aWxlXCI6MzR9XSw5OTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgYWpheD1fZGVyZXFfKFwiLi4vdXRpbC9hamF4XCIpLEltYWdlU291cmNlPV9kZXJlcV8oXCIuL2ltYWdlX3NvdXJjZVwiKSxWaWRlb1NvdXJjZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbyxpLHIpe3QuY2FsbCh0aGlzLGUsbyxpLHIpLHRoaXMucm91bmRab29tPSEwLHRoaXMudHlwZT1cInZpZGVvXCIsdGhpcy5vcHRpb25zPW99cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5vcHRpb25zO3RoaXMudXJscz1lLnVybHMsYWpheC5nZXRWaWRlbyhlLnVybHMsZnVuY3Rpb24oZSxvKXtpZihlKXJldHVybiB0LmZpcmUoXCJlcnJvclwiLHtlcnJvcjplfSk7dC52aWRlbz1vLHQudmlkZW8ubG9vcD0hMDt2YXIgaTt0LnZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoXCJwbGF5aW5nXCIsZnVuY3Rpb24oKXtpPXQubWFwLnN0eWxlLmFuaW1hdGlvbkxvb3Auc2V0KDEvMCksdC5tYXAuX3JlcmVuZGVyKCl9KSx0LnZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoXCJwYXVzZVwiLGZ1bmN0aW9uKCl7dC5tYXAuc3R5bGUuYW5pbWF0aW9uTG9vcC5jYW5jZWwoaSl9KSx0Lm1hcCYmdC52aWRlby5wbGF5KCksdC5fZmluaXNoTG9hZGluZygpfSl9LGUucHJvdG90eXBlLmdldFZpZGVvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW99LGUucHJvdG90eXBlLm9uQWRkPWZ1bmN0aW9uKHQpe3RoaXMubWFwfHwodGhpcy5sb2FkKCksdGhpcy5tYXA9dCx0aGlzLnZpZGVvJiYodGhpcy52aWRlby5wbGF5KCksdGhpcy5zZXRDb29yZGluYXRlcyh0aGlzLmNvb3JkaW5hdGVzKSkpfSxlLnByb3RvdHlwZS5wcmVwYXJlPWZ1bmN0aW9uKCl7IXRoaXMudGlsZXx8dGhpcy52aWRlby5yZWFkeVN0YXRlPDJ8fHRoaXMuX3ByZXBhcmVJbWFnZSh0aGlzLm1hcC5wYWludGVyLmdsLHRoaXMudmlkZW8pfSxlLnByb3RvdHlwZS5zZXJpYWxpemU9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZTpcInZpZGVvXCIsdXJsczp0aGlzLnVybHMsY29vcmRpbmF0ZXM6dGhpcy5jb29yZGluYXRlc319LGV9KEltYWdlU291cmNlKTttb2R1bGUuZXhwb3J0cz1WaWRlb1NvdXJjZTtcbn0se1wiLi4vdXRpbC9hamF4XCI6MTk0LFwiLi9pbWFnZV9zb3VyY2VcIjo4Nn1dLDEwMDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgQWN0b3I9X2RlcmVxXyhcIi4uL3V0aWwvYWN0b3JcIiksU3R5bGVMYXllckluZGV4PV9kZXJlcV8oXCIuLi9zdHlsZS9zdHlsZV9sYXllcl9pbmRleFwiKSxWZWN0b3JUaWxlV29ya2VyU291cmNlPV9kZXJlcV8oXCIuL3ZlY3Rvcl90aWxlX3dvcmtlcl9zb3VyY2VcIiksR2VvSlNPTldvcmtlclNvdXJjZT1fZGVyZXFfKFwiLi9nZW9qc29uX3dvcmtlcl9zb3VyY2VcIiksZ2xvYmFsUlRMVGV4dFBsdWdpbj1fZGVyZXFfKFwiLi9ydGxfdGV4dF9wbHVnaW5cIiksV29ya2VyPWZ1bmN0aW9uKGUpe3ZhciByPXRoaXM7dGhpcy5zZWxmPWUsdGhpcy5hY3Rvcj1uZXcgQWN0b3IoZSx0aGlzKSx0aGlzLmxheWVySW5kZXhlcz17fSx0aGlzLndvcmtlclNvdXJjZVR5cGVzPXt2ZWN0b3I6VmVjdG9yVGlsZVdvcmtlclNvdXJjZSxnZW9qc29uOkdlb0pTT05Xb3JrZXJTb3VyY2V9LHRoaXMud29ya2VyU291cmNlcz17fSx0aGlzLnNlbGYucmVnaXN0ZXJXb3JrZXJTb3VyY2U9ZnVuY3Rpb24oZSxvKXtpZihyLndvcmtlclNvdXJjZVR5cGVzW2VdKXRocm93IG5ldyBFcnJvcignV29ya2VyIHNvdXJjZSB3aXRoIG5hbWUgXCInK2UrJ1wiIGFscmVhZHkgcmVnaXN0ZXJlZC4nKTtyLndvcmtlclNvdXJjZVR5cGVzW2VdPW99LHRoaXMuc2VsZi5yZWdpc3RlclJUTFRleHRQbHVnaW49ZnVuY3Rpb24oZSl7aWYoZ2xvYmFsUlRMVGV4dFBsdWdpbi5hcHBseUFyYWJpY1NoYXBpbmd8fGdsb2JhbFJUTFRleHRQbHVnaW4ucHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0KXRocm93IG5ldyBFcnJvcihcIlJUTCB0ZXh0IHBsdWdpbiBhbHJlYWR5IHJlZ2lzdGVyZWQuXCIpO2dsb2JhbFJUTFRleHRQbHVnaW4uYXBwbHlBcmFiaWNTaGFwaW5nPWUuYXBwbHlBcmFiaWNTaGFwaW5nLGdsb2JhbFJUTFRleHRQbHVnaW4ucHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0PWUucHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0fX07V29ya2VyLnByb3RvdHlwZS5zZXRMYXllcnM9ZnVuY3Rpb24oZSxyKXt0aGlzLmdldExheWVySW5kZXgoZSkucmVwbGFjZShyKX0sV29ya2VyLnByb3RvdHlwZS51cGRhdGVMYXllcnM9ZnVuY3Rpb24oZSxyKXt0aGlzLmdldExheWVySW5kZXgoZSkudXBkYXRlKHIubGF5ZXJzLHIucmVtb3ZlZElkcyxyLnN5bWJvbE9yZGVyKX0sV29ya2VyLnByb3RvdHlwZS5sb2FkVGlsZT1mdW5jdGlvbihlLHIsbyl7dGhpcy5nZXRXb3JrZXJTb3VyY2UoZSxyLnR5cGUpLmxvYWRUaWxlKHIsbyl9LFdvcmtlci5wcm90b3R5cGUucmVsb2FkVGlsZT1mdW5jdGlvbihlLHIsbyl7dGhpcy5nZXRXb3JrZXJTb3VyY2UoZSxyLnR5cGUpLnJlbG9hZFRpbGUocixvKX0sV29ya2VyLnByb3RvdHlwZS5hYm9ydFRpbGU9ZnVuY3Rpb24oZSxyKXt0aGlzLmdldFdvcmtlclNvdXJjZShlLHIudHlwZSkuYWJvcnRUaWxlKHIpfSxXb3JrZXIucHJvdG90eXBlLnJlbW92ZVRpbGU9ZnVuY3Rpb24oZSxyKXt0aGlzLmdldFdvcmtlclNvdXJjZShlLHIudHlwZSkucmVtb3ZlVGlsZShyKX0sV29ya2VyLnByb3RvdHlwZS5yZW1vdmVTb3VyY2U9ZnVuY3Rpb24oZSxyKXt2YXIgbz10aGlzLmdldFdvcmtlclNvdXJjZShlLHIudHlwZSk7dm9pZCAwIT09by5yZW1vdmVTb3VyY2UmJm8ucmVtb3ZlU291cmNlKHIpfSxXb3JrZXIucHJvdG90eXBlLnJlZG9QbGFjZW1lbnQ9ZnVuY3Rpb24oZSxyLG8pe3RoaXMuZ2V0V29ya2VyU291cmNlKGUsci50eXBlKS5yZWRvUGxhY2VtZW50KHIsbyl9LFdvcmtlci5wcm90b3R5cGUubG9hZFdvcmtlclNvdXJjZT1mdW5jdGlvbihlLHIsbyl7dHJ5e3RoaXMuc2VsZi5pbXBvcnRTY3JpcHRzKHIudXJsKSxvKCl9Y2F0Y2goZSl7byhlKX19LFdvcmtlci5wcm90b3R5cGUubG9hZFJUTFRleHRQbHVnaW49ZnVuY3Rpb24oZSxyLG8pe3RyeXtnbG9iYWxSVExUZXh0UGx1Z2luLmFwcGx5QXJhYmljU2hhcGluZ3x8Z2xvYmFsUlRMVGV4dFBsdWdpbi5wcm9jZXNzQmlkaXJlY3Rpb25hbFRleHR8fHRoaXMuc2VsZi5pbXBvcnRTY3JpcHRzKHIpfWNhdGNoKGUpe28oZSl9fSxXb3JrZXIucHJvdG90eXBlLmdldExheWVySW5kZXg9ZnVuY3Rpb24oZSl7dmFyIHI9dGhpcy5sYXllckluZGV4ZXNbZV07cmV0dXJuIHJ8fChyPXRoaXMubGF5ZXJJbmRleGVzW2VdPW5ldyBTdHlsZUxheWVySW5kZXgpLHJ9LFdvcmtlci5wcm90b3R5cGUuZ2V0V29ya2VyU291cmNlPWZ1bmN0aW9uKGUscil7dmFyIG89dGhpcztpZih0aGlzLndvcmtlclNvdXJjZXNbZV18fCh0aGlzLndvcmtlclNvdXJjZXNbZV09e30pLCF0aGlzLndvcmtlclNvdXJjZXNbZV1bcl0pe3ZhciB0PXtzZW5kOmZ1bmN0aW9uKHIsdCxpLG4pe28uYWN0b3Iuc2VuZChyLHQsaSxuLGUpfX07dGhpcy53b3JrZXJTb3VyY2VzW2VdW3JdPW5ldyB0aGlzLndvcmtlclNvdXJjZVR5cGVzW3JdKHQsdGhpcy5nZXRMYXllckluZGV4KGUpKX1yZXR1cm4gdGhpcy53b3JrZXJTb3VyY2VzW2VdW3JdfSxtb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFdvcmtlcihlKX07XG59LHtcIi4uL3N0eWxlL3N0eWxlX2xheWVyX2luZGV4XCI6MTU3LFwiLi4vdXRpbC9hY3RvclwiOjE5MyxcIi4vZ2VvanNvbl93b3JrZXJfc291cmNlXCI6ODQsXCIuL3J0bF90ZXh0X3BsdWdpblwiOjkxLFwiLi92ZWN0b3JfdGlsZV93b3JrZXJfc291cmNlXCI6OTh9XSwxMDE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gcmVjYWxjdWxhdGVMYXllcnMoZSxpKXtmb3IodmFyIHI9MCxvPWUubGF5ZXJzO3I8by5sZW5ndGg7cis9MSl7dmFyIHQ9b1tyXTt0LnJlY2FsY3VsYXRlKGkpfX1mdW5jdGlvbiBzZXJpYWxpemVCdWNrZXRzKGUsaSl7cmV0dXJuIGUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLmlzRW1wdHkoKX0pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5zZXJpYWxpemUoaSl9KX12YXIgRmVhdHVyZUluZGV4PV9kZXJlcV8oXCIuLi9kYXRhL2ZlYXR1cmVfaW5kZXhcIiksQ29sbGlzaW9uVGlsZT1fZGVyZXFfKFwiLi4vc3ltYm9sL2NvbGxpc2lvbl90aWxlXCIpLENvbGxpc2lvbkJveEFycmF5PV9kZXJlcV8oXCIuLi9zeW1ib2wvY29sbGlzaW9uX2JveFwiKSxEaWN0aW9uYXJ5Q29kZXI9X2RlcmVxXyhcIi4uL3V0aWwvZGljdGlvbmFyeV9jb2RlclwiKSx1dGlsPV9kZXJlcV8oXCIuLi91dGlsL3V0aWxcIiksV29ya2VyVGlsZT1mdW5jdGlvbihlKXt0aGlzLmNvb3JkPWUuY29vcmQsdGhpcy51aWQ9ZS51aWQsdGhpcy56b29tPWUuem9vbSx0aGlzLnRpbGVTaXplPWUudGlsZVNpemUsdGhpcy5zb3VyY2U9ZS5zb3VyY2UsdGhpcy5vdmVyc2NhbGluZz1lLm92ZXJzY2FsaW5nLHRoaXMuYW5nbGU9ZS5hbmdsZSx0aGlzLnBpdGNoPWUucGl0Y2gsdGhpcy5zaG93Q29sbGlzaW9uQm94ZXM9ZS5zaG93Q29sbGlzaW9uQm94ZXN9O1dvcmtlclRpbGUucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGUsaSxyLG8pe3ZhciB0PXRoaXM7ZS5sYXllcnN8fChlPXtsYXllcnM6e19nZW9qc29uVGlsZUxheWVyOmV9fSksdGhpcy5zdGF0dXM9XCJwYXJzaW5nXCIsdGhpcy5kYXRhPWUsdGhpcy5jb2xsaXNpb25Cb3hBcnJheT1uZXcgQ29sbGlzaW9uQm94QXJyYXk7dmFyIHM9bmV3IERpY3Rpb25hcnlDb2RlcihPYmplY3Qua2V5cyhlLmxheWVycykuc29ydCgpKSxsPW5ldyBGZWF0dXJlSW5kZXgodGhpcy5jb29yZCx0aGlzLm92ZXJzY2FsaW5nKTtsLmJ1Y2tldExheWVySURzPXt9O3ZhciBuPXt9LGE9MCxjPXtmZWF0dXJlSW5kZXg6bCxpY29uRGVwZW5kZW5jaWVzOnt9LGdseXBoRGVwZW5kZW5jaWVzOnt9fSx1PWkuZmFtaWxpZXNCeVNvdXJjZVt0aGlzLnNvdXJjZV07Zm9yKHZhciBoIGluIHUpe3ZhciB5PWUubGF5ZXJzW2hdO2lmKHkpezE9PT15LnZlcnNpb24mJnV0aWwud2Fybk9uY2UoJ1ZlY3RvciB0aWxlIHNvdXJjZSBcIicrdC5zb3VyY2UrJ1wiIGxheWVyIFwiJytoKydcIiBkb2VzIG5vdCB1c2UgdmVjdG9yIHRpbGUgc3BlYyB2MiBhbmQgdGhlcmVmb3JlIG1heSBoYXZlIHNvbWUgcmVuZGVyaW5nIGVycm9ycy4nKTtmb3IodmFyIGQ9cy5lbmNvZGUoaCkscD1bXSxtPTA7bTx5Lmxlbmd0aDttKyspe3ZhciB2PXkuZmVhdHVyZShtKTt2LmluZGV4PW0sdi5zb3VyY2VMYXllckluZGV4PWQscC5wdXNoKHYpfWZvcih2YXIgZj0wLGc9dVtoXTtmPGcubGVuZ3RoO2YrPTEpe3ZhciB4PWdbZl0sQj14WzBdO2lmKCEoQi5taW56b29tJiZ0Lnpvb208Qi5taW56b29tfHxCLm1heHpvb20mJnQuem9vbT49Qi5tYXh6b29tfHxCLmxheW91dCYmXCJub25lXCI9PT1CLmxheW91dC52aXNpYmlsaXR5KSl7Zm9yKHZhciBiPTAsaz14O2I8ay5sZW5ndGg7Yis9MSl7dmFyIHo9a1tiXTt6LnJlY2FsY3VsYXRlKHQuem9vbSl9dmFyIEM9bltCLmlkXT1CLmNyZWF0ZUJ1Y2tldCh7aW5kZXg6YSxsYXllcnM6eCx6b29tOnQuem9vbSxvdmVyc2NhbGluZzp0Lm92ZXJzY2FsaW5nLGNvbGxpc2lvbkJveEFycmF5OnQuY29sbGlzaW9uQm94QXJyYXl9KTtDLnBvcHVsYXRlKHAsYyksbC5idWNrZXRMYXllcklEc1thXT14Lm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5pZH0pLGErK319fX12YXIgVD1mdW5jdGlvbihlKXt0LnN0YXR1cz1cImRvbmVcIixsLnBhaW50UHJvcGVydHlTdGF0aXN0aWNzPXt9O2Zvcih2YXIgaSBpbiBuKXV0aWwuZXh0ZW5kKGwucGFpbnRQcm9wZXJ0eVN0YXRpc3RpY3MsbltpXS5nZXRQYWludFByb3BlcnR5U3RhdGlzdGljcygpKTt2YXIgcj1bXTtvKG51bGwse2J1Y2tldHM6c2VyaWFsaXplQnVja2V0cyh1dGlsLnZhbHVlcyhuKSxyKSxmZWF0dXJlSW5kZXg6bC5zZXJpYWxpemUociksY29sbGlzaW9uVGlsZTplLnNlcmlhbGl6ZShyKSxjb2xsaXNpb25Cb3hBcnJheTp0LmNvbGxpc2lvbkJveEFycmF5LnNlcmlhbGl6ZSgpfSxyKX07dGhpcy5zeW1ib2xCdWNrZXRzPVtdO2Zvcih2YXIgdz1pLnN5bWJvbE9yZGVyLmxlbmd0aC0xO3c+PTA7dy0tKXt2YXIgQT1uW2kuc3ltYm9sT3JkZXJbd11dO0EmJnQuc3ltYm9sQnVja2V0cy5wdXNoKEEpfWlmKDA9PT10aGlzLnN5bWJvbEJ1Y2tldHMubGVuZ3RoKXJldHVybiBUKG5ldyBDb2xsaXNpb25UaWxlKHRoaXMuYW5nbGUsdGhpcy5waXRjaCx0aGlzLmNvbGxpc2lvbkJveEFycmF5KSk7dmFyIEQ9MCxJPU9iamVjdC5rZXlzKGMuaWNvbkRlcGVuZGVuY2llcyksTz11dGlsLm1hcE9iamVjdChjLmdseXBoRGVwZW5kZW5jaWVzLGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3Qua2V5cyhlKS5tYXAoTnVtYmVyKX0pLEw9ZnVuY3Rpb24oZSl7aWYoZSlyZXR1cm4gbyhlKTtpZihEKyssMj09PUQpe2Zvcih2YXIgaT1uZXcgQ29sbGlzaW9uVGlsZSh0LmFuZ2xlLHQucGl0Y2gsdC5jb2xsaXNpb25Cb3hBcnJheSkscj0wLHM9dC5zeW1ib2xCdWNrZXRzO3I8cy5sZW5ndGg7cis9MSl7dmFyIGw9c1tyXTtyZWNhbGN1bGF0ZUxheWVycyhsLHQuem9vbSksbC5wcmVwYXJlKE8sSSksbC5wbGFjZShpLHQuc2hvd0NvbGxpc2lvbkJveGVzKX1UKGkpfX07T2JqZWN0LmtleXMoTykubGVuZ3RoP3Iuc2VuZChcImdldEdseXBoc1wiLHt1aWQ6dGhpcy51aWQsc3RhY2tzOk99LGZ1bmN0aW9uKGUsaSl7Tz1pLEwoZSl9KTpMKCksSS5sZW5ndGg/ci5zZW5kKFwiZ2V0SWNvbnNcIix7aWNvbnM6SX0sZnVuY3Rpb24oZSxpKXtJPWksTChlKX0pOkwoKX0sV29ya2VyVGlsZS5wcm90b3R5cGUucmVkb1BsYWNlbWVudD1mdW5jdGlvbihlLGkscil7dmFyIG89dGhpcztpZih0aGlzLmFuZ2xlPWUsdGhpcy5waXRjaD1pLFwiZG9uZVwiIT09dGhpcy5zdGF0dXMpcmV0dXJue307Zm9yKHZhciB0PW5ldyBDb2xsaXNpb25UaWxlKHRoaXMuYW5nbGUsdGhpcy5waXRjaCx0aGlzLmNvbGxpc2lvbkJveEFycmF5KSxzPTAsbD1vLnN5bWJvbEJ1Y2tldHM7czxsLmxlbmd0aDtzKz0xKXt2YXIgbj1sW3NdO3JlY2FsY3VsYXRlTGF5ZXJzKG4sby56b29tKSxuLnBsYWNlKHQscil9dmFyIGE9W107cmV0dXJue3Jlc3VsdDp7YnVja2V0czpzZXJpYWxpemVCdWNrZXRzKHRoaXMuc3ltYm9sQnVja2V0cyxhKSxjb2xsaXNpb25UaWxlOnQuc2VyaWFsaXplKGEpfSx0cmFuc2ZlcmFibGVzOmF9fSxtb2R1bGUuZXhwb3J0cz1Xb3JrZXJUaWxlO1xufSx7XCIuLi9kYXRhL2ZlYXR1cmVfaW5kZXhcIjo1NSxcIi4uL3N5bWJvbC9jb2xsaXNpb25fYm94XCI6MTYzLFwiLi4vc3ltYm9sL2NvbGxpc2lvbl90aWxlXCI6MTY1LFwiLi4vdXRpbC9kaWN0aW9uYXJ5X2NvZGVyXCI6MjAwLFwiLi4vdXRpbC91dGlsXCI6MjE1fV0sMTAyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGRlcmVmKHIsZSl7dmFyIGY9e307Zm9yKHZhciB0IGluIHIpXCJyZWZcIiE9PXQmJihmW3RdPXJbdF0pO3JldHVybiByZWZQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24ocil7ciBpbiBlJiYoZltyXT1lW3JdKX0pLGZ9ZnVuY3Rpb24gZGVyZWZMYXllcnMocil7cj1yLnNsaWNlKCk7Zm9yKHZhciBlPU9iamVjdC5jcmVhdGUobnVsbCksZj0wO2Y8ci5sZW5ndGg7ZisrKWVbcltmXS5pZF09cltmXTtmb3IodmFyIHQ9MDt0PHIubGVuZ3RoO3QrKylcInJlZlwiaW4gclt0XSYmKHJbdF09ZGVyZWYoclt0XSxlW3JbdF0ucmVmXSkpO3JldHVybiByfXZhciByZWZQcm9wZXJ0aWVzPV9kZXJlcV8oXCIuL3V0aWwvcmVmX3Byb3BlcnRpZXNcIik7bW9kdWxlLmV4cG9ydHM9ZGVyZWZMYXllcnM7XG59LHtcIi4vdXRpbC9yZWZfcHJvcGVydGllc1wiOjEyNX1dLDEwMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBkaWZmU291cmNlcyhlLHIsbyxhKXtlPWV8fHt9LHI9cnx8e307dmFyIHM7Zm9yKHMgaW4gZSllLmhhc093blByb3BlcnR5KHMpJiYoci5oYXNPd25Qcm9wZXJ0eShzKXx8KG8ucHVzaCh7Y29tbWFuZDpvcGVyYXRpb25zLnJlbW92ZVNvdXJjZSxhcmdzOltzXX0pLGFbc109ITApKTtmb3IocyBpbiByKXIuaGFzT3duUHJvcGVydHkocykmJihlLmhhc093blByb3BlcnR5KHMpP2lzRXF1YWwoZVtzXSxyW3NdKXx8KG8ucHVzaCh7Y29tbWFuZDpvcGVyYXRpb25zLnJlbW92ZVNvdXJjZSxhcmdzOltzXX0pLG8ucHVzaCh7Y29tbWFuZDpvcGVyYXRpb25zLmFkZFNvdXJjZSxhcmdzOltzLHJbc11dfSksYVtzXT0hMCk6by5wdXNoKHtjb21tYW5kOm9wZXJhdGlvbnMuYWRkU291cmNlLGFyZ3M6W3MscltzXV19KSl9ZnVuY3Rpb24gZGlmZkxheWVyUHJvcGVydHlDaGFuZ2VzKGUscixvLGEscyx0KXtlPWV8fHt9LHI9cnx8e307dmFyIG47Zm9yKG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYoaXNFcXVhbChlW25dLHJbbl0pfHxvLnB1c2goe2NvbW1hbmQ6dCxhcmdzOlthLG4scltuXSxzXX0pKTtmb3IobiBpbiByKXIuaGFzT3duUHJvcGVydHkobikmJiFlLmhhc093blByb3BlcnR5KG4pJiYoaXNFcXVhbChlW25dLHJbbl0pfHxvLnB1c2goe2NvbW1hbmQ6dCxhcmdzOlthLG4scltuXSxzXX0pKX1mdW5jdGlvbiBwbHVja0lkKGUpe3JldHVybiBlLmlkfWZ1bmN0aW9uIGluZGV4QnlJZChlLHIpe3JldHVybiBlW3IuaWRdPXIsZX1mdW5jdGlvbiBkaWZmTGF5ZXJzKGUscixvKXtlPWV8fFtdLHI9cnx8W107dmFyIGEscyx0LG4saSxwLG0sdT1lLm1hcChwbHVja0lkKSxsPXIubWFwKHBsdWNrSWQpLHk9ZS5yZWR1Y2UoaW5kZXhCeUlkLHt9KSxjPXIucmVkdWNlKGluZGV4QnlJZCx7fSksZD11LnNsaWNlKCksaD1PYmplY3QuY3JlYXRlKG51bGwpO2ZvcihhPTAscz0wO2E8dS5sZW5ndGg7YSsrKXQ9dVthXSxjLmhhc093blByb3BlcnR5KHQpP3MrKzooby5wdXNoKHtjb21tYW5kOm9wZXJhdGlvbnMucmVtb3ZlTGF5ZXIsYXJnczpbdF19KSxkLnNwbGljZShkLmluZGV4T2YodCxzKSwxKSk7Zm9yKGE9MCxzPTA7YTxsLmxlbmd0aDthKyspdD1sW2wubGVuZ3RoLTEtYV0sZFtkLmxlbmd0aC0xLWFdIT09dCYmKHkuaGFzT3duUHJvcGVydHkodCk/KG8ucHVzaCh7Y29tbWFuZDpvcGVyYXRpb25zLnJlbW92ZUxheWVyLGFyZ3M6W3RdfSksZC5zcGxpY2UoZC5sYXN0SW5kZXhPZih0LGQubGVuZ3RoLXMpLDEpKTpzKysscD1kW2QubGVuZ3RoLWFdLG8ucHVzaCh7Y29tbWFuZDpvcGVyYXRpb25zLmFkZExheWVyLGFyZ3M6W2NbdF0scF19KSxkLnNwbGljZShkLmxlbmd0aC1hLDAsdCksaFt0XT0hMCk7Zm9yKGE9MDthPGwubGVuZ3RoO2ErKylpZih0PWxbYV0sbj15W3RdLGk9Y1t0XSwhaFt0XSYmIWlzRXF1YWwobixpKSlpZihpc0VxdWFsKG4uc291cmNlLGkuc291cmNlKSYmaXNFcXVhbChuW1wic291cmNlLWxheWVyXCJdLGlbXCJzb3VyY2UtbGF5ZXJcIl0pJiZpc0VxdWFsKG4udHlwZSxpLnR5cGUpKXtkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMobi5sYXlvdXQsaS5sYXlvdXQsbyx0LG51bGwsb3BlcmF0aW9ucy5zZXRMYXlvdXRQcm9wZXJ0eSksZGlmZkxheWVyUHJvcGVydHlDaGFuZ2VzKG4ucGFpbnQsaS5wYWludCxvLHQsbnVsbCxvcGVyYXRpb25zLnNldFBhaW50UHJvcGVydHkpLGlzRXF1YWwobi5maWx0ZXIsaS5maWx0ZXIpfHxvLnB1c2goe2NvbW1hbmQ6b3BlcmF0aW9ucy5zZXRGaWx0ZXIsYXJnczpbdCxpLmZpbHRlcl19KSxpc0VxdWFsKG4ubWluem9vbSxpLm1pbnpvb20pJiZpc0VxdWFsKG4ubWF4em9vbSxpLm1heHpvb20pfHxvLnB1c2goe2NvbW1hbmQ6b3BlcmF0aW9ucy5zZXRMYXllclpvb21SYW5nZSxhcmdzOlt0LGkubWluem9vbSxpLm1heHpvb21dfSk7Zm9yKG0gaW4gbiluLmhhc093blByb3BlcnR5KG0pJiZcImxheW91dFwiIT09bSYmXCJwYWludFwiIT09bSYmXCJmaWx0ZXJcIiE9PW0mJlwibWV0YWRhdGFcIiE9PW0mJlwibWluem9vbVwiIT09bSYmXCJtYXh6b29tXCIhPT1tJiYoMD09PW0uaW5kZXhPZihcInBhaW50LlwiKT9kaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMoblttXSxpW21dLG8sdCxtLnNsaWNlKDYpLG9wZXJhdGlvbnMuc2V0UGFpbnRQcm9wZXJ0eSk6aXNFcXVhbChuW21dLGlbbV0pfHxvLnB1c2goe2NvbW1hbmQ6b3BlcmF0aW9ucy5zZXRMYXllclByb3BlcnR5LGFyZ3M6W3QsbSxpW21dXX0pKTtmb3IobSBpbiBpKWkuaGFzT3duUHJvcGVydHkobSkmJiFuLmhhc093blByb3BlcnR5KG0pJiZcImxheW91dFwiIT09bSYmXCJwYWludFwiIT09bSYmXCJmaWx0ZXJcIiE9PW0mJlwibWV0YWRhdGFcIiE9PW0mJlwibWluem9vbVwiIT09bSYmXCJtYXh6b29tXCIhPT1tJiYoMD09PW0uaW5kZXhPZihcInBhaW50LlwiKT9kaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMoblttXSxpW21dLG8sdCxtLnNsaWNlKDYpLG9wZXJhdGlvbnMuc2V0UGFpbnRQcm9wZXJ0eSk6aXNFcXVhbChuW21dLGlbbV0pfHxvLnB1c2goe2NvbW1hbmQ6b3BlcmF0aW9ucy5zZXRMYXllclByb3BlcnR5LGFyZ3M6W3QsbSxpW21dXX0pKX1lbHNlIG8ucHVzaCh7Y29tbWFuZDpvcGVyYXRpb25zLnJlbW92ZUxheWVyLGFyZ3M6W3RdfSkscD1kW2QubGFzdEluZGV4T2YodCkrMV0sby5wdXNoKHtjb21tYW5kOm9wZXJhdGlvbnMuYWRkTGF5ZXIsYXJnczpbaSxwXX0pfWZ1bmN0aW9uIGRpZmZTdHlsZXMoZSxyKXtpZighZSlyZXR1cm5be2NvbW1hbmQ6b3BlcmF0aW9ucy5zZXRTdHlsZSxhcmdzOltyXX1dO3ZhciBvPVtdO3RyeXtpZighaXNFcXVhbChlLnZlcnNpb24sci52ZXJzaW9uKSlyZXR1cm5be2NvbW1hbmQ6b3BlcmF0aW9ucy5zZXRTdHlsZSxhcmdzOltyXX1dO2lzRXF1YWwoZS5jZW50ZXIsci5jZW50ZXIpfHxvLnB1c2goe2NvbW1hbmQ6b3BlcmF0aW9ucy5zZXRDZW50ZXIsYXJnczpbci5jZW50ZXJdfSksaXNFcXVhbChlLnpvb20sci56b29tKXx8by5wdXNoKHtjb21tYW5kOm9wZXJhdGlvbnMuc2V0Wm9vbSxhcmdzOltyLnpvb21dfSksaXNFcXVhbChlLmJlYXJpbmcsci5iZWFyaW5nKXx8by5wdXNoKHtjb21tYW5kOm9wZXJhdGlvbnMuc2V0QmVhcmluZyxhcmdzOltyLmJlYXJpbmddfSksaXNFcXVhbChlLnBpdGNoLHIucGl0Y2gpfHxvLnB1c2goe2NvbW1hbmQ6b3BlcmF0aW9ucy5zZXRQaXRjaCxhcmdzOltyLnBpdGNoXX0pLGlzRXF1YWwoZS5zcHJpdGUsci5zcHJpdGUpfHxvLnB1c2goe2NvbW1hbmQ6b3BlcmF0aW9ucy5zZXRTcHJpdGUsYXJnczpbci5zcHJpdGVdfSksaXNFcXVhbChlLmdseXBocyxyLmdseXBocyl8fG8ucHVzaCh7Y29tbWFuZDpvcGVyYXRpb25zLnNldEdseXBocyxhcmdzOltyLmdseXBoc119KSxpc0VxdWFsKGUudHJhbnNpdGlvbixyLnRyYW5zaXRpb24pfHxvLnB1c2goe2NvbW1hbmQ6b3BlcmF0aW9ucy5zZXRUcmFuc2l0aW9uLGFyZ3M6W3IudHJhbnNpdGlvbl19KSxpc0VxdWFsKGUubGlnaHQsci5saWdodCl8fG8ucHVzaCh7Y29tbWFuZDpvcGVyYXRpb25zLnNldExpZ2h0LGFyZ3M6W3IubGlnaHRdfSk7dmFyIGE9e30scz1bXTtkaWZmU291cmNlcyhlLnNvdXJjZXMsci5zb3VyY2VzLHMsYSk7dmFyIHQ9W107ZS5sYXllcnMmJmUubGF5ZXJzLmZvckVhY2goZnVuY3Rpb24oZSl7YVtlLnNvdXJjZV0/by5wdXNoKHtjb21tYW5kOm9wZXJhdGlvbnMucmVtb3ZlTGF5ZXIsYXJnczpbZS5pZF19KTp0LnB1c2goZSl9KSxvPW8uY29uY2F0KHMpLGRpZmZMYXllcnModCxyLmxheWVycyxvKX1jYXRjaChlKXtjb25zb2xlLndhcm4oXCJVbmFibGUgdG8gY29tcHV0ZSBzdHlsZSBkaWZmOlwiLGUpLG89W3tjb21tYW5kOm9wZXJhdGlvbnMuc2V0U3R5bGUsYXJnczpbcl19XX1yZXR1cm4gb312YXIgaXNFcXVhbD1fZGVyZXFfKFwibG9kYXNoLmlzZXF1YWxcIiksb3BlcmF0aW9ucz17c2V0U3R5bGU6XCJzZXRTdHlsZVwiLGFkZExheWVyOlwiYWRkTGF5ZXJcIixyZW1vdmVMYXllcjpcInJlbW92ZUxheWVyXCIsc2V0UGFpbnRQcm9wZXJ0eTpcInNldFBhaW50UHJvcGVydHlcIixzZXRMYXlvdXRQcm9wZXJ0eTpcInNldExheW91dFByb3BlcnR5XCIsc2V0RmlsdGVyOlwic2V0RmlsdGVyXCIsYWRkU291cmNlOlwiYWRkU291cmNlXCIscmVtb3ZlU291cmNlOlwicmVtb3ZlU291cmNlXCIsc2V0TGF5ZXJab29tUmFuZ2U6XCJzZXRMYXllclpvb21SYW5nZVwiLHNldExheWVyUHJvcGVydHk6XCJzZXRMYXllclByb3BlcnR5XCIsc2V0Q2VudGVyOlwic2V0Q2VudGVyXCIsc2V0Wm9vbTpcInNldFpvb21cIixzZXRCZWFyaW5nOlwic2V0QmVhcmluZ1wiLHNldFBpdGNoOlwic2V0UGl0Y2hcIixzZXRTcHJpdGU6XCJzZXRTcHJpdGVcIixzZXRHbHlwaHM6XCJzZXRHbHlwaHNcIixzZXRUcmFuc2l0aW9uOlwic2V0VHJhbnNpdGlvblwiLHNldExpZ2h0Olwic2V0TGlnaHRcIn07bW9kdWxlLmV4cG9ydHM9ZGlmZlN0eWxlcyxtb2R1bGUuZXhwb3J0cy5vcGVyYXRpb25zPW9wZXJhdGlvbnM7XG59LHtcImxvZGFzaC5pc2VxdWFsXCI6MTE2fV0sMTA0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIFZhbGlkYXRpb25FcnJvcihyLGkpe3RoaXMubWVzc2FnZT0ocj9yK1wiOiBcIjpcIlwiKStmb3JtYXQuYXBwbHkoZm9ybWF0LEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKSksbnVsbCE9PWkmJnZvaWQgMCE9PWkmJmkuX19saW5lX18mJih0aGlzLmxpbmU9aS5fX2xpbmVfXyl9dmFyIGZvcm1hdD1fZGVyZXFfKFwidXRpbFwiKS5mb3JtYXQ7bW9kdWxlLmV4cG9ydHM9VmFsaWRhdGlvbkVycm9yO1xufSx7XCJ1dGlsXCI6MzN9XSwxMDU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gY3JlYXRlRmlsdGVyKGUpe3JldHVybiBuZXcgRnVuY3Rpb24oXCJmXCIsXCJ2YXIgcCA9IChmICYmIGYucHJvcGVydGllcyB8fCB7fSk7IHJldHVybiBcIitjb21waWxlKGUpKX1mdW5jdGlvbiBjb21waWxlKGUpe2lmKCFlKXJldHVyblwidHJ1ZVwiO3ZhciBpPWVbMF07aWYoZS5sZW5ndGg8PTEpcmV0dXJuXCJhbnlcIj09PWk/XCJmYWxzZVwiOlwidHJ1ZVwiO3ZhciBuPVwiPT1cIj09PWk/Y29tcGlsZUNvbXBhcmlzb25PcChlWzFdLGVbMl0sXCI9PT1cIiwhMSk6XCIhPVwiPT09aT9jb21waWxlQ29tcGFyaXNvbk9wKGVbMV0sZVsyXSxcIiE9PVwiLCExKTpcIjxcIj09PWl8fFwiPlwiPT09aXx8XCI8PVwiPT09aXx8XCI+PVwiPT09aT9jb21waWxlQ29tcGFyaXNvbk9wKGVbMV0sZVsyXSxpLCEwKTpcImFueVwiPT09aT9jb21waWxlTG9naWNhbE9wKGUuc2xpY2UoMSksXCJ8fFwiKTpcImFsbFwiPT09aT9jb21waWxlTG9naWNhbE9wKGUuc2xpY2UoMSksXCImJlwiKTpcIm5vbmVcIj09PWk/Y29tcGlsZU5lZ2F0aW9uKGNvbXBpbGVMb2dpY2FsT3AoZS5zbGljZSgxKSxcInx8XCIpKTpcImluXCI9PT1pP2NvbXBpbGVJbk9wKGVbMV0sZS5zbGljZSgyKSk6XCIhaW5cIj09PWk/Y29tcGlsZU5lZ2F0aW9uKGNvbXBpbGVJbk9wKGVbMV0sZS5zbGljZSgyKSkpOlwiaGFzXCI9PT1pP2NvbXBpbGVIYXNPcChlWzFdKTpcIiFoYXNcIj09PWk/Y29tcGlsZU5lZ2F0aW9uKGNvbXBpbGVIYXNPcChlWzFdKSk6XCJ0cnVlXCI7cmV0dXJuXCIoXCIrbitcIilcIn1mdW5jdGlvbiBjb21waWxlUHJvcGVydHlSZWZlcmVuY2UoZSl7cmV0dXJuXCIkdHlwZVwiPT09ZT9cImYudHlwZVwiOlwiJGlkXCI9PT1lP1wiZi5pZFwiOlwicFtcIitKU09OLnN0cmluZ2lmeShlKStcIl1cIn1mdW5jdGlvbiBjb21waWxlQ29tcGFyaXNvbk9wKGUsaSxuLHIpe3ZhciBvPWNvbXBpbGVQcm9wZXJ0eVJlZmVyZW5jZShlKSx0PVwiJHR5cGVcIj09PWU/dHlwZXMuaW5kZXhPZihpKTpKU09OLnN0cmluZ2lmeShpKTtyZXR1cm4ocj9cInR5cGVvZiBcIitvK1wiPT09IHR5cGVvZiBcIit0K1wiJiZcIjpcIlwiKStvK24rdH1mdW5jdGlvbiBjb21waWxlTG9naWNhbE9wKGUsaSl7cmV0dXJuIGUubWFwKGNvbXBpbGUpLmpvaW4oaSl9ZnVuY3Rpb24gY29tcGlsZUluT3AoZSxpKXtcIiR0eXBlXCI9PT1lJiYoaT1pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gdHlwZXMuaW5kZXhPZihlKX0pKTt2YXIgbj1KU09OLnN0cmluZ2lmeShpLnNvcnQoY29tcGFyZSkpLHI9Y29tcGlsZVByb3BlcnR5UmVmZXJlbmNlKGUpO3JldHVybiBpLmxlbmd0aDw9MjAwP24rXCIuaW5kZXhPZihcIityK1wiKSAhPT0gLTFcIjpcImZ1bmN0aW9uKHYsIGEsIGksIGopIHt3aGlsZSAoaSA8PSBqKSB7IHZhciBtID0gKGkgKyBqKSA+PiAxOyAgICBpZiAoYVttXSA9PT0gdikgcmV0dXJuIHRydWU7IGlmIChhW21dID4gdikgaiA9IG0gLSAxOyBlbHNlIGkgPSBtICsgMTt9cmV0dXJuIGZhbHNlOyB9KFwiK3IrXCIsIFwiK24rXCIsMCxcIisoaS5sZW5ndGgtMSkrXCIpXCJ9ZnVuY3Rpb24gY29tcGlsZUhhc09wKGUpe3JldHVyblwiJGlkXCI9PT1lPydcImlkXCIgaW4gZic6SlNPTi5zdHJpbmdpZnkoZSkrXCIgaW4gcFwifWZ1bmN0aW9uIGNvbXBpbGVOZWdhdGlvbihlKXtyZXR1cm5cIiEoXCIrZStcIilcIn1mdW5jdGlvbiBjb21wYXJlKGUsaSl7cmV0dXJuIGU8aT8tMTplPmk/MTowfW1vZHVsZS5leHBvcnRzPWNyZWF0ZUZpbHRlcjt2YXIgdHlwZXM9W1wiVW5rbm93blwiLFwiUG9pbnRcIixcIkxpbmVTdHJpbmdcIixcIlBvbHlnb25cIl07XG59LHt9XSwxMDY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24geHl6MmxhYihyKXtyZXR1cm4gcj50Mz9NYXRoLnBvdyhyLDEvMyk6ci90Mit0MH1mdW5jdGlvbiBsYWIyeHl6KHIpe3JldHVybiByPnQxP3IqcipyOnQyKihyLXQwKX1mdW5jdGlvbiB4eXoycmdiKHIpe3JldHVybiAyNTUqKHI8PS4wMDMxMzA4PzEyLjkyKnI6MS4wNTUqTWF0aC5wb3cociwxLzIuNCktLjA1NSl9ZnVuY3Rpb24gcmdiMnh5eihyKXtyZXR1cm4gci89MjU1LHI8PS4wNDA0NT9yLzEyLjkyOk1hdGgucG93KChyKy4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gcmdiVG9MYWIocil7dmFyIHQ9cmdiMnh5eihyWzBdKSxhPXJnYjJ4eXooclsxXSksbj1yZ2IyeHl6KHJbMl0pLGI9eHl6MmxhYigoLjQxMjQ1NjQqdCsuMzU3NTc2MSphKy4xODA0Mzc1Km4pL1huKSxvPXh5ejJsYWIoKC4yMTI2NzI5KnQrLjcxNTE1MjIqYSsuMDcyMTc1Km4pL1luKSxnPXh5ejJsYWIoKC4wMTkzMzM5KnQrLjExOTE5MiphKy45NTAzMDQxKm4pL1puKTtyZXR1cm5bMTE2Km8tMTYsNTAwKihiLW8pLDIwMCooby1nKSxyWzNdXX1mdW5jdGlvbiBsYWJUb1JnYihyKXt2YXIgdD0oclswXSsxNikvMTE2LGE9aXNOYU4oclsxXSk/dDp0K3JbMV0vNTAwLG49aXNOYU4oclsyXSk/dDp0LXJbMl0vMjAwO3JldHVybiB0PVluKmxhYjJ4eXoodCksYT1YbipsYWIyeHl6KGEpLG49Wm4qbGFiMnh5eihuKSxbeHl6MnJnYigzLjI0MDQ1NDIqYS0xLjUzNzEzODUqdC0uNDk4NTMxNCpuKSx4eXoycmdiKC0uOTY5MjY2KmErMS44NzYwMTA4KnQrLjA0MTU1NipuKSx4eXoycmdiKC4wNTU2NDM0KmEtLjIwNDAyNTkqdCsxLjA1NzIyNTIqbiksclszXV19ZnVuY3Rpb24gcmdiVG9IY2wocil7dmFyIHQ9cmdiVG9MYWIociksYT10WzBdLG49dFsxXSxiPXRbMl0sbz1NYXRoLmF0YW4yKGIsbikqcmFkMmRlZztyZXR1cm5bbzwwP28rMzYwOm8sTWF0aC5zcXJ0KG4qbitiKmIpLGEsclszXV19ZnVuY3Rpb24gaGNsVG9SZ2Iocil7dmFyIHQ9clswXSpkZWcycmFkLGE9clsxXSxuPXJbMl07cmV0dXJuIGxhYlRvUmdiKFtuLE1hdGguY29zKHQpKmEsTWF0aC5zaW4odCkqYSxyWzNdXSl9dmFyIFhuPS45NTA0NyxZbj0xLFpuPTEuMDg4ODMsdDA9NC8yOSx0MT02LzI5LHQyPTMqdDEqdDEsdDM9dDEqdDEqdDEsZGVnMnJhZD1NYXRoLlBJLzE4MCxyYWQyZGVnPTE4MC9NYXRoLlBJO21vZHVsZS5leHBvcnRzPXtsYWI6e2ZvcndhcmQ6cmdiVG9MYWIscmV2ZXJzZTpsYWJUb1JnYn0saGNsOntmb3J3YXJkOnJnYlRvSGNsLHJldmVyc2U6aGNsVG9SZ2J9fTtcbn0se31dLDEwNzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBpZGVudGl0eUZ1bmN0aW9uKHQpe3JldHVybiB0fWZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uKHQsZSl7dmFyIG8sbj1cImNvbG9yXCI9PT1lLnR5cGU7aWYoaXNGdW5jdGlvbkRlZmluaXRpb24odCkpe3ZhciByPXQuc3RvcHMmJlwib2JqZWN0XCI9PXR5cGVvZiB0LnN0b3BzWzBdWzBdLGE9cnx8dm9pZCAwIT09dC5wcm9wZXJ0eSxpPXJ8fCFhLHM9dC50eXBlfHwoXCJpbnRlcnBvbGF0ZWRcIj09PWUuZnVuY3Rpb24/XCJleHBvbmVudGlhbFwiOlwiaW50ZXJ2YWxcIik7biYmKHQ9ZXh0ZW5kKHt9LHQpLHQuc3RvcHMmJih0LnN0b3BzPXQuc3RvcHMubWFwKGZ1bmN0aW9uKHQpe3JldHVyblt0WzBdLHBhcnNlQ29sb3IodFsxXSldfSkpLHQuZGVmYXVsdD90LmRlZmF1bHQ9cGFyc2VDb2xvcih0LmRlZmF1bHQpOnQuZGVmYXVsdD1wYXJzZUNvbG9yKGUuZGVmYXVsdCkpO3ZhciB1LHAsbDtpZihcImV4cG9uZW50aWFsXCI9PT1zKXU9ZXZhbHVhdGVFeHBvbmVudGlhbEZ1bmN0aW9uO2Vsc2UgaWYoXCJpbnRlcnZhbFwiPT09cyl1PWV2YWx1YXRlSW50ZXJ2YWxGdW5jdGlvbjtlbHNlIGlmKFwiY2F0ZWdvcmljYWxcIj09PXMpe3U9ZXZhbHVhdGVDYXRlZ29yaWNhbEZ1bmN0aW9uLHA9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IodmFyIGM9MCxmPXQuc3RvcHM7YzxmLmxlbmd0aDtjKz0xKXt2YXIgZD1mW2NdO3BbZFswXV09ZFsxXX1sPXR5cGVvZiB0LnN0b3BzWzBdWzBdfWVsc2V7aWYoXCJpZGVudGl0eVwiIT09cyl0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZnVuY3Rpb24gdHlwZSBcIicrcysnXCInKTt1PWV2YWx1YXRlSWRlbnRpdHlGdW5jdGlvbn12YXIgdjtpZih0LmNvbG9yU3BhY2UmJlwicmdiXCIhPT10LmNvbG9yU3BhY2Upe2lmKCFjb2xvclNwYWNlc1t0LmNvbG9yU3BhY2VdKXRocm93IG5ldyBFcnJvcihcIlVua25vd24gY29sb3Igc3BhY2U6IFwiK3QuY29sb3JTcGFjZSk7dmFyIHk9Y29sb3JTcGFjZXNbdC5jb2xvclNwYWNlXTt0PUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodCkpO2Zvcih2YXIgRj0wO0Y8dC5zdG9wcy5sZW5ndGg7RisrKXQuc3RvcHNbRl09W3Quc3RvcHNbRl1bMF0seS5mb3J3YXJkKHQuc3RvcHNbRl1bMV0pXTt2PXkucmV2ZXJzZX1lbHNlIHY9aWRlbnRpdHlGdW5jdGlvbjtpZihyKXtmb3IodmFyIGg9e30sZz1bXSxDPTA7Qzx0LnN0b3BzLmxlbmd0aDtDKyspe3ZhciBtPXQuc3RvcHNbQ10sUz1tWzBdLnpvb207dm9pZCAwPT09aFtTXSYmKGhbU109e3pvb206Uyx0eXBlOnQudHlwZSxwcm9wZXJ0eTp0LnByb3BlcnR5LGRlZmF1bHQ6dC5kZWZhdWx0LHN0b3BzOltdfSxnLnB1c2goUykpLGhbU10uc3RvcHMucHVzaChbbVswXS52YWx1ZSxtWzFdXSl9Zm9yKHZhciBUPVtdLHg9MCxiPWc7eDxiLmxlbmd0aDt4Kz0xKXt2YXIgcT1iW3hdO1QucHVzaChbaFtxXS56b29tLGNyZWF0ZUZ1bmN0aW9uKGhbcV0sZSldKX1vPWZ1bmN0aW9uKG8sbil7cmV0dXJuIHYoZXZhbHVhdGVFeHBvbmVudGlhbEZ1bmN0aW9uKHtzdG9wczpULGJhc2U6dC5iYXNlfSxlLG8pKG8sbikpfSxvLmlzRmVhdHVyZUNvbnN0YW50PSExLG8uaXNab29tQ29uc3RhbnQ9ITF9ZWxzZSBpPyhvPWZ1bmN0aW9uKG8pe3JldHVybiB2KHUodCxlLG8scCxsKSl9LG8uaXNGZWF0dXJlQ29uc3RhbnQ9ITAsby5pc1pvb21Db25zdGFudD0hMSk6KG89ZnVuY3Rpb24obyxuKXt2YXIgcj1uW3QucHJvcGVydHldO3JldHVybiB2b2lkIDA9PT1yP2NvYWxlc2NlKHQuZGVmYXVsdCxlLmRlZmF1bHQpOnYodSh0LGUscixwLGwpKX0sby5pc0ZlYXR1cmVDb25zdGFudD0hMSxvLmlzWm9vbUNvbnN0YW50PSEwKX1lbHNlIG4mJnQmJih0PXBhcnNlQ29sb3IodCkpLG89ZnVuY3Rpb24oKXtyZXR1cm4gdH0sby5pc0ZlYXR1cmVDb25zdGFudD0hMCxvLmlzWm9vbUNvbnN0YW50PSEwO3JldHVybiBvfWZ1bmN0aW9uIGNvYWxlc2NlKHQsZSxvKXtyZXR1cm4gdm9pZCAwIT09dD90OnZvaWQgMCE9PWU/ZTp2b2lkIDAhPT1vP286dm9pZCAwfWZ1bmN0aW9uIGV2YWx1YXRlQ2F0ZWdvcmljYWxGdW5jdGlvbih0LGUsbyxuLHIpe3ZhciBhPXR5cGVvZiBvPT09cj9uW29dOnZvaWQgMDtyZXR1cm4gY29hbGVzY2UoYSx0LmRlZmF1bHQsZS5kZWZhdWx0KX1mdW5jdGlvbiBldmFsdWF0ZUludGVydmFsRnVuY3Rpb24odCxlLG8pe2lmKFwibnVtYmVyXCIhPT1nZXRUeXBlKG8pKXJldHVybiBjb2FsZXNjZSh0LmRlZmF1bHQsZS5kZWZhdWx0KTt2YXIgbj10LnN0b3BzLmxlbmd0aDtpZigxPT09bilyZXR1cm4gdC5zdG9wc1swXVsxXTtpZihvPD10LnN0b3BzWzBdWzBdKXJldHVybiB0LnN0b3BzWzBdWzFdO2lmKG8+PXQuc3RvcHNbbi0xXVswXSlyZXR1cm4gdC5zdG9wc1tuLTFdWzFdO3ZhciByPWZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG8odC5zdG9wcyxvKTtyZXR1cm4gdC5zdG9wc1tyXVsxXX1mdW5jdGlvbiBldmFsdWF0ZUV4cG9uZW50aWFsRnVuY3Rpb24odCxlLG8pe3ZhciBuPXZvaWQgMCE9PXQuYmFzZT90LmJhc2U6MTtpZihcIm51bWJlclwiIT09Z2V0VHlwZShvKSlyZXR1cm4gY29hbGVzY2UodC5kZWZhdWx0LGUuZGVmYXVsdCk7dmFyIHI9dC5zdG9wcy5sZW5ndGg7aWYoMT09PXIpcmV0dXJuIHQuc3RvcHNbMF1bMV07aWYobzw9dC5zdG9wc1swXVswXSlyZXR1cm4gdC5zdG9wc1swXVsxXTtpZihvPj10LnN0b3BzW3ItMV1bMF0pcmV0dXJuIHQuc3RvcHNbci0xXVsxXTt2YXIgYT1maW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvKHQuc3RvcHMsbyksaT1pbnRlcnBvbGF0aW9uRmFjdG9yKG8sbix0LnN0b3BzW2FdWzBdLHQuc3RvcHNbYSsxXVswXSkscz10LnN0b3BzW2FdWzFdLHU9dC5zdG9wc1thKzFdWzFdLHA9aW50ZXJwb2xhdGVbZS50eXBlXXx8aWRlbnRpdHlGdW5jdGlvbjtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiBzP2Z1bmN0aW9uKCl7dmFyIHQ9cy5hcHBseSh2b2lkIDAsYXJndW1lbnRzKSxlPXUuYXBwbHkodm9pZCAwLGFyZ3VtZW50cyk7aWYodm9pZCAwIT09dCYmdm9pZCAwIT09ZSlyZXR1cm4gcCh0LGUsaSl9OnAocyx1LGkpfWZ1bmN0aW9uIGV2YWx1YXRlSWRlbnRpdHlGdW5jdGlvbih0LGUsbyl7cmV0dXJuXCJjb2xvclwiPT09ZS50eXBlP289cGFyc2VDb2xvcihvKTpnZXRUeXBlKG8pIT09ZS50eXBlJiYobz12b2lkIDApLGNvYWxlc2NlKG8sdC5kZWZhdWx0LGUuZGVmYXVsdCl9ZnVuY3Rpb24gZmluZFN0b3BMZXNzVGhhbk9yRXF1YWxUbyh0LGUpe2Zvcih2YXIgbyxuLHI9dC5sZW5ndGgsYT0wLGk9ci0xLHM9MDthPD1pOyl7aWYocz1NYXRoLmZsb29yKChhK2kpLzIpLG89dFtzXVswXSxuPXRbcysxXVswXSxlPT09b3x8ZT5vJiZlPG4pcmV0dXJuIHM7bzxlP2E9cysxOm8+ZSYmKGk9cy0xKX1yZXR1cm4gTWF0aC5tYXgocy0xLDApfWZ1bmN0aW9uIGlzRnVuY3Rpb25EZWZpbml0aW9uKHQpe3JldHVyblwib2JqZWN0XCI9PXR5cGVvZiB0JiYodC5zdG9wc3x8XCJpZGVudGl0eVwiPT09dC50eXBlKX1mdW5jdGlvbiBpbnRlcnBvbGF0aW9uRmFjdG9yKHQsZSxvLG4pe3ZhciByPW4tbyxhPXQtbztyZXR1cm4gMT09PWU/YS9yOihNYXRoLnBvdyhlLGEpLTEpLyhNYXRoLnBvdyhlLHIpLTEpfXZhciBjb2xvclNwYWNlcz1fZGVyZXFfKFwiLi9jb2xvcl9zcGFjZXNcIikscGFyc2VDb2xvcj1fZGVyZXFfKFwiLi4vdXRpbC9wYXJzZV9jb2xvclwiKSxleHRlbmQ9X2RlcmVxXyhcIi4uL3V0aWwvZXh0ZW5kXCIpLGdldFR5cGU9X2RlcmVxXyhcIi4uL3V0aWwvZ2V0X3R5cGVcIiksaW50ZXJwb2xhdGU9X2RlcmVxXyhcIi4uL3V0aWwvaW50ZXJwb2xhdGVcIik7bW9kdWxlLmV4cG9ydHM9Y3JlYXRlRnVuY3Rpb24sbW9kdWxlLmV4cG9ydHMuaXNGdW5jdGlvbkRlZmluaXRpb249aXNGdW5jdGlvbkRlZmluaXRpb24sbW9kdWxlLmV4cG9ydHMuaW50ZXJwb2xhdGlvbkZhY3Rvcj1pbnRlcnBvbGF0aW9uRmFjdG9yLG1vZHVsZS5leHBvcnRzLmZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG89ZmluZFN0b3BMZXNzVGhhbk9yRXF1YWxUbztcbn0se1wiLi4vdXRpbC9leHRlbmRcIjoxMjEsXCIuLi91dGlsL2dldF90eXBlXCI6MTIyLFwiLi4vdXRpbC9pbnRlcnBvbGF0ZVwiOjEyMyxcIi4uL3V0aWwvcGFyc2VfY29sb3JcIjoxMjQsXCIuL2NvbG9yX3NwYWNlc1wiOjEwNn1dLDEwODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBrZXkocil7cmV0dXJuIHN0cmluZ2lmeShyZWZQcm9wZXJ0aWVzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gcltlXX0pKX1mdW5jdGlvbiBncm91cEJ5TGF5b3V0KHIpe2Zvcih2YXIgZT17fSx0PTA7dDxyLmxlbmd0aDt0Kyspe3ZhciBpPWtleShyW3RdKSx1PWVbaV07dXx8KHU9ZVtpXT1bXSksdS5wdXNoKHJbdF0pfXZhciBuPVtdO2Zvcih2YXIgbyBpbiBlKW4ucHVzaChlW29dKTtyZXR1cm4gbn12YXIgcmVmUHJvcGVydGllcz1fZGVyZXFfKFwiLi91dGlsL3JlZl9wcm9wZXJ0aWVzXCIpLHN0cmluZ2lmeT1fZGVyZXFfKFwiZmFzdC1zdGFibGUtc3RyaW5naWZ5XCIpO21vZHVsZS5leHBvcnRzPWdyb3VwQnlMYXlvdXQ7XG59LHtcIi4vdXRpbC9yZWZfcHJvcGVydGllc1wiOjEyNSxcImZhc3Qtc3RhYmxlLXN0cmluZ2lmeVwiOjExMH1dLDEwOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5mdW5jdGlvbiBjbGFtcF9jc3NfYnl0ZShlKXtyZXR1cm4gZT1NYXRoLnJvdW5kKGUpLGU8MD8wOmU+MjU1PzI1NTplfWZ1bmN0aW9uIGNsYW1wX2Nzc19mbG9hdChlKXtyZXR1cm4gZTwwPzA6ZT4xPzE6ZX1mdW5jdGlvbiBwYXJzZV9jc3NfaW50KGUpe3JldHVybiBjbGFtcF9jc3NfYnl0ZShcIiVcIj09PWVbZS5sZW5ndGgtMV0/cGFyc2VGbG9hdChlKS8xMDAqMjU1OnBhcnNlSW50KGUpKX1mdW5jdGlvbiBwYXJzZV9jc3NfZmxvYXQoZSl7cmV0dXJuIGNsYW1wX2Nzc19mbG9hdChcIiVcIj09PWVbZS5sZW5ndGgtMV0/cGFyc2VGbG9hdChlKS8xMDA6cGFyc2VGbG9hdChlKSl9ZnVuY3Rpb24gY3NzX2h1ZV90b19yZ2IoZSxyLGwpe3JldHVybiBsPDA/bCs9MTpsPjEmJihsLT0xKSw2Kmw8MT9lKyhyLWUpKmwqNjoyKmw8MT9yOjMqbDwyP2UrKHItZSkqKDIvMy1sKSo2OmV9ZnVuY3Rpb24gcGFyc2VDU1NDb2xvcihlKXt2YXIgcj1lLnJlcGxhY2UoLyAvZyxcIlwiKS50b0xvd2VyQ2FzZSgpO2lmKHIgaW4ga0NTU0NvbG9yVGFibGUpcmV0dXJuIGtDU1NDb2xvclRhYmxlW3JdLnNsaWNlKCk7aWYoXCIjXCI9PT1yWzBdKXtpZig0PT09ci5sZW5ndGgpe3ZhciBsPXBhcnNlSW50KHIuc3Vic3RyKDEpLDE2KTtyZXR1cm4gbD49MCYmbDw9NDA5NT9bKDM4NDAmbCk+PjR8KDM4NDAmbCk+PjgsMjQwJmx8KDI0MCZsKT4+NCwxNSZsfCgxNSZsKTw8NCwxXTpudWxsfWlmKDc9PT1yLmxlbmd0aCl7dmFyIGw9cGFyc2VJbnQoci5zdWJzdHIoMSksMTYpO3JldHVybiBsPj0wJiZsPD0xNjc3NzIxNT9bKDE2NzExNjgwJmwpPj4xNiwoNjUyODAmbCk+PjgsMjU1JmwsMV06bnVsbH1yZXR1cm4gbnVsbH12YXIgYT1yLmluZGV4T2YoXCIoXCIpLHQ9ci5pbmRleE9mKFwiKVwiKTtpZihhIT09LTEmJnQrMT09PXIubGVuZ3RoKXt2YXIgbj1yLnN1YnN0cigwLGEpLHM9ci5zdWJzdHIoYSsxLHQtKGErMSkpLnNwbGl0KFwiLFwiKSxvPTE7c3dpdGNoKG4pe2Nhc2VcInJnYmFcIjppZig0IT09cy5sZW5ndGgpcmV0dXJuIG51bGw7bz1wYXJzZV9jc3NfZmxvYXQocy5wb3AoKSk7Y2FzZVwicmdiXCI6cmV0dXJuIDMhPT1zLmxlbmd0aD9udWxsOltwYXJzZV9jc3NfaW50KHNbMF0pLHBhcnNlX2Nzc19pbnQoc1sxXSkscGFyc2VfY3NzX2ludChzWzJdKSxvXTtjYXNlXCJoc2xhXCI6aWYoNCE9PXMubGVuZ3RoKXJldHVybiBudWxsO289cGFyc2VfY3NzX2Zsb2F0KHMucG9wKCkpO2Nhc2VcImhzbFwiOmlmKDMhPT1zLmxlbmd0aClyZXR1cm4gbnVsbDt2YXIgaT0ocGFyc2VGbG9hdChzWzBdKSUzNjArMzYwKSUzNjAvMzYwLHU9cGFyc2VfY3NzX2Zsb2F0KHNbMV0pLGc9cGFyc2VfY3NzX2Zsb2F0KHNbMl0pLGQ9Zzw9LjU/ZyoodSsxKTpnK3UtZyp1LGM9MipnLWQ7cmV0dXJuW2NsYW1wX2Nzc19ieXRlKDI1NSpjc3NfaHVlX3RvX3JnYihjLGQsaSsxLzMpKSxjbGFtcF9jc3NfYnl0ZSgyNTUqY3NzX2h1ZV90b19yZ2IoYyxkLGkpKSxjbGFtcF9jc3NfYnl0ZSgyNTUqY3NzX2h1ZV90b19yZ2IoYyxkLGktMS8zKSksb107ZGVmYXVsdDpyZXR1cm4gbnVsbH19cmV0dXJuIG51bGx9dmFyIGtDU1NDb2xvclRhYmxlPXt0cmFuc3BhcmVudDpbMCwwLDAsMF0sYWxpY2VibHVlOlsyNDAsMjQ4LDI1NSwxXSxhbnRpcXVld2hpdGU6WzI1MCwyMzUsMjE1LDFdLGFxdWE6WzAsMjU1LDI1NSwxXSxhcXVhbWFyaW5lOlsxMjcsMjU1LDIxMiwxXSxhenVyZTpbMjQwLDI1NSwyNTUsMV0sYmVpZ2U6WzI0NSwyNDUsMjIwLDFdLGJpc3F1ZTpbMjU1LDIyOCwxOTYsMV0sYmxhY2s6WzAsMCwwLDFdLGJsYW5jaGVkYWxtb25kOlsyNTUsMjM1LDIwNSwxXSxibHVlOlswLDAsMjU1LDFdLGJsdWV2aW9sZXQ6WzEzOCw0MywyMjYsMV0sYnJvd246WzE2NSw0Miw0MiwxXSxidXJseXdvb2Q6WzIyMiwxODQsMTM1LDFdLGNhZGV0Ymx1ZTpbOTUsMTU4LDE2MCwxXSxjaGFydHJldXNlOlsxMjcsMjU1LDAsMV0sY2hvY29sYXRlOlsyMTAsMTA1LDMwLDFdLGNvcmFsOlsyNTUsMTI3LDgwLDFdLGNvcm5mbG93ZXJibHVlOlsxMDAsMTQ5LDIzNywxXSxjb3Juc2lsazpbMjU1LDI0OCwyMjAsMV0sY3JpbXNvbjpbMjIwLDIwLDYwLDFdLGN5YW46WzAsMjU1LDI1NSwxXSxkYXJrYmx1ZTpbMCwwLDEzOSwxXSxkYXJrY3lhbjpbMCwxMzksMTM5LDFdLGRhcmtnb2xkZW5yb2Q6WzE4NCwxMzQsMTEsMV0sZGFya2dyYXk6WzE2OSwxNjksMTY5LDFdLGRhcmtncmVlbjpbMCwxMDAsMCwxXSxkYXJrZ3JleTpbMTY5LDE2OSwxNjksMV0sZGFya2toYWtpOlsxODksMTgzLDEwNywxXSxkYXJrbWFnZW50YTpbMTM5LDAsMTM5LDFdLGRhcmtvbGl2ZWdyZWVuOls4NSwxMDcsNDcsMV0sZGFya29yYW5nZTpbMjU1LDE0MCwwLDFdLGRhcmtvcmNoaWQ6WzE1Myw1MCwyMDQsMV0sZGFya3JlZDpbMTM5LDAsMCwxXSxkYXJrc2FsbW9uOlsyMzMsMTUwLDEyMiwxXSxkYXJrc2VhZ3JlZW46WzE0MywxODgsMTQzLDFdLGRhcmtzbGF0ZWJsdWU6WzcyLDYxLDEzOSwxXSxkYXJrc2xhdGVncmF5Ols0Nyw3OSw3OSwxXSxkYXJrc2xhdGVncmV5Ols0Nyw3OSw3OSwxXSxkYXJrdHVycXVvaXNlOlswLDIwNiwyMDksMV0sZGFya3Zpb2xldDpbMTQ4LDAsMjExLDFdLGRlZXBwaW5rOlsyNTUsMjAsMTQ3LDFdLGRlZXBza3libHVlOlswLDE5MSwyNTUsMV0sZGltZ3JheTpbMTA1LDEwNSwxMDUsMV0sZGltZ3JleTpbMTA1LDEwNSwxMDUsMV0sZG9kZ2VyYmx1ZTpbMzAsMTQ0LDI1NSwxXSxmaXJlYnJpY2s6WzE3OCwzNCwzNCwxXSxmbG9yYWx3aGl0ZTpbMjU1LDI1MCwyNDAsMV0sZm9yZXN0Z3JlZW46WzM0LDEzOSwzNCwxXSxmdWNoc2lhOlsyNTUsMCwyNTUsMV0sZ2FpbnNib3JvOlsyMjAsMjIwLDIyMCwxXSxnaG9zdHdoaXRlOlsyNDgsMjQ4LDI1NSwxXSxnb2xkOlsyNTUsMjE1LDAsMV0sZ29sZGVucm9kOlsyMTgsMTY1LDMyLDFdLGdyYXk6WzEyOCwxMjgsMTI4LDFdLGdyZWVuOlswLDEyOCwwLDFdLGdyZWVueWVsbG93OlsxNzMsMjU1LDQ3LDFdLGdyZXk6WzEyOCwxMjgsMTI4LDFdLGhvbmV5ZGV3OlsyNDAsMjU1LDI0MCwxXSxob3RwaW5rOlsyNTUsMTA1LDE4MCwxXSxpbmRpYW5yZWQ6WzIwNSw5Miw5MiwxXSxpbmRpZ286Wzc1LDAsMTMwLDFdLGl2b3J5OlsyNTUsMjU1LDI0MCwxXSxraGFraTpbMjQwLDIzMCwxNDAsMV0sbGF2ZW5kZXI6WzIzMCwyMzAsMjUwLDFdLGxhdmVuZGVyYmx1c2g6WzI1NSwyNDAsMjQ1LDFdLGxhd25ncmVlbjpbMTI0LDI1MiwwLDFdLGxlbW9uY2hpZmZvbjpbMjU1LDI1MCwyMDUsMV0sbGlnaHRibHVlOlsxNzMsMjE2LDIzMCwxXSxsaWdodGNvcmFsOlsyNDAsMTI4LDEyOCwxXSxsaWdodGN5YW46WzIyNCwyNTUsMjU1LDFdLGxpZ2h0Z29sZGVucm9keWVsbG93OlsyNTAsMjUwLDIxMCwxXSxsaWdodGdyYXk6WzIxMSwyMTEsMjExLDFdLGxpZ2h0Z3JlZW46WzE0NCwyMzgsMTQ0LDFdLGxpZ2h0Z3JleTpbMjExLDIxMSwyMTEsMV0sbGlnaHRwaW5rOlsyNTUsMTgyLDE5MywxXSxsaWdodHNhbG1vbjpbMjU1LDE2MCwxMjIsMV0sbGlnaHRzZWFncmVlbjpbMzIsMTc4LDE3MCwxXSxsaWdodHNreWJsdWU6WzEzNSwyMDYsMjUwLDFdLGxpZ2h0c2xhdGVncmF5OlsxMTksMTM2LDE1MywxXSxsaWdodHNsYXRlZ3JleTpbMTE5LDEzNiwxNTMsMV0sbGlnaHRzdGVlbGJsdWU6WzE3NiwxOTYsMjIyLDFdLGxpZ2h0eWVsbG93OlsyNTUsMjU1LDIyNCwxXSxsaW1lOlswLDI1NSwwLDFdLGxpbWVncmVlbjpbNTAsMjA1LDUwLDFdLGxpbmVuOlsyNTAsMjQwLDIzMCwxXSxtYWdlbnRhOlsyNTUsMCwyNTUsMV0sbWFyb29uOlsxMjgsMCwwLDFdLG1lZGl1bWFxdWFtYXJpbmU6WzEwMiwyMDUsMTcwLDFdLG1lZGl1bWJsdWU6WzAsMCwyMDUsMV0sbWVkaXVtb3JjaGlkOlsxODYsODUsMjExLDFdLG1lZGl1bXB1cnBsZTpbMTQ3LDExMiwyMTksMV0sbWVkaXVtc2VhZ3JlZW46WzYwLDE3OSwxMTMsMV0sbWVkaXVtc2xhdGVibHVlOlsxMjMsMTA0LDIzOCwxXSxtZWRpdW1zcHJpbmdncmVlbjpbMCwyNTAsMTU0LDFdLG1lZGl1bXR1cnF1b2lzZTpbNzIsMjA5LDIwNCwxXSxtZWRpdW12aW9sZXRyZWQ6WzE5OSwyMSwxMzMsMV0sbWlkbmlnaHRibHVlOlsyNSwyNSwxMTIsMV0sbWludGNyZWFtOlsyNDUsMjU1LDI1MCwxXSxtaXN0eXJvc2U6WzI1NSwyMjgsMjI1LDFdLG1vY2Nhc2luOlsyNTUsMjI4LDE4MSwxXSxuYXZham93aGl0ZTpbMjU1LDIyMiwxNzMsMV0sbmF2eTpbMCwwLDEyOCwxXSxvbGRsYWNlOlsyNTMsMjQ1LDIzMCwxXSxvbGl2ZTpbMTI4LDEyOCwwLDFdLG9saXZlZHJhYjpbMTA3LDE0MiwzNSwxXSxvcmFuZ2U6WzI1NSwxNjUsMCwxXSxvcmFuZ2VyZWQ6WzI1NSw2OSwwLDFdLG9yY2hpZDpbMjE4LDExMiwyMTQsMV0scGFsZWdvbGRlbnJvZDpbMjM4LDIzMiwxNzAsMV0scGFsZWdyZWVuOlsxNTIsMjUxLDE1MiwxXSxwYWxldHVycXVvaXNlOlsxNzUsMjM4LDIzOCwxXSxwYWxldmlvbGV0cmVkOlsyMTksMTEyLDE0NywxXSxwYXBheWF3aGlwOlsyNTUsMjM5LDIxMywxXSxwZWFjaHB1ZmY6WzI1NSwyMTgsMTg1LDFdLHBlcnU6WzIwNSwxMzMsNjMsMV0scGluazpbMjU1LDE5MiwyMDMsMV0scGx1bTpbMjIxLDE2MCwyMjEsMV0scG93ZGVyYmx1ZTpbMTc2LDIyNCwyMzAsMV0scHVycGxlOlsxMjgsMCwxMjgsMV0scmViZWNjYXB1cnBsZTpbMTAyLDUxLDE1MywxXSxyZWQ6WzI1NSwwLDAsMV0scm9zeWJyb3duOlsxODgsMTQzLDE0MywxXSxyb3lhbGJsdWU6WzY1LDEwNSwyMjUsMV0sc2FkZGxlYnJvd246WzEzOSw2OSwxOSwxXSxzYWxtb246WzI1MCwxMjgsMTE0LDFdLHNhbmR5YnJvd246WzI0NCwxNjQsOTYsMV0sc2VhZ3JlZW46WzQ2LDEzOSw4NywxXSxzZWFzaGVsbDpbMjU1LDI0NSwyMzgsMV0sc2llbm5hOlsxNjAsODIsNDUsMV0sc2lsdmVyOlsxOTIsMTkyLDE5MiwxXSxza3libHVlOlsxMzUsMjA2LDIzNSwxXSxzbGF0ZWJsdWU6WzEwNiw5MCwyMDUsMV0sc2xhdGVncmF5OlsxMTIsMTI4LDE0NCwxXSxzbGF0ZWdyZXk6WzExMiwxMjgsMTQ0LDFdLHNub3c6WzI1NSwyNTAsMjUwLDFdLHNwcmluZ2dyZWVuOlswLDI1NSwxMjcsMV0sc3RlZWxibHVlOls3MCwxMzAsMTgwLDFdLHRhbjpbMjEwLDE4MCwxNDAsMV0sdGVhbDpbMCwxMjgsMTI4LDFdLHRoaXN0bGU6WzIxNiwxOTEsMjE2LDFdLHRvbWF0bzpbMjU1LDk5LDcxLDFdLHR1cnF1b2lzZTpbNjQsMjI0LDIwOCwxXSx2aW9sZXQ6WzIzOCwxMzAsMjM4LDFdLHdoZWF0OlsyNDUsMjIyLDE3OSwxXSx3aGl0ZTpbMjU1LDI1NSwyNTUsMV0sd2hpdGVzbW9rZTpbMjQ1LDI0NSwyNDUsMV0seWVsbG93OlsyNTUsMjU1LDAsMV0seWVsbG93Z3JlZW46WzE1NCwyMDUsNTAsMV19O3RyeXtleHBvcnRzLnBhcnNlQ1NTQ29sb3I9cGFyc2VDU1NDb2xvcn1jYXRjaChlKXt9XG59LHt9XSwxMTA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuZnVuY3Rpb24gc3NzKHIpe3ZhciBlLHQscyxuLHUsYTtzd2l0Y2godHlwZW9mIHIpe2Nhc2VcIm9iamVjdFwiOmlmKG51bGw9PT1yKXJldHVybiBudWxsO2lmKGlzQXJyYXkocikpe2ZvcihzPVwiW1wiLHQ9ci5sZW5ndGgtMSxlPTA7ZTx0O2UrKylzKz1zc3MocltlXSkrXCIsXCI7cmV0dXJuIHQ+LTEmJihzKz1zc3MocltlXSkpLHMrXCJdXCJ9Zm9yKG49b2JqS2V5cyhyKS5zb3J0KCksdD1uLmxlbmd0aCxzPVwie1wiLHU9bltlPTBdLGE9dD4wJiZ2b2lkIDAhPT1yW3VdO2U8dDspYT8ocys9J1wiJyt1LnJlcGxhY2Uoc3RyUmVnLHN0clJlcGxhY2UpKydcIjonK3NzcyhyW3VdKSx1PW5bKytlXSxhPWU8dCYmdm9pZCAwIT09clt1XSxhJiYocys9XCIsXCIpKToodT1uWysrZV0sYT1lPHQmJnZvaWQgMCE9PXJbdV0pO3JldHVybiBzK1wifVwiO2Nhc2VcInVuZGVmaW5lZFwiOnJldHVybiBudWxsO2Nhc2VcInN0cmluZ1wiOnJldHVybidcIicrci5yZXBsYWNlKHN0clJlZyxzdHJSZXBsYWNlKSsnXCInO2RlZmF1bHQ6cmV0dXJuIHJ9fXZhciB0b1N0cmluZz17fS50b1N0cmluZyxpc0FycmF5PUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKHIpe3JldHVyblwiW29iamVjdCBBcnJheV1cIj09PXRvU3RyaW5nLmNhbGwocil9LG9iaktleXM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHIpe3ZhciBlPVtdO2Zvcih2YXIgdCBpbiByKXIuaGFzT3duUHJvcGVydHkodCkmJmUucHVzaCh0KTtyZXR1cm4gZX0sc3RyUmVnPS9bXFx1MDAwMC1cXHUwMDFmXCJcXFxcXS9nLHN0clJlcGxhY2U9ZnVuY3Rpb24ocil7dmFyIGU9ci5jaGFyQ29kZUF0KDApO3N3aXRjaChlKXtjYXNlIDM0OnJldHVybidcXFxcXCInO2Nhc2UgOTI6cmV0dXJuXCJcXFxcXFxcXFwiO2Nhc2UgMTI6cmV0dXJuXCJcXFxcZlwiO2Nhc2UgMTA6cmV0dXJuXCJcXFxcblwiO2Nhc2UgMTM6cmV0dXJuXCJcXFxcclwiO2Nhc2UgOTpyZXR1cm5cIlxcXFx0XCI7Y2FzZSA4OnJldHVyblwiXFxcXGJcIjtkZWZhdWx0OnJldHVybiBlPjE1P1wiXFxcXHUwMFwiK2UudG9TdHJpbmcoMTYpOlwiXFxcXHUwMDBcIitlLnRvU3RyaW5nKDE2KX19O21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHIpe2lmKHZvaWQgMCE9PXIpcmV0dXJuXCJcIitzc3Mocil9LG1vZHVsZS5leHBvcnRzLnN0cmluZ1NlYXJjaD1zdHJSZWcsbW9kdWxlLmV4cG9ydHMuc3RyaW5nUmVwbGFjZT1zdHJSZXBsYWNlO1xufSx7fV0sMTExOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZShyKXtyZXR1cm4hIXImJlwib2JqZWN0XCI9PXR5cGVvZiByfWZ1bmN0aW9uIGFycmF5U29tZShyLGUpe2Zvcih2YXIgYT0tMSx0PXIubGVuZ3RoOysrYTx0OylpZihlKHJbYV0sYSxyKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBiYXNlSXNFcXVhbChyLGUsYSx0LG8sbil7cmV0dXJuIHI9PT1lfHwobnVsbD09cnx8bnVsbD09ZXx8IWlzT2JqZWN0KHIpJiYhaXNPYmplY3RMaWtlKGUpP3IhPT1yJiZlIT09ZTpiYXNlSXNFcXVhbERlZXAocixlLGJhc2VJc0VxdWFsLGEsdCxvLG4pKX1mdW5jdGlvbiBiYXNlSXNFcXVhbERlZXAocixlLGEsdCxvLG4sdSl7dmFyIGM9aXNBcnJheShyKSxzPWlzQXJyYXkoZSksaT1hcnJheVRhZyxnPWFycmF5VGFnO2N8fChpPW9ialRvU3RyaW5nLmNhbGwociksaT09YXJnc1RhZz9pPW9iamVjdFRhZzppIT1vYmplY3RUYWcmJihjPWlzVHlwZWRBcnJheShyKSkpLHN8fChnPW9ialRvU3RyaW5nLmNhbGwoZSksZz09YXJnc1RhZz9nPW9iamVjdFRhZzpnIT1vYmplY3RUYWcmJihzPWlzVHlwZWRBcnJheShlKSkpO3ZhciBiPWk9PW9iamVjdFRhZyxsPWc9PW9iamVjdFRhZyxmPWk9PWc7aWYoZiYmIWMmJiFiKXJldHVybiBlcXVhbEJ5VGFnKHIsZSxpKTtpZighbyl7dmFyIHk9YiYmaGFzT3duUHJvcGVydHkuY2FsbChyLFwiX193cmFwcGVkX19cIiksVD1sJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKGUsXCJfX3dyYXBwZWRfX1wiKTtpZih5fHxUKXJldHVybiBhKHk/ci52YWx1ZSgpOnIsVD9lLnZhbHVlKCk6ZSx0LG8sbix1KX1pZighZilyZXR1cm4hMTtufHwobj1bXSksdXx8KHU9W10pO2Zvcih2YXIgaj1uLmxlbmd0aDtqLS07KWlmKG5bal09PXIpcmV0dXJuIHVbal09PWU7bi5wdXNoKHIpLHUucHVzaChlKTt2YXIgcD0oYz9lcXVhbEFycmF5czplcXVhbE9iamVjdHMpKHIsZSxhLHQsbyxuLHUpO3JldHVybiBuLnBvcCgpLHUucG9wKCkscH1mdW5jdGlvbiBlcXVhbEFycmF5cyhyLGUsYSx0LG8sbix1KXt2YXIgYz0tMSxzPXIubGVuZ3RoLGk9ZS5sZW5ndGg7aWYocyE9aSYmIShvJiZpPnMpKXJldHVybiExO2Zvcig7KytjPHM7KXt2YXIgZz1yW2NdLGI9ZVtjXSxsPXQ/dChvP2I6ZyxvP2c6YixjKTp2b2lkIDA7aWYodm9pZCAwIT09bCl7aWYobCljb250aW51ZTtyZXR1cm4hMX1pZihvKXtpZighYXJyYXlTb21lKGUsZnVuY3Rpb24ocil7cmV0dXJuIGc9PT1yfHxhKGcscix0LG8sbix1KX0pKXJldHVybiExfWVsc2UgaWYoZyE9PWImJiFhKGcsYix0LG8sbix1KSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBlcXVhbEJ5VGFnKHIsZSxhKXtzd2l0Y2goYSl7Y2FzZSBib29sVGFnOmNhc2UgZGF0ZVRhZzpyZXR1cm4rcj09K2U7Y2FzZSBlcnJvclRhZzpyZXR1cm4gci5uYW1lPT1lLm5hbWUmJnIubWVzc2FnZT09ZS5tZXNzYWdlO2Nhc2UgbnVtYmVyVGFnOnJldHVybiByIT0rcj9lIT0rZTpyPT0rZTtjYXNlIHJlZ2V4cFRhZzpjYXNlIHN0cmluZ1RhZzpyZXR1cm4gcj09ZStcIlwifXJldHVybiExfWZ1bmN0aW9uIGVxdWFsT2JqZWN0cyhyLGUsYSx0LG8sbix1KXt2YXIgYz1rZXlzKHIpLHM9Yy5sZW5ndGgsaT1rZXlzKGUpLGc9aS5sZW5ndGg7aWYocyE9ZyYmIW8pcmV0dXJuITE7Zm9yKHZhciBiPXM7Yi0tOyl7dmFyIGw9Y1tiXTtpZighKG8/bCBpbiBlOmhhc093blByb3BlcnR5LmNhbGwoZSxsKSkpcmV0dXJuITF9Zm9yKHZhciBmPW87KytiPHM7KXtsPWNbYl07dmFyIHk9cltsXSxUPWVbbF0saj10P3Qobz9UOnksbz95OlQsbCk6dm9pZCAwO2lmKCEodm9pZCAwPT09aj9hKHksVCx0LG8sbix1KTpqKSlyZXR1cm4hMTtmfHwoZj1cImNvbnN0cnVjdG9yXCI9PWwpfWlmKCFmKXt2YXIgcD1yLmNvbnN0cnVjdG9yLHY9ZS5jb25zdHJ1Y3RvcjtpZihwIT12JiZcImNvbnN0cnVjdG9yXCJpbiByJiZcImNvbnN0cnVjdG9yXCJpbiBlJiYhKFwiZnVuY3Rpb25cIj09dHlwZW9mIHAmJnAgaW5zdGFuY2VvZiBwJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiB2JiZ2IGluc3RhbmNlb2YgdikpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gaXNPYmplY3Qocil7dmFyIGU9dHlwZW9mIHI7cmV0dXJuISFyJiYoXCJvYmplY3RcIj09ZXx8XCJmdW5jdGlvblwiPT1lKX12YXIgaXNBcnJheT1fZGVyZXFfKFwibG9kYXNoLmlzYXJyYXlcIiksaXNUeXBlZEFycmF5PV9kZXJlcV8oXCJsb2Rhc2guaXN0eXBlZGFycmF5XCIpLGtleXM9X2RlcmVxXyhcImxvZGFzaC5rZXlzXCIpLGFyZ3NUYWc9XCJbb2JqZWN0IEFyZ3VtZW50c11cIixhcnJheVRhZz1cIltvYmplY3QgQXJyYXldXCIsYm9vbFRhZz1cIltvYmplY3QgQm9vbGVhbl1cIixkYXRlVGFnPVwiW29iamVjdCBEYXRlXVwiLGVycm9yVGFnPVwiW29iamVjdCBFcnJvcl1cIixudW1iZXJUYWc9XCJbb2JqZWN0IE51bWJlcl1cIixvYmplY3RUYWc9XCJbb2JqZWN0IE9iamVjdF1cIixyZWdleHBUYWc9XCJbb2JqZWN0IFJlZ0V4cF1cIixzdHJpbmdUYWc9XCJbb2JqZWN0IFN0cmluZ11cIixvYmplY3RQcm90bz1PYmplY3QucHJvdG90eXBlLGhhc093blByb3BlcnR5PW9iamVjdFByb3RvLmhhc093blByb3BlcnR5LG9ialRvU3RyaW5nPW9iamVjdFByb3RvLnRvU3RyaW5nO21vZHVsZS5leHBvcnRzPWJhc2VJc0VxdWFsO1xufSx7XCJsb2Rhc2guaXNhcnJheVwiOjExNSxcImxvZGFzaC5pc3R5cGVkYXJyYXlcIjoxMTcsXCJsb2Rhc2gua2V5c1wiOjExOH1dLDExMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5mdW5jdGlvbiBiaW5kQ2FsbGJhY2sobix0LHIpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIG4pcmV0dXJuIGlkZW50aXR5O2lmKHZvaWQgMD09PXQpcmV0dXJuIG47c3dpdGNoKHIpe2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIG4uY2FsbCh0LHIpfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKHIsZSx1KXtyZXR1cm4gbi5jYWxsKHQscixlLHUpfTtjYXNlIDQ6cmV0dXJuIGZ1bmN0aW9uKHIsZSx1LGMpe3JldHVybiBuLmNhbGwodCxyLGUsdSxjKX07Y2FzZSA1OnJldHVybiBmdW5jdGlvbihyLGUsdSxjLGkpe3JldHVybiBuLmNhbGwodCxyLGUsdSxjLGkpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbi5hcHBseSh0LGFyZ3VtZW50cyl9fWZ1bmN0aW9uIGlkZW50aXR5KG4pe3JldHVybiBufW1vZHVsZS5leHBvcnRzPWJpbmRDYWxsYmFjaztcbn0se31dLDExMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5mdW5jdGlvbiBpc09iamVjdExpa2UodCl7cmV0dXJuISF0JiZcIm9iamVjdFwiPT10eXBlb2YgdH1mdW5jdGlvbiBnZXROYXRpdmUodCxvKXt2YXIgZT1udWxsPT10P3ZvaWQgMDp0W29dO3JldHVybiBpc05hdGl2ZShlKT9lOnZvaWQgMH1mdW5jdGlvbiBpc0Z1bmN0aW9uKHQpe3JldHVybiBpc09iamVjdCh0KSYmb2JqVG9TdHJpbmcuY2FsbCh0KT09ZnVuY1RhZ31mdW5jdGlvbiBpc09iamVjdCh0KXt2YXIgbz10eXBlb2YgdDtyZXR1cm4hIXQmJihcIm9iamVjdFwiPT1vfHxcImZ1bmN0aW9uXCI9PW8pfWZ1bmN0aW9uIGlzTmF0aXZlKHQpe3JldHVybiBudWxsIT10JiYoaXNGdW5jdGlvbih0KT9yZUlzTmF0aXZlLnRlc3QoZm5Ub1N0cmluZy5jYWxsKHQpKTppc09iamVjdExpa2UodCkmJnJlSXNIb3N0Q3Rvci50ZXN0KHQpKX12YXIgZnVuY1RhZz1cIltvYmplY3QgRnVuY3Rpb25dXCIscmVJc0hvc3RDdG9yPS9eXFxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXFxdJC8sb2JqZWN0UHJvdG89T2JqZWN0LnByb3RvdHlwZSxmblRvU3RyaW5nPUZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyxoYXNPd25Qcm9wZXJ0eT1vYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eSxvYmpUb1N0cmluZz1vYmplY3RQcm90by50b1N0cmluZyxyZUlzTmF0aXZlPVJlZ0V4cChcIl5cIitmblRvU3RyaW5nLmNhbGwoaGFzT3duUHJvcGVydHkpLnJlcGxhY2UoL1tcXFxcXiQuKis/KClbXFxde318XS9nLFwiXFxcXCQmXCIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csXCIkMS4qP1wiKStcIiRcIik7bW9kdWxlLmV4cG9ydHM9Z2V0TmF0aXZlO1xufSx7fV0sMTE0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmZ1bmN0aW9uIGlzQXJndW1lbnRzKHQpe3JldHVybiBpc0FycmF5TGlrZU9iamVjdCh0KSYmaGFzT3duUHJvcGVydHkuY2FsbCh0LFwiY2FsbGVlXCIpJiYoIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodCxcImNhbGxlZVwiKXx8b2JqZWN0VG9TdHJpbmcuY2FsbCh0KT09YXJnc1RhZyl9ZnVuY3Rpb24gaXNBcnJheUxpa2UodCl7cmV0dXJuIG51bGwhPXQmJmlzTGVuZ3RoKHQubGVuZ3RoKSYmIWlzRnVuY3Rpb24odCl9ZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodCl7cmV0dXJuIGlzT2JqZWN0TGlrZSh0KSYmaXNBcnJheUxpa2UodCl9ZnVuY3Rpb24gaXNGdW5jdGlvbih0KXt2YXIgZT1pc09iamVjdCh0KT9vYmplY3RUb1N0cmluZy5jYWxsKHQpOlwiXCI7cmV0dXJuIGU9PWZ1bmNUYWd8fGU9PWdlblRhZ31mdW5jdGlvbiBpc0xlbmd0aCh0KXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgdCYmdD4tMSYmdCUxPT0wJiZ0PD1NQVhfU0FGRV9JTlRFR0VSfWZ1bmN0aW9uIGlzT2JqZWN0KHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiEhdCYmKFwib2JqZWN0XCI9PWV8fFwiZnVuY3Rpb25cIj09ZSl9ZnVuY3Rpb24gaXNPYmplY3RMaWtlKHQpe3JldHVybiEhdCYmXCJvYmplY3RcIj09dHlwZW9mIHR9dmFyIE1BWF9TQUZFX0lOVEVHRVI9OTAwNzE5OTI1NDc0MDk5MSxhcmdzVGFnPVwiW29iamVjdCBBcmd1bWVudHNdXCIsZnVuY1RhZz1cIltvYmplY3QgRnVuY3Rpb25dXCIsZ2VuVGFnPVwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl1cIixvYmplY3RQcm90bz1PYmplY3QucHJvdG90eXBlLGhhc093blByb3BlcnR5PW9iamVjdFByb3RvLmhhc093blByb3BlcnR5LG9iamVjdFRvU3RyaW5nPW9iamVjdFByb3RvLnRvU3RyaW5nLHByb3BlcnR5SXNFbnVtZXJhYmxlPW9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlO21vZHVsZS5leHBvcnRzPWlzQXJndW1lbnRzO1xufSx7fV0sMTE1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh0KXtyZXR1cm4hIXQmJlwib2JqZWN0XCI9PXR5cGVvZiB0fWZ1bmN0aW9uIGdldE5hdGl2ZSh0LHIpe3ZhciBlPW51bGw9PXQ/dm9pZCAwOnRbcl07cmV0dXJuIGlzTmF0aXZlKGUpP2U6dm9pZCAwfWZ1bmN0aW9uIGlzTGVuZ3RoKHQpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiB0JiZ0Pi0xJiZ0JTE9PTAmJnQ8PU1BWF9TQUZFX0lOVEVHRVJ9ZnVuY3Rpb24gaXNGdW5jdGlvbih0KXtyZXR1cm4gaXNPYmplY3QodCkmJm9ialRvU3RyaW5nLmNhbGwodCk9PWZ1bmNUYWd9ZnVuY3Rpb24gaXNPYmplY3QodCl7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuISF0JiYoXCJvYmplY3RcIj09cnx8XCJmdW5jdGlvblwiPT1yKX1mdW5jdGlvbiBpc05hdGl2ZSh0KXtyZXR1cm4gbnVsbCE9dCYmKGlzRnVuY3Rpb24odCk/cmVJc05hdGl2ZS50ZXN0KGZuVG9TdHJpbmcuY2FsbCh0KSk6aXNPYmplY3RMaWtlKHQpJiZyZUlzSG9zdEN0b3IudGVzdCh0KSl9dmFyIGFycmF5VGFnPVwiW29iamVjdCBBcnJheV1cIixmdW5jVGFnPVwiW29iamVjdCBGdW5jdGlvbl1cIixyZUlzSG9zdEN0b3I9L15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLyxvYmplY3RQcm90bz1PYmplY3QucHJvdG90eXBlLGZuVG9TdHJpbmc9RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLGhhc093blByb3BlcnR5PW9iamVjdFByb3RvLmhhc093blByb3BlcnR5LG9ialRvU3RyaW5nPW9iamVjdFByb3RvLnRvU3RyaW5nLHJlSXNOYXRpdmU9UmVnRXhwKFwiXlwiK2ZuVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSkucmVwbGFjZSgvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2csXCJcXFxcJCZcIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXFxcXCgpfCBmb3IgLis/KD89XFxcXFxcXSkvZyxcIiQxLio/XCIpK1wiJFwiKSxuYXRpdmVJc0FycmF5PWdldE5hdGl2ZShBcnJheSxcImlzQXJyYXlcIiksTUFYX1NBRkVfSU5URUdFUj05MDA3MTk5MjU0NzQwOTkxLGlzQXJyYXk9bmF0aXZlSXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIGlzT2JqZWN0TGlrZSh0KSYmaXNMZW5ndGgodC5sZW5ndGgpJiZvYmpUb1N0cmluZy5jYWxsKHQpPT1hcnJheVRhZ307bW9kdWxlLmV4cG9ydHM9aXNBcnJheTtcbn0se31dLDExNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5mdW5jdGlvbiBpc0VxdWFsKGEsbCxpLGUpe2k9XCJmdW5jdGlvblwiPT10eXBlb2YgaT9iaW5kQ2FsbGJhY2soaSxlLDMpOnZvaWQgMDt2YXIgcz1pP2koYSxsKTp2b2lkIDA7cmV0dXJuIHZvaWQgMD09PXM/YmFzZUlzRXF1YWwoYSxsLGkpOiEhc312YXIgYmFzZUlzRXF1YWw9X2RlcmVxXyhcImxvZGFzaC5fYmFzZWlzZXF1YWxcIiksYmluZENhbGxiYWNrPV9kZXJlcV8oXCJsb2Rhc2guX2JpbmRjYWxsYmFja1wiKTttb2R1bGUuZXhwb3J0cz1pc0VxdWFsO1xufSx7XCJsb2Rhc2guX2Jhc2Vpc2VxdWFsXCI6MTExLFwibG9kYXNoLl9iaW5kY2FsbGJhY2tcIjoxMTJ9XSwxMTc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuZnVuY3Rpb24gaXNMZW5ndGgoYSl7cmV0dXJuXCJudW1iZXJcIj09dHlwZW9mIGEmJmE+LTEmJmElMT09MCYmYTw9TUFYX1NBRkVfSU5URUdFUn1mdW5jdGlvbiBpc09iamVjdExpa2UoYSl7cmV0dXJuISFhJiZcIm9iamVjdFwiPT10eXBlb2YgYX1mdW5jdGlvbiBpc1R5cGVkQXJyYXkoYSl7cmV0dXJuIGlzT2JqZWN0TGlrZShhKSYmaXNMZW5ndGgoYS5sZW5ndGgpJiYhIXR5cGVkQXJyYXlUYWdzW29iamVjdFRvU3RyaW5nLmNhbGwoYSldfXZhciBNQVhfU0FGRV9JTlRFR0VSPTkwMDcxOTkyNTQ3NDA5OTEsYXJnc1RhZz1cIltvYmplY3QgQXJndW1lbnRzXVwiLGFycmF5VGFnPVwiW29iamVjdCBBcnJheV1cIixib29sVGFnPVwiW29iamVjdCBCb29sZWFuXVwiLGRhdGVUYWc9XCJbb2JqZWN0IERhdGVdXCIsZXJyb3JUYWc9XCJbb2JqZWN0IEVycm9yXVwiLGZ1bmNUYWc9XCJbb2JqZWN0IEZ1bmN0aW9uXVwiLG1hcFRhZz1cIltvYmplY3QgTWFwXVwiLG51bWJlclRhZz1cIltvYmplY3QgTnVtYmVyXVwiLG9iamVjdFRhZz1cIltvYmplY3QgT2JqZWN0XVwiLHJlZ2V4cFRhZz1cIltvYmplY3QgUmVnRXhwXVwiLHNldFRhZz1cIltvYmplY3QgU2V0XVwiLHN0cmluZ1RhZz1cIltvYmplY3QgU3RyaW5nXVwiLHdlYWtNYXBUYWc9XCJbb2JqZWN0IFdlYWtNYXBdXCIsYXJyYXlCdWZmZXJUYWc9XCJbb2JqZWN0IEFycmF5QnVmZmVyXVwiLGRhdGFWaWV3VGFnPVwiW29iamVjdCBEYXRhVmlld11cIixmbG9hdDMyVGFnPVwiW29iamVjdCBGbG9hdDMyQXJyYXldXCIsZmxvYXQ2NFRhZz1cIltvYmplY3QgRmxvYXQ2NEFycmF5XVwiLGludDhUYWc9XCJbb2JqZWN0IEludDhBcnJheV1cIixpbnQxNlRhZz1cIltvYmplY3QgSW50MTZBcnJheV1cIixpbnQzMlRhZz1cIltvYmplY3QgSW50MzJBcnJheV1cIix1aW50OFRhZz1cIltvYmplY3QgVWludDhBcnJheV1cIix1aW50OENsYW1wZWRUYWc9XCJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XVwiLHVpbnQxNlRhZz1cIltvYmplY3QgVWludDE2QXJyYXldXCIsdWludDMyVGFnPVwiW29iamVjdCBVaW50MzJBcnJheV1cIix0eXBlZEFycmF5VGFncz17fTt0eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXT10eXBlZEFycmF5VGFnc1tmbG9hdDY0VGFnXT10eXBlZEFycmF5VGFnc1tpbnQ4VGFnXT10eXBlZEFycmF5VGFnc1tpbnQxNlRhZ109dHlwZWRBcnJheVRhZ3NbaW50MzJUYWddPXR5cGVkQXJyYXlUYWdzW3VpbnQ4VGFnXT10eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddPXR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ109dHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXT0hMCx0eXBlZEFycmF5VGFnc1thcmdzVGFnXT10eXBlZEFycmF5VGFnc1thcnJheVRhZ109dHlwZWRBcnJheVRhZ3NbYXJyYXlCdWZmZXJUYWddPXR5cGVkQXJyYXlUYWdzW2Jvb2xUYWddPXR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXT10eXBlZEFycmF5VGFnc1tkYXRlVGFnXT10eXBlZEFycmF5VGFnc1tlcnJvclRhZ109dHlwZWRBcnJheVRhZ3NbZnVuY1RhZ109dHlwZWRBcnJheVRhZ3NbbWFwVGFnXT10eXBlZEFycmF5VGFnc1tudW1iZXJUYWddPXR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ109dHlwZWRBcnJheVRhZ3NbcmVnZXhwVGFnXT10eXBlZEFycmF5VGFnc1tzZXRUYWddPXR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ109dHlwZWRBcnJheVRhZ3Nbd2Vha01hcFRhZ109ITE7dmFyIG9iamVjdFByb3RvPU9iamVjdC5wcm90b3R5cGUsb2JqZWN0VG9TdHJpbmc9b2JqZWN0UHJvdG8udG9TdHJpbmc7bW9kdWxlLmV4cG9ydHM9aXNUeXBlZEFycmF5O1xufSx7fV0sMTE4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbmZ1bmN0aW9uIGJhc2VQcm9wZXJ0eShlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwOnRbZV19fWZ1bmN0aW9uIGlzQXJyYXlMaWtlKGUpe3JldHVybiBudWxsIT1lJiZpc0xlbmd0aChnZXRMZW5ndGgoZSkpfWZ1bmN0aW9uIGlzSW5kZXgoZSx0KXtyZXR1cm4gZT1cIm51bWJlclwiPT10eXBlb2YgZXx8cmVJc1VpbnQudGVzdChlKT8rZTotMSx0PW51bGw9PXQ/TUFYX1NBRkVfSU5URUdFUjp0LGU+LTEmJmUlMT09MCYmZTx0fWZ1bmN0aW9uIGlzTGVuZ3RoKGUpe3JldHVyblwibnVtYmVyXCI9PXR5cGVvZiBlJiZlPi0xJiZlJTE9PTAmJmU8PU1BWF9TQUZFX0lOVEVHRVJ9ZnVuY3Rpb24gc2hpbUtleXMoZSl7Zm9yKHZhciB0PWtleXNJbihlKSxyPXQubGVuZ3RoLG49ciYmZS5sZW5ndGgscz0hIW4mJmlzTGVuZ3RoKG4pJiYoaXNBcnJheShlKXx8aXNBcmd1bWVudHMoZSkpLG89LTEsaT1bXTsrK288cjspe3ZhciB1PXRbb107KHMmJmlzSW5kZXgodSxuKXx8aGFzT3duUHJvcGVydHkuY2FsbChlLHUpKSYmaS5wdXNoKHUpfXJldHVybiBpfWZ1bmN0aW9uIGlzT2JqZWN0KGUpe3ZhciB0PXR5cGVvZiBlO3JldHVybiEhZSYmKFwib2JqZWN0XCI9PXR8fFwiZnVuY3Rpb25cIj09dCl9ZnVuY3Rpb24ga2V5c0luKGUpe2lmKG51bGw9PWUpcmV0dXJuW107aXNPYmplY3QoZSl8fChlPU9iamVjdChlKSk7dmFyIHQ9ZS5sZW5ndGg7dD10JiZpc0xlbmd0aCh0KSYmKGlzQXJyYXkoZSl8fGlzQXJndW1lbnRzKGUpKSYmdHx8MDtmb3IodmFyIHI9ZS5jb25zdHJ1Y3RvcixuPS0xLHM9XCJmdW5jdGlvblwiPT10eXBlb2YgciYmci5wcm90b3R5cGU9PT1lLG89QXJyYXkodCksaT10PjA7KytuPHQ7KW9bbl09bitcIlwiO2Zvcih2YXIgdSBpbiBlKWkmJmlzSW5kZXgodSx0KXx8XCJjb25zdHJ1Y3RvclwiPT11JiYoc3x8IWhhc093blByb3BlcnR5LmNhbGwoZSx1KSl8fG8ucHVzaCh1KTtyZXR1cm4gb312YXIgZ2V0TmF0aXZlPV9kZXJlcV8oXCJsb2Rhc2guX2dldG5hdGl2ZVwiKSxpc0FyZ3VtZW50cz1fZGVyZXFfKFwibG9kYXNoLmlzYXJndW1lbnRzXCIpLGlzQXJyYXk9X2RlcmVxXyhcImxvZGFzaC5pc2FycmF5XCIpLHJlSXNVaW50PS9eXFxkKyQvLG9iamVjdFByb3RvPU9iamVjdC5wcm90b3R5cGUsaGFzT3duUHJvcGVydHk9b2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHksbmF0aXZlS2V5cz1nZXROYXRpdmUoT2JqZWN0LFwia2V5c1wiKSxNQVhfU0FGRV9JTlRFR0VSPTkwMDcxOTkyNTQ3NDA5OTEsZ2V0TGVuZ3RoPWJhc2VQcm9wZXJ0eShcImxlbmd0aFwiKSxrZXlzPW5hdGl2ZUtleXM/ZnVuY3Rpb24oZSl7dmFyIHQ9bnVsbD09ZT92b2lkIDA6ZS5jb25zdHJ1Y3RvcjtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0JiZ0LnByb3RvdHlwZT09PWV8fFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUmJmlzQXJyYXlMaWtlKGUpP3NoaW1LZXlzKGUpOmlzT2JqZWN0KGUpP25hdGl2ZUtleXMoZSk6W119OnNoaW1LZXlzO21vZHVsZS5leHBvcnRzPWtleXM7XG59LHtcImxvZGFzaC5fZ2V0bmF0aXZlXCI6MTEzLFwibG9kYXNoLmlzYXJndW1lbnRzXCI6MTE0LFwibG9kYXNoLmlzYXJyYXlcIjoxMTV9XSwxMTk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7bW9kdWxlLmV4cG9ydHM9X2RlcmVxXyhcIi4vdjguanNvblwiKTtcbn0se1wiLi92OC5qc29uXCI6MTIwfV0sMTIwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbm1vZHVsZS5leHBvcnRzPXtcIiR2ZXJzaW9uXCI6OCxcIiRyb290XCI6e1widmVyc2lvblwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOls4XX0sXCJuYW1lXCI6e1widHlwZVwiOlwic3RyaW5nXCJ9LFwibWV0YWRhdGFcIjp7XCJ0eXBlXCI6XCIqXCJ9LFwiY2VudGVyXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIn0sXCJ6b29tXCI6e1widHlwZVwiOlwibnVtYmVyXCJ9LFwiYmVhcmluZ1wiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJwZXJpb2RcIjozNjAsXCJ1bml0c1wiOlwiZGVncmVlc1wifSxcInBpdGNoXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInVuaXRzXCI6XCJkZWdyZWVzXCJ9LFwibGlnaHRcIjp7XCJ0eXBlXCI6XCJsaWdodFwifSxcInNvdXJjZXNcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJzb3VyY2VzXCJ9LFwic3ByaXRlXCI6e1widHlwZVwiOlwic3RyaW5nXCJ9LFwiZ2x5cGhzXCI6e1widHlwZVwiOlwic3RyaW5nXCJ9LFwidHJhbnNpdGlvblwiOntcInR5cGVcIjpcInRyYW5zaXRpb25cIn0sXCJsYXllcnNcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcImxheWVyXCJ9fSxcInNvdXJjZXNcIjp7XCIqXCI6e1widHlwZVwiOlwic291cmNlXCJ9fSxcInNvdXJjZVwiOltcInNvdXJjZV90aWxlXCIsXCJzb3VyY2VfZ2VvanNvblwiLFwic291cmNlX3ZpZGVvXCIsXCJzb3VyY2VfaW1hZ2VcIixcInNvdXJjZV9jYW52YXNcIl0sXCJzb3VyY2VfdGlsZVwiOntcInR5cGVcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjp7XCJ2ZWN0b3JcIjp7fSxcInJhc3RlclwiOnt9fX0sXCJ1cmxcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIn0sXCJ0aWxlc1wiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwic3RyaW5nXCJ9LFwibWluem9vbVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjB9LFwibWF4em9vbVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjIyfSxcInRpbGVTaXplXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6NTEyLFwidW5pdHNcIjpcInBpeGVsc1wifSxcIipcIjp7XCJ0eXBlXCI6XCIqXCJ9fSxcInNvdXJjZV9nZW9qc29uXCI6e1widHlwZVwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOntcImdlb2pzb25cIjp7fX19LFwiZGF0YVwiOntcInR5cGVcIjpcIipcIn0sXCJtYXh6b29tXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MTh9LFwiYnVmZmVyXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MTI4LFwibWF4aW11bVwiOjUxMixcIm1pbmltdW1cIjowfSxcInRvbGVyYW5jZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAuMzc1fSxcImNsdXN0ZXJcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJkZWZhdWx0XCI6ZmFsc2V9LFwiY2x1c3RlclJhZGl1c1wiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjUwLFwibWluaW11bVwiOjB9LFwiY2x1c3Rlck1heFpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIn19LFwic291cmNlX3ZpZGVvXCI6e1widHlwZVwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOntcInZpZGVvXCI6e319fSxcInVybHNcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcInN0cmluZ1wifSxcImNvb3JkaW5hdGVzXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiYXJyYXlcIixcImxlbmd0aFwiOjQsXCJ2YWx1ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJsZW5ndGhcIjoyLFwidmFsdWVcIjpcIm51bWJlclwifX19LFwic291cmNlX2ltYWdlXCI6e1widHlwZVwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOntcImltYWdlXCI6e319fSxcInVybFwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcInN0cmluZ1wifSxcImNvb3JkaW5hdGVzXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiYXJyYXlcIixcImxlbmd0aFwiOjQsXCJ2YWx1ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJsZW5ndGhcIjoyLFwidmFsdWVcIjpcIm51bWJlclwifX19LFwic291cmNlX2NhbnZhc1wiOntcInR5cGVcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjp7XCJjYW52YXNcIjp7fX19LFwiY29vcmRpbmF0ZXNcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJhcnJheVwiLFwibGVuZ3RoXCI6NCxcInZhbHVlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcImxlbmd0aFwiOjIsXCJ2YWx1ZVwiOlwibnVtYmVyXCJ9fSxcImFuaW1hdGVcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJkZWZhdWx0XCI6XCJ0cnVlXCJ9LFwiY2FudmFzXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJyZXF1aXJlZFwiOnRydWV9fSxcImxheWVyXCI6e1wiaWRcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcInJlcXVpcmVkXCI6dHJ1ZX0sXCJ0eXBlXCI6e1widHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6e1wiZmlsbFwiOnt9LFwibGluZVwiOnt9LFwic3ltYm9sXCI6e30sXCJjaXJjbGVcIjp7fSxcImZpbGwtZXh0cnVzaW9uXCI6e30sXCJyYXN0ZXJcIjp7fSxcImJhY2tncm91bmRcIjp7fX19LFwibWV0YWRhdGFcIjp7XCJ0eXBlXCI6XCIqXCJ9LFwicmVmXCI6e1widHlwZVwiOlwic3RyaW5nXCJ9LFwic291cmNlXCI6e1widHlwZVwiOlwic3RyaW5nXCJ9LFwic291cmNlLWxheWVyXCI6e1widHlwZVwiOlwic3RyaW5nXCJ9LFwibWluem9vbVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MjR9LFwibWF4em9vbVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MjR9LFwiZmlsdGVyXCI6e1widHlwZVwiOlwiZmlsdGVyXCJ9LFwibGF5b3V0XCI6e1widHlwZVwiOlwibGF5b3V0XCJ9LFwicGFpbnRcIjp7XCJ0eXBlXCI6XCJwYWludFwifSxcInBhaW50LipcIjp7XCJ0eXBlXCI6XCJwYWludFwifX0sXCJsYXlvdXRcIjpbXCJsYXlvdXRfZmlsbFwiLFwibGF5b3V0X2xpbmVcIixcImxheW91dF9jaXJjbGVcIixcImxheW91dF9maWxsLWV4dHJ1c2lvblwiLFwibGF5b3V0X3N5bWJvbFwiLFwibGF5b3V0X3Jhc3RlclwiLFwibGF5b3V0X2JhY2tncm91bmRcIl0sXCJsYXlvdXRfYmFja2dyb3VuZFwiOntcInZpc2liaWxpdHlcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjp7XCJ2aXNpYmxlXCI6e30sXCJub25lXCI6e319LFwiZGVmYXVsdFwiOlwidmlzaWJsZVwifX0sXCJsYXlvdXRfZmlsbFwiOntcInZpc2liaWxpdHlcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjp7XCJ2aXNpYmxlXCI6e30sXCJub25lXCI6e319LFwiZGVmYXVsdFwiOlwidmlzaWJsZVwifX0sXCJsYXlvdXRfY2lyY2xlXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOntcInZpc2libGVcIjp7fSxcIm5vbmVcIjp7fX0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCJ9fSxcImxheW91dF9maWxsLWV4dHJ1c2lvblwiOntcInZpc2liaWxpdHlcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjp7XCJ2aXNpYmxlXCI6e30sXCJub25lXCI6e319LFwiZGVmYXVsdFwiOlwidmlzaWJsZVwifX0sXCJsYXlvdXRfbGluZVwiOntcImxpbmUtY2FwXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ2YWx1ZXNcIjp7XCJidXR0XCI6e30sXCJyb3VuZFwiOnt9LFwic3F1YXJlXCI6e319LFwiZGVmYXVsdFwiOlwiYnV0dFwifSxcImxpbmUtam9pblwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidmFsdWVzXCI6e1wiYmV2ZWxcIjp7fSxcInJvdW5kXCI6e30sXCJtaXRlclwiOnt9fSxcImRlZmF1bHRcIjpcIm1pdGVyXCJ9LFwibGluZS1taXRlci1saW1pdFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W3tcImxpbmUtam9pblwiOlwibWl0ZXJcIn1dfSxcImxpbmUtcm91bmQtbGltaXRcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxLjA1LFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOlt7XCJsaW5lLWpvaW5cIjpcInJvdW5kXCJ9XX0sXCJ2aXNpYmlsaXR5XCI6e1widHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6e1widmlzaWJsZVwiOnt9LFwibm9uZVwiOnt9fSxcImRlZmF1bHRcIjpcInZpc2libGVcIn19LFwibGF5b3V0X3N5bWJvbFwiOntcInN5bWJvbC1wbGFjZW1lbnRcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInZhbHVlc1wiOntcInBvaW50XCI6e30sXCJsaW5lXCI6e319LFwiZGVmYXVsdFwiOlwicG9pbnRcIn0sXCJzeW1ib2wtc3BhY2luZ1wiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjI1MCxcIm1pbmltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJyZXF1aXJlc1wiOlt7XCJzeW1ib2wtcGxhY2VtZW50XCI6XCJsaW5lXCJ9XX0sXCJzeW1ib2wtYXZvaWQtZWRnZXNcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcImRlZmF1bHRcIjpmYWxzZX0sXCJpY29uLWFsbG93LW92ZXJsYXBcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcImRlZmF1bHRcIjpmYWxzZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWlnbm9yZS1wbGFjZW1lbnRcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcImRlZmF1bHRcIjpmYWxzZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLW9wdGlvbmFsXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJkZWZhdWx0XCI6ZmFsc2UsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIixcInRleHQtZmllbGRcIl19LFwiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInZhbHVlc1wiOntcIm1hcFwiOnt9LFwidmlld3BvcnRcIjp7fSxcImF1dG9cIjp7fX0sXCJkZWZhdWx0XCI6XCJhdXRvXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1zaXplXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi10ZXh0LWZpdFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidmFsdWVzXCI6e1wibm9uZVwiOnt9LFwid2lkdGhcIjp7fSxcImhlaWdodFwiOnt9LFwiYm90aFwiOnt9fSxcImRlZmF1bHRcIjpcIm5vbmVcIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiLFwidGV4dC1maWVsZFwiXX0sXCJpY29uLXRleHQtZml0LXBhZGRpbmdcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwibGVuZ3RoXCI6NCxcImRlZmF1bHRcIjpbMCwwLDAsMF0sXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiLFwidGV4dC1maWVsZFwiLHtcImljb24tdGV4dC1maXRcIjpbXCJib3RoXCIsXCJ3aWR0aFwiLFwiaGVpZ2h0XCJdfV19LFwiaWNvbi1pbWFnZVwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0b2tlbnNcIjp0cnVlfSxcImljb24tcm90YXRlXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInBlcmlvZFwiOjM2MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwidW5pdHNcIjpcImRlZ3JlZXNcIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLXBhZGRpbmdcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoyLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWtlZXAtdXByaWdodFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwiZGVmYXVsdFwiOmZhbHNlLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCIse1wiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIjpcIm1hcFwifSx7XCJzeW1ib2wtcGxhY2VtZW50XCI6XCJsaW5lXCJ9XX0sXCJpY29uLW9mZnNldFwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjoyLFwiZGVmYXVsdFwiOlswLDBdLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwidGV4dC1waXRjaC1hbGlnbm1lbnRcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInZhbHVlc1wiOntcIm1hcFwiOnt9LFwidmlld3BvcnRcIjp7fSxcImF1dG9cIjp7fX0sXCJkZWZhdWx0XCI6XCJhdXRvXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInZhbHVlc1wiOntcIm1hcFwiOnt9LFwidmlld3BvcnRcIjp7fSxcImF1dG9cIjp7fX0sXCJkZWZhdWx0XCI6XCJhdXRvXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1maWVsZFwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJkZWZhdWx0XCI6XCJcIixcInRva2Vuc1wiOnRydWV9LFwidGV4dC1mb250XCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJzdHJpbmdcIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwiZGVmYXVsdFwiOltcIk9wZW4gU2FucyBSZWd1bGFyXCIsXCJBcmlhbCBVbmljb2RlIE1TIFJlZ3VsYXJcIl0sXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1zaXplXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MTYsXCJtaW5pbXVtXCI6MCxcInVuaXRzXCI6XCJwaXhlbHNcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtbWF4LXdpZHRoXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MTAsXCJtaW5pbXVtXCI6MCxcInVuaXRzXCI6XCJlbXNcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtbGluZS1oZWlnaHRcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxLjIsXCJ1bml0c1wiOlwiZW1zXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWxldHRlci1zcGFjaW5nXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInVuaXRzXCI6XCJlbXNcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtanVzdGlmeVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidmFsdWVzXCI6e1wibGVmdFwiOnt9LFwiY2VudGVyXCI6e30sXCJyaWdodFwiOnt9fSxcImRlZmF1bHRcIjpcImNlbnRlclwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtYW5jaG9yXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ2YWx1ZXNcIjp7XCJjZW50ZXJcIjp7fSxcImxlZnRcIjp7fSxcInJpZ2h0XCI6e30sXCJ0b3BcIjp7fSxcImJvdHRvbVwiOnt9LFwidG9wLWxlZnRcIjp7fSxcInRvcC1yaWdodFwiOnt9LFwiYm90dG9tLWxlZnRcIjp7fSxcImJvdHRvbS1yaWdodFwiOnt9fSxcImRlZmF1bHRcIjpcImNlbnRlclwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtbWF4LWFuZ2xlXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6NDUsXCJ1bml0c1wiOlwiZGVncmVlc1wiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIix7XCJzeW1ib2wtcGxhY2VtZW50XCI6XCJsaW5lXCJ9XX0sXCJ0ZXh0LXJvdGF0ZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJwZXJpb2RcIjozNjAsXCJ1bml0c1wiOlwiZGVncmVlc1wiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1wYWRkaW5nXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MixcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1rZWVwLXVwcmlnaHRcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcImRlZmF1bHRcIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCIse1widGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjpcIm1hcFwifSx7XCJzeW1ib2wtcGxhY2VtZW50XCI6XCJsaW5lXCJ9XX0sXCJ0ZXh0LXRyYW5zZm9ybVwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwidmFsdWVzXCI6e1wibm9uZVwiOnt9LFwidXBwZXJjYXNlXCI6e30sXCJsb3dlcmNhc2VcIjp7fX0sXCJkZWZhdWx0XCI6XCJub25lXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1vZmZzZXRcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwidW5pdHNcIjpcImVtc1wiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJsZW5ndGhcIjoyLFwiZGVmYXVsdFwiOlswLDBdLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtYWxsb3ctb3ZlcmxhcFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwiZGVmYXVsdFwiOmZhbHNlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtaWdub3JlLXBsYWNlbWVudFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwiZGVmYXVsdFwiOmZhbHNlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtb3B0aW9uYWxcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcImRlZmF1bHRcIjpmYWxzZSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiLFwiaWNvbi1pbWFnZVwiXX0sXCJ2aXNpYmlsaXR5XCI6e1widHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6e1widmlzaWJsZVwiOnt9LFwibm9uZVwiOnt9fSxcImRlZmF1bHRcIjpcInZpc2libGVcIn19LFwibGF5b3V0X3Jhc3RlclwiOntcInZpc2liaWxpdHlcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjp7XCJ2aXNpYmxlXCI6e30sXCJub25lXCI6e319LFwiZGVmYXVsdFwiOlwidmlzaWJsZVwifX0sXCJmaWx0ZXJcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIipcIn0sXCJmaWx0ZXJfb3BlcmF0b3JcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjp7XCI9PVwiOnt9LFwiIT1cIjp7fSxcIj5cIjp7fSxcIj49XCI6e30sXCI8XCI6e30sXCI8PVwiOnt9LFwiaW5cIjp7fSxcIiFpblwiOnt9LFwiYWxsXCI6e30sXCJhbnlcIjp7fSxcIm5vbmVcIjp7fSxcImhhc1wiOnt9LFwiIWhhc1wiOnt9fX0sXCJnZW9tZXRyeV90eXBlXCI6e1widHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6e1wiUG9pbnRcIjp7fSxcIkxpbmVTdHJpbmdcIjp7fSxcIlBvbHlnb25cIjp7fX19LFwiZnVuY3Rpb25cIjp7XCJzdG9wc1wiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwiZnVuY3Rpb25fc3RvcFwifSxcImJhc2VcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxLFwibWluaW11bVwiOjB9LFwicHJvcGVydHlcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImRlZmF1bHRcIjpcIiR6b29tXCJ9LFwidHlwZVwiOntcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOntcImlkZW50aXR5XCI6e30sXCJleHBvbmVudGlhbFwiOnt9LFwiaW50ZXJ2YWxcIjp7fSxcImNhdGVnb3JpY2FsXCI6e319LFwiZGVmYXVsdFwiOlwiZXhwb25lbnRpYWxcIn0sXCJjb2xvclNwYWNlXCI6e1widHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6e1wicmdiXCI6e30sXCJsYWJcIjp7fSxcImhjbFwiOnt9fSxcImRlZmF1bHRcIjpcInJnYlwifSxcImRlZmF1bHRcIjp7XCJ0eXBlXCI6XCIqXCIsXCJyZXF1aXJlZFwiOmZhbHNlfX0sXCJmdW5jdGlvbl9zdG9wXCI6e1widHlwZVwiOlwiYXJyYXlcIixcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjIyLFwidmFsdWVcIjpbXCJudW1iZXJcIixcImNvbG9yXCJdLFwibGVuZ3RoXCI6Mn0sXCJsaWdodFwiOntcImFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImRlZmF1bHRcIjpcInZpZXdwb3J0XCIsXCJ2YWx1ZXNcIjp7XCJtYXBcIjp7fSxcInZpZXdwb3J0XCI6e319LFwidHJhbnNpdGlvblwiOmZhbHNlfSxcInBvc2l0aW9uXCI6e1widHlwZVwiOlwiYXJyYXlcIixcImRlZmF1bHRcIjpbMS4xNSwyMTAsMzBdLFwibGVuZ3RoXCI6MyxcInZhbHVlXCI6XCJudW1iZXJcIixcInRyYW5zaXRpb25cIjp0cnVlLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOmZhbHNlfSxcImNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiNmZmZmZmZcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjpmYWxzZSxcInRyYW5zaXRpb25cIjp0cnVlfSxcImludGVuc2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAuNSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6ZmFsc2UsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX19LFwicGFpbnRcIjpbXCJwYWludF9maWxsXCIsXCJwYWludF9saW5lXCIsXCJwYWludF9jaXJjbGVcIixcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCIsXCJwYWludF9zeW1ib2xcIixcInBhaW50X3Jhc3RlclwiLFwicGFpbnRfYmFja2dyb3VuZFwiXSxcInBhaW50X2ZpbGxcIjp7XCJmaWxsLWFudGlhbGlhc1wiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwiZGVmYXVsdFwiOnRydWV9LFwiZmlsbC1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcImRlZmF1bHRcIjoxLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MSxcInRyYW5zaXRpb25cIjp0cnVlfSxcImZpbGwtY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwiIzAwMDAwMFwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W3tcIiFcIjpcImZpbGwtcGF0dGVyblwifV19LFwiZmlsbC1vdXRsaW5lLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOlt7XCIhXCI6XCJmaWxsLXBhdHRlcm5cIn0se1wiZmlsbC1hbnRpYWxpYXNcIjp0cnVlfV19LFwiZmlsbC10cmFuc2xhdGVcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwibGVuZ3RoXCI6MixcImRlZmF1bHRcIjpbMCwwXSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwiZmlsbC10cmFuc2xhdGUtYW5jaG9yXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ2YWx1ZXNcIjp7XCJtYXBcIjp7fSxcInZpZXdwb3J0XCI6e319LFwiZGVmYXVsdFwiOlwibWFwXCIsXCJyZXF1aXJlc1wiOltcImZpbGwtdHJhbnNsYXRlXCJdfSxcImZpbGwtcGF0dGVyblwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX19LFwicGFpbnRfZmlsbC1leHRydXNpb25cIjp7XCJmaWxsLWV4dHJ1c2lvbi1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6ZmFsc2UsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJmaWxsLWV4dHJ1c2lvbi1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbe1wiIVwiOlwiZmlsbC1leHRydXNpb24tcGF0dGVyblwifV19LFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcImxlbmd0aFwiOjIsXCJkZWZhdWx0XCI6WzAsMF0sXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3JcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInZhbHVlc1wiOntcIm1hcFwiOnt9LFwidmlld3BvcnRcIjp7fX0sXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1wiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlXCJdfSxcImZpbGwtZXh0cnVzaW9uLXBhdHRlcm5cIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWV9LFwiZmlsbC1leHRydXNpb24taGVpZ2h0XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6NjU1MzUsXCJ1bml0c1wiOlwibWV0ZXJzXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJmaWxsLWV4dHJ1c2lvbi1iYXNlXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6NjU1MzUsXCJ1bml0c1wiOlwibWV0ZXJzXCIsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1wiZmlsbC1leHRydXNpb24taGVpZ2h0XCJdfX0sXCJwYWludF9saW5lXCI6e1wibGluZS1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcImRlZmF1bHRcIjoxLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MSxcInRyYW5zaXRpb25cIjp0cnVlfSxcImxpbmUtY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwiIzAwMDAwMFwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W3tcIiFcIjpcImxpbmUtcGF0dGVyblwifV19LFwibGluZS10cmFuc2xhdGVcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwibGVuZ3RoXCI6MixcImRlZmF1bHRcIjpbMCwwXSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwibGluZS10cmFuc2xhdGUtYW5jaG9yXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ2YWx1ZXNcIjp7XCJtYXBcIjp7fSxcInZpZXdwb3J0XCI6e319LFwiZGVmYXVsdFwiOlwibWFwXCIsXCJyZXF1aXJlc1wiOltcImxpbmUtdHJhbnNsYXRlXCJdfSxcImxpbmUtd2lkdGhcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImxpbmUtZ2FwLXdpZHRoXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIn0sXCJsaW5lLW9mZnNldFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImxpbmUtYmx1clwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwibGluZS1kYXNoYXJyYXlcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJtaW5pbXVtXCI6MCxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcImxpbmUgd2lkdGhzXCIsXCJyZXF1aXJlc1wiOlt7XCIhXCI6XCJsaW5lLXBhdHRlcm5cIn1dfSxcImxpbmUtcGF0dGVyblwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX19LFwicGFpbnRfY2lyY2xlXCI6e1wiY2lyY2xlLXJhZGl1c1wiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjUsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwiY2lyY2xlLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWV9LFwiY2lyY2xlLWJsdXJcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJjaXJjbGUtb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJjaXJjbGUtdHJhbnNsYXRlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcImxlbmd0aFwiOjIsXCJkZWZhdWx0XCI6WzAsMF0sXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImNpcmNsZS10cmFuc2xhdGUtYW5jaG9yXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ2YWx1ZXNcIjp7XCJtYXBcIjp7fSxcInZpZXdwb3J0XCI6e319LFwiZGVmYXVsdFwiOlwibWFwXCIsXCJyZXF1aXJlc1wiOltcImNpcmNsZS10cmFuc2xhdGVcIl19LFwiY2lyY2xlLXBpdGNoLXNjYWxlXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ2YWx1ZXNcIjp7XCJtYXBcIjp7fSxcInZpZXdwb3J0XCI6e319LFwiZGVmYXVsdFwiOlwibWFwXCJ9LFwiY2lyY2xlLXN0cm9rZS13aWR0aFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwiY2lyY2xlLXN0cm9rZS1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlfSxcImNpcmNsZS1zdHJva2Utb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX19LFwicGFpbnRfc3ltYm9sXCI6e1wiaWNvbi1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24tY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwiIzAwMDAwMFwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWhhbG8tY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwicmdiYSgwLCAwLCAwLCAwKVwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLWhhbG8td2lkdGhcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24taGFsby1ibHVyXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLXRyYW5zbGF0ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjoyLFwiZGVmYXVsdFwiOlswLDBdLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLXRyYW5zbGF0ZS1hbmNob3JcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInZhbHVlc1wiOntcIm1hcFwiOnt9LFwidmlld3BvcnRcIjp7fX0sXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiLFwiaWNvbi10cmFuc2xhdGVcIl19LFwidGV4dC1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwiIzAwMDAwMFwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWhhbG8tY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwicmdiYSgwLCAwLCAwLCAwKVwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWhhbG8td2lkdGhcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtaGFsby1ibHVyXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LXRyYW5zbGF0ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjoyLFwiZGVmYXVsdFwiOlswLDBdLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LXRyYW5zbGF0ZS1hbmNob3JcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInZhbHVlc1wiOntcIm1hcFwiOnt9LFwidmlld3BvcnRcIjp7fX0sXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiLFwidGV4dC10cmFuc2xhdGVcIl19fSxcInBhaW50X3Jhc3RlclwiOntcInJhc3Rlci1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlfSxcInJhc3Rlci1odWUtcm90YXRlXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInBlcmlvZFwiOjM2MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwiZGVncmVlc1wifSxcInJhc3Rlci1icmlnaHRuZXNzLW1pblwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJyYXN0ZXItYnJpZ2h0bmVzcy1tYXhcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwidHJhbnNpdGlvblwiOnRydWV9LFwicmFzdGVyLXNhdHVyYXRpb25cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOi0xLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlfSxcInJhc3Rlci1jb250cmFzdFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6LTEsXCJtYXhpbXVtXCI6MSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWV9LFwicmFzdGVyLWZhZGUtZHVyYXRpb25cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjozMDAsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwibWlsbGlzZWNvbmRzXCJ9fSxcInBhaW50X2JhY2tncm91bmRcIjp7XCJiYWNrZ3JvdW5kLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOlt7XCIhXCI6XCJiYWNrZ3JvdW5kLXBhdHRlcm5cIn1dfSxcImJhY2tncm91bmQtcGF0dGVyblwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJiYWNrZ3JvdW5kLW9wYWNpdHlcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWV9fSxcInRyYW5zaXRpb25cIjp7XCJkdXJhdGlvblwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjMwMCxcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcIm1pbGxpc2Vjb25kc1wifSxcImRlbGF5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcIm1pbGxpc2Vjb25kc1wifX19XG59LHt9XSwxMjE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24ocil7Zm9yKHZhciB0PWFyZ3VtZW50cyxlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIG49dFtlXTtmb3IodmFyIG8gaW4gbilyW29dPW5bb119cmV0dXJuIHJ9O1xufSx7fV0sMTIyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKG4pe3JldHVybiBuIGluc3RhbmNlb2YgTnVtYmVyP1wibnVtYmVyXCI6biBpbnN0YW5jZW9mIFN0cmluZz9cInN0cmluZ1wiOm4gaW5zdGFuY2VvZiBCb29sZWFuP1wiYm9vbGVhblwiOkFycmF5LmlzQXJyYXkobik/XCJhcnJheVwiOm51bGw9PT1uP1wibnVsbFwiOnR5cGVvZiBufTtcbn0se31dLDEyMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBpbnRlcnBvbGF0ZSh0LGUsbil7cmV0dXJuIHQqKDEtbikrZSpufW1vZHVsZS5leHBvcnRzPWludGVycG9sYXRlLGludGVycG9sYXRlLm51bWJlcj1pbnRlcnBvbGF0ZSxpbnRlcnBvbGF0ZS52ZWMyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm5baW50ZXJwb2xhdGUodFswXSxlWzBdLG4pLGludGVycG9sYXRlKHRbMV0sZVsxXSxuKV19LGludGVycG9sYXRlLmNvbG9yPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm5baW50ZXJwb2xhdGUodFswXSxlWzBdLG4pLGludGVycG9sYXRlKHRbMV0sZVsxXSxuKSxpbnRlcnBvbGF0ZSh0WzJdLGVbMl0sbiksaW50ZXJwb2xhdGUodFszXSxlWzNdLG4pXX0saW50ZXJwb2xhdGUuYXJyYXk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0Lm1hcChmdW5jdGlvbih0LHIpe3JldHVybiBpbnRlcnBvbGF0ZSh0LGVbcl0sbil9KX07XG59LHt9XSwxMjQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIHBhcnNlQ29sb3JTdHJpbmc9X2RlcmVxXyhcImNzc2NvbG9ycGFyc2VyXCIpLnBhcnNlQ1NTQ29sb3I7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24ocil7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHIpe3ZhciBlPXBhcnNlQ29sb3JTdHJpbmcocik7aWYoIWUpcmV0dXJuO3JldHVybltlWzBdLzI1NSplWzNdLGVbMV0vMjU1KmVbM10sZVsyXS8yNTUqZVszXSxlWzNdXX1yZXR1cm4gQXJyYXkuaXNBcnJheShyKT9yOnZvaWQgMH07XG59LHtcImNzc2NvbG9ycGFyc2VyXCI6MTA5fV0sMTI1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO21vZHVsZS5leHBvcnRzPVtcInR5cGVcIixcInNvdXJjZVwiLFwic291cmNlLWxheWVyXCIsXCJtaW56b29tXCIsXCJtYXh6b29tXCIsXCJmaWx0ZXJcIixcImxheW91dFwiXTtcbn0se31dLDEyNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihuKXtyZXR1cm4gbiBpbnN0YW5jZW9mIE51bWJlcnx8biBpbnN0YW5jZW9mIFN0cmluZ3x8biBpbnN0YW5jZW9mIEJvb2xlYW4/bi52YWx1ZU9mKCk6bn07XG59LHt9XSwxMjc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIFZhbGlkYXRpb25FcnJvcj1fZGVyZXFfKFwiLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvclwiKSxnZXRUeXBlPV9kZXJlcV8oXCIuLi91dGlsL2dldF90eXBlXCIpLGV4dGVuZD1fZGVyZXFfKFwiLi4vdXRpbC9leHRlbmRcIik7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHI9X2RlcmVxXyhcIi4vdmFsaWRhdGVfZnVuY3Rpb25cIiksdD1fZGVyZXFfKFwiLi92YWxpZGF0ZV9vYmplY3RcIiksaT17XCIqXCI6ZnVuY3Rpb24oKXtyZXR1cm5bXX0sYXJyYXk6X2RlcmVxXyhcIi4vdmFsaWRhdGVfYXJyYXlcIiksYm9vbGVhbjpfZGVyZXFfKFwiLi92YWxpZGF0ZV9ib29sZWFuXCIpLG51bWJlcjpfZGVyZXFfKFwiLi92YWxpZGF0ZV9udW1iZXJcIiksY29sb3I6X2RlcmVxXyhcIi4vdmFsaWRhdGVfY29sb3JcIiksY29uc3RhbnRzOl9kZXJlcV8oXCIuL3ZhbGlkYXRlX2NvbnN0YW50c1wiKSxlbnVtOl9kZXJlcV8oXCIuL3ZhbGlkYXRlX2VudW1cIiksZmlsdGVyOl9kZXJlcV8oXCIuL3ZhbGlkYXRlX2ZpbHRlclwiKSxmdW5jdGlvbjpfZGVyZXFfKFwiLi92YWxpZGF0ZV9mdW5jdGlvblwiKSxsYXllcjpfZGVyZXFfKFwiLi92YWxpZGF0ZV9sYXllclwiKSxvYmplY3Q6X2RlcmVxXyhcIi4vdmFsaWRhdGVfb2JqZWN0XCIpLHNvdXJjZTpfZGVyZXFfKFwiLi92YWxpZGF0ZV9zb3VyY2VcIiksbGlnaHQ6X2RlcmVxXyhcIi4vdmFsaWRhdGVfbGlnaHRcIiksc3RyaW5nOl9kZXJlcV8oXCIuL3ZhbGlkYXRlX3N0cmluZ1wiKX0sYT1lLnZhbHVlLG49ZS52YWx1ZVNwZWMsdT1lLmtleSxvPWUuc3R5bGVTcGVjLGw9ZS5zdHlsZTtpZihcInN0cmluZ1wiPT09Z2V0VHlwZShhKSYmXCJAXCI9PT1hWzBdKXtpZihvLiR2ZXJzaW9uPjcpcmV0dXJuW25ldyBWYWxpZGF0aW9uRXJyb3IodSxhLFwiY29uc3RhbnRzIGhhdmUgYmVlbiBkZXByZWNhdGVkIGFzIG9mIHY4XCIpXTtpZighKGEgaW4gbC5jb25zdGFudHMpKXJldHVybltuZXcgVmFsaWRhdGlvbkVycm9yKHUsYSwnY29uc3RhbnQgXCIlc1wiIG5vdCBmb3VuZCcsYSldO2U9ZXh0ZW5kKHt9LGUse3ZhbHVlOmwuY29uc3RhbnRzW2FdfSl9cmV0dXJuIG4uZnVuY3Rpb24mJlwib2JqZWN0XCI9PT1nZXRUeXBlKGEpP3IoZSk6bi50eXBlJiZpW24udHlwZV0/aVtuLnR5cGVdKGUpOnQoZXh0ZW5kKHt9LGUse3ZhbHVlU3BlYzpuLnR5cGU/b1tuLnR5cGVdOm59KSl9O1xufSx7XCIuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yXCI6MTA0LFwiLi4vdXRpbC9leHRlbmRcIjoxMjEsXCIuLi91dGlsL2dldF90eXBlXCI6MTIyLFwiLi92YWxpZGF0ZV9hcnJheVwiOjEyOCxcIi4vdmFsaWRhdGVfYm9vbGVhblwiOjEyOSxcIi4vdmFsaWRhdGVfY29sb3JcIjoxMzAsXCIuL3ZhbGlkYXRlX2NvbnN0YW50c1wiOjEzMSxcIi4vdmFsaWRhdGVfZW51bVwiOjEzMixcIi4vdmFsaWRhdGVfZmlsdGVyXCI6MTMzLFwiLi92YWxpZGF0ZV9mdW5jdGlvblwiOjEzNCxcIi4vdmFsaWRhdGVfbGF5ZXJcIjoxMzYsXCIuL3ZhbGlkYXRlX2xpZ2h0XCI6MTM4LFwiLi92YWxpZGF0ZV9udW1iZXJcIjoxMzksXCIuL3ZhbGlkYXRlX29iamVjdFwiOjE0MCxcIi4vdmFsaWRhdGVfc291cmNlXCI6MTQzLFwiLi92YWxpZGF0ZV9zdHJpbmdcIjoxNDR9XSwxMjg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIGdldFR5cGU9X2RlcmVxXyhcIi4uL3V0aWwvZ2V0X3R5cGVcIiksdmFsaWRhdGU9X2RlcmVxXyhcIi4vdmFsaWRhdGVcIiksVmFsaWRhdGlvbkVycm9yPV9kZXJlcV8oXCIuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yXCIpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciByPWUudmFsdWUsdD1lLnZhbHVlU3BlYyxhPWUuc3R5bGUsbj1lLnN0eWxlU3BlYyxsPWUua2V5LGk9ZS5hcnJheUVsZW1lbnRWYWxpZGF0b3J8fHZhbGlkYXRlO2lmKFwiYXJyYXlcIiE9PWdldFR5cGUocikpcmV0dXJuW25ldyBWYWxpZGF0aW9uRXJyb3IobCxyLFwiYXJyYXkgZXhwZWN0ZWQsICVzIGZvdW5kXCIsZ2V0VHlwZShyKSldO2lmKHQubGVuZ3RoJiZyLmxlbmd0aCE9PXQubGVuZ3RoKXJldHVybltuZXcgVmFsaWRhdGlvbkVycm9yKGwscixcImFycmF5IGxlbmd0aCAlZCBleHBlY3RlZCwgbGVuZ3RoICVkIGZvdW5kXCIsdC5sZW5ndGgsci5sZW5ndGgpXTtpZih0W1wibWluLWxlbmd0aFwiXSYmci5sZW5ndGg8dFtcIm1pbi1sZW5ndGhcIl0pcmV0dXJuW25ldyBWYWxpZGF0aW9uRXJyb3IobCxyLFwiYXJyYXkgbGVuZ3RoIGF0IGxlYXN0ICVkIGV4cGVjdGVkLCBsZW5ndGggJWQgZm91bmRcIix0W1wibWluLWxlbmd0aFwiXSxyLmxlbmd0aCldO3ZhciBvPXt0eXBlOnQudmFsdWV9O24uJHZlcnNpb248NyYmKG8uZnVuY3Rpb249dC5mdW5jdGlvbiksXCJvYmplY3RcIj09PWdldFR5cGUodC52YWx1ZSkmJihvPXQudmFsdWUpO2Zvcih2YXIgdT1bXSxkPTA7ZDxyLmxlbmd0aDtkKyspdT11LmNvbmNhdChpKHthcnJheTpyLGFycmF5SW5kZXg6ZCx2YWx1ZTpyW2RdLHZhbHVlU3BlYzpvLHN0eWxlOmEsc3R5bGVTcGVjOm4sa2V5OmwrXCJbXCIrZCtcIl1cIn0pKTtyZXR1cm4gdX07XG59LHtcIi4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3JcIjoxMDQsXCIuLi91dGlsL2dldF90eXBlXCI6MTIyLFwiLi92YWxpZGF0ZVwiOjEyN31dLDEyOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgZ2V0VHlwZT1fZGVyZXFfKFwiLi4vdXRpbC9nZXRfdHlwZVwiKSxWYWxpZGF0aW9uRXJyb3I9X2RlcmVxXyhcIi4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3JcIik7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHI9ZS52YWx1ZSxvPWUua2V5LHQ9Z2V0VHlwZShyKTtyZXR1cm5cImJvb2xlYW5cIiE9PXQ/W25ldyBWYWxpZGF0aW9uRXJyb3IobyxyLFwiYm9vbGVhbiBleHBlY3RlZCwgJXMgZm91bmRcIix0KV06W119O1xufSx7XCIuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yXCI6MTA0LFwiLi4vdXRpbC9nZXRfdHlwZVwiOjEyMn1dLDEzMDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgVmFsaWRhdGlvbkVycm9yPV9kZXJlcV8oXCIuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yXCIpLGdldFR5cGU9X2RlcmVxXyhcIi4uL3V0aWwvZ2V0X3R5cGVcIikscGFyc2VDU1NDb2xvcj1fZGVyZXFfKFwiY3NzY29sb3JwYXJzZXJcIikucGFyc2VDU1NDb2xvcjttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihyKXt2YXIgZT1yLmtleSxvPXIudmFsdWUsdD1nZXRUeXBlKG8pO3JldHVyblwic3RyaW5nXCIhPT10P1tuZXcgVmFsaWRhdGlvbkVycm9yKGUsbyxcImNvbG9yIGV4cGVjdGVkLCAlcyBmb3VuZFwiLHQpXTpudWxsPT09cGFyc2VDU1NDb2xvcihvKT9bbmV3IFZhbGlkYXRpb25FcnJvcihlLG8sJ2NvbG9yIGV4cGVjdGVkLCBcIiVzXCIgZm91bmQnLG8pXTpbXX07XG59LHtcIi4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3JcIjoxMDQsXCIuLi91dGlsL2dldF90eXBlXCI6MTIyLFwiY3NzY29sb3JwYXJzZXJcIjoxMDl9XSwxMzE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIFZhbGlkYXRpb25FcnJvcj1fZGVyZXFfKFwiLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvclwiKSxnZXRUeXBlPV9kZXJlcV8oXCIuLi91dGlsL2dldF90eXBlXCIpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHIpe3ZhciBlPXIua2V5LHQ9ci52YWx1ZSxhPXIuc3R5bGVTcGVjO2lmKGEuJHZlcnNpb24+NylyZXR1cm4gdD9bbmV3IFZhbGlkYXRpb25FcnJvcihlLHQsXCJjb25zdGFudHMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgYXMgb2YgdjhcIildOltdO3ZhciBvPWdldFR5cGUodCk7aWYoXCJvYmplY3RcIiE9PW8pcmV0dXJuW25ldyBWYWxpZGF0aW9uRXJyb3IoZSx0LFwib2JqZWN0IGV4cGVjdGVkLCAlcyBmb3VuZFwiLG8pXTt2YXIgbj1bXTtmb3IodmFyIGkgaW4gdClcIkBcIiE9PWlbMF0mJm4ucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGUrXCIuXCIraSx0W2ldLCdjb25zdGFudHMgbXVzdCBzdGFydCB3aXRoIFwiQFwiJykpO3JldHVybiBufTtcbn0se1wiLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvclwiOjEwNCxcIi4uL3V0aWwvZ2V0X3R5cGVcIjoxMjJ9XSwxMzI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIFZhbGlkYXRpb25FcnJvcj1fZGVyZXFfKFwiLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvclwiKSx1bmJ1bmRsZT1fZGVyZXFfKFwiLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludFwiKTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgcj1lLmtleSxuPWUudmFsdWUsdT1lLnZhbHVlU3BlYyxvPVtdO3JldHVybiBBcnJheS5pc0FycmF5KHUudmFsdWVzKT91LnZhbHVlcy5pbmRleE9mKHVuYnVuZGxlKG4pKT09PS0xJiZvLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihyLG4sXCJleHBlY3RlZCBvbmUgb2YgWyVzXSwgJXMgZm91bmRcIix1LnZhbHVlcy5qb2luKFwiLCBcIiksbikpOk9iamVjdC5rZXlzKHUudmFsdWVzKS5pbmRleE9mKHVuYnVuZGxlKG4pKT09PS0xJiZvLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihyLG4sXCJleHBlY3RlZCBvbmUgb2YgWyVzXSwgJXMgZm91bmRcIixPYmplY3Qua2V5cyh1LnZhbHVlcykuam9pbihcIiwgXCIpLG4pKSxvfTtcbn0se1wiLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvclwiOjEwNCxcIi4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnRcIjoxMjZ9XSwxMzM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIFZhbGlkYXRpb25FcnJvcj1fZGVyZXFfKFwiLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvclwiKSx2YWxpZGF0ZUVudW09X2RlcmVxXyhcIi4vdmFsaWRhdGVfZW51bVwiKSxnZXRUeXBlPV9kZXJlcV8oXCIuLi91dGlsL2dldF90eXBlXCIpLHVuYnVuZGxlPV9kZXJlcV8oXCIuLi91dGlsL3VuYnVuZGxlX2pzb25saW50XCIpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uIGUocil7dmFyIHQsYT1yLnZhbHVlLG49ci5rZXksbD1yLnN0eWxlU3BlYyxzPVtdO2lmKFwiYXJyYXlcIiE9PWdldFR5cGUoYSkpcmV0dXJuW25ldyBWYWxpZGF0aW9uRXJyb3IobixhLFwiYXJyYXkgZXhwZWN0ZWQsICVzIGZvdW5kXCIsZ2V0VHlwZShhKSldO2lmKGEubGVuZ3RoPDEpcmV0dXJuW25ldyBWYWxpZGF0aW9uRXJyb3IobixhLFwiZmlsdGVyIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCAxIGVsZW1lbnRcIildO3N3aXRjaChzPXMuY29uY2F0KHZhbGlkYXRlRW51bSh7a2V5Om4rXCJbMF1cIix2YWx1ZTphWzBdLHZhbHVlU3BlYzpsLmZpbHRlcl9vcGVyYXRvcixzdHlsZTpyLnN0eWxlLHN0eWxlU3BlYzpyLnN0eWxlU3BlY30pKSx1bmJ1bmRsZShhWzBdKSl7Y2FzZVwiPFwiOmNhc2VcIjw9XCI6Y2FzZVwiPlwiOmNhc2VcIj49XCI6YS5sZW5ndGg+PTImJlwiJHR5cGVcIj09PXVuYnVuZGxlKGFbMV0pJiZzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihuLGEsJ1wiJHR5cGVcIiBjYW5ub3QgYmUgdXNlIHdpdGggb3BlcmF0b3IgXCIlc1wiJyxhWzBdKSk7Y2FzZVwiPT1cIjpjYXNlXCIhPVwiOjMhPT1hLmxlbmd0aCYmcy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IobixhLCdmaWx0ZXIgYXJyYXkgZm9yIG9wZXJhdG9yIFwiJXNcIiBtdXN0IGhhdmUgMyBlbGVtZW50cycsYVswXSkpO2Nhc2VcImluXCI6Y2FzZVwiIWluXCI6YS5sZW5ndGg+PTImJih0PWdldFR5cGUoYVsxXSksXCJzdHJpbmdcIiE9PXQmJnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKG4rXCJbMV1cIixhWzFdLFwic3RyaW5nIGV4cGVjdGVkLCAlcyBmb3VuZFwiLHQpKSk7Zm9yKHZhciBvPTI7bzxhLmxlbmd0aDtvKyspdD1nZXRUeXBlKGFbb10pLFwiJHR5cGVcIj09PXVuYnVuZGxlKGFbMV0pP3M9cy5jb25jYXQodmFsaWRhdGVFbnVtKHtrZXk6bitcIltcIitvK1wiXVwiLHZhbHVlOmFbb10sdmFsdWVTcGVjOmwuZ2VvbWV0cnlfdHlwZSxzdHlsZTpyLnN0eWxlLHN0eWxlU3BlYzpyLnN0eWxlU3BlY30pKTpcInN0cmluZ1wiIT09dCYmXCJudW1iZXJcIiE9PXQmJlwiYm9vbGVhblwiIT09dCYmcy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IobitcIltcIitvK1wiXVwiLGFbb10sXCJzdHJpbmcsIG51bWJlciwgb3IgYm9vbGVhbiBleHBlY3RlZCwgJXMgZm91bmRcIix0KSk7YnJlYWs7Y2FzZVwiYW55XCI6Y2FzZVwiYWxsXCI6Y2FzZVwibm9uZVwiOmZvcih2YXIgaT0xO2k8YS5sZW5ndGg7aSsrKXM9cy5jb25jYXQoZSh7a2V5Om4rXCJbXCIraStcIl1cIix2YWx1ZTphW2ldLHN0eWxlOnIuc3R5bGUsc3R5bGVTcGVjOnIuc3R5bGVTcGVjfSkpO2JyZWFrO2Nhc2VcImhhc1wiOmNhc2VcIiFoYXNcIjp0PWdldFR5cGUoYVsxXSksMiE9PWEubGVuZ3RoP3MucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKG4sYSwnZmlsdGVyIGFycmF5IGZvciBcIiVzXCIgb3BlcmF0b3IgbXVzdCBoYXZlIDIgZWxlbWVudHMnLGFbMF0pKTpcInN0cmluZ1wiIT09dCYmcy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IobitcIlsxXVwiLGFbMV0sXCJzdHJpbmcgZXhwZWN0ZWQsICVzIGZvdW5kXCIsdCkpfXJldHVybiBzfTtcbn0se1wiLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvclwiOjEwNCxcIi4uL3V0aWwvZ2V0X3R5cGVcIjoxMjIsXCIuLi91dGlsL3VuYnVuZGxlX2pzb25saW50XCI6MTI2LFwiLi92YWxpZGF0ZV9lbnVtXCI6MTMyfV0sMTM0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBWYWxpZGF0aW9uRXJyb3I9X2RlcmVxXyhcIi4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3JcIiksZ2V0VHlwZT1fZGVyZXFfKFwiLi4vdXRpbC9nZXRfdHlwZVwiKSx2YWxpZGF0ZT1fZGVyZXFfKFwiLi92YWxpZGF0ZVwiKSx2YWxpZGF0ZU9iamVjdD1fZGVyZXFfKFwiLi92YWxpZGF0ZV9vYmplY3RcIiksdmFsaWRhdGVBcnJheT1fZGVyZXFfKFwiLi92YWxpZGF0ZV9hcnJheVwiKSx2YWxpZGF0ZU51bWJlcj1fZGVyZXFfKFwiLi92YWxpZGF0ZV9udW1iZXJcIiksdW5idW5kbGU9X2RlcmVxXyhcIi4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnRcIik7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtpZihcImlkZW50aXR5XCI9PT1wKXJldHVybltuZXcgVmFsaWRhdGlvbkVycm9yKGUua2V5LGUudmFsdWUsJ2lkZW50aXR5IGZ1bmN0aW9uIG1heSBub3QgaGF2ZSBhIFwic3RvcHNcIiBwcm9wZXJ0eScpXTt2YXIgdD1bXSxhPWUudmFsdWU7cmV0dXJuIHQ9dC5jb25jYXQodmFsaWRhdGVBcnJheSh7a2V5OmUua2V5LHZhbHVlOmEsdmFsdWVTcGVjOmUudmFsdWVTcGVjLHN0eWxlOmUuc3R5bGUsc3R5bGVTcGVjOmUuc3R5bGVTcGVjLGFycmF5RWxlbWVudFZhbGlkYXRvcjpyfSkpLFwiYXJyYXlcIj09PWdldFR5cGUoYSkmJjA9PT1hLmxlbmd0aCYmdC5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoZS5rZXksYSxcImFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc3RvcFwiKSksdH1mdW5jdGlvbiByKGUpe3ZhciB0PVtdLHI9ZS52YWx1ZSxvPWUua2V5O2lmKFwiYXJyYXlcIiE9PWdldFR5cGUocikpcmV0dXJuW25ldyBWYWxpZGF0aW9uRXJyb3IobyxyLFwiYXJyYXkgZXhwZWN0ZWQsICVzIGZvdW5kXCIsZ2V0VHlwZShyKSldO2lmKDIhPT1yLmxlbmd0aClyZXR1cm5bbmV3IFZhbGlkYXRpb25FcnJvcihvLHIsXCJhcnJheSBsZW5ndGggJWQgZXhwZWN0ZWQsIGxlbmd0aCAlZCBmb3VuZFwiLDIsci5sZW5ndGgpXTtpZihjKXtpZihcIm9iamVjdFwiIT09Z2V0VHlwZShyWzBdKSlyZXR1cm5bbmV3IFZhbGlkYXRpb25FcnJvcihvLHIsXCJvYmplY3QgZXhwZWN0ZWQsICVzIGZvdW5kXCIsZ2V0VHlwZShyWzBdKSldO2lmKHZvaWQgMD09PXJbMF0uem9vbSlyZXR1cm5bbmV3IFZhbGlkYXRpb25FcnJvcihvLHIsXCJvYmplY3Qgc3RvcCBrZXkgbXVzdCBoYXZlIHpvb21cIildO2lmKHZvaWQgMD09PXJbMF0udmFsdWUpcmV0dXJuW25ldyBWYWxpZGF0aW9uRXJyb3IobyxyLFwib2JqZWN0IHN0b3Aga2V5IG11c3QgaGF2ZSB2YWx1ZVwiKV07aWYobCYmbD51bmJ1bmRsZShyWzBdLnpvb20pKXJldHVybltuZXcgVmFsaWRhdGlvbkVycm9yKG8sclswXS56b29tLFwic3RvcCB6b29tIHZhbHVlcyBtdXN0IGFwcGVhciBpbiBhc2NlbmRpbmcgb3JkZXJcIildO3VuYnVuZGxlKHJbMF0uem9vbSkhPT1sJiYobD11bmJ1bmRsZShyWzBdLnpvb20pLGk9dm9pZCAwLHM9e30pLHQ9dC5jb25jYXQodmFsaWRhdGVPYmplY3Qoe2tleTpvK1wiWzBdXCIsdmFsdWU6clswXSx2YWx1ZVNwZWM6e3pvb206e319LHN0eWxlOmUuc3R5bGUsc3R5bGVTcGVjOmUuc3R5bGVTcGVjLG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOnt6b29tOnZhbGlkYXRlTnVtYmVyLHZhbHVlOmF9fSkpfWVsc2UgdD10LmNvbmNhdChhKHtrZXk6bytcIlswXVwiLHZhbHVlOnJbMF0sdmFsdWVTcGVjOnt9LHN0eWxlOmUuc3R5bGUsc3R5bGVTcGVjOmUuc3R5bGVTcGVjfSkpO3JldHVybiB0LmNvbmNhdCh2YWxpZGF0ZSh7a2V5Om8rXCJbMV1cIix2YWx1ZTpyWzFdLHZhbHVlU3BlYzp1LHN0eWxlOmUuc3R5bGUsc3R5bGVTcGVjOmUuc3R5bGVTcGVjfSkpfWZ1bmN0aW9uIGEoZSl7dmFyIHQ9Z2V0VHlwZShlLnZhbHVlKSxyPXVuYnVuZGxlKGUudmFsdWUpO2lmKG4pe2lmKHQhPT1uKXJldHVybltuZXcgVmFsaWRhdGlvbkVycm9yKGUua2V5LGUudmFsdWUsXCIlcyBzdG9wIGRvbWFpbiB0eXBlIG11c3QgbWF0Y2ggcHJldmlvdXMgc3RvcCBkb21haW4gdHlwZSAlc1wiLHQsbildfWVsc2Ugbj10O2lmKFwibnVtYmVyXCIhPT10JiZcInN0cmluZ1wiIT09dCYmXCJib29sZWFuXCIhPT10KXJldHVybltuZXcgVmFsaWRhdGlvbkVycm9yKGUua2V5LGUudmFsdWUsXCJzdG9wIGRvbWFpbiB2YWx1ZSBtdXN0IGJlIGEgbnVtYmVyLCBzdHJpbmcsIG9yIGJvb2xlYW5cIildO2lmKFwibnVtYmVyXCIhPT10JiZcImNhdGVnb3JpY2FsXCIhPT1wKXt2YXIgYT1cIm51bWJlciBleHBlY3RlZCwgJXMgZm91bmRcIjtyZXR1cm4gdVtcInByb3BlcnR5LWZ1bmN0aW9uXCJdJiZ2b2lkIDA9PT1wJiYoYSs9J1xcbklmIHlvdSBpbnRlbmRlZCB0byB1c2UgYSBjYXRlZ29yaWNhbCBmdW5jdGlvbiwgc3BlY2lmeSBgXCJ0eXBlXCI6IFwiY2F0ZWdvcmljYWxcImAuJyksW25ldyBWYWxpZGF0aW9uRXJyb3IoZS5rZXksZS52YWx1ZSxhLHQpXX1yZXR1cm5cImNhdGVnb3JpY2FsXCIhPT1wfHxcIm51bWJlclwiIT09dHx8aXNGaW5pdGUocikmJk1hdGguZmxvb3Iocik9PT1yP1wibnVtYmVyXCI9PT10JiZ2b2lkIDAhPT1pJiZyPGk/W25ldyBWYWxpZGF0aW9uRXJyb3IoZS5rZXksZS52YWx1ZSxcInN0b3AgZG9tYWluIHZhbHVlcyBtdXN0IGFwcGVhciBpbiBhc2NlbmRpbmcgb3JkZXJcIildOihpPXIsXCJjYXRlZ29yaWNhbFwiPT09cCYmciBpbiBzP1tuZXcgVmFsaWRhdGlvbkVycm9yKGUua2V5LGUudmFsdWUsXCJzdG9wIGRvbWFpbiB2YWx1ZXMgbXVzdCBiZSB1bmlxdWVcIildOihzW3JdPSEwLFtdKSk6W25ldyBWYWxpZGF0aW9uRXJyb3IoZS5rZXksZS52YWx1ZSxcImludGVnZXIgZXhwZWN0ZWQsIGZvdW5kICVzXCIscildfWZ1bmN0aW9uIG8oZSl7cmV0dXJuIHZhbGlkYXRlKHtrZXk6ZS5rZXksdmFsdWU6ZS52YWx1ZSx2YWx1ZVNwZWM6dSxzdHlsZTplLnN0eWxlLHN0eWxlU3BlYzplLnN0eWxlU3BlY30pfXZhciBuLGksbCx1PWUudmFsdWVTcGVjLHA9dW5idW5kbGUoZS52YWx1ZS50eXBlKSxzPXt9LHk9XCJjYXRlZ29yaWNhbFwiIT09cCYmdm9pZCAwPT09ZS52YWx1ZS5wcm9wZXJ0eSxkPSF5LGM9XCJhcnJheVwiPT09Z2V0VHlwZShlLnZhbHVlLnN0b3BzKSYmXCJhcnJheVwiPT09Z2V0VHlwZShlLnZhbHVlLnN0b3BzWzBdKSYmXCJvYmplY3RcIj09PWdldFR5cGUoZS52YWx1ZS5zdG9wc1swXVswXSksdj12YWxpZGF0ZU9iamVjdCh7a2V5OmUua2V5LHZhbHVlOmUudmFsdWUsdmFsdWVTcGVjOmUuc3R5bGVTcGVjLmZ1bmN0aW9uLHN0eWxlOmUuc3R5bGUsc3R5bGVTcGVjOmUuc3R5bGVTcGVjLG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOntzdG9wczp0LGRlZmF1bHQ6b319KTtyZXR1cm5cImlkZW50aXR5XCI9PT1wJiZ5JiZ2LnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihlLmtleSxlLnZhbHVlLCdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwicHJvcGVydHlcIicpKSxcImlkZW50aXR5XCI9PT1wfHxlLnZhbHVlLnN0b3BzfHx2LnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihlLmtleSxlLnZhbHVlLCdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwic3RvcHNcIicpKSxcImV4cG9uZW50aWFsXCI9PT1wJiZcInBpZWNld2lzZS1jb25zdGFudFwiPT09ZS52YWx1ZVNwZWMuZnVuY3Rpb24mJnYucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGUua2V5LGUudmFsdWUsXCJleHBvbmVudGlhbCBmdW5jdGlvbnMgbm90IHN1cHBvcnRlZFwiKSksZS5zdHlsZVNwZWMuJHZlcnNpb24+PTgmJihkJiYhZS52YWx1ZVNwZWNbXCJwcm9wZXJ0eS1mdW5jdGlvblwiXT92LnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihlLmtleSxlLnZhbHVlLFwicHJvcGVydHkgZnVuY3Rpb25zIG5vdCBzdXBwb3J0ZWRcIikpOnkmJiFlLnZhbHVlU3BlY1tcInpvb20tZnVuY3Rpb25cIl0mJnYucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGUua2V5LGUudmFsdWUsXCJ6b29tIGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkXCIpKSksXCJjYXRlZ29yaWNhbFwiIT09cCYmIWN8fHZvaWQgMCE9PWUudmFsdWUucHJvcGVydHl8fHYucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGUua2V5LGUudmFsdWUsJ1wicHJvcGVydHlcIiBwcm9wZXJ0eSBpcyByZXF1aXJlZCcpKSx2fTtcbn0se1wiLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvclwiOjEwNCxcIi4uL3V0aWwvZ2V0X3R5cGVcIjoxMjIsXCIuLi91dGlsL3VuYnVuZGxlX2pzb25saW50XCI6MTI2LFwiLi92YWxpZGF0ZVwiOjEyNyxcIi4vdmFsaWRhdGVfYXJyYXlcIjoxMjgsXCIuL3ZhbGlkYXRlX251bWJlclwiOjEzOSxcIi4vdmFsaWRhdGVfb2JqZWN0XCI6MTQwfV0sMTM1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBWYWxpZGF0aW9uRXJyb3I9X2RlcmVxXyhcIi4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3JcIiksdmFsaWRhdGVTdHJpbmc9X2RlcmVxXyhcIi4vdmFsaWRhdGVfc3RyaW5nXCIpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHIpe3ZhciBlPXIudmFsdWUsdD1yLmtleSxhPXZhbGlkYXRlU3RyaW5nKHIpO3JldHVybiBhLmxlbmd0aD9hOihlLmluZGV4T2YoXCJ7Zm9udHN0YWNrfVwiKT09PS0xJiZhLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcih0LGUsJ1wiZ2x5cGhzXCIgdXJsIG11c3QgaW5jbHVkZSBhIFwie2ZvbnRzdGFja31cIiB0b2tlbicpKSxlLmluZGV4T2YoXCJ7cmFuZ2V9XCIpPT09LTEmJmEucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKHQsZSwnXCJnbHlwaHNcIiB1cmwgbXVzdCBpbmNsdWRlIGEgXCJ7cmFuZ2V9XCIgdG9rZW4nKSksYSl9O1xufSx7XCIuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yXCI6MTA0LFwiLi92YWxpZGF0ZV9zdHJpbmdcIjoxNDR9XSwxMzY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIFZhbGlkYXRpb25FcnJvcj1fZGVyZXFfKFwiLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvclwiKSx1bmJ1bmRsZT1fZGVyZXFfKFwiLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludFwiKSx2YWxpZGF0ZU9iamVjdD1fZGVyZXFfKFwiLi92YWxpZGF0ZV9vYmplY3RcIiksdmFsaWRhdGVGaWx0ZXI9X2RlcmVxXyhcIi4vdmFsaWRhdGVfZmlsdGVyXCIpLHZhbGlkYXRlUGFpbnRQcm9wZXJ0eT1fZGVyZXFfKFwiLi92YWxpZGF0ZV9wYWludF9wcm9wZXJ0eVwiKSx2YWxpZGF0ZUxheW91dFByb3BlcnR5PV9kZXJlcV8oXCIuL3ZhbGlkYXRlX2xheW91dF9wcm9wZXJ0eVwiKSxleHRlbmQ9X2RlcmVxXyhcIi4uL3V0aWwvZXh0ZW5kXCIpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciByPVtdLHQ9ZS52YWx1ZSxhPWUua2V5LGk9ZS5zdHlsZSxsPWUuc3R5bGVTcGVjO3QudHlwZXx8dC5yZWZ8fHIucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGEsdCwnZWl0aGVyIFwidHlwZVwiIG9yIFwicmVmXCIgaXMgcmVxdWlyZWQnKSk7dmFyIHU9dW5idW5kbGUodC50eXBlKSxuPXVuYnVuZGxlKHQucmVmKTtpZih0LmlkKWZvcih2YXIgbz11bmJ1bmRsZSh0LmlkKSxzPTA7czxlLmFycmF5SW5kZXg7cysrKXt2YXIgZD1pLmxheWVyc1tzXTt1bmJ1bmRsZShkLmlkKT09PW8mJnIucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGEsdC5pZCwnZHVwbGljYXRlIGxheWVyIGlkIFwiJXNcIiwgcHJldmlvdXNseSB1c2VkIGF0IGxpbmUgJWQnLHQuaWQsZC5pZC5fX2xpbmVfXykpfWlmKFwicmVmXCJpbiB0KXtbXCJ0eXBlXCIsXCJzb3VyY2VcIixcInNvdXJjZS1sYXllclwiLFwiZmlsdGVyXCIsXCJsYXlvdXRcIl0uZm9yRWFjaChmdW5jdGlvbihlKXtlIGluIHQmJnIucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGEsdFtlXSwnXCIlc1wiIGlzIHByb2hpYml0ZWQgZm9yIHJlZiBsYXllcnMnLGUpKX0pO3ZhciB5O2kubGF5ZXJzLmZvckVhY2goZnVuY3Rpb24oZSl7dW5idW5kbGUoZS5pZCk9PT1uJiYoeT1lKX0pLHk/eS5yZWY/ci5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoYSx0LnJlZixcInJlZiBjYW5ub3QgcmVmZXJlbmNlIGFub3RoZXIgcmVmIGxheWVyXCIpKTp1PXVuYnVuZGxlKHkudHlwZSk6ci5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoYSx0LnJlZiwncmVmIGxheWVyIFwiJXNcIiBub3QgZm91bmQnLG4pKX1lbHNlIGlmKFwiYmFja2dyb3VuZFwiIT09dSlpZih0LnNvdXJjZSl7dmFyIGM9aS5zb3VyY2VzJiZpLnNvdXJjZXNbdC5zb3VyY2VdLHA9YyYmdW5idW5kbGUoYy50eXBlKTtjP1widmVjdG9yXCI9PT1wJiZcInJhc3RlclwiPT09dT9yLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihhLHQuc291cmNlLCdsYXllciBcIiVzXCIgcmVxdWlyZXMgYSByYXN0ZXIgc291cmNlJyx0LmlkKSk6XCJyYXN0ZXJcIj09PXAmJlwicmFzdGVyXCIhPT11P3IucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGEsdC5zb3VyY2UsJ2xheWVyIFwiJXNcIiByZXF1aXJlcyBhIHZlY3RvciBzb3VyY2UnLHQuaWQpKTpcInZlY3RvclwiIT09cHx8dFtcInNvdXJjZS1sYXllclwiXXx8ci5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoYSx0LCdsYXllciBcIiVzXCIgbXVzdCBzcGVjaWZ5IGEgXCJzb3VyY2UtbGF5ZXJcIicsdC5pZCkpOnIucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGEsdC5zb3VyY2UsJ3NvdXJjZSBcIiVzXCIgbm90IGZvdW5kJyx0LnNvdXJjZSkpfWVsc2Ugci5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoYSx0LCdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwic291cmNlXCInKSk7cmV0dXJuIHI9ci5jb25jYXQodmFsaWRhdGVPYmplY3Qoe2tleTphLHZhbHVlOnQsdmFsdWVTcGVjOmwubGF5ZXIsc3R5bGU6ZS5zdHlsZSxzdHlsZVNwZWM6ZS5zdHlsZVNwZWMsb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6e1wiKlwiOmZ1bmN0aW9uKCl7cmV0dXJuW119LGZpbHRlcjp2YWxpZGF0ZUZpbHRlcixsYXlvdXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHZhbGlkYXRlT2JqZWN0KHtsYXllcjp0LGtleTplLmtleSx2YWx1ZTplLnZhbHVlLHN0eWxlOmUuc3R5bGUsc3R5bGVTcGVjOmUuc3R5bGVTcGVjLG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOntcIipcIjpmdW5jdGlvbihlKXtyZXR1cm4gdmFsaWRhdGVMYXlvdXRQcm9wZXJ0eShleHRlbmQoe2xheWVyVHlwZTp1fSxlKSl9fX0pfSxwYWludDpmdW5jdGlvbihlKXtyZXR1cm4gdmFsaWRhdGVPYmplY3Qoe2xheWVyOnQsa2V5OmUua2V5LHZhbHVlOmUudmFsdWUsc3R5bGU6ZS5zdHlsZSxzdHlsZVNwZWM6ZS5zdHlsZVNwZWMsb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6e1wiKlwiOmZ1bmN0aW9uKGUpe3JldHVybiB2YWxpZGF0ZVBhaW50UHJvcGVydHkoZXh0ZW5kKHtsYXllclR5cGU6dX0sZSkpfX19KX19fSkpfTtcbn0se1wiLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvclwiOjEwNCxcIi4uL3V0aWwvZXh0ZW5kXCI6MTIxLFwiLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludFwiOjEyNixcIi4vdmFsaWRhdGVfZmlsdGVyXCI6MTMzLFwiLi92YWxpZGF0ZV9sYXlvdXRfcHJvcGVydHlcIjoxMzcsXCIuL3ZhbGlkYXRlX29iamVjdFwiOjE0MCxcIi4vdmFsaWRhdGVfcGFpbnRfcHJvcGVydHlcIjoxNDF9XSwxMzc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIHZhbGlkYXRlUHJvcGVydHk9X2RlcmVxXyhcIi4vdmFsaWRhdGVfcHJvcGVydHlcIik7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24ocil7cmV0dXJuIHZhbGlkYXRlUHJvcGVydHkocixcImxheW91dFwiKX07XG59LHtcIi4vdmFsaWRhdGVfcHJvcGVydHlcIjoxNDJ9XSwxMzg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIFZhbGlkYXRpb25FcnJvcj1fZGVyZXFfKFwiLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvclwiKSxnZXRUeXBlPV9kZXJlcV8oXCIuLi91dGlsL2dldF90eXBlXCIpLHZhbGlkYXRlPV9kZXJlcV8oXCIuL3ZhbGlkYXRlXCIpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PWUudmFsdWUscj1lLnN0eWxlU3BlYyxhPXIubGlnaHQsaT1lLnN0eWxlLG49W10sbz1nZXRUeXBlKHQpO2lmKHZvaWQgMD09PXQpcmV0dXJuIG47aWYoXCJvYmplY3RcIiE9PW8pcmV0dXJuIG49bi5jb25jYXQoW25ldyBWYWxpZGF0aW9uRXJyb3IoXCJsaWdodFwiLHQsXCJvYmplY3QgZXhwZWN0ZWQsICVzIGZvdW5kXCIsbyldKTtmb3IodmFyIGwgaW4gdCl7dmFyIGM9bC5tYXRjaCgvXiguKiktdHJhbnNpdGlvbiQvKTtuPWMmJmFbY1sxXV0mJmFbY1sxXV0udHJhbnNpdGlvbj9uLmNvbmNhdCh2YWxpZGF0ZSh7a2V5OmwsdmFsdWU6dFtsXSx2YWx1ZVNwZWM6ci50cmFuc2l0aW9uLHN0eWxlOmksc3R5bGVTcGVjOnJ9KSk6YVtsXT9uLmNvbmNhdCh2YWxpZGF0ZSh7a2V5OmwsdmFsdWU6dFtsXSx2YWx1ZVNwZWM6YVtsXSxzdHlsZTppLHN0eWxlU3BlYzpyfSkpOm4uY29uY2F0KFtuZXcgVmFsaWRhdGlvbkVycm9yKGwsdFtsXSwndW5rbm93biBwcm9wZXJ0eSBcIiVzXCInLGwpXSl9cmV0dXJuIG59O1xufSx7XCIuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yXCI6MTA0LFwiLi4vdXRpbC9nZXRfdHlwZVwiOjEyMixcIi4vdmFsaWRhdGVcIjoxMjd9XSwxMzk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIGdldFR5cGU9X2RlcmVxXyhcIi4uL3V0aWwvZ2V0X3R5cGVcIiksVmFsaWRhdGlvbkVycm9yPV9kZXJlcV8oXCIuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yXCIpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciByPWUua2V5LGk9ZS52YWx1ZSxtPWUudmFsdWVTcGVjLGE9Z2V0VHlwZShpKTtyZXR1cm5cIm51bWJlclwiIT09YT9bbmV3IFZhbGlkYXRpb25FcnJvcihyLGksXCJudW1iZXIgZXhwZWN0ZWQsICVzIGZvdW5kXCIsYSldOlwibWluaW11bVwiaW4gbSYmaTxtLm1pbmltdW0/W25ldyBWYWxpZGF0aW9uRXJyb3IocixpLFwiJXMgaXMgbGVzcyB0aGFuIHRoZSBtaW5pbXVtIHZhbHVlICVzXCIsaSxtLm1pbmltdW0pXTpcIm1heGltdW1cImluIG0mJmk+bS5tYXhpbXVtP1tuZXcgVmFsaWRhdGlvbkVycm9yKHIsaSxcIiVzIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSB2YWx1ZSAlc1wiLGksbS5tYXhpbXVtKV06W119O1xufSx7XCIuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yXCI6MTA0LFwiLi4vdXRpbC9nZXRfdHlwZVwiOjEyMn1dLDE0MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgVmFsaWRhdGlvbkVycm9yPV9kZXJlcV8oXCIuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yXCIpLGdldFR5cGU9X2RlcmVxXyhcIi4uL3V0aWwvZ2V0X3R5cGVcIiksdmFsaWRhdGVTcGVjPV9kZXJlcV8oXCIuL3ZhbGlkYXRlXCIpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciByPWUua2V5LHQ9ZS52YWx1ZSxpPWUudmFsdWVTcGVjfHx7fSxhPWUub2JqZWN0RWxlbWVudFZhbGlkYXRvcnN8fHt9LG89ZS5zdHlsZSxsPWUuc3R5bGVTcGVjLG49W10sdT1nZXRUeXBlKHQpO2lmKFwib2JqZWN0XCIhPT11KXJldHVybltuZXcgVmFsaWRhdGlvbkVycm9yKHIsdCxcIm9iamVjdCBleHBlY3RlZCwgJXMgZm91bmRcIix1KV07Zm9yKHZhciBkIGluIHQpe3ZhciBwPWQuc3BsaXQoXCIuXCIpWzBdLHM9aVtwXXx8aVtcIipcIl0sYz12b2lkIDA7aWYoYVtwXSljPWFbcF07ZWxzZSBpZihpW3BdKWM9dmFsaWRhdGVTcGVjO2Vsc2UgaWYoYVtcIipcIl0pYz1hW1wiKlwiXTtlbHNle2lmKCFpW1wiKlwiXSl7bi5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Iocix0W2RdLCd1bmtub3duIHByb3BlcnR5IFwiJXNcIicsZCkpO2NvbnRpbnVlfWM9dmFsaWRhdGVTcGVjfW49bi5jb25jYXQoYyh7a2V5OihyP3IrXCIuXCI6cikrZCx2YWx1ZTp0W2RdLHZhbHVlU3BlYzpzLHN0eWxlOm8sc3R5bGVTcGVjOmwsb2JqZWN0OnQsb2JqZWN0S2V5OmR9KSl9Zm9yKHZhciB2IGluIGkpaVt2XS5yZXF1aXJlZCYmdm9pZCAwPT09aVt2XS5kZWZhdWx0JiZ2b2lkIDA9PT10W3ZdJiZuLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihyLHQsJ21pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCIlc1wiJyx2KSk7cmV0dXJuIG59O1xufSx7XCIuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yXCI6MTA0LFwiLi4vdXRpbC9nZXRfdHlwZVwiOjEyMixcIi4vdmFsaWRhdGVcIjoxMjd9XSwxNDE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIHZhbGlkYXRlUHJvcGVydHk9X2RlcmVxXyhcIi4vdmFsaWRhdGVfcHJvcGVydHlcIik7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24ocil7cmV0dXJuIHZhbGlkYXRlUHJvcGVydHkocixcInBhaW50XCIpfTtcbn0se1wiLi92YWxpZGF0ZV9wcm9wZXJ0eVwiOjE0Mn1dLDE0MjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgdmFsaWRhdGU9X2RlcmVxXyhcIi4vdmFsaWRhdGVcIiksVmFsaWRhdGlvbkVycm9yPV9kZXJlcV8oXCIuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yXCIpLGdldFR5cGU9X2RlcmVxXyhcIi4uL3V0aWwvZ2V0X3R5cGVcIik7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgcj1lLmtleSxpPWUuc3R5bGUsYT1lLnN0eWxlU3BlYyxuPWUudmFsdWUsbz1lLm9iamVjdEtleSxsPWFbdCtcIl9cIitlLmxheWVyVHlwZV07aWYoIWwpcmV0dXJuW107dmFyIHk9by5tYXRjaCgvXiguKiktdHJhbnNpdGlvbiQvKTtpZihcInBhaW50XCI9PT10JiZ5JiZsW3lbMV1dJiZsW3lbMV1dLnRyYW5zaXRpb24pcmV0dXJuIHZhbGlkYXRlKHtrZXk6cix2YWx1ZTpuLHZhbHVlU3BlYzphLnRyYW5zaXRpb24sc3R5bGU6aSxzdHlsZVNwZWM6YX0pO3ZhciBwPWUudmFsdWVTcGVjfHxsW29dO2lmKCFwKXJldHVybltuZXcgVmFsaWRhdGlvbkVycm9yKHIsbiwndW5rbm93biBwcm9wZXJ0eSBcIiVzXCInLG8pXTt2YXIgcztpZihcInN0cmluZ1wiPT09Z2V0VHlwZShuKSYmcFtcInByb3BlcnR5LWZ1bmN0aW9uXCJdJiYhcC50b2tlbnMmJihzPS9eeyhbXn1dKyl9JC8uZXhlYyhuKSkpcmV0dXJuW25ldyBWYWxpZGF0aW9uRXJyb3IocixuLCdcIiVzXCIgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcnBvbGF0aW9uIHN5bnRheFxcblVzZSBhbiBpZGVudGl0eSBwcm9wZXJ0eSBmdW5jdGlvbiBpbnN0ZWFkOiBgeyBcInR5cGVcIjogXCJpZGVudGl0eVwiLCBcInByb3BlcnR5XCI6ICVzYCB9YC4nLG8sSlNPTi5zdHJpbmdpZnkoc1sxXSkpXTt2YXIgdT1bXTtyZXR1cm5cInN5bWJvbFwiPT09ZS5sYXllclR5cGUmJlwidGV4dC1maWVsZFwiPT09byYmaSYmIWkuZ2x5cGhzJiZ1LnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihyLG4sJ3VzZSBvZiBcInRleHQtZmllbGRcIiByZXF1aXJlcyBhIHN0eWxlIFwiZ2x5cGhzXCIgcHJvcGVydHknKSksdS5jb25jYXQodmFsaWRhdGUoe2tleTplLmtleSx2YWx1ZTpuLHZhbHVlU3BlYzpwLHN0eWxlOmksc3R5bGVTcGVjOmF9KSl9O1xufSx7XCIuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yXCI6MTA0LFwiLi4vdXRpbC9nZXRfdHlwZVwiOjEyMixcIi4vdmFsaWRhdGVcIjoxMjd9XSwxNDM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIFZhbGlkYXRpb25FcnJvcj1fZGVyZXFfKFwiLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvclwiKSx1bmJ1bmRsZT1fZGVyZXFfKFwiLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludFwiKSx2YWxpZGF0ZU9iamVjdD1fZGVyZXFfKFwiLi92YWxpZGF0ZV9vYmplY3RcIiksdmFsaWRhdGVFbnVtPV9kZXJlcV8oXCIuL3ZhbGlkYXRlX2VudW1cIik7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIGE9ZS52YWx1ZSx0PWUua2V5LHI9ZS5zdHlsZVNwZWMsbD1lLnN0eWxlO2lmKCFhLnR5cGUpcmV0dXJuW25ldyBWYWxpZGF0aW9uRXJyb3IodCxhLCdcInR5cGVcIiBpcyByZXF1aXJlZCcpXTt2YXIgdT11bmJ1bmRsZShhLnR5cGUpLGk9W107c3dpdGNoKHUpe2Nhc2VcInZlY3RvclwiOmNhc2VcInJhc3RlclwiOmlmKGk9aS5jb25jYXQodmFsaWRhdGVPYmplY3Qoe2tleTp0LHZhbHVlOmEsdmFsdWVTcGVjOnIuc291cmNlX3RpbGUsc3R5bGU6ZS5zdHlsZSxzdHlsZVNwZWM6cn0pKSxcInVybFwiaW4gYSlmb3IodmFyIHMgaW4gYSlbXCJ0eXBlXCIsXCJ1cmxcIixcInRpbGVTaXplXCJdLmluZGV4T2Yocyk8MCYmaS5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IodCtcIi5cIitzLGFbc10sJ2Egc291cmNlIHdpdGggYSBcInVybFwiIHByb3BlcnR5IG1heSBub3QgaW5jbHVkZSBhIFwiJXNcIiBwcm9wZXJ0eScscykpO3JldHVybiBpO2Nhc2VcImdlb2pzb25cIjpyZXR1cm4gdmFsaWRhdGVPYmplY3Qoe2tleTp0LHZhbHVlOmEsdmFsdWVTcGVjOnIuc291cmNlX2dlb2pzb24sc3R5bGU6bCxzdHlsZVNwZWM6cn0pO2Nhc2VcInZpZGVvXCI6cmV0dXJuIHZhbGlkYXRlT2JqZWN0KHtrZXk6dCx2YWx1ZTphLHZhbHVlU3BlYzpyLnNvdXJjZV92aWRlbyxzdHlsZTpsLHN0eWxlU3BlYzpyfSk7Y2FzZVwiaW1hZ2VcIjpyZXR1cm4gdmFsaWRhdGVPYmplY3Qoe2tleTp0LHZhbHVlOmEsdmFsdWVTcGVjOnIuc291cmNlX2ltYWdlLHN0eWxlOmwsc3R5bGVTcGVjOnJ9KTtjYXNlXCJjYW52YXNcIjpyZXR1cm4gdmFsaWRhdGVPYmplY3Qoe2tleTp0LHZhbHVlOmEsdmFsdWVTcGVjOnIuc291cmNlX2NhbnZhcyxzdHlsZTpsLHN0eWxlU3BlYzpyfSk7ZGVmYXVsdDpyZXR1cm4gdmFsaWRhdGVFbnVtKHtrZXk6dCtcIi50eXBlXCIsdmFsdWU6YS50eXBlLHZhbHVlU3BlYzp7dmFsdWVzOltcInZlY3RvclwiLFwicmFzdGVyXCIsXCJnZW9qc29uXCIsXCJ2aWRlb1wiLFwiaW1hZ2VcIixcImNhbnZhc1wiXX0sc3R5bGU6bCxzdHlsZVNwZWM6cn0pfX07XG59LHtcIi4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3JcIjoxMDQsXCIuLi91dGlsL3VuYnVuZGxlX2pzb25saW50XCI6MTI2LFwiLi92YWxpZGF0ZV9lbnVtXCI6MTMyLFwiLi92YWxpZGF0ZV9vYmplY3RcIjoxNDB9XSwxNDQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIGdldFR5cGU9X2RlcmVxXyhcIi4uL3V0aWwvZ2V0X3R5cGVcIiksVmFsaWRhdGlvbkVycm9yPV9kZXJlcV8oXCIuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yXCIpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHIpe3ZhciBlPXIudmFsdWUsdD1yLmtleSxpPWdldFR5cGUoZSk7cmV0dXJuXCJzdHJpbmdcIiE9PWk/W25ldyBWYWxpZGF0aW9uRXJyb3IodCxlLFwic3RyaW5nIGV4cGVjdGVkLCAlcyBmb3VuZFwiLGkpXTpbXX07XG59LHtcIi4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3JcIjoxMDQsXCIuLi91dGlsL2dldF90eXBlXCI6MTIyfV0sMTQ1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIHZhbGlkYXRlU3R5bGVNaW4oZSxhKXthPWF8fGxhdGVzdFN0eWxlU3BlYzt2YXIgdD1bXTtyZXR1cm4gdD10LmNvbmNhdCh2YWxpZGF0ZSh7a2V5OlwiXCIsdmFsdWU6ZSx2YWx1ZVNwZWM6YS4kcm9vdCxzdHlsZVNwZWM6YSxzdHlsZTplLG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOntnbHlwaHM6dmFsaWRhdGVHbHlwaHNVUkwsXCIqXCI6ZnVuY3Rpb24oKXtyZXR1cm5bXX19fSkpLGEuJHZlcnNpb24+NyYmZS5jb25zdGFudHMmJih0PXQuY29uY2F0KHZhbGlkYXRlQ29uc3RhbnRzKHtrZXk6XCJjb25zdGFudHNcIix2YWx1ZTplLmNvbnN0YW50cyxzdHlsZTplLHN0eWxlU3BlYzphfSkpKSxzb3J0RXJyb3JzKHQpfWZ1bmN0aW9uIHNvcnRFcnJvcnMoZSl7cmV0dXJuW10uY29uY2F0KGUpLnNvcnQoZnVuY3Rpb24oZSxhKXtyZXR1cm4gZS5saW5lLWEubGluZX0pfWZ1bmN0aW9uIHdyYXBDbGVhbkVycm9ycyhlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gc29ydEVycm9ycyhlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fXZhciB2YWxpZGF0ZUNvbnN0YW50cz1fZGVyZXFfKFwiLi92YWxpZGF0ZS92YWxpZGF0ZV9jb25zdGFudHNcIiksdmFsaWRhdGU9X2RlcmVxXyhcIi4vdmFsaWRhdGUvdmFsaWRhdGVcIiksbGF0ZXN0U3R5bGVTcGVjPV9kZXJlcV8oXCIuL3JlZmVyZW5jZS9sYXRlc3RcIiksdmFsaWRhdGVHbHlwaHNVUkw9X2RlcmVxXyhcIi4vdmFsaWRhdGUvdmFsaWRhdGVfZ2x5cGhzX3VybFwiKTt2YWxpZGF0ZVN0eWxlTWluLnNvdXJjZT13cmFwQ2xlYW5FcnJvcnMoX2RlcmVxXyhcIi4vdmFsaWRhdGUvdmFsaWRhdGVfc291cmNlXCIpKSx2YWxpZGF0ZVN0eWxlTWluLmxpZ2h0PXdyYXBDbGVhbkVycm9ycyhfZGVyZXFfKFwiLi92YWxpZGF0ZS92YWxpZGF0ZV9saWdodFwiKSksdmFsaWRhdGVTdHlsZU1pbi5sYXllcj13cmFwQ2xlYW5FcnJvcnMoX2RlcmVxXyhcIi4vdmFsaWRhdGUvdmFsaWRhdGVfbGF5ZXJcIikpLHZhbGlkYXRlU3R5bGVNaW4uZmlsdGVyPXdyYXBDbGVhbkVycm9ycyhfZGVyZXFfKFwiLi92YWxpZGF0ZS92YWxpZGF0ZV9maWx0ZXJcIikpLHZhbGlkYXRlU3R5bGVNaW4ucGFpbnRQcm9wZXJ0eT13cmFwQ2xlYW5FcnJvcnMoX2RlcmVxXyhcIi4vdmFsaWRhdGUvdmFsaWRhdGVfcGFpbnRfcHJvcGVydHlcIikpLHZhbGlkYXRlU3R5bGVNaW4ubGF5b3V0UHJvcGVydHk9d3JhcENsZWFuRXJyb3JzKF9kZXJlcV8oXCIuL3ZhbGlkYXRlL3ZhbGlkYXRlX2xheW91dF9wcm9wZXJ0eVwiKSksbW9kdWxlLmV4cG9ydHM9dmFsaWRhdGVTdHlsZU1pbjtcbn0se1wiLi9yZWZlcmVuY2UvbGF0ZXN0XCI6MTE5LFwiLi92YWxpZGF0ZS92YWxpZGF0ZVwiOjEyNyxcIi4vdmFsaWRhdGUvdmFsaWRhdGVfY29uc3RhbnRzXCI6MTMxLFwiLi92YWxpZGF0ZS92YWxpZGF0ZV9maWx0ZXJcIjoxMzMsXCIuL3ZhbGlkYXRlL3ZhbGlkYXRlX2dseXBoc191cmxcIjoxMzUsXCIuL3ZhbGlkYXRlL3ZhbGlkYXRlX2xheWVyXCI6MTM2LFwiLi92YWxpZGF0ZS92YWxpZGF0ZV9sYXlvdXRfcHJvcGVydHlcIjoxMzcsXCIuL3ZhbGlkYXRlL3ZhbGlkYXRlX2xpZ2h0XCI6MTM4LFwiLi92YWxpZGF0ZS92YWxpZGF0ZV9wYWludF9wcm9wZXJ0eVwiOjE0MSxcIi4vdmFsaWRhdGUvdmFsaWRhdGVfc291cmNlXCI6MTQzfV0sMTQ2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBBbmltYXRpb25Mb29wPWZ1bmN0aW9uKCl7dGhpcy5uPTAsdGhpcy50aW1lcz1bXX07QW5pbWF0aW9uTG9vcC5wcm90b3R5cGUuc3RvcHBlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWVzPXRoaXMudGltZXMuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0LnRpbWU+PShuZXcgRGF0ZSkuZ2V0VGltZSgpfSksIXRoaXMudGltZXMubGVuZ3RofSxBbmltYXRpb25Mb29wLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudGltZXMucHVzaCh7aWQ6dGhpcy5uLHRpbWU6dCsobmV3IERhdGUpLmdldFRpbWUoKX0pLHRoaXMubisrfSxBbmltYXRpb25Mb29wLnByb3RvdHlwZS5jYW5jZWw9ZnVuY3Rpb24odCl7dGhpcy50aW1lcz10aGlzLnRpbWVzLmZpbHRlcihmdW5jdGlvbihpKXtyZXR1cm4gaS5pZCE9PXR9KX0sbW9kdWxlLmV4cG9ydHM9QW5pbWF0aW9uTG9vcDtcbn0se31dLDE0NzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgRXZlbnRlZD1fZGVyZXFfKFwiLi4vdXRpbC9ldmVudGVkXCIpLGFqYXg9X2RlcmVxXyhcIi4uL3V0aWwvYWpheFwiKSxicm93c2VyPV9kZXJlcV8oXCIuLi91dGlsL2Jyb3dzZXJcIiksbm9ybWFsaXplVVJMPV9kZXJlcV8oXCIuLi91dGlsL21hcGJveFwiKS5ub3JtYWxpemVTcHJpdGVVUkwsU3ByaXRlUG9zaXRpb249ZnVuY3Rpb24oKXt0aGlzLng9MCx0aGlzLnk9MCx0aGlzLndpZHRoPTAsdGhpcy5oZWlnaHQ9MCx0aGlzLnBpeGVsUmF0aW89MSx0aGlzLnNkZj0hMX0sSW1hZ2VTcHJpdGU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLGkpe3ZhciByPXRoaXM7dC5jYWxsKHRoaXMpLHRoaXMuYmFzZT1lLHRoaXMucmV0aW5hPWJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbz4xLHRoaXMuc2V0RXZlbnRlZFBhcmVudChpKTt2YXIgYT10aGlzLnJldGluYT9cIkAyeFwiOlwiXCI7YWpheC5nZXRKU09OKG5vcm1hbGl6ZVVSTChlLGEsXCIuanNvblwiKSxmdW5jdGlvbih0LGUpe3JldHVybiB0P3ZvaWQgci5maXJlKFwiZXJyb3JcIix7ZXJyb3I6dH0pOihyLmRhdGE9ZSx2b2lkKHIuaW1nRGF0YSYmci5maXJlKFwiZGF0YVwiLHtkYXRhVHlwZTpcInN0eWxlXCJ9KSkpfSksYWpheC5nZXRJbWFnZShub3JtYWxpemVVUkwoZSxhLFwiLnBuZ1wiKSxmdW5jdGlvbih0LGUpe3JldHVybiB0P3ZvaWQgci5maXJlKFwiZXJyb3JcIix7ZXJyb3I6dH0pOihyLmltZ0RhdGE9YnJvd3Nlci5nZXRJbWFnZURhdGEoZSksci53aWR0aD1lLndpZHRoLHZvaWQoci5kYXRhJiZyLmZpcmUoXCJkYXRhXCIse2RhdGFUeXBlOlwic3R5bGVcIn0pKSl9KX1yZXR1cm4gdCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmFzZX0sZS5wcm90b3R5cGUubG9hZGVkPWZ1bmN0aW9uKCl7cmV0dXJuISghdGhpcy5kYXRhfHwhdGhpcy5pbWdEYXRhKX0sZS5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZihicm93c2VyLmRldmljZVBpeGVsUmF0aW8+MSE9PXRoaXMucmV0aW5hKXt2YXIgaT1uZXcgZSh0aGlzLmJhc2UpO2kub24oXCJkYXRhXCIsZnVuY3Rpb24oKXt0LmRhdGE9aS5kYXRhLHQuaW1nRGF0YT1pLmltZ0RhdGEsdC53aWR0aD1pLndpZHRoLHQucmV0aW5hPWkucmV0aW5hfSl9fSxlLnByb3RvdHlwZS5nZXRTcHJpdGVQb3NpdGlvbj1mdW5jdGlvbih0KXtpZighdGhpcy5sb2FkZWQoKSlyZXR1cm4gbmV3IFNwcml0ZVBvc2l0aW9uO3ZhciBlPXRoaXMuZGF0YSYmdGhpcy5kYXRhW3RdO3JldHVybiBlJiZ0aGlzLmltZ0RhdGE/ZTpuZXcgU3ByaXRlUG9zaXRpb259LGV9KEV2ZW50ZWQpO21vZHVsZS5leHBvcnRzPUltYWdlU3ByaXRlO1xufSx7XCIuLi91dGlsL2FqYXhcIjoxOTQsXCIuLi91dGlsL2Jyb3dzZXJcIjoxOTUsXCIuLi91dGlsL2V2ZW50ZWRcIjoyMDMsXCIuLi91dGlsL21hcGJveFwiOjIxMH1dLDE0ODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgc3R5bGVTcGVjPV9kZXJlcV8oXCIuLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3RcIiksdXRpbD1fZGVyZXFfKFwiLi4vdXRpbC91dGlsXCIpLEV2ZW50ZWQ9X2RlcmVxXyhcIi4uL3V0aWwvZXZlbnRlZFwiKSx2YWxpZGF0ZVN0eWxlPV9kZXJlcV8oXCIuL3ZhbGlkYXRlX3N0eWxlXCIpLFN0eWxlRGVjbGFyYXRpb249X2RlcmVxXyhcIi4vc3R5bGVfZGVjbGFyYXRpb25cIiksU3R5bGVUcmFuc2l0aW9uPV9kZXJlcV8oXCIuL3N0eWxlX3RyYW5zaXRpb25cIiksVFJBTlNJVElPTl9TVUZGSVg9XCItdHJhbnNpdGlvblwiLExpZ2h0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGkoaSl7dC5jYWxsKHRoaXMpLHRoaXMucHJvcGVydGllcz1bXCJhbmNob3JcIixcImNvbG9yXCIsXCJwb3NpdGlvblwiLFwiaW50ZW5zaXR5XCJdLHRoaXMuX3NwZWNpZmljYXRpb25zPXN0eWxlU3BlYy5saWdodCx0aGlzLnNldChpKX1yZXR1cm4gdCYmKGkuX19wcm90b19fPXQpLGkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGkucHJvdG90eXBlLmNvbnN0cnVjdG9yPWksaS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQpe3ZhciBpPXRoaXM7aWYoIXRoaXMuX3ZhbGlkYXRlKHZhbGlkYXRlU3R5bGUubGlnaHQsdCkpe3RoaXMuX2RlY2xhcmF0aW9ucz17fSx0aGlzLl90cmFuc2l0aW9ucz17fSx0aGlzLl90cmFuc2l0aW9uT3B0aW9ucz17fSx0aGlzLmNhbGN1bGF0ZWQ9e30sdD11dGlsLmV4dGVuZCh7YW5jaG9yOnRoaXMuX3NwZWNpZmljYXRpb25zLmFuY2hvci5kZWZhdWx0LGNvbG9yOnRoaXMuX3NwZWNpZmljYXRpb25zLmNvbG9yLmRlZmF1bHQscG9zaXRpb246dGhpcy5fc3BlY2lmaWNhdGlvbnMucG9zaXRpb24uZGVmYXVsdCxpbnRlbnNpdHk6dGhpcy5fc3BlY2lmaWNhdGlvbnMuaW50ZW5zaXR5LmRlZmF1bHR9LHQpO2Zvcih2YXIgZT0wLG89aS5wcm9wZXJ0aWVzO2U8by5sZW5ndGg7ZSs9MSl7dmFyIG49b1tlXTtpLl9kZWNsYXJhdGlvbnNbbl09bmV3IFN0eWxlRGVjbGFyYXRpb24oaS5fc3BlY2lmaWNhdGlvbnNbbl0sdFtuXSl9cmV0dXJuIHRoaXN9fSxpLnByb3RvdHlwZS5nZXRMaWdodD1mdW5jdGlvbigpe3JldHVybnthbmNob3I6dGhpcy5nZXRMaWdodFByb3BlcnR5KFwiYW5jaG9yXCIpLGNvbG9yOnRoaXMuZ2V0TGlnaHRQcm9wZXJ0eShcImNvbG9yXCIpLHBvc2l0aW9uOnRoaXMuZ2V0TGlnaHRQcm9wZXJ0eShcInBvc2l0aW9uXCIpLGludGVuc2l0eTp0aGlzLmdldExpZ2h0UHJvcGVydHkoXCJpbnRlbnNpdHlcIil9fSxpLnByb3RvdHlwZS5nZXRMaWdodFByb3BlcnR5PWZ1bmN0aW9uKHQpe3JldHVybiB1dGlsLmVuZHNXaXRoKHQsVFJBTlNJVElPTl9TVUZGSVgpP3RoaXMuX3RyYW5zaXRpb25PcHRpb25zW3RdOnRoaXMuX2RlY2xhcmF0aW9uc1t0XSYmdGhpcy5fZGVjbGFyYXRpb25zW3RdLnZhbHVlfSxpLnByb3RvdHlwZS5nZXRMaWdodFZhbHVlPWZ1bmN0aW9uKHQsaSl7aWYoXCJwb3NpdGlvblwiPT09dCl7dmFyIGU9dGhpcy5fdHJhbnNpdGlvbnNbdF0uY2FsY3VsYXRlKGkpLG89dXRpbC5zcGhlcmljYWxUb0NhcnRlc2lhbihlKTtyZXR1cm57eDpvWzBdLHk6b1sxXSx6Om9bMl19fXJldHVybiB0aGlzLl90cmFuc2l0aW9uc1t0XS5jYWxjdWxhdGUoaSl9LGkucHJvdG90eXBlLnNldExpZ2h0PWZ1bmN0aW9uKHQpe3ZhciBpPXRoaXM7aWYoIXRoaXMuX3ZhbGlkYXRlKHZhbGlkYXRlU3R5bGUubGlnaHQsdCkpZm9yKHZhciBlIGluIHQpe3ZhciBvPXRbZV07dXRpbC5lbmRzV2l0aChlLFRSQU5TSVRJT05fU1VGRklYKT9pLl90cmFuc2l0aW9uT3B0aW9uc1tlXT1vOm51bGw9PT1vfHx2b2lkIDA9PT1vP2RlbGV0ZSBpLl9kZWNsYXJhdGlvbnNbZV06aS5fZGVjbGFyYXRpb25zW2VdPW5ldyBTdHlsZURlY2xhcmF0aW9uKGkuX3NwZWNpZmljYXRpb25zW2VdLG8pfX0saS5wcm90b3R5cGUucmVjYWxjdWxhdGU9ZnVuY3Rpb24odCl7dmFyIGk9dGhpcztmb3IodmFyIGUgaW4gaS5fZGVjbGFyYXRpb25zKWkuY2FsY3VsYXRlZFtlXT1pLmdldExpZ2h0VmFsdWUoZSx7em9vbTp0fSl9LGkucHJvdG90eXBlLl9hcHBseUxpZ2h0RGVjbGFyYXRpb249ZnVuY3Rpb24odCxpLGUsbyxuKXt2YXIgcj1lLnRyYW5zaXRpb24/dGhpcy5fdHJhbnNpdGlvbnNbdF06dm9pZCAwLGE9dGhpcy5fc3BlY2lmaWNhdGlvbnNbdF07aWYobnVsbCE9PWkmJnZvaWQgMCE9PWl8fChpPW5ldyBTdHlsZURlY2xhcmF0aW9uKGEsYS5kZWZhdWx0KSksIXJ8fHIuZGVjbGFyYXRpb24uanNvbiE9PWkuanNvbil7dmFyIHM9dXRpbC5leHRlbmQoe2R1cmF0aW9uOjMwMCxkZWxheTowfSxvLHRoaXMuZ2V0TGlnaHRQcm9wZXJ0eSh0K1RSQU5TSVRJT05fU1VGRklYKSksbD10aGlzLl90cmFuc2l0aW9uc1t0XT1uZXcgU3R5bGVUcmFuc2l0aW9uKGEsaSxyLHMpO2wuaW5zdGFudCgpfHwobC5sb29wSUQ9bi5zZXQobC5lbmRUaW1lLURhdGUubm93KCkpKSxyJiZuLmNhbmNlbChyLmxvb3BJRCl9fSxpLnByb3RvdHlwZS51cGRhdGVMaWdodFRyYW5zaXRpb25zPWZ1bmN0aW9uKHQsaSxlKXt2YXIgbyxuPXRoaXM7Zm9yKG8gaW4gbi5fZGVjbGFyYXRpb25zKW4uX2FwcGx5TGlnaHREZWNsYXJhdGlvbihvLG4uX2RlY2xhcmF0aW9uc1tvXSx0LGksZSl9LGkucHJvdG90eXBlLl92YWxpZGF0ZT1mdW5jdGlvbih0LGkpe3JldHVybiB2YWxpZGF0ZVN0eWxlLmVtaXRFcnJvcnModGhpcyx0LmNhbGwodmFsaWRhdGVTdHlsZSx1dGlsLmV4dGVuZCh7dmFsdWU6aSxzdHlsZTp7Z2x5cGhzOiEwLHNwcml0ZTohMH0sc3R5bGVTcGVjOnN0eWxlU3BlY30pKSl9LGl9KEV2ZW50ZWQpO21vZHVsZS5leHBvcnRzPUxpZ2h0O1xufSx7XCIuLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3RcIjoxMTksXCIuLi91dGlsL2V2ZW50ZWRcIjoyMDMsXCIuLi91dGlsL3V0aWxcIjoyMTUsXCIuL3N0eWxlX2RlY2xhcmF0aW9uXCI6MTUwLFwiLi9zdHlsZV90cmFuc2l0aW9uXCI6MTU4LFwiLi92YWxpZGF0ZV9zdHlsZVwiOjE1OX1dLDE0OTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgRXZlbnRlZD1fZGVyZXFfKFwiLi4vdXRpbC9ldmVudGVkXCIpLFN0eWxlTGF5ZXI9X2RlcmVxXyhcIi4vc3R5bGVfbGF5ZXJcIiksSW1hZ2VTcHJpdGU9X2RlcmVxXyhcIi4vaW1hZ2Vfc3ByaXRlXCIpLExpZ2h0PV9kZXJlcV8oXCIuL2xpZ2h0XCIpLEdseXBoU291cmNlPV9kZXJlcV8oXCIuLi9zeW1ib2wvZ2x5cGhfc291cmNlXCIpLFNwcml0ZUF0bGFzPV9kZXJlcV8oXCIuLi9zeW1ib2wvc3ByaXRlX2F0bGFzXCIpLExpbmVBdGxhcz1fZGVyZXFfKFwiLi4vcmVuZGVyL2xpbmVfYXRsYXNcIiksdXRpbD1fZGVyZXFfKFwiLi4vdXRpbC91dGlsXCIpLGFqYXg9X2RlcmVxXyhcIi4uL3V0aWwvYWpheFwiKSxtYXBib3g9X2RlcmVxXyhcIi4uL3V0aWwvbWFwYm94XCIpLGJyb3dzZXI9X2RlcmVxXyhcIi4uL3V0aWwvYnJvd3NlclwiKSxEaXNwYXRjaGVyPV9kZXJlcV8oXCIuLi91dGlsL2Rpc3BhdGNoZXJcIiksQW5pbWF0aW9uTG9vcD1fZGVyZXFfKFwiLi9hbmltYXRpb25fbG9vcFwiKSx2YWxpZGF0ZVN0eWxlPV9kZXJlcV8oXCIuL3ZhbGlkYXRlX3N0eWxlXCIpLFNvdXJjZT1fZGVyZXFfKFwiLi4vc291cmNlL3NvdXJjZVwiKSxRdWVyeUZlYXR1cmVzPV9kZXJlcV8oXCIuLi9zb3VyY2UvcXVlcnlfZmVhdHVyZXNcIiksU291cmNlQ2FjaGU9X2RlcmVxXyhcIi4uL3NvdXJjZS9zb3VyY2VfY2FjaGVcIiksc3R5bGVTcGVjPV9kZXJlcV8oXCIuLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3RcIiksTWFwYm94R0xGdW5jdGlvbj1fZGVyZXFfKFwiLi4vc3R5bGUtc3BlYy9mdW5jdGlvblwiKSxnZXRXb3JrZXJQb29sPV9kZXJlcV8oXCIuLi91dGlsL2dsb2JhbF93b3JrZXJfcG9vbFwiKSxkZXJlZj1fZGVyZXFfKFwiLi4vc3R5bGUtc3BlYy9kZXJlZlwiKSxkaWZmPV9kZXJlcV8oXCIuLi9zdHlsZS1zcGVjL2RpZmZcIikscnRsVGV4dFBsdWdpbj1fZGVyZXFfKFwiLi4vc291cmNlL3J0bF90ZXh0X3BsdWdpblwiKSxzdXBwb3J0ZWREaWZmT3BlcmF0aW9ucz11dGlsLnBpY2soZGlmZi5vcGVyYXRpb25zLFtcImFkZExheWVyXCIsXCJyZW1vdmVMYXllclwiLFwic2V0UGFpbnRQcm9wZXJ0eVwiLFwic2V0TGF5b3V0UHJvcGVydHlcIixcInNldEZpbHRlclwiLFwiYWRkU291cmNlXCIsXCJyZW1vdmVTb3VyY2VcIixcInNldExheWVyWm9vbVJhbmdlXCIsXCJzZXRMaWdodFwiLFwic2V0VHJhbnNpdGlvblwiXSksaWdub3JlZERpZmZPcGVyYXRpb25zPXV0aWwucGljayhkaWZmLm9wZXJhdGlvbnMsW1wic2V0Q2VudGVyXCIsXCJzZXRab29tXCIsXCJzZXRCZWFyaW5nXCIsXCJzZXRQaXRjaFwiXSksU3R5bGU9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0LHIsaSl7dmFyIG89dGhpcztlLmNhbGwodGhpcyksdGhpcy5tYXA9cix0aGlzLmFuaW1hdGlvbkxvb3A9ciYmci5hbmltYXRpb25Mb29wfHxuZXcgQW5pbWF0aW9uTG9vcCx0aGlzLmRpc3BhdGNoZXI9bmV3IERpc3BhdGNoZXIoZ2V0V29ya2VyUG9vbCgpLHRoaXMpLHRoaXMuc3ByaXRlQXRsYXM9bmV3IFNwcml0ZUF0bGFzKDEwMjQsMTAyNCksdGhpcy5zcHJpdGVBdGxhcy5zZXRFdmVudGVkUGFyZW50KHRoaXMpLHRoaXMubGluZUF0bGFzPW5ldyBMaW5lQXRsYXMoMjU2LDUxMiksdGhpcy5fbGF5ZXJzPXt9LHRoaXMuX29yZGVyPVtdLHRoaXMuc291cmNlQ2FjaGVzPXt9LHRoaXMuem9vbUhpc3Rvcnk9e30sdGhpcy5fbG9hZGVkPSExLHV0aWwuYmluZEFsbChbXCJfcmVkb1BsYWNlbWVudFwiXSx0aGlzKSx0aGlzLl9yZXNldFVwZGF0ZXMoKSxpPXV0aWwuZXh0ZW5kKHt2YWxpZGF0ZTpcInN0cmluZ1wiIT10eXBlb2YgdHx8IW1hcGJveC5pc01hcGJveFVSTCh0KX0saSksdGhpcy5zZXRFdmVudGVkUGFyZW50KHIpLHRoaXMuZmlyZShcImRhdGFsb2FkaW5nXCIse2RhdGFUeXBlOlwic3R5bGVcIn0pO3ZhciBzPXRoaXM7dGhpcy5fcnRsVGV4dFBsdWdpbkNhbGxiYWNrPXJ0bFRleHRQbHVnaW4ucmVnaXN0ZXJGb3JQbHVnaW5BdmFpbGFiaWxpdHkoZnVuY3Rpb24oZSl7cy5kaXNwYXRjaGVyLmJyb2FkY2FzdChcImxvYWRSVExUZXh0UGx1Z2luXCIsZS5wbHVnaW5CbG9iVVJMLGUuZXJyb3JDYWxsYmFjayk7Zm9yKHZhciB0IGluIHMuc291cmNlQ2FjaGVzKXMuc291cmNlQ2FjaGVzW3RdLnJlbG9hZCgpfSk7dmFyIGE9ZnVuY3Rpb24oZSx0KXtpZihlKXJldHVybiB2b2lkIG8uZmlyZShcImVycm9yXCIse2Vycm9yOmV9KTtpZighaS52YWxpZGF0ZXx8IXZhbGlkYXRlU3R5bGUuZW1pdEVycm9ycyhvLHZhbGlkYXRlU3R5bGUodCkpKXtvLl9sb2FkZWQ9ITAsby5zdHlsZXNoZWV0PXQsby51cGRhdGVDbGFzc2VzKCk7Zm9yKHZhciByIGluIHQuc291cmNlcylvLmFkZFNvdXJjZShyLHQuc291cmNlc1tyXSxpKTt0LnNwcml0ZSYmKG8uc3ByaXRlPW5ldyBJbWFnZVNwcml0ZSh0LnNwcml0ZSxvKSksby5nbHlwaFNvdXJjZT1uZXcgR2x5cGhTb3VyY2UodC5nbHlwaHMpLG8uX3Jlc29sdmUoKSxvLmZpcmUoXCJkYXRhXCIse2RhdGFUeXBlOlwic3R5bGVcIn0pLG8uZmlyZShcInN0eWxlLmxvYWRcIil9fTtcInN0cmluZ1wiPT10eXBlb2YgdD9hamF4LmdldEpTT04obWFwYm94Lm5vcm1hbGl6ZVN0eWxlVVJMKHQpLGEpOmJyb3dzZXIuZnJhbWUoYS5iaW5kKHRoaXMsbnVsbCx0KSksdGhpcy5vbihcImRhdGFcIixmdW5jdGlvbihlKXtpZihcInNvdXJjZVwiPT09ZS5kYXRhVHlwZSYmXCJtZXRhZGF0YVwiPT09ZS5zb3VyY2VEYXRhVHlwZSl7dmFyIHQ9by5zb3VyY2VDYWNoZXNbZS5zb3VyY2VJZF0uZ2V0U291cmNlKCk7aWYodCYmdC52ZWN0b3JMYXllcklkcylmb3IodmFyIHIgaW4gby5fbGF5ZXJzKXt2YXIgaT1vLl9sYXllcnNbcl07aS5zb3VyY2U9PT10LmlkJiZvLl92YWxpZGF0ZUxheWVyKGkpfX19KX1yZXR1cm4gZSYmKHQuX19wcm90b19fPWUpLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUpLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXQsdC5wcm90b3R5cGUuX3ZhbGlkYXRlTGF5ZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zb3VyY2VDYWNoZXNbZS5zb3VyY2VdO2lmKGUuc291cmNlTGF5ZXImJnQpe3ZhciByPXQuZ2V0U291cmNlKCk7KFwiZ2VvanNvblwiPT09ci50eXBlfHxyLnZlY3RvckxheWVySWRzJiZyLnZlY3RvckxheWVySWRzLmluZGV4T2YoZS5zb3VyY2VMYXllcik9PT0tMSkmJnRoaXMuZmlyZShcImVycm9yXCIse2Vycm9yOm5ldyBFcnJvcignU291cmNlIGxheWVyIFwiJytlLnNvdXJjZUxheWVyKydcIiBkb2VzIG5vdCBleGlzdCBvbiBzb3VyY2UgXCInK3IuaWQrJ1wiIGFzIHNwZWNpZmllZCBieSBzdHlsZSBsYXllciBcIicrZS5pZCsnXCInKX0pfX0sdC5wcm90b3R5cGUubG9hZGVkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZighdGhpcy5fbG9hZGVkKXJldHVybiExO2lmKE9iamVjdC5rZXlzKHRoaXMuX3VwZGF0ZWRTb3VyY2VzKS5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciB0IGluIGUuc291cmNlQ2FjaGVzKWlmKCFlLnNvdXJjZUNhY2hlc1t0XS5sb2FkZWQoKSlyZXR1cm4hMTtyZXR1cm4hKHRoaXMuc3ByaXRlJiYhdGhpcy5zcHJpdGUubG9hZGVkKCkpfSx0LnByb3RvdHlwZS5fcmVzb2x2ZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1kZXJlZih0aGlzLnN0eWxlc2hlZXQubGF5ZXJzKTt0aGlzLl9vcmRlcj10Lm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5pZH0pLHRoaXMuX2xheWVycz17fTtmb3IodmFyIHI9MCxpPXQ7cjxpLmxlbmd0aDtyKz0xKXt2YXIgbz1pW3JdO289U3R5bGVMYXllci5jcmVhdGUobyksby5zZXRFdmVudGVkUGFyZW50KGUse2xheWVyOntpZDpvLmlkfX0pLGUuX2xheWVyc1tvLmlkXT1vfXRoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoXCJzZXRMYXllcnNcIix0aGlzLl9zZXJpYWxpemVMYXllcnModGhpcy5fb3JkZXIpKSx0aGlzLmxpZ2h0PW5ldyBMaWdodCh0aGlzLnN0eWxlc2hlZXQubGlnaHQpfSx0LnByb3RvdHlwZS5fc2VyaWFsaXplTGF5ZXJzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIGUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiB0Ll9sYXllcnNbZV0uc2VyaWFsaXplKCl9KX0sdC5wcm90b3R5cGUuX2FwcGx5Q2xhc3Nlcz1mdW5jdGlvbihlLHQpe3ZhciByPXRoaXM7aWYodGhpcy5fbG9hZGVkKXtlPWV8fFtdLHQ9dHx8e3RyYW5zaXRpb246ITB9O3ZhciBpPXRoaXMuc3R5bGVzaGVldC50cmFuc2l0aW9ufHx7fSxvPXRoaXMuX3VwZGF0ZWRBbGxQYWludFByb3BzP3RoaXMuX2xheWVyczp0aGlzLl91cGRhdGVkUGFpbnRQcm9wcztmb3IodmFyIHMgaW4gbyl7dmFyIGE9ci5fbGF5ZXJzW3NdLG49ci5fdXBkYXRlZFBhaW50UHJvcHNbc107aWYoci5fdXBkYXRlZEFsbFBhaW50UHJvcHN8fG4uYWxsKWEudXBkYXRlUGFpbnRUcmFuc2l0aW9ucyhlLHQsaSxyLmFuaW1hdGlvbkxvb3Asci56b29tSGlzdG9yeSk7ZWxzZSBmb3IodmFyIGwgaW4gbilyLl9sYXllcnNbc10udXBkYXRlUGFpbnRUcmFuc2l0aW9uKGwsZSx0LGksci5hbmltYXRpb25Mb29wLHIuem9vbUhpc3RvcnkpfXRoaXMubGlnaHQudXBkYXRlTGlnaHRUcmFuc2l0aW9ucyh0LGksdGhpcy5hbmltYXRpb25Mb29wKX19LHQucHJvdG90eXBlLl9yZWNhbGN1bGF0ZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKHRoaXMuX2xvYWRlZCl7Zm9yKHZhciByIGluIHQuc291cmNlQ2FjaGVzKXQuc291cmNlQ2FjaGVzW3JdLnVzZWQ9ITE7dGhpcy5fdXBkYXRlWm9vbUhpc3RvcnkoZSk7Zm9yKHZhciBpPTAsbz10Ll9vcmRlcjtpPG8ubGVuZ3RoO2krPTEpe3ZhciBzPW9baV0sYT10Ll9sYXllcnNbc107YS5yZWNhbGN1bGF0ZShlKSwhYS5pc0hpZGRlbihlKSYmYS5zb3VyY2UmJih0LnNvdXJjZUNhY2hlc1thLnNvdXJjZV0udXNlZD0hMCl9dGhpcy5saWdodC5yZWNhbGN1bGF0ZShlKTt2YXIgbj0zMDA7TWF0aC5mbG9vcih0aGlzLnopIT09TWF0aC5mbG9vcihlKSYmdGhpcy5hbmltYXRpb25Mb29wLnNldChuKSx0aGlzLno9ZX19LHQucHJvdG90eXBlLl91cGRhdGVab29tSGlzdG9yeT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnpvb21IaXN0b3J5O3ZvaWQgMD09PXQubGFzdEludGVnZXJab29tJiYodC5sYXN0SW50ZWdlclpvb209TWF0aC5mbG9vcihlKSx0Lmxhc3RJbnRlZ2VyWm9vbVRpbWU9MCx0Lmxhc3Rab29tPWUpLE1hdGguZmxvb3IodC5sYXN0Wm9vbSk8TWF0aC5mbG9vcihlKT8odC5sYXN0SW50ZWdlclpvb209TWF0aC5mbG9vcihlKSx0Lmxhc3RJbnRlZ2VyWm9vbVRpbWU9RGF0ZS5ub3coKSk6TWF0aC5mbG9vcih0Lmxhc3Rab29tKT5NYXRoLmZsb29yKGUpJiYodC5sYXN0SW50ZWdlclpvb209TWF0aC5mbG9vcihlKzEpLHQubGFzdEludGVnZXJab29tVGltZT1EYXRlLm5vdygpKSx0Lmxhc3Rab29tPWV9LHQucHJvdG90eXBlLl9jaGVja0xvYWRlZD1mdW5jdGlvbigpe2lmKCF0aGlzLl9sb2FkZWQpdGhyb3cgbmV3IEVycm9yKFwiU3R5bGUgaXMgbm90IGRvbmUgbG9hZGluZ1wiKX0sdC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcztpZih0aGlzLl9jaGFuZ2VkKXt2YXIgaT1PYmplY3Qua2V5cyh0aGlzLl91cGRhdGVkTGF5ZXJzKSxvPU9iamVjdC5rZXlzKHRoaXMuX3JlbW92ZWRMYXllcnMpOyhpLmxlbmd0aHx8by5sZW5ndGh8fHRoaXMuX3VwZGF0ZWRTeW1ib2xPcmRlcikmJnRoaXMuX3VwZGF0ZVdvcmtlckxheWVycyhpLG8pO2Zvcih2YXIgcyBpbiByLl91cGRhdGVkU291cmNlcyl7dmFyIGE9ci5fdXBkYXRlZFNvdXJjZXNbc107XCJyZWxvYWRcIj09PWE/ci5fcmVsb2FkU291cmNlKHMpOlwiY2xlYXJcIj09PWEmJnIuX2NsZWFyU291cmNlKHMpfXRoaXMuX2FwcGx5Q2xhc3NlcyhlLHQpLHRoaXMuX3Jlc2V0VXBkYXRlcygpLHRoaXMuZmlyZShcImRhdGFcIix7ZGF0YVR5cGU6XCJzdHlsZVwifSl9fSx0LnByb3RvdHlwZS5fdXBkYXRlV29ya2VyTGF5ZXJzPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcyxpPXRoaXMuX3VwZGF0ZWRTeW1ib2xPcmRlcj90aGlzLl9vcmRlci5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuXCJzeW1ib2xcIj09PXIuX2xheWVyc1tlXS50eXBlfSk6bnVsbDt0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KFwidXBkYXRlTGF5ZXJzXCIse2xheWVyczp0aGlzLl9zZXJpYWxpemVMYXllcnMoZSkscmVtb3ZlZElkczp0LHN5bWJvbE9yZGVyOml9KX0sdC5wcm90b3R5cGUuX3Jlc2V0VXBkYXRlcz1mdW5jdGlvbigpe3RoaXMuX2NoYW5nZWQ9ITEsdGhpcy5fdXBkYXRlZExheWVycz17fSx0aGlzLl9yZW1vdmVkTGF5ZXJzPXt9LHRoaXMuX3VwZGF0ZWRTeW1ib2xPcmRlcj0hMSx0aGlzLl91cGRhdGVkU291cmNlcz17fSx0aGlzLl91cGRhdGVkUGFpbnRQcm9wcz17fSx0aGlzLl91cGRhdGVkQWxsUGFpbnRQcm9wcz0hMX0sdC5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZih0aGlzLl9jaGVja0xvYWRlZCgpLHZhbGlkYXRlU3R5bGUuZW1pdEVycm9ycyh0aGlzLHZhbGlkYXRlU3R5bGUoZSkpKXJldHVybiExO2U9dXRpbC5leHRlbmQoe30sZSksZS5sYXllcnM9ZGVyZWYoZS5sYXllcnMpO3ZhciByPWRpZmYodGhpcy5zZXJpYWxpemUoKSxlKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIShlLmNvbW1hbmQgaW4gaWdub3JlZERpZmZPcGVyYXRpb25zKX0pO2lmKDA9PT1yLmxlbmd0aClyZXR1cm4hMTt2YXIgaT1yLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hKGUuY29tbWFuZCBpbiBzdXBwb3J0ZWREaWZmT3BlcmF0aW9ucyl9KTtpZihpLmxlbmd0aD4wKXRocm93IG5ldyBFcnJvcihcIlVuaW1wbGVtZW50ZWQ6IFwiK2kubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNvbW1hbmR9KS5qb2luKFwiLCBcIikrXCIuXCIpO3JldHVybiByLmZvckVhY2goZnVuY3Rpb24oZSl7XCJzZXRUcmFuc2l0aW9uXCIhPT1lLmNvbW1hbmQmJnRbZS5jb21tYW5kXS5hcHBseSh0LGUuYXJncyl9KSx0aGlzLnN0eWxlc2hlZXQ9ZSwhMH0sdC5wcm90b3R5cGUuYWRkU291cmNlPWZ1bmN0aW9uKGUsdCxyKXt2YXIgaT10aGlzO2lmKHRoaXMuX2NoZWNrTG9hZGVkKCksdm9pZCAwIT09dGhpcy5zb3VyY2VDYWNoZXNbZV0pdGhyb3cgbmV3IEVycm9yKFwiVGhlcmUgaXMgYWxyZWFkeSBhIHNvdXJjZSB3aXRoIHRoaXMgSURcIik7aWYoIXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoXCJUaGUgdHlwZSBwcm9wZXJ0eSBtdXN0IGJlIGRlZmluZWQsIGJ1dCB0aGUgb25seSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgd2VyZSBnaXZlbjogXCIrT2JqZWN0LmtleXModCkrXCIuXCIpO3ZhciBvPVtcInZlY3RvclwiLFwicmFzdGVyXCIsXCJnZW9qc29uXCIsXCJ2aWRlb1wiLFwiaW1hZ2VcIixcImNhbnZhc1wiXSxzPW8uaW5kZXhPZih0LnR5cGUpPj0wO2lmKCFzfHwhdGhpcy5fdmFsaWRhdGUodmFsaWRhdGVTdHlsZS5zb3VyY2UsXCJzb3VyY2VzLlwiK2UsdCxudWxsLHIpKXt2YXIgYT10aGlzLnNvdXJjZUNhY2hlc1tlXT1uZXcgU291cmNlQ2FjaGUoZSx0LHRoaXMuZGlzcGF0Y2hlcik7YS5zdHlsZT10aGlzLGEuc2V0RXZlbnRlZFBhcmVudCh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJue2lzU291cmNlTG9hZGVkOmkubG9hZGVkKCksc291cmNlOmEuc2VyaWFsaXplKCksc291cmNlSWQ6ZX19KSxhLm9uQWRkKHRoaXMubWFwKSx0aGlzLl9jaGFuZ2VkPSEwfX0sdC5wcm90b3R5cGUucmVtb3ZlU291cmNlPWZ1bmN0aW9uKGUpe2lmKHRoaXMuX2NoZWNrTG9hZGVkKCksdm9pZCAwPT09dGhpcy5zb3VyY2VDYWNoZXNbZV0pdGhyb3cgbmV3IEVycm9yKFwiVGhlcmUgaXMgbm8gc291cmNlIHdpdGggdGhpcyBJRFwiKTt2YXIgdD10aGlzLnNvdXJjZUNhY2hlc1tlXTtkZWxldGUgdGhpcy5zb3VyY2VDYWNoZXNbZV0sZGVsZXRlIHRoaXMuX3VwZGF0ZWRTb3VyY2VzW2VdLHQuc2V0RXZlbnRlZFBhcmVudChudWxsKSx0LmNsZWFyVGlsZXMoKSx0Lm9uUmVtb3ZlJiZ0Lm9uUmVtb3ZlKHRoaXMubWFwKSx0aGlzLl9jaGFuZ2VkPSEwfSx0LnByb3RvdHlwZS5nZXRTb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc291cmNlQ2FjaGVzW2VdJiZ0aGlzLnNvdXJjZUNhY2hlc1tlXS5nZXRTb3VyY2UoKX0sdC5wcm90b3R5cGUuYWRkTGF5ZXI9ZnVuY3Rpb24oZSx0LHIpe3RoaXMuX2NoZWNrTG9hZGVkKCk7dmFyIGk9ZS5pZDtpZihcIm9iamVjdFwiPT10eXBlb2YgZS5zb3VyY2UmJih0aGlzLmFkZFNvdXJjZShpLGUuc291cmNlKSxlPXV0aWwuZXh0ZW5kKGUse3NvdXJjZTppfSkpLCF0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLmxheWVyLFwibGF5ZXJzLlwiK2ksZSx7YXJyYXlJbmRleDotMX0scikpe3ZhciBvPVN0eWxlTGF5ZXIuY3JlYXRlKGUpO3RoaXMuX3ZhbGlkYXRlTGF5ZXIobyksby5zZXRFdmVudGVkUGFyZW50KHRoaXMse2xheWVyOntpZDppfX0pO3ZhciBzPXQ/dGhpcy5fb3JkZXIuaW5kZXhPZih0KTp0aGlzLl9vcmRlci5sZW5ndGg7aWYodGhpcy5fb3JkZXIuc3BsaWNlKHMsMCxpKSx0aGlzLl9sYXllcnNbaV09byx0aGlzLl9yZW1vdmVkTGF5ZXJzW2ldJiZvLnNvdXJjZSl7dmFyIGE9dGhpcy5fcmVtb3ZlZExheWVyc1tpXTtkZWxldGUgdGhpcy5fcmVtb3ZlZExheWVyc1tpXSx0aGlzLl91cGRhdGVkU291cmNlc1tvLnNvdXJjZV09YS50eXBlIT09by50eXBlP1wiY2xlYXJcIjpcInJlbG9hZFwifXRoaXMuX3VwZGF0ZUxheWVyKG8pLFwic3ltYm9sXCI9PT1vLnR5cGUmJih0aGlzLl91cGRhdGVkU3ltYm9sT3JkZXI9ITApLHRoaXMudXBkYXRlQ2xhc3NlcyhpKX19LHQucHJvdG90eXBlLm1vdmVMYXllcj1mdW5jdGlvbihlLHQpe3RoaXMuX2NoZWNrTG9hZGVkKCksdGhpcy5fY2hhbmdlZD0hMDt2YXIgcj10aGlzLl9sYXllcnNbZV07aWYoIXIpcmV0dXJuIHZvaWQgdGhpcy5maXJlKFwiZXJyb3JcIix7ZXJyb3I6bmV3IEVycm9yKFwiVGhlIGxheWVyICdcIitlK1wiJyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSBtb3ZlZC5cIil9KTt2YXIgaT10aGlzLl9vcmRlci5pbmRleE9mKGUpO3RoaXMuX29yZGVyLnNwbGljZShpLDEpO3ZhciBvPXQ/dGhpcy5fb3JkZXIuaW5kZXhPZih0KTp0aGlzLl9vcmRlci5sZW5ndGg7dGhpcy5fb3JkZXIuc3BsaWNlKG8sMCxlKSxcInN5bWJvbFwiPT09ci50eXBlJiYodGhpcy5fdXBkYXRlZFN5bWJvbE9yZGVyPSEwLHIuc291cmNlJiYhdGhpcy5fdXBkYXRlZFNvdXJjZXNbci5zb3VyY2VdJiYodGhpcy5fdXBkYXRlZFNvdXJjZXNbci5zb3VyY2VdPVwicmVsb2FkXCIpKX0sdC5wcm90b3R5cGUucmVtb3ZlTGF5ZXI9ZnVuY3Rpb24oZSl7dGhpcy5fY2hlY2tMb2FkZWQoKTt2YXIgdD10aGlzLl9sYXllcnNbZV07aWYoIXQpcmV0dXJuIHZvaWQgdGhpcy5maXJlKFwiZXJyb3JcIix7ZXJyb3I6bmV3IEVycm9yKFwiVGhlIGxheWVyICdcIitlK1wiJyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSByZW1vdmVkLlwiKX0pO3Quc2V0RXZlbnRlZFBhcmVudChudWxsKTt2YXIgcj10aGlzLl9vcmRlci5pbmRleE9mKGUpO3RoaXMuX29yZGVyLnNwbGljZShyLDEpLFwic3ltYm9sXCI9PT10LnR5cGUmJih0aGlzLl91cGRhdGVkU3ltYm9sT3JkZXI9ITApLHRoaXMuX2NoYW5nZWQ9ITAsdGhpcy5fcmVtb3ZlZExheWVyc1tlXT10LGRlbGV0ZSB0aGlzLl9sYXllcnNbZV0sZGVsZXRlIHRoaXMuX3VwZGF0ZWRMYXllcnNbZV0sZGVsZXRlIHRoaXMuX3VwZGF0ZWRQYWludFByb3BzW2VdfSx0LnByb3RvdHlwZS5nZXRMYXllcj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fbGF5ZXJzW2VdfSx0LnByb3RvdHlwZS5zZXRMYXllclpvb21SYW5nZT1mdW5jdGlvbihlLHQscil7dGhpcy5fY2hlY2tMb2FkZWQoKTt2YXIgaT10aGlzLmdldExheWVyKGUpO3JldHVybiBpP3ZvaWQoaS5taW56b29tPT09dCYmaS5tYXh6b29tPT09cnx8KG51bGwhPXQmJihpLm1pbnpvb209dCksbnVsbCE9ciYmKGkubWF4em9vbT1yKSx0aGlzLl91cGRhdGVMYXllcihpKSkpOnZvaWQgdGhpcy5maXJlKFwiZXJyb3JcIix7ZXJyb3I6bmV3IEVycm9yKFwiVGhlIGxheWVyICdcIitlK1wiJyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBoYXZlIHpvb20gZXh0ZW50LlwiKX0pfSx0LnByb3RvdHlwZS5zZXRGaWx0ZXI9ZnVuY3Rpb24oZSx0KXt0aGlzLl9jaGVja0xvYWRlZCgpO3ZhciByPXRoaXMuZ2V0TGF5ZXIoZSk7cmV0dXJuIHI/dm9pZChudWxsIT09dCYmdm9pZCAwIT09dCYmdGhpcy5fdmFsaWRhdGUodmFsaWRhdGVTdHlsZS5maWx0ZXIsXCJsYXllcnMuXCIrci5pZCtcIi5maWx0ZXJcIix0KXx8dXRpbC5kZWVwRXF1YWwoci5maWx0ZXIsdCl8fChyLmZpbHRlcj11dGlsLmNsb25lKHQpLHRoaXMuX3VwZGF0ZUxheWVyKHIpKSk6dm9pZCB0aGlzLmZpcmUoXCJlcnJvclwiLHtlcnJvcjpuZXcgRXJyb3IoXCJUaGUgbGF5ZXIgJ1wiK2UrXCInIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIGZpbHRlcmVkLlwiKX0pfSx0LnByb3RvdHlwZS5nZXRGaWx0ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIHV0aWwuY2xvbmUodGhpcy5nZXRMYXllcihlKS5maWx0ZXIpfSx0LnByb3RvdHlwZS5zZXRMYXlvdXRQcm9wZXJ0eT1mdW5jdGlvbihlLHQscil7dGhpcy5fY2hlY2tMb2FkZWQoKTt2YXIgaT10aGlzLmdldExheWVyKGUpO3JldHVybiBpP3ZvaWQodXRpbC5kZWVwRXF1YWwoaS5nZXRMYXlvdXRQcm9wZXJ0eSh0KSxyKXx8KGkuc2V0TGF5b3V0UHJvcGVydHkodCxyKSx0aGlzLl91cGRhdGVMYXllcihpKSkpOnZvaWQgdGhpcy5maXJlKFwiZXJyb3JcIix7ZXJyb3I6bmV3IEVycm9yKFwiVGhlIGxheWVyICdcIitlK1wiJyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSBzdHlsZWQuXCIpfSl9LHQucHJvdG90eXBlLmdldExheW91dFByb3BlcnR5PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZ2V0TGF5ZXIoZSkuZ2V0TGF5b3V0UHJvcGVydHkodCl9LHQucHJvdG90eXBlLnNldFBhaW50UHJvcGVydHk9ZnVuY3Rpb24oZSx0LHIsaSl7dGhpcy5fY2hlY2tMb2FkZWQoKTt2YXIgbz10aGlzLmdldExheWVyKGUpO2lmKCFvKXJldHVybiB2b2lkIHRoaXMuZmlyZShcImVycm9yXCIse2Vycm9yOm5ldyBFcnJvcihcIlRoZSBsYXllciAnXCIrZStcIicgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlIGFuZCBjYW5ub3QgYmUgc3R5bGVkLlwiKX0pO2lmKCF1dGlsLmRlZXBFcXVhbChvLmdldFBhaW50UHJvcGVydHkodCxpKSxyKSl7dmFyIHM9by5pc1BhaW50VmFsdWVGZWF0dXJlQ29uc3RhbnQodCk7by5zZXRQYWludFByb3BlcnR5KHQscixpKTt2YXIgYT0hKHImJk1hcGJveEdMRnVuY3Rpb24uaXNGdW5jdGlvbkRlZmluaXRpb24ocikmJlwiJHpvb21cIiE9PXIucHJvcGVydHkmJnZvaWQgMCE9PXIucHJvcGVydHkpO2EmJnN8fHRoaXMuX3VwZGF0ZUxheWVyKG8pLHRoaXMudXBkYXRlQ2xhc3NlcyhlLHQpfX0sdC5wcm90b3R5cGUuZ2V0UGFpbnRQcm9wZXJ0eT1mdW5jdGlvbihlLHQscil7cmV0dXJuIHRoaXMuZ2V0TGF5ZXIoZSkuZ2V0UGFpbnRQcm9wZXJ0eSh0LHIpfSx0LnByb3RvdHlwZS5nZXRUcmFuc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHV0aWwuZXh0ZW5kKHtkdXJhdGlvbjozMDAsZGVsYXk6MH0sdGhpcy5zdHlsZXNoZWV0JiZ0aGlzLnN0eWxlc2hlZXQudHJhbnNpdGlvbil9LHQucHJvdG90eXBlLnVwZGF0ZUNsYXNzZXM9ZnVuY3Rpb24oZSx0KXtpZih0aGlzLl9jaGFuZ2VkPSEwLGUpe3ZhciByPXRoaXMuX3VwZGF0ZWRQYWludFByb3BzO3JbZV18fChyW2VdPXt9KSxyW2VdW3R8fFwiYWxsXCJdPSEwfWVsc2UgdGhpcy5fdXBkYXRlZEFsbFBhaW50UHJvcHM9ITB9LHQucHJvdG90eXBlLnNlcmlhbGl6ZT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIHV0aWwuZmlsdGVyT2JqZWN0KHt2ZXJzaW9uOnRoaXMuc3R5bGVzaGVldC52ZXJzaW9uLG5hbWU6dGhpcy5zdHlsZXNoZWV0Lm5hbWUsbWV0YWRhdGE6dGhpcy5zdHlsZXNoZWV0Lm1ldGFkYXRhLGxpZ2h0OnRoaXMuc3R5bGVzaGVldC5saWdodCxjZW50ZXI6dGhpcy5zdHlsZXNoZWV0LmNlbnRlcix6b29tOnRoaXMuc3R5bGVzaGVldC56b29tLGJlYXJpbmc6dGhpcy5zdHlsZXNoZWV0LmJlYXJpbmcscGl0Y2g6dGhpcy5zdHlsZXNoZWV0LnBpdGNoLHNwcml0ZTp0aGlzLnN0eWxlc2hlZXQuc3ByaXRlLGdseXBoczp0aGlzLnN0eWxlc2hlZXQuZ2x5cGhzLHRyYW5zaXRpb246dGhpcy5zdHlsZXNoZWV0LnRyYW5zaXRpb24sc291cmNlczp1dGlsLm1hcE9iamVjdCh0aGlzLnNvdXJjZUNhY2hlcyxmdW5jdGlvbihlKXtyZXR1cm4gZS5zZXJpYWxpemUoKX0pLGxheWVyczp0aGlzLl9vcmRlci5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGUuX2xheWVyc1t0XS5zZXJpYWxpemUoKX0pfSxmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwIT09ZX0pfSx0LnByb3RvdHlwZS5fdXBkYXRlTGF5ZXI9ZnVuY3Rpb24oZSl7dGhpcy5fdXBkYXRlZExheWVyc1tlLmlkXT0hMCxlLnNvdXJjZSYmIXRoaXMuX3VwZGF0ZWRTb3VyY2VzW2Uuc291cmNlXSYmKHRoaXMuX3VwZGF0ZWRTb3VyY2VzW2Uuc291cmNlXT1cInJlbG9hZFwiKSx0aGlzLl9jaGFuZ2VkPSEwfSx0LnByb3RvdHlwZS5fZmxhdHRlblJlbmRlcmVkRmVhdHVyZXM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMscj1bXSxpPXRoaXMuX29yZGVyLmxlbmd0aC0xO2k+PTA7aS0tKWZvcih2YXIgbz10Ll9vcmRlcltpXSxzPTAsYT1lO3M8YS5sZW5ndGg7cys9MSl7dmFyIG49YVtzXSxsPW5bb107aWYobClmb3IodmFyIGQ9MCx1PWw7ZDx1Lmxlbmd0aDtkKz0xKXt2YXIgaD11W2RdO3IucHVzaChoKX19cmV0dXJuIHJ9LHQucHJvdG90eXBlLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcz1mdW5jdGlvbihlLHQscixpKXt2YXIgbz10aGlzO3QmJnQuZmlsdGVyJiZ0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLmZpbHRlcixcInF1ZXJ5UmVuZGVyZWRGZWF0dXJlcy5maWx0ZXJcIix0LmZpbHRlcik7dmFyIHM9e307aWYodCYmdC5sYXllcnMpe2lmKCFBcnJheS5pc0FycmF5KHQubGF5ZXJzKSlyZXR1cm4gdm9pZCB0aGlzLmZpcmUoXCJlcnJvclwiLHtlcnJvcjpcInBhcmFtZXRlcnMubGF5ZXJzIG11c3QgYmUgYW4gQXJyYXkuXCJ9KTtmb3IodmFyIGE9MCxuPXQubGF5ZXJzO2E8bi5sZW5ndGg7YSs9MSl7dmFyIGw9blthXSxkPW8uX2xheWVyc1tsXTtpZighZClyZXR1cm4gdm9pZCBvLmZpcmUoXCJlcnJvclwiLHtlcnJvcjpcIlRoZSBsYXllciAnXCIrbCtcIicgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlIGFuZCBjYW5ub3QgYmUgcXVlcmllZCBmb3IgZmVhdHVyZXMuXCJ9KTtzW2Quc291cmNlXT0hMH19dmFyIHU9W107Zm9yKHZhciBoIGluIG8uc291cmNlQ2FjaGVzKWlmKCF0LmxheWVyc3x8c1toXSl7dmFyIGM9UXVlcnlGZWF0dXJlcy5yZW5kZXJlZChvLnNvdXJjZUNhY2hlc1toXSxvLl9sYXllcnMsZSx0LHIsaSk7dS5wdXNoKGMpfXJldHVybiB0aGlzLl9mbGF0dGVuUmVuZGVyZWRGZWF0dXJlcyh1KX0sdC5wcm90b3R5cGUucXVlcnlTb3VyY2VGZWF0dXJlcz1mdW5jdGlvbihlLHQpe3QmJnQuZmlsdGVyJiZ0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLmZpbHRlcixcInF1ZXJ5U291cmNlRmVhdHVyZXMuZmlsdGVyXCIsdC5maWx0ZXIpO3ZhciByPXRoaXMuc291cmNlQ2FjaGVzW2VdO3JldHVybiByP1F1ZXJ5RmVhdHVyZXMuc291cmNlKHIsdCk6W119LHQucHJvdG90eXBlLmFkZFNvdXJjZVR5cGU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBTb3VyY2UuZ2V0VHlwZShlKT9yKG5ldyBFcnJvcignQSBzb3VyY2UgdHlwZSBjYWxsZWQgXCInK2UrJ1wiIGFscmVhZHkgZXhpc3RzLicpKTooU291cmNlLnNldFR5cGUoZSx0KSx0LndvcmtlclNvdXJjZVVSTD92b2lkIHRoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoXCJsb2FkV29ya2VyU291cmNlXCIse25hbWU6ZSx1cmw6dC53b3JrZXJTb3VyY2VVUkx9LHIpOnIobnVsbCxudWxsKSl9LHQucHJvdG90eXBlLmdldExpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGlnaHQuZ2V0TGlnaHQoKX0sdC5wcm90b3R5cGUuc2V0TGlnaHQ9ZnVuY3Rpb24oZSx0KXt0aGlzLl9jaGVja0xvYWRlZCgpO3ZhciByPXRoaXMubGlnaHQuZ2V0TGlnaHQoKSxpPSExO2Zvcih2YXIgbyBpbiBlKWlmKCF1dGlsLmRlZXBFcXVhbChlW29dLHJbb10pKXtpPSEwO2JyZWFrfWlmKGkpe3ZhciBzPXRoaXMuc3R5bGVzaGVldC50cmFuc2l0aW9ufHx7fTt0aGlzLmxpZ2h0LnNldExpZ2h0KGUpLHRoaXMubGlnaHQudXBkYXRlTGlnaHRUcmFuc2l0aW9ucyh0fHx7dHJhbnNpdGlvbjohMH0scyx0aGlzLmFuaW1hdGlvbkxvb3ApfX0sdC5wcm90b3R5cGUuX3ZhbGlkYXRlPWZ1bmN0aW9uKGUsdCxyLGksbyl7cmV0dXJuKCFvfHxvLnZhbGlkYXRlIT09ITEpJiZ2YWxpZGF0ZVN0eWxlLmVtaXRFcnJvcnModGhpcyxlLmNhbGwodmFsaWRhdGVTdHlsZSx1dGlsLmV4dGVuZCh7a2V5OnQsc3R5bGU6dGhpcy5zZXJpYWxpemUoKSx2YWx1ZTpyLHN0eWxlU3BlYzpzdHlsZVNwZWN9LGkpKSl9LHQucHJvdG90eXBlLl9yZW1vdmU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3J0bFRleHRQbHVnaW4uZXZlbnRlZC5vZmYoXCJwbHVnaW5BdmFpbGFibGVcIix0aGlzLl9ydGxUZXh0UGx1Z2luQ2FsbGJhY2spO2Zvcih2YXIgdCBpbiBlLnNvdXJjZUNhY2hlcyllLnNvdXJjZUNhY2hlc1t0XS5jbGVhclRpbGVzKCk7dGhpcy5kaXNwYXRjaGVyLnJlbW92ZSgpfSx0LnByb3RvdHlwZS5fY2xlYXJTb3VyY2U9ZnVuY3Rpb24oZSl7dGhpcy5zb3VyY2VDYWNoZXNbZV0uY2xlYXJUaWxlcygpfSx0LnByb3RvdHlwZS5fcmVsb2FkU291cmNlPWZ1bmN0aW9uKGUpe3RoaXMuc291cmNlQ2FjaGVzW2VdLnJlbG9hZCgpfSx0LnByb3RvdHlwZS5fdXBkYXRlU291cmNlcz1mdW5jdGlvbihlKXt2YXIgdD10aGlzO2Zvcih2YXIgciBpbiB0LnNvdXJjZUNhY2hlcyl0LnNvdXJjZUNhY2hlc1tyXS51cGRhdGUoZSl9LHQucHJvdG90eXBlLl9yZWRvUGxhY2VtZW50PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztmb3IodmFyIHQgaW4gZS5zb3VyY2VDYWNoZXMpZS5zb3VyY2VDYWNoZXNbdF0ucmVkb1BsYWNlbWVudCgpfSx0LnByb3RvdHlwZS5nZXRJY29ucz1mdW5jdGlvbihlLHQscil7dmFyIGk9dGhpcyxvPWZ1bmN0aW9uKCl7aS5zcHJpdGVBdGxhcy5zZXRTcHJpdGUoaS5zcHJpdGUpLGkuc3ByaXRlQXRsYXMuYWRkSWNvbnModC5pY29ucyxyKX07IXRoaXMuc3ByaXRlfHx0aGlzLnNwcml0ZS5sb2FkZWQoKT9vKCk6dGhpcy5zcHJpdGUub24oXCJkYXRhXCIsbyl9LHQucHJvdG90eXBlLmdldEdseXBocz1mdW5jdGlvbihlLHQscil7ZnVuY3Rpb24gaShlLHQsaSl7ZSYmY29uc29sZS5lcnJvcihlKSxuW2ldPXQsYS0tLDA9PT1hJiZyKG51bGwsbil9dmFyIG89dGhpcyxzPXQuc3RhY2tzLGE9T2JqZWN0LmtleXMocykubGVuZ3RoLG49e307Zm9yKHZhciBsIGluIHMpby5nbHlwaFNvdXJjZS5nZXRTaW1wbGVHbHlwaHMobCxzW2xdLHQudWlkLGkpfSx0fShFdmVudGVkKTttb2R1bGUuZXhwb3J0cz1TdHlsZTtcbn0se1wiLi4vcmVuZGVyL2xpbmVfYXRsYXNcIjo3NixcIi4uL3NvdXJjZS9xdWVyeV9mZWF0dXJlc1wiOjg5LFwiLi4vc291cmNlL3J0bF90ZXh0X3BsdWdpblwiOjkxLFwiLi4vc291cmNlL3NvdXJjZVwiOjkyLFwiLi4vc291cmNlL3NvdXJjZV9jYWNoZVwiOjkzLFwiLi4vc3R5bGUtc3BlYy9kZXJlZlwiOjEwMixcIi4uL3N0eWxlLXNwZWMvZGlmZlwiOjEwMyxcIi4uL3N0eWxlLXNwZWMvZnVuY3Rpb25cIjoxMDcsXCIuLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3RcIjoxMTksXCIuLi9zeW1ib2wvZ2x5cGhfc291cmNlXCI6MTY4LFwiLi4vc3ltYm9sL3Nwcml0ZV9hdGxhc1wiOjE3MixcIi4uL3V0aWwvYWpheFwiOjE5NCxcIi4uL3V0aWwvYnJvd3NlclwiOjE5NSxcIi4uL3V0aWwvZGlzcGF0Y2hlclwiOjIwMSxcIi4uL3V0aWwvZXZlbnRlZFwiOjIwMyxcIi4uL3V0aWwvZ2xvYmFsX3dvcmtlcl9wb29sXCI6MjA1LFwiLi4vdXRpbC9tYXBib3hcIjoyMTAsXCIuLi91dGlsL3V0aWxcIjoyMTUsXCIuL2FuaW1hdGlvbl9sb29wXCI6MTQ2LFwiLi9pbWFnZV9zcHJpdGVcIjoxNDcsXCIuL2xpZ2h0XCI6MTQ4LFwiLi9zdHlsZV9sYXllclwiOjE1MSxcIi4vdmFsaWRhdGVfc3R5bGVcIjoxNTl9XSwxNTA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIGNyZWF0ZUZ1bmN0aW9uPV9kZXJlcV8oXCIuLi9zdHlsZS1zcGVjL2Z1bmN0aW9uXCIpLHV0aWw9X2RlcmVxXyhcIi4uL3V0aWwvdXRpbFwiKSxTdHlsZURlY2xhcmF0aW9uPWZ1bmN0aW9uKHQsaSl7dmFyIG89dGhpcztpZih0aGlzLnZhbHVlPXV0aWwuY2xvbmUoaSksdGhpcy5pc0Z1bmN0aW9uPWNyZWF0ZUZ1bmN0aW9uLmlzRnVuY3Rpb25EZWZpbml0aW9uKGkpLHRoaXMuanNvbj1KU09OLnN0cmluZ2lmeSh0aGlzLnZhbHVlKSx0aGlzLm1pbmltdW09dC5taW5pbXVtLHRoaXMuZnVuY3Rpb249Y3JlYXRlRnVuY3Rpb24odGhpcy52YWx1ZSx0KSx0aGlzLmlzRmVhdHVyZUNvbnN0YW50PXRoaXMuZnVuY3Rpb24uaXNGZWF0dXJlQ29uc3RhbnQsdGhpcy5pc1pvb21Db25zdGFudD10aGlzLmZ1bmN0aW9uLmlzWm9vbUNvbnN0YW50LHRoaXMuaXNGZWF0dXJlQ29uc3RhbnR8fHRoaXMuaXNab29tQ29uc3RhbnQpe2lmKCF0aGlzLmlzWm9vbUNvbnN0YW50KXt0aGlzLnN0b3Bab29tTGV2ZWxzPVtdO2Zvcih2YXIgbj0wLHM9by52YWx1ZS5zdG9wcztuPHMubGVuZ3RoO24rPTEpe3ZhciBlPXNbbl07by5zdG9wWm9vbUxldmVscy5pbmRleE9mKGVbMF0pPDAmJm8uc3RvcFpvb21MZXZlbHMucHVzaChlWzBdKX19fWVsc2V7dGhpcy5zdG9wWm9vbUxldmVscz1bXTtmb3IodmFyIGE9W10sdT0wLGw9by52YWx1ZS5zdG9wczt1PGwubGVuZ3RoO3UrPTEpe3ZhciByPWxbdV0sYz1yWzBdLnpvb207by5zdG9wWm9vbUxldmVscy5pbmRleE9mKGMpPDAmJihvLnN0b3Bab29tTGV2ZWxzLnB1c2goYyksYS5wdXNoKFtjLGEubGVuZ3RoXSkpfXRoaXMuX2Z1bmN0aW9uSW50ZXJwb2xhdGlvblQ9Y3JlYXRlRnVuY3Rpb24oe3R5cGU6XCJleHBvbmVudGlhbFwiLHN0b3BzOmEsYmFzZTppLmJhc2V9LHt0eXBlOlwibnVtYmVyXCJ9KX19O1N0eWxlRGVjbGFyYXRpb24ucHJvdG90eXBlLmNhbGN1bGF0ZT1mdW5jdGlvbih0LGkpe3ZhciBvPXRoaXMuZnVuY3Rpb24odCYmdC56b29tLGl8fHt9KTtyZXR1cm4gdm9pZCAwIT09dGhpcy5taW5pbXVtJiZvPHRoaXMubWluaW11bT90aGlzLm1pbmltdW06b30sU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUuY2FsY3VsYXRlSW50ZXJwb2xhdGlvblQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXNGZWF0dXJlQ29uc3RhbnR8fHRoaXMuaXNab29tQ29uc3RhbnQ/MDp0aGlzLl9mdW5jdGlvbkludGVycG9sYXRpb25UKHQmJnQuem9vbSx7fSl9LG1vZHVsZS5leHBvcnRzPVN0eWxlRGVjbGFyYXRpb247XG59LHtcIi4uL3N0eWxlLXNwZWMvZnVuY3Rpb25cIjoxMDcsXCIuLi91dGlsL3V0aWxcIjoyMTV9XSwxNTE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25WYWx1ZSh0KXtyZXR1cm4gdC52YWx1ZX12YXIgdXRpbD1fZGVyZXFfKFwiLi4vdXRpbC91dGlsXCIpLFN0eWxlVHJhbnNpdGlvbj1fZGVyZXFfKFwiLi9zdHlsZV90cmFuc2l0aW9uXCIpLFN0eWxlRGVjbGFyYXRpb249X2RlcmVxXyhcIi4vc3R5bGVfZGVjbGFyYXRpb25cIiksc3R5bGVTcGVjPV9kZXJlcV8oXCIuLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3RcIiksdmFsaWRhdGVTdHlsZT1fZGVyZXFfKFwiLi92YWxpZGF0ZV9zdHlsZVwiKSxwYXJzZUNvbG9yPV9kZXJlcV8oXCIuLy4uL3N0eWxlLXNwZWMvdXRpbC9wYXJzZV9jb2xvclwiKSxFdmVudGVkPV9kZXJlcV8oXCIuLi91dGlsL2V2ZW50ZWRcIiksVFJBTlNJVElPTl9TVUZGSVg9XCItdHJhbnNpdGlvblwiLFN0eWxlTGF5ZXI9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gaShpKXt2YXIgYT10aGlzO3QuY2FsbCh0aGlzKSx0aGlzLmlkPWkuaWQsdGhpcy5tZXRhZGF0YT1pLm1ldGFkYXRhLHRoaXMudHlwZT1pLnR5cGUsdGhpcy5zb3VyY2U9aS5zb3VyY2UsdGhpcy5zb3VyY2VMYXllcj1pW1wic291cmNlLWxheWVyXCJdLHRoaXMubWluem9vbT1pLm1pbnpvb20sdGhpcy5tYXh6b29tPWkubWF4em9vbSx0aGlzLmZpbHRlcj1pLmZpbHRlcix0aGlzLnBhaW50PXt9LHRoaXMubGF5b3V0PXt9LHRoaXMuX3BhaW50U3BlY2lmaWNhdGlvbnM9c3R5bGVTcGVjW1wicGFpbnRfXCIrdGhpcy50eXBlXSx0aGlzLl9sYXlvdXRTcGVjaWZpY2F0aW9ucz1zdHlsZVNwZWNbXCJsYXlvdXRfXCIrdGhpcy50eXBlXSx0aGlzLl9wYWludFRyYW5zaXRpb25zPXt9LHRoaXMuX3BhaW50VHJhbnNpdGlvbk9wdGlvbnM9e30sdGhpcy5fcGFpbnREZWNsYXJhdGlvbnM9e30sdGhpcy5fbGF5b3V0RGVjbGFyYXRpb25zPXt9LHRoaXMuX2xheW91dEZ1bmN0aW9ucz17fTt2YXIgZSxvLG49e3ZhbGlkYXRlOiExfTtmb3IodmFyIHIgaW4gaSl7dmFyIHM9ci5tYXRjaCgvXnBhaW50KD86XFwuKC4qKSk/JC8pO2lmKHMpe3ZhciBsPXNbMV18fFwiXCI7Zm9yKGUgaW4gaVtyXSlhLnNldFBhaW50UHJvcGVydHkoZSxpW3JdW2VdLGwsbil9fWZvcihvIGluIGkubGF5b3V0KWEuc2V0TGF5b3V0UHJvcGVydHkobyxpLmxheW91dFtvXSxuKTtmb3IoZSBpbiBhLl9wYWludFNwZWNpZmljYXRpb25zKWEucGFpbnRbZV09YS5nZXRQYWludFZhbHVlKGUpO2ZvcihvIGluIGEuX2xheW91dFNwZWNpZmljYXRpb25zKWEuX3VwZGF0ZUxheW91dFZhbHVlKG8pfXJldHVybiB0JiYoaS5fX3Byb3RvX189dCksaS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksaS5wcm90b3R5cGUuY29uc3RydWN0b3I9aSxpLnByb3RvdHlwZS5zZXRMYXlvdXRQcm9wZXJ0eT1mdW5jdGlvbih0LGksYSl7aWYobnVsbD09aSlkZWxldGUgdGhpcy5fbGF5b3V0RGVjbGFyYXRpb25zW3RdO2Vsc2V7dmFyIGU9XCJsYXllcnMuXCIrdGhpcy5pZCtcIi5sYXlvdXQuXCIrdDtpZih0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLmxheW91dFByb3BlcnR5LGUsdCxpLGEpKXJldHVybjt0aGlzLl9sYXlvdXREZWNsYXJhdGlvbnNbdF09bmV3IFN0eWxlRGVjbGFyYXRpb24odGhpcy5fbGF5b3V0U3BlY2lmaWNhdGlvbnNbdF0saSl9dGhpcy5fdXBkYXRlTGF5b3V0VmFsdWUodCl9LGkucHJvdG90eXBlLmdldExheW91dFByb3BlcnR5PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9sYXlvdXREZWNsYXJhdGlvbnNbdF0mJnRoaXMuX2xheW91dERlY2xhcmF0aW9uc1t0XS52YWx1ZX0saS5wcm90b3R5cGUuZ2V0TGF5b3V0VmFsdWU9ZnVuY3Rpb24odCxpLGEpe3ZhciBlPXRoaXMuX2xheW91dFNwZWNpZmljYXRpb25zW3RdLG89dGhpcy5fbGF5b3V0RGVjbGFyYXRpb25zW3RdO3JldHVybiBvP28uY2FsY3VsYXRlKGksYSk6ZS5kZWZhdWx0fSxpLnByb3RvdHlwZS5zZXRQYWludFByb3BlcnR5PWZ1bmN0aW9uKHQsaSxhLGUpe3ZhciBvPVwibGF5ZXJzLlwiK3RoaXMuaWQrKGE/J1tcInBhaW50LicrYSsnXCJdLic6XCIucGFpbnQuXCIpK3Q7aWYodXRpbC5lbmRzV2l0aCh0LFRSQU5TSVRJT05fU1VGRklYKSlpZih0aGlzLl9wYWludFRyYW5zaXRpb25PcHRpb25zW2F8fFwiXCJdfHwodGhpcy5fcGFpbnRUcmFuc2l0aW9uT3B0aW9uc1thfHxcIlwiXT17fSksbnVsbD09PWl8fHZvaWQgMD09PWkpZGVsZXRlIHRoaXMuX3BhaW50VHJhbnNpdGlvbk9wdGlvbnNbYXx8XCJcIl1bdF07ZWxzZXtpZih0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLnBhaW50UHJvcGVydHksbyx0LGksZSkpcmV0dXJuO3RoaXMuX3BhaW50VHJhbnNpdGlvbk9wdGlvbnNbYXx8XCJcIl1bdF09aX1lbHNlIGlmKHRoaXMuX3BhaW50RGVjbGFyYXRpb25zW2F8fFwiXCJdfHwodGhpcy5fcGFpbnREZWNsYXJhdGlvbnNbYXx8XCJcIl09e30pLG51bGw9PT1pfHx2b2lkIDA9PT1pKWRlbGV0ZSB0aGlzLl9wYWludERlY2xhcmF0aW9uc1thfHxcIlwiXVt0XTtlbHNle2lmKHRoaXMuX3ZhbGlkYXRlKHZhbGlkYXRlU3R5bGUucGFpbnRQcm9wZXJ0eSxvLHQsaSxlKSlyZXR1cm47dGhpcy5fcGFpbnREZWNsYXJhdGlvbnNbYXx8XCJcIl1bdF09bmV3IFN0eWxlRGVjbGFyYXRpb24odGhpcy5fcGFpbnRTcGVjaWZpY2F0aW9uc1t0XSxpKX19LGkucHJvdG90eXBlLmdldFBhaW50UHJvcGVydHk9ZnVuY3Rpb24odCxpKXtyZXR1cm4gaT1pfHxcIlwiLHV0aWwuZW5kc1dpdGgodCxUUkFOU0lUSU9OX1NVRkZJWCk/dGhpcy5fcGFpbnRUcmFuc2l0aW9uT3B0aW9uc1tpXSYmdGhpcy5fcGFpbnRUcmFuc2l0aW9uT3B0aW9uc1tpXVt0XTp0aGlzLl9wYWludERlY2xhcmF0aW9uc1tpXSYmdGhpcy5fcGFpbnREZWNsYXJhdGlvbnNbaV1bdF0mJnRoaXMuX3BhaW50RGVjbGFyYXRpb25zW2ldW3RdLnZhbHVlfSxpLnByb3RvdHlwZS5nZXRQYWludFZhbHVlPWZ1bmN0aW9uKHQsaSxhKXt2YXIgZT10aGlzLl9wYWludFNwZWNpZmljYXRpb25zW3RdLG89dGhpcy5fcGFpbnRUcmFuc2l0aW9uc1t0XTtyZXR1cm4gbz9vLmNhbGN1bGF0ZShpLGEpOlwiY29sb3JcIj09PWUudHlwZSYmZS5kZWZhdWx0P3BhcnNlQ29sb3IoZS5kZWZhdWx0KTplLmRlZmF1bHR9LGkucHJvdG90eXBlLmdldFBhaW50VmFsdWVTdG9wWm9vbUxldmVscz1mdW5jdGlvbih0KXt2YXIgaT10aGlzLl9wYWludFRyYW5zaXRpb25zW3RdO3JldHVybiBpP2kuZGVjbGFyYXRpb24uc3RvcFpvb21MZXZlbHM6W119LGkucHJvdG90eXBlLmdldExheW91dFZhbHVlU3RvcFpvb21MZXZlbHM9ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fbGF5b3V0RGVjbGFyYXRpb25zW3RdO3JldHVybiBpP2kuc3RvcFpvb21MZXZlbHM6W119LGkucHJvdG90eXBlLmdldFBhaW50SW50ZXJwb2xhdGlvblQ9ZnVuY3Rpb24odCxpKXt2YXIgYT10aGlzLl9wYWludFRyYW5zaXRpb25zW3RdO3JldHVybiBhLmRlY2xhcmF0aW9uLmNhbGN1bGF0ZUludGVycG9sYXRpb25UKGkpfSxpLnByb3RvdHlwZS5nZXRMYXlvdXRJbnRlcnBvbGF0aW9uVD1mdW5jdGlvbih0LGkpe3ZhciBhPXRoaXMuX2xheW91dERlY2xhcmF0aW9uc1t0XTtyZXR1cm4gYS5jYWxjdWxhdGVJbnRlcnBvbGF0aW9uVChpKX0saS5wcm90b3R5cGUuaXNQYWludFZhbHVlRmVhdHVyZUNvbnN0YW50PWZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX3BhaW50VHJhbnNpdGlvbnNbdF07cmV0dXJuIWl8fGkuZGVjbGFyYXRpb24uaXNGZWF0dXJlQ29uc3RhbnR9LGkucHJvdG90eXBlLmlzTGF5b3V0VmFsdWVGZWF0dXJlQ29uc3RhbnQ9ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fbGF5b3V0RGVjbGFyYXRpb25zW3RdO3JldHVybiFpfHxpLmlzRmVhdHVyZUNvbnN0YW50fSxpLnByb3RvdHlwZS5pc1BhaW50VmFsdWVab29tQ29uc3RhbnQ9ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fcGFpbnRUcmFuc2l0aW9uc1t0XTtyZXR1cm4haXx8aS5kZWNsYXJhdGlvbi5pc1pvb21Db25zdGFudH0saS5wcm90b3R5cGUuaXNMYXlvdXRWYWx1ZVpvb21Db25zdGFudD1mdW5jdGlvbih0KXt2YXIgaT10aGlzLl9sYXlvdXREZWNsYXJhdGlvbnNbdF07cmV0dXJuIWl8fGkuaXNab29tQ29uc3RhbnR9LGkucHJvdG90eXBlLmlzSGlkZGVuPWZ1bmN0aW9uKHQpe3JldHVybiEhKHRoaXMubWluem9vbSYmdDx0aGlzLm1pbnpvb20pfHwoISEodGhpcy5tYXh6b29tJiZ0Pj10aGlzLm1heHpvb20pfHxcIm5vbmVcIj09PXRoaXMubGF5b3V0LnZpc2liaWxpdHkpfSxpLnByb3RvdHlwZS51cGRhdGVQYWludFRyYW5zaXRpb25zPWZ1bmN0aW9uKHQsaSxhLGUsbyl7Zm9yKHZhciBuPXRoaXMscj11dGlsLmV4dGVuZCh7fSx0aGlzLl9wYWludERlY2xhcmF0aW9uc1tcIlwiXSkscz0wO3M8dC5sZW5ndGg7cysrKXV0aWwuZXh0ZW5kKHIsbi5fcGFpbnREZWNsYXJhdGlvbnNbdFtzXV0pO3ZhciBsO2ZvcihsIGluIHIpbi5fYXBwbHlQYWludERlY2xhcmF0aW9uKGwscltsXSxpLGEsZSxvKTtmb3IobCBpbiBuLl9wYWludFRyYW5zaXRpb25zKWwgaW4gcnx8bi5fYXBwbHlQYWludERlY2xhcmF0aW9uKGwsbnVsbCxpLGEsZSxvKX0saS5wcm90b3R5cGUudXBkYXRlUGFpbnRUcmFuc2l0aW9uPWZ1bmN0aW9uKHQsaSxhLGUsbyxuKXtmb3IodmFyIHI9dGhpcyxzPXRoaXMuX3BhaW50RGVjbGFyYXRpb25zW1wiXCJdW3RdLGw9MDtsPGkubGVuZ3RoO2wrKyl7dmFyIHU9ci5fcGFpbnREZWNsYXJhdGlvbnNbaVtsXV07dSYmdVt0XSYmKHM9dVt0XSl9dGhpcy5fYXBwbHlQYWludERlY2xhcmF0aW9uKHQscyxhLGUsbyxuKX0saS5wcm90b3R5cGUucmVjYWxjdWxhdGU9ZnVuY3Rpb24odCl7dmFyIGk9dGhpcztmb3IodmFyIGEgaW4gaS5fcGFpbnRUcmFuc2l0aW9ucylpLnBhaW50W2FdPWkuZ2V0UGFpbnRWYWx1ZShhLHt6b29tOnR9KTtmb3IodmFyIGUgaW4gaS5fbGF5b3V0RnVuY3Rpb25zKWkubGF5b3V0W2VdPWkuZ2V0TGF5b3V0VmFsdWUoZSx7em9vbTp0fSl9LGkucHJvdG90eXBlLnNlcmlhbGl6ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMsaT17aWQ6dGhpcy5pZCx0eXBlOnRoaXMudHlwZSxzb3VyY2U6dGhpcy5zb3VyY2UsXCJzb3VyY2UtbGF5ZXJcIjp0aGlzLnNvdXJjZUxheWVyLG1ldGFkYXRhOnRoaXMubWV0YWRhdGEsbWluem9vbTp0aGlzLm1pbnpvb20sbWF4em9vbTp0aGlzLm1heHpvb20sZmlsdGVyOnRoaXMuZmlsdGVyLGxheW91dDp1dGlsLm1hcE9iamVjdCh0aGlzLl9sYXlvdXREZWNsYXJhdGlvbnMsZ2V0RGVjbGFyYXRpb25WYWx1ZSl9O2Zvcih2YXIgYSBpbiB0Ll9wYWludERlY2xhcmF0aW9ucyl7dmFyIGU9XCJcIj09PWE/XCJwYWludFwiOlwicGFpbnQuXCIrYTtpW2VdPXV0aWwubWFwT2JqZWN0KHQuX3BhaW50RGVjbGFyYXRpb25zW2FdLGdldERlY2xhcmF0aW9uVmFsdWUpfXJldHVybiB1dGlsLmZpbHRlck9iamVjdChpLGZ1bmN0aW9uKHQsaSl7cmV0dXJuIHZvaWQgMCE9PXQmJiEoXCJsYXlvdXRcIj09PWkmJiFPYmplY3Qua2V5cyh0KS5sZW5ndGgpfSl9LGkucHJvdG90eXBlLl9hcHBseVBhaW50RGVjbGFyYXRpb249ZnVuY3Rpb24odCxpLGEsZSxvLG4pe3ZhciByPWEudHJhbnNpdGlvbj90aGlzLl9wYWludFRyYW5zaXRpb25zW3RdOnZvaWQgMCxzPXRoaXMuX3BhaW50U3BlY2lmaWNhdGlvbnNbdF07aWYobnVsbCE9PWkmJnZvaWQgMCE9PWl8fChpPW5ldyBTdHlsZURlY2xhcmF0aW9uKHMscy5kZWZhdWx0KSksIXJ8fHIuZGVjbGFyYXRpb24uanNvbiE9PWkuanNvbil7dmFyIGw9dXRpbC5leHRlbmQoe2R1cmF0aW9uOjMwMCxkZWxheTowfSxlLHRoaXMuZ2V0UGFpbnRQcm9wZXJ0eSh0K1RSQU5TSVRJT05fU1VGRklYKSksdT10aGlzLl9wYWludFRyYW5zaXRpb25zW3RdPW5ldyBTdHlsZVRyYW5zaXRpb24ocyxpLHIsbCxuKTt1Lmluc3RhbnQoKXx8KHUubG9vcElEPW8uc2V0KHUuZW5kVGltZS1EYXRlLm5vdygpKSksciYmby5jYW5jZWwoci5sb29wSUQpfX0saS5wcm90b3R5cGUuX3VwZGF0ZUxheW91dFZhbHVlPWZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX2xheW91dERlY2xhcmF0aW9uc1t0XTtpJiZpLmlzRnVuY3Rpb24/dGhpcy5fbGF5b3V0RnVuY3Rpb25zW3RdPSEwOihkZWxldGUgdGhpcy5fbGF5b3V0RnVuY3Rpb25zW3RdLHRoaXMubGF5b3V0W3RdPXRoaXMuZ2V0TGF5b3V0VmFsdWUodCkpfSxpLnByb3RvdHlwZS5fdmFsaWRhdGU9ZnVuY3Rpb24odCxpLGEsZSxvKXtyZXR1cm4oIW98fG8udmFsaWRhdGUhPT0hMSkmJnZhbGlkYXRlU3R5bGUuZW1pdEVycm9ycyh0aGlzLHQuY2FsbCh2YWxpZGF0ZVN0eWxlLHtrZXk6aSxsYXllclR5cGU6dGhpcy50eXBlLG9iamVjdEtleTphLHZhbHVlOmUsc3R5bGVTcGVjOnN0eWxlU3BlYyxzdHlsZTp7Z2x5cGhzOiEwLHNwcml0ZTohMH19KSl9LGl9KEV2ZW50ZWQpO21vZHVsZS5leHBvcnRzPVN0eWxlTGF5ZXI7dmFyIHN1YmNsYXNzZXM9e2NpcmNsZTpfZGVyZXFfKFwiLi9zdHlsZV9sYXllci9jaXJjbGVfc3R5bGVfbGF5ZXJcIiksZmlsbDpfZGVyZXFfKFwiLi9zdHlsZV9sYXllci9maWxsX3N0eWxlX2xheWVyXCIpLFwiZmlsbC1leHRydXNpb25cIjpfZGVyZXFfKFwiLi9zdHlsZV9sYXllci9maWxsX2V4dHJ1c2lvbl9zdHlsZV9sYXllclwiKSxsaW5lOl9kZXJlcV8oXCIuL3N0eWxlX2xheWVyL2xpbmVfc3R5bGVfbGF5ZXJcIiksc3ltYm9sOl9kZXJlcV8oXCIuL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllclwiKX07U3R5bGVMYXllci5jcmVhdGU9ZnVuY3Rpb24odCl7dmFyIGk9c3ViY2xhc3Nlc1t0LnR5cGVdfHxTdHlsZUxheWVyO3JldHVybiBuZXcgaSh0KX07XG59LHtcIi4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdFwiOjExOSxcIi4uL3V0aWwvZXZlbnRlZFwiOjIwMyxcIi4uL3V0aWwvdXRpbFwiOjIxNSxcIi4vLi4vc3R5bGUtc3BlYy91dGlsL3BhcnNlX2NvbG9yXCI6MTI0LFwiLi9zdHlsZV9kZWNsYXJhdGlvblwiOjE1MCxcIi4vc3R5bGVfbGF5ZXIvY2lyY2xlX3N0eWxlX2xheWVyXCI6MTUyLFwiLi9zdHlsZV9sYXllci9maWxsX2V4dHJ1c2lvbl9zdHlsZV9sYXllclwiOjE1MyxcIi4vc3R5bGVfbGF5ZXIvZmlsbF9zdHlsZV9sYXllclwiOjE1NCxcIi4vc3R5bGVfbGF5ZXIvbGluZV9zdHlsZV9sYXllclwiOjE1NSxcIi4vc3R5bGVfbGF5ZXIvc3ltYm9sX3N0eWxlX2xheWVyXCI6MTU2LFwiLi9zdHlsZV90cmFuc2l0aW9uXCI6MTU4LFwiLi92YWxpZGF0ZV9zdHlsZVwiOjE1OX1dLDE1MjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgU3R5bGVMYXllcj1fZGVyZXFfKFwiLi4vc3R5bGVfbGF5ZXJcIiksQ2lyY2xlQnVja2V0PV9kZXJlcV8oXCIuLi8uLi9kYXRhL2J1Y2tldC9jaXJjbGVfYnVja2V0XCIpLENpcmNsZVN0eWxlTGF5ZXI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBlJiYodC5fX3Byb3RvX189ZSksdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSksdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dCx0LnByb3RvdHlwZS5jcmVhdGVCdWNrZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBDaXJjbGVCdWNrZXQoZSl9LHR9KFN0eWxlTGF5ZXIpO21vZHVsZS5leHBvcnRzPUNpcmNsZVN0eWxlTGF5ZXI7XG59LHtcIi4uLy4uL2RhdGEvYnVja2V0L2NpcmNsZV9idWNrZXRcIjo0NixcIi4uL3N0eWxlX2xheWVyXCI6MTUxfV0sMTUzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBTdHlsZUxheWVyPV9kZXJlcV8oXCIuLi9zdHlsZV9sYXllclwiKSxGaWxsRXh0cnVzaW9uQnVja2V0PV9kZXJlcV8oXCIuLi8uLi9kYXRhL2J1Y2tldC9maWxsX2V4dHJ1c2lvbl9idWNrZXRcIiksRmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXI9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiB0JiYoZS5fX3Byb3RvX189dCksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5nZXRQYWludFZhbHVlPWZ1bmN0aW9uKGUscixvKXt2YXIgbD10LnByb3RvdHlwZS5nZXRQYWludFZhbHVlLmNhbGwodGhpcyxlLHIsbyk7cmV0dXJuXCJmaWxsLWV4dHJ1c2lvbi1jb2xvclwiPT09ZSYmbCYmKGxbM109MSksbH0sZS5wcm90b3R5cGUuY3JlYXRlQnVja2V0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRmlsbEV4dHJ1c2lvbkJ1Y2tldCh0KX0sZX0oU3R5bGVMYXllcik7bW9kdWxlLmV4cG9ydHM9RmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXI7XG59LHtcIi4uLy4uL2RhdGEvYnVja2V0L2ZpbGxfZXh0cnVzaW9uX2J1Y2tldFwiOjQ4LFwiLi4vc3R5bGVfbGF5ZXJcIjoxNTF9XSwxNTQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIFN0eWxlTGF5ZXI9X2RlcmVxXyhcIi4uL3N0eWxlX2xheWVyXCIpLEZpbGxCdWNrZXQ9X2RlcmVxXyhcIi4uLy4uL2RhdGEvYnVja2V0L2ZpbGxfYnVja2V0XCIpLEZpbGxTdHlsZUxheWVyPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG8oKXt0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gdCYmKG8uX19wcm90b19fPXQpLG8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLG8ucHJvdG90eXBlLmNvbnN0cnVjdG9yPW8sby5wcm90b3R5cGUuZ2V0UGFpbnRWYWx1ZT1mdW5jdGlvbihvLGwsZSl7dmFyIGk9dGhpcztpZihcImZpbGwtb3V0bGluZS1jb2xvclwiPT09byl7aWYodm9pZCAwPT09dGhpcy5nZXRQYWludFByb3BlcnR5KFwiZmlsbC1vdXRsaW5lLWNvbG9yXCIpKXJldHVybiB0LnByb3RvdHlwZS5nZXRQYWludFZhbHVlLmNhbGwodGhpcyxcImZpbGwtY29sb3JcIixsLGUpO2Zvcih2YXIgcj10aGlzLl9wYWludFRyYW5zaXRpb25zW1wiZmlsbC1vdXRsaW5lLWNvbG9yXCJdO3I7KXt2YXIgbj1yJiZyLmRlY2xhcmF0aW9uJiZyLmRlY2xhcmF0aW9uLnZhbHVlO2lmKCFuKXJldHVybiB0LnByb3RvdHlwZS5nZXRQYWludFZhbHVlLmNhbGwoaSxcImZpbGwtY29sb3JcIixsLGUpO3I9ci5vbGRUcmFuc2l0aW9ufX1yZXR1cm4gdC5wcm90b3R5cGUuZ2V0UGFpbnRWYWx1ZS5jYWxsKHRoaXMsbyxsLGUpfSxvLnByb3RvdHlwZS5nZXRQYWludFZhbHVlU3RvcFpvb21MZXZlbHM9ZnVuY3Rpb24obyl7cmV0dXJuXCJmaWxsLW91dGxpbmUtY29sb3JcIj09PW8mJnZvaWQgMD09PXRoaXMuZ2V0UGFpbnRQcm9wZXJ0eShcImZpbGwtb3V0bGluZS1jb2xvclwiKT90LnByb3RvdHlwZS5nZXRQYWludFZhbHVlU3RvcFpvb21MZXZlbHMuY2FsbCh0aGlzLFwiZmlsbC1jb2xvclwiKTp0LnByb3RvdHlwZS5nZXRQYWludFZhbHVlU3RvcFpvb21MZXZlbHMuY2FsbCh0aGlzLG8pfSxvLnByb3RvdHlwZS5nZXRQYWludEludGVycG9sYXRpb25UPWZ1bmN0aW9uKG8sbCl7cmV0dXJuXCJmaWxsLW91dGxpbmUtY29sb3JcIj09PW8mJnZvaWQgMD09PXRoaXMuZ2V0UGFpbnRQcm9wZXJ0eShcImZpbGwtb3V0bGluZS1jb2xvclwiKT90LnByb3RvdHlwZS5nZXRQYWludEludGVycG9sYXRpb25ULmNhbGwodGhpcyxcImZpbGwtY29sb3JcIixsKTp0LnByb3RvdHlwZS5nZXRQYWludEludGVycG9sYXRpb25ULmNhbGwodGhpcyxvLGwpfSxvLnByb3RvdHlwZS5pc1BhaW50VmFsdWVGZWF0dXJlQ29uc3RhbnQ9ZnVuY3Rpb24obyl7cmV0dXJuXCJmaWxsLW91dGxpbmUtY29sb3JcIj09PW8mJnZvaWQgMD09PXRoaXMuZ2V0UGFpbnRQcm9wZXJ0eShcImZpbGwtb3V0bGluZS1jb2xvclwiKT90LnByb3RvdHlwZS5pc1BhaW50VmFsdWVGZWF0dXJlQ29uc3RhbnQuY2FsbCh0aGlzLFwiZmlsbC1jb2xvclwiKTp0LnByb3RvdHlwZS5pc1BhaW50VmFsdWVGZWF0dXJlQ29uc3RhbnQuY2FsbCh0aGlzLG8pfSxvLnByb3RvdHlwZS5pc1BhaW50VmFsdWVab29tQ29uc3RhbnQ9ZnVuY3Rpb24obyl7cmV0dXJuXCJmaWxsLW91dGxpbmUtY29sb3JcIj09PW8mJnZvaWQgMD09PXRoaXMuZ2V0UGFpbnRQcm9wZXJ0eShcImZpbGwtb3V0bGluZS1jb2xvclwiKT90LnByb3RvdHlwZS5pc1BhaW50VmFsdWVab29tQ29uc3RhbnQuY2FsbCh0aGlzLFwiZmlsbC1jb2xvclwiKTp0LnByb3RvdHlwZS5pc1BhaW50VmFsdWVab29tQ29uc3RhbnQuY2FsbCh0aGlzLG8pfSxvLnByb3RvdHlwZS5jcmVhdGVCdWNrZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBGaWxsQnVja2V0KHQpfSxvfShTdHlsZUxheWVyKTttb2R1bGUuZXhwb3J0cz1GaWxsU3R5bGVMYXllcjtcbn0se1wiLi4vLi4vZGF0YS9idWNrZXQvZmlsbF9idWNrZXRcIjo0NyxcIi4uL3N0eWxlX2xheWVyXCI6MTUxfV0sMTU1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBTdHlsZUxheWVyPV9kZXJlcV8oXCIuLi9zdHlsZV9sYXllclwiKSxMaW5lQnVja2V0PV9kZXJlcV8oXCIuLi8uLi9kYXRhL2J1Y2tldC9saW5lX2J1Y2tldFwiKSx1dGlsPV9kZXJlcV8oXCIuLi8uLi91dGlsL3V0aWxcIiksTGluZVN0eWxlTGF5ZXI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBlJiYodC5fX3Byb3RvX189ZSksdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSksdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dCx0LnByb3RvdHlwZS5nZXRQYWludFZhbHVlPWZ1bmN0aW9uKHQscixvKXt2YXIgaT1lLnByb3RvdHlwZS5nZXRQYWludFZhbHVlLmNhbGwodGhpcyx0LHIsbyk7aWYoaSYmXCJsaW5lLWRhc2hhcnJheVwiPT09dCl7dmFyIGE9dGhpcy5nZXRQYWludFZhbHVlKFwibGluZS13aWR0aFwiLHV0aWwuZXh0ZW5kKHt9LHIse3pvb206TWF0aC5mbG9vcihyLnpvb20pfSksbyk7aS5mcm9tU2NhbGUqPWEsaS50b1NjYWxlKj1hfXJldHVybiBpfSx0LnByb3RvdHlwZS5jcmVhdGVCdWNrZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBMaW5lQnVja2V0KGUpfSx0fShTdHlsZUxheWVyKTttb2R1bGUuZXhwb3J0cz1MaW5lU3R5bGVMYXllcjtcbn0se1wiLi4vLi4vZGF0YS9idWNrZXQvbGluZV9idWNrZXRcIjo0OSxcIi4uLy4uL3V0aWwvdXRpbFwiOjIxNSxcIi4uL3N0eWxlX2xheWVyXCI6MTUxfV0sMTU2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBTdHlsZUxheWVyPV9kZXJlcV8oXCIuLi9zdHlsZV9sYXllclwiKSxTeW1ib2xCdWNrZXQ9X2RlcmVxXyhcIi4uLy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXRcIiksU3ltYm9sU3R5bGVMYXllcj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldExheW91dFZhbHVlPWZ1bmN0aW9uKGUsbyxyKXt2YXIgYT10LnByb3RvdHlwZS5nZXRMYXlvdXRWYWx1ZS5jYWxsKHRoaXMsZSxvLHIpO2lmKFwiYXV0b1wiIT09YSlyZXR1cm4gYTtzd2l0Y2goZSl7Y2FzZVwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjpjYXNlXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiOnJldHVyblwibGluZVwiPT09dGhpcy5nZXRMYXlvdXRWYWx1ZShcInN5bWJvbC1wbGFjZW1lbnRcIixvLHIpP1wibWFwXCI6XCJ2aWV3cG9ydFwiO2Nhc2VcInRleHQtcGl0Y2gtYWxpZ25tZW50XCI6cmV0dXJuIHRoaXMuZ2V0TGF5b3V0VmFsdWUoXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiLG8scik7ZGVmYXVsdDpyZXR1cm4gYX19LGUucHJvdG90eXBlLmNyZWF0ZUJ1Y2tldD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFN5bWJvbEJ1Y2tldCh0KX0sZX0oU3R5bGVMYXllcik7bW9kdWxlLmV4cG9ydHM9U3ltYm9sU3R5bGVMYXllcjtcbn0se1wiLi4vLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldFwiOjUwLFwiLi4vc3R5bGVfbGF5ZXJcIjoxNTF9XSwxNTc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIFN0eWxlTGF5ZXI9X2RlcmVxXyhcIi4vc3R5bGVfbGF5ZXJcIiksdXRpbD1fZGVyZXFfKFwiLi4vdXRpbC91dGlsXCIpLGZlYXR1cmVGaWx0ZXI9X2RlcmVxXyhcIi4uL3N0eWxlLXNwZWMvZmVhdHVyZV9maWx0ZXJcIiksZ3JvdXBCeUxheW91dD1fZGVyZXFfKFwiLi4vc3R5bGUtc3BlYy9ncm91cF9ieV9sYXlvdXRcIiksU3R5bGVMYXllckluZGV4PWZ1bmN0aW9uKGUpe2UmJnRoaXMucmVwbGFjZShlKX07U3R5bGVMYXllckluZGV4LnByb3RvdHlwZS5yZXBsYWNlPWZ1bmN0aW9uKGUpe3ZhciByPXRoaXM7dGhpcy5zeW1ib2xPcmRlcj1bXTtmb3IodmFyIHQ9MCxpPWU7dDxpLmxlbmd0aDt0Kz0xKXt2YXIgYT1pW3RdO1wic3ltYm9sXCI9PT1hLnR5cGUmJnIuc3ltYm9sT3JkZXIucHVzaChhLmlkKX10aGlzLl9sYXllckNvbmZpZ3M9e30sdGhpcy5fbGF5ZXJzPXt9LHRoaXMudXBkYXRlKGUsW10pfSxTdHlsZUxheWVySW5kZXgucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlLHIsdCl7Zm9yKHZhciBpPXRoaXMsYT0wLGw9ZTthPGwubGVuZ3RoO2ErPTEpe3ZhciB5PWxbYV07aS5fbGF5ZXJDb25maWdzW3kuaWRdPXk7dmFyIHM9aS5fbGF5ZXJzW3kuaWRdPVN0eWxlTGF5ZXIuY3JlYXRlKHkpO3MudXBkYXRlUGFpbnRUcmFuc2l0aW9ucyh7fSx7dHJhbnNpdGlvbjohMX0pLHMuZmlsdGVyPWZlYXR1cmVGaWx0ZXIocy5maWx0ZXIpfWZvcih2YXIgbz0wLHU9cjtvPHUubGVuZ3RoO28rPTEpe3ZhciBuPXVbb107ZGVsZXRlIGkuX2xheWVyQ29uZmlnc1tuXSxkZWxldGUgaS5fbGF5ZXJzW25dfXQmJih0aGlzLnN5bWJvbE9yZGVyPXQpLHRoaXMuZmFtaWxpZXNCeVNvdXJjZT17fTtmb3IodmFyIGY9Z3JvdXBCeUxheW91dCh1dGlsLnZhbHVlcyh0aGlzLl9sYXllckNvbmZpZ3MpKSxwPTAsZD1mO3A8ZC5sZW5ndGg7cCs9MSl7dmFyIGg9ZFtwXSxjPWgubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBpLl9sYXllcnNbZS5pZF19KSx2PWNbMF07aWYoIXYubGF5b3V0fHxcIm5vbmVcIiE9PXYubGF5b3V0LnZpc2liaWxpdHkpe3ZhciBfPXYuc291cmNlfHxcIlwiLGc9aS5mYW1pbGllc0J5U291cmNlW19dO2d8fChnPWkuZmFtaWxpZXNCeVNvdXJjZVtfXT17fSk7dmFyIEw9di5zb3VyY2VMYXllcnx8XCJfZ2VvanNvblRpbGVMYXllclwiLG09Z1tMXTttfHwobT1nW0xdPVtdKSxtLnB1c2goYyl9fX0sbW9kdWxlLmV4cG9ydHM9U3R5bGVMYXllckluZGV4O1xufSx7XCIuLi9zdHlsZS1zcGVjL2ZlYXR1cmVfZmlsdGVyXCI6MTA1LFwiLi4vc3R5bGUtc3BlYy9ncm91cF9ieV9sYXlvdXRcIjoxMDgsXCIuLi91dGlsL3V0aWxcIjoyMTUsXCIuL3N0eWxlX2xheWVyXCI6MTUxfV0sMTU4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGludGVycFpvb21UcmFuc2l0aW9uZWQodCxpLGUpe2lmKHZvaWQgMCE9PXQmJnZvaWQgMCE9PWkpcmV0dXJue2Zyb206dC50byxmcm9tU2NhbGU6dC50b1NjYWxlLHRvOmkudG8sdG9TY2FsZTppLnRvU2NhbGUsdDplfX12YXIgdXRpbD1fZGVyZXFfKFwiLi4vdXRpbC91dGlsXCIpLGludGVycG9sYXRlPV9kZXJlcV8oXCIuLi9zdHlsZS1zcGVjL3V0aWwvaW50ZXJwb2xhdGVcIiksZmFrZVpvb21IaXN0b3J5PXtsYXN0SW50ZWdlclpvb206MCxsYXN0SW50ZWdlclpvb21UaW1lOjAsbGFzdFpvb206MH0sU3R5bGVUcmFuc2l0aW9uPWZ1bmN0aW9uKHQsaSxlLG8sYSl7dGhpcy5kZWNsYXJhdGlvbj1pLHRoaXMuc3RhcnRUaW1lPXRoaXMuZW5kVGltZT0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLm9sZFRyYW5zaXRpb249ZSx0aGlzLmR1cmF0aW9uPW8uZHVyYXRpb258fDAsdGhpcy5kZWxheT1vLmRlbGF5fHwwLHRoaXMuem9vbVRyYW5zaXRpb25lZD1cInBpZWNld2lzZS1jb25zdGFudFwiPT09dC5mdW5jdGlvbiYmdC50cmFuc2l0aW9uLHRoaXMuaW50ZXJwPXRoaXMuem9vbVRyYW5zaXRpb25lZD9pbnRlcnBab29tVHJhbnNpdGlvbmVkOmludGVycG9sYXRlW3QudHlwZV0sdGhpcy56b29tSGlzdG9yeT1hfHxmYWtlWm9vbUhpc3RvcnksdGhpcy5pbnN0YW50KCl8fCh0aGlzLmVuZFRpbWU9dGhpcy5zdGFydFRpbWUrdGhpcy5kdXJhdGlvbit0aGlzLmRlbGF5KSxlJiZlLmVuZFRpbWU8PXRoaXMuc3RhcnRUaW1lJiZkZWxldGUgZS5vbGRUcmFuc2l0aW9ufTtTdHlsZVRyYW5zaXRpb24ucHJvdG90eXBlLmluc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5vbGRUcmFuc2l0aW9ufHwhdGhpcy5pbnRlcnB8fDA9PT10aGlzLmR1cmF0aW9uJiYwPT09dGhpcy5kZWxheX0sU3R5bGVUcmFuc2l0aW9uLnByb3RvdHlwZS5jYWxjdWxhdGU9ZnVuY3Rpb24odCxpLGUpe3ZhciBvPXRoaXMuX2NhbGN1bGF0ZVRhcmdldFZhbHVlKHQsaSk7aWYodGhpcy5pbnN0YW50KCkpcmV0dXJuIG87aWYoZT1lfHxEYXRlLm5vdygpLGU+PXRoaXMuZW5kVGltZSlyZXR1cm4gbzt2YXIgYT10aGlzLm9sZFRyYW5zaXRpb24uY2FsY3VsYXRlKHQsaSx0aGlzLnN0YXJ0VGltZSksbj11dGlsLmVhc2VDdWJpY0luT3V0KChlLXRoaXMuc3RhcnRUaW1lLXRoaXMuZGVsYXkpL3RoaXMuZHVyYXRpb24pO3JldHVybiB0aGlzLmludGVycChhLG8sbil9LFN0eWxlVHJhbnNpdGlvbi5wcm90b3R5cGUuX2NhbGN1bGF0ZVRhcmdldFZhbHVlPWZ1bmN0aW9uKHQsaSl7aWYoIXRoaXMuem9vbVRyYW5zaXRpb25lZClyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbi5jYWxjdWxhdGUodCxpKTt2YXIgZT10Lnpvb20sbz10aGlzLnpvb21IaXN0b3J5Lmxhc3RJbnRlZ2VyWm9vbSxhPWU+bz8yOi41LG49dGhpcy5kZWNsYXJhdGlvbi5jYWxjdWxhdGUoe3pvb206ZT5vP2UtMTplKzF9LGkpLHI9dGhpcy5kZWNsYXJhdGlvbi5jYWxjdWxhdGUoe3pvb206ZX0saSkscz1NYXRoLm1pbigoRGF0ZS5ub3coKS10aGlzLnpvb21IaXN0b3J5Lmxhc3RJbnRlZ2VyWm9vbVRpbWUpL3RoaXMuZHVyYXRpb24sMSksbD1NYXRoLmFicyhlLW8pLHU9aW50ZXJwb2xhdGUocywxLGwpO3JldHVybiB2b2lkIDAhPT1uJiZ2b2lkIDAhPT1yP3tmcm9tOm4sZnJvbVNjYWxlOmEsdG86cix0b1NjYWxlOjEsdDp1fTp2b2lkIDB9LG1vZHVsZS5leHBvcnRzPVN0eWxlVHJhbnNpdGlvbjtcbn0se1wiLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlXCI6MTIzLFwiLi4vdXRpbC91dGlsXCI6MjE1fV0sMTU5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO21vZHVsZS5leHBvcnRzPV9kZXJlcV8oXCIuLi9zdHlsZS1zcGVjL3ZhbGlkYXRlX3N0eWxlLm1pblwiKSxtb2R1bGUuZXhwb3J0cy5lbWl0RXJyb3JzPWZ1bmN0aW9uKHIsZSl7aWYoZSYmZS5sZW5ndGgpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKXIuZmlyZShcImVycm9yXCIse2Vycm9yOm5ldyBFcnJvcihlW3RdLm1lc3NhZ2UpfSk7cmV0dXJuITB9cmV0dXJuITF9O1xufSx7XCIuLi9zdHlsZS1zcGVjL3ZhbGlkYXRlX3N0eWxlLm1pblwiOjE0NX1dLDE2MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgUG9pbnQ9X2RlcmVxXyhcInBvaW50LWdlb21ldHJ5XCIpLEFuY2hvcj1mdW5jdGlvbih0KXtmdW5jdGlvbiBvKG8sZSxuLHIpe3QuY2FsbCh0aGlzLG8sZSksdGhpcy5hbmdsZT1uLHZvaWQgMCE9PXImJih0aGlzLnNlZ21lbnQ9cil9cmV0dXJuIHQmJihvLl9fcHJvdG9fXz10KSxvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxvLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1vLG8ucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvKHRoaXMueCx0aGlzLnksdGhpcy5hbmdsZSx0aGlzLnNlZ21lbnQpfSxvfShQb2ludCk7bW9kdWxlLmV4cG9ydHM9QW5jaG9yO1xufSx7XCJwb2ludC1nZW9tZXRyeVwiOjI2fV0sMTYxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGNoZWNrTWF4QW5nbGUoZSx0LGEscixuKXtpZih2b2lkIDA9PT10LnNlZ21lbnQpcmV0dXJuITA7Zm9yKHZhciBpPXQscz10LnNlZ21lbnQrMSxmPTA7Zj4tYS8yOyl7aWYocy0tLHM8MClyZXR1cm4hMTtmLT1lW3NdLmRpc3QoaSksaT1lW3NdfWYrPWVbc10uZGlzdChlW3MrMV0pLHMrKztmb3IodmFyIGw9W10sbz0wO2Y8YS8yOyl7dmFyIHU9ZVtzLTFdLGM9ZVtzXSxnPWVbcysxXTtpZighZylyZXR1cm4hMTt2YXIgaD11LmFuZ2xlVG8oYyktYy5hbmdsZVRvKGcpO2ZvcihoPU1hdGguYWJzKChoKzMqTWF0aC5QSSklKDIqTWF0aC5QSSktTWF0aC5QSSksbC5wdXNoKHtkaXN0YW5jZTpmLGFuZ2xlRGVsdGE6aH0pLG8rPWg7Zi1sWzBdLmRpc3RhbmNlPnI7KW8tPWwuc2hpZnQoKS5hbmdsZURlbHRhO2lmKG8+bilyZXR1cm4hMTtzKyssZis9Yy5kaXN0KGcpfXJldHVybiEwfW1vZHVsZS5leHBvcnRzPWNoZWNrTWF4QW5nbGU7XG59LHt9XSwxNjI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gY2xpcExpbmUobix4LHksbyxlKXtmb3IodmFyIHI9W10sdD0wO3Q8bi5sZW5ndGg7dCsrKWZvcih2YXIgaT1uW3RdLHU9dm9pZCAwLGQ9MDtkPGkubGVuZ3RoLTE7ZCsrKXt2YXIgUD1pW2RdLHc9aVtkKzFdO1AueDx4JiZ3Lng8eHx8KFAueDx4P1A9bmV3IFBvaW50KHgsUC55Kyh3LnktUC55KSooKHgtUC54KS8ody54LVAueCkpKS5fcm91bmQoKTp3Lng8eCYmKHc9bmV3IFBvaW50KHgsUC55Kyh3LnktUC55KSooKHgtUC54KS8ody54LVAueCkpKS5fcm91bmQoKSksUC55PHkmJncueTx5fHwoUC55PHk/UD1uZXcgUG9pbnQoUC54Kyh3LngtUC54KSooKHktUC55KS8ody55LVAueSkpLHkpLl9yb3VuZCgpOncueTx5JiYodz1uZXcgUG9pbnQoUC54Kyh3LngtUC54KSooKHktUC55KS8ody55LVAueSkpLHkpLl9yb3VuZCgpKSxQLng+PW8mJncueD49b3x8KFAueD49bz9QPW5ldyBQb2ludChvLFAueSsody55LVAueSkqKChvLVAueCkvKHcueC1QLngpKSkuX3JvdW5kKCk6dy54Pj1vJiYodz1uZXcgUG9pbnQobyxQLnkrKHcueS1QLnkpKigoby1QLngpLyh3LngtUC54KSkpLl9yb3VuZCgpKSxQLnk+PWUmJncueT49ZXx8KFAueT49ZT9QPW5ldyBQb2ludChQLngrKHcueC1QLngpKigoZS1QLnkpLyh3LnktUC55KSksZSkuX3JvdW5kKCk6dy55Pj1lJiYodz1uZXcgUG9pbnQoUC54Kyh3LngtUC54KSooKGUtUC55KS8ody55LVAueSkpLGUpLl9yb3VuZCgpKSx1JiZQLmVxdWFscyh1W3UubGVuZ3RoLTFdKXx8KHU9W1BdLHIucHVzaCh1KSksdS5wdXNoKHcpKSkpKX1yZXR1cm4gcn12YXIgUG9pbnQ9X2RlcmVxXyhcInBvaW50LWdlb21ldHJ5XCIpO21vZHVsZS5leHBvcnRzPWNsaXBMaW5lO1xufSx7XCJwb2ludC1nZW9tZXRyeVwiOjI2fV0sMTYzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBjcmVhdGVTdHJ1Y3RBcnJheVR5cGU9X2RlcmVxXyhcIi4uL3V0aWwvc3RydWN0X2FycmF5XCIpLFBvaW50PV9kZXJlcV8oXCJwb2ludC1nZW9tZXRyeVwiKSxDb2xsaXNpb25Cb3hBcnJheT1jcmVhdGVTdHJ1Y3RBcnJheVR5cGUoe21lbWJlcnM6W3t0eXBlOlwiSW50MTZcIixuYW1lOlwiYW5jaG9yUG9pbnRYXCJ9LHt0eXBlOlwiSW50MTZcIixuYW1lOlwiYW5jaG9yUG9pbnRZXCJ9LHt0eXBlOlwiSW50MTZcIixuYW1lOlwieDFcIn0se3R5cGU6XCJJbnQxNlwiLG5hbWU6XCJ5MVwifSx7dHlwZTpcIkludDE2XCIsbmFtZTpcIngyXCJ9LHt0eXBlOlwiSW50MTZcIixuYW1lOlwieTJcIn0se3R5cGU6XCJGbG9hdDMyXCIsbmFtZTpcIm1heFNjYWxlXCJ9LHt0eXBlOlwiVWludDMyXCIsbmFtZTpcImZlYXR1cmVJbmRleFwifSx7dHlwZTpcIlVpbnQxNlwiLG5hbWU6XCJzb3VyY2VMYXllckluZGV4XCJ9LHt0eXBlOlwiVWludDE2XCIsbmFtZTpcImJ1Y2tldEluZGV4XCJ9LHt0eXBlOlwiSW50MTZcIixuYW1lOlwiYmJveDBcIn0se3R5cGU6XCJJbnQxNlwiLG5hbWU6XCJiYm94MVwifSx7dHlwZTpcIkludDE2XCIsbmFtZTpcImJib3gyXCJ9LHt0eXBlOlwiSW50MTZcIixuYW1lOlwiYmJveDNcIn0se3R5cGU6XCJGbG9hdDMyXCIsbmFtZTpcInBsYWNlbWVudFNjYWxlXCJ9XX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShDb2xsaXNpb25Cb3hBcnJheS5wcm90b3R5cGUuU3RydWN0VHlwZS5wcm90b3R5cGUsXCJhbmNob3JQb2ludFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFBvaW50KHRoaXMuYW5jaG9yUG9pbnRYLHRoaXMuYW5jaG9yUG9pbnRZKX19KSxtb2R1bGUuZXhwb3J0cz1Db2xsaXNpb25Cb3hBcnJheTtcbn0se1wiLi4vdXRpbC9zdHJ1Y3RfYXJyYXlcIjoyMTMsXCJwb2ludC1nZW9tZXRyeVwiOjI2fV0sMTY0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBDb2xsaXNpb25GZWF0dXJlPWZ1bmN0aW9uKHQsZSxpLG8scyxhLG4scixsLGQsdSl7dmFyIGg9bi50b3Aqci1sLHg9bi5ib3R0b20qcitsLGY9bi5sZWZ0KnItbCxtPW4ucmlnaHQqcitsO2lmKHRoaXMuYm94U3RhcnRJbmRleD10Lmxlbmd0aCxkKXt2YXIgXz14LWgsYj1tLWY7aWYoXz4wKWlmKF89TWF0aC5tYXgoMTAqcixfKSx1KXt2YXIgdj1lW2kuc2VnbWVudCsxXS5zdWIoZVtpLnNlZ21lbnRdKS5fdW5pdCgpLl9tdWx0KGIpLGM9W2kuc3ViKHYpLGkuYWRkKHYpXTt0aGlzLl9hZGRMaW5lQ29sbGlzaW9uQm94ZXModCxjLGksMCxiLF8sbyxzLGEpfWVsc2UgdGhpcy5fYWRkTGluZUNvbGxpc2lvbkJveGVzKHQsZSxpLGkuc2VnbWVudCxiLF8sbyxzLGEpfWVsc2UgdC5lbXBsYWNlQmFjayhpLngsaS55LGYsaCxtLHgsMS8wLG8scyxhLDAsMCwwLDAsMCk7dGhpcy5ib3hFbmRJbmRleD10Lmxlbmd0aH07Q29sbGlzaW9uRmVhdHVyZS5wcm90b3R5cGUuX2FkZExpbmVDb2xsaXNpb25Cb3hlcz1mdW5jdGlvbih0LGUsaSxvLHMsYSxuLHIsbCl7dmFyIGQ9YS8yLHU9TWF0aC5mbG9vcihzL2QpLGg9LWEvMix4PXRoaXMuYm94ZXMsZj1pLG09bysxLF89aDtkb3tpZihtLS0sbTwwKXJldHVybiB4O18tPWVbbV0uZGlzdChmKSxmPWVbbV19d2hpbGUoXz4tcy8yKTtmb3IodmFyIGI9ZVttXS5kaXN0KGVbbSsxXSksdj0wO3Y8dTt2Kyspe2Zvcih2YXIgYz0tcy8yK3YqZDtfK2I8Yzspe2lmKF8rPWIsbSsrLG0rMT49ZS5sZW5ndGgpcmV0dXJuIHg7Yj1lW21dLmRpc3QoZVttKzFdKX12YXIgZz1jLV8scD1lW21dLEM9ZVttKzFdLEI9Qy5zdWIocCkuX3VuaXQoKS5fbXVsdChnKS5fYWRkKHApLl9yb3VuZCgpLE09TWF0aC5tYXgoTWF0aC5hYnMoYy1oKS1kLzIsMCkseT1zLzIvTTt0LmVtcGxhY2VCYWNrKEIueCxCLnksLWEvMiwtYS8yLGEvMixhLzIseSxuLHIsbCwwLDAsMCwwLDApfXJldHVybiB4fSxtb2R1bGUuZXhwb3J0cz1Db2xsaXNpb25GZWF0dXJlO1xufSx7fV0sMTY1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBQb2ludD1fZGVyZXFfKFwicG9pbnQtZ2VvbWV0cnlcIiksRVhURU5UPV9kZXJlcV8oXCIuLi9kYXRhL2V4dGVudFwiKSxHcmlkPV9kZXJlcV8oXCJncmlkLWluZGV4XCIpLGludGVyc2VjdGlvblRlc3RzPV9kZXJlcV8oXCIuLi91dGlsL2ludGVyc2VjdGlvbl90ZXN0c1wiKSxDb2xsaXNpb25UaWxlPWZ1bmN0aW9uKHQsZSxpKXtpZihcIm9iamVjdFwiPT10eXBlb2YgdCl7dmFyIHI9dDtpPWUsdD1yLmFuZ2xlLGU9ci5waXRjaCx0aGlzLmdyaWQ9bmV3IEdyaWQoci5ncmlkKSx0aGlzLmlnbm9yZWRHcmlkPW5ldyBHcmlkKHIuaWdub3JlZEdyaWQpfWVsc2UgdGhpcy5ncmlkPW5ldyBHcmlkKEVYVEVOVCwxMiw2KSx0aGlzLmlnbm9yZWRHcmlkPW5ldyBHcmlkKEVYVEVOVCwxMiwwKTt0aGlzLm1pblNjYWxlPS41LHRoaXMubWF4U2NhbGU9Mix0aGlzLmFuZ2xlPXQsdGhpcy5waXRjaD1lO3ZhciBhPU1hdGguc2luKHQpLG89TWF0aC5jb3ModCk7aWYodGhpcy5yb3RhdGlvbk1hdHJpeD1bbywtYSxhLG9dLHRoaXMucmV2ZXJzZVJvdGF0aW9uTWF0cml4PVtvLGEsLWEsb10sdGhpcy55U3RyZXRjaD0xL01hdGguY29zKGUvMTgwKk1hdGguUEkpLHRoaXMueVN0cmV0Y2g9TWF0aC5wb3codGhpcy55U3RyZXRjaCwxLjMpLHRoaXMuY29sbGlzaW9uQm94QXJyYXk9aSwwPT09aS5sZW5ndGgpe2kuZW1wbGFjZUJhY2soKTt2YXIgbj0zMjc2NztpLmVtcGxhY2VCYWNrKDAsMCwwLC1uLDAsbixuLDAsMCwwLDAsMCwwLDAsMCwwKSxpLmVtcGxhY2VCYWNrKEVYVEVOVCwwLDAsLW4sMCxuLG4sMCwwLDAsMCwwLDAsMCwwLDApLGkuZW1wbGFjZUJhY2soMCwwLC1uLDAsbiwwLG4sMCwwLDAsMCwwLDAsMCwwLDApLGkuZW1wbGFjZUJhY2soMCxFWFRFTlQsLW4sMCxuLDAsbiwwLDAsMCwwLDAsMCwwLDAsMCl9dGhpcy50ZW1wQ29sbGlzaW9uQm94PWkuZ2V0KDApLHRoaXMuZWRnZXM9W2kuZ2V0KDEpLGkuZ2V0KDIpLGkuZ2V0KDMpLGkuZ2V0KDQpXX07Q29sbGlzaW9uVGlsZS5wcm90b3R5cGUuc2VyaWFsaXplPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ3JpZC50b0FycmF5QnVmZmVyKCksaT10aGlzLmlnbm9yZWRHcmlkLnRvQXJyYXlCdWZmZXIoKTtyZXR1cm4gdCYmKHQucHVzaChlKSx0LnB1c2goaSkpLHthbmdsZTp0aGlzLmFuZ2xlLHBpdGNoOnRoaXMucGl0Y2gsZ3JpZDplLGlnbm9yZWRHcmlkOml9fSxDb2xsaXNpb25UaWxlLnByb3RvdHlwZS5wbGFjZUNvbGxpc2lvbkZlYXR1cmU9ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgcj10aGlzLGE9dGhpcy5jb2xsaXNpb25Cb3hBcnJheSxvPXRoaXMubWluU2NhbGUsbj10aGlzLnJvdGF0aW9uTWF0cml4LGw9dGhpcy55U3RyZXRjaCxoPXQuYm94U3RhcnRJbmRleDtoPHQuYm94RW5kSW5kZXg7aCsrKXt2YXIgcz1hLmdldChoKSx4PXMuYW5jaG9yUG9pbnQuX21hdE11bHQobiksYz14LngsZz14LnkseT1jK3MueDEsZD1nK3MueTEqbCxtPWMrcy54Mix1PWcrcy55MipsO2lmKHMuYmJveDA9eSxzLmJib3gxPWQscy5iYm94Mj1tLHMuYmJveDM9dSwhZSlmb3IodmFyIHA9ci5ncmlkLnF1ZXJ5KHksZCxtLHUpLE09MDtNPHAubGVuZ3RoO00rKyl7dmFyIGY9YS5nZXQocFtNXSksdj1mLmFuY2hvclBvaW50Ll9tYXRNdWx0KG4pO2lmKG89ci5nZXRQbGFjZW1lbnRTY2FsZShvLHgscyx2LGYpLG8+PXIubWF4U2NhbGUpcmV0dXJuIG99aWYoaSl7dmFyIFM9dm9pZCAwO2lmKHIuYW5nbGUpe3ZhciBQPXIucmV2ZXJzZVJvdGF0aW9uTWF0cml4LGI9bmV3IFBvaW50KHMueDEscy55MSkubWF0TXVsdChQKSxUPW5ldyBQb2ludChzLngyLHMueTEpLm1hdE11bHQoUCksdz1uZXcgUG9pbnQocy54MSxzLnkyKS5tYXRNdWx0KFApLE49bmV3IFBvaW50KHMueDIscy55MikubWF0TXVsdChQKTtTPXIudGVtcENvbGxpc2lvbkJveCxTLmFuY2hvclBvaW50WD1zLmFuY2hvclBvaW50LngsUy5hbmNob3JQb2ludFk9cy5hbmNob3JQb2ludC55LFMueDE9TWF0aC5taW4oYi54LFQueCx3LngsTi54KSxTLnkxPU1hdGgubWluKGIueSxULngsdy54LE4ueCksUy54Mj1NYXRoLm1heChiLngsVC54LHcueCxOLngpLFMueTI9TWF0aC5tYXgoYi55LFQueCx3LngsTi54KSxTLm1heFNjYWxlPXMubWF4U2NhbGV9ZWxzZSBTPXM7Zm9yKHZhciBCPTA7Qjx0aGlzLmVkZ2VzLmxlbmd0aDtCKyspe3ZhciBHPXIuZWRnZXNbQl07aWYobz1yLmdldFBsYWNlbWVudFNjYWxlKG8scy5hbmNob3JQb2ludCxTLEcuYW5jaG9yUG9pbnQsRyksbz49ci5tYXhTY2FsZSlyZXR1cm4gb319fXJldHVybiBvfSxDb2xsaXNpb25UaWxlLnByb3RvdHlwZS5xdWVyeVJlbmRlcmVkU3ltYm9scz1mdW5jdGlvbih0LGUpe3ZhciBpPXt9LHI9W107aWYoMD09PXQubGVuZ3RofHwwPT09dGhpcy5ncmlkLmxlbmd0aCYmMD09PXRoaXMuaWdub3JlZEdyaWQubGVuZ3RoKXJldHVybiByO2Zvcih2YXIgYT10aGlzLmNvbGxpc2lvbkJveEFycmF5LG89dGhpcy5yb3RhdGlvbk1hdHJpeCxuPXRoaXMueVN0cmV0Y2gsbD1bXSxoPTEvMCxzPTEvMCx4PS0oMS8wKSxjPS0oMS8wKSxnPTA7Zzx0Lmxlbmd0aDtnKyspZm9yKHZhciB5PXRbZ10sZD0wO2Q8eS5sZW5ndGg7ZCsrKXt2YXIgbT15W2RdLm1hdE11bHQobyk7aD1NYXRoLm1pbihoLG0ueCkscz1NYXRoLm1pbihzLG0ueSkseD1NYXRoLm1heCh4LG0ueCksYz1NYXRoLm1heChjLG0ueSksbC5wdXNoKG0pfWZvcih2YXIgdT10aGlzLmdyaWQucXVlcnkoaCxzLHgsYykscD10aGlzLmlnbm9yZWRHcmlkLnF1ZXJ5KGgscyx4LGMpLE09MDtNPHAubGVuZ3RoO00rKyl1LnB1c2gocFtNXSk7Zm9yKHZhciBmPU1hdGgucG93KDIsTWF0aC5jZWlsKE1hdGgubG9nKGUpL01hdGguTE4yKjEwKS8xMCksdj0wO3Y8dS5sZW5ndGg7disrKXt2YXIgUz1hLmdldCh1W3ZdKSxQPVMuc291cmNlTGF5ZXJJbmRleCxiPVMuZmVhdHVyZUluZGV4O2lmKHZvaWQgMD09PWlbUF0mJihpW1BdPXt9KSwhaVtQXVtiXSYmIShmPFMucGxhY2VtZW50U2NhbGV8fGY+Uy5tYXhTY2FsZSkpe3ZhciBUPVMuYW5jaG9yUG9pbnQubWF0TXVsdChvKSx3PVQueCtTLngxL2UsTj1ULnkrUy55MS9lKm4sQj1ULngrUy54Mi9lLEc9VC55K1MueTIvZSpuLEU9W25ldyBQb2ludCh3LE4pLG5ldyBQb2ludChCLE4pLG5ldyBQb2ludChCLEcpLG5ldyBQb2ludCh3LEcpXTtpbnRlcnNlY3Rpb25UZXN0cy5wb2x5Z29uSW50ZXJzZWN0c1BvbHlnb24obCxFKSYmKGlbUF1bYl09ITAsci5wdXNoKHVbdl0pKX19cmV0dXJuIHJ9LENvbGxpc2lvblRpbGUucHJvdG90eXBlLmdldFBsYWNlbWVudFNjYWxlPWZ1bmN0aW9uKHQsZSxpLHIsYSl7dmFyIG89ZS54LXIueCxuPWUueS1yLnksbD0oYS54MS1pLngyKS9vLGg9KGEueDItaS54MSkvbyxzPShhLnkxLWkueTIpKnRoaXMueVN0cmV0Y2gvbix4PShhLnkyLWkueTEpKnRoaXMueVN0cmV0Y2gvbjsoaXNOYU4obCl8fGlzTmFOKGgpKSYmKGw9aD0xKSwoaXNOYU4ocyl8fGlzTmFOKHgpKSYmKHM9eD0xKTt2YXIgYz1NYXRoLm1pbihNYXRoLm1heChsLGgpLE1hdGgubWF4KHMseCkpLGc9YS5tYXhTY2FsZSx5PWkubWF4U2NhbGU7cmV0dXJuIGM+ZyYmKGM9ZyksYz55JiYoYz15KSxjPnQmJmM+PWEucGxhY2VtZW50U2NhbGUmJih0PWMpLHR9LENvbGxpc2lvblRpbGUucHJvdG90eXBlLmluc2VydENvbGxpc2lvbkZlYXR1cmU9ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgcj10aGlzLGE9aT90aGlzLmlnbm9yZWRHcmlkOnRoaXMuZ3JpZCxvPXRoaXMuY29sbGlzaW9uQm94QXJyYXksbj10LmJveFN0YXJ0SW5kZXg7bjx0LmJveEVuZEluZGV4O24rKyl7dmFyIGw9by5nZXQobik7bC5wbGFjZW1lbnRTY2FsZT1lLGU8ci5tYXhTY2FsZSYmYS5pbnNlcnQobixsLmJib3gwLGwuYmJveDEsbC5iYm94MixsLmJib3gzKX19LG1vZHVsZS5leHBvcnRzPUNvbGxpc2lvblRpbGU7XG59LHtcIi4uL2RhdGEvZXh0ZW50XCI6NTQsXCIuLi91dGlsL2ludGVyc2VjdGlvbl90ZXN0c1wiOjIwNyxcImdyaWQtaW5kZXhcIjoxNixcInBvaW50LWdlb21ldHJ5XCI6MjZ9XSwxNjY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZ2V0QW5jaG9ycyhlLHIsdCxuLGEsbCxvLGksYyl7dmFyIGg9bj8uNipsKm86MCxzPU1hdGgubWF4KG4/bi5yaWdodC1uLmxlZnQ6MCxhP2EucmlnaHQtYS5sZWZ0OjApLHU9MD09PWVbMF0ueHx8ZVswXS54PT09Y3x8MD09PWVbMF0ueXx8ZVswXS55PT09YztyLXMqbzxyLzQmJihyPXMqbytyLzQpO3ZhciBnPTIqbCxwPXU/ci8yKmklcjoocy8yK2cpKm8qaSVyO3JldHVybiByZXNhbXBsZShlLHAscixoLHQscypvLHUsITEsYyl9ZnVuY3Rpb24gcmVzYW1wbGUoZSxyLHQsbixhLGwsbyxpLGMpe2Zvcih2YXIgaD1sLzIscz0wLHU9MDt1PGUubGVuZ3RoLTE7dSsrKXMrPWVbdV0uZGlzdChlW3UrMV0pO2Zvcih2YXIgZz0wLHA9ci10LHg9W10sZj0wO2Y8ZS5sZW5ndGgtMTtmKyspe2Zvcih2YXIgdj1lW2ZdLG09ZVtmKzFdLHk9di5kaXN0KG0pLEE9bS5hbmdsZVRvKHYpO3ArdDxnK3k7KXtwKz10O3ZhciBkPShwLWcpL3ksaz1pbnRlcnBvbGF0ZSh2LngsbS54LGQpLHE9aW50ZXJwb2xhdGUodi55LG0ueSxkKTtpZihrPj0wJiZrPGMmJnE+PTAmJnE8YyYmcC1oPj0wJiZwK2g8PXMpe3ZhciBNPW5ldyBBbmNob3IoayxxLEEsZikuX3JvdW5kKCk7biYmIWNoZWNrTWF4QW5nbGUoZSxNLGwsbixhKXx8eC5wdXNoKE0pfX1nKz15fXJldHVybiBpfHx4Lmxlbmd0aHx8b3x8KHg9cmVzYW1wbGUoZSxnLzIsdCxuLGEsbCxvLCEwLGMpKSx4fXZhciBpbnRlcnBvbGF0ZT1fZGVyZXFfKFwiLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlXCIpLEFuY2hvcj1fZGVyZXFfKFwiLi4vc3ltYm9sL2FuY2hvclwiKSxjaGVja01heEFuZ2xlPV9kZXJlcV8oXCIuL2NoZWNrX21heF9hbmdsZVwiKTttb2R1bGUuZXhwb3J0cz1nZXRBbmNob3JzO1xufSx7XCIuLi9zdHlsZS1zcGVjL3V0aWwvaW50ZXJwb2xhdGVcIjoxMjMsXCIuLi9zeW1ib2wvYW5jaG9yXCI6MTYwLFwiLi9jaGVja19tYXhfYW5nbGVcIjoxNjF9XSwxNjc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIFNoZWxmUGFjaz1fZGVyZXFfKFwiQG1hcGJveC9zaGVsZi1wYWNrXCIpLHV0aWw9X2RlcmVxXyhcIi4uL3V0aWwvdXRpbFwiKSxTSVpFX0dST1dUSF9SQVRFPTQsREVGQVVMVF9TSVpFPTEyOCxNQVhfU0laRT0yMDQ4LEdseXBoQXRsYXM9ZnVuY3Rpb24oKXt0aGlzLndpZHRoPURFRkFVTFRfU0laRSx0aGlzLmhlaWdodD1ERUZBVUxUX1NJWkUsdGhpcy5hdGxhcz1uZXcgU2hlbGZQYWNrKHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLHRoaXMuaW5kZXg9e30sdGhpcy5pZHM9e30sdGhpcy5kYXRhPW5ldyBVaW50OEFycmF5KHRoaXMud2lkdGgqdGhpcy5oZWlnaHQpfTtHbHlwaEF0bGFzLnByb3RvdHlwZS5nZXRHbHlwaHM9ZnVuY3Rpb24oKXt2YXIgdCxpLGUsaD10aGlzLHI9e307Zm9yKHZhciBzIGluIGguaWRzKXQ9cy5zcGxpdChcIiNcIiksaT10WzBdLGU9dFsxXSxyW2ldfHwocltpXT1bXSkscltpXS5wdXNoKGUpO3JldHVybiByfSxHbHlwaEF0bGFzLnByb3RvdHlwZS5nZXRSZWN0cz1mdW5jdGlvbigpe3ZhciB0LGksZSxoPXRoaXMscj17fTtmb3IodmFyIHMgaW4gaC5pZHMpdD1zLnNwbGl0KFwiI1wiKSxpPXRbMF0sZT10WzFdLHJbaV18fChyW2ldPXt9KSxyW2ldW2VdPWguaW5kZXhbc107cmV0dXJuIHJ9LEdseXBoQXRsYXMucHJvdG90eXBlLmFkZEdseXBoPWZ1bmN0aW9uKHQsaSxlLGgpe3ZhciByPXRoaXM7aWYoIWUpcmV0dXJuIG51bGw7dmFyIHM9aStcIiNcIitlLmlkO2lmKHRoaXMuaW5kZXhbc10pcmV0dXJuIHRoaXMuaWRzW3NdLmluZGV4T2YodCk8MCYmdGhpcy5pZHNbc10ucHVzaCh0KSx0aGlzLmluZGV4W3NdO2lmKCFlLmJpdG1hcClyZXR1cm4gbnVsbDt2YXIgYT1lLndpZHRoKzIqaCxFPWUuaGVpZ2h0KzIqaCxuPTEsbD1hKzIqbixUPUUrMipuO2wrPTQtbCU0LFQrPTQtVCU0O3ZhciB1PXRoaXMuYXRsYXMucGFja09uZShsLFQpO2lmKHV8fCh0aGlzLnJlc2l6ZSgpLHU9dGhpcy5hdGxhcy5wYWNrT25lKGwsVCkpLCF1KXJldHVybiB1dGlsLndhcm5PbmNlKFwiZ2x5cGggYml0bWFwIG92ZXJmbG93XCIpLG51bGw7dGhpcy5pbmRleFtzXT11LHRoaXMuaWRzW3NdPVt0XTtmb3IodmFyIGQ9dGhpcy5kYXRhLHA9ZS5iaXRtYXAsQT0wO0E8RTtBKyspZm9yKHZhciBfPXIud2lkdGgqKHUueStBK24pK3UueCtuLG89YSpBLHg9MDt4PGE7eCsrKWRbXyt4XT1wW28reF07cmV0dXJuIHRoaXMuZGlydHk9ITAsdX0sR2x5cGhBdGxhcy5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxpPXRoaXMud2lkdGgsZT10aGlzLmhlaWdodDtpZighKGk+PU1BWF9TSVpFfHxlPj1NQVhfU0laRSkpe3RoaXMudGV4dHVyZSYmKHRoaXMuZ2wmJnRoaXMuZ2wuZGVsZXRlVGV4dHVyZSh0aGlzLnRleHR1cmUpLHRoaXMudGV4dHVyZT1udWxsKSx0aGlzLndpZHRoKj1TSVpFX0dST1dUSF9SQVRFLHRoaXMuaGVpZ2h0Kj1TSVpFX0dST1dUSF9SQVRFLHRoaXMuYXRsYXMucmVzaXplKHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpO2Zvcih2YXIgaD1uZXcgQXJyYXlCdWZmZXIodGhpcy53aWR0aCp0aGlzLmhlaWdodCkscj0wO3I8ZTtyKyspe3ZhciBzPW5ldyBVaW50OEFycmF5KHQuZGF0YS5idWZmZXIsZSpyLGkpLGE9bmV3IFVpbnQ4QXJyYXkoaCxlKnIqU0laRV9HUk9XVEhfUkFURSxpKTthLnNldChzKX10aGlzLmRhdGE9bmV3IFVpbnQ4QXJyYXkoaCl9fSxHbHlwaEF0bGFzLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKHQpe3RoaXMuZ2w9dCx0aGlzLnRleHR1cmU/dC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsdGhpcy50ZXh0dXJlKToodGhpcy50ZXh0dXJlPXQuY3JlYXRlVGV4dHVyZSgpLHQuYmluZFRleHR1cmUodC5URVhUVVJFXzJELHRoaXMudGV4dHVyZSksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUFHX0ZJTFRFUix0LkxJTkVBUiksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUlOX0ZJTFRFUix0LkxJTkVBUiksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfV1JBUF9TLHQuQ0xBTVBfVE9fRURHRSksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfV1JBUF9ULHQuQ0xBTVBfVE9fRURHRSksdC50ZXhJbWFnZTJEKHQuVEVYVFVSRV8yRCwwLHQuQUxQSEEsdGhpcy53aWR0aCx0aGlzLmhlaWdodCwwLHQuQUxQSEEsdC5VTlNJR05FRF9CWVRFLG51bGwpKX0sR2x5cGhBdGxhcy5wcm90b3R5cGUudXBkYXRlVGV4dHVyZT1mdW5jdGlvbih0KXt0aGlzLmJpbmQodCksdGhpcy5kaXJ0eSYmKHQudGV4U3ViSW1hZ2UyRCh0LlRFWFRVUkVfMkQsMCwwLDAsdGhpcy53aWR0aCx0aGlzLmhlaWdodCx0LkFMUEhBLHQuVU5TSUdORURfQllURSx0aGlzLmRhdGEpLHRoaXMuZGlydHk9ITEpfSxtb2R1bGUuZXhwb3J0cz1HbHlwaEF0bGFzO1xufSx7XCIuLi91dGlsL3V0aWxcIjoyMTUsXCJAbWFwYm94L3NoZWxmLXBhY2tcIjoyfV0sMTY4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGdseXBoVXJsKHQsZSxhLGwpe3JldHVybiBsPWx8fFwiYWJjXCIsYS5yZXBsYWNlKFwie3N9XCIsbFt0Lmxlbmd0aCVsLmxlbmd0aF0pLnJlcGxhY2UoXCJ7Zm9udHN0YWNrfVwiLHQpLnJlcGxhY2UoXCJ7cmFuZ2V9XCIsZSl9dmFyIG5vcm1hbGl6ZVVSTD1fZGVyZXFfKFwiLi4vdXRpbC9tYXBib3hcIikubm9ybWFsaXplR2x5cGhzVVJMLGFqYXg9X2RlcmVxXyhcIi4uL3V0aWwvYWpheFwiKSx2ZXJ0aWNhbGl6ZVB1bmN0dWF0aW9uPV9kZXJlcV8oXCIuLi91dGlsL3ZlcnRpY2FsaXplX3B1bmN0dWF0aW9uXCIpLEdseXBocz1fZGVyZXFfKFwiLi4vdXRpbC9nbHlwaHNcIiksR2x5cGhBdGxhcz1fZGVyZXFfKFwiLi4vc3ltYm9sL2dseXBoX2F0bGFzXCIpLFByb3RvYnVmPV9kZXJlcV8oXCJwYmZcIiksU2ltcGxlR2x5cGg9ZnVuY3Rpb24odCxlLGEpe3ZhciBsPTE7dGhpcy5hZHZhbmNlPXQuYWR2YW5jZSx0aGlzLmxlZnQ9dC5sZWZ0LWEtbCx0aGlzLnRvcD10LnRvcCthK2wsdGhpcy5yZWN0PWV9LEdseXBoU291cmNlPWZ1bmN0aW9uKHQpe3RoaXMudXJsPXQmJm5vcm1hbGl6ZVVSTCh0KSx0aGlzLmF0bGFzZXM9e30sdGhpcy5zdGFja3M9e30sdGhpcy5sb2FkaW5nPXt9fTtHbHlwaFNvdXJjZS5wcm90b3R5cGUuZ2V0U2ltcGxlR2x5cGhzPWZ1bmN0aW9uKHQsZSxhLGwpe3ZhciBpPXRoaXM7dm9pZCAwPT09dGhpcy5zdGFja3NbdF0mJih0aGlzLnN0YWNrc1t0XT17fSksdm9pZCAwPT09dGhpcy5hdGxhc2VzW3RdJiYodGhpcy5hdGxhc2VzW3RdPW5ldyBHbHlwaEF0bGFzKTtmb3IodmFyIHI9e30sbz10aGlzLnN0YWNrc1t0XSxzPXRoaXMuYXRsYXNlc1t0XSxuPTMsaD17fSxwPTAsdT1mdW5jdGlvbihlKXt2YXIgbD1NYXRoLmZsb29yKGUvMjU2KTtpZihvW2xdKXt2YXIgaT1vW2xdLmdseXBoc1tlXSx1PXMuYWRkR2x5cGgoYSx0LGksbik7aSYmKHJbZV09bmV3IFNpbXBsZUdseXBoKGksdSxuKSl9ZWxzZSB2b2lkIDA9PT1oW2xdJiYoaFtsXT1bXSxwKyspLGhbbF0ucHVzaChlKX0sYz0wO2M8ZS5sZW5ndGg7YysrKXt2YXIgeT1lW2NdLGY9U3RyaW5nLmZyb21DaGFyQ29kZSh5KTt1KHkpLHZlcnRpY2FsaXplUHVuY3R1YXRpb24ubG9va3VwW2ZdJiZ1KHZlcnRpY2FsaXplUHVuY3R1YXRpb24ubG9va3VwW2ZdLmNoYXJDb2RlQXQoMCkpfXB8fGwodm9pZCAwLHIsdCk7dmFyIHY9ZnVuY3Rpb24oZSxvLHUpe2lmKCFlKWZvcih2YXIgYz1pLnN0YWNrc1t0XVtvXT11LnN0YWNrc1swXSx5PTA7eTxoW29dLmxlbmd0aDt5Kyspe3ZhciBmPWhbb11beV0sdj1jLmdseXBoc1tmXSxkPXMuYWRkR2x5cGgoYSx0LHYsbik7diYmKHJbZl09bmV3IFNpbXBsZUdseXBoKHYsZCxuKSl9cC0tLHB8fGwodm9pZCAwLHIsdCl9O2Zvcih2YXIgZCBpbiBoKWkubG9hZFJhbmdlKHQsZCx2KX0sR2x5cGhTb3VyY2UucHJvdG90eXBlLmxvYWRSYW5nZT1mdW5jdGlvbih0LGUsYSl7aWYoMjU2KmU+NjU1MzUpcmV0dXJuIGEoXCJnbHlwaHMgPiA2NTUzNSBub3Qgc3VwcG9ydGVkXCIpO3ZvaWQgMD09PXRoaXMubG9hZGluZ1t0XSYmKHRoaXMubG9hZGluZ1t0XT17fSk7dmFyIGw9dGhpcy5sb2FkaW5nW3RdO2lmKGxbZV0pbFtlXS5wdXNoKGEpO2Vsc2V7bFtlXT1bYV07dmFyIGk9MjU2KmUrXCItXCIrKDI1NiplKzI1NSkscj1nbHlwaFVybCh0LGksdGhpcy51cmwpO2FqYXguZ2V0QXJyYXlCdWZmZXIocixmdW5jdGlvbih0LGEpe2Zvcih2YXIgaT0hdCYmbmV3IEdseXBocyhuZXcgUHJvdG9idWYoYS5kYXRhKSkscj0wO3I8bFtlXS5sZW5ndGg7cisrKWxbZV1bcl0odCxlLGkpO2RlbGV0ZSBsW2VdfSl9fSxHbHlwaFNvdXJjZS5wcm90b3R5cGUuZ2V0R2x5cGhBdGxhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hdGxhc2VzW3RdfSxtb2R1bGUuZXhwb3J0cz1HbHlwaFNvdXJjZTtcbn0se1wiLi4vc3ltYm9sL2dseXBoX2F0bGFzXCI6MTY3LFwiLi4vdXRpbC9hamF4XCI6MTk0LFwiLi4vdXRpbC9nbHlwaHNcIjoyMDYsXCIuLi91dGlsL21hcGJveFwiOjIxMCxcIi4uL3V0aWwvdmVydGljYWxpemVfcHVuY3R1YXRpb25cIjoyMTcsXCJwYmZcIjoyNX1dLDE2OTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe2cucHVzaChlW3RdKSxsKyt9ZnVuY3Rpb24gcihlLHQscil7dmFyIG49dVtlXTtyZXR1cm4gZGVsZXRlIHVbZV0sdVt0XT1uLGdbbl0uZ2VvbWV0cnlbMF0ucG9wKCksZ1tuXS5nZW9tZXRyeVswXT1nW25dLmdlb21ldHJ5WzBdLmNvbmNhdChyWzBdKSxufWZ1bmN0aW9uIG4oZSx0LHIpe3ZhciBuPWlbdF07cmV0dXJuIGRlbGV0ZSBpW3RdLGlbZV09bixnW25dLmdlb21ldHJ5WzBdLnNoaWZ0KCksZ1tuXS5nZW9tZXRyeVswXT1yWzBdLmNvbmNhdChnW25dLmdlb21ldHJ5WzBdKSxufWZ1bmN0aW9uIG8oZSx0LHIpe3ZhciBuPXI/dFswXVt0WzBdLmxlbmd0aC0xXTp0WzBdWzBdO3JldHVybiBlK1wiOlwiK24ueCtcIjpcIituLnl9Zm9yKHZhciBpPXt9LHU9e30sZz1bXSxsPTAsbT0wO208ZS5sZW5ndGg7bSsrKXt2YXIgeT1lW21dLGM9eS5nZW9tZXRyeSxmPXkudGV4dDtpZihmKXt2YXIgYT1vKGYsYykscz1vKGYsYywhMCk7aWYoYSBpbiB1JiZzIGluIGkmJnVbYV0hPT1pW3NdKXt2YXIgdj1uKGEscyxjKSxkPXIoYSxzLGdbdl0uZ2VvbWV0cnkpO2RlbGV0ZSBpW2FdLGRlbGV0ZSB1W3NdLHVbbyhmLGdbZF0uZ2VvbWV0cnksITApXT1kLGdbdl0uZ2VvbWV0cnk9bnVsbH1lbHNlIGEgaW4gdT9yKGEscyxjKTpzIGluIGk/bihhLHMsYyk6KHQobSksaVthXT1sLTEsdVtzXT1sLTEpfWVsc2UgdChtKX1yZXR1cm4gZy5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2VvbWV0cnl9KX07XG59LHt9XSwxNzA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gU3ltYm9sUXVhZCh0LGUsbixhLGksbyxsLHIsaCxjLGcpe3RoaXMuYW5jaG9yUG9pbnQ9dCx0aGlzLnRsPWUsdGhpcy50cj1uLHRoaXMuYmw9YSx0aGlzLmJyPWksdGhpcy50ZXg9byx0aGlzLmFuY2hvckFuZ2xlPWwsdGhpcy5nbHlwaEFuZ2xlPXIsdGhpcy5taW5TY2FsZT1oLHRoaXMubWF4U2NhbGU9Yyx0aGlzLndyaXRpbmdNb2RlPWd9ZnVuY3Rpb24gZ2V0SWNvblF1YWRzKHQsZSxuLGEsaSxvLGwscixoKXt2YXIgYyxnLHUsbSxzPWUuaW1hZ2UucmVjdCxkPWkubGF5b3V0LHg9MSxTPWUubGVmdC14LGY9UytzLncvZS5pbWFnZS5waXhlbFJhdGlvLE09ZS50b3AteCx5PU0rcy5oL2UuaW1hZ2UucGl4ZWxSYXRpbztpZihcIm5vbmVcIiE9PWRbXCJpY29uLXRleHQtZml0XCJdJiZsKXt2YXIgUD1mLVMscD15LU0sdz1kW1widGV4dC1zaXplXCJdLzI0LHY9bC5sZWZ0KncsYj1sLnJpZ2h0KncsST1sLnRvcCp3LF89bC5ib3R0b20qdyxRPWItdixHPV8tSSxWPWRbXCJpY29uLXRleHQtZml0LXBhZGRpbmdcIl1bMF0sTD1kW1wiaWNvbi10ZXh0LWZpdC1wYWRkaW5nXCJdWzFdLEE9ZFtcImljb24tdGV4dC1maXQtcGFkZGluZ1wiXVsyXSxEPWRbXCJpY29uLXRleHQtZml0LXBhZGRpbmdcIl1bM10sRT1cIndpZHRoXCI9PT1kW1wiaWNvbi10ZXh0LWZpdFwiXT8uNSooRy1wKTowLEY9XCJoZWlnaHRcIj09PWRbXCJpY29uLXRleHQtZml0XCJdPy41KihRLVApOjAscT1cIndpZHRoXCI9PT1kW1wiaWNvbi10ZXh0LWZpdFwiXXx8XCJib3RoXCI9PT1kW1wiaWNvbi10ZXh0LWZpdFwiXT9ROlAsTj1cImhlaWdodFwiPT09ZFtcImljb24tdGV4dC1maXRcIl18fFwiYm90aFwiPT09ZFtcImljb24tdGV4dC1maXRcIl0/RzpwO2M9bmV3IFBvaW50KHYrRi1ELEkrRS1WKSxnPW5ldyBQb2ludCh2K0YrTCtxLEkrRS1WKSx1PW5ldyBQb2ludCh2K0YrTCtxLEkrRStBK04pLG09bmV3IFBvaW50KHYrRi1ELEkrRStBK04pfWVsc2UgYz1uZXcgUG9pbnQoUyxNKSxnPW5ldyBQb2ludChmLE0pLHU9bmV3IFBvaW50KGYseSksbT1uZXcgUG9pbnQoUyx5KTt2YXIgUj1pLmdldExheW91dFZhbHVlKFwiaWNvbi1yb3RhdGVcIixyLGgpKk1hdGguUEkvMTgwO2lmKG8pe3ZhciBrPWFbdC5zZWdtZW50XTtpZih0Lnk9PT1rLnkmJnQueD09PWsueCYmdC5zZWdtZW50KzE8YS5sZW5ndGgpe3ZhciB6PWFbdC5zZWdtZW50KzFdO1IrPU1hdGguYXRhbjIodC55LXoueSx0Lngtei54KStNYXRoLlBJfWVsc2UgUis9TWF0aC5hdGFuMih0Lnktay55LHQueC1rLngpfWlmKFIpe3ZhciBqPU1hdGguc2luKFIpLEI9TWF0aC5jb3MoUiksQz1bQiwtaixqLEJdO2M9Yy5tYXRNdWx0KEMpLGc9Zy5tYXRNdWx0KEMpLG09bS5tYXRNdWx0KEMpLHU9dS5tYXRNdWx0KEMpfXJldHVybltuZXcgU3ltYm9sUXVhZChuZXcgUG9pbnQodC54LHQueSksYyxnLG0sdSxlLmltYWdlLnJlY3QsMCwwLG1pblNjYWxlLDEvMCldfWZ1bmN0aW9uIGdldEdseXBoUXVhZHModCxlLG4sYSxpLG8sbCxyKXtmb3IodmFyIGg9aS5nZXRMYXlvdXRWYWx1ZShcInRleHQtcm90YXRlXCIsbCxyKSpNYXRoLlBJLzE4MCxjPWkubGF5b3V0W1widGV4dC1rZWVwLXVwcmlnaHRcIl0sZz1lLnBvc2l0aW9uZWRHbHlwaHMsdT1bXSxtPTA7bTxnLmxlbmd0aDttKyspe3ZhciBzPWdbbV0sZD1zLmdseXBoO2lmKGQpe3ZhciB4PWQucmVjdDtpZih4KXt2YXIgUz0ocy54K2QuYWR2YW5jZS8yKSpuLGY9dm9pZCAwLE09bWluU2NhbGU7bz8oZj1bXSxNPWdldExpbmVHbHlwaHMoZix0LFMsYSx0LnNlZ21lbnQsITEpLGMmJihNPU1hdGgubWluKE0sZ2V0TGluZUdseXBocyhmLHQsUyxhLHQuc2VnbWVudCwhMCkpKSk6Zj1be2FuY2hvclBvaW50Om5ldyBQb2ludCh0LngsdC55KSx1cHNpZGVEb3duOiExLGFuZ2xlOjAsbWF4U2NhbGU6MS8wLG1pblNjYWxlOm1pblNjYWxlfV07dmFyIHk9cy54K2QubGVmdCxQPXMueS1kLnRvcCxwPXkreC53LHc9UCt4Lmgsdj1uZXcgUG9pbnQocy54LGQuYWR2YW5jZS8yKSxiPW5ldyBQb2ludCh5LFApLEk9bmV3IFBvaW50KHAsUCksXz1uZXcgUG9pbnQoeSx3KSxRPW5ldyBQb2ludChwLHcpOzAhPT1zLmFuZ2xlJiYoYi5fc3ViKHYpLl9yb3RhdGUocy5hbmdsZSkuX2FkZCh2KSxJLl9zdWIodikuX3JvdGF0ZShzLmFuZ2xlKS5fYWRkKHYpLF8uX3N1Yih2KS5fcm90YXRlKHMuYW5nbGUpLl9hZGQodiksUS5fc3ViKHYpLl9yb3RhdGUocy5hbmdsZSkuX2FkZCh2KSk7Zm9yKHZhciBHPTA7RzxmLmxlbmd0aDtHKyspe3ZhciBWPWZbR10sTD1iLEE9SSxEPV8sRT1RO2lmKGgpe3ZhciBGPU1hdGguc2luKGgpLHE9TWF0aC5jb3MoaCksTj1bcSwtRixGLHFdO0w9TC5tYXRNdWx0KE4pLEE9QS5tYXRNdWx0KE4pLEQ9RC5tYXRNdWx0KE4pLEU9RS5tYXRNdWx0KE4pfXZhciBSPU1hdGgubWF4KFYubWluU2NhbGUsTSksaz0odC5hbmdsZSsoVi51cHNpZGVEb3duP01hdGguUEk6MCkrMipNYXRoLlBJKSUoMipNYXRoLlBJKSx6PShWLmFuZ2xlKyhWLnVwc2lkZURvd24/TWF0aC5QSTowKSsyKk1hdGguUEkpJSgyKk1hdGguUEkpO3UucHVzaChuZXcgU3ltYm9sUXVhZChWLmFuY2hvclBvaW50LEwsQSxELEUseCxrLHosUixWLm1heFNjYWxlLGUud3JpdGluZ01vZGUpKX19fX1yZXR1cm4gdX1mdW5jdGlvbiBnZXRMaW5lR2x5cGhzKHQsZSxuLGEsaSxvKXtmb3IodmFyIGw9bj49MF5vLHI9TWF0aC5hYnMobiksaD1uZXcgUG9pbnQoZS54LGUueSksYz1nZXRTZWdtZW50RW5kKGwsYSxpKSxnPXthbmNob3I6aCxlbmQ6YyxpbmRleDppLG1pblNjYWxlOmdldE1pblNjYWxlRm9yU2VnbWVudChyLGgsYyksbWF4U2NhbGU6MS8wfTs7KXtpZihpbnNlcnRTZWdtZW50R2x5cGgodCxnLGwsbyksZy5taW5TY2FsZTw9ZS5zY2FsZSlyZXR1cm4gZS5zY2FsZTt2YXIgdT1nZXROZXh0VmlydHVhbFNlZ21lbnQoZyxhLHIsbCk7aWYoIXUpcmV0dXJuIGcubWluU2NhbGU7Zz11fX1mdW5jdGlvbiBpbnNlcnRTZWdtZW50R2x5cGgodCxlLG4sYSl7dmFyIGk9TWF0aC5hdGFuMihlLmVuZC55LWUuYW5jaG9yLnksZS5lbmQueC1lLmFuY2hvci54KSxvPW4/aTppK01hdGguUEk7dC5wdXNoKHthbmNob3JQb2ludDplLmFuY2hvcix1cHNpZGVEb3duOmEsbWluU2NhbGU6ZS5taW5TY2FsZSxtYXhTY2FsZTplLm1heFNjYWxlLGFuZ2xlOihvKzIqTWF0aC5QSSklKDIqTWF0aC5QSSl9KX1mdW5jdGlvbiBnZXRWaXJ0dWFsU2VnbWVudEFuY2hvcih0LGUsbil7dmFyIGE9ZS5zdWIodCkuX3VuaXQoKTtyZXR1cm4gdC5zdWIoYS5fbXVsdChuKSl9ZnVuY3Rpb24gZ2V0TWluU2NhbGVGb3JTZWdtZW50KHQsZSxuKXt2YXIgYT1lLmRpc3Qobik7cmV0dXJuIHQvYX1mdW5jdGlvbiBnZXRTZWdtZW50RW5kKHQsZSxuKXtyZXR1cm4gdD9lW24rMV06ZVtuXX1mdW5jdGlvbiBnZXROZXh0VmlydHVhbFNlZ21lbnQodCxlLG4sYSl7Zm9yKHZhciBpPXQuZW5kLG89aSxsPXQuaW5kZXg7by5lcXVhbHMoaSk7KXtpZihhJiZsKzI8ZS5sZW5ndGgpbCs9MTtlbHNle2lmKGF8fDA9PT1sKXJldHVybiBudWxsO2wtPTF9bz1nZXRTZWdtZW50RW5kKGEsZSxsKX12YXIgcj1nZXRWaXJ0dWFsU2VnbWVudEFuY2hvcihpLG8sdC5hbmNob3IuZGlzdCh0LmVuZCkpO3JldHVybnthbmNob3I6cixlbmQ6byxpbmRleDpsLG1pblNjYWxlOmdldE1pblNjYWxlRm9yU2VnbWVudChuLHIsbyksbWF4U2NhbGU6dC5taW5TY2FsZX19dmFyIFBvaW50PV9kZXJlcV8oXCJwb2ludC1nZW9tZXRyeVwiKTttb2R1bGUuZXhwb3J0cz17Z2V0SWNvblF1YWRzOmdldEljb25RdWFkcyxnZXRHbHlwaFF1YWRzOmdldEdseXBoUXVhZHMsU3ltYm9sUXVhZDpTeW1ib2xRdWFkfTt2YXIgbWluU2NhbGU9LjU7XG59LHtcInBvaW50LWdlb21ldHJ5XCI6MjZ9XSwxNzE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gUG9zaXRpb25lZEdseXBoKGUsdCxpLG4scil7dGhpcy5jb2RlUG9pbnQ9ZSx0aGlzLng9dCx0aGlzLnk9aSx0aGlzLmdseXBoPW58fG51bGwsdGhpcy5hbmdsZT1yfWZ1bmN0aW9uIFNoYXBpbmcoZSx0LGksbixyLGEsbyl7dGhpcy5wb3NpdGlvbmVkR2x5cGhzPWUsdGhpcy50ZXh0PXQsdGhpcy50b3A9aSx0aGlzLmJvdHRvbT1uLHRoaXMubGVmdD1yLHRoaXMucmlnaHQ9YSx0aGlzLndyaXRpbmdNb2RlPW99ZnVuY3Rpb24gYnJlYWtMaW5lcyhlLHQpe2Zvcih2YXIgaT1bXSxuPTAscj0wLGE9dDtyPGEubGVuZ3RoO3IrPTEpe3ZhciBvPWFbcl07aS5wdXNoKGUuc3Vic3RyaW5nKG4sbykpLG49b31yZXR1cm4gbjxlLmxlbmd0aCYmaS5wdXNoKGUuc3Vic3RyaW5nKG4sZS5sZW5ndGgpKSxpfWZ1bmN0aW9uIHNoYXBlVGV4dChlLHQsaSxuLHIsYSxvLHMsaCxsLGMpe3ZhciB1PWUudHJpbSgpO2M9PT1Xcml0aW5nTW9kZS52ZXJ0aWNhbCYmKHU9dmVydGljYWxpemVQdW5jdHVhdGlvbih1KSk7dmFyIGQsZz1bXSxwPW5ldyBTaGFwaW5nKGcsdSxoWzFdLGhbMV0saFswXSxoWzBdLGMpO3JldHVybiBkPXJ0bFRleHRQbHVnaW4ucHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0P3J0bFRleHRQbHVnaW4ucHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0KHUsZGV0ZXJtaW5lTGluZUJyZWFrcyh1LHMsaSx0KSk6YnJlYWtMaW5lcyh1LGRldGVybWluZUxpbmVCcmVha3ModSxzLGksdCkpLHNoYXBlTGluZXMocCx0LGQsbixyLGEsbyxoLGMscyxsKSwhIWcubGVuZ3RoJiZwfWZ1bmN0aW9uIGRldGVybWluZUF2ZXJhZ2VMaW5lV2lkdGgoZSx0LGksbil7dmFyIHI9MDtmb3IodmFyIGEgaW4gZSl7dmFyIG89bltlLmNoYXJDb2RlQXQoYSldO28mJihyKz1vLmFkdmFuY2UrdCl9dmFyIHM9TWF0aC5tYXgoMSxNYXRoLmNlaWwoci9pKSk7cmV0dXJuIHIvc31mdW5jdGlvbiBjYWxjdWxhdGVCYWRuZXNzKGUsdCxpLG4pe3ZhciByPU1hdGgucG93KGUtdCwyKTtyZXR1cm4gbj9lPHQ/ci8yOjIqcjpyK01hdGguYWJzKGkpKml9ZnVuY3Rpb24gY2FsY3VsYXRlUGVuYWx0eShlLHQpe3ZhciBpPTA7cmV0dXJuIDEwPT09ZSYmKGktPTFlNCksNDAhPT1lJiY2NTI4OCE9PWV8fChpKz01MCksNDEhPT10JiY2NTI4OSE9PXR8fChpKz01MCksaX1mdW5jdGlvbiBldmFsdWF0ZUJyZWFrKGUsdCxpLG4scixhKXtmb3IodmFyIG89bnVsbCxzPWNhbGN1bGF0ZUJhZG5lc3ModCxpLHIsYSksaD0wLGw9bjtoPGwubGVuZ3RoO2grPTEpe3ZhciBjPWxbaF0sdT10LWMueCxkPWNhbGN1bGF0ZUJhZG5lc3ModSxpLHIsYSkrYy5iYWRuZXNzO2Q8PXMmJihvPWMscz1kKX1yZXR1cm57aW5kZXg6ZSx4OnQscHJpb3JCcmVhazpvLGJhZG5lc3M6c319ZnVuY3Rpb24gbGVhc3RCYWRCcmVha3MoZSl7cmV0dXJuIGU/bGVhc3RCYWRCcmVha3MoZS5wcmlvckJyZWFrKS5jb25jYXQoZS5pbmRleCk6W119ZnVuY3Rpb24gZGV0ZXJtaW5lTGluZUJyZWFrcyhlLHQsaSxuKXtpZighaSlyZXR1cm5bXTtpZighZSlyZXR1cm5bXTtmb3IodmFyIHI9W10sYT1kZXRlcm1pbmVBdmVyYWdlTGluZVdpZHRoKGUsdCxpLG4pLG89MCxzPTA7czxlLmxlbmd0aDtzKyspe3ZhciBoPWUuY2hhckNvZGVBdChzKSxsPW5baF07bCYmIXdoaXRlc3BhY2VbaF0mJihvKz1sLmFkdmFuY2UrdCksczxlLmxlbmd0aC0xJiYoYnJlYWthYmxlW2hdfHxzY3JpcHREZXRlY3Rpb24uY2hhckFsbG93c0lkZW9ncmFwaGljQnJlYWtpbmcoaCkpJiZyLnB1c2goZXZhbHVhdGVCcmVhayhzKzEsbyxhLHIsY2FsY3VsYXRlUGVuYWx0eShoLGUuY2hhckNvZGVBdChzKzEpKSwhMSkpfXJldHVybiBsZWFzdEJhZEJyZWFrcyhldmFsdWF0ZUJyZWFrKGUubGVuZ3RoLG8sYSxyLDAsITApKX1mdW5jdGlvbiBzaGFwZUxpbmVzKGUsdCxpLG4scixhLG8scyxoLGwsYyl7dmFyIHU9LTE3LGQ9MCxnPXUscD0wLHY9ZS5wb3NpdGlvbmVkR2x5cGhzO2Zvcih2YXIgZiBpbiBpKXt2YXIgeD1pW2ZdLnRyaW0oKTtpZih4Lmxlbmd0aCl7Zm9yKHZhciBCPXYubGVuZ3RoLGs9MDtrPHgubGVuZ3RoO2srKyl7dmFyIFA9eC5jaGFyQ29kZUF0KGspLGI9dFtQXTtiJiYoc2NyaXB0RGV0ZWN0aW9uLmNoYXJIYXNVcHJpZ2h0VmVydGljYWxPcmllbnRhdGlvbihQKSYmaCE9PVdyaXRpbmdNb2RlLmhvcml6b250YWw/KHYucHVzaChuZXcgUG9zaXRpb25lZEdseXBoKFAsZCwwLGIsLU1hdGguUEkvMikpLGQrPWMrbCk6KHYucHVzaChuZXcgUG9zaXRpb25lZEdseXBoKFAsZCxnLGIsMCkpLGQrPWIuYWR2YW5jZStsKSl9aWYodi5sZW5ndGghPT1CKXt2YXIgbT1kLWw7cD1NYXRoLm1heChtLHApLGp1c3RpZnlMaW5lKHYsdCxCLHYubGVuZ3RoLTEsbyl9ZD0wLGcrPW59ZWxzZSBnKz1ufWFsaWduKHYsbyxyLGEscCxuLGkubGVuZ3RoLHMpO3ZhciB5PWkubGVuZ3RoKm47ZS50b3ArPS1hKnksZS5ib3R0b209ZS50b3AreSxlLmxlZnQrPS1yKnAsZS5yaWdodD1lLmxlZnQrcH1mdW5jdGlvbiBqdXN0aWZ5TGluZShlLHQsaSxuLHIpe2lmKHIpZm9yKHZhciBhPXRbZVtuXS5jb2RlUG9pbnRdLmFkdmFuY2Usbz0oZVtuXS54K2EpKnIscz1pO3M8PW47cysrKWVbc10ueC09b31mdW5jdGlvbiBhbGlnbihlLHQsaSxuLHIsYSxvLHMpe2Zvcih2YXIgaD0odC1pKSpyK3NbMF0sbD0oLW4qbysuNSkqYStzWzFdLGM9MDtjPGUubGVuZ3RoO2MrKyllW2NdLngrPWgsZVtjXS55Kz1sfWZ1bmN0aW9uIHNoYXBlSWNvbihlLHQpe2lmKCFlfHwhZS5yZWN0KXJldHVybiBudWxsO3ZhciBpPXRbMF0sbj10WzFdLHI9aS1lLndpZHRoLzIsYT1yK2Uud2lkdGgsbz1uLWUuaGVpZ2h0LzIscz1vK2UuaGVpZ2h0O3JldHVybiBuZXcgUG9zaXRpb25lZEljb24oZSxvLHMscixhKX1mdW5jdGlvbiBQb3NpdGlvbmVkSWNvbihlLHQsaSxuLHIpe3RoaXMuaW1hZ2U9ZSx0aGlzLnRvcD10LHRoaXMuYm90dG9tPWksdGhpcy5sZWZ0PW4sdGhpcy5yaWdodD1yfXZhciBzY3JpcHREZXRlY3Rpb249X2RlcmVxXyhcIi4uL3V0aWwvc2NyaXB0X2RldGVjdGlvblwiKSx2ZXJ0aWNhbGl6ZVB1bmN0dWF0aW9uPV9kZXJlcV8oXCIuLi91dGlsL3ZlcnRpY2FsaXplX3B1bmN0dWF0aW9uXCIpLHJ0bFRleHRQbHVnaW49X2RlcmVxXyhcIi4uL3NvdXJjZS9ydGxfdGV4dF9wbHVnaW5cIiksV3JpdGluZ01vZGU9e2hvcml6b250YWw6MSx2ZXJ0aWNhbDoyfTttb2R1bGUuZXhwb3J0cz17c2hhcGVUZXh0OnNoYXBlVGV4dCxzaGFwZUljb246c2hhcGVJY29uLFdyaXRpbmdNb2RlOldyaXRpbmdNb2RlfTt2YXIgd2hpdGVzcGFjZT17OTohMCwxMDohMCwxMTohMCwxMjohMCwxMzohMCwzMjohMH0sYnJlYWthYmxlPXsxMDohMCwzMjohMCwzODohMCw0MDohMCw0MTohMCw0MzohMCw0NTohMCw0NzohMCwxNzM6ITAsMTgzOiEwLDgyMDM6ITAsODIwODohMCw4MjExOiEwLDgyMzE6ITB9O1xufSx7XCIuLi9zb3VyY2UvcnRsX3RleHRfcGx1Z2luXCI6OTEsXCIuLi91dGlsL3NjcmlwdF9kZXRlY3Rpb25cIjoyMTEsXCIuLi91dGlsL3ZlcnRpY2FsaXplX3B1bmN0dWF0aW9uXCI6MjE3fV0sMTcyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGNvcHlCaXRtYXAodCxpLGUscixhLGgscyxvLG4sbCxwKXt2YXIgZix1LGQ9cippK2UsZz1vKmgrcztpZihwKWZvcihnLT1oLHU9LTE7dTw9bDt1KyssZys9aClmb3IoZD0oKHUrbCklbCtyKSppK2UsZj0tMTtmPD1uO2YrKylhW2crZl09dFtkKyhmK24pJW5dO2Vsc2UgZm9yKHU9MDt1PGw7dSsrLGQrPWksZys9aClmb3IoZj0wO2Y8bjtmKyspYVtnK2ZdPXRbZCtmXX12YXIgU2hlbGZQYWNrPV9kZXJlcV8oXCJAbWFwYm94L3NoZWxmLXBhY2tcIiksYnJvd3Nlcj1fZGVyZXFfKFwiLi4vdXRpbC9icm93c2VyXCIpLHV0aWw9X2RlcmVxXyhcIi4uL3V0aWwvdXRpbFwiKSx3aW5kb3c9X2RlcmVxXyhcIi4uL3V0aWwvd2luZG93XCIpLEV2ZW50ZWQ9X2RlcmVxXyhcIi4uL3V0aWwvZXZlbnRlZFwiKSxTcHJpdGVBdGxhcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBpKGksZSl7dC5jYWxsKHRoaXMpLHRoaXMud2lkdGg9aSx0aGlzLmhlaWdodD1lLHRoaXMuc2hlbGZQYWNrPW5ldyBTaGVsZlBhY2soaSxlKSx0aGlzLmltYWdlcz17fSx0aGlzLmRhdGE9ITEsdGhpcy50ZXh0dXJlPTAsdGhpcy5maWx0ZXI9MCx0aGlzLnBpeGVsUmF0aW89YnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvPjE/MjoxLHRoaXMuZGlydHk9ITB9cmV0dXJuIHQmJihpLl9fcHJvdG9fXz10KSxpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxpLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1pLGkucHJvdG90eXBlLmFsbG9jYXRlSW1hZ2U9ZnVuY3Rpb24odCxpKXt0Lz10aGlzLnBpeGVsUmF0aW8saS89dGhpcy5waXhlbFJhdGlvO3ZhciBlPTIscj10K2UrKDQtKHQrZSklNCksYT1pK2UrKDQtKGkrZSklNCksaD10aGlzLnNoZWxmUGFjay5wYWNrT25lKHIsYSk7cmV0dXJuIGg/aDoodXRpbC53YXJuT25jZShcIlNwcml0ZUF0bGFzIG91dCBvZiBzcGFjZS5cIiksbnVsbCl9LGkucHJvdG90eXBlLmFkZEltYWdlPWZ1bmN0aW9uKHQsaSxlKXt2YXIgcixhLGg7aWYoaSBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSW1hZ2VFbGVtZW50PyhyPWkud2lkdGgsYT1pLmhlaWdodCxpPWJyb3dzZXIuZ2V0SW1hZ2VEYXRhKGkpLGg9MSk6KHI9ZS53aWR0aCxhPWUuaGVpZ2h0LGg9ZS5waXhlbFJhdGlvfHwxKSxBcnJheUJ1ZmZlci5pc1ZpZXcoaSkmJihpPW5ldyBVaW50MzJBcnJheShpLmJ1ZmZlcikpLCEoaSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5KSlyZXR1cm4gdGhpcy5maXJlKFwiZXJyb3JcIix7ZXJyb3I6bmV3IEVycm9yKFwiSW1hZ2UgcHJvdmlkZWQgaW4gYW4gaW52YWxpZCBmb3JtYXQuIFN1cHBvcnRlZCBmb3JtYXRzIGFyZSBIVE1MSW1hZ2VFbGVtZW50IGFuZCBBcnJheUJ1ZmZlclZpZXcuXCIpfSk7aWYodGhpcy5pbWFnZXNbdF0pcmV0dXJuIHRoaXMuZmlyZShcImVycm9yXCIse2Vycm9yOm5ldyBFcnJvcihcIkFuIGltYWdlIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzLlwiKX0pO3ZhciBzPXRoaXMuYWxsb2NhdGVJbWFnZShyLGEpO2lmKCFzKXJldHVybiB0aGlzLmZpcmUoXCJlcnJvclwiLHtlcnJvcjpuZXcgRXJyb3IoXCJUaGVyZSBpcyBub3QgZW5vdWdoIHNwYWNlIHRvIGFkZCB0aGlzIGltYWdlLlwiKX0pO3ZhciBvPXtyZWN0OnMsd2lkdGg6ci9oLGhlaWdodDphL2gsc2RmOiExLHBpeGVsUmF0aW86aC90aGlzLnBpeGVsUmF0aW99O3RoaXMuaW1hZ2VzW3RdPW8sdGhpcy5jb3B5KGkscixzLHtwaXhlbFJhdGlvOmgseDowLHk6MCx3aWR0aDpyLGhlaWdodDphfSwhMSksdGhpcy5maXJlKFwiZGF0YVwiLHtkYXRhVHlwZTpcInN0eWxlXCJ9KX0saS5wcm90b3R5cGUucmVtb3ZlSW1hZ2U9ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5pbWFnZXNbdF07cmV0dXJuIGRlbGV0ZSB0aGlzLmltYWdlc1t0XSxpPyh0aGlzLnNoZWxmUGFjay51bnJlZihpLnJlY3QpLHZvaWQgdGhpcy5maXJlKFwiZGF0YVwiLHtkYXRhVHlwZTpcInN0eWxlXCJ9KSk6dGhpcy5maXJlKFwiZXJyb3JcIix7ZXJyb3I6bmV3IEVycm9yKFwiTm8gaW1hZ2Ugd2l0aCB0aGlzIG5hbWUgZXhpc3RzLlwiKX0pfSxpLnByb3RvdHlwZS5nZXRJbWFnZT1mdW5jdGlvbih0LGkpe2lmKHRoaXMuaW1hZ2VzW3RdKXJldHVybiB0aGlzLmltYWdlc1t0XTtpZighdGhpcy5zcHJpdGUpcmV0dXJuIG51bGw7dmFyIGU9dGhpcy5zcHJpdGUuZ2V0U3ByaXRlUG9zaXRpb24odCk7aWYoIWUud2lkdGh8fCFlLmhlaWdodClyZXR1cm4gbnVsbDt2YXIgcj10aGlzLmFsbG9jYXRlSW1hZ2UoZS53aWR0aCxlLmhlaWdodCk7aWYoIXIpcmV0dXJuIG51bGw7dmFyIGE9e3JlY3Q6cix3aWR0aDplLndpZHRoL2UucGl4ZWxSYXRpbyxoZWlnaHQ6ZS5oZWlnaHQvZS5waXhlbFJhdGlvLHNkZjplLnNkZixwaXhlbFJhdGlvOmUucGl4ZWxSYXRpby90aGlzLnBpeGVsUmF0aW99O2lmKHRoaXMuaW1hZ2VzW3RdPWEsIXRoaXMuc3ByaXRlLmltZ0RhdGEpcmV0dXJuIG51bGw7dmFyIGg9bmV3IFVpbnQzMkFycmF5KHRoaXMuc3ByaXRlLmltZ0RhdGEuYnVmZmVyKTtyZXR1cm4gdGhpcy5jb3B5KGgsdGhpcy5zcHJpdGUud2lkdGgscixlLGkpLGF9LGkucHJvdG90eXBlLmdldFBvc2l0aW9uPWZ1bmN0aW9uKHQsaSl7dmFyIGU9dGhpcy5nZXRJbWFnZSh0LGkpLHI9ZSYmZS5yZWN0O2lmKCFyKXJldHVybiBudWxsO3ZhciBhPWUud2lkdGgqZS5waXhlbFJhdGlvLGg9ZS5oZWlnaHQqZS5waXhlbFJhdGlvLHM9MTtyZXR1cm57c2l6ZTpbZS53aWR0aCxlLmhlaWdodF0sdGw6WyhyLngrcykvdGhpcy53aWR0aCwoci55K3MpL3RoaXMuaGVpZ2h0XSxicjpbKHIueCtzK2EpL3RoaXMud2lkdGgsKHIueStzK2gpL3RoaXMuaGVpZ2h0XX19LGkucHJvdG90eXBlLmFsbG9jYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZighdGhpcy5kYXRhKXt2YXIgaT1NYXRoLmZsb29yKHRoaXMud2lkdGgqdGhpcy5waXhlbFJhdGlvKSxlPU1hdGguZmxvb3IodGhpcy5oZWlnaHQqdGhpcy5waXhlbFJhdGlvKTt0aGlzLmRhdGE9bmV3IFVpbnQzMkFycmF5KGkqZSk7Zm9yKHZhciByPTA7cjx0aGlzLmRhdGEubGVuZ3RoO3IrKyl0LmRhdGFbcl09MH19LGkucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24odCxpLGUscixhKXt0aGlzLmFsbG9jYXRlKCk7dmFyIGg9dGhpcy5kYXRhLHM9MTtjb3B5Qml0bWFwKHQsaSxyLngsci55LGgsdGhpcy53aWR0aCp0aGlzLnBpeGVsUmF0aW8sKGUueCtzKSp0aGlzLnBpeGVsUmF0aW8sKGUueStzKSp0aGlzLnBpeGVsUmF0aW8sci53aWR0aCxyLmhlaWdodCxhKSx0aGlzLmRpcnR5PSEwfSxpLnByb3RvdHlwZS5zZXRTcHJpdGU9ZnVuY3Rpb24odCl7dCYmdGhpcy5jYW52YXMmJih0aGlzLmNhbnZhcy53aWR0aD10aGlzLndpZHRoKnRoaXMucGl4ZWxSYXRpbyx0aGlzLmNhbnZhcy5oZWlnaHQ9dGhpcy5oZWlnaHQqdGhpcy5waXhlbFJhdGlvKSx0aGlzLnNwcml0ZT10fSxpLnByb3RvdHlwZS5hZGRJY29ucz1mdW5jdGlvbih0LGkpe2Zvcih2YXIgZT10aGlzLHI9MDtyPHQubGVuZ3RoO3IrKyllLmdldEltYWdlKHRbcl0pO2kobnVsbCx0aGlzLmltYWdlcyl9LGkucHJvdG90eXBlLmJpbmQ9ZnVuY3Rpb24odCxpKXt2YXIgZT0hMTt0aGlzLnRleHR1cmU/dC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsdGhpcy50ZXh0dXJlKToodGhpcy50ZXh0dXJlPXQuY3JlYXRlVGV4dHVyZSgpLHQuYmluZFRleHR1cmUodC5URVhUVVJFXzJELHRoaXMudGV4dHVyZSksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfV1JBUF9TLHQuQ0xBTVBfVE9fRURHRSksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfV1JBUF9ULHQuQ0xBTVBfVE9fRURHRSksdC5waXhlbFN0b3JlaSh0LlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwhMCksZT0hMCk7dmFyIHI9aT90LkxJTkVBUjp0Lk5FQVJFU1Q7ciE9PXRoaXMuZmlsdGVyJiYodC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfTUlOX0ZJTFRFUixyKSx0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9NQUdfRklMVEVSLHIpLHRoaXMuZmlsdGVyPXIpLHRoaXMuZGlydHkmJih0aGlzLmFsbG9jYXRlKCksZT90LnRleEltYWdlMkQodC5URVhUVVJFXzJELDAsdC5SR0JBLHRoaXMud2lkdGgqdGhpcy5waXhlbFJhdGlvLHRoaXMuaGVpZ2h0KnRoaXMucGl4ZWxSYXRpbywwLHQuUkdCQSx0LlVOU0lHTkVEX0JZVEUsbmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhLmJ1ZmZlcikpOnQudGV4U3ViSW1hZ2UyRCh0LlRFWFRVUkVfMkQsMCwwLDAsdGhpcy53aWR0aCp0aGlzLnBpeGVsUmF0aW8sdGhpcy5oZWlnaHQqdGhpcy5waXhlbFJhdGlvLHQuUkdCQSx0LlVOU0lHTkVEX0JZVEUsbmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhLmJ1ZmZlcikpLHRoaXMuZGlydHk9ITEpfSxpfShFdmVudGVkKTttb2R1bGUuZXhwb3J0cz1TcHJpdGVBdGxhcztcbn0se1wiLi4vdXRpbC9icm93c2VyXCI6MTk1LFwiLi4vdXRpbC9ldmVudGVkXCI6MjAzLFwiLi4vdXRpbC91dGlsXCI6MjE1LFwiLi4vdXRpbC93aW5kb3dcIjoxOTcsXCJAbWFwYm94L3NoZWxmLXBhY2tcIjoyfV0sMTczOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBydGxUZXh0UGx1Z2luPV9kZXJlcV8oXCIuLi9zb3VyY2UvcnRsX3RleHRfcGx1Z2luXCIpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKGUscix0LGEpe3ZhciBsPXIuZ2V0TGF5b3V0VmFsdWUoXCJ0ZXh0LXRyYW5zZm9ybVwiLHQsYSk7cmV0dXJuXCJ1cHBlcmNhc2VcIj09PWw/ZT1lLnRvTG9jYWxlVXBwZXJDYXNlKCk6XCJsb3dlcmNhc2VcIj09PWwmJihlPWUudG9Mb2NhbGVMb3dlckNhc2UoKSkscnRsVGV4dFBsdWdpbi5hcHBseUFyYWJpY1NoYXBpbmcmJihlPXJ0bFRleHRQbHVnaW4uYXBwbHlBcmFiaWNTaGFwaW5nKGUpKSxlfTtcbn0se1wiLi4vc291cmNlL3J0bF90ZXh0X3BsdWdpblwiOjkxfV0sMTc0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBET009X2RlcmVxXyhcIi4uL3V0aWwvZG9tXCIpLFBvaW50PV9kZXJlcV8oXCJwb2ludC1nZW9tZXRyeVwiKSxoYW5kbGVycz17c2Nyb2xsWm9vbTpfZGVyZXFfKFwiLi9oYW5kbGVyL3Njcm9sbF96b29tXCIpLGJveFpvb206X2RlcmVxXyhcIi4vaGFuZGxlci9ib3hfem9vbVwiKSxkcmFnUm90YXRlOl9kZXJlcV8oXCIuL2hhbmRsZXIvZHJhZ19yb3RhdGVcIiksZHJhZ1BhbjpfZGVyZXFfKFwiLi9oYW5kbGVyL2RyYWdfcGFuXCIpLGtleWJvYXJkOl9kZXJlcV8oXCIuL2hhbmRsZXIva2V5Ym9hcmRcIiksZG91YmxlQ2xpY2tab29tOl9kZXJlcV8oXCIuL2hhbmRsZXIvZGJsY2xpY2tfem9vbVwiKSx0b3VjaFpvb21Sb3RhdGU6X2RlcmVxXyhcIi4vaGFuZGxlci90b3VjaF96b29tX3JvdGF0ZVwiKX07bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUpe2goXCJtb3VzZW91dFwiLGUpfWZ1bmN0aW9uIG8odCl7ZS5zdG9wKCksTD1ET00ubW91c2VQb3MoZyx0KSxoKFwibW91c2Vkb3duXCIsdCksRT0hMH1mdW5jdGlvbiByKHQpe3ZhciBuPWUuZHJhZ1JvdGF0ZSYmZS5kcmFnUm90YXRlLmlzQWN0aXZlKCk7cCYmIW4mJmgoXCJjb250ZXh0bWVudVwiLHApLHA9bnVsbCxFPSExLGgoXCJtb3VzZXVwXCIsdCl9ZnVuY3Rpb24gYSh0KXtpZighKGUuZHJhZ1BhbiYmZS5kcmFnUGFuLmlzQWN0aXZlKCl8fGUuZHJhZ1JvdGF0ZSYmZS5kcmFnUm90YXRlLmlzQWN0aXZlKCkpKXtmb3IodmFyIG49dC50b0VsZW1lbnR8fHQudGFyZ2V0O24mJm4hPT1nOyluPW4ucGFyZW50Tm9kZTtuPT09ZyYmaChcIm1vdXNlbW92ZVwiLHQpfX1mdW5jdGlvbiB1KHQpe2Uuc3RvcCgpLGYoXCJ0b3VjaHN0YXJ0XCIsdCksIXQudG91Y2hlc3x8dC50b3VjaGVzLmxlbmd0aD4xfHwoYj8oY2xlYXJUaW1lb3V0KGIpLGI9bnVsbCxoKFwiZGJsY2xpY2tcIix0KSk6Yj1zZXRUaW1lb3V0KGwsMzAwKSl9ZnVuY3Rpb24gaShlKXtmKFwidG91Y2htb3ZlXCIsZSl9ZnVuY3Rpb24gYyhlKXtmKFwidG91Y2hlbmRcIixlKX1mdW5jdGlvbiBkKGUpe2YoXCJ0b3VjaGNhbmNlbFwiLGUpfWZ1bmN0aW9uIGwoKXtiPW51bGx9ZnVuY3Rpb24gcyhlKXt2YXIgdD1ET00ubW91c2VQb3MoZyxlKTt0LmVxdWFscyhMKSYmaChcImNsaWNrXCIsZSl9ZnVuY3Rpb24gdihlKXtoKFwiZGJsY2xpY2tcIixlKSxlLnByZXZlbnREZWZhdWx0KCl9ZnVuY3Rpb24gbSh0KXt2YXIgbj1lLmRyYWdSb3RhdGUmJmUuZHJhZ1JvdGF0ZS5pc0FjdGl2ZSgpO0V8fG4/RSYmKHA9dCk6aChcImNvbnRleHRtZW51XCIsdCksdC5wcmV2ZW50RGVmYXVsdCgpfWZ1bmN0aW9uIGgodCxuKXt2YXIgbz1ET00ubW91c2VQb3MoZyxuKTtyZXR1cm4gZS5maXJlKHQse2xuZ0xhdDplLnVucHJvamVjdChvKSxwb2ludDpvLG9yaWdpbmFsRXZlbnQ6bn0pfWZ1bmN0aW9uIGYodCxuKXt2YXIgbz1ET00udG91Y2hQb3MoZyxuKSxyPW8ucmVkdWNlKGZ1bmN0aW9uKGUsdCxuLG8pe3JldHVybiBlLmFkZCh0LmRpdihvLmxlbmd0aCkpfSxuZXcgUG9pbnQoMCwwKSk7cmV0dXJuIGUuZmlyZSh0LHtsbmdMYXQ6ZS51bnByb2plY3QocikscG9pbnQ6cixsbmdMYXRzOm8ubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBlLnVucHJvamVjdCh0KX0sdGhpcykscG9pbnRzOm8sb3JpZ2luYWxFdmVudDpufSl9dmFyIGc9ZS5nZXRDYW52YXNDb250YWluZXIoKSxwPW51bGwsRT0hMSxMPW51bGwsYj1udWxsO2Zvcih2YXIgcSBpbiBoYW5kbGVycyllW3FdPW5ldyBoYW5kbGVyc1txXShlLHQpLHQuaW50ZXJhY3RpdmUmJnRbcV0mJmVbcV0uZW5hYmxlKHRbcV0pO2cuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3V0XCIsbiwhMSksZy5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsbywhMSksZy5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHIsITEpLGcuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLGEsITEpLGcuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIix1LCExKSxnLmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLGMsITEpLGcuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLGksITEpLGcuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoY2FuY2VsXCIsZCwhMSksZy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIixzLCExKSxnLmFkZEV2ZW50TGlzdGVuZXIoXCJkYmxjbGlja1wiLHYsITEpLGcuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsbSwhMSl9O1xufSx7XCIuLi91dGlsL2RvbVwiOjIwMixcIi4vaGFuZGxlci9ib3hfem9vbVwiOjE4MixcIi4vaGFuZGxlci9kYmxjbGlja196b29tXCI6MTgzLFwiLi9oYW5kbGVyL2RyYWdfcGFuXCI6MTg0LFwiLi9oYW5kbGVyL2RyYWdfcm90YXRlXCI6MTg1LFwiLi9oYW5kbGVyL2tleWJvYXJkXCI6MTg2LFwiLi9oYW5kbGVyL3Njcm9sbF96b29tXCI6MTg3LFwiLi9oYW5kbGVyL3RvdWNoX3pvb21fcm90YXRlXCI6MTg4LFwicG9pbnQtZ2VvbWV0cnlcIjoyNn1dLDE3NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgdXRpbD1fZGVyZXFfKFwiLi4vdXRpbC91dGlsXCIpLGludGVycG9sYXRlPV9kZXJlcV8oXCIuLi9zdHlsZS1zcGVjL3V0aWwvaW50ZXJwb2xhdGVcIiksYnJvd3Nlcj1fZGVyZXFfKFwiLi4vdXRpbC9icm93c2VyXCIpLExuZ0xhdD1fZGVyZXFfKFwiLi4vZ2VvL2xuZ19sYXRcIiksTG5nTGF0Qm91bmRzPV9kZXJlcV8oXCIuLi9nZW8vbG5nX2xhdF9ib3VuZHNcIiksUG9pbnQ9X2RlcmVxXyhcInBvaW50LWdlb21ldHJ5XCIpLEV2ZW50ZWQ9X2RlcmVxXyhcIi4uL3V0aWwvZXZlbnRlZFwiKSxDYW1lcmE9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLGkpe3QuY2FsbCh0aGlzKSx0aGlzLm1vdmluZz0hMSx0aGlzLnRyYW5zZm9ybT1lLHRoaXMuX2JlYXJpbmdTbmFwPWkuYmVhcmluZ1NuYXB9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUucHJvdG90eXBlLmdldENlbnRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRyYW5zZm9ybS5jZW50ZXJ9LGUucHJvdG90eXBlLnNldENlbnRlcj1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmp1bXBUbyh7Y2VudGVyOnR9LGUpfSxlLnByb3RvdHlwZS5wYW5CeT1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIHQ9UG9pbnQuY29udmVydCh0KS5tdWx0KC0xKSx0aGlzLnBhblRvKHRoaXMudHJhbnNmb3JtLmNlbnRlcix1dGlsLmV4dGVuZCh7b2Zmc2V0OnR9LGUpLGkpfSxlLnByb3RvdHlwZS5wYW5Ubz1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRoaXMuZWFzZVRvKHV0aWwuZXh0ZW5kKHtjZW50ZXI6dH0sZSksaSl9LGUucHJvdG90eXBlLmdldFpvb209ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0uem9vbX0sZS5wcm90b3R5cGUuc2V0Wm9vbT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmp1bXBUbyh7em9vbTp0fSxlKSx0aGlzfSxlLnByb3RvdHlwZS56b29tVG89ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLmVhc2VUbyh1dGlsLmV4dGVuZCh7em9vbTp0fSxlKSxpKX0sZS5wcm90b3R5cGUuem9vbUluPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuem9vbVRvKHRoaXMuZ2V0Wm9vbSgpKzEsdCxlKSx0aGlzfSxlLnByb3RvdHlwZS56b29tT3V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuem9vbVRvKHRoaXMuZ2V0Wm9vbSgpLTEsdCxlKSx0aGlzfSxlLnByb3RvdHlwZS5nZXRCZWFyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHJhbnNmb3JtLmJlYXJpbmd9LGUucHJvdG90eXBlLnNldEJlYXJpbmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5qdW1wVG8oe2JlYXJpbmc6dH0sZSksdGhpc30sZS5wcm90b3R5cGUucm90YXRlVG89ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLmVhc2VUbyh1dGlsLmV4dGVuZCh7YmVhcmluZzp0fSxlKSxpKX0sZS5wcm90b3R5cGUucmVzZXROb3J0aD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnJvdGF0ZVRvKDAsdXRpbC5leHRlbmQoe2R1cmF0aW9uOjFlM30sdCksZSksdGhpc30sZS5wcm90b3R5cGUuc25hcFRvTm9ydGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5hYnModGhpcy5nZXRCZWFyaW5nKCkpPHRoaXMuX2JlYXJpbmdTbmFwP3RoaXMucmVzZXROb3J0aCh0LGUpOnRoaXN9LGUucHJvdG90eXBlLmdldFBpdGNoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHJhbnNmb3JtLnBpdGNofSxlLnByb3RvdHlwZS5zZXRQaXRjaD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmp1bXBUbyh7cGl0Y2g6dH0sZSksdGhpc30sZS5wcm90b3R5cGUuZml0Qm91bmRzPWZ1bmN0aW9uKHQsZSxpKXtpZihlPXV0aWwuZXh0ZW5kKHtwYWRkaW5nOnt0b3A6MCxib3R0b206MCxyaWdodDowLGxlZnQ6MH0sb2Zmc2V0OlswLDBdLG1heFpvb206dGhpcy50cmFuc2Zvcm0ubWF4Wm9vbX0sZSksXCJudW1iZXJcIj09dHlwZW9mIGUucGFkZGluZyl7dmFyIG89ZS5wYWRkaW5nO2UucGFkZGluZz17dG9wOm8sYm90dG9tOm8scmlnaHQ6byxsZWZ0Om99fWlmKCF1dGlsLmRlZXBFcXVhbChPYmplY3Qua2V5cyhlLnBhZGRpbmcpLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOjB9KSxbXCJib3R0b21cIixcImxlZnRcIixcInJpZ2h0XCIsXCJ0b3BcIl0pKXJldHVybiB2b2lkIHV0aWwud2Fybk9uY2UoXCJvcHRpb25zLnBhZGRpbmcgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciwgb3IgYW4gT2JqZWN0IHdpdGgga2V5cyAnYm90dG9tJywgJ2xlZnQnLCAncmlnaHQnLCAndG9wJ1wiKTt0PUxuZ0xhdEJvdW5kcy5jb252ZXJ0KHQpO3ZhciBuPVtlLnBhZGRpbmcubGVmdC1lLnBhZGRpbmcucmlnaHQsZS5wYWRkaW5nLnRvcC1lLnBhZGRpbmcuYm90dG9tXSxyPU1hdGgubWluKGUucGFkZGluZy5yaWdodCxlLnBhZGRpbmcubGVmdCksYT1NYXRoLm1pbihlLnBhZGRpbmcudG9wLGUucGFkZGluZy5ib3R0b20pO2Uub2Zmc2V0PVtlLm9mZnNldFswXStuWzBdLGUub2Zmc2V0WzFdK25bMV1dO3ZhciBzPVBvaW50LmNvbnZlcnQoZS5vZmZzZXQpLGg9dGhpcy50cmFuc2Zvcm0scD1oLnByb2plY3QodC5nZXROb3J0aFdlc3QoKSksdT1oLnByb2plY3QodC5nZXRTb3V0aEVhc3QoKSksYz11LnN1YihwKSxmPShoLndpZHRoLTIqci0yKk1hdGguYWJzKHMueCkpL2MueCxtPShoLmhlaWdodC0yKmEtMipNYXRoLmFicyhzLnkpKS9jLnk7cmV0dXJuIG08MHx8ZjwwP3ZvaWQgdXRpbC53YXJuT25jZShcIk1hcCBjYW5ub3QgZml0IHdpdGhpbiBjYW52YXMgd2l0aCB0aGUgZ2l2ZW4gYm91bmRzLCBwYWRkaW5nLCBhbmQvb3Igb2Zmc2V0LlwiKTooZS5jZW50ZXI9aC51bnByb2plY3QocC5hZGQodSkuZGl2KDIpKSxlLnpvb209TWF0aC5taW4oaC5zY2FsZVpvb20oaC5zY2FsZSpNYXRoLm1pbihmLG0pKSxlLm1heFpvb20pLGUuYmVhcmluZz0wLGUubGluZWFyP3RoaXMuZWFzZVRvKGUsaSk6dGhpcy5mbHlUbyhlLGkpKX0sZS5wcm90b3R5cGUuanVtcFRvPWZ1bmN0aW9uKHQsZSl7dGhpcy5zdG9wKCk7dmFyIGk9dGhpcy50cmFuc2Zvcm0sbz0hMSxuPSExLHI9ITE7cmV0dXJuXCJ6b29tXCJpbiB0JiZpLnpvb20hPT0rdC56b29tJiYobz0hMCxpLnpvb209K3Quem9vbSksXCJjZW50ZXJcImluIHQmJihpLmNlbnRlcj1MbmdMYXQuY29udmVydCh0LmNlbnRlcikpLFwiYmVhcmluZ1wiaW4gdCYmaS5iZWFyaW5nIT09K3QuYmVhcmluZyYmKG49ITAsaS5iZWFyaW5nPSt0LmJlYXJpbmcpLFwicGl0Y2hcImluIHQmJmkucGl0Y2ghPT0rdC5waXRjaCYmKHI9ITAsaS5waXRjaD0rdC5waXRjaCksdGhpcy5maXJlKFwibW92ZXN0YXJ0XCIsZSkuZmlyZShcIm1vdmVcIixlKSxvJiZ0aGlzLmZpcmUoXCJ6b29tc3RhcnRcIixlKS5maXJlKFwiem9vbVwiLGUpLmZpcmUoXCJ6b29tZW5kXCIsZSksbiYmdGhpcy5maXJlKFwicm90YXRlXCIsZSksciYmdGhpcy5maXJlKFwicGl0Y2hzdGFydFwiLGUpLmZpcmUoXCJwaXRjaFwiLGUpLmZpcmUoXCJwaXRjaGVuZFwiLGUpLHRoaXMuZmlyZShcIm1vdmVlbmRcIixlKX0sZS5wcm90b3R5cGUuZWFzZVRvPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpczt0aGlzLnN0b3AoKSx0PXV0aWwuZXh0ZW5kKHtvZmZzZXQ6WzAsMF0sZHVyYXRpb246NTAwLGVhc2luZzp1dGlsLmVhc2V9LHQpLHQuYW5pbWF0ZT09PSExJiYodC5kdXJhdGlvbj0wKSx0LnNtb290aEVhc2luZyYmMCE9PXQuZHVyYXRpb24mJih0LmVhc2luZz10aGlzLl9zbW9vdGhPdXRFYXNpbmcodC5kdXJhdGlvbikpO3ZhciBvPXRoaXMudHJhbnNmb3JtLG49dGhpcy5nZXRab29tKCkscj10aGlzLmdldEJlYXJpbmcoKSxhPXRoaXMuZ2V0UGl0Y2goKSxzPVwiem9vbVwiaW4gdD8rdC56b29tOm4saD1cImJlYXJpbmdcImluIHQ/dGhpcy5fbm9ybWFsaXplQmVhcmluZyh0LmJlYXJpbmcscik6cixwPVwicGl0Y2hcImluIHQ/K3QucGl0Y2g6YSx1PW8uY2VudGVyUG9pbnQuYWRkKFBvaW50LmNvbnZlcnQodC5vZmZzZXQpKSxjPW8ucG9pbnRMb2NhdGlvbih1KSxmPUxuZ0xhdC5jb252ZXJ0KHQuY2VudGVyfHxjKTt0aGlzLl9ub3JtYWxpemVDZW50ZXIoZik7dmFyIG0sZyxkPW8ucHJvamVjdChjKSxsPW8ucHJvamVjdChmKS5zdWIoZCksdj1vLnpvb21TY2FsZShzLW4pO3JldHVybiB0LmFyb3VuZCYmKG09TG5nTGF0LmNvbnZlcnQodC5hcm91bmQpLGc9by5sb2NhdGlvblBvaW50KG0pKSx0aGlzLnpvb21pbmc9cyE9PW4sdGhpcy5yb3RhdGluZz1yIT09aCx0aGlzLnBpdGNoaW5nPXAhPT1hLHRoaXMuX3ByZXBhcmVFYXNlKGUsdC5ub01vdmVTdGFydCksY2xlYXJUaW1lb3V0KHRoaXMuX29uRWFzZUVuZCksdGhpcy5fZWFzZShmdW5jdGlvbih0KXtpZih0aGlzLnpvb21pbmcmJihvLnpvb209aW50ZXJwb2xhdGUobixzLHQpKSx0aGlzLnJvdGF0aW5nJiYoby5iZWFyaW5nPWludGVycG9sYXRlKHIsaCx0KSksdGhpcy5waXRjaGluZyYmKG8ucGl0Y2g9aW50ZXJwb2xhdGUoYSxwLHQpKSxtKW8uc2V0TG9jYXRpb25BdFBvaW50KG0sZyk7ZWxzZXt2YXIgaT1vLnpvb21TY2FsZShvLnpvb20tbiksYz1zPm4/TWF0aC5taW4oMix2KTpNYXRoLm1heCguNSx2KSxmPU1hdGgucG93KGMsMS10KSxiPW8udW5wcm9qZWN0KGQuYWRkKGwubXVsdCh0KmYpKS5tdWx0KGkpKTtvLnNldExvY2F0aW9uQXRQb2ludChvLnJlbmRlcldvcmxkQ29waWVzP2Iud3JhcCgpOmIsdSl9dGhpcy5fZmlyZU1vdmVFdmVudHMoZSl9LGZ1bmN0aW9uKCl7dC5kZWxheUVuZEV2ZW50cz9pLl9vbkVhc2VFbmQ9c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBpLl9lYXNlVG9FbmQoZSl9LHQuZGVsYXlFbmRFdmVudHMpOmkuX2Vhc2VUb0VuZChlKX0sdCksdGhpc30sZS5wcm90b3R5cGUuX3ByZXBhcmVFYXNlPWZ1bmN0aW9uKHQsZSl7dGhpcy5tb3Zpbmc9ITAsZXx8dGhpcy5maXJlKFwibW92ZXN0YXJ0XCIsdCksdGhpcy56b29taW5nJiZ0aGlzLmZpcmUoXCJ6b29tc3RhcnRcIix0KSx0aGlzLnBpdGNoaW5nJiZ0aGlzLmZpcmUoXCJwaXRjaHN0YXJ0XCIsdCl9LGUucHJvdG90eXBlLl9maXJlTW92ZUV2ZW50cz1mdW5jdGlvbih0KXt0aGlzLmZpcmUoXCJtb3ZlXCIsdCksdGhpcy56b29taW5nJiZ0aGlzLmZpcmUoXCJ6b29tXCIsdCksdGhpcy5yb3RhdGluZyYmdGhpcy5maXJlKFwicm90YXRlXCIsdCksdGhpcy5waXRjaGluZyYmdGhpcy5maXJlKFwicGl0Y2hcIix0KX0sZS5wcm90b3R5cGUuX2Vhc2VUb0VuZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnpvb21pbmcsaT10aGlzLnBpdGNoaW5nO3RoaXMubW92aW5nPSExLHRoaXMuem9vbWluZz0hMSx0aGlzLnJvdGF0aW5nPSExLHRoaXMucGl0Y2hpbmc9ITEsZSYmdGhpcy5maXJlKFwiem9vbWVuZFwiLHQpLGkmJnRoaXMuZmlyZShcInBpdGNoZW5kXCIsdCksdGhpcy5maXJlKFwibW92ZWVuZFwiLHQpfSxlLnByb3RvdHlwZS5mbHlUbz1mdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCl7dmFyIGU9KE0qTS16KnorKHQ/LTE6MSkqTCpMKkUqRSkvKDIqKHQ/TTp6KSpMKkUpO3JldHVybiBNYXRoLmxvZyhNYXRoLnNxcnQoZSplKzEpLWUpfWZ1bmN0aW9uIG8odCl7cmV0dXJuKE1hdGguZXhwKHQpLU1hdGguZXhwKC10KSkvMn1mdW5jdGlvbiBuKHQpe3JldHVybihNYXRoLmV4cCh0KStNYXRoLmV4cCgtdCkpLzJ9ZnVuY3Rpb24gcih0KXtyZXR1cm4gbyh0KS9uKHQpfXZhciBhPXRoaXM7dGhpcy5zdG9wKCksdD11dGlsLmV4dGVuZCh7b2Zmc2V0OlswLDBdLHNwZWVkOjEuMixjdXJ2ZToxLjQyLGVhc2luZzp1dGlsLmVhc2V9LHQpO3ZhciBzPXRoaXMudHJhbnNmb3JtLGg9dGhpcy5nZXRab29tKCkscD10aGlzLmdldEJlYXJpbmcoKSx1PXRoaXMuZ2V0UGl0Y2goKSxjPVwiem9vbVwiaW4gdD8rdC56b29tOmgsZj1cImJlYXJpbmdcImluIHQ/dGhpcy5fbm9ybWFsaXplQmVhcmluZyh0LmJlYXJpbmcscCk6cCxtPVwicGl0Y2hcImluIHQ/K3QucGl0Y2g6dSxnPXMuem9vbVNjYWxlKGMtaCksZD1zLmNlbnRlclBvaW50LmFkZChQb2ludC5jb252ZXJ0KHQub2Zmc2V0KSksbD1zLnBvaW50TG9jYXRpb24oZCksdj1MbmdMYXQuY29udmVydCh0LmNlbnRlcnx8bCk7dGhpcy5fbm9ybWFsaXplQ2VudGVyKHYpO3ZhciBiPXMucHJvamVjdChsKSx5PXMucHJvamVjdCh2KS5zdWIoYiksXz10LmN1cnZlLHo9TWF0aC5tYXgocy53aWR0aCxzLmhlaWdodCksTT16L2csRT15Lm1hZygpO2lmKFwibWluWm9vbVwiaW4gdCl7dmFyIFQ9dXRpbC5jbGFtcChNYXRoLm1pbih0Lm1pblpvb20saCxjKSxzLm1pblpvb20scy5tYXhab29tKSx4PXovcy56b29tU2NhbGUoVC1oKTtfPU1hdGguc3FydCh4L0UqMil9dmFyIEw9XypfLGo9aSgwKSx3PWZ1bmN0aW9uKHQpe3JldHVybiBuKGopL24oaitfKnQpfSxQPWZ1bmN0aW9uKHQpe3JldHVybiB6KigobihqKSpyKGorXyp0KS1vKGopKS9MKS9FfSxaPShpKDEpLWopL187aWYoTWF0aC5hYnMoRSk8MWUtNil7aWYoTWF0aC5hYnMoei1NKTwxZS02KXJldHVybiB0aGlzLmVhc2VUbyh0LGUpO3ZhciBxPU08ej8tMToxO1o9TWF0aC5hYnMoTWF0aC5sb2coTS96KSkvXyxQPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LHc9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguZXhwKHEqXyp0KX19aWYoXCJkdXJhdGlvblwiaW4gdCl0LmR1cmF0aW9uPSt0LmR1cmF0aW9uO2Vsc2V7dmFyIEI9XCJzY3JlZW5TcGVlZFwiaW4gdD8rdC5zY3JlZW5TcGVlZC9fOit0LnNwZWVkO3QuZHVyYXRpb249MWUzKlovQn1yZXR1cm4gdGhpcy56b29taW5nPSEwLHRoaXMucm90YXRpbmc9cCE9PWYsdGhpcy5waXRjaGluZz1tIT09dSx0aGlzLl9wcmVwYXJlRWFzZShlLCExKSx0aGlzLl9lYXNlKGZ1bmN0aW9uKHQpe3ZhciBpPXQqWixvPTEvdyhpKTtzLnpvb209aCtzLnNjYWxlWm9vbShvKSx0aGlzLnJvdGF0aW5nJiYocy5iZWFyaW5nPWludGVycG9sYXRlKHAsZix0KSksdGhpcy5waXRjaGluZyYmKHMucGl0Y2g9aW50ZXJwb2xhdGUodSxtLHQpKTt2YXIgbj1zLnVucHJvamVjdChiLmFkZCh5Lm11bHQoUChpKSkpLm11bHQobykpO3Muc2V0TG9jYXRpb25BdFBvaW50KHMucmVuZGVyV29ybGRDb3BpZXM/bi53cmFwKCk6bixkKSx0aGlzLl9maXJlTW92ZUV2ZW50cyhlKX0sZnVuY3Rpb24oKXtyZXR1cm4gYS5fZWFzZVRvRW5kKGUpfSx0KSx0aGlzfSxlLnByb3RvdHlwZS5pc0Vhc2luZz1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5fYWJvcnRGbn0sZS5wcm90b3R5cGUuaXNNb3Zpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tb3Zpbmd9LGUucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYWJvcnRGbiYmKHRoaXMuX2Fib3J0Rm4oKSx0aGlzLl9maW5pc2hFYXNlKCkpLHRoaXN9LGUucHJvdG90eXBlLl9lYXNlPWZ1bmN0aW9uKHQsZSxpKXt0aGlzLl9maW5pc2hGbj1lLHRoaXMuX2Fib3J0Rm49YnJvd3Nlci50aW1lZChmdW5jdGlvbihlKXt0LmNhbGwodGhpcyxpLmVhc2luZyhlKSksMT09PWUmJnRoaXMuX2ZpbmlzaEVhc2UoKX0saS5hbmltYXRlPT09ITE/MDppLmR1cmF0aW9uLHRoaXMpfSxlLnByb3RvdHlwZS5fZmluaXNoRWFzZT1mdW5jdGlvbigpe2RlbGV0ZSB0aGlzLl9hYm9ydEZuO3ZhciB0PXRoaXMuX2ZpbmlzaEZuO2RlbGV0ZSB0aGlzLl9maW5pc2hGbix0LmNhbGwodGhpcyl9LGUucHJvdG90eXBlLl9ub3JtYWxpemVCZWFyaW5nPWZ1bmN0aW9uKHQsZSl7dD11dGlsLndyYXAodCwtMTgwLDE4MCk7dmFyIGk9TWF0aC5hYnModC1lKTtyZXR1cm4gTWF0aC5hYnModC0zNjAtZSk8aSYmKHQtPTM2MCksTWF0aC5hYnModCszNjAtZSk8aSYmKHQrPTM2MCksdH0sZS5wcm90b3R5cGUuX25vcm1hbGl6ZUNlbnRlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnRyYW5zZm9ybTtpZihlLnJlbmRlcldvcmxkQ29waWVzJiYhZS5sbmdSYW5nZSl7dmFyIGk9dC5sbmctZS5jZW50ZXIubG5nO3QubG5nKz1pPjE4MD8tMzYwOmk8LTE4MD8zNjA6MH19LGUucHJvdG90eXBlLl9zbW9vdGhPdXRFYXNpbmc9ZnVuY3Rpb24odCl7dmFyIGU9dXRpbC5lYXNlO2lmKHRoaXMuX3ByZXZFYXNlKXt2YXIgaT10aGlzLl9wcmV2RWFzZSxvPShEYXRlLm5vdygpLWkuc3RhcnQpL2kuZHVyYXRpb24sbj1pLmVhc2luZyhvKy4wMSktaS5lYXNpbmcobykscj0uMjcvTWF0aC5zcXJ0KG4qbisxZS00KSouMDEsYT1NYXRoLnNxcnQoLjA3MjktcipyKTtlPXV0aWwuYmV6aWVyKHIsYSwuMjUsMSl9cmV0dXJuIHRoaXMuX3ByZXZFYXNlPXtzdGFydDoobmV3IERhdGUpLmdldFRpbWUoKSxkdXJhdGlvbjp0LGVhc2luZzplfSxlfSxlfShFdmVudGVkKTttb2R1bGUuZXhwb3J0cz1DYW1lcmE7XG59LHtcIi4uL2dlby9sbmdfbGF0XCI6NjIsXCIuLi9nZW8vbG5nX2xhdF9ib3VuZHNcIjo2MyxcIi4uL3N0eWxlLXNwZWMvdXRpbC9pbnRlcnBvbGF0ZVwiOjEyMyxcIi4uL3V0aWwvYnJvd3NlclwiOjE5NSxcIi4uL3V0aWwvZXZlbnRlZFwiOjIwMyxcIi4uL3V0aWwvdXRpbFwiOjIxNSxcInBvaW50LWdlb21ldHJ5XCI6MjZ9XSwxNzY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIERPTT1fZGVyZXFfKFwiLi4vLi4vdXRpbC9kb21cIiksdXRpbD1fZGVyZXFfKFwiLi4vLi4vdXRpbC91dGlsXCIpLEF0dHJpYnV0aW9uQ29udHJvbD1mdW5jdGlvbih0KXt0aGlzLm9wdGlvbnM9dCx1dGlsLmJpbmRBbGwoW1wiX3VwZGF0ZUVkaXRMaW5rXCIsXCJfdXBkYXRlRGF0YVwiLFwiX3VwZGF0ZUNvbXBhY3RcIl0sdGhpcyl9O0F0dHJpYnV0aW9uQ29udHJvbC5wcm90b3R5cGUuZ2V0RGVmYXVsdFBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuXCJib3R0b20tcmlnaHRcIn0sQXR0cmlidXRpb25Db250cm9sLnByb3RvdHlwZS5vbkFkZD1mdW5jdGlvbih0KXt2YXIgaT10aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5jb21wYWN0O3JldHVybiB0aGlzLl9tYXA9dCx0aGlzLl9jb250YWluZXI9RE9NLmNyZWF0ZShcImRpdlwiLFwibWFwYm94Z2wtY3RybCBtYXBib3hnbC1jdHJsLWF0dHJpYlwiKSxpJiZ0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZChcIm1hcGJveGdsLWNvbXBhY3RcIiksdGhpcy5fdXBkYXRlQXR0cmlidXRpb25zKCksdGhpcy5fdXBkYXRlRWRpdExpbmsoKSx0aGlzLl9tYXAub24oXCJzb3VyY2VkYXRhXCIsdGhpcy5fdXBkYXRlRGF0YSksdGhpcy5fbWFwLm9uKFwibW92ZWVuZFwiLHRoaXMuX3VwZGF0ZUVkaXRMaW5rKSx2b2lkIDA9PT1pJiYodGhpcy5fbWFwLm9uKFwicmVzaXplXCIsdGhpcy5fdXBkYXRlQ29tcGFjdCksdGhpcy5fdXBkYXRlQ29tcGFjdCgpKSx0aGlzLl9jb250YWluZXJ9LEF0dHJpYnV0aW9uQ29udHJvbC5wcm90b3R5cGUub25SZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLl9jb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9jb250YWluZXIpLHRoaXMuX21hcC5vZmYoXCJzb3VyY2VkYXRhXCIsdGhpcy5fdXBkYXRlRGF0YSksdGhpcy5fbWFwLm9mZihcIm1vdmVlbmRcIix0aGlzLl91cGRhdGVFZGl0TGluayksdGhpcy5fbWFwLm9mZihcInJlc2l6ZVwiLHRoaXMuX3VwZGF0ZUNvbXBhY3QpLHRoaXMuX21hcD12b2lkIDB9LEF0dHJpYnV0aW9uQ29udHJvbC5wcm90b3R5cGUuX3VwZGF0ZUVkaXRMaW5rPWZ1bmN0aW9uKCl7aWYodGhpcy5fZWRpdExpbmt8fCh0aGlzLl9lZGl0TGluaz10aGlzLl9jb250YWluZXIucXVlcnlTZWxlY3RvcihcIi5tYXBib3hnbC1pbXByb3ZlLW1hcFwiKSksdGhpcy5fZWRpdExpbmspe3ZhciB0PXRoaXMuX21hcC5nZXRDZW50ZXIoKTt0aGlzLl9lZGl0TGluay5ocmVmPVwiaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXAtZmVlZGJhY2svIy9cIit0LmxuZytcIi9cIit0LmxhdCtcIi9cIitNYXRoLnJvdW5kKHRoaXMuX21hcC5nZXRab29tKCkrMSl9fSxBdHRyaWJ1dGlvbkNvbnRyb2wucHJvdG90eXBlLl91cGRhdGVEYXRhPWZ1bmN0aW9uKHQpe3QmJlwibWV0YWRhdGFcIj09PXQuc291cmNlRGF0YVR5cGUmJih0aGlzLl91cGRhdGVBdHRyaWJ1dGlvbnMoKSx0aGlzLl91cGRhdGVFZGl0TGluaygpKX0sQXR0cmlidXRpb25Db250cm9sLnByb3RvdHlwZS5fdXBkYXRlQXR0cmlidXRpb25zPWZ1bmN0aW9uKCl7aWYodGhpcy5fbWFwLnN0eWxlKXt2YXIgdD1bXSxpPXRoaXMuX21hcC5zdHlsZS5zb3VyY2VDYWNoZXM7Zm9yKHZhciBvIGluIGkpe3ZhciBuPWlbb10uZ2V0U291cmNlKCk7bi5hdHRyaWJ1dGlvbiYmdC5pbmRleE9mKG4uYXR0cmlidXRpb24pPDAmJnQucHVzaChuLmF0dHJpYnV0aW9uKX10LnNvcnQoZnVuY3Rpb24odCxpKXtyZXR1cm4gdC5sZW5ndGgtaS5sZW5ndGh9KSx0PXQuZmlsdGVyKGZ1bmN0aW9uKGksbyl7Zm9yKHZhciBuPW8rMTtuPHQubGVuZ3RoO24rKylpZih0W25dLmluZGV4T2YoaSk+PTApcmV0dXJuITE7cmV0dXJuITB9KSx0aGlzLl9jb250YWluZXIuaW5uZXJIVE1MPXQuam9pbihcIiB8IFwiKSx0aGlzLl9lZGl0TGluaz1udWxsfX0sQXR0cmlidXRpb25Db250cm9sLnByb3RvdHlwZS5fdXBkYXRlQ29tcGFjdD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcC5nZXRDYW52YXNDb250YWluZXIoKS5vZmZzZXRXaWR0aDw9NjQwO3RoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3RbdD9cImFkZFwiOlwicmVtb3ZlXCJdKFwibWFwYm94Z2wtY29tcGFjdFwiKX0sbW9kdWxlLmV4cG9ydHM9QXR0cmlidXRpb25Db250cm9sO1xufSx7XCIuLi8uLi91dGlsL2RvbVwiOjIwMixcIi4uLy4uL3V0aWwvdXRpbFwiOjIxNX1dLDE3NzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgRE9NPV9kZXJlcV8oXCIuLi8uLi91dGlsL2RvbVwiKSx1dGlsPV9kZXJlcV8oXCIuLi8uLi91dGlsL3V0aWxcIiksd2luZG93PV9kZXJlcV8oXCIuLi8uLi91dGlsL3dpbmRvd1wiKSxGdWxsc2NyZWVuQ29udHJvbD1mdW5jdGlvbigpe3RoaXMuX2Z1bGxzY3JlZW49ITEsdXRpbC5iaW5kQWxsKFtcIl9vbkNsaWNrRnVsbHNjcmVlblwiLFwiX2NoYW5nZUljb25cIl0sdGhpcyksXCJvbmZ1bGxzY3JlZW5jaGFuZ2VcImluIHdpbmRvdy5kb2N1bWVudD90aGlzLl9mdWxsc2NyZWVuY2hhbmdlPVwiZnVsbHNjcmVlbmNoYW5nZVwiOlwib25tb3pmdWxsc2NyZWVuY2hhbmdlXCJpbiB3aW5kb3cuZG9jdW1lbnQ/dGhpcy5fZnVsbHNjcmVlbmNoYW5nZT1cIm1vemZ1bGxzY3JlZW5jaGFuZ2VcIjpcIm9ud2Via2l0ZnVsbHNjcmVlbmNoYW5nZVwiaW4gd2luZG93LmRvY3VtZW50P3RoaXMuX2Z1bGxzY3JlZW5jaGFuZ2U9XCJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlXCI6XCJvbm1zZnVsbHNjcmVlbmNoYW5nZVwiaW4gd2luZG93LmRvY3VtZW50JiYodGhpcy5fZnVsbHNjcmVlbmNoYW5nZT1cIk1TRnVsbHNjcmVlbkNoYW5nZVwiKX07RnVsbHNjcmVlbkNvbnRyb2wucHJvdG90eXBlLm9uQWRkPWZ1bmN0aW9uKGUpe3ZhciBuPVwibWFwYm94Z2wtY3RybFwiLGw9dGhpcy5fY29udGFpbmVyPURPTS5jcmVhdGUoXCJkaXZcIixuK1wiIG1hcGJveGdsLWN0cmwtZ3JvdXBcIiksdD10aGlzLl9mdWxsc2NyZWVuQnV0dG9uPURPTS5jcmVhdGUoXCJidXR0b25cIixuK1wiLWljb24gXCIrbitcIi1mdWxsc2NyZWVuXCIsdGhpcy5fY29udGFpbmVyKTtyZXR1cm4gdC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsXCJUb2dnbGUgZnVsbHNjcmVlblwiKSx0LnR5cGU9XCJidXR0b25cIix0aGlzLl9mdWxsc2NyZWVuQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLHRoaXMuX29uQ2xpY2tGdWxsc2NyZWVuKSx0aGlzLl9tYXBDb250YWluZXI9ZS5nZXRDb250YWluZXIoKSx3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLl9mdWxsc2NyZWVuY2hhbmdlLHRoaXMuX2NoYW5nZUljb24pLGx9LEZ1bGxzY3JlZW5Db250cm9sLnByb3RvdHlwZS5vblJlbW92ZT1mdW5jdGlvbigpe3RoaXMuX2NvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2NvbnRhaW5lciksdGhpcy5fbWFwPW51bGwsd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5fZnVsbHNjcmVlbmNoYW5nZSx0aGlzLl9jaGFuZ2VJY29uKX0sRnVsbHNjcmVlbkNvbnRyb2wucHJvdG90eXBlLl9pc0Z1bGxzY3JlZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZnVsbHNjcmVlbn0sRnVsbHNjcmVlbkNvbnRyb2wucHJvdG90eXBlLl9jaGFuZ2VJY29uPWZ1bmN0aW9uKCl7dmFyIGU9d2luZG93LmRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50fHx3aW5kb3cuZG9jdW1lbnQubW96RnVsbFNjcmVlbkVsZW1lbnR8fHdpbmRvdy5kb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudHx8d2luZG93LmRvY3VtZW50Lm1zRnVsbHNjcmVlbkVsZW1lbnQ7aWYoZT09PXRoaXMuX21hcENvbnRhaW5lciE9PXRoaXMuX2Z1bGxzY3JlZW4pe3RoaXMuX2Z1bGxzY3JlZW49IXRoaXMuX2Z1bGxzY3JlZW47dmFyIG49XCJtYXBib3hnbC1jdHJsXCI7dGhpcy5fZnVsbHNjcmVlbkJ1dHRvbi5jbGFzc0xpc3QudG9nZ2xlKG4rXCItc2hyaW5rXCIpLHRoaXMuX2Z1bGxzY3JlZW5CdXR0b24uY2xhc3NMaXN0LnRvZ2dsZShuK1wiLWZ1bGxzY3JlZW5cIil9fSxGdWxsc2NyZWVuQ29udHJvbC5wcm90b3R5cGUuX29uQ2xpY2tGdWxsc2NyZWVuPWZ1bmN0aW9uKCl7dGhpcy5faXNGdWxsc2NyZWVuKCk/d2luZG93LmRvY3VtZW50LmV4aXRGdWxsc2NyZWVuP3dpbmRvdy5kb2N1bWVudC5leGl0RnVsbHNjcmVlbigpOndpbmRvdy5kb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuP3dpbmRvdy5kb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk6d2luZG93LmRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4/d2luZG93LmRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTp3aW5kb3cuZG9jdW1lbnQud2Via2l0Q2FuY2VsRnVsbFNjcmVlbiYmd2luZG93LmRvY3VtZW50LndlYmtpdENhbmNlbEZ1bGxTY3JlZW4oKTp0aGlzLl9tYXBDb250YWluZXIucmVxdWVzdEZ1bGxzY3JlZW4/dGhpcy5fbWFwQ29udGFpbmVyLnJlcXVlc3RGdWxsc2NyZWVuKCk6dGhpcy5fbWFwQ29udGFpbmVyLm1velJlcXVlc3RGdWxsU2NyZWVuP3RoaXMuX21hcENvbnRhaW5lci5tb3pSZXF1ZXN0RnVsbFNjcmVlbigpOnRoaXMuX21hcENvbnRhaW5lci5tc1JlcXVlc3RGdWxsc2NyZWVuP3RoaXMuX21hcENvbnRhaW5lci5tc1JlcXVlc3RGdWxsc2NyZWVuKCk6dGhpcy5fbWFwQ29udGFpbmVyLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuJiZ0aGlzLl9tYXBDb250YWluZXIud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4oKX0sbW9kdWxlLmV4cG9ydHM9RnVsbHNjcmVlbkNvbnRyb2w7XG59LHtcIi4uLy4uL3V0aWwvZG9tXCI6MjAyLFwiLi4vLi4vdXRpbC91dGlsXCI6MjE1LFwiLi4vLi4vdXRpbC93aW5kb3dcIjoxOTd9XSwxNzg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gY2hlY2tHZW9sb2NhdGlvblN1cHBvcnQodCl7dm9pZCAwIT09c3VwcG9ydHNHZW9sb2NhdGlvbj90KHN1cHBvcnRzR2VvbG9jYXRpb24pOnZvaWQgMCE9PXdpbmRvdy5uYXZpZ2F0b3IucGVybWlzc2lvbnM/d2luZG93Lm5hdmlnYXRvci5wZXJtaXNzaW9ucy5xdWVyeSh7bmFtZTpcImdlb2xvY2F0aW9uXCJ9KS50aGVuKGZ1bmN0aW9uKG8pe3N1cHBvcnRzR2VvbG9jYXRpb249XCJkZW5pZWRcIiE9PW8uc3RhdGUsdChzdXBwb3J0c0dlb2xvY2F0aW9uKX0pOihzdXBwb3J0c0dlb2xvY2F0aW9uPSEhd2luZG93Lm5hdmlnYXRvci5nZW9sb2NhdGlvbix0KHN1cHBvcnRzR2VvbG9jYXRpb24pKX12YXIgRXZlbnRlZD1fZGVyZXFfKFwiLi4vLi4vdXRpbC9ldmVudGVkXCIpLERPTT1fZGVyZXFfKFwiLi4vLi4vdXRpbC9kb21cIiksd2luZG93PV9kZXJlcV8oXCIuLi8uLi91dGlsL3dpbmRvd1wiKSx1dGlsPV9kZXJlcV8oXCIuLi8uLi91dGlsL3V0aWxcIiksZGVmYXVsdEdlb1Bvc2l0aW9uT3B0aW9ucz17ZW5hYmxlSGlnaEFjY3VyYWN5OiExLHRpbWVvdXQ6NmUzfSxjbGFzc05hbWU9XCJtYXBib3hnbC1jdHJsXCIsc3VwcG9ydHNHZW9sb2NhdGlvbixHZW9sb2NhdGVDb250cm9sPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG8obyl7dC5jYWxsKHRoaXMpLHRoaXMub3B0aW9ucz1vfHx7fSx1dGlsLmJpbmRBbGwoW1wiX29uU3VjY2Vzc1wiLFwiX29uRXJyb3JcIixcIl9maW5pc2hcIixcIl9zZXR1cFVJXCJdLHRoaXMpfXJldHVybiB0JiYoby5fX3Byb3RvX189dCksby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksby5wcm90b3R5cGUuY29uc3RydWN0b3I9byxvLnByb3RvdHlwZS5vbkFkZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbWFwPXQsdGhpcy5fY29udGFpbmVyPURPTS5jcmVhdGUoXCJkaXZcIixjbGFzc05hbWUrXCIgXCIrY2xhc3NOYW1lK1wiLWdyb3VwXCIpLGNoZWNrR2VvbG9jYXRpb25TdXBwb3J0KHRoaXMuX3NldHVwVUkpLHRoaXMuX2NvbnRhaW5lcn0sby5wcm90b3R5cGUub25SZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLl9jb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9jb250YWluZXIpLHRoaXMuX21hcD12b2lkIDB9LG8ucHJvdG90eXBlLl9vblN1Y2Nlc3M9ZnVuY3Rpb24odCl7dGhpcy5fbWFwLmp1bXBUbyh7Y2VudGVyOlt0LmNvb3Jkcy5sb25naXR1ZGUsdC5jb29yZHMubGF0aXR1ZGVdLHpvb206MTcsYmVhcmluZzowLHBpdGNoOjB9KSx0aGlzLmZpcmUoXCJnZW9sb2NhdGVcIix0KSx0aGlzLl9maW5pc2goKX0sby5wcm90b3R5cGUuX29uRXJyb3I9ZnVuY3Rpb24odCl7dGhpcy5maXJlKFwiZXJyb3JcIix0KSx0aGlzLl9maW5pc2goKX0sby5wcm90b3R5cGUuX2ZpbmlzaD1mdW5jdGlvbigpe3RoaXMuX3RpbWVvdXRJZCYmY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZCksdGhpcy5fdGltZW91dElkPXZvaWQgMH0sby5wcm90b3R5cGUuX3NldHVwVUk9ZnVuY3Rpb24odCl7dCE9PSExJiYodGhpcy5fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLGZ1bmN0aW9uKHQpe3JldHVybiB0LnByZXZlbnREZWZhdWx0KCl9KSx0aGlzLl9nZW9sb2NhdGVCdXR0b249RE9NLmNyZWF0ZShcImJ1dHRvblwiLGNsYXNzTmFtZStcIi1pY29uIFwiK2NsYXNzTmFtZStcIi1nZW9sb2NhdGVcIix0aGlzLl9jb250YWluZXIpLHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi50eXBlPVwiYnV0dG9uXCIsdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIixcIkdlb2xvY2F0ZVwiKSx0aGlzLm9wdGlvbnMud2F0Y2hQb3NpdGlvbiYmdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtcHJlc3NlZFwiLCExKSx0aGlzLl9nZW9sb2NhdGVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsdGhpcy5fb25DbGlja0dlb2xvY2F0ZS5iaW5kKHRoaXMpKSl9LG8ucHJvdG90eXBlLl9vbkNsaWNrR2VvbG9jYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9dXRpbC5leHRlbmQoZGVmYXVsdEdlb1Bvc2l0aW9uT3B0aW9ucyx0aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5wb3NpdGlvbk9wdGlvbnN8fHt9KTt0aGlzLm9wdGlvbnMud2F0Y2hQb3NpdGlvbj92b2lkIDAhPT10aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQ/KHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKFwibWFwYm94Z2wtd2F0Y2hpbmdcIiksdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtcHJlc3NlZFwiLCExKSx3aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2godGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEKSx0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQ9dm9pZCAwKToodGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoXCJtYXBib3hnbC13YXRjaGluZ1wiKSx0aGlzLl9nZW9sb2NhdGVCdXR0b24uc2V0QXR0cmlidXRlKFwiYXJpYS1wcmVzc2VkXCIsITApLHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRD13aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24odGhpcy5fb25TdWNjZXNzLHRoaXMuX29uRXJyb3IsdCkpOih3aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbih0aGlzLl9vblN1Y2Nlc3MsdGhpcy5fb25FcnJvcix0KSx0aGlzLl90aW1lb3V0SWQ9c2V0VGltZW91dCh0aGlzLl9maW5pc2gsMWU0KSl9LG99KEV2ZW50ZWQpO21vZHVsZS5leHBvcnRzPUdlb2xvY2F0ZUNvbnRyb2w7XG59LHtcIi4uLy4uL3V0aWwvZG9tXCI6MjAyLFwiLi4vLi4vdXRpbC9ldmVudGVkXCI6MjAzLFwiLi4vLi4vdXRpbC91dGlsXCI6MjE1LFwiLi4vLi4vdXRpbC93aW5kb3dcIjoxOTd9XSwxNzk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIERPTT1fZGVyZXFfKFwiLi4vLi4vdXRpbC9kb21cIiksdXRpbD1fZGVyZXFfKFwiLi4vLi4vdXRpbC91dGlsXCIpLExvZ29Db250cm9sPWZ1bmN0aW9uKCl7dXRpbC5iaW5kQWxsKFtcIl91cGRhdGVMb2dvXCJdLHRoaXMpfTtMb2dvQ29udHJvbC5wcm90b3R5cGUub25BZGQ9ZnVuY3Rpb24obyl7cmV0dXJuIHRoaXMuX21hcD1vLHRoaXMuX2NvbnRhaW5lcj1ET00uY3JlYXRlKFwiZGl2XCIsXCJtYXBib3hnbC1jdHJsXCIpLHRoaXMuX21hcC5vbihcInNvdXJjZWRhdGFcIix0aGlzLl91cGRhdGVMb2dvKSx0aGlzLl91cGRhdGVMb2dvKCksdGhpcy5fY29udGFpbmVyfSxMb2dvQ29udHJvbC5wcm90b3R5cGUub25SZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLl9jb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9jb250YWluZXIpLHRoaXMuX21hcC5vZmYoXCJzb3VyY2VkYXRhXCIsdGhpcy5fdXBkYXRlTG9nbyl9LExvZ29Db250cm9sLnByb3RvdHlwZS5nZXREZWZhdWx0UG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm5cImJvdHRvbS1sZWZ0XCJ9LExvZ29Db250cm9sLnByb3RvdHlwZS5fdXBkYXRlTG9nbz1mdW5jdGlvbihvKXtpZihvJiZcIm1ldGFkYXRhXCI9PT1vLnNvdXJjZURhdGFUeXBlKWlmKCF0aGlzLl9jb250YWluZXIuY2hpbGROb2Rlcy5sZW5ndGgmJnRoaXMuX2xvZ29SZXF1aXJlZCgpKXt2YXIgdD1ET00uY3JlYXRlKFwiYVwiLFwibWFwYm94Z2wtY3RybC1sb2dvXCIpO3QudGFyZ2V0PVwiX2JsYW5rXCIsdC5ocmVmPVwiaHR0cHM6Ly93d3cubWFwYm94LmNvbS9cIix0LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIixcIk1hcGJveCBsb2dvXCIpLHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0KSx0aGlzLl9tYXAub2ZmKFwiZGF0YVwiLHRoaXMuX3VwZGF0ZUxvZ28pfWVsc2UgdGhpcy5fY29udGFpbmVyLmNoaWxkTm9kZXMubGVuZ3RoJiYhdGhpcy5fbG9nb1JlcXVpcmVkKCkmJnRoaXMub25SZW1vdmUoKX0sTG9nb0NvbnRyb2wucHJvdG90eXBlLl9sb2dvUmVxdWlyZWQ9ZnVuY3Rpb24oKXtpZih0aGlzLl9tYXAuc3R5bGUpe3ZhciBvPXRoaXMuX21hcC5zdHlsZS5zb3VyY2VDYWNoZXM7Zm9yKHZhciB0IGluIG8pe3ZhciBlPW9bdF0uZ2V0U291cmNlKCk7aWYoZS5tYXBib3hfbG9nbylyZXR1cm4hMH1yZXR1cm4hMX19LG1vZHVsZS5leHBvcnRzPUxvZ29Db250cm9sO1xufSx7XCIuLi8uLi91dGlsL2RvbVwiOjIwMixcIi4uLy4uL3V0aWwvdXRpbFwiOjIxNX1dLDE4MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBjb3B5TW91c2VFdmVudCh0KXtyZXR1cm4gbmV3IHdpbmRvdy5Nb3VzZUV2ZW50KHQudHlwZSx7YnV0dG9uOjIsYnV0dG9uczoyLGJ1YmJsZXM6ITAsY2FuY2VsYWJsZTohMCxkZXRhaWw6dC5kZXRhaWwsdmlldzp0LnZpZXcsc2NyZWVuWDp0LnNjcmVlblgsc2NyZWVuWTp0LnNjcmVlblksY2xpZW50WDp0LmNsaWVudFgsY2xpZW50WTp0LmNsaWVudFksbW92ZW1lbnRYOnQubW92ZW1lbnRYLG1vdmVtZW50WTp0Lm1vdmVtZW50WSxjdHJsS2V5OnQuY3RybEtleSxzaGlmdEtleTp0LnNoaWZ0S2V5LGFsdEtleTp0LmFsdEtleSxtZXRhS2V5OnQubWV0YUtleX0pfXZhciBET009X2RlcmVxXyhcIi4uLy4uL3V0aWwvZG9tXCIpLHdpbmRvdz1fZGVyZXFfKFwiLi4vLi4vdXRpbC93aW5kb3dcIiksdXRpbD1fZGVyZXFfKFwiLi4vLi4vdXRpbC91dGlsXCIpLGNsYXNzTmFtZT1cIm1hcGJveGdsLWN0cmxcIixOYXZpZ2F0aW9uQ29udHJvbD1mdW5jdGlvbigpe3V0aWwuYmluZEFsbChbXCJfcm90YXRlQ29tcGFzc0Fycm93XCJdLHRoaXMpfTtOYXZpZ2F0aW9uQ29udHJvbC5wcm90b3R5cGUuX3JvdGF0ZUNvbXBhc3NBcnJvdz1mdW5jdGlvbigpe3ZhciB0PVwicm90YXRlKFwiK3RoaXMuX21hcC50cmFuc2Zvcm0uYW5nbGUqKDE4MC9NYXRoLlBJKStcImRlZylcIjt0aGlzLl9jb21wYXNzQXJyb3cuc3R5bGUudHJhbnNmb3JtPXR9LE5hdmlnYXRpb25Db250cm9sLnByb3RvdHlwZS5vbkFkZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbWFwPXQsdGhpcy5fY29udGFpbmVyPURPTS5jcmVhdGUoXCJkaXZcIixjbGFzc05hbWUrXCIgXCIrY2xhc3NOYW1lK1wiLWdyb3VwXCIsdC5nZXRDb250YWluZXIoKSksdGhpcy5fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLHRoaXMuX29uQ29udGV4dE1lbnUuYmluZCh0aGlzKSksdGhpcy5fem9vbUluQnV0dG9uPXRoaXMuX2NyZWF0ZUJ1dHRvbihjbGFzc05hbWUrXCItaWNvbiBcIitjbGFzc05hbWUrXCItem9vbS1pblwiLFwiWm9vbSBJblwiLHQuem9vbUluLmJpbmQodCkpLHRoaXMuX3pvb21PdXRCdXR0b249dGhpcy5fY3JlYXRlQnV0dG9uKGNsYXNzTmFtZStcIi1pY29uIFwiK2NsYXNzTmFtZStcIi16b29tLW91dFwiLFwiWm9vbSBPdXRcIix0Lnpvb21PdXQuYmluZCh0KSksdGhpcy5fY29tcGFzcz10aGlzLl9jcmVhdGVCdXR0b24oY2xhc3NOYW1lK1wiLWljb24gXCIrY2xhc3NOYW1lK1wiLWNvbXBhc3NcIixcIlJlc2V0IE5vcnRoXCIsdC5yZXNldE5vcnRoLmJpbmQodCkpLHRoaXMuX2NvbXBhc3NBcnJvdz1ET00uY3JlYXRlKFwic3BhblwiLGNsYXNzTmFtZStcIi1jb21wYXNzLWFycm93XCIsdGhpcy5fY29tcGFzcyksdGhpcy5fY29tcGFzcy5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsdGhpcy5fb25Db21wYXNzRG93bi5iaW5kKHRoaXMpKSx0aGlzLl9vbkNvbXBhc3NNb3ZlPXRoaXMuX29uQ29tcGFzc01vdmUuYmluZCh0aGlzKSx0aGlzLl9vbkNvbXBhc3NVcD10aGlzLl9vbkNvbXBhc3NVcC5iaW5kKHRoaXMpLHRoaXMuX21hcC5vbihcInJvdGF0ZVwiLHRoaXMuX3JvdGF0ZUNvbXBhc3NBcnJvdyksdGhpcy5fcm90YXRlQ29tcGFzc0Fycm93KCksdGhpcy5fY29udGFpbmVyfSxOYXZpZ2F0aW9uQ29udHJvbC5wcm90b3R5cGUub25SZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLl9jb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9jb250YWluZXIpLHRoaXMuX21hcC5vZmYoXCJyb3RhdGVcIix0aGlzLl9yb3RhdGVDb21wYXNzQXJyb3cpLHRoaXMuX21hcD12b2lkIDB9LE5hdmlnYXRpb25Db250cm9sLnByb3RvdHlwZS5fb25Db250ZXh0TWVudT1mdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCl9LE5hdmlnYXRpb25Db250cm9sLnByb3RvdHlwZS5fb25Db21wYXNzRG93bj1mdW5jdGlvbih0KXswPT09dC5idXR0b24mJihET00uZGlzYWJsZURyYWcoKSx3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHRoaXMuX29uQ29tcGFzc01vdmUpLHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX29uQ29tcGFzc1VwKSx0aGlzLl9tYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCkuZGlzcGF0Y2hFdmVudChjb3B5TW91c2VFdmVudCh0KSksdC5zdG9wUHJvcGFnYXRpb24oKSl9LE5hdmlnYXRpb25Db250cm9sLnByb3RvdHlwZS5fb25Db21wYXNzTW92ZT1mdW5jdGlvbih0KXswPT09dC5idXR0b24mJih0aGlzLl9tYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCkuZGlzcGF0Y2hFdmVudChjb3B5TW91c2VFdmVudCh0KSksdC5zdG9wUHJvcGFnYXRpb24oKSl9LE5hdmlnYXRpb25Db250cm9sLnByb3RvdHlwZS5fb25Db21wYXNzVXA9ZnVuY3Rpb24odCl7MD09PXQuYnV0dG9uJiYod2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLl9vbkNvbXBhc3NNb3ZlKSx3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIix0aGlzLl9vbkNvbXBhc3NVcCksRE9NLmVuYWJsZURyYWcoKSx0aGlzLl9tYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCkuZGlzcGF0Y2hFdmVudChjb3B5TW91c2VFdmVudCh0KSksdC5zdG9wUHJvcGFnYXRpb24oKSl9LE5hdmlnYXRpb25Db250cm9sLnByb3RvdHlwZS5fY3JlYXRlQnV0dG9uPWZ1bmN0aW9uKHQsbyxlKXt2YXIgbj1ET00uY3JlYXRlKFwiYnV0dG9uXCIsdCx0aGlzLl9jb250YWluZXIpO3JldHVybiBuLnR5cGU9XCJidXR0b25cIixuLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIixvKSxuLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLGZ1bmN0aW9uKCl7ZSgpfSksbn0sbW9kdWxlLmV4cG9ydHM9TmF2aWdhdGlvbkNvbnRyb2w7XG59LHtcIi4uLy4uL3V0aWwvZG9tXCI6MjAyLFwiLi4vLi4vdXRpbC91dGlsXCI6MjE1LFwiLi4vLi4vdXRpbC93aW5kb3dcIjoxOTd9XSwxODE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdXBkYXRlU2NhbGUodCxlLG8pe3ZhciBuPW8mJm8ubWF4V2lkdGh8fDEwMCxpPXQuX2NvbnRhaW5lci5jbGllbnRIZWlnaHQvMixhPWdldERpc3RhbmNlKHQudW5wcm9qZWN0KFswLGldKSx0LnVucHJvamVjdChbbixpXSkpO2lmKG8mJlwiaW1wZXJpYWxcIj09PW8udW5pdCl7dmFyIHI9My4yODA4KmE7aWYocj41MjgwKXt2YXIgbD1yLzUyODA7c2V0U2NhbGUoZSxuLGwsXCJtaVwiKX1lbHNlIHNldFNjYWxlKGUsbixyLFwiZnRcIil9ZWxzZSBzZXRTY2FsZShlLG4sYSxcIm1cIil9ZnVuY3Rpb24gc2V0U2NhbGUodCxlLG8sbil7dmFyIGk9Z2V0Um91bmROdW0obyksYT1pL287XCJtXCI9PT1uJiZpPj0xZTMmJihpLz0xZTMsbj1cImttXCIpLHQuc3R5bGUud2lkdGg9ZSphK1wicHhcIix0LmlubmVySFRNTD1pK259ZnVuY3Rpb24gZ2V0RGlzdGFuY2UodCxlKXt2YXIgbz02MzcxZTMsbj1NYXRoLlBJLzE4MCxpPXQubGF0Km4sYT1lLmxhdCpuLHI9TWF0aC5zaW4oaSkqTWF0aC5zaW4oYSkrTWF0aC5jb3MoaSkqTWF0aC5jb3MoYSkqTWF0aC5jb3MoKGUubG5nLXQubG5nKSpuKSxsPW8qTWF0aC5hY29zKE1hdGgubWluKHIsMSkpO3JldHVybiBsfWZ1bmN0aW9uIGdldFJvdW5kTnVtKHQpe3ZhciBlPU1hdGgucG93KDEwLChcIlwiK01hdGguZmxvb3IodCkpLmxlbmd0aC0xKSxvPXQvZTtyZXR1cm4gbz1vPj0xMD8xMDpvPj01PzU6bz49Mz8zOm8+PTI/MjoxLGUqb312YXIgRE9NPV9kZXJlcV8oXCIuLi8uLi91dGlsL2RvbVwiKSx1dGlsPV9kZXJlcV8oXCIuLi8uLi91dGlsL3V0aWxcIiksU2NhbGVDb250cm9sPWZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz10LHV0aWwuYmluZEFsbChbXCJfb25Nb3ZlXCJdLHRoaXMpfTtTY2FsZUNvbnRyb2wucHJvdG90eXBlLmdldERlZmF1bHRQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVyblwiYm90dG9tLWxlZnRcIn0sU2NhbGVDb250cm9sLnByb3RvdHlwZS5fb25Nb3ZlPWZ1bmN0aW9uKCl7dXBkYXRlU2NhbGUodGhpcy5fbWFwLHRoaXMuX2NvbnRhaW5lcix0aGlzLm9wdGlvbnMpfSxTY2FsZUNvbnRyb2wucHJvdG90eXBlLm9uQWRkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9tYXA9dCx0aGlzLl9jb250YWluZXI9RE9NLmNyZWF0ZShcImRpdlwiLFwibWFwYm94Z2wtY3RybCBtYXBib3hnbC1jdHJsLXNjYWxlXCIsdC5nZXRDb250YWluZXIoKSksdGhpcy5fbWFwLm9uKFwibW92ZVwiLHRoaXMuX29uTW92ZSksdGhpcy5fb25Nb3ZlKCksdGhpcy5fY29udGFpbmVyfSxTY2FsZUNvbnRyb2wucHJvdG90eXBlLm9uUmVtb3ZlPWZ1bmN0aW9uKCl7dGhpcy5fY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fY29udGFpbmVyKSx0aGlzLl9tYXAub2ZmKFwibW92ZVwiLHRoaXMuX29uTW92ZSksdGhpcy5fbWFwPXZvaWQgMH0sbW9kdWxlLmV4cG9ydHM9U2NhbGVDb250cm9sO1xufSx7XCIuLi8uLi91dGlsL2RvbVwiOjIwMixcIi4uLy4uL3V0aWwvdXRpbFwiOjIxNX1dLDE4MjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgRE9NPV9kZXJlcV8oXCIuLi8uLi91dGlsL2RvbVwiKSxMbmdMYXRCb3VuZHM9X2RlcmVxXyhcIi4uLy4uL2dlby9sbmdfbGF0X2JvdW5kc1wiKSx1dGlsPV9kZXJlcV8oXCIuLi8uLi91dGlsL3V0aWxcIiksd2luZG93PV9kZXJlcV8oXCIuLi8uLi91dGlsL3dpbmRvd1wiKSxCb3hab29tSGFuZGxlcj1mdW5jdGlvbihvKXt0aGlzLl9tYXA9byx0aGlzLl9lbD1vLmdldENhbnZhc0NvbnRhaW5lcigpLHRoaXMuX2NvbnRhaW5lcj1vLmdldENvbnRhaW5lcigpLHV0aWwuYmluZEFsbChbXCJfb25Nb3VzZURvd25cIixcIl9vbk1vdXNlTW92ZVwiLFwiX29uTW91c2VVcFwiLFwiX29uS2V5RG93blwiXSx0aGlzKX07Qm94Wm9vbUhhbmRsZXIucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5fZW5hYmxlZH0sQm94Wm9vbUhhbmRsZXIucHJvdG90eXBlLmlzQWN0aXZlPWZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl9hY3RpdmV9LEJveFpvb21IYW5kbGVyLnByb3RvdHlwZS5lbmFibGU9ZnVuY3Rpb24oKXt0aGlzLmlzRW5hYmxlZCgpfHwodGhpcy5fbWFwLmRyYWdQYW4mJnRoaXMuX21hcC5kcmFnUGFuLmRpc2FibGUoKSx0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsdGhpcy5fb25Nb3VzZURvd24sITEpLHRoaXMuX21hcC5kcmFnUGFuJiZ0aGlzLl9tYXAuZHJhZ1Bhbi5lbmFibGUoKSx0aGlzLl9lbmFibGVkPSEwKX0sQm94Wm9vbUhhbmRsZXIucHJvdG90eXBlLmRpc2FibGU9ZnVuY3Rpb24oKXt0aGlzLmlzRW5hYmxlZCgpJiYodGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLHRoaXMuX29uTW91c2VEb3duKSx0aGlzLl9lbmFibGVkPSExKX0sQm94Wm9vbUhhbmRsZXIucHJvdG90eXBlLl9vbk1vdXNlRG93bj1mdW5jdGlvbihvKXtvLnNoaWZ0S2V5JiYwPT09by5idXR0b24mJih3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHRoaXMuX29uTW91c2VNb3ZlLCExKSx3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIix0aGlzLl9vbktleURvd24sITEpLHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX29uTW91c2VVcCwhMSksRE9NLmRpc2FibGVEcmFnKCksdGhpcy5fc3RhcnRQb3M9RE9NLm1vdXNlUG9zKHRoaXMuX2VsLG8pLHRoaXMuX2FjdGl2ZT0hMCl9LEJveFpvb21IYW5kbGVyLnByb3RvdHlwZS5fb25Nb3VzZU1vdmU9ZnVuY3Rpb24obyl7dmFyIGU9dGhpcy5fc3RhcnRQb3MsdD1ET00ubW91c2VQb3ModGhpcy5fZWwsbyk7dGhpcy5fYm94fHwodGhpcy5fYm94PURPTS5jcmVhdGUoXCJkaXZcIixcIm1hcGJveGdsLWJveHpvb21cIix0aGlzLl9jb250YWluZXIpLHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtY3Jvc3NoYWlyXCIpLHRoaXMuX2ZpcmVFdmVudChcImJveHpvb21zdGFydFwiLG8pKTt2YXIgbj1NYXRoLm1pbihlLngsdC54KSxpPU1hdGgubWF4KGUueCx0LngpLHM9TWF0aC5taW4oZS55LHQueSksYT1NYXRoLm1heChlLnksdC55KTtET00uc2V0VHJhbnNmb3JtKHRoaXMuX2JveCxcInRyYW5zbGF0ZShcIituK1wicHgsXCIrcytcInB4KVwiKSx0aGlzLl9ib3guc3R5bGUud2lkdGg9aS1uK1wicHhcIix0aGlzLl9ib3guc3R5bGUuaGVpZ2h0PWEtcytcInB4XCJ9LEJveFpvb21IYW5kbGVyLnByb3RvdHlwZS5fb25Nb3VzZVVwPWZ1bmN0aW9uKG8pe2lmKDA9PT1vLmJ1dHRvbil7dmFyIGU9dGhpcy5fc3RhcnRQb3MsdD1ET00ubW91c2VQb3ModGhpcy5fZWwsbyksbj0obmV3IExuZ0xhdEJvdW5kcykuZXh0ZW5kKHRoaXMuX21hcC51bnByb2plY3QoZSkpLmV4dGVuZCh0aGlzLl9tYXAudW5wcm9qZWN0KHQpKTt0aGlzLl9maW5pc2goKSxlLng9PT10LngmJmUueT09PXQueT90aGlzLl9maXJlRXZlbnQoXCJib3h6b29tY2FuY2VsXCIsbyk6dGhpcy5fbWFwLmZpdEJvdW5kcyhuLHtsaW5lYXI6ITB9KS5maXJlKFwiYm94em9vbWVuZFwiLHtvcmlnaW5hbEV2ZW50Om8sYm94Wm9vbUJvdW5kczpufSl9fSxCb3hab29tSGFuZGxlci5wcm90b3R5cGUuX29uS2V5RG93bj1mdW5jdGlvbihvKXsyNz09PW8ua2V5Q29kZSYmKHRoaXMuX2ZpbmlzaCgpLHRoaXMuX2ZpcmVFdmVudChcImJveHpvb21jYW5jZWxcIixvKSl9LEJveFpvb21IYW5kbGVyLnByb3RvdHlwZS5fZmluaXNoPWZ1bmN0aW9uKCl7dGhpcy5fYWN0aXZlPSExLHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsdGhpcy5fb25Nb3VzZU1vdmUsITEpLHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLHRoaXMuX29uS2V5RG93biwhMSksd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsdGhpcy5fb25Nb3VzZVVwLCExKSx0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShcIm1hcGJveGdsLWNyb3NzaGFpclwiKSx0aGlzLl9ib3gmJih0aGlzLl9ib3gucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9ib3gpLHRoaXMuX2JveD1udWxsKSxET00uZW5hYmxlRHJhZygpfSxCb3hab29tSGFuZGxlci5wcm90b3R5cGUuX2ZpcmVFdmVudD1mdW5jdGlvbihvLGUpe3JldHVybiB0aGlzLl9tYXAuZmlyZShvLHtvcmlnaW5hbEV2ZW50OmV9KX0sbW9kdWxlLmV4cG9ydHM9Qm94Wm9vbUhhbmRsZXI7XG59LHtcIi4uLy4uL2dlby9sbmdfbGF0X2JvdW5kc1wiOjYzLFwiLi4vLi4vdXRpbC9kb21cIjoyMDIsXCIuLi8uLi91dGlsL3V0aWxcIjoyMTUsXCIuLi8uLi91dGlsL3dpbmRvd1wiOjE5N31dLDE4MzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgRG91YmxlQ2xpY2tab29tSGFuZGxlcj1mdW5jdGlvbihvKXt0aGlzLl9tYXA9byx0aGlzLl9vbkRibENsaWNrPXRoaXMuX29uRGJsQ2xpY2suYmluZCh0aGlzKX07RG91YmxlQ2xpY2tab29tSGFuZGxlci5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl9lbmFibGVkfSxEb3VibGVDbGlja1pvb21IYW5kbGVyLnByb3RvdHlwZS5lbmFibGU9ZnVuY3Rpb24oKXt0aGlzLmlzRW5hYmxlZCgpfHwodGhpcy5fbWFwLm9uKFwiZGJsY2xpY2tcIix0aGlzLl9vbkRibENsaWNrKSx0aGlzLl9lbmFibGVkPSEwKX0sRG91YmxlQ2xpY2tab29tSGFuZGxlci5wcm90b3R5cGUuZGlzYWJsZT1mdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkKCkmJih0aGlzLl9tYXAub2ZmKFwiZGJsY2xpY2tcIix0aGlzLl9vbkRibENsaWNrKSx0aGlzLl9lbmFibGVkPSExKX0sRG91YmxlQ2xpY2tab29tSGFuZGxlci5wcm90b3R5cGUuX29uRGJsQ2xpY2s9ZnVuY3Rpb24obyl7dGhpcy5fbWFwLnpvb21Ubyh0aGlzLl9tYXAuZ2V0Wm9vbSgpKyhvLm9yaWdpbmFsRXZlbnQuc2hpZnRLZXk/LTE6MSkse2Fyb3VuZDpvLmxuZ0xhdH0sbyl9LG1vZHVsZS5leHBvcnRzPURvdWJsZUNsaWNrWm9vbUhhbmRsZXI7XG59LHt9XSwxODQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIERPTT1fZGVyZXFfKFwiLi4vLi4vdXRpbC9kb21cIiksdXRpbD1fZGVyZXFfKFwiLi4vLi4vdXRpbC91dGlsXCIpLHdpbmRvdz1fZGVyZXFfKFwiLi4vLi4vdXRpbC93aW5kb3dcIiksaW5lcnRpYUxpbmVhcml0eT0uMyxpbmVydGlhRWFzaW5nPXV0aWwuYmV6aWVyKDAsMCxpbmVydGlhTGluZWFyaXR5LDEpLGluZXJ0aWFNYXhTcGVlZD0xNDAwLGluZXJ0aWFEZWNlbGVyYXRpb249MjUwMCxEcmFnUGFuSGFuZGxlcj1mdW5jdGlvbih0KXt0aGlzLl9tYXA9dCx0aGlzLl9lbD10LmdldENhbnZhc0NvbnRhaW5lcigpLHV0aWwuYmluZEFsbChbXCJfb25Eb3duXCIsXCJfb25Nb3ZlXCIsXCJfb25VcFwiLFwiX29uVG91Y2hFbmRcIixcIl9vbk1vdXNlVXBcIl0sdGhpcyl9O0RyYWdQYW5IYW5kbGVyLnByb3RvdHlwZS5pc0VuYWJsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuX2VuYWJsZWR9LERyYWdQYW5IYW5kbGVyLnByb3RvdHlwZS5pc0FjdGl2ZT1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5fYWN0aXZlfSxEcmFnUGFuSGFuZGxlci5wcm90b3R5cGUuZW5hYmxlPWZ1bmN0aW9uKCl7dGhpcy5pc0VuYWJsZWQoKXx8KHRoaXMuX2VsLmNsYXNzTGlzdC5hZGQoXCJtYXBib3hnbC10b3VjaC1kcmFnLXBhblwiKSx0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsdGhpcy5fb25Eb3duKSx0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLHRoaXMuX29uRG93biksdGhpcy5fZW5hYmxlZD0hMCl9LERyYWdQYW5IYW5kbGVyLnByb3RvdHlwZS5kaXNhYmxlPWZ1bmN0aW9uKCl7dGhpcy5pc0VuYWJsZWQoKSYmKHRoaXMuX2VsLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBib3hnbC10b3VjaC1kcmFnLXBhblwiKSx0aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsdGhpcy5fb25Eb3duKSx0aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLHRoaXMuX29uRG93biksdGhpcy5fZW5hYmxlZD0hMSl9LERyYWdQYW5IYW5kbGVyLnByb3RvdHlwZS5fb25Eb3duPWZ1bmN0aW9uKHQpe3RoaXMuX2lnbm9yZUV2ZW50KHQpfHx0aGlzLmlzQWN0aXZlKCl8fCh0LnRvdWNoZXM/KHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsdGhpcy5fb25Nb3ZlKSx3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsdGhpcy5fb25Ub3VjaEVuZCkpOih3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHRoaXMuX29uTW92ZSksd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsdGhpcy5fb25Nb3VzZVVwKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsdGhpcy5fb25Nb3VzZVVwKSx0aGlzLl9hY3RpdmU9ITEsdGhpcy5fc3RhcnRQb3M9dGhpcy5fcG9zPURPTS5tb3VzZVBvcyh0aGlzLl9lbCx0KSx0aGlzLl9pbmVydGlhPVtbRGF0ZS5ub3coKSx0aGlzLl9wb3NdXSl9LERyYWdQYW5IYW5kbGVyLnByb3RvdHlwZS5fb25Nb3ZlPWZ1bmN0aW9uKHQpe2lmKCF0aGlzLl9pZ25vcmVFdmVudCh0KSl7dGhpcy5pc0FjdGl2ZSgpfHwodGhpcy5fYWN0aXZlPSEwLHRoaXMuX21hcC5tb3Zpbmc9ITAsdGhpcy5fZmlyZUV2ZW50KFwiZHJhZ3N0YXJ0XCIsdCksdGhpcy5fZmlyZUV2ZW50KFwibW92ZXN0YXJ0XCIsdCkpO3ZhciBlPURPTS5tb3VzZVBvcyh0aGlzLl9lbCx0KSxuPXRoaXMuX21hcDtuLnN0b3AoKSx0aGlzLl9kcmFpbkluZXJ0aWFCdWZmZXIoKSx0aGlzLl9pbmVydGlhLnB1c2goW0RhdGUubm93KCksZV0pLG4udHJhbnNmb3JtLnNldExvY2F0aW9uQXRQb2ludChuLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKHRoaXMuX3BvcyksZSksdGhpcy5fZmlyZUV2ZW50KFwiZHJhZ1wiLHQpLHRoaXMuX2ZpcmVFdmVudChcIm1vdmVcIix0KSx0aGlzLl9wb3M9ZSx0LnByZXZlbnREZWZhdWx0KCl9fSxEcmFnUGFuSGFuZGxlci5wcm90b3R5cGUuX29uVXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZih0aGlzLmlzQWN0aXZlKCkpe3RoaXMuX2FjdGl2ZT0hMSx0aGlzLl9maXJlRXZlbnQoXCJkcmFnZW5kXCIsdCksdGhpcy5fZHJhaW5JbmVydGlhQnVmZmVyKCk7dmFyIG49ZnVuY3Rpb24oKXtlLl9tYXAubW92aW5nPSExLGUuX2ZpcmVFdmVudChcIm1vdmVlbmRcIix0KX0saT10aGlzLl9pbmVydGlhO2lmKGkubGVuZ3RoPDIpcmV0dXJuIHZvaWQgbigpO3ZhciBvPWlbaS5sZW5ndGgtMV0scj1pWzBdLGE9b1sxXS5zdWIoclsxXSkscz0ob1swXS1yWzBdKS8xZTM7aWYoMD09PXN8fG9bMV0uZXF1YWxzKHJbMV0pKXJldHVybiB2b2lkIG4oKTt2YXIgdT1hLm11bHQoaW5lcnRpYUxpbmVhcml0eS9zKSxkPXUubWFnKCk7ZD5pbmVydGlhTWF4U3BlZWQmJihkPWluZXJ0aWFNYXhTcGVlZCx1Ll91bml0KCkuX211bHQoZCkpO3ZhciBoPWQvKGluZXJ0aWFEZWNlbGVyYXRpb24qaW5lcnRpYUxpbmVhcml0eSksdj11Lm11bHQoLWgvMik7dGhpcy5fbWFwLnBhbkJ5KHYse2R1cmF0aW9uOjFlMypoLGVhc2luZzppbmVydGlhRWFzaW5nLG5vTW92ZVN0YXJ0OiEwfSx7b3JpZ2luYWxFdmVudDp0fSl9fSxEcmFnUGFuSGFuZGxlci5wcm90b3R5cGUuX29uTW91c2VVcD1mdW5jdGlvbih0KXt0aGlzLl9pZ25vcmVFdmVudCh0KXx8KHRoaXMuX29uVXAodCksd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIix0aGlzLl9vbk1vdmUpLHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuX29uTW91c2VVcCksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsdGhpcy5fb25Nb3VzZVVwKSl9LERyYWdQYW5IYW5kbGVyLnByb3RvdHlwZS5fb25Ub3VjaEVuZD1mdW5jdGlvbih0KXt0aGlzLl9pZ25vcmVFdmVudCh0KXx8KHRoaXMuX29uVXAodCksd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIix0aGlzLl9vbk1vdmUpLHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIix0aGlzLl9vblRvdWNoRW5kKSl9LERyYWdQYW5IYW5kbGVyLnByb3RvdHlwZS5fZmlyZUV2ZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX21hcC5maXJlKHQse29yaWdpbmFsRXZlbnQ6ZX0pfSxEcmFnUGFuSGFuZGxlci5wcm90b3R5cGUuX2lnbm9yZUV2ZW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21hcDtpZihlLmJveFpvb20mJmUuYm94Wm9vbS5pc0FjdGl2ZSgpKXJldHVybiEwO2lmKGUuZHJhZ1JvdGF0ZSYmZS5kcmFnUm90YXRlLmlzQWN0aXZlKCkpcmV0dXJuITA7aWYodC50b3VjaGVzKXJldHVybiB0LnRvdWNoZXMubGVuZ3RoPjE7aWYodC5jdHJsS2V5KXJldHVybiEwO3ZhciBuPTEsaT0wO3JldHVyblwibW91c2Vtb3ZlXCI9PT10LnR5cGU/dC5idXR0b25zJjA9PT1uOnQuYnV0dG9uJiZ0LmJ1dHRvbiE9PWl9LERyYWdQYW5IYW5kbGVyLnByb3RvdHlwZS5fZHJhaW5JbmVydGlhQnVmZmVyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2luZXJ0aWEsZT1EYXRlLm5vdygpLG49MTYwO3QubGVuZ3RoPjAmJmUtdFswXVswXT5uOyl0LnNoaWZ0KCl9LG1vZHVsZS5leHBvcnRzPURyYWdQYW5IYW5kbGVyO1xufSx7XCIuLi8uLi91dGlsL2RvbVwiOjIwMixcIi4uLy4uL3V0aWwvdXRpbFwiOjIxNSxcIi4uLy4uL3V0aWwvd2luZG93XCI6MTk3fV0sMTg1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBET009X2RlcmVxXyhcIi4uLy4uL3V0aWwvZG9tXCIpLHV0aWw9X2RlcmVxXyhcIi4uLy4uL3V0aWwvdXRpbFwiKSx3aW5kb3c9X2RlcmVxXyhcIi4uLy4uL3V0aWwvd2luZG93XCIpLGluZXJ0aWFMaW5lYXJpdHk9LjI1LGluZXJ0aWFFYXNpbmc9dXRpbC5iZXppZXIoMCwwLGluZXJ0aWFMaW5lYXJpdHksMSksaW5lcnRpYU1heFNwZWVkPTE4MCxpbmVydGlhRGVjZWxlcmF0aW9uPTcyMCxEcmFnUm90YXRlSGFuZGxlcj1mdW5jdGlvbih0LGUpe3RoaXMuX21hcD10LHRoaXMuX2VsPXQuZ2V0Q2FudmFzQ29udGFpbmVyKCksdGhpcy5fYmVhcmluZ1NuYXA9ZS5iZWFyaW5nU25hcCx0aGlzLl9waXRjaFdpdGhSb3RhdGU9ZS5waXRjaFdpdGhSb3RhdGUhPT0hMSx1dGlsLmJpbmRBbGwoW1wiX29uRG93blwiLFwiX29uTW92ZVwiLFwiX29uVXBcIl0sdGhpcyl9O0RyYWdSb3RhdGVIYW5kbGVyLnByb3RvdHlwZS5pc0VuYWJsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuX2VuYWJsZWR9LERyYWdSb3RhdGVIYW5kbGVyLnByb3RvdHlwZS5pc0FjdGl2ZT1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5fYWN0aXZlfSxEcmFnUm90YXRlSGFuZGxlci5wcm90b3R5cGUuZW5hYmxlPWZ1bmN0aW9uKCl7dGhpcy5pc0VuYWJsZWQoKXx8KHRoaXMuX2VsLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIix0aGlzLl9vbkRvd24pLHRoaXMuX2VuYWJsZWQ9ITApfSxEcmFnUm90YXRlSGFuZGxlci5wcm90b3R5cGUuZGlzYWJsZT1mdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkKCkmJih0aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsdGhpcy5fb25Eb3duKSx0aGlzLl9lbmFibGVkPSExKX0sRHJhZ1JvdGF0ZUhhbmRsZXIucHJvdG90eXBlLl9vbkRvd249ZnVuY3Rpb24odCl7dGhpcy5faWdub3JlRXZlbnQodCl8fHRoaXMuaXNBY3RpdmUoKXx8KHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsdGhpcy5fb25Nb3ZlKSx3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIix0aGlzLl9vblVwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIix0aGlzLl9vblVwKSx0aGlzLl9hY3RpdmU9ITEsdGhpcy5faW5lcnRpYT1bW0RhdGUubm93KCksdGhpcy5fbWFwLmdldEJlYXJpbmcoKV1dLHRoaXMuX3N0YXJ0UG9zPXRoaXMuX3Bvcz1ET00ubW91c2VQb3ModGhpcy5fZWwsdCksdGhpcy5fY2VudGVyPXRoaXMuX21hcC50cmFuc2Zvcm0uY2VudGVyUG9pbnQsdC5wcmV2ZW50RGVmYXVsdCgpKX0sRHJhZ1JvdGF0ZUhhbmRsZXIucHJvdG90eXBlLl9vbk1vdmU9ZnVuY3Rpb24odCl7aWYoIXRoaXMuX2lnbm9yZUV2ZW50KHQpKXt0aGlzLmlzQWN0aXZlKCl8fCh0aGlzLl9hY3RpdmU9ITAsdGhpcy5fbWFwLm1vdmluZz0hMCx0aGlzLl9maXJlRXZlbnQoXCJyb3RhdGVzdGFydFwiLHQpLHRoaXMuX2ZpcmVFdmVudChcIm1vdmVzdGFydFwiLHQpLHRoaXMuX3BpdGNoV2l0aFJvdGF0ZSYmdGhpcy5fZmlyZUV2ZW50KFwicGl0Y2hzdGFydFwiLHQpKTt2YXIgZT10aGlzLl9tYXA7ZS5zdG9wKCk7dmFyIGk9dGhpcy5fcG9zLG49RE9NLm1vdXNlUG9zKHRoaXMuX2VsLHQpLHI9LjgqKGkueC1uLngpLGE9KGkueS1uLnkpKi0uNSxvPWUuZ2V0QmVhcmluZygpLXIscz1lLmdldFBpdGNoKCktYSxoPXRoaXMuX2luZXJ0aWEsXz1oW2gubGVuZ3RoLTFdO3RoaXMuX2RyYWluSW5lcnRpYUJ1ZmZlcigpLGgucHVzaChbRGF0ZS5ub3coKSxlLl9ub3JtYWxpemVCZWFyaW5nKG8sX1sxXSldKSxlLnRyYW5zZm9ybS5iZWFyaW5nPW8sdGhpcy5fcGl0Y2hXaXRoUm90YXRlJiYodGhpcy5fZmlyZUV2ZW50KFwicGl0Y2hcIix0KSxlLnRyYW5zZm9ybS5waXRjaD1zKSx0aGlzLl9maXJlRXZlbnQoXCJyb3RhdGVcIix0KSx0aGlzLl9maXJlRXZlbnQoXCJtb3ZlXCIsdCksdGhpcy5fcG9zPW59fSxEcmFnUm90YXRlSGFuZGxlci5wcm90b3R5cGUuX29uVXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZighdGhpcy5faWdub3JlRXZlbnQodCkmJih3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHRoaXMuX29uTW92ZSksd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsdGhpcy5fb25VcCksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsdGhpcy5fb25VcCksdGhpcy5pc0FjdGl2ZSgpKSl7dGhpcy5fYWN0aXZlPSExLHRoaXMuX2ZpcmVFdmVudChcInJvdGF0ZWVuZFwiLHQpLHRoaXMuX2RyYWluSW5lcnRpYUJ1ZmZlcigpO3ZhciBpPXRoaXMuX21hcCxuPWkuZ2V0QmVhcmluZygpLHI9dGhpcy5faW5lcnRpYSxhPWZ1bmN0aW9uKCl7TWF0aC5hYnMobik8ZS5fYmVhcmluZ1NuYXA/aS5yZXNldE5vcnRoKHtub01vdmVTdGFydDohMH0se29yaWdpbmFsRXZlbnQ6dH0pOihlLl9tYXAubW92aW5nPSExLGUuX2ZpcmVFdmVudChcIm1vdmVlbmRcIix0KSksZS5fcGl0Y2hXaXRoUm90YXRlJiZlLl9maXJlRXZlbnQoXCJwaXRjaGVuZFwiLHQpfTtpZihyLmxlbmd0aDwyKXJldHVybiB2b2lkIGEoKTt2YXIgbz1yWzBdLHM9cltyLmxlbmd0aC0xXSxoPXJbci5sZW5ndGgtMl0sXz1pLl9ub3JtYWxpemVCZWFyaW5nKG4saFsxXSksdj1zWzFdLW9bMV0scD12PDA/LTE6MSxkPShzWzBdLW9bMF0pLzFlMztpZigwPT09dnx8MD09PWQpcmV0dXJuIHZvaWQgYSgpO3ZhciB1PU1hdGguYWJzKHYqKGluZXJ0aWFMaW5lYXJpdHkvZCkpO3U+aW5lcnRpYU1heFNwZWVkJiYodT1pbmVydGlhTWF4U3BlZWQpO3ZhciBsPXUvKGluZXJ0aWFEZWNlbGVyYXRpb24qaW5lcnRpYUxpbmVhcml0eSksZz1wKnUqKGwvMik7Xys9ZyxNYXRoLmFicyhpLl9ub3JtYWxpemVCZWFyaW5nKF8sMCkpPHRoaXMuX2JlYXJpbmdTbmFwJiYoXz1pLl9ub3JtYWxpemVCZWFyaW5nKDAsXykpLGkucm90YXRlVG8oXyx7ZHVyYXRpb246MWUzKmwsZWFzaW5nOmluZXJ0aWFFYXNpbmcsbm9Nb3ZlU3RhcnQ6ITB9LHtvcmlnaW5hbEV2ZW50OnR9KX19LERyYWdSb3RhdGVIYW5kbGVyLnByb3RvdHlwZS5fZmlyZUV2ZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX21hcC5maXJlKHQse29yaWdpbmFsRXZlbnQ6ZX0pfSxEcmFnUm90YXRlSGFuZGxlci5wcm90b3R5cGUuX2lnbm9yZUV2ZW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21hcDtpZihlLmJveFpvb20mJmUuYm94Wm9vbS5pc0FjdGl2ZSgpKXJldHVybiEwO2lmKGUuZHJhZ1BhbiYmZS5kcmFnUGFuLmlzQWN0aXZlKCkpcmV0dXJuITA7aWYodC50b3VjaGVzKXJldHVybiB0LnRvdWNoZXMubGVuZ3RoPjE7dmFyIGk9dC5jdHJsS2V5PzE6MixuPXQuY3RybEtleT8wOjIscj10LmJ1dHRvbjtyZXR1cm5cInVuZGVmaW5lZFwiIT10eXBlb2YgSW5zdGFsbFRyaWdnZXImJjI9PT10LmJ1dHRvbiYmdC5jdHJsS2V5JiZ3aW5kb3cubmF2aWdhdG9yLnBsYXRmb3JtLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihcIk1BQ1wiKT49MCYmKHI9MCksXCJtb3VzZW1vdmVcIj09PXQudHlwZT90LmJ1dHRvbnMmMD09PWk6IXRoaXMuaXNBY3RpdmUoKSYmciE9PW59LERyYWdSb3RhdGVIYW5kbGVyLnByb3RvdHlwZS5fZHJhaW5JbmVydGlhQnVmZmVyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2luZXJ0aWEsZT1EYXRlLm5vdygpLGk9MTYwO3QubGVuZ3RoPjAmJmUtdFswXVswXT5pOyl0LnNoaWZ0KCl9LG1vZHVsZS5leHBvcnRzPURyYWdSb3RhdGVIYW5kbGVyO1xufSx7XCIuLi8uLi91dGlsL2RvbVwiOjIwMixcIi4uLy4uL3V0aWwvdXRpbFwiOjIxNSxcIi4uLy4uL3V0aWwvd2luZG93XCI6MTk3fV0sMTg2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGVhc2VPdXQoZSl7cmV0dXJuIGUqKDItZSl9dmFyIHBhblN0ZXA9MTAwLGJlYXJpbmdTdGVwPTE1LHBpdGNoU3RlcD0xMCxLZXlib2FyZEhhbmRsZXI9ZnVuY3Rpb24oZSl7dGhpcy5fbWFwPWUsdGhpcy5fZWw9ZS5nZXRDYW52YXNDb250YWluZXIoKSx0aGlzLl9vbktleURvd249dGhpcy5fb25LZXlEb3duLmJpbmQodGhpcyl9O0tleWJvYXJkSGFuZGxlci5wcm90b3R5cGUuaXNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl9lbmFibGVkfSxLZXlib2FyZEhhbmRsZXIucHJvdG90eXBlLmVuYWJsZT1mdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkKCl8fCh0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLHRoaXMuX29uS2V5RG93biwhMSksdGhpcy5fZW5hYmxlZD0hMCl9LEtleWJvYXJkSGFuZGxlci5wcm90b3R5cGUuZGlzYWJsZT1mdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkKCkmJih0aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLHRoaXMuX29uS2V5RG93biksdGhpcy5fZW5hYmxlZD0hMSl9LEtleWJvYXJkSGFuZGxlci5wcm90b3R5cGUuX29uS2V5RG93bj1mdW5jdGlvbihlKXtpZighKGUuYWx0S2V5fHxlLmN0cmxLZXl8fGUubWV0YUtleSkpe3ZhciB0PTAsYT0wLG49MCxyPTAsaT0wO3N3aXRjaChlLmtleUNvZGUpe2Nhc2UgNjE6Y2FzZSAxMDc6Y2FzZSAxNzE6Y2FzZSAxODc6dD0xO2JyZWFrO2Nhc2UgMTg5OmNhc2UgMTA5OmNhc2UgMTczOnQ9LTE7YnJlYWs7Y2FzZSAzNzplLnNoaWZ0S2V5P2E9LTE6KGUucHJldmVudERlZmF1bHQoKSxyPS0xKTticmVhaztjYXNlIDM5OmUuc2hpZnRLZXk/YT0xOihlLnByZXZlbnREZWZhdWx0KCkscj0xKTticmVhaztjYXNlIDM4OmUuc2hpZnRLZXk/bj0xOihlLnByZXZlbnREZWZhdWx0KCksaT0tMSk7YnJlYWs7Y2FzZSA0MDplLnNoaWZ0S2V5P249LTE6KGk9MSxlLnByZXZlbnREZWZhdWx0KCkpO2JyZWFrO2RlZmF1bHQ6cmV0dXJufXZhciBzPXRoaXMuX21hcCxvPXMuZ2V0Wm9vbSgpLGQ9e2R1cmF0aW9uOjMwMCxkZWxheUVuZEV2ZW50czo1MDAsZWFzaW5nOmVhc2VPdXQsem9vbTp0P01hdGgucm91bmQobykrdCooZS5zaGlmdEtleT8yOjEpOm8sYmVhcmluZzpzLmdldEJlYXJpbmcoKSthKmJlYXJpbmdTdGVwLHBpdGNoOnMuZ2V0UGl0Y2goKStuKnBpdGNoU3RlcCxvZmZzZXQ6Wy1yKnBhblN0ZXAsLWkqcGFuU3RlcF0sY2VudGVyOnMuZ2V0Q2VudGVyKCl9O3MuZWFzZVRvKGQse29yaWdpbmFsRXZlbnQ6ZX0pfX0sbW9kdWxlLmV4cG9ydHM9S2V5Ym9hcmRIYW5kbGVyO1xufSx7fV0sMTg3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBET009X2RlcmVxXyhcIi4uLy4uL3V0aWwvZG9tXCIpLHV0aWw9X2RlcmVxXyhcIi4uLy4uL3V0aWwvdXRpbFwiKSxicm93c2VyPV9kZXJlcV8oXCIuLi8uLi91dGlsL2Jyb3dzZXJcIiksd2luZG93PV9kZXJlcV8oXCIuLi8uLi91dGlsL3dpbmRvd1wiKSx1YT13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLGZpcmVmb3g9dWEuaW5kZXhPZihcImZpcmVmb3hcIikhPT0tMSxzYWZhcmk9dWEuaW5kZXhPZihcInNhZmFyaVwiKSE9PS0xJiZ1YS5pbmRleE9mKFwiY2hyb21cIik9PT0tMSxTY3JvbGxab29tSGFuZGxlcj1mdW5jdGlvbihlKXt0aGlzLl9tYXA9ZSx0aGlzLl9lbD1lLmdldENhbnZhc0NvbnRhaW5lcigpLHV0aWwuYmluZEFsbChbXCJfb25XaGVlbFwiLFwiX29uVGltZW91dFwiXSx0aGlzKX07U2Nyb2xsWm9vbUhhbmRsZXIucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5fZW5hYmxlZH0sU2Nyb2xsWm9vbUhhbmRsZXIucHJvdG90eXBlLmVuYWJsZT1mdW5jdGlvbihlKXt0aGlzLmlzRW5hYmxlZCgpfHwodGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsdGhpcy5fb25XaGVlbCwhMSksdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNld2hlZWxcIix0aGlzLl9vbldoZWVsLCExKSx0aGlzLl9lbmFibGVkPSEwLHRoaXMuX2Fyb3VuZENlbnRlcj1lJiZcImNlbnRlclwiPT09ZS5hcm91bmQpfSxTY3JvbGxab29tSGFuZGxlci5wcm90b3R5cGUuZGlzYWJsZT1mdW5jdGlvbigpe3RoaXMuaXNFbmFibGVkKCkmJih0aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKFwid2hlZWxcIix0aGlzLl9vbldoZWVsKSx0aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V3aGVlbFwiLHRoaXMuX29uV2hlZWwpLHRoaXMuX2VuYWJsZWQ9ITEpfSxTY3JvbGxab29tSGFuZGxlci5wcm90b3R5cGUuX29uV2hlZWw9ZnVuY3Rpb24oZSl7dmFyIHQ7XCJ3aGVlbFwiPT09ZS50eXBlPyh0PWUuZGVsdGFZLGZpcmVmb3gmJmUuZGVsdGFNb2RlPT09d2luZG93LldoZWVsRXZlbnQuRE9NX0RFTFRBX1BJWEVMJiYodC89YnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvKSxlLmRlbHRhTW9kZT09PXdpbmRvdy5XaGVlbEV2ZW50LkRPTV9ERUxUQV9MSU5FJiYodCo9NDApKTpcIm1vdXNld2hlZWxcIj09PWUudHlwZSYmKHQ9LWUud2hlZWxEZWx0YVksc2FmYXJpJiYodC89MykpO3ZhciBvPWJyb3dzZXIubm93KCksaT1vLSh0aGlzLl90aW1lfHwwKTt0aGlzLl9wb3M9RE9NLm1vdXNlUG9zKHRoaXMuX2VsLGUpLHRoaXMuX3RpbWU9bywwIT09dCYmdCU0LjAwMDI0NDE0MDYyNT09PTA/dGhpcy5fdHlwZT1cIndoZWVsXCI6MCE9PXQmJk1hdGguYWJzKHQpPDQ/dGhpcy5fdHlwZT1cInRyYWNrcGFkXCI6aT40MDA/KHRoaXMuX3R5cGU9bnVsbCx0aGlzLl9sYXN0VmFsdWU9dCx0aGlzLl90aW1lb3V0PXNldFRpbWVvdXQodGhpcy5fb25UaW1lb3V0LDQwKSk6dGhpcy5fdHlwZXx8KHRoaXMuX3R5cGU9TWF0aC5hYnMoaSp0KTwyMDA/XCJ0cmFja3BhZFwiOlwid2hlZWxcIix0aGlzLl90aW1lb3V0JiYoY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpLHRoaXMuX3RpbWVvdXQ9bnVsbCx0Kz10aGlzLl9sYXN0VmFsdWUpKSxlLnNoaWZ0S2V5JiZ0JiYodC89NCksdGhpcy5fdHlwZSYmdGhpcy5fem9vbSgtdCxlKSxlLnByZXZlbnREZWZhdWx0KCl9LFNjcm9sbFpvb21IYW5kbGVyLnByb3RvdHlwZS5fb25UaW1lb3V0PWZ1bmN0aW9uKCl7dGhpcy5fdHlwZT1cIndoZWVsXCIsdGhpcy5fem9vbSgtdGhpcy5fbGFzdFZhbHVlKX0sU2Nyb2xsWm9vbUhhbmRsZXIucHJvdG90eXBlLl96b29tPWZ1bmN0aW9uKGUsdCl7aWYoMCE9PWUpe3ZhciBvPXRoaXMuX21hcCxpPTIvKDErTWF0aC5leHAoLU1hdGguYWJzKGUvMTAwKSkpO2U8MCYmMCE9PWkmJihpPTEvaSk7dmFyIGw9by5lYXNlP28uZWFzZS50bzpvLnRyYW5zZm9ybS5zY2FsZSxzPW8udHJhbnNmb3JtLnNjYWxlWm9vbShsKmkpO28uem9vbVRvKHMse2R1cmF0aW9uOlwid2hlZWxcIj09PXRoaXMuX3R5cGU/MjAwOjAsYXJvdW5kOnRoaXMuX2Fyb3VuZENlbnRlcj9vLmdldENlbnRlcigpOm8udW5wcm9qZWN0KHRoaXMuX3BvcyksZGVsYXlFbmRFdmVudHM6MjAwLHNtb290aEVhc2luZzohMH0se29yaWdpbmFsRXZlbnQ6dH0pfX0sbW9kdWxlLmV4cG9ydHM9U2Nyb2xsWm9vbUhhbmRsZXI7XG59LHtcIi4uLy4uL3V0aWwvYnJvd3NlclwiOjE5NSxcIi4uLy4uL3V0aWwvZG9tXCI6MjAyLFwiLi4vLi4vdXRpbC91dGlsXCI6MjE1LFwiLi4vLi4vdXRpbC93aW5kb3dcIjoxOTd9XSwxODg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIERPTT1fZGVyZXFfKFwiLi4vLi4vdXRpbC9kb21cIiksdXRpbD1fZGVyZXFfKFwiLi4vLi4vdXRpbC91dGlsXCIpLHdpbmRvdz1fZGVyZXFfKFwiLi4vLi4vdXRpbC93aW5kb3dcIiksaW5lcnRpYUxpbmVhcml0eT0uMTUsaW5lcnRpYUVhc2luZz11dGlsLmJlemllcigwLDAsaW5lcnRpYUxpbmVhcml0eSwxKSxpbmVydGlhRGVjZWxlcmF0aW9uPTEyLGluZXJ0aWFNYXhTcGVlZD0yLjUsc2lnbmlmaWNhbnRTY2FsZVRocmVzaG9sZD0uMTUsc2lnbmlmaWNhbnRSb3RhdGVUaHJlc2hvbGQ9NCxUb3VjaFpvb21Sb3RhdGVIYW5kbGVyPWZ1bmN0aW9uKHQpe3RoaXMuX21hcD10LHRoaXMuX2VsPXQuZ2V0Q2FudmFzQ29udGFpbmVyKCksdXRpbC5iaW5kQWxsKFtcIl9vblN0YXJ0XCIsXCJfb25Nb3ZlXCIsXCJfb25FbmRcIl0sdGhpcyl9O1RvdWNoWm9vbVJvdGF0ZUhhbmRsZXIucHJvdG90eXBlLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5fZW5hYmxlZH0sVG91Y2hab29tUm90YXRlSGFuZGxlci5wcm90b3R5cGUuZW5hYmxlPWZ1bmN0aW9uKHQpe3RoaXMuaXNFbmFibGVkKCl8fCh0aGlzLl9lbC5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtdG91Y2gtem9vbS1yb3RhdGVcIiksdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIix0aGlzLl9vblN0YXJ0LCExKSx0aGlzLl9lbmFibGVkPSEwLHRoaXMuX2Fyb3VuZENlbnRlcj10JiZcImNlbnRlclwiPT09dC5hcm91bmQpfSxUb3VjaFpvb21Sb3RhdGVIYW5kbGVyLnByb3RvdHlwZS5kaXNhYmxlPWZ1bmN0aW9uKCl7dGhpcy5pc0VuYWJsZWQoKSYmKHRoaXMuX2VsLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXBib3hnbC10b3VjaC16b29tLXJvdGF0ZVwiKSx0aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLHRoaXMuX29uU3RhcnQpLHRoaXMuX2VuYWJsZWQ9ITEpfSxUb3VjaFpvb21Sb3RhdGVIYW5kbGVyLnByb3RvdHlwZS5kaXNhYmxlUm90YXRpb249ZnVuY3Rpb24oKXt0aGlzLl9yb3RhdGlvbkRpc2FibGVkPSEwfSxUb3VjaFpvb21Sb3RhdGVIYW5kbGVyLnByb3RvdHlwZS5lbmFibGVSb3RhdGlvbj1mdW5jdGlvbigpe3RoaXMuX3JvdGF0aW9uRGlzYWJsZWQ9ITF9LFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXIucHJvdG90eXBlLl9vblN0YXJ0PWZ1bmN0aW9uKHQpe2lmKDI9PT10LnRvdWNoZXMubGVuZ3RoKXt2YXIgZT1ET00ubW91c2VQb3ModGhpcy5fZWwsdC50b3VjaGVzWzBdKSxvPURPTS5tb3VzZVBvcyh0aGlzLl9lbCx0LnRvdWNoZXNbMV0pO3RoaXMuX3N0YXJ0VmVjPWUuc3ViKG8pLHRoaXMuX3N0YXJ0U2NhbGU9dGhpcy5fbWFwLnRyYW5zZm9ybS5zY2FsZSx0aGlzLl9zdGFydEJlYXJpbmc9dGhpcy5fbWFwLnRyYW5zZm9ybS5iZWFyaW5nLHRoaXMuX2dlc3R1cmVJbnRlbnQ9dm9pZCAwLHRoaXMuX2luZXJ0aWE9W10sd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIix0aGlzLl9vbk1vdmUsITEpLHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIix0aGlzLl9vbkVuZCwhMSl9fSxUb3VjaFpvb21Sb3RhdGVIYW5kbGVyLnByb3RvdHlwZS5fb25Nb3ZlPWZ1bmN0aW9uKHQpe2lmKDI9PT10LnRvdWNoZXMubGVuZ3RoKXt2YXIgZT1ET00ubW91c2VQb3ModGhpcy5fZWwsdC50b3VjaGVzWzBdKSxvPURPTS5tb3VzZVBvcyh0aGlzLl9lbCx0LnRvdWNoZXNbMV0pLGk9ZS5hZGQobykuZGl2KDIpLG49ZS5zdWIobyksYT1uLm1hZygpL3RoaXMuX3N0YXJ0VmVjLm1hZygpLHI9dGhpcy5fcm90YXRpb25EaXNhYmxlZD8wOjE4MCpuLmFuZ2xlV2l0aCh0aGlzLl9zdGFydFZlYykvTWF0aC5QSSxzPXRoaXMuX21hcDtpZih0aGlzLl9nZXN0dXJlSW50ZW50KXt2YXIgaD17ZHVyYXRpb246MCxhcm91bmQ6cy51bnByb2plY3QoaSl9O1wicm90YXRlXCI9PT10aGlzLl9nZXN0dXJlSW50ZW50JiYoaC5iZWFyaW5nPXRoaXMuX3N0YXJ0QmVhcmluZytyKSxcInpvb21cIiE9PXRoaXMuX2dlc3R1cmVJbnRlbnQmJlwicm90YXRlXCIhPT10aGlzLl9nZXN0dXJlSW50ZW50fHwoaC56b29tPXMudHJhbnNmb3JtLnNjYWxlWm9vbSh0aGlzLl9zdGFydFNjYWxlKmEpKSxzLnN0b3AoKSx0aGlzLl9kcmFpbkluZXJ0aWFCdWZmZXIoKSx0aGlzLl9pbmVydGlhLnB1c2goW0RhdGUubm93KCksYSxpXSkscy5lYXNlVG8oaCx7b3JpZ2luYWxFdmVudDp0fSl9ZWxzZXt2YXIgdT1NYXRoLmFicygxLWEpPnNpZ25pZmljYW50U2NhbGVUaHJlc2hvbGQsbD1NYXRoLmFicyhyKT5zaWduaWZpY2FudFJvdGF0ZVRocmVzaG9sZDtsP3RoaXMuX2dlc3R1cmVJbnRlbnQ9XCJyb3RhdGVcIjp1JiYodGhpcy5fZ2VzdHVyZUludGVudD1cInpvb21cIiksdGhpcy5fZ2VzdHVyZUludGVudCYmKHRoaXMuX3N0YXJ0VmVjPW4sdGhpcy5fc3RhcnRTY2FsZT1zLnRyYW5zZm9ybS5zY2FsZSx0aGlzLl9zdGFydEJlYXJpbmc9cy50cmFuc2Zvcm0uYmVhcmluZyl9dC5wcmV2ZW50RGVmYXVsdCgpfX0sVG91Y2hab29tUm90YXRlSGFuZGxlci5wcm90b3R5cGUuX29uRW5kPWZ1bmN0aW9uKHQpe3dpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsdGhpcy5fb25Nb3ZlKSx3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsdGhpcy5fb25FbmQpLHRoaXMuX2RyYWluSW5lcnRpYUJ1ZmZlcigpO3ZhciBlPXRoaXMuX2luZXJ0aWEsbz10aGlzLl9tYXA7aWYoZS5sZW5ndGg8MilyZXR1cm4gdm9pZCBvLnNuYXBUb05vcnRoKHt9LHtvcmlnaW5hbEV2ZW50OnR9KTt2YXIgaT1lW2UubGVuZ3RoLTFdLG49ZVswXSxhPW8udHJhbnNmb3JtLnNjYWxlWm9vbSh0aGlzLl9zdGFydFNjYWxlKmlbMV0pLHI9by50cmFuc2Zvcm0uc2NhbGVab29tKHRoaXMuX3N0YXJ0U2NhbGUqblsxXSkscz1hLXIsaD0oaVswXS1uWzBdKS8xZTMsdT1pWzJdO2lmKDA9PT1ofHxhPT09cilyZXR1cm4gdm9pZCBvLnNuYXBUb05vcnRoKHt9LHtvcmlnaW5hbEV2ZW50OnR9KTt2YXIgbD1zKmluZXJ0aWFMaW5lYXJpdHkvaDtNYXRoLmFicyhsKT5pbmVydGlhTWF4U3BlZWQmJihsPWw+MD9pbmVydGlhTWF4U3BlZWQ6LWluZXJ0aWFNYXhTcGVlZCk7dmFyIGQ9MWUzKk1hdGguYWJzKGwvKGluZXJ0aWFEZWNlbGVyYXRpb24qaW5lcnRpYUxpbmVhcml0eSkpLGM9YStsKmQvMmUzO2M8MCYmKGM9MCksby5lYXNlVG8oe3pvb206YyxkdXJhdGlvbjpkLGVhc2luZzppbmVydGlhRWFzaW5nLGFyb3VuZDp0aGlzLl9hcm91bmRDZW50ZXI/by5nZXRDZW50ZXIoKTpvLnVucHJvamVjdCh1KX0se29yaWdpbmFsRXZlbnQ6dH0pfSxUb3VjaFpvb21Sb3RhdGVIYW5kbGVyLnByb3RvdHlwZS5fZHJhaW5JbmVydGlhQnVmZmVyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2luZXJ0aWEsZT1EYXRlLm5vdygpLG89MTYwO3QubGVuZ3RoPjImJmUtdFswXVswXT5vOyl0LnNoaWZ0KCl9LG1vZHVsZS5leHBvcnRzPVRvdWNoWm9vbVJvdGF0ZUhhbmRsZXI7XG59LHtcIi4uLy4uL3V0aWwvZG9tXCI6MjAyLFwiLi4vLi4vdXRpbC91dGlsXCI6MjE1LFwiLi4vLi4vdXRpbC93aW5kb3dcIjoxOTd9XSwxODk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIHV0aWw9X2RlcmVxXyhcIi4uL3V0aWwvdXRpbFwiKSx3aW5kb3c9X2RlcmVxXyhcIi4uL3V0aWwvd2luZG93XCIpLEhhc2g9ZnVuY3Rpb24oKXt1dGlsLmJpbmRBbGwoW1wiX29uSGFzaENoYW5nZVwiLFwiX3VwZGF0ZUhhc2hcIl0sdGhpcyl9O0hhc2gucHJvdG90eXBlLmFkZFRvPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9tYXA9dCx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImhhc2hjaGFuZ2VcIix0aGlzLl9vbkhhc2hDaGFuZ2UsITEpLHRoaXMuX21hcC5vbihcIm1vdmVlbmRcIix0aGlzLl91cGRhdGVIYXNoKSx0aGlzfSxIYXNoLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJoYXNoY2hhbmdlXCIsdGhpcy5fb25IYXNoQ2hhbmdlLCExKSx0aGlzLl9tYXAub2ZmKFwibW92ZWVuZFwiLHRoaXMuX3VwZGF0ZUhhc2gpLGRlbGV0ZSB0aGlzLl9tYXAsdGhpc30sSGFzaC5wcm90b3R5cGUuX29uSGFzaENoYW5nZT1mdW5jdGlvbigpe3ZhciB0PXdpbmRvdy5sb2NhdGlvbi5oYXNoLnJlcGxhY2UoXCIjXCIsXCJcIikuc3BsaXQoXCIvXCIpO3JldHVybiB0Lmxlbmd0aD49MyYmKHRoaXMuX21hcC5qdW1wVG8oe2NlbnRlcjpbK3RbMl0sK3RbMV1dLHpvb206K3RbMF0sYmVhcmluZzorKHRbM118fDApLHBpdGNoOisodFs0XXx8MCl9KSwhMCl9LEhhc2gucHJvdG90eXBlLl91cGRhdGVIYXNoPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwLmdldENlbnRlcigpLGU9dGhpcy5fbWFwLmdldFpvb20oKSxhPXRoaXMuX21hcC5nZXRCZWFyaW5nKCksaD10aGlzLl9tYXAuZ2V0UGl0Y2goKSxpPU1hdGgubWF4KDAsTWF0aC5jZWlsKE1hdGgubG9nKGUpL01hdGguTE4yKSksbj1cIiNcIitNYXRoLnJvdW5kKDEwMCplKS8xMDArXCIvXCIrdC5sYXQudG9GaXhlZChpKStcIi9cIit0LmxuZy50b0ZpeGVkKGkpOyhhfHxoKSYmKG4rPVwiL1wiK01hdGgucm91bmQoMTAqYSkvMTApLGgmJihuKz1cIi9cIitNYXRoLnJvdW5kKGgpKSx3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoXCJcIixcIlwiLG4pfSxtb2R1bGUuZXhwb3J0cz1IYXNoO1xufSx7XCIuLi91dGlsL3V0aWxcIjoyMTUsXCIuLi91dGlsL3dpbmRvd1wiOjE5N31dLDE5MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiByZW1vdmVOb2RlKHQpe3QucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpfXZhciB1dGlsPV9kZXJlcV8oXCIuLi91dGlsL3V0aWxcIiksYnJvd3Nlcj1fZGVyZXFfKFwiLi4vdXRpbC9icm93c2VyXCIpLHdpbmRvdz1fZGVyZXFfKFwiLi4vdXRpbC93aW5kb3dcIiksRE9NPV9kZXJlcV8oXCIuLi91dGlsL2RvbVwiKSxhamF4PV9kZXJlcV8oXCIuLi91dGlsL2FqYXhcIiksU3R5bGU9X2RlcmVxXyhcIi4uL3N0eWxlL3N0eWxlXCIpLEFuaW1hdGlvbkxvb3A9X2RlcmVxXyhcIi4uL3N0eWxlL2FuaW1hdGlvbl9sb29wXCIpLFBhaW50ZXI9X2RlcmVxXyhcIi4uL3JlbmRlci9wYWludGVyXCIpLFRyYW5zZm9ybT1fZGVyZXFfKFwiLi4vZ2VvL3RyYW5zZm9ybVwiKSxIYXNoPV9kZXJlcV8oXCIuL2hhc2hcIiksYmluZEhhbmRsZXJzPV9kZXJlcV8oXCIuL2JpbmRfaGFuZGxlcnNcIiksQ2FtZXJhPV9kZXJlcV8oXCIuL2NhbWVyYVwiKSxMbmdMYXQ9X2RlcmVxXyhcIi4uL2dlby9sbmdfbGF0XCIpLExuZ0xhdEJvdW5kcz1fZGVyZXFfKFwiLi4vZ2VvL2xuZ19sYXRfYm91bmRzXCIpLFBvaW50PV9kZXJlcV8oXCJwb2ludC1nZW9tZXRyeVwiKSxBdHRyaWJ1dGlvbkNvbnRyb2w9X2RlcmVxXyhcIi4vY29udHJvbC9hdHRyaWJ1dGlvbl9jb250cm9sXCIpLExvZ29Db250cm9sPV9kZXJlcV8oXCIuL2NvbnRyb2wvbG9nb19jb250cm9sXCIpLGlzU3VwcG9ydGVkPV9kZXJlcV8oXCJtYXBib3gtZ2wtc3VwcG9ydGVkXCIpLGRlZmF1bHRNaW5ab29tPTAsZGVmYXVsdE1heFpvb209MjIsZGVmYXVsdE9wdGlvbnM9e2NlbnRlcjpbMCwwXSx6b29tOjAsYmVhcmluZzowLHBpdGNoOjAsbWluWm9vbTpkZWZhdWx0TWluWm9vbSxtYXhab29tOmRlZmF1bHRNYXhab29tLGludGVyYWN0aXZlOiEwLHNjcm9sbFpvb206ITAsYm94Wm9vbTohMCxkcmFnUm90YXRlOiEwLGRyYWdQYW46ITAsa2V5Ym9hcmQ6ITAsZG91YmxlQ2xpY2tab29tOiEwLHRvdWNoWm9vbVJvdGF0ZTohMCxiZWFyaW5nU25hcDo3LGhhc2g6ITEsYXR0cmlidXRpb25Db250cm9sOiEwLGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6ITEscHJlc2VydmVEcmF3aW5nQnVmZmVyOiExLHRyYWNrUmVzaXplOiEwLHJlbmRlcldvcmxkQ29waWVzOiEwLHJlZnJlc2hFeHBpcmVkVGlsZXM6ITB9LE1hcD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBvPXRoaXM7aWYoZT11dGlsLmV4dGVuZCh7fSxkZWZhdWx0T3B0aW9ucyxlKSxudWxsIT1lLm1pblpvb20mJm51bGwhPWUubWF4Wm9vbSYmZS5taW5ab29tPmUubWF4Wm9vbSl0aHJvdyBuZXcgRXJyb3IoXCJtYXhab29tIG11c3QgYmUgZ3JlYXRlciB0aGFuIG1pblpvb21cIik7dmFyIGk9bmV3IFRyYW5zZm9ybShlLm1pblpvb20sZS5tYXhab29tLGUucmVuZGVyV29ybGRDb3BpZXMpO2lmKHQuY2FsbCh0aGlzLGksZSksdGhpcy5faW50ZXJhY3RpdmU9ZS5pbnRlcmFjdGl2ZSx0aGlzLl9mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0PWUuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCx0aGlzLl9wcmVzZXJ2ZURyYXdpbmdCdWZmZXI9ZS5wcmVzZXJ2ZURyYXdpbmdCdWZmZXIsdGhpcy5fdHJhY2tSZXNpemU9ZS50cmFja1Jlc2l6ZSx0aGlzLl9iZWFyaW5nU25hcD1lLmJlYXJpbmdTbmFwLHRoaXMuX3JlZnJlc2hFeHBpcmVkVGlsZXM9ZS5yZWZyZXNoRXhwaXJlZFRpbGVzLFwic3RyaW5nXCI9PXR5cGVvZiBlLmNvbnRhaW5lcil7aWYodGhpcy5fY29udGFpbmVyPXdpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlLmNvbnRhaW5lciksIXRoaXMuX2NvbnRhaW5lcil0aHJvdyBuZXcgRXJyb3IoXCJDb250YWluZXIgJ1wiK2UuY29udGFpbmVyK1wiJyBub3QgZm91bmQuXCIpfWVsc2UgdGhpcy5fY29udGFpbmVyPWUuY29udGFpbmVyO3RoaXMuYW5pbWF0aW9uTG9vcD1uZXcgQW5pbWF0aW9uTG9vcCxlLm1heEJvdW5kcyYmdGhpcy5zZXRNYXhCb3VuZHMoZS5tYXhCb3VuZHMpLHV0aWwuYmluZEFsbChbXCJfb25XaW5kb3dPbmxpbmVcIixcIl9vbldpbmRvd1Jlc2l6ZVwiLFwiX2NvbnRleHRMb3N0XCIsXCJfY29udGV4dFJlc3RvcmVkXCIsXCJfdXBkYXRlXCIsXCJfcmVuZGVyXCIsXCJfb25EYXRhXCIsXCJfb25EYXRhTG9hZGluZ1wiXSx0aGlzKSx0aGlzLl9zZXR1cENvbnRhaW5lcigpLHRoaXMuX3NldHVwUGFpbnRlcigpLHRoaXMub24oXCJtb3ZlXCIsdGhpcy5fdXBkYXRlLmJpbmQodGhpcywhMSkpLHRoaXMub24oXCJ6b29tXCIsdGhpcy5fdXBkYXRlLmJpbmQodGhpcywhMCkpLHRoaXMub24oXCJtb3ZlZW5kXCIsZnVuY3Rpb24oKXtvLmFuaW1hdGlvbkxvb3Auc2V0KDMwMCksby5fcmVyZW5kZXIoKX0pLFwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm9ubGluZVwiLHRoaXMuX29uV2luZG93T25saW5lLCExKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLHRoaXMuX29uV2luZG93UmVzaXplLCExKSksYmluZEhhbmRsZXJzKHRoaXMsZSksdGhpcy5faGFzaD1lLmhhc2gmJihuZXcgSGFzaCkuYWRkVG8odGhpcyksdGhpcy5faGFzaCYmdGhpcy5faGFzaC5fb25IYXNoQ2hhbmdlKCl8fHRoaXMuanVtcFRvKHtjZW50ZXI6ZS5jZW50ZXIsem9vbTplLnpvb20sYmVhcmluZzplLmJlYXJpbmcscGl0Y2g6ZS5waXRjaH0pLHRoaXMuX2NsYXNzZXM9W10sdGhpcy5yZXNpemUoKSxlLmNsYXNzZXMmJnRoaXMuc2V0Q2xhc3NlcyhlLmNsYXNzZXMpLGUuc3R5bGUmJnRoaXMuc2V0U3R5bGUoZS5zdHlsZSksZS5hdHRyaWJ1dGlvbkNvbnRyb2wmJnRoaXMuYWRkQ29udHJvbChuZXcgQXR0cmlidXRpb25Db250cm9sKSx0aGlzLmFkZENvbnRyb2wobmV3IExvZ29Db250cm9sLGUubG9nb1Bvc2l0aW9uKSx0aGlzLm9uKFwic3R5bGUubG9hZFwiLGZ1bmN0aW9uKCl7dGhpcy50cmFuc2Zvcm0udW5tb2RpZmllZCYmdGhpcy5qdW1wVG8odGhpcy5zdHlsZS5zdHlsZXNoZWV0KSx0aGlzLnN0eWxlLnVwZGF0ZSh0aGlzLl9jbGFzc2VzLHt0cmFuc2l0aW9uOiExfSl9KSx0aGlzLm9uKFwiZGF0YVwiLHRoaXMuX29uRGF0YSksdGhpcy5vbihcImRhdGFsb2FkaW5nXCIsdGhpcy5fb25EYXRhTG9hZGluZyl9dCYmKGUuX19wcm90b19fPXQpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWU7dmFyIG89e3Nob3dUaWxlQm91bmRhcmllczp7fSxzaG93Q29sbGlzaW9uQm94ZXM6e30sc2hvd092ZXJkcmF3SW5zcGVjdG9yOnt9LHJlcGFpbnQ6e30sdmVydGljZXM6e319O3JldHVybiBlLnByb3RvdHlwZS5hZGRDb250cm9sPWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmdC5nZXREZWZhdWx0UG9zaXRpb24mJihlPXQuZ2V0RGVmYXVsdFBvc2l0aW9uKCkpLHZvaWQgMD09PWUmJihlPVwidG9wLXJpZ2h0XCIpO3ZhciBvPXQub25BZGQodGhpcyksaT10aGlzLl9jb250cm9sUG9zaXRpb25zW2VdO3JldHVybiBlLmluZGV4T2YoXCJib3R0b21cIikhPT0tMT9pLmluc2VydEJlZm9yZShvLGkuZmlyc3RDaGlsZCk6aS5hcHBlbmRDaGlsZChvKSx0aGlzfSxlLnByb3RvdHlwZS5yZW1vdmVDb250cm9sPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm9uUmVtb3ZlKHRoaXMpLHRoaXN9LGUucHJvdG90eXBlLmFkZENsYXNzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHV0aWwud2Fybk9uY2UoXCJTdHlsZSBjbGFzc2VzIGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYW4gdXBjb21pbmcgcmVsZWFzZSBvZiBNYXBib3ggR0wgSlMuXCIpLHRoaXMuX2NsYXNzZXMuaW5kZXhPZih0KT49MHx8XCJcIj09PXQ/dGhpczoodGhpcy5fY2xhc3Nlcy5wdXNoKHQpLHRoaXMuX2NsYXNzT3B0aW9ucz1lLHRoaXMuc3R5bGUmJnRoaXMuc3R5bGUudXBkYXRlQ2xhc3NlcygpLHRoaXMuX3VwZGF0ZSghMCkpfSxlLnByb3RvdHlwZS5yZW1vdmVDbGFzcz1mdW5jdGlvbih0LGUpe3V0aWwud2Fybk9uY2UoXCJTdHlsZSBjbGFzc2VzIGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYW4gdXBjb21pbmcgcmVsZWFzZSBvZiBNYXBib3ggR0wgSlMuXCIpO3ZhciBvPXRoaXMuX2NsYXNzZXMuaW5kZXhPZih0KTtyZXR1cm4gbzwwfHxcIlwiPT09dD90aGlzOih0aGlzLl9jbGFzc2VzLnNwbGljZShvLDEpLHRoaXMuX2NsYXNzT3B0aW9ucz1lLHRoaXMuc3R5bGUmJnRoaXMuc3R5bGUudXBkYXRlQ2xhc3NlcygpLHRoaXMuX3VwZGF0ZSghMCkpfSxlLnByb3RvdHlwZS5zZXRDbGFzc2VzPWZ1bmN0aW9uKHQsZSl7dXRpbC53YXJuT25jZShcIlN0eWxlIGNsYXNzZXMgYXJlIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhbiB1cGNvbWluZyByZWxlYXNlIG9mIE1hcGJveCBHTCBKUy5cIik7Zm9yKHZhciBvPXt9LGk9MDtpPHQubGVuZ3RoO2krKylcIlwiIT09dFtpXSYmKG9bdFtpXV09ITApO3JldHVybiB0aGlzLl9jbGFzc2VzPU9iamVjdC5rZXlzKG8pLHRoaXMuX2NsYXNzT3B0aW9ucz1lLHRoaXMuc3R5bGUmJnRoaXMuc3R5bGUudXBkYXRlQ2xhc3NlcygpLHRoaXMuX3VwZGF0ZSghMCl9LGUucHJvdG90eXBlLmhhc0NsYXNzPWZ1bmN0aW9uKHQpe3JldHVybiB1dGlsLndhcm5PbmNlKFwiU3R5bGUgY2xhc3NlcyBhcmUgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGFuIHVwY29taW5nIHJlbGVhc2Ugb2YgTWFwYm94IEdMIEpTLlwiKSx0aGlzLl9jbGFzc2VzLmluZGV4T2YodCk+PTB9LGUucHJvdG90eXBlLmdldENsYXNzZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdXRpbC53YXJuT25jZShcIlN0eWxlIGNsYXNzZXMgYXJlIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhbiB1cGNvbWluZyByZWxlYXNlIG9mIE1hcGJveCBHTCBKUy5cIiksdGhpcy5fY2xhc3Nlc30sZS5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY29udGFpbmVyRGltZW5zaW9ucygpLGU9dFswXSxvPXRbMV07cmV0dXJuIHRoaXMuX3Jlc2l6ZUNhbnZhcyhlLG8pLHRoaXMudHJhbnNmb3JtLnJlc2l6ZShlLG8pLHRoaXMucGFpbnRlci5yZXNpemUoZSxvKSx0aGlzLmZpcmUoXCJtb3Zlc3RhcnRcIikuZmlyZShcIm1vdmVcIikuZmlyZShcInJlc2l6ZVwiKS5maXJlKFwibW92ZWVuZFwiKX0sZS5wcm90b3R5cGUuZ2V0Qm91bmRzPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IExuZ0xhdEJvdW5kcyh0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKG5ldyBQb2ludCgwLHRoaXMudHJhbnNmb3JtLmhlaWdodCkpLHRoaXMudHJhbnNmb3JtLnBvaW50TG9jYXRpb24obmV3IFBvaW50KHRoaXMudHJhbnNmb3JtLndpZHRoLDApKSk7cmV0dXJuKHRoaXMudHJhbnNmb3JtLmFuZ2xlfHx0aGlzLnRyYW5zZm9ybS5waXRjaCkmJih0LmV4dGVuZCh0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKG5ldyBQb2ludCh0aGlzLnRyYW5zZm9ybS5zaXplLngsMCkpKSx0LmV4dGVuZCh0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKG5ldyBQb2ludCgwLHRoaXMudHJhbnNmb3JtLnNpemUueSkpKSksdH0sZS5wcm90b3R5cGUuc2V0TWF4Qm91bmRzPWZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlPUxuZ0xhdEJvdW5kcy5jb252ZXJ0KHQpO3RoaXMudHJhbnNmb3JtLmxuZ1JhbmdlPVtlLmdldFdlc3QoKSxlLmdldEVhc3QoKV0sdGhpcy50cmFuc2Zvcm0ubGF0UmFuZ2U9W2UuZ2V0U291dGgoKSxlLmdldE5vcnRoKCldLHRoaXMudHJhbnNmb3JtLl9jb25zdHJhaW4oKSx0aGlzLl91cGRhdGUoKX1lbHNlIG51bGwhPT10JiZ2b2lkIDAhPT10fHwodGhpcy50cmFuc2Zvcm0ubG5nUmFuZ2U9W10sdGhpcy50cmFuc2Zvcm0ubGF0UmFuZ2U9W10sdGhpcy5fdXBkYXRlKCkpO3JldHVybiB0aGlzfSxlLnByb3RvdHlwZS5zZXRNaW5ab29tPWZ1bmN0aW9uKHQpe2lmKHQ9bnVsbD09PXR8fHZvaWQgMD09PXQ/ZGVmYXVsdE1pblpvb206dCx0Pj1kZWZhdWx0TWluWm9vbSYmdDw9dGhpcy50cmFuc2Zvcm0ubWF4Wm9vbSlyZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWluWm9vbT10LHRoaXMuX3VwZGF0ZSgpLHRoaXMuZ2V0Wm9vbSgpPHQmJnRoaXMuc2V0Wm9vbSh0KSx0aGlzO3Rocm93IG5ldyBFcnJvcihcIm1pblpvb20gbXVzdCBiZSBiZXR3ZWVuIFwiK2RlZmF1bHRNaW5ab29tK1wiIGFuZCB0aGUgY3VycmVudCBtYXhab29tLCBpbmNsdXNpdmVcIil9LGUucHJvdG90eXBlLmdldE1pblpvb209ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWluWm9vbX0sZS5wcm90b3R5cGUuc2V0TWF4Wm9vbT1mdW5jdGlvbih0KXtpZih0PW51bGw9PT10fHx2b2lkIDA9PT10P2RlZmF1bHRNYXhab29tOnQsdD49dGhpcy50cmFuc2Zvcm0ubWluWm9vbSlyZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWF4Wm9vbT10LHRoaXMuX3VwZGF0ZSgpLHRoaXMuZ2V0Wm9vbSgpPnQmJnRoaXMuc2V0Wm9vbSh0KSx0aGlzO3Rocm93IG5ldyBFcnJvcihcIm1heFpvb20gbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgbWluWm9vbVwiKX0sZS5wcm90b3R5cGUuZ2V0TWF4Wm9vbT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRyYW5zZm9ybS5tYXhab29tfSxlLnByb3RvdHlwZS5wcm9qZWN0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRyYW5zZm9ybS5sb2NhdGlvblBvaW50KExuZ0xhdC5jb252ZXJ0KHQpKX0sZS5wcm90b3R5cGUudW5wcm9qZWN0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKFBvaW50LmNvbnZlcnQodCkpfSxlLnByb3RvdHlwZS5vbj1mdW5jdGlvbihlLG8saSl7dmFyIHI9dGhpcztpZih2b2lkIDA9PT1pKXJldHVybiB0LnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsZSxvKTt2YXIgcz1mdW5jdGlvbigpe2lmKFwibW91c2VlbnRlclwiPT09ZXx8XCJtb3VzZW92ZXJcIj09PWUpe3ZhciB0PSExLHM9ZnVuY3Rpb24ocyl7dmFyIG49ci5xdWVyeVJlbmRlcmVkRmVhdHVyZXMocy5wb2ludCx7bGF5ZXJzOltvXX0pO24ubGVuZ3RoP3R8fCh0PSEwLGkuY2FsbChyLHV0aWwuZXh0ZW5kKHtmZWF0dXJlczpufSxzLHt0eXBlOmV9KSkpOnQ9ITF9LG49ZnVuY3Rpb24oKXt0PSExfTtyZXR1cm57bGF5ZXI6byxsaXN0ZW5lcjppLGRlbGVnYXRlczp7bW91c2Vtb3ZlOnMsbW91c2VvdXQ6bn19fWlmKFwibW91c2VsZWF2ZVwiPT09ZXx8XCJtb3VzZW91dFwiPT09ZSl7dmFyIGE9ITEsaD1mdW5jdGlvbih0KXt2YXIgcz1yLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyh0LnBvaW50LHtsYXllcnM6W29dfSk7cy5sZW5ndGg/YT0hMDphJiYoYT0hMSxpLmNhbGwocix1dGlsLmV4dGVuZCh7fSx0LHt0eXBlOmV9KSkpfSxsPWZ1bmN0aW9uKHQpe2EmJihhPSExLGkuY2FsbChyLHV0aWwuZXh0ZW5kKHt9LHQse3R5cGU6ZX0pKSl9O3JldHVybntsYXllcjpvLGxpc3RlbmVyOmksZGVsZWdhdGVzOnttb3VzZW1vdmU6aCxtb3VzZW91dDpsfX19dmFyIHU9ZnVuY3Rpb24odCl7dmFyIGU9ci5xdWVyeVJlbmRlcmVkRmVhdHVyZXModC5wb2ludCx7bGF5ZXJzOltvXX0pO2UubGVuZ3RoJiZpLmNhbGwocix1dGlsLmV4dGVuZCh7ZmVhdHVyZXM6ZX0sdCkpfTtyZXR1cm57bGF5ZXI6byxsaXN0ZW5lcjppLGRlbGVnYXRlczooZD17fSxkW2VdPXUsZCl9O3ZhciBkfSgpO3RoaXMuX2RlbGVnYXRlZExpc3RlbmVycz10aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnN8fHt9LHRoaXMuX2RlbGVnYXRlZExpc3RlbmVyc1tlXT10aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnNbZV18fFtdLHRoaXMuX2RlbGVnYXRlZExpc3RlbmVyc1tlXS5wdXNoKHMpO2Zvcih2YXIgbiBpbiBzLmRlbGVnYXRlcylyLm9uKG4scy5kZWxlZ2F0ZXNbbl0pO3JldHVybiB0aGlzfSxlLnByb3RvdHlwZS5vZmY9ZnVuY3Rpb24oZSxvLGkpe3ZhciByPXRoaXM7aWYodm9pZCAwPT09aSlyZXR1cm4gdC5wcm90b3R5cGUub2ZmLmNhbGwodGhpcyxlLG8pO2lmKHRoaXMuX2RlbGVnYXRlZExpc3RlbmVycyYmdGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzW2VdKWZvcih2YXIgcz10aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnNbZV0sbj0wO248cy5sZW5ndGg7bisrKXt2YXIgYT1zW25dO2lmKGEubGF5ZXI9PT1vJiZhLmxpc3RlbmVyPT09aSl7Zm9yKHZhciBoIGluIGEuZGVsZWdhdGVzKXIub2ZmKGgsYS5kZWxlZ2F0ZXNbaF0pO3JldHVybiBzLnNwbGljZShuLDEpLHJ9fX0sZS5wcm90b3R5cGUucXVlcnlSZW5kZXJlZEZlYXR1cmVzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIFBvaW50fHxBcnJheS5pc0FycmF5KHQpfXZhciBlLG89e307cmV0dXJuIDI9PT1hcmd1bWVudHMubGVuZ3RoPyhlPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSk6MT09PWFyZ3VtZW50cy5sZW5ndGgmJnQoYXJndW1lbnRzWzBdKT9lPWFyZ3VtZW50c1swXToxPT09YXJndW1lbnRzLmxlbmd0aCYmKG89YXJndW1lbnRzWzBdKSx0aGlzLnN0eWxlP3RoaXMuc3R5bGUucXVlcnlSZW5kZXJlZEZlYXR1cmVzKHRoaXMuX21ha2VRdWVyeUdlb21ldHJ5KGUpLG8sdGhpcy50cmFuc2Zvcm0uem9vbSx0aGlzLnRyYW5zZm9ybS5hbmdsZSk6W119LGUucHJvdG90eXBlLl9tYWtlUXVlcnlHZW9tZXRyeT1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3ZvaWQgMD09PXQmJih0PVtQb2ludC5jb252ZXJ0KFswLDBdKSxQb2ludC5jb252ZXJ0KFt0aGlzLnRyYW5zZm9ybS53aWR0aCx0aGlzLnRyYW5zZm9ybS5oZWlnaHRdKV0pO3ZhciBvLGk9dCBpbnN0YW5jZW9mIFBvaW50fHxcIm51bWJlclwiPT10eXBlb2YgdFswXTtpZihpKXt2YXIgcj1Qb2ludC5jb252ZXJ0KHQpO289W3JdfWVsc2V7dmFyIHM9W1BvaW50LmNvbnZlcnQodFswXSksUG9pbnQuY29udmVydCh0WzFdKV07bz1bc1swXSxuZXcgUG9pbnQoc1sxXS54LHNbMF0ueSksc1sxXSxuZXcgUG9pbnQoc1swXS54LHNbMV0ueSksc1swXV19cmV0dXJuIG89by5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGUudHJhbnNmb3JtLnBvaW50Q29vcmRpbmF0ZSh0KX0pfSxlLnByb3RvdHlwZS5xdWVyeVNvdXJjZUZlYXR1cmVzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuc3R5bGUucXVlcnlTb3VyY2VGZWF0dXJlcyh0LGUpfSxlLnByb3RvdHlwZS5zZXRTdHlsZT1mdW5jdGlvbih0LGUpe3ZhciBvPSghZXx8ZS5kaWZmIT09ITEpJiZ0aGlzLnN0eWxlJiZ0JiYhKHQgaW5zdGFuY2VvZiBTdHlsZSkmJlwic3RyaW5nXCIhPXR5cGVvZiB0O2lmKG8pdHJ5e3JldHVybiB0aGlzLnN0eWxlLnNldFN0YXRlKHQpJiZ0aGlzLl91cGRhdGUoITApLHRoaXN9Y2F0Y2godCl7dXRpbC53YXJuT25jZShcIlVuYWJsZSB0byBwZXJmb3JtIHN0eWxlIGRpZmY6IFwiKyh0Lm1lc3NhZ2V8fHQuZXJyb3J8fHQpK1wiLiAgUmVidWlsZGluZyB0aGUgc3R5bGUgZnJvbSBzY3JhdGNoLlwiKX1yZXR1cm4gdGhpcy5zdHlsZSYmKHRoaXMuc3R5bGUuc2V0RXZlbnRlZFBhcmVudChudWxsKSx0aGlzLnN0eWxlLl9yZW1vdmUoKSx0aGlzLm9mZihcInJvdGF0ZVwiLHRoaXMuc3R5bGUuX3JlZG9QbGFjZW1lbnQpLHRoaXMub2ZmKFwicGl0Y2hcIix0aGlzLnN0eWxlLl9yZWRvUGxhY2VtZW50KSksdD8odCBpbnN0YW5jZW9mIFN0eWxlP3RoaXMuc3R5bGU9dDp0aGlzLnN0eWxlPW5ldyBTdHlsZSh0LHRoaXMpLHRoaXMuc3R5bGUuc2V0RXZlbnRlZFBhcmVudCh0aGlzLHtzdHlsZTp0aGlzLnN0eWxlfSksdGhpcy5vbihcInJvdGF0ZVwiLHRoaXMuc3R5bGUuX3JlZG9QbGFjZW1lbnQpLHRoaXMub24oXCJwaXRjaFwiLHRoaXMuc3R5bGUuX3JlZG9QbGFjZW1lbnQpLHRoaXMpOih0aGlzLnN0eWxlPW51bGwsdGhpcyl9LGUucHJvdG90eXBlLmdldFN0eWxlPWZ1bmN0aW9uKCl7aWYodGhpcy5zdHlsZSlyZXR1cm4gdGhpcy5zdHlsZS5zZXJpYWxpemUoKX0sZS5wcm90b3R5cGUuaXNTdHlsZUxvYWRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0eWxlP3RoaXMuc3R5bGUubG9hZGVkKCk6dXRpbC53YXJuT25jZShcIlRoZXJlIGlzIG5vIHN0eWxlIGFkZGVkIHRvIHRoZSBtYXAuXCIpfSxlLnByb3RvdHlwZS5hZGRTb3VyY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5zdHlsZS5hZGRTb3VyY2UodCxlKSx0aGlzLl91cGRhdGUoITApLHRoaXN9LGUucHJvdG90eXBlLmlzU291cmNlTG9hZGVkPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc3R5bGUmJnRoaXMuc3R5bGUuc291cmNlQ2FjaGVzW3RdO3JldHVybiB2b2lkIDA9PT1lP3ZvaWQgdGhpcy5maXJlKFwiZXJyb3JcIix7ZXJyb3I6bmV3IEVycm9yKFwiVGhlcmUgaXMgbm8gc291cmNlIHdpdGggSUQgJ1wiK3QrXCInXCIpfSk6ZS5sb2FkZWQoKX0sZS5wcm90b3R5cGUuYXJlVGlsZXNMb2FkZWQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnN0eWxlJiZ0aGlzLnN0eWxlLnNvdXJjZUNhY2hlcztmb3IodmFyIGUgaW4gdCl7dmFyIG89dFtlXSxpPW8uX3RpbGVzO2Zvcih2YXIgciBpbiBpKXt2YXIgcz1pW3JdO2lmKFwibG9hZGVkXCIhPT1zLnN0YXRlJiZcImVycm9yZWRcIiE9PXMuc3RhdGUpcmV0dXJuITF9fXJldHVybiEwfSxlLnByb3RvdHlwZS5hZGRTb3VyY2VUeXBlPWZ1bmN0aW9uKHQsZSxvKXtyZXR1cm4gdGhpcy5zdHlsZS5hZGRTb3VyY2VUeXBlKHQsZSxvKX0sZS5wcm90b3R5cGUucmVtb3ZlU291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnN0eWxlLnJlbW92ZVNvdXJjZSh0KSx0aGlzLl91cGRhdGUoITApLHRoaXN9LGUucHJvdG90eXBlLmdldFNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zdHlsZS5nZXRTb3VyY2UodCl9LGUucHJvdG90eXBlLmFkZEltYWdlPWZ1bmN0aW9uKHQsZSxvKXt0aGlzLnN0eWxlLnNwcml0ZUF0bGFzLmFkZEltYWdlKHQsZSxvKX0sZS5wcm90b3R5cGUucmVtb3ZlSW1hZ2U9ZnVuY3Rpb24odCl7dGhpcy5zdHlsZS5zcHJpdGVBdGxhcy5yZW1vdmVJbWFnZSh0KX0sZS5wcm90b3R5cGUubG9hZEltYWdlPWZ1bmN0aW9uKHQsZSl7YWpheC5nZXRJbWFnZSh0LGUpfSxlLnByb3RvdHlwZS5hZGRMYXllcj1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnN0eWxlLmFkZExheWVyKHQsZSksdGhpcy5fdXBkYXRlKCEwKSx0aGlzfSxlLnByb3RvdHlwZS5tb3ZlTGF5ZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5zdHlsZS5tb3ZlTGF5ZXIodCxlKSx0aGlzLl91cGRhdGUoITApLHRoaXN9LGUucHJvdG90eXBlLnJlbW92ZUxheWVyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnN0eWxlLnJlbW92ZUxheWVyKHQpLHRoaXMuX3VwZGF0ZSghMCksdGhpc30sZS5wcm90b3R5cGUuZ2V0TGF5ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc3R5bGUuZ2V0TGF5ZXIodCl9LGUucHJvdG90eXBlLnNldEZpbHRlcj1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnN0eWxlLnNldEZpbHRlcih0LGUpLHRoaXMuX3VwZGF0ZSghMCksdGhpc30sZS5wcm90b3R5cGUuc2V0TGF5ZXJab29tUmFuZ2U9ZnVuY3Rpb24odCxlLG8pe3JldHVybiB0aGlzLnN0eWxlLnNldExheWVyWm9vbVJhbmdlKHQsZSxvKSx0aGlzLl91cGRhdGUoITApLHRoaXN9LGUucHJvdG90eXBlLmdldEZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zdHlsZS5nZXRGaWx0ZXIodCl9LGUucHJvdG90eXBlLnNldFBhaW50UHJvcGVydHk9ZnVuY3Rpb24odCxlLG8saSl7cmV0dXJuIHRoaXMuc3R5bGUuc2V0UGFpbnRQcm9wZXJ0eSh0LGUsbyxpKSx0aGlzLl91cGRhdGUoITApLHRoaXN9LGUucHJvdG90eXBlLmdldFBhaW50UHJvcGVydHk9ZnVuY3Rpb24odCxlLG8pe3JldHVybiB0aGlzLnN0eWxlLmdldFBhaW50UHJvcGVydHkodCxlLG8pfSxlLnByb3RvdHlwZS5zZXRMYXlvdXRQcm9wZXJ0eT1mdW5jdGlvbih0LGUsbyl7cmV0dXJuIHRoaXMuc3R5bGUuc2V0TGF5b3V0UHJvcGVydHkodCxlLG8pLHRoaXMuX3VwZGF0ZSghMCksdGhpc30sZS5wcm90b3R5cGUuZ2V0TGF5b3V0UHJvcGVydHk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5zdHlsZS5nZXRMYXlvdXRQcm9wZXJ0eSh0LGUpfSxlLnByb3RvdHlwZS5zZXRMaWdodD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zdHlsZS5zZXRMaWdodCh0KSx0aGlzLl91cGRhdGUoITApLHRoaXN9LGUucHJvdG90eXBlLmdldExpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3R5bGUuZ2V0TGlnaHQoKX0sZS5wcm90b3R5cGUuZ2V0Q29udGFpbmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRhaW5lcn0sZS5wcm90b3R5cGUuZ2V0Q2FudmFzQ29udGFpbmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NhbnZhc0NvbnRhaW5lcn0sZS5wcm90b3R5cGUuZ2V0Q2FudmFzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NhbnZhc30sZS5wcm90b3R5cGUuX2NvbnRhaW5lckRpbWVuc2lvbnM9ZnVuY3Rpb24oKXt2YXIgdD0wLGU9MDtyZXR1cm4gdGhpcy5fY29udGFpbmVyJiYodD10aGlzLl9jb250YWluZXIub2Zmc2V0V2lkdGh8fDQwMCxlPXRoaXMuX2NvbnRhaW5lci5vZmZzZXRIZWlnaHR8fDMwMCksW3QsZV19LGUucHJvdG90eXBlLl9zZXR1cENvbnRhaW5lcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NvbnRhaW5lcjt0LmNsYXNzTGlzdC5hZGQoXCJtYXBib3hnbC1tYXBcIik7dmFyIGU9dGhpcy5fY2FudmFzQ29udGFpbmVyPURPTS5jcmVhdGUoXCJkaXZcIixcIm1hcGJveGdsLWNhbnZhcy1jb250YWluZXJcIix0KTt0aGlzLl9pbnRlcmFjdGl2ZSYmZS5jbGFzc0xpc3QuYWRkKFwibWFwYm94Z2wtaW50ZXJhY3RpdmVcIiksdGhpcy5fY2FudmFzPURPTS5jcmVhdGUoXCJjYW52YXNcIixcIm1hcGJveGdsLWNhbnZhc1wiLGUpLHRoaXMuX2NhbnZhcy5zdHlsZS5wb3NpdGlvbj1cImFic29sdXRlXCIsdGhpcy5fY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJ3ZWJnbGNvbnRleHRsb3N0XCIsdGhpcy5fY29udGV4dExvc3QsITEpLHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwid2ViZ2xjb250ZXh0cmVzdG9yZWRcIix0aGlzLl9jb250ZXh0UmVzdG9yZWQsITEpLHRoaXMuX2NhbnZhcy5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLDApLHRoaXMuX2NhbnZhcy5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsXCJNYXBcIik7dmFyIG89dGhpcy5fY29udGFpbmVyRGltZW5zaW9ucygpO3RoaXMuX3Jlc2l6ZUNhbnZhcyhvWzBdLG9bMV0pO3ZhciBpPXRoaXMuX2NvbnRyb2xDb250YWluZXI9RE9NLmNyZWF0ZShcImRpdlwiLFwibWFwYm94Z2wtY29udHJvbC1jb250YWluZXJcIix0KSxyPXRoaXMuX2NvbnRyb2xQb3NpdGlvbnM9e307W1widG9wLWxlZnRcIixcInRvcC1yaWdodFwiLFwiYm90dG9tLWxlZnRcIixcImJvdHRvbS1yaWdodFwiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JbdF09RE9NLmNyZWF0ZShcImRpdlwiLFwibWFwYm94Z2wtY3RybC1cIit0LGkpfSl9LGUucHJvdG90eXBlLl9yZXNpemVDYW52YXM9ZnVuY3Rpb24odCxlKXt2YXIgbz13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8MTt0aGlzLl9jYW52YXMud2lkdGg9byp0LHRoaXMuX2NhbnZhcy5oZWlnaHQ9byplLHRoaXMuX2NhbnZhcy5zdHlsZS53aWR0aD10K1wicHhcIix0aGlzLl9jYW52YXMuc3R5bGUuaGVpZ2h0PWUrXCJweFwifSxlLnByb3RvdHlwZS5fc2V0dXBQYWludGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dXRpbC5leHRlbmQoe2ZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6dGhpcy5fZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCxwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6dGhpcy5fcHJlc2VydmVEcmF3aW5nQnVmZmVyfSxpc1N1cHBvcnRlZC53ZWJHTENvbnRleHRBdHRyaWJ1dGVzKSxlPXRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KFwid2ViZ2xcIix0KXx8dGhpcy5fY2FudmFzLmdldENvbnRleHQoXCJleHBlcmltZW50YWwtd2ViZ2xcIix0KTtyZXR1cm4gZT92b2lkKHRoaXMucGFpbnRlcj1uZXcgUGFpbnRlcihlLHRoaXMudHJhbnNmb3JtKSk6dm9pZCB0aGlzLmZpcmUoXCJlcnJvclwiLHtlcnJvcjpuZXcgRXJyb3IoXCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBXZWJHTFwiKX0pfSxlLnByb3RvdHlwZS5fY29udGV4dExvc3Q9ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2ZyYW1lSWQmJmJyb3dzZXIuY2FuY2VsRnJhbWUodGhpcy5fZnJhbWVJZCksdGhpcy5maXJlKFwid2ViZ2xjb250ZXh0bG9zdFwiLHtvcmlnaW5hbEV2ZW50OnR9KX0sZS5wcm90b3R5cGUuX2NvbnRleHRSZXN0b3JlZD1mdW5jdGlvbih0KXt0aGlzLl9zZXR1cFBhaW50ZXIoKSx0aGlzLnJlc2l6ZSgpLHRoaXMuX3VwZGF0ZSgpLHRoaXMuZmlyZShcIndlYmdsY29udGV4dHJlc3RvcmVkXCIse29yaWdpbmFsRXZlbnQ6dH0pfSxlLnByb3RvdHlwZS5sb2FkZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5fc3R5bGVEaXJ0eSYmIXRoaXMuX3NvdXJjZXNEaXJ0eSYmISghdGhpcy5zdHlsZXx8IXRoaXMuc3R5bGUubG9hZGVkKCkpfSxlLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnN0eWxlPyh0aGlzLl9zdHlsZURpcnR5PXRoaXMuX3N0eWxlRGlydHl8fHQsdGhpcy5fc291cmNlc0RpcnR5PSEwLHRoaXMuX3JlcmVuZGVyKCksdGhpcyk6dGhpc30sZS5wcm90b3R5cGUuX3JlbmRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0eWxlJiZ0aGlzLl9zdHlsZURpcnR5JiYodGhpcy5fc3R5bGVEaXJ0eT0hMSx0aGlzLnN0eWxlLnVwZGF0ZSh0aGlzLl9jbGFzc2VzLHRoaXMuX2NsYXNzT3B0aW9ucyksdGhpcy5fY2xhc3NPcHRpb25zPW51bGwsdGhpcy5zdHlsZS5fcmVjYWxjdWxhdGUodGhpcy50cmFuc2Zvcm0uem9vbSkpLHRoaXMuc3R5bGUmJnRoaXMuX3NvdXJjZXNEaXJ0eSYmKHRoaXMuX3NvdXJjZXNEaXJ0eT0hMSx0aGlzLnN0eWxlLl91cGRhdGVTb3VyY2VzKHRoaXMudHJhbnNmb3JtKSksdGhpcy5wYWludGVyLnJlbmRlcih0aGlzLnN0eWxlLHtzaG93VGlsZUJvdW5kYXJpZXM6dGhpcy5zaG93VGlsZUJvdW5kYXJpZXMsc2hvd092ZXJkcmF3SW5zcGVjdG9yOnRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3Rvcixyb3RhdGluZzp0aGlzLnJvdGF0aW5nLHpvb21pbmc6dGhpcy56b29taW5nfSksdGhpcy5maXJlKFwicmVuZGVyXCIpLHRoaXMubG9hZGVkKCkmJiF0aGlzLl9sb2FkZWQmJih0aGlzLl9sb2FkZWQ9ITAsdGhpcy5maXJlKFwibG9hZFwiKSksdGhpcy5fZnJhbWVJZD1udWxsLHRoaXMuYW5pbWF0aW9uTG9vcC5zdG9wcGVkKCl8fCh0aGlzLl9zdHlsZURpcnR5PSEwKSwodGhpcy5fc291cmNlc0RpcnR5fHx0aGlzLl9yZXBhaW50fHx0aGlzLl9zdHlsZURpcnR5KSYmdGhpcy5fcmVyZW5kZXIoKSx0aGlzfSxlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLl9oYXNoJiZ0aGlzLl9oYXNoLnJlbW92ZSgpLGJyb3dzZXIuY2FuY2VsRnJhbWUodGhpcy5fZnJhbWVJZCksdGhpcy5zZXRTdHlsZShudWxsKSxcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiYod2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIix0aGlzLl9vbldpbmRvd1Jlc2l6ZSwhMSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJvbmxpbmVcIix0aGlzLl9vbldpbmRvd09ubGluZSwhMSkpO3ZhciB0PXRoaXMucGFpbnRlci5nbC5nZXRFeHRlbnNpb24oXCJXRUJHTF9sb3NlX2NvbnRleHRcIik7dCYmdC5sb3NlQ29udGV4dCgpLHJlbW92ZU5vZGUodGhpcy5fY2FudmFzQ29udGFpbmVyKSxyZW1vdmVOb2RlKHRoaXMuX2NvbnRyb2xDb250YWluZXIpLHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKFwibWFwYm94Z2wtbWFwXCIpLHRoaXMuZmlyZShcInJlbW92ZVwiKX0sZS5wcm90b3R5cGUuX3JlcmVuZGVyPWZ1bmN0aW9uKCl7dGhpcy5zdHlsZSYmIXRoaXMuX2ZyYW1lSWQmJih0aGlzLl9mcmFtZUlkPWJyb3dzZXIuZnJhbWUodGhpcy5fcmVuZGVyKSl9LGUucHJvdG90eXBlLl9vbldpbmRvd09ubGluZT1mdW5jdGlvbigpe3RoaXMuX3VwZGF0ZSgpfSxlLnByb3RvdHlwZS5fb25XaW5kb3dSZXNpemU9ZnVuY3Rpb24oKXt0aGlzLl90cmFja1Jlc2l6ZSYmdGhpcy5zdG9wKCkucmVzaXplKCkuX3VwZGF0ZSgpfSxvLnNob3dUaWxlQm91bmRhcmllcy5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuX3Nob3dUaWxlQm91bmRhcmllc30sby5zaG93VGlsZUJvdW5kYXJpZXMuc2V0PWZ1bmN0aW9uKHQpe3RoaXMuX3Nob3dUaWxlQm91bmRhcmllcyE9PXQmJih0aGlzLl9zaG93VGlsZUJvdW5kYXJpZXM9dCx0aGlzLl91cGRhdGUoKSl9LG8uc2hvd0NvbGxpc2lvbkJveGVzLmdldD1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5fc2hvd0NvbGxpc2lvbkJveGVzfSxvLnNob3dDb2xsaXNpb25Cb3hlcy5zZXQ9ZnVuY3Rpb24odCl7dGhpcy5fc2hvd0NvbGxpc2lvbkJveGVzIT09dCYmKHRoaXMuX3Nob3dDb2xsaXNpb25Cb3hlcz10LHRoaXMuc3R5bGUuX3JlZG9QbGFjZW1lbnQoKSl9LG8uc2hvd092ZXJkcmF3SW5zcGVjdG9yLmdldD1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yfSxvLnNob3dPdmVyZHJhd0luc3BlY3Rvci5zZXQ9ZnVuY3Rpb24odCl7dGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yIT09dCYmKHRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3Rvcj10LHRoaXMuX3VwZGF0ZSgpKX0sby5yZXBhaW50LmdldD1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5fcmVwYWludH0sby5yZXBhaW50LnNldD1mdW5jdGlvbih0KXt0aGlzLl9yZXBhaW50PXQsdGhpcy5fdXBkYXRlKCl9LG8udmVydGljZXMuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl92ZXJ0aWNlc30sby52ZXJ0aWNlcy5zZXQ9ZnVuY3Rpb24odCl7dGhpcy5fdmVydGljZXM9dCx0aGlzLl91cGRhdGUoKX0sZS5wcm90b3R5cGUuX29uRGF0YT1mdW5jdGlvbih0KXt0aGlzLl91cGRhdGUoXCJzdHlsZVwiPT09dC5kYXRhVHlwZSksdGhpcy5maXJlKHQuZGF0YVR5cGUrXCJkYXRhXCIsdCl9LGUucHJvdG90eXBlLl9vbkRhdGFMb2FkaW5nPWZ1bmN0aW9uKHQpe3RoaXMuZmlyZSh0LmRhdGFUeXBlK1wiZGF0YWxvYWRpbmdcIix0KX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZS5wcm90b3R5cGUsbyksZX0oQ2FtZXJhKTttb2R1bGUuZXhwb3J0cz1NYXA7XG59LHtcIi4uL2dlby9sbmdfbGF0XCI6NjIsXCIuLi9nZW8vbG5nX2xhdF9ib3VuZHNcIjo2MyxcIi4uL2dlby90cmFuc2Zvcm1cIjo2NCxcIi4uL3JlbmRlci9wYWludGVyXCI6NzcsXCIuLi9zdHlsZS9hbmltYXRpb25fbG9vcFwiOjE0NixcIi4uL3N0eWxlL3N0eWxlXCI6MTQ5LFwiLi4vdXRpbC9hamF4XCI6MTk0LFwiLi4vdXRpbC9icm93c2VyXCI6MTk1LFwiLi4vdXRpbC9kb21cIjoyMDIsXCIuLi91dGlsL3V0aWxcIjoyMTUsXCIuLi91dGlsL3dpbmRvd1wiOjE5NyxcIi4vYmluZF9oYW5kbGVyc1wiOjE3NCxcIi4vY2FtZXJhXCI6MTc1LFwiLi9jb250cm9sL2F0dHJpYnV0aW9uX2NvbnRyb2xcIjoxNzYsXCIuL2NvbnRyb2wvbG9nb19jb250cm9sXCI6MTc5LFwiLi9oYXNoXCI6MTg5LFwibWFwYm94LWdsLXN1cHBvcnRlZFwiOjIyLFwicG9pbnQtZ2VvbWV0cnlcIjoyNn1dLDE5MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgRE9NPV9kZXJlcV8oXCIuLi91dGlsL2RvbVwiKSxMbmdMYXQ9X2RlcmVxXyhcIi4uL2dlby9sbmdfbGF0XCIpLFBvaW50PV9kZXJlcV8oXCJwb2ludC1nZW9tZXRyeVwiKSxzbWFydFdyYXA9X2RlcmVxXyhcIi4uL3V0aWwvc21hcnRfd3JhcFwiKSxNYXJrZXI9ZnVuY3Rpb24odCxlKXt0aGlzLl9vZmZzZXQ9UG9pbnQuY29udmVydChlJiZlLm9mZnNldHx8WzAsMF0pLHRoaXMuX3VwZGF0ZT10aGlzLl91cGRhdGUuYmluZCh0aGlzKSx0aGlzLl9vbk1hcENsaWNrPXRoaXMuX29uTWFwQ2xpY2suYmluZCh0aGlzKSx0fHwodD1ET00uY3JlYXRlKFwiZGl2XCIpKSx0LmNsYXNzTGlzdC5hZGQoXCJtYXBib3hnbC1tYXJrZXJcIiksdGhpcy5fZWxlbWVudD10LHRoaXMuX3BvcHVwPW51bGx9O01hcmtlci5wcm90b3R5cGUuYWRkVG89ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmVtb3ZlKCksdGhpcy5fbWFwPXQsdC5nZXRDYW52YXNDb250YWluZXIoKS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50KSx0Lm9uKFwibW92ZVwiLHRoaXMuX3VwZGF0ZSksdC5vbihcIm1vdmVlbmRcIix0aGlzLl91cGRhdGUpLHRoaXMuX3VwZGF0ZSgpLHRoaXMuX21hcC5vbihcImNsaWNrXCIsdGhpcy5fb25NYXBDbGljayksdGhpc30sTWFya2VyLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwJiYodGhpcy5fbWFwLm9mZihcImNsaWNrXCIsdGhpcy5fb25NYXBDbGljayksdGhpcy5fbWFwLm9mZihcIm1vdmVcIix0aGlzLl91cGRhdGUpLHRoaXMuX21hcC5vZmYoXCJtb3ZlZW5kXCIsdGhpcy5fdXBkYXRlKSx0aGlzLl9tYXA9bnVsbCksRE9NLnJlbW92ZSh0aGlzLl9lbGVtZW50KSx0aGlzLl9wb3B1cCYmdGhpcy5fcG9wdXAucmVtb3ZlKCksdGhpc30sTWFya2VyLnByb3RvdHlwZS5nZXRMbmdMYXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbG5nTGF0fSxNYXJrZXIucHJvdG90eXBlLnNldExuZ0xhdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbG5nTGF0PUxuZ0xhdC5jb252ZXJ0KHQpLHRoaXMuX3Bvcz1udWxsLHRoaXMuX3BvcHVwJiZ0aGlzLl9wb3B1cC5zZXRMbmdMYXQodGhpcy5fbG5nTGF0KSx0aGlzLl91cGRhdGUoKSx0aGlzfSxNYXJrZXIucHJvdG90eXBlLmdldEVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxlbWVudH0sTWFya2VyLnByb3RvdHlwZS5zZXRQb3B1cD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcG9wdXAmJih0aGlzLl9wb3B1cC5yZW1vdmUoKSx0aGlzLl9wb3B1cD1udWxsKSx0JiYodGhpcy5fcG9wdXA9dCx0aGlzLl9wb3B1cC5zZXRMbmdMYXQodGhpcy5fbG5nTGF0KSksdGhpc30sTWFya2VyLnByb3RvdHlwZS5fb25NYXBDbGljaz1mdW5jdGlvbih0KXt2YXIgZT10Lm9yaWdpbmFsRXZlbnQudGFyZ2V0LHA9dGhpcy5fZWxlbWVudDt0aGlzLl9wb3B1cCYmKGU9PT1wfHxwLmNvbnRhaW5zKGUpKSYmdGhpcy50b2dnbGVQb3B1cCgpfSxNYXJrZXIucHJvdG90eXBlLmdldFBvcHVwPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BvcHVwfSxNYXJrZXIucHJvdG90eXBlLnRvZ2dsZVBvcHVwPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcG9wdXA7dCYmKHQuaXNPcGVuKCk/dC5yZW1vdmUoKTp0LmFkZFRvKHRoaXMuX21hcCkpfSxNYXJrZXIucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCl7dGhpcy5fbWFwJiYodGhpcy5fbWFwLnRyYW5zZm9ybS5yZW5kZXJXb3JsZENvcGllcyYmKHRoaXMuX2xuZ0xhdD1zbWFydFdyYXAodGhpcy5fbG5nTGF0LHRoaXMuX3Bvcyx0aGlzLl9tYXAudHJhbnNmb3JtKSksdGhpcy5fcG9zPXRoaXMuX21hcC5wcm9qZWN0KHRoaXMuX2xuZ0xhdCkuX2FkZCh0aGlzLl9vZmZzZXQpLHQmJlwibW92ZWVuZFwiIT09dC50eXBlfHwodGhpcy5fcG9zPXRoaXMuX3Bvcy5yb3VuZCgpKSxET00uc2V0VHJhbnNmb3JtKHRoaXMuX2VsZW1lbnQsXCJ0cmFuc2xhdGUoXCIrdGhpcy5fcG9zLngrXCJweCwgXCIrdGhpcy5fcG9zLnkrXCJweClcIikpfSxtb2R1bGUuZXhwb3J0cz1NYXJrZXI7XG59LHtcIi4uL2dlby9sbmdfbGF0XCI6NjIsXCIuLi91dGlsL2RvbVwiOjIwMixcIi4uL3V0aWwvc21hcnRfd3JhcFwiOjIxMixcInBvaW50LWdlb21ldHJ5XCI6MjZ9XSwxOTI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbm9ybWFsaXplT2Zmc2V0KHQpe2lmKHQpe2lmKFwibnVtYmVyXCI9PXR5cGVvZiB0KXt2YXIgbz1NYXRoLnJvdW5kKE1hdGguc3FydCguNSpNYXRoLnBvdyh0LDIpKSk7cmV0dXJue3RvcDpuZXcgUG9pbnQoMCx0KSxcInRvcC1sZWZ0XCI6bmV3IFBvaW50KG8sbyksXCJ0b3AtcmlnaHRcIjpuZXcgUG9pbnQoLW8sbyksYm90dG9tOm5ldyBQb2ludCgwLC10KSxcImJvdHRvbS1sZWZ0XCI6bmV3IFBvaW50KG8sLW8pLFwiYm90dG9tLXJpZ2h0XCI6bmV3IFBvaW50KC1vLC1vKSxsZWZ0Om5ldyBQb2ludCh0LDApLHJpZ2h0Om5ldyBQb2ludCgtdCwwKX19aWYoaXNQb2ludExpa2UodCkpe3ZhciBlPVBvaW50LmNvbnZlcnQodCk7cmV0dXJue3RvcDplLFwidG9wLWxlZnRcIjplLFwidG9wLXJpZ2h0XCI6ZSxib3R0b206ZSxcImJvdHRvbS1sZWZ0XCI6ZSxcImJvdHRvbS1yaWdodFwiOmUsbGVmdDplLHJpZ2h0OmV9fXJldHVybnt0b3A6UG9pbnQuY29udmVydCh0LnRvcHx8WzAsMF0pLFwidG9wLWxlZnRcIjpQb2ludC5jb252ZXJ0KHRbXCJ0b3AtbGVmdFwiXXx8WzAsMF0pLFwidG9wLXJpZ2h0XCI6UG9pbnQuY29udmVydCh0W1widG9wLXJpZ2h0XCJdfHxbMCwwXSksYm90dG9tOlBvaW50LmNvbnZlcnQodC5ib3R0b218fFswLDBdKSxcImJvdHRvbS1sZWZ0XCI6UG9pbnQuY29udmVydCh0W1wiYm90dG9tLWxlZnRcIl18fFswLDBdKSxcImJvdHRvbS1yaWdodFwiOlBvaW50LmNvbnZlcnQodFtcImJvdHRvbS1yaWdodFwiXXx8WzAsMF0pLGxlZnQ6UG9pbnQuY29udmVydCh0LmxlZnR8fFswLDBdKSxyaWdodDpQb2ludC5jb252ZXJ0KHQucmlnaHR8fFswLDBdKX19cmV0dXJuIG5vcm1hbGl6ZU9mZnNldChuZXcgUG9pbnQoMCwwKSl9ZnVuY3Rpb24gaXNQb2ludExpa2UodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBQb2ludHx8QXJyYXkuaXNBcnJheSh0KX12YXIgdXRpbD1fZGVyZXFfKFwiLi4vdXRpbC91dGlsXCIpLEV2ZW50ZWQ9X2RlcmVxXyhcIi4uL3V0aWwvZXZlbnRlZFwiKSxET009X2RlcmVxXyhcIi4uL3V0aWwvZG9tXCIpLExuZ0xhdD1fZGVyZXFfKFwiLi4vZ2VvL2xuZ19sYXRcIiksUG9pbnQ9X2RlcmVxXyhcInBvaW50LWdlb21ldHJ5XCIpLHdpbmRvdz1fZGVyZXFfKFwiLi4vdXRpbC93aW5kb3dcIiksc21hcnRXcmFwPV9kZXJlcV8oXCIuLi91dGlsL3NtYXJ0X3dyYXBcIiksZGVmYXVsdE9wdGlvbnM9e2Nsb3NlQnV0dG9uOiEwLGNsb3NlT25DbGljazohMH0sUG9wdXA9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbyhvKXt0LmNhbGwodGhpcyksdGhpcy5vcHRpb25zPXV0aWwuZXh0ZW5kKE9iamVjdC5jcmVhdGUoZGVmYXVsdE9wdGlvbnMpLG8pLHV0aWwuYmluZEFsbChbXCJfdXBkYXRlXCIsXCJfb25DbGlja0Nsb3NlXCJdLHRoaXMpfXJldHVybiB0JiYoby5fX3Byb3RvX189dCksby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSksby5wcm90b3R5cGUuY29uc3RydWN0b3I9byxvLnByb3RvdHlwZS5hZGRUbz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbWFwPXQsdGhpcy5fbWFwLm9uKFwibW92ZVwiLHRoaXMuX3VwZGF0ZSksdGhpcy5vcHRpb25zLmNsb3NlT25DbGljayYmdGhpcy5fbWFwLm9uKFwiY2xpY2tcIix0aGlzLl9vbkNsaWNrQ2xvc2UpLHRoaXMuX3VwZGF0ZSgpLHRoaXN9LG8ucHJvdG90eXBlLmlzT3Blbj1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5fbWFwfSxvLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGVudCYmdGhpcy5fY29udGVudC5wYXJlbnROb2RlJiZ0aGlzLl9jb250ZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fY29udGVudCksdGhpcy5fY29udGFpbmVyJiYodGhpcy5fY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fY29udGFpbmVyKSxkZWxldGUgdGhpcy5fY29udGFpbmVyKSx0aGlzLl9tYXAmJih0aGlzLl9tYXAub2ZmKFwibW92ZVwiLHRoaXMuX3VwZGF0ZSksdGhpcy5fbWFwLm9mZihcImNsaWNrXCIsdGhpcy5fb25DbGlja0Nsb3NlKSxkZWxldGUgdGhpcy5fbWFwKSx0aGlzLmZpcmUoXCJjbG9zZVwiKSx0aGlzfSxvLnByb3RvdHlwZS5nZXRMbmdMYXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbG5nTGF0fSxvLnByb3RvdHlwZS5zZXRMbmdMYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2xuZ0xhdD1MbmdMYXQuY29udmVydCh0KSx0aGlzLl9wb3M9bnVsbCx0aGlzLl91cGRhdGUoKSx0aGlzfSxvLnByb3RvdHlwZS5zZXRUZXh0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNldERPTUNvbnRlbnQod2luZG93LmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHQpKX0sby5wcm90b3R5cGUuc2V0SFRNTD1mdW5jdGlvbih0KXt2YXIgbyxlPXdpbmRvdy5kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksbj13aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJvZHlcIik7Zm9yKG4uaW5uZXJIVE1MPXQ7Oyl7aWYobz1uLmZpcnN0Q2hpbGQsIW8pYnJlYWs7ZS5hcHBlbmRDaGlsZChvKX1yZXR1cm4gdGhpcy5zZXRET01Db250ZW50KGUpfSxvLnByb3RvdHlwZS5zZXRET01Db250ZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jcmVhdGVDb250ZW50KCksdGhpcy5fY29udGVudC5hcHBlbmRDaGlsZCh0KSx0aGlzLl91cGRhdGUoKSx0aGlzfSxvLnByb3RvdHlwZS5fY3JlYXRlQ29udGVudD1mdW5jdGlvbigpe3RoaXMuX2NvbnRlbnQmJnRoaXMuX2NvbnRlbnQucGFyZW50Tm9kZSYmdGhpcy5fY29udGVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2NvbnRlbnQpLHRoaXMuX2NvbnRlbnQ9RE9NLmNyZWF0ZShcImRpdlwiLFwibWFwYm94Z2wtcG9wdXAtY29udGVudFwiLHRoaXMuX2NvbnRhaW5lciksdGhpcy5vcHRpb25zLmNsb3NlQnV0dG9uJiYodGhpcy5fY2xvc2VCdXR0b249RE9NLmNyZWF0ZShcImJ1dHRvblwiLFwibWFwYm94Z2wtcG9wdXAtY2xvc2UtYnV0dG9uXCIsdGhpcy5fY29udGVudCksdGhpcy5fY2xvc2VCdXR0b24udHlwZT1cImJ1dHRvblwiLHRoaXMuX2Nsb3NlQnV0dG9uLmlubmVySFRNTD1cIiYjMjE1O1wiLHRoaXMuX2Nsb3NlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLHRoaXMuX29uQ2xpY2tDbG9zZSkpfSxvLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKCl7aWYodGhpcy5fbWFwJiZ0aGlzLl9sbmdMYXQmJnRoaXMuX2NvbnRlbnQpe3RoaXMuX2NvbnRhaW5lcnx8KHRoaXMuX2NvbnRhaW5lcj1ET00uY3JlYXRlKFwiZGl2XCIsXCJtYXBib3hnbC1wb3B1cFwiLHRoaXMuX21hcC5nZXRDb250YWluZXIoKSksdGhpcy5fdGlwPURPTS5jcmVhdGUoXCJkaXZcIixcIm1hcGJveGdsLXBvcHVwLXRpcFwiLHRoaXMuX2NvbnRhaW5lciksdGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX2NvbnRlbnQpKSx0aGlzLl9tYXAudHJhbnNmb3JtLnJlbmRlcldvcmxkQ29waWVzJiYodGhpcy5fbG5nTGF0PXNtYXJ0V3JhcCh0aGlzLl9sbmdMYXQsdGhpcy5fcG9zLHRoaXMuX21hcC50cmFuc2Zvcm0pKSx0aGlzLl9wb3M9dGhpcy5fbWFwLnByb2plY3QodGhpcy5fbG5nTGF0KTt2YXIgdD10aGlzLm9wdGlvbnMuYW5jaG9yLG89bm9ybWFsaXplT2Zmc2V0KHRoaXMub3B0aW9ucy5vZmZzZXQpO2lmKCF0KXt2YXIgZT10aGlzLl9jb250YWluZXIub2Zmc2V0V2lkdGgsbj10aGlzLl9jb250YWluZXIub2Zmc2V0SGVpZ2h0O3Q9dGhpcy5fcG9zLnkrby5ib3R0b20ueTxuP1tcInRvcFwiXTp0aGlzLl9wb3MueT50aGlzLl9tYXAudHJhbnNmb3JtLmhlaWdodC1uP1tcImJvdHRvbVwiXTpbXSx0aGlzLl9wb3MueDxlLzI/dC5wdXNoKFwibGVmdFwiKTp0aGlzLl9wb3MueD50aGlzLl9tYXAudHJhbnNmb3JtLndpZHRoLWUvMiYmdC5wdXNoKFwicmlnaHRcIiksdD0wPT09dC5sZW5ndGg/XCJib3R0b21cIjp0LmpvaW4oXCItXCIpfXZhciBpPXRoaXMuX3Bvcy5hZGQob1t0XSkucm91bmQoKSxyPXt0b3A6XCJ0cmFuc2xhdGUoLTUwJSwwKVwiLFwidG9wLWxlZnRcIjpcInRyYW5zbGF0ZSgwLDApXCIsXCJ0b3AtcmlnaHRcIjpcInRyYW5zbGF0ZSgtMTAwJSwwKVwiLGJvdHRvbTpcInRyYW5zbGF0ZSgtNTAlLC0xMDAlKVwiLFwiYm90dG9tLWxlZnRcIjpcInRyYW5zbGF0ZSgwLC0xMDAlKVwiLFwiYm90dG9tLXJpZ2h0XCI6XCJ0cmFuc2xhdGUoLTEwMCUsLTEwMCUpXCIsbGVmdDpcInRyYW5zbGF0ZSgwLC01MCUpXCIscmlnaHQ6XCJ0cmFuc2xhdGUoLTEwMCUsLTUwJSlcIn0scz10aGlzLl9jb250YWluZXIuY2xhc3NMaXN0O2Zvcih2YXIgcCBpbiByKXMucmVtb3ZlKFwibWFwYm94Z2wtcG9wdXAtYW5jaG9yLVwiK3ApO3MuYWRkKFwibWFwYm94Z2wtcG9wdXAtYW5jaG9yLVwiK3QpLERPTS5zZXRUcmFuc2Zvcm0odGhpcy5fY29udGFpbmVyLHJbdF0rXCIgdHJhbnNsYXRlKFwiK2kueCtcInB4LFwiK2kueStcInB4KVwiKX19LG8ucHJvdG90eXBlLl9vbkNsaWNrQ2xvc2U9ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZSgpfSxvfShFdmVudGVkKTttb2R1bGUuZXhwb3J0cz1Qb3B1cDtcbn0se1wiLi4vZ2VvL2xuZ19sYXRcIjo2MixcIi4uL3V0aWwvZG9tXCI6MjAyLFwiLi4vdXRpbC9ldmVudGVkXCI6MjAzLFwiLi4vdXRpbC9zbWFydF93cmFwXCI6MjEyLFwiLi4vdXRpbC91dGlsXCI6MjE1LFwiLi4vdXRpbC93aW5kb3dcIjoxOTcsXCJwb2ludC1nZW9tZXRyeVwiOjI2fV0sMTkzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBBY3Rvcj1mdW5jdGlvbih0LGUsYSl7dGhpcy50YXJnZXQ9dCx0aGlzLnBhcmVudD1lLHRoaXMubWFwSWQ9YSx0aGlzLmNhbGxiYWNrcz17fSx0aGlzLmNhbGxiYWNrSUQ9MCx0aGlzLnJlY2VpdmU9dGhpcy5yZWNlaXZlLmJpbmQodGhpcyksdGhpcy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIix0aGlzLnJlY2VpdmUsITEpfTtBY3Rvci5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbih0LGUsYSxyLHMpe3ZhciBpPWE/dGhpcy5tYXBJZCtcIjpcIit0aGlzLmNhbGxiYWNrSUQrKzpudWxsO2EmJih0aGlzLmNhbGxiYWNrc1tpXT1hKSx0aGlzLnRhcmdldC5wb3N0TWVzc2FnZSh7dGFyZ2V0TWFwSWQ6cyxzb3VyY2VNYXBJZDp0aGlzLm1hcElkLHR5cGU6dCxpZDpTdHJpbmcoaSksZGF0YTplfSxyKX0sQWN0b3IucHJvdG90eXBlLnJlY2VpdmU9ZnVuY3Rpb24odCl7dmFyIGUsYT10aGlzLHI9dC5kYXRhLHM9ci5pZDtpZighci50YXJnZXRNYXBJZHx8dGhpcy5tYXBJZD09PXIudGFyZ2V0TWFwSWQpe3ZhciBpPWZ1bmN0aW9uKHQsZSxyKXthLnRhcmdldC5wb3N0TWVzc2FnZSh7c291cmNlTWFwSWQ6YS5tYXBJZCx0eXBlOlwiPHJlc3BvbnNlPlwiLGlkOlN0cmluZyhzKSxlcnJvcjp0P1N0cmluZyh0KTpudWxsLGRhdGE6ZX0scil9O2lmKFwiPHJlc3BvbnNlPlwiPT09ci50eXBlKWU9dGhpcy5jYWxsYmFja3Nbci5pZF0sZGVsZXRlIHRoaXMuY2FsbGJhY2tzW3IuaWRdLGUmJmUoci5lcnJvcnx8bnVsbCxyLmRhdGEpO2Vsc2UgaWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHIuaWQmJnRoaXMucGFyZW50W3IudHlwZV0pdGhpcy5wYXJlbnRbci50eXBlXShyLnNvdXJjZU1hcElkLHIuZGF0YSxpKTtlbHNlIGlmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiByLmlkJiZ0aGlzLnBhcmVudC5nZXRXb3JrZXJTb3VyY2Upe3ZhciBwPXIudHlwZS5zcGxpdChcIi5cIiksZD10aGlzLnBhcmVudC5nZXRXb3JrZXJTb3VyY2Uoci5zb3VyY2VNYXBJZCxwWzBdKTtkW3BbMV1dKHIuZGF0YSxpKX1lbHNlIHRoaXMucGFyZW50W3IudHlwZV0oci5kYXRhKX19LEFjdG9yLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLHRoaXMucmVjZWl2ZSwhMSl9LG1vZHVsZS5leHBvcnRzPUFjdG9yO1xufSx7fV0sMTk0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIHNhbWVPcmlnaW4oZSl7dmFyIHQ9d2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO3JldHVybiB0LmhyZWY9ZSx0LnByb3RvY29sPT09d2luZG93LmRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sJiZ0Lmhvc3Q9PT13aW5kb3cuZG9jdW1lbnQubG9jYXRpb24uaG9zdH12YXIgd2luZG93PV9kZXJlcV8oXCIuL3dpbmRvd1wiKSxBSkFYRXJyb3I9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0LHIpe2UuY2FsbCh0aGlzLHQpLHRoaXMuc3RhdHVzPXJ9cmV0dXJuIGUmJih0Ll9fcHJvdG9fXz1lKSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlKSx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10LHR9KEVycm9yKTtleHBvcnRzLmdldEpTT049ZnVuY3Rpb24oZSx0KXt2YXIgcj1uZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0O3JldHVybiByLm9wZW4oXCJHRVRcIixlLCEwKSxyLnNldFJlcXVlc3RIZWFkZXIoXCJBY2NlcHRcIixcImFwcGxpY2F0aW9uL2pzb25cIiksci5vbmVycm9yPWZ1bmN0aW9uKGUpe3QoZSl9LHIub25sb2FkPWZ1bmN0aW9uKCl7aWYoci5zdGF0dXM+PTIwMCYmci5zdGF0dXM8MzAwJiZyLnJlc3BvbnNlKXt2YXIgZTt0cnl7ZT1KU09OLnBhcnNlKHIucmVzcG9uc2UpfWNhdGNoKGUpe3JldHVybiB0KGUpfXQobnVsbCxlKX1lbHNlIHQobmV3IEFKQVhFcnJvcihyLnN0YXR1c1RleHQsci5zdGF0dXMpKX0sci5zZW5kKCkscn0sZXhwb3J0cy5nZXRBcnJheUJ1ZmZlcj1mdW5jdGlvbihlLHQpe3ZhciByPW5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3Q7cmV0dXJuIHIub3BlbihcIkdFVFwiLGUsITApLHIucmVzcG9uc2VUeXBlPVwiYXJyYXlidWZmZXJcIixyLm9uZXJyb3I9ZnVuY3Rpb24oZSl7dChlKX0sci5vbmxvYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXIucmVzcG9uc2UuYnl0ZUxlbmd0aCYmMjAwPT09ci5zdGF0dXM/dChuZXcgRXJyb3IoXCJodHRwIHN0YXR1cyAyMDAgcmV0dXJuZWQgd2l0aG91dCBjb250ZW50LlwiKSk6dm9pZChyLnN0YXR1cz49MjAwJiZyLnN0YXR1czwzMDAmJnIucmVzcG9uc2U/dChudWxsLHtkYXRhOnIucmVzcG9uc2UsY2FjaGVDb250cm9sOnIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJDYWNoZS1Db250cm9sXCIpLGV4cGlyZXM6ci5nZXRSZXNwb25zZUhlYWRlcihcIkV4cGlyZXNcIil9KTp0KG5ldyBBSkFYRXJyb3Ioci5zdGF0dXNUZXh0LHIuc3RhdHVzKSkpfSxyLnNlbmQoKSxyfTt2YXIgdHJhbnNwYXJlbnRQbmdVcmw9XCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFFQUFBQUJDQVlBQUFBZkZjU0pBQUFBQzBsRVFWUVlWMk5nQUFJQUFBVUFBYXJWeUZFQUFBQUFTVVZPUks1Q1lJST1cIjtleHBvcnRzLmdldEltYWdlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGV4cG9ydHMuZ2V0QXJyYXlCdWZmZXIoZSxmdW5jdGlvbihlLHIpe2lmKGUpcmV0dXJuIHQoZSk7dmFyIG49bmV3IHdpbmRvdy5JbWFnZSxvPXdpbmRvdy5VUkx8fHdpbmRvdy53ZWJraXRVUkw7bi5vbmxvYWQ9ZnVuY3Rpb24oKXt0KG51bGwsbiksby5yZXZva2VPYmplY3RVUkwobi5zcmMpfTt2YXIgcz1uZXcgd2luZG93LkJsb2IoW25ldyBVaW50OEFycmF5KHIuZGF0YSldLHt0eXBlOlwiaW1hZ2UvcG5nXCJ9KTtuLmNhY2hlQ29udHJvbD1yLmNhY2hlQ29udHJvbCxuLmV4cGlyZXM9ci5leHBpcmVzLG4uc3JjPXIuZGF0YS5ieXRlTGVuZ3RoP28uY3JlYXRlT2JqZWN0VVJMKHMpOnRyYW5zcGFyZW50UG5nVXJsfSl9LGV4cG9ydHMuZ2V0VmlkZW89ZnVuY3Rpb24oZSx0KXt2YXIgcj13aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInZpZGVvXCIpO3Iub25sb2Fkc3RhcnQ9ZnVuY3Rpb24oKXt0KG51bGwscil9O2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgbz13aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNvdXJjZVwiKTtzYW1lT3JpZ2luKGVbbl0pfHwoci5jcm9zc09yaWdpbj1cIkFub255bW91c1wiKSxvLnNyYz1lW25dLHIuYXBwZW5kQ2hpbGQobyl9cmV0dXJuIHJ9O1xufSx7XCIuL3dpbmRvd1wiOjE5N31dLDE5NTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgd2luZG93PV9kZXJlcV8oXCIuL3dpbmRvd1wiKTttb2R1bGUuZXhwb3J0cy5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LnBlcmZvcm1hbmNlJiZ3aW5kb3cucGVyZm9ybWFuY2Uubm93P3dpbmRvdy5wZXJmb3JtYW5jZS5ub3cuYmluZCh3aW5kb3cucGVyZm9ybWFuY2UpOkRhdGUubm93LmJpbmQoRGF0ZSl9KCk7dmFyIGZyYW1lPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZTtleHBvcnRzLmZyYW1lPWZ1bmN0aW9uKGUpe3JldHVybiBmcmFtZShlKX07dmFyIGNhbmNlbD13aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pDYW5jZWxBbmltYXRpb25GcmFtZXx8d2luZG93LndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubXNDYW5jZWxBbmltYXRpb25GcmFtZTtleHBvcnRzLmNhbmNlbEZyYW1lPWZ1bmN0aW9uKGUpe2NhbmNlbChlKX0sZXhwb3J0cy50aW1lZD1mdW5jdGlvbihlLG4sdCl7ZnVuY3Rpb24gbyhpKXtyfHwoaT1tb2R1bGUuZXhwb3J0cy5ub3coKSxpPj1hK24/ZS5jYWxsKHQsMSk6KGUuY2FsbCh0LChpLWEpL24pLGV4cG9ydHMuZnJhbWUobykpKX1pZighbilyZXR1cm4gZS5jYWxsKHQsMSksbnVsbDt2YXIgcj0hMSxhPW1vZHVsZS5leHBvcnRzLm5vdygpO3JldHVybiBleHBvcnRzLmZyYW1lKG8pLGZ1bmN0aW9uKCl7cj0hMH19LGV4cG9ydHMuZ2V0SW1hZ2VEYXRhPWZ1bmN0aW9uKGUpe3ZhciBuPXdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLHQ9bi5nZXRDb250ZXh0KFwiMmRcIik7cmV0dXJuIG4ud2lkdGg9ZS53aWR0aCxuLmhlaWdodD1lLmhlaWdodCx0LmRyYXdJbWFnZShlLDAsMCxlLndpZHRoLGUuaGVpZ2h0KSx0LmdldEltYWdlRGF0YSgwLDAsZS53aWR0aCxlLmhlaWdodCkuZGF0YX0sZXhwb3J0cy5zdXBwb3J0ZWQ9X2RlcmVxXyhcIm1hcGJveC1nbC1zdXBwb3J0ZWRcIiksZXhwb3J0cy5oYXJkd2FyZUNvbmN1cnJlbmN5PXdpbmRvdy5uYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeXx8NCxPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cyxcImRldmljZVBpeGVsUmF0aW9cIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfX0pLGV4cG9ydHMuc3VwcG9ydHNXZWJwPSExO3ZhciB3ZWJwSW1nVGVzdD13aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTt3ZWJwSW1nVGVzdC5vbmxvYWQ9ZnVuY3Rpb24oKXtleHBvcnRzLnN1cHBvcnRzV2VicD0hMH0sd2VicEltZ1Rlc3Quc3JjPVwiZGF0YTppbWFnZS93ZWJwO2Jhc2U2NCxVa2xHUmg0QUFBQlhSVUpRVmxBNFRCRUFBQUF2QVFBQUFBZlEvLzczdi8rQmlPaC9BQUE9XCI7XG59LHtcIi4vd2luZG93XCI6MTk3LFwibWFwYm94LWdsLXN1cHBvcnRlZFwiOjIyfV0sMTk2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciBXZWJXb3JraWZ5PV9kZXJlcV8oXCJ3ZWJ3b3JraWZ5XCIpLHdpbmRvdz1fZGVyZXFfKFwiLi4vd2luZG93XCIpLHdvcmtlclVSTD13aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgV2ViV29ya2lmeShfZGVyZXFfKFwiLi4vLi4vc291cmNlL3dvcmtlclwiKSx7YmFyZTohMH0pKTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbigpe3JldHVybiBuZXcgd2luZG93Lldvcmtlcih3b3JrZXJVUkwpfTtcbn0se1wiLi4vLi4vc291cmNlL3dvcmtlclwiOjEwMCxcIi4uL3dpbmRvd1wiOjE5NyxcIndlYndvcmtpZnlcIjo0MX1dLDE5NzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjttb2R1bGUuZXhwb3J0cz1zZWxmO1xufSx7fV0sMTk4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGNvbXBhcmVBcmVhcyhlLHIpe3JldHVybiByLmFyZWEtZS5hcmVhfXZhciBxdWlja3NlbGVjdD1fZGVyZXFfKFwicXVpY2tzZWxlY3RcIiksY2FsY3VsYXRlU2lnbmVkQXJlYT1fZGVyZXFfKFwiLi91dGlsXCIpLmNhbGN1bGF0ZVNpZ25lZEFyZWE7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oZSxyKXt2YXIgYT1lLmxlbmd0aDtpZihhPD0xKXJldHVybltlXTtmb3IodmFyIHQsdSxjPVtdLGk9MDtpPGE7aSsrKXt2YXIgbD1jYWxjdWxhdGVTaWduZWRBcmVhKGVbaV0pOzAhPT1sJiYoZVtpXS5hcmVhPU1hdGguYWJzKGwpLHZvaWQgMD09PXUmJih1PWw8MCksdT09PWw8MD8odCYmYy5wdXNoKHQpLHQ9W2VbaV1dKTp0LnB1c2goZVtpXSkpfWlmKHQmJmMucHVzaCh0KSxyPjEpZm9yKHZhciBuPTA7bjxjLmxlbmd0aDtuKyspY1tuXS5sZW5ndGg8PXJ8fChxdWlja3NlbGVjdChjW25dLHIsMSxjW25dLmxlbmd0aC0xLGNvbXBhcmVBcmVhcyksY1tuXT1jW25dLnNsaWNlKDAscikpO3JldHVybiBjfTtcbn0se1wiLi91dGlsXCI6MjE1LFwicXVpY2tzZWxlY3RcIjoyOH1dLDE5OTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgY29uZmlnPXtBUElfVVJMOlwiaHR0cHM6Ly9hcGkubWFwYm94LmNvbVwiLFJFUVVJUkVfQUNDRVNTX1RPS0VOOiEwLEFDQ0VTU19UT0tFTjpudWxsfTttb2R1bGUuZXhwb3J0cz1jb25maWc7XG59LHt9XSwyMDA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIERpY3Rpb25hcnlDb2Rlcj1mdW5jdGlvbihyKXt2YXIgdD10aGlzO3RoaXMuX3N0cmluZ1RvTnVtYmVyPXt9LHRoaXMuX251bWJlclRvU3RyaW5nPVtdO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXt2YXIgaT1yW29dO3QuX3N0cmluZ1RvTnVtYmVyW2ldPW8sdC5fbnVtYmVyVG9TdHJpbmdbb109aX19O0RpY3Rpb25hcnlDb2Rlci5wcm90b3R5cGUuZW5jb2RlPWZ1bmN0aW9uKHIpe3JldHVybiB0aGlzLl9zdHJpbmdUb051bWJlcltyXX0sRGljdGlvbmFyeUNvZGVyLnByb3RvdHlwZS5kZWNvZGU9ZnVuY3Rpb24ocil7cmV0dXJuIHRoaXMuX251bWJlclRvU3RyaW5nW3JdfSxtb2R1bGUuZXhwb3J0cz1EaWN0aW9uYXJ5Q29kZXI7XG59LHt9XSwyMDE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIHV0aWw9X2RlcmVxXyhcIi4vdXRpbFwiKSxBY3Rvcj1fZGVyZXFfKFwiLi9hY3RvclwiKSxEaXNwYXRjaGVyPWZ1bmN0aW9uKHQscil7dmFyIG89dGhpczt0aGlzLndvcmtlclBvb2w9dCx0aGlzLmFjdG9ycz1bXSx0aGlzLmN1cnJlbnRBY3Rvcj0wLHRoaXMuaWQ9dXRpbC51bmlxdWVJZCgpO2Zvcih2YXIgaT10aGlzLndvcmtlclBvb2wuYWNxdWlyZSh0aGlzLmlkKSxlPTA7ZTxpLmxlbmd0aDtlKyspe3ZhciBzPWlbZV0sYz1uZXcgQWN0b3IocyxyLG8uaWQpO2MubmFtZT1cIldvcmtlciBcIitlLG8uYWN0b3JzLnB1c2goYyl9fTtEaXNwYXRjaGVyLnByb3RvdHlwZS5icm9hZGNhc3Q9ZnVuY3Rpb24odCxyLG8pe289b3x8ZnVuY3Rpb24oKXt9LHV0aWwuYXN5bmNBbGwodGhpcy5hY3RvcnMsZnVuY3Rpb24obyxpKXtvLnNlbmQodCxyLGkpfSxvKX0sRGlzcGF0Y2hlci5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbih0LHIsbyxpLGUpe3JldHVybihcIm51bWJlclwiIT10eXBlb2YgaXx8aXNOYU4oaSkpJiYoaT10aGlzLmN1cnJlbnRBY3Rvcj0odGhpcy5jdXJyZW50QWN0b3IrMSkldGhpcy5hY3RvcnMubGVuZ3RoKSx0aGlzLmFjdG9yc1tpXS5zZW5kKHQscixvLGUpLGl9LERpc3BhdGNoZXIucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuYWN0b3JzLmZvckVhY2goZnVuY3Rpb24odCl7dC5yZW1vdmUoKX0pLHRoaXMuYWN0b3JzPVtdLHRoaXMud29ya2VyUG9vbC5yZWxlYXNlKHRoaXMuaWQpfSxtb2R1bGUuZXhwb3J0cz1EaXNwYXRjaGVyO1xufSx7XCIuL2FjdG9yXCI6MTkzLFwiLi91dGlsXCI6MjE1fV0sMjAyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIHRlc3RQcm9wKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKWlmKGVbdF1pbiBkb2NTdHlsZSlyZXR1cm4gZVt0XTtyZXR1cm4gZVswXX1mdW5jdGlvbiBzdXBwcmVzc0NsaWNrKGUpe2UucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIixzdXBwcmVzc0NsaWNrLCEwKX12YXIgUG9pbnQ9X2RlcmVxXyhcInBvaW50LWdlb21ldHJ5XCIpLHdpbmRvdz1fZGVyZXFfKFwiLi93aW5kb3dcIik7ZXhwb3J0cy5jcmVhdGU9ZnVuY3Rpb24oZSx0LG8pe3ZhciBuPXdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpO3JldHVybiB0JiYobi5jbGFzc05hbWU9dCksbyYmby5hcHBlbmRDaGlsZChuKSxufTt2YXIgZG9jU3R5bGU9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSxzZWxlY3RQcm9wPXRlc3RQcm9wKFtcInVzZXJTZWxlY3RcIixcIk1velVzZXJTZWxlY3RcIixcIldlYmtpdFVzZXJTZWxlY3RcIixcIm1zVXNlclNlbGVjdFwiXSksdXNlclNlbGVjdDtleHBvcnRzLmRpc2FibGVEcmFnPWZ1bmN0aW9uKCl7c2VsZWN0UHJvcCYmKHVzZXJTZWxlY3Q9ZG9jU3R5bGVbc2VsZWN0UHJvcF0sZG9jU3R5bGVbc2VsZWN0UHJvcF09XCJub25lXCIpfSxleHBvcnRzLmVuYWJsZURyYWc9ZnVuY3Rpb24oKXtzZWxlY3RQcm9wJiYoZG9jU3R5bGVbc2VsZWN0UHJvcF09dXNlclNlbGVjdCl9O3ZhciB0cmFuc2Zvcm1Qcm9wPXRlc3RQcm9wKFtcInRyYW5zZm9ybVwiLFwiV2Via2l0VHJhbnNmb3JtXCJdKTtleHBvcnRzLnNldFRyYW5zZm9ybT1mdW5jdGlvbihlLHQpe2Uuc3R5bGVbdHJhbnNmb3JtUHJvcF09dH0sZXhwb3J0cy5zdXBwcmVzc0NsaWNrPWZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLHN1cHByZXNzQ2xpY2ssITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLHN1cHByZXNzQ2xpY2ssITApfSwwKX0sZXhwb3J0cy5tb3VzZVBvcz1mdW5jdGlvbihlLHQpe3ZhciBvPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuIHQ9dC50b3VjaGVzP3QudG91Y2hlc1swXTp0LG5ldyBQb2ludCh0LmNsaWVudFgtby5sZWZ0LWUuY2xpZW50TGVmdCx0LmNsaWVudFktby50b3AtZS5jbGllbnRUb3ApfSxleHBvcnRzLnRvdWNoUG9zPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBvPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1bXSxyPVwidG91Y2hlbmRcIj09PXQudHlwZT90LmNoYW5nZWRUb3VjaGVzOnQudG91Y2hlcyxzPTA7czxyLmxlbmd0aDtzKyspbi5wdXNoKG5ldyBQb2ludChyW3NdLmNsaWVudFgtby5sZWZ0LWUuY2xpZW50TGVmdCxyW3NdLmNsaWVudFktby50b3AtZS5jbGllbnRUb3ApKTtyZXR1cm4gbn0sZXhwb3J0cy5yZW1vdmU9ZnVuY3Rpb24oZSl7ZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSl9O1xufSx7XCIuL3dpbmRvd1wiOjE5NyxcInBvaW50LWdlb21ldHJ5XCI6MjZ9XSwyMDM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gX2FkZEV2ZW50TGlzdGVuZXIoZSx0LG4pe25bZV09bltlXXx8W10sbltlXS5wdXNoKHQpfWZ1bmN0aW9uIF9yZW1vdmVFdmVudExpc3RlbmVyKGUsdCxuKXtpZihuJiZuW2VdKXt2YXIgaT1uW2VdLmluZGV4T2YodCk7aSE9PS0xJiZuW2VdLnNwbGljZShpLDEpfX12YXIgdXRpbD1fZGVyZXFfKFwiLi91dGlsXCIpLEV2ZW50ZWQ9ZnVuY3Rpb24oKXt9O0V2ZW50ZWQucHJvdG90eXBlLm9uPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX2xpc3RlbmVycz10aGlzLl9saXN0ZW5lcnN8fHt9LF9hZGRFdmVudExpc3RlbmVyKGUsdCx0aGlzLl9saXN0ZW5lcnMpLHRoaXN9LEV2ZW50ZWQucHJvdG90eXBlLm9mZj1mdW5jdGlvbihlLHQpe3JldHVybiBfcmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQsdGhpcy5fbGlzdGVuZXJzKSxfcmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQsdGhpcy5fb25lVGltZUxpc3RlbmVycyksdGhpc30sRXZlbnRlZC5wcm90b3R5cGUub25jZT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzPXRoaXMuX29uZVRpbWVMaXN0ZW5lcnN8fHt9LF9hZGRFdmVudExpc3RlbmVyKGUsdCx0aGlzLl9vbmVUaW1lTGlzdGVuZXJzKSx0aGlzfSxFdmVudGVkLnByb3RvdHlwZS5maXJlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztpZih0aGlzLmxpc3RlbnMoZSkpe3Q9dXRpbC5leHRlbmQoe30sdCx7dHlwZTplLHRhcmdldDp0aGlzfSk7Zm9yKHZhciBpPXRoaXMuX2xpc3RlbmVycyYmdGhpcy5fbGlzdGVuZXJzW2VdP3RoaXMuX2xpc3RlbmVyc1tlXS5zbGljZSgpOltdLHM9MDtzPGkubGVuZ3RoO3MrKylpW3NdLmNhbGwobix0KTtmb3IodmFyIHI9dGhpcy5fb25lVGltZUxpc3RlbmVycyYmdGhpcy5fb25lVGltZUxpc3RlbmVyc1tlXT90aGlzLl9vbmVUaW1lTGlzdGVuZXJzW2VdLnNsaWNlKCk6W10sbz0wO288ci5sZW5ndGg7bysrKXJbb10uY2FsbChuLHQpLF9yZW1vdmVFdmVudExpc3RlbmVyKGUscltvXSxuLl9vbmVUaW1lTGlzdGVuZXJzKTt0aGlzLl9ldmVudGVkUGFyZW50JiZ0aGlzLl9ldmVudGVkUGFyZW50LmZpcmUoZSx1dGlsLmV4dGVuZCh7fSx0LFwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMuX2V2ZW50ZWRQYXJlbnREYXRhP3RoaXMuX2V2ZW50ZWRQYXJlbnREYXRhKCk6dGhpcy5fZXZlbnRlZFBhcmVudERhdGEpKX1lbHNlIHV0aWwuZW5kc1dpdGgoZSxcImVycm9yXCIpJiZjb25zb2xlLmVycm9yKHQmJnQuZXJyb3J8fHR8fFwiRW1wdHkgZXJyb3IgZXZlbnRcIik7cmV0dXJuIHRoaXN9LEV2ZW50ZWQucHJvdG90eXBlLmxpc3RlbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2xpc3RlbmVycyYmdGhpcy5fbGlzdGVuZXJzW2VdJiZ0aGlzLl9saXN0ZW5lcnNbZV0ubGVuZ3RoPjB8fHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMmJnRoaXMuX29uZVRpbWVMaXN0ZW5lcnNbZV0mJnRoaXMuX29uZVRpbWVMaXN0ZW5lcnNbZV0ubGVuZ3RoPjB8fHRoaXMuX2V2ZW50ZWRQYXJlbnQmJnRoaXMuX2V2ZW50ZWRQYXJlbnQubGlzdGVucyhlKX0sRXZlbnRlZC5wcm90b3R5cGUuc2V0RXZlbnRlZFBhcmVudD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9ldmVudGVkUGFyZW50PWUsdGhpcy5fZXZlbnRlZFBhcmVudERhdGE9dCx0aGlzfSxtb2R1bGUuZXhwb3J0cz1FdmVudGVkO1xufSx7XCIuL3V0aWxcIjoyMTV9XSwyMDQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gY29tcGFyZU1heChlLHQpe3JldHVybiB0Lm1heC1lLm1heH1mdW5jdGlvbiBDZWxsKGUsdCxuLHIpe3RoaXMucD1uZXcgUG9pbnQoZSx0KSx0aGlzLmg9bix0aGlzLmQ9cG9pbnRUb1BvbHlnb25EaXN0KHRoaXMucCxyKSx0aGlzLm1heD10aGlzLmQrdGhpcy5oKk1hdGguU1FSVDJ9ZnVuY3Rpb24gcG9pbnRUb1BvbHlnb25EaXN0KGUsdCl7Zm9yKHZhciBuPSExLHI9MS8wLG89MDtvPHQubGVuZ3RoO28rKylmb3IodmFyIGk9dFtvXSxsPTAsdT1pLmxlbmd0aCxzPXUtMTtsPHU7cz1sKyspe3ZhciBhPWlbbF0saD1pW3NdO2EueT5lLnkhPWgueT5lLnkmJmUueDwoaC54LWEueCkqKGUueS1hLnkpLyhoLnktYS55KSthLngmJihuPSFuKSxyPU1hdGgubWluKHIsZGlzdFRvU2VnbWVudFNxdWFyZWQoZSxhLGgpKX1yZXR1cm4obj8xOi0xKSpNYXRoLnNxcnQocil9ZnVuY3Rpb24gZ2V0Q2VudHJvaWRDZWxsKGUpe2Zvcih2YXIgdD0wLG49MCxyPTAsbz1lWzBdLGk9MCxsPW8ubGVuZ3RoLHU9bC0xO2k8bDt1PWkrKyl7dmFyIHM9b1tpXSxhPW9bdV0saD1zLngqYS55LWEueCpzLnk7bis9KHMueCthLngpKmgscis9KHMueSthLnkpKmgsdCs9MypofXJldHVybiBuZXcgQ2VsbChuL3Qsci90LDAsZSl9dmFyIFF1ZXVlPV9kZXJlcV8oXCJ0aW55cXVldWVcIiksUG9pbnQ9X2RlcmVxXyhcInBvaW50LWdlb21ldHJ5XCIpLGRpc3RUb1NlZ21lbnRTcXVhcmVkPV9kZXJlcV8oXCIuL2ludGVyc2VjdGlvbl90ZXN0c1wiKS5kaXN0VG9TZWdtZW50U3F1YXJlZDttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7dD10fHwxO2Zvcih2YXIgcixvLGksbCx1PWVbMF0scz0wO3M8dS5sZW5ndGg7cysrKXt2YXIgYT11W3NdOyghc3x8YS54PHIpJiYocj1hLngpLCghc3x8YS55PG8pJiYobz1hLnkpLCghc3x8YS54PmkpJiYoaT1hLngpLCghc3x8YS55PmwpJiYobD1hLnkpfXZhciBoPWktcixwPWwtbyx5PU1hdGgubWluKGgscCkseD15LzIsZD1uZXcgUXVldWUobnVsbCxjb21wYXJlTWF4KTtpZigwPT09eSlyZXR1cm5bcixvXTtmb3IodmFyIGc9cjtnPGk7Zys9eSlmb3IodmFyIGY9bztmPGw7Zis9eSlkLnB1c2gobmV3IENlbGwoZyt4LGYreCx4LGUpKTtmb3IodmFyIG09Z2V0Q2VudHJvaWRDZWxsKGUpLGM9ZC5sZW5ndGg7ZC5sZW5ndGg7KXt2YXIgdj1kLnBvcCgpOyh2LmQ+bS5kfHwhbS5kKSYmKG09dixuJiZjb25zb2xlLmxvZyhcImZvdW5kIGJlc3QgJWQgYWZ0ZXIgJWQgcHJvYmVzXCIsTWF0aC5yb3VuZCgxZTQqdi5kKS8xZTQsYykpLHYubWF4LW0uZDw9dHx8KHg9di5oLzIsZC5wdXNoKG5ldyBDZWxsKHYucC54LXgsdi5wLnkteCx4LGUpKSxkLnB1c2gobmV3IENlbGwodi5wLngreCx2LnAueS14LHgsZSkpLGQucHVzaChuZXcgQ2VsbCh2LnAueC14LHYucC55K3gseCxlKSksZC5wdXNoKG5ldyBDZWxsKHYucC54K3gsdi5wLnkreCx4LGUpKSxjKz00KX1yZXR1cm4gbiYmKGNvbnNvbGUubG9nKFwibnVtIHByb2JlczogXCIrYyksY29uc29sZS5sb2coXCJiZXN0IGRpc3RhbmNlOiBcIittLmQpKSxtLnB9O1xufSx7XCIuL2ludGVyc2VjdGlvbl90ZXN0c1wiOjIwNyxcInBvaW50LWdlb21ldHJ5XCI6MjYsXCJ0aW55cXVldWVcIjozMH1dLDIwNTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgV29ya2VyUG9vbD1fZGVyZXFfKFwiLi93b3JrZXJfcG9vbFwiKSxnbG9iYWxXb3JrZXJQb29sO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKCl7cmV0dXJuIGdsb2JhbFdvcmtlclBvb2x8fChnbG9iYWxXb3JrZXJQb29sPW5ldyBXb3JrZXJQb29sKSxnbG9iYWxXb3JrZXJQb29sfTtcbn0se1wiLi93b3JrZXJfcG9vbFwiOjIxOH1dLDIwNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBHbHlwaHMoYSxlKXt0aGlzLnN0YWNrcz1hLnJlYWRGaWVsZHMocmVhZEZvbnRzdGFja3MsW10sZSl9ZnVuY3Rpb24gcmVhZEZvbnRzdGFja3MoYSxlLHIpe2lmKDE9PT1hKXt2YXIgdD1yLnJlYWRNZXNzYWdlKHJlYWRGb250c3RhY2sse2dseXBoczp7fX0pO2UucHVzaCh0KX19ZnVuY3Rpb24gcmVhZEZvbnRzdGFjayhhLGUscil7aWYoMT09PWEpZS5uYW1lPXIucmVhZFN0cmluZygpO2Vsc2UgaWYoMj09PWEpZS5yYW5nZT1yLnJlYWRTdHJpbmcoKTtlbHNlIGlmKDM9PT1hKXt2YXIgdD1yLnJlYWRNZXNzYWdlKHJlYWRHbHlwaCx7fSk7ZS5nbHlwaHNbdC5pZF09dH19ZnVuY3Rpb24gcmVhZEdseXBoKGEsZSxyKXsxPT09YT9lLmlkPXIucmVhZFZhcmludCgpOjI9PT1hP2UuYml0bWFwPXIucmVhZEJ5dGVzKCk6Mz09PWE/ZS53aWR0aD1yLnJlYWRWYXJpbnQoKTo0PT09YT9lLmhlaWdodD1yLnJlYWRWYXJpbnQoKTo1PT09YT9lLmxlZnQ9ci5yZWFkU1ZhcmludCgpOjY9PT1hP2UudG9wPXIucmVhZFNWYXJpbnQoKTo3PT09YSYmKGUuYWR2YW5jZT1yLnJlYWRWYXJpbnQoKSl9bW9kdWxlLmV4cG9ydHM9R2x5cGhzO1xufSx7fV0sMjA3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIHBvbHlnb25JbnRlcnNlY3RzUG9seWdvbihuLHQpe2Zvcih2YXIgZT0wO2U8bi5sZW5ndGg7ZSsrKWlmKHBvbHlnb25Db250YWluc1BvaW50KHQsbltlXSkpcmV0dXJuITA7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspaWYocG9seWdvbkNvbnRhaW5zUG9pbnQobix0W3JdKSlyZXR1cm4hMDtyZXR1cm4hIWxpbmVJbnRlcnNlY3RzTGluZShuLHQpfWZ1bmN0aW9uIG11bHRpUG9seWdvbkludGVyc2VjdHNCdWZmZXJlZE11bHRpUG9pbnQobix0LGUpe2Zvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKWZvcih2YXIgbz1uW3JdLGk9MDtpPHQubGVuZ3RoO2krKylmb3IodmFyIGw9dFtpXSx1PTA7dTxsLmxlbmd0aDt1Kyspe3ZhciBzPWxbdV07aWYocG9seWdvbkNvbnRhaW5zUG9pbnQobyxzKSlyZXR1cm4hMDtpZihwb2ludEludGVyc2VjdHNCdWZmZXJlZExpbmUocyxvLGUpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIG11bHRpUG9seWdvbkludGVyc2VjdHNNdWx0aVBvbHlnb24obix0KXtpZigxPT09bi5sZW5ndGgmJjE9PT1uWzBdLmxlbmd0aClyZXR1cm4gbXVsdGlQb2x5Z29uQ29udGFpbnNQb2ludCh0LG5bMF1bMF0pO2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWZvcih2YXIgcj10W2VdLG89MDtvPHIubGVuZ3RoO28rKylpZihtdWx0aVBvbHlnb25Db250YWluc1BvaW50KG4scltvXSkpcmV0dXJuITA7Zm9yKHZhciBpPTA7aTxuLmxlbmd0aDtpKyspe2Zvcih2YXIgbD1uW2ldLHU9MDt1PGwubGVuZ3RoO3UrKylpZihtdWx0aVBvbHlnb25Db250YWluc1BvaW50KHQsbFt1XSkpcmV0dXJuITA7Zm9yKHZhciBzPTA7czx0Lmxlbmd0aDtzKyspaWYobGluZUludGVyc2VjdHNMaW5lKGwsdFtzXSkpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gbXVsdGlQb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkTXVsdGlMaW5lKG4sdCxlKXtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKylmb3IodmFyIG89dFtyXSxpPTA7aTxuLmxlbmd0aDtpKyspe3ZhciBsPW5baV07aWYobC5sZW5ndGg+PTMpZm9yKHZhciB1PTA7dTxvLmxlbmd0aDt1KyspaWYocG9seWdvbkNvbnRhaW5zUG9pbnQobCxvW3VdKSlyZXR1cm4hMDtpZihsaW5lSW50ZXJzZWN0c0J1ZmZlcmVkTGluZShsLG8sZSkpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gbGluZUludGVyc2VjdHNCdWZmZXJlZExpbmUobix0LGUpe2lmKG4ubGVuZ3RoPjEpe2lmKGxpbmVJbnRlcnNlY3RzTGluZShuLHQpKXJldHVybiEwO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKWlmKHBvaW50SW50ZXJzZWN0c0J1ZmZlcmVkTGluZSh0W3JdLG4sZSkpcmV0dXJuITB9Zm9yKHZhciBvPTA7bzxuLmxlbmd0aDtvKyspaWYocG9pbnRJbnRlcnNlY3RzQnVmZmVyZWRMaW5lKG5bb10sdCxlKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBsaW5lSW50ZXJzZWN0c0xpbmUobix0KXtpZigwPT09bi5sZW5ndGh8fDA9PT10Lmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIGU9MDtlPG4ubGVuZ3RoLTE7ZSsrKWZvcih2YXIgcj1uW2VdLG89bltlKzFdLGk9MDtpPHQubGVuZ3RoLTE7aSsrKXt2YXIgbD10W2ldLHU9dFtpKzFdO2lmKGxpbmVTZWdtZW50SW50ZXJzZWN0c0xpbmVTZWdtZW50KHIsbyxsLHUpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIGxpbmVTZWdtZW50SW50ZXJzZWN0c0xpbmVTZWdtZW50KG4sdCxlLHIpe3JldHVybiBpc0NvdW50ZXJDbG9ja3dpc2UobixlLHIpIT09aXNDb3VudGVyQ2xvY2t3aXNlKHQsZSxyKSYmaXNDb3VudGVyQ2xvY2t3aXNlKG4sdCxlKSE9PWlzQ291bnRlckNsb2Nrd2lzZShuLHQscil9ZnVuY3Rpb24gcG9pbnRJbnRlcnNlY3RzQnVmZmVyZWRMaW5lKG4sdCxlKXt2YXIgcj1lKmU7aWYoMT09PXQubGVuZ3RoKXJldHVybiBuLmRpc3RTcXIodFswXSk8cjtmb3IodmFyIG89MTtvPHQubGVuZ3RoO28rKyl7dmFyIGk9dFtvLTFdLGw9dFtvXTtpZihkaXN0VG9TZWdtZW50U3F1YXJlZChuLGksbCk8cilyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBkaXN0VG9TZWdtZW50U3F1YXJlZChuLHQsZSl7dmFyIHI9dC5kaXN0U3FyKGUpO2lmKDA9PT1yKXJldHVybiBuLmRpc3RTcXIodCk7dmFyIG89KChuLngtdC54KSooZS54LXQueCkrKG4ueS10LnkpKihlLnktdC55KSkvcjtyZXR1cm4gbzwwP24uZGlzdFNxcih0KTpvPjE/bi5kaXN0U3FyKGUpOm4uZGlzdFNxcihlLnN1Yih0KS5fbXVsdChvKS5fYWRkKHQpKX1mdW5jdGlvbiBtdWx0aVBvbHlnb25Db250YWluc1BvaW50KG4sdCl7Zm9yKHZhciBlLHIsbyxpPSExLGw9MDtsPG4ubGVuZ3RoO2wrKyl7ZT1uW2xdO2Zvcih2YXIgdT0wLHM9ZS5sZW5ndGgtMTt1PGUubGVuZ3RoO3M9dSsrKXI9ZVt1XSxvPWVbc10sci55PnQueSE9by55PnQueSYmdC54PChvLngtci54KSoodC55LXIueSkvKG8ueS1yLnkpK3IueCYmKGk9IWkpfXJldHVybiBpfWZ1bmN0aW9uIHBvbHlnb25Db250YWluc1BvaW50KG4sdCl7Zm9yKHZhciBlPSExLHI9MCxvPW4ubGVuZ3RoLTE7cjxuLmxlbmd0aDtvPXIrKyl7dmFyIGk9bltyXSxsPW5bb107aS55PnQueSE9bC55PnQueSYmdC54PChsLngtaS54KSoodC55LWkueSkvKGwueS1pLnkpK2kueCYmKGU9IWUpfXJldHVybiBlfXZhciBpc0NvdW50ZXJDbG9ja3dpc2U9X2RlcmVxXyhcIi4vdXRpbFwiKS5pc0NvdW50ZXJDbG9ja3dpc2U7bW9kdWxlLmV4cG9ydHM9e211bHRpUG9seWdvbkludGVyc2VjdHNCdWZmZXJlZE11bHRpUG9pbnQ6bXVsdGlQb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkTXVsdGlQb2ludCxtdWx0aVBvbHlnb25JbnRlcnNlY3RzTXVsdGlQb2x5Z29uOm11bHRpUG9seWdvbkludGVyc2VjdHNNdWx0aVBvbHlnb24sbXVsdGlQb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkTXVsdGlMaW5lOm11bHRpUG9seWdvbkludGVyc2VjdHNCdWZmZXJlZE11bHRpTGluZSxwb2x5Z29uSW50ZXJzZWN0c1BvbHlnb246cG9seWdvbkludGVyc2VjdHNQb2x5Z29uLGRpc3RUb1NlZ21lbnRTcXVhcmVkOmRpc3RUb1NlZ21lbnRTcXVhcmVkfTtcbn0se1wiLi91dGlsXCI6MjE1fV0sMjA4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO3ZhciB1bmljb2RlQmxvY2tMb29rdXA9e1wiTGF0aW4tMSBTdXBwbGVtZW50XCI6ZnVuY3Rpb24obil7cmV0dXJuIG4+PTEyOCYmbjw9MjU1fSxcIkhhbmd1bCBKYW1vXCI6ZnVuY3Rpb24obil7cmV0dXJuIG4+PTQzNTImJm48PTQ2MDd9LFwiVW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljc1wiOmZ1bmN0aW9uKG4pe3JldHVybiBuPj01MTIwJiZuPD01NzU5fSxcIlVuaWZpZWQgQ2FuYWRpYW4gQWJvcmlnaW5hbCBTeWxsYWJpY3MgRXh0ZW5kZWRcIjpmdW5jdGlvbihuKXtyZXR1cm4gbj49NjMyMCYmbjw9NjM5OX0sXCJHZW5lcmFsIFB1bmN0dWF0aW9uXCI6ZnVuY3Rpb24obil7cmV0dXJuIG4+PTgxOTImJm48PTgzMDN9LFwiTGV0dGVybGlrZSBTeW1ib2xzXCI6ZnVuY3Rpb24obil7cmV0dXJuIG4+PTg0NDgmJm48PTg1Mjd9LFwiTnVtYmVyIEZvcm1zXCI6ZnVuY3Rpb24obil7cmV0dXJuIG4+PTg1MjgmJm48PTg1OTF9LFwiTWlzY2VsbGFuZW91cyBUZWNobmljYWxcIjpmdW5jdGlvbihuKXtyZXR1cm4gbj49ODk2MCYmbjw9OTIxNX0sXCJDb250cm9sIFBpY3R1cmVzXCI6ZnVuY3Rpb24obil7cmV0dXJuIG4+PTkyMTYmJm48PTkyNzl9LFwiT3B0aWNhbCBDaGFyYWN0ZXIgUmVjb2duaXRpb25cIjpmdW5jdGlvbihuKXtyZXR1cm4gbj49OTI4MCYmbjw9OTMxMX0sXCJFbmNsb3NlZCBBbHBoYW51bWVyaWNzXCI6ZnVuY3Rpb24obil7cmV0dXJuIG4+PTkzMTImJm48PTk0NzF9LFwiR2VvbWV0cmljIFNoYXBlc1wiOmZ1bmN0aW9uKG4pe3JldHVybiBuPj05NjMyJiZuPD05NzI3fSxcIk1pc2NlbGxhbmVvdXMgU3ltYm9sc1wiOmZ1bmN0aW9uKG4pe3JldHVybiBuPj05NzI4JiZuPD05OTgzfSxcIk1pc2NlbGxhbmVvdXMgU3ltYm9scyBhbmQgQXJyb3dzXCI6ZnVuY3Rpb24obil7cmV0dXJuIG4+PTExMDA4JiZuPD0xMTI2M30sXCJDSksgUmFkaWNhbHMgU3VwcGxlbWVudFwiOmZ1bmN0aW9uKG4pe3JldHVybiBuPj0xMTkwNCYmbjw9MTIwMzF9LFwiS2FuZ3hpIFJhZGljYWxzXCI6ZnVuY3Rpb24obil7cmV0dXJuIG4+PTEyMDMyJiZuPD0xMjI1NX0sXCJJZGVvZ3JhcGhpYyBEZXNjcmlwdGlvbiBDaGFyYWN0ZXJzXCI6ZnVuY3Rpb24obil7cmV0dXJuIG4+PTEyMjcyJiZuPD0xMjI4N30sXCJDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb25cIjpmdW5jdGlvbihuKXtyZXR1cm4gbj49MTIyODgmJm48PTEyMzUxfSxIaXJhZ2FuYTpmdW5jdGlvbihuKXtyZXR1cm4gbj49MTIzNTImJm48PTEyNDQ3fSxLYXRha2FuYTpmdW5jdGlvbihuKXtyZXR1cm4gbj49MTI0NDgmJm48PTEyNTQzfSxCb3BvbW9mbzpmdW5jdGlvbihuKXtyZXR1cm4gbj49MTI1NDQmJm48PTEyNTkxfSxcIkhhbmd1bCBDb21wYXRpYmlsaXR5IEphbW9cIjpmdW5jdGlvbihuKXtyZXR1cm4gbj49MTI1OTImJm48PTEyNjg3fSxLYW5idW46ZnVuY3Rpb24obil7cmV0dXJuIG4+PTEyNjg4JiZuPD0xMjcwM30sXCJCb3BvbW9mbyBFeHRlbmRlZFwiOmZ1bmN0aW9uKG4pe3JldHVybiBuPj0xMjcwNCYmbjw9MTI3MzV9LFwiQ0pLIFN0cm9rZXNcIjpmdW5jdGlvbihuKXtyZXR1cm4gbj49MTI3MzYmJm48PTEyNzgzfSxcIkthdGFrYW5hIFBob25ldGljIEV4dGVuc2lvbnNcIjpmdW5jdGlvbihuKXtyZXR1cm4gbj49MTI3ODQmJm48PTEyNzk5fSxcIkVuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHNcIjpmdW5jdGlvbihuKXtyZXR1cm4gbj49MTI4MDAmJm48PTEzMDU1fSxcIkNKSyBDb21wYXRpYmlsaXR5XCI6ZnVuY3Rpb24obil7cmV0dXJuIG4+PTEzMDU2JiZuPD0xMzMxMX0sXCJDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBBXCI6ZnVuY3Rpb24obil7cmV0dXJuIG4+PTEzMzEyJiZuPD0xOTkwM30sXCJZaWppbmcgSGV4YWdyYW0gU3ltYm9sc1wiOmZ1bmN0aW9uKG4pe3JldHVybiBuPj0xOTkwNCYmbjw9MTk5Njd9LFwiQ0pLIFVuaWZpZWQgSWRlb2dyYXBoc1wiOmZ1bmN0aW9uKG4pe3JldHVybiBuPj0xOTk2OCYmbjw9NDA5NTl9LFwiWWkgU3lsbGFibGVzXCI6ZnVuY3Rpb24obil7cmV0dXJuIG4+PTQwOTYwJiZuPD00MjEyN30sXCJZaSBSYWRpY2Fsc1wiOmZ1bmN0aW9uKG4pe3JldHVybiBuPj00MjEyOCYmbjw9NDIxOTF9LFwiSGFuZ3VsIEphbW8gRXh0ZW5kZWQtQVwiOmZ1bmN0aW9uKG4pe3JldHVybiBuPj00MzM2MCYmbjw9NDMzOTF9LFwiSGFuZ3VsIFN5bGxhYmxlc1wiOmZ1bmN0aW9uKG4pe3JldHVybiBuPj00NDAzMiYmbjw9NTUyMTV9LFwiSGFuZ3VsIEphbW8gRXh0ZW5kZWQtQlwiOmZ1bmN0aW9uKG4pe3JldHVybiBuPj01NTIxNiYmbjw9NTUyOTV9LFwiUHJpdmF0ZSBVc2UgQXJlYVwiOmZ1bmN0aW9uKG4pe3JldHVybiBuPj01NzM0NCYmbjw9NjM3NDN9LFwiQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBoc1wiOmZ1bmN0aW9uKG4pe3JldHVybiBuPj02Mzc0NCYmbjw9NjQyNTV9LFwiVmVydGljYWwgRm9ybXNcIjpmdW5jdGlvbihuKXtyZXR1cm4gbj49NjUwNDAmJm48PTY1MDU1fSxcIkNKSyBDb21wYXRpYmlsaXR5IEZvcm1zXCI6ZnVuY3Rpb24obil7cmV0dXJuIG4+PTY1MDcyJiZuPD02NTEwM30sXCJTbWFsbCBGb3JtIFZhcmlhbnRzXCI6ZnVuY3Rpb24obil7cmV0dXJuIG4+PTY1MTA0JiZuPD02NTEzNX0sXCJIYWxmd2lkdGggYW5kIEZ1bGx3aWR0aCBGb3Jtc1wiOmZ1bmN0aW9uKG4pe3JldHVybiBuPj02NTI4MCYmbjw9NjU1MTl9fTttb2R1bGUuZXhwb3J0cz11bmljb2RlQmxvY2tMb29rdXA7XG59LHt9XSwyMDk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIExSVUNhY2hlPWZ1bmN0aW9uKHQsZSl7dGhpcy5tYXg9dCx0aGlzLm9uUmVtb3ZlPWUsdGhpcy5yZXNldCgpfTtMUlVDYWNoZS5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2Zvcih2YXIgZSBpbiB0LmRhdGEpdC5vblJlbW92ZSh0LmRhdGFbZV0pO3JldHVybiB0aGlzLmRhdGE9e30sdGhpcy5vcmRlcj1bXSx0aGlzfSxMUlVDYWNoZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5oYXModCkpdGhpcy5vcmRlci5zcGxpY2UodGhpcy5vcmRlci5pbmRleE9mKHQpLDEpLHRoaXMuZGF0YVt0XT1lLHRoaXMub3JkZXIucHVzaCh0KTtlbHNlIGlmKHRoaXMuZGF0YVt0XT1lLHRoaXMub3JkZXIucHVzaCh0KSx0aGlzLm9yZGVyLmxlbmd0aD50aGlzLm1heCl7dmFyIHI9dGhpcy5nZXQodGhpcy5vcmRlclswXSk7ciYmdGhpcy5vblJlbW92ZShyKX1yZXR1cm4gdGhpc30sTFJVQ2FjaGUucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbiB0aGlzLmRhdGF9LExSVUNhY2hlLnByb3RvdHlwZS5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3JkZXJ9LExSVUNhY2hlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7aWYoIXRoaXMuaGFzKHQpKXJldHVybiBudWxsO3ZhciBlPXRoaXMuZGF0YVt0XTtyZXR1cm4gZGVsZXRlIHRoaXMuZGF0YVt0XSx0aGlzLm9yZGVyLnNwbGljZSh0aGlzLm9yZGVyLmluZGV4T2YodCksMSksZX0sTFJVQ2FjaGUucHJvdG90eXBlLmdldFdpdGhvdXRSZW1vdmluZz1mdW5jdGlvbih0KXtpZighdGhpcy5oYXModCkpcmV0dXJuIG51bGw7dmFyIGU9dGhpcy5kYXRhW3RdO3JldHVybiBlfSxMUlVDYWNoZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe2lmKCF0aGlzLmhhcyh0KSlyZXR1cm4gdGhpczt2YXIgZT10aGlzLmRhdGFbdF07cmV0dXJuIGRlbGV0ZSB0aGlzLmRhdGFbdF0sdGhpcy5vblJlbW92ZShlKSx0aGlzLm9yZGVyLnNwbGljZSh0aGlzLm9yZGVyLmluZGV4T2YodCksMSksdGhpc30sTFJVQ2FjaGUucHJvdG90eXBlLnNldE1heFNpemU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztmb3IodGhpcy5tYXg9dDt0aGlzLm9yZGVyLmxlbmd0aD50aGlzLm1heDspe3ZhciByPWUuZ2V0KGUub3JkZXJbMF0pO3ImJmUub25SZW1vdmUocil9cmV0dXJuIHRoaXN9LG1vZHVsZS5leHBvcnRzPUxSVUNhY2hlO1xufSx7fV0sMjEwOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIG1ha2VBUElVUkwocixlKXt2YXIgdD1wYXJzZVVybChjb25maWcuQVBJX1VSTCk7aWYoci5wcm90b2NvbD10LnByb3RvY29sLHIuYXV0aG9yaXR5PXQuYXV0aG9yaXR5LCFjb25maWcuUkVRVUlSRV9BQ0NFU1NfVE9LRU4pcmV0dXJuIGZvcm1hdFVybChyKTtpZihlPWV8fGNvbmZpZy5BQ0NFU1NfVE9LRU4sIWUpdGhyb3cgbmV3IEVycm9yKFwiQW4gQVBJIGFjY2VzcyB0b2tlbiBpcyByZXF1aXJlZCB0byB1c2UgTWFwYm94IEdMLiBcIitoZWxwKTtpZihcInNcIj09PWVbMF0pdGhyb3cgbmV3IEVycm9yKFwiVXNlIGEgcHVibGljIGFjY2VzcyB0b2tlbiAocGsuKikgd2l0aCBNYXBib3ggR0wsIG5vdCBhIHNlY3JldCBhY2Nlc3MgdG9rZW4gKHNrLiopLiBcIitoZWxwKTtyZXR1cm4gci5wYXJhbXMucHVzaChcImFjY2Vzc190b2tlbj1cIitlKSxmb3JtYXRVcmwocil9ZnVuY3Rpb24gaXNNYXBib3hVUkwocil7cmV0dXJuIDA9PT1yLmluZGV4T2YoXCJtYXBib3g6XCIpfWZ1bmN0aW9uIHJlcGxhY2VUZW1wQWNjZXNzVG9rZW4ocil7Zm9yKHZhciBlPTA7ZTxyLmxlbmd0aDtlKyspMD09PXJbZV0uaW5kZXhPZihcImFjY2Vzc190b2tlbj10ay5cIikmJihyW2VdPVwiYWNjZXNzX3Rva2VuPVwiKyhjb25maWcuQUNDRVNTX1RPS0VOfHxcIlwiKSl9ZnVuY3Rpb24gcGFyc2VVcmwocil7dmFyIGU9ci5tYXRjaCh1cmxSZSk7aWYoIWUpdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIHBhcnNlIFVSTCBvYmplY3RcIik7cmV0dXJue3Byb3RvY29sOmVbMV0sYXV0aG9yaXR5OmVbMl0scGF0aDplWzNdfHxcIi9cIixwYXJhbXM6ZVs0XT9lWzRdLnNwbGl0KFwiJlwiKTpbXX19ZnVuY3Rpb24gZm9ybWF0VXJsKHIpe3ZhciBlPXIucGFyYW1zLmxlbmd0aD9cIj9cIityLnBhcmFtcy5qb2luKFwiJlwiKTpcIlwiO3JldHVybiByLnByb3RvY29sK1wiOi8vXCIrci5hdXRob3JpdHkrci5wYXRoK2V9dmFyIGNvbmZpZz1fZGVyZXFfKFwiLi9jb25maWdcIiksYnJvd3Nlcj1fZGVyZXFfKFwiLi9icm93c2VyXCIpLGhlbHA9XCJTZWUgaHR0cHM6Ly93d3cubWFwYm94LmNvbS9hcGktZG9jdW1lbnRhdGlvbi8jYWNjZXNzLXRva2Vuc1wiO2V4cG9ydHMuaXNNYXBib3hVUkw9aXNNYXBib3hVUkwsZXhwb3J0cy5ub3JtYWxpemVTdHlsZVVSTD1mdW5jdGlvbihyLGUpe2lmKCFpc01hcGJveFVSTChyKSlyZXR1cm4gcjt2YXIgdD1wYXJzZVVybChyKTtyZXR1cm4gdC5wYXRoPVwiL3N0eWxlcy92MVwiK3QucGF0aCxtYWtlQVBJVVJMKHQsZSl9LGV4cG9ydHMubm9ybWFsaXplR2x5cGhzVVJMPWZ1bmN0aW9uKHIsZSl7aWYoIWlzTWFwYm94VVJMKHIpKXJldHVybiByO3ZhciB0PXBhcnNlVXJsKHIpO3JldHVybiB0LnBhdGg9XCIvZm9udHMvdjFcIit0LnBhdGgsbWFrZUFQSVVSTCh0LGUpfSxleHBvcnRzLm5vcm1hbGl6ZVNvdXJjZVVSTD1mdW5jdGlvbihyLGUpe2lmKCFpc01hcGJveFVSTChyKSlyZXR1cm4gcjt2YXIgdD1wYXJzZVVybChyKTtyZXR1cm4gdC5wYXRoPVwiL3Y0L1wiK3QuYXV0aG9yaXR5K1wiLmpzb25cIix0LnBhcmFtcy5wdXNoKFwic2VjdXJlXCIpLG1ha2VBUElVUkwodCxlKX0sZXhwb3J0cy5ub3JtYWxpemVTcHJpdGVVUkw9ZnVuY3Rpb24ocixlLHQsbyl7dmFyIGE9cGFyc2VVcmwocik7cmV0dXJuIGlzTWFwYm94VVJMKHIpPyhhLnBhdGg9XCIvc3R5bGVzL3YxXCIrYS5wYXRoK1wiL3Nwcml0ZVwiK2UrdCxtYWtlQVBJVVJMKGEsbykpOihhLnBhdGgrPVwiXCIrZSt0LGZvcm1hdFVybChhKSl9O3ZhciBpbWFnZUV4dGVuc2lvblJlPS8oXFwuKHBuZ3xqcGcpXFxkKikoPz0kKS87ZXhwb3J0cy5ub3JtYWxpemVUaWxlVVJMPWZ1bmN0aW9uKHIsZSx0KXtpZighZXx8IWlzTWFwYm94VVJMKGUpKXJldHVybiByO3ZhciBvPXBhcnNlVXJsKHIpLGE9YnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvPj0yfHw1MTI9PT10P1wiQDJ4XCI6XCJcIixzPWJyb3dzZXIuc3VwcG9ydHNXZWJwP1wiLndlYnBcIjpcIiQxXCI7cmV0dXJuIG8ucGF0aD1vLnBhdGgucmVwbGFjZShpbWFnZUV4dGVuc2lvblJlLFwiXCIrYStzKSxyZXBsYWNlVGVtcEFjY2Vzc1Rva2VuKG8ucGFyYW1zKSxmb3JtYXRVcmwobyl9O3ZhciB1cmxSZT0vXihcXHcrKTpcXC9cXC8oW15cXC8/XSopKFxcL1teP10rKT9cXD8/KC4rKT8vO1xufSx7XCIuL2Jyb3dzZXJcIjoxOTUsXCIuL2NvbmZpZ1wiOjE5OX1dLDIxMTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgaXNDaGFyPV9kZXJlcV8oXCIuL2lzX2NoYXJfaW5fdW5pY29kZV9ibG9ja1wiKTttb2R1bGUuZXhwb3J0cy5hbGxvd3NJZGVvZ3JhcGhpY0JyZWFraW5nPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaT0wLHI9YTtpPHIubGVuZ3RoO2krPTEpe3ZhciBzPXJbaV07aWYoIWV4cG9ydHMuY2hhckFsbG93c0lkZW9ncmFwaGljQnJlYWtpbmcocy5jaGFyQ29kZUF0KDApKSlyZXR1cm4hMX1yZXR1cm4hMH0sbW9kdWxlLmV4cG9ydHMuYWxsb3dzVmVydGljYWxXcml0aW5nTW9kZT1mdW5jdGlvbihhKXtmb3IodmFyIGk9MCxyPWE7aTxyLmxlbmd0aDtpKz0xKXt2YXIgcz1yW2ldO2lmKGV4cG9ydHMuY2hhckhhc1VwcmlnaHRWZXJ0aWNhbE9yaWVudGF0aW9uKHMuY2hhckNvZGVBdCgwKSkpcmV0dXJuITB9cmV0dXJuITF9LG1vZHVsZS5leHBvcnRzLmNoYXJBbGxvd3NJZGVvZ3JhcGhpY0JyZWFraW5nPWZ1bmN0aW9uKGEpe3JldHVybiEoYTwxMTkwNCkmJighIWlzQ2hhcltcIkJvcG9tb2ZvIEV4dGVuZGVkXCJdKGEpfHwoISFpc0NoYXIuQm9wb21vZm8oYSl8fCghIWlzQ2hhcltcIkNKSyBDb21wYXRpYmlsaXR5IEZvcm1zXCJdKGEpfHwoISFpc0NoYXJbXCJDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzXCJdKGEpfHwoISFpc0NoYXJbXCJDSksgQ29tcGF0aWJpbGl0eVwiXShhKXx8KCEhaXNDaGFyW1wiQ0pLIFJhZGljYWxzIFN1cHBsZW1lbnRcIl0oYSl8fCghIWlzQ2hhcltcIkNKSyBTdHJva2VzXCJdKGEpfHwoISFpc0NoYXJbXCJDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb25cIl0oYSl8fCghIWlzQ2hhcltcIkNKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEFcIl0oYSl8fCghIWlzQ2hhcltcIkNKSyBVbmlmaWVkIElkZW9ncmFwaHNcIl0oYSl8fCghIWlzQ2hhcltcIkVuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHNcIl0oYSl8fCghIWlzQ2hhcltcIkhhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zXCJdKGEpfHwoISFpc0NoYXIuSGlyYWdhbmEoYSl8fCghIWlzQ2hhcltcIklkZW9ncmFwaGljIERlc2NyaXB0aW9uIENoYXJhY3RlcnNcIl0oYSl8fCghIWlzQ2hhcltcIkthbmd4aSBSYWRpY2Fsc1wiXShhKXx8KCEhaXNDaGFyW1wiS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9uc1wiXShhKXx8KCEhaXNDaGFyLkthdGFrYW5hKGEpfHwoISFpc0NoYXJbXCJWZXJ0aWNhbCBGb3Jtc1wiXShhKXx8KCEhaXNDaGFyW1wiWWkgUmFkaWNhbHNcIl0oYSl8fCEhaXNDaGFyW1wiWWkgU3lsbGFibGVzXCJdKGEpKSkpKSkpKSkpKSkpKSkpKSkpKX0sZXhwb3J0cy5jaGFySGFzVXByaWdodFZlcnRpY2FsT3JpZW50YXRpb249ZnVuY3Rpb24oYSl7cmV0dXJuIDc0Nj09PWF8fDc0Nz09PWF8fCEoYTw0MzUyKSYmKCEhaXNDaGFyW1wiQm9wb21vZm8gRXh0ZW5kZWRcIl0oYSl8fCghIWlzQ2hhci5Cb3BvbW9mbyhhKXx8KCEoIWlzQ2hhcltcIkNKSyBDb21wYXRpYmlsaXR5IEZvcm1zXCJdKGEpfHxhPj02NTA5NyYmYTw9NjUxMDMpfHwoISFpc0NoYXJbXCJDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzXCJdKGEpfHwoISFpc0NoYXJbXCJDSksgQ29tcGF0aWJpbGl0eVwiXShhKXx8KCEhaXNDaGFyW1wiQ0pLIFJhZGljYWxzIFN1cHBsZW1lbnRcIl0oYSl8fCghIWlzQ2hhcltcIkNKSyBTdHJva2VzXCJdKGEpfHwoISghaXNDaGFyW1wiQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uXCJdKGEpfHxhPj0xMjI5NiYmYTw9MTIzMDV8fGE+PTEyMzA4JiZhPD0xMjMxOXx8MTIzMzY9PT1hKXx8KCEhaXNDaGFyW1wiQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQVwiXShhKXx8KCEhaXNDaGFyW1wiQ0pLIFVuaWZpZWQgSWRlb2dyYXBoc1wiXShhKXx8KCEhaXNDaGFyW1wiRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRoc1wiXShhKXx8KCEhaXNDaGFyW1wiSGFuZ3VsIENvbXBhdGliaWxpdHkgSmFtb1wiXShhKXx8KCEhaXNDaGFyW1wiSGFuZ3VsIEphbW8gRXh0ZW5kZWQtQVwiXShhKXx8KCEhaXNDaGFyW1wiSGFuZ3VsIEphbW8gRXh0ZW5kZWQtQlwiXShhKXx8KCEhaXNDaGFyW1wiSGFuZ3VsIEphbW9cIl0oYSl8fCghIWlzQ2hhcltcIkhhbmd1bCBTeWxsYWJsZXNcIl0oYSl8fCghIWlzQ2hhci5IaXJhZ2FuYShhKXx8KCEhaXNDaGFyW1wiSWRlb2dyYXBoaWMgRGVzY3JpcHRpb24gQ2hhcmFjdGVyc1wiXShhKXx8KCEhaXNDaGFyLkthbmJ1bihhKXx8KCEhaXNDaGFyW1wiS2FuZ3hpIFJhZGljYWxzXCJdKGEpfHwoISFpc0NoYXJbXCJLYXRha2FuYSBQaG9uZXRpYyBFeHRlbnNpb25zXCJdKGEpfHwoISghaXNDaGFyLkthdGFrYW5hKGEpfHwxMjU0MD09PWEpfHwoISghaXNDaGFyW1wiSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXNcIl0oYSl8fDY1Mjg4PT09YXx8NjUyODk9PT1hfHw2NTI5Mz09PWF8fGE+PTY1MzA2JiZhPD02NTMxMHx8NjUzMzk9PT1hfHw2NTM0MT09PWF8fDY1MzQzPT09YXx8YT49NjUzNzEmJmE8PTY1NTAzfHw2NTUwNz09PWF8fGE+PTY1NTEyJiZhPD02NTUxOSl8fCghKCFpc0NoYXJbXCJTbWFsbCBGb3JtIFZhcmlhbnRzXCJdKGEpfHxhPj02NTExMiYmYTw9NjUxMTh8fGE+PTY1MTIzJiZhPD02NTEyNil8fCghIWlzQ2hhcltcIlVuaWZpZWQgQ2FuYWRpYW4gQWJvcmlnaW5hbCBTeWxsYWJpY3NcIl0oYSl8fCghIWlzQ2hhcltcIlVuaWZpZWQgQ2FuYWRpYW4gQWJvcmlnaW5hbCBTeWxsYWJpY3MgRXh0ZW5kZWRcIl0oYSl8fCghIWlzQ2hhcltcIlZlcnRpY2FsIEZvcm1zXCJdKGEpfHwoISFpc0NoYXJbXCJZaWppbmcgSGV4YWdyYW0gU3ltYm9sc1wiXShhKXx8KCEhaXNDaGFyW1wiWWkgU3lsbGFibGVzXCJdKGEpfHwhIWlzQ2hhcltcIllpIFJhZGljYWxzXCJdKGEpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSl9LGV4cG9ydHMuY2hhckhhc05ldXRyYWxWZXJ0aWNhbE9yaWVudGF0aW9uPWZ1bmN0aW9uKGEpe3JldHVybiEoIWlzQ2hhcltcIkxhdGluLTEgU3VwcGxlbWVudFwiXShhKXx8MTY3IT09YSYmMTY5IT09YSYmMTc0IT09YSYmMTc3IT09YSYmMTg4IT09YSYmMTg5IT09YSYmMTkwIT09YSYmMjE1IT09YSYmMjQ3IT09YSl8fCghKCFpc0NoYXJbXCJHZW5lcmFsIFB1bmN0dWF0aW9uXCJdKGEpfHw4MjE0IT09YSYmODIyNCE9PWEmJjgyMjUhPT1hJiY4MjQwIT09YSYmODI0MSE9PWEmJjgyNTEhPT1hJiY4MjUyIT09YSYmODI1OCE9PWEmJjgyNjMhPT1hJiY4MjY0IT09YSYmODI2NSE9PWEmJjgyNzMhPT1hKXx8KCEhaXNDaGFyW1wiTGV0dGVybGlrZSBTeW1ib2xzXCJdKGEpfHwoISFpc0NoYXJbXCJOdW1iZXIgRm9ybXNcIl0oYSl8fCghKCFpc0NoYXJbXCJNaXNjZWxsYW5lb3VzIFRlY2huaWNhbFwiXShhKXx8IShhPj04OTYwJiZhPD04OTY3fHxhPj04OTcyJiZhPD04OTkxfHxhPj04OTk2JiZhPD05ZTN8fDkwMDM9PT1hfHxhPj05MDg1JiZhPD05MTE0fHxhPj05MTUwJiZhPD05MTY1fHw5MTY3PT09YXx8YT49OTE2OSYmYTw9OTE3OXx8YT49OTE4NiYmYTw9OTIxNSkpfHwoISghaXNDaGFyW1wiQ29udHJvbCBQaWN0dXJlc1wiXShhKXx8OTI1MT09PWEpfHwoISFpc0NoYXJbXCJPcHRpY2FsIENoYXJhY3RlciBSZWNvZ25pdGlvblwiXShhKXx8KCEhaXNDaGFyW1wiRW5jbG9zZWQgQWxwaGFudW1lcmljc1wiXShhKXx8KCEhaXNDaGFyW1wiR2VvbWV0cmljIFNoYXBlc1wiXShhKXx8KCEoIWlzQ2hhcltcIk1pc2NlbGxhbmVvdXMgU3ltYm9sc1wiXShhKXx8YT49OTc1NCYmYTw9OTc1OSl8fCghKCFpc0NoYXJbXCJNaXNjZWxsYW5lb3VzIFN5bWJvbHMgYW5kIEFycm93c1wiXShhKXx8IShhPj0xMTAyNiYmYTw9MTEwNTV8fGE+PTExMDg4JiZhPD0xMTA5N3x8YT49MTExOTImJmE8PTExMjQzKSl8fCghIWlzQ2hhcltcIkNKSyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvblwiXShhKXx8KCEhaXNDaGFyLkthdGFrYW5hKGEpfHwoISFpc0NoYXJbXCJQcml2YXRlIFVzZSBBcmVhXCJdKGEpfHwoISFpc0NoYXJbXCJDSksgQ29tcGF0aWJpbGl0eSBGb3Jtc1wiXShhKXx8KCEhaXNDaGFyW1wiU21hbGwgRm9ybSBWYXJpYW50c1wiXShhKXx8KCEhaXNDaGFyW1wiSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXNcIl0oYSl8fCg4NzM0PT09YXx8ODc1Nj09PWF8fDg3NTc9PT1hfHxhPj05OTg0JiZhPD0xMDA4N3x8YT49MTAxMDImJmE8PTEwMTMxfHw2NTUzMj09PWF8fDY1NTMzPT09YSkpKSkpKSkpKSkpKSkpKSkpfSxleHBvcnRzLmNoYXJIYXNSb3RhdGVkVmVydGljYWxPcmllbnRhdGlvbj1mdW5jdGlvbihhKXtyZXR1cm4hKGV4cG9ydHMuY2hhckhhc1VwcmlnaHRWZXJ0aWNhbE9yaWVudGF0aW9uKGEpfHxleHBvcnRzLmNoYXJIYXNOZXV0cmFsVmVydGljYWxPcmllbnRhdGlvbihhKSl9O1xufSx7XCIuL2lzX2NoYXJfaW5fdW5pY29kZV9ibG9ja1wiOjIwOH1dLDIxMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgTG5nTGF0PV9kZXJlcV8oXCIuLi9nZW8vbG5nX2xhdFwiKTttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihuLHQsbCl7aWYobj1uZXcgTG5nTGF0KG4ubG5nLG4ubGF0KSx0KXt2YXIgYT1uZXcgTG5nTGF0KG4ubG5nLTM2MCxuLmxhdCksaT1uZXcgTG5nTGF0KG4ubG5nKzM2MCxuLmxhdCksbz1sLmxvY2F0aW9uUG9pbnQobikuZGlzdFNxcih0KTtsLmxvY2F0aW9uUG9pbnQoYSkuZGlzdFNxcih0KTxvP249YTpsLmxvY2F0aW9uUG9pbnQoaSkuZGlzdFNxcih0KTxvJiYobj1pKX1mb3IoO01hdGguYWJzKG4ubG5nLWwuY2VudGVyLmxuZyk+MTgwOyl7dmFyIGU9bC5sb2NhdGlvblBvaW50KG4pO2lmKGUueD49MCYmZS55Pj0wJiZlLng8PWwud2lkdGgmJmUueTw9bC5oZWlnaHQpYnJlYWs7bi5sbmc+bC5jZW50ZXIubG5nP24ubG5nLT0zNjA6bi5sbmcrPTM2MH1yZXR1cm4gbn07XG59LHtcIi4uL2dlby9sbmdfbGF0XCI6NjJ9XSwyMTM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gY3JlYXRlU3RydWN0QXJyYXlUeXBlKHQpe3ZhciBlPUpTT04uc3RyaW5naWZ5KHQpO2lmKHN0cnVjdEFycmF5VHlwZUNhY2hlW2VdKXJldHVybiBzdHJ1Y3RBcnJheVR5cGVDYWNoZVtlXTt2YXIgcj12b2lkIDA9PT10LmFsaWdubWVudD8xOnQuYWxpZ25tZW50LGk9MCxuPTAsYT1bXCJVaW50OFwiXSxvPXQubWVtYmVycy5tYXAoZnVuY3Rpb24odCl7YS5pbmRleE9mKHQudHlwZSk8MCYmYS5wdXNoKHQudHlwZSk7dmFyIGU9c2l6ZU9mKHQudHlwZSksbz1pPWFsaWduKGksTWF0aC5tYXgocixlKSkscz10LmNvbXBvbmVudHN8fDE7cmV0dXJuIG49TWF0aC5tYXgobixlKSxpKz1lKnMse25hbWU6dC5uYW1lLHR5cGU6dC50eXBlLGNvbXBvbmVudHM6cyxvZmZzZXQ6b319KSxzPWFsaWduKGksTWF0aC5tYXgobixyKSkscD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KFN0cnVjdCk7cC5wcm90b3R5cGUuYWxpZ25tZW50PXIscC5wcm90b3R5cGUuc2l6ZT1zO2Zvcih2YXIgeT0wLGM9bzt5PGMubGVuZ3RoO3krPTEpZm9yKHZhciBoPWNbeV0sdT0wO3U8aC5jb21wb25lbnRzO3UrKyl7dmFyIGY9aC5uYW1lKygxPT09aC5jb21wb25lbnRzP1wiXCI6dSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHAucHJvdG90eXBlLGYse2dldDpjcmVhdGVHZXR0ZXIoaCx1KSxzZXQ6Y3JlYXRlU2V0dGVyKGgsdSl9KX12YXIgbT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHQmJihlLl9fcHJvdG9fXz10KSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGV9KFN0cnVjdEFycmF5KTtyZXR1cm4gbS5wcm90b3R5cGUubWVtYmVycz1vLG0ucHJvdG90eXBlLlN0cnVjdFR5cGU9cCxtLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQ9cyxtLnByb3RvdHlwZS5lbXBsYWNlQmFjaz1jcmVhdGVFbXBsYWNlQmFjayhvLHMpLG0ucHJvdG90eXBlLl91c2VkVHlwZXM9YSxzdHJ1Y3RBcnJheVR5cGVDYWNoZVtlXT1tLG19ZnVuY3Rpb24gYWxpZ24odCxlKXtyZXR1cm4gTWF0aC5jZWlsKHQvZSkqZX1mdW5jdGlvbiBzaXplT2YodCl7cmV0dXJuIHZpZXdUeXBlc1t0XS5CWVRFU19QRVJfRUxFTUVOVH1mdW5jdGlvbiBnZXRBcnJheVZpZXdOYW1lKHQpe3JldHVybiB0LnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gY3JlYXRlRW1wbGFjZUJhY2sodCxlKXtmb3IodmFyIHI9W10saT1bXSxuPVwidmFyIGkgPSB0aGlzLmxlbmd0aDtcXG50aGlzLnJlc2l6ZSh0aGlzLmxlbmd0aCArIDEpO1xcblwiLGE9MCxvPXQ7YTxvLmxlbmd0aDthKz0xKXt2YXIgcz1vW2FdLHA9c2l6ZU9mKHMudHlwZSk7ci5pbmRleE9mKHApPDAmJihyLnB1c2gocCksbis9XCJ2YXIgb1wiK3AudG9GaXhlZCgwKStcIiA9IGkgKiBcIisoZS9wKS50b0ZpeGVkKDApK1wiO1xcblwiKTtmb3IodmFyIHk9MDt5PHMuY29tcG9uZW50czt5Kyspe3ZhciBjPVwidlwiK2kubGVuZ3RoLGg9XCJvXCIrcC50b0ZpeGVkKDApK1wiICsgXCIrKHMub2Zmc2V0L3AreSkudG9GaXhlZCgwKTtuKz1cInRoaXMuXCIrZ2V0QXJyYXlWaWV3TmFtZShzLnR5cGUpK1wiW1wiK2grXCJdID0gXCIrYytcIjtcXG5cIixpLnB1c2goYyl9fXJldHVybiBuKz1cInJldHVybiBpO1wiLG5ldyBGdW5jdGlvbihpLnRvU3RyaW5nKCksbil9ZnVuY3Rpb24gY3JlYXRlTWVtYmVyQ29tcG9uZW50U3RyaW5nKHQsZSl7dmFyIHI9XCJ0aGlzLl9wb3NcIitzaXplT2YodC50eXBlKS50b0ZpeGVkKDApLGk9KHQub2Zmc2V0L3NpemVPZih0LnR5cGUpK2UpLnRvRml4ZWQoMCksbj1yK1wiICsgXCIraTtyZXR1cm5cInRoaXMuX3N0cnVjdEFycmF5LlwiK2dldEFycmF5Vmlld05hbWUodC50eXBlKStcIltcIituK1wiXVwifWZ1bmN0aW9uIGNyZWF0ZUdldHRlcih0LGUpe3JldHVybiBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gXCIrY3JlYXRlTWVtYmVyQ29tcG9uZW50U3RyaW5nKHQsZSkrXCI7XCIpfWZ1bmN0aW9uIGNyZWF0ZVNldHRlcih0LGUpe3JldHVybiBuZXcgRnVuY3Rpb24oXCJ4XCIsY3JlYXRlTWVtYmVyQ29tcG9uZW50U3RyaW5nKHQsZSkrXCIgPSB4O1wiKX1tb2R1bGUuZXhwb3J0cz1jcmVhdGVTdHJ1Y3RBcnJheVR5cGU7dmFyIHZpZXdUeXBlcz17SW50ODpJbnQ4QXJyYXksVWludDg6VWludDhBcnJheSxVaW50OENsYW1wZWQ6VWludDhDbGFtcGVkQXJyYXksSW50MTY6SW50MTZBcnJheSxVaW50MTY6VWludDE2QXJyYXksSW50MzI6SW50MzJBcnJheSxVaW50MzI6VWludDMyQXJyYXksRmxvYXQzMjpGbG9hdDMyQXJyYXksRmxvYXQ2NDpGbG9hdDY0QXJyYXl9LFN0cnVjdD1mdW5jdGlvbih0LGUpe3RoaXMuX3N0cnVjdEFycmF5PXQsdGhpcy5fcG9zMT1lKnRoaXMuc2l6ZSx0aGlzLl9wb3MyPXRoaXMuX3BvczEvMix0aGlzLl9wb3M0PXRoaXMuX3BvczEvNCx0aGlzLl9wb3M4PXRoaXMuX3BvczEvOH0sREVGQVVMVF9DQVBBQ0lUWT0xMjgsUkVTSVpFX01VTFRJUExJRVI9NSxTdHJ1Y3RBcnJheT1mdW5jdGlvbih0KXt0aGlzLmlzVHJhbnNmZXJyZWQ9ITEsdm9pZCAwIT09dD8odGhpcy5hcnJheUJ1ZmZlcj10LmFycmF5QnVmZmVyLHRoaXMubGVuZ3RoPXQubGVuZ3RoLHRoaXMuY2FwYWNpdHk9dGhpcy5hcnJheUJ1ZmZlci5ieXRlTGVuZ3RoL3RoaXMuYnl0ZXNQZXJFbGVtZW50LHRoaXMuX3JlZnJlc2hWaWV3cygpKToodGhpcy5jYXBhY2l0eT0tMSx0aGlzLnJlc2l6ZSgwKSl9O1N0cnVjdEFycmF5LnNlcmlhbGl6ZT1mdW5jdGlvbigpe3JldHVybnttZW1iZXJzOnRoaXMucHJvdG90eXBlLm1lbWJlcnMsYWxpZ25tZW50OnRoaXMucHJvdG90eXBlLlN0cnVjdFR5cGUucHJvdG90eXBlLmFsaWdubWVudCxieXRlc1BlckVsZW1lbnQ6dGhpcy5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50fX0sU3RydWN0QXJyYXkucHJvdG90eXBlLnNlcmlhbGl6ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fdHJpbSgpLHQmJih0aGlzLmlzVHJhbnNmZXJyZWQ9ITAsdC5wdXNoKHRoaXMuYXJyYXlCdWZmZXIpKSx7bGVuZ3RoOnRoaXMubGVuZ3RoLGFycmF5QnVmZmVyOnRoaXMuYXJyYXlCdWZmZXJ9fSxTdHJ1Y3RBcnJheS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgdGhpcy5TdHJ1Y3RUeXBlKHRoaXMsdCl9LFN0cnVjdEFycmF5LnByb3RvdHlwZS5fdHJpbT1mdW5jdGlvbigpe3RoaXMubGVuZ3RoIT09dGhpcy5jYXBhY2l0eSYmKHRoaXMuY2FwYWNpdHk9dGhpcy5sZW5ndGgsdGhpcy5hcnJheUJ1ZmZlcj10aGlzLmFycmF5QnVmZmVyLnNsaWNlKDAsdGhpcy5sZW5ndGgqdGhpcy5ieXRlc1BlckVsZW1lbnQpLHRoaXMuX3JlZnJlc2hWaWV3cygpKX0sU3RydWN0QXJyYXkucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbih0KXtpZih0aGlzLmxlbmd0aD10LHQ+dGhpcy5jYXBhY2l0eSl7dGhpcy5jYXBhY2l0eT1NYXRoLm1heCh0LE1hdGguZmxvb3IodGhpcy5jYXBhY2l0eSpSRVNJWkVfTVVMVElQTElFUiksREVGQVVMVF9DQVBBQ0lUWSksdGhpcy5hcnJheUJ1ZmZlcj1uZXcgQXJyYXlCdWZmZXIodGhpcy5jYXBhY2l0eSp0aGlzLmJ5dGVzUGVyRWxlbWVudCk7dmFyIGU9dGhpcy51aW50ODt0aGlzLl9yZWZyZXNoVmlld3MoKSxlJiZ0aGlzLnVpbnQ4LnNldChlKX19LFN0cnVjdEFycmF5LnByb3RvdHlwZS5fcmVmcmVzaFZpZXdzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMsZT0wLHI9dC5fdXNlZFR5cGVzO2U8ci5sZW5ndGg7ZSs9MSl7dmFyIGk9cltlXTt0W2dldEFycmF5Vmlld05hbWUoaSldPW5ldyB2aWV3VHlwZXNbaV0odC5hcnJheUJ1ZmZlcil9fSxTdHJ1Y3RBcnJheS5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10aGlzLGk9W10sbj10O248ZTtuKyspe3ZhciBhPXIuZ2V0KG4pO2kucHVzaChhKX1yZXR1cm4gaX07dmFyIHN0cnVjdEFycmF5VHlwZUNhY2hlPXt9O1xufSx7fV0sMjE0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcblwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIHJlc29sdmVUb2tlbnMoZSxuKXtyZXR1cm4gbi5yZXBsYWNlKC97KFtee31dKyl9L2csZnVuY3Rpb24obixyKXtyZXR1cm4gciBpbiBlP2Vbcl06XCJcIn0pfW1vZHVsZS5leHBvcnRzPXJlc29sdmVUb2tlbnM7XG59LHt9XSwyMTU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIFVuaXRCZXppZXI9X2RlcmVxXyhcIkBtYXBib3gvdW5pdGJlemllclwiKSxDb29yZGluYXRlPV9kZXJlcV8oXCIuLi9nZW8vY29vcmRpbmF0ZVwiKSxQb2ludD1fZGVyZXFfKFwicG9pbnQtZ2VvbWV0cnlcIik7ZXhwb3J0cy5lYXNlQ3ViaWNJbk91dD1mdW5jdGlvbihyKXtpZihyPD0wKXJldHVybiAwO2lmKHI+PTEpcmV0dXJuIDE7dmFyIGU9cipyLHQ9ZSpyO3JldHVybiA0KihyPC41P3Q6Myooci1lKSt0LS43NSl9LGV4cG9ydHMuYmV6aWVyPWZ1bmN0aW9uKHIsZSx0LG4pe3ZhciBvPW5ldyBVbml0QmV6aWVyKHIsZSx0LG4pO3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gby5zb2x2ZShyKX19LGV4cG9ydHMuZWFzZT1leHBvcnRzLmJlemllciguMjUsLjEsLjI1LDEpLGV4cG9ydHMuY2xhbXA9ZnVuY3Rpb24ocixlLHQpe3JldHVybiBNYXRoLm1pbih0LE1hdGgubWF4KGUscikpfSxleHBvcnRzLndyYXA9ZnVuY3Rpb24ocixlLHQpe3ZhciBuPXQtZSxvPSgoci1lKSVuK24pJW4rZTtyZXR1cm4gbz09PWU/dDpvfSxleHBvcnRzLmFzeW5jQWxsPWZ1bmN0aW9uKHIsZSx0KXtpZighci5sZW5ndGgpcmV0dXJuIHQobnVsbCxbXSk7dmFyIG49ci5sZW5ndGgsbz1uZXcgQXJyYXkoci5sZW5ndGgpLGE9bnVsbDtyLmZvckVhY2goZnVuY3Rpb24ocixpKXtlKHIsZnVuY3Rpb24ocixlKXtyJiYoYT1yKSxvW2ldPWUsMD09PS0tbiYmdChhLG8pfSl9KX0sZXhwb3J0cy52YWx1ZXM9ZnVuY3Rpb24ocil7dmFyIGU9W107Zm9yKHZhciB0IGluIHIpZS5wdXNoKHJbdF0pO3JldHVybiBlfSxleHBvcnRzLmtleXNEaWZmZXJlbmNlPWZ1bmN0aW9uKHIsZSl7dmFyIHQ9W107Zm9yKHZhciBuIGluIHIpbiBpbiBlfHx0LnB1c2gobik7cmV0dXJuIHR9LGV4cG9ydHMuZXh0ZW5kPWZ1bmN0aW9uKHIsZSx0LG4pe2Zvcih2YXIgbz1hcmd1bWVudHMsYT0xO2E8YXJndW1lbnRzLmxlbmd0aDthKyspe3ZhciBpPW9bYV07Zm9yKHZhciB1IGluIGkpclt1XT1pW3VdfXJldHVybiByfSxleHBvcnRzLnBpY2s9ZnVuY3Rpb24ocixlKXtmb3IodmFyIHQ9e30sbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgbz1lW25dO28gaW4gciYmKHRbb109cltvXSl9cmV0dXJuIHR9O3ZhciBpZD0xO2V4cG9ydHMudW5pcXVlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gaWQrK30sZXhwb3J0cy5iaW5kQWxsPWZ1bmN0aW9uKHIsZSl7ci5mb3JFYWNoKGZ1bmN0aW9uKHIpe2Vbcl0mJihlW3JdPWVbcl0uYmluZChlKSl9KX0sZXhwb3J0cy5nZXRDb29yZGluYXRlc0NlbnRlcj1mdW5jdGlvbihyKXtmb3IodmFyIGU9MS8wLHQ9MS8wLG49LSgxLzApLG89LSgxLzApLGE9MDthPHIubGVuZ3RoO2ErKyllPU1hdGgubWluKGUsclthXS5jb2x1bW4pLHQ9TWF0aC5taW4odCxyW2FdLnJvdyksbj1NYXRoLm1heChuLHJbYV0uY29sdW1uKSxvPU1hdGgubWF4KG8sclthXS5yb3cpO3ZhciBpPW4tZSx1PW8tdCxzPU1hdGgubWF4KGksdSksYz1NYXRoLm1heCgwLE1hdGguZmxvb3IoLU1hdGgubG9nKHMpL01hdGguTE4yKSk7cmV0dXJuIG5ldyBDb29yZGluYXRlKChlK24pLzIsKHQrbykvMiwwKS56b29tVG8oYyl9LGV4cG9ydHMuZW5kc1dpdGg9ZnVuY3Rpb24ocixlKXtyZXR1cm4gci5pbmRleE9mKGUsci5sZW5ndGgtZS5sZW5ndGgpIT09LTF9LGV4cG9ydHMubWFwT2JqZWN0PWZ1bmN0aW9uKHIsZSx0KXt2YXIgbj10aGlzLG89e307Zm9yKHZhciBhIGluIHIpb1thXT1lLmNhbGwodHx8bixyW2FdLGEscik7cmV0dXJuIG99LGV4cG9ydHMuZmlsdGVyT2JqZWN0PWZ1bmN0aW9uKHIsZSx0KXt2YXIgbj10aGlzLG89e307Zm9yKHZhciBhIGluIHIpZS5jYWxsKHR8fG4sclthXSxhLHIpJiYob1thXT1yW2FdKTtyZXR1cm4gb30sZXhwb3J0cy5kZWVwRXF1YWw9ZnVuY3Rpb24ocixlKXtpZihBcnJheS5pc0FycmF5KHIpKXtpZighQXJyYXkuaXNBcnJheShlKXx8ci5sZW5ndGghPT1lLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIHQ9MDt0PHIubGVuZ3RoO3QrKylpZighZXhwb3J0cy5kZWVwRXF1YWwoclt0XSxlW3RdKSlyZXR1cm4hMTtyZXR1cm4hMH1pZihcIm9iamVjdFwiPT10eXBlb2YgciYmbnVsbCE9PXImJm51bGwhPT1lKXtpZihcIm9iamVjdFwiIT10eXBlb2YgZSlyZXR1cm4hMTt2YXIgbj1PYmplY3Qua2V5cyhyKTtpZihuLmxlbmd0aCE9PU9iamVjdC5rZXlzKGUpLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIG8gaW4gcilpZighZXhwb3J0cy5kZWVwRXF1YWwocltvXSxlW29dKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gcj09PWV9LGV4cG9ydHMuY2xvbmU9ZnVuY3Rpb24ocil7cmV0dXJuIEFycmF5LmlzQXJyYXkocik/ci5tYXAoZXhwb3J0cy5jbG9uZSk6XCJvYmplY3RcIj09dHlwZW9mIHImJnI/ZXhwb3J0cy5tYXBPYmplY3QocixleHBvcnRzLmNsb25lKTpyfSxleHBvcnRzLmFycmF5c0ludGVyc2VjdD1mdW5jdGlvbihyLGUpe2Zvcih2YXIgdD0wO3Q8ci5sZW5ndGg7dCsrKWlmKGUuaW5kZXhPZihyW3RdKT49MClyZXR1cm4hMDtyZXR1cm4hMX07dmFyIHdhcm5PbmNlSGlzdG9yeT17fTtleHBvcnRzLndhcm5PbmNlPWZ1bmN0aW9uKHIpe3dhcm5PbmNlSGlzdG9yeVtyXXx8KFwidW5kZWZpbmVkXCIhPXR5cGVvZiBjb25zb2xlJiZjb25zb2xlLndhcm4ociksd2Fybk9uY2VIaXN0b3J5W3JdPSEwKX0sZXhwb3J0cy5pc0NvdW50ZXJDbG9ja3dpc2U9ZnVuY3Rpb24ocixlLHQpe3JldHVybih0Lnktci55KSooZS54LXIueCk+KGUueS1yLnkpKih0Lngtci54KX0sZXhwb3J0cy5jYWxjdWxhdGVTaWduZWRBcmVhPWZ1bmN0aW9uKHIpe2Zvcih2YXIgZT0wLHQ9MCxuPXIubGVuZ3RoLG89bi0xLGE9dm9pZCAwLGk9dm9pZCAwO3Q8bjtvPXQrKylhPXJbdF0saT1yW29dLGUrPShpLngtYS54KSooYS55K2kueSk7cmV0dXJuIGV9LGV4cG9ydHMuaXNDbG9zZWRQb2x5Z29uPWZ1bmN0aW9uKHIpe2lmKHIubGVuZ3RoPDQpcmV0dXJuITE7dmFyIGU9clswXSx0PXJbci5sZW5ndGgtMV07cmV0dXJuIShNYXRoLmFicyhlLngtdC54KT4wfHxNYXRoLmFicyhlLnktdC55KT4wKSYmTWF0aC5hYnMoZXhwb3J0cy5jYWxjdWxhdGVTaWduZWRBcmVhKHIpKT4uMDF9LGV4cG9ydHMuc3BoZXJpY2FsVG9DYXJ0ZXNpYW49ZnVuY3Rpb24ocil7dmFyIGU9clswXSx0PXJbMV0sbj1yWzJdO3JldHVybiB0Kz05MCx0Kj1NYXRoLlBJLzE4MCxuKj1NYXRoLlBJLzE4MCxbZSpNYXRoLmNvcyh0KSpNYXRoLnNpbihuKSxlKk1hdGguc2luKHQpKk1hdGguc2luKG4pLGUqTWF0aC5jb3MobildfSxleHBvcnRzLnBhcnNlQ2FjaGVDb250cm9sPWZ1bmN0aW9uKHIpe3ZhciBlPS8oPzpefCg/OlxccypcXCxcXHMqKSkoW15cXHgwMC1cXHgyMFxcKFxcKTw+QFxcLDtcXDpcXFxcXCJcXC9cXFtcXF1cXD9cXD1cXHtcXH1cXHg3Rl0rKSg/OlxcPSg/OihbXlxceDAwLVxceDIwXFwoXFwpPD5AXFwsO1xcOlxcXFxcIlxcL1xcW1xcXVxcP1xcPVxce1xcfVxceDdGXSspfCg/OlxcXCIoKD86W15cIlxcXFxdfFxcXFwuKSopXFxcIikpKT8vZyx0PXt9O2lmKHIucmVwbGFjZShlLGZ1bmN0aW9uKHIsZSxuLG8pe3ZhciBhPW58fG87cmV0dXJuIHRbZV09IWF8fGEudG9Mb3dlckNhc2UoKSxcIlwifSksdFtcIm1heC1hZ2VcIl0pe3ZhciBuPXBhcnNlSW50KHRbXCJtYXgtYWdlXCJdLDEwKTtpc05hTihuKT9kZWxldGUgdFtcIm1heC1hZ2VcIl06dFtcIm1heC1hZ2VcIl09bn1yZXR1cm4gdH07XG59LHtcIi4uL2dlby9jb29yZGluYXRlXCI6NjEsXCJAbWFwYm94L3VuaXRiZXppZXJcIjozLFwicG9pbnQtZ2VvbWV0cnlcIjoyNn1dLDIxNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgRmVhdHVyZT1mdW5jdGlvbihlLHQscixvKXt0aGlzLnR5cGU9XCJGZWF0dXJlXCIsdGhpcy5fdmVjdG9yVGlsZUZlYXR1cmU9ZSxlLl96PXQsZS5feD1yLGUuX3k9byx0aGlzLnByb3BlcnRpZXM9ZS5wcm9wZXJ0aWVzLG51bGwhPWUuaWQmJih0aGlzLmlkPWUuaWQpfSxwcm90b3R5cGVBY2Nlc3NvcnM9e2dlb21ldHJ5Ont9fTtwcm90b3R5cGVBY2Nlc3NvcnMuZ2VvbWV0cnkuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PXRoaXMuX2dlb21ldHJ5JiYodGhpcy5fZ2VvbWV0cnk9dGhpcy5fdmVjdG9yVGlsZUZlYXR1cmUudG9HZW9KU09OKHRoaXMuX3ZlY3RvclRpbGVGZWF0dXJlLl94LHRoaXMuX3ZlY3RvclRpbGVGZWF0dXJlLl95LHRoaXMuX3ZlY3RvclRpbGVGZWF0dXJlLl96KS5nZW9tZXRyeSksdGhpcy5fZ2VvbWV0cnl9LHByb3RvdHlwZUFjY2Vzc29ycy5nZW9tZXRyeS5zZXQ9ZnVuY3Rpb24oZSl7dGhpcy5fZ2VvbWV0cnk9ZX0sRmVhdHVyZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXtnZW9tZXRyeTp0aGlzLmdlb21ldHJ5fTtmb3IodmFyIHIgaW4gZSlcIl9nZW9tZXRyeVwiIT09ciYmXCJfdmVjdG9yVGlsZUZlYXR1cmVcIiE9PXImJih0W3JdPWVbcl0pO3JldHVybiB0fSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhGZWF0dXJlLnByb3RvdHlwZSxwcm90b3R5cGVBY2Nlc3NvcnMpLG1vZHVsZS5leHBvcnRzPUZlYXR1cmU7XG59LHt9XSwyMTc6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuXCJ1c2Ugc3RyaWN0XCI7dmFyIHNjcmlwdERldGVjdGlvbj1fZGVyZXFfKFwiLi9zY3JpcHRfZGV0ZWN0aW9uXCIpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbz1cIlwiLGU9MDtlPHQubGVuZ3RoO2UrKyl7dmFyIHI9dC5jaGFyQ29kZUF0KGUrMSl8fG51bGwsbD10LmNoYXJDb2RlQXQoZS0xKXx8bnVsbCxpPSghcnx8IXNjcmlwdERldGVjdGlvbi5jaGFySGFzUm90YXRlZFZlcnRpY2FsT3JpZW50YXRpb24ocil8fG1vZHVsZS5leHBvcnRzLmxvb2t1cFt0W2UrMV1dKSYmKCFsfHwhc2NyaXB0RGV0ZWN0aW9uLmNoYXJIYXNSb3RhdGVkVmVydGljYWxPcmllbnRhdGlvbihsKXx8bW9kdWxlLmV4cG9ydHMubG9va3VwW3RbZS0xXV0pO28rPWkmJm1vZHVsZS5leHBvcnRzLmxvb2t1cFt0W2VdXT9tb2R1bGUuZXhwb3J0cy5sb29rdXBbdFtlXV06dFtlXX1yZXR1cm4gb30sbW9kdWxlLmV4cG9ydHMubG9va3VwPXtcIiFcIjpcIu+4lVwiLFwiI1wiOlwi77yDXCIsJDpcIu+8hFwiLFwiJVwiOlwi77yFXCIsXCImXCI6XCLvvIZcIixcIihcIjpcIu+4tVwiLFwiKVwiOlwi77i2XCIsXCIqXCI6XCLvvIpcIixcIitcIjpcIu+8i1wiLFwiLFwiOlwi77iQXCIsXCItXCI6XCLvuLJcIixcIi5cIjpcIuODu1wiLFwiL1wiOlwi77yPXCIsXCI6XCI6XCLvuJNcIixcIjtcIjpcIu+4lFwiLFwiPFwiOlwi77i/XCIsXCI9XCI6XCLvvJ1cIixcIj5cIjpcIu+5gFwiLFwiP1wiOlwi77iWXCIsXCJAXCI6XCLvvKBcIixcIltcIjpcIu+5h1wiLFwiXFxcXFwiOlwi77y8XCIsXCJdXCI6XCLvuYhcIixcIl5cIjpcIu+8vlwiLF86XCLvuLNcIixcImBcIjpcIu+9gFwiLFwie1wiOlwi77i3XCIsXCJ8XCI6XCLigJVcIixcIn1cIjpcIu+4uFwiLFwiflwiOlwi772eXCIsXCLColwiOlwi77+gXCIsXCLCo1wiOlwi77+hXCIsXCLCpVwiOlwi77+lXCIsXCLCplwiOlwi77+kXCIsXCLCrFwiOlwi77+iXCIsXCLCr1wiOlwi77+jXCIsXCLigJNcIjpcIu+4slwiLFwi4oCUXCI6XCLvuLFcIixcIuKAmFwiOlwi77mDXCIsXCLigJlcIjpcIu+5hFwiLFwi4oCcXCI6XCLvuYFcIixcIuKAnVwiOlwi77mCXCIsXCLigKZcIjpcIu+4mVwiLFwi4oCnXCI6XCLjg7tcIixcIuKCqVwiOlwi77+mXCIsXCLjgIFcIjpcIu+4kVwiLFwi44CCXCI6XCLvuJJcIixcIuOAiFwiOlwi77i/XCIsXCLjgIlcIjpcIu+5gFwiLFwi44CKXCI6XCLvuL1cIixcIuOAi1wiOlwi77i+XCIsXCLjgIxcIjpcIu+5gVwiLFwi44CNXCI6XCLvuYJcIixcIuOAjlwiOlwi77mDXCIsXCLjgI9cIjpcIu+5hFwiLFwi44CQXCI6XCLvuLtcIixcIuOAkVwiOlwi77i8XCIsXCLjgJRcIjpcIu+4uVwiLFwi44CVXCI6XCLvuLpcIixcIuOAllwiOlwi77iXXCIsXCLjgJdcIjpcIu+4mFwiLFwi77yBXCI6XCLvuJVcIixcIu+8iFwiOlwi77i1XCIsXCLvvIlcIjpcIu+4tlwiLFwi77yMXCI6XCLvuJBcIixcIu+8jVwiOlwi77iyXCIsXCLvvI5cIjpcIuODu1wiLFwi77yaXCI6XCLvuJNcIixcIu+8m1wiOlwi77iUXCIsXCLvvJxcIjpcIu+4v1wiLFwi77yeXCI6XCLvuYBcIixcIu+8n1wiOlwi77iWXCIsXCLvvLtcIjpcIu+5h1wiLFwi77y9XCI6XCLvuYhcIixcIu+8v1wiOlwi77izXCIsXCLvvZtcIjpcIu+4t1wiLFwi772cXCI6XCLigJVcIixcIu+9nVwiOlwi77i4XCIsXCLvvZ9cIjpcIu+4tVwiLFwi772gXCI6XCLvuLZcIixcIu+9oVwiOlwi77iSXCIsXCLvvaJcIjpcIu+5gVwiLFwi772jXCI6XCLvuYJcIn07XG59LHtcIi4vc2NyaXB0X2RldGVjdGlvblwiOjIxMX1dLDIxODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7XG5cInVzZSBzdHJpY3RcIjt2YXIgV2ViV29ya2VyPV9kZXJlcV8oXCIuL3dlYl93b3JrZXJcIiksV29ya2VyUG9vbD1mdW5jdGlvbigpe3RoaXMuYWN0aXZlPXt9fTtXb3JrZXJQb29sLnByb3RvdHlwZS5hY3F1aXJlPWZ1bmN0aW9uKHIpe3ZhciBlPXRoaXM7aWYoIXRoaXMud29ya2Vycyl7dmFyIG89X2RlcmVxXyhcIi4uL1wiKS53b3JrZXJDb3VudDtmb3IodGhpcy53b3JrZXJzPVtdO3RoaXMud29ya2Vycy5sZW5ndGg8bzspZS53b3JrZXJzLnB1c2gobmV3IFdlYldvcmtlcil9cmV0dXJuIHRoaXMuYWN0aXZlW3JdPSEwLHRoaXMud29ya2Vycy5zbGljZSgpfSxXb3JrZXJQb29sLnByb3RvdHlwZS5yZWxlYXNlPWZ1bmN0aW9uKHIpe2RlbGV0ZSB0aGlzLmFjdGl2ZVtyXSwwPT09T2JqZWN0LmtleXModGhpcy5hY3RpdmUpLmxlbmd0aCYmKHRoaXMud29ya2Vycy5mb3JFYWNoKGZ1bmN0aW9uKHIpe3IudGVybWluYXRlKCl9KSx0aGlzLndvcmtlcnM9bnVsbCl9LG1vZHVsZS5leHBvcnRzPVdvcmtlclBvb2w7XG59LHtcIi4uL1wiOjY1LFwiLi93ZWJfd29ya2VyXCI6MTk2fV19LHt9LFs2NV0pKDY1KVxufSk7XG5cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWFwYm94LWdsLmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxudmFyIGRvbWFpbjtcblxuLy8gVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIHRvIHN0b3JlIGV2ZW50IGhhbmRsZXJzLiBJbnN0YW50aWF0aW5nIHRoaXMgaXNcbi8vIGZhc3RlciB0aGFuIGV4cGxpY2l0bHkgY2FsbGluZyBgT2JqZWN0LmNyZWF0ZShudWxsKWAgdG8gZ2V0IGEgXCJjbGVhblwiIGVtcHR5XG4vLyBvYmplY3QgKHRlc3RlZCB3aXRoIHY4IHY0LjkpLlxuZnVuY3Rpb24gRXZlbnRIYW5kbGVycygpIHt9XG5FdmVudEhhbmRsZXJzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgRXZlbnRFbWl0dGVyLmluaXQuY2FsbCh0aGlzKTtcbn1cbmV4cG9ydCBkZWZhdWx0IEV2ZW50RW1pdHRlcjtcbmV4cG9ydCB7RXZlbnRFbWl0dGVyfTtcblxuLy8gbm9kZWpzIG9kZGl0eVxuLy8gcmVxdWlyZSgnZXZlbnRzJykgPT09IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlclxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlclxuXG5FdmVudEVtaXR0ZXIudXNpbmdEb21haW5zID0gZmFsc2U7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZG9tYWluID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG5FdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG5FdmVudEVtaXR0ZXIuaW5pdCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmRvbWFpbiA9IG51bGw7XG4gIGlmIChFdmVudEVtaXR0ZXIudXNpbmdEb21haW5zKSB7XG4gICAgLy8gaWYgdGhlcmUgaXMgYW4gYWN0aXZlIGRvbWFpbiwgdGhlbiBhdHRhY2ggdG8gaXQuXG4gICAgaWYgKGRvbWFpbi5hY3RpdmUgJiYgISh0aGlzIGluc3RhbmNlb2YgZG9tYWluLkRvbWFpbikpIHtcbiAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluLmFjdGl2ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCB0aGlzLl9ldmVudHMgPT09IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSB7XG4gICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcnMoKTtcbiAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gIH1cblxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufTtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKG4pIHtcbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuIDwgMCB8fCBpc05hTihuKSlcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcIm5cIiBhcmd1bWVudCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gJGdldE1heExpc3RlbmVycyh0aGF0KSB7XG4gIGlmICh0aGF0Ll9tYXhMaXN0ZW5lcnMgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gIHJldHVybiB0aGF0Ll9tYXhMaXN0ZW5lcnM7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24gZ2V0TWF4TGlzdGVuZXJzKCkge1xuICByZXR1cm4gJGdldE1heExpc3RlbmVycyh0aGlzKTtcbn07XG5cbi8vIFRoZXNlIHN0YW5kYWxvbmUgZW1pdCogZnVuY3Rpb25zIGFyZSB1c2VkIHRvIG9wdGltaXplIGNhbGxpbmcgb2YgZXZlbnRcbi8vIGhhbmRsZXJzIGZvciBmYXN0IGNhc2VzIGJlY2F1c2UgZW1pdCgpIGl0c2VsZiBvZnRlbiBoYXMgYSB2YXJpYWJsZSBudW1iZXIgb2Zcbi8vIGFyZ3VtZW50cyBhbmQgY2FuIGJlIGRlb3B0aW1pemVkIGJlY2F1c2Ugb2YgdGhhdC4gVGhlc2UgZnVuY3Rpb25zIGFsd2F5cyBoYXZlXG4vLyB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzIGFuZCB0aHVzIGRvIG5vdCBnZXQgZGVvcHRpbWl6ZWQsIHNvIHRoZSBjb2RlXG4vLyBpbnNpZGUgdGhlbSBjYW4gZXhlY3V0ZSBmYXN0ZXIuXG5mdW5jdGlvbiBlbWl0Tm9uZShoYW5kbGVyLCBpc0ZuLCBzZWxmKSB7XG4gIGlmIChpc0ZuKVxuICAgIGhhbmRsZXIuY2FsbChzZWxmKTtcbiAgZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIGxpc3RlbmVyc1tpXS5jYWxsKHNlbGYpO1xuICB9XG59XG5mdW5jdGlvbiBlbWl0T25lKGhhbmRsZXIsIGlzRm4sIHNlbGYsIGFyZzEpIHtcbiAgaWYgKGlzRm4pXG4gICAgaGFuZGxlci5jYWxsKHNlbGYsIGFyZzEpO1xuICBlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgICAgbGlzdGVuZXJzW2ldLmNhbGwoc2VsZiwgYXJnMSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVtaXRUd28oaGFuZGxlciwgaXNGbiwgc2VsZiwgYXJnMSwgYXJnMikge1xuICBpZiAoaXNGbilcbiAgICBoYW5kbGVyLmNhbGwoc2VsZiwgYXJnMSwgYXJnMik7XG4gIGVsc2Uge1xuICAgIHZhciBsZW4gPSBoYW5kbGVyLmxlbmd0aDtcbiAgICB2YXIgbGlzdGVuZXJzID0gYXJyYXlDbG9uZShoYW5kbGVyLCBsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpXG4gICAgICBsaXN0ZW5lcnNbaV0uY2FsbChzZWxmLCBhcmcxLCBhcmcyKTtcbiAgfVxufVxuZnVuY3Rpb24gZW1pdFRocmVlKGhhbmRsZXIsIGlzRm4sIHNlbGYsIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgaWYgKGlzRm4pXG4gICAgaGFuZGxlci5jYWxsKHNlbGYsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICBlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgICAgbGlzdGVuZXJzW2ldLmNhbGwoc2VsZiwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdE1hbnkoaGFuZGxlciwgaXNGbiwgc2VsZiwgYXJncykge1xuICBpZiAoaXNGbilcbiAgICBoYW5kbGVyLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICBlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgICAgbGlzdGVuZXJzW2ldLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICB9XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQodHlwZSkge1xuICB2YXIgZXIsIGhhbmRsZXIsIGxlbiwgYXJncywgaSwgZXZlbnRzLCBkb21haW47XG4gIHZhciBuZWVkRG9tYWluRXhpdCA9IGZhbHNlO1xuICB2YXIgZG9FcnJvciA9ICh0eXBlID09PSAnZXJyb3InKTtcblxuICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gIGlmIChldmVudHMpXG4gICAgZG9FcnJvciA9IChkb0Vycm9yICYmIGV2ZW50cy5lcnJvciA9PSBudWxsKTtcbiAgZWxzZSBpZiAoIWRvRXJyb3IpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGRvbWFpbiA9IHRoaXMuZG9tYWluO1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKGRvRXJyb3IpIHtcbiAgICBlciA9IGFyZ3VtZW50c1sxXTtcbiAgICBpZiAoZG9tYWluKSB7XG4gICAgICBpZiAoIWVyKVxuICAgICAgICBlciA9IG5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkIFwiZXJyb3JcIiBldmVudCcpO1xuICAgICAgZXIuZG9tYWluRW1pdHRlciA9IHRoaXM7XG4gICAgICBlci5kb21haW4gPSBkb21haW47XG4gICAgICBlci5kb21haW5UaHJvd24gPSBmYWxzZTtcbiAgICAgIGRvbWFpbi5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICB9IGVsc2UgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgXCJlcnJvclwiIGV2ZW50LiAoJyArIGVyICsgJyknKTtcbiAgICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGhhbmRsZXIgPSBldmVudHNbdHlwZV07XG5cbiAgaWYgKCFoYW5kbGVyKVxuICAgIHJldHVybiBmYWxzZTtcblxuICB2YXIgaXNGbiA9IHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nO1xuICBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICBzd2l0Y2ggKGxlbikge1xuICAgIC8vIGZhc3QgY2FzZXNcbiAgICBjYXNlIDE6XG4gICAgICBlbWl0Tm9uZShoYW5kbGVyLCBpc0ZuLCB0aGlzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjpcbiAgICAgIGVtaXRPbmUoaGFuZGxlciwgaXNGbiwgdGhpcywgYXJndW1lbnRzWzFdKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzpcbiAgICAgIGVtaXRUd28oaGFuZGxlciwgaXNGbiwgdGhpcywgYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0OlxuICAgICAgZW1pdFRocmVlKGhhbmRsZXIsIGlzRm4sIHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdLCBhcmd1bWVudHNbM10pO1xuICAgICAgYnJlYWs7XG4gICAgLy8gc2xvd2VyXG4gICAgZGVmYXVsdDpcbiAgICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgICBmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspXG4gICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgZW1pdE1hbnkoaGFuZGxlciwgaXNGbiwgdGhpcywgYXJncyk7XG4gIH1cblxuICBpZiAobmVlZERvbWFpbkV4aXQpXG4gICAgZG9tYWluLmV4aXQoKTtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmZ1bmN0aW9uIF9hZGRMaXN0ZW5lcih0YXJnZXQsIHR5cGUsIGxpc3RlbmVyLCBwcmVwZW5kKSB7XG4gIHZhciBtO1xuICB2YXIgZXZlbnRzO1xuICB2YXIgZXhpc3Rpbmc7XG5cbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gIGlmICghZXZlbnRzKSB7XG4gICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVycygpO1xuICAgIHRhcmdldC5fZXZlbnRzQ291bnQgPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gICAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICAgIGlmIChldmVudHMubmV3TGlzdGVuZXIpIHtcbiAgICAgIHRhcmdldC5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA/IGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gICAgICAvLyBSZS1hc3NpZ24gYGV2ZW50c2AgYmVjYXVzZSBhIG5ld0xpc3RlbmVyIGhhbmRsZXIgY291bGQgaGF2ZSBjYXVzZWQgdGhlXG4gICAgICAvLyB0aGlzLl9ldmVudHMgdG8gYmUgYXNzaWduZWQgdG8gYSBuZXcgb2JqZWN0XG4gICAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgICB9XG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV07XG4gIH1cblxuICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgICArK3RhcmdldC5fZXZlbnRzQ291bnQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9IHByZXBlbmQgPyBbbGlzdGVuZXIsIGV4aXN0aW5nXSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZXhpc3RpbmcsIGxpc3RlbmVyXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgICAgaWYgKHByZXBlbmQpIHtcbiAgICAgICAgZXhpc3RpbmcudW5zaGlmdChsaXN0ZW5lcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGlzdGluZy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICAgIGlmICghZXhpc3Rpbmcud2FybmVkKSB7XG4gICAgICBtID0gJGdldE1heExpc3RlbmVycyh0YXJnZXQpO1xuICAgICAgaWYgKG0gJiYgbSA+IDAgJiYgZXhpc3RpbmcubGVuZ3RoID4gbSkge1xuICAgICAgICBleGlzdGluZy53YXJuZWQgPSB0cnVlO1xuICAgICAgICB2YXIgdyA9IG5ldyBFcnJvcignUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5sZW5ndGggKyAnICcgKyB0eXBlICsgJyBsaXN0ZW5lcnMgYWRkZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdCcpO1xuICAgICAgICB3Lm5hbWUgPSAnTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nJztcbiAgICAgICAgdy5lbWl0dGVyID0gdGFyZ2V0O1xuICAgICAgICB3LnR5cGUgPSB0eXBlO1xuICAgICAgICB3LmNvdW50ID0gZXhpc3RpbmcubGVuZ3RoO1xuICAgICAgICBlbWl0V2FybmluZyh3KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gZW1pdFdhcm5pbmcoZSkge1xuICB0eXBlb2YgY29uc29sZS53YXJuID09PSAnZnVuY3Rpb24nID8gY29uc29sZS53YXJuKGUpIDogY29uc29sZS5sb2coZSk7XG59XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24gYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICAgIH07XG5cbmZ1bmN0aW9uIF9vbmNlV3JhcCh0YXJnZXQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBmaXJlZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBnKCkge1xuICAgIHRhcmdldC5yZW1vdmVMaXN0ZW5lcih0eXBlLCBnKTtcbiAgICBpZiAoIWZpcmVkKSB7XG4gICAgICBmaXJlZCA9IHRydWU7XG4gICAgICBsaXN0ZW5lci5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG4gIGcubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgcmV0dXJuIGc7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UodHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIHRoaXMub24odHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICB0aGlzLnByZXBlbmRMaXN0ZW5lcih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbi8vIGVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZmYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgdmFyIGxpc3QsIGV2ZW50cywgcG9zaXRpb24sIGksIG9yaWdpbmFsTGlzdGVuZXI7XG5cbiAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdGVuZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKCFldmVudHMpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBsaXN0ID0gZXZlbnRzW3R5cGVdO1xuICAgICAgaWYgKCFsaXN0KVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8IChsaXN0Lmxpc3RlbmVyICYmIGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVycygpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcG9zaXRpb24gPSAtMTtcblxuICAgICAgICBmb3IgKGkgPSBsaXN0Lmxlbmd0aDsgaS0tID4gMDspIHtcbiAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHxcbiAgICAgICAgICAgICAgKGxpc3RbaV0ubGlzdGVuZXIgJiYgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgICAgICAgICBvcmlnaW5hbExpc3RlbmVyID0gbGlzdFtpXS5saXN0ZW5lcjtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgbGlzdFswXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcnMoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzcGxpY2VPbmUobGlzdCwgcG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgb3JpZ2luYWxMaXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cbiAgICBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnModHlwZSkge1xuICAgICAgdmFyIGxpc3RlbmVycywgZXZlbnRzO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoIWV2ZW50cylcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgICAgIGlmICghZXZlbnRzLnJlbW92ZUxpc3RlbmVyKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcnMoKTtcbiAgICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzW3R5cGVdKSB7XG4gICAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRIYW5kbGVycygpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhldmVudHMpO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwga2V5OyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcnMoKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gICAgICB9IGVsc2UgaWYgKGxpc3RlbmVycykge1xuICAgICAgICAvLyBMSUZPIG9yZGVyXG4gICAgICAgIGRvIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tsaXN0ZW5lcnMubGVuZ3RoIC0gMV0pO1xuICAgICAgICB9IHdoaWxlIChsaXN0ZW5lcnNbMF0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyh0eXBlKSB7XG4gIHZhciBldmxpc3RlbmVyO1xuICB2YXIgcmV0O1xuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuXG4gIGlmICghZXZlbnRzKVxuICAgIHJldCA9IFtdO1xuICBlbHNlIHtcbiAgICBldmxpc3RlbmVyID0gZXZlbnRzW3R5cGVdO1xuICAgIGlmICghZXZsaXN0ZW5lcilcbiAgICAgIHJldCA9IFtdO1xuICAgIGVsc2UgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKVxuICAgICAgcmV0ID0gW2V2bGlzdGVuZXIubGlzdGVuZXIgfHwgZXZsaXN0ZW5lcl07XG4gICAgZWxzZVxuICAgICAgcmV0ID0gdW53cmFwTGlzdGVuZXJzKGV2bGlzdGVuZXIpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICBpZiAodHlwZW9mIGVtaXR0ZXIubGlzdGVuZXJDb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyQ291bnQuY2FsbChlbWl0dGVyLCB0eXBlKTtcbiAgfVxufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gbGlzdGVuZXJDb3VudDtcbmZ1bmN0aW9uIGxpc3RlbmVyQ291bnQodHlwZSkge1xuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuXG4gIGlmIChldmVudHMpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcblxuICAgIGlmICh0eXBlb2YgZXZsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfSBlbHNlIGlmIChldmxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZXZlbnROYW1lcyA9IGZ1bmN0aW9uIGV2ZW50TmFtZXMoKSB7XG4gIHJldHVybiB0aGlzLl9ldmVudHNDb3VudCA+IDAgPyBSZWZsZWN0Lm93bktleXModGhpcy5fZXZlbnRzKSA6IFtdO1xufTtcblxuLy8gQWJvdXQgMS41eCBmYXN0ZXIgdGhhbiB0aGUgdHdvLWFyZyB2ZXJzaW9uIG9mIEFycmF5I3NwbGljZSgpLlxuZnVuY3Rpb24gc3BsaWNlT25lKGxpc3QsIGluZGV4KSB7XG4gIGZvciAodmFyIGkgPSBpbmRleCwgayA9IGkgKyAxLCBuID0gbGlzdC5sZW5ndGg7IGsgPCBuOyBpICs9IDEsIGsgKz0gMSlcbiAgICBsaXN0W2ldID0gbGlzdFtrXTtcbiAgbGlzdC5wb3AoKTtcbn1cblxuZnVuY3Rpb24gYXJyYXlDbG9uZShhcnIsIGkpIHtcbiAgdmFyIGNvcHkgPSBuZXcgQXJyYXkoaSk7XG4gIHdoaWxlIChpLS0pXG4gICAgY29weVtpXSA9IGFycltpXTtcbiAgcmV0dXJuIGNvcHk7XG59XG5cbmZ1bmN0aW9uIHVud3JhcExpc3RlbmVycyhhcnIpIHtcbiAgdmFyIHJldCA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyArK2kpIHtcbiAgICByZXRbaV0gPSBhcnJbaV0ubGlzdGVuZXIgfHwgYXJyW2ldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBXQVJOSU5HOiBETyBOT1QgbWFudWFsbHkgcmVxdWlyZSB0aGlzIG1vZHVsZS5cbiAqIFRoaXMgaXMgYSByZXBsYWNlbWVudCBmb3IgYGludmFyaWFudCguLi4pYCB1c2VkIGJ5IHRoZSBlcnJvciBjb2RlIHN5c3RlbVxuICogYW5kIHdpbGwgX29ubHlfIGJlIHJlcXVpcmVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGJhYmVsIHBhc3MuXG4gKiBJdCBhbHdheXMgdGhyb3dzLlxuICovXG5cbmZ1bmN0aW9uIHJlYWN0UHJvZEludmFyaWFudChjb2RlKSB7XG4gIHZhciBhcmdDb3VudCA9IGFyZ3VtZW50cy5sZW5ndGggLSAxO1xuXG4gIHZhciBtZXNzYWdlID0gJ01pbmlmaWVkIFJlYWN0IGVycm9yICMnICsgY29kZSArICc7IHZpc2l0ICcgKyAnaHR0cDovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL2Vycm9yLWRlY29kZXIuaHRtbD9pbnZhcmlhbnQ9JyArIGNvZGU7XG5cbiAgZm9yICh2YXIgYXJnSWR4ID0gMDsgYXJnSWR4IDwgYXJnQ291bnQ7IGFyZ0lkeCsrKSB7XG4gICAgbWVzc2FnZSArPSAnJmFyZ3NbXT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1thcmdJZHggKyAxXSk7XG4gIH1cblxuICBtZXNzYWdlICs9ICcgZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50JyArICcgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuJztcblxuICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIGVycm9yLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gIGVycm9yLmZyYW1lc1RvUG9wID0gMTsgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCByZWFjdFByb2RJbnZhcmlhbnQncyBvd24gZnJhbWVcblxuICB0aHJvdyBlcnJvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZWFjdFByb2RJbnZhcmlhbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVXNlIGludmFyaWFudCgpIHRvIGFzc2VydCBzdGF0ZSB3aGljaCB5b3VyIHByb2dyYW0gYXNzdW1lcyB0byBiZSB0cnVlLlxuICpcbiAqIFByb3ZpZGUgc3ByaW50Zi1zdHlsZSBmb3JtYXQgKG9ubHkgJXMgaXMgc3VwcG9ydGVkKSBhbmQgYXJndW1lbnRzXG4gKiB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYnJva2UgYW5kIHdoYXQgeW91IHdlcmVcbiAqIGV4cGVjdGluZy5cbiAqXG4gKiBUaGUgaW52YXJpYW50IG1lc3NhZ2Ugd2lsbCBiZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGludmFyaWFudFxuICogd2lsbCByZW1haW4gdG8gZW5zdXJlIGxvZ2ljIGRvZXMgbm90IGRpZmZlciBpbiBwcm9kdWN0aW9uLlxuICovXG5cbnZhciB2YWxpZGF0ZUZvcm1hdCA9IGZ1bmN0aW9uIHZhbGlkYXRlRm9ybWF0KGZvcm1hdCkge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhbGlkYXRlRm9ybWF0ID0gZnVuY3Rpb24gdmFsaWRhdGVGb3JtYXQoZm9ybWF0KSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFyaWFudCByZXF1aXJlcyBhbiBlcnJvciBtZXNzYWdlIGFyZ3VtZW50Jyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBpbnZhcmlhbnQoY29uZGl0aW9uLCBmb3JtYXQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgdmFsaWRhdGVGb3JtYXQoZm9ybWF0KTtcblxuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHZhciBlcnJvcjtcbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKCdNaW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCAnICsgJ2ZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBhcmdzID0gW2EsIGIsIGMsIGQsIGUsIGZdO1xuICAgICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdO1xuICAgICAgfSkpO1xuICAgICAgZXJyb3IubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICB9XG5cbiAgICBlcnJvci5mcmFtZXNUb1BvcCA9IDE7IC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgaW52YXJpYW50J3Mgb3duIGZyYW1lXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbnZhcmlhbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG5mdW5jdGlvbiBjaGVja01hc2sodmFsdWUsIGJpdG1hc2spIHtcbiAgcmV0dXJuICh2YWx1ZSAmIGJpdG1hc2spID09PSBiaXRtYXNrO1xufVxuXG52YXIgRE9NUHJvcGVydHlJbmplY3Rpb24gPSB7XG4gIC8qKlxuICAgKiBNYXBwaW5nIGZyb20gbm9ybWFsaXplZCwgY2FtZWxjYXNlZCBwcm9wZXJ0eSBuYW1lcyB0byBhIGNvbmZpZ3VyYXRpb24gdGhhdFxuICAgKiBzcGVjaWZpZXMgaG93IHRoZSBhc3NvY2lhdGVkIERPTSBwcm9wZXJ0eSBzaG91bGQgYmUgYWNjZXNzZWQgb3IgcmVuZGVyZWQuXG4gICAqL1xuICBNVVNUX1VTRV9QUk9QRVJUWTogMHgxLFxuICBIQVNfQk9PTEVBTl9WQUxVRTogMHg0LFxuICBIQVNfTlVNRVJJQ19WQUxVRTogMHg4LFxuICBIQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRTogMHgxMCB8IDB4OCxcbiAgSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRTogMHgyMCxcblxuICAvKipcbiAgICogSW5qZWN0IHNvbWUgc3BlY2lhbGl6ZWQga25vd2xlZGdlIGFib3V0IHRoZSBET00uIFRoaXMgdGFrZXMgYSBjb25maWcgb2JqZWN0XG4gICAqIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICAgKlxuICAgKiBpc0N1c3RvbUF0dHJpYnV0ZTogZnVuY3Rpb24gdGhhdCBnaXZlbiBhbiBhdHRyaWJ1dGUgbmFtZSB3aWxsIHJldHVybiB0cnVlXG4gICAqIGlmIGl0IGNhbiBiZSBpbnNlcnRlZCBpbnRvIHRoZSBET00gdmVyYmF0aW0uIFVzZWZ1bCBmb3IgZGF0YS0qIG9yIGFyaWEtKlxuICAgKiBhdHRyaWJ1dGVzIHdoZXJlIGl0J3MgaW1wb3NzaWJsZSB0byBlbnVtZXJhdGUgYWxsIG9mIHRoZSBwb3NzaWJsZVxuICAgKiBhdHRyaWJ1dGUgbmFtZXMsXG4gICAqXG4gICAqIFByb3BlcnRpZXM6IG9iamVjdCBtYXBwaW5nIERPTSBwcm9wZXJ0eSBuYW1lIHRvIG9uZSBvZiB0aGVcbiAgICogRE9NUHJvcGVydHlJbmplY3Rpb24gY29uc3RhbnRzIG9yIG51bGwuIElmIHlvdXIgYXR0cmlidXRlIGlzbid0IGluIGhlcmUsXG4gICAqIGl0IHdvbid0IGdldCB3cml0dGVuIHRvIHRoZSBET00uXG4gICAqXG4gICAqIERPTUF0dHJpYnV0ZU5hbWVzOiBvYmplY3QgbWFwcGluZyBSZWFjdCBhdHRyaWJ1dGUgbmFtZSB0byB0aGUgRE9NXG4gICAqIGF0dHJpYnV0ZSBuYW1lLiBBdHRyaWJ1dGUgbmFtZXMgbm90IHNwZWNpZmllZCB1c2UgdGhlICoqbG93ZXJjYXNlKipcbiAgICogbm9ybWFsaXplZCBuYW1lLlxuICAgKlxuICAgKiBET01BdHRyaWJ1dGVOYW1lc3BhY2VzOiBvYmplY3QgbWFwcGluZyBSZWFjdCBhdHRyaWJ1dGUgbmFtZSB0byB0aGUgRE9NXG4gICAqIGF0dHJpYnV0ZSBuYW1lc3BhY2UgVVJMLiAoQXR0cmlidXRlIG5hbWVzIG5vdCBzcGVjaWZpZWQgdXNlIG5vIG5hbWVzcGFjZS4pXG4gICAqXG4gICAqIERPTVByb3BlcnR5TmFtZXM6IHNpbWlsYXIgdG8gRE9NQXR0cmlidXRlTmFtZXMgYnV0IGZvciBET00gcHJvcGVydGllcy5cbiAgICogUHJvcGVydHkgbmFtZXMgbm90IHNwZWNpZmllZCB1c2UgdGhlIG5vcm1hbGl6ZWQgbmFtZS5cbiAgICpcbiAgICogRE9NTXV0YXRpb25NZXRob2RzOiBQcm9wZXJ0aWVzIHRoYXQgcmVxdWlyZSBzcGVjaWFsIG11dGF0aW9uIG1ldGhvZHMuIElmXG4gICAqIGB2YWx1ZWAgaXMgdW5kZWZpbmVkLCB0aGUgbXV0YXRpb24gbWV0aG9kIHNob3VsZCB1bnNldCB0aGUgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkb21Qcm9wZXJ0eUNvbmZpZyB0aGUgY29uZmlnIGFzIGRlc2NyaWJlZCBhYm92ZS5cbiAgICovXG4gIGluamVjdERPTVByb3BlcnR5Q29uZmlnOiBmdW5jdGlvbiAoZG9tUHJvcGVydHlDb25maWcpIHtcbiAgICB2YXIgSW5qZWN0aW9uID0gRE9NUHJvcGVydHlJbmplY3Rpb247XG4gICAgdmFyIFByb3BlcnRpZXMgPSBkb21Qcm9wZXJ0eUNvbmZpZy5Qcm9wZXJ0aWVzIHx8IHt9O1xuICAgIHZhciBET01BdHRyaWJ1dGVOYW1lc3BhY2VzID0gZG9tUHJvcGVydHlDb25maWcuRE9NQXR0cmlidXRlTmFtZXNwYWNlcyB8fCB7fTtcbiAgICB2YXIgRE9NQXR0cmlidXRlTmFtZXMgPSBkb21Qcm9wZXJ0eUNvbmZpZy5ET01BdHRyaWJ1dGVOYW1lcyB8fCB7fTtcbiAgICB2YXIgRE9NUHJvcGVydHlOYW1lcyA9IGRvbVByb3BlcnR5Q29uZmlnLkRPTVByb3BlcnR5TmFtZXMgfHwge307XG4gICAgdmFyIERPTU11dGF0aW9uTWV0aG9kcyA9IGRvbVByb3BlcnR5Q29uZmlnLkRPTU11dGF0aW9uTWV0aG9kcyB8fCB7fTtcblxuICAgIGlmIChkb21Qcm9wZXJ0eUNvbmZpZy5pc0N1c3RvbUF0dHJpYnV0ZSkge1xuICAgICAgRE9NUHJvcGVydHkuX2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zLnB1c2goZG9tUHJvcGVydHlDb25maWcuaXNDdXN0b21BdHRyaWJ1dGUpO1xuICAgIH1cblxuICAgIGZvciAodmFyIHByb3BOYW1lIGluIFByb3BlcnRpZXMpIHtcbiAgICAgICEhRE9NUHJvcGVydHkucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnaW5qZWN0RE9NUHJvcGVydHlDb25maWcoLi4uKTogWW91XFwncmUgdHJ5aW5nIHRvIGluamVjdCBET00gcHJvcGVydHkgXFwnJXNcXCcgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBpbmplY3RlZC4gWW91IG1heSBiZSBhY2NpZGVudGFsbHkgaW5qZWN0aW5nIHRoZSBzYW1lIERPTSBwcm9wZXJ0eSBjb25maWcgdHdpY2UsIG9yIHlvdSBtYXkgYmUgaW5qZWN0aW5nIHR3byBjb25maWdzIHRoYXQgaGF2ZSBjb25mbGljdGluZyBwcm9wZXJ0eSBuYW1lcy4nLCBwcm9wTmFtZSkgOiBfcHJvZEludmFyaWFudCgnNDgnLCBwcm9wTmFtZSkgOiB2b2lkIDA7XG5cbiAgICAgIHZhciBsb3dlckNhc2VkID0gcHJvcE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBwcm9wQ29uZmlnID0gUHJvcGVydGllc1twcm9wTmFtZV07XG5cbiAgICAgIHZhciBwcm9wZXJ0eUluZm8gPSB7XG4gICAgICAgIGF0dHJpYnV0ZU5hbWU6IGxvd2VyQ2FzZWQsXG4gICAgICAgIGF0dHJpYnV0ZU5hbWVzcGFjZTogbnVsbCxcbiAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wTmFtZSxcbiAgICAgICAgbXV0YXRpb25NZXRob2Q6IG51bGwsXG5cbiAgICAgICAgbXVzdFVzZVByb3BlcnR5OiBjaGVja01hc2socHJvcENvbmZpZywgSW5qZWN0aW9uLk1VU1RfVVNFX1BST1BFUlRZKSxcbiAgICAgICAgaGFzQm9vbGVhblZhbHVlOiBjaGVja01hc2socHJvcENvbmZpZywgSW5qZWN0aW9uLkhBU19CT09MRUFOX1ZBTFVFKSxcbiAgICAgICAgaGFzTnVtZXJpY1ZhbHVlOiBjaGVja01hc2socHJvcENvbmZpZywgSW5qZWN0aW9uLkhBU19OVU1FUklDX1ZBTFVFKSxcbiAgICAgICAgaGFzUG9zaXRpdmVOdW1lcmljVmFsdWU6IGNoZWNrTWFzayhwcm9wQ29uZmlnLCBJbmplY3Rpb24uSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUpLFxuICAgICAgICBoYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlOiBjaGVja01hc2socHJvcENvbmZpZywgSW5qZWN0aW9uLkhBU19PVkVSTE9BREVEX0JPT0xFQU5fVkFMVUUpXG4gICAgICB9O1xuICAgICAgIShwcm9wZXJ0eUluZm8uaGFzQm9vbGVhblZhbHVlICsgcHJvcGVydHlJbmZvLmhhc051bWVyaWNWYWx1ZSArIHByb3BlcnR5SW5mby5oYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlIDw9IDEpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0RPTVByb3BlcnR5OiBWYWx1ZSBjYW4gYmUgb25lIG9mIGJvb2xlYW4sIG92ZXJsb2FkZWQgYm9vbGVhbiwgb3IgbnVtZXJpYyB2YWx1ZSwgYnV0IG5vdCBhIGNvbWJpbmF0aW9uOiAlcycsIHByb3BOYW1lKSA6IF9wcm9kSW52YXJpYW50KCc1MCcsIHByb3BOYW1lKSA6IHZvaWQgMDtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgRE9NUHJvcGVydHkuZ2V0UG9zc2libGVTdGFuZGFyZE5hbWVbbG93ZXJDYXNlZF0gPSBwcm9wTmFtZTtcbiAgICAgIH1cblxuICAgICAgaWYgKERPTUF0dHJpYnV0ZU5hbWVzLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICB2YXIgYXR0cmlidXRlTmFtZSA9IERPTUF0dHJpYnV0ZU5hbWVzW3Byb3BOYW1lXTtcbiAgICAgICAgcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lO1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIERPTVByb3BlcnR5LmdldFBvc3NpYmxlU3RhbmRhcmROYW1lW2F0dHJpYnV0ZU5hbWVdID0gcHJvcE5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKERPTUF0dHJpYnV0ZU5hbWVzcGFjZXMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lc3BhY2UgPSBET01BdHRyaWJ1dGVOYW1lc3BhY2VzW3Byb3BOYW1lXTtcbiAgICAgIH1cblxuICAgICAgaWYgKERPTVByb3BlcnR5TmFtZXMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWUgPSBET01Qcm9wZXJ0eU5hbWVzW3Byb3BOYW1lXTtcbiAgICAgIH1cblxuICAgICAgaWYgKERPTU11dGF0aW9uTWV0aG9kcy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcGVydHlJbmZvLm11dGF0aW9uTWV0aG9kID0gRE9NTXV0YXRpb25NZXRob2RzW3Byb3BOYW1lXTtcbiAgICAgIH1cblxuICAgICAgRE9NUHJvcGVydHkucHJvcGVydGllc1twcm9wTmFtZV0gPSBwcm9wZXJ0eUluZm87XG4gICAgfVxuICB9XG59O1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG52YXIgQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiA9ICc6QS1aX2EtelxcXFx1MDBDMC1cXFxcdTAwRDZcXFxcdTAwRDgtXFxcXHUwMEY2XFxcXHUwMEY4LVxcXFx1MDJGRlxcXFx1MDM3MC1cXFxcdTAzN0RcXFxcdTAzN0YtXFxcXHUxRkZGXFxcXHUyMDBDLVxcXFx1MjAwRFxcXFx1MjA3MC1cXFxcdTIxOEZcXFxcdTJDMDAtXFxcXHUyRkVGXFxcXHUzMDAxLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkZEJztcbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiAqL1xuXG4vKipcbiAqIERPTVByb3BlcnR5IGV4cG9ydHMgbG9va3VwIG9iamVjdHMgdGhhdCBjYW4gYmUgdXNlZCBsaWtlIGZ1bmN0aW9uczpcbiAqXG4gKiAgID4gRE9NUHJvcGVydHkuaXNWYWxpZFsnaWQnXVxuICogICB0cnVlXG4gKiAgID4gRE9NUHJvcGVydHkuaXNWYWxpZFsnZm9vYmFyJ11cbiAqICAgdW5kZWZpbmVkXG4gKlxuICogQWx0aG91Z2ggdGhpcyBtYXkgYmUgY29uZnVzaW5nLCBpdCBwZXJmb3JtcyBiZXR0ZXIgaW4gZ2VuZXJhbC5cbiAqXG4gKiBAc2VlIGh0dHA6Ly9qc3BlcmYuY29tL2tleS1leGlzdHNcbiAqIEBzZWUgaHR0cDovL2pzcGVyZi5jb20va2V5LW1pc3NpbmdcbiAqL1xudmFyIERPTVByb3BlcnR5ID0ge1xuICBJRF9BVFRSSUJVVEVfTkFNRTogJ2RhdGEtcmVhY3RpZCcsXG4gIFJPT1RfQVRUUklCVVRFX05BTUU6ICdkYXRhLXJlYWN0cm9vdCcsXG5cbiAgQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUjogQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUixcbiAgQVRUUklCVVRFX05BTUVfQ0hBUjogQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiArICdcXFxcLS4wLTlcXFxcdTAwQjdcXFxcdTAzMDAtXFxcXHUwMzZGXFxcXHUyMDNGLVxcXFx1MjA0MCcsXG5cbiAgLyoqXG4gICAqIE1hcCBmcm9tIHByb3BlcnR5IFwic3RhbmRhcmQgbmFtZVwiIHRvIGFuIG9iamVjdCB3aXRoIGluZm8gYWJvdXQgaG93IHRvIHNldFxuICAgKiB0aGUgcHJvcGVydHkgaW4gdGhlIERPTS4gRWFjaCBvYmplY3QgY29udGFpbnM6XG4gICAqXG4gICAqIGF0dHJpYnV0ZU5hbWU6XG4gICAqICAgVXNlZCB3aGVuIHJlbmRlcmluZyBtYXJrdXAgb3Igd2l0aCBgKkF0dHJpYnV0ZSgpYC5cbiAgICogYXR0cmlidXRlTmFtZXNwYWNlXG4gICAqIHByb3BlcnR5TmFtZTpcbiAgICogICBVc2VkIG9uIERPTSBub2RlIGluc3RhbmNlcy4gKFRoaXMgaW5jbHVkZXMgcHJvcGVydGllcyB0aGF0IG11dGF0ZSBkdWUgdG9cbiAgICogICBleHRlcm5hbCBmYWN0b3JzLilcbiAgICogbXV0YXRpb25NZXRob2Q6XG4gICAqICAgSWYgbm9uLW51bGwsIHVzZWQgaW5zdGVhZCBvZiB0aGUgcHJvcGVydHkgb3IgYHNldEF0dHJpYnV0ZSgpYCBhZnRlclxuICAgKiAgIGluaXRpYWwgcmVuZGVyLlxuICAgKiBtdXN0VXNlUHJvcGVydHk6XG4gICAqICAgV2hldGhlciB0aGUgcHJvcGVydHkgbXVzdCBiZSBhY2Nlc3NlZCBhbmQgbXV0YXRlZCBhcyBhbiBvYmplY3QgcHJvcGVydHkuXG4gICAqIGhhc0Jvb2xlYW5WYWx1ZTpcbiAgICogICBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIHNldCB0byBhIGZhbHNleSB2YWx1ZS5cbiAgICogaGFzTnVtZXJpY1ZhbHVlOlxuICAgKiAgIFdoZXRoZXIgdGhlIHByb3BlcnR5IG11c3QgYmUgbnVtZXJpYyBvciBwYXJzZSBhcyBhIG51bWVyaWMgYW5kIHNob3VsZCBiZVxuICAgKiAgIHJlbW92ZWQgd2hlbiBzZXQgdG8gYSBmYWxzZXkgdmFsdWUuXG4gICAqIGhhc1Bvc2l0aXZlTnVtZXJpY1ZhbHVlOlxuICAgKiAgIFdoZXRoZXIgdGhlIHByb3BlcnR5IG11c3QgYmUgcG9zaXRpdmUgbnVtZXJpYyBvciBwYXJzZSBhcyBhIHBvc2l0aXZlXG4gICAqICAgbnVtZXJpYyBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiBzZXQgdG8gYSBmYWxzZXkgdmFsdWUuXG4gICAqIGhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWU6XG4gICAqICAgV2hldGhlciB0aGUgcHJvcGVydHkgY2FuIGJlIHVzZWQgYXMgYSBmbGFnIGFzIHdlbGwgYXMgd2l0aCBhIHZhbHVlLlxuICAgKiAgIFJlbW92ZWQgd2hlbiBzdHJpY3RseSBlcXVhbCB0byBmYWxzZTsgcHJlc2VudCB3aXRob3V0IGEgdmFsdWUgd2hlblxuICAgKiAgIHN0cmljdGx5IGVxdWFsIHRvIHRydWU7IHByZXNlbnQgd2l0aCBhIHZhbHVlIG90aGVyd2lzZS5cbiAgICovXG4gIHByb3BlcnRpZXM6IHt9LFxuXG4gIC8qKlxuICAgKiBNYXBwaW5nIGZyb20gbG93ZXJjYXNlIHByb3BlcnR5IG5hbWVzIHRvIHRoZSBwcm9wZXJseSBjYXNlZCB2ZXJzaW9uLCB1c2VkXG4gICAqIHRvIHdhcm4gaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBwcm9wZXJ0aWVzLiBBdmFpbGFibGUgb25seSBpbiBfX0RFVl9fLlxuICAgKlxuICAgKiBhdXRvZm9jdXMgaXMgcHJlZGVmaW5lZCwgYmVjYXVzZSBhZGRpbmcgaXQgdG8gdGhlIHByb3BlcnR5IHdoaXRlbGlzdFxuICAgKiBjYXVzZXMgdW5pbnRlbmRlZCBzaWRlIGVmZmVjdHMuXG4gICAqXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHsgYXV0b2ZvY3VzOiAnYXV0b0ZvY3VzJyB9IDogbnVsbCxcblxuICAvKipcbiAgICogQWxsIG9mIHRoZSBpc0N1c3RvbUF0dHJpYnV0ZSgpIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYmVlbiBpbmplY3RlZC5cbiAgICovXG4gIF9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9uczogW10sXG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgcHJvcGVydHkgbmFtZSBpcyBhIGN1c3RvbSBhdHRyaWJ1dGUuXG4gICAqIEBtZXRob2RcbiAgICovXG4gIGlzQ3VzdG9tQXR0cmlidXRlOiBmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgRE9NUHJvcGVydHkuX2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXNDdXN0b21BdHRyaWJ1dGVGbiA9IERPTVByb3BlcnR5Ll9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9uc1tpXTtcbiAgICAgIGlmIChpc0N1c3RvbUF0dHJpYnV0ZUZuKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgaW5qZWN0aW9uOiBET01Qcm9wZXJ0eUluamVjdGlvblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBET01Qcm9wZXJ0eTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE1LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RET01Db21wb25lbnRGbGFncyA9IHtcbiAgaGFzQ2FjaGVkQ2hpbGROb2RlczogMSA8PCAwXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NQ29tcG9uZW50RmxhZ3M7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIERPTVByb3BlcnR5ID0gcmVxdWlyZSgnLi9ET01Qcm9wZXJ0eScpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50RmxhZ3MgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50RmxhZ3MnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG52YXIgQVRUUl9OQU1FID0gRE9NUHJvcGVydHkuSURfQVRUUklCVVRFX05BTUU7XG52YXIgRmxhZ3MgPSBSZWFjdERPTUNvbXBvbmVudEZsYWdzO1xuXG52YXIgaW50ZXJuYWxJbnN0YW5jZUtleSA9ICdfX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSQnICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBnaXZlbiBub2RlIHNob3VsZCBiZSBjYWNoZWQuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFByZWNhY2hlTm9kZShub2RlLCBub2RlSUQpIHtcbiAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKSA9PT0gU3RyaW5nKG5vZGVJRCkgfHwgbm9kZS5ub2RlVHlwZSA9PT0gOCAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gJyByZWFjdC10ZXh0OiAnICsgbm9kZUlEICsgJyAnIHx8IG5vZGUubm9kZVR5cGUgPT09IDggJiYgbm9kZS5ub2RlVmFsdWUgPT09ICcgcmVhY3QtZW1wdHk6ICcgKyBub2RlSUQgKyAnICc7XG59XG5cbi8qKlxuICogRHJpbGwgZG93biAodGhyb3VnaCBjb21wb3NpdGVzIGFuZCBlbXB0eSBjb21wb25lbnRzKSB1bnRpbCB3ZSBnZXQgYSBob3N0IG9yXG4gKiBob3N0IHRleHQgY29tcG9uZW50LlxuICpcbiAqIFRoaXMgaXMgcHJldHR5IHBvbHltb3JwaGljIGJ1dCB1bmF2b2lkYWJsZSB3aXRoIHRoZSBjdXJyZW50IHN0cnVjdHVyZSB3ZSBoYXZlXG4gKiBmb3IgYF9yZW5kZXJlZENoaWxkcmVuYC5cbiAqL1xuZnVuY3Rpb24gZ2V0UmVuZGVyZWRIb3N0T3JUZXh0RnJvbUNvbXBvbmVudChjb21wb25lbnQpIHtcbiAgdmFyIHJlbmRlcmVkO1xuICB3aGlsZSAocmVuZGVyZWQgPSBjb21wb25lbnQuX3JlbmRlcmVkQ29tcG9uZW50KSB7XG4gICAgY29tcG9uZW50ID0gcmVuZGVyZWQ7XG4gIH1cbiAgcmV0dXJuIGNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBQb3B1bGF0ZSBgX2hvc3ROb2RlYCBvbiB0aGUgcmVuZGVyZWQgaG9zdC90ZXh0IGNvbXBvbmVudCB3aXRoIHRoZSBnaXZlblxuICogRE9NIG5vZGUuIFRoZSBwYXNzZWQgYGluc3RgIGNhbiBiZSBhIGNvbXBvc2l0ZS5cbiAqL1xuZnVuY3Rpb24gcHJlY2FjaGVOb2RlKGluc3QsIG5vZGUpIHtcbiAgdmFyIGhvc3RJbnN0ID0gZ2V0UmVuZGVyZWRIb3N0T3JUZXh0RnJvbUNvbXBvbmVudChpbnN0KTtcbiAgaG9zdEluc3QuX2hvc3ROb2RlID0gbm9kZTtcbiAgbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSA9IGhvc3RJbnN0O1xufVxuXG5mdW5jdGlvbiB1bmNhY2hlTm9kZShpbnN0KSB7XG4gIHZhciBub2RlID0gaW5zdC5faG9zdE5vZGU7XG4gIGlmIChub2RlKSB7XG4gICAgZGVsZXRlIG5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG4gICAgaW5zdC5faG9zdE5vZGUgPSBudWxsO1xuICB9XG59XG5cbi8qKlxuICogUG9wdWxhdGUgYF9ob3N0Tm9kZWAgb24gZWFjaCBjaGlsZCBvZiBgaW5zdGAsIGFzc3VtaW5nIHRoYXQgdGhlIGNoaWxkcmVuXG4gKiBtYXRjaCB1cCB3aXRoIHRoZSBET00gKGVsZW1lbnQpIGNoaWxkcmVuIG9mIGBub2RlYC5cbiAqXG4gKiBXZSBjYWNoZSBlbnRpcmUgbGV2ZWxzIGF0IG9uY2UgdG8gYXZvaWQgYW4gbl4yIHByb2JsZW0gd2hlcmUgd2UgYWNjZXNzIHRoZVxuICogY2hpbGRyZW4gb2YgYSBub2RlIHNlcXVlbnRpYWxseSBhbmQgaGF2ZSB0byB3YWxrIGZyb20gdGhlIHN0YXJ0IHRvIG91ciB0YXJnZXRcbiAqIG5vZGUgZXZlcnkgdGltZS5cbiAqXG4gKiBTaW5jZSB3ZSB1cGRhdGUgYF9yZW5kZXJlZENoaWxkcmVuYCBhbmQgdGhlIGFjdHVhbCBET00gYXQgKHNsaWdodGx5KVxuICogZGlmZmVyZW50IHRpbWVzLCB3ZSBjb3VsZCByYWNlIGhlcmUgYW5kIHNlZSBhIG5ld2VyIGBfcmVuZGVyZWRDaGlsZHJlbmAgdGhhblxuICogdGhlIERPTSBub2RlcyB3ZSBzZWUuIFRvIGF2b2lkIHRoaXMsIFJlYWN0TXVsdGlDaGlsZCBjYWxsc1xuICogYHByZXBhcmVUb01hbmFnZUNoaWxkcmVuYCBiZWZvcmUgd2UgY2hhbmdlIGBfcmVuZGVyZWRDaGlsZHJlbmAsIGF0IHdoaWNoXG4gKiB0aW1lIHRoZSBjb250YWluZXIncyBjaGlsZCBub2RlcyBhcmUgYWx3YXlzIGNhY2hlZCAodW50aWwgaXQgdW5tb3VudHMpLlxuICovXG5mdW5jdGlvbiBwcmVjYWNoZUNoaWxkTm9kZXMoaW5zdCwgbm9kZSkge1xuICBpZiAoaW5zdC5fZmxhZ3MgJiBGbGFncy5oYXNDYWNoZWRDaGlsZE5vZGVzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBjaGlsZHJlbiA9IGluc3QuX3JlbmRlcmVkQ2hpbGRyZW47XG4gIHZhciBjaGlsZE5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gIG91dGVyOiBmb3IgKHZhciBuYW1lIGluIGNoaWxkcmVuKSB7XG4gICAgaWYgKCFjaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBjaGlsZEluc3QgPSBjaGlsZHJlbltuYW1lXTtcbiAgICB2YXIgY2hpbGRJRCA9IGdldFJlbmRlcmVkSG9zdE9yVGV4dEZyb21Db21wb25lbnQoY2hpbGRJbnN0KS5fZG9tSUQ7XG4gICAgaWYgKGNoaWxkSUQgPT09IDApIHtcbiAgICAgIC8vIFdlJ3JlIGN1cnJlbnRseSB1bm1vdW50aW5nIHRoaXMgY2hpbGQgaW4gUmVhY3RNdWx0aUNoaWxkOyBza2lwIGl0LlxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIFdlIGFzc3VtZSB0aGUgY2hpbGQgbm9kZXMgYXJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBjaGlsZCBpbnN0YW5jZXMuXG4gICAgZm9yICg7IGNoaWxkTm9kZSAhPT0gbnVsbDsgY2hpbGROb2RlID0gY2hpbGROb2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICBpZiAoc2hvdWxkUHJlY2FjaGVOb2RlKGNoaWxkTm9kZSwgY2hpbGRJRCkpIHtcbiAgICAgICAgcHJlY2FjaGVOb2RlKGNoaWxkSW5zdCwgY2hpbGROb2RlKTtcbiAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgRE9NIGNoaWxkcmVuIHdpdGhvdXQgZmluZGluZyBhbiBJRCBtYXRjaC5cbiAgICAhZmFsc2UgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnVW5hYmxlIHRvIGZpbmQgZWxlbWVudCB3aXRoIElEICVzLicsIGNoaWxkSUQpIDogX3Byb2RJbnZhcmlhbnQoJzMyJywgY2hpbGRJRCkgOiB2b2lkIDA7XG4gIH1cbiAgaW5zdC5fZmxhZ3MgfD0gRmxhZ3MuaGFzQ2FjaGVkQ2hpbGROb2Rlcztcbn1cblxuLyoqXG4gKiBHaXZlbiBhIERPTSBub2RlLCByZXR1cm4gdGhlIGNsb3Nlc3QgUmVhY3RET01Db21wb25lbnQgb3JcbiAqIFJlYWN0RE9NVGV4dENvbXBvbmVudCBpbnN0YW5jZSBhbmNlc3Rvci5cbiAqL1xuZnVuY3Rpb24gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobm9kZSkge1xuICBpZiAobm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSkge1xuICAgIHJldHVybiBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuICB9XG5cbiAgLy8gV2FsayB1cCB0aGUgdHJlZSB1bnRpbCB3ZSBmaW5kIGFuIGFuY2VzdG9yIHdob3NlIGluc3RhbmNlIHdlIGhhdmUgY2FjaGVkLlxuICB2YXIgcGFyZW50cyA9IFtdO1xuICB3aGlsZSAoIW5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV0pIHtcbiAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgaWYgKG5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVG9wIG9mIHRoZSB0cmVlLiBUaGlzIG5vZGUgbXVzdCBub3QgYmUgcGFydCBvZiBhIFJlYWN0IHRyZWUgKG9yIGlzXG4gICAgICAvLyB1bm1vdW50ZWQsIHBvdGVudGlhbGx5KS5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjbG9zZXN0O1xuICB2YXIgaW5zdDtcbiAgZm9yICg7IG5vZGUgJiYgKGluc3QgPSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldKTsgbm9kZSA9IHBhcmVudHMucG9wKCkpIHtcbiAgICBjbG9zZXN0ID0gaW5zdDtcbiAgICBpZiAocGFyZW50cy5sZW5ndGgpIHtcbiAgICAgIHByZWNhY2hlQ2hpbGROb2RlcyhpbnN0LCBub2RlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2xvc2VzdDtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIERPTSBub2RlLCByZXR1cm4gdGhlIFJlYWN0RE9NQ29tcG9uZW50IG9yIFJlYWN0RE9NVGV4dENvbXBvbmVudFxuICogaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIG5vZGUgd2FzIG5vdCByZW5kZXJlZCBieSB0aGlzIFJlYWN0LlxuICovXG5mdW5jdGlvbiBnZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpIHtcbiAgdmFyIGluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShub2RlKTtcbiAgaWYgKGluc3QgIT0gbnVsbCAmJiBpbnN0Ll9ob3N0Tm9kZSA9PT0gbm9kZSkge1xuICAgIHJldHVybiBpbnN0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnQsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZ1xuICogRE9NIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIGdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCkge1xuICAvLyBXaXRob3V0IHRoaXMgZmlyc3QgaW52YXJpYW50LCBwYXNzaW5nIGEgbm9uLURPTS1jb21wb25lbnQgdHJpZ2dlcnMgdGhlIG5leHRcbiAgLy8gaW52YXJpYW50IGZvciBhIG1pc3NpbmcgcGFyZW50LCB3aGljaCBpcyBzdXBlciBjb25mdXNpbmcuXG4gICEoaW5zdC5faG9zdE5vZGUgIT09IHVuZGVmaW5lZCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnZ2V0Tm9kZUZyb21JbnN0YW5jZTogSW52YWxpZCBhcmd1bWVudC4nKSA6IF9wcm9kSW52YXJpYW50KCczMycpIDogdm9pZCAwO1xuXG4gIGlmIChpbnN0Ll9ob3N0Tm9kZSkge1xuICAgIHJldHVybiBpbnN0Ll9ob3N0Tm9kZTtcbiAgfVxuXG4gIC8vIFdhbGsgdXAgdGhlIHRyZWUgdW50aWwgd2UgZmluZCBhbiBhbmNlc3RvciB3aG9zZSBET00gbm9kZSB3ZSBoYXZlIGNhY2hlZC5cbiAgdmFyIHBhcmVudHMgPSBbXTtcbiAgd2hpbGUgKCFpbnN0Ll9ob3N0Tm9kZSkge1xuICAgIHBhcmVudHMucHVzaChpbnN0KTtcbiAgICAhaW5zdC5faG9zdFBhcmVudCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdCBET00gdHJlZSByb290IHNob3VsZCBhbHdheXMgaGF2ZSBhIG5vZGUgcmVmZXJlbmNlLicpIDogX3Byb2RJbnZhcmlhbnQoJzM0JykgOiB2b2lkIDA7XG4gICAgaW5zdCA9IGluc3QuX2hvc3RQYXJlbnQ7XG4gIH1cblxuICAvLyBOb3cgcGFyZW50cyBjb250YWlucyBlYWNoIGFuY2VzdG9yIHRoYXQgZG9lcyAqbm90KiBoYXZlIGEgY2FjaGVkIG5hdGl2ZVxuICAvLyBub2RlLCBhbmQgYGluc3RgIGlzIHRoZSBkZWVwZXN0IGFuY2VzdG9yIHRoYXQgZG9lcy5cbiAgZm9yICg7IHBhcmVudHMubGVuZ3RoOyBpbnN0ID0gcGFyZW50cy5wb3AoKSkge1xuICAgIHByZWNhY2hlQ2hpbGROb2RlcyhpbnN0LCBpbnN0Ll9ob3N0Tm9kZSk7XG4gIH1cblxuICByZXR1cm4gaW5zdC5faG9zdE5vZGU7XG59XG5cbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSB7XG4gIGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlOiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSxcbiAgZ2V0SW5zdGFuY2VGcm9tTm9kZTogZ2V0SW5zdGFuY2VGcm9tTm9kZSxcbiAgZ2V0Tm9kZUZyb21JbnN0YW5jZTogZ2V0Tm9kZUZyb21JbnN0YW5jZSxcbiAgcHJlY2FjaGVDaGlsZE5vZGVzOiBwcmVjYWNoZUNoaWxkTm9kZXMsXG4gIHByZWNhY2hlTm9kZTogcHJlY2FjaGVOb2RlLFxuICB1bmNhY2hlTm9kZTogdW5jYWNoZU5vZGVcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01Db21wb25lbnRUcmVlOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBBUklBRE9NUHJvcGVydHlDb25maWcgPSB7XG4gIFByb3BlcnRpZXM6IHtcbiAgICAvLyBHbG9iYWwgU3RhdGVzIGFuZCBQcm9wZXJ0aWVzXG4gICAgJ2FyaWEtY3VycmVudCc6IDAsIC8vIHN0YXRlXG4gICAgJ2FyaWEtZGV0YWlscyc6IDAsXG4gICAgJ2FyaWEtZGlzYWJsZWQnOiAwLCAvLyBzdGF0ZVxuICAgICdhcmlhLWhpZGRlbic6IDAsIC8vIHN0YXRlXG4gICAgJ2FyaWEtaW52YWxpZCc6IDAsIC8vIHN0YXRlXG4gICAgJ2FyaWEta2V5c2hvcnRjdXRzJzogMCxcbiAgICAnYXJpYS1sYWJlbCc6IDAsXG4gICAgJ2FyaWEtcm9sZWRlc2NyaXB0aW9uJzogMCxcbiAgICAvLyBXaWRnZXQgQXR0cmlidXRlc1xuICAgICdhcmlhLWF1dG9jb21wbGV0ZSc6IDAsXG4gICAgJ2FyaWEtY2hlY2tlZCc6IDAsXG4gICAgJ2FyaWEtZXhwYW5kZWQnOiAwLFxuICAgICdhcmlhLWhhc3BvcHVwJzogMCxcbiAgICAnYXJpYS1sZXZlbCc6IDAsXG4gICAgJ2FyaWEtbW9kYWwnOiAwLFxuICAgICdhcmlhLW11bHRpbGluZSc6IDAsXG4gICAgJ2FyaWEtbXVsdGlzZWxlY3RhYmxlJzogMCxcbiAgICAnYXJpYS1vcmllbnRhdGlvbic6IDAsXG4gICAgJ2FyaWEtcGxhY2Vob2xkZXInOiAwLFxuICAgICdhcmlhLXByZXNzZWQnOiAwLFxuICAgICdhcmlhLXJlYWRvbmx5JzogMCxcbiAgICAnYXJpYS1yZXF1aXJlZCc6IDAsXG4gICAgJ2FyaWEtc2VsZWN0ZWQnOiAwLFxuICAgICdhcmlhLXNvcnQnOiAwLFxuICAgICdhcmlhLXZhbHVlbWF4JzogMCxcbiAgICAnYXJpYS12YWx1ZW1pbic6IDAsXG4gICAgJ2FyaWEtdmFsdWVub3cnOiAwLFxuICAgICdhcmlhLXZhbHVldGV4dCc6IDAsXG4gICAgLy8gTGl2ZSBSZWdpb24gQXR0cmlidXRlc1xuICAgICdhcmlhLWF0b21pYyc6IDAsXG4gICAgJ2FyaWEtYnVzeSc6IDAsXG4gICAgJ2FyaWEtbGl2ZSc6IDAsXG4gICAgJ2FyaWEtcmVsZXZhbnQnOiAwLFxuICAgIC8vIERyYWctYW5kLURyb3AgQXR0cmlidXRlc1xuICAgICdhcmlhLWRyb3BlZmZlY3QnOiAwLFxuICAgICdhcmlhLWdyYWJiZWQnOiAwLFxuICAgIC8vIFJlbGF0aW9uc2hpcCBBdHRyaWJ1dGVzXG4gICAgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCc6IDAsXG4gICAgJ2FyaWEtY29sY291bnQnOiAwLFxuICAgICdhcmlhLWNvbGluZGV4JzogMCxcbiAgICAnYXJpYS1jb2xzcGFuJzogMCxcbiAgICAnYXJpYS1jb250cm9scyc6IDAsXG4gICAgJ2FyaWEtZGVzY3JpYmVkYnknOiAwLFxuICAgICdhcmlhLWVycm9ybWVzc2FnZSc6IDAsXG4gICAgJ2FyaWEtZmxvd3RvJzogMCxcbiAgICAnYXJpYS1sYWJlbGxlZGJ5JzogMCxcbiAgICAnYXJpYS1vd25zJzogMCxcbiAgICAnYXJpYS1wb3NpbnNldCc6IDAsXG4gICAgJ2FyaWEtcm93Y291bnQnOiAwLFxuICAgICdhcmlhLXJvd2luZGV4JzogMCxcbiAgICAnYXJpYS1yb3dzcGFuJzogMCxcbiAgICAnYXJpYS1zZXRzaXplJzogMFxuICB9LFxuICBET01BdHRyaWJ1dGVOYW1lczoge30sXG4gIERPTVByb3BlcnR5TmFtZXM6IHt9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFSSUFET01Qcm9wZXJ0eUNvbmZpZzsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBJbmplY3RhYmxlIG9yZGVyaW5nIG9mIGV2ZW50IHBsdWdpbnMuXG4gKi9cbnZhciBldmVudFBsdWdpbk9yZGVyID0gbnVsbDtcblxuLyoqXG4gKiBJbmplY3RhYmxlIG1hcHBpbmcgZnJvbSBuYW1lcyB0byBldmVudCBwbHVnaW4gbW9kdWxlcy5cbiAqL1xudmFyIG5hbWVzVG9QbHVnaW5zID0ge307XG5cbi8qKlxuICogUmVjb21wdXRlcyB0aGUgcGx1Z2luIGxpc3QgdXNpbmcgdGhlIGluamVjdGVkIHBsdWdpbnMgYW5kIHBsdWdpbiBvcmRlcmluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiByZWNvbXB1dGVQbHVnaW5PcmRlcmluZygpIHtcbiAgaWYgKCFldmVudFBsdWdpbk9yZGVyKSB7XG4gICAgLy8gV2FpdCB1bnRpbCBhbiBgZXZlbnRQbHVnaW5PcmRlcmAgaXMgaW5qZWN0ZWQuXG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAodmFyIHBsdWdpbk5hbWUgaW4gbmFtZXNUb1BsdWdpbnMpIHtcbiAgICB2YXIgcGx1Z2luTW9kdWxlID0gbmFtZXNUb1BsdWdpbnNbcGx1Z2luTmFtZV07XG4gICAgdmFyIHBsdWdpbkluZGV4ID0gZXZlbnRQbHVnaW5PcmRlci5pbmRleE9mKHBsdWdpbk5hbWUpO1xuICAgICEocGx1Z2luSW5kZXggPiAtMSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXZlbnRQbHVnaW5SZWdpc3RyeTogQ2Fubm90IGluamVjdCBldmVudCBwbHVnaW5zIHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSBwbHVnaW4gb3JkZXJpbmcsIGAlc2AuJywgcGx1Z2luTmFtZSkgOiBfcHJvZEludmFyaWFudCgnOTYnLCBwbHVnaW5OYW1lKSA6IHZvaWQgMDtcbiAgICBpZiAoRXZlbnRQbHVnaW5SZWdpc3RyeS5wbHVnaW5zW3BsdWdpbkluZGV4XSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgICFwbHVnaW5Nb2R1bGUuZXh0cmFjdEV2ZW50cyA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFdmVudFBsdWdpblJlZ2lzdHJ5OiBFdmVudCBwbHVnaW5zIG11c3QgaW1wbGVtZW50IGFuIGBleHRyYWN0RXZlbnRzYCBtZXRob2QsIGJ1dCBgJXNgIGRvZXMgbm90LicsIHBsdWdpbk5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzk3JywgcGx1Z2luTmFtZSkgOiB2b2lkIDA7XG4gICAgRXZlbnRQbHVnaW5SZWdpc3RyeS5wbHVnaW5zW3BsdWdpbkluZGV4XSA9IHBsdWdpbk1vZHVsZTtcbiAgICB2YXIgcHVibGlzaGVkRXZlbnRzID0gcGx1Z2luTW9kdWxlLmV2ZW50VHlwZXM7XG4gICAgZm9yICh2YXIgZXZlbnROYW1lIGluIHB1Ymxpc2hlZEV2ZW50cykge1xuICAgICAgIXB1Ymxpc2hFdmVudEZvclBsdWdpbihwdWJsaXNoZWRFdmVudHNbZXZlbnROYW1lXSwgcGx1Z2luTW9kdWxlLCBldmVudE5hbWUpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luUmVnaXN0cnk6IEZhaWxlZCB0byBwdWJsaXNoIGV2ZW50IGAlc2AgZm9yIHBsdWdpbiBgJXNgLicsIGV2ZW50TmFtZSwgcGx1Z2luTmFtZSkgOiBfcHJvZEludmFyaWFudCgnOTgnLCBldmVudE5hbWUsIHBsdWdpbk5hbWUpIDogdm9pZCAwO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFB1Ymxpc2hlcyBhbiBldmVudCBzbyB0aGF0IGl0IGNhbiBiZSBkaXNwYXRjaGVkIGJ5IHRoZSBzdXBwbGllZCBwbHVnaW4uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIERpc3BhdGNoIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBldmVudC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBQbHVnaW5Nb2R1bGUgUGx1Z2luIHB1Ymxpc2hpbmcgdGhlIGV2ZW50LlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIHN1Y2Nlc3NmdWxseSBwdWJsaXNoZWQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBwdWJsaXNoRXZlbnRGb3JQbHVnaW4oZGlzcGF0Y2hDb25maWcsIHBsdWdpbk1vZHVsZSwgZXZlbnROYW1lKSB7XG4gICEhRXZlbnRQbHVnaW5SZWdpc3RyeS5ldmVudE5hbWVEaXNwYXRjaENvbmZpZ3MuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFdmVudFBsdWdpbkh1YjogTW9yZSB0aGFuIG9uZSBwbHVnaW4gYXR0ZW1wdGVkIHRvIHB1Ymxpc2ggdGhlIHNhbWUgZXZlbnQgbmFtZSwgYCVzYC4nLCBldmVudE5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzk5JywgZXZlbnROYW1lKSA6IHZvaWQgMDtcbiAgRXZlbnRQbHVnaW5SZWdpc3RyeS5ldmVudE5hbWVEaXNwYXRjaENvbmZpZ3NbZXZlbnROYW1lXSA9IGRpc3BhdGNoQ29uZmlnO1xuXG4gIHZhciBwaGFzZWRSZWdpc3RyYXRpb25OYW1lcyA9IGRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzO1xuICBpZiAocGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMpIHtcbiAgICBmb3IgKHZhciBwaGFzZU5hbWUgaW4gcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMpIHtcbiAgICAgIGlmIChwaGFzZWRSZWdpc3RyYXRpb25OYW1lcy5oYXNPd25Qcm9wZXJ0eShwaGFzZU5hbWUpKSB7XG4gICAgICAgIHZhciBwaGFzZWRSZWdpc3RyYXRpb25OYW1lID0gcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXNbcGhhc2VOYW1lXTtcbiAgICAgICAgcHVibGlzaFJlZ2lzdHJhdGlvbk5hbWUocGhhc2VkUmVnaXN0cmF0aW9uTmFtZSwgcGx1Z2luTW9kdWxlLCBldmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChkaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lKSB7XG4gICAgcHVibGlzaFJlZ2lzdHJhdGlvbk5hbWUoZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9uTmFtZSwgcGx1Z2luTW9kdWxlLCBldmVudE5hbWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBQdWJsaXNoZXMgYSByZWdpc3RyYXRpb24gbmFtZSB0aGF0IGlzIHVzZWQgdG8gaWRlbnRpZnkgZGlzcGF0Y2hlZCBldmVudHMgYW5kXG4gKiBjYW4gYmUgdXNlZCB3aXRoIGBFdmVudFBsdWdpbkh1Yi5wdXRMaXN0ZW5lcmAgdG8gcmVnaXN0ZXIgbGlzdGVuZXJzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb25OYW1lIFJlZ2lzdHJhdGlvbiBuYW1lIHRvIGFkZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBQbHVnaW5Nb2R1bGUgUGx1Z2luIHB1Ymxpc2hpbmcgdGhlIGV2ZW50LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcHVibGlzaFJlZ2lzdHJhdGlvbk5hbWUocmVnaXN0cmF0aW9uTmFtZSwgcGx1Z2luTW9kdWxlLCBldmVudE5hbWUpIHtcbiAgISFFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3JlZ2lzdHJhdGlvbk5hbWVdID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luSHViOiBNb3JlIHRoYW4gb25lIHBsdWdpbiBhdHRlbXB0ZWQgdG8gcHVibGlzaCB0aGUgc2FtZSByZWdpc3RyYXRpb24gbmFtZSwgYCVzYC4nLCByZWdpc3RyYXRpb25OYW1lKSA6IF9wcm9kSW52YXJpYW50KCcxMDAnLCByZWdpc3RyYXRpb25OYW1lKSA6IHZvaWQgMDtcbiAgRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tyZWdpc3RyYXRpb25OYW1lXSA9IHBsdWdpbk1vZHVsZTtcbiAgRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdID0gcGx1Z2luTW9kdWxlLmV2ZW50VHlwZXNbZXZlbnROYW1lXS5kZXBlbmRlbmNpZXM7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSByZWdpc3RyYXRpb25OYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgRXZlbnRQbHVnaW5SZWdpc3RyeS5wb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzW2xvd2VyQ2FzZWROYW1lXSA9IHJlZ2lzdHJhdGlvbk5hbWU7XG5cbiAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSA9PT0gJ29uRG91YmxlQ2xpY2snKSB7XG4gICAgICBFdmVudFBsdWdpblJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMub25kYmxjbGljayA9IHJlZ2lzdHJhdGlvbk5hbWU7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIHBsdWdpbnMgc28gdGhhdCB0aGV5IGNhbiBleHRyYWN0IGFuZCBkaXNwYXRjaCBldmVudHMuXG4gKlxuICogQHNlZSB7RXZlbnRQbHVnaW5IdWJ9XG4gKi9cbnZhciBFdmVudFBsdWdpblJlZ2lzdHJ5ID0ge1xuICAvKipcbiAgICogT3JkZXJlZCBsaXN0IG9mIGluamVjdGVkIHBsdWdpbnMuXG4gICAqL1xuICBwbHVnaW5zOiBbXSxcblxuICAvKipcbiAgICogTWFwcGluZyBmcm9tIGV2ZW50IG5hbWUgdG8gZGlzcGF0Y2ggY29uZmlnXG4gICAqL1xuICBldmVudE5hbWVEaXNwYXRjaENvbmZpZ3M6IHt9LFxuXG4gIC8qKlxuICAgKiBNYXBwaW5nIGZyb20gcmVnaXN0cmF0aW9uIG5hbWUgdG8gcGx1Z2luIG1vZHVsZVxuICAgKi9cbiAgcmVnaXN0cmF0aW9uTmFtZU1vZHVsZXM6IHt9LFxuXG4gIC8qKlxuICAgKiBNYXBwaW5nIGZyb20gcmVnaXN0cmF0aW9uIG5hbWUgdG8gZXZlbnQgbmFtZVxuICAgKi9cbiAgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llczoge30sXG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgZnJvbSBsb3dlcmNhc2UgcmVnaXN0cmF0aW9uIG5hbWVzIHRvIHRoZSBwcm9wZXJseSBjYXNlZCB2ZXJzaW9uLFxuICAgKiB1c2VkIHRvIHdhcm4gaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBldmVudCBoYW5kbGVycy4gQXZhaWxhYmxlXG4gICAqIG9ubHkgaW4gX19ERVZfXy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM6IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB7fSA6IG51bGwsXG4gIC8vIFRydXN0IHRoZSBkZXZlbG9wZXIgdG8gb25seSB1c2UgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyBpbiBfX0RFVl9fXG5cbiAgLyoqXG4gICAqIEluamVjdHMgYW4gb3JkZXJpbmcgb2YgcGx1Z2lucyAoYnkgcGx1Z2luIG5hbWUpLiBUaGlzIGFsbG93cyB0aGUgb3JkZXJpbmdcbiAgICogdG8gYmUgZGVjb3VwbGVkIGZyb20gaW5qZWN0aW9uIG9mIHRoZSBhY3R1YWwgcGx1Z2lucyBzbyB0aGF0IG9yZGVyaW5nIGlzXG4gICAqIGFsd2F5cyBkZXRlcm1pbmlzdGljIHJlZ2FyZGxlc3Mgb2YgcGFja2FnaW5nLCBvbi10aGUtZmx5IGluamVjdGlvbiwgZXRjLlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5fSBJbmplY3RlZEV2ZW50UGx1Z2luT3JkZXJcbiAgICogQGludGVybmFsXG4gICAqIEBzZWUge0V2ZW50UGx1Z2luSHViLmluamVjdGlvbi5pbmplY3RFdmVudFBsdWdpbk9yZGVyfVxuICAgKi9cbiAgaW5qZWN0RXZlbnRQbHVnaW5PcmRlcjogZnVuY3Rpb24gKGluamVjdGVkRXZlbnRQbHVnaW5PcmRlcikge1xuICAgICEhZXZlbnRQbHVnaW5PcmRlciA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFdmVudFBsdWdpblJlZ2lzdHJ5OiBDYW5ub3QgaW5qZWN0IGV2ZW50IHBsdWdpbiBvcmRlcmluZyBtb3JlIHRoYW4gb25jZS4gWW91IGFyZSBsaWtlbHkgdHJ5aW5nIHRvIGxvYWQgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0LicpIDogX3Byb2RJbnZhcmlhbnQoJzEwMScpIDogdm9pZCAwO1xuICAgIC8vIENsb25lIHRoZSBvcmRlcmluZyBzbyBpdCBjYW5ub3QgYmUgZHluYW1pY2FsbHkgbXV0YXRlZC5cbiAgICBldmVudFBsdWdpbk9yZGVyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoaW5qZWN0ZWRFdmVudFBsdWdpbk9yZGVyKTtcbiAgICByZWNvbXB1dGVQbHVnaW5PcmRlcmluZygpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBJbmplY3RzIHBsdWdpbnMgdG8gYmUgdXNlZCBieSBgRXZlbnRQbHVnaW5IdWJgLiBUaGUgcGx1Z2luIG5hbWVzIG11c3QgYmVcbiAgICogaW4gdGhlIG9yZGVyaW5nIGluamVjdGVkIGJ5IGBpbmplY3RFdmVudFBsdWdpbk9yZGVyYC5cbiAgICpcbiAgICogUGx1Z2lucyBjYW4gYmUgaW5qZWN0ZWQgYXMgcGFydCBvZiBwYWdlIGluaXRpYWxpemF0aW9uIG9yIG9uLXRoZS1mbHkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpbmplY3RlZE5hbWVzVG9QbHVnaW5zIE1hcCBmcm9tIG5hbWVzIHRvIHBsdWdpbiBtb2R1bGVzLlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHNlZSB7RXZlbnRQbHVnaW5IdWIuaW5qZWN0aW9uLmluamVjdEV2ZW50UGx1Z2luc0J5TmFtZX1cbiAgICovXG4gIGluamVjdEV2ZW50UGx1Z2luc0J5TmFtZTogZnVuY3Rpb24gKGluamVjdGVkTmFtZXNUb1BsdWdpbnMpIHtcbiAgICB2YXIgaXNPcmRlcmluZ0RpcnR5ID0gZmFsc2U7XG4gICAgZm9yICh2YXIgcGx1Z2luTmFtZSBpbiBpbmplY3RlZE5hbWVzVG9QbHVnaW5zKSB7XG4gICAgICBpZiAoIWluamVjdGVkTmFtZXNUb1BsdWdpbnMuaGFzT3duUHJvcGVydHkocGx1Z2luTmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgcGx1Z2luTW9kdWxlID0gaW5qZWN0ZWROYW1lc1RvUGx1Z2luc1twbHVnaW5OYW1lXTtcbiAgICAgIGlmICghbmFtZXNUb1BsdWdpbnMuaGFzT3duUHJvcGVydHkocGx1Z2luTmFtZSkgfHwgbmFtZXNUb1BsdWdpbnNbcGx1Z2luTmFtZV0gIT09IHBsdWdpbk1vZHVsZSkge1xuICAgICAgICAhIW5hbWVzVG9QbHVnaW5zW3BsdWdpbk5hbWVdID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luUmVnaXN0cnk6IENhbm5vdCBpbmplY3QgdHdvIGRpZmZlcmVudCBldmVudCBwbHVnaW5zIHVzaW5nIHRoZSBzYW1lIG5hbWUsIGAlc2AuJywgcGx1Z2luTmFtZSkgOiBfcHJvZEludmFyaWFudCgnMTAyJywgcGx1Z2luTmFtZSkgOiB2b2lkIDA7XG4gICAgICAgIG5hbWVzVG9QbHVnaW5zW3BsdWdpbk5hbWVdID0gcGx1Z2luTW9kdWxlO1xuICAgICAgICBpc09yZGVyaW5nRGlydHkgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNPcmRlcmluZ0RpcnR5KSB7XG4gICAgICByZWNvbXB1dGVQbHVnaW5PcmRlcmluZygpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogTG9va3MgdXAgdGhlIHBsdWdpbiBmb3IgdGhlIHN1cHBsaWVkIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgQSBzeW50aGV0aWMgZXZlbnQuXG4gICAqIEByZXR1cm4gez9vYmplY3R9IFRoZSBwbHVnaW4gdGhhdCBjcmVhdGVkIHRoZSBzdXBwbGllZCBldmVudC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXRQbHVnaW5Nb2R1bGVGb3JFdmVudDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIGRpc3BhdGNoQ29uZmlnID0gZXZlbnQuZGlzcGF0Y2hDb25maWc7XG4gICAgaWYgKGRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUpIHtcbiAgICAgIHJldHVybiBFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW2Rpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWVdIHx8IG51bGw7XG4gICAgfVxuICAgIGlmIChkaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBwdWxsaW5nIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzIG91dCBvZiBkaXNwYXRjaENvbmZpZyBoZWxwcyBGbG93IHNlZVxuICAgICAgLy8gdGhhdCBpdCBpcyBub3QgdW5kZWZpbmVkLlxuICAgICAgdmFyIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzID0gZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM7XG5cbiAgICAgIGZvciAodmFyIHBoYXNlIGluIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKSB7XG4gICAgICAgIGlmICghcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkocGhhc2UpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBsdWdpbk1vZHVsZSA9IEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXNbcGhhc2VdXTtcbiAgICAgICAgaWYgKHBsdWdpbk1vZHVsZSkge1xuICAgICAgICAgIHJldHVybiBwbHVnaW5Nb2R1bGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEV4cG9zZWQgZm9yIHVuaXQgdGVzdGluZy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9yZXNldEV2ZW50UGx1Z2luczogZnVuY3Rpb24gKCkge1xuICAgIGV2ZW50UGx1Z2luT3JkZXIgPSBudWxsO1xuICAgIGZvciAodmFyIHBsdWdpbk5hbWUgaW4gbmFtZXNUb1BsdWdpbnMpIHtcbiAgICAgIGlmIChuYW1lc1RvUGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShwbHVnaW5OYW1lKSkge1xuICAgICAgICBkZWxldGUgbmFtZXNUb1BsdWdpbnNbcGx1Z2luTmFtZV07XG4gICAgICB9XG4gICAgfVxuICAgIEV2ZW50UGx1Z2luUmVnaXN0cnkucGx1Z2lucy5sZW5ndGggPSAwO1xuXG4gICAgdmFyIGV2ZW50TmFtZURpc3BhdGNoQ29uZmlncyA9IEV2ZW50UGx1Z2luUmVnaXN0cnkuZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzO1xuICAgIGZvciAodmFyIGV2ZW50TmFtZSBpbiBldmVudE5hbWVEaXNwYXRjaENvbmZpZ3MpIHtcbiAgICAgIGlmIChldmVudE5hbWVEaXNwYXRjaENvbmZpZ3MuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkge1xuICAgICAgICBkZWxldGUgZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzW2V2ZW50TmFtZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzID0gRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlcztcbiAgICBmb3IgKHZhciByZWdpc3RyYXRpb25OYW1lIGluIHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzKSB7XG4gICAgICBpZiAocmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMuaGFzT3duUHJvcGVydHkocmVnaXN0cmF0aW9uTmFtZSkpIHtcbiAgICAgICAgZGVsZXRlIHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3JlZ2lzdHJhdGlvbk5hbWVdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcyA9IEV2ZW50UGx1Z2luUmVnaXN0cnkucG9zc2libGVSZWdpc3RyYXRpb25OYW1lcztcbiAgICAgIGZvciAodmFyIGxvd2VyQ2FzZWROYW1lIGluIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMpIHtcbiAgICAgICAgaWYgKHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpKSB7XG4gICAgICAgICAgZGVsZXRlIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNbbG93ZXJDYXNlZE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50UGx1Z2luUmVnaXN0cnk7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2F1Z2h0RXJyb3IgPSBudWxsO1xuXG4vKipcbiAqIENhbGwgYSBmdW5jdGlvbiB3aGlsZSBndWFyZGluZyBhZ2FpbnN0IGVycm9ycyB0aGF0IGhhcHBlbnMgd2l0aGluIGl0LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9mIHRoZSBndWFyZCB0byB1c2UgZm9yIGxvZ2dpbmcgb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2VcbiAqIEBwYXJhbSB7Kn0gYSBGaXJzdCBhcmd1bWVudFxuICogQHBhcmFtIHsqfSBiIFNlY29uZCBhcmd1bWVudFxuICovXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobmFtZSwgZnVuYywgYSkge1xuICB0cnkge1xuICAgIGZ1bmMoYSk7XG4gIH0gY2F0Y2ggKHgpIHtcbiAgICBpZiAoY2F1Z2h0RXJyb3IgPT09IG51bGwpIHtcbiAgICAgIGNhdWdodEVycm9yID0geDtcbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0RXJyb3JVdGlscyA9IHtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrOiBpbnZva2VHdWFyZGVkQ2FsbGJhY2ssXG5cbiAgLyoqXG4gICAqIEludm9rZWQgYnkgUmVhY3RUZXN0VXRpbHMuU2ltdWxhdGUgc28gdGhhdCBhbnkgZXJyb3JzIHRocm93biBieSB0aGUgZXZlbnRcbiAgICogaGFuZGxlciBhcmUgc3VyZSB0byBiZSByZXRocm93biBieSByZXRocm93Q2F1Z2h0RXJyb3IuXG4gICAqL1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tXaXRoQ2F0Y2g6IGludm9rZUd1YXJkZWRDYWxsYmFjayxcblxuICAvKipcbiAgICogRHVyaW5nIGV4ZWN1dGlvbiBvZiBndWFyZGVkIGZ1bmN0aW9ucyB3ZSB3aWxsIGNhcHR1cmUgdGhlIGZpcnN0IGVycm9yIHdoaWNoXG4gICAqIHdlIHdpbGwgcmV0aHJvdyB0byBiZSBoYW5kbGVkIGJ5IHRoZSB0b3AgbGV2ZWwgZXJyb3IgaGFuZGxlci5cbiAgICovXG4gIHJldGhyb3dDYXVnaHRFcnJvcjogZnVuY3Rpb24gKCkge1xuICAgIGlmIChjYXVnaHRFcnJvcikge1xuICAgICAgdmFyIGVycm9yID0gY2F1Z2h0RXJyb3I7XG4gICAgICBjYXVnaHRFcnJvciA9IG51bGw7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbn07XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8qKlxuICAgKiBUbyBoZWxwIGRldmVsb3BtZW50IHdlIGNhbiBnZXQgYmV0dGVyIGRldnRvb2xzIGludGVncmF0aW9uIGJ5IHNpbXVsYXRpbmcgYVxuICAgKiByZWFsIGJyb3dzZXIgZXZlbnQuXG4gICAqL1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kaXNwYXRjaEV2ZW50ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGZha2VOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncmVhY3QnKTtcbiAgICBSZWFjdEVycm9yVXRpbHMuaW52b2tlR3VhcmRlZENhbGxiYWNrID0gZnVuY3Rpb24gKG5hbWUsIGZ1bmMsIGEpIHtcbiAgICAgIHZhciBib3VuZEZ1bmMgPSBmdW5jLmJpbmQobnVsbCwgYSk7XG4gICAgICB2YXIgZXZ0VHlwZSA9ICdyZWFjdC0nICsgbmFtZTtcbiAgICAgIGZha2VOb2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZ0VHlwZSwgYm91bmRGdW5jLCBmYWxzZSk7XG4gICAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgICBldnQuaW5pdEV2ZW50KGV2dFR5cGUsIGZhbHNlLCBmYWxzZSk7XG4gICAgICBmYWtlTm9kZS5kaXNwYXRjaEV2ZW50KGV2dCk7XG4gICAgICBmYWtlTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2dFR5cGUsIGJvdW5kRnVuYywgZmFsc2UpO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEVycm9yVXRpbHM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG5mdW5jdGlvbiBtYWtlRW1wdHlGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYXJnO1xuICB9O1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gYWNjZXB0cyBhbmQgZGlzY2FyZHMgaW5wdXRzOyBpdCBoYXMgbm8gc2lkZSBlZmZlY3RzLiBUaGlzIGlzXG4gKiBwcmltYXJpbHkgdXNlZnVsIGlkaW9tYXRpY2FsbHkgZm9yIG92ZXJyaWRhYmxlIGZ1bmN0aW9uIGVuZHBvaW50cyB3aGljaFxuICogYWx3YXlzIG5lZWQgdG8gYmUgY2FsbGFibGUsIHNpbmNlIEpTIGxhY2tzIGEgbnVsbC1jYWxsIGlkaW9tIGFsYSBDb2NvYS5cbiAqL1xudmFyIGVtcHR5RnVuY3Rpb24gPSBmdW5jdGlvbiBlbXB0eUZ1bmN0aW9uKCkge307XG5cbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnMgPSBtYWtlRW1wdHlGdW5jdGlvbjtcbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNGYWxzZSA9IG1ha2VFbXB0eUZ1bmN0aW9uKGZhbHNlKTtcbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUcnVlID0gbWFrZUVtcHR5RnVuY3Rpb24odHJ1ZSk7XG5lbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zTnVsbCA9IG1ha2VFbXB0eUZ1bmN0aW9uKG51bGwpO1xuZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc1RoaXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzO1xufTtcbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNBcmd1bWVudCA9IGZ1bmN0aW9uIChhcmcpIHtcbiAgcmV0dXJuIGFyZztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZW1wdHlGdW5jdGlvbjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE0LTIwMTUsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJy4vZW1wdHlGdW5jdGlvbicpO1xuXG4vKipcbiAqIFNpbWlsYXIgdG8gaW52YXJpYW50IGJ1dCBvbmx5IGxvZ3MgYSB3YXJuaW5nIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldC5cbiAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gbG9nIGlzc3VlcyBpbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMgaW4gY3JpdGljYWxcbiAqIHBhdGhzLiBSZW1vdmluZyB0aGUgbG9nZ2luZyBjb2RlIGZvciBwcm9kdWN0aW9uIGVudmlyb25tZW50cyB3aWxsIGtlZXAgdGhlXG4gKiBzYW1lIGxvZ2ljIGFuZCBmb2xsb3cgdGhlIHNhbWUgY29kZSBwYXRocy5cbiAqL1xuXG52YXIgd2FybmluZyA9IGVtcHR5RnVuY3Rpb247XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBwcmludFdhcm5pbmcgPSBmdW5jdGlvbiBwcmludFdhcm5pbmcoZm9ybWF0KSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyBmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107XG4gICAgfSk7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIC0tLSBXZWxjb21lIHRvIGRlYnVnZ2luZyBSZWFjdCAtLS1cbiAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoeCkge31cbiAgfTtcblxuICB3YXJuaW5nID0gZnVuY3Rpb24gd2FybmluZyhjb25kaXRpb24sIGZvcm1hdCkge1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdgd2FybmluZyhjb25kaXRpb24sIGZvcm1hdCwgLi4uYXJncylgIHJlcXVpcmVzIGEgd2FybmluZyAnICsgJ21lc3NhZ2UgYXJndW1lbnQnKTtcbiAgICB9XG5cbiAgICBpZiAoZm9ybWF0LmluZGV4T2YoJ0ZhaWxlZCBDb21wb3NpdGUgcHJvcFR5cGU6ICcpID09PSAwKSB7XG4gICAgICByZXR1cm47IC8vIElnbm9yZSBDb21wb3NpdGVDb21wb25lbnQgcHJvcHR5cGUgY2hlY2suXG4gICAgfVxuXG4gICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yID4gMiA/IF9sZW4yIC0gMiA6IDApLCBfa2V5MiA9IDI7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5MiAtIDJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgcHJpbnRXYXJuaW5nLmFwcGx5KHVuZGVmaW5lZCwgW2Zvcm1hdF0uY29uY2F0KGFyZ3MpKTtcbiAgICB9XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gd2FybmluZzsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RFcnJvclV0aWxzID0gcmVxdWlyZSgnLi9SZWFjdEVycm9yVXRpbHMnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbi8qKlxuICogSW5qZWN0ZWQgZGVwZW5kZW5jaWVzOlxuICovXG5cbi8qKlxuICogLSBgQ29tcG9uZW50VHJlZWA6IFtyZXF1aXJlZF0gTW9kdWxlIHRoYXQgY2FuIGNvbnZlcnQgYmV0d2VlbiBSZWFjdCBpbnN0YW5jZXNcbiAqICAgYW5kIGFjdHVhbCBub2RlIHJlZmVyZW5jZXMuXG4gKi9cbnZhciBDb21wb25lbnRUcmVlO1xudmFyIFRyZWVUcmF2ZXJzYWw7XG52YXIgaW5qZWN0aW9uID0ge1xuICBpbmplY3RDb21wb25lbnRUcmVlOiBmdW5jdGlvbiAoSW5qZWN0ZWQpIHtcbiAgICBDb21wb25lbnRUcmVlID0gSW5qZWN0ZWQ7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKEluamVjdGVkICYmIEluamVjdGVkLmdldE5vZGVGcm9tSW5zdGFuY2UgJiYgSW5qZWN0ZWQuZ2V0SW5zdGFuY2VGcm9tTm9kZSwgJ0V2ZW50UGx1Z2luVXRpbHMuaW5qZWN0aW9uLmluamVjdENvbXBvbmVudFRyZWUoLi4uKTogSW5qZWN0ZWQgJyArICdtb2R1bGUgaXMgbWlzc2luZyBnZXROb2RlRnJvbUluc3RhbmNlIG9yIGdldEluc3RhbmNlRnJvbU5vZGUuJykgOiB2b2lkIDA7XG4gICAgfVxuICB9LFxuICBpbmplY3RUcmVlVHJhdmVyc2FsOiBmdW5jdGlvbiAoSW5qZWN0ZWQpIHtcbiAgICBUcmVlVHJhdmVyc2FsID0gSW5qZWN0ZWQ7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKEluamVjdGVkICYmIEluamVjdGVkLmlzQW5jZXN0b3IgJiYgSW5qZWN0ZWQuZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IsICdFdmVudFBsdWdpblV0aWxzLmluamVjdGlvbi5pbmplY3RUcmVlVHJhdmVyc2FsKC4uLik6IEluamVjdGVkICcgKyAnbW9kdWxlIGlzIG1pc3NpbmcgaXNBbmNlc3RvciBvciBnZXRMb3dlc3RDb21tb25BbmNlc3Rvci4nKSA6IHZvaWQgMDtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGlzRW5kaXNoKHRvcExldmVsVHlwZSkge1xuICByZXR1cm4gdG9wTGV2ZWxUeXBlID09PSAndG9wTW91c2VVcCcgfHwgdG9wTGV2ZWxUeXBlID09PSAndG9wVG91Y2hFbmQnIHx8IHRvcExldmVsVHlwZSA9PT0gJ3RvcFRvdWNoQ2FuY2VsJztcbn1cblxuZnVuY3Rpb24gaXNNb3ZlaXNoKHRvcExldmVsVHlwZSkge1xuICByZXR1cm4gdG9wTGV2ZWxUeXBlID09PSAndG9wTW91c2VNb3ZlJyB8fCB0b3BMZXZlbFR5cGUgPT09ICd0b3BUb3VjaE1vdmUnO1xufVxuZnVuY3Rpb24gaXNTdGFydGlzaCh0b3BMZXZlbFR5cGUpIHtcbiAgcmV0dXJuIHRvcExldmVsVHlwZSA9PT0gJ3RvcE1vdXNlRG93bicgfHwgdG9wTGV2ZWxUeXBlID09PSAndG9wVG91Y2hTdGFydCc7XG59XG5cbnZhciB2YWxpZGF0ZUV2ZW50RGlzcGF0Y2hlcztcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhbGlkYXRlRXZlbnREaXNwYXRjaGVzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIGRpc3BhdGNoTGlzdGVuZXJzID0gZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzO1xuICAgIHZhciBkaXNwYXRjaEluc3RhbmNlcyA9IGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcztcblxuICAgIHZhciBsaXN0ZW5lcnNJc0FyciA9IEFycmF5LmlzQXJyYXkoZGlzcGF0Y2hMaXN0ZW5lcnMpO1xuICAgIHZhciBsaXN0ZW5lcnNMZW4gPSBsaXN0ZW5lcnNJc0FyciA/IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aCA6IGRpc3BhdGNoTGlzdGVuZXJzID8gMSA6IDA7XG5cbiAgICB2YXIgaW5zdGFuY2VzSXNBcnIgPSBBcnJheS5pc0FycmF5KGRpc3BhdGNoSW5zdGFuY2VzKTtcbiAgICB2YXIgaW5zdGFuY2VzTGVuID0gaW5zdGFuY2VzSXNBcnIgPyBkaXNwYXRjaEluc3RhbmNlcy5sZW5ndGggOiBkaXNwYXRjaEluc3RhbmNlcyA/IDEgOiAwO1xuXG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoaW5zdGFuY2VzSXNBcnIgPT09IGxpc3RlbmVyc0lzQXJyICYmIGluc3RhbmNlc0xlbiA9PT0gbGlzdGVuZXJzTGVuLCAnRXZlbnRQbHVnaW5VdGlsczogSW52YWxpZCBgZXZlbnRgLicpIDogdm9pZCAwO1xuICB9O1xufVxuXG4vKipcbiAqIERpc3BhdGNoIHRoZSBldmVudCB0byB0aGUgbGlzdGVuZXIuXG4gKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudCBTeW50aGV0aWNFdmVudCB0byBoYW5kbGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2ltdWxhdGVkIElmIHRoZSBldmVudCBpcyBzaW11bGF0ZWQgKGNoYW5nZXMgZXhuIGJlaGF2aW9yKVxuICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXIgQXBwbGljYXRpb24tbGV2ZWwgY2FsbGJhY2tcbiAqIEBwYXJhbSB7Kn0gaW5zdCBJbnRlcm5hbCBjb21wb25lbnQgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBzaW11bGF0ZWQsIGxpc3RlbmVyLCBpbnN0KSB7XG4gIHZhciB0eXBlID0gZXZlbnQudHlwZSB8fCAndW5rbm93bi1ldmVudCc7XG4gIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBFdmVudFBsdWdpblV0aWxzLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCk7XG4gIGlmIChzaW11bGF0ZWQpIHtcbiAgICBSZWFjdEVycm9yVXRpbHMuaW52b2tlR3VhcmRlZENhbGxiYWNrV2l0aENhdGNoKHR5cGUsIGxpc3RlbmVyLCBldmVudCk7XG4gIH0gZWxzZSB7XG4gICAgUmVhY3RFcnJvclV0aWxzLmludm9rZUd1YXJkZWRDYWxsYmFjayh0eXBlLCBsaXN0ZW5lciwgZXZlbnQpO1xuICB9XG4gIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBudWxsO1xufVxuXG4vKipcbiAqIFN0YW5kYXJkL3NpbXBsZSBpdGVyYXRpb24gdGhyb3VnaCBhbiBldmVudCdzIGNvbGxlY3RlZCBkaXNwYXRjaGVzLlxuICovXG5mdW5jdGlvbiBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXIoZXZlbnQsIHNpbXVsYXRlZCkge1xuICB2YXIgZGlzcGF0Y2hMaXN0ZW5lcnMgPSBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnM7XG4gIHZhciBkaXNwYXRjaEluc3RhbmNlcyA9IGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcztcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2YWxpZGF0ZUV2ZW50RGlzcGF0Y2hlcyhldmVudCk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoZGlzcGF0Y2hMaXN0ZW5lcnMpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXNwYXRjaExpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLyBMaXN0ZW5lcnMgYW5kIEluc3RhbmNlcyBhcmUgdHdvIHBhcmFsbGVsIGFycmF5cyB0aGF0IGFyZSBhbHdheXMgaW4gc3luYy5cbiAgICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgc2ltdWxhdGVkLCBkaXNwYXRjaExpc3RlbmVyc1tpXSwgZGlzcGF0Y2hJbnN0YW5jZXNbaV0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChkaXNwYXRjaExpc3RlbmVycykge1xuICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgc2ltdWxhdGVkLCBkaXNwYXRjaExpc3RlbmVycywgZGlzcGF0Y2hJbnN0YW5jZXMpO1xuICB9XG4gIGV2ZW50Ll9kaXNwYXRjaExpc3RlbmVycyA9IG51bGw7XG4gIGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcyA9IG51bGw7XG59XG5cbi8qKlxuICogU3RhbmRhcmQvc2ltcGxlIGl0ZXJhdGlvbiB0aHJvdWdoIGFuIGV2ZW50J3MgY29sbGVjdGVkIGRpc3BhdGNoZXMsIGJ1dCBzdG9wc1xuICogYXQgdGhlIGZpcnN0IGRpc3BhdGNoIGV4ZWN1dGlvbiByZXR1cm5pbmcgdHJ1ZSwgYW5kIHJldHVybnMgdGhhdCBpZC5cbiAqXG4gKiBAcmV0dXJuIHs/c3RyaW5nfSBpZCBvZiB0aGUgZmlyc3QgZGlzcGF0Y2ggZXhlY3V0aW9uIHdobydzIGxpc3RlbmVyIHJldHVybnNcbiAqIHRydWUsIG9yIG51bGwgaWYgbm8gbGlzdGVuZXIgcmV0dXJuZWQgdHJ1ZS5cbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyU3RvcEF0VHJ1ZUltcGwoZXZlbnQpIHtcbiAgdmFyIGRpc3BhdGNoTGlzdGVuZXJzID0gZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzO1xuICB2YXIgZGlzcGF0Y2hJbnN0YW5jZXMgPSBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXM7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdmFsaWRhdGVFdmVudERpc3BhdGNoZXMoZXZlbnQpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGRpc3BhdGNoTGlzdGVuZXJzKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlzcGF0Y2hMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy8gTGlzdGVuZXJzIGFuZCBJbnN0YW5jZXMgYXJlIHR3byBwYXJhbGxlbCBhcnJheXMgdGhhdCBhcmUgYWx3YXlzIGluIHN5bmMuXG4gICAgICBpZiAoZGlzcGF0Y2hMaXN0ZW5lcnNbaV0oZXZlbnQsIGRpc3BhdGNoSW5zdGFuY2VzW2ldKSkge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2hJbnN0YW5jZXNbaV07XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGRpc3BhdGNoTGlzdGVuZXJzKSB7XG4gICAgaWYgKGRpc3BhdGNoTGlzdGVuZXJzKGV2ZW50LCBkaXNwYXRjaEluc3RhbmNlcykpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaEluc3RhbmNlcztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogQHNlZSBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXJTdG9wQXRUcnVlSW1wbFxuICovXG5mdW5jdGlvbiBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXJTdG9wQXRUcnVlKGV2ZW50KSB7XG4gIHZhciByZXQgPSBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXJTdG9wQXRUcnVlSW1wbChldmVudCk7XG4gIGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcyA9IG51bGw7XG4gIGV2ZW50Ll9kaXNwYXRjaExpc3RlbmVycyA9IG51bGw7XG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogRXhlY3V0aW9uIG9mIGEgXCJkaXJlY3RcIiBkaXNwYXRjaCAtIHRoZXJlIG11c3QgYmUgYXQgbW9zdCBvbmUgZGlzcGF0Y2hcbiAqIGFjY3VtdWxhdGVkIG9uIHRoZSBldmVudCBvciBpdCBpcyBjb25zaWRlcmVkIGFuIGVycm9yLiBJdCBkb2Vzbid0IHJlYWxseSBtYWtlXG4gKiBzZW5zZSBmb3IgYW4gZXZlbnQgd2l0aCBtdWx0aXBsZSBkaXNwYXRjaGVzIChidWJibGVkKSB0byBrZWVwIHRyYWNrIG9mIHRoZVxuICogcmV0dXJuIHZhbHVlcyBhdCBlYWNoIGRpc3BhdGNoIGV4ZWN1dGlvbiwgYnV0IGl0IGRvZXMgdGVuZCB0byBtYWtlIHNlbnNlIHdoZW5cbiAqIGRlYWxpbmcgd2l0aCBcImRpcmVjdFwiIGRpc3BhdGNoZXMuXG4gKlxuICogQHJldHVybiB7Kn0gVGhlIHJldHVybiB2YWx1ZSBvZiBleGVjdXRpbmcgdGhlIHNpbmdsZSBkaXNwYXRjaC5cbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURpcmVjdERpc3BhdGNoKGV2ZW50KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdmFsaWRhdGVFdmVudERpc3BhdGNoZXMoZXZlbnQpO1xuICB9XG4gIHZhciBkaXNwYXRjaExpc3RlbmVyID0gZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzO1xuICB2YXIgZGlzcGF0Y2hJbnN0YW5jZSA9IGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcztcbiAgISFBcnJheS5pc0FycmF5KGRpc3BhdGNoTGlzdGVuZXIpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2V4ZWN1dGVEaXJlY3REaXNwYXRjaCguLi4pOiBJbnZhbGlkIGBldmVudGAuJykgOiBfcHJvZEludmFyaWFudCgnMTAzJykgOiB2b2lkIDA7XG4gIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBkaXNwYXRjaExpc3RlbmVyID8gRXZlbnRQbHVnaW5VdGlscy5nZXROb2RlRnJvbUluc3RhbmNlKGRpc3BhdGNoSW5zdGFuY2UpIDogbnVsbDtcbiAgdmFyIHJlcyA9IGRpc3BhdGNoTGlzdGVuZXIgPyBkaXNwYXRjaExpc3RlbmVyKGV2ZW50KSA6IG51bGw7XG4gIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBudWxsO1xuICBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMgPSBudWxsO1xuICBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMgPSBudWxsO1xuICByZXR1cm4gcmVzO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmZiBudW1iZXIgb2YgZGlzcGF0Y2hlcyBhY2N1bXVsYXRlZCBpcyBncmVhdGVyIHRoYW4gMC5cbiAqL1xuZnVuY3Rpb24gaGFzRGlzcGF0Y2hlcyhldmVudCkge1xuICByZXR1cm4gISFldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnM7XG59XG5cbi8qKlxuICogR2VuZXJhbCB1dGlsaXRpZXMgdGhhdCBhcmUgdXNlZnVsIGluIGNyZWF0aW5nIGN1c3RvbSBFdmVudCBQbHVnaW5zLlxuICovXG52YXIgRXZlbnRQbHVnaW5VdGlscyA9IHtcbiAgaXNFbmRpc2g6IGlzRW5kaXNoLFxuICBpc01vdmVpc2g6IGlzTW92ZWlzaCxcbiAgaXNTdGFydGlzaDogaXNTdGFydGlzaCxcblxuICBleGVjdXRlRGlyZWN0RGlzcGF0Y2g6IGV4ZWN1dGVEaXJlY3REaXNwYXRjaCxcbiAgZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyOiBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXIsXG4gIGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlclN0b3BBdFRydWU6IGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlclN0b3BBdFRydWUsXG4gIGhhc0Rpc3BhdGNoZXM6IGhhc0Rpc3BhdGNoZXMsXG5cbiAgZ2V0SW5zdGFuY2VGcm9tTm9kZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpO1xuICB9LFxuICBnZXROb2RlRnJvbUluc3RhbmNlOiBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBDb21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2Uobm9kZSk7XG4gIH0sXG4gIGlzQW5jZXN0b3I6IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIFRyZWVUcmF2ZXJzYWwuaXNBbmNlc3RvcihhLCBiKTtcbiAgfSxcbiAgZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3I6IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIFRyZWVUcmF2ZXJzYWwuZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoYSwgYik7XG4gIH0sXG4gIGdldFBhcmVudEluc3RhbmNlOiBmdW5jdGlvbiAoaW5zdCkge1xuICAgIHJldHVybiBUcmVlVHJhdmVyc2FsLmdldFBhcmVudEluc3RhbmNlKGluc3QpO1xuICB9LFxuICB0cmF2ZXJzZVR3b1BoYXNlOiBmdW5jdGlvbiAodGFyZ2V0LCBmbiwgYXJnKSB7XG4gICAgcmV0dXJuIFRyZWVUcmF2ZXJzYWwudHJhdmVyc2VUd29QaGFzZSh0YXJnZXQsIGZuLCBhcmcpO1xuICB9LFxuICB0cmF2ZXJzZUVudGVyTGVhdmU6IGZ1bmN0aW9uIChmcm9tLCB0bywgZm4sIGFyZ0Zyb20sIGFyZ1RvKSB7XG4gICAgcmV0dXJuIFRyZWVUcmF2ZXJzYWwudHJhdmVyc2VFbnRlckxlYXZlKGZyb20sIHRvLCBmbiwgYXJnRnJvbSwgYXJnVG8pO1xuICB9LFxuXG4gIGluamVjdGlvbjogaW5qZWN0aW9uXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50UGx1Z2luVXRpbHM7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogQWNjdW11bGF0ZXMgaXRlbXMgdGhhdCBtdXN0IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZCBpbnRvIHRoZSBmaXJzdCBvbmUuIFRoaXNcbiAqIGlzIHVzZWQgdG8gY29uc2VydmUgbWVtb3J5IGJ5IGF2b2lkaW5nIGFycmF5IGFsbG9jYXRpb25zLCBhbmQgdGh1cyBzYWNyaWZpY2VzXG4gKiBBUEkgY2xlYW5uZXNzLiBTaW5jZSBgY3VycmVudGAgY2FuIGJlIG51bGwgYmVmb3JlIGJlaW5nIHBhc3NlZCBpbiBhbmQgbm90XG4gKiBudWxsIGFmdGVyIHRoaXMgZnVuY3Rpb24sIG1ha2Ugc3VyZSB0byBhc3NpZ24gaXQgYmFjayB0byBgY3VycmVudGA6XG4gKlxuICogYGEgPSBhY2N1bXVsYXRlSW50byhhLCBiKTtgXG4gKlxuICogVGhpcyBBUEkgc2hvdWxkIGJlIHNwYXJpbmdseSB1c2VkLiBUcnkgYGFjY3VtdWxhdGVgIGZvciBzb21ldGhpbmcgY2xlYW5lci5cbiAqXG4gKiBAcmV0dXJuIHsqfGFycmF5PCo+fSBBbiBhY2N1bXVsYXRpb24gb2YgaXRlbXMuXG4gKi9cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUludG8oY3VycmVudCwgbmV4dCkge1xuICAhKG5leHQgIT0gbnVsbCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnYWNjdW11bGF0ZUludG8oLi4uKTogQWNjdW11bGF0ZWQgaXRlbXMgbXVzdCBub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuJykgOiBfcHJvZEludmFyaWFudCgnMzAnKSA6IHZvaWQgMDtcblxuICBpZiAoY3VycmVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cblxuICAvLyBCb3RoIGFyZSBub3QgZW1wdHkuIFdhcm5pbmc6IE5ldmVyIGNhbGwgeC5jb25jYXQoeSkgd2hlbiB5b3UgYXJlIG5vdFxuICAvLyBjZXJ0YWluIHRoYXQgeCBpcyBhbiBBcnJheSAoeCBjb3VsZCBiZSBhIHN0cmluZyB3aXRoIGNvbmNhdCBtZXRob2QpLlxuICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50KSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG5leHQpKSB7XG4gICAgICBjdXJyZW50LnB1c2guYXBwbHkoY3VycmVudCwgbmV4dCk7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgY3VycmVudC5wdXNoKG5leHQpO1xuICAgIHJldHVybiBjdXJyZW50O1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkobmV4dCkpIHtcbiAgICAvLyBBIGJpdCB0b28gZGFuZ2Vyb3VzIHRvIG11dGF0ZSBgbmV4dGAuXG4gICAgcmV0dXJuIFtjdXJyZW50XS5jb25jYXQobmV4dCk7XG4gIH1cblxuICByZXR1cm4gW2N1cnJlbnQsIG5leHRdO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFjY3VtdWxhdGVJbnRvOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAcGFyYW0ge2FycmF5fSBhcnIgYW4gXCJhY2N1bXVsYXRpb25cIiBvZiBpdGVtcyB3aGljaCBpcyBlaXRoZXIgYW4gQXJyYXkgb3JcbiAqIGEgc2luZ2xlIGl0ZW0uIFVzZWZ1bCB3aGVuIHBhaXJlZCB3aXRoIHRoZSBgYWNjdW11bGF0ZWAgbW9kdWxlLiBUaGlzIGlzIGFcbiAqIHNpbXBsZSB1dGlsaXR5IHRoYXQgYWxsb3dzIHVzIHRvIHJlYXNvbiBhYm91dCBhIGNvbGxlY3Rpb24gb2YgaXRlbXMsIGJ1dFxuICogaGFuZGxpbmcgdGhlIGNhc2Ugd2hlbiB0aGVyZSBpcyBleGFjdGx5IG9uZSBpdGVtIChhbmQgd2UgZG8gbm90IG5lZWQgdG9cbiAqIGFsbG9jYXRlIGFuIGFycmF5KS5cbiAqL1xuXG5mdW5jdGlvbiBmb3JFYWNoQWNjdW11bGF0ZWQoYXJyLCBjYiwgc2NvcGUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgIGFyci5mb3JFYWNoKGNiLCBzY29wZSk7XG4gIH0gZWxzZSBpZiAoYXJyKSB7XG4gICAgY2IuY2FsbChzY29wZSwgYXJyKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZvckVhY2hBY2N1bXVsYXRlZDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgRXZlbnRQbHVnaW5SZWdpc3RyeSA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5SZWdpc3RyeScpO1xudmFyIEV2ZW50UGx1Z2luVXRpbHMgPSByZXF1aXJlKCcuL0V2ZW50UGx1Z2luVXRpbHMnKTtcbnZhciBSZWFjdEVycm9yVXRpbHMgPSByZXF1aXJlKCcuL1JlYWN0RXJyb3JVdGlscycpO1xuXG52YXIgYWNjdW11bGF0ZUludG8gPSByZXF1aXJlKCcuL2FjY3VtdWxhdGVJbnRvJyk7XG52YXIgZm9yRWFjaEFjY3VtdWxhdGVkID0gcmVxdWlyZSgnLi9mb3JFYWNoQWNjdW11bGF0ZWQnKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBJbnRlcm5hbCBzdG9yZSBmb3IgZXZlbnQgbGlzdGVuZXJzXG4gKi9cbnZhciBsaXN0ZW5lckJhbmsgPSB7fTtcblxuLyoqXG4gKiBJbnRlcm5hbCBxdWV1ZSBvZiBldmVudHMgdGhhdCBoYXZlIGFjY3VtdWxhdGVkIHRoZWlyIGRpc3BhdGNoZXMgYW5kIGFyZVxuICogd2FpdGluZyB0byBoYXZlIHRoZWlyIGRpc3BhdGNoZXMgZXhlY3V0ZWQuXG4gKi9cbnZhciBldmVudFF1ZXVlID0gbnVsbDtcblxuLyoqXG4gKiBEaXNwYXRjaGVzIGFuIGV2ZW50IGFuZCByZWxlYXNlcyBpdCBiYWNrIGludG8gdGhlIHBvb2wsIHVubGVzcyBwZXJzaXN0ZW50LlxuICpcbiAqIEBwYXJhbSB7P29iamVjdH0gZXZlbnQgU3ludGhldGljIGV2ZW50IHRvIGJlIGRpc3BhdGNoZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNpbXVsYXRlZCBJZiB0aGUgZXZlbnQgaXMgc2ltdWxhdGVkIChjaGFuZ2VzIGV4biBiZWhhdmlvcilcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBleGVjdXRlRGlzcGF0Y2hlc0FuZFJlbGVhc2UgPSBmdW5jdGlvbiAoZXZlbnQsIHNpbXVsYXRlZCkge1xuICBpZiAoZXZlbnQpIHtcbiAgICBFdmVudFBsdWdpblV0aWxzLmV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlcihldmVudCwgc2ltdWxhdGVkKTtcblxuICAgIGlmICghZXZlbnQuaXNQZXJzaXN0ZW50KCkpIHtcbiAgICAgIGV2ZW50LmNvbnN0cnVjdG9yLnJlbGVhc2UoZXZlbnQpO1xuICAgIH1cbiAgfVxufTtcbnZhciBleGVjdXRlRGlzcGF0Y2hlc0FuZFJlbGVhc2VTaW11bGF0ZWQgPSBmdW5jdGlvbiAoZSkge1xuICByZXR1cm4gZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlKGUsIHRydWUpO1xufTtcbnZhciBleGVjdXRlRGlzcGF0Y2hlc0FuZFJlbGVhc2VUb3BMZXZlbCA9IGZ1bmN0aW9uIChlKSB7XG4gIHJldHVybiBleGVjdXRlRGlzcGF0Y2hlc0FuZFJlbGVhc2UoZSwgZmFsc2UpO1xufTtcblxudmFyIGdldERpY3Rpb25hcnlLZXkgPSBmdW5jdGlvbiAoaW5zdCkge1xuICAvLyBQcmV2ZW50cyBWOCBwZXJmb3JtYW5jZSBpc3N1ZTpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNzIzMlxuICByZXR1cm4gJy4nICsgaW5zdC5fcm9vdE5vZGVJRDtcbn07XG5cbmZ1bmN0aW9uIGlzSW50ZXJhY3RpdmUodGFnKSB7XG4gIHJldHVybiB0YWcgPT09ICdidXR0b24nIHx8IHRhZyA9PT0gJ2lucHV0JyB8fCB0YWcgPT09ICdzZWxlY3QnIHx8IHRhZyA9PT0gJ3RleHRhcmVhJztcbn1cblxuZnVuY3Rpb24gc2hvdWxkUHJldmVudE1vdXNlRXZlbnQobmFtZSwgdHlwZSwgcHJvcHMpIHtcbiAgc3dpdGNoIChuYW1lKSB7XG4gICAgY2FzZSAnb25DbGljayc6XG4gICAgY2FzZSAnb25DbGlja0NhcHR1cmUnOlxuICAgIGNhc2UgJ29uRG91YmxlQ2xpY2snOlxuICAgIGNhc2UgJ29uRG91YmxlQ2xpY2tDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlRG93bic6XG4gICAgY2FzZSAnb25Nb3VzZURvd25DYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlTW92ZSc6XG4gICAgY2FzZSAnb25Nb3VzZU1vdmVDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlVXAnOlxuICAgIGNhc2UgJ29uTW91c2VVcENhcHR1cmUnOlxuICAgICAgcmV0dXJuICEhKHByb3BzLmRpc2FibGVkICYmIGlzSW50ZXJhY3RpdmUodHlwZSkpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGlzIGEgdW5pZmllZCBpbnRlcmZhY2UgZm9yIGV2ZW50IHBsdWdpbnMgdG8gYmUgaW5zdGFsbGVkIGFuZCBjb25maWd1cmVkLlxuICpcbiAqIEV2ZW50IHBsdWdpbnMgY2FuIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICBgZXh0cmFjdEV2ZW50c2Age2Z1bmN0aW9uKHN0cmluZywgRE9NRXZlbnRUYXJnZXQsIHN0cmluZywgb2JqZWN0KTogKn1cbiAqICAgICBSZXF1aXJlZC4gV2hlbiBhIHRvcC1sZXZlbCBldmVudCBpcyBmaXJlZCwgdGhpcyBtZXRob2QgaXMgZXhwZWN0ZWQgdG9cbiAqICAgICBleHRyYWN0IHN5bnRoZXRpYyBldmVudHMgdGhhdCB3aWxsIGluIHR1cm4gYmUgcXVldWVkIGFuZCBkaXNwYXRjaGVkLlxuICpcbiAqICAgYGV2ZW50VHlwZXNgIHtvYmplY3R9XG4gKiAgICAgT3B0aW9uYWwsIHBsdWdpbnMgdGhhdCBmaXJlIGV2ZW50cyBtdXN0IHB1Ymxpc2ggYSBtYXBwaW5nIG9mIHJlZ2lzdHJhdGlvblxuICogICAgIG5hbWVzIHRoYXQgYXJlIHVzZWQgdG8gcmVnaXN0ZXIgbGlzdGVuZXJzLiBWYWx1ZXMgb2YgdGhpcyBtYXBwaW5nIG11c3RcbiAqICAgICBiZSBvYmplY3RzIHRoYXQgY29udGFpbiBgcmVnaXN0cmF0aW9uTmFtZWAgb3IgYHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzYC5cbiAqXG4gKiAgIGBleGVjdXRlRGlzcGF0Y2hgIHtmdW5jdGlvbihvYmplY3QsIGZ1bmN0aW9uLCBzdHJpbmcpfVxuICogICAgIE9wdGlvbmFsLCBhbGxvd3MgcGx1Z2lucyB0byBvdmVycmlkZSBob3cgYW4gZXZlbnQgZ2V0cyBkaXNwYXRjaGVkLiBCeVxuICogICAgIGRlZmF1bHQsIHRoZSBsaXN0ZW5lciBpcyBzaW1wbHkgaW52b2tlZC5cbiAqXG4gKiBFYWNoIHBsdWdpbiB0aGF0IGlzIGluamVjdGVkIGludG8gYEV2ZW50c1BsdWdpbkh1YmAgaXMgaW1tZWRpYXRlbHkgb3BlcmFibGUuXG4gKlxuICogQHB1YmxpY1xuICovXG52YXIgRXZlbnRQbHVnaW5IdWIgPSB7XG4gIC8qKlxuICAgKiBNZXRob2RzIGZvciBpbmplY3RpbmcgZGVwZW5kZW5jaWVzLlxuICAgKi9cbiAgaW5qZWN0aW9uOiB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHthcnJheX0gSW5qZWN0ZWRFdmVudFBsdWdpbk9yZGVyXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIGluamVjdEV2ZW50UGx1Z2luT3JkZXI6IEV2ZW50UGx1Z2luUmVnaXN0cnkuaW5qZWN0RXZlbnRQbHVnaW5PcmRlcixcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBpbmplY3RlZE5hbWVzVG9QbHVnaW5zIE1hcCBmcm9tIG5hbWVzIHRvIHBsdWdpbiBtb2R1bGVzLlxuICAgICAqL1xuICAgIGluamVjdEV2ZW50UGx1Z2luc0J5TmFtZTogRXZlbnRQbHVnaW5SZWdpc3RyeS5pbmplY3RFdmVudFBsdWdpbnNCeU5hbWVcbiAgfSxcblxuICAvKipcbiAgICogU3RvcmVzIGBsaXN0ZW5lcmAgYXQgYGxpc3RlbmVyQmFua1tyZWdpc3RyYXRpb25OYW1lXVtrZXldYC4gSXMgaWRlbXBvdGVudC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGluc3QgVGhlIGluc3RhbmNlLCB3aGljaCBpcyB0aGUgc291cmNlIG9mIGV2ZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5hbWUgTmFtZSBvZiBsaXN0ZW5lciAoZS5nLiBgb25DbGlja2ApLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgY2FsbGJhY2sgdG8gc3RvcmUuXG4gICAqL1xuICBwdXRMaXN0ZW5lcjogZnVuY3Rpb24gKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUsIGxpc3RlbmVyKSB7XG4gICAgISh0eXBlb2YgbGlzdGVuZXIgPT09ICdmdW5jdGlvbicpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V4cGVjdGVkICVzIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24sIGluc3RlYWQgZ290IHR5cGUgJXMnLCByZWdpc3RyYXRpb25OYW1lLCB0eXBlb2YgbGlzdGVuZXIpIDogX3Byb2RJbnZhcmlhbnQoJzk0JywgcmVnaXN0cmF0aW9uTmFtZSwgdHlwZW9mIGxpc3RlbmVyKSA6IHZvaWQgMDtcblxuICAgIHZhciBrZXkgPSBnZXREaWN0aW9uYXJ5S2V5KGluc3QpO1xuICAgIHZhciBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZSA9IGxpc3RlbmVyQmFua1tyZWdpc3RyYXRpb25OYW1lXSB8fCAobGlzdGVuZXJCYW5rW3JlZ2lzdHJhdGlvbk5hbWVdID0ge30pO1xuICAgIGJhbmtGb3JSZWdpc3RyYXRpb25OYW1lW2tleV0gPSBsaXN0ZW5lcjtcblxuICAgIHZhciBQbHVnaW5Nb2R1bGUgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3JlZ2lzdHJhdGlvbk5hbWVdO1xuICAgIGlmIChQbHVnaW5Nb2R1bGUgJiYgUGx1Z2luTW9kdWxlLmRpZFB1dExpc3RlbmVyKSB7XG4gICAgICBQbHVnaW5Nb2R1bGUuZGlkUHV0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGluc3QgVGhlIGluc3RhbmNlLCB3aGljaCBpcyB0aGUgc291cmNlIG9mIGV2ZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5hbWUgTmFtZSBvZiBsaXN0ZW5lciAoZS5nLiBgb25DbGlja2ApLlxuICAgKiBAcmV0dXJuIHs/ZnVuY3Rpb259IFRoZSBzdG9yZWQgY2FsbGJhY2suXG4gICAqL1xuICBnZXRMaXN0ZW5lcjogZnVuY3Rpb24gKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUpIHtcbiAgICAvLyBUT0RPOiBzaG91bGRQcmV2ZW50TW91c2VFdmVudCBpcyBET00tc3BlY2lmaWMgYW5kIGRlZmluaXRlbHkgc2hvdWxkIG5vdFxuICAgIC8vIGxpdmUgaGVyZTsgbmVlZHMgdG8gYmUgbW92ZWQgdG8gYSBiZXR0ZXIgcGxhY2Ugc29vblxuICAgIHZhciBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZSA9IGxpc3RlbmVyQmFua1tyZWdpc3RyYXRpb25OYW1lXTtcbiAgICBpZiAoc2hvdWxkUHJldmVudE1vdXNlRXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgaW5zdC5fY3VycmVudEVsZW1lbnQudHlwZSwgaW5zdC5fY3VycmVudEVsZW1lbnQucHJvcHMpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIGtleSA9IGdldERpY3Rpb25hcnlLZXkoaW5zdCk7XG4gICAgcmV0dXJuIGJhbmtGb3JSZWdpc3RyYXRpb25OYW1lICYmIGJhbmtGb3JSZWdpc3RyYXRpb25OYW1lW2tleV07XG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSByZWdpc3RyYXRpb24gYmFuay5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGluc3QgVGhlIGluc3RhbmNlLCB3aGljaCBpcyB0aGUgc291cmNlIG9mIGV2ZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5hbWUgTmFtZSBvZiBsaXN0ZW5lciAoZS5nLiBgb25DbGlja2ApLlxuICAgKi9cbiAgZGVsZXRlTGlzdGVuZXI6IGZ1bmN0aW9uIChpbnN0LCByZWdpc3RyYXRpb25OYW1lKSB7XG4gICAgdmFyIFBsdWdpbk1vZHVsZSA9IEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV07XG4gICAgaWYgKFBsdWdpbk1vZHVsZSAmJiBQbHVnaW5Nb2R1bGUud2lsbERlbGV0ZUxpc3RlbmVyKSB7XG4gICAgICBQbHVnaW5Nb2R1bGUud2lsbERlbGV0ZUxpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgIH1cblxuICAgIHZhciBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZSA9IGxpc3RlbmVyQmFua1tyZWdpc3RyYXRpb25OYW1lXTtcbiAgICAvLyBUT0RPOiBUaGlzIHNob3VsZCBuZXZlciBiZSBudWxsIC0tIHdoZW4gaXMgaXQ/XG4gICAgaWYgKGJhbmtGb3JSZWdpc3RyYXRpb25OYW1lKSB7XG4gICAgICB2YXIga2V5ID0gZ2V0RGljdGlvbmFyeUtleShpbnN0KTtcbiAgICAgIGRlbGV0ZSBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZVtrZXldO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogRGVsZXRlcyBhbGwgbGlzdGVuZXJzIGZvciB0aGUgRE9NIGVsZW1lbnQgd2l0aCB0aGUgc3VwcGxpZWQgSUQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpbnN0IFRoZSBpbnN0YW5jZSwgd2hpY2ggaXMgdGhlIHNvdXJjZSBvZiBldmVudHMuXG4gICAqL1xuICBkZWxldGVBbGxMaXN0ZW5lcnM6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgdmFyIGtleSA9IGdldERpY3Rpb25hcnlLZXkoaW5zdCk7XG4gICAgZm9yICh2YXIgcmVnaXN0cmF0aW9uTmFtZSBpbiBsaXN0ZW5lckJhbmspIHtcbiAgICAgIGlmICghbGlzdGVuZXJCYW5rLmhhc093blByb3BlcnR5KHJlZ2lzdHJhdGlvbk5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWxpc3RlbmVyQmFua1tyZWdpc3RyYXRpb25OYW1lXVtrZXldKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgUGx1Z2luTW9kdWxlID0gRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tyZWdpc3RyYXRpb25OYW1lXTtcbiAgICAgIGlmIChQbHVnaW5Nb2R1bGUgJiYgUGx1Z2luTW9kdWxlLndpbGxEZWxldGVMaXN0ZW5lcikge1xuICAgICAgICBQbHVnaW5Nb2R1bGUud2lsbERlbGV0ZUxpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgICAgfVxuXG4gICAgICBkZWxldGUgbGlzdGVuZXJCYW5rW3JlZ2lzdHJhdGlvbk5hbWVdW2tleV07XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBBbGxvd3MgcmVnaXN0ZXJlZCBwbHVnaW5zIGFuIG9wcG9ydHVuaXR5IHRvIGV4dHJhY3QgZXZlbnRzIGZyb20gdG9wLWxldmVsXG4gICAqIG5hdGl2ZSBicm93c2VyIGV2ZW50cy5cbiAgICpcbiAgICogQHJldHVybiB7Kn0gQW4gYWNjdW11bGF0aW9uIG9mIHN5bnRoZXRpYyBldmVudHMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZXh0cmFjdEV2ZW50czogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgdmFyIGV2ZW50cztcbiAgICB2YXIgcGx1Z2lucyA9IEV2ZW50UGx1Z2luUmVnaXN0cnkucGx1Z2lucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIE5vdCBldmVyeSBwbHVnaW4gaW4gdGhlIG9yZGVyaW5nIG1heSBiZSBsb2FkZWQgYXQgcnVudGltZS5cbiAgICAgIHZhciBwb3NzaWJsZVBsdWdpbiA9IHBsdWdpbnNbaV07XG4gICAgICBpZiAocG9zc2libGVQbHVnaW4pIHtcbiAgICAgICAgdmFyIGV4dHJhY3RlZEV2ZW50cyA9IHBvc3NpYmxlUGx1Z2luLmV4dHJhY3RFdmVudHModG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgICBpZiAoZXh0cmFjdGVkRXZlbnRzKSB7XG4gICAgICAgICAgZXZlbnRzID0gYWNjdW11bGF0ZUludG8oZXZlbnRzLCBleHRyYWN0ZWRFdmVudHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBldmVudHM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEVucXVldWVzIGEgc3ludGhldGljIGV2ZW50IHRoYXQgc2hvdWxkIGJlIGRpc3BhdGNoZWQgd2hlblxuICAgKiBgcHJvY2Vzc0V2ZW50UXVldWVgIGlzIGludm9rZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gZXZlbnRzIEFuIGFjY3VtdWxhdGlvbiBvZiBzeW50aGV0aWMgZXZlbnRzLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVFdmVudHM6IGZ1bmN0aW9uIChldmVudHMpIHtcbiAgICBpZiAoZXZlbnRzKSB7XG4gICAgICBldmVudFF1ZXVlID0gYWNjdW11bGF0ZUludG8oZXZlbnRRdWV1ZSwgZXZlbnRzKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIERpc3BhdGNoZXMgYWxsIHN5bnRoZXRpYyBldmVudHMgb24gdGhlIGV2ZW50IHF1ZXVlLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb2Nlc3NFdmVudFF1ZXVlOiBmdW5jdGlvbiAoc2ltdWxhdGVkKSB7XG4gICAgLy8gU2V0IGBldmVudFF1ZXVlYCB0byBudWxsIGJlZm9yZSBwcm9jZXNzaW5nIGl0IHNvIHRoYXQgd2UgY2FuIHRlbGwgaWYgbW9yZVxuICAgIC8vIGV2ZW50cyBnZXQgZW5xdWV1ZWQgd2hpbGUgcHJvY2Vzc2luZy5cbiAgICB2YXIgcHJvY2Vzc2luZ0V2ZW50UXVldWUgPSBldmVudFF1ZXVlO1xuICAgIGV2ZW50UXVldWUgPSBudWxsO1xuICAgIGlmIChzaW11bGF0ZWQpIHtcbiAgICAgIGZvckVhY2hBY2N1bXVsYXRlZChwcm9jZXNzaW5nRXZlbnRRdWV1ZSwgZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlU2ltdWxhdGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yRWFjaEFjY3VtdWxhdGVkKHByb2Nlc3NpbmdFdmVudFF1ZXVlLCBleGVjdXRlRGlzcGF0Y2hlc0FuZFJlbGVhc2VUb3BMZXZlbCk7XG4gICAgfVxuICAgICEhZXZlbnRRdWV1ZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdwcm9jZXNzRXZlbnRRdWV1ZSgpOiBBZGRpdGlvbmFsIGV2ZW50cyB3ZXJlIGVucXVldWVkIHdoaWxlIHByb2Nlc3NpbmcgYW4gZXZlbnQgcXVldWUuIFN1cHBvcnQgZm9yIHRoaXMgaGFzIG5vdCB5ZXQgYmVlbiBpbXBsZW1lbnRlZC4nKSA6IF9wcm9kSW52YXJpYW50KCc5NScpIDogdm9pZCAwO1xuICAgIC8vIFRoaXMgd291bGQgYmUgYSBnb29kIHRpbWUgdG8gcmV0aHJvdyBpZiBhbnkgb2YgdGhlIGV2ZW50IGhhbmRsZXJzIHRocmV3LlxuICAgIFJlYWN0RXJyb3JVdGlscy5yZXRocm93Q2F1Z2h0RXJyb3IoKTtcbiAgfSxcblxuICAvKipcbiAgICogVGhlc2UgYXJlIG5lZWRlZCBmb3IgdGVzdHMgb25seS4gRG8gbm90IHVzZSFcbiAgICovXG4gIF9fcHVyZ2U6IGZ1bmN0aW9uICgpIHtcbiAgICBsaXN0ZW5lckJhbmsgPSB7fTtcbiAgfSxcblxuICBfX2dldExpc3RlbmVyQmFuazogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBsaXN0ZW5lckJhbms7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRQbHVnaW5IdWI7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEV2ZW50UGx1Z2luSHViID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpbkh1YicpO1xudmFyIEV2ZW50UGx1Z2luVXRpbHMgPSByZXF1aXJlKCcuL0V2ZW50UGx1Z2luVXRpbHMnKTtcblxudmFyIGFjY3VtdWxhdGVJbnRvID0gcmVxdWlyZSgnLi9hY2N1bXVsYXRlSW50bycpO1xudmFyIGZvckVhY2hBY2N1bXVsYXRlZCA9IHJlcXVpcmUoJy4vZm9yRWFjaEFjY3VtdWxhdGVkJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIGdldExpc3RlbmVyID0gRXZlbnRQbHVnaW5IdWIuZ2V0TGlzdGVuZXI7XG5cbi8qKlxuICogU29tZSBldmVudCB0eXBlcyBoYXZlIGEgbm90aW9uIG9mIGRpZmZlcmVudCByZWdpc3RyYXRpb24gbmFtZXMgZm9yIGRpZmZlcmVudFxuICogXCJwaGFzZXNcIiBvZiBwcm9wYWdhdGlvbi4gVGhpcyBmaW5kcyBsaXN0ZW5lcnMgYnkgYSBnaXZlbiBwaGFzZS5cbiAqL1xuZnVuY3Rpb24gbGlzdGVuZXJBdFBoYXNlKGluc3QsIGV2ZW50LCBwcm9wYWdhdGlvblBoYXNlKSB7XG4gIHZhciByZWdpc3RyYXRpb25OYW1lID0gZXZlbnQuZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXNbcHJvcGFnYXRpb25QaGFzZV07XG4gIHJldHVybiBnZXRMaXN0ZW5lcihpbnN0LCByZWdpc3RyYXRpb25OYW1lKTtcbn1cblxuLyoqXG4gKiBUYWdzIGEgYFN5bnRoZXRpY0V2ZW50YCB3aXRoIGRpc3BhdGNoZWQgbGlzdGVuZXJzLiBDcmVhdGluZyB0aGlzIGZ1bmN0aW9uXG4gKiBoZXJlLCBhbGxvd3MgdXMgdG8gbm90IGhhdmUgdG8gYmluZCBvciBjcmVhdGUgZnVuY3Rpb25zIGZvciBlYWNoIGV2ZW50LlxuICogTXV0YXRpbmcgdGhlIGV2ZW50J3MgbWVtYmVycyBhbGxvd3MgdXMgdG8gbm90IGhhdmUgdG8gY3JlYXRlIGEgd3JhcHBpbmdcbiAqIFwiZGlzcGF0Y2hcIiBvYmplY3QgdGhhdCBwYWlycyB0aGUgZXZlbnQgd2l0aCB0aGUgbGlzdGVuZXIuXG4gKi9cbmZ1bmN0aW9uIGFjY3VtdWxhdGVEaXJlY3Rpb25hbERpc3BhdGNoZXMoaW5zdCwgcGhhc2UsIGV2ZW50KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoaW5zdCwgJ0Rpc3BhdGNoaW5nIGluc3QgbXVzdCBub3QgYmUgbnVsbCcpIDogdm9pZCAwO1xuICB9XG4gIHZhciBsaXN0ZW5lciA9IGxpc3RlbmVyQXRQaGFzZShpbnN0LCBldmVudCwgcGhhc2UpO1xuICBpZiAobGlzdGVuZXIpIHtcbiAgICBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMgPSBhY2N1bXVsYXRlSW50byhldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMsIGxpc3RlbmVyKTtcbiAgICBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMgPSBhY2N1bXVsYXRlSW50byhldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMsIGluc3QpO1xuICB9XG59XG5cbi8qKlxuICogQ29sbGVjdCBkaXNwYXRjaGVzIChtdXN0IGJlIGVudGlyZWx5IGNvbGxlY3RlZCBiZWZvcmUgZGlzcGF0Y2hpbmcgLSBzZWUgdW5pdFxuICogdGVzdHMpLiBMYXppbHkgYWxsb2NhdGUgdGhlIGFycmF5IHRvIGNvbnNlcnZlIG1lbW9yeS4gIFdlIG11c3QgbG9vcCB0aHJvdWdoXG4gKiBlYWNoIGV2ZW50IGFuZCBwZXJmb3JtIHRoZSB0cmF2ZXJzYWwgZm9yIGVhY2ggb25lLiBXZSBjYW5ub3QgcGVyZm9ybSBhXG4gKiBzaW5nbGUgdHJhdmVyc2FsIGZvciB0aGUgZW50aXJlIGNvbGxlY3Rpb24gb2YgZXZlbnRzIGJlY2F1c2UgZWFjaCBldmVudCBtYXlcbiAqIGhhdmUgYSBkaWZmZXJlbnQgdGFyZ2V0LlxuICovXG5mdW5jdGlvbiBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2luZ2xlKGV2ZW50KSB7XG4gIGlmIChldmVudCAmJiBldmVudC5kaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lcykge1xuICAgIEV2ZW50UGx1Z2luVXRpbHMudHJhdmVyc2VUd29QaGFzZShldmVudC5fdGFyZ2V0SW5zdCwgYWNjdW11bGF0ZURpcmVjdGlvbmFsRGlzcGF0Y2hlcywgZXZlbnQpO1xuICB9XG59XG5cbi8qKlxuICogU2FtZSBhcyBgYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NpbmdsZWAsIGJ1dCBza2lwcyBvdmVyIHRoZSB0YXJnZXRJRC5cbiAqL1xuZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NpbmdsZVNraXBUYXJnZXQoZXZlbnQpIHtcbiAgaWYgKGV2ZW50ICYmIGV2ZW50LmRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKSB7XG4gICAgdmFyIHRhcmdldEluc3QgPSBldmVudC5fdGFyZ2V0SW5zdDtcbiAgICB2YXIgcGFyZW50SW5zdCA9IHRhcmdldEluc3QgPyBFdmVudFBsdWdpblV0aWxzLmdldFBhcmVudEluc3RhbmNlKHRhcmdldEluc3QpIDogbnVsbDtcbiAgICBFdmVudFBsdWdpblV0aWxzLnRyYXZlcnNlVHdvUGhhc2UocGFyZW50SW5zdCwgYWNjdW11bGF0ZURpcmVjdGlvbmFsRGlzcGF0Y2hlcywgZXZlbnQpO1xuICB9XG59XG5cbi8qKlxuICogQWNjdW11bGF0ZXMgd2l0aG91dCByZWdhcmQgdG8gZGlyZWN0aW9uLCBkb2VzIG5vdCBsb29rIGZvciBwaGFzZWRcbiAqIHJlZ2lzdHJhdGlvbiBuYW1lcy4gU2FtZSBhcyBgYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXNTaW5nbGVgIGJ1dCB3aXRob3V0XG4gKiByZXF1aXJpbmcgdGhhdCB0aGUgYGRpc3BhdGNoTWFya2VyYCBiZSB0aGUgc2FtZSBhcyB0aGUgZGlzcGF0Y2hlZCBJRC5cbiAqL1xuZnVuY3Rpb24gYWNjdW11bGF0ZURpc3BhdGNoZXMoaW5zdCwgaWdub3JlZERpcmVjdGlvbiwgZXZlbnQpIHtcbiAgaWYgKGV2ZW50ICYmIGV2ZW50LmRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUpIHtcbiAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IGV2ZW50LmRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWU7XG4gICAgdmFyIGxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSk7XG4gICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMgPSBhY2N1bXVsYXRlSW50byhldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMsIGxpc3RlbmVyKTtcbiAgICAgIGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcyA9IGFjY3VtdWxhdGVJbnRvKGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcywgaW5zdCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQWNjdW11bGF0ZXMgZGlzcGF0Y2hlcyBvbiBhbiBgU3ludGhldGljRXZlbnRgLCBidXQgb25seSBmb3IgdGhlXG4gKiBgZGlzcGF0Y2hNYXJrZXJgLlxuICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXNTaW5nbGUoZXZlbnQpIHtcbiAgaWYgKGV2ZW50ICYmIGV2ZW50LmRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUpIHtcbiAgICBhY2N1bXVsYXRlRGlzcGF0Y2hlcyhldmVudC5fdGFyZ2V0SW5zdCwgbnVsbCwgZXZlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoZXZlbnRzKSB7XG4gIGZvckVhY2hBY2N1bXVsYXRlZChldmVudHMsIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTaW5nbGUpO1xufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2tpcFRhcmdldChldmVudHMpIHtcbiAgZm9yRWFjaEFjY3VtdWxhdGVkKGV2ZW50cywgYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NpbmdsZVNraXBUYXJnZXQpO1xufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlRW50ZXJMZWF2ZURpc3BhdGNoZXMobGVhdmUsIGVudGVyLCBmcm9tLCB0bykge1xuICBFdmVudFBsdWdpblV0aWxzLnRyYXZlcnNlRW50ZXJMZWF2ZShmcm9tLCB0bywgYWNjdW11bGF0ZURpc3BhdGNoZXMsIGxlYXZlLCBlbnRlcik7XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVzKGV2ZW50cykge1xuICBmb3JFYWNoQWNjdW11bGF0ZWQoZXZlbnRzLCBhY2N1bXVsYXRlRGlyZWN0RGlzcGF0Y2hlc1NpbmdsZSk7XG59XG5cbi8qKlxuICogQSBzbWFsbCBzZXQgb2YgcHJvcGFnYXRpb24gcGF0dGVybnMsIGVhY2ggb2Ygd2hpY2ggd2lsbCBhY2NlcHQgYSBzbWFsbCBhbW91bnRcbiAqIG9mIGluZm9ybWF0aW9uLCBhbmQgZ2VuZXJhdGUgYSBzZXQgb2YgXCJkaXNwYXRjaCByZWFkeSBldmVudCBvYmplY3RzXCIgLSB3aGljaFxuICogYXJlIHNldHMgb2YgZXZlbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYW5ub3RhdGVkIHdpdGggYSBzZXQgb2YgZGlzcGF0Y2hlZFxuICogbGlzdGVuZXIgZnVuY3Rpb25zL2lkcy4gVGhlIEFQSSBpcyBkZXNpZ25lZCB0aGlzIHdheSB0byBkaXNjb3VyYWdlIHRoZXNlXG4gKiBwcm9wYWdhdGlvbiBzdHJhdGVnaWVzIGZyb20gYWN0dWFsbHkgZXhlY3V0aW5nIHRoZSBkaXNwYXRjaGVzLCBzaW5jZSB3ZVxuICogYWx3YXlzIHdhbnQgdG8gY29sbGVjdCB0aGUgZW50aXJlIHNldCBvZiBkaXNwYXRjaGVzIGJlZm9yZSBleGVjdXRpbmcgZXZlbnQgYVxuICogc2luZ2xlIG9uZS5cbiAqXG4gKiBAY29uc3RydWN0b3IgRXZlbnRQcm9wYWdhdG9yc1xuICovXG52YXIgRXZlbnRQcm9wYWdhdG9ycyA9IHtcbiAgYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlczogYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyxcbiAgYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NraXBUYXJnZXQ6IGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTa2lwVGFyZ2V0LFxuICBhY2N1bXVsYXRlRGlyZWN0RGlzcGF0Y2hlczogYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXMsXG4gIGFjY3VtdWxhdGVFbnRlckxlYXZlRGlzcGF0Y2hlczogYWNjdW11bGF0ZUVudGVyTGVhdmVEaXNwYXRjaGVzXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50UHJvcGFnYXRvcnM7IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBjYW5Vc2VET00gPSAhISh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuZG9jdW1lbnQgJiYgd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXG4vKipcbiAqIFNpbXBsZSwgbGlnaHR3ZWlnaHQgbW9kdWxlIGFzc2lzdGluZyB3aXRoIHRoZSBkZXRlY3Rpb24gYW5kIGNvbnRleHQgb2ZcbiAqIFdvcmtlci4gSGVscHMgYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGFuZCBhbGxvd3MgY29kZSB0byByZWFzb24gYWJvdXRcbiAqIHdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGluIGEgV29ya2VyLCBldmVuIGlmIHRoZXkgbmV2ZXIgaW5jbHVkZSB0aGUgbWFpblxuICogYFJlYWN0V29ya2VyYCBkZXBlbmRlbmN5LlxuICovXG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSB7XG5cbiAgY2FuVXNlRE9NOiBjYW5Vc2VET00sXG5cbiAgY2FuVXNlV29ya2VyczogdHlwZW9mIFdvcmtlciAhPT0gJ3VuZGVmaW5lZCcsXG5cbiAgY2FuVXNlRXZlbnRMaXN0ZW5lcnM6IGNhblVzZURPTSAmJiAhISh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciB8fCB3aW5kb3cuYXR0YWNoRXZlbnQpLFxuXG4gIGNhblVzZVZpZXdwb3J0OiBjYW5Vc2VET00gJiYgISF3aW5kb3cuc2NyZWVuLFxuXG4gIGlzSW5Xb3JrZXI6ICFjYW5Vc2VET00gLy8gRm9yIG5vdywgdGhpcyBpcyB0cnVlIC0gbWlnaHQgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRXhlY3V0aW9uRW52aXJvbm1lbnQ7IiwiLypcbm9iamVjdC1hc3NpZ25cbihjKSBTaW5kcmUgU29yaHVzXG5AbGljZW5zZSBNSVRcbiovXG5cbid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KHZhbCkge1xuXHRpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTtcblx0fVxuXG5cdHJldHVybiBPYmplY3QodmFsKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKCkge1xuXHR0cnkge1xuXHRcdGlmICghT2JqZWN0LmFzc2lnbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIERldGVjdCBidWdneSBwcm9wZXJ0eSBlbnVtZXJhdGlvbiBvcmRlciBpbiBvbGRlciBWOCB2ZXJzaW9ucy5cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQxMThcblx0XHR2YXIgdGVzdDEgPSBuZXcgU3RyaW5nKCdhYmMnKTsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3LXdyYXBwZXJzXG5cdFx0dGVzdDFbNV0gPSAnZGUnO1xuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MSlbMF0gPT09ICc1Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDIgPSB7fTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcblx0XHRcdHRlc3QyWydfJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTtcblx0XHR9XG5cdFx0dmFyIG9yZGVyMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24gKG4pIHtcblx0XHRcdHJldHVybiB0ZXN0MltuXTtcblx0XHR9KTtcblx0XHRpZiAob3JkZXIyLmpvaW4oJycpICE9PSAnMDEyMzQ1Njc4OScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QzID0ge307XG5cdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAobGV0dGVyKSB7XG5cdFx0XHR0ZXN0M1tsZXR0ZXJdID0gbGV0dGVyO1xuXHRcdH0pO1xuXHRcdGlmIChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PVxuXHRcdFx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdC8vIFdlIGRvbid0IGV4cGVjdCBhbnkgb2YgdGhlIGFib3ZlIHRvIHRocm93LCBidXQgYmV0dGVyIHRvIGJlIHNhZmUuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hvdWxkVXNlTmF0aXZlKCkgPyBPYmplY3QuYXNzaWduIDogZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG5cdHZhciBmcm9tO1xuXHR2YXIgdG8gPSB0b09iamVjdCh0YXJnZXQpO1xuXHR2YXIgc3ltYm9scztcblxuXHRmb3IgKHZhciBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKykge1xuXHRcdGZyb20gPSBPYmplY3QoYXJndW1lbnRzW3NdKTtcblxuXHRcdGZvciAodmFyIGtleSBpbiBmcm9tKSB7XG5cdFx0XHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB7XG5cdFx0XHRcdHRvW2tleV0gPSBmcm9tW2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuXHRcdFx0c3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9scyhmcm9tKTtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocHJvcElzRW51bWVyYWJsZS5jYWxsKGZyb20sIHN5bWJvbHNbaV0pKSB7XG5cdFx0XHRcdFx0dG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRvO1xufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIFN0YXRpYyBwb29sZXJzLiBTZXZlcmFsIGN1c3RvbSB2ZXJzaW9ucyBmb3IgZWFjaCBwb3RlbnRpYWwgbnVtYmVyIG9mXG4gKiBhcmd1bWVudHMuIEEgY29tcGxldGVseSBnZW5lcmljIHBvb2xlciBpcyBlYXN5IHRvIGltcGxlbWVudCwgYnV0IHdvdWxkXG4gKiByZXF1aXJlIGFjY2Vzc2luZyB0aGUgYGFyZ3VtZW50c2Agb2JqZWN0LiBJbiBlYWNoIG9mIHRoZXNlLCBgdGhpc2AgcmVmZXJzIHRvXG4gKiB0aGUgQ2xhc3MgaXRzZWxmLCBub3QgYW4gaW5zdGFuY2UuIElmIGFueSBvdGhlcnMgYXJlIG5lZWRlZCwgc2ltcGx5IGFkZCB0aGVtXG4gKiBoZXJlLCBvciBpbiB0aGVpciBvd24gZmlsZXMuXG4gKi9cbnZhciBvbmVBcmd1bWVudFBvb2xlciA9IGZ1bmN0aW9uIChjb3B5RmllbGRzRnJvbSkge1xuICB2YXIgS2xhc3MgPSB0aGlzO1xuICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCkge1xuICAgIHZhciBpbnN0YW5jZSA9IEtsYXNzLmluc3RhbmNlUG9vbC5wb3AoKTtcbiAgICBLbGFzcy5jYWxsKGluc3RhbmNlLCBjb3B5RmllbGRzRnJvbSk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgS2xhc3MoY29weUZpZWxkc0Zyb20pO1xuICB9XG59O1xuXG52YXIgdHdvQXJndW1lbnRQb29sZXIgPSBmdW5jdGlvbiAoYTEsIGEyKSB7XG4gIHZhciBLbGFzcyA9IHRoaXM7XG4gIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKSB7XG4gICAgdmFyIGluc3RhbmNlID0gS2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpO1xuICAgIEtsYXNzLmNhbGwoaW5zdGFuY2UsIGExLCBhMik7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgS2xhc3MoYTEsIGEyKTtcbiAgfVxufTtcblxudmFyIHRocmVlQXJndW1lbnRQb29sZXIgPSBmdW5jdGlvbiAoYTEsIGEyLCBhMykge1xuICB2YXIgS2xhc3MgPSB0aGlzO1xuICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCkge1xuICAgIHZhciBpbnN0YW5jZSA9IEtsYXNzLmluc3RhbmNlUG9vbC5wb3AoKTtcbiAgICBLbGFzcy5jYWxsKGluc3RhbmNlLCBhMSwgYTIsIGEzKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBLbGFzcyhhMSwgYTIsIGEzKTtcbiAgfVxufTtcblxudmFyIGZvdXJBcmd1bWVudFBvb2xlciA9IGZ1bmN0aW9uIChhMSwgYTIsIGEzLCBhNCkge1xuICB2YXIgS2xhc3MgPSB0aGlzO1xuICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCkge1xuICAgIHZhciBpbnN0YW5jZSA9IEtsYXNzLmluc3RhbmNlUG9vbC5wb3AoKTtcbiAgICBLbGFzcy5jYWxsKGluc3RhbmNlLCBhMSwgYTIsIGEzLCBhNCk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgS2xhc3MoYTEsIGEyLCBhMywgYTQpO1xuICB9XG59O1xuXG52YXIgc3RhbmRhcmRSZWxlYXNlciA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICB2YXIgS2xhc3MgPSB0aGlzO1xuICAhKGluc3RhbmNlIGluc3RhbmNlb2YgS2xhc3MpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1RyeWluZyB0byByZWxlYXNlIGFuIGluc3RhbmNlIGludG8gYSBwb29sIG9mIGEgZGlmZmVyZW50IHR5cGUuJykgOiBfcHJvZEludmFyaWFudCgnMjUnKSA6IHZvaWQgMDtcbiAgaW5zdGFuY2UuZGVzdHJ1Y3RvcigpO1xuICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCA8IEtsYXNzLnBvb2xTaXplKSB7XG4gICAgS2xhc3MuaW5zdGFuY2VQb29sLnB1c2goaW5zdGFuY2UpO1xuICB9XG59O1xuXG52YXIgREVGQVVMVF9QT09MX1NJWkUgPSAxMDtcbnZhciBERUZBVUxUX1BPT0xFUiA9IG9uZUFyZ3VtZW50UG9vbGVyO1xuXG4vKipcbiAqIEF1Z21lbnRzIGBDb3B5Q29uc3RydWN0b3JgIHRvIGJlIGEgcG9vbGFibGUgY2xhc3MsIGF1Z21lbnRpbmcgb25seSB0aGUgY2xhc3NcbiAqIGl0c2VsZiAoc3RhdGljYWxseSkgbm90IGFkZGluZyBhbnkgcHJvdG90eXBpY2FsIGZpZWxkcy4gQW55IENvcHlDb25zdHJ1Y3RvclxuICogeW91IGdpdmUgdGhpcyBtYXkgaGF2ZSBhIGBwb29sU2l6ZWAgcHJvcGVydHksIGFuZCB3aWxsIGxvb2sgZm9yIGFcbiAqIHByb3RvdHlwaWNhbCBgZGVzdHJ1Y3RvcmAgb24gaW5zdGFuY2VzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IENvcHlDb25zdHJ1Y3RvciBDb25zdHJ1Y3RvciB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlc2V0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcG9vbGVyIEN1c3RvbWl6YWJsZSBwb29sZXIuXG4gKi9cbnZhciBhZGRQb29saW5nVG8gPSBmdW5jdGlvbiAoQ29weUNvbnN0cnVjdG9yLCBwb29sZXIpIHtcbiAgLy8gQ2FzdGluZyBhcyBhbnkgc28gdGhhdCBmbG93IGlnbm9yZXMgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBhbmQgdHJ1c3RzXG4gIC8vIGl0IHRvIG1hdGNoIHRoZSB0eXBlIHdlIGRlY2xhcmVkXG4gIHZhciBOZXdLbGFzcyA9IENvcHlDb25zdHJ1Y3RvcjtcbiAgTmV3S2xhc3MuaW5zdGFuY2VQb29sID0gW107XG4gIE5ld0tsYXNzLmdldFBvb2xlZCA9IHBvb2xlciB8fCBERUZBVUxUX1BPT0xFUjtcbiAgaWYgKCFOZXdLbGFzcy5wb29sU2l6ZSkge1xuICAgIE5ld0tsYXNzLnBvb2xTaXplID0gREVGQVVMVF9QT09MX1NJWkU7XG4gIH1cbiAgTmV3S2xhc3MucmVsZWFzZSA9IHN0YW5kYXJkUmVsZWFzZXI7XG4gIHJldHVybiBOZXdLbGFzcztcbn07XG5cbnZhciBQb29sZWRDbGFzcyA9IHtcbiAgYWRkUG9vbGluZ1RvOiBhZGRQb29saW5nVG8sXG4gIG9uZUFyZ3VtZW50UG9vbGVyOiBvbmVBcmd1bWVudFBvb2xlcixcbiAgdHdvQXJndW1lbnRQb29sZXI6IHR3b0FyZ3VtZW50UG9vbGVyLFxuICB0aHJlZUFyZ3VtZW50UG9vbGVyOiB0aHJlZUFyZ3VtZW50UG9vbGVyLFxuICBmb3VyQXJndW1lbnRQb29sZXI6IGZvdXJBcmd1bWVudFBvb2xlclxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBQb29sZWRDbGFzczsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xuXG52YXIgY29udGVudEtleSA9IG51bGw7XG5cbi8qKlxuICogR2V0cyB0aGUga2V5IHVzZWQgdG8gYWNjZXNzIHRleHQgY29udGVudCBvbiBhIERPTSBub2RlLlxuICpcbiAqIEByZXR1cm4gez9zdHJpbmd9IEtleSB1c2VkIHRvIGFjY2VzcyB0ZXh0IGNvbnRlbnQuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gZ2V0VGV4dENvbnRlbnRBY2Nlc3NvcigpIHtcbiAgaWYgKCFjb250ZW50S2V5ICYmIEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkge1xuICAgIC8vIFByZWZlciB0ZXh0Q29udGVudCB0byBpbm5lclRleHQgYmVjYXVzZSBtYW55IGJyb3dzZXJzIHN1cHBvcnQgYm90aCBidXRcbiAgICAvLyBTVkcgPHRleHQ+IGVsZW1lbnRzIGRvbid0IHN1cHBvcnQgaW5uZXJUZXh0IGV2ZW4gd2hlbiA8ZGl2PiBkb2VzLlxuICAgIGNvbnRlbnRLZXkgPSAndGV4dENvbnRlbnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCA/ICd0ZXh0Q29udGVudCcgOiAnaW5uZXJUZXh0JztcbiAgfVxuICByZXR1cm4gY29udGVudEtleTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRUZXh0Q29udGVudEFjY2Vzc29yOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUG9vbGVkQ2xhc3MgPSByZXF1aXJlKCcuL1Bvb2xlZENsYXNzJyk7XG5cbnZhciBnZXRUZXh0Q29udGVudEFjY2Vzc29yID0gcmVxdWlyZSgnLi9nZXRUZXh0Q29udGVudEFjY2Vzc29yJyk7XG5cbi8qKlxuICogVGhpcyBoZWxwZXIgY2xhc3Mgc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IHRleHQgY29udGVudCBvZiBhIHRhcmdldCBub2RlLFxuICogYWxsb3dpbmcgY29tcGFyaXNvbiBvZiBjb250ZW50IGJlZm9yZSBhbmQgYWZ0ZXIgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBJZGVudGlmeSB0aGUgbm9kZSB3aGVyZSBzZWxlY3Rpb24gY3VycmVudGx5IGJlZ2lucywgdGhlbiBvYnNlcnZlXG4gKiBib3RoIGl0cyB0ZXh0IGNvbnRlbnQgYW5kIGl0cyBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBET00uIFNpbmNlIHRoZVxuICogYnJvd3NlciBtYXkgbmF0aXZlbHkgcmVwbGFjZSB0aGUgdGFyZ2V0IG5vZGUgZHVyaW5nIGNvbXBvc2l0aW9uLCB3ZSBjYW5cbiAqIHVzZSBpdHMgcG9zaXRpb24gdG8gZmluZCBpdHMgcmVwbGFjZW1lbnQuXG4gKlxuICogQHBhcmFtIHtET01FdmVudFRhcmdldH0gcm9vdFxuICovXG5mdW5jdGlvbiBGYWxsYmFja0NvbXBvc2l0aW9uU3RhdGUocm9vdCkge1xuICB0aGlzLl9yb290ID0gcm9vdDtcbiAgdGhpcy5fc3RhcnRUZXh0ID0gdGhpcy5nZXRUZXh0KCk7XG4gIHRoaXMuX2ZhbGxiYWNrVGV4dCA9IG51bGw7XG59XG5cbl9hc3NpZ24oRmFsbGJhY2tDb21wb3NpdGlvblN0YXRlLnByb3RvdHlwZSwge1xuICBkZXN0cnVjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fcm9vdCA9IG51bGw7XG4gICAgdGhpcy5fc3RhcnRUZXh0ID0gbnVsbDtcbiAgICB0aGlzLl9mYWxsYmFja1RleHQgPSBudWxsO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB0ZXh0IG9mIGlucHV0LlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXRUZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCd2YWx1ZScgaW4gdGhpcy5fcm9vdCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3Jvb3QudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yb290W2dldFRleHRDb250ZW50QWNjZXNzb3IoKV07XG4gIH0sXG5cbiAgLyoqXG4gICAqIERldGVybWluZSB0aGUgZGlmZmVyaW5nIHN1YnN0cmluZyBiZXR3ZWVuIHRoZSBpbml0aWFsbHkgc3RvcmVkXG4gICAqIHRleHQgY29udGVudCBhbmQgdGhlIGN1cnJlbnQgY29udGVudC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0RGF0YTogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9mYWxsYmFja1RleHQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9mYWxsYmFja1RleHQ7XG4gICAgfVxuXG4gICAgdmFyIHN0YXJ0O1xuICAgIHZhciBzdGFydFZhbHVlID0gdGhpcy5fc3RhcnRUZXh0O1xuICAgIHZhciBzdGFydExlbmd0aCA9IHN0YXJ0VmFsdWUubGVuZ3RoO1xuICAgIHZhciBlbmQ7XG4gICAgdmFyIGVuZFZhbHVlID0gdGhpcy5nZXRUZXh0KCk7XG4gICAgdmFyIGVuZExlbmd0aCA9IGVuZFZhbHVlLmxlbmd0aDtcblxuICAgIGZvciAoc3RhcnQgPSAwOyBzdGFydCA8IHN0YXJ0TGVuZ3RoOyBzdGFydCsrKSB7XG4gICAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydF0gIT09IGVuZFZhbHVlW3N0YXJ0XSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbWluRW5kID0gc3RhcnRMZW5ndGggLSBzdGFydDtcbiAgICBmb3IgKGVuZCA9IDE7IGVuZCA8PSBtaW5FbmQ7IGVuZCsrKSB7XG4gICAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydExlbmd0aCAtIGVuZF0gIT09IGVuZFZhbHVlW2VuZExlbmd0aCAtIGVuZF0pIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNsaWNlVGFpbCA9IGVuZCA+IDEgPyAxIC0gZW5kIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuX2ZhbGxiYWNrVGV4dCA9IGVuZFZhbHVlLnNsaWNlKHN0YXJ0LCBzbGljZVRhaWwpO1xuICAgIHJldHVybiB0aGlzLl9mYWxsYmFja1RleHQ7XG4gIH1cbn0pO1xuXG5Qb29sZWRDbGFzcy5hZGRQb29saW5nVG8oRmFsbGJhY2tDb21wb3NpdGlvblN0YXRlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGYWxsYmFja0NvbXBvc2l0aW9uU3RhdGU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBQb29sZWRDbGFzcyA9IHJlcXVpcmUoJy4vUG9vbGVkQ2xhc3MnKTtcblxudmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eUZ1bmN0aW9uJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIGRpZFdhcm5Gb3JBZGRlZE5ld1Byb3BlcnR5ID0gZmFsc2U7XG52YXIgaXNQcm94eVN1cHBvcnRlZCA9IHR5cGVvZiBQcm94eSA9PT0gJ2Z1bmN0aW9uJztcblxudmFyIHNob3VsZEJlUmVsZWFzZWRQcm9wZXJ0aWVzID0gWydkaXNwYXRjaENvbmZpZycsICdfdGFyZ2V0SW5zdCcsICduYXRpdmVFdmVudCcsICdpc0RlZmF1bHRQcmV2ZW50ZWQnLCAnaXNQcm9wYWdhdGlvblN0b3BwZWQnLCAnX2Rpc3BhdGNoTGlzdGVuZXJzJywgJ19kaXNwYXRjaEluc3RhbmNlcyddO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG52YXIgRXZlbnRJbnRlcmZhY2UgPSB7XG4gIHR5cGU6IG51bGwsXG4gIHRhcmdldDogbnVsbCxcbiAgLy8gY3VycmVudFRhcmdldCBpcyBzZXQgd2hlbiBkaXNwYXRjaGluZzsgbm8gdXNlIGluIGNvcHlpbmcgaXQgaGVyZVxuICBjdXJyZW50VGFyZ2V0OiBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zTnVsbCxcbiAgZXZlbnRQaGFzZTogbnVsbCxcbiAgYnViYmxlczogbnVsbCxcbiAgY2FuY2VsYWJsZTogbnVsbCxcbiAgdGltZVN0YW1wOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG4gIH0sXG4gIGRlZmF1bHRQcmV2ZW50ZWQ6IG51bGwsXG4gIGlzVHJ1c3RlZDogbnVsbFxufTtcblxuLyoqXG4gKiBTeW50aGV0aWMgZXZlbnRzIGFyZSBkaXNwYXRjaGVkIGJ5IGV2ZW50IHBsdWdpbnMsIHR5cGljYWxseSBpbiByZXNwb25zZSB0byBhXG4gKiB0b3AtbGV2ZWwgZXZlbnQgZGVsZWdhdGlvbiBoYW5kbGVyLlxuICpcbiAqIFRoZXNlIHN5c3RlbXMgc2hvdWxkIGdlbmVyYWxseSB1c2UgcG9vbGluZyB0byByZWR1Y2UgdGhlIGZyZXF1ZW5jeSBvZiBnYXJiYWdlXG4gKiBjb2xsZWN0aW9uLiBUaGUgc3lzdGVtIHNob3VsZCBjaGVjayBgaXNQZXJzaXN0ZW50YCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVcbiAqIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBpbnRvIHRoZSBwb29sIGFmdGVyIGJlaW5nIGRpc3BhdGNoZWQuIFVzZXJzIHRoYXRcbiAqIG5lZWQgYSBwZXJzaXN0ZWQgZXZlbnQgc2hvdWxkIGludm9rZSBgcGVyc2lzdGAuXG4gKlxuICogU3ludGhldGljIGV2ZW50cyAoYW5kIHN1YmNsYXNzZXMpIGltcGxlbWVudCB0aGUgRE9NIExldmVsIDMgRXZlbnRzIEFQSSBieVxuICogbm9ybWFsaXppbmcgYnJvd3NlciBxdWlya3MuIFN1YmNsYXNzZXMgZG8gbm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8gaW1wbGVtZW50IGFcbiAqIERPTSBpbnRlcmZhY2U7IGN1c3RvbSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBldmVudHMgY2FuIGFsc28gc3ViY2xhc3MgdGhpcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuXG4gKiBAcGFyYW0geyp9IHRhcmdldEluc3QgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcGFyYW0ge0RPTUV2ZW50VGFyZ2V0fSBuYXRpdmVFdmVudFRhcmdldCBUYXJnZXQgbm9kZS5cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljRXZlbnQoZGlzcGF0Y2hDb25maWcsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIC8vIHRoZXNlIGhhdmUgYSBnZXR0ZXIvc2V0dGVyIGZvciB3YXJuaW5nc1xuICAgIGRlbGV0ZSB0aGlzLm5hdGl2ZUV2ZW50O1xuICAgIGRlbGV0ZSB0aGlzLnByZXZlbnREZWZhdWx0O1xuICAgIGRlbGV0ZSB0aGlzLnN0b3BQcm9wYWdhdGlvbjtcbiAgfVxuXG4gIHRoaXMuZGlzcGF0Y2hDb25maWcgPSBkaXNwYXRjaENvbmZpZztcbiAgdGhpcy5fdGFyZ2V0SW5zdCA9IHRhcmdldEluc3Q7XG4gIHRoaXMubmF0aXZlRXZlbnQgPSBuYXRpdmVFdmVudDtcblxuICB2YXIgSW50ZXJmYWNlID0gdGhpcy5jb25zdHJ1Y3Rvci5JbnRlcmZhY2U7XG4gIGZvciAodmFyIHByb3BOYW1lIGluIEludGVyZmFjZSkge1xuICAgIGlmICghSW50ZXJmYWNlLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBkZWxldGUgdGhpc1twcm9wTmFtZV07IC8vIHRoaXMgaGFzIGEgZ2V0dGVyL3NldHRlciBmb3Igd2FybmluZ3NcbiAgICB9XG4gICAgdmFyIG5vcm1hbGl6ZSA9IEludGVyZmFjZVtwcm9wTmFtZV07XG4gICAgaWYgKG5vcm1hbGl6ZSkge1xuICAgICAgdGhpc1twcm9wTmFtZV0gPSBub3JtYWxpemUobmF0aXZlRXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJvcE5hbWUgPT09ICd0YXJnZXQnKSB7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzW3Byb3BOYW1lXSA9IG5hdGl2ZUV2ZW50W3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgZGVmYXVsdFByZXZlbnRlZCA9IG5hdGl2ZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgIT0gbnVsbCA/IG5hdGl2ZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgOiBuYXRpdmVFdmVudC5yZXR1cm5WYWx1ZSA9PT0gZmFsc2U7XG4gIGlmIChkZWZhdWx0UHJldmVudGVkKSB7XG4gICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zVHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNGYWxzZTtcbiAgfVxuICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc0ZhbHNlO1xuICByZXR1cm4gdGhpcztcbn1cblxuX2Fzc2lnbihTeW50aGV0aWNFdmVudC5wcm90b3R5cGUsIHtcbiAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgIHZhciBldmVudCA9IHRoaXMubmF0aXZlRXZlbnQ7XG4gICAgaWYgKCFldmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2YWxpZC10eXBlb2ZcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBldmVudC5yZXR1cm5WYWx1ZSAhPT0gJ3Vua25vd24nKSB7XG4gICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUcnVlO1xuICB9LFxuXG4gIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgIHZhciBldmVudCA9IHRoaXMubmF0aXZlRXZlbnQ7XG4gICAgaWYgKCFldmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZhbGlkLXR5cGVvZlxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LmNhbmNlbEJ1YmJsZSAhPT0gJ3Vua25vd24nKSB7XG4gICAgICAvLyBUaGUgQ2hhbmdlRXZlbnRQbHVnaW4gcmVnaXN0ZXJzIGEgXCJwcm9wZXJ0eWNoYW5nZVwiIGV2ZW50IGZvclxuICAgICAgLy8gSUUuIFRoaXMgZXZlbnQgZG9lcyBub3Qgc3VwcG9ydCBidWJibGluZyBvciBjYW5jZWxsaW5nLCBhbmRcbiAgICAgIC8vIGFueSByZWZlcmVuY2VzIHRvIGNhbmNlbEJ1YmJsZSB0aHJvdyBcIk1lbWJlciBub3QgZm91bmRcIi4gIEFcbiAgICAgIC8vIHR5cGVvZiBjaGVjayBvZiBcInVua25vd25cIiBjaXJjdW12ZW50cyB0aGlzIGlzc3VlIChhbmQgaXMgYWxzb1xuICAgICAgLy8gSUUgc3BlY2lmaWMpLlxuICAgICAgZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc1RydWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFdlIHJlbGVhc2UgYWxsIGRpc3BhdGNoZWQgYFN5bnRoZXRpY0V2ZW50YHMgYWZ0ZXIgZWFjaCBldmVudCBsb29wLCBhZGRpbmdcbiAgICogdGhlbSBiYWNrIGludG8gdGhlIHBvb2wuIFRoaXMgYWxsb3dzIGEgd2F5IHRvIGhvbGQgb250byBhIHJlZmVyZW5jZSB0aGF0XG4gICAqIHdvbid0IGJlIGFkZGVkIGJhY2sgaW50byB0aGUgcG9vbC5cbiAgICovXG4gIHBlcnNpc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmlzUGVyc2lzdGVudCA9IGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUcnVlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhpcyBldmVudCBzaG91bGQgYmUgcmVsZWFzZWQgYmFjayBpbnRvIHRoZSBwb29sLlxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoaXMgc2hvdWxkIG5vdCBiZSByZWxlYXNlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgaXNQZXJzaXN0ZW50OiBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zRmFsc2UsXG5cbiAgLyoqXG4gICAqIGBQb29sZWRDbGFzc2AgbG9va3MgZm9yIGBkZXN0cnVjdG9yYCBvbiBlYWNoIGluc3RhbmNlIGl0IHJlbGVhc2VzLlxuICAgKi9cbiAgZGVzdHJ1Y3RvcjogZnVuY3Rpb24gKCkge1xuICAgIHZhciBJbnRlcmZhY2UgPSB0aGlzLmNvbnN0cnVjdG9yLkludGVyZmFjZTtcbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBJbnRlcmZhY2UpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wTmFtZSwgZ2V0UG9vbGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbihwcm9wTmFtZSwgSW50ZXJmYWNlW3Byb3BOYW1lXSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1twcm9wTmFtZV0gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNob3VsZEJlUmVsZWFzZWRQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzW3Nob3VsZEJlUmVsZWFzZWRQcm9wZXJ0aWVzW2ldXSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ25hdGl2ZUV2ZW50JywgZ2V0UG9vbGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbignbmF0aXZlRXZlbnQnLCBudWxsKSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3ByZXZlbnREZWZhdWx0JywgZ2V0UG9vbGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbigncHJldmVudERlZmF1bHQnLCBlbXB0eUZ1bmN0aW9uKSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3N0b3BQcm9wYWdhdGlvbicsIGdldFBvb2xlZFdhcm5pbmdQcm9wZXJ0eURlZmluaXRpb24oJ3N0b3BQcm9wYWdhdGlvbicsIGVtcHR5RnVuY3Rpb24pKTtcbiAgICB9XG4gIH1cbn0pO1xuXG5TeW50aGV0aWNFdmVudC5JbnRlcmZhY2UgPSBFdmVudEludGVyZmFjZTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgaWYgKGlzUHJveHlTdXBwb3J0ZWQpIHtcbiAgICAvKmVzbGludC1kaXNhYmxlIG5vLWZ1bmMtYXNzaWduICovXG4gICAgU3ludGhldGljRXZlbnQgPSBuZXcgUHJveHkoU3ludGhldGljRXZlbnQsIHtcbiAgICAgIGNvbnN0cnVjdDogZnVuY3Rpb24gKHRhcmdldCwgYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBseSh0YXJnZXQsIE9iamVjdC5jcmVhdGUodGFyZ2V0LnByb3RvdHlwZSksIGFyZ3MpO1xuICAgICAgfSxcbiAgICAgIGFwcGx5OiBmdW5jdGlvbiAoY29uc3RydWN0b3IsIHRoYXQsIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eShjb25zdHJ1Y3Rvci5hcHBseSh0aGF0LCBhcmdzKSwge1xuICAgICAgICAgIHNldDogZnVuY3Rpb24gKHRhcmdldCwgcHJvcCwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChwcm9wICE9PSAnaXNQZXJzaXN0ZW50JyAmJiAhdGFyZ2V0LmNvbnN0cnVjdG9yLkludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJiBzaG91bGRCZVJlbGVhc2VkUHJvcGVydGllcy5pbmRleE9mKHByb3ApID09PSAtMSkge1xuICAgICAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhkaWRXYXJuRm9yQWRkZWROZXdQcm9wZXJ0eSB8fCB0YXJnZXQuaXNQZXJzaXN0ZW50KCksIFwiVGhpcyBzeW50aGV0aWMgZXZlbnQgaXMgcmV1c2VkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiBJZiB5b3UncmUgXCIgKyBcInNlZWluZyB0aGlzLCB5b3UncmUgYWRkaW5nIGEgbmV3IHByb3BlcnR5IGluIHRoZSBzeW50aGV0aWMgZXZlbnQgb2JqZWN0LiBcIiArICdUaGUgcHJvcGVydHkgaXMgbmV2ZXIgcmVsZWFzZWQuIFNlZSAnICsgJ2h0dHBzOi8vZmIubWUvcmVhY3QtZXZlbnQtcG9vbGluZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgZGlkV2FybkZvckFkZGVkTmV3UHJvcGVydHkgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8qZXNsaW50LWVuYWJsZSBuby1mdW5jLWFzc2lnbiAqL1xuICB9XG59XG4vKipcbiAqIEhlbHBlciB0byByZWR1Y2UgYm9pbGVycGxhdGUgd2hlbiBjcmVhdGluZyBzdWJjbGFzc2VzLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IENsYXNzXG4gKiBAcGFyYW0gez9vYmplY3R9IEludGVyZmFjZVxuICovXG5TeW50aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MgPSBmdW5jdGlvbiAoQ2xhc3MsIEludGVyZmFjZSkge1xuICB2YXIgU3VwZXIgPSB0aGlzO1xuXG4gIHZhciBFID0gZnVuY3Rpb24gKCkge307XG4gIEUucHJvdG90eXBlID0gU3VwZXIucHJvdG90eXBlO1xuICB2YXIgcHJvdG90eXBlID0gbmV3IEUoKTtcblxuICBfYXNzaWduKHByb3RvdHlwZSwgQ2xhc3MucHJvdG90eXBlKTtcbiAgQ2xhc3MucHJvdG90eXBlID0gcHJvdG90eXBlO1xuICBDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDbGFzcztcblxuICBDbGFzcy5JbnRlcmZhY2UgPSBfYXNzaWduKHt9LCBTdXBlci5JbnRlcmZhY2UsIEludGVyZmFjZSk7XG4gIENsYXNzLmF1Z21lbnRDbGFzcyA9IFN1cGVyLmF1Z21lbnRDbGFzcztcblxuICBQb29sZWRDbGFzcy5hZGRQb29saW5nVG8oQ2xhc3MsIFBvb2xlZENsYXNzLmZvdXJBcmd1bWVudFBvb2xlcik7XG59O1xuXG5Qb29sZWRDbGFzcy5hZGRQb29saW5nVG8oU3ludGhldGljRXZlbnQsIFBvb2xlZENsYXNzLmZvdXJBcmd1bWVudFBvb2xlcik7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljRXZlbnQ7XG5cbi8qKlxuICAqIEhlbHBlciB0byBudWxsaWZ5IHN5bnRoZXRpY0V2ZW50IGluc3RhbmNlIHByb3BlcnRpZXMgd2hlbiBkZXN0cnVjdGluZ1xuICAqXG4gICogQHBhcmFtIHtvYmplY3R9IFN5bnRoZXRpY0V2ZW50XG4gICogQHBhcmFtIHtTdHJpbmd9IHByb3BOYW1lXG4gICogQHJldHVybiB7b2JqZWN0fSBkZWZpbmVQcm9wZXJ0eSBvYmplY3RcbiAgKi9cbmZ1bmN0aW9uIGdldFBvb2xlZFdhcm5pbmdQcm9wZXJ0eURlZmluaXRpb24ocHJvcE5hbWUsIGdldFZhbCkge1xuICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiBnZXRWYWwgPT09ICdmdW5jdGlvbic7XG4gIHJldHVybiB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHNldDogc2V0LFxuICAgIGdldDogZ2V0XG4gIH07XG5cbiAgZnVuY3Rpb24gc2V0KHZhbCkge1xuICAgIHZhciBhY3Rpb24gPSBpc0Z1bmN0aW9uID8gJ3NldHRpbmcgdGhlIG1ldGhvZCcgOiAnc2V0dGluZyB0aGUgcHJvcGVydHknO1xuICAgIHdhcm4oYWN0aW9uLCAnVGhpcyBpcyBlZmZlY3RpdmVseSBhIG5vLW9wJyk7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldCgpIHtcbiAgICB2YXIgYWN0aW9uID0gaXNGdW5jdGlvbiA/ICdhY2Nlc3NpbmcgdGhlIG1ldGhvZCcgOiAnYWNjZXNzaW5nIHRoZSBwcm9wZXJ0eSc7XG4gICAgdmFyIHJlc3VsdCA9IGlzRnVuY3Rpb24gPyAnVGhpcyBpcyBhIG5vLW9wIGZ1bmN0aW9uJyA6ICdUaGlzIGlzIHNldCB0byBudWxsJztcbiAgICB3YXJuKGFjdGlvbiwgcmVzdWx0KTtcbiAgICByZXR1cm4gZ2V0VmFsO1xuICB9XG5cbiAgZnVuY3Rpb24gd2FybihhY3Rpb24sIHJlc3VsdCkge1xuICAgIHZhciB3YXJuaW5nQ29uZGl0aW9uID0gZmFsc2U7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcod2FybmluZ0NvbmRpdGlvbiwgXCJUaGlzIHN5bnRoZXRpYyBldmVudCBpcyByZXVzZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIElmIHlvdSdyZSBzZWVpbmcgdGhpcywgXCIgKyBcInlvdSdyZSAlcyBgJXNgIG9uIGEgcmVsZWFzZWQvbnVsbGlmaWVkIHN5bnRoZXRpYyBldmVudC4gJXMuIFwiICsgJ0lmIHlvdSBtdXN0IGtlZXAgdGhlIG9yaWdpbmFsIHN5bnRoZXRpYyBldmVudCBhcm91bmQsIHVzZSBldmVudC5wZXJzaXN0KCkuICcgKyAnU2VlIGh0dHBzOi8vZmIubWUvcmVhY3QtZXZlbnQtcG9vbGluZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLCBhY3Rpb24sIHByb3BOYW1lLCByZXN1bHQpIDogdm9pZCAwO1xuICB9XG59IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY0V2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNFdmVudCcpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtY29tcG9zaXRpb25ldmVudHNcbiAqL1xudmFyIENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSB7XG4gIGRhdGE6IG51bGxcbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9XG4gKi9cbmZ1bmN0aW9uIFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY0V2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljQ29tcG9zaXRpb25FdmVudCwgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljQ29tcG9zaXRpb25FdmVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3ludGhldGljRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0V2ZW50Jyk7XG5cbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDEzMTEwNVxuICogICAgICAvI2V2ZW50cy1pbnB1dGV2ZW50c1xuICovXG52YXIgSW5wdXRFdmVudEludGVyZmFjZSA9IHtcbiAgZGF0YTogbnVsbFxufTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAZXh0ZW5kcyB7U3ludGhldGljVUlFdmVudH1cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljSW5wdXRFdmVudChkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICByZXR1cm4gU3ludGhldGljRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cblN5bnRoZXRpY0V2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNJbnB1dEV2ZW50LCBJbnB1dEV2ZW50SW50ZXJmYWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNJbnB1dEV2ZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEV2ZW50UHJvcGFnYXRvcnMgPSByZXF1aXJlKCcuL0V2ZW50UHJvcGFnYXRvcnMnKTtcbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG52YXIgRmFsbGJhY2tDb21wb3NpdGlvblN0YXRlID0gcmVxdWlyZSgnLi9GYWxsYmFja0NvbXBvc2l0aW9uU3RhdGUnKTtcbnZhciBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50Jyk7XG52YXIgU3ludGhldGljSW5wdXRFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljSW5wdXRFdmVudCcpO1xuXG52YXIgRU5EX0tFWUNPREVTID0gWzksIDEzLCAyNywgMzJdOyAvLyBUYWIsIFJldHVybiwgRXNjLCBTcGFjZVxudmFyIFNUQVJUX0tFWUNPREUgPSAyMjk7XG5cbnZhciBjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NICYmICdDb21wb3NpdGlvbkV2ZW50JyBpbiB3aW5kb3c7XG5cbnZhciBkb2N1bWVudE1vZGUgPSBudWxsO1xuaWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSAmJiAnZG9jdW1lbnRNb2RlJyBpbiBkb2N1bWVudCkge1xuICBkb2N1bWVudE1vZGUgPSBkb2N1bWVudC5kb2N1bWVudE1vZGU7XG59XG5cbi8vIFdlYmtpdCBvZmZlcnMgYSB2ZXJ5IHVzZWZ1bCBgdGV4dElucHV0YCBldmVudCB0aGF0IGNhbiBiZSB1c2VkIHRvXG4vLyBkaXJlY3RseSByZXByZXNlbnQgYGJlZm9yZUlucHV0YC4gVGhlIElFIGB0ZXh0aW5wdXRgIGV2ZW50IGlzIG5vdCBhc1xuLy8gdXNlZnVsLCBzbyB3ZSBkb24ndCB1c2UgaXQuXG52YXIgY2FuVXNlVGV4dElucHV0RXZlbnQgPSBFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gJiYgJ1RleHRFdmVudCcgaW4gd2luZG93ICYmICFkb2N1bWVudE1vZGUgJiYgIWlzUHJlc3RvKCk7XG5cbi8vIEluIElFOSssIHdlIGhhdmUgYWNjZXNzIHRvIGNvbXBvc2l0aW9uIGV2ZW50cywgYnV0IHRoZSBkYXRhIHN1cHBsaWVkXG4vLyBieSB0aGUgbmF0aXZlIGNvbXBvc2l0aW9uZW5kIGV2ZW50IG1heSBiZSBpbmNvcnJlY3QuIEphcGFuZXNlIGlkZW9ncmFwaGljXG4vLyBzcGFjZXMsIGZvciBpbnN0YW5jZSAoXFx1MzAwMCkgYXJlIG5vdCByZWNvcmRlZCBjb3JyZWN0bHkuXG52YXIgdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgPSBFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gJiYgKCFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50IHx8IGRvY3VtZW50TW9kZSAmJiBkb2N1bWVudE1vZGUgPiA4ICYmIGRvY3VtZW50TW9kZSA8PSAxMSk7XG5cbi8qKlxuICogT3BlcmEgPD0gMTIgaW5jbHVkZXMgVGV4dEV2ZW50IGluIHdpbmRvdywgYnV0IGRvZXMgbm90IGZpcmVcbiAqIHRleHQgaW5wdXQgZXZlbnRzLiBSZWx5IG9uIGtleXByZXNzIGluc3RlYWQuXG4gKi9cbmZ1bmN0aW9uIGlzUHJlc3RvKCkge1xuICB2YXIgb3BlcmEgPSB3aW5kb3cub3BlcmE7XG4gIHJldHVybiB0eXBlb2Ygb3BlcmEgPT09ICdvYmplY3QnICYmIHR5cGVvZiBvcGVyYS52ZXJzaW9uID09PSAnZnVuY3Rpb24nICYmIHBhcnNlSW50KG9wZXJhLnZlcnNpb24oKSwgMTApIDw9IDEyO1xufVxuXG52YXIgU1BBQ0VCQVJfQ09ERSA9IDMyO1xudmFyIFNQQUNFQkFSX0NIQVIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFNQQUNFQkFSX0NPREUpO1xuXG4vLyBFdmVudHMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgbmFtZXMuXG52YXIgZXZlbnRUeXBlcyA9IHtcbiAgYmVmb3JlSW5wdXQ6IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogJ29uQmVmb3JlSW5wdXQnLFxuICAgICAgY2FwdHVyZWQ6ICdvbkJlZm9yZUlucHV0Q2FwdHVyZSdcbiAgICB9LFxuICAgIGRlcGVuZGVuY2llczogWyd0b3BDb21wb3NpdGlvbkVuZCcsICd0b3BLZXlQcmVzcycsICd0b3BUZXh0SW5wdXQnLCAndG9wUGFzdGUnXVxuICB9LFxuICBjb21wb3NpdGlvbkVuZDoge1xuICAgIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOiB7XG4gICAgICBidWJibGVkOiAnb25Db21wb3NpdGlvbkVuZCcsXG4gICAgICBjYXB0dXJlZDogJ29uQ29tcG9zaXRpb25FbmRDYXB0dXJlJ1xuICAgIH0sXG4gICAgZGVwZW5kZW5jaWVzOiBbJ3RvcEJsdXInLCAndG9wQ29tcG9zaXRpb25FbmQnLCAndG9wS2V5RG93bicsICd0b3BLZXlQcmVzcycsICd0b3BLZXlVcCcsICd0b3BNb3VzZURvd24nXVxuICB9LFxuICBjb21wb3NpdGlvblN0YXJ0OiB7XG4gICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHtcbiAgICAgIGJ1YmJsZWQ6ICdvbkNvbXBvc2l0aW9uU3RhcnQnLFxuICAgICAgY2FwdHVyZWQ6ICdvbkNvbXBvc2l0aW9uU3RhcnRDYXB0dXJlJ1xuICAgIH0sXG4gICAgZGVwZW5kZW5jaWVzOiBbJ3RvcEJsdXInLCAndG9wQ29tcG9zaXRpb25TdGFydCcsICd0b3BLZXlEb3duJywgJ3RvcEtleVByZXNzJywgJ3RvcEtleVVwJywgJ3RvcE1vdXNlRG93biddXG4gIH0sXG4gIGNvbXBvc2l0aW9uVXBkYXRlOiB7XG4gICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHtcbiAgICAgIGJ1YmJsZWQ6ICdvbkNvbXBvc2l0aW9uVXBkYXRlJyxcbiAgICAgIGNhcHR1cmVkOiAnb25Db21wb3NpdGlvblVwZGF0ZUNhcHR1cmUnXG4gICAgfSxcbiAgICBkZXBlbmRlbmNpZXM6IFsndG9wQmx1cicsICd0b3BDb21wb3NpdGlvblVwZGF0ZScsICd0b3BLZXlEb3duJywgJ3RvcEtleVByZXNzJywgJ3RvcEtleVVwJywgJ3RvcE1vdXNlRG93biddXG4gIH1cbn07XG5cbi8vIFRyYWNrIHdoZXRoZXIgd2UndmUgZXZlciBoYW5kbGVkIGEga2V5cHJlc3Mgb24gdGhlIHNwYWNlIGtleS5cbnZhciBoYXNTcGFjZUtleXByZXNzID0gZmFsc2U7XG5cbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgYSBuYXRpdmUga2V5cHJlc3MgZXZlbnQgaXMgYXNzdW1lZCB0byBiZSBhIGNvbW1hbmQuXG4gKiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgRmlyZWZveCBmaXJlcyBga2V5cHJlc3NgIGV2ZW50cyBmb3Iga2V5IGNvbW1hbmRzXG4gKiAoY3V0LCBjb3B5LCBzZWxlY3QtYWxsLCBldGMuKSBldmVuIHRob3VnaCBubyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiAobmF0aXZlRXZlbnQuY3RybEtleSB8fCBuYXRpdmVFdmVudC5hbHRLZXkgfHwgbmF0aXZlRXZlbnQubWV0YUtleSkgJiZcbiAgLy8gY3RybEtleSAmJiBhbHRLZXkgaXMgZXF1aXZhbGVudCB0byBBbHRHciwgYW5kIGlzIG5vdCBhIGNvbW1hbmQuXG4gICEobmF0aXZlRXZlbnQuY3RybEtleSAmJiBuYXRpdmVFdmVudC5hbHRLZXkpO1xufVxuXG4vKipcbiAqIFRyYW5zbGF0ZSBuYXRpdmUgdG9wIGxldmVsIGV2ZW50cyBpbnRvIGV2ZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b3BMZXZlbFR5cGVcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZnVuY3Rpb24gZ2V0Q29tcG9zaXRpb25FdmVudFR5cGUodG9wTGV2ZWxUeXBlKSB7XG4gIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7XG4gICAgY2FzZSAndG9wQ29tcG9zaXRpb25TdGFydCc6XG4gICAgICByZXR1cm4gZXZlbnRUeXBlcy5jb21wb3NpdGlvblN0YXJ0O1xuICAgIGNhc2UgJ3RvcENvbXBvc2l0aW9uRW5kJzpcbiAgICAgIHJldHVybiBldmVudFR5cGVzLmNvbXBvc2l0aW9uRW5kO1xuICAgIGNhc2UgJ3RvcENvbXBvc2l0aW9uVXBkYXRlJzpcbiAgICAgIHJldHVybiBldmVudFR5cGVzLmNvbXBvc2l0aW9uVXBkYXRlO1xuICB9XG59XG5cbi8qKlxuICogRG9lcyBvdXIgZmFsbGJhY2sgYmVzdC1ndWVzcyBtb2RlbCB0aGluayB0aGlzIGV2ZW50IHNpZ25pZmllcyB0aGF0XG4gKiBjb21wb3NpdGlvbiBoYXMgYmVndW4/XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRvcExldmVsVHlwZVxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25TdGFydCh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiB0b3BMZXZlbFR5cGUgPT09ICd0b3BLZXlEb3duJyAmJiBuYXRpdmVFdmVudC5rZXlDb2RlID09PSBTVEFSVF9LRVlDT0RFO1xufVxuXG4vKipcbiAqIERvZXMgb3VyIGZhbGxiYWNrIG1vZGUgdGhpbmsgdGhhdCB0aGlzIGV2ZW50IGlzIHRoZSBlbmQgb2YgY29tcG9zaXRpb24/XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRvcExldmVsVHlwZVxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKHRvcExldmVsVHlwZSkge1xuICAgIGNhc2UgJ3RvcEtleVVwJzpcbiAgICAgIC8vIENvbW1hbmQga2V5cyBpbnNlcnQgb3IgY2xlYXIgSU1FIGlucHV0LlxuICAgICAgcmV0dXJuIEVORF9LRVlDT0RFUy5pbmRleE9mKG5hdGl2ZUV2ZW50LmtleUNvZGUpICE9PSAtMTtcbiAgICBjYXNlICd0b3BLZXlEb3duJzpcbiAgICAgIC8vIEV4cGVjdCBJTUUga2V5Q29kZSBvbiBlYWNoIGtleWRvd24uIElmIHdlIGdldCBhbnkgb3RoZXJcbiAgICAgIC8vIGNvZGUgd2UgbXVzdCBoYXZlIGV4aXRlZCBlYXJsaWVyLlxuICAgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmtleUNvZGUgIT09IFNUQVJUX0tFWUNPREU7XG4gICAgY2FzZSAndG9wS2V5UHJlc3MnOlxuICAgIGNhc2UgJ3RvcE1vdXNlRG93bic6XG4gICAgY2FzZSAndG9wQmx1cic6XG4gICAgICAvLyBFdmVudHMgYXJlIG5vdCBwb3NzaWJsZSB3aXRob3V0IGNhbmNlbGxpbmcgSU1FLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEdvb2dsZSBJbnB1dCBUb29scyBwcm92aWRlcyBjb21wb3NpdGlvbiBkYXRhIHZpYSBhIEN1c3RvbUV2ZW50LFxuICogd2l0aCB0aGUgYGRhdGFgIHByb3BlcnR5IHBvcHVsYXRlZCBpbiB0aGUgYGRldGFpbGAgb2JqZWN0LiBJZiB0aGlzXG4gKiBpcyBhdmFpbGFibGUgb24gdGhlIGV2ZW50IG9iamVjdCwgdXNlIGl0LiBJZiBub3QsIHRoaXMgaXMgYSBwbGFpblxuICogY29tcG9zaXRpb24gZXZlbnQgYW5kIHdlIGhhdmUgbm90aGluZyBzcGVjaWFsIHRvIGV4dHJhY3QuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHs/c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBkZXRhaWwgPSBuYXRpdmVFdmVudC5kZXRhaWw7XG4gIGlmICh0eXBlb2YgZGV0YWlsID09PSAnb2JqZWN0JyAmJiAnZGF0YScgaW4gZGV0YWlsKSB7XG4gICAgcmV0dXJuIGRldGFpbC5kYXRhO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vLyBUcmFjayB0aGUgY3VycmVudCBJTUUgY29tcG9zaXRpb24gZmFsbGJhY2sgb2JqZWN0LCBpZiBhbnkuXG52YXIgY3VycmVudENvbXBvc2l0aW9uID0gbnVsbDtcblxuLyoqXG4gKiBAcmV0dXJuIHs/b2JqZWN0fSBBIFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RDb21wb3NpdGlvbkV2ZW50KHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHZhciBldmVudFR5cGU7XG4gIHZhciBmYWxsYmFja0RhdGE7XG5cbiAgaWYgKGNhblVzZUNvbXBvc2l0aW9uRXZlbnQpIHtcbiAgICBldmVudFR5cGUgPSBnZXRDb21wb3NpdGlvbkV2ZW50VHlwZSh0b3BMZXZlbFR5cGUpO1xuICB9IGVsc2UgaWYgKCFjdXJyZW50Q29tcG9zaXRpb24pIHtcbiAgICBpZiAoaXNGYWxsYmFja0NvbXBvc2l0aW9uU3RhcnQodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkpIHtcbiAgICAgIGV2ZW50VHlwZSA9IGV2ZW50VHlwZXMuY29tcG9zaXRpb25TdGFydDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgZXZlbnRUeXBlID0gZXZlbnRUeXBlcy5jb21wb3NpdGlvbkVuZDtcbiAgfVxuXG4gIGlmICghZXZlbnRUeXBlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEpIHtcbiAgICAvLyBUaGUgY3VycmVudCBjb21wb3NpdGlvbiBpcyBzdG9yZWQgc3RhdGljYWxseSBhbmQgbXVzdCBub3QgYmVcbiAgICAvLyBvdmVyd3JpdHRlbiB3aGlsZSBjb21wb3NpdGlvbiBjb250aW51ZXMuXG4gICAgaWYgKCFjdXJyZW50Q29tcG9zaXRpb24gJiYgZXZlbnRUeXBlID09PSBldmVudFR5cGVzLmNvbXBvc2l0aW9uU3RhcnQpIHtcbiAgICAgIGN1cnJlbnRDb21wb3NpdGlvbiA9IEZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZS5nZXRQb29sZWQobmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBldmVudFR5cGVzLmNvbXBvc2l0aW9uRW5kKSB7XG4gICAgICBpZiAoY3VycmVudENvbXBvc2l0aW9uKSB7XG4gICAgICAgIGZhbGxiYWNrRGF0YSA9IGN1cnJlbnRDb21wb3NpdGlvbi5nZXREYXRhKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGV2ZW50ID0gU3ludGhldGljQ29tcG9zaXRpb25FdmVudC5nZXRQb29sZWQoZXZlbnRUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGlmIChmYWxsYmFja0RhdGEpIHtcbiAgICAvLyBJbmplY3QgZGF0YSBnZW5lcmF0ZWQgZnJvbSBmYWxsYmFjayBwYXRoIGludG8gdGhlIHN5bnRoZXRpYyBldmVudC5cbiAgICAvLyBUaGlzIG1hdGNoZXMgdGhlIHByb3BlcnR5IG9mIG5hdGl2ZSBDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlLlxuICAgIGV2ZW50LmRhdGEgPSBmYWxsYmFja0RhdGE7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGN1c3RvbURhdGEgPSBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KTtcbiAgICBpZiAoY3VzdG9tRGF0YSAhPT0gbnVsbCkge1xuICAgICAgZXZlbnQuZGF0YSA9IGN1c3RvbURhdGE7XG4gICAgfVxuICB9XG5cbiAgRXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50KTtcbiAgcmV0dXJuIGV2ZW50O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b3BMZXZlbFR5cGUgUmVjb3JkIGZyb20gYEV2ZW50Q29uc3RhbnRzYC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGlzIGBiZWZvcmVJbnB1dGAgZXZlbnQuXG4gKi9cbmZ1bmN0aW9uIGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnModG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKHRvcExldmVsVHlwZSkge1xuICAgIGNhc2UgJ3RvcENvbXBvc2l0aW9uRW5kJzpcbiAgICAgIHJldHVybiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KTtcbiAgICBjYXNlICd0b3BLZXlQcmVzcyc6XG4gICAgICAvKipcbiAgICAgICAqIElmIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudHMgYXJlIGF2YWlsYWJsZSwgb3VyIGdvYWwgaXMgdG8gbWFrZVxuICAgICAgICogdXNlIG9mIHRoZW0uIEhvd2V2ZXIsIHRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlOiB0aGUgc3BhY2ViYXIga2V5LlxuICAgICAgICogSW4gV2Via2l0LCBwcmV2ZW50aW5nIGRlZmF1bHQgb24gYSBzcGFjZWJhciBgdGV4dElucHV0YCBldmVudFxuICAgICAgICogY2FuY2VscyBjaGFyYWN0ZXIgaW5zZXJ0aW9uLCBidXQgaXQgKmFsc28qIGNhdXNlcyB0aGUgYnJvd3NlclxuICAgICAgICogdG8gZmFsbCBiYWNrIHRvIGl0cyBkZWZhdWx0IHNwYWNlYmFyIGJlaGF2aW9yIG9mIHNjcm9sbGluZyB0aGVcbiAgICAgICAqIHBhZ2UuXG4gICAgICAgKlxuICAgICAgICogVHJhY2tpbmcgYXQ6XG4gICAgICAgKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzU1MTAzXG4gICAgICAgKlxuICAgICAgICogVG8gYXZvaWQgdGhpcyBpc3N1ZSwgdXNlIHRoZSBrZXlwcmVzcyBldmVudCBhcyBpZiBubyBgdGV4dElucHV0YFxuICAgICAgICogZXZlbnQgaXMgYXZhaWxhYmxlLlxuICAgICAgICovXG4gICAgICB2YXIgd2hpY2ggPSBuYXRpdmVFdmVudC53aGljaDtcbiAgICAgIGlmICh3aGljaCAhPT0gU1BBQ0VCQVJfQ09ERSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaGFzU3BhY2VLZXlwcmVzcyA9IHRydWU7XG4gICAgICByZXR1cm4gU1BBQ0VCQVJfQ0hBUjtcblxuICAgIGNhc2UgJ3RvcFRleHRJbnB1dCc6XG4gICAgICAvLyBSZWNvcmQgdGhlIGNoYXJhY3RlcnMgdG8gYmUgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgIHZhciBjaGFycyA9IG5hdGl2ZUV2ZW50LmRhdGE7XG5cbiAgICAgIC8vIElmIGl0J3MgYSBzcGFjZWJhciBjaGFyYWN0ZXIsIGFzc3VtZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkXG4gICAgICAvLyBpdCBhdCB0aGUga2V5cHJlc3MgbGV2ZWwgYW5kIGJhaWwgaW1tZWRpYXRlbHkuIEFuZHJvaWQgQ2hyb21lXG4gICAgICAvLyBkb2Vzbid0IGdpdmUgdXMga2V5Y29kZXMsIHNvIHdlIG5lZWQgdG8gYmxhY2tsaXN0IGl0LlxuICAgICAgaWYgKGNoYXJzID09PSBTUEFDRUJBUl9DSEFSICYmIGhhc1NwYWNlS2V5cHJlc3MpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjaGFycztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBGb3Igb3RoZXIgbmF0aXZlIGV2ZW50IHR5cGVzLCBkbyBub3RoaW5nLlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3IgYnJvd3NlcnMgdGhhdCBkbyBub3QgcHJvdmlkZSB0aGUgYHRleHRJbnB1dGAgZXZlbnQsIGV4dHJhY3QgdGhlXG4gKiBhcHByb3ByaWF0ZSBzdHJpbmcgdG8gdXNlIGZvciBTeW50aGV0aWNJbnB1dEV2ZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b3BMZXZlbFR5cGUgUmVjb3JkIGZyb20gYEV2ZW50Q29uc3RhbnRzYC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBmYWxsYmFjayBzdHJpbmcgZm9yIHRoaXMgYGJlZm9yZUlucHV0YCBldmVudC5cbiAqL1xuZnVuY3Rpb24gZ2V0RmFsbGJhY2tCZWZvcmVJbnB1dENoYXJzKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpIHtcbiAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBjb21wb3NpbmcgKElNRSkgYW5kIHVzaW5nIGEgZmFsbGJhY2sgdG8gZG8gc28sXG4gIC8vIHRyeSB0byBleHRyYWN0IHRoZSBjb21wb3NlZCBjaGFyYWN0ZXJzIGZyb20gdGhlIGZhbGxiYWNrIG9iamVjdC5cbiAgLy8gSWYgY29tcG9zaXRpb24gZXZlbnQgaXMgYXZhaWxhYmxlLCB3ZSBleHRyYWN0IGEgc3RyaW5nIG9ubHkgYXRcbiAgLy8gY29tcG9zaXRpb25ldmVudCwgb3RoZXJ3aXNlIGV4dHJhY3QgaXQgYXQgZmFsbGJhY2sgZXZlbnRzLlxuICBpZiAoY3VycmVudENvbXBvc2l0aW9uKSB7XG4gICAgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcENvbXBvc2l0aW9uRW5kJyB8fCAhY2FuVXNlQ29tcG9zaXRpb25FdmVudCAmJiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkpIHtcbiAgICAgIHZhciBjaGFycyA9IGN1cnJlbnRDb21wb3NpdGlvbi5nZXREYXRhKCk7XG4gICAgICBGYWxsYmFja0NvbXBvc2l0aW9uU3RhdGUucmVsZWFzZShjdXJyZW50Q29tcG9zaXRpb24pO1xuICAgICAgY3VycmVudENvbXBvc2l0aW9uID0gbnVsbDtcbiAgICAgIHJldHVybiBjaGFycztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzd2l0Y2ggKHRvcExldmVsVHlwZSkge1xuICAgIGNhc2UgJ3RvcFBhc3RlJzpcbiAgICAgIC8vIElmIGEgcGFzdGUgZXZlbnQgb2NjdXJzIGFmdGVyIGEga2V5cHJlc3MsIHRocm93IG91dCB0aGUgaW5wdXRcbiAgICAgIC8vIGNoYXJzLiBQYXN0ZSBldmVudHMgc2hvdWxkIG5vdCBsZWFkIHRvIEJlZm9yZUlucHV0IGV2ZW50cy5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNhc2UgJ3RvcEtleVByZXNzJzpcbiAgICAgIC8qKlxuICAgICAgICogQXMgb2YgdjI3LCBGaXJlZm94IG1heSBmaXJlIGtleXByZXNzIGV2ZW50cyBldmVuIHdoZW4gbm8gY2hhcmFjdGVyXG4gICAgICAgKiB3aWxsIGJlIGluc2VydGVkLiBBIGZldyBwb3NzaWJpbGl0aWVzOlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyBgMGAuIEFycm93IGtleXMsIEVzYyBrZXksIGV0Yy5cbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgdGhlIHByZXNzZWQga2V5IGNvZGUsIGJ1dCBubyBjaGFyIGlzIGF2YWlsYWJsZS5cbiAgICAgICAqICAgRXg6ICdBbHRHciArIGRgIGluIFBvbGlzaC4gVGhlcmUgaXMgbm8gbW9kaWZpZWQgY2hhcmFjdGVyIGZvclxuICAgICAgICogICB0aGlzIGtleSBjb21iaW5hdGlvbiBhbmQgbm8gY2hhcmFjdGVyIGlzIGluc2VydGVkIGludG8gdGhlXG4gICAgICAgKiAgIGRvY3VtZW50LCBidXQgRkYgZmlyZXMgdGhlIGtleXByZXNzIGZvciBjaGFyIGNvZGUgYDEwMGAgYW55d2F5LlxuICAgICAgICogICBObyBgaW5wdXRgIGV2ZW50IHdpbGwgb2NjdXIuXG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIHRoZSBwcmVzc2VkIGtleSBjb2RlLCBidXQgYSBjb21tYW5kIGNvbWJpbmF0aW9uIGlzXG4gICAgICAgKiAgIGJlaW5nIHVzZWQuIEV4OiBgQ21kK0NgLiBObyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQsIGFuZCBub1xuICAgICAgICogICBgaW5wdXRgIGV2ZW50IHdpbGwgb2NjdXIuXG4gICAgICAgKi9cbiAgICAgIGlmIChuYXRpdmVFdmVudC53aGljaCAmJiAhaXNLZXlwcmVzc0NvbW1hbmQobmF0aXZlRXZlbnQpKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKG5hdGl2ZUV2ZW50LndoaWNoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNhc2UgJ3RvcENvbXBvc2l0aW9uRW5kJzpcbiAgICAgIHJldHVybiB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSA/IG51bGwgOiBuYXRpdmVFdmVudC5kYXRhO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEV4dHJhY3QgYSBTeW50aGV0aWNJbnB1dEV2ZW50IGZvciBgYmVmb3JlSW5wdXRgLCBiYXNlZCBvbiBlaXRoZXIgbmF0aXZlXG4gKiBgdGV4dElucHV0YCBvciBmYWxsYmFjayBiZWhhdmlvci5cbiAqXG4gKiBAcmV0dXJuIHs/b2JqZWN0fSBBIFN5bnRoZXRpY0lucHV0RXZlbnQuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RCZWZvcmVJbnB1dEV2ZW50KHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHZhciBjaGFycztcblxuICBpZiAoY2FuVXNlVGV4dElucHV0RXZlbnQpIHtcbiAgICBjaGFycyA9IGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnModG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCk7XG4gIH0gZWxzZSB7XG4gICAgY2hhcnMgPSBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnModG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCk7XG4gIH1cblxuICAvLyBJZiBubyBjaGFyYWN0ZXJzIGFyZSBiZWluZyBpbnNlcnRlZCwgbm8gQmVmb3JlSW5wdXQgZXZlbnQgc2hvdWxkXG4gIC8vIGJlIGZpcmVkLlxuICBpZiAoIWNoYXJzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgZXZlbnQgPSBTeW50aGV0aWNJbnB1dEV2ZW50LmdldFBvb2xlZChldmVudFR5cGVzLmJlZm9yZUlucHV0LCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGV2ZW50LmRhdGEgPSBjaGFycztcbiAgRXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50KTtcbiAgcmV0dXJuIGV2ZW50O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBgb25CZWZvcmVJbnB1dGAgZXZlbnQgdG8gbWF0Y2hcbiAqIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1LyNldmVudHMtaW5wdXRldmVudHMuXG4gKlxuICogVGhpcyBldmVudCBwbHVnaW4gaXMgYmFzZWQgb24gdGhlIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudFxuICogYXZhaWxhYmxlIGluIENocm9tZSwgU2FmYXJpLCBPcGVyYSwgYW5kIElFLiBUaGlzIGV2ZW50IGZpcmVzIGFmdGVyXG4gKiBgb25LZXlQcmVzc2AgYW5kIGBvbkNvbXBvc2l0aW9uRW5kYCwgYnV0IGJlZm9yZSBgb25JbnB1dGAuXG4gKlxuICogYGJlZm9yZUlucHV0YCBpcyBzcGVjJ2QgYnV0IG5vdCBpbXBsZW1lbnRlZCBpbiBhbnkgYnJvd3NlcnMsIGFuZFxuICogdGhlIGBpbnB1dGAgZXZlbnQgZG9lcyBub3QgcHJvdmlkZSBhbnkgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgaGFzXG4gKiBhY3R1YWxseSBiZWVuIGFkZGVkLCBjb250cmFyeSB0byB0aGUgc3BlYy4gVGh1cywgYHRleHRJbnB1dGAgaXMgdGhlIGJlc3RcbiAqIGF2YWlsYWJsZSBldmVudCB0byBpZGVudGlmeSB0aGUgY2hhcmFjdGVycyB0aGF0IGhhdmUgYWN0dWFsbHkgYmVlbiBpbnNlcnRlZFxuICogaW50byB0aGUgdGFyZ2V0IG5vZGUuXG4gKlxuICogVGhpcyBwbHVnaW4gaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgZW1pdHRpbmcgYGNvbXBvc2l0aW9uYCBldmVudHMsIHRodXNcbiAqIGFsbG93aW5nIHVzIHRvIHNoYXJlIGNvbXBvc2l0aW9uIGZhbGxiYWNrIGNvZGUgZm9yIGJvdGggYGJlZm9yZUlucHV0YCBhbmRcbiAqIGBjb21wb3NpdGlvbmAgZXZlbnQgdHlwZXMuXG4gKi9cbnZhciBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luID0ge1xuICBldmVudFR5cGVzOiBldmVudFR5cGVzLFxuXG4gIGV4dHJhY3RFdmVudHM6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIHJldHVybiBbZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpLCBleHRyYWN0QmVmb3JlSW5wdXRFdmVudCh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCldO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJlZm9yZUlucHV0RXZlbnRQbHVnaW47IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgUG9vbGVkQ2xhc3MgPSByZXF1aXJlKCcuL1Bvb2xlZENsYXNzJyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHBzZXVkby1ldmVudCBtb2R1bGUgdG8gaGVscCBrZWVwIHRyYWNrIG9mIGNvbXBvbmVudHMgd2FpdGluZyB0b1xuICogYmUgbm90aWZpZWQgd2hlbiB0aGVpciBET00gcmVwcmVzZW50YXRpb25zIGFyZSBhdmFpbGFibGUgZm9yIHVzZS5cbiAqXG4gKiBUaGlzIGltcGxlbWVudHMgYFBvb2xlZENsYXNzYCwgc28geW91IHNob3VsZCBuZXZlciBuZWVkIHRvIGluc3RhbnRpYXRlIHRoaXMuXG4gKiBJbnN0ZWFkLCB1c2UgYENhbGxiYWNrUXVldWUuZ2V0UG9vbGVkKClgLlxuICpcbiAqIEBjbGFzcyBSZWFjdE1vdW50UmVhZHlcbiAqIEBpbXBsZW1lbnRzIFBvb2xlZENsYXNzXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG52YXIgQ2FsbGJhY2tRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ2FsbGJhY2tRdWV1ZShhcmcpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2FsbGJhY2tRdWV1ZSk7XG5cbiAgICB0aGlzLl9jYWxsYmFja3MgPSBudWxsO1xuICAgIHRoaXMuX2NvbnRleHRzID0gbnVsbDtcbiAgICB0aGlzLl9hcmcgPSBhcmc7XG4gIH1cblxuICAvKipcbiAgICogRW5xdWV1ZXMgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gYG5vdGlmeUFsbGAgaXMgaW52b2tlZC5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgSW52b2tlZCB3aGVuIGBub3RpZnlBbGxgIGlzIGludm9rZWQuXG4gICAqIEBwYXJhbSB7P29iamVjdH0gY29udGV4dCBDb250ZXh0IHRvIGNhbGwgYGNhbGxiYWNrYCB3aXRoLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG5cblxuICBDYWxsYmFja1F1ZXVlLnByb3RvdHlwZS5lbnF1ZXVlID0gZnVuY3Rpb24gZW5xdWV1ZShjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCBbXTtcbiAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgdGhpcy5fY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cyB8fCBbXTtcbiAgICB0aGlzLl9jb250ZXh0cy5wdXNoKGNvbnRleHQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJbnZva2VzIGFsbCBlbnF1ZXVlZCBjYWxsYmFja3MgYW5kIGNsZWFycyB0aGUgcXVldWUuIFRoaXMgaXMgaW52b2tlZCBhZnRlclxuICAgKiB0aGUgRE9NIHJlcHJlc2VudGF0aW9uIG9mIGEgY29tcG9uZW50IGhhcyBiZWVuIGNyZWF0ZWQgb3IgdXBkYXRlZC5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuXG5cbiAgQ2FsbGJhY2tRdWV1ZS5wcm90b3R5cGUubm90aWZ5QWxsID0gZnVuY3Rpb24gbm90aWZ5QWxsKCkge1xuICAgIHZhciBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3M7XG4gICAgdmFyIGNvbnRleHRzID0gdGhpcy5fY29udGV4dHM7XG4gICAgdmFyIGFyZyA9IHRoaXMuX2FyZztcbiAgICBpZiAoY2FsbGJhY2tzICYmIGNvbnRleHRzKSB7XG4gICAgICAhKGNhbGxiYWNrcy5sZW5ndGggPT09IGNvbnRleHRzLmxlbmd0aCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnTWlzbWF0Y2hlZCBsaXN0IG9mIGNvbnRleHRzIGluIGNhbGxiYWNrIHF1ZXVlJykgOiBfcHJvZEludmFyaWFudCgnMjQnKSA6IHZvaWQgMDtcbiAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IG51bGw7XG4gICAgICB0aGlzLl9jb250ZXh0cyA9IG51bGw7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjYWxsYmFja3NbaV0uY2FsbChjb250ZXh0c1tpXSwgYXJnKTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrcy5sZW5ndGggPSAwO1xuICAgICAgY29udGV4dHMubGVuZ3RoID0gMDtcbiAgICB9XG4gIH07XG5cbiAgQ2FsbGJhY2tRdWV1ZS5wcm90b3R5cGUuY2hlY2twb2ludCA9IGZ1bmN0aW9uIGNoZWNrcG9pbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxiYWNrcyA/IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggOiAwO1xuICB9O1xuXG4gIENhbGxiYWNrUXVldWUucHJvdG90eXBlLnJvbGxiYWNrID0gZnVuY3Rpb24gcm9sbGJhY2sobGVuKSB7XG4gICAgaWYgKHRoaXMuX2NhbGxiYWNrcyAmJiB0aGlzLl9jb250ZXh0cykge1xuICAgICAgdGhpcy5fY2FsbGJhY2tzLmxlbmd0aCA9IGxlbjtcbiAgICAgIHRoaXMuX2NvbnRleHRzLmxlbmd0aCA9IGxlbjtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgaW50ZXJuYWwgcXVldWUuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cblxuXG4gIENhbGxiYWNrUXVldWUucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgdGhpcy5fY2FsbGJhY2tzID0gbnVsbDtcbiAgICB0aGlzLl9jb250ZXh0cyA9IG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIGBQb29sZWRDbGFzc2AgbG9va3MgZm9yIHRoaXMuXG4gICAqL1xuXG5cbiAgQ2FsbGJhY2tRdWV1ZS5wcm90b3R5cGUuZGVzdHJ1Y3RvciA9IGZ1bmN0aW9uIGRlc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yZXNldCgpO1xuICB9O1xuXG4gIHJldHVybiBDYWxsYmFja1F1ZXVlO1xufSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvb2xlZENsYXNzLmFkZFBvb2xpbmdUbyhDYWxsYmFja1F1ZXVlKTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdEZlYXR1cmVGbGFncyA9IHtcbiAgLy8gV2hlbiB0cnVlLCBjYWxsIGNvbnNvbGUudGltZSgpIGJlZm9yZSBhbmQgLnRpbWVFbmQoKSBhZnRlciBlYWNoIHRvcC1sZXZlbFxuICAvLyByZW5kZXIgKGJvdGggaW5pdGlhbCByZW5kZXJzIGFuZCB1cGRhdGVzKS4gVXNlZnVsIHdoZW4gbG9va2luZyBhdCBwcm9kLW1vZGVcbiAgLy8gdGltZWxpbmUgcHJvZmlsZXMgaW4gQ2hyb21lLCBmb3IgZXhhbXBsZS5cbiAgbG9nVG9wTGV2ZWxSZW5kZXJzOiBmYWxzZVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEZlYXR1cmVGbGFnczsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBAcGFyYW0gez9vYmplY3R9IG9iamVjdFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgb2JqZWN0YCBpcyBhIHZhbGlkIG93bmVyLlxuICogQGZpbmFsXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRPd25lcihvYmplY3QpIHtcbiAgcmV0dXJuICEhKG9iamVjdCAmJiB0eXBlb2Ygb2JqZWN0LmF0dGFjaFJlZiA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqZWN0LmRldGFjaFJlZiA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogUmVhY3RPd25lcnMgYXJlIGNhcGFibGUgb2Ygc3RvcmluZyByZWZlcmVuY2VzIHRvIG93bmVkIGNvbXBvbmVudHMuXG4gKlxuICogQWxsIGNvbXBvbmVudHMgYXJlIGNhcGFibGUgb2YgLy9iZWluZy8vIHJlZmVyZW5jZWQgYnkgb3duZXIgY29tcG9uZW50cywgYnV0XG4gKiBvbmx5IFJlYWN0T3duZXIgY29tcG9uZW50cyBhcmUgY2FwYWJsZSBvZiAvL3JlZmVyZW5jaW5nLy8gb3duZWQgY29tcG9uZW50cy5cbiAqIFRoZSBuYW1lZCByZWZlcmVuY2UgaXMga25vd24gYXMgYSBcInJlZlwiLlxuICpcbiAqIFJlZnMgYXJlIGF2YWlsYWJsZSB3aGVuIG1vdW50ZWQgYW5kIHVwZGF0ZWQgZHVyaW5nIHJlY29uY2lsaWF0aW9uLlxuICpcbiAqICAgdmFyIE15Q29tcG9uZW50ID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICogICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7XG4gKiAgICAgICByZXR1cm4gKFxuICogICAgICAgICA8ZGl2IG9uQ2xpY2s9e3RoaXMuaGFuZGxlQ2xpY2t9PlxuICogICAgICAgICAgIDxDdXN0b21Db21wb25lbnQgcmVmPVwiY3VzdG9tXCIgLz5cbiAqICAgICAgICAgPC9kaXY+XG4gKiAgICAgICApO1xuICogICAgIH0sXG4gKiAgICAgaGFuZGxlQ2xpY2s6IGZ1bmN0aW9uKCkge1xuICogICAgICAgdGhpcy5yZWZzLmN1c3RvbS5oYW5kbGVDbGljaygpO1xuICogICAgIH0sXG4gKiAgICAgY29tcG9uZW50RGlkTW91bnQ6IGZ1bmN0aW9uKCkge1xuICogICAgICAgdGhpcy5yZWZzLmN1c3RvbS5pbml0aWFsaXplKCk7XG4gKiAgICAgfVxuICogICB9KTtcbiAqXG4gKiBSZWZzIHNob3VsZCByYXJlbHkgYmUgdXNlZC4gV2hlbiByZWZzIGFyZSB1c2VkLCB0aGV5IHNob3VsZCBvbmx5IGJlIGRvbmUgdG9cbiAqIGNvbnRyb2wgZGF0YSB0aGF0IGlzIG5vdCBoYW5kbGVkIGJ5IFJlYWN0J3MgZGF0YSBmbG93LlxuICpcbiAqIEBjbGFzcyBSZWFjdE93bmVyXG4gKi9cbnZhciBSZWFjdE93bmVyID0ge1xuICAvKipcbiAgICogQWRkcyBhIGNvbXBvbmVudCBieSByZWYgdG8gYW4gb3duZXIgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjb21wb25lbnQgQ29tcG9uZW50IHRvIHJlZmVyZW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZiBOYW1lIGJ5IHdoaWNoIHRvIHJlZmVyIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIEBwYXJhbSB7UmVhY3RPd25lcn0gb3duZXIgQ29tcG9uZW50IG9uIHdoaWNoIHRvIHJlY29yZCB0aGUgcmVmLlxuICAgKiBAZmluYWxcbiAgICogQGludGVybmFsXG4gICAqL1xuICBhZGRDb21wb25lbnRBc1JlZlRvOiBmdW5jdGlvbiAoY29tcG9uZW50LCByZWYsIG93bmVyKSB7XG4gICAgIWlzVmFsaWRPd25lcihvd25lcikgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnYWRkQ29tcG9uZW50QXNSZWZUbyguLi4pOiBPbmx5IGEgUmVhY3RPd25lciBjYW4gaGF2ZSByZWZzLiBZb3UgbWlnaHQgYmUgYWRkaW5nIGEgcmVmIHRvIGEgY29tcG9uZW50IHRoYXQgd2FzIG5vdCBjcmVhdGVkIGluc2lkZSBhIGNvbXBvbmVudFxcJ3MgYHJlbmRlcmAgbWV0aG9kLCBvciB5b3UgaGF2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgUmVhY3QgbG9hZGVkIChkZXRhaWxzOiBodHRwczovL2ZiLm1lL3JlYWN0LXJlZnMtbXVzdC1oYXZlLW93bmVyKS4nKSA6IF9wcm9kSW52YXJpYW50KCcxMTknKSA6IHZvaWQgMDtcbiAgICBvd25lci5hdHRhY2hSZWYocmVmLCBjb21wb25lbnQpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY29tcG9uZW50IGJ5IHJlZiBmcm9tIGFuIG93bmVyIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY29tcG9uZW50IENvbXBvbmVudCB0byBkZXJlZmVyZW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZiBOYW1lIG9mIHRoZSByZWYgdG8gcmVtb3ZlLlxuICAgKiBAcGFyYW0ge1JlYWN0T3duZXJ9IG93bmVyIENvbXBvbmVudCBvbiB3aGljaCB0aGUgcmVmIGlzIHJlY29yZGVkLlxuICAgKiBAZmluYWxcbiAgICogQGludGVybmFsXG4gICAqL1xuICByZW1vdmVDb21wb25lbnRBc1JlZkZyb206IGZ1bmN0aW9uIChjb21wb25lbnQsIHJlZiwgb3duZXIpIHtcbiAgICAhaXNWYWxpZE93bmVyKG93bmVyKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdyZW1vdmVDb21wb25lbnRBc1JlZkZyb20oLi4uKTogT25seSBhIFJlYWN0T3duZXIgY2FuIGhhdmUgcmVmcy4gWW91IG1pZ2h0IGJlIHJlbW92aW5nIGEgcmVmIHRvIGEgY29tcG9uZW50IHRoYXQgd2FzIG5vdCBjcmVhdGVkIGluc2lkZSBhIGNvbXBvbmVudFxcJ3MgYHJlbmRlcmAgbWV0aG9kLCBvciB5b3UgaGF2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgUmVhY3QgbG9hZGVkIChkZXRhaWxzOiBodHRwczovL2ZiLm1lL3JlYWN0LXJlZnMtbXVzdC1oYXZlLW93bmVyKS4nKSA6IF9wcm9kSW52YXJpYW50KCcxMjAnKSA6IHZvaWQgMDtcbiAgICB2YXIgb3duZXJQdWJsaWNJbnN0YW5jZSA9IG93bmVyLmdldFB1YmxpY0luc3RhbmNlKCk7XG4gICAgLy8gQ2hlY2sgdGhhdCBgY29tcG9uZW50YCdzIG93bmVyIGlzIHN0aWxsIGFsaXZlIGFuZCB0aGF0IGBjb21wb25lbnRgIGlzIHN0aWxsIHRoZSBjdXJyZW50IHJlZlxuICAgIC8vIGJlY2F1c2Ugd2UgZG8gbm90IHdhbnQgdG8gZGV0YWNoIHRoZSByZWYgaWYgYW5vdGhlciBjb21wb25lbnQgc3RvbGUgaXQuXG4gICAgaWYgKG93bmVyUHVibGljSW5zdGFuY2UgJiYgb3duZXJQdWJsaWNJbnN0YW5jZS5yZWZzW3JlZl0gPT09IGNvbXBvbmVudC5nZXRQdWJsaWNJbnN0YW5jZSgpKSB7XG4gICAgICBvd25lci5kZXRhY2hSZWYocmVmKTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RPd25lcjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdE93bmVyID0gcmVxdWlyZSgnLi9SZWFjdE93bmVyJyk7XG5cbnZhciBSZWFjdFJlZiA9IHt9O1xuXG5mdW5jdGlvbiBhdHRhY2hSZWYocmVmLCBjb21wb25lbnQsIG93bmVyKSB7XG4gIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmVmKGNvbXBvbmVudC5nZXRQdWJsaWNJbnN0YW5jZSgpKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBMZWdhY3kgcmVmXG4gICAgUmVhY3RPd25lci5hZGRDb21wb25lbnRBc1JlZlRvKGNvbXBvbmVudCwgcmVmLCBvd25lcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGV0YWNoUmVmKHJlZiwgY29tcG9uZW50LCBvd25lcikge1xuICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJlZihudWxsKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBMZWdhY3kgcmVmXG4gICAgUmVhY3RPd25lci5yZW1vdmVDb21wb25lbnRBc1JlZkZyb20oY29tcG9uZW50LCByZWYsIG93bmVyKTtcbiAgfVxufVxuXG5SZWFjdFJlZi5hdHRhY2hSZWZzID0gZnVuY3Rpb24gKGluc3RhbmNlLCBlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50ID09PSBudWxsIHx8IHR5cGVvZiBlbGVtZW50ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgcmVmID0gZWxlbWVudC5yZWY7XG4gIGlmIChyZWYgIT0gbnVsbCkge1xuICAgIGF0dGFjaFJlZihyZWYsIGluc3RhbmNlLCBlbGVtZW50Ll9vd25lcik7XG4gIH1cbn07XG5cblJlYWN0UmVmLnNob3VsZFVwZGF0ZVJlZnMgPSBmdW5jdGlvbiAocHJldkVsZW1lbnQsIG5leHRFbGVtZW50KSB7XG4gIC8vIElmIGVpdGhlciB0aGUgb3duZXIgb3IgYSBgcmVmYCBoYXMgY2hhbmdlZCwgbWFrZSBzdXJlIHRoZSBuZXdlc3Qgb3duZXJcbiAgLy8gaGFzIHN0b3JlZCBhIHJlZmVyZW5jZSB0byBgdGhpc2AsIGFuZCB0aGUgcHJldmlvdXMgb3duZXIgKGlmIGRpZmZlcmVudClcbiAgLy8gaGFzIGZvcmdvdHRlbiB0aGUgcmVmZXJlbmNlIHRvIGB0aGlzYC4gV2UgdXNlIHRoZSBlbGVtZW50IGluc3RlYWRcbiAgLy8gb2YgdGhlIHB1YmxpYyB0aGlzLnByb3BzIGJlY2F1c2UgdGhlIHBvc3QgcHJvY2Vzc2luZyBjYW5ub3QgZGV0ZXJtaW5lXG4gIC8vIGEgcmVmLiBUaGUgcmVmIGNvbmNlcHR1YWxseSBsaXZlcyBvbiB0aGUgZWxlbWVudC5cblxuICAvLyBUT0RPOiBTaG91bGQgdGhpcyBldmVuIGJlIHBvc3NpYmxlPyBUaGUgb3duZXIgY2Fubm90IGNoYW5nZSBiZWNhdXNlXG4gIC8vIGl0J3MgZm9yYmlkZGVuIGJ5IHNob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50LiBUaGUgcmVmIGNhbiBjaGFuZ2VcbiAgLy8gaWYgeW91IHN3YXAgdGhlIGtleXMgb2YgYnV0IG5vdCB0aGUgcmVmcy4gUmVjb25zaWRlciB3aGVyZSB0aGlzIGNoZWNrXG4gIC8vIGlzIG1hZGUuIEl0IHByb2JhYmx5IGJlbG9uZ3Mgd2hlcmUgdGhlIGtleSBjaGVja2luZyBhbmRcbiAgLy8gaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudCBpcyBkb25lLlxuXG4gIHZhciBwcmV2UmVmID0gbnVsbDtcbiAgdmFyIHByZXZPd25lciA9IG51bGw7XG4gIGlmIChwcmV2RWxlbWVudCAhPT0gbnVsbCAmJiB0eXBlb2YgcHJldkVsZW1lbnQgPT09ICdvYmplY3QnKSB7XG4gICAgcHJldlJlZiA9IHByZXZFbGVtZW50LnJlZjtcbiAgICBwcmV2T3duZXIgPSBwcmV2RWxlbWVudC5fb3duZXI7XG4gIH1cblxuICB2YXIgbmV4dFJlZiA9IG51bGw7XG4gIHZhciBuZXh0T3duZXIgPSBudWxsO1xuICBpZiAobmV4dEVsZW1lbnQgIT09IG51bGwgJiYgdHlwZW9mIG5leHRFbGVtZW50ID09PSAnb2JqZWN0Jykge1xuICAgIG5leHRSZWYgPSBuZXh0RWxlbWVudC5yZWY7XG4gICAgbmV4dE93bmVyID0gbmV4dEVsZW1lbnQuX293bmVyO1xuICB9XG5cbiAgcmV0dXJuIHByZXZSZWYgIT09IG5leHRSZWYgfHxcbiAgLy8gSWYgb3duZXIgY2hhbmdlcyBidXQgd2UgaGF2ZSBhbiB1bmNoYW5nZWQgZnVuY3Rpb24gcmVmLCBkb24ndCB1cGRhdGUgcmVmc1xuICB0eXBlb2YgbmV4dFJlZiA9PT0gJ3N0cmluZycgJiYgbmV4dE93bmVyICE9PSBwcmV2T3duZXI7XG59O1xuXG5SZWFjdFJlZi5kZXRhY2hSZWZzID0gZnVuY3Rpb24gKGluc3RhbmNlLCBlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50ID09PSBudWxsIHx8IHR5cGVvZiBlbGVtZW50ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgcmVmID0gZWxlbWVudC5yZWY7XG4gIGlmIChyZWYgIT0gbnVsbCkge1xuICAgIGRldGFjaFJlZihyZWYsIGluc3RhbmNlLCBlbGVtZW50Ll9vd25lcik7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RSZWY7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNi1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vLyBUcnVzdCB0aGUgZGV2ZWxvcGVyIHRvIG9ubHkgdXNlIFJlYWN0SW5zdHJ1bWVudGF0aW9uIHdpdGggYSBfX0RFVl9fIGNoZWNrXG5cbnZhciBkZWJ1Z1Rvb2wgPSBudWxsO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3REZWJ1Z1Rvb2wgPSByZXF1aXJlKCcuL1JlYWN0RGVidWdUb29sJyk7XG4gIGRlYnVnVG9vbCA9IFJlYWN0RGVidWdUb29sO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHsgZGVidWdUb29sOiBkZWJ1Z1Rvb2wgfTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RSZWYgPSByZXF1aXJlKCcuL1JlYWN0UmVmJyk7XG52YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSByZXF1aXJlKCcuL1JlYWN0SW5zdHJ1bWVudGF0aW9uJyk7XG5cbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG4vKipcbiAqIEhlbHBlciB0byBjYWxsIFJlYWN0UmVmLmF0dGFjaFJlZnMgd2l0aCB0aGlzIGNvbXBvc2l0ZSBjb21wb25lbnQsIHNwbGl0IG91dFxuICogdG8gYXZvaWQgYWxsb2NhdGlvbnMgaW4gdGhlIHRyYW5zYWN0aW9uIG1vdW50LXJlYWR5IHF1ZXVlLlxuICovXG5mdW5jdGlvbiBhdHRhY2hSZWZzKCkge1xuICBSZWFjdFJlZi5hdHRhY2hSZWZzKHRoaXMsIHRoaXMuX2N1cnJlbnRFbGVtZW50KTtcbn1cblxudmFyIFJlYWN0UmVjb25jaWxlciA9IHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQsIHJlbmRlcnMgbWFya3VwLCBhbmQgcmVnaXN0ZXJzIGV2ZW50IGxpc3RlbmVycy5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gaW50ZXJuYWxJbnN0YW5jZVxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb258UmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHs/b2JqZWN0fSB0aGUgY29udGFpbmluZyBob3N0IGNvbXBvbmVudCBpbnN0YW5jZVxuICAgKiBAcGFyYW0gez9vYmplY3R9IGluZm8gYWJvdXQgdGhlIGhvc3QgY29udGFpbmVyXG4gICAqIEByZXR1cm4gez9zdHJpbmd9IFJlbmRlcmVkIG1hcmt1cCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBET00uXG4gICAqIEBmaW5hbFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoaW50ZXJuYWxJbnN0YW5jZSwgdHJhbnNhY3Rpb24sIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCBjb250ZXh0LCBwYXJlbnREZWJ1Z0lEKSAvLyAwIGluIHByb2R1Y3Rpb24gYW5kIGZvciByb290c1xuICB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZm9yZU1vdW50Q29tcG9uZW50KGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQsIGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50LCBwYXJlbnREZWJ1Z0lEKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIG1hcmt1cCA9IGludGVybmFsSW5zdGFuY2UubW91bnRDb21wb25lbnQodHJhbnNhY3Rpb24sIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCBjb250ZXh0LCBwYXJlbnREZWJ1Z0lEKTtcbiAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQgJiYgaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQucmVmICE9IG51bGwpIHtcbiAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoYXR0YWNoUmVmcywgaW50ZXJuYWxJbnN0YW5jZSk7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCAhPT0gMCkge1xuICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Nb3VudENvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcmt1cDtcbiAgfSxcblxuICAvKipcbiAgICogUmV0dXJucyBhIHZhbHVlIHRoYXQgY2FuIGJlIHBhc3NlZCB0b1xuICAgKiBSZWFjdENvbXBvbmVudEVudmlyb25tZW50LnJlcGxhY2VOb2RlV2l0aE1hcmt1cC5cbiAgICovXG4gIGdldEhvc3ROb2RlOiBmdW5jdGlvbiAoaW50ZXJuYWxJbnN0YW5jZSkge1xuICAgIHJldHVybiBpbnRlcm5hbEluc3RhbmNlLmdldEhvc3ROb2RlKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIGFueSByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IGBtb3VudENvbXBvbmVudGAuXG4gICAqXG4gICAqIEBmaW5hbFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHVubW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChpbnRlcm5hbEluc3RhbmNlLCBzYWZlbHkpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVmb3JlVW5tb3VudENvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKTtcbiAgICAgIH1cbiAgICB9XG4gICAgUmVhY3RSZWYuZGV0YWNoUmVmcyhpbnRlcm5hbEluc3RhbmNlLCBpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxlbWVudCk7XG4gICAgaW50ZXJuYWxJbnN0YW5jZS51bm1vdW50Q29tcG9uZW50KHNhZmVseSk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblVubW91bnRDb21wb25lbnQoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYSBjb21wb25lbnQgdXNpbmcgYSBuZXcgZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gaW50ZXJuYWxJbnN0YW5jZVxuICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4dEVsZW1lbnRcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlY2VpdmVDb21wb25lbnQ6IGZ1bmN0aW9uIChpbnRlcm5hbEluc3RhbmNlLCBuZXh0RWxlbWVudCwgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHtcbiAgICB2YXIgcHJldkVsZW1lbnQgPSBpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxlbWVudDtcblxuICAgIGlmIChuZXh0RWxlbWVudCA9PT0gcHJldkVsZW1lbnQgJiYgY29udGV4dCA9PT0gaW50ZXJuYWxJbnN0YW5jZS5fY29udGV4dCkge1xuICAgICAgLy8gU2luY2UgZWxlbWVudHMgYXJlIGltbXV0YWJsZSBhZnRlciB0aGUgb3duZXIgaXMgcmVuZGVyZWQsXG4gICAgICAvLyB3ZSBjYW4gZG8gYSBjaGVhcCBpZGVudGl0eSBjb21wYXJlIGhlcmUgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYVxuICAgICAgLy8gc3VwZXJmbHVvdXMgcmVjb25jaWxlLiBJdCdzIHBvc3NpYmxlIGZvciBzdGF0ZSB0byBiZSBtdXRhYmxlIGJ1dCBzdWNoXG4gICAgICAvLyBjaGFuZ2Ugc2hvdWxkIHRyaWdnZXIgYW4gdXBkYXRlIG9mIHRoZSBvd25lciB3aGljaCB3b3VsZCByZWNyZWF0ZVxuICAgICAgLy8gdGhlIGVsZW1lbnQuIFdlIGV4cGxpY2l0bHkgY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW4gb3duZXIgc2luY2VcbiAgICAgIC8vIGl0J3MgcG9zc2libGUgZm9yIGFuIGVsZW1lbnQgY3JlYXRlZCBvdXRzaWRlIGEgY29tcG9zaXRlIHRvIGJlXG4gICAgICAvLyBkZWVwbHkgbXV0YXRlZCBhbmQgcmV1c2VkLlxuXG4gICAgICAvLyBUT0RPOiBCYWlsaW5nIG91dCBlYXJseSBpcyBqdXN0IGEgcGVyZiBvcHRpbWl6YXRpb24gcmlnaHQ/XG4gICAgICAvLyBUT0RPOiBSZW1vdmluZyB0aGUgcmV0dXJuIHN0YXRlbWVudCBzaG91bGQgYWZmZWN0IGNvcnJlY3RuZXNzP1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCAhPT0gMCkge1xuICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWZvcmVVcGRhdGVDb21wb25lbnQoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCwgbmV4dEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByZWZzQ2hhbmdlZCA9IFJlYWN0UmVmLnNob3VsZFVwZGF0ZVJlZnMocHJldkVsZW1lbnQsIG5leHRFbGVtZW50KTtcblxuICAgIGlmIChyZWZzQ2hhbmdlZCkge1xuICAgICAgUmVhY3RSZWYuZGV0YWNoUmVmcyhpbnRlcm5hbEluc3RhbmNlLCBwcmV2RWxlbWVudCk7XG4gICAgfVxuXG4gICAgaW50ZXJuYWxJbnN0YW5jZS5yZWNlaXZlQ29tcG9uZW50KG5leHRFbGVtZW50LCB0cmFuc2FjdGlvbiwgY29udGV4dCk7XG5cbiAgICBpZiAocmVmc0NoYW5nZWQgJiYgaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQgJiYgaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQucmVmICE9IG51bGwpIHtcbiAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoYXR0YWNoUmVmcywgaW50ZXJuYWxJbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblVwZGF0ZUNvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZsdXNoIGFueSBkaXJ0eSBjaGFuZ2VzIGluIGEgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBpbnRlcm5hbEluc3RhbmNlXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwZXJmb3JtVXBkYXRlSWZOZWNlc3Nhcnk6IGZ1bmN0aW9uIChpbnRlcm5hbEluc3RhbmNlLCB0cmFuc2FjdGlvbiwgdXBkYXRlQmF0Y2hOdW1iZXIpIHtcbiAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fdXBkYXRlQmF0Y2hOdW1iZXIgIT09IHVwZGF0ZUJhdGNoTnVtYmVyKSB7XG4gICAgICAvLyBUaGUgY29tcG9uZW50J3MgZW5xdWV1ZWQgYmF0Y2ggbnVtYmVyIHNob3VsZCBhbHdheXMgYmUgdGhlIGN1cnJlbnRcbiAgICAgIC8vIGJhdGNoIG9yIHRoZSBmb2xsb3dpbmcgb25lLlxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoaW50ZXJuYWxJbnN0YW5jZS5fdXBkYXRlQmF0Y2hOdW1iZXIgPT0gbnVsbCB8fCBpbnRlcm5hbEluc3RhbmNlLl91cGRhdGVCYXRjaE51bWJlciA9PT0gdXBkYXRlQmF0Y2hOdW1iZXIgKyAxLCAncGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5OiBVbmV4cGVjdGVkIGJhdGNoIG51bWJlciAoY3VycmVudCAlcywgJyArICdwZW5kaW5nICVzKScsIHVwZGF0ZUJhdGNoTnVtYmVyLCBpbnRlcm5hbEluc3RhbmNlLl91cGRhdGVCYXRjaE51bWJlcikgOiB2b2lkIDA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCAhPT0gMCkge1xuICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWZvcmVVcGRhdGVDb21wb25lbnQoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCwgaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpbnRlcm5hbEluc3RhbmNlLnBlcmZvcm1VcGRhdGVJZk5lY2Vzc2FyeSh0cmFuc2FjdGlvbik7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblVwZGF0ZUNvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RSZWNvbmNpbGVyOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG52YXIgT0JTRVJWRURfRVJST1IgPSB7fTtcblxuLyoqXG4gKiBgVHJhbnNhY3Rpb25gIGNyZWF0ZXMgYSBibGFjayBib3ggdGhhdCBpcyBhYmxlIHRvIHdyYXAgYW55IG1ldGhvZCBzdWNoIHRoYXRcbiAqIGNlcnRhaW4gaW52YXJpYW50cyBhcmUgbWFpbnRhaW5lZCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBtZXRob2QgaXMgaW52b2tlZFxuICogKEV2ZW4gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biB3aGlsZSBpbnZva2luZyB0aGUgd3JhcHBlZCBtZXRob2QpLiBXaG9ldmVyXG4gKiBpbnN0YW50aWF0ZXMgYSB0cmFuc2FjdGlvbiBjYW4gcHJvdmlkZSBlbmZvcmNlcnMgb2YgdGhlIGludmFyaWFudHMgYXRcbiAqIGNyZWF0aW9uIHRpbWUuIFRoZSBgVHJhbnNhY3Rpb25gIGNsYXNzIGl0c2VsZiB3aWxsIHN1cHBseSBvbmUgYWRkaXRpb25hbFxuICogYXV0b21hdGljIGludmFyaWFudCBmb3IgeW91IC0gdGhlIGludmFyaWFudCB0aGF0IGFueSB0cmFuc2FjdGlvbiBpbnN0YW5jZVxuICogc2hvdWxkIG5vdCBiZSBydW4gd2hpbGUgaXQgaXMgYWxyZWFkeSBiZWluZyBydW4uIFlvdSB3b3VsZCB0eXBpY2FsbHkgY3JlYXRlIGFcbiAqIHNpbmdsZSBpbnN0YW5jZSBvZiBhIGBUcmFuc2FjdGlvbmAgZm9yIHJldXNlIG11bHRpcGxlIHRpbWVzLCB0aGF0IHBvdGVudGlhbGx5XG4gKiBpcyB1c2VkIHRvIHdyYXAgc2V2ZXJhbCBkaWZmZXJlbnQgbWV0aG9kcy4gV3JhcHBlcnMgYXJlIGV4dHJlbWVseSBzaW1wbGUgLVxuICogdGhleSBvbmx5IHJlcXVpcmUgaW1wbGVtZW50aW5nIHR3byBtZXRob2RzLlxuICpcbiAqIDxwcmU+XG4gKiAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlcnMgKGluamVjdGVkIGF0IGNyZWF0aW9uIHRpbWUpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgICAgICAgK1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS0tLS0tLS0rXG4gKiAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgdiAgICAgICAgfCAgICAgICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgIHwgICAgICArLS0tLS0tLS0tLS0tLS0tKyAgIHwgICAgICAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICB8ICAgKy0tfCAgICB3cmFwcGVyMSAgIHwtLS18LS0tLSsgICAgICAgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgfCAgIHwgICstLS0tLS0tLS0tLS0tLS0rICAgdiAgICB8ICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgIHwgICB8ICAgICAgICAgICstLS0tLS0tLS0tLS0tKyAgfCAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICB8ICAgfCAgICAgKy0tLS18ICAgd3JhcHBlcjIgIHwtLS0tLS0tLSsgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgfCAgIHwgICAgIHwgICAgKy0tLS0tLS0tLS0tLS0rICB8ICAgICB8ICAgfFxuICogICAgICAgICAgICAgICAgICAgIHwgICB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCAgIHxcbiAqICAgICAgICAgICAgICAgICAgICB8ICAgdiAgICAgdiAgICAgICAgICAgICAgICAgICAgIHYgICAgIHYgICB8IHdyYXBwZXJcbiAqICAgICAgICAgICAgICAgICAgICB8ICstLS0rICstLS0rICAgKy0tLS0tLS0tLSsgICArLS0tKyArLS0tKyB8IGludmFyaWFudHNcbiAqIHBlcmZvcm0oYW55TWV0aG9kKSB8IHwgICB8IHwgICB8ICAgfCAgICAgICAgIHwgICB8ICAgfCB8ICAgfCB8IG1haW50YWluZWRcbiAqICstLS0tLS0tLS0tLS0tLS0tLT58LXwtLS18LXwtLS18LS0+fGFueU1ldGhvZHwtLS18LS0tfC18LS0tfC18LS0tLS0tLS0+XG4gKiAgICAgICAgICAgICAgICAgICAgfCB8ICAgfCB8ICAgfCAgIHwgICAgICAgICB8ICAgfCAgIHwgfCAgIHwgfFxuICogICAgICAgICAgICAgICAgICAgIHwgfCAgIHwgfCAgIHwgICB8ICAgICAgICAgfCAgIHwgICB8IHwgICB8IHxcbiAqICAgICAgICAgICAgICAgICAgICB8IHwgICB8IHwgICB8ICAgfCAgICAgICAgIHwgICB8ICAgfCB8ICAgfCB8XG4gKiAgICAgICAgICAgICAgICAgICAgfCArLS0tKyArLS0tKyAgICstLS0tLS0tLS0rICAgKy0tLSsgKy0tLSsgfFxuICogICAgICAgICAgICAgICAgICAgIHwgIGluaXRpYWxpemUgICAgICAgICAgICAgICAgICAgIGNsb3NlICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gKiA8L3ByZT5cbiAqXG4gKiBVc2UgY2FzZXM6XG4gKiAtIFByZXNlcnZpbmcgdGhlIGlucHV0IHNlbGVjdGlvbiByYW5nZXMgYmVmb3JlL2FmdGVyIHJlY29uY2lsaWF0aW9uLlxuICogICBSZXN0b3Jpbmcgc2VsZWN0aW9uIGV2ZW4gaW4gdGhlIGV2ZW50IG9mIGFuIHVuZXhwZWN0ZWQgZXJyb3IuXG4gKiAtIERlYWN0aXZhdGluZyBldmVudHMgd2hpbGUgcmVhcnJhbmdpbmcgdGhlIERPTSwgcHJldmVudGluZyBibHVycy9mb2N1c2VzLFxuICogICB3aGlsZSBndWFyYW50ZWVpbmcgdGhhdCBhZnRlcndhcmRzLCB0aGUgZXZlbnQgc3lzdGVtIGlzIHJlYWN0aXZhdGVkLlxuICogLSBGbHVzaGluZyBhIHF1ZXVlIG9mIGNvbGxlY3RlZCBET00gbXV0YXRpb25zIHRvIHRoZSBtYWluIFVJIHRocmVhZCBhZnRlciBhXG4gKiAgIHJlY29uY2lsaWF0aW9uIHRha2VzIHBsYWNlIGluIGEgd29ya2VyIHRocmVhZC5cbiAqIC0gSW52b2tpbmcgYW55IGNvbGxlY3RlZCBgY29tcG9uZW50RGlkVXBkYXRlYCBjYWxsYmFja3MgYWZ0ZXIgcmVuZGVyaW5nIG5ld1xuICogICBjb250ZW50LlxuICogLSAoRnV0dXJlIHVzZSBjYXNlKTogV3JhcHBpbmcgcGFydGljdWxhciBmbHVzaGVzIG9mIHRoZSBgUmVhY3RXb3JrZXJgIHF1ZXVlXG4gKiAgIHRvIHByZXNlcnZlIHRoZSBgc2Nyb2xsVG9wYCAoYW4gYXV0b21hdGljIHNjcm9sbCBhd2FyZSBET00pLlxuICogLSAoRnV0dXJlIHVzZSBjYXNlKTogTGF5b3V0IGNhbGN1bGF0aW9ucyBiZWZvcmUgYW5kIGFmdGVyIERPTSB1cGRhdGVzLlxuICpcbiAqIFRyYW5zYWN0aW9uYWwgcGx1Z2luIEFQSTpcbiAqIC0gQSBtb2R1bGUgdGhhdCBoYXMgYW4gYGluaXRpYWxpemVgIG1ldGhvZCB0aGF0IHJldHVybnMgYW55IHByZWNvbXB1dGF0aW9uLlxuICogLSBhbmQgYSBgY2xvc2VgIG1ldGhvZCB0aGF0IGFjY2VwdHMgdGhlIHByZWNvbXB1dGF0aW9uLiBgY2xvc2VgIGlzIGludm9rZWRcbiAqICAgd2hlbiB0aGUgd3JhcHBlZCBwcm9jZXNzIGlzIGNvbXBsZXRlZCwgb3IgaGFzIGZhaWxlZC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PFRyYW5zYWN0aW9uYWxXcmFwcGVyPn0gdHJhbnNhY3Rpb25XcmFwcGVyIFdyYXBwZXIgbW9kdWxlc1xuICogdGhhdCBpbXBsZW1lbnQgYGluaXRpYWxpemVgIGFuZCBgY2xvc2VgLlxuICogQHJldHVybiB7VHJhbnNhY3Rpb259IFNpbmdsZSB0cmFuc2FjdGlvbiBmb3IgcmV1c2UgaW4gdGhyZWFkLlxuICpcbiAqIEBjbGFzcyBUcmFuc2FjdGlvblxuICovXG52YXIgVHJhbnNhY3Rpb25JbXBsID0ge1xuICAvKipcbiAgICogU2V0cyB1cCB0aGlzIGluc3RhbmNlIHNvIHRoYXQgaXQgaXMgcHJlcGFyZWQgZm9yIGNvbGxlY3RpbmcgbWV0cmljcy4gRG9lc1xuICAgKiBzbyBzdWNoIHRoYXQgdGhpcyBzZXR1cCBtZXRob2QgbWF5IGJlIHVzZWQgb24gYW4gaW5zdGFuY2UgdGhhdCBpcyBhbHJlYWR5XG4gICAqIGluaXRpYWxpemVkLCBpbiBhIHdheSB0aGF0IGRvZXMgbm90IGNvbnN1bWUgYWRkaXRpb25hbCBtZW1vcnkgdXBvbiByZXVzZS5cbiAgICogVGhhdCBjYW4gYmUgdXNlZnVsIGlmIHlvdSBkZWNpZGUgdG8gbWFrZSB5b3VyIHN1YmNsYXNzIG9mIHRoaXMgbWl4aW4gYVxuICAgKiBcIlBvb2xlZENsYXNzXCIuXG4gICAqL1xuICByZWluaXRpYWxpemVUcmFuc2FjdGlvbjogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMudHJhbnNhY3Rpb25XcmFwcGVycyA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25XcmFwcGVycygpO1xuICAgIGlmICh0aGlzLndyYXBwZXJJbml0RGF0YSkge1xuICAgICAgdGhpcy53cmFwcGVySW5pdERhdGEubGVuZ3RoID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53cmFwcGVySW5pdERhdGEgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5faXNJblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gIH0sXG5cbiAgX2lzSW5UcmFuc2FjdGlvbjogZmFsc2UsXG5cbiAgLyoqXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcmV0dXJuIHtBcnJheTxUcmFuc2FjdGlvbldyYXBwZXI+fSBBcnJheSBvZiB0cmFuc2FjdGlvbiB3cmFwcGVycy5cbiAgICovXG4gIGdldFRyYW5zYWN0aW9uV3JhcHBlcnM6IG51bGwsXG5cbiAgaXNJblRyYW5zYWN0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5faXNJblRyYW5zYWN0aW9uO1xuICB9LFxuXG4gIC8qIGVzbGludC1kaXNhYmxlIHNwYWNlLWJlZm9yZS1mdW5jdGlvbi1wYXJlbiAqL1xuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyB0aGUgZnVuY3Rpb24gd2l0aGluIGEgc2FmZXR5IHdpbmRvdy4gVXNlIHRoaXMgZm9yIHRoZSB0b3AgbGV2ZWxcbiAgICogbWV0aG9kcyB0aGF0IHJlc3VsdCBpbiBsYXJnZSBhbW91bnRzIG9mIGNvbXB1dGF0aW9uL211dGF0aW9ucyB0aGF0IHdvdWxkXG4gICAqIG5lZWQgdG8gYmUgc2FmZXR5IGNoZWNrZWQuIFRoZSBvcHRpb25hbCBhcmd1bWVudHMgaGVscHMgcHJldmVudCB0aGUgbmVlZFxuICAgKiB0byBiaW5kIGluIG1hbnkgY2FzZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG1ldGhvZCBNZW1iZXIgb2Ygc2NvcGUgdG8gY2FsbC5cbiAgICogQHBhcmFtIHtPYmplY3R9IHNjb3BlIFNjb3BlIHRvIGludm9rZSBmcm9tLlxuICAgKiBAcGFyYW0ge09iamVjdD89fSBhIEFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAgICogQHBhcmFtIHtPYmplY3Q/PX0gYiBBcmd1bWVudCB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gICAqIEBwYXJhbSB7T2JqZWN0Pz19IGMgQXJndW1lbnQgdG8gcGFzcyB0byB0aGUgbWV0aG9kLlxuICAgKiBAcGFyYW0ge09iamVjdD89fSBkIEFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAgICogQHBhcmFtIHtPYmplY3Q/PX0gZSBBcmd1bWVudCB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gICAqIEBwYXJhbSB7T2JqZWN0Pz19IGYgQXJndW1lbnQgdG8gcGFzcyB0byB0aGUgbWV0aG9kLlxuICAgKlxuICAgKiBAcmV0dXJuIHsqfSBSZXR1cm4gdmFsdWUgZnJvbSBgbWV0aG9kYC5cbiAgICovXG4gIHBlcmZvcm06IGZ1bmN0aW9uIChtZXRob2QsIHNjb3BlLCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgLyogZXNsaW50LWVuYWJsZSBzcGFjZS1iZWZvcmUtZnVuY3Rpb24tcGFyZW4gKi9cbiAgICAhIXRoaXMuaXNJblRyYW5zYWN0aW9uKCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnVHJhbnNhY3Rpb24ucGVyZm9ybSguLi4pOiBDYW5ub3QgaW5pdGlhbGl6ZSBhIHRyYW5zYWN0aW9uIHdoZW4gdGhlcmUgaXMgYWxyZWFkeSBhbiBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbi4nKSA6IF9wcm9kSW52YXJpYW50KCcyNycpIDogdm9pZCAwO1xuICAgIHZhciBlcnJvclRocm93bjtcbiAgICB2YXIgcmV0O1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9pc0luVHJhbnNhY3Rpb24gPSB0cnVlO1xuICAgICAgLy8gQ2F0Y2hpbmcgZXJyb3JzIG1ha2VzIGRlYnVnZ2luZyBtb3JlIGRpZmZpY3VsdCwgc28gd2Ugc3RhcnQgd2l0aFxuICAgICAgLy8gZXJyb3JUaHJvd24gc2V0IHRvIHRydWUgYmVmb3JlIHNldHRpbmcgaXQgdG8gZmFsc2UgYWZ0ZXIgY2FsbGluZ1xuICAgICAgLy8gY2xvc2UgLS0gaWYgaXQncyBzdGlsbCBzZXQgdG8gdHJ1ZSBpbiB0aGUgZmluYWxseSBibG9jaywgaXQgbWVhbnNcbiAgICAgIC8vIG9uZSBvZiB0aGVzZSBjYWxscyB0aHJldy5cbiAgICAgIGVycm9yVGhyb3duID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUFsbCgwKTtcbiAgICAgIHJldCA9IG1ldGhvZC5jYWxsKHNjb3BlLCBhLCBiLCBjLCBkLCBlLCBmKTtcbiAgICAgIGVycm9yVGhyb3duID0gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChlcnJvclRocm93bikge1xuICAgICAgICAgIC8vIElmIGBtZXRob2RgIHRocm93cywgcHJlZmVyIHRvIHNob3cgdGhhdCBzdGFjayB0cmFjZSBvdmVyIGFueSB0aHJvd25cbiAgICAgICAgICAvLyBieSBpbnZva2luZyBgY2xvc2VBbGxgLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlQWxsKDApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge31cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTaW5jZSBgbWV0aG9kYCBkaWRuJ3QgdGhyb3csIHdlIGRvbid0IHdhbnQgdG8gc2lsZW5jZSB0aGUgZXhjZXB0aW9uXG4gICAgICAgICAgLy8gaGVyZS5cbiAgICAgICAgICB0aGlzLmNsb3NlQWxsKDApO1xuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLl9pc0luVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfSxcblxuICBpbml0aWFsaXplQWxsOiBmdW5jdGlvbiAoc3RhcnRJbmRleCkge1xuICAgIHZhciB0cmFuc2FjdGlvbldyYXBwZXJzID0gdGhpcy50cmFuc2FjdGlvbldyYXBwZXJzO1xuICAgIGZvciAodmFyIGkgPSBzdGFydEluZGV4OyBpIDwgdHJhbnNhY3Rpb25XcmFwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHdyYXBwZXIgPSB0cmFuc2FjdGlvbldyYXBwZXJzW2ldO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ2F0Y2hpbmcgZXJyb3JzIG1ha2VzIGRlYnVnZ2luZyBtb3JlIGRpZmZpY3VsdCwgc28gd2Ugc3RhcnQgd2l0aCB0aGVcbiAgICAgICAgLy8gT0JTRVJWRURfRVJST1Igc3RhdGUgYmVmb3JlIG92ZXJ3cml0aW5nIGl0IHdpdGggdGhlIHJlYWwgcmV0dXJuIHZhbHVlXG4gICAgICAgIC8vIG9mIGluaXRpYWxpemUgLS0gaWYgaXQncyBzdGlsbCBzZXQgdG8gT0JTRVJWRURfRVJST1IgaW4gdGhlIGZpbmFsbHlcbiAgICAgICAgLy8gYmxvY2ssIGl0IG1lYW5zIHdyYXBwZXIuaW5pdGlhbGl6ZSB0aHJldy5cbiAgICAgICAgdGhpcy53cmFwcGVySW5pdERhdGFbaV0gPSBPQlNFUlZFRF9FUlJPUjtcbiAgICAgICAgdGhpcy53cmFwcGVySW5pdERhdGFbaV0gPSB3cmFwcGVyLmluaXRpYWxpemUgPyB3cmFwcGVyLmluaXRpYWxpemUuY2FsbCh0aGlzKSA6IG51bGw7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAodGhpcy53cmFwcGVySW5pdERhdGFbaV0gPT09IE9CU0VSVkVEX0VSUk9SKSB7XG4gICAgICAgICAgLy8gVGhlIGluaXRpYWxpemVyIGZvciB3cmFwcGVyIGkgdGhyZXcgYW4gZXJyb3I7IGluaXRpYWxpemUgdGhlXG4gICAgICAgICAgLy8gcmVtYWluaW5nIHdyYXBwZXJzIGJ1dCBzaWxlbmNlIGFueSBleGNlcHRpb25zIGZyb20gdGhlbSB0byBlbnN1cmVcbiAgICAgICAgICAvLyB0aGF0IHRoZSBmaXJzdCBlcnJvciBpcyB0aGUgb25lIHRvIGJ1YmJsZSB1cC5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplQWxsKGkgKyAxKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEludm9rZXMgZWFjaCBvZiBgdGhpcy50cmFuc2FjdGlvbldyYXBwZXJzLmNsb3NlW2ldYCBmdW5jdGlvbnMsIHBhc3NpbmcgaW50b1xuICAgKiB0aGVtIHRoZSByZXNwZWN0aXZlIHJldHVybiB2YWx1ZXMgb2YgYHRoaXMudHJhbnNhY3Rpb25XcmFwcGVycy5pbml0W2ldYFxuICAgKiAoYGNsb3NlYHJzIHRoYXQgY29ycmVzcG9uZCB0byBpbml0aWFsaXplcnMgdGhhdCBmYWlsZWQgd2lsbCBub3QgYmVcbiAgICogaW52b2tlZCkuXG4gICAqL1xuICBjbG9zZUFsbDogZnVuY3Rpb24gKHN0YXJ0SW5kZXgpIHtcbiAgICAhdGhpcy5pc0luVHJhbnNhY3Rpb24oKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdUcmFuc2FjdGlvbi5jbG9zZUFsbCgpOiBDYW5ub3QgY2xvc2UgdHJhbnNhY3Rpb24gd2hlbiBub25lIGFyZSBvcGVuLicpIDogX3Byb2RJbnZhcmlhbnQoJzI4JykgOiB2b2lkIDA7XG4gICAgdmFyIHRyYW5zYWN0aW9uV3JhcHBlcnMgPSB0aGlzLnRyYW5zYWN0aW9uV3JhcHBlcnM7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0SW5kZXg7IGkgPCB0cmFuc2FjdGlvbldyYXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgd3JhcHBlciA9IHRyYW5zYWN0aW9uV3JhcHBlcnNbaV07XG4gICAgICB2YXIgaW5pdERhdGEgPSB0aGlzLndyYXBwZXJJbml0RGF0YVtpXTtcbiAgICAgIHZhciBlcnJvclRocm93bjtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIENhdGNoaW5nIGVycm9ycyBtYWtlcyBkZWJ1Z2dpbmcgbW9yZSBkaWZmaWN1bHQsIHNvIHdlIHN0YXJ0IHdpdGhcbiAgICAgICAgLy8gZXJyb3JUaHJvd24gc2V0IHRvIHRydWUgYmVmb3JlIHNldHRpbmcgaXQgdG8gZmFsc2UgYWZ0ZXIgY2FsbGluZ1xuICAgICAgICAvLyBjbG9zZSAtLSBpZiBpdCdzIHN0aWxsIHNldCB0byB0cnVlIGluIHRoZSBmaW5hbGx5IGJsb2NrLCBpdCBtZWFuc1xuICAgICAgICAvLyB3cmFwcGVyLmNsb3NlIHRocmV3LlxuICAgICAgICBlcnJvclRocm93biA9IHRydWU7XG4gICAgICAgIGlmIChpbml0RGF0YSAhPT0gT0JTRVJWRURfRVJST1IgJiYgd3JhcHBlci5jbG9zZSkge1xuICAgICAgICAgIHdyYXBwZXIuY2xvc2UuY2FsbCh0aGlzLCBpbml0RGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZXJyb3JUaHJvd24gPSBmYWxzZTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChlcnJvclRocm93bikge1xuICAgICAgICAgIC8vIFRoZSBjbG9zZXIgZm9yIHdyYXBwZXIgaSB0aHJldyBhbiBlcnJvcjsgY2xvc2UgdGhlIHJlbWFpbmluZ1xuICAgICAgICAgIC8vIHdyYXBwZXJzIGJ1dCBzaWxlbmNlIGFueSBleGNlcHRpb25zIGZyb20gdGhlbSB0byBlbnN1cmUgdGhhdCB0aGVcbiAgICAgICAgICAvLyBmaXJzdCBlcnJvciBpcyB0aGUgb25lIHRvIGJ1YmJsZSB1cC5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUFsbChpICsgMSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLndyYXBwZXJJbml0RGF0YS5sZW5ndGggPSAwO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zYWN0aW9uSW1wbDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpLFxuICAgIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBDYWxsYmFja1F1ZXVlID0gcmVxdWlyZSgnLi9DYWxsYmFja1F1ZXVlJyk7XG52YXIgUG9vbGVkQ2xhc3MgPSByZXF1aXJlKCcuL1Bvb2xlZENsYXNzJyk7XG52YXIgUmVhY3RGZWF0dXJlRmxhZ3MgPSByZXF1aXJlKCcuL1JlYWN0RmVhdHVyZUZsYWdzJyk7XG52YXIgUmVhY3RSZWNvbmNpbGVyID0gcmVxdWlyZSgnLi9SZWFjdFJlY29uY2lsZXInKTtcbnZhciBUcmFuc2FjdGlvbiA9IHJlcXVpcmUoJy4vVHJhbnNhY3Rpb24nKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG52YXIgZGlydHlDb21wb25lbnRzID0gW107XG52YXIgdXBkYXRlQmF0Y2hOdW1iZXIgPSAwO1xudmFyIGFzYXBDYWxsYmFja1F1ZXVlID0gQ2FsbGJhY2tRdWV1ZS5nZXRQb29sZWQoKTtcbnZhciBhc2FwRW5xdWV1ZWQgPSBmYWxzZTtcblxudmFyIGJhdGNoaW5nU3RyYXRlZ3kgPSBudWxsO1xuXG5mdW5jdGlvbiBlbnN1cmVJbmplY3RlZCgpIHtcbiAgIShSZWFjdFVwZGF0ZXMuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbiAmJiBiYXRjaGluZ1N0cmF0ZWd5KSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdFVwZGF0ZXM6IG11c3QgaW5qZWN0IGEgcmVjb25jaWxlIHRyYW5zYWN0aW9uIGNsYXNzIGFuZCBiYXRjaGluZyBzdHJhdGVneScpIDogX3Byb2RJbnZhcmlhbnQoJzEyMycpIDogdm9pZCAwO1xufVxuXG52YXIgTkVTVEVEX1VQREFURVMgPSB7XG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmRpcnR5Q29tcG9uZW50c0xlbmd0aCA9IGRpcnR5Q29tcG9uZW50cy5sZW5ndGg7XG4gIH0sXG4gIGNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoICE9PSBkaXJ0eUNvbXBvbmVudHMubGVuZ3RoKSB7XG4gICAgICAvLyBBZGRpdGlvbmFsIHVwZGF0ZXMgd2VyZSBlbnF1ZXVlZCBieSBjb21wb25lbnREaWRVcGRhdGUgaGFuZGxlcnMgb3JcbiAgICAgIC8vIHNpbWlsYXI7IGJlZm9yZSBvdXIgb3duIFVQREFURV9RVUVVRUlORyB3cmFwcGVyIGNsb3Nlcywgd2Ugd2FudCB0byBydW5cbiAgICAgIC8vIHRoZXNlIG5ldyB1cGRhdGVzIHNvIHRoYXQgaWYgQSdzIGNvbXBvbmVudERpZFVwZGF0ZSBjYWxscyBzZXRTdGF0ZSBvblxuICAgICAgLy8gQiwgQiB3aWxsIHVwZGF0ZSBiZWZvcmUgdGhlIGNhbGxiYWNrIEEncyB1cGRhdGVyIHByb3ZpZGVkIHdoZW4gY2FsbGluZ1xuICAgICAgLy8gc2V0U3RhdGUuXG4gICAgICBkaXJ0eUNvbXBvbmVudHMuc3BsaWNlKDAsIHRoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoKTtcbiAgICAgIGZsdXNoQmF0Y2hlZFVwZGF0ZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlydHlDb21wb25lbnRzLmxlbmd0aCA9IDA7XG4gICAgfVxuICB9XG59O1xuXG52YXIgVVBEQVRFX1FVRVVFSU5HID0ge1xuICBpbml0aWFsaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5jYWxsYmFja1F1ZXVlLnJlc2V0KCk7XG4gIH0sXG4gIGNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5jYWxsYmFja1F1ZXVlLm5vdGlmeUFsbCgpO1xuICB9XG59O1xuXG52YXIgVFJBTlNBQ1RJT05fV1JBUFBFUlMgPSBbTkVTVEVEX1VQREFURVMsIFVQREFURV9RVUVVRUlOR107XG5cbmZ1bmN0aW9uIFJlYWN0VXBkYXRlc0ZsdXNoVHJhbnNhY3Rpb24oKSB7XG4gIHRoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKTtcbiAgdGhpcy5kaXJ0eUNvbXBvbmVudHNMZW5ndGggPSBudWxsO1xuICB0aGlzLmNhbGxiYWNrUXVldWUgPSBDYWxsYmFja1F1ZXVlLmdldFBvb2xlZCgpO1xuICB0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9uID0gUmVhY3RVcGRhdGVzLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uZ2V0UG9vbGVkKFxuICAvKiB1c2VDcmVhdGVFbGVtZW50ICovdHJ1ZSk7XG59XG5cbl9hc3NpZ24oUmVhY3RVcGRhdGVzRmx1c2hUcmFuc2FjdGlvbi5wcm90b3R5cGUsIFRyYW5zYWN0aW9uLCB7XG4gIGdldFRyYW5zYWN0aW9uV3JhcHBlcnM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gVFJBTlNBQ1RJT05fV1JBUFBFUlM7XG4gIH0sXG5cbiAgZGVzdHJ1Y3RvcjogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoID0gbnVsbDtcbiAgICBDYWxsYmFja1F1ZXVlLnJlbGVhc2UodGhpcy5jYWxsYmFja1F1ZXVlKTtcbiAgICB0aGlzLmNhbGxiYWNrUXVldWUgPSBudWxsO1xuICAgIFJlYWN0VXBkYXRlcy5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uLnJlbGVhc2UodGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbik7XG4gICAgdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbiA9IG51bGw7XG4gIH0sXG5cbiAgcGVyZm9ybTogZnVuY3Rpb24gKG1ldGhvZCwgc2NvcGUsIGEpIHtcbiAgICAvLyBFc3NlbnRpYWxseSBjYWxscyBgdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbi5wZXJmb3JtKG1ldGhvZCwgc2NvcGUsIGEpYFxuICAgIC8vIHdpdGggdGhpcyB0cmFuc2FjdGlvbidzIHdyYXBwZXJzIGFyb3VuZCBpdC5cbiAgICByZXR1cm4gVHJhbnNhY3Rpb24ucGVyZm9ybS5jYWxsKHRoaXMsIHRoaXMucmVjb25jaWxlVHJhbnNhY3Rpb24ucGVyZm9ybSwgdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbiwgbWV0aG9kLCBzY29wZSwgYSk7XG4gIH1cbn0pO1xuXG5Qb29sZWRDbGFzcy5hZGRQb29saW5nVG8oUmVhY3RVcGRhdGVzRmx1c2hUcmFuc2FjdGlvbik7XG5cbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzKGNhbGxiYWNrLCBhLCBiLCBjLCBkLCBlKSB7XG4gIGVuc3VyZUluamVjdGVkKCk7XG4gIHJldHVybiBiYXRjaGluZ1N0cmF0ZWd5LmJhdGNoZWRVcGRhdGVzKGNhbGxiYWNrLCBhLCBiLCBjLCBkLCBlKTtcbn1cblxuLyoqXG4gKiBBcnJheSBjb21wYXJhdG9yIGZvciBSZWFjdENvbXBvbmVudHMgYnkgbW91bnQgb3JkZXJpbmcuXG4gKlxuICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gYzEgZmlyc3QgY29tcG9uZW50IHlvdSdyZSBjb21wYXJpbmdcbiAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGMyIHNlY29uZCBjb21wb25lbnQgeW91J3JlIGNvbXBhcmluZ1xuICogQHJldHVybiB7bnVtYmVyfSBSZXR1cm4gdmFsdWUgdXNhYmxlIGJ5IEFycmF5LnByb3RvdHlwZS5zb3J0KCkuXG4gKi9cbmZ1bmN0aW9uIG1vdW50T3JkZXJDb21wYXJhdG9yKGMxLCBjMikge1xuICByZXR1cm4gYzEuX21vdW50T3JkZXIgLSBjMi5fbW91bnRPcmRlcjtcbn1cblxuZnVuY3Rpb24gcnVuQmF0Y2hlZFVwZGF0ZXModHJhbnNhY3Rpb24pIHtcbiAgdmFyIGxlbiA9IHRyYW5zYWN0aW9uLmRpcnR5Q29tcG9uZW50c0xlbmd0aDtcbiAgIShsZW4gPT09IGRpcnR5Q29tcG9uZW50cy5sZW5ndGgpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V4cGVjdGVkIGZsdXNoIHRyYW5zYWN0aW9uXFwncyBzdG9yZWQgZGlydHktY29tcG9uZW50cyBsZW5ndGggKCVzKSB0byBtYXRjaCBkaXJ0eS1jb21wb25lbnRzIGFycmF5IGxlbmd0aCAoJXMpLicsIGxlbiwgZGlydHlDb21wb25lbnRzLmxlbmd0aCkgOiBfcHJvZEludmFyaWFudCgnMTI0JywgbGVuLCBkaXJ0eUNvbXBvbmVudHMubGVuZ3RoKSA6IHZvaWQgMDtcblxuICAvLyBTaW5jZSByZWNvbmNpbGluZyBhIGNvbXBvbmVudCBoaWdoZXIgaW4gdGhlIG93bmVyIGhpZXJhcmNoeSB1c3VhbGx5IChub3RcbiAgLy8gYWx3YXlzIC0tIHNlZSBzaG91bGRDb21wb25lbnRVcGRhdGUoKSkgd2lsbCByZWNvbmNpbGUgY2hpbGRyZW4sIHJlY29uY2lsZVxuICAvLyB0aGVtIGJlZm9yZSB0aGVpciBjaGlsZHJlbiBieSBzb3J0aW5nIHRoZSBhcnJheS5cbiAgZGlydHlDb21wb25lbnRzLnNvcnQobW91bnRPcmRlckNvbXBhcmF0b3IpO1xuXG4gIC8vIEFueSB1cGRhdGVzIGVucXVldWVkIHdoaWxlIHJlY29uY2lsaW5nIG11c3QgYmUgcGVyZm9ybWVkIGFmdGVyIHRoaXMgZW50aXJlXG4gIC8vIGJhdGNoLiBPdGhlcndpc2UsIGlmIGRpcnR5Q29tcG9uZW50cyBpcyBbQSwgQl0gd2hlcmUgQSBoYXMgY2hpbGRyZW4gQiBhbmRcbiAgLy8gQywgQiBjb3VsZCB1cGRhdGUgdHdpY2UgaW4gYSBzaW5nbGUgYmF0Y2ggaWYgQydzIHJlbmRlciBlbnF1ZXVlcyBhbiB1cGRhdGVcbiAgLy8gdG8gQiAoc2luY2UgQiB3b3VsZCBoYXZlIGFscmVhZHkgdXBkYXRlZCwgd2Ugc2hvdWxkIHNraXAgaXQsIGFuZCB0aGUgb25seVxuICAvLyB3YXkgd2UgY2FuIGtub3cgdG8gZG8gc28gaXMgYnkgY2hlY2tpbmcgdGhlIGJhdGNoIGNvdW50ZXIpLlxuICB1cGRhdGVCYXRjaE51bWJlcisrO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAvLyBJZiBhIGNvbXBvbmVudCBpcyB1bm1vdW50ZWQgYmVmb3JlIHBlbmRpbmcgY2hhbmdlcyBhcHBseSwgaXQgd2lsbCBzdGlsbFxuICAgIC8vIGJlIGhlcmUsIGJ1dCB3ZSBhc3N1bWUgdGhhdCBpdCBoYXMgY2xlYXJlZCBpdHMgX3BlbmRpbmdDYWxsYmFja3MgYW5kXG4gICAgLy8gdGhhdCBwZXJmb3JtVXBkYXRlSWZOZWNlc3NhcnkgaXMgYSBub29wLlxuICAgIHZhciBjb21wb25lbnQgPSBkaXJ0eUNvbXBvbmVudHNbaV07XG5cbiAgICAvLyBJZiBwZXJmb3JtVXBkYXRlSWZOZWNlc3NhcnkgaGFwcGVucyB0byBlbnF1ZXVlIGFueSBuZXcgdXBkYXRlcywgd2VcbiAgICAvLyBzaG91bGRuJ3QgZXhlY3V0ZSB0aGUgY2FsbGJhY2tzIHVudGlsIHRoZSBuZXh0IHJlbmRlciBoYXBwZW5zLCBzb1xuICAgIC8vIHN0YXNoIHRoZSBjYWxsYmFja3MgZmlyc3RcbiAgICB2YXIgY2FsbGJhY2tzID0gY29tcG9uZW50Ll9wZW5kaW5nQ2FsbGJhY2tzO1xuICAgIGNvbXBvbmVudC5fcGVuZGluZ0NhbGxiYWNrcyA9IG51bGw7XG5cbiAgICB2YXIgbWFya2VyTmFtZTtcbiAgICBpZiAoUmVhY3RGZWF0dXJlRmxhZ3MubG9nVG9wTGV2ZWxSZW5kZXJzKSB7XG4gICAgICB2YXIgbmFtZWRDb21wb25lbnQgPSBjb21wb25lbnQ7XG4gICAgICAvLyBEdWNrIHR5cGUgVG9wTGV2ZWxXcmFwcGVyLiBUaGlzIGlzIHByb2JhYmx5IGFsd2F5cyB0cnVlLlxuICAgICAgaWYgKGNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQudHlwZS5pc1JlYWN0VG9wTGV2ZWxXcmFwcGVyKSB7XG4gICAgICAgIG5hbWVkQ29tcG9uZW50ID0gY29tcG9uZW50Ll9yZW5kZXJlZENvbXBvbmVudDtcbiAgICAgIH1cbiAgICAgIG1hcmtlck5hbWUgPSAnUmVhY3QgdXBkYXRlOiAnICsgbmFtZWRDb21wb25lbnQuZ2V0TmFtZSgpO1xuICAgICAgY29uc29sZS50aW1lKG1hcmtlck5hbWUpO1xuICAgIH1cblxuICAgIFJlYWN0UmVjb25jaWxlci5wZXJmb3JtVXBkYXRlSWZOZWNlc3NhcnkoY29tcG9uZW50LCB0cmFuc2FjdGlvbi5yZWNvbmNpbGVUcmFuc2FjdGlvbiwgdXBkYXRlQmF0Y2hOdW1iZXIpO1xuXG4gICAgaWYgKG1hcmtlck5hbWUpIHtcbiAgICAgIGNvbnNvbGUudGltZUVuZChtYXJrZXJOYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNhbGxiYWNrcy5sZW5ndGg7IGorKykge1xuICAgICAgICB0cmFuc2FjdGlvbi5jYWxsYmFja1F1ZXVlLmVucXVldWUoY2FsbGJhY2tzW2pdLCBjb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBmbHVzaEJhdGNoZWRVcGRhdGVzID0gZnVuY3Rpb24gKCkge1xuICAvLyBSZWFjdFVwZGF0ZXNGbHVzaFRyYW5zYWN0aW9uJ3Mgd3JhcHBlcnMgd2lsbCBjbGVhciB0aGUgZGlydHlDb21wb25lbnRzXG4gIC8vIGFycmF5IGFuZCBwZXJmb3JtIGFueSB1cGRhdGVzIGVucXVldWVkIGJ5IG1vdW50LXJlYWR5IGhhbmRsZXJzIChpLmUuLFxuICAvLyBjb21wb25lbnREaWRVcGRhdGUpIGJ1dCB3ZSBuZWVkIHRvIGNoZWNrIGhlcmUgdG9vIGluIG9yZGVyIHRvIGNhdGNoXG4gIC8vIHVwZGF0ZXMgZW5xdWV1ZWQgYnkgc2V0U3RhdGUgY2FsbGJhY2tzIGFuZCBhc2FwIGNhbGxzLlxuICB3aGlsZSAoZGlydHlDb21wb25lbnRzLmxlbmd0aCB8fCBhc2FwRW5xdWV1ZWQpIHtcbiAgICBpZiAoZGlydHlDb21wb25lbnRzLmxlbmd0aCkge1xuICAgICAgdmFyIHRyYW5zYWN0aW9uID0gUmVhY3RVcGRhdGVzRmx1c2hUcmFuc2FjdGlvbi5nZXRQb29sZWQoKTtcbiAgICAgIHRyYW5zYWN0aW9uLnBlcmZvcm0ocnVuQmF0Y2hlZFVwZGF0ZXMsIG51bGwsIHRyYW5zYWN0aW9uKTtcbiAgICAgIFJlYWN0VXBkYXRlc0ZsdXNoVHJhbnNhY3Rpb24ucmVsZWFzZSh0cmFuc2FjdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKGFzYXBFbnF1ZXVlZCkge1xuICAgICAgYXNhcEVucXVldWVkID0gZmFsc2U7XG4gICAgICB2YXIgcXVldWUgPSBhc2FwQ2FsbGJhY2tRdWV1ZTtcbiAgICAgIGFzYXBDYWxsYmFja1F1ZXVlID0gQ2FsbGJhY2tRdWV1ZS5nZXRQb29sZWQoKTtcbiAgICAgIHF1ZXVlLm5vdGlmeUFsbCgpO1xuICAgICAgQ2FsbGJhY2tRdWV1ZS5yZWxlYXNlKHF1ZXVlKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogTWFyayBhIGNvbXBvbmVudCBhcyBuZWVkaW5nIGEgcmVyZW5kZXIsIGFkZGluZyBhbiBvcHRpb25hbCBjYWxsYmFjayB0byBhXG4gKiBsaXN0IG9mIGZ1bmN0aW9ucyB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIG9uY2UgdGhlIHJlcmVuZGVyIG9jY3Vycy5cbiAqL1xuZnVuY3Rpb24gZW5xdWV1ZVVwZGF0ZShjb21wb25lbnQpIHtcbiAgZW5zdXJlSW5qZWN0ZWQoKTtcblxuICAvLyBWYXJpb3VzIHBhcnRzIG9mIG91ciBjb2RlIChzdWNoIGFzIFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50J3NcbiAgLy8gX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudCkgYXNzdW1lIHRoYXQgY2FsbHMgdG8gcmVuZGVyIGFyZW4ndCBuZXN0ZWQ7XG4gIC8vIHZlcmlmeSB0aGF0IHRoYXQncyB0aGUgY2FzZS4gKFRoaXMgaXMgY2FsbGVkIGJ5IGVhY2ggdG9wLWxldmVsIHVwZGF0ZVxuICAvLyBmdW5jdGlvbiwgbGlrZSBzZXRTdGF0ZSwgZm9yY2VVcGRhdGUsIGV0Yy47IGNyZWF0aW9uIGFuZFxuICAvLyBkZXN0cnVjdGlvbiBvZiB0b3AtbGV2ZWwgY29tcG9uZW50cyBpcyBndWFyZGVkIGluIFJlYWN0TW91bnQuKVxuXG4gIGlmICghYmF0Y2hpbmdTdHJhdGVneS5pc0JhdGNoaW5nVXBkYXRlcykge1xuICAgIGJhdGNoaW5nU3RyYXRlZ3kuYmF0Y2hlZFVwZGF0ZXMoZW5xdWV1ZVVwZGF0ZSwgY29tcG9uZW50KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBkaXJ0eUNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICBpZiAoY29tcG9uZW50Ll91cGRhdGVCYXRjaE51bWJlciA9PSBudWxsKSB7XG4gICAgY29tcG9uZW50Ll91cGRhdGVCYXRjaE51bWJlciA9IHVwZGF0ZUJhdGNoTnVtYmVyICsgMTtcbiAgfVxufVxuXG4vKipcbiAqIEVucXVldWUgYSBjYWxsYmFjayB0byBiZSBydW4gYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBiYXRjaGluZyBjeWNsZS4gVGhyb3dzXG4gKiBpZiBubyB1cGRhdGVzIGFyZSBjdXJyZW50bHkgYmVpbmcgcGVyZm9ybWVkLlxuICovXG5mdW5jdGlvbiBhc2FwKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICFiYXRjaGluZ1N0cmF0ZWd5LmlzQmF0Y2hpbmdVcGRhdGVzID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0VXBkYXRlcy5hc2FwOiBDYW5cXCd0IGVucXVldWUgYW4gYXNhcCBjYWxsYmFjayBpbiBhIGNvbnRleHQgd2hlcmV1cGRhdGVzIGFyZSBub3QgYmVpbmcgYmF0Y2hlZC4nKSA6IF9wcm9kSW52YXJpYW50KCcxMjUnKSA6IHZvaWQgMDtcbiAgYXNhcENhbGxiYWNrUXVldWUuZW5xdWV1ZShjYWxsYmFjaywgY29udGV4dCk7XG4gIGFzYXBFbnF1ZXVlZCA9IHRydWU7XG59XG5cbnZhciBSZWFjdFVwZGF0ZXNJbmplY3Rpb24gPSB7XG4gIGluamVjdFJlY29uY2lsZVRyYW5zYWN0aW9uOiBmdW5jdGlvbiAoUmVjb25jaWxlVHJhbnNhY3Rpb24pIHtcbiAgICAhUmVjb25jaWxlVHJhbnNhY3Rpb24gPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RVcGRhdGVzOiBtdXN0IHByb3ZpZGUgYSByZWNvbmNpbGUgdHJhbnNhY3Rpb24gY2xhc3MnKSA6IF9wcm9kSW52YXJpYW50KCcxMjYnKSA6IHZvaWQgMDtcbiAgICBSZWFjdFVwZGF0ZXMuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbiA9IFJlY29uY2lsZVRyYW5zYWN0aW9uO1xuICB9LFxuXG4gIGluamVjdEJhdGNoaW5nU3RyYXRlZ3k6IGZ1bmN0aW9uIChfYmF0Y2hpbmdTdHJhdGVneSkge1xuICAgICFfYmF0Y2hpbmdTdHJhdGVneSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdFVwZGF0ZXM6IG11c3QgcHJvdmlkZSBhIGJhdGNoaW5nIHN0cmF0ZWd5JykgOiBfcHJvZEludmFyaWFudCgnMTI3JykgOiB2b2lkIDA7XG4gICAgISh0eXBlb2YgX2JhdGNoaW5nU3RyYXRlZ3kuYmF0Y2hlZFVwZGF0ZXMgPT09ICdmdW5jdGlvbicpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0VXBkYXRlczogbXVzdCBwcm92aWRlIGEgYmF0Y2hlZFVwZGF0ZXMoKSBmdW5jdGlvbicpIDogX3Byb2RJbnZhcmlhbnQoJzEyOCcpIDogdm9pZCAwO1xuICAgICEodHlwZW9mIF9iYXRjaGluZ1N0cmF0ZWd5LmlzQmF0Y2hpbmdVcGRhdGVzID09PSAnYm9vbGVhbicpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0VXBkYXRlczogbXVzdCBwcm92aWRlIGFuIGlzQmF0Y2hpbmdVcGRhdGVzIGJvb2xlYW4gYXR0cmlidXRlJykgOiBfcHJvZEludmFyaWFudCgnMTI5JykgOiB2b2lkIDA7XG4gICAgYmF0Y2hpbmdTdHJhdGVneSA9IF9iYXRjaGluZ1N0cmF0ZWd5O1xuICB9XG59O1xuXG52YXIgUmVhY3RVcGRhdGVzID0ge1xuICAvKipcbiAgICogUmVhY3QgcmVmZXJlbmNlcyBgUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbmAgdXNpbmcgdGhpcyBwcm9wZXJ0eSBpbiBvcmRlclxuICAgKiB0byBhbGxvdyBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uOiBudWxsLFxuXG4gIGJhdGNoZWRVcGRhdGVzOiBiYXRjaGVkVXBkYXRlcyxcbiAgZW5xdWV1ZVVwZGF0ZTogZW5xdWV1ZVVwZGF0ZSxcbiAgZmx1c2hCYXRjaGVkVXBkYXRlczogZmx1c2hCYXRjaGVkVXBkYXRlcyxcbiAgaW5qZWN0aW9uOiBSZWFjdFVwZGF0ZXNJbmplY3Rpb24sXG4gIGFzYXA6IGFzYXBcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RVcGRhdGVzOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xuXG5mdW5jdGlvbiBpc0NoZWNrYWJsZShlbGVtKSB7XG4gIHZhciB0eXBlID0gZWxlbS50eXBlO1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lO1xuICByZXR1cm4gbm9kZU5hbWUgJiYgbm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiAodHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0eXBlID09PSAncmFkaW8nKTtcbn1cblxuZnVuY3Rpb24gZ2V0VHJhY2tlcihpbnN0KSB7XG4gIHJldHVybiBpbnN0Ll93cmFwcGVyU3RhdGUudmFsdWVUcmFja2VyO1xufVxuXG5mdW5jdGlvbiBhdHRhY2hUcmFja2VyKGluc3QsIHRyYWNrZXIpIHtcbiAgaW5zdC5fd3JhcHBlclN0YXRlLnZhbHVlVHJhY2tlciA9IHRyYWNrZXI7XG59XG5cbmZ1bmN0aW9uIGRldGFjaFRyYWNrZXIoaW5zdCkge1xuICBkZWxldGUgaW5zdC5fd3JhcHBlclN0YXRlLnZhbHVlVHJhY2tlcjtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWVGcm9tTm9kZShub2RlKSB7XG4gIHZhciB2YWx1ZTtcbiAgaWYgKG5vZGUpIHtcbiAgICB2YWx1ZSA9IGlzQ2hlY2thYmxlKG5vZGUpID8gJycgKyBub2RlLmNoZWNrZWQgOiBub2RlLnZhbHVlO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxudmFyIGlucHV0VmFsdWVUcmFja2luZyA9IHtcbiAgLy8gZXhwb3NlZCBmb3IgdGVzdGluZ1xuICBfZ2V0VHJhY2tlckZyb21Ob2RlOiBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBnZXRUcmFja2VyKFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpKTtcbiAgfSxcblxuXG4gIHRyYWNrOiBmdW5jdGlvbiAoaW5zdCkge1xuICAgIGlmIChnZXRUcmFja2VyKGluc3QpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTtcbiAgICB2YXIgdmFsdWVGaWVsZCA9IGlzQ2hlY2thYmxlKG5vZGUpID8gJ2NoZWNrZWQnIDogJ3ZhbHVlJztcbiAgICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobm9kZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHZhbHVlRmllbGQpO1xuXG4gICAgdmFyIGN1cnJlbnRWYWx1ZSA9ICcnICsgbm9kZVt2YWx1ZUZpZWxkXTtcblxuICAgIC8vIGlmIHNvbWVvbmUgaGFzIGFscmVhZHkgZGVmaW5lZCBhIHZhbHVlIG9yIFNhZmFyaSwgdGhlbiBiYWlsXG4gICAgLy8gYW5kIGRvbid0IHRyYWNrIHZhbHVlIHdpbGwgY2F1c2Ugb3ZlciByZXBvcnRpbmcgb2YgY2hhbmdlcyxcbiAgICAvLyBidXQgaXQncyBiZXR0ZXIgdGhlbiBhIGhhcmQgZmFpbHVyZVxuICAgIC8vIChuZWVkZWQgZm9yIGNlcnRhaW4gdGVzdHMgdGhhdCBzcHlPbiBpbnB1dCB2YWx1ZXMgYW5kIFNhZmFyaSlcbiAgICBpZiAobm9kZS5oYXNPd25Qcm9wZXJ0eSh2YWx1ZUZpZWxkKSB8fCB0eXBlb2YgZGVzY3JpcHRvci5nZXQgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGRlc2NyaXB0b3Iuc2V0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGUsIHZhbHVlRmllbGQsIHtcbiAgICAgIGVudW1lcmFibGU6IGRlc2NyaXB0b3IuZW51bWVyYWJsZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5nZXQuY2FsbCh0aGlzKTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBjdXJyZW50VmFsdWUgPSAnJyArIHZhbHVlO1xuICAgICAgICBkZXNjcmlwdG9yLnNldC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGF0dGFjaFRyYWNrZXIoaW5zdCwge1xuICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBzZXRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGN1cnJlbnRWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICB9LFxuICAgICAgc3RvcFRyYWNraW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRldGFjaFRyYWNrZXIoaW5zdCk7XG4gICAgICAgIGRlbGV0ZSBub2RlW3ZhbHVlRmllbGRdO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIHVwZGF0ZVZhbHVlSWZDaGFuZ2VkOiBmdW5jdGlvbiAoaW5zdCkge1xuICAgIGlmICghaW5zdCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgdHJhY2tlciA9IGdldFRyYWNrZXIoaW5zdCk7XG5cbiAgICBpZiAoIXRyYWNrZXIpIHtcbiAgICAgIGlucHV0VmFsdWVUcmFja2luZy50cmFjayhpbnN0KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBsYXN0VmFsdWUgPSB0cmFja2VyLmdldFZhbHVlKCk7XG4gICAgdmFyIG5leHRWYWx1ZSA9IGdldFZhbHVlRnJvbU5vZGUoUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCkpO1xuXG4gICAgaWYgKG5leHRWYWx1ZSAhPT0gbGFzdFZhbHVlKSB7XG4gICAgICB0cmFja2VyLnNldFZhbHVlKG5leHRWYWx1ZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIHN0b3BUcmFja2luZzogZnVuY3Rpb24gKGluc3QpIHtcbiAgICB2YXIgdHJhY2tlciA9IGdldFRyYWNrZXIoaW5zdCk7XG4gICAgaWYgKHRyYWNrZXIpIHtcbiAgICAgIHRyYWNrZXIuc3RvcFRyYWNraW5nKCk7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlucHV0VmFsdWVUcmFja2luZzsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEdldHMgdGhlIHRhcmdldCBub2RlIGZyb20gYSBuYXRpdmUgYnJvd3NlciBldmVudCBieSBhY2NvdW50aW5nIGZvclxuICogaW5jb25zaXN0ZW5jaWVzIGluIGJyb3dzZXIgRE9NIEFQSXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7RE9NRXZlbnRUYXJnZXR9IFRhcmdldCBub2RlLlxuICovXG5cbmZ1bmN0aW9uIGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciB0YXJnZXQgPSBuYXRpdmVFdmVudC50YXJnZXQgfHwgbmF0aXZlRXZlbnQuc3JjRWxlbWVudCB8fCB3aW5kb3c7XG5cbiAgLy8gTm9ybWFsaXplIFNWRyA8dXNlPiBlbGVtZW50IGV2ZW50cyAjNDk2M1xuICBpZiAodGFyZ2V0LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KSB7XG4gICAgdGFyZ2V0ID0gdGFyZ2V0LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50O1xuICB9XG5cbiAgLy8gU2FmYXJpIG1heSBmaXJlIGV2ZW50cyBvbiB0ZXh0IG5vZGVzIChOb2RlLlRFWFRfTk9ERSBpcyAzKS5cbiAgLy8gQHNlZSBodHRwOi8vd3d3LnF1aXJrc21vZGUub3JnL2pzL2V2ZW50c19wcm9wZXJ0aWVzLmh0bWxcbiAgcmV0dXJuIHRhcmdldC5ub2RlVHlwZSA9PT0gMyA/IHRhcmdldC5wYXJlbnROb2RlIDogdGFyZ2V0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEV2ZW50VGFyZ2V0OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG5cbnZhciB1c2VIYXNGZWF0dXJlO1xuaWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkge1xuICB1c2VIYXNGZWF0dXJlID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24gJiYgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSAmJlxuICAvLyBhbHdheXMgcmV0dXJucyB0cnVlIGluIG5ld2VyIGJyb3dzZXJzIGFzIHBlciB0aGUgc3RhbmRhcmQuXG4gIC8vIEBzZWUgaHR0cDovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2RvbS1kb21pbXBsZW1lbnRhdGlvbi1oYXNmZWF0dXJlXG4gIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoJycsICcnKSAhPT0gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gZXZlbnQgaXMgc3VwcG9ydGVkIGluIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBlbnZpcm9ubWVudC5cbiAqXG4gKiBOT1RFOiBUaGlzIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5IGZvciBub24tZ2VuZXJpYyBldmVudHMgc3VjaCBhcyBgY2hhbmdlYCxcbiAqIGByZXNldGAsIGBsb2FkYCwgYGVycm9yYCwgYW5kIGBzZWxlY3RgLlxuICpcbiAqIEJvcnJvd3MgZnJvbSBNb2Rlcm5penIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVN1ZmZpeCBFdmVudCBuYW1lLCBlLmcuIFwiY2xpY2tcIi5cbiAqIEBwYXJhbSB7P2Jvb2xlYW59IGNhcHR1cmUgQ2hlY2sgaWYgdGhlIGNhcHR1cmUgcGhhc2UgaXMgc3VwcG9ydGVkLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZXZlbnQgaXMgc3VwcG9ydGVkLlxuICogQGludGVybmFsXG4gKiBAbGljZW5zZSBNb2Rlcm5penIgMy4wLjBwcmUgKEN1c3RvbSBCdWlsZCkgfCBNSVRcbiAqL1xuZnVuY3Rpb24gaXNFdmVudFN1cHBvcnRlZChldmVudE5hbWVTdWZmaXgsIGNhcHR1cmUpIHtcbiAgaWYgKCFFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gfHwgY2FwdHVyZSAmJiAhKCdhZGRFdmVudExpc3RlbmVyJyBpbiBkb2N1bWVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgZXZlbnROYW1lID0gJ29uJyArIGV2ZW50TmFtZVN1ZmZpeDtcbiAgdmFyIGlzU3VwcG9ydGVkID0gZXZlbnROYW1lIGluIGRvY3VtZW50O1xuXG4gIGlmICghaXNTdXBwb3J0ZWQpIHtcbiAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGV2ZW50TmFtZSwgJ3JldHVybjsnKTtcbiAgICBpc1N1cHBvcnRlZCA9IHR5cGVvZiBlbGVtZW50W2V2ZW50TmFtZV0gPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICBpZiAoIWlzU3VwcG9ydGVkICYmIHVzZUhhc0ZlYXR1cmUgJiYgZXZlbnROYW1lU3VmZml4ID09PSAnd2hlZWwnKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgb25seSB3YXkgdG8gdGVzdCBzdXBwb3J0IGZvciB0aGUgYHdoZWVsYCBldmVudCBpbiBJRTkrLlxuICAgIGlzU3VwcG9ydGVkID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSgnRXZlbnRzLndoZWVsJywgJzMuMCcpO1xuICB9XG5cbiAgcmV0dXJuIGlzU3VwcG9ydGVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRXZlbnRTdXBwb3J0ZWQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBzZWUgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvdGhlLWlucHV0LWVsZW1lbnQuaHRtbCNpbnB1dC10eXBlLWF0dHItc3VtbWFyeVxuICovXG5cbnZhciBzdXBwb3J0ZWRJbnB1dFR5cGVzID0ge1xuICBjb2xvcjogdHJ1ZSxcbiAgZGF0ZTogdHJ1ZSxcbiAgZGF0ZXRpbWU6IHRydWUsXG4gICdkYXRldGltZS1sb2NhbCc6IHRydWUsXG4gIGVtYWlsOiB0cnVlLFxuICBtb250aDogdHJ1ZSxcbiAgbnVtYmVyOiB0cnVlLFxuICBwYXNzd29yZDogdHJ1ZSxcbiAgcmFuZ2U6IHRydWUsXG4gIHNlYXJjaDogdHJ1ZSxcbiAgdGVsOiB0cnVlLFxuICB0ZXh0OiB0cnVlLFxuICB0aW1lOiB0cnVlLFxuICB1cmw6IHRydWUsXG4gIHdlZWs6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGlzVGV4dElucHV0RWxlbWVudChlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKG5vZGVOYW1lID09PSAnaW5wdXQnKSB7XG4gICAgcmV0dXJuICEhc3VwcG9ydGVkSW5wdXRUeXBlc1tlbGVtLnR5cGVdO1xuICB9XG5cbiAgaWYgKG5vZGVOYW1lID09PSAndGV4dGFyZWEnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNUZXh0SW5wdXRFbGVtZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFdmVudFBsdWdpbkh1YiA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5IdWInKTtcbnZhciBFdmVudFByb3BhZ2F0b3JzID0gcmVxdWlyZSgnLi9FdmVudFByb3BhZ2F0b3JzJyk7XG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RVcGRhdGVzID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZXMnKTtcbnZhciBTeW50aGV0aWNFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljRXZlbnQnKTtcblxudmFyIGlucHV0VmFsdWVUcmFja2luZyA9IHJlcXVpcmUoJy4vaW5wdXRWYWx1ZVRyYWNraW5nJyk7XG52YXIgZ2V0RXZlbnRUYXJnZXQgPSByZXF1aXJlKCcuL2dldEV2ZW50VGFyZ2V0Jyk7XG52YXIgaXNFdmVudFN1cHBvcnRlZCA9IHJlcXVpcmUoJy4vaXNFdmVudFN1cHBvcnRlZCcpO1xudmFyIGlzVGV4dElucHV0RWxlbWVudCA9IHJlcXVpcmUoJy4vaXNUZXh0SW5wdXRFbGVtZW50Jyk7XG5cbnZhciBldmVudFR5cGVzID0ge1xuICBjaGFuZ2U6IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogJ29uQ2hhbmdlJyxcbiAgICAgIGNhcHR1cmVkOiAnb25DaGFuZ2VDYXB0dXJlJ1xuICAgIH0sXG4gICAgZGVwZW5kZW5jaWVzOiBbJ3RvcEJsdXInLCAndG9wQ2hhbmdlJywgJ3RvcENsaWNrJywgJ3RvcEZvY3VzJywgJ3RvcElucHV0JywgJ3RvcEtleURvd24nLCAndG9wS2V5VXAnLCAndG9wU2VsZWN0aW9uQ2hhbmdlJ11cbiAgfVxufTtcblxuZnVuY3Rpb24gY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGluc3QsIG5hdGl2ZUV2ZW50LCB0YXJnZXQpIHtcbiAgdmFyIGV2ZW50ID0gU3ludGhldGljRXZlbnQuZ2V0UG9vbGVkKGV2ZW50VHlwZXMuY2hhbmdlLCBpbnN0LCBuYXRpdmVFdmVudCwgdGFyZ2V0KTtcbiAgZXZlbnQudHlwZSA9ICdjaGFuZ2UnO1xuICBFdmVudFByb3BhZ2F0b3JzLmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoZXZlbnQpO1xuICByZXR1cm4gZXZlbnQ7XG59XG4vKipcbiAqIEZvciBJRSBzaGltc1xuICovXG52YXIgYWN0aXZlRWxlbWVudCA9IG51bGw7XG52YXIgYWN0aXZlRWxlbWVudEluc3QgPSBudWxsO1xuXG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgY2hhbmdlYCBldmVudFxuICovXG5mdW5jdGlvbiBzaG91bGRVc2VDaGFuZ2VFdmVudChlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gbm9kZU5hbWUgPT09ICdzZWxlY3QnIHx8IG5vZGVOYW1lID09PSAnaW5wdXQnICYmIGVsZW0udHlwZSA9PT0gJ2ZpbGUnO1xufVxuXG52YXIgZG9lc0NoYW5nZUV2ZW50QnViYmxlID0gZmFsc2U7XG5pZiAoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKSB7XG4gIC8vIFNlZSBgaGFuZGxlQ2hhbmdlYCBjb21tZW50IGJlbG93XG4gIGRvZXNDaGFuZ2VFdmVudEJ1YmJsZSA9IGlzRXZlbnRTdXBwb3J0ZWQoJ2NoYW5nZScpICYmICghZG9jdW1lbnQuZG9jdW1lbnRNb2RlIHx8IGRvY3VtZW50LmRvY3VtZW50TW9kZSA+IDgpO1xufVxuXG5mdW5jdGlvbiBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBldmVudCA9IGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChhY3RpdmVFbGVtZW50SW5zdCwgbmF0aXZlRXZlbnQsIGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KSk7XG5cbiAgLy8gSWYgY2hhbmdlIGFuZCBwcm9wZXJ0eWNoYW5nZSBidWJibGVkLCB3ZSdkIGp1c3QgYmluZCB0byBpdCBsaWtlIGFsbCB0aGVcbiAgLy8gb3RoZXIgZXZlbnRzIGFuZCBoYXZlIGl0IGdvIHRocm91Z2ggUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLiBTaW5jZSBpdFxuICAvLyBkb2Vzbid0LCB3ZSBtYW51YWxseSBsaXN0ZW4gZm9yIHRoZSBldmVudHMgYW5kIHNvIHdlIGhhdmUgdG8gZW5xdWV1ZSBhbmRcbiAgLy8gcHJvY2VzcyB0aGUgYWJzdHJhY3QgZXZlbnQgbWFudWFsbHkuXG4gIC8vXG4gIC8vIEJhdGNoaW5nIGlzIG5lY2Vzc2FyeSBoZXJlIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IGFsbCBldmVudCBoYW5kbGVycyBydW5cbiAgLy8gYmVmb3JlIHRoZSBuZXh0IHJlcmVuZGVyIChpbmNsdWRpbmcgZXZlbnQgaGFuZGxlcnMgYXR0YWNoZWQgdG8gYW5jZXN0b3JcbiAgLy8gZWxlbWVudHMgaW5zdGVhZCBvZiBkaXJlY3RseSBvbiB0aGUgaW5wdXQpLiBXaXRob3V0IHRoaXMsIGNvbnRyb2xsZWRcbiAgLy8gY29tcG9uZW50cyBkb24ndCB3b3JrIHByb3Blcmx5IGluIGNvbmp1bmN0aW9uIHdpdGggZXZlbnQgYnViYmxpbmcgYmVjYXVzZVxuICAvLyB0aGUgY29tcG9uZW50IGlzIHJlcmVuZGVyZWQgYW5kIHRoZSB2YWx1ZSByZXZlcnRlZCBiZWZvcmUgYWxsIHRoZSBldmVudFxuICAvLyBoYW5kbGVycyBjYW4gcnVuLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy83MDguXG4gIFJlYWN0VXBkYXRlcy5iYXRjaGVkVXBkYXRlcyhydW5FdmVudEluQmF0Y2gsIGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gcnVuRXZlbnRJbkJhdGNoKGV2ZW50KSB7XG4gIEV2ZW50UGx1Z2luSHViLmVucXVldWVFdmVudHMoZXZlbnQpO1xuICBFdmVudFBsdWdpbkh1Yi5wcm9jZXNzRXZlbnRRdWV1ZShmYWxzZSk7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0V2F0Y2hpbmdGb3JDaGFuZ2VFdmVudElFOCh0YXJnZXQsIHRhcmdldEluc3QpIHtcbiAgYWN0aXZlRWxlbWVudCA9IHRhcmdldDtcbiAgYWN0aXZlRWxlbWVudEluc3QgPSB0YXJnZXRJbnN0O1xuICBhY3RpdmVFbGVtZW50LmF0dGFjaEV2ZW50KCdvbmNoYW5nZScsIG1hbnVhbERpc3BhdGNoQ2hhbmdlRXZlbnQpO1xufVxuXG5mdW5jdGlvbiBzdG9wV2F0Y2hpbmdGb3JDaGFuZ2VFdmVudElFOCgpIHtcbiAgaWYgKCFhY3RpdmVFbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGFjdGl2ZUVsZW1lbnQuZGV0YWNoRXZlbnQoJ29uY2hhbmdlJywgbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudCk7XG4gIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xuICBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEluc3RJZlZhbHVlQ2hhbmdlZCh0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCkge1xuICB2YXIgdXBkYXRlZCA9IGlucHV0VmFsdWVUcmFja2luZy51cGRhdGVWYWx1ZUlmQ2hhbmdlZCh0YXJnZXRJbnN0KTtcbiAgdmFyIHNpbXVsYXRlZCA9IG5hdGl2ZUV2ZW50LnNpbXVsYXRlZCA9PT0gdHJ1ZSAmJiBDaGFuZ2VFdmVudFBsdWdpbi5fYWxsb3dTaW11bGF0ZWRQYXNzVGhyb3VnaDtcblxuICBpZiAodXBkYXRlZCB8fCBzaW11bGF0ZWQpIHtcbiAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9yQ2hhbmdlRXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0KSB7XG4gIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BDaGFuZ2UnKSB7XG4gICAgcmV0dXJuIHRhcmdldEluc3Q7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlRXZlbnRzRm9yQ2hhbmdlRXZlbnRJRTgodG9wTGV2ZWxUeXBlLCB0YXJnZXQsIHRhcmdldEluc3QpIHtcbiAgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcEZvY3VzJykge1xuICAgIC8vIHN0b3BXYXRjaGluZygpIHNob3VsZCBiZSBhIG5vb3AgaGVyZSBidXQgd2UgY2FsbCBpdCBqdXN0IGluIGNhc2Ugd2VcbiAgICAvLyBtaXNzZWQgYSBibHVyIGV2ZW50IHNvbWVob3cuXG4gICAgc3RvcFdhdGNoaW5nRm9yQ2hhbmdlRXZlbnRJRTgoKTtcbiAgICBzdGFydFdhdGNoaW5nRm9yQ2hhbmdlRXZlbnRJRTgodGFyZ2V0LCB0YXJnZXRJbnN0KTtcbiAgfSBlbHNlIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BCbHVyJykge1xuICAgIHN0b3BXYXRjaGluZ0ZvckNoYW5nZUV2ZW50SUU4KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTRUNUSU9OOiBoYW5kbGUgYGlucHV0YCBldmVudFxuICovXG52YXIgaXNJbnB1dEV2ZW50U3VwcG9ydGVkID0gZmFsc2U7XG5pZiAoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKSB7XG4gIC8vIElFOSBjbGFpbXMgdG8gc3VwcG9ydCB0aGUgaW5wdXQgZXZlbnQgYnV0IGZhaWxzIHRvIHRyaWdnZXIgaXQgd2hlblxuICAvLyBkZWxldGluZyB0ZXh0LCBzbyB3ZSBpZ25vcmUgaXRzIGlucHV0IGV2ZW50cy5cblxuICBpc0lucHV0RXZlbnRTdXBwb3J0ZWQgPSBpc0V2ZW50U3VwcG9ydGVkKCdpbnB1dCcpICYmICghKCdkb2N1bWVudE1vZGUnIGluIGRvY3VtZW50KSB8fCBkb2N1bWVudC5kb2N1bWVudE1vZGUgPiA5KTtcbn1cblxuLyoqXG4gKiAoRm9yIElFIDw9OSkgU3RhcnRzIHRyYWNraW5nIHByb3BlcnR5Y2hhbmdlIGV2ZW50cyBvbiB0aGUgcGFzc2VkLWluIGVsZW1lbnRcbiAqIGFuZCBvdmVycmlkZSB0aGUgdmFsdWUgcHJvcGVydHkgc28gdGhhdCB3ZSBjYW4gZGlzdGluZ3Vpc2ggdXNlciBldmVudHMgZnJvbVxuICogdmFsdWUgY2hhbmdlcyBpbiBKUy5cbiAqL1xuZnVuY3Rpb24gc3RhcnRXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKHRhcmdldCwgdGFyZ2V0SW5zdCkge1xuICBhY3RpdmVFbGVtZW50ID0gdGFyZ2V0O1xuICBhY3RpdmVFbGVtZW50SW5zdCA9IHRhcmdldEluc3Q7XG4gIGFjdGl2ZUVsZW1lbnQuYXR0YWNoRXZlbnQoJ29ucHJvcGVydHljaGFuZ2UnLCBoYW5kbGVQcm9wZXJ0eUNoYW5nZSk7XG59XG5cbi8qKlxuICogKEZvciBJRSA8PTkpIFJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVycyBmcm9tIHRoZSBjdXJyZW50bHktdHJhY2tlZCBlbGVtZW50LFxuICogaWYgYW55IGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKSB7XG4gIGlmICghYWN0aXZlRWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuICBhY3RpdmVFbGVtZW50LmRldGFjaEV2ZW50KCdvbnByb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UpO1xuXG4gIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xuICBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG59XG5cbi8qKlxuICogKEZvciBJRSA8PTkpIEhhbmRsZXMgYSBwcm9wZXJ0eWNoYW5nZSBldmVudCwgc2VuZGluZyBhIGBjaGFuZ2VgIGV2ZW50IGlmXG4gKiB0aGUgdmFsdWUgb2YgdGhlIGFjdGl2ZSBlbGVtZW50IGhhcyBjaGFuZ2VkLlxuICovXG5mdW5jdGlvbiBoYW5kbGVQcm9wZXJ0eUNoYW5nZShuYXRpdmVFdmVudCkge1xuICBpZiAobmF0aXZlRXZlbnQucHJvcGVydHlOYW1lICE9PSAndmFsdWUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChnZXRJbnN0SWZWYWx1ZUNoYW5nZWQoYWN0aXZlRWxlbWVudEluc3QsIG5hdGl2ZUV2ZW50KSkge1xuICAgIG1hbnVhbERpc3BhdGNoQ2hhbmdlRXZlbnQobmF0aXZlRXZlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRQb2x5ZmlsbCh0b3BMZXZlbFR5cGUsIHRhcmdldCwgdGFyZ2V0SW5zdCkge1xuICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wRm9jdXMnKSB7XG4gICAgLy8gSW4gSUU4LCB3ZSBjYW4gY2FwdHVyZSBhbG1vc3QgYWxsIC52YWx1ZSBjaGFuZ2VzIGJ5IGFkZGluZyBhXG4gICAgLy8gcHJvcGVydHljaGFuZ2UgaGFuZGxlciBhbmQgbG9va2luZyBmb3IgZXZlbnRzIHdpdGggcHJvcGVydHlOYW1lXG4gICAgLy8gZXF1YWwgdG8gJ3ZhbHVlJ1xuICAgIC8vIEluIElFOSwgcHJvcGVydHljaGFuZ2UgZmlyZXMgZm9yIG1vc3QgaW5wdXQgZXZlbnRzIGJ1dCBpcyBidWdneSBhbmRcbiAgICAvLyBkb2Vzbid0IGZpcmUgd2hlbiB0ZXh0IGlzIGRlbGV0ZWQsIGJ1dCBjb252ZW5pZW50bHksIHNlbGVjdGlvbmNoYW5nZVxuICAgIC8vIGFwcGVhcnMgdG8gZmlyZSBpbiBhbGwgb2YgdGhlIHJlbWFpbmluZyBjYXNlcyBzbyB3ZSBjYXRjaCB0aG9zZSBhbmRcbiAgICAvLyBmb3J3YXJkIHRoZSBldmVudCBpZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWRcbiAgICAvLyBJbiBlaXRoZXIgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byBjYWxsIHRoZSBldmVudCBoYW5kbGVyIGlmIHRoZSB2YWx1ZVxuICAgIC8vIGlzIGNoYW5nZWQgZnJvbSBKUyBzbyB3ZSByZWRlZmluZSBhIHNldHRlciBmb3IgYC52YWx1ZWAgdGhhdCB1cGRhdGVzXG4gICAgLy8gb3VyIGFjdGl2ZUVsZW1lbnRWYWx1ZSB2YXJpYWJsZSwgYWxsb3dpbmcgdXMgdG8gaWdub3JlIHRob3NlIGNoYW5nZXNcbiAgICAvL1xuICAgIC8vIHN0b3BXYXRjaGluZygpIHNob3VsZCBiZSBhIG5vb3AgaGVyZSBidXQgd2UgY2FsbCBpdCBqdXN0IGluIGNhc2Ugd2VcbiAgICAvLyBtaXNzZWQgYSBibHVyIGV2ZW50IHNvbWVob3cuXG4gICAgc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKTtcbiAgICBzdGFydFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KTtcbiAgfSBlbHNlIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BCbHVyJykge1xuICAgIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCk7XG4gIH1cbn1cblxuLy8gRm9yIElFOCBhbmQgSUU5LlxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnRQb2x5ZmlsbCh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50KSB7XG4gIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BTZWxlY3Rpb25DaGFuZ2UnIHx8IHRvcExldmVsVHlwZSA9PT0gJ3RvcEtleVVwJyB8fCB0b3BMZXZlbFR5cGUgPT09ICd0b3BLZXlEb3duJykge1xuICAgIC8vIE9uIHRoZSBzZWxlY3Rpb25jaGFuZ2UgZXZlbnQsIHRoZSB0YXJnZXQgaXMganVzdCBkb2N1bWVudCB3aGljaCBpc24ndFxuICAgIC8vIGhlbHBmdWwgZm9yIHVzIHNvIGp1c3QgY2hlY2sgYWN0aXZlRWxlbWVudCBpbnN0ZWFkLlxuICAgIC8vXG4gICAgLy8gOTklIG9mIHRoZSB0aW1lLCBrZXlkb3duIGFuZCBrZXl1cCBhcmVuJ3QgbmVjZXNzYXJ5LiBJRTggZmFpbHMgdG8gZmlyZVxuICAgIC8vIHByb3BlcnR5Y2hhbmdlIG9uIHRoZSBmaXJzdCBpbnB1dCBldmVudCBhZnRlciBzZXR0aW5nIGB2YWx1ZWAgZnJvbSBhXG4gICAgLy8gc2NyaXB0IGFuZCBmaXJlcyBvbmx5IGtleWRvd24sIGtleXByZXNzLCBrZXl1cC4gQ2F0Y2hpbmcga2V5dXAgdXN1YWxseVxuICAgIC8vIGdldHMgaXQgYW5kIGNhdGNoaW5nIGtleWRvd24gbGV0cyB1cyBmaXJlIGFuIGV2ZW50IGZvciB0aGUgZmlyc3RcbiAgICAvLyBrZXlzdHJva2UgaWYgdXNlciBkb2VzIGEga2V5IHJlcGVhdCAoaXQnbGwgYmUgYSBsaXR0bGUgZGVsYXllZDogcmlnaHRcbiAgICAvLyBiZWZvcmUgdGhlIHNlY29uZCBrZXlzdHJva2UpLiBPdGhlciBpbnB1dCBtZXRob2RzIChlLmcuLCBwYXN0ZSkgc2VlbSB0b1xuICAgIC8vIGZpcmUgc2VsZWN0aW9uY2hhbmdlIG5vcm1hbGx5LlxuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQoYWN0aXZlRWxlbWVudEluc3QsIG5hdGl2ZUV2ZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgY2xpY2tgIGV2ZW50XG4gKi9cbmZ1bmN0aW9uIHNob3VsZFVzZUNsaWNrRXZlbnQoZWxlbSkge1xuICAvLyBVc2UgdGhlIGBjbGlja2AgZXZlbnQgdG8gZGV0ZWN0IGNoYW5nZXMgdG8gY2hlY2tib3ggYW5kIHJhZGlvIGlucHV0cy5cbiAgLy8gVGhpcyBhcHByb2FjaCB3b3JrcyBhY3Jvc3MgYWxsIGJyb3dzZXJzLCB3aGVyZWFzIGBjaGFuZ2VgIGRvZXMgbm90IGZpcmVcbiAgLy8gdW50aWwgYGJsdXJgIGluIElFOC5cbiAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZTtcbiAgcmV0dXJuIG5vZGVOYW1lICYmIG5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgJiYgKGVsZW0udHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtLnR5cGUgPT09ICdyYWRpbycpO1xufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9yQ2xpY2tFdmVudCh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50KSB7XG4gIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BDbGljaycpIHtcbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRPckNoYW5nZUV2ZW50KHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQpIHtcbiAgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcElucHV0JyB8fCB0b3BMZXZlbFR5cGUgPT09ICd0b3BDaGFuZ2UnKSB7XG4gICAgcmV0dXJuIGdldEluc3RJZlZhbHVlQ2hhbmdlZCh0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQ29udHJvbGxlZElucHV0Qmx1cihpbnN0LCBub2RlKSB7XG4gIC8vIFRPRE86IEluIElFLCBpbnN0IGlzIG9jY2FzaW9uYWxseSBudWxsLiBXaHk/XG4gIGlmIChpbnN0ID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBGaWJlciBhbmQgUmVhY3RET00ga2VlcCB3cmFwcGVyIHN0YXRlIGluIHNlcGFyYXRlIHBsYWNlc1xuICB2YXIgc3RhdGUgPSBpbnN0Ll93cmFwcGVyU3RhdGUgfHwgbm9kZS5fd3JhcHBlclN0YXRlO1xuXG4gIGlmICghc3RhdGUgfHwgIXN0YXRlLmNvbnRyb2xsZWQgfHwgbm9kZS50eXBlICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIElmIGNvbnRyb2xsZWQsIGFzc2lnbiB0aGUgdmFsdWUgYXR0cmlidXRlIHRvIHRoZSBjdXJyZW50IHZhbHVlIG9uIGJsdXJcbiAgdmFyIHZhbHVlID0gJycgKyBub2RlLnZhbHVlO1xuICBpZiAobm9kZS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykgIT09IHZhbHVlKSB7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyBwbHVnaW4gY3JlYXRlcyBhbiBgb25DaGFuZ2VgIGV2ZW50IHRoYXQgbm9ybWFsaXplcyBjaGFuZ2UgZXZlbnRzXG4gKiBhY3Jvc3MgZm9ybSBlbGVtZW50cy4gVGhpcyBldmVudCBmaXJlcyBhdCBhIHRpbWUgd2hlbiBpdCdzIHBvc3NpYmxlIHRvXG4gKiBjaGFuZ2UgdGhlIGVsZW1lbnQncyB2YWx1ZSB3aXRob3V0IHNlZWluZyBhIGZsaWNrZXIuXG4gKlxuICogU3VwcG9ydGVkIGVsZW1lbnRzIGFyZTpcbiAqIC0gaW5wdXQgKHNlZSBgaXNUZXh0SW5wdXRFbGVtZW50YClcbiAqIC0gdGV4dGFyZWFcbiAqIC0gc2VsZWN0XG4gKi9cbnZhciBDaGFuZ2VFdmVudFBsdWdpbiA9IHtcbiAgZXZlbnRUeXBlczogZXZlbnRUeXBlcyxcblxuICBfYWxsb3dTaW11bGF0ZWRQYXNzVGhyb3VnaDogdHJ1ZSxcbiAgX2lzSW5wdXRFdmVudFN1cHBvcnRlZDogaXNJbnB1dEV2ZW50U3VwcG9ydGVkLFxuXG4gIGV4dHJhY3RFdmVudHM6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIHZhciB0YXJnZXROb2RlID0gdGFyZ2V0SW5zdCA/IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpIDogd2luZG93O1xuXG4gICAgdmFyIGdldFRhcmdldEluc3RGdW5jLCBoYW5kbGVFdmVudEZ1bmM7XG4gICAgaWYgKHNob3VsZFVzZUNoYW5nZUV2ZW50KHRhcmdldE5vZGUpKSB7XG4gICAgICBpZiAoZG9lc0NoYW5nZUV2ZW50QnViYmxlKSB7XG4gICAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNoYW5nZUV2ZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGFuZGxlRXZlbnRGdW5jID0gaGFuZGxlRXZlbnRzRm9yQ2hhbmdlRXZlbnRJRTg7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICAgIGlmIChpc0lucHV0RXZlbnRTdXBwb3J0ZWQpIHtcbiAgICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRPckNoYW5nZUV2ZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudFBvbHlmaWxsO1xuICAgICAgICBoYW5kbGVFdmVudEZ1bmMgPSBoYW5kbGVFdmVudHNGb3JJbnB1dEV2ZW50UG9seWZpbGw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzaG91bGRVc2VDbGlja0V2ZW50KHRhcmdldE5vZGUpKSB7XG4gICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDbGlja0V2ZW50O1xuICAgIH1cblxuICAgIGlmIChnZXRUYXJnZXRJbnN0RnVuYykge1xuICAgICAgdmFyIGluc3QgPSBnZXRUYXJnZXRJbnN0RnVuYyh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50KTtcbiAgICAgIGlmIChpbnN0KSB7XG4gICAgICAgIHZhciBldmVudCA9IGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChpbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhbmRsZUV2ZW50RnVuYykge1xuICAgICAgaGFuZGxlRXZlbnRGdW5jKHRvcExldmVsVHlwZSwgdGFyZ2V0Tm9kZSwgdGFyZ2V0SW5zdCk7XG4gICAgfVxuXG4gICAgLy8gV2hlbiBibHVycmluZywgc2V0IHRoZSB2YWx1ZSBhdHRyaWJ1dGUgZm9yIG51bWJlciBpbnB1dHNcbiAgICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wQmx1cicpIHtcbiAgICAgIGhhbmRsZUNvbnRyb2xsZWRJbnB1dEJsdXIodGFyZ2V0SW5zdCwgdGFyZ2V0Tm9kZSk7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENoYW5nZUV2ZW50UGx1Z2luOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIHRoYXQgaXMgaW5qZWN0YWJsZSBpbnRvIGBFdmVudFBsdWdpbkh1YmAsIHRoYXQgc3BlY2lmaWVzIGFcbiAqIGRldGVybWluaXN0aWMgb3JkZXJpbmcgb2YgYEV2ZW50UGx1Z2luYHMuIEEgY29udmVuaWVudCB3YXkgdG8gcmVhc29uIGFib3V0XG4gKiBwbHVnaW5zLCB3aXRob3V0IGhhdmluZyB0byBwYWNrYWdlIGV2ZXJ5IG9uZSBvZiB0aGVtLiBUaGlzIGlzIGJldHRlciB0aGFuXG4gKiBoYXZpbmcgcGx1Z2lucyBiZSBvcmRlcmVkIGluIHRoZSBzYW1lIG9yZGVyIHRoYXQgdGhleSBhcmUgaW5qZWN0ZWQgYmVjYXVzZVxuICogdGhhdCBvcmRlcmluZyB3b3VsZCBiZSBpbmZsdWVuY2VkIGJ5IHRoZSBwYWNrYWdpbmcgb3JkZXIuXG4gKiBgUmVzcG9uZGVyRXZlbnRQbHVnaW5gIG11c3Qgb2NjdXIgYmVmb3JlIGBTaW1wbGVFdmVudFBsdWdpbmAgc28gdGhhdFxuICogcHJldmVudGluZyBkZWZhdWx0IG9uIGV2ZW50cyBpcyBjb252ZW5pZW50IGluIGBTaW1wbGVFdmVudFBsdWdpbmAgaGFuZGxlcnMuXG4gKi9cblxudmFyIERlZmF1bHRFdmVudFBsdWdpbk9yZGVyID0gWydSZXNwb25kZXJFdmVudFBsdWdpbicsICdTaW1wbGVFdmVudFBsdWdpbicsICdUYXBFdmVudFBsdWdpbicsICdFbnRlckxlYXZlRXZlbnRQbHVnaW4nLCAnQ2hhbmdlRXZlbnRQbHVnaW4nLCAnU2VsZWN0RXZlbnRQbHVnaW4nLCAnQmVmb3JlSW5wdXRFdmVudFBsdWdpbiddO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERlZmF1bHRFdmVudFBsdWdpbk9yZGVyOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBTeW50aGV0aWNFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljRXZlbnQnKTtcblxudmFyIGdldEV2ZW50VGFyZ2V0ID0gcmVxdWlyZSgnLi9nZXRFdmVudFRhcmdldCcpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgVUlFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cbnZhciBVSUV2ZW50SW50ZXJmYWNlID0ge1xuICB2aWV3OiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudmlldykge1xuICAgICAgcmV0dXJuIGV2ZW50LnZpZXc7XG4gICAgfVxuXG4gICAgdmFyIHRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KGV2ZW50KTtcbiAgICBpZiAodGFyZ2V0LndpbmRvdyA9PT0gdGFyZ2V0KSB7XG4gICAgICAvLyB0YXJnZXQgaXMgYSB3aW5kb3cgb2JqZWN0XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIHZhciBkb2MgPSB0YXJnZXQub3duZXJEb2N1bWVudDtcbiAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoeSBgb3duZXJEb2N1bWVudGAgaXMgc29tZXRpbWVzIHVuZGVmaW5lZCBpbiBJRTguXG4gICAgaWYgKGRvYykge1xuICAgICAgcmV0dXJuIGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gd2luZG93O1xuICAgIH1cbiAgfSxcbiAgZGV0YWlsOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQuZGV0YWlsIHx8IDA7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY0V2ZW50fVxuICovXG5mdW5jdGlvbiBTeW50aGV0aWNVSUV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBTeW50aGV0aWNFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuU3ludGhldGljRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY1VJRXZlbnQsIFVJRXZlbnRJbnRlcmZhY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY1VJRXZlbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFZpZXdwb3J0TWV0cmljcyA9IHtcbiAgY3VycmVudFNjcm9sbExlZnQ6IDAsXG5cbiAgY3VycmVudFNjcm9sbFRvcDogMCxcblxuICByZWZyZXNoU2Nyb2xsVmFsdWVzOiBmdW5jdGlvbiAoc2Nyb2xsUG9zaXRpb24pIHtcbiAgICBWaWV3cG9ydE1ldHJpY3MuY3VycmVudFNjcm9sbExlZnQgPSBzY3JvbGxQb3NpdGlvbi54O1xuICAgIFZpZXdwb3J0TWV0cmljcy5jdXJyZW50U2Nyb2xsVG9wID0gc2Nyb2xsUG9zaXRpb24ueTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBWaWV3cG9ydE1ldHJpY3M7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBUcmFuc2xhdGlvbiBmcm9tIG1vZGlmaWVyIGtleSB0byB0aGUgYXNzb2NpYXRlZCBwcm9wZXJ0eSBpbiB0aGUgZXZlbnQuXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8ja2V5cy1Nb2RpZmllcnNcbiAqL1xuXG52YXIgbW9kaWZpZXJLZXlUb1Byb3AgPSB7XG4gIEFsdDogJ2FsdEtleScsXG4gIENvbnRyb2w6ICdjdHJsS2V5JyxcbiAgTWV0YTogJ21ldGFLZXknLFxuICBTaGlmdDogJ3NoaWZ0S2V5J1xufTtcblxuLy8gSUU4IGRvZXMgbm90IGltcGxlbWVudCBnZXRNb2RpZmllclN0YXRlIHNvIHdlIHNpbXBseSBtYXAgaXQgdG8gdGhlIG9ubHlcbi8vIG1vZGlmaWVyIGtleXMgZXhwb3NlZCBieSB0aGUgZXZlbnQgaXRzZWxmLCBkb2VzIG5vdCBzdXBwb3J0IExvY2sta2V5cy5cbi8vIEN1cnJlbnRseSwgYWxsIG1ham9yIGJyb3dzZXJzIGV4Y2VwdCBDaHJvbWUgc2VlbXMgdG8gc3VwcG9ydCBMb2NrLWtleXMuXG5mdW5jdGlvbiBtb2RpZmllclN0YXRlR2V0dGVyKGtleUFyZykge1xuICB2YXIgc3ludGhldGljRXZlbnQgPSB0aGlzO1xuICB2YXIgbmF0aXZlRXZlbnQgPSBzeW50aGV0aWNFdmVudC5uYXRpdmVFdmVudDtcbiAgaWYgKG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUpIHtcbiAgICByZXR1cm4gbmF0aXZlRXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZShrZXlBcmcpO1xuICB9XG4gIHZhciBrZXlQcm9wID0gbW9kaWZpZXJLZXlUb1Byb3Bba2V5QXJnXTtcbiAgcmV0dXJuIGtleVByb3AgPyAhIW5hdGl2ZUV2ZW50W2tleVByb3BdIDogZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEV2ZW50TW9kaWZpZXJTdGF0ZShuYXRpdmVFdmVudCkge1xuICByZXR1cm4gbW9kaWZpZXJTdGF0ZUdldHRlcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRFdmVudE1vZGlmaWVyU3RhdGU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY1VJRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY1VJRXZlbnQnKTtcbnZhciBWaWV3cG9ydE1ldHJpY3MgPSByZXF1aXJlKCcuL1ZpZXdwb3J0TWV0cmljcycpO1xuXG52YXIgZ2V0RXZlbnRNb2RpZmllclN0YXRlID0gcmVxdWlyZSgnLi9nZXRFdmVudE1vZGlmaWVyU3RhdGUnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIE1vdXNlRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG52YXIgTW91c2VFdmVudEludGVyZmFjZSA9IHtcbiAgc2NyZWVuWDogbnVsbCxcbiAgc2NyZWVuWTogbnVsbCxcbiAgY2xpZW50WDogbnVsbCxcbiAgY2xpZW50WTogbnVsbCxcbiAgY3RybEtleTogbnVsbCxcbiAgc2hpZnRLZXk6IG51bGwsXG4gIGFsdEtleTogbnVsbCxcbiAgbWV0YUtleTogbnVsbCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlLFxuICBidXR0b246IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIFdlYmtpdCwgRmlyZWZveCwgSUU5K1xuICAgIC8vIHdoaWNoOiAgMSAyIDNcbiAgICAvLyBidXR0b246IDAgMSAyIChzdGFuZGFyZClcbiAgICB2YXIgYnV0dG9uID0gZXZlbnQuYnV0dG9uO1xuICAgIGlmICgnd2hpY2gnIGluIGV2ZW50KSB7XG4gICAgICByZXR1cm4gYnV0dG9uO1xuICAgIH1cbiAgICAvLyBJRTw5XG4gICAgLy8gd2hpY2g6ICB1bmRlZmluZWRcbiAgICAvLyBidXR0b246IDAgMCAwXG4gICAgLy8gYnV0dG9uOiAxIDQgMiAob25tb3VzZXVwKVxuICAgIHJldHVybiBidXR0b24gPT09IDIgPyAyIDogYnV0dG9uID09PSA0ID8gMSA6IDA7XG4gIH0sXG4gIGJ1dHRvbnM6IG51bGwsXG4gIHJlbGF0ZWRUYXJnZXQ6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiBldmVudC5yZWxhdGVkVGFyZ2V0IHx8IChldmVudC5mcm9tRWxlbWVudCA9PT0gZXZlbnQuc3JjRWxlbWVudCA/IGV2ZW50LnRvRWxlbWVudCA6IGV2ZW50LmZyb21FbGVtZW50KTtcbiAgfSxcbiAgLy8gXCJQcm9wcmlldGFyeVwiIEludGVyZmFjZS5cbiAgcGFnZVg6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAncGFnZVgnIGluIGV2ZW50ID8gZXZlbnQucGFnZVggOiBldmVudC5jbGllbnRYICsgVmlld3BvcnRNZXRyaWNzLmN1cnJlbnRTY3JvbGxMZWZ0O1xuICB9LFxuICBwYWdlWTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdwYWdlWScgaW4gZXZlbnQgPyBldmVudC5wYWdlWSA6IGV2ZW50LmNsaWVudFkgKyBWaWV3cG9ydE1ldHJpY3MuY3VycmVudFNjcm9sbFRvcDtcbiAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAZXh0ZW5kcyB7U3ludGhldGljVUlFdmVudH1cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljTW91c2VFdmVudChkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICByZXR1cm4gU3ludGhldGljVUlFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuU3ludGhldGljVUlFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljTW91c2VFdmVudCwgTW91c2VFdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljTW91c2VFdmVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXZlbnRQcm9wYWdhdG9ycyA9IHJlcXVpcmUoJy4vRXZlbnRQcm9wYWdhdG9ycycpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgU3ludGhldGljTW91c2VFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljTW91c2VFdmVudCcpO1xuXG52YXIgZXZlbnRUeXBlcyA9IHtcbiAgbW91c2VFbnRlcjoge1xuICAgIHJlZ2lzdHJhdGlvbk5hbWU6ICdvbk1vdXNlRW50ZXInLFxuICAgIGRlcGVuZGVuY2llczogWyd0b3BNb3VzZU91dCcsICd0b3BNb3VzZU92ZXInXVxuICB9LFxuICBtb3VzZUxlYXZlOiB7XG4gICAgcmVnaXN0cmF0aW9uTmFtZTogJ29uTW91c2VMZWF2ZScsXG4gICAgZGVwZW5kZW5jaWVzOiBbJ3RvcE1vdXNlT3V0JywgJ3RvcE1vdXNlT3ZlciddXG4gIH1cbn07XG5cbnZhciBFbnRlckxlYXZlRXZlbnRQbHVnaW4gPSB7XG4gIGV2ZW50VHlwZXM6IGV2ZW50VHlwZXMsXG5cbiAgLyoqXG4gICAqIEZvciBhbG1vc3QgZXZlcnkgaW50ZXJhY3Rpb24gd2UgY2FyZSBhYm91dCwgdGhlcmUgd2lsbCBiZSBib3RoIGEgdG9wLWxldmVsXG4gICAqIGBtb3VzZW92ZXJgIGFuZCBgbW91c2VvdXRgIGV2ZW50IHRoYXQgb2NjdXJzLiBPbmx5IHVzZSBgbW91c2VvdXRgIHNvIHRoYXRcbiAgICogd2UgZG8gbm90IGV4dHJhY3QgZHVwbGljYXRlIGV2ZW50cy4gSG93ZXZlciwgbW92aW5nIHRoZSBtb3VzZSBpbnRvIHRoZVxuICAgKiBicm93c2VyIGZyb20gb3V0c2lkZSB3aWxsIG5vdCBmaXJlIGEgYG1vdXNlb3V0YCBldmVudC4gSW4gdGhpcyBjYXNlLCB3ZSB1c2VcbiAgICogdGhlIGBtb3VzZW92ZXJgIHRvcC1sZXZlbCBldmVudC5cbiAgICovXG4gIGV4dHJhY3RFdmVudHM6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BNb3VzZU92ZXInICYmIChuYXRpdmVFdmVudC5yZWxhdGVkVGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LmZyb21FbGVtZW50KSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0b3BMZXZlbFR5cGUgIT09ICd0b3BNb3VzZU91dCcgJiYgdG9wTGV2ZWxUeXBlICE9PSAndG9wTW91c2VPdmVyJykge1xuICAgICAgLy8gTXVzdCBub3QgYmUgYSBtb3VzZSBpbiBvciBtb3VzZSBvdXQgLSBpZ25vcmluZy5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciB3aW47XG4gICAgaWYgKG5hdGl2ZUV2ZW50VGFyZ2V0LndpbmRvdyA9PT0gbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICAgIC8vIGBuYXRpdmVFdmVudFRhcmdldGAgaXMgcHJvYmFibHkgYSB3aW5kb3cgb2JqZWN0LlxuICAgICAgd2luID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2h5IGBvd25lckRvY3VtZW50YCBpcyBzb21ldGltZXMgdW5kZWZpbmVkIGluIElFOC5cbiAgICAgIHZhciBkb2MgPSBuYXRpdmVFdmVudFRhcmdldC5vd25lckRvY3VtZW50O1xuICAgICAgaWYgKGRvYykge1xuICAgICAgICB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbiA9IHdpbmRvdztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZnJvbTtcbiAgICB2YXIgdG87XG4gICAgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcE1vdXNlT3V0Jykge1xuICAgICAgZnJvbSA9IHRhcmdldEluc3Q7XG4gICAgICB2YXIgcmVsYXRlZCA9IG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQudG9FbGVtZW50O1xuICAgICAgdG8gPSByZWxhdGVkID8gUmVhY3RET01Db21wb25lbnRUcmVlLmdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHJlbGF0ZWQpIDogbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTW92aW5nIHRvIGEgbm9kZSBmcm9tIG91dHNpZGUgdGhlIHdpbmRvdy5cbiAgICAgIGZyb20gPSBudWxsO1xuICAgICAgdG8gPSB0YXJnZXRJbnN0O1xuICAgIH1cblxuICAgIGlmIChmcm9tID09PSB0bykge1xuICAgICAgLy8gTm90aGluZyBwZXJ0YWlucyB0byBvdXIgbWFuYWdlZCBjb21wb25lbnRzLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGZyb21Ob2RlID0gZnJvbSA9PSBudWxsID8gd2luIDogUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoZnJvbSk7XG4gICAgdmFyIHRvTm9kZSA9IHRvID09IG51bGwgPyB3aW4gOiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0byk7XG5cbiAgICB2YXIgbGVhdmUgPSBTeW50aGV0aWNNb3VzZUV2ZW50LmdldFBvb2xlZChldmVudFR5cGVzLm1vdXNlTGVhdmUsIGZyb20sIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgbGVhdmUudHlwZSA9ICdtb3VzZWxlYXZlJztcbiAgICBsZWF2ZS50YXJnZXQgPSBmcm9tTm9kZTtcbiAgICBsZWF2ZS5yZWxhdGVkVGFyZ2V0ID0gdG9Ob2RlO1xuXG4gICAgdmFyIGVudGVyID0gU3ludGhldGljTW91c2VFdmVudC5nZXRQb29sZWQoZXZlbnRUeXBlcy5tb3VzZUVudGVyLCB0bywgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBlbnRlci50eXBlID0gJ21vdXNlZW50ZXInO1xuICAgIGVudGVyLnRhcmdldCA9IHRvTm9kZTtcbiAgICBlbnRlci5yZWxhdGVkVGFyZ2V0ID0gZnJvbU5vZGU7XG5cbiAgICBFdmVudFByb3BhZ2F0b3JzLmFjY3VtdWxhdGVFbnRlckxlYXZlRGlzcGF0Y2hlcyhsZWF2ZSwgZW50ZXIsIGZyb20sIHRvKTtcblxuICAgIHJldHVybiBbbGVhdmUsIGVudGVyXTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFbnRlckxlYXZlRXZlbnRQbHVnaW47IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIERPTVByb3BlcnR5ID0gcmVxdWlyZSgnLi9ET01Qcm9wZXJ0eScpO1xuXG52YXIgTVVTVF9VU0VfUFJPUEVSVFkgPSBET01Qcm9wZXJ0eS5pbmplY3Rpb24uTVVTVF9VU0VfUFJPUEVSVFk7XG52YXIgSEFTX0JPT0xFQU5fVkFMVUUgPSBET01Qcm9wZXJ0eS5pbmplY3Rpb24uSEFTX0JPT0xFQU5fVkFMVUU7XG52YXIgSEFTX05VTUVSSUNfVkFMVUUgPSBET01Qcm9wZXJ0eS5pbmplY3Rpb24uSEFTX05VTUVSSUNfVkFMVUU7XG52YXIgSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUgPSBET01Qcm9wZXJ0eS5pbmplY3Rpb24uSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUU7XG52YXIgSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRSA9IERPTVByb3BlcnR5LmluamVjdGlvbi5IQVNfT1ZFUkxPQURFRF9CT09MRUFOX1ZBTFVFO1xuXG52YXIgSFRNTERPTVByb3BlcnR5Q29uZmlnID0ge1xuICBpc0N1c3RvbUF0dHJpYnV0ZTogUmVnRXhwLnByb3RvdHlwZS50ZXN0LmJpbmQobmV3IFJlZ0V4cCgnXihkYXRhfGFyaWEpLVsnICsgRE9NUHJvcGVydHkuQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKSksXG4gIFByb3BlcnRpZXM6IHtcbiAgICAvKipcbiAgICAgKiBTdGFuZGFyZCBQcm9wZXJ0aWVzXG4gICAgICovXG4gICAgYWNjZXB0OiAwLFxuICAgIGFjY2VwdENoYXJzZXQ6IDAsXG4gICAgYWNjZXNzS2V5OiAwLFxuICAgIGFjdGlvbjogMCxcbiAgICBhbGxvd0Z1bGxTY3JlZW46IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGFsbG93VHJhbnNwYXJlbmN5OiAwLFxuICAgIGFsdDogMCxcbiAgICAvLyBzcGVjaWZpZXMgdGFyZ2V0IGNvbnRleHQgZm9yIGxpbmtzIHdpdGggYHByZWxvYWRgIHR5cGVcbiAgICBhczogMCxcbiAgICBhc3luYzogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgYXV0b0NvbXBsZXRlOiAwLFxuICAgIC8vIGF1dG9Gb2N1cyBpcyBwb2x5ZmlsbGVkL25vcm1hbGl6ZWQgYnkgQXV0b0ZvY3VzVXRpbHNcbiAgICAvLyBhdXRvRm9jdXM6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGF1dG9QbGF5OiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBjYXB0dXJlOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBjZWxsUGFkZGluZzogMCxcbiAgICBjZWxsU3BhY2luZzogMCxcbiAgICBjaGFyU2V0OiAwLFxuICAgIGNoYWxsZW5nZTogMCxcbiAgICBjaGVja2VkOiBNVVNUX1VTRV9QUk9QRVJUWSB8IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGNpdGU6IDAsXG4gICAgY2xhc3NJRDogMCxcbiAgICBjbGFzc05hbWU6IDAsXG4gICAgY29sczogSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUsXG4gICAgY29sU3BhbjogMCxcbiAgICBjb250ZW50OiAwLFxuICAgIGNvbnRlbnRFZGl0YWJsZTogMCxcbiAgICBjb250ZXh0TWVudTogMCxcbiAgICBjb250cm9sczogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgY29vcmRzOiAwLFxuICAgIGNyb3NzT3JpZ2luOiAwLFxuICAgIGRhdGE6IDAsIC8vIEZvciBgPG9iamVjdCAvPmAgYWN0cyBhcyBgc3JjYC5cbiAgICBkYXRlVGltZTogMCxcbiAgICAnZGVmYXVsdCc6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGRlZmVyOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBkaXI6IDAsXG4gICAgZGlzYWJsZWQ6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGRvd25sb2FkOiBIQVNfT1ZFUkxPQURFRF9CT09MRUFOX1ZBTFVFLFxuICAgIGRyYWdnYWJsZTogMCxcbiAgICBlbmNUeXBlOiAwLFxuICAgIGZvcm06IDAsXG4gICAgZm9ybUFjdGlvbjogMCxcbiAgICBmb3JtRW5jVHlwZTogMCxcbiAgICBmb3JtTWV0aG9kOiAwLFxuICAgIGZvcm1Ob1ZhbGlkYXRlOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBmb3JtVGFyZ2V0OiAwLFxuICAgIGZyYW1lQm9yZGVyOiAwLFxuICAgIGhlYWRlcnM6IDAsXG4gICAgaGVpZ2h0OiAwLFxuICAgIGhpZGRlbjogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgaGlnaDogMCxcbiAgICBocmVmOiAwLFxuICAgIGhyZWZMYW5nOiAwLFxuICAgIGh0bWxGb3I6IDAsXG4gICAgaHR0cEVxdWl2OiAwLFxuICAgIGljb246IDAsXG4gICAgaWQ6IDAsXG4gICAgaW5wdXRNb2RlOiAwLFxuICAgIGludGVncml0eTogMCxcbiAgICBpczogMCxcbiAgICBrZXlQYXJhbXM6IDAsXG4gICAga2V5VHlwZTogMCxcbiAgICBraW5kOiAwLFxuICAgIGxhYmVsOiAwLFxuICAgIGxhbmc6IDAsXG4gICAgbGlzdDogMCxcbiAgICBsb29wOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBsb3c6IDAsXG4gICAgbWFuaWZlc3Q6IDAsXG4gICAgbWFyZ2luSGVpZ2h0OiAwLFxuICAgIG1hcmdpbldpZHRoOiAwLFxuICAgIG1heDogMCxcbiAgICBtYXhMZW5ndGg6IDAsXG4gICAgbWVkaWE6IDAsXG4gICAgbWVkaWFHcm91cDogMCxcbiAgICBtZXRob2Q6IDAsXG4gICAgbWluOiAwLFxuICAgIG1pbkxlbmd0aDogMCxcbiAgICAvLyBDYXV0aW9uOyBgb3B0aW9uLnNlbGVjdGVkYCBpcyBub3QgdXBkYXRlZCBpZiBgc2VsZWN0Lm11bHRpcGxlYCBpc1xuICAgIC8vIGRpc2FibGVkIHdpdGggYHJlbW92ZUF0dHJpYnV0ZWAuXG4gICAgbXVsdGlwbGU6IE1VU1RfVVNFX1BST1BFUlRZIHwgSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgbXV0ZWQ6IE1VU1RfVVNFX1BST1BFUlRZIHwgSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgbmFtZTogMCxcbiAgICBub25jZTogMCxcbiAgICBub1ZhbGlkYXRlOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBvcGVuOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBvcHRpbXVtOiAwLFxuICAgIHBhdHRlcm46IDAsXG4gICAgcGxhY2Vob2xkZXI6IDAsXG4gICAgcGxheXNJbmxpbmU6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIHBvc3RlcjogMCxcbiAgICBwcmVsb2FkOiAwLFxuICAgIHByb2ZpbGU6IDAsXG4gICAgcmFkaW9Hcm91cDogMCxcbiAgICByZWFkT25seTogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgcmVmZXJyZXJQb2xpY3k6IDAsXG4gICAgcmVsOiAwLFxuICAgIHJlcXVpcmVkOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICByZXZlcnNlZDogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgcm9sZTogMCxcbiAgICByb3dzOiBIQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRSxcbiAgICByb3dTcGFuOiBIQVNfTlVNRVJJQ19WQUxVRSxcbiAgICBzYW5kYm94OiAwLFxuICAgIHNjb3BlOiAwLFxuICAgIHNjb3BlZDogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgc2Nyb2xsaW5nOiAwLFxuICAgIHNlYW1sZXNzOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBzZWxlY3RlZDogTVVTVF9VU0VfUFJPUEVSVFkgfCBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBzaGFwZTogMCxcbiAgICBzaXplOiBIQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRSxcbiAgICBzaXplczogMCxcbiAgICBzcGFuOiBIQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRSxcbiAgICBzcGVsbENoZWNrOiAwLFxuICAgIHNyYzogMCxcbiAgICBzcmNEb2M6IDAsXG4gICAgc3JjTGFuZzogMCxcbiAgICBzcmNTZXQ6IDAsXG4gICAgc3RhcnQ6IEhBU19OVU1FUklDX1ZBTFVFLFxuICAgIHN0ZXA6IDAsXG4gICAgc3R5bGU6IDAsXG4gICAgc3VtbWFyeTogMCxcbiAgICB0YWJJbmRleDogMCxcbiAgICB0YXJnZXQ6IDAsXG4gICAgdGl0bGU6IDAsXG4gICAgLy8gU2V0dGluZyAudHlwZSB0aHJvd3Mgb24gbm9uLTxpbnB1dD4gdGFnc1xuICAgIHR5cGU6IDAsXG4gICAgdXNlTWFwOiAwLFxuICAgIHZhbHVlOiAwLFxuICAgIHdpZHRoOiAwLFxuICAgIHdtb2RlOiAwLFxuICAgIHdyYXA6IDAsXG5cbiAgICAvKipcbiAgICAgKiBSREZhIFByb3BlcnRpZXNcbiAgICAgKi9cbiAgICBhYm91dDogMCxcbiAgICBkYXRhdHlwZTogMCxcbiAgICBpbmxpc3Q6IDAsXG4gICAgcHJlZml4OiAwLFxuICAgIC8vIHByb3BlcnR5IGlzIGFsc28gc3VwcG9ydGVkIGZvciBPcGVuR3JhcGggaW4gbWV0YSB0YWdzLlxuICAgIHByb3BlcnR5OiAwLFxuICAgIHJlc291cmNlOiAwLFxuICAgICd0eXBlb2YnOiAwLFxuICAgIHZvY2FiOiAwLFxuXG4gICAgLyoqXG4gICAgICogTm9uLXN0YW5kYXJkIFByb3BlcnRpZXNcbiAgICAgKi9cbiAgICAvLyBhdXRvQ2FwaXRhbGl6ZSBhbmQgYXV0b0NvcnJlY3QgYXJlIHN1cHBvcnRlZCBpbiBNb2JpbGUgU2FmYXJpIGZvclxuICAgIC8vIGtleWJvYXJkIGhpbnRzLlxuICAgIGF1dG9DYXBpdGFsaXplOiAwLFxuICAgIGF1dG9Db3JyZWN0OiAwLFxuICAgIC8vIGF1dG9TYXZlIGFsbG93cyBXZWJLaXQvQmxpbmsgdG8gcGVyc2lzdCB2YWx1ZXMgb2YgaW5wdXQgZmllbGRzIG9uIHBhZ2UgcmVsb2Fkc1xuICAgIGF1dG9TYXZlOiAwLFxuICAgIC8vIGNvbG9yIGlzIGZvciBTYWZhcmkgbWFzay1pY29uIGxpbmtcbiAgICBjb2xvcjogMCxcbiAgICAvLyBpdGVtUHJvcCwgaXRlbVNjb3BlLCBpdGVtVHlwZSBhcmUgZm9yXG4gICAgLy8gTWljcm9kYXRhIHN1cHBvcnQuIFNlZSBodHRwOi8vc2NoZW1hLm9yZy9kb2NzL2dzLmh0bWxcbiAgICBpdGVtUHJvcDogMCxcbiAgICBpdGVtU2NvcGU6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGl0ZW1UeXBlOiAwLFxuICAgIC8vIGl0ZW1JRCBhbmQgaXRlbVJlZiBhcmUgZm9yIE1pY3JvZGF0YSBzdXBwb3J0IGFzIHdlbGwgYnV0XG4gICAgLy8gb25seSBzcGVjaWZpZWQgaW4gdGhlIFdIQVRXRyBzcGVjIGRvY3VtZW50LiBTZWVcbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9taWNyb2RhdGEuaHRtbCNtaWNyb2RhdGEtZG9tLWFwaVxuICAgIGl0ZW1JRDogMCxcbiAgICBpdGVtUmVmOiAwLFxuICAgIC8vIHJlc3VsdHMgc2hvdyBsb29raW5nIGdsYXNzIGljb24gYW5kIHJlY2VudCBzZWFyY2hlcyBvbiBpbnB1dFxuICAgIC8vIHNlYXJjaCBmaWVsZHMgaW4gV2ViS2l0L0JsaW5rXG4gICAgcmVzdWx0czogMCxcbiAgICAvLyBJRS1vbmx5IGF0dHJpYnV0ZSB0aGF0IHNwZWNpZmllcyBzZWN1cml0eSByZXN0cmljdGlvbnMgb24gYW4gaWZyYW1lXG4gICAgLy8gYXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIHNhbmRib3ggYXR0cmlidXRlIG9uIElFPDEwXG4gICAgc2VjdXJpdHk6IDAsXG4gICAgLy8gSUUtb25seSBhdHRyaWJ1dGUgdGhhdCBjb250cm9scyBmb2N1cyBiZWhhdmlvclxuICAgIHVuc2VsZWN0YWJsZTogMFxuICB9LFxuICBET01BdHRyaWJ1dGVOYW1lczoge1xuICAgIGFjY2VwdENoYXJzZXQ6ICdhY2NlcHQtY2hhcnNldCcsXG4gICAgY2xhc3NOYW1lOiAnY2xhc3MnLFxuICAgIGh0bWxGb3I6ICdmb3InLFxuICAgIGh0dHBFcXVpdjogJ2h0dHAtZXF1aXYnXG4gIH0sXG4gIERPTVByb3BlcnR5TmFtZXM6IHt9LFxuICBET01NdXRhdGlvbk1ldGhvZHM6IHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gKG5vZGUsIHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIE51bWJlciBpbnB1dHMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50IGR1ZSB0byBzb21lIGVkZ2UgY2FzZXMgaW5cbiAgICAgIC8vIENocm9tZS4gTGV0IGV2ZXJ5dGhpbmcgZWxzZSBhc3NpZ24gdGhlIHZhbHVlIGF0dHJpYnV0ZSBhcyBub3JtYWwuXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyNTMjaXNzdWVjb21tZW50LTIzNjA3NDMyNlxuICAgICAgaWYgKG5vZGUudHlwZSAhPT0gJ251bWJlcicgfHwgbm9kZS5oYXNBdHRyaWJ1dGUoJ3ZhbHVlJykgPT09IGZhbHNlKSB7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCd2YWx1ZScsICcnICsgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnZhbGlkaXR5ICYmICFub2RlLnZhbGlkaXR5LmJhZElucHV0ICYmIG5vZGUub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSBub2RlKSB7XG4gICAgICAgIC8vIERvbid0IGFzc2lnbiBhbiBhdHRyaWJ1dGUgaWYgdmFsaWRhdGlvbiByZXBvcnRzIGJhZFxuICAgICAgICAvLyBpbnB1dC4gQ2hyb21lIHdpbGwgY2xlYXIgdGhlIHZhbHVlLiBBZGRpdGlvbmFsbHksIGRvbid0XG4gICAgICAgIC8vIG9wZXJhdGUgb24gaW5wdXRzIHRoYXQgaGF2ZSBmb2N1cywgb3RoZXJ3aXNlIENocm9tZSBtaWdodFxuICAgICAgICAvLyBzdHJpcCBvZmYgdHJhaWxpbmcgZGVjaW1hbCBwbGFjZXMgYW5kIGNhdXNlIHRoZSB1c2VyJ3NcbiAgICAgICAgLy8gY3Vyc29yIHBvc2l0aW9uIHRvIGp1bXAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEluIFJlYWN0RE9NSW5wdXQsIHdlIGhhdmUgYW4gb25CbHVyIGV2ZW50IHRoYXQgd2lsbCB0cmlnZ2VyXG4gICAgICAgIC8vIHRoaXMgZnVuY3Rpb24gYWdhaW4gd2hlbiBmb2N1cyBpcyBsb3N0LlxuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgndmFsdWUnLCAnJyArIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gSFRNTERPTVByb3BlcnR5Q29uZmlnOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBET01OYW1lc3BhY2VzID0ge1xuICBodG1sOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsXG4gIG1hdGhtbDogJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnLFxuICBzdmc6ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zydcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRE9NTmFtZXNwYWNlczsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuLyogZ2xvYmFscyBNU0FwcCAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ3JlYXRlIGEgZnVuY3Rpb24gd2hpY2ggaGFzICd1bnNhZmUnIHByaXZpbGVnZXMgKHJlcXVpcmVkIGJ5IHdpbmRvd3M4IGFwcHMpXG4gKi9cblxudmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSBmdW5jdGlvbiAoZnVuYykge1xuICBpZiAodHlwZW9mIE1TQXBwICE9PSAndW5kZWZpbmVkJyAmJiBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMykge1xuICAgICAgTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuYyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xudmFyIERPTU5hbWVzcGFjZXMgPSByZXF1aXJlKCcuL0RPTU5hbWVzcGFjZXMnKTtcblxudmFyIFdISVRFU1BBQ0VfVEVTVCA9IC9eWyBcXHJcXG5cXHRcXGZdLztcbnZhciBOT05WSVNJQkxFX1RFU1QgPSAvPCghLS18bGlua3xub3NjcmlwdHxtZXRhfHNjcmlwdHxzdHlsZSlbIFxcclxcblxcdFxcZlxcLz5dLztcblxudmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSByZXF1aXJlKCcuL2NyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24nKTtcblxuLy8gU1ZHIHRlbXAgY29udGFpbmVyIGZvciBJRSBsYWNraW5nIGlubmVySFRNTFxudmFyIHJldXNhYmxlU1ZHQ29udGFpbmVyO1xuXG4vKipcbiAqIFNldCB0aGUgaW5uZXJIVE1MIHByb3BlcnR5IG9mIGEgbm9kZSwgZW5zdXJpbmcgdGhhdCB3aGl0ZXNwYWNlIGlzIHByZXNlcnZlZFxuICogZXZlbiBpbiBJRTguXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuICogQGludGVybmFsXG4gKi9cbnZhciBzZXRJbm5lckhUTUwgPSBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uIChub2RlLCBodG1sKSB7XG4gIC8vIElFIGRvZXMgbm90IGhhdmUgaW5uZXJIVE1MIGZvciBTVkcgbm9kZXMsIHNvIGluc3RlYWQgd2UgaW5qZWN0IHRoZVxuICAvLyBuZXcgbWFya3VwIGluIGEgdGVtcCBub2RlIGFuZCB0aGVuIG1vdmUgdGhlIGNoaWxkIG5vZGVzIGFjcm9zcyBpbnRvXG4gIC8vIHRoZSB0YXJnZXQgbm9kZVxuICBpZiAobm9kZS5uYW1lc3BhY2VVUkkgPT09IERPTU5hbWVzcGFjZXMuc3ZnICYmICEoJ2lubmVySFRNTCcgaW4gbm9kZSkpIHtcbiAgICByZXVzYWJsZVNWR0NvbnRhaW5lciA9IHJldXNhYmxlU1ZHQ29udGFpbmVyIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHJldXNhYmxlU1ZHQ29udGFpbmVyLmlubmVySFRNTCA9ICc8c3ZnPicgKyBodG1sICsgJzwvc3ZnPic7XG4gICAgdmFyIHN2Z05vZGUgPSByZXVzYWJsZVNWR0NvbnRhaW5lci5maXJzdENoaWxkO1xuICAgIHdoaWxlIChzdmdOb2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoc3ZnTm9kZS5maXJzdENoaWxkKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbm9kZS5pbm5lckhUTUwgPSBodG1sO1xuICB9XG59KTtcblxuaWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkge1xuICAvLyBJRTg6IFdoZW4gdXBkYXRpbmcgYSBqdXN0IGNyZWF0ZWQgbm9kZSB3aXRoIGlubmVySFRNTCBvbmx5IGxlYWRpbmdcbiAgLy8gd2hpdGVzcGFjZSBpcyByZW1vdmVkLiBXaGVuIHVwZGF0aW5nIGFuIGV4aXN0aW5nIG5vZGUgd2l0aCBpbm5lckhUTUxcbiAgLy8gd2hpdGVzcGFjZSBpbiByb290IFRleHROb2RlcyBpcyBhbHNvIGNvbGxhcHNlZC5cbiAgLy8gQHNlZSBxdWlya3Ntb2RlLm9yZy9idWdyZXBvcnRzL2FyY2hpdmVzLzIwMDQvMTEvaW5uZXJodG1sX2FuZF90Lmh0bWxcblxuICAvLyBGZWF0dXJlIGRldGVjdGlvbjsgb25seSBJRTggaXMga25vd24gdG8gYmVoYXZlIGltcHJvcGVybHkgbGlrZSB0aGlzLlxuICB2YXIgdGVzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdGVzdEVsZW1lbnQuaW5uZXJIVE1MID0gJyAnO1xuICBpZiAodGVzdEVsZW1lbnQuaW5uZXJIVE1MID09PSAnJykge1xuICAgIHNldElubmVySFRNTCA9IGZ1bmN0aW9uIChub2RlLCBodG1sKSB7XG4gICAgICAvLyBNYWdpYyB0aGVvcnk6IElFOCBzdXBwb3NlZGx5IGRpZmZlcmVudGlhdGVzIGJldHdlZW4gYWRkZWQgYW5kIHVwZGF0ZWRcbiAgICAgIC8vIG5vZGVzIHdoZW4gcHJvY2Vzc2luZyBpbm5lckhUTUwsIGlubmVySFRNTCBvbiB1cGRhdGVkIG5vZGVzIHN1ZmZlcnNcbiAgICAgIC8vIGZyb20gd29yc2Ugd2hpdGVzcGFjZSBiZWhhdmlvci4gUmUtYWRkaW5nIGEgbm9kZSBsaWtlIHRoaXMgdHJpZ2dlcnNcbiAgICAgIC8vIHRoZSBpbml0aWFsIGFuZCBtb3JlIGZhdm9yYWJsZSB3aGl0ZXNwYWNlIGJlaGF2aW9yLlxuICAgICAgLy8gVE9ETzogV2hhdCB0byBkbyBvbiBhIGRldGFjaGVkIG5vZGU/XG4gICAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobm9kZSwgbm9kZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdlIGFsc28gaW1wbGVtZW50IGEgd29ya2Fyb3VuZCBmb3Igbm9uLXZpc2libGUgdGFncyBkaXNhcHBlYXJpbmcgaW50b1xuICAgICAgLy8gdGhpbiBhaXIgb24gSUU4LCB0aGlzIG9ubHkgaGFwcGVucyBpZiB0aGVyZSBpcyBubyB2aXNpYmxlIHRleHRcbiAgICAgIC8vIGluLWZyb250IG9mIHRoZSBub24tdmlzaWJsZSB0YWdzLiBQaWdneWJhY2sgb24gdGhlIHdoaXRlc3BhY2UgZml4XG4gICAgICAvLyBhbmQgc2ltcGx5IGNoZWNrIGlmIGFueSBub24tdmlzaWJsZSB0YWdzIGFwcGVhciBpbiB0aGUgc291cmNlLlxuICAgICAgaWYgKFdISVRFU1BBQ0VfVEVTVC50ZXN0KGh0bWwpIHx8IGh0bWxbMF0gPT09ICc8JyAmJiBOT05WSVNJQkxFX1RFU1QudGVzdChodG1sKSkge1xuICAgICAgICAvLyBSZWNvdmVyIGxlYWRpbmcgd2hpdGVzcGFjZSBieSB0ZW1wb3JhcmlseSBwcmVwZW5kaW5nIGFueSBjaGFyYWN0ZXIuXG4gICAgICAgIC8vIFxcdUZFRkYgaGFzIHRoZSBwb3RlbnRpYWwgYWR2YW50YWdlIG9mIGJlaW5nIHplcm8td2lkdGgvaW52aXNpYmxlLlxuICAgICAgICAvLyBVZ2xpZnlKUyBkcm9wcyBVK0ZFRkYgY2hhcnMgd2hlbiBwYXJzaW5nLCBzbyB1c2UgU3RyaW5nLmZyb21DaGFyQ29kZVxuICAgICAgICAvLyBpbiBob3BlcyB0aGF0IHRoaXMgaXMgcHJlc2VydmVkIGV2ZW4gaWYgXCJcXHVGRUZGXCIgaXMgdHJhbnNmb3JtZWQgdG9cbiAgICAgICAgLy8gdGhlIGFjdHVhbCBVbmljb2RlIGNoYXJhY3RlciAoYnkgQmFiZWwsIGZvciBleGFtcGxlKS5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21pc2hvby9VZ2xpZnlKUzIvYmxvYi92Mi40LjIwL2xpYi9wYXJzZS5qcyNMMjE2XG4gICAgICAgIG5vZGUuaW5uZXJIVE1MID0gU3RyaW5nLmZyb21DaGFyQ29kZSgweGZlZmYpICsgaHRtbDtcblxuICAgICAgICAvLyBkZWxldGVEYXRhIGxlYXZlcyBhbiBlbXB0eSBgVGV4dE5vZGVgIHdoaWNoIG9mZnNldHMgdGhlIGluZGV4IG9mIGFsbFxuICAgICAgICAvLyBjaGlsZHJlbi4gRGVmaW5pdGVseSB3YW50IHRvIGF2b2lkIHRoaXMuXG4gICAgICAgIHZhciB0ZXh0Tm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKHRleHROb2RlLmRhdGEubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgbm9kZS5yZW1vdmVDaGlsZCh0ZXh0Tm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGV4dE5vZGUuZGVsZXRlRGF0YSgwLCAxKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgdGVzdEVsZW1lbnQgPSBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldElubmVySFRNTDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE2LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBCYXNlZCBvbiB0aGUgZXNjYXBlLWh0bWwgbGlicmFyeSwgd2hpY2ggaXMgdXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgYmVsb3c6XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodCAoYykgMjAxNSBBbmRyZWFzIEx1YmJlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGlhbmNoZW5nIFwiVGltb3RoeVwiIEd1XG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nXG4gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbiAqICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbiAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbiAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0b1xuICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvXG4gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmVcbiAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG4gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWVxuICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCxcbiAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFXG4gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vLyBjb2RlIGNvcGllZCBhbmQgbW9kaWZpZWQgZnJvbSBlc2NhcGUtaHRtbFxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgbWF0Y2hIdG1sUmVnRXhwID0gL1tcIicmPD5dLztcblxuLyoqXG4gKiBFc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbiBzdHJpbmcgb2YgaHRtbC5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGVzY2FwZSBmb3IgaW5zZXJ0aW5nIGludG8gSFRNTFxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGVzY2FwZUh0bWwoc3RyaW5nKSB7XG4gIHZhciBzdHIgPSAnJyArIHN0cmluZztcbiAgdmFyIG1hdGNoID0gbWF0Y2hIdG1sUmVnRXhwLmV4ZWMoc3RyKTtcblxuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIHZhciBlc2NhcGU7XG4gIHZhciBodG1sID0gJyc7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsYXN0SW5kZXggPSAwO1xuXG4gIGZvciAoaW5kZXggPSBtYXRjaC5pbmRleDsgaW5kZXggPCBzdHIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgc3dpdGNoIChzdHIuY2hhckNvZGVBdChpbmRleCkpIHtcbiAgICAgIGNhc2UgMzQ6XG4gICAgICAgIC8vIFwiXG4gICAgICAgIGVzY2FwZSA9ICcmcXVvdDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzg6XG4gICAgICAgIC8vICZcbiAgICAgICAgZXNjYXBlID0gJyZhbXA7JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM5OlxuICAgICAgICAvLyAnXG4gICAgICAgIGVzY2FwZSA9ICcmI3gyNzsnOyAvLyBtb2RpZmllZCBmcm9tIGVzY2FwZS1odG1sOyB1c2VkIHRvIGJlICcmIzM5J1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjA6XG4gICAgICAgIC8vIDxcbiAgICAgICAgZXNjYXBlID0gJyZsdDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjI6XG4gICAgICAgIC8vID5cbiAgICAgICAgZXNjYXBlID0gJyZndDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChsYXN0SW5kZXggIT09IGluZGV4KSB7XG4gICAgICBodG1sICs9IHN0ci5zdWJzdHJpbmcobGFzdEluZGV4LCBpbmRleCk7XG4gICAgfVxuXG4gICAgbGFzdEluZGV4ID0gaW5kZXggKyAxO1xuICAgIGh0bWwgKz0gZXNjYXBlO1xuICB9XG5cbiAgcmV0dXJuIGxhc3RJbmRleCAhPT0gaW5kZXggPyBodG1sICsgc3RyLnN1YnN0cmluZyhsYXN0SW5kZXgsIGluZGV4KSA6IGh0bWw7XG59XG4vLyBlbmQgY29kZSBjb3BpZWQgYW5kIG1vZGlmaWVkIGZyb20gZXNjYXBlLWh0bWxcblxuLyoqXG4gKiBFc2NhcGVzIHRleHQgdG8gcHJldmVudCBzY3JpcHRpbmcgYXR0YWNrcy5cbiAqXG4gKiBAcGFyYW0geyp9IHRleHQgVGV4dCB2YWx1ZSB0byBlc2NhcGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEFuIGVzY2FwZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIodGV4dCkge1xuICBpZiAodHlwZW9mIHRleHQgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgdGV4dCA9PT0gJ251bWJlcicpIHtcbiAgICAvLyB0aGlzIHNob3J0Y2lyY3VpdCBoZWxwcyBwZXJmIGZvciB0eXBlcyB0aGF0IHdlIGtub3cgd2lsbCBuZXZlciBoYXZlXG4gICAgLy8gc3BlY2lhbCBjaGFyYWN0ZXJzLCBlc3BlY2lhbGx5IGdpdmVuIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9mdGVuXG4gICAgLy8gZm9yIG51bWVyaWMgZG9tIGlkcy5cbiAgICByZXR1cm4gJycgKyB0ZXh0O1xuICB9XG4gIHJldHVybiBlc2NhcGVIdG1sKHRleHQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3NlcjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xudmFyIGVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3NlciA9IHJlcXVpcmUoJy4vZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyJyk7XG52YXIgc2V0SW5uZXJIVE1MID0gcmVxdWlyZSgnLi9zZXRJbm5lckhUTUwnKTtcblxuLyoqXG4gKiBTZXQgdGhlIHRleHRDb250ZW50IHByb3BlcnR5IG9mIGEgbm9kZSwgZW5zdXJpbmcgdGhhdCB3aGl0ZXNwYWNlIGlzIHByZXNlcnZlZFxuICogZXZlbiBpbiBJRTguIGlubmVyVGV4dCBpcyBhIHBvb3Igc3Vic3RpdHV0ZSBmb3IgdGV4dENvbnRlbnQgYW5kLCBhbW9uZyBtYW55XG4gKiBpc3N1ZXMsIGluc2VydHMgPGJyPiBpbnN0ZWFkIG9mIHRoZSBsaXRlcmFsIG5ld2xpbmUgY2hhcnMuIGlubmVySFRNTCBiZWhhdmVzXG4gKiBhcyBpdCBzaG91bGQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICogQGludGVybmFsXG4gKi9cbnZhciBzZXRUZXh0Q29udGVudCA9IGZ1bmN0aW9uIChub2RlLCB0ZXh0KSB7XG4gIGlmICh0ZXh0KSB7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XG5cbiAgICBpZiAoZmlyc3RDaGlsZCAmJiBmaXJzdENoaWxkID09PSBub2RlLmxhc3RDaGlsZCAmJiBmaXJzdENoaWxkLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICBmaXJzdENoaWxkLm5vZGVWYWx1ZSA9IHRleHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIG5vZGUudGV4dENvbnRlbnQgPSB0ZXh0O1xufTtcblxuaWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkge1xuICBpZiAoISgndGV4dENvbnRlbnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpIHtcbiAgICBzZXRUZXh0Q29udGVudCA9IGZ1bmN0aW9uIChub2RlLCB0ZXh0KSB7XG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICBub2RlLm5vZGVWYWx1ZSA9IHRleHQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNldElubmVySFRNTChub2RlLCBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIodGV4dCkpO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRUZXh0Q29udGVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE1LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NTmFtZXNwYWNlcyA9IHJlcXVpcmUoJy4vRE9NTmFtZXNwYWNlcycpO1xudmFyIHNldElubmVySFRNTCA9IHJlcXVpcmUoJy4vc2V0SW5uZXJIVE1MJyk7XG5cbnZhciBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uID0gcmVxdWlyZSgnLi9jcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uJyk7XG52YXIgc2V0VGV4dENvbnRlbnQgPSByZXF1aXJlKCcuL3NldFRleHRDb250ZW50Jyk7XG5cbnZhciBFTEVNRU5UX05PREVfVFlQRSA9IDE7XG52YXIgRE9DVU1FTlRfRlJBR01FTlRfTk9ERV9UWVBFID0gMTE7XG5cbi8qKlxuICogSW4gSUUgKDgtMTEpIGFuZCBFZGdlLCBhcHBlbmRpbmcgbm9kZXMgd2l0aCBubyBjaGlsZHJlbiBpcyBkcmFtYXRpY2FsbHlcbiAqIGZhc3RlciB0aGFuIGFwcGVuZGluZyBhIGZ1bGwgc3VidHJlZSwgc28gd2UgZXNzZW50aWFsbHkgcXVldWUgdXAgdGhlXG4gKiAuYXBwZW5kQ2hpbGQgY2FsbHMgaGVyZSBhbmQgYXBwbHkgdGhlbSBzbyBlYWNoIG5vZGUgaXMgYWRkZWQgdG8gaXRzIHBhcmVudFxuICogYmVmb3JlIGFueSBjaGlsZHJlbiBhcmUgYWRkZWQuXG4gKlxuICogSW4gb3RoZXIgYnJvd3NlcnMsIGRvaW5nIHNvIGlzIHNsb3dlciBvciBuZXV0cmFsIGNvbXBhcmVkIHRvIHRoZSBvdGhlciBvcmRlclxuICogKGluIEZpcmVmb3gsIHR3aWNlIGFzIHNsb3cpIHNvIHdlIG9ubHkgZG8gdGhpcyBpbnZlcnNpb24gaW4gSUUuXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zcGljeWovaW5uZXJodG1sLXZzLWNyZWF0ZWVsZW1lbnQtdnMtY2xvbmVub2RlLlxuICovXG52YXIgZW5hYmxlTGF6eSA9IHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG5hdmlnYXRvci51c2VyQWdlbnQgPT09ICdzdHJpbmcnICYmIC9cXGJFZGdlXFwvXFxkLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuXG5mdW5jdGlvbiBpbnNlcnRUcmVlQ2hpbGRyZW4odHJlZSkge1xuICBpZiAoIWVuYWJsZUxhenkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG5vZGUgPSB0cmVlLm5vZGU7XG4gIHZhciBjaGlsZHJlbiA9IHRyZWUuY2hpbGRyZW47XG4gIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpbnNlcnRUcmVlQmVmb3JlKG5vZGUsIGNoaWxkcmVuW2ldLCBudWxsKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHJlZS5odG1sICE9IG51bGwpIHtcbiAgICBzZXRJbm5lckhUTUwobm9kZSwgdHJlZS5odG1sKTtcbiAgfSBlbHNlIGlmICh0cmVlLnRleHQgIT0gbnVsbCkge1xuICAgIHNldFRleHRDb250ZW50KG5vZGUsIHRyZWUudGV4dCk7XG4gIH1cbn1cblxudmFyIGluc2VydFRyZWVCZWZvcmUgPSBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uIChwYXJlbnROb2RlLCB0cmVlLCByZWZlcmVuY2VOb2RlKSB7XG4gIC8vIERvY3VtZW50RnJhZ21lbnRzIGFyZW4ndCBhY3R1YWxseSBwYXJ0IG9mIHRoZSBET00gYWZ0ZXIgaW5zZXJ0aW9uIHNvXG4gIC8vIGFwcGVuZGluZyBjaGlsZHJlbiB3b24ndCB1cGRhdGUgdGhlIERPTS4gV2UgbmVlZCB0byBlbnN1cmUgdGhlIGZyYWdtZW50XG4gIC8vIGlzIHByb3Blcmx5IHBvcHVsYXRlZCBmaXJzdCwgYnJlYWtpbmcgb3V0IG9mIG91ciBsYXp5IGFwcHJvYWNoIGZvciBqdXN0XG4gIC8vIHRoaXMgbGV2ZWwuIEFsc28sIHNvbWUgPG9iamVjdD4gcGx1Z2lucyAobGlrZSBGbGFzaCBQbGF5ZXIpIHdpbGwgcmVhZFxuICAvLyA8cGFyYW0+IG5vZGVzIGltbWVkaWF0ZWx5IHVwb24gaW5zZXJ0aW9uIGludG8gdGhlIERPTSwgc28gPG9iamVjdD5cbiAgLy8gbXVzdCBhbHNvIGJlIHBvcHVsYXRlZCBwcmlvciB0byBpbnNlcnRpb24gaW50byB0aGUgRE9NLlxuICBpZiAodHJlZS5ub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFX1RZUEUgfHwgdHJlZS5ub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREVfVFlQRSAmJiB0cmVlLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ29iamVjdCcgJiYgKHRyZWUubm9kZS5uYW1lc3BhY2VVUkkgPT0gbnVsbCB8fCB0cmVlLm5vZGUubmFtZXNwYWNlVVJJID09PSBET01OYW1lc3BhY2VzLmh0bWwpKSB7XG4gICAgaW5zZXJ0VHJlZUNoaWxkcmVuKHRyZWUpO1xuICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRyZWUubm9kZSwgcmVmZXJlbmNlTm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodHJlZS5ub2RlLCByZWZlcmVuY2VOb2RlKTtcbiAgICBpbnNlcnRUcmVlQ2hpbGRyZW4odHJlZSk7XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiByZXBsYWNlQ2hpbGRXaXRoVHJlZShvbGROb2RlLCBuZXdUcmVlKSB7XG4gIG9sZE5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3VHJlZS5ub2RlLCBvbGROb2RlKTtcbiAgaW5zZXJ0VHJlZUNoaWxkcmVuKG5ld1RyZWUpO1xufVxuXG5mdW5jdGlvbiBxdWV1ZUNoaWxkKHBhcmVudFRyZWUsIGNoaWxkVHJlZSkge1xuICBpZiAoZW5hYmxlTGF6eSkge1xuICAgIHBhcmVudFRyZWUuY2hpbGRyZW4ucHVzaChjaGlsZFRyZWUpO1xuICB9IGVsc2Uge1xuICAgIHBhcmVudFRyZWUubm9kZS5hcHBlbmRDaGlsZChjaGlsZFRyZWUubm9kZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcXVldWVIVE1MKHRyZWUsIGh0bWwpIHtcbiAgaWYgKGVuYWJsZUxhenkpIHtcbiAgICB0cmVlLmh0bWwgPSBodG1sO1xuICB9IGVsc2Uge1xuICAgIHNldElubmVySFRNTCh0cmVlLm5vZGUsIGh0bWwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHF1ZXVlVGV4dCh0cmVlLCB0ZXh0KSB7XG4gIGlmIChlbmFibGVMYXp5KSB7XG4gICAgdHJlZS50ZXh0ID0gdGV4dDtcbiAgfSBlbHNlIHtcbiAgICBzZXRUZXh0Q29udGVudCh0cmVlLm5vZGUsIHRleHQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gdGhpcy5ub2RlLm5vZGVOYW1lO1xufVxuXG5mdW5jdGlvbiBET01MYXp5VHJlZShub2RlKSB7XG4gIHJldHVybiB7XG4gICAgbm9kZTogbm9kZSxcbiAgICBjaGlsZHJlbjogW10sXG4gICAgaHRtbDogbnVsbCxcbiAgICB0ZXh0OiBudWxsLFxuICAgIHRvU3RyaW5nOiB0b1N0cmluZ1xuICB9O1xufVxuXG5ET01MYXp5VHJlZS5pbnNlcnRUcmVlQmVmb3JlID0gaW5zZXJ0VHJlZUJlZm9yZTtcbkRPTUxhenlUcmVlLnJlcGxhY2VDaGlsZFdpdGhUcmVlID0gcmVwbGFjZUNoaWxkV2l0aFRyZWU7XG5ET01MYXp5VHJlZS5xdWV1ZUNoaWxkID0gcXVldWVDaGlsZDtcbkRPTUxhenlUcmVlLnF1ZXVlSFRNTCA9IHF1ZXVlSFRNTDtcbkRPTUxhenlUcmVlLnF1ZXVlVGV4dCA9IHF1ZXVlVGV4dDtcblxubW9kdWxlLmV4cG9ydHMgPSBET01MYXp5VHJlZTsiLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCcuL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIENvbnZlcnQgYXJyYXktbGlrZSBvYmplY3RzIHRvIGFycmF5cy5cbiAqXG4gKiBUaGlzIEFQSSBhc3N1bWVzIHRoZSBjYWxsZXIga25vd3MgdGhlIGNvbnRlbnRzIG9mIHRoZSBkYXRhIHR5cGUuIEZvciBsZXNzXG4gKiB3ZWxsIGRlZmluZWQgaW5wdXRzIHVzZSBjcmVhdGVBcnJheUZyb21NaXhlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdHxmdW5jdGlvbnxmaWxlbGlzdH0gb2JqXG4gKiBAcmV0dXJuIHthcnJheX1cbiAqL1xuZnVuY3Rpb24gdG9BcnJheShvYmopIHtcbiAgdmFyIGxlbmd0aCA9IG9iai5sZW5ndGg7XG5cbiAgLy8gU29tZSBicm93c2VycyBidWlsdGluIG9iamVjdHMgY2FuIHJlcG9ydCB0eXBlb2YgJ2Z1bmN0aW9uJyAoZS5nLiBOb2RlTGlzdFxuICAvLyBpbiBvbGQgdmVyc2lvbnMgb2YgU2FmYXJpKS5cbiAgISghQXJyYXkuaXNBcnJheShvYmopICYmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyB8fCB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndG9BcnJheTogQXJyYXktbGlrZSBvYmplY3QgZXhwZWN0ZWQnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG5cbiAgISh0eXBlb2YgbGVuZ3RoID09PSAnbnVtYmVyJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndG9BcnJheTogT2JqZWN0IG5lZWRzIGEgbGVuZ3RoIHByb3BlcnR5JykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuXG4gICEobGVuZ3RoID09PSAwIHx8IGxlbmd0aCAtIDEgaW4gb2JqKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd0b0FycmF5OiBPYmplY3Qgc2hvdWxkIGhhdmUga2V5cyBmb3IgaW5kaWNlcycpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcblxuICAhKHR5cGVvZiBvYmouY2FsbGVlICE9PSAnZnVuY3Rpb24nKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd0b0FycmF5OiBPYmplY3QgY2FuXFwndCBiZSBgYXJndW1lbnRzYC4gVXNlIHJlc3QgcGFyYW1zICcgKyAnKGZ1bmN0aW9uKC4uLmFyZ3MpIHt9KSBvciBBcnJheS5mcm9tKCkgaW5zdGVhZC4nKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG5cbiAgLy8gT2xkIElFIGRvZXNuJ3QgZ2l2ZSBjb2xsZWN0aW9ucyBhY2Nlc3MgdG8gaGFzT3duUHJvcGVydHkuIEFzc3VtZSBpbnB1dHNcbiAgLy8gd2l0aG91dCBtZXRob2Qgd2lsbCB0aHJvdyBkdXJpbmcgdGhlIHNsaWNlIGNhbGwgYW5kIHNraXAgc3RyYWlnaHQgdG8gdGhlXG4gIC8vIGZhbGxiYWNrLlxuICBpZiAob2JqLmhhc093blByb3BlcnR5KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChvYmopO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElFIDwgOSBkb2VzIG5vdCBzdXBwb3J0IEFycmF5I3NsaWNlIG9uIGNvbGxlY3Rpb25zIG9iamVjdHNcbiAgICB9XG4gIH1cblxuICAvLyBGYWxsIGJhY2sgdG8gY29weWluZyBrZXkgYnkga2V5LiBUaGlzIGFzc3VtZXMgYWxsIGtleXMgaGF2ZSBhIHZhbHVlLFxuICAvLyBzbyB3aWxsIG5vdCBwcmVzZXJ2ZSBzcGFyc2VseSBwb3B1bGF0ZWQgaW5wdXRzLlxuICB2YXIgcmV0ID0gQXJyYXkobGVuZ3RoKTtcbiAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGxlbmd0aDsgaWkrKykge1xuICAgIHJldFtpaV0gPSBvYmpbaWldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogUGVyZm9ybSBhIGhldXJpc3RpYyB0ZXN0IHRvIGRldGVybWluZSBpZiBhbiBvYmplY3QgaXMgXCJhcnJheS1saWtlXCIuXG4gKlxuICogICBBIG1vbmsgYXNrZWQgSm9zaHUsIGEgWmVuIG1hc3RlciwgXCJIYXMgYSBkb2cgQnVkZGhhIG5hdHVyZT9cIlxuICogICBKb3NodSByZXBsaWVkOiBcIk11LlwiXG4gKlxuICogVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIGl0cyBhcmd1bWVudCBoYXMgXCJhcnJheSBuYXR1cmVcIjogaXQgcmV0dXJuc1xuICogdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgYW4gYWN0dWFsIGFycmF5LCBhbiBgYXJndW1lbnRzJyBvYmplY3QsIG9yIGFuXG4gKiBIVE1MQ29sbGVjdGlvbiAoZS5nLiBub2RlLmNoaWxkTm9kZXMgb3Igbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgpKS5cbiAqXG4gKiBJdCB3aWxsIHJldHVybiBmYWxzZSBmb3Igb3RoZXIgYXJyYXktbGlrZSBvYmplY3RzIGxpa2UgRmlsZWxpc3QuXG4gKlxuICogQHBhcmFtIHsqfSBvYmpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGhhc0FycmF5TmF0dXJlKG9iaikge1xuICByZXR1cm4gKFxuICAgIC8vIG5vdCBudWxsL2ZhbHNlXG4gICAgISFvYmogJiYgKFxuICAgIC8vIGFycmF5cyBhcmUgb2JqZWN0cywgTm9kZUxpc3RzIGFyZSBmdW5jdGlvbnMgaW4gU2FmYXJpXG4gICAgdHlwZW9mIG9iaiA9PSAnb2JqZWN0JyB8fCB0eXBlb2Ygb2JqID09ICdmdW5jdGlvbicpICYmXG4gICAgLy8gcXVhY2tzIGxpa2UgYW4gYXJyYXlcbiAgICAnbGVuZ3RoJyBpbiBvYmogJiZcbiAgICAvLyBub3Qgd2luZG93XG4gICAgISgnc2V0SW50ZXJ2YWwnIGluIG9iaikgJiZcbiAgICAvLyBubyBET00gbm9kZSBzaG91bGQgYmUgY29uc2lkZXJlZCBhbiBhcnJheS1saWtlXG4gICAgLy8gYSAnc2VsZWN0JyBlbGVtZW50IGhhcyAnbGVuZ3RoJyBhbmQgJ2l0ZW0nIHByb3BlcnRpZXMgb24gSUU4XG4gICAgdHlwZW9mIG9iai5ub2RlVHlwZSAhPSAnbnVtYmVyJyAmJiAoXG4gICAgLy8gYSByZWFsIGFycmF5XG4gICAgQXJyYXkuaXNBcnJheShvYmopIHx8XG4gICAgLy8gYXJndW1lbnRzXG4gICAgJ2NhbGxlZScgaW4gb2JqIHx8XG4gICAgLy8gSFRNTENvbGxlY3Rpb24vTm9kZUxpc3RcbiAgICAnaXRlbScgaW4gb2JqKVxuICApO1xufVxuXG4vKipcbiAqIEVuc3VyZSB0aGF0IHRoZSBhcmd1bWVudCBpcyBhbiBhcnJheSBieSB3cmFwcGluZyBpdCBpbiBhbiBhcnJheSBpZiBpdCBpcyBub3QuXG4gKiBDcmVhdGVzIGEgY29weSBvZiB0aGUgYXJndW1lbnQgaWYgaXQgaXMgYWxyZWFkeSBhbiBhcnJheS5cbiAqXG4gKiBUaGlzIGlzIG1vc3RseSB1c2VmdWwgaWRpb21hdGljYWxseTpcbiAqXG4gKiAgIHZhciBjcmVhdGVBcnJheUZyb21NaXhlZCA9IHJlcXVpcmUoJ2NyZWF0ZUFycmF5RnJvbU1peGVkJyk7XG4gKlxuICogICBmdW5jdGlvbiB0YWtlc09uZU9yTW9yZVRoaW5ncyh0aGluZ3MpIHtcbiAqICAgICB0aGluZ3MgPSBjcmVhdGVBcnJheUZyb21NaXhlZCh0aGluZ3MpO1xuICogICAgIC4uLlxuICogICB9XG4gKlxuICogVGhpcyBhbGxvd3MgeW91IHRvIHRyZWF0IGB0aGluZ3MnIGFzIGFuIGFycmF5LCBidXQgYWNjZXB0IHNjYWxhcnMgaW4gdGhlIEFQSS5cbiAqXG4gKiBJZiB5b3UgbmVlZCB0byBjb252ZXJ0IGFuIGFycmF5LWxpa2Ugb2JqZWN0LCBsaWtlIGBhcmd1bWVudHNgLCBpbnRvIGFuIGFycmF5XG4gKiB1c2UgdG9BcnJheSBpbnN0ZWFkLlxuICpcbiAqIEBwYXJhbSB7Kn0gb2JqXG4gKiBAcmV0dXJuIHthcnJheX1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQXJyYXlGcm9tTWl4ZWQob2JqKSB7XG4gIGlmICghaGFzQXJyYXlOYXR1cmUob2JqKSkge1xuICAgIHJldHVybiBbb2JqXTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICByZXR1cm4gb2JqLnNsaWNlKCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRvQXJyYXkob2JqKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUFycmF5RnJvbU1peGVkOyIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4vKmVzbGludC1kaXNhYmxlIGZiLXd3dy91bnNhZmUtaHRtbCAqL1xuXG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCcuL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCcuL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIER1bW15IGNvbnRhaW5lciB1c2VkIHRvIGRldGVjdCB3aGljaCB3cmFwcyBhcmUgbmVjZXNzYXJ5LlxuICovXG52YXIgZHVtbXlOb2RlID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykgOiBudWxsO1xuXG4vKipcbiAqIFNvbWUgYnJvd3NlcnMgY2Fubm90IHVzZSBgaW5uZXJIVE1MYCB0byByZW5kZXIgY2VydGFpbiBlbGVtZW50cyBzdGFuZGFsb25lLFxuICogc28gd2Ugd3JhcCB0aGVtLCByZW5kZXIgdGhlIHdyYXBwZWQgbm9kZXMsIHRoZW4gZXh0cmFjdCB0aGUgZGVzaXJlZCBub2RlLlxuICpcbiAqIEluIElFOCwgY2VydGFpbiBlbGVtZW50cyBjYW5ub3QgcmVuZGVyIGFsb25lLCBzbyB3cmFwIGFsbCBlbGVtZW50cyAoJyonKS5cbiAqL1xuXG52YXIgc2hvdWxkV3JhcCA9IHt9O1xuXG52YXIgc2VsZWN0V3JhcCA9IFsxLCAnPHNlbGVjdCBtdWx0aXBsZT1cInRydWVcIj4nLCAnPC9zZWxlY3Q+J107XG52YXIgdGFibGVXcmFwID0gWzEsICc8dGFibGU+JywgJzwvdGFibGU+J107XG52YXIgdHJXcmFwID0gWzMsICc8dGFibGU+PHRib2R5Pjx0cj4nLCAnPC90cj48L3Rib2R5PjwvdGFibGU+J107XG5cbnZhciBzdmdXcmFwID0gWzEsICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4nLCAnPC9zdmc+J107XG5cbnZhciBtYXJrdXBXcmFwID0ge1xuICAnKic6IFsxLCAnPzxkaXY+JywgJzwvZGl2PiddLFxuXG4gICdhcmVhJzogWzEsICc8bWFwPicsICc8L21hcD4nXSxcbiAgJ2NvbCc6IFsyLCAnPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4nLCAnPC9jb2xncm91cD48L3RhYmxlPiddLFxuICAnbGVnZW5kJzogWzEsICc8ZmllbGRzZXQ+JywgJzwvZmllbGRzZXQ+J10sXG4gICdwYXJhbSc6IFsxLCAnPG9iamVjdD4nLCAnPC9vYmplY3Q+J10sXG4gICd0cic6IFsyLCAnPHRhYmxlPjx0Ym9keT4nLCAnPC90Ym9keT48L3RhYmxlPiddLFxuXG4gICdvcHRncm91cCc6IHNlbGVjdFdyYXAsXG4gICdvcHRpb24nOiBzZWxlY3RXcmFwLFxuXG4gICdjYXB0aW9uJzogdGFibGVXcmFwLFxuICAnY29sZ3JvdXAnOiB0YWJsZVdyYXAsXG4gICd0Ym9keSc6IHRhYmxlV3JhcCxcbiAgJ3Rmb290JzogdGFibGVXcmFwLFxuICAndGhlYWQnOiB0YWJsZVdyYXAsXG5cbiAgJ3RkJzogdHJXcmFwLFxuICAndGgnOiB0cldyYXBcbn07XG5cbi8vIEluaXRpYWxpemUgdGhlIFNWRyBlbGVtZW50cyBzaW5jZSB3ZSBrbm93IHRoZXknbGwgYWx3YXlzIG5lZWQgdG8gYmUgd3JhcHBlZFxuLy8gY29uc2lzdGVudGx5LiBJZiB0aGV5IGFyZSBjcmVhdGVkIGluc2lkZSBhIDxkaXY+IHRoZXkgd2lsbCBiZSBpbml0aWFsaXplZCBpblxuLy8gdGhlIHdyb25nIG5hbWVzcGFjZSAoYW5kIHdpbGwgbm90IGRpc3BsYXkpLlxudmFyIHN2Z0VsZW1lbnRzID0gWydjaXJjbGUnLCAnY2xpcFBhdGgnLCAnZGVmcycsICdlbGxpcHNlJywgJ2cnLCAnaW1hZ2UnLCAnbGluZScsICdsaW5lYXJHcmFkaWVudCcsICdtYXNrJywgJ3BhdGgnLCAncGF0dGVybicsICdwb2x5Z29uJywgJ3BvbHlsaW5lJywgJ3JhZGlhbEdyYWRpZW50JywgJ3JlY3QnLCAnc3RvcCcsICd0ZXh0JywgJ3RzcGFuJ107XG5zdmdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlTmFtZSkge1xuICBtYXJrdXBXcmFwW25vZGVOYW1lXSA9IHN2Z1dyYXA7XG4gIHNob3VsZFdyYXBbbm9kZU5hbWVdID0gdHJ1ZTtcbn0pO1xuXG4vKipcbiAqIEdldHMgdGhlIG1hcmt1cCB3cmFwIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzdXBwbGllZCBgbm9kZU5hbWVgLlxuICpcbiAqIE5PVEU6IFRoaXMgbGF6aWx5IGRldGVjdHMgd2hpY2ggd3JhcHMgYXJlIG5lY2Vzc2FyeSBmb3IgdGhlIGN1cnJlbnQgYnJvd3Nlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbm9kZU5hbWUgTG93ZXJjYXNlIGBub2RlTmFtZWAuXG4gKiBAcmV0dXJuIHs/YXJyYXl9IE1hcmt1cCB3cmFwIGNvbmZpZ3VyYXRpb24sIGlmIGFwcGxpY2FibGUuXG4gKi9cbmZ1bmN0aW9uIGdldE1hcmt1cFdyYXAobm9kZU5hbWUpIHtcbiAgISEhZHVtbXlOb2RlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ01hcmt1cCB3cmFwcGluZyBub2RlIG5vdCBpbml0aWFsaXplZCcpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgaWYgKCFtYXJrdXBXcmFwLmhhc093blByb3BlcnR5KG5vZGVOYW1lKSkge1xuICAgIG5vZGVOYW1lID0gJyonO1xuICB9XG4gIGlmICghc2hvdWxkV3JhcC5oYXNPd25Qcm9wZXJ0eShub2RlTmFtZSkpIHtcbiAgICBpZiAobm9kZU5hbWUgPT09ICcqJykge1xuICAgICAgZHVtbXlOb2RlLmlubmVySFRNTCA9ICc8bGluayAvPic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGR1bW15Tm9kZS5pbm5lckhUTUwgPSAnPCcgKyBub2RlTmFtZSArICc+PC8nICsgbm9kZU5hbWUgKyAnPic7XG4gICAgfVxuICAgIHNob3VsZFdyYXBbbm9kZU5hbWVdID0gIWR1bW15Tm9kZS5maXJzdENoaWxkO1xuICB9XG4gIHJldHVybiBzaG91bGRXcmFwW25vZGVOYW1lXSA/IG1hcmt1cFdyYXBbbm9kZU5hbWVdIDogbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRNYXJrdXBXcmFwOyIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxuLyplc2xpbnQtZGlzYWJsZSBmYi13d3cvdW5zYWZlLWh0bWwqL1xuXG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCcuL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG5cbnZhciBjcmVhdGVBcnJheUZyb21NaXhlZCA9IHJlcXVpcmUoJy4vY3JlYXRlQXJyYXlGcm9tTWl4ZWQnKTtcbnZhciBnZXRNYXJrdXBXcmFwID0gcmVxdWlyZSgnLi9nZXRNYXJrdXBXcmFwJyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnLi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBEdW1teSBjb250YWluZXIgdXNlZCB0byByZW5kZXIgYWxsIG1hcmt1cC5cbiAqL1xudmFyIGR1bW15Tm9kZSA9IEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpIDogbnVsbDtcblxuLyoqXG4gKiBQYXR0ZXJuIHVzZWQgYnkgYGdldE5vZGVOYW1lYC5cbiAqL1xudmFyIG5vZGVOYW1lUGF0dGVybiA9IC9eXFxzKjwoXFx3KykvO1xuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBgbm9kZU5hbWVgIG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIGEgc3RyaW5nIG9mIG1hcmt1cC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWFya3VwIFN0cmluZyBvZiBtYXJrdXAuXG4gKiBAcmV0dXJuIHs/c3RyaW5nfSBOb2RlIG5hbWUgb2YgdGhlIHN1cHBsaWVkIG1hcmt1cC5cbiAqL1xuZnVuY3Rpb24gZ2V0Tm9kZU5hbWUobWFya3VwKSB7XG4gIHZhciBub2RlTmFtZU1hdGNoID0gbWFya3VwLm1hdGNoKG5vZGVOYW1lUGF0dGVybik7XG4gIHJldHVybiBub2RlTmFtZU1hdGNoICYmIG5vZGVOYW1lTWF0Y2hbMV0udG9Mb3dlckNhc2UoKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG5vZGVzIHJlbmRlcmVkIGZyb20gdGhlIHN1cHBsaWVkIG1hcmt1cC4gVGhlXG4gKiBvcHRpb25hbGx5IHN1cHBsaWVkIGBoYW5kbGVTY3JpcHRgIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCBvbmNlIGZvciBlYWNoXG4gKiA8c2NyaXB0PiBlbGVtZW50IHRoYXQgaXMgcmVuZGVyZWQuIElmIG5vIGBoYW5kbGVTY3JpcHRgIGZ1bmN0aW9uIGlzIHN1cHBsaWVkLFxuICogYW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiBhbnkgPHNjcmlwdD4gZWxlbWVudHMgYXJlIHJlbmRlcmVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrdXAgQSBzdHJpbmcgb2YgdmFsaWQgSFRNTCBtYXJrdXAuXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gaGFuZGxlU2NyaXB0IEludm9rZWQgb25jZSBmb3IgZWFjaCByZW5kZXJlZCA8c2NyaXB0Pi5cbiAqIEByZXR1cm4ge2FycmF5PERPTUVsZW1lbnR8RE9NVGV4dE5vZGU+fSBBbiBhcnJheSBvZiByZW5kZXJlZCBub2Rlcy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlTm9kZXNGcm9tTWFya3VwKG1hcmt1cCwgaGFuZGxlU2NyaXB0KSB7XG4gIHZhciBub2RlID0gZHVtbXlOb2RlO1xuICAhISFkdW1teU5vZGUgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnY3JlYXRlTm9kZXNGcm9tTWFya3VwIGR1bW15IG5vdCBpbml0aWFsaXplZCcpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgdmFyIG5vZGVOYW1lID0gZ2V0Tm9kZU5hbWUobWFya3VwKTtcblxuICB2YXIgd3JhcCA9IG5vZGVOYW1lICYmIGdldE1hcmt1cFdyYXAobm9kZU5hbWUpO1xuICBpZiAod3JhcCkge1xuICAgIG5vZGUuaW5uZXJIVE1MID0gd3JhcFsxXSArIG1hcmt1cCArIHdyYXBbMl07XG5cbiAgICB2YXIgd3JhcERlcHRoID0gd3JhcFswXTtcbiAgICB3aGlsZSAod3JhcERlcHRoLS0pIHtcbiAgICAgIG5vZGUgPSBub2RlLmxhc3RDaGlsZDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbm9kZS5pbm5lckhUTUwgPSBtYXJrdXA7XG4gIH1cblxuICB2YXIgc2NyaXB0cyA9IG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpO1xuICBpZiAoc2NyaXB0cy5sZW5ndGgpIHtcbiAgICAhaGFuZGxlU2NyaXB0ID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2NyZWF0ZU5vZGVzRnJvbU1hcmt1cCguLi4pOiBVbmV4cGVjdGVkIDxzY3JpcHQ+IGVsZW1lbnQgcmVuZGVyZWQuJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICAgIGNyZWF0ZUFycmF5RnJvbU1peGVkKHNjcmlwdHMpLmZvckVhY2goaGFuZGxlU2NyaXB0KTtcbiAgfVxuXG4gIHZhciBub2RlcyA9IEFycmF5LmZyb20obm9kZS5jaGlsZE5vZGVzKTtcbiAgd2hpbGUgKG5vZGUubGFzdENoaWxkKSB7XG4gICAgbm9kZS5yZW1vdmVDaGlsZChub2RlLmxhc3RDaGlsZCk7XG4gIH1cbiAgcmV0dXJuIG5vZGVzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZU5vZGVzRnJvbU1hcmt1cDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgRE9NTGF6eVRyZWUgPSByZXF1aXJlKCcuL0RPTUxhenlUcmVlJyk7XG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xuXG52YXIgY3JlYXRlTm9kZXNGcm9tTWFya3VwID0gcmVxdWlyZSgnZmJqcy9saWIvY3JlYXRlTm9kZXNGcm9tTWFya3VwJyk7XG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxudmFyIERhbmdlciA9IHtcbiAgLyoqXG4gICAqIFJlcGxhY2VzIGEgbm9kZSB3aXRoIGEgc3RyaW5nIG9mIG1hcmt1cCBhdCBpdHMgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gaXRzXG4gICAqIHBhcmVudC4gVGhlIG1hcmt1cCBtdXN0IHJlbmRlciBpbnRvIGEgc2luZ2xlIHJvb3Qgbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIHtET01FbGVtZW50fSBvbGRDaGlsZCBDaGlsZCBub2RlIHRvIHJlcGxhY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrdXAgTWFya3VwIHRvIHJlbmRlciBpbiBwbGFjZSBvZiB0aGUgY2hpbGQgbm9kZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cDogZnVuY3Rpb24gKG9sZENoaWxkLCBtYXJrdXApIHtcbiAgICAhRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2Rhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwKC4uLik6IENhbm5vdCByZW5kZXIgbWFya3VwIGluIGEgd29ya2VyIHRocmVhZC4gTWFrZSBzdXJlIGB3aW5kb3dgIGFuZCBgZG9jdW1lbnRgIGFyZSBhdmFpbGFibGUgZ2xvYmFsbHkgYmVmb3JlIHJlcXVpcmluZyBSZWFjdCB3aGVuIHVuaXQgdGVzdGluZyBvciB1c2UgUmVhY3RET01TZXJ2ZXIucmVuZGVyVG9TdHJpbmcoKSBmb3Igc2VydmVyIHJlbmRlcmluZy4nKSA6IF9wcm9kSW52YXJpYW50KCc1NicpIDogdm9pZCAwO1xuICAgICFtYXJrdXAgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAoLi4uKTogTWlzc2luZyBtYXJrdXAuJykgOiBfcHJvZEludmFyaWFudCgnNTcnKSA6IHZvaWQgMDtcbiAgICAhKG9sZENoaWxkLm5vZGVOYW1lICE9PSAnSFRNTCcpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2Rhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwKC4uLik6IENhbm5vdCByZXBsYWNlIG1hcmt1cCBvZiB0aGUgPGh0bWw+IG5vZGUuIFRoaXMgaXMgYmVjYXVzZSBicm93c2VyIHF1aXJrcyBtYWtlIHRoaXMgdW5yZWxpYWJsZSBhbmQvb3Igc2xvdy4gSWYgeW91IHdhbnQgdG8gcmVuZGVyIHRvIHRoZSByb290IHlvdSBtdXN0IHVzZSBzZXJ2ZXIgcmVuZGVyaW5nLiBTZWUgUmVhY3RET01TZXJ2ZXIucmVuZGVyVG9TdHJpbmcoKS4nKSA6IF9wcm9kSW52YXJpYW50KCc1OCcpIDogdm9pZCAwO1xuXG4gICAgaWYgKHR5cGVvZiBtYXJrdXAgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgbmV3Q2hpbGQgPSBjcmVhdGVOb2Rlc0Zyb21NYXJrdXAobWFya3VwLCBlbXB0eUZ1bmN0aW9uKVswXTtcbiAgICAgIG9sZENoaWxkLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld0NoaWxkLCBvbGRDaGlsZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIERPTUxhenlUcmVlLnJlcGxhY2VDaGlsZFdpdGhUcmVlKG9sZENoaWxkLCBtYXJrdXApO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBEYW5nZXI7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIERPTUxhenlUcmVlID0gcmVxdWlyZSgnLi9ET01MYXp5VHJlZScpO1xudmFyIERhbmdlciA9IHJlcXVpcmUoJy4vRGFuZ2VyJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0cnVtZW50YXRpb24nKTtcblxudmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSByZXF1aXJlKCcuL2NyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24nKTtcbnZhciBzZXRJbm5lckhUTUwgPSByZXF1aXJlKCcuL3NldElubmVySFRNTCcpO1xudmFyIHNldFRleHRDb250ZW50ID0gcmVxdWlyZSgnLi9zZXRUZXh0Q29udGVudCcpO1xuXG5mdW5jdGlvbiBnZXROb2RlQWZ0ZXIocGFyZW50Tm9kZSwgbm9kZSkge1xuICAvLyBTcGVjaWFsIGNhc2UgZm9yIHRleHQgY29tcG9uZW50cywgd2hpY2ggcmV0dXJuIFtvcGVuLCBjbG9zZV0gY29tbWVudHNcbiAgLy8gZnJvbSBnZXRIb3N0Tm9kZS5cbiAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHtcbiAgICBub2RlID0gbm9kZVsxXTtcbiAgfVxuICByZXR1cm4gbm9kZSA/IG5vZGUubmV4dFNpYmxpbmcgOiBwYXJlbnROb2RlLmZpcnN0Q2hpbGQ7XG59XG5cbi8qKlxuICogSW5zZXJ0cyBgY2hpbGROb2RlYCBhcyBhIGNoaWxkIG9mIGBwYXJlbnROb2RlYCBhdCB0aGUgYGluZGV4YC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IHBhcmVudE5vZGUgUGFyZW50IG5vZGUgaW4gd2hpY2ggdG8gaW5zZXJ0LlxuICogQHBhcmFtIHtET01FbGVtZW50fSBjaGlsZE5vZGUgQ2hpbGQgbm9kZSB0byBpbnNlcnQuXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSBjaGlsZC5cbiAqIEBpbnRlcm5hbFxuICovXG52YXIgaW5zZXJ0Q2hpbGRBdCA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKHBhcmVudE5vZGUsIGNoaWxkTm9kZSwgcmVmZXJlbmNlTm9kZSkge1xuICAvLyBXZSByZWx5IGV4Y2x1c2l2ZWx5IG9uIGBpbnNlcnRCZWZvcmUobm9kZSwgbnVsbClgIGluc3RlYWQgb2YgYWxzbyB1c2luZ1xuICAvLyBgYXBwZW5kQ2hpbGQobm9kZSlgLiAoVXNpbmcgYHVuZGVmaW5lZGAgaXMgbm90IGFsbG93ZWQgYnkgYWxsIGJyb3dzZXJzIHNvXG4gIC8vIHdlIGFyZSBjYXJlZnVsIHRvIHVzZSBgbnVsbGAuKVxuICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZE5vZGUsIHJlZmVyZW5jZU5vZGUpO1xufSk7XG5cbmZ1bmN0aW9uIGluc2VydExhenlUcmVlQ2hpbGRBdChwYXJlbnROb2RlLCBjaGlsZFRyZWUsIHJlZmVyZW5jZU5vZGUpIHtcbiAgRE9NTGF6eVRyZWUuaW5zZXJ0VHJlZUJlZm9yZShwYXJlbnROb2RlLCBjaGlsZFRyZWUsIHJlZmVyZW5jZU5vZGUpO1xufVxuXG5mdW5jdGlvbiBtb3ZlQ2hpbGQocGFyZW50Tm9kZSwgY2hpbGROb2RlLCByZWZlcmVuY2VOb2RlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkTm9kZSkpIHtcbiAgICBtb3ZlRGVsaW1pdGVkVGV4dChwYXJlbnROb2RlLCBjaGlsZE5vZGVbMF0sIGNoaWxkTm9kZVsxXSwgcmVmZXJlbmNlTm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgaW5zZXJ0Q2hpbGRBdChwYXJlbnROb2RlLCBjaGlsZE5vZGUsIHJlZmVyZW5jZU5vZGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUNoaWxkKHBhcmVudE5vZGUsIGNoaWxkTm9kZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZE5vZGUpKSB7XG4gICAgdmFyIGNsb3NpbmdDb21tZW50ID0gY2hpbGROb2RlWzFdO1xuICAgIGNoaWxkTm9kZSA9IGNoaWxkTm9kZVswXTtcbiAgICByZW1vdmVEZWxpbWl0ZWRUZXh0KHBhcmVudE5vZGUsIGNoaWxkTm9kZSwgY2xvc2luZ0NvbW1lbnQpO1xuICAgIHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xvc2luZ0NvbW1lbnQpO1xuICB9XG4gIHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGROb2RlKTtcbn1cblxuZnVuY3Rpb24gbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSwgb3BlbmluZ0NvbW1lbnQsIGNsb3NpbmdDb21tZW50LCByZWZlcmVuY2VOb2RlKSB7XG4gIHZhciBub2RlID0gb3BlbmluZ0NvbW1lbnQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIG5leHROb2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgICBpbnNlcnRDaGlsZEF0KHBhcmVudE5vZGUsIG5vZGUsIHJlZmVyZW5jZU5vZGUpO1xuICAgIGlmIChub2RlID09PSBjbG9zaW5nQ29tbWVudCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIG5vZGUgPSBuZXh0Tm9kZTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVEZWxpbWl0ZWRUZXh0KHBhcmVudE5vZGUsIHN0YXJ0Tm9kZSwgY2xvc2luZ0NvbW1lbnQpIHtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgbm9kZSA9IHN0YXJ0Tm9kZS5uZXh0U2libGluZztcbiAgICBpZiAobm9kZSA9PT0gY2xvc2luZ0NvbW1lbnQpIHtcbiAgICAgIC8vIFRoZSBjbG9zaW5nIGNvbW1lbnQgaXMgcmVtb3ZlZCBieSBSZWFjdE11bHRpQ2hpbGQuXG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwbGFjZURlbGltaXRlZFRleHQob3BlbmluZ0NvbW1lbnQsIGNsb3NpbmdDb21tZW50LCBzdHJpbmdUZXh0KSB7XG4gIHZhciBwYXJlbnROb2RlID0gb3BlbmluZ0NvbW1lbnQucGFyZW50Tm9kZTtcbiAgdmFyIG5vZGVBZnRlckNvbW1lbnQgPSBvcGVuaW5nQ29tbWVudC5uZXh0U2libGluZztcbiAgaWYgKG5vZGVBZnRlckNvbW1lbnQgPT09IGNsb3NpbmdDb21tZW50KSB7XG4gICAgLy8gVGhlcmUgYXJlIG5vIHRleHQgbm9kZXMgYmV0d2VlbiB0aGUgb3BlbmluZyBhbmQgY2xvc2luZyBjb21tZW50czsgaW5zZXJ0XG4gICAgLy8gYSBuZXcgb25lIGlmIHN0cmluZ1RleHQgaXNuJ3QgZW1wdHkuXG4gICAgaWYgKHN0cmluZ1RleHQpIHtcbiAgICAgIGluc2VydENoaWxkQXQocGFyZW50Tm9kZSwgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoc3RyaW5nVGV4dCksIG5vZGVBZnRlckNvbW1lbnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoc3RyaW5nVGV4dCkge1xuICAgICAgLy8gU2V0IHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGZpcnN0IG5vZGUgYWZ0ZXIgdGhlIG9wZW5pbmcgY29tbWVudCwgYW5kXG4gICAgICAvLyByZW1vdmUgYWxsIGZvbGxvd2luZyBub2RlcyB1cCB1bnRpbCB0aGUgY2xvc2luZyBjb21tZW50LlxuICAgICAgc2V0VGV4dENvbnRlbnQobm9kZUFmdGVyQ29tbWVudCwgc3RyaW5nVGV4dCk7XG4gICAgICByZW1vdmVEZWxpbWl0ZWRUZXh0KHBhcmVudE5vZGUsIG5vZGVBZnRlckNvbW1lbnQsIGNsb3NpbmdDb21tZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVtb3ZlRGVsaW1pdGVkVGV4dChwYXJlbnROb2RlLCBvcGVuaW5nQ29tbWVudCwgY2xvc2luZ0NvbW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICBpbnN0YW5jZUlEOiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShvcGVuaW5nQ29tbWVudCkuX2RlYnVnSUQsXG4gICAgICB0eXBlOiAncmVwbGFjZSB0ZXh0JyxcbiAgICAgIHBheWxvYWQ6IHN0cmluZ1RleHRcbiAgICB9KTtcbiAgfVxufVxuXG52YXIgZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAgPSBEYW5nZXIuZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXA7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cCA9IGZ1bmN0aW9uIChvbGRDaGlsZCwgbWFya3VwLCBwcmV2SW5zdGFuY2UpIHtcbiAgICBEYW5nZXIuZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAob2xkQ2hpbGQsIG1hcmt1cCk7XG4gICAgaWYgKHByZXZJbnN0YW5jZS5fZGVidWdJRCAhPT0gMCkge1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgIGluc3RhbmNlSUQ6IHByZXZJbnN0YW5jZS5fZGVidWdJRCxcbiAgICAgICAgdHlwZTogJ3JlcGxhY2Ugd2l0aCcsXG4gICAgICAgIHBheWxvYWQ6IG1hcmt1cC50b1N0cmluZygpXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG5leHRJbnN0YW5jZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG1hcmt1cC5ub2RlKTtcbiAgICAgIGlmIChuZXh0SW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgICAgaW5zdGFuY2VJRDogbmV4dEluc3RhbmNlLl9kZWJ1Z0lELFxuICAgICAgICAgIHR5cGU6ICdtb3VudCcsXG4gICAgICAgICAgcGF5bG9hZDogbWFya3VwLnRvU3RyaW5nKClcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIE9wZXJhdGlvbnMgZm9yIHVwZGF0aW5nIHdpdGggRE9NIGNoaWxkcmVuLlxuICovXG52YXIgRE9NQ2hpbGRyZW5PcGVyYXRpb25zID0ge1xuICBkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cDogZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAsXG5cbiAgcmVwbGFjZURlbGltaXRlZFRleHQ6IHJlcGxhY2VEZWxpbWl0ZWRUZXh0LFxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGEgY29tcG9uZW50J3MgY2hpbGRyZW4gYnkgcHJvY2Vzc2luZyBhIHNlcmllcyBvZiB1cGRhdGVzLiBUaGVcbiAgICogdXBkYXRlIGNvbmZpZ3VyYXRpb25zIGFyZSBlYWNoIGV4cGVjdGVkIHRvIGhhdmUgYSBgcGFyZW50Tm9kZWAgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXk8b2JqZWN0Pn0gdXBkYXRlcyBMaXN0IG9mIHVwZGF0ZSBjb25maWd1cmF0aW9ucy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm9jZXNzVXBkYXRlczogZnVuY3Rpb24gKHBhcmVudE5vZGUsIHVwZGF0ZXMpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHBhcmVudE5vZGVEZWJ1Z0lEID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUocGFyZW50Tm9kZSkuX2RlYnVnSUQ7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCB1cGRhdGVzLmxlbmd0aDsgaysrKSB7XG4gICAgICB2YXIgdXBkYXRlID0gdXBkYXRlc1trXTtcbiAgICAgIHN3aXRjaCAodXBkYXRlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnSU5TRVJUX01BUktVUCc6XG4gICAgICAgICAgaW5zZXJ0TGF6eVRyZWVDaGlsZEF0KHBhcmVudE5vZGUsIHVwZGF0ZS5jb250ZW50LCBnZXROb2RlQWZ0ZXIocGFyZW50Tm9kZSwgdXBkYXRlLmFmdGVyTm9kZSkpO1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VJRDogcGFyZW50Tm9kZURlYnVnSUQsXG4gICAgICAgICAgICAgIHR5cGU6ICdpbnNlcnQgY2hpbGQnLFxuICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgdG9JbmRleDogdXBkYXRlLnRvSW5kZXgsXG4gICAgICAgICAgICAgICAgY29udGVudDogdXBkYXRlLmNvbnRlbnQudG9TdHJpbmcoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ01PVkVfRVhJU1RJTkcnOlxuICAgICAgICAgIG1vdmVDaGlsZChwYXJlbnROb2RlLCB1cGRhdGUuZnJvbU5vZGUsIGdldE5vZGVBZnRlcihwYXJlbnROb2RlLCB1cGRhdGUuYWZ0ZXJOb2RlKSk7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe1xuICAgICAgICAgICAgICBpbnN0YW5jZUlEOiBwYXJlbnROb2RlRGVidWdJRCxcbiAgICAgICAgICAgICAgdHlwZTogJ21vdmUgY2hpbGQnLFxuICAgICAgICAgICAgICBwYXlsb2FkOiB7IGZyb21JbmRleDogdXBkYXRlLmZyb21JbmRleCwgdG9JbmRleDogdXBkYXRlLnRvSW5kZXggfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdTRVRfTUFSS1VQJzpcbiAgICAgICAgICBzZXRJbm5lckhUTUwocGFyZW50Tm9kZSwgdXBkYXRlLmNvbnRlbnQpO1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VJRDogcGFyZW50Tm9kZURlYnVnSUQsXG4gICAgICAgICAgICAgIHR5cGU6ICdyZXBsYWNlIGNoaWxkcmVuJyxcbiAgICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLmNvbnRlbnQudG9TdHJpbmcoKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdURVhUX0NPTlRFTlQnOlxuICAgICAgICAgIHNldFRleHRDb250ZW50KHBhcmVudE5vZGUsIHVwZGF0ZS5jb250ZW50KTtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgICAgICAgIGluc3RhbmNlSUQ6IHBhcmVudE5vZGVEZWJ1Z0lELFxuICAgICAgICAgICAgICB0eXBlOiAncmVwbGFjZSB0ZXh0JyxcbiAgICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLmNvbnRlbnQudG9TdHJpbmcoKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdSRU1PVkVfTk9ERSc6XG4gICAgICAgICAgcmVtb3ZlQ2hpbGQocGFyZW50Tm9kZSwgdXBkYXRlLmZyb21Ob2RlKTtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgICAgICAgIGluc3RhbmNlSUQ6IHBhcmVudE5vZGVEZWJ1Z0lELFxuICAgICAgICAgICAgICB0eXBlOiAncmVtb3ZlIGNoaWxkJyxcbiAgICAgICAgICAgICAgcGF5bG9hZDogeyBmcm9tSW5kZXg6IHVwZGF0ZS5mcm9tSW5kZXggfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBET01DaGlsZHJlbk9wZXJhdGlvbnM7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIERPTUNoaWxkcmVuT3BlcmF0aW9ucyA9IHJlcXVpcmUoJy4vRE9NQ2hpbGRyZW5PcGVyYXRpb25zJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcblxuLyoqXG4gKiBPcGVyYXRpb25zIHVzZWQgdG8gcHJvY2VzcyB1cGRhdGVzIHRvIERPTSBub2Rlcy5cbiAqL1xudmFyIFJlYWN0RE9NSURPcGVyYXRpb25zID0ge1xuICAvKipcbiAgICogVXBkYXRlcyBhIGNvbXBvbmVudCdzIGNoaWxkcmVuIGJ5IHByb2Nlc3NpbmcgYSBzZXJpZXMgb2YgdXBkYXRlcy5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheTxvYmplY3Q+fSB1cGRhdGVzIExpc3Qgb2YgdXBkYXRlIGNvbmZpZ3VyYXRpb25zLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGRhbmdlcm91c2x5UHJvY2Vzc0NoaWxkcmVuVXBkYXRlczogZnVuY3Rpb24gKHBhcmVudEluc3QsIHVwZGF0ZXMpIHtcbiAgICB2YXIgbm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHBhcmVudEluc3QpO1xuICAgIERPTUNoaWxkcmVuT3BlcmF0aW9ucy5wcm9jZXNzVXBkYXRlcyhub2RlLCB1cGRhdGVzKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUlET3BlcmF0aW9uczsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NQ2hpbGRyZW5PcGVyYXRpb25zID0gcmVxdWlyZSgnLi9ET01DaGlsZHJlbk9wZXJhdGlvbnMnKTtcbnZhciBSZWFjdERPTUlET3BlcmF0aW9ucyA9IHJlcXVpcmUoJy4vUmVhY3RET01JRE9wZXJhdGlvbnMnKTtcblxuLyoqXG4gKiBBYnN0cmFjdHMgYXdheSBhbGwgZnVuY3Rpb25hbGl0eSBvZiB0aGUgcmVjb25jaWxlciB0aGF0IHJlcXVpcmVzIGtub3dsZWRnZSBvZlxuICogdGhlIGJyb3dzZXIgY29udGV4dC4gVE9ETzogVGhlc2UgY2FsbGVycyBzaG91bGQgYmUgcmVmYWN0b3JlZCB0byBhdm9pZCB0aGVcbiAqIG5lZWQgZm9yIHRoaXMgaW5qZWN0aW9uLlxuICovXG52YXIgUmVhY3RDb21wb25lbnRCcm93c2VyRW52aXJvbm1lbnQgPSB7XG4gIHByb2Nlc3NDaGlsZHJlblVwZGF0ZXM6IFJlYWN0RE9NSURPcGVyYXRpb25zLmRhbmdlcm91c2x5UHJvY2Vzc0NoaWxkcmVuVXBkYXRlcyxcblxuICByZXBsYWNlTm9kZVdpdGhNYXJrdXA6IERPTUNoaWxkcmVuT3BlcmF0aW9ucy5kYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cFxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudDsiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGUgaW5wdXQvdGV4dGFyZWEgdG8gZm9jdXNcbiAqL1xuXG5mdW5jdGlvbiBmb2N1c05vZGUobm9kZSkge1xuICAvLyBJRTggY2FuIHRocm93IFwiQ2FuJ3QgbW92ZSBmb2N1cyB0byB0aGUgY29udHJvbCBiZWNhdXNlIGl0IGlzIGludmlzaWJsZSxcbiAgLy8gbm90IGVuYWJsZWQsIG9yIG9mIGEgdHlwZSB0aGF0IGRvZXMgbm90IGFjY2VwdCB0aGUgZm9jdXMuXCIgZm9yIGFsbCBraW5kcyBvZlxuICAvLyByZWFzb25zIHRoYXQgYXJlIHRvbyBleHBlbnNpdmUgYW5kIGZyYWdpbGUgdG8gdGVzdC5cbiAgdHJ5IHtcbiAgICBub2RlLmZvY3VzKCk7XG4gIH0gY2F0Y2ggKGUpIHt9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZm9jdXNOb2RlOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xuXG52YXIgZm9jdXNOb2RlID0gcmVxdWlyZSgnZmJqcy9saWIvZm9jdXNOb2RlJyk7XG5cbnZhciBBdXRvRm9jdXNVdGlscyA9IHtcbiAgZm9jdXNET01Db21wb25lbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICBmb2N1c05vZGUoUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UodGhpcykpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEF1dG9Gb2N1c1V0aWxzOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ1NTIHByb3BlcnRpZXMgd2hpY2ggYWNjZXB0IG51bWJlcnMgYnV0IGFyZSBub3QgaW4gdW5pdHMgb2YgXCJweFwiLlxuICovXG5cbnZhciBpc1VuaXRsZXNzTnVtYmVyID0ge1xuICBhbmltYXRpb25JdGVyYXRpb25Db3VudDogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VPdXRzZXQ6IHRydWUsXG4gIGJvcmRlckltYWdlU2xpY2U6IHRydWUsXG4gIGJvcmRlckltYWdlV2lkdGg6IHRydWUsXG4gIGJveEZsZXg6IHRydWUsXG4gIGJveEZsZXhHcm91cDogdHJ1ZSxcbiAgYm94T3JkaW5hbEdyb3VwOiB0cnVlLFxuICBjb2x1bW5Db3VudDogdHJ1ZSxcbiAgZmxleDogdHJ1ZSxcbiAgZmxleEdyb3c6IHRydWUsXG4gIGZsZXhQb3NpdGl2ZTogdHJ1ZSxcbiAgZmxleFNocmluazogdHJ1ZSxcbiAgZmxleE5lZ2F0aXZlOiB0cnVlLFxuICBmbGV4T3JkZXI6IHRydWUsXG4gIGdyaWRSb3c6IHRydWUsXG4gIGdyaWRSb3dFbmQ6IHRydWUsXG4gIGdyaWRSb3dTcGFuOiB0cnVlLFxuICBncmlkUm93U3RhcnQ6IHRydWUsXG4gIGdyaWRDb2x1bW46IHRydWUsXG4gIGdyaWRDb2x1bW5FbmQ6IHRydWUsXG4gIGdyaWRDb2x1bW5TcGFuOiB0cnVlLFxuICBncmlkQ29sdW1uU3RhcnQ6IHRydWUsXG4gIGZvbnRXZWlnaHQ6IHRydWUsXG4gIGxpbmVDbGFtcDogdHJ1ZSxcbiAgbGluZUhlaWdodDogdHJ1ZSxcbiAgb3BhY2l0eTogdHJ1ZSxcbiAgb3JkZXI6IHRydWUsXG4gIG9ycGhhbnM6IHRydWUsXG4gIHRhYlNpemU6IHRydWUsXG4gIHdpZG93czogdHJ1ZSxcbiAgekluZGV4OiB0cnVlLFxuICB6b29tOiB0cnVlLFxuXG4gIC8vIFNWRy1yZWxhdGVkIHByb3BlcnRpZXNcbiAgZmlsbE9wYWNpdHk6IHRydWUsXG4gIGZsb29kT3BhY2l0eTogdHJ1ZSxcbiAgc3RvcE9wYWNpdHk6IHRydWUsXG4gIHN0cm9rZURhc2hhcnJheTogdHJ1ZSxcbiAgc3Ryb2tlRGFzaG9mZnNldDogdHJ1ZSxcbiAgc3Ryb2tlTWl0ZXJsaW1pdDogdHJ1ZSxcbiAgc3Ryb2tlT3BhY2l0eTogdHJ1ZSxcbiAgc3Ryb2tlV2lkdGg6IHRydWVcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeCB2ZW5kb3Itc3BlY2lmaWMgcHJlZml4LCBlZzogV2Via2l0XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHN0eWxlIG5hbWUsIGVnOiB0cmFuc2l0aW9uRHVyYXRpb25cbiAqIEByZXR1cm4ge3N0cmluZ30gc3R5bGUgbmFtZSBwcmVmaXhlZCB3aXRoIGBwcmVmaXhgLCBwcm9wZXJseSBjYW1lbENhc2VkLCBlZzpcbiAqIFdlYmtpdFRyYW5zaXRpb25EdXJhdGlvblxuICovXG5mdW5jdGlvbiBwcmVmaXhLZXkocHJlZml4LCBrZXkpIHtcbiAgcmV0dXJuIHByZWZpeCArIGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zdWJzdHJpbmcoMSk7XG59XG5cbi8qKlxuICogU3VwcG9ydCBzdHlsZSBuYW1lcyB0aGF0IG1heSBjb21lIHBhc3NlZCBpbiBwcmVmaXhlZCBieSBhZGRpbmcgcGVybXV0YXRpb25zXG4gKiBvZiB2ZW5kb3IgcHJlZml4ZXMuXG4gKi9cbnZhciBwcmVmaXhlcyA9IFsnV2Via2l0JywgJ21zJywgJ01veicsICdPJ107XG5cbi8vIFVzaW5nIE9iamVjdC5rZXlzIGhlcmUsIG9yIGVsc2UgdGhlIHZhbmlsbGEgZm9yLWluIGxvb3AgbWFrZXMgSUU4IGdvIGludG8gYW5cbi8vIGluZmluaXRlIGxvb3AsIGJlY2F1c2UgaXQgaXRlcmF0ZXMgb3ZlciB0aGUgbmV3bHkgYWRkZWQgcHJvcHMgdG9vLlxuT2JqZWN0LmtleXMoaXNVbml0bGVzc051bWJlcikuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICBwcmVmaXhlcy5mb3JFYWNoKGZ1bmN0aW9uIChwcmVmaXgpIHtcbiAgICBpc1VuaXRsZXNzTnVtYmVyW3ByZWZpeEtleShwcmVmaXgsIHByb3ApXSA9IGlzVW5pdGxlc3NOdW1iZXJbcHJvcF07XG4gIH0pO1xufSk7XG5cbi8qKlxuICogTW9zdCBzdHlsZSBwcm9wZXJ0aWVzIGNhbiBiZSB1bnNldCBieSBkb2luZyAuc3R5bGVbcHJvcF0gPSAnJyBidXQgSUU4XG4gKiBkb2Vzbid0IGxpa2UgZG9pbmcgdGhhdCB3aXRoIHNob3J0aGFuZCBwcm9wZXJ0aWVzIHNvIGZvciB0aGUgcHJvcGVydGllcyB0aGF0XG4gKiBJRTggYnJlYWtzIG9uLCB3aGljaCBhcmUgbGlzdGVkIGhlcmUsIHdlIGluc3RlYWQgdW5zZXQgZWFjaCBvZiB0aGVcbiAqIGluZGl2aWR1YWwgcHJvcGVydGllcy4gU2VlIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEyMzg1LlxuICogVGhlIDQtdmFsdWUgJ2Nsb2NrJyBwcm9wZXJ0aWVzIGxpa2UgbWFyZ2luLCBwYWRkaW5nLCBib3JkZXItd2lkdGggc2VlbSB0b1xuICogYmVoYXZlIHdpdGhvdXQgYW55IHByb2JsZW1zLiBDdXJpb3VzbHksIGxpc3Qtc3R5bGUgd29ya3MgdG9vIHdpdGhvdXQgYW55XG4gKiBzcGVjaWFsIHByb2RkaW5nLlxuICovXG52YXIgc2hvcnRoYW5kUHJvcGVydHlFeHBhbnNpb25zID0ge1xuICBiYWNrZ3JvdW5kOiB7XG4gICAgYmFja2dyb3VuZEF0dGFjaG1lbnQ6IHRydWUsXG4gICAgYmFja2dyb3VuZENvbG9yOiB0cnVlLFxuICAgIGJhY2tncm91bmRJbWFnZTogdHJ1ZSxcbiAgICBiYWNrZ3JvdW5kUG9zaXRpb25YOiB0cnVlLFxuICAgIGJhY2tncm91bmRQb3NpdGlvblk6IHRydWUsXG4gICAgYmFja2dyb3VuZFJlcGVhdDogdHJ1ZVxuICB9LFxuICBiYWNrZ3JvdW5kUG9zaXRpb246IHtcbiAgICBiYWNrZ3JvdW5kUG9zaXRpb25YOiB0cnVlLFxuICAgIGJhY2tncm91bmRQb3NpdGlvblk6IHRydWVcbiAgfSxcbiAgYm9yZGVyOiB7XG4gICAgYm9yZGVyV2lkdGg6IHRydWUsXG4gICAgYm9yZGVyU3R5bGU6IHRydWUsXG4gICAgYm9yZGVyQ29sb3I6IHRydWVcbiAgfSxcbiAgYm9yZGVyQm90dG9tOiB7XG4gICAgYm9yZGVyQm90dG9tV2lkdGg6IHRydWUsXG4gICAgYm9yZGVyQm90dG9tU3R5bGU6IHRydWUsXG4gICAgYm9yZGVyQm90dG9tQ29sb3I6IHRydWVcbiAgfSxcbiAgYm9yZGVyTGVmdDoge1xuICAgIGJvcmRlckxlZnRXaWR0aDogdHJ1ZSxcbiAgICBib3JkZXJMZWZ0U3R5bGU6IHRydWUsXG4gICAgYm9yZGVyTGVmdENvbG9yOiB0cnVlXG4gIH0sXG4gIGJvcmRlclJpZ2h0OiB7XG4gICAgYm9yZGVyUmlnaHRXaWR0aDogdHJ1ZSxcbiAgICBib3JkZXJSaWdodFN0eWxlOiB0cnVlLFxuICAgIGJvcmRlclJpZ2h0Q29sb3I6IHRydWVcbiAgfSxcbiAgYm9yZGVyVG9wOiB7XG4gICAgYm9yZGVyVG9wV2lkdGg6IHRydWUsXG4gICAgYm9yZGVyVG9wU3R5bGU6IHRydWUsXG4gICAgYm9yZGVyVG9wQ29sb3I6IHRydWVcbiAgfSxcbiAgZm9udDoge1xuICAgIGZvbnRTdHlsZTogdHJ1ZSxcbiAgICBmb250VmFyaWFudDogdHJ1ZSxcbiAgICBmb250V2VpZ2h0OiB0cnVlLFxuICAgIGZvbnRTaXplOiB0cnVlLFxuICAgIGxpbmVIZWlnaHQ6IHRydWUsXG4gICAgZm9udEZhbWlseTogdHJ1ZVxuICB9LFxuICBvdXRsaW5lOiB7XG4gICAgb3V0bGluZVdpZHRoOiB0cnVlLFxuICAgIG91dGxpbmVTdHlsZTogdHJ1ZSxcbiAgICBvdXRsaW5lQ29sb3I6IHRydWVcbiAgfVxufTtcblxudmFyIENTU1Byb3BlcnR5ID0ge1xuICBpc1VuaXRsZXNzTnVtYmVyOiBpc1VuaXRsZXNzTnVtYmVyLFxuICBzaG9ydGhhbmRQcm9wZXJ0eUV4cGFuc2lvbnM6IHNob3J0aGFuZFByb3BlcnR5RXhwYW5zaW9uc1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDU1NQcm9wZXJ0eTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ1NTUHJvcGVydHkgPSByZXF1aXJlKCcuL0NTU1Byb3BlcnR5Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIGlzVW5pdGxlc3NOdW1iZXIgPSBDU1NQcm9wZXJ0eS5pc1VuaXRsZXNzTnVtYmVyO1xudmFyIHN0eWxlV2FybmluZ3MgPSB7fTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgdmFsdWUgaW50byB0aGUgcHJvcGVyIGNzcyB3cml0YWJsZSB2YWx1ZS4gVGhlIHN0eWxlIG5hbWUgYG5hbWVgXG4gKiBzaG91bGQgYmUgbG9naWNhbCAobm8gaHlwaGVucyksIGFzIHNwZWNpZmllZFxuICogaW4gYENTU1Byb3BlcnR5LmlzVW5pdGxlc3NOdW1iZXJgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENTUyBwcm9wZXJ0eSBuYW1lIHN1Y2ggYXMgYHRvcE1hcmdpbmAuXG4gKiBAcGFyYW0geyp9IHZhbHVlIENTUyBwcm9wZXJ0eSB2YWx1ZSBzdWNoIGFzIGAxMHB4YC5cbiAqIEBwYXJhbSB7UmVhY3RET01Db21wb25lbnR9IGNvbXBvbmVudFxuICogQHJldHVybiB7c3RyaW5nfSBOb3JtYWxpemVkIHN0eWxlIHZhbHVlIHdpdGggZGltZW5zaW9ucyBhcHBsaWVkLlxuICovXG5mdW5jdGlvbiBkYW5nZXJvdXNTdHlsZVZhbHVlKG5hbWUsIHZhbHVlLCBjb21wb25lbnQsIGlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgLy8gTm90ZSB0aGF0IHdlJ3ZlIHJlbW92ZWQgZXNjYXBlVGV4dEZvckJyb3dzZXIoKSBjYWxscyBoZXJlIHNpbmNlIHRoZVxuICAvLyB3aG9sZSBzdHJpbmcgd2lsbCBiZSBlc2NhcGVkIHdoZW4gdGhlIGF0dHJpYnV0ZSBpcyBpbmplY3RlZCBpbnRvXG4gIC8vIHRoZSBtYXJrdXAuIElmIHlvdSBwcm92aWRlIHVuc2FmZSB1c2VyIGRhdGEgaGVyZSB0aGV5IGNhbiBpbmplY3RcbiAgLy8gYXJiaXRyYXJ5IENTUyB3aGljaCBtYXkgYmUgcHJvYmxlbWF0aWMgKEkgY291bGRuJ3QgcmVwcm8gdGhpcyk6XG4gIC8vIGh0dHBzOi8vd3d3Lm93YXNwLm9yZy9pbmRleC5waHAvWFNTX0ZpbHRlcl9FdmFzaW9uX0NoZWF0X1NoZWV0XG4gIC8vIGh0dHA6Ly93d3cudGhlc3Bhbm5lci5jby51ay8yMDA3LzExLzI2L3VsdGltYXRlLXhzcy1jc3MtaW5qZWN0aW9uL1xuICAvLyBUaGlzIGlzIG5vdCBhbiBYU1MgaG9sZSBidXQgaW5zdGVhZCBhIHBvdGVudGlhbCBDU1MgaW5qZWN0aW9uIGlzc3VlXG4gIC8vIHdoaWNoIGhhcyBsZWFkIHRvIGEgZ3JlYXRlciBkaXNjdXNzaW9uIGFib3V0IGhvdyB3ZSdyZSBnb2luZyB0b1xuICAvLyB0cnVzdCBVUkxzIG1vdmluZyBmb3J3YXJkLiBTZWUgIzIxMTU5MDFcblxuICB2YXIgaXNFbXB0eSA9IHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdmFsdWUgPT09ICcnO1xuICBpZiAoaXNFbXB0eSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHZhciBpc05vbk51bWVyaWMgPSBpc05hTih2YWx1ZSk7XG4gIGlmIChpc0N1c3RvbVByb3BlcnR5IHx8IGlzTm9uTnVtZXJpYyB8fCB2YWx1ZSA9PT0gMCB8fCBpc1VuaXRsZXNzTnVtYmVyLmhhc093blByb3BlcnR5KG5hbWUpICYmIGlzVW5pdGxlc3NOdW1iZXJbbmFtZV0pIHtcbiAgICByZXR1cm4gJycgKyB2YWx1ZTsgLy8gY2FzdCB0byBzdHJpbmdcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIC8vIEFsbG93ICcwJyB0byBwYXNzIHRocm91Z2ggd2l0aG91dCB3YXJuaW5nLiAwIGlzIGFscmVhZHkgc3BlY2lhbCBhbmRcbiAgICAgIC8vIGRvZXNuJ3QgcmVxdWlyZSB1bml0cywgc28gd2UgZG9uJ3QgbmVlZCB0byB3YXJuIGFib3V0IGl0LlxuICAgICAgaWYgKGNvbXBvbmVudCAmJiB2YWx1ZSAhPT0gJzAnKSB7XG4gICAgICAgIHZhciBvd25lciA9IGNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQuX293bmVyO1xuICAgICAgICB2YXIgb3duZXJOYW1lID0gb3duZXIgPyBvd25lci5nZXROYW1lKCkgOiBudWxsO1xuICAgICAgICBpZiAob3duZXJOYW1lICYmICFzdHlsZVdhcm5pbmdzW293bmVyTmFtZV0pIHtcbiAgICAgICAgICBzdHlsZVdhcm5pbmdzW293bmVyTmFtZV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgd2FybmVkID0gZmFsc2U7XG4gICAgICAgIGlmIChvd25lck5hbWUpIHtcbiAgICAgICAgICB2YXIgd2FybmluZ3MgPSBzdHlsZVdhcm5pbmdzW293bmVyTmFtZV07XG4gICAgICAgICAgd2FybmVkID0gd2FybmluZ3NbbmFtZV07XG4gICAgICAgICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgICAgICAgIHdhcm5pbmdzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2EgYCVzYCB0YWcgKG93bmVyOiBgJXNgKSB3YXMgcGFzc2VkIGEgbnVtZXJpYyBzdHJpbmcgdmFsdWUgJyArICdmb3IgQ1NTIHByb3BlcnR5IGAlc2AgKHZhbHVlOiBgJXNgKSB3aGljaCB3aWxsIGJlIHRyZWF0ZWQgJyArICdhcyBhIHVuaXRsZXNzIG51bWJlciBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIFJlYWN0LicsIGNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQudHlwZSwgb3duZXJOYW1lIHx8ICd1bmtub3duJywgbmFtZSwgdmFsdWUpIDogdm9pZCAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHZhbHVlID0gdmFsdWUudHJpbSgpO1xuICB9XG4gIHJldHVybiB2YWx1ZSArICdweCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZTsiLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbnZhciBfdXBwZXJjYXNlUGF0dGVybiA9IC8oW0EtWl0pL2c7XG5cbi8qKlxuICogSHlwaGVuYXRlcyBhIGNhbWVsY2FzZWQgc3RyaW5nLCBmb3IgZXhhbXBsZTpcbiAqXG4gKiAgID4gaHlwaGVuYXRlKCdiYWNrZ3JvdW5kQ29sb3InKVxuICogICA8IFwiYmFja2dyb3VuZC1jb2xvclwiXG4gKlxuICogRm9yIENTUyBzdHlsZSBuYW1lcywgdXNlIGBoeXBoZW5hdGVTdHlsZU5hbWVgIGluc3RlYWQgd2hpY2ggd29ya3MgcHJvcGVybHlcbiAqIHdpdGggYWxsIHZlbmRvciBwcmVmaXhlcywgaW5jbHVkaW5nIGBtc2AuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBoeXBoZW5hdGUoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZShfdXBwZXJjYXNlUGF0dGVybiwgJy0kMScpLnRvTG93ZXJDYXNlKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaHlwaGVuYXRlOyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGh5cGhlbmF0ZSA9IHJlcXVpcmUoJy4vaHlwaGVuYXRlJyk7XG5cbnZhciBtc1BhdHRlcm4gPSAvXm1zLS87XG5cbi8qKlxuICogSHlwaGVuYXRlcyBhIGNhbWVsY2FzZWQgQ1NTIHByb3BlcnR5IG5hbWUsIGZvciBleGFtcGxlOlxuICpcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ2JhY2tncm91bmRDb2xvcicpXG4gKiAgIDwgXCJiYWNrZ3JvdW5kLWNvbG9yXCJcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ01velRyYW5zaXRpb24nKVxuICogICA8IFwiLW1vei10cmFuc2l0aW9uXCJcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ21zVHJhbnNpdGlvbicpXG4gKiAgIDwgXCItbXMtdHJhbnNpdGlvblwiXG4gKlxuICogQXMgTW9kZXJuaXpyIHN1Z2dlc3RzIChodHRwOi8vbW9kZXJuaXpyLmNvbS9kb2NzLyNwcmVmaXhlZCksIGFuIGBtc2AgcHJlZml4XG4gKiBpcyBjb252ZXJ0ZWQgdG8gYC1tcy1gLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gaHlwaGVuYXRlU3R5bGVOYW1lKHN0cmluZykge1xuICByZXR1cm4gaHlwaGVuYXRlKHN0cmluZykucmVwbGFjZShtc1BhdHRlcm4sICctbXMtJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaHlwaGVuYXRlU3R5bGVOYW1lOyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqIEB0eXBlY2hlY2tzIHN0YXRpYy1vbmx5XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1lbW9pemVzIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgb25lIHN0cmluZyBhcmd1bWVudC5cbiAqL1xuXG5mdW5jdGlvbiBtZW1vaXplU3RyaW5nT25seShjYWxsYmFjaykge1xuICB2YXIgY2FjaGUgPSB7fTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICBpZiAoIWNhY2hlLmhhc093blByb3BlcnR5KHN0cmluZykpIHtcbiAgICAgIGNhY2hlW3N0cmluZ10gPSBjYWxsYmFjay5jYWxsKHRoaXMsIHN0cmluZyk7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZVtzdHJpbmddO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1lbW9pemVTdHJpbmdPbmx5OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBDU1NQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vQ1NTUHJvcGVydHknKTtcbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG52YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSByZXF1aXJlKCcuL1JlYWN0SW5zdHJ1bWVudGF0aW9uJyk7XG5cbnZhciBjYW1lbGl6ZVN0eWxlTmFtZSA9IHJlcXVpcmUoJ2ZianMvbGliL2NhbWVsaXplU3R5bGVOYW1lJyk7XG52YXIgZGFuZ2Vyb3VzU3R5bGVWYWx1ZSA9IHJlcXVpcmUoJy4vZGFuZ2Vyb3VzU3R5bGVWYWx1ZScpO1xudmFyIGh5cGhlbmF0ZVN0eWxlTmFtZSA9IHJlcXVpcmUoJ2ZianMvbGliL2h5cGhlbmF0ZVN0eWxlTmFtZScpO1xudmFyIG1lbW9pemVTdHJpbmdPbmx5ID0gcmVxdWlyZSgnZmJqcy9saWIvbWVtb2l6ZVN0cmluZ09ubHknKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgcHJvY2Vzc1N0eWxlTmFtZSA9IG1lbW9pemVTdHJpbmdPbmx5KGZ1bmN0aW9uIChzdHlsZU5hbWUpIHtcbiAgcmV0dXJuIGh5cGhlbmF0ZVN0eWxlTmFtZShzdHlsZU5hbWUpO1xufSk7XG5cbnZhciBoYXNTaG9ydGhhbmRQcm9wZXJ0eUJ1ZyA9IGZhbHNlO1xudmFyIHN0eWxlRmxvYXRBY2Nlc3NvciA9ICdjc3NGbG9hdCc7XG5pZiAoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKSB7XG4gIHZhciB0ZW1wU3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZTtcbiAgdHJ5IHtcbiAgICAvLyBJRTggdGhyb3dzIFwiSW52YWxpZCBhcmd1bWVudC5cIiBpZiByZXNldHRpbmcgc2hvcnRoYW5kIHN0eWxlIHByb3BlcnRpZXMuXG4gICAgdGVtcFN0eWxlLmZvbnQgPSAnJztcbiAgfSBjYXRjaCAoZSkge1xuICAgIGhhc1Nob3J0aGFuZFByb3BlcnR5QnVnID0gdHJ1ZTtcbiAgfVxuICAvLyBJRTggb25seSBzdXBwb3J0cyBhY2Nlc3NpbmcgY3NzRmxvYXQgKHN0YW5kYXJkKSBhcyBzdHlsZUZsb2F0XG4gIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuY3NzRmxvYXQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0eWxlRmxvYXRBY2Nlc3NvciA9ICdzdHlsZUZsb2F0JztcbiAgfVxufVxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAvLyAnbXNUcmFuc2Zvcm0nIGlzIGNvcnJlY3QsIGJ1dCB0aGUgb3RoZXIgcHJlZml4ZXMgc2hvdWxkIGJlIGNhcGl0YWxpemVkXG4gIHZhciBiYWRWZW5kb3JlZFN0eWxlTmFtZVBhdHRlcm4gPSAvXig/OndlYmtpdHxtb3p8bylbQS1aXS87XG5cbiAgLy8gc3R5bGUgdmFsdWVzIHNob3VsZG4ndCBjb250YWluIGEgc2VtaWNvbG9uXG4gIHZhciBiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4gPSAvO1xccyokLztcblxuICB2YXIgd2FybmVkU3R5bGVOYW1lcyA9IHt9O1xuICB2YXIgd2FybmVkU3R5bGVWYWx1ZXMgPSB7fTtcbiAgdmFyIHdhcm5lZEZvck5hTlZhbHVlID0gZmFsc2U7XG5cbiAgdmFyIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lID0gZnVuY3Rpb24gKG5hbWUsIG93bmVyKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlTmFtZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0gPSB0cnVlO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVW5zdXBwb3J0ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8lcycsIG5hbWUsIGNhbWVsaXplU3R5bGVOYW1lKG5hbWUpLCBjaGVja1JlbmRlck1lc3NhZ2Uob3duZXIpKSA6IHZvaWQgMDtcbiAgfTtcblxuICB2YXIgd2FybkJhZFZlbmRvcmVkU3R5bGVOYW1lID0gZnVuY3Rpb24gKG5hbWUsIG93bmVyKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlTmFtZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0gPSB0cnVlO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVW5zdXBwb3J0ZWQgdmVuZG9yLXByZWZpeGVkIHN0eWxlIHByb3BlcnR5ICVzLiBEaWQgeW91IG1lYW4gJXM/JXMnLCBuYW1lLCBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSwgY2hlY2tSZW5kZXJNZXNzYWdlKG93bmVyKSkgOiB2b2lkIDA7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlV2l0aFNlbWljb2xvbiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgb3duZXIpIHtcbiAgICBpZiAod2FybmVkU3R5bGVWYWx1ZXMuaGFzT3duUHJvcGVydHkodmFsdWUpICYmIHdhcm5lZFN0eWxlVmFsdWVzW3ZhbHVlXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZFN0eWxlVmFsdWVzW3ZhbHVlXSA9IHRydWU7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsIFwiU3R5bGUgcHJvcGVydHkgdmFsdWVzIHNob3VsZG4ndCBjb250YWluIGEgc2VtaWNvbG9uLiVzIFwiICsgJ1RyeSBcIiVzOiAlc1wiIGluc3RlYWQuJywgY2hlY2tSZW5kZXJNZXNzYWdlKG93bmVyKSwgbmFtZSwgdmFsdWUucmVwbGFjZShiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4sICcnKSkgOiB2b2lkIDA7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlSXNOYU4gPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIG93bmVyKSB7XG4gICAgaWYgKHdhcm5lZEZvck5hTlZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkRm9yTmFOVmFsdWUgPSB0cnVlO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYE5hTmAgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgdGhlIGAlc2AgY3NzIHN0eWxlIHByb3BlcnR5LiVzJywgbmFtZSwgY2hlY2tSZW5kZXJNZXNzYWdlKG93bmVyKSkgOiB2b2lkIDA7XG4gIH07XG5cbiAgdmFyIGNoZWNrUmVuZGVyTWVzc2FnZSA9IGZ1bmN0aW9uIChvd25lcikge1xuICAgIGlmIChvd25lcikge1xuICAgICAgdmFyIG5hbWUgPSBvd25lci5nZXROYW1lKCk7XG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICByZXR1cm4gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtSZWFjdERPTUNvbXBvbmVudH0gY29tcG9uZW50XG4gICAqL1xuICB2YXIgd2FyblZhbGlkU3R5bGUgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIGNvbXBvbmVudCkge1xuICAgIHZhciBvd25lcjtcbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICBvd25lciA9IGNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQuX293bmVyO1xuICAgIH1cbiAgICBpZiAobmFtZS5pbmRleE9mKCctJykgPiAtMSkge1xuICAgICAgd2Fybkh5cGhlbmF0ZWRTdHlsZU5hbWUobmFtZSwgb3duZXIpO1xuICAgIH0gZWxzZSBpZiAoYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuLnRlc3QobmFtZSkpIHtcbiAgICAgIHdhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZShuYW1lLCBvd25lcik7XG4gICAgfSBlbHNlIGlmIChiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHdhcm5TdHlsZVZhbHVlV2l0aFNlbWljb2xvbihuYW1lLCB2YWx1ZSwgb3duZXIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlzTmFOKHZhbHVlKSkge1xuICAgICAgd2FyblN0eWxlVmFsdWVJc05hTihuYW1lLCB2YWx1ZSwgb3duZXIpO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBPcGVyYXRpb25zIGZvciBkZWFsaW5nIHdpdGggQ1NTIHByb3BlcnRpZXMuXG4gKi9cbnZhciBDU1NQcm9wZXJ0eU9wZXJhdGlvbnMgPSB7XG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWFwcGluZyBvZiBzdHlsZSBwcm9wZXJ0aWVzIGZvciB1c2UgYXMgaW5saW5lIHN0eWxlczpcbiAgICpcbiAgICogICA+IGNyZWF0ZU1hcmt1cEZvclN0eWxlcyh7d2lkdGg6ICcyMDBweCcsIGhlaWdodDogMH0pXG4gICAqICAgXCJ3aWR0aDoyMDBweDtoZWlnaHQ6MDtcIlxuICAgKlxuICAgKiBVbmRlZmluZWQgdmFsdWVzIGFyZSBpZ25vcmVkIHNvIHRoYXQgZGVjbGFyYXRpdmUgcHJvZ3JhbW1pbmcgaXMgZWFzaWVyLlxuICAgKiBUaGUgcmVzdWx0IHNob3VsZCBiZSBIVE1MLWVzY2FwZWQgYmVmb3JlIGluc2VydGlvbiBpbnRvIHRoZSBET00uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzdHlsZXNcbiAgICogQHBhcmFtIHtSZWFjdERPTUNvbXBvbmVudH0gY29tcG9uZW50XG4gICAqIEByZXR1cm4gez9zdHJpbmd9XG4gICAqL1xuICBjcmVhdGVNYXJrdXBGb3JTdHlsZXM6IGZ1bmN0aW9uIChzdHlsZXMsIGNvbXBvbmVudCkge1xuICAgIHZhciBzZXJpYWxpemVkID0gJyc7XG4gICAgZm9yICh2YXIgc3R5bGVOYW1lIGluIHN0eWxlcykge1xuICAgICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBpc0N1c3RvbVByb3BlcnR5ID0gc3R5bGVOYW1lLmluZGV4T2YoJy0tJykgPT09IDA7XG4gICAgICB2YXIgc3R5bGVWYWx1ZSA9IHN0eWxlc1tzdHlsZU5hbWVdO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgaWYgKCFpc0N1c3RvbVByb3BlcnR5KSB7XG4gICAgICAgICAgd2FyblZhbGlkU3R5bGUoc3R5bGVOYW1lLCBzdHlsZVZhbHVlLCBjb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3R5bGVWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gcHJvY2Vzc1N0eWxlTmFtZShzdHlsZU5hbWUpICsgJzonO1xuICAgICAgICBzZXJpYWxpemVkICs9IGRhbmdlcm91c1N0eWxlVmFsdWUoc3R5bGVOYW1lLCBzdHlsZVZhbHVlLCBjb21wb25lbnQsIGlzQ3VzdG9tUHJvcGVydHkpICsgJzsnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2VyaWFsaXplZCB8fCBudWxsO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgbXVsdGlwbGUgc3R5bGVzIG9uIGEgbm9kZS4gIElmIGEgdmFsdWUgaXMgc3BlY2lmaWVkIGFzXG4gICAqICcnIChlbXB0eSBzdHJpbmcpLCB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBwcm9wZXJ0eSB3aWxsIGJlIHVuc2V0LlxuICAgKlxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAgICogQHBhcmFtIHtvYmplY3R9IHN0eWxlc1xuICAgKiBAcGFyYW0ge1JlYWN0RE9NQ29tcG9uZW50fSBjb21wb25lbnRcbiAgICovXG4gIHNldFZhbHVlRm9yU3R5bGVzOiBmdW5jdGlvbiAobm9kZSwgc3R5bGVzLCBjb21wb25lbnQpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgIGluc3RhbmNlSUQ6IGNvbXBvbmVudC5fZGVidWdJRCxcbiAgICAgICAgdHlwZTogJ3VwZGF0ZSBzdHlsZXMnLFxuICAgICAgICBwYXlsb2FkOiBzdHlsZXNcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBzdHlsZSA9IG5vZGUuc3R5bGU7XG4gICAgZm9yICh2YXIgc3R5bGVOYW1lIGluIHN0eWxlcykge1xuICAgICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBpc0N1c3RvbVByb3BlcnR5ID0gc3R5bGVOYW1lLmluZGV4T2YoJy0tJykgPT09IDA7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBpZiAoIWlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgICAgICAgICB3YXJuVmFsaWRTdHlsZShzdHlsZU5hbWUsIHN0eWxlc1tzdHlsZU5hbWVdLCBjb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgc3R5bGVWYWx1ZSA9IGRhbmdlcm91c1N0eWxlVmFsdWUoc3R5bGVOYW1lLCBzdHlsZXNbc3R5bGVOYW1lXSwgY29tcG9uZW50LCBpc0N1c3RvbVByb3BlcnR5KTtcbiAgICAgIGlmIChzdHlsZU5hbWUgPT09ICdmbG9hdCcgfHwgc3R5bGVOYW1lID09PSAnY3NzRmxvYXQnKSB7XG4gICAgICAgIHN0eWxlTmFtZSA9IHN0eWxlRmxvYXRBY2Nlc3NvcjtcbiAgICAgIH1cbiAgICAgIGlmIChpc0N1c3RvbVByb3BlcnR5KSB7XG4gICAgICAgIHN0eWxlLnNldFByb3BlcnR5KHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKHN0eWxlVmFsdWUpIHtcbiAgICAgICAgc3R5bGVbc3R5bGVOYW1lXSA9IHN0eWxlVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZXhwYW5zaW9uID0gaGFzU2hvcnRoYW5kUHJvcGVydHlCdWcgJiYgQ1NTUHJvcGVydHkuc2hvcnRoYW5kUHJvcGVydHlFeHBhbnNpb25zW3N0eWxlTmFtZV07XG4gICAgICAgIGlmIChleHBhbnNpb24pIHtcbiAgICAgICAgICAvLyBTaG9ydGhhbmQgcHJvcGVydHkgdGhhdCBJRTggd29uJ3QgbGlrZSB1bnNldHRpbmcsIHNvIHVuc2V0IGVhY2hcbiAgICAgICAgICAvLyBjb21wb25lbnQgdG8gcGxhY2F0ZSBpdFxuICAgICAgICAgIGZvciAodmFyIGluZGl2aWR1YWxTdHlsZU5hbWUgaW4gZXhwYW5zaW9uKSB7XG4gICAgICAgICAgICBzdHlsZVtpbmRpdmlkdWFsU3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHlsZVtzdHlsZU5hbWVdID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ1NTUHJvcGVydHlPcGVyYXRpb25zOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIgPSByZXF1aXJlKCcuL2VzY2FwZVRleHRDb250ZW50Rm9yQnJvd3NlcicpO1xuXG4vKipcbiAqIEVzY2FwZXMgYXR0cmlidXRlIHZhbHVlIHRvIHByZXZlbnQgc2NyaXB0aW5nIGF0dGFja3MuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBlc2NhcGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEFuIGVzY2FwZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBxdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3Nlcih2YWx1ZSkge1xuICByZXR1cm4gJ1wiJyArIGVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3Nlcih2YWx1ZSkgKyAnXCInO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBET01Qcm9wZXJ0eSA9IHJlcXVpcmUoJy4vRE9NUHJvcGVydHknKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xudmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xuXG52YXIgcXVvdGVBdHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXIgPSByZXF1aXJlKCcuL3F1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYID0gbmV3IFJlZ0V4cCgnXlsnICsgRE9NUHJvcGVydHkuQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiArICddWycgKyBET01Qcm9wZXJ0eS5BVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xudmFyIGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUgPSB7fTtcbnZhciB2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGUgPSB7fTtcblxuZnVuY3Rpb24gaXNBdHRyaWJ1dGVOYW1lU2FmZShhdHRyaWJ1dGVOYW1lKSB7XG4gIGlmICh2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGUuaGFzT3duUHJvcGVydHkoYXR0cmlidXRlTmFtZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZS5oYXNPd25Qcm9wZXJ0eShhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVgudGVzdChhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnSW52YWxpZCBhdHRyaWJ1dGUgbmFtZTogYCVzYCcsIGF0dHJpYnV0ZU5hbWUpIDogdm9pZCAwO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHNob3VsZElnbm9yZVZhbHVlKHByb3BlcnR5SW5mbywgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgcHJvcGVydHlJbmZvLmhhc0Jvb2xlYW5WYWx1ZSAmJiAhdmFsdWUgfHwgcHJvcGVydHlJbmZvLmhhc051bWVyaWNWYWx1ZSAmJiBpc05hTih2YWx1ZSkgfHwgcHJvcGVydHlJbmZvLmhhc1Bvc2l0aXZlTnVtZXJpY1ZhbHVlICYmIHZhbHVlIDwgMSB8fCBwcm9wZXJ0eUluZm8uaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZSAmJiB2YWx1ZSA9PT0gZmFsc2U7XG59XG5cbi8qKlxuICogT3BlcmF0aW9ucyBmb3IgZGVhbGluZyB3aXRoIERPTSBwcm9wZXJ0aWVzLlxuICovXG52YXIgRE9NUHJvcGVydHlPcGVyYXRpb25zID0ge1xuICAvKipcbiAgICogQ3JlYXRlcyBtYXJrdXAgZm9yIHRoZSBJRCBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFVuZXNjYXBlZCBJRC5cbiAgICogQHJldHVybiB7c3RyaW5nfSBNYXJrdXAgc3RyaW5nLlxuICAgKi9cbiAgY3JlYXRlTWFya3VwRm9ySUQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHJldHVybiBET01Qcm9wZXJ0eS5JRF9BVFRSSUJVVEVfTkFNRSArICc9JyArIHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyKGlkKTtcbiAgfSxcblxuICBzZXRBdHRyaWJ1dGVGb3JJRDogZnVuY3Rpb24gKG5vZGUsIGlkKSB7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoRE9NUHJvcGVydHkuSURfQVRUUklCVVRFX05BTUUsIGlkKTtcbiAgfSxcblxuICBjcmVhdGVNYXJrdXBGb3JSb290OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIERPTVByb3BlcnR5LlJPT1RfQVRUUklCVVRFX05BTUUgKyAnPVwiXCInO1xuICB9LFxuXG4gIHNldEF0dHJpYnV0ZUZvclJvb3Q6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoRE9NUHJvcGVydHkuUk9PVF9BVFRSSUJVVEVfTkFNRSwgJycpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG1hcmt1cCBmb3IgYSBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcmV0dXJuIHs/c3RyaW5nfSBNYXJrdXAgc3RyaW5nLCBvciBudWxsIGlmIHRoZSBwcm9wZXJ0eSB3YXMgaW52YWxpZC5cbiAgICovXG4gIGNyZWF0ZU1hcmt1cEZvclByb3BlcnR5OiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgcHJvcGVydHlJbmZvID0gRE9NUHJvcGVydHkucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IERPTVByb3BlcnR5LnByb3BlcnRpZXNbbmFtZV0gOiBudWxsO1xuICAgIGlmIChwcm9wZXJ0eUluZm8pIHtcbiAgICAgIGlmIChzaG91bGRJZ25vcmVWYWx1ZShwcm9wZXJ0eUluZm8sIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgICB2YXIgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lO1xuICAgICAgaWYgKHByb3BlcnR5SW5mby5oYXNCb29sZWFuVmFsdWUgfHwgcHJvcGVydHlJbmZvLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUgJiYgdmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZU5hbWUgKyAnPVwiXCInO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGF0dHJpYnV0ZU5hbWUgKyAnPScgKyBxdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3Nlcih2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChET01Qcm9wZXJ0eS5pc0N1c3RvbUF0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5hbWUgKyAnPScgKyBxdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3Nlcih2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG1hcmt1cCBmb3IgYSBjdXN0b20gcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfSBNYXJrdXAgc3RyaW5nLCBvciBlbXB0eSBzdHJpbmcgaWYgdGhlIHByb3BlcnR5IHdhcyBpbnZhbGlkLlxuICAgKi9cbiAgY3JlYXRlTWFya3VwRm9yQ3VzdG9tQXR0cmlidXRlOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAoIWlzQXR0cmlidXRlTmFtZVNhZmUobmFtZSkgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZSArICc9JyArIHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyKHZhbHVlKTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgZm9yIGEgcHJvcGVydHkgb24gYSBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKi9cbiAgc2V0VmFsdWVGb3JQcm9wZXJ0eTogZnVuY3Rpb24gKG5vZGUsIG5hbWUsIHZhbHVlKSB7XG4gICAgdmFyIHByb3BlcnR5SW5mbyA9IERPTVByb3BlcnR5LnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzW25hbWVdIDogbnVsbDtcbiAgICBpZiAocHJvcGVydHlJbmZvKSB7XG4gICAgICB2YXIgbXV0YXRpb25NZXRob2QgPSBwcm9wZXJ0eUluZm8ubXV0YXRpb25NZXRob2Q7XG4gICAgICBpZiAobXV0YXRpb25NZXRob2QpIHtcbiAgICAgICAgbXV0YXRpb25NZXRob2Qobm9kZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChzaG91bGRJZ25vcmVWYWx1ZShwcm9wZXJ0eUluZm8sIHZhbHVlKSkge1xuICAgICAgICB0aGlzLmRlbGV0ZVZhbHVlRm9yUHJvcGVydHkobm9kZSwgbmFtZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eSkge1xuICAgICAgICAvLyBDb250cmFyeSB0byBgc2V0QXR0cmlidXRlYCwgb2JqZWN0IHByb3BlcnRpZXMgYXJlIHByb3Blcmx5XG4gICAgICAgIC8vIGB0b1N0cmluZ2BlZCBieSBJRTgvOS5cbiAgICAgICAgbm9kZVtwcm9wZXJ0eUluZm8ucHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZTtcbiAgICAgICAgdmFyIG5hbWVzcGFjZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lc3BhY2U7XG4gICAgICAgIC8vIGBzZXRBdHRyaWJ1dGVgIHdpdGggb2JqZWN0cyBiZWNvbWVzIG9ubHkgYFtvYmplY3RdYCBpbiBJRTgvOSxcbiAgICAgICAgLy8gKCcnICsgdmFsdWUpIG1ha2VzIGl0IG91dHB1dCB0aGUgY29ycmVjdCB0b1N0cmluZygpLXZhbHVlLlxuICAgICAgICBpZiAobmFtZXNwYWNlKSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGVOUyhuYW1lc3BhY2UsIGF0dHJpYnV0ZU5hbWUsICcnICsgdmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5SW5mby5oYXNCb29sZWFuVmFsdWUgfHwgcHJvcGVydHlJbmZvLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUgJiYgdmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCAnJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgJycgKyB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKERPTVByb3BlcnR5LmlzQ3VzdG9tQXR0cmlidXRlKG5hbWUpKSB7XG4gICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuc2V0VmFsdWVGb3JBdHRyaWJ1dGUobm9kZSwgbmFtZSwgdmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgcGF5bG9hZCA9IHt9O1xuICAgICAgcGF5bG9hZFtuYW1lXSA9IHZhbHVlO1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgIGluc3RhbmNlSUQ6IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpLl9kZWJ1Z0lELFxuICAgICAgICB0eXBlOiAndXBkYXRlIGF0dHJpYnV0ZScsXG4gICAgICAgIHBheWxvYWQ6IHBheWxvYWRcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBzZXRWYWx1ZUZvckF0dHJpYnV0ZTogZnVuY3Rpb24gKG5vZGUsIG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKCFpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgJycgKyB2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBwYXlsb2FkID0ge307XG4gICAgICBwYXlsb2FkW25hbWVdID0gdmFsdWU7XG4gICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgICAgaW5zdGFuY2VJRDogUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUobm9kZSkuX2RlYnVnSUQsXG4gICAgICAgIHR5cGU6ICd1cGRhdGUgYXR0cmlidXRlJyxcbiAgICAgICAgcGF5bG9hZDogcGF5bG9hZFxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGFuIGF0dHJpYnV0ZXMgZnJvbSBhIG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZGVsZXRlVmFsdWVGb3JBdHRyaWJ1dGU6IGZ1bmN0aW9uIChub2RlLCBuYW1lKSB7XG4gICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe1xuICAgICAgICBpbnN0YW5jZUlEOiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKS5fZGVidWdJRCxcbiAgICAgICAgdHlwZTogJ3JlbW92ZSBhdHRyaWJ1dGUnLFxuICAgICAgICBwYXlsb2FkOiBuYW1lXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBkZWxldGVWYWx1ZUZvclByb3BlcnR5OiBmdW5jdGlvbiAobm9kZSwgbmFtZSkge1xuICAgIHZhciBwcm9wZXJ0eUluZm8gPSBET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG5hbWUpID8gRE9NUHJvcGVydHkucHJvcGVydGllc1tuYW1lXSA6IG51bGw7XG4gICAgaWYgKHByb3BlcnR5SW5mbykge1xuICAgICAgdmFyIG11dGF0aW9uTWV0aG9kID0gcHJvcGVydHlJbmZvLm11dGF0aW9uTWV0aG9kO1xuICAgICAgaWYgKG11dGF0aW9uTWV0aG9kKSB7XG4gICAgICAgIG11dGF0aW9uTWV0aG9kKG5vZGUsIHVuZGVmaW5lZCk7XG4gICAgICB9IGVsc2UgaWYgKHByb3BlcnR5SW5mby5tdXN0VXNlUHJvcGVydHkpIHtcbiAgICAgICAgdmFyIHByb3BOYW1lID0gcHJvcGVydHlJbmZvLnByb3BlcnR5TmFtZTtcbiAgICAgICAgaWYgKHByb3BlcnR5SW5mby5oYXNCb29sZWFuVmFsdWUpIHtcbiAgICAgICAgICBub2RlW3Byb3BOYW1lXSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vZGVbcHJvcE5hbWVdID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKERPTVByb3BlcnR5LmlzQ3VzdG9tQXR0cmlidXRlKG5hbWUpKSB7XG4gICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgIGluc3RhbmNlSUQ6IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpLl9kZWJ1Z0lELFxuICAgICAgICB0eXBlOiAncmVtb3ZlIGF0dHJpYnV0ZScsXG4gICAgICAgIHBheWxvYWQ6IG5hbWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBET01Qcm9wZXJ0eU9wZXJhdGlvbnM7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEV2ZW50UGx1Z2luSHViID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpbkh1YicpO1xuXG5mdW5jdGlvbiBydW5FdmVudFF1ZXVlSW5CYXRjaChldmVudHMpIHtcbiAgRXZlbnRQbHVnaW5IdWIuZW5xdWV1ZUV2ZW50cyhldmVudHMpO1xuICBFdmVudFBsdWdpbkh1Yi5wcm9jZXNzRXZlbnRRdWV1ZShmYWxzZSk7XG59XG5cbnZhciBSZWFjdEV2ZW50RW1pdHRlck1peGluID0ge1xuICAvKipcbiAgICogU3RyZWFtcyBhIGZpcmVkIHRvcC1sZXZlbCBldmVudCB0byBgRXZlbnRQbHVnaW5IdWJgIHdoZXJlIHBsdWdpbnMgaGF2ZSB0aGVcbiAgICogb3Bwb3J0dW5pdHkgdG8gY3JlYXRlIGBSZWFjdEV2ZW50YHMgdG8gYmUgZGlzcGF0Y2hlZC5cbiAgICovXG4gIGhhbmRsZVRvcExldmVsOiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICB2YXIgZXZlbnRzID0gRXZlbnRQbHVnaW5IdWIuZXh0cmFjdEV2ZW50cyh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgcnVuRXZlbnRRdWV1ZUluQmF0Y2goZXZlbnRzKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEV2ZW50RW1pdHRlck1peGluOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG5cbi8qKlxuICogR2VuZXJhdGUgYSBtYXBwaW5nIG9mIHN0YW5kYXJkIHZlbmRvciBwcmVmaXhlcyB1c2luZyB0aGUgZGVmaW5lZCBzdHlsZSBwcm9wZXJ0eSBhbmQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3R5bGVQcm9wXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5mdW5jdGlvbiBtYWtlUHJlZml4TWFwKHN0eWxlUHJvcCwgZXZlbnROYW1lKSB7XG4gIHZhciBwcmVmaXhlcyA9IHt9O1xuXG4gIHByZWZpeGVzW3N0eWxlUHJvcC50b0xvd2VyQ2FzZSgpXSA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICBwcmVmaXhlc1snV2Via2l0JyArIHN0eWxlUHJvcF0gPSAnd2Via2l0JyArIGV2ZW50TmFtZTtcbiAgcHJlZml4ZXNbJ01veicgKyBzdHlsZVByb3BdID0gJ21veicgKyBldmVudE5hbWU7XG4gIHByZWZpeGVzWydtcycgKyBzdHlsZVByb3BdID0gJ01TJyArIGV2ZW50TmFtZTtcbiAgcHJlZml4ZXNbJ08nICsgc3R5bGVQcm9wXSA9ICdvJyArIGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIHJldHVybiBwcmVmaXhlcztcbn1cblxuLyoqXG4gKiBBIGxpc3Qgb2YgZXZlbnQgbmFtZXMgdG8gYSBjb25maWd1cmFibGUgbGlzdCBvZiB2ZW5kb3IgcHJlZml4ZXMuXG4gKi9cbnZhciB2ZW5kb3JQcmVmaXhlcyA9IHtcbiAgYW5pbWF0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uRW5kJyksXG4gIGFuaW1hdGlvbml0ZXJhdGlvbjogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkl0ZXJhdGlvbicpLFxuICBhbmltYXRpb25zdGFydDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvblN0YXJ0JyksXG4gIHRyYW5zaXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ1RyYW5zaXRpb24nLCAnVHJhbnNpdGlvbkVuZCcpXG59O1xuXG4vKipcbiAqIEV2ZW50IG5hbWVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gZGV0ZWN0ZWQgYW5kIHByZWZpeGVkIChpZiBhcHBsaWNhYmxlKS5cbiAqL1xudmFyIHByZWZpeGVkRXZlbnROYW1lcyA9IHt9O1xuXG4vKipcbiAqIEVsZW1lbnQgdG8gY2hlY2sgZm9yIHByZWZpeGVzIG9uLlxuICovXG52YXIgc3R5bGUgPSB7fTtcblxuLyoqXG4gKiBCb290c3RyYXAgaWYgYSBET00gZXhpc3RzLlxuICovXG5pZiAoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKSB7XG4gIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGU7XG5cbiAgLy8gT24gc29tZSBwbGF0Zm9ybXMsIGluIHBhcnRpY3VsYXIgc29tZSByZWxlYXNlcyBvZiBBbmRyb2lkIDQueCxcbiAgLy8gdGhlIHVuLXByZWZpeGVkIFwiYW5pbWF0aW9uXCIgYW5kIFwidHJhbnNpdGlvblwiIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgb24gdGhlXG4gIC8vIHN0eWxlIG9iamVjdCBidXQgdGhlIGV2ZW50cyB0aGF0IGZpcmUgd2lsbCBzdGlsbCBiZSBwcmVmaXhlZCwgc28gd2UgbmVlZFxuICAvLyB0byBjaGVjayBpZiB0aGUgdW4tcHJlZml4ZWQgZXZlbnRzIGFyZSB1c2FibGUsIGFuZCBpZiBub3QgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgbWFwLlxuICBpZiAoISgnQW5pbWF0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uO1xuICB9XG5cbiAgLy8gU2FtZSBhcyBhYm92ZVxuICBpZiAoISgnVHJhbnNpdGlvbkV2ZW50JyBpbiB3aW5kb3cpKSB7XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEF0dGVtcHRzIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCB2ZW5kb3IgcHJlZml4ZWQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShldmVudE5hbWUpIHtcbiAgaWYgKHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdO1xuICB9IGVsc2UgaWYgKCF2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZTtcbiAgfVxuXG4gIHZhciBwcmVmaXhNYXAgPSB2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdO1xuXG4gIGZvciAodmFyIHN0eWxlUHJvcCBpbiBwcmVmaXhNYXApIHtcbiAgICBpZiAocHJlZml4TWFwLmhhc093blByb3BlcnR5KHN0eWxlUHJvcCkgJiYgc3R5bGVQcm9wIGluIHN0eWxlKSB7XG4gICAgICByZXR1cm4gcHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV0gPSBwcmVmaXhNYXBbc3R5bGVQcm9wXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBFdmVudFBsdWdpblJlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpblJlZ2lzdHJ5Jyk7XG52YXIgUmVhY3RFdmVudEVtaXR0ZXJNaXhpbiA9IHJlcXVpcmUoJy4vUmVhY3RFdmVudEVtaXR0ZXJNaXhpbicpO1xudmFyIFZpZXdwb3J0TWV0cmljcyA9IHJlcXVpcmUoJy4vVmlld3BvcnRNZXRyaWNzJyk7XG5cbnZhciBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSA9IHJlcXVpcmUoJy4vZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUnKTtcbnZhciBpc0V2ZW50U3VwcG9ydGVkID0gcmVxdWlyZSgnLi9pc0V2ZW50U3VwcG9ydGVkJyk7XG5cbi8qKlxuICogU3VtbWFyeSBvZiBgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyYCBldmVudCBoYW5kbGluZzpcbiAqXG4gKiAgLSBUb3AtbGV2ZWwgZGVsZWdhdGlvbiBpcyB1c2VkIHRvIHRyYXAgbW9zdCBuYXRpdmUgYnJvd3NlciBldmVudHMuIFRoaXNcbiAqICAgIG1heSBvbmx5IG9jY3VyIGluIHRoZSBtYWluIHRocmVhZCBhbmQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mXG4gKiAgICBSZWFjdEV2ZW50TGlzdGVuZXIsIHdoaWNoIGlzIGluamVjdGVkIGFuZCBjYW4gdGhlcmVmb3JlIHN1cHBvcnQgcGx1Z2dhYmxlXG4gKiAgICBldmVudCBzb3VyY2VzLiBUaGlzIGlzIHRoZSBvbmx5IHdvcmsgdGhhdCBvY2N1cnMgaW4gdGhlIG1haW4gdGhyZWFkLlxuICpcbiAqICAtIFdlIG5vcm1hbGl6ZSBhbmQgZGUtZHVwbGljYXRlIGV2ZW50cyB0byBhY2NvdW50IGZvciBicm93c2VyIHF1aXJrcy4gVGhpc1xuICogICAgbWF5IGJlIGRvbmUgaW4gdGhlIHdvcmtlciB0aHJlYWQuXG4gKlxuICogIC0gRm9yd2FyZCB0aGVzZSBuYXRpdmUgZXZlbnRzICh3aXRoIHRoZSBhc3NvY2lhdGVkIHRvcC1sZXZlbCB0eXBlIHVzZWQgdG9cbiAqICAgIHRyYXAgaXQpIHRvIGBFdmVudFBsdWdpbkh1YmAsIHdoaWNoIGluIHR1cm4gd2lsbCBhc2sgcGx1Z2lucyBpZiB0aGV5IHdhbnRcbiAqICAgIHRvIGV4dHJhY3QgYW55IHN5bnRoZXRpYyBldmVudHMuXG4gKlxuICogIC0gVGhlIGBFdmVudFBsdWdpbkh1YmAgd2lsbCB0aGVuIHByb2Nlc3MgZWFjaCBldmVudCBieSBhbm5vdGF0aW5nIHRoZW0gd2l0aFxuICogICAgXCJkaXNwYXRjaGVzXCIsIGEgc2VxdWVuY2Ugb2YgbGlzdGVuZXJzIGFuZCBJRHMgdGhhdCBjYXJlIGFib3V0IHRoYXQgZXZlbnQuXG4gKlxuICogIC0gVGhlIGBFdmVudFBsdWdpbkh1YmAgdGhlbiBkaXNwYXRjaGVzIHRoZSBldmVudHMuXG4gKlxuICogT3ZlcnZpZXcgb2YgUmVhY3QgYW5kIHRoZSBldmVudCBzeXN0ZW06XG4gKlxuICogKy0tLS0tLS0tLS0tLSsgICAgLlxuICogfCAgICBET00gICAgIHwgICAgLlxuICogKy0tLS0tLS0tLS0tLSsgICAgLlxuICogICAgICAgfCAgICAgICAgICAgLlxuICogICAgICAgdiAgICAgICAgICAgLlxuICogKy0tLS0tLS0tLS0tLSsgICAgLlxuICogfCBSZWFjdEV2ZW50IHwgICAgLlxuICogfCAgTGlzdGVuZXIgIHwgICAgLlxuICogKy0tLS0tLS0tLS0tLSsgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rXG4gKiAgICAgICB8ICAgICAgICAgICAuICAgICAgICAgICAgICAgKy0tLS0tLS0tK3xTaW1wbGVFdmVudHxcbiAqICAgICAgIHwgICAgICAgICAgIC4gICAgICAgICAgICAgICB8ICAgICAgICAgfFBsdWdpbiAgICAgfFxuICogKy0tLS0tfC0tLS0tLSsgICAgLiAgICAgICAgICAgICAgIHYgICAgICAgICArLS0tLS0tLS0tLS0rXG4gKiB8ICAgICB8ICAgICAgfCAgICAuICAgICstLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0rXG4gKiB8ICAgICArLS0tLS0tLS0tLS0uLS0tPnxFdmVudFBsdWdpbkh1YnwgICAgICAgICAgICAgICAgICAgIHwgICAgRXZlbnQgICB8XG4gKiB8ICAgICAgICAgICAgfCAgICAuICAgIHwgICAgICAgICAgICAgIHwgICAgICstLS0tLS0tLS0tLSsgIHwgUHJvcGFnYXRvcnN8XG4gKiB8IFJlYWN0RXZlbnQgfCAgICAuICAgIHwgICAgICAgICAgICAgIHwgICAgIHxUYXBFdmVudCAgIHwgIHwtLS0tLS0tLS0tLS18XG4gKiB8ICBFbWl0dGVyICAgfCAgICAuICAgIHwgICAgICAgICAgICAgIHw8LS0tK3xQbHVnaW4gICAgIHwgIHxvdGhlciBwbHVnaW58XG4gKiB8ICAgICAgICAgICAgfCAgICAuICAgIHwgICAgICAgICAgICAgIHwgICAgICstLS0tLS0tLS0tLSsgIHwgIHV0aWxpdGllcyB8XG4gKiB8ICAgICArLS0tLS0tLS0tLS0uLS0tPnwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0rXG4gKiB8ICAgICB8ICAgICAgfCAgICAuICAgICstLS0tLS0tLS0tLS0tLStcbiAqICstLS0tLXwtLS0tLS0rICAgIC4gICAgICAgICAgICAgICAgXiAgICAgICAgKy0tLS0tLS0tLS0tK1xuICogICAgICAgfCAgICAgICAgICAgLiAgICAgICAgICAgICAgICB8ICAgICAgICB8RW50ZXIvTGVhdmV8XG4gKiAgICAgICArICAgICAgICAgICAuICAgICAgICAgICAgICAgICstLS0tLS0tK3xQbHVnaW4gICAgIHxcbiAqICstLS0tLS0tLS0tLS0tKyAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tK1xuICogfCBhcHBsaWNhdGlvbiB8ICAgLlxuICogfC0tLS0tLS0tLS0tLS18ICAgLlxuICogfCAgICAgICAgICAgICB8ICAgLlxuICogfCAgICAgICAgICAgICB8ICAgLlxuICogKy0tLS0tLS0tLS0tLS0rICAgLlxuICogICAgICAgICAgICAgICAgICAgLlxuICogICAgUmVhY3QgQ29yZSAgICAgLiAgR2VuZXJhbCBQdXJwb3NlIEV2ZW50IFBsdWdpbiBTeXN0ZW1cbiAqL1xuXG52YXIgaGFzRXZlbnRQYWdlWFk7XG52YXIgYWxyZWFkeUxpc3RlbmluZ1RvID0ge307XG52YXIgaXNNb25pdG9yaW5nU2Nyb2xsVmFsdWUgPSBmYWxzZTtcbnZhciByZWFjdFRvcExpc3RlbmVyc0NvdW50ZXIgPSAwO1xuXG4vLyBGb3IgZXZlbnRzIGxpa2UgJ3N1Ym1pdCcgd2hpY2ggZG9uJ3QgY29uc2lzdGVudGx5IGJ1YmJsZSAod2hpY2ggd2UgdHJhcCBhdCBhXG4vLyBsb3dlciBub2RlIHRoYW4gYGRvY3VtZW50YCksIGJpbmRpbmcgYXQgYGRvY3VtZW50YCB3b3VsZCBjYXVzZSBkdXBsaWNhdGVcbi8vIGV2ZW50cyBzbyB3ZSBkb24ndCBpbmNsdWRlIHRoZW0gaGVyZVxudmFyIHRvcEV2ZW50TWFwcGluZyA9IHtcbiAgdG9wQWJvcnQ6ICdhYm9ydCcsXG4gIHRvcEFuaW1hdGlvbkVuZDogZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ2FuaW1hdGlvbmVuZCcpIHx8ICdhbmltYXRpb25lbmQnLFxuICB0b3BBbmltYXRpb25JdGVyYXRpb246IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25pdGVyYXRpb24nKSB8fCAnYW5pbWF0aW9uaXRlcmF0aW9uJyxcbiAgdG9wQW5pbWF0aW9uU3RhcnQ6IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25zdGFydCcpIHx8ICdhbmltYXRpb25zdGFydCcsXG4gIHRvcEJsdXI6ICdibHVyJyxcbiAgdG9wQ2FuUGxheTogJ2NhbnBsYXknLFxuICB0b3BDYW5QbGF5VGhyb3VnaDogJ2NhbnBsYXl0aHJvdWdoJyxcbiAgdG9wQ2hhbmdlOiAnY2hhbmdlJyxcbiAgdG9wQ2xpY2s6ICdjbGljaycsXG4gIHRvcENvbXBvc2l0aW9uRW5kOiAnY29tcG9zaXRpb25lbmQnLFxuICB0b3BDb21wb3NpdGlvblN0YXJ0OiAnY29tcG9zaXRpb25zdGFydCcsXG4gIHRvcENvbXBvc2l0aW9uVXBkYXRlOiAnY29tcG9zaXRpb251cGRhdGUnLFxuICB0b3BDb250ZXh0TWVudTogJ2NvbnRleHRtZW51JyxcbiAgdG9wQ29weTogJ2NvcHknLFxuICB0b3BDdXQ6ICdjdXQnLFxuICB0b3BEb3VibGVDbGljazogJ2RibGNsaWNrJyxcbiAgdG9wRHJhZzogJ2RyYWcnLFxuICB0b3BEcmFnRW5kOiAnZHJhZ2VuZCcsXG4gIHRvcERyYWdFbnRlcjogJ2RyYWdlbnRlcicsXG4gIHRvcERyYWdFeGl0OiAnZHJhZ2V4aXQnLFxuICB0b3BEcmFnTGVhdmU6ICdkcmFnbGVhdmUnLFxuICB0b3BEcmFnT3ZlcjogJ2RyYWdvdmVyJyxcbiAgdG9wRHJhZ1N0YXJ0OiAnZHJhZ3N0YXJ0JyxcbiAgdG9wRHJvcDogJ2Ryb3AnLFxuICB0b3BEdXJhdGlvbkNoYW5nZTogJ2R1cmF0aW9uY2hhbmdlJyxcbiAgdG9wRW1wdGllZDogJ2VtcHRpZWQnLFxuICB0b3BFbmNyeXB0ZWQ6ICdlbmNyeXB0ZWQnLFxuICB0b3BFbmRlZDogJ2VuZGVkJyxcbiAgdG9wRXJyb3I6ICdlcnJvcicsXG4gIHRvcEZvY3VzOiAnZm9jdXMnLFxuICB0b3BJbnB1dDogJ2lucHV0JyxcbiAgdG9wS2V5RG93bjogJ2tleWRvd24nLFxuICB0b3BLZXlQcmVzczogJ2tleXByZXNzJyxcbiAgdG9wS2V5VXA6ICdrZXl1cCcsXG4gIHRvcExvYWRlZERhdGE6ICdsb2FkZWRkYXRhJyxcbiAgdG9wTG9hZGVkTWV0YWRhdGE6ICdsb2FkZWRtZXRhZGF0YScsXG4gIHRvcExvYWRTdGFydDogJ2xvYWRzdGFydCcsXG4gIHRvcE1vdXNlRG93bjogJ21vdXNlZG93bicsXG4gIHRvcE1vdXNlTW92ZTogJ21vdXNlbW92ZScsXG4gIHRvcE1vdXNlT3V0OiAnbW91c2VvdXQnLFxuICB0b3BNb3VzZU92ZXI6ICdtb3VzZW92ZXInLFxuICB0b3BNb3VzZVVwOiAnbW91c2V1cCcsXG4gIHRvcFBhc3RlOiAncGFzdGUnLFxuICB0b3BQYXVzZTogJ3BhdXNlJyxcbiAgdG9wUGxheTogJ3BsYXknLFxuICB0b3BQbGF5aW5nOiAncGxheWluZycsXG4gIHRvcFByb2dyZXNzOiAncHJvZ3Jlc3MnLFxuICB0b3BSYXRlQ2hhbmdlOiAncmF0ZWNoYW5nZScsXG4gIHRvcFNjcm9sbDogJ3Njcm9sbCcsXG4gIHRvcFNlZWtlZDogJ3NlZWtlZCcsXG4gIHRvcFNlZWtpbmc6ICdzZWVraW5nJyxcbiAgdG9wU2VsZWN0aW9uQ2hhbmdlOiAnc2VsZWN0aW9uY2hhbmdlJyxcbiAgdG9wU3RhbGxlZDogJ3N0YWxsZWQnLFxuICB0b3BTdXNwZW5kOiAnc3VzcGVuZCcsXG4gIHRvcFRleHRJbnB1dDogJ3RleHRJbnB1dCcsXG4gIHRvcFRpbWVVcGRhdGU6ICd0aW1ldXBkYXRlJyxcbiAgdG9wVG91Y2hDYW5jZWw6ICd0b3VjaGNhbmNlbCcsXG4gIHRvcFRvdWNoRW5kOiAndG91Y2hlbmQnLFxuICB0b3BUb3VjaE1vdmU6ICd0b3VjaG1vdmUnLFxuICB0b3BUb3VjaFN0YXJ0OiAndG91Y2hzdGFydCcsXG4gIHRvcFRyYW5zaXRpb25FbmQ6IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCd0cmFuc2l0aW9uZW5kJykgfHwgJ3RyYW5zaXRpb25lbmQnLFxuICB0b3BWb2x1bWVDaGFuZ2U6ICd2b2x1bWVjaGFuZ2UnLFxuICB0b3BXYWl0aW5nOiAnd2FpdGluZycsXG4gIHRvcFdoZWVsOiAnd2hlZWwnXG59O1xuXG4vKipcbiAqIFRvIGVuc3VyZSBubyBjb25mbGljdHMgd2l0aCBvdGhlciBwb3RlbnRpYWwgUmVhY3QgaW5zdGFuY2VzIG9uIHRoZSBwYWdlXG4gKi9cbnZhciB0b3BMaXN0ZW5lcnNJREtleSA9ICdfcmVhY3RMaXN0ZW5lcnNJRCcgKyBTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoMik7XG5cbmZ1bmN0aW9uIGdldExpc3RlbmluZ0ZvckRvY3VtZW50KG1vdW50QXQpIHtcbiAgLy8gSW4gSUU4LCBgbW91bnRBdGAgaXMgYSBob3N0IG9iamVjdCBhbmQgZG9lc24ndCBoYXZlIGBoYXNPd25Qcm9wZXJ0eWBcbiAgLy8gZGlyZWN0bHkuXG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vdW50QXQsIHRvcExpc3RlbmVyc0lES2V5KSkge1xuICAgIG1vdW50QXRbdG9wTGlzdGVuZXJzSURLZXldID0gcmVhY3RUb3BMaXN0ZW5lcnNDb3VudGVyKys7XG4gICAgYWxyZWFkeUxpc3RlbmluZ1RvW21vdW50QXRbdG9wTGlzdGVuZXJzSURLZXldXSA9IHt9O1xuICB9XG4gIHJldHVybiBhbHJlYWR5TGlzdGVuaW5nVG9bbW91bnRBdFt0b3BMaXN0ZW5lcnNJREtleV1dO1xufVxuXG4vKipcbiAqIGBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXJgIGlzIHVzZWQgdG8gYXR0YWNoIHRvcC1sZXZlbCBldmVudCBsaXN0ZW5lcnMuIEZvclxuICogZXhhbXBsZTpcbiAqXG4gKiAgIEV2ZW50UGx1Z2luSHViLnB1dExpc3RlbmVyKCdteUlEJywgJ29uQ2xpY2snLCBteUZ1bmN0aW9uKTtcbiAqXG4gKiBUaGlzIHdvdWxkIGFsbG9jYXRlIGEgXCJyZWdpc3RyYXRpb25cIiBvZiBgKCdvbkNsaWNrJywgbXlGdW5jdGlvbilgIG9uICdteUlEJy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlciA9IF9hc3NpZ24oe30sIFJlYWN0RXZlbnRFbWl0dGVyTWl4aW4sIHtcbiAgLyoqXG4gICAqIEluamVjdGFibGUgZXZlbnQgYmFja2VuZFxuICAgKi9cbiAgUmVhY3RFdmVudExpc3RlbmVyOiBudWxsLFxuXG4gIGluamVjdGlvbjoge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBSZWFjdEV2ZW50TGlzdGVuZXJcbiAgICAgKi9cbiAgICBpbmplY3RSZWFjdEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIChSZWFjdEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIFJlYWN0RXZlbnRMaXN0ZW5lci5zZXRIYW5kbGVUb3BMZXZlbChSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuaGFuZGxlVG9wTGV2ZWwpO1xuICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lciA9IFJlYWN0RXZlbnRMaXN0ZW5lcjtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciBvciBub3QgYW55IGNyZWF0ZWQgY2FsbGJhY2tzIHNob3VsZCBiZSBlbmFibGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWQgVHJ1ZSBpZiBjYWxsYmFja3Mgc2hvdWxkIGJlIGVuYWJsZWQuXG4gICAqL1xuICBzZXRFbmFibGVkOiBmdW5jdGlvbiAoZW5hYmxlZCkge1xuICAgIGlmIChSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyKSB7XG4gICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnNldEVuYWJsZWQoZW5hYmxlZCk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGNhbGxiYWNrcyBhcmUgZW5hYmxlZC5cbiAgICovXG4gIGlzRW5hYmxlZDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIShSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyICYmIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIuaXNFbmFibGVkKCkpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBXZSBsaXN0ZW4gZm9yIGJ1YmJsZWQgdG91Y2ggZXZlbnRzIG9uIHRoZSBkb2N1bWVudCBvYmplY3QuXG4gICAqXG4gICAqIEZpcmVmb3ggdjguMDEgKGFuZCBwb3NzaWJseSBvdGhlcnMpIGV4aGliaXRlZCBzdHJhbmdlIGJlaGF2aW9yIHdoZW5cbiAgICogbW91bnRpbmcgYG9ubW91c2Vtb3ZlYCBldmVudHMgYXQgc29tZSBub2RlIHRoYXQgd2FzIG5vdCB0aGUgZG9jdW1lbnRcbiAgICogZWxlbWVudC4gVGhlIHN5bXB0b21zIHdlcmUgdGhhdCBpZiB5b3VyIG1vdXNlIGlzIG5vdCBtb3Zpbmcgb3ZlciBzb21ldGhpbmdcbiAgICogY29udGFpbmVkIHdpdGhpbiB0aGF0IG1vdW50IHBvaW50IChmb3IgZXhhbXBsZSBvbiB0aGUgYmFja2dyb3VuZCkgdGhlXG4gICAqIHRvcC1sZXZlbCBsaXN0ZW5lcnMgZm9yIGBvbm1vdXNlbW92ZWAgd29uJ3QgYmUgY2FsbGVkLiBIb3dldmVyLCBpZiB5b3VcbiAgICogcmVnaXN0ZXIgdGhlIGBtb3VzZW1vdmVgIG9uIHRoZSBkb2N1bWVudCBvYmplY3QsIHRoZW4gaXQgd2lsbCBvZiBjb3Vyc2VcbiAgICogY2F0Y2ggYWxsIGBtb3VzZW1vdmVgcy4gVGhpcyBhbG9uZyB3aXRoIGlPUyBxdWlya3MsIGp1c3RpZmllcyByZXN0cmljdGluZ1xuICAgKiB0b3AtbGV2ZWwgbGlzdGVuZXJzIHRvIHRoZSBkb2N1bWVudCBvYmplY3Qgb25seSwgYXQgbGVhc3QgZm9yIHRoZXNlXG4gICAqIG1vdmVtZW50IHR5cGVzIG9mIGV2ZW50cyBhbmQgcG9zc2libHkgYWxsIGV2ZW50cy5cbiAgICpcbiAgICogQHNlZSBodHRwOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxMC8wOS9jbGlja19ldmVudF9kZWwuaHRtbFxuICAgKlxuICAgKiBBbHNvLCBga2V5dXBgL2BrZXlwcmVzc2AvYGtleWRvd25gIGRvIG5vdCBidWJibGUgdG8gdGhlIHdpbmRvdyBvbiBJRSwgYnV0XG4gICAqIHRoZXkgYnViYmxlIHRvIGRvY3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBOYW1lIG9mIGxpc3RlbmVyIChlLmcuIGBvbkNsaWNrYCkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZW50RG9jdW1lbnRIYW5kbGUgRG9jdW1lbnQgd2hpY2ggb3ducyB0aGUgY29udGFpbmVyXG4gICAqL1xuICBsaXN0ZW5UbzogZnVuY3Rpb24gKHJlZ2lzdHJhdGlvbk5hbWUsIGNvbnRlbnREb2N1bWVudEhhbmRsZSkge1xuICAgIHZhciBtb3VudEF0ID0gY29udGVudERvY3VtZW50SGFuZGxlO1xuICAgIHZhciBpc0xpc3RlbmluZyA9IGdldExpc3RlbmluZ0ZvckRvY3VtZW50KG1vdW50QXQpO1xuICAgIHZhciBkZXBlbmRlbmNpZXMgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXNbcmVnaXN0cmF0aW9uTmFtZV07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlcGVuZGVuY2llcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlcGVuZGVuY3kgPSBkZXBlbmRlbmNpZXNbaV07XG4gICAgICBpZiAoIShpc0xpc3RlbmluZy5oYXNPd25Qcm9wZXJ0eShkZXBlbmRlbmN5KSAmJiBpc0xpc3RlbmluZ1tkZXBlbmRlbmN5XSkpIHtcbiAgICAgICAgaWYgKGRlcGVuZGVuY3kgPT09ICd0b3BXaGVlbCcpIHtcbiAgICAgICAgICBpZiAoaXNFdmVudFN1cHBvcnRlZCgnd2hlZWwnKSkge1xuICAgICAgICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCd0b3BXaGVlbCcsICd3aGVlbCcsIG1vdW50QXQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNFdmVudFN1cHBvcnRlZCgnbW91c2V3aGVlbCcpKSB7XG4gICAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcFdoZWVsJywgJ21vdXNld2hlZWwnLCBtb3VudEF0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmlyZWZveCBuZWVkcyB0byBjYXB0dXJlIGEgZGlmZmVyZW50IG1vdXNlIHNjcm9sbCBldmVudC5cbiAgICAgICAgICAgIC8vIEBzZWUgaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9kb20vZXZlbnRzL3Rlc3RzL3Njcm9sbC5odG1sXG4gICAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcFdoZWVsJywgJ0RPTU1vdXNlU2Nyb2xsJywgbW91bnRBdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRlcGVuZGVuY3kgPT09ICd0b3BTY3JvbGwnKSB7XG4gICAgICAgICAgaWYgKGlzRXZlbnRTdXBwb3J0ZWQoJ3Njcm9sbCcsIHRydWUpKSB7XG4gICAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KCd0b3BTY3JvbGwnLCAnc2Nyb2xsJywgbW91bnRBdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wU2Nyb2xsJywgJ3Njcm9sbCcsIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIuV0lORE9XX0hBTkRMRSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRlcGVuZGVuY3kgPT09ICd0b3BGb2N1cycgfHwgZGVwZW5kZW5jeSA9PT0gJ3RvcEJsdXInKSB7XG4gICAgICAgICAgaWYgKGlzRXZlbnRTdXBwb3J0ZWQoJ2ZvY3VzJywgdHJ1ZSkpIHtcbiAgICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcENhcHR1cmVkRXZlbnQoJ3RvcEZvY3VzJywgJ2ZvY3VzJywgbW91bnRBdCk7XG4gICAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KCd0b3BCbHVyJywgJ2JsdXInLCBtb3VudEF0KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzRXZlbnRTdXBwb3J0ZWQoJ2ZvY3VzaW4nKSkge1xuICAgICAgICAgICAgLy8gSUUgaGFzIGBmb2N1c2luYCBhbmQgYGZvY3Vzb3V0YCBldmVudHMgd2hpY2ggYnViYmxlLlxuICAgICAgICAgICAgLy8gQHNlZSBodHRwOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAwOC8wNC9kZWxlZ2F0aW5nX3RoZS5odG1sXG4gICAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcEZvY3VzJywgJ2ZvY3VzaW4nLCBtb3VudEF0KTtcbiAgICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wQmx1cicsICdmb2N1c291dCcsIG1vdW50QXQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHRvIG1ha2Ugc3VyZSBibHVyIGFuZCBmb2N1cyBldmVudCBsaXN0ZW5lcnMgYXJlIG9ubHkgYXR0YWNoZWQgb25jZVxuICAgICAgICAgIGlzTGlzdGVuaW5nLnRvcEJsdXIgPSB0cnVlO1xuICAgICAgICAgIGlzTGlzdGVuaW5nLnRvcEZvY3VzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0b3BFdmVudE1hcHBpbmcuaGFzT3duUHJvcGVydHkoZGVwZW5kZW5jeSkpIHtcbiAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoZGVwZW5kZW5jeSwgdG9wRXZlbnRNYXBwaW5nW2RlcGVuZGVuY3ldLCBtb3VudEF0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlzTGlzdGVuaW5nW2RlcGVuZGVuY3ldID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgdHJhcEJ1YmJsZWRFdmVudDogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgaGFuZGxlckJhc2VOYW1lLCBoYW5kbGUpIHtcbiAgICByZXR1cm4gUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KHRvcExldmVsVHlwZSwgaGFuZGxlckJhc2VOYW1lLCBoYW5kbGUpO1xuICB9LFxuXG4gIHRyYXBDYXB0dXJlZEV2ZW50OiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCBoYW5kbGVyQmFzZU5hbWUsIGhhbmRsZSkge1xuICAgIHJldHVybiBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KHRvcExldmVsVHlwZSwgaGFuZGxlckJhc2VOYW1lLCBoYW5kbGUpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBQcm90ZWN0IGFnYWluc3QgZG9jdW1lbnQuY3JlYXRlRXZlbnQoKSByZXR1cm5pbmcgbnVsbFxuICAgKiBTb21lIHBvcHVwIGJsb2NrZXIgZXh0ZW5zaW9ucyBhcHBlYXIgdG8gZG8gdGhpczpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy82ODg3XG4gICAqL1xuICBzdXBwb3J0c0V2ZW50UGFnZVhZOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFkb2N1bWVudC5jcmVhdGVFdmVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgZXYgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudCcpO1xuICAgIHJldHVybiBldiAhPSBudWxsICYmICdwYWdlWCcgaW4gZXY7XG4gIH0sXG5cbiAgLyoqXG4gICAqIExpc3RlbnMgdG8gd2luZG93IHNjcm9sbCBhbmQgcmVzaXplIGV2ZW50cy4gV2UgY2FjaGUgc2Nyb2xsIHZhbHVlcyBzbyB0aGF0XG4gICAqIGFwcGxpY2F0aW9uIGNvZGUgY2FuIGFjY2VzcyB0aGVtIHdpdGhvdXQgdHJpZ2dlcmluZyByZWZsb3dzLlxuICAgKlxuICAgKiBWaWV3cG9ydE1ldHJpY3MgaXMgb25seSB1c2VkIGJ5IFN5bnRoZXRpY01vdXNlL1RvdWNoRXZlbnQgYW5kIG9ubHkgd2hlblxuICAgKiBwYWdlWC9wYWdlWSBpc24ndCBzdXBwb3J0ZWQgKGxlZ2FjeSBicm93c2VycykuXG4gICAqXG4gICAqIE5PVEU6IFNjcm9sbCBldmVudHMgZG8gbm90IGJ1YmJsZS5cbiAgICpcbiAgICogQHNlZSBodHRwOi8vd3d3LnF1aXJrc21vZGUub3JnL2RvbS9ldmVudHMvc2Nyb2xsLmh0bWxcbiAgICovXG4gIGVuc3VyZVNjcm9sbFZhbHVlTW9uaXRvcmluZzogZnVuY3Rpb24gKCkge1xuICAgIGlmIChoYXNFdmVudFBhZ2VYWSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNFdmVudFBhZ2VYWSA9IFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5zdXBwb3J0c0V2ZW50UGFnZVhZKCk7XG4gICAgfVxuICAgIGlmICghaGFzRXZlbnRQYWdlWFkgJiYgIWlzTW9uaXRvcmluZ1Njcm9sbFZhbHVlKSB7XG4gICAgICB2YXIgcmVmcmVzaCA9IFZpZXdwb3J0TWV0cmljcy5yZWZyZXNoU2Nyb2xsVmFsdWVzO1xuICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci5tb25pdG9yU2Nyb2xsVmFsdWUocmVmcmVzaCk7XG4gICAgICBpc01vbml0b3JpbmdTY3JvbGxWYWx1ZSA9IHRydWU7XG4gICAgfVxuICB9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXI7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJztcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlc1NlY3JldDtcbiIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuICB2YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcbiAgdmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcbiAgdmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xufVxuXG4vKipcbiAqIEFzc2VydCB0aGF0IHRoZSB2YWx1ZXMgbWF0Y2ggd2l0aCB0aGUgdHlwZSBzcGVjcy5cbiAqIEVycm9yIG1lc3NhZ2VzIGFyZSBtZW1vcml6ZWQgYW5kIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0eXBlU3BlY3MgTWFwIG9mIG5hbWUgdG8gYSBSZWFjdFByb3BUeXBlXG4gKiBAcGFyYW0ge29iamVjdH0gdmFsdWVzIFJ1bnRpbWUgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSB0eXBlLWNoZWNrZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBlLmcuIFwicHJvcFwiLCBcImNvbnRleHRcIiwgXCJjaGlsZCBjb250ZXh0XCJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21wb25lbnROYW1lIE5hbWUgb2YgdGhlIGNvbXBvbmVudCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gez9GdW5jdGlvbn0gZ2V0U3RhY2sgUmV0dXJucyB0aGUgY29tcG9uZW50IHN0YWNrLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBnZXRTdGFjaykge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmICh0eXBlU3BlY3MuaGFzT3duUHJvcGVydHkodHlwZVNwZWNOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3I7XG4gICAgICAgIC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpbnZhcmlhbnQodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdID09PSAnZnVuY3Rpb24nLCAnJXM6ICVzIHR5cGUgYCVzYCBpcyBpbnZhbGlkOyBpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSAnICsgJ1JlYWN0LlByb3BUeXBlcy4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIGxvY2F0aW9uLCB0eXBlU3BlY05hbWUpO1xuICAgICAgICAgIGVycm9yID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IgPSBleDtcbiAgICAgICAgfVxuICAgICAgICB3YXJuaW5nKCFlcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIEVycm9yLCAnJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yLm1lc3NhZ2VdID0gdHJ1ZTtcblxuICAgICAgICAgIHZhciBzdGFjayA9IGdldFN0YWNrID8gZ2V0U3RhY2soKSA6ICcnO1xuXG4gICAgICAgICAgd2FybmluZyhmYWxzZSwgJ0ZhaWxlZCAlcyB0eXBlOiAlcyVzJywgbG9jYXRpb24sIGVycm9yLm1lc3NhZ2UsIHN0YWNrICE9IG51bGwgPyBzdGFjayA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNoZWNrUHJvcFR5cGVzO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xudmFyIGNoZWNrUHJvcFR5cGVzID0gcmVxdWlyZSgnLi9jaGVja1Byb3BUeXBlcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGlzVmFsaWRFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKSB7XG4gIC8qIGdsb2JhbCBTeW1ib2wgKi9cbiAgdmFyIElURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yO1xuICB2YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7IC8vIEJlZm9yZSBTeW1ib2wgc3BlYy5cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaXRlcmF0b3IgbWV0aG9kIGZ1bmN0aW9uIGNvbnRhaW5lZCBvbiB0aGUgaXRlcmFibGUgb2JqZWN0LlxuICAgKlxuICAgKiBCZSBzdXJlIHRvIGludm9rZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgaXRlcmFibGUgYXMgY29udGV4dDpcbiAgICpcbiAgICogICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihteUl0ZXJhYmxlKTtcbiAgICogICAgIGlmIChpdGVyYXRvckZuKSB7XG4gICAqICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChteUl0ZXJhYmxlKTtcbiAgICogICAgICAgLi4uXG4gICAqICAgICB9XG4gICAqXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbWF5YmVJdGVyYWJsZVxuICAgKiBAcmV0dXJuIHs/ZnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IG1heWJlSXRlcmFibGUgJiYgKElURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF0pO1xuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZXJhdG9yRm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3Rpb24gb2YgbWV0aG9kcyB0aGF0IGFsbG93IGRlY2xhcmF0aW9uIGFuZCB2YWxpZGF0aW9uIG9mIHByb3BzIHRoYXQgYXJlXG4gICAqIHN1cHBsaWVkIHRvIFJlYWN0IGNvbXBvbmVudHMuIEV4YW1wbGUgdXNhZ2U6XG4gICAqXG4gICAqICAgdmFyIFByb3BzID0gcmVxdWlyZSgnUmVhY3RQcm9wVHlwZXMnKTtcbiAgICogICB2YXIgTXlBcnRpY2xlID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICAgcHJvcFR5cGVzOiB7XG4gICAqICAgICAgIC8vIEFuIG9wdGlvbmFsIHN0cmluZyBwcm9wIG5hbWVkIFwiZGVzY3JpcHRpb25cIi5cbiAgICogICAgICAgZGVzY3JpcHRpb246IFByb3BzLnN0cmluZyxcbiAgICpcbiAgICogICAgICAgLy8gQSByZXF1aXJlZCBlbnVtIHByb3AgbmFtZWQgXCJjYXRlZ29yeVwiLlxuICAgKiAgICAgICBjYXRlZ29yeTogUHJvcHMub25lT2YoWydOZXdzJywnUGhvdG9zJ10pLmlzUmVxdWlyZWQsXG4gICAqXG4gICAqICAgICAgIC8vIEEgcHJvcCBuYW1lZCBcImRpYWxvZ1wiIHRoYXQgcmVxdWlyZXMgYW4gaW5zdGFuY2Ugb2YgRGlhbG9nLlxuICAgKiAgICAgICBkaWFsb2c6IFByb3BzLmluc3RhbmNlT2YoRGlhbG9nKS5pc1JlcXVpcmVkXG4gICAqICAgICB9LFxuICAgKiAgICAgcmVuZGVyOiBmdW5jdGlvbigpIHsgLi4uIH1cbiAgICogICB9KTtcbiAgICpcbiAgICogQSBtb3JlIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGhvdyB0aGVzZSBtZXRob2RzIGFyZSB1c2VkOlxuICAgKlxuICAgKiAgIHR5cGUgOj0gYXJyYXl8Ym9vbHxmdW5jfG9iamVjdHxudW1iZXJ8c3RyaW5nfG9uZU9mKFsuLi5dKXxpbnN0YW5jZU9mKC4uLilcbiAgICogICBkZWNsIDo9IFJlYWN0UHJvcFR5cGVzLnt0eXBlfSguaXNSZXF1aXJlZCk/XG4gICAqXG4gICAqIEVhY2ggYW5kIGV2ZXJ5IGRlY2xhcmF0aW9uIHByb2R1Y2VzIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUuIFRoaXNcbiAgICogYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvbnMuIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAgdmFyIE15TGluayA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgcHJvcFR5cGVzOiB7XG4gICAqICAgICAgLy8gQW4gb3B0aW9uYWwgc3RyaW5nIG9yIFVSSSBwcm9wIG5hbWVkIFwiaHJlZlwiLlxuICAgKiAgICAgIGhyZWY6IGZ1bmN0aW9uKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICAgKiAgICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICogICAgICAgIGlmIChwcm9wVmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgcHJvcFZhbHVlICE9PSAnc3RyaW5nJyAmJlxuICAgKiAgICAgICAgICAgICEocHJvcFZhbHVlIGluc3RhbmNlb2YgVVJJKSkge1xuICAgKiAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKFxuICAgKiAgICAgICAgICAgICdFeHBlY3RlZCBhIHN0cmluZyBvciBhbiBVUkkgZm9yICcgKyBwcm9wTmFtZSArICcgaW4gJyArXG4gICAqICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgKiAgICAgICAgICApO1xuICAgKiAgICAgICAgfVxuICAgKiAgICAgIH1cbiAgICogICAgfSxcbiAgICogICAgcmVuZGVyOiBmdW5jdGlvbigpIHsuLi59XG4gICAqICB9KTtcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuXG4gIHZhciBBTk9OWU1PVVMgPSAnPDxhbm9ueW1vdXM+Pic7XG5cbiAgLy8gSW1wb3J0YW50IVxuICAvLyBLZWVwIHRoaXMgbGlzdCBpbiBzeW5jIHdpdGggcHJvZHVjdGlvbiB2ZXJzaW9uIGluIGAuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcy5qc2AuXG4gIHZhciBSZWFjdFByb3BUeXBlcyA9IHtcbiAgICBhcnJheTogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2FycmF5JyksXG4gICAgYm9vbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Jvb2xlYW4nKSxcbiAgICBmdW5jOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignZnVuY3Rpb24nKSxcbiAgICBudW1iZXI6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdudW1iZXInKSxcbiAgICBvYmplY3Q6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdvYmplY3QnKSxcbiAgICBzdHJpbmc6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzdHJpbmcnKSxcbiAgICBzeW1ib2w6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzeW1ib2wnKSxcblxuICAgIGFueTogY3JlYXRlQW55VHlwZUNoZWNrZXIoKSxcbiAgICBhcnJheU9mOiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIsXG4gICAgZWxlbWVudDogY3JlYXRlRWxlbWVudFR5cGVDaGVja2VyKCksXG4gICAgaW5zdGFuY2VPZjogY3JlYXRlSW5zdGFuY2VUeXBlQ2hlY2tlcixcbiAgICBub2RlOiBjcmVhdGVOb2RlQ2hlY2tlcigpLFxuICAgIG9iamVjdE9mOiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyLFxuICAgIG9uZU9mOiBjcmVhdGVFbnVtVHlwZUNoZWNrZXIsXG4gICAgb25lT2ZUeXBlOiBjcmVhdGVVbmlvblR5cGVDaGVja2VyLFxuICAgIHNoYXBlOiBjcmVhdGVTaGFwZVR5cGVDaGVja2VyXG4gIH07XG5cbiAgLyoqXG4gICAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBvd25cbiAgICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gICAqL1xuICAvKmVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSovXG4gIGZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgICAvLyBTYW1lVmFsdWUgYWxnb3JpdGhtXG4gICAgaWYgKHggPT09IHkpIHtcbiAgICAgIC8vIFN0ZXBzIDEtNSwgNy0xMFxuICAgICAgLy8gU3RlcHMgNi5iLTYuZTogKzAgIT0gLTBcbiAgICAgIHJldHVybiB4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3RlcCA2LmE6IE5hTiA9PSBOYU5cbiAgICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG4gICAgfVxuICB9XG4gIC8qZXNsaW50LWVuYWJsZSBuby1zZWxmLWNvbXBhcmUqL1xuXG4gIC8qKlxuICAgKiBXZSB1c2UgYW4gRXJyb3ItbGlrZSBvYmplY3QgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYXMgcGVvcGxlIG1heSBjYWxsXG4gICAqIFByb3BUeXBlcyBkaXJlY3RseSBhbmQgaW5zcGVjdCB0aGVpciBvdXRwdXQuIEhvd2V2ZXIsIHdlIGRvbid0IHVzZSByZWFsXG4gICAqIEVycm9ycyBhbnltb3JlLiBXZSBkb24ndCBpbnNwZWN0IHRoZWlyIHN0YWNrIGFueXdheSwgYW5kIGNyZWF0aW5nIHRoZW1cbiAgICogaXMgcHJvaGliaXRpdmVseSBleHBlbnNpdmUgaWYgdGhleSBhcmUgY3JlYXRlZCB0b28gb2Z0ZW4sIHN1Y2ggYXMgd2hhdFxuICAgKiBoYXBwZW5zIGluIG9uZU9mVHlwZSgpIGZvciBhbnkgdHlwZSBiZWZvcmUgdGhlIG9uZSB0aGF0IG1hdGNoZWQuXG4gICAqL1xuICBmdW5jdGlvbiBQcm9wVHlwZUVycm9yKG1lc3NhZ2UpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuc3RhY2sgPSAnJztcbiAgfVxuICAvLyBNYWtlIGBpbnN0YW5jZW9mIEVycm9yYCBzdGlsbCB3b3JrIGZvciByZXR1cm5lZCBlcnJvcnMuXG4gIFByb3BUeXBlRXJyb3IucHJvdG90eXBlID0gRXJyb3IucHJvdG90eXBlO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBtYW51YWxQcm9wVHlwZUNhbGxDYWNoZSA9IHt9O1xuICAgICAgdmFyIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50ID0gMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tUeXBlKGlzUmVxdWlyZWQsIHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgICBjb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZSB8fCBBTk9OWU1PVVM7XG4gICAgICBwcm9wRnVsbE5hbWUgPSBwcm9wRnVsbE5hbWUgfHwgcHJvcE5hbWU7XG5cbiAgICAgIGlmIChzZWNyZXQgIT09IFJlYWN0UHJvcFR5cGVzU2VjcmV0KSB7XG4gICAgICAgIGlmICh0aHJvd09uRGlyZWN0QWNjZXNzKSB7XG4gICAgICAgICAgLy8gTmV3IGJlaGF2aW9yIG9ubHkgZm9yIHVzZXJzIG9mIGBwcm9wLXR5cGVzYCBwYWNrYWdlXG4gICAgICAgICAgaW52YXJpYW50KFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAnQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAgICAgICAnVXNlIGBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoKWAgdG8gY2FsbCB0aGVtLiAnICtcbiAgICAgICAgICAgICdSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAvLyBPbGQgYmVoYXZpb3IgZm9yIHBlb3BsZSB1c2luZyBSZWFjdC5Qcm9wVHlwZXNcbiAgICAgICAgICB2YXIgY2FjaGVLZXkgPSBjb21wb25lbnROYW1lICsgJzonICsgcHJvcE5hbWU7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIW1hbnVhbFByb3BUeXBlQ2FsbENhY2hlW2NhY2hlS2V5XSAmJlxuICAgICAgICAgICAgLy8gQXZvaWQgc3BhbW1pbmcgdGhlIGNvbnNvbGUgYmVjYXVzZSB0aGV5IGFyZSBvZnRlbiBub3QgYWN0aW9uYWJsZSBleGNlcHQgZm9yIGxpYiBhdXRob3JzXG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCA8IDNcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHdhcm5pbmcoXG4gICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAnWW91IGFyZSBtYW51YWxseSBjYWxsaW5nIGEgUmVhY3QuUHJvcFR5cGVzIHZhbGlkYXRpb24gJyArXG4gICAgICAgICAgICAgICdmdW5jdGlvbiBmb3IgdGhlIGAlc2AgcHJvcCBvbiBgJXNgLiBUaGlzIGlzIGRlcHJlY2F0ZWQgJyArXG4gICAgICAgICAgICAgICdhbmQgd2lsbCB0aHJvdyBpbiB0aGUgc3RhbmRhbG9uZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAgICAgICAgICdZb3UgbWF5IGJlIHNlZWluZyB0aGlzIHdhcm5pbmcgZHVlIHRvIGEgdGhpcmQtcGFydHkgUHJvcFR5cGVzICcgK1xuICAgICAgICAgICAgICAnbGlicmFyeS4gU2VlIGh0dHBzOi8vZmIubWUvcmVhY3Qtd2FybmluZy1kb250LWNhbGwtcHJvcHR5cGVzICcgKyAnZm9yIGRldGFpbHMuJyxcbiAgICAgICAgICAgICAgcHJvcEZ1bGxOYW1lLFxuICAgICAgICAgICAgICBjb21wb25lbnROYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGVbY2FjaGVLZXldID0gdHJ1ZTtcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgICAgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICAgICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1RoZSAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgaXMgbWFya2VkIGFzIHJlcXVpcmVkICcgKyAoJ2luIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBidXQgaXRzIHZhbHVlIGlzIGBudWxsYC4nKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignVGhlICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgaW4gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGJ1dCBpdHMgdmFsdWUgaXMgYHVuZGVmaW5lZGAuJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoYWluZWRDaGVja1R5cGUgPSBjaGVja1R5cGUuYmluZChudWxsLCBmYWxzZSk7XG4gICAgY2hhaW5lZENoZWNrVHlwZS5pc1JlcXVpcmVkID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gY2hhaW5lZENoZWNrVHlwZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKGV4cGVjdGVkVHlwZSkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gZXhwZWN0ZWRUeXBlKSB7XG4gICAgICAgIC8vIGBwcm9wVmFsdWVgIGJlaW5nIGluc3RhbmNlIG9mLCBzYXksIGRhdGUvcmVnZXhwLCBwYXNzIHRoZSAnb2JqZWN0J1xuICAgICAgICAvLyBjaGVjaywgYnV0IHdlIGNhbiBvZmZlciBhIG1vcmUgcHJlY2lzZSBlcnJvciBtZXNzYWdlIGhlcmUgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gJ29mIHR5cGUgYG9iamVjdGAnLlxuICAgICAgICB2YXIgcHJlY2lzZVR5cGUgPSBnZXRQcmVjaXNlVHlwZShwcm9wVmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByZWNpc2VUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkICcpICsgKCdgJyArIGV4cGVjdGVkVHlwZSArICdgLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQW55VHlwZUNoZWNrZXIoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNOdWxsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcih0eXBlQ2hlY2tlcikge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiB0eXBlQ2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1Byb3BlcnR5IGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgY29tcG9uZW50IGAnICsgY29tcG9uZW50TmFtZSArICdgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBhcnJheU9mLicpO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGFuIGFycmF5LicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcFZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlcnJvciA9IHR5cGVDaGVja2VyKHByb3BWYWx1ZSwgaSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICdbJyArIGkgKyAnXScsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudFR5cGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVsZW1lbnQuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyKGV4cGVjdGVkQ2xhc3MpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICghKHByb3BzW3Byb3BOYW1lXSBpbnN0YW5jZW9mIGV4cGVjdGVkQ2xhc3MpKSB7XG4gICAgICAgIHZhciBleHBlY3RlZENsYXNzTmFtZSA9IGV4cGVjdGVkQ2xhc3MubmFtZSB8fCBBTk9OWU1PVVM7XG4gICAgICAgIHZhciBhY3R1YWxDbGFzc05hbWUgPSBnZXRDbGFzc05hbWUocHJvcHNbcHJvcE5hbWVdKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgYWN0dWFsQ2xhc3NOYW1lICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkICcpICsgKCdpbnN0YW5jZSBvZiBgJyArIGV4cGVjdGVkQ2xhc3NOYW1lICsgJ2AuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbnVtVHlwZUNoZWNrZXIoZXhwZWN0ZWRWYWx1ZXMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXhwZWN0ZWRWYWx1ZXMpKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LicpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNOdWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwZWN0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGlzKHByb3BWYWx1ZSwgZXhwZWN0ZWRWYWx1ZXNbaV0pKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHZhbHVlc1N0cmluZyA9IEpTT04uc3RyaW5naWZ5KGV4cGVjdGVkVmFsdWVzKTtcbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdmFsdWUgYCcgKyBwcm9wVmFsdWUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgb25lIG9mICcgKyB2YWx1ZXNTdHJpbmcgKyAnLicpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdQcm9wZXJ0eSBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIGNvbXBvbmVudCBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgb2JqZWN0T2YuJyk7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gb2JqZWN0LicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBwcm9wVmFsdWUpIHtcbiAgICAgICAgaWYgKHByb3BWYWx1ZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVVbmlvblR5cGVDaGVja2VyKGFycmF5T2ZUeXBlQ2hlY2tlcnMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXlPZlR5cGVDaGVja2VycykpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LicpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNOdWxsO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlPZlR5cGVDaGVja2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoZWNrZXIgPSBhcnJheU9mVHlwZUNoZWNrZXJzW2ldO1xuICAgICAgaWYgKHR5cGVvZiBjaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5pbmcoXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZCB0byBvbmVPZlR5cGUuIEV4cGVjdGVkIGFuIGFycmF5IG9mIGNoZWNrIGZ1bmN0aW9ucywgYnV0ICcgK1xuICAgICAgICAgICdyZWNlaXZlZCAlcyBhdCBpbmRleCAlcy4nLFxuICAgICAgICAgIGdldFBvc3RmaXhGb3JUeXBlV2FybmluZyhjaGVja2VyKSxcbiAgICAgICAgICBpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zTnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlPZlR5cGVDaGVja2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IGFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07XG4gICAgICAgIGlmIChjaGVja2VyKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLicpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU5vZGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKCFpc05vZGUocHJvcHNbcHJvcE5hbWVdKSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIFJlYWN0Tm9kZS4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIoc2hhcGVUeXBlcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBgJyArIHByb3BUeXBlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGBvYmplY3RgLicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBzaGFwZVR5cGVzKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gc2hhcGVUeXBlc1trZXldO1xuICAgICAgICBpZiAoIWNoZWNrZXIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXJyb3IgPSBjaGVja2VyKHByb3BWYWx1ZSwga2V5LCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5LCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc05vZGUocHJvcFZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlb2YgcHJvcFZhbHVlKSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIHJldHVybiAhcHJvcFZhbHVlO1xuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBwcm9wVmFsdWUuZXZlcnkoaXNOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcFZhbHVlID09PSBudWxsIHx8IGlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihwcm9wVmFsdWUpO1xuICAgICAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChwcm9wVmFsdWUpO1xuICAgICAgICAgIHZhciBzdGVwO1xuICAgICAgICAgIGlmIChpdGVyYXRvckZuICE9PSBwcm9wVmFsdWUuZW50cmllcykge1xuICAgICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgICBpZiAoIWlzTm9kZShzdGVwLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJdGVyYXRvciB3aWxsIHByb3ZpZGUgZW50cnkgW2ssdl0gdHVwbGVzIHJhdGhlciB0aGFuIHZhbHVlcy5cbiAgICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05vZGUoZW50cnlbMV0pKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzU3ltYm9sKHByb3BUeXBlLCBwcm9wVmFsdWUpIHtcbiAgICAvLyBOYXRpdmUgU3ltYm9sLlxuICAgIGlmIChwcm9wVHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIDE5LjQuMy41IFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ10gPT09ICdTeW1ib2wnXG4gICAgaWYgKHByb3BWYWx1ZVsnQEB0b1N0cmluZ1RhZyddID09PSAnU3ltYm9sJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZm9yIG5vbi1zcGVjIGNvbXBsaWFudCBTeW1ib2xzIHdoaWNoIGFyZSBwb2x5ZmlsbGVkLlxuICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHByb3BWYWx1ZSBpbnN0YW5jZW9mIFN5bWJvbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gRXF1aXZhbGVudCBvZiBgdHlwZW9mYCBidXQgd2l0aCBzcGVjaWFsIGhhbmRsaW5nIGZvciBhcnJheSBhbmQgcmVnZXhwLlxuICBmdW5jdGlvbiBnZXRQcm9wVHlwZShwcm9wVmFsdWUpIHtcbiAgICB2YXIgcHJvcFR5cGUgPSB0eXBlb2YgcHJvcFZhbHVlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgIHJldHVybiAnYXJyYXknO1xuICAgIH1cbiAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAvLyBPbGQgd2Via2l0cyAoYXQgbGVhc3QgdW50aWwgQW5kcm9pZCA0LjApIHJldHVybiAnZnVuY3Rpb24nIHJhdGhlciB0aGFuXG4gICAgICAvLyAnb2JqZWN0JyBmb3IgdHlwZW9mIGEgUmVnRXhwLiBXZSdsbCBub3JtYWxpemUgdGhpcyBoZXJlIHNvIHRoYXQgL2JsYS9cbiAgICAgIC8vIHBhc3NlcyBQcm9wVHlwZXMub2JqZWN0LlxuICAgICAgcmV0dXJuICdvYmplY3QnO1xuICAgIH1cbiAgICBpZiAoaXNTeW1ib2wocHJvcFR5cGUsIHByb3BWYWx1ZSkpIHtcbiAgICAgIHJldHVybiAnc3ltYm9sJztcbiAgICB9XG4gICAgcmV0dXJuIHByb3BUeXBlO1xuICB9XG5cbiAgLy8gVGhpcyBoYW5kbGVzIG1vcmUgdHlwZXMgdGhhbiBgZ2V0UHJvcFR5cGVgLiBPbmx5IHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICAvLyBTZWUgYGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyYC5cbiAgZnVuY3Rpb24gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHByb3BWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnICsgcHJvcFZhbHVlO1xuICAgIH1cbiAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgIGlmIChwcm9wVHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiAnZGF0ZSc7XG4gICAgICB9IGVsc2UgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9wVHlwZTtcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBzdHJpbmcgdGhhdCBpcyBwb3N0Zml4ZWQgdG8gYSB3YXJuaW5nIGFib3V0IGFuIGludmFsaWQgdHlwZS5cbiAgLy8gRm9yIGV4YW1wbGUsIFwidW5kZWZpbmVkXCIgb3IgXCJvZiB0eXBlIGFycmF5XCJcbiAgZnVuY3Rpb24gZ2V0UG9zdGZpeEZvclR5cGVXYXJuaW5nKHZhbHVlKSB7XG4gICAgdmFyIHR5cGUgPSBnZXRQcmVjaXNlVHlwZSh2YWx1ZSk7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdhcnJheSc6XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICByZXR1cm4gJ2FuICcgKyB0eXBlO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgIGNhc2UgJ3JlZ2V4cCc6XG4gICAgICAgIHJldHVybiAnYSAnICsgdHlwZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJldHVybnMgY2xhc3MgbmFtZSBvZiB0aGUgb2JqZWN0LCBpZiBhbnkuXG4gIGZ1bmN0aW9uIGdldENsYXNzTmFtZShwcm9wVmFsdWUpIHtcbiAgICBpZiAoIXByb3BWYWx1ZS5jb25zdHJ1Y3RvciB8fCAhcHJvcFZhbHVlLmNvbnN0cnVjdG9yLm5hbWUpIHtcbiAgICAgIHJldHVybiBBTk9OWU1PVVM7XG4gICAgfVxuICAgIHJldHVybiBwcm9wVmFsdWUuY29uc3RydWN0b3IubmFtZTtcbiAgfVxuXG4gIFJlYWN0UHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzID0gY2hlY2tQcm9wVHlwZXM7XG4gIFJlYWN0UHJvcFR5cGVzLlByb3BUeXBlcyA9IFJlYWN0UHJvcFR5cGVzO1xuXG4gIHJldHVybiBSZWFjdFByb3BUeXBlcztcbn07XG4iLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8vIFJlYWN0IDE1LjUgcmVmZXJlbmNlcyB0aGlzIG1vZHVsZSwgYW5kIGFzc3VtZXMgUHJvcFR5cGVzIGFyZSBzdGlsbCBjYWxsYWJsZSBpbiBwcm9kdWN0aW9uLlxuLy8gVGhlcmVmb3JlIHdlIHJlLWV4cG9ydCBkZXZlbG9wbWVudC1vbmx5IHZlcnNpb24gd2l0aCBhbGwgdGhlIFByb3BUeXBlcyBjaGVja3MgaGVyZS5cbi8vIEhvd2V2ZXIgaWYgb25lIGlzIG1pZ3JhdGluZyB0byB0aGUgYHByb3AtdHlwZXNgIG5wbSBsaWJyYXJ5LCB0aGV5IHdpbGwgZ28gdGhyb3VnaCB0aGVcbi8vIGBpbmRleC5qc2AgZW50cnkgcG9pbnQsIGFuZCBpdCB3aWxsIGJyYW5jaCBkZXBlbmRpbmcgb24gdGhlIGVudmlyb25tZW50LlxudmFyIGZhY3RvcnkgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGlzVmFsaWRFbGVtZW50KSB7XG4gIC8vIEl0IGlzIHN0aWxsIGFsbG93ZWQgaW4gMTUuNS5cbiAgdmFyIHRocm93T25EaXJlY3RBY2Nlc3MgPSBmYWxzZTtcbiAgcmV0dXJuIGZhY3RvcnkoaXNWYWxpZEVsZW1lbnQsIHRocm93T25EaXJlY3RBY2Nlc3MpO1xufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFdBUk5JTkc6IERPIE5PVCBtYW51YWxseSByZXF1aXJlIHRoaXMgbW9kdWxlLlxuICogVGhpcyBpcyBhIHJlcGxhY2VtZW50IGZvciBgaW52YXJpYW50KC4uLilgIHVzZWQgYnkgdGhlIGVycm9yIGNvZGUgc3lzdGVtXG4gKiBhbmQgd2lsbCBfb25seV8gYmUgcmVxdWlyZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgYmFiZWwgcGFzcy5cbiAqIEl0IGFsd2F5cyB0aHJvd3MuXG4gKi9cblxuZnVuY3Rpb24gcmVhY3RQcm9kSW52YXJpYW50KGNvZGUpIHtcbiAgdmFyIGFyZ0NvdW50ID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG5cbiAgdmFyIG1lc3NhZ2UgPSAnTWluaWZpZWQgUmVhY3QgZXJyb3IgIycgKyBjb2RlICsgJzsgdmlzaXQgJyArICdodHRwOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvZXJyb3ItZGVjb2Rlci5odG1sP2ludmFyaWFudD0nICsgY29kZTtcblxuICBmb3IgKHZhciBhcmdJZHggPSAwOyBhcmdJZHggPCBhcmdDb3VudDsgYXJnSWR4KyspIHtcbiAgICBtZXNzYWdlICs9ICcmYXJnc1tdPScgKyBlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW2FyZ0lkeCArIDFdKTtcbiAgfVxuXG4gIG1lc3NhZ2UgKz0gJyBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQnICsgJyBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4nO1xuXG4gIHZhciBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgZXJyb3IubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgZXJyb3IuZnJhbWVzVG9Qb3AgPSAxOyAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IHJlYWN0UHJvZEludmFyaWFudCdzIG93biBmcmFtZVxuXG4gIHRocm93IGVycm9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlYWN0UHJvZEludmFyaWFudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE1LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxuZnVuY3Rpb24gd2Fybk5vb3AocHVibGljSW5zdGFuY2UsIGNhbGxlck5hbWUpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2YXIgY29uc3RydWN0b3IgPSBwdWJsaWNJbnN0YW5jZS5jb25zdHJ1Y3RvcjtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzKC4uLik6IENhbiBvbmx5IHVwZGF0ZSBhIG1vdW50ZWQgb3IgbW91bnRpbmcgY29tcG9uZW50LiAnICsgJ1RoaXMgdXN1YWxseSBtZWFucyB5b3UgY2FsbGVkICVzKCkgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4gJyArICdUaGlzIGlzIGEgbm8tb3AuIFBsZWFzZSBjaGVjayB0aGUgY29kZSBmb3IgdGhlICVzIGNvbXBvbmVudC4nLCBjYWxsZXJOYW1lLCBjYWxsZXJOYW1lLCBjb25zdHJ1Y3RvciAmJiAoY29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgY29uc3RydWN0b3IubmFtZSkgfHwgJ1JlYWN0Q2xhc3MnKSA6IHZvaWQgMDtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGFic3RyYWN0IEFQSSBmb3IgYW4gdXBkYXRlIHF1ZXVlLlxuICovXG52YXIgUmVhY3ROb29wVXBkYXRlUXVldWUgPSB7XG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhpcyBjb21wb3NpdGUgY29tcG9uZW50IGlzIG1vdW50ZWQuXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHdlIHdhbnQgdG8gdGVzdC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb3VudGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGZpbmFsXG4gICAqL1xuICBpc01vdW50ZWQ6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAvKipcbiAgICogRW5xdWV1ZSBhIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBhZnRlciBhbGwgdGhlIHBlbmRpbmcgdXBkYXRlc1xuICAgKiBoYXZlIHByb2Nlc3NlZC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdG8gdXNlIGFzIGB0aGlzYCBjb250ZXh0LlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHN0YXRlIGlzIHVwZGF0ZWQuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZUNhbGxiYWNrOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNhbGxiYWNrKSB7fSxcblxuICAvKipcbiAgICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICAgKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipub3QqKiBpbiBhIERPTSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICAgKiBjb21wb25lbnQncyBzdGF0ZSBoYXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC5cbiAgICpcbiAgICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICAgKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnREaWRVcGRhdGVgLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnZm9yY2VVcGRhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogUmVwbGFjZXMgYWxsIG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIG9yIGBzZXRTdGF0ZWAgdG8gbXV0YXRlIHN0YXRlLlxuICAgKiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gICAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcGxldGVTdGF0ZSBOZXh0IHN0YXRlLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVSZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY29tcGxldGVTdGF0ZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAncmVwbGFjZVN0YXRlJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBUaGlzIG9ubHkgZXhpc3RzIGJlY2F1c2UgX3BlbmRpbmdTdGF0ZSBpc1xuICAgKiBpbnRlcm5hbC4gVGhpcyBwcm92aWRlcyBhIG1lcmdpbmcgc3RyYXRlZ3kgdGhhdCBpcyBub3QgYXZhaWxhYmxlIHRvIGRlZXBcbiAgICogcHJvcGVydGllcyB3aGljaCBpcyBjb25mdXNpbmcuIFRPRE86IEV4cG9zZSBwZW5kaW5nU3RhdGUgb3IgZG9uJ3QgdXNlIGl0XG4gICAqIGR1cmluZyB0aGUgbWVyZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBzdGF0ZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgcGFydGlhbFN0YXRlKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdzZXRTdGF0ZScpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGNhbkRlZmluZVByb3BlcnR5ID0gZmFsc2U7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB0cnkge1xuICAgIC8vICRGbG93Rml4TWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzI4NVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3gnLCB7IGdldDogZnVuY3Rpb24gKCkge30gfSk7XG4gICAgY2FuRGVmaW5lUHJvcGVydHkgPSB0cnVlO1xuICB9IGNhdGNoICh4KSB7XG4gICAgLy8gSUUgd2lsbCBmYWlsIG9uIGRlZmluZVByb3BlcnR5XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjYW5EZWZpbmVQcm9wZXJ0eTsiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGVtcHR5T2JqZWN0ID0ge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIE9iamVjdC5mcmVlemUoZW1wdHlPYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVtcHR5T2JqZWN0OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRm9ya2VkIGZyb20gZmJqcy93YXJuaW5nOlxuICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2ZianMvYmxvYi9lNjZiYTIwYWQ1YmU0MzNlYjU0NDIzZjJiMDk3ZDgyOTMyNGQ5ZGU2L3BhY2thZ2VzL2ZianMvc3JjL19fZm9ya3NfXy93YXJuaW5nLmpzXG4gKlxuICogT25seSBjaGFuZ2UgaXMgd2UgdXNlIGNvbnNvbGUud2FybiBpbnN0ZWFkIG9mIGNvbnNvbGUuZXJyb3IsXG4gKiBhbmQgZG8gbm90aGluZyB3aGVuICdjb25zb2xlJyBpcyBub3Qgc3VwcG9ydGVkLlxuICogVGhpcyByZWFsbHkgc2ltcGxpZmllcyB0aGUgY29kZS5cbiAqIC0tLVxuICogU2ltaWxhciB0byBpbnZhcmlhbnQgYnV0IG9ubHkgbG9ncyBhIHdhcm5pbmcgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byBsb2cgaXNzdWVzIGluIGRldmVsb3BtZW50IGVudmlyb25tZW50cyBpbiBjcml0aWNhbFxuICogcGF0aHMuIFJlbW92aW5nIHRoZSBsb2dnaW5nIGNvZGUgZm9yIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIHdpbGwga2VlcCB0aGVcbiAqIHNhbWUgbG9naWMgYW5kIGZvbGxvdyB0aGUgc2FtZSBjb2RlIHBhdGhzLlxuICovXG5cbnZhciBsb3dQcmlvcml0eVdhcm5pbmcgPSBmdW5jdGlvbiAoKSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICB9KTtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG5cbiAgbG93UHJpb3JpdHlXYXJuaW5nID0gZnVuY3Rpb24gKGNvbmRpdGlvbiwgZm9ybWF0KSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2B3YXJuaW5nKGNvbmRpdGlvbiwgZm9ybWF0LCAuLi5hcmdzKWAgcmVxdWlyZXMgYSB3YXJuaW5nICcgKyAnbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIgPiAyID8gX2xlbjIgLSAyIDogMCksIF9rZXkyID0gMjsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMl0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcuYXBwbHkodW5kZWZpbmVkLCBbZm9ybWF0XS5jb25jYXQoYXJncykpO1xuICAgIH1cbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsb3dQcmlvcml0eVdhcm5pbmc7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKSxcbiAgICBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3ROb29wVXBkYXRlUXVldWUgPSByZXF1aXJlKCcuL1JlYWN0Tm9vcFVwZGF0ZVF1ZXVlJyk7XG5cbnZhciBjYW5EZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vY2FuRGVmaW5lUHJvcGVydHknKTtcbnZhciBlbXB0eU9iamVjdCA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5T2JqZWN0Jyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgbG93UHJpb3JpdHlXYXJuaW5nID0gcmVxdWlyZSgnLi9sb3dQcmlvcml0eVdhcm5pbmcnKTtcblxuLyoqXG4gKiBCYXNlIGNsYXNzIGhlbHBlcnMgZm9yIHRoZSB1cGRhdGluZyBzdGF0ZSBvZiBhIGNvbXBvbmVudC5cbiAqL1xuZnVuY3Rpb24gUmVhY3RDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHtcbiAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICB0aGlzLnJlZnMgPSBlbXB0eU9iamVjdDtcbiAgLy8gV2UgaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCB1cGRhdGVyIGJ1dCB0aGUgcmVhbCBvbmUgZ2V0cyBpbmplY3RlZCBieSB0aGVcbiAgLy8gcmVuZGVyZXIuXG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cblJlYWN0Q29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50ID0ge307XG5cbi8qKlxuICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyB0byBtdXRhdGVcbiAqIHN0YXRlLiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gKlxuICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc29cbiAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gKlxuICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgY2FsbHMgdG8gYHNldFN0YXRlYCB3aWxsIHJ1biBzeW5jaHJvbm91c2x5LFxuICogYXMgdGhleSBtYXkgZXZlbnR1YWxseSBiZSBiYXRjaGVkIHRvZ2V0aGVyLiAgWW91IGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsXG4gKiBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgY2FsbCB0byBzZXRTdGF0ZSBpcyBhY3R1YWxseVxuICogY29tcGxldGVkLlxuICpcbiAqIFdoZW4gYSBmdW5jdGlvbiBpcyBwcm92aWRlZCB0byBzZXRTdGF0ZSwgaXQgd2lsbCBiZSBjYWxsZWQgYXQgc29tZSBwb2ludCBpblxuICogdGhlIGZ1dHVyZSAobm90IHN5bmNocm9ub3VzbHkpLiBJdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSB1cCB0byBkYXRlXG4gKiBjb21wb25lbnQgYXJndW1lbnRzIChzdGF0ZSwgcHJvcHMsIGNvbnRleHQpLiBUaGVzZSB2YWx1ZXMgY2FuIGJlIGRpZmZlcmVudFxuICogZnJvbSB0aGlzLiogYmVjYXVzZSB5b3VyIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgYWZ0ZXIgcmVjZWl2ZVByb3BzIGJ1dCBiZWZvcmVcbiAqIHNob3VsZENvbXBvbmVudFVwZGF0ZSwgYW5kIHRoaXMgbmV3IHN0YXRlLCBwcm9wcywgYW5kIGNvbnRleHQgd2lsbCBub3QgeWV0IGJlXG4gKiBhc3NpZ25lZCB0byB0aGlzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fGZ1bmN0aW9ufSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIG9yIGZ1bmN0aW9uIHRvXG4gKiAgICAgICAgcHJvZHVjZSBuZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggY3VycmVudCBzdGF0ZS5cbiAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgc3RhdGUgaXMgdXBkYXRlZC5cbiAqIEBmaW5hbFxuICogQHByb3RlY3RlZFxuICovXG5SZWFjdENvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAocGFydGlhbFN0YXRlLCBjYWxsYmFjaykge1xuICAhKHR5cGVvZiBwYXJ0aWFsU3RhdGUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBwYXJ0aWFsU3RhdGUgPT09ICdmdW5jdGlvbicgfHwgcGFydGlhbFN0YXRlID09IG51bGwpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3NldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLicpIDogX3Byb2RJbnZhcmlhbnQoJzg1JykgOiB2b2lkIDA7XG4gIHRoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcywgcGFydGlhbFN0YXRlKTtcbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgdGhpcy51cGRhdGVyLmVucXVldWVDYWxsYmFjayh0aGlzLCBjYWxsYmFjaywgJ3NldFN0YXRlJyk7XG4gIH1cbn07XG5cbi8qKlxuICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gKlxuICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gKlxuICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAqXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqIEBmaW5hbFxuICogQHByb3RlY3RlZFxuICovXG5SZWFjdENvbXBvbmVudC5wcm90b3R5cGUuZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzKTtcbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgdGhpcy51cGRhdGVyLmVucXVldWVDYWxsYmFjayh0aGlzLCBjYWxsYmFjaywgJ2ZvcmNlVXBkYXRlJyk7XG4gIH1cbn07XG5cbi8qKlxuICogRGVwcmVjYXRlZCBBUElzLiBUaGVzZSBBUElzIHVzZWQgdG8gZXhpc3Qgb24gY2xhc3NpYyBSZWFjdCBjbGFzc2VzIGJ1dCBzaW5jZVxuICogd2Ugd291bGQgbGlrZSB0byBkZXByZWNhdGUgdGhlbSwgd2UncmUgbm90IGdvaW5nIHRvIG1vdmUgdGhlbSBvdmVyIHRvIHRoaXNcbiAqIG1vZGVybiBiYXNlIGNsYXNzLiBJbnN0ZWFkLCB3ZSBkZWZpbmUgYSBnZXR0ZXIgdGhhdCB3YXJucyBpZiBpdCdzIGFjY2Vzc2VkLlxuICovXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgZGVwcmVjYXRlZEFQSXMgPSB7XG4gICAgaXNNb3VudGVkOiBbJ2lzTW91bnRlZCcsICdJbnN0ZWFkLCBtYWtlIHN1cmUgdG8gY2xlYW4gdXAgc3Vic2NyaXB0aW9ucyBhbmQgcGVuZGluZyByZXF1ZXN0cyBpbiAnICsgJ2NvbXBvbmVudFdpbGxVbm1vdW50IHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzLiddLFxuICAgIHJlcGxhY2VTdGF0ZTogWydyZXBsYWNlU3RhdGUnLCAnUmVmYWN0b3IgeW91ciBjb2RlIHRvIHVzZSBzZXRTdGF0ZSBpbnN0ZWFkIChzZWUgJyArICdodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzMyMzYpLiddXG4gIH07XG4gIHZhciBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcgPSBmdW5jdGlvbiAobWV0aG9kTmFtZSwgaW5mbykge1xuICAgIGlmIChjYW5EZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWN0Q29tcG9uZW50LnByb3RvdHlwZSwgbWV0aG9kTmFtZSwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBsb3dQcmlvcml0eVdhcm5pbmcoZmFsc2UsICclcyguLi4pIGlzIGRlcHJlY2F0ZWQgaW4gcGxhaW4gSmF2YVNjcmlwdCBSZWFjdCBjbGFzc2VzLiAlcycsIGluZm9bMF0sIGluZm9bMV0pO1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgZm9yICh2YXIgZm5OYW1lIGluIGRlcHJlY2F0ZWRBUElzKSB7XG4gICAgaWYgKGRlcHJlY2F0ZWRBUElzLmhhc093blByb3BlcnR5KGZuTmFtZSkpIHtcbiAgICAgIGRlZmluZURlcHJlY2F0aW9uV2FybmluZyhmbk5hbWUsIGRlcHJlY2F0ZWRBUElzW2ZuTmFtZV0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgaGVscGVycyBmb3IgdGhlIHVwZGF0aW5nIHN0YXRlIG9mIGEgY29tcG9uZW50LlxuICovXG5mdW5jdGlvbiBSZWFjdFB1cmVDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHtcbiAgLy8gRHVwbGljYXRlZCBmcm9tIFJlYWN0Q29tcG9uZW50LlxuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0O1xuICAvLyBXZSBpbml0aWFsaXplIHRoZSBkZWZhdWx0IHVwZGF0ZXIgYnV0IHRoZSByZWFsIG9uZSBnZXRzIGluamVjdGVkIGJ5IHRoZVxuICAvLyByZW5kZXJlci5cbiAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcbn1cblxuZnVuY3Rpb24gQ29tcG9uZW50RHVtbXkoKSB7fVxuQ29tcG9uZW50RHVtbXkucHJvdG90eXBlID0gUmVhY3RDb21wb25lbnQucHJvdG90eXBlO1xuUmVhY3RQdXJlQ29tcG9uZW50LnByb3RvdHlwZSA9IG5ldyBDb21wb25lbnREdW1teSgpO1xuUmVhY3RQdXJlQ29tcG9uZW50LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlYWN0UHVyZUNvbXBvbmVudDtcbi8vIEF2b2lkIGFuIGV4dHJhIHByb3RvdHlwZSBqdW1wIGZvciB0aGVzZSBtZXRob2RzLlxuX2Fzc2lnbihSZWFjdFB1cmVDb21wb25lbnQucHJvdG90eXBlLCBSZWFjdENvbXBvbmVudC5wcm90b3R5cGUpO1xuUmVhY3RQdXJlQ29tcG9uZW50LnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCA9IHRydWU7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBDb21wb25lbnQ6IFJlYWN0Q29tcG9uZW50LFxuICBQdXJlQ29tcG9uZW50OiBSZWFjdFB1cmVDb21wb25lbnRcbn07IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogU3RhdGljIHBvb2xlcnMuIFNldmVyYWwgY3VzdG9tIHZlcnNpb25zIGZvciBlYWNoIHBvdGVudGlhbCBudW1iZXIgb2ZcbiAqIGFyZ3VtZW50cy4gQSBjb21wbGV0ZWx5IGdlbmVyaWMgcG9vbGVyIGlzIGVhc3kgdG8gaW1wbGVtZW50LCBidXQgd291bGRcbiAqIHJlcXVpcmUgYWNjZXNzaW5nIHRoZSBgYXJndW1lbnRzYCBvYmplY3QuIEluIGVhY2ggb2YgdGhlc2UsIGB0aGlzYCByZWZlcnMgdG9cbiAqIHRoZSBDbGFzcyBpdHNlbGYsIG5vdCBhbiBpbnN0YW5jZS4gSWYgYW55IG90aGVycyBhcmUgbmVlZGVkLCBzaW1wbHkgYWRkIHRoZW1cbiAqIGhlcmUsIG9yIGluIHRoZWlyIG93biBmaWxlcy5cbiAqL1xudmFyIG9uZUFyZ3VtZW50UG9vbGVyID0gZnVuY3Rpb24gKGNvcHlGaWVsZHNGcm9tKSB7XG4gIHZhciBLbGFzcyA9IHRoaXM7XG4gIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKSB7XG4gICAgdmFyIGluc3RhbmNlID0gS2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpO1xuICAgIEtsYXNzLmNhbGwoaW5zdGFuY2UsIGNvcHlGaWVsZHNGcm9tKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBLbGFzcyhjb3B5RmllbGRzRnJvbSk7XG4gIH1cbn07XG5cbnZhciB0d29Bcmd1bWVudFBvb2xlciA9IGZ1bmN0aW9uIChhMSwgYTIpIHtcbiAgdmFyIEtsYXNzID0gdGhpcztcbiAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGgpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBLbGFzcy5pbnN0YW5jZVBvb2wucG9wKCk7XG4gICAgS2xhc3MuY2FsbChpbnN0YW5jZSwgYTEsIGEyKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBLbGFzcyhhMSwgYTIpO1xuICB9XG59O1xuXG52YXIgdGhyZWVBcmd1bWVudFBvb2xlciA9IGZ1bmN0aW9uIChhMSwgYTIsIGEzKSB7XG4gIHZhciBLbGFzcyA9IHRoaXM7XG4gIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKSB7XG4gICAgdmFyIGluc3RhbmNlID0gS2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpO1xuICAgIEtsYXNzLmNhbGwoaW5zdGFuY2UsIGExLCBhMiwgYTMpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IEtsYXNzKGExLCBhMiwgYTMpO1xuICB9XG59O1xuXG52YXIgZm91ckFyZ3VtZW50UG9vbGVyID0gZnVuY3Rpb24gKGExLCBhMiwgYTMsIGE0KSB7XG4gIHZhciBLbGFzcyA9IHRoaXM7XG4gIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKSB7XG4gICAgdmFyIGluc3RhbmNlID0gS2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpO1xuICAgIEtsYXNzLmNhbGwoaW5zdGFuY2UsIGExLCBhMiwgYTMsIGE0KTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBLbGFzcyhhMSwgYTIsIGEzLCBhNCk7XG4gIH1cbn07XG5cbnZhciBzdGFuZGFyZFJlbGVhc2VyID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gIHZhciBLbGFzcyA9IHRoaXM7XG4gICEoaW5zdGFuY2UgaW5zdGFuY2VvZiBLbGFzcykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnVHJ5aW5nIHRvIHJlbGVhc2UgYW4gaW5zdGFuY2UgaW50byBhIHBvb2wgb2YgYSBkaWZmZXJlbnQgdHlwZS4nKSA6IF9wcm9kSW52YXJpYW50KCcyNScpIDogdm9pZCAwO1xuICBpbnN0YW5jZS5kZXN0cnVjdG9yKCk7XG4gIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoIDwgS2xhc3MucG9vbFNpemUpIHtcbiAgICBLbGFzcy5pbnN0YW5jZVBvb2wucHVzaChpbnN0YW5jZSk7XG4gIH1cbn07XG5cbnZhciBERUZBVUxUX1BPT0xfU0laRSA9IDEwO1xudmFyIERFRkFVTFRfUE9PTEVSID0gb25lQXJndW1lbnRQb29sZXI7XG5cbi8qKlxuICogQXVnbWVudHMgYENvcHlDb25zdHJ1Y3RvcmAgdG8gYmUgYSBwb29sYWJsZSBjbGFzcywgYXVnbWVudGluZyBvbmx5IHRoZSBjbGFzc1xuICogaXRzZWxmIChzdGF0aWNhbGx5KSBub3QgYWRkaW5nIGFueSBwcm90b3R5cGljYWwgZmllbGRzLiBBbnkgQ29weUNvbnN0cnVjdG9yXG4gKiB5b3UgZ2l2ZSB0aGlzIG1heSBoYXZlIGEgYHBvb2xTaXplYCBwcm9wZXJ0eSwgYW5kIHdpbGwgbG9vayBmb3IgYVxuICogcHJvdG90eXBpY2FsIGBkZXN0cnVjdG9yYCBvbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gQ29weUNvbnN0cnVjdG9yIENvbnN0cnVjdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVzZXQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwb29sZXIgQ3VzdG9taXphYmxlIHBvb2xlci5cbiAqL1xudmFyIGFkZFBvb2xpbmdUbyA9IGZ1bmN0aW9uIChDb3B5Q29uc3RydWN0b3IsIHBvb2xlcikge1xuICAvLyBDYXN0aW5nIGFzIGFueSBzbyB0aGF0IGZsb3cgaWdub3JlcyB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIGFuZCB0cnVzdHNcbiAgLy8gaXQgdG8gbWF0Y2ggdGhlIHR5cGUgd2UgZGVjbGFyZWRcbiAgdmFyIE5ld0tsYXNzID0gQ29weUNvbnN0cnVjdG9yO1xuICBOZXdLbGFzcy5pbnN0YW5jZVBvb2wgPSBbXTtcbiAgTmV3S2xhc3MuZ2V0UG9vbGVkID0gcG9vbGVyIHx8IERFRkFVTFRfUE9PTEVSO1xuICBpZiAoIU5ld0tsYXNzLnBvb2xTaXplKSB7XG4gICAgTmV3S2xhc3MucG9vbFNpemUgPSBERUZBVUxUX1BPT0xfU0laRTtcbiAgfVxuICBOZXdLbGFzcy5yZWxlYXNlID0gc3RhbmRhcmRSZWxlYXNlcjtcbiAgcmV0dXJuIE5ld0tsYXNzO1xufTtcblxudmFyIFBvb2xlZENsYXNzID0ge1xuICBhZGRQb29saW5nVG86IGFkZFBvb2xpbmdUbyxcbiAgb25lQXJndW1lbnRQb29sZXI6IG9uZUFyZ3VtZW50UG9vbGVyLFxuICB0d29Bcmd1bWVudFBvb2xlcjogdHdvQXJndW1lbnRQb29sZXIsXG4gIHRocmVlQXJndW1lbnRQb29sZXI6IHRocmVlQXJndW1lbnRQb29sZXIsXG4gIGZvdXJBcmd1bWVudFBvb2xlcjogZm91ckFyZ3VtZW50UG9vbGVyXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvb2xlZENsYXNzOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBvd25lci5cbiAqXG4gKiBUaGUgY3VycmVudCBvd25lciBpcyB0aGUgY29tcG9uZW50IHdobyBzaG91bGQgb3duIGFueSBjb21wb25lbnRzIHRoYXQgYXJlXG4gKiBjdXJyZW50bHkgYmVpbmcgY29uc3RydWN0ZWQuXG4gKi9cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAdHlwZSB7UmVhY3RDb21wb25lbnR9XG4gICAqL1xuICBjdXJyZW50OiBudWxsXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q3VycmVudE93bmVyOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50IHR5cGUuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cblxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sWydmb3InXSAmJiBTeW1ib2xbJ2ZvciddKCdyZWFjdC5lbGVtZW50JykgfHwgMHhlYWM3O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJFQUNUX0VMRU1FTlRfVFlQRTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgnLi9SZWFjdEN1cnJlbnRPd25lcicpO1xuXG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcbnZhciBjYW5EZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vY2FuRGVmaW5lUHJvcGVydHknKTtcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudFN5bWJvbCcpO1xuXG52YXIgUkVTRVJWRURfUFJPUFMgPSB7XG4gIGtleTogdHJ1ZSxcbiAgcmVmOiB0cnVlLFxuICBfX3NlbGY6IHRydWUsXG4gIF9fc291cmNlOiB0cnVlXG59O1xuXG52YXIgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24sIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duO1xuXG5mdW5jdGlvbiBoYXNWYWxpZFJlZihjb25maWcpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdyZWYnKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAncmVmJykuZ2V0O1xuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY29uZmlnLnJlZiAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZEtleShjb25maWcpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdrZXknKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAna2V5JykuZ2V0O1xuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY29uZmlnLmtleSAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ0tleSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duKSB7XG4gICAgICBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9IHRydWU7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzOiBga2V5YCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9mYi5tZS9yZWFjdC1zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKSA6IHZvaWQgMDtcbiAgICB9XG4gIH07XG4gIHdhcm5BYm91dEFjY2Vzc2luZ0tleS5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ2tleScsIHtcbiAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ0tleSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2YXIgd2FybkFib3V0QWNjZXNzaW5nUmVmID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24pIHtcbiAgICAgIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duID0gdHJ1ZTtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnJXM6IGByZWZgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL2ZiLm1lL3JlYWN0LXNwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpIDogdm9pZCAwO1xuICAgIH1cbiAgfTtcbiAgd2FybkFib3V0QWNjZXNzaW5nUmVmLmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAncmVmJywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nUmVmLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgUmVhY3QgZWxlbWVudC4gVGhpcyBubyBsb25nZXIgYWRoZXJlcyB0b1xuICogdGhlIGNsYXNzIHBhdHRlcm4sIHNvIGRvIG5vdCB1c2UgbmV3IHRvIGNhbGwgaXQuIEFsc28sIG5vIGluc3RhbmNlb2YgY2hlY2tcbiAqIHdpbGwgd29yay4gSW5zdGVhZCB0ZXN0ICQkdHlwZW9mIGZpZWxkIGFnYWluc3QgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIHRvIGNoZWNrXG4gKiBpZiBzb21ldGhpbmcgaXMgYSBSZWFjdCBFbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHsqfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gcmVmXG4gKiBAcGFyYW0geyp9IHNlbGYgQSAqdGVtcG9yYXJ5KiBoZWxwZXIgdG8gZGV0ZWN0IHBsYWNlcyB3aGVyZSBgdGhpc2AgaXNcbiAqIGRpZmZlcmVudCBmcm9tIHRoZSBgb3duZXJgIHdoZW4gUmVhY3QuY3JlYXRlRWxlbWVudCBpcyBjYWxsZWQsIHNvIHRoYXQgd2VcbiAqIGNhbiB3YXJuLiBXZSB3YW50IHRvIGdldCByaWQgb2Ygb3duZXIgYW5kIHJlcGxhY2Ugc3RyaW5nIGByZWZgcyB3aXRoIGFycm93XG4gKiBmdW5jdGlvbnMsIGFuZCBhcyBsb25nIGFzIGB0aGlzYCBhbmQgb3duZXIgYXJlIHRoZSBzYW1lLCB0aGVyZSB3aWxsIGJlIG5vXG4gKiBjaGFuZ2UgaW4gYmVoYXZpb3IuXG4gKiBAcGFyYW0geyp9IHNvdXJjZSBBbiBhbm5vdGF0aW9uIG9iamVjdCAoYWRkZWQgYnkgYSB0cmFuc3BpbGVyIG9yIG90aGVyd2lzZSlcbiAqIGluZGljYXRpbmcgZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBhbmQvb3Igb3RoZXIgaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0geyp9IG93bmVyXG4gKiBAcGFyYW0geyp9IHByb3BzXG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIFJlYWN0RWxlbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpIHtcbiAgdmFyIGVsZW1lbnQgPSB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3cgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IEVsZW1lbnRcbiAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuXG4gICAgLy8gQnVpbHQtaW4gcHJvcGVydGllcyB0aGF0IGJlbG9uZyBvbiB0aGUgZWxlbWVudFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXksXG4gICAgcmVmOiByZWYsXG4gICAgcHJvcHM6IHByb3BzLFxuXG4gICAgLy8gUmVjb3JkIHRoZSBjb21wb25lbnQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgZWxlbWVudC5cbiAgICBfb3duZXI6IG93bmVyXG4gIH07XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAvLyBUaGUgdmFsaWRhdGlvbiBmbGFnIGlzIGN1cnJlbnRseSBtdXRhdGl2ZS4gV2UgcHV0IGl0IG9uXG4gICAgLy8gYW4gZXh0ZXJuYWwgYmFja2luZyBzdG9yZSBzbyB0aGF0IHdlIGNhbiBmcmVlemUgdGhlIHdob2xlIG9iamVjdC5cbiAgICAvLyBUaGlzIGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgV2Vha01hcCBvbmNlIHRoZXkgYXJlIGltcGxlbWVudGVkIGluXG4gICAgLy8gY29tbW9ubHkgdXNlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMuXG4gICAgZWxlbWVudC5fc3RvcmUgPSB7fTtcblxuICAgIC8vIFRvIG1ha2UgY29tcGFyaW5nIFJlYWN0RWxlbWVudHMgZWFzaWVyIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCB3ZSBtYWtlXG4gICAgLy8gdGhlIHZhbGlkYXRpb24gZmxhZyBub24tZW51bWVyYWJsZSAod2hlcmUgcG9zc2libGUsIHdoaWNoIHNob3VsZFxuICAgIC8vIGluY2x1ZGUgZXZlcnkgZW52aXJvbm1lbnQgd2UgcnVuIHRlc3RzIGluKSwgc28gdGhlIHRlc3QgZnJhbWV3b3JrXG4gICAgLy8gaWdub3JlcyBpdC5cbiAgICBpZiAoY2FuRGVmaW5lUHJvcGVydHkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50Ll9zdG9yZSwgJ3ZhbGlkYXRlZCcsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgLy8gc2VsZiBhbmQgc291cmNlIGFyZSBERVYgb25seSBwcm9wZXJ0aWVzLlxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc2VsZicsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IHNlbGZcbiAgICAgIH0pO1xuICAgICAgLy8gVHdvIGVsZW1lbnRzIGNyZWF0ZWQgaW4gdHdvIGRpZmZlcmVudCBwbGFjZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWRcbiAgICAgIC8vIGVxdWFsIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGFuZCB0aGVyZWZvcmUgd2UgaGlkZSBpdCBmcm9tIGVudW1lcmF0aW9uLlxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc291cmNlJywge1xuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogc291cmNlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkID0gZmFsc2U7XG4gICAgICBlbGVtZW50Ll9zZWxmID0gc2VsZjtcbiAgICAgIGVsZW1lbnQuX3NvdXJjZSA9IHNvdXJjZTtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5mcmVlemUpIHtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudC5wcm9wcyk7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgb2YgdGhlIGdpdmVuIHR5cGUuXG4gKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3QuY3JlYXRlZWxlbWVudFxuICovXG5SZWFjdEVsZW1lbnQuY3JlYXRlRWxlbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBjb25maWcsIGNoaWxkcmVuKSB7XG4gIHZhciBwcm9wTmFtZTtcblxuICAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG4gIHZhciBwcm9wcyA9IHt9O1xuXG4gIHZhciBrZXkgPSBudWxsO1xuICB2YXIgcmVmID0gbnVsbDtcbiAgdmFyIHNlbGYgPSBudWxsO1xuICB2YXIgc291cmNlID0gbnVsbDtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgcmVmID0gY29uZmlnLnJlZjtcbiAgICB9XG4gICAgaWYgKGhhc1ZhbGlkS2V5KGNvbmZpZykpIHtcbiAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTtcbiAgICB9XG5cbiAgICBzZWxmID0gY29uZmlnLl9fc2VsZiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbmZpZy5fX3NlbGY7XG4gICAgc291cmNlID0gY29uZmlnLl9fc291cmNlID09PSB1bmRlZmluZWQgPyBudWxsIDogY29uZmlnLl9fc291cmNlO1xuICAgIC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byBhIG5ldyBwcm9wcyBvYmplY3RcbiAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBwcm9wTmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgICBPYmplY3QuZnJlZXplKGNoaWxkQXJyYXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gIH1cblxuICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcbiAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7XG4gICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChrZXkgfHwgcmVmKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3BzLiQkdHlwZW9mID09PSAndW5kZWZpbmVkJyB8fCBwcm9wcy4kJHR5cGVvZiAhPT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICAgIHZhciBkaXNwbGF5TmFtZSA9IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nID8gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgJ1Vua25vd24nIDogdHlwZTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFJlYWN0RWxlbWVudCh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LCBwcm9wcyk7XG59O1xuXG4vKipcbiAqIFJldHVybiBhIGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgUmVhY3RFbGVtZW50cyBvZiBhIGdpdmVuIHR5cGUuXG4gKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3QuY3JlYXRlZmFjdG9yeVxuICovXG5SZWFjdEVsZW1lbnQuY3JlYXRlRmFjdG9yeSA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gIHZhciBmYWN0b3J5ID0gUmVhY3RFbGVtZW50LmNyZWF0ZUVsZW1lbnQuYmluZChudWxsLCB0eXBlKTtcbiAgLy8gRXhwb3NlIHRoZSB0eXBlIG9uIHRoZSBmYWN0b3J5IGFuZCB0aGUgcHJvdG90eXBlIHNvIHRoYXQgaXQgY2FuIGJlXG4gIC8vIGVhc2lseSBhY2Nlc3NlZCBvbiBlbGVtZW50cy4gRS5nLiBgPEZvbyAvPi50eXBlID09PSBGb29gLlxuICAvLyBUaGlzIHNob3VsZCBub3QgYmUgbmFtZWQgYGNvbnN0cnVjdG9yYCBzaW5jZSB0aGlzIG1heSBub3QgYmUgdGhlIGZ1bmN0aW9uXG4gIC8vIHRoYXQgY3JlYXRlZCB0aGUgZWxlbWVudCwgYW5kIGl0IG1heSBub3QgZXZlbiBiZSBhIGNvbnN0cnVjdG9yLlxuICAvLyBMZWdhY3kgaG9vayBUT0RPOiBXYXJuIGlmIHRoaXMgaXMgYWNjZXNzZWRcbiAgZmFjdG9yeS50eXBlID0gdHlwZTtcbiAgcmV0dXJuIGZhY3Rvcnk7XG59O1xuXG5SZWFjdEVsZW1lbnQuY2xvbmVBbmRSZXBsYWNlS2V5ID0gZnVuY3Rpb24gKG9sZEVsZW1lbnQsIG5ld0tleSkge1xuICB2YXIgbmV3RWxlbWVudCA9IFJlYWN0RWxlbWVudChvbGRFbGVtZW50LnR5cGUsIG5ld0tleSwgb2xkRWxlbWVudC5yZWYsIG9sZEVsZW1lbnQuX3NlbGYsIG9sZEVsZW1lbnQuX3NvdXJjZSwgb2xkRWxlbWVudC5fb3duZXIsIG9sZEVsZW1lbnQucHJvcHMpO1xuXG4gIHJldHVybiBuZXdFbGVtZW50O1xufTtcblxuLyoqXG4gKiBDbG9uZSBhbmQgcmV0dXJuIGEgbmV3IFJlYWN0RWxlbWVudCB1c2luZyBlbGVtZW50IGFzIHRoZSBzdGFydGluZyBwb2ludC5cbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jbG9uZWVsZW1lbnRcbiAqL1xuUmVhY3RFbGVtZW50LmNsb25lRWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50LCBjb25maWcsIGNoaWxkcmVuKSB7XG4gIHZhciBwcm9wTmFtZTtcblxuICAvLyBPcmlnaW5hbCBwcm9wcyBhcmUgY29waWVkXG4gIHZhciBwcm9wcyA9IF9hc3NpZ24oe30sIGVsZW1lbnQucHJvcHMpO1xuXG4gIC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcmVmID0gZWxlbWVudC5yZWY7XG4gIC8vIFNlbGYgaXMgcHJlc2VydmVkIHNpbmNlIHRoZSBvd25lciBpcyBwcmVzZXJ2ZWQuXG4gIHZhciBzZWxmID0gZWxlbWVudC5fc2VsZjtcbiAgLy8gU291cmNlIGlzIHByZXNlcnZlZCBzaW5jZSBjbG9uZUVsZW1lbnQgaXMgdW5saWtlbHkgdG8gYmUgdGFyZ2V0ZWQgYnkgYVxuICAvLyB0cmFuc3BpbGVyLCBhbmQgdGhlIG9yaWdpbmFsIHNvdXJjZSBpcyBwcm9iYWJseSBhIGJldHRlciBpbmRpY2F0b3Igb2YgdGhlXG4gIC8vIHRydWUgb3duZXIuXG4gIHZhciBzb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG5cbiAgLy8gT3duZXIgd2lsbCBiZSBwcmVzZXJ2ZWQsIHVubGVzcyByZWYgaXMgb3ZlcnJpZGRlblxuICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgLy8gU2lsZW50bHkgc3RlYWwgdGhlIHJlZiBmcm9tIHRoZSBwYXJlbnQuXG4gICAgICByZWYgPSBjb25maWcucmVmO1xuICAgICAgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuICAgIH1cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH1cblxuICAgIC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIG92ZXJyaWRlIGV4aXN0aW5nIHByb3BzXG4gICAgdmFyIGRlZmF1bHRQcm9wcztcbiAgICBpZiAoZWxlbWVudC50eXBlICYmIGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIGRlZmF1bHRQcm9wcyA9IGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHM7XG4gICAgfVxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIGlmIChjb25maWdbcHJvcE5hbWVdID09PSB1bmRlZmluZWQgJiYgZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvXG4gIC8vIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0LlxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KGVsZW1lbnQudHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKTtcbn07XG5cbi8qKlxuICogVmVyaWZpZXMgdGhlIG9iamVjdCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5pc3ZhbGlkZWxlbWVudFxuICogQHBhcmFtIHs/b2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYG9iamVjdGAgaXMgYSB2YWxpZCBjb21wb25lbnQuXG4gKiBAZmluYWxcbiAqL1xuUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50ID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEVsZW1lbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgU3ltYm9sICovXG5cbnZhciBJVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJzsgLy8gQmVmb3JlIFN5bWJvbCBzcGVjLlxuXG4vKipcbiAqIFJldHVybnMgdGhlIGl0ZXJhdG9yIG1ldGhvZCBmdW5jdGlvbiBjb250YWluZWQgb24gdGhlIGl0ZXJhYmxlIG9iamVjdC5cbiAqXG4gKiBCZSBzdXJlIHRvIGludm9rZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgaXRlcmFibGUgYXMgY29udGV4dDpcbiAqXG4gKiAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG15SXRlcmFibGUpO1xuICogICAgIGlmIChpdGVyYXRvckZuKSB7XG4gKiAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobXlJdGVyYWJsZSk7XG4gKiAgICAgICAuLi5cbiAqICAgICB9XG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBtYXliZUl0ZXJhYmxlXG4gKiBAcmV0dXJuIHs/ZnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICB2YXIgaXRlcmF0b3JGbiA9IG1heWJlSXRlcmFibGUgJiYgKElURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF0pO1xuICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gaXRlcmF0b3JGbjtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEl0ZXJhdG9yRm47IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEVzY2FwZSBhbmQgd3JhcCBrZXkgc28gaXQgaXMgc2FmZSB0byB1c2UgYXMgYSByZWFjdGlkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSB0byBiZSBlc2NhcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgZXNjYXBlZCBrZXkuXG4gKi9cblxuZnVuY3Rpb24gZXNjYXBlKGtleSkge1xuICB2YXIgZXNjYXBlUmVnZXggPSAvWz06XS9nO1xuICB2YXIgZXNjYXBlckxvb2t1cCA9IHtcbiAgICAnPSc6ICc9MCcsXG4gICAgJzonOiAnPTInXG4gIH07XG4gIHZhciBlc2NhcGVkU3RyaW5nID0gKCcnICsga2V5KS5yZXBsYWNlKGVzY2FwZVJlZ2V4LCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICByZXR1cm4gZXNjYXBlckxvb2t1cFttYXRjaF07XG4gIH0pO1xuXG4gIHJldHVybiAnJCcgKyBlc2NhcGVkU3RyaW5nO1xufVxuXG4vKipcbiAqIFVuZXNjYXBlIGFuZCB1bndyYXAga2V5IGZvciBodW1hbi1yZWFkYWJsZSBkaXNwbGF5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSB0byB1bmVzY2FwZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIHVuZXNjYXBlZCBrZXkuXG4gKi9cbmZ1bmN0aW9uIHVuZXNjYXBlKGtleSkge1xuICB2YXIgdW5lc2NhcGVSZWdleCA9IC8oPTB8PTIpL2c7XG4gIHZhciB1bmVzY2FwZXJMb29rdXAgPSB7XG4gICAgJz0wJzogJz0nLFxuICAgICc9Mic6ICc6J1xuICB9O1xuICB2YXIga2V5U3Vic3RyaW5nID0ga2V5WzBdID09PSAnLicgJiYga2V5WzFdID09PSAnJCcgPyBrZXkuc3Vic3RyaW5nKDIpIDoga2V5LnN1YnN0cmluZygxKTtcblxuICByZXR1cm4gKCcnICsga2V5U3Vic3RyaW5nKS5yZXBsYWNlKHVuZXNjYXBlUmVnZXgsIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgIHJldHVybiB1bmVzY2FwZXJMb29rdXBbbWF0Y2hdO1xuICB9KTtcbn1cblxudmFyIEtleUVzY2FwZVV0aWxzID0ge1xuICBlc2NhcGU6IGVzY2FwZSxcbiAgdW5lc2NhcGU6IHVuZXNjYXBlXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEtleUVzY2FwZVV0aWxzOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJy4vUmVhY3RDdXJyZW50T3duZXInKTtcbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudFN5bWJvbCcpO1xuXG52YXIgZ2V0SXRlcmF0b3JGbiA9IHJlcXVpcmUoJy4vZ2V0SXRlcmF0b3JGbicpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIEtleUVzY2FwZVV0aWxzID0gcmVxdWlyZSgnLi9LZXlFc2NhcGVVdGlscycpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBTRVBBUkFUT1IgPSAnLic7XG52YXIgU1VCU0VQQVJBVE9SID0gJzonO1xuXG4vKipcbiAqIFRoaXMgaXMgaW5saW5lZCBmcm9tIFJlYWN0RWxlbWVudCBzaW5jZSB0aGlzIGZpbGUgaXMgc2hhcmVkIGJldHdlZW5cbiAqIGlzb21vcnBoaWMgYW5kIHJlbmRlcmVycy4gV2UgY291bGQgZXh0cmFjdCB0aGlzIHRvIGFcbiAqXG4gKi9cblxuLyoqXG4gKiBUT0RPOiBUZXN0IHRoYXQgYSBzaW5nbGUgY2hpbGQgYW5kIGFuIGFycmF5IHdpdGggb25lIGl0ZW0gaGF2ZSB0aGUgc2FtZSBrZXlcbiAqIHBhdHRlcm4uXG4gKi9cblxudmFyIGRpZFdhcm5BYm91dE1hcHMgPSBmYWxzZTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIGtleSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIGEgY29tcG9uZW50IHdpdGhpbiBhIHNldC5cbiAqXG4gKiBAcGFyYW0geyp9IGNvbXBvbmVudCBBIGNvbXBvbmVudCB0aGF0IGNvdWxkIGNvbnRhaW4gYSBtYW51YWwga2V5LlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IHRoYXQgaXMgdXNlZCBpZiBhIG1hbnVhbCBrZXkgaXMgbm90IHByb3ZpZGVkLlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRDb21wb25lbnRLZXkoY29tcG9uZW50LCBpbmRleCkge1xuICAvLyBEbyBzb21lIHR5cGVjaGVja2luZyBoZXJlIHNpbmNlIHdlIGNhbGwgdGhpcyBibGluZGx5LiBXZSB3YW50IHRvIGVuc3VyZVxuICAvLyB0aGF0IHdlIGRvbid0IGJsb2NrIHBvdGVudGlhbCBmdXR1cmUgRVMgQVBJcy5cbiAgaWYgKGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50ID09PSAnb2JqZWN0JyAmJiBjb21wb25lbnQua2V5ICE9IG51bGwpIHtcbiAgICAvLyBFeHBsaWNpdCBrZXlcbiAgICByZXR1cm4gS2V5RXNjYXBlVXRpbHMuZXNjYXBlKGNvbXBvbmVudC5rZXkpO1xuICB9XG4gIC8vIEltcGxpY2l0IGtleSBkZXRlcm1pbmVkIGJ5IHRoZSBpbmRleCBpbiB0aGUgc2V0XG4gIHJldHVybiBpbmRleC50b1N0cmluZygzNik7XG59XG5cbi8qKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0geyFzdHJpbmd9IG5hbWVTb0ZhciBOYW1lIG9mIHRoZSBrZXkgcGF0aCBzbyBmYXIuXG4gKiBAcGFyYW0geyFmdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gaW52b2tlIHdpdGggZWFjaCBjaGlsZCBmb3VuZC5cbiAqIEBwYXJhbSB7Pyp9IHRyYXZlcnNlQ29udGV4dCBVc2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdGhyb3VnaG91dCB0aGUgdHJhdmVyc2FsXG4gKiBwcm9jZXNzLlxuICogQHJldHVybiB7IW51bWJlcn0gVGhlIG51bWJlciBvZiBjaGlsZHJlbiBpbiB0aGlzIHN1YnRyZWUuXG4gKi9cbmZ1bmN0aW9uIHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkcmVuLCBuYW1lU29GYXIsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgY2hpbGRyZW47XG5cbiAgaWYgKHR5cGUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGUgPT09ICdib29sZWFuJykge1xuICAgIC8vIEFsbCBvZiB0aGUgYWJvdmUgYXJlIHBlcmNlaXZlZCBhcyBudWxsLlxuICAgIGNoaWxkcmVuID0gbnVsbDtcbiAgfVxuXG4gIGlmIChjaGlsZHJlbiA9PT0gbnVsbCB8fCB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnbnVtYmVyJyB8fFxuICAvLyBUaGUgZm9sbG93aW5nIGlzIGlubGluZWQgZnJvbSBSZWFjdEVsZW1lbnQuIFRoaXMgbWVhbnMgd2UgY2FuIG9wdGltaXplXG4gIC8vIHNvbWUgY2hlY2tzLiBSZWFjdCBGaWJlciBhbHNvIGlubGluZXMgdGhpcyBsb2dpYyBmb3Igc2ltaWxhciBwdXJwb3Nlcy5cbiAgdHlwZSA9PT0gJ29iamVjdCcgJiYgY2hpbGRyZW4uJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgIGNhbGxiYWNrKHRyYXZlcnNlQ29udGV4dCwgY2hpbGRyZW4sXG4gICAgLy8gSWYgaXQncyB0aGUgb25seSBjaGlsZCwgdHJlYXQgdGhlIG5hbWUgYXMgaWYgaXQgd2FzIHdyYXBwZWQgaW4gYW4gYXJyYXlcbiAgICAvLyBzbyB0aGF0IGl0J3MgY29uc2lzdGVudCBpZiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGdyb3dzLlxuICAgIG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgKyBnZXRDb21wb25lbnRLZXkoY2hpbGRyZW4sIDApIDogbmFtZVNvRmFyKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHZhciBjaGlsZDtcbiAgdmFyIG5leHROYW1lO1xuICB2YXIgc3VidHJlZUNvdW50ID0gMDsgLy8gQ291bnQgb2YgY2hpbGRyZW4gZm91bmQgaW4gdGhlIGN1cnJlbnQgc3VidHJlZS5cbiAgdmFyIG5leHROYW1lUHJlZml4ID0gbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiA6IG5hbWVTb0ZhciArIFNVQlNFUEFSQVRPUjtcblxuICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldENvbXBvbmVudEtleShjaGlsZCwgaSk7XG4gICAgICBzdWJ0cmVlQ291bnQgKz0gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGQsIG5leHROYW1lLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGNoaWxkcmVuKTtcbiAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGNoaWxkcmVuKTtcbiAgICAgIHZhciBzdGVwO1xuICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IGNoaWxkcmVuLmVudHJpZXMpIHtcbiAgICAgICAgdmFyIGlpID0gMDtcbiAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgIGNoaWxkID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkLCBpaSsrKTtcbiAgICAgICAgICBzdWJ0cmVlQ291bnQgKz0gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGQsIG5leHROYW1lLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICB2YXIgbWFwc0FzQ2hpbGRyZW5BZGRlbmR1bSA9ICcnO1xuICAgICAgICAgIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgICAgICAgICB2YXIgbWFwc0FzQ2hpbGRyZW5Pd25lck5hbWUgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKTtcbiAgICAgICAgICAgIGlmIChtYXBzQXNDaGlsZHJlbk93bmVyTmFtZSkge1xuICAgICAgICAgICAgICBtYXBzQXNDaGlsZHJlbkFkZGVuZHVtID0gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG1hcHNBc0NoaWxkcmVuT3duZXJOYW1lICsgJ2AuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZGlkV2FybkFib3V0TWFwcywgJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHlldCBmdWxseSBzdXBwb3J0ZWQuIEl0IGlzIGFuICcgKyAnZXhwZXJpbWVudGFsIGZlYXR1cmUgdGhhdCBtaWdodCBiZSByZW1vdmVkLiBDb252ZXJ0IGl0IHRvIGEgJyArICdzZXF1ZW5jZSAvIGl0ZXJhYmxlIG9mIGtleWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4lcycsIG1hcHNBc0NoaWxkcmVuQWRkZW5kdW0pIDogdm9pZCAwO1xuICAgICAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEl0ZXJhdG9yIHdpbGwgcHJvdmlkZSBlbnRyeSBbayx2XSB0dXBsZXMgcmF0aGVyIHRoYW4gdmFsdWVzLlxuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIGNoaWxkID0gZW50cnlbMV07XG4gICAgICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgS2V5RXNjYXBlVXRpbHMuZXNjYXBlKGVudHJ5WzBdKSArIFNVQlNFUEFSQVRPUiArIGdldENvbXBvbmVudEtleShjaGlsZCwgMCk7XG4gICAgICAgICAgICBzdWJ0cmVlQ291bnQgKz0gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGQsIG5leHROYW1lLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgYWRkZW5kdW0gPSAnJztcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGFkZGVuZHVtID0gJyBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5ICcgKyAnaW5zdGVhZCBvciB3cmFwIHRoZSBvYmplY3QgdXNpbmcgY3JlYXRlRnJhZ21lbnQob2JqZWN0KSBmcm9tIHRoZSAnICsgJ1JlYWN0IGFkZC1vbnMuJztcbiAgICAgICAgaWYgKGNoaWxkcmVuLl9pc1JlYWN0RWxlbWVudCkge1xuICAgICAgICAgIGFkZGVuZHVtID0gXCIgSXQgbG9va3MgbGlrZSB5b3UncmUgdXNpbmcgYW4gZWxlbWVudCBjcmVhdGVkIGJ5IGEgZGlmZmVyZW50IFwiICsgJ3ZlcnNpb24gb2YgUmVhY3QuIE1ha2Ugc3VyZSB0byB1c2Ugb25seSBvbmUgY29weSBvZiBSZWFjdC4nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgICAgICAgdmFyIG5hbWUgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKTtcbiAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgYWRkZW5kdW0gKz0gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIGNoaWxkcmVuU3RyaW5nID0gU3RyaW5nKGNoaWxkcmVuKTtcbiAgICAgICFmYWxzZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6ICVzKS4lcycsIGNoaWxkcmVuU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZHJlblN0cmluZywgYWRkZW5kdW0pIDogX3Byb2RJbnZhcmlhbnQoJzMxJywgY2hpbGRyZW5TdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjaGlsZHJlbikuam9pbignLCAnKSArICd9JyA6IGNoaWxkcmVuU3RyaW5nLCBhZGRlbmR1bSkgOiB2b2lkIDA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN1YnRyZWVDb3VudDtcbn1cblxuLyoqXG4gKiBUcmF2ZXJzZXMgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLCBidXRcbiAqIG1pZ2h0IGFsc28gYmUgc3BlY2lmaWVkIHRocm91Z2ggYXR0cmlidXRlczpcbiAqXG4gKiAtIGB0cmF2ZXJzZUFsbENoaWxkcmVuKHRoaXMucHJvcHMuY2hpbGRyZW4sIC4uLilgXG4gKiAtIGB0cmF2ZXJzZUFsbENoaWxkcmVuKHRoaXMucHJvcHMubGVmdFBhbmVsQ2hpbGRyZW4sIC4uLilgXG4gKlxuICogVGhlIGB0cmF2ZXJzZUNvbnRleHRgIGlzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRoYXQgaXMgcGFzc2VkIHRocm91Z2ggdGhlXG4gKiBlbnRpcmUgdHJhdmVyc2FsLiBJdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBhY2N1bXVsYXRpb25zIG9yIGFueXRoaW5nIGVsc2UgdGhhdFxuICogdGhlIGNhbGxiYWNrIG1pZ2h0IGZpbmQgcmVsZXZhbnQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBvYmplY3QuXG4gKiBAcGFyYW0geyFmdW5jdGlvbn0gY2FsbGJhY2sgVG8gaW52b2tlIHVwb24gdHJhdmVyc2luZyBlYWNoIGNoaWxkLlxuICogQHBhcmFtIHs/Kn0gdHJhdmVyc2VDb250ZXh0IENvbnRleHQgZm9yIHRyYXZlcnNhbC5cbiAqIEByZXR1cm4geyFudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhpcyBzdWJ0cmVlLlxuICovXG5mdW5jdGlvbiB0cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICByZXR1cm4gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGRyZW4sICcnLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0cmF2ZXJzZUFsbENoaWxkcmVuOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBQb29sZWRDbGFzcyA9IHJlcXVpcmUoJy4vUG9vbGVkQ2xhc3MnKTtcbnZhciBSZWFjdEVsZW1lbnQgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudCcpO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTtcbnZhciB0cmF2ZXJzZUFsbENoaWxkcmVuID0gcmVxdWlyZSgnLi90cmF2ZXJzZUFsbENoaWxkcmVuJyk7XG5cbnZhciB0d29Bcmd1bWVudFBvb2xlciA9IFBvb2xlZENsYXNzLnR3b0FyZ3VtZW50UG9vbGVyO1xudmFyIGZvdXJBcmd1bWVudFBvb2xlciA9IFBvb2xlZENsYXNzLmZvdXJBcmd1bWVudFBvb2xlcjtcblxudmFyIHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4ID0gL1xcLysvZztcbmZ1bmN0aW9uIGVzY2FwZVVzZXJQcm92aWRlZEtleSh0ZXh0KSB7XG4gIHJldHVybiAoJycgKyB0ZXh0KS5yZXBsYWNlKHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4LCAnJCYvJyk7XG59XG5cbi8qKlxuICogUG9vbGVkQ2xhc3MgcmVwcmVzZW50aW5nIHRoZSBib29ra2VlcGluZyBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyBhIGNoaWxkXG4gKiB0cmF2ZXJzYWwuIEFsbG93cyBhdm9pZGluZyBiaW5kaW5nIGNhbGxiYWNrcy5cbiAqXG4gKiBAY29uc3RydWN0b3IgRm9yRWFjaEJvb2tLZWVwaW5nXG4gKiBAcGFyYW0geyFmdW5jdGlvbn0gZm9yRWFjaEZ1bmN0aW9uIEZ1bmN0aW9uIHRvIHBlcmZvcm0gdHJhdmVyc2FsIHdpdGguXG4gKiBAcGFyYW0gez8qfSBmb3JFYWNoQ29udGV4dCBDb250ZXh0IHRvIHBlcmZvcm0gY29udGV4dCB3aXRoLlxuICovXG5mdW5jdGlvbiBGb3JFYWNoQm9va0tlZXBpbmcoZm9yRWFjaEZ1bmN0aW9uLCBmb3JFYWNoQ29udGV4dCkge1xuICB0aGlzLmZ1bmMgPSBmb3JFYWNoRnVuY3Rpb247XG4gIHRoaXMuY29udGV4dCA9IGZvckVhY2hDb250ZXh0O1xuICB0aGlzLmNvdW50ID0gMDtcbn1cbkZvckVhY2hCb29rS2VlcGluZy5wcm90b3R5cGUuZGVzdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5mdW5jID0gbnVsbDtcbiAgdGhpcy5jb250ZXh0ID0gbnVsbDtcbiAgdGhpcy5jb3VudCA9IDA7XG59O1xuUG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKEZvckVhY2hCb29rS2VlcGluZywgdHdvQXJndW1lbnRQb29sZXIpO1xuXG5mdW5jdGlvbiBmb3JFYWNoU2luZ2xlQ2hpbGQoYm9va0tlZXBpbmcsIGNoaWxkLCBuYW1lKSB7XG4gIHZhciBmdW5jID0gYm9va0tlZXBpbmcuZnVuYyxcbiAgICAgIGNvbnRleHQgPSBib29rS2VlcGluZy5jb250ZXh0O1xuXG4gIGZ1bmMuY2FsbChjb250ZXh0LCBjaGlsZCwgYm9va0tlZXBpbmcuY291bnQrKyk7XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNoaWxkcmVuLmZvcmVhY2hcbiAqXG4gKiBUaGUgcHJvdmlkZWQgZm9yRWFjaEZ1bmMoY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZm9yRWFjaEZ1bmNcbiAqIEBwYXJhbSB7Kn0gZm9yRWFjaENvbnRleHQgQ29udGV4dCBmb3IgZm9yRWFjaENvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG4gIHZhciB0cmF2ZXJzZUNvbnRleHQgPSBGb3JFYWNoQm9va0tlZXBpbmcuZ2V0UG9vbGVkKGZvckVhY2hGdW5jLCBmb3JFYWNoQ29udGV4dCk7XG4gIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIGZvckVhY2hTaW5nbGVDaGlsZCwgdHJhdmVyc2VDb250ZXh0KTtcbiAgRm9yRWFjaEJvb2tLZWVwaW5nLnJlbGVhc2UodHJhdmVyc2VDb250ZXh0KTtcbn1cblxuLyoqXG4gKiBQb29sZWRDbGFzcyByZXByZXNlbnRpbmcgdGhlIGJvb2trZWVwaW5nIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIGEgY2hpbGRcbiAqIG1hcHBpbmcuIEFsbG93cyBhdm9pZGluZyBiaW5kaW5nIGNhbGxiYWNrcy5cbiAqXG4gKiBAY29uc3RydWN0b3IgTWFwQm9va0tlZXBpbmdcbiAqIEBwYXJhbSB7ISp9IG1hcFJlc3VsdCBPYmplY3QgY29udGFpbmluZyB0aGUgb3JkZXJlZCBtYXAgb2YgcmVzdWx0cy5cbiAqIEBwYXJhbSB7IWZ1bmN0aW9ufSBtYXBGdW5jdGlvbiBGdW5jdGlvbiB0byBwZXJmb3JtIG1hcHBpbmcgd2l0aC5cbiAqIEBwYXJhbSB7Pyp9IG1hcENvbnRleHQgQ29udGV4dCB0byBwZXJmb3JtIG1hcHBpbmcgd2l0aC5cbiAqL1xuZnVuY3Rpb24gTWFwQm9va0tlZXBpbmcobWFwUmVzdWx0LCBrZXlQcmVmaXgsIG1hcEZ1bmN0aW9uLCBtYXBDb250ZXh0KSB7XG4gIHRoaXMucmVzdWx0ID0gbWFwUmVzdWx0O1xuICB0aGlzLmtleVByZWZpeCA9IGtleVByZWZpeDtcbiAgdGhpcy5mdW5jID0gbWFwRnVuY3Rpb247XG4gIHRoaXMuY29udGV4dCA9IG1hcENvbnRleHQ7XG4gIHRoaXMuY291bnQgPSAwO1xufVxuTWFwQm9va0tlZXBpbmcucHJvdG90eXBlLmRlc3RydWN0b3IgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMucmVzdWx0ID0gbnVsbDtcbiAgdGhpcy5rZXlQcmVmaXggPSBudWxsO1xuICB0aGlzLmZ1bmMgPSBudWxsO1xuICB0aGlzLmNvbnRleHQgPSBudWxsO1xuICB0aGlzLmNvdW50ID0gMDtcbn07XG5Qb29sZWRDbGFzcy5hZGRQb29saW5nVG8oTWFwQm9va0tlZXBpbmcsIGZvdXJBcmd1bWVudFBvb2xlcik7XG5cbmZ1bmN0aW9uIG1hcFNpbmdsZUNoaWxkSW50b0NvbnRleHQoYm9va0tlZXBpbmcsIGNoaWxkLCBjaGlsZEtleSkge1xuICB2YXIgcmVzdWx0ID0gYm9va0tlZXBpbmcucmVzdWx0LFxuICAgICAga2V5UHJlZml4ID0gYm9va0tlZXBpbmcua2V5UHJlZml4LFxuICAgICAgZnVuYyA9IGJvb2tLZWVwaW5nLmZ1bmMsXG4gICAgICBjb250ZXh0ID0gYm9va0tlZXBpbmcuY29udGV4dDtcblxuXG4gIHZhciBtYXBwZWRDaGlsZCA9IGZ1bmMuY2FsbChjb250ZXh0LCBjaGlsZCwgYm9va0tlZXBpbmcuY291bnQrKyk7XG4gIGlmIChBcnJheS5pc0FycmF5KG1hcHBlZENoaWxkKSkge1xuICAgIG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWwobWFwcGVkQ2hpbGQsIHJlc3VsdCwgY2hpbGRLZXksIGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNBcmd1bWVudCk7XG4gIH0gZWxzZSBpZiAobWFwcGVkQ2hpbGQgIT0gbnVsbCkge1xuICAgIGlmIChSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQobWFwcGVkQ2hpbGQpKSB7XG4gICAgICBtYXBwZWRDaGlsZCA9IFJlYWN0RWxlbWVudC5jbG9uZUFuZFJlcGxhY2VLZXkobWFwcGVkQ2hpbGQsXG4gICAgICAvLyBLZWVwIGJvdGggdGhlIChtYXBwZWQpIGFuZCBvbGQga2V5cyBpZiB0aGV5IGRpZmZlciwganVzdCBhc1xuICAgICAgLy8gdHJhdmVyc2VBbGxDaGlsZHJlbiB1c2VkIHRvIGRvIGZvciBvYmplY3RzIGFzIGNoaWxkcmVuXG4gICAgICBrZXlQcmVmaXggKyAobWFwcGVkQ2hpbGQua2V5ICYmICghY2hpbGQgfHwgY2hpbGQua2V5ICE9PSBtYXBwZWRDaGlsZC5rZXkpID8gZXNjYXBlVXNlclByb3ZpZGVkS2V5KG1hcHBlZENoaWxkLmtleSkgKyAnLycgOiAnJykgKyBjaGlsZEtleSk7XG4gICAgfVxuICAgIHJlc3VsdC5wdXNoKG1hcHBlZENoaWxkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXBJbnRvV2l0aEtleVByZWZpeEludGVybmFsKGNoaWxkcmVuLCBhcnJheSwgcHJlZml4LCBmdW5jLCBjb250ZXh0KSB7XG4gIHZhciBlc2NhcGVkUHJlZml4ID0gJyc7XG4gIGlmIChwcmVmaXggIT0gbnVsbCkge1xuICAgIGVzY2FwZWRQcmVmaXggPSBlc2NhcGVVc2VyUHJvdmlkZWRLZXkocHJlZml4KSArICcvJztcbiAgfVxuICB2YXIgdHJhdmVyc2VDb250ZXh0ID0gTWFwQm9va0tlZXBpbmcuZ2V0UG9vbGVkKGFycmF5LCBlc2NhcGVkUHJlZml4LCBmdW5jLCBjb250ZXh0KTtcbiAgdHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgbWFwU2luZ2xlQ2hpbGRJbnRvQ29udGV4dCwgdHJhdmVyc2VDb250ZXh0KTtcbiAgTWFwQm9va0tlZXBpbmcucmVsZWFzZSh0cmF2ZXJzZUNvbnRleHQpO1xufVxuXG4vKipcbiAqIE1hcHMgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jaGlsZHJlbi5tYXBcbiAqXG4gKiBUaGUgcHJvdmlkZWQgbWFwRnVuY3Rpb24oY2hpbGQsIGtleSwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoXG4gKiBsZWFmIGNoaWxkLlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHtmdW5jdGlvbigqLCBpbnQpfSBmdW5jIFRoZSBtYXAgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgQ29udGV4dCBmb3IgbWFwRnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtvYmplY3R9IE9iamVjdCBjb250YWluaW5nIHRoZSBvcmRlcmVkIG1hcCBvZiByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuYywgY29udGV4dCkge1xuICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkge1xuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfVxuICB2YXIgcmVzdWx0ID0gW107XG4gIG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWwoY2hpbGRyZW4sIHJlc3VsdCwgbnVsbCwgZnVuYywgY29udGV4dCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGZvckVhY2hTaW5nbGVDaGlsZER1bW15KHRyYXZlcnNlQ29udGV4dCwgY2hpbGQsIG5hbWUpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogQ291bnQgdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzXG4gKiBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jaGlsZHJlbi5jb3VudFxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuLlxuICovXG5mdW5jdGlvbiBjb3VudENoaWxkcmVuKGNoaWxkcmVuLCBjb250ZXh0KSB7XG4gIHJldHVybiB0cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLCBmb3JFYWNoU2luZ2xlQ2hpbGREdW1teSwgbnVsbCk7XG59XG5cbi8qKlxuICogRmxhdHRlbiBhIGNoaWxkcmVuIG9iamVjdCAodHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gKSBhbmRcbiAqIHJldHVybiBhbiBhcnJheSB3aXRoIGFwcHJvcHJpYXRlbHkgcmUta2V5ZWQgY2hpbGRyZW4uXG4gKlxuICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNoaWxkcmVuLnRvYXJyYXlcbiAqL1xuZnVuY3Rpb24gdG9BcnJheShjaGlsZHJlbikge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWwoY2hpbGRyZW4sIHJlc3VsdCwgbnVsbCwgZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc0FyZ3VtZW50KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxudmFyIFJlYWN0Q2hpbGRyZW4gPSB7XG4gIGZvckVhY2g6IGZvckVhY2hDaGlsZHJlbixcbiAgbWFwOiBtYXBDaGlsZHJlbixcbiAgbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5hbDogbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5hbCxcbiAgY291bnQ6IGNvdW50Q2hpbGRyZW4sXG4gIHRvQXJyYXk6IHRvQXJyYXlcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RDaGlsZHJlbjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RFbGVtZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnQnKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBmYWN0b3J5IHRoYXQgY3JlYXRlcyBIVE1MIHRhZyBlbGVtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgY3JlYXRlRE9NRmFjdG9yeSA9IFJlYWN0RWxlbWVudC5jcmVhdGVGYWN0b3J5O1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0RWxlbWVudFZhbGlkYXRvciA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50VmFsaWRhdG9yJyk7XG4gIGNyZWF0ZURPTUZhY3RvcnkgPSBSZWFjdEVsZW1lbnRWYWxpZGF0b3IuY3JlYXRlRmFjdG9yeTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWFwcGluZyBmcm9tIHN1cHBvcnRlZCBIVE1MIHRhZ3MgdG8gYFJlYWN0RE9NQ29tcG9uZW50YCBjbGFzc2VzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xudmFyIFJlYWN0RE9NRmFjdG9yaWVzID0ge1xuICBhOiBjcmVhdGVET01GYWN0b3J5KCdhJyksXG4gIGFiYnI6IGNyZWF0ZURPTUZhY3RvcnkoJ2FiYnInKSxcbiAgYWRkcmVzczogY3JlYXRlRE9NRmFjdG9yeSgnYWRkcmVzcycpLFxuICBhcmVhOiBjcmVhdGVET01GYWN0b3J5KCdhcmVhJyksXG4gIGFydGljbGU6IGNyZWF0ZURPTUZhY3RvcnkoJ2FydGljbGUnKSxcbiAgYXNpZGU6IGNyZWF0ZURPTUZhY3RvcnkoJ2FzaWRlJyksXG4gIGF1ZGlvOiBjcmVhdGVET01GYWN0b3J5KCdhdWRpbycpLFxuICBiOiBjcmVhdGVET01GYWN0b3J5KCdiJyksXG4gIGJhc2U6IGNyZWF0ZURPTUZhY3RvcnkoJ2Jhc2UnKSxcbiAgYmRpOiBjcmVhdGVET01GYWN0b3J5KCdiZGknKSxcbiAgYmRvOiBjcmVhdGVET01GYWN0b3J5KCdiZG8nKSxcbiAgYmlnOiBjcmVhdGVET01GYWN0b3J5KCdiaWcnKSxcbiAgYmxvY2txdW90ZTogY3JlYXRlRE9NRmFjdG9yeSgnYmxvY2txdW90ZScpLFxuICBib2R5OiBjcmVhdGVET01GYWN0b3J5KCdib2R5JyksXG4gIGJyOiBjcmVhdGVET01GYWN0b3J5KCdicicpLFxuICBidXR0b246IGNyZWF0ZURPTUZhY3RvcnkoJ2J1dHRvbicpLFxuICBjYW52YXM6IGNyZWF0ZURPTUZhY3RvcnkoJ2NhbnZhcycpLFxuICBjYXB0aW9uOiBjcmVhdGVET01GYWN0b3J5KCdjYXB0aW9uJyksXG4gIGNpdGU6IGNyZWF0ZURPTUZhY3RvcnkoJ2NpdGUnKSxcbiAgY29kZTogY3JlYXRlRE9NRmFjdG9yeSgnY29kZScpLFxuICBjb2w6IGNyZWF0ZURPTUZhY3RvcnkoJ2NvbCcpLFxuICBjb2xncm91cDogY3JlYXRlRE9NRmFjdG9yeSgnY29sZ3JvdXAnKSxcbiAgZGF0YTogY3JlYXRlRE9NRmFjdG9yeSgnZGF0YScpLFxuICBkYXRhbGlzdDogY3JlYXRlRE9NRmFjdG9yeSgnZGF0YWxpc3QnKSxcbiAgZGQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2RkJyksXG4gIGRlbDogY3JlYXRlRE9NRmFjdG9yeSgnZGVsJyksXG4gIGRldGFpbHM6IGNyZWF0ZURPTUZhY3RvcnkoJ2RldGFpbHMnKSxcbiAgZGZuOiBjcmVhdGVET01GYWN0b3J5KCdkZm4nKSxcbiAgZGlhbG9nOiBjcmVhdGVET01GYWN0b3J5KCdkaWFsb2cnKSxcbiAgZGl2OiBjcmVhdGVET01GYWN0b3J5KCdkaXYnKSxcbiAgZGw6IGNyZWF0ZURPTUZhY3RvcnkoJ2RsJyksXG4gIGR0OiBjcmVhdGVET01GYWN0b3J5KCdkdCcpLFxuICBlbTogY3JlYXRlRE9NRmFjdG9yeSgnZW0nKSxcbiAgZW1iZWQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2VtYmVkJyksXG4gIGZpZWxkc2V0OiBjcmVhdGVET01GYWN0b3J5KCdmaWVsZHNldCcpLFxuICBmaWdjYXB0aW9uOiBjcmVhdGVET01GYWN0b3J5KCdmaWdjYXB0aW9uJyksXG4gIGZpZ3VyZTogY3JlYXRlRE9NRmFjdG9yeSgnZmlndXJlJyksXG4gIGZvb3RlcjogY3JlYXRlRE9NRmFjdG9yeSgnZm9vdGVyJyksXG4gIGZvcm06IGNyZWF0ZURPTUZhY3RvcnkoJ2Zvcm0nKSxcbiAgaDE6IGNyZWF0ZURPTUZhY3RvcnkoJ2gxJyksXG4gIGgyOiBjcmVhdGVET01GYWN0b3J5KCdoMicpLFxuICBoMzogY3JlYXRlRE9NRmFjdG9yeSgnaDMnKSxcbiAgaDQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2g0JyksXG4gIGg1OiBjcmVhdGVET01GYWN0b3J5KCdoNScpLFxuICBoNjogY3JlYXRlRE9NRmFjdG9yeSgnaDYnKSxcbiAgaGVhZDogY3JlYXRlRE9NRmFjdG9yeSgnaGVhZCcpLFxuICBoZWFkZXI6IGNyZWF0ZURPTUZhY3RvcnkoJ2hlYWRlcicpLFxuICBoZ3JvdXA6IGNyZWF0ZURPTUZhY3RvcnkoJ2hncm91cCcpLFxuICBocjogY3JlYXRlRE9NRmFjdG9yeSgnaHInKSxcbiAgaHRtbDogY3JlYXRlRE9NRmFjdG9yeSgnaHRtbCcpLFxuICBpOiBjcmVhdGVET01GYWN0b3J5KCdpJyksXG4gIGlmcmFtZTogY3JlYXRlRE9NRmFjdG9yeSgnaWZyYW1lJyksXG4gIGltZzogY3JlYXRlRE9NRmFjdG9yeSgnaW1nJyksXG4gIGlucHV0OiBjcmVhdGVET01GYWN0b3J5KCdpbnB1dCcpLFxuICBpbnM6IGNyZWF0ZURPTUZhY3RvcnkoJ2lucycpLFxuICBrYmQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2tiZCcpLFxuICBrZXlnZW46IGNyZWF0ZURPTUZhY3RvcnkoJ2tleWdlbicpLFxuICBsYWJlbDogY3JlYXRlRE9NRmFjdG9yeSgnbGFiZWwnKSxcbiAgbGVnZW5kOiBjcmVhdGVET01GYWN0b3J5KCdsZWdlbmQnKSxcbiAgbGk6IGNyZWF0ZURPTUZhY3RvcnkoJ2xpJyksXG4gIGxpbms6IGNyZWF0ZURPTUZhY3RvcnkoJ2xpbmsnKSxcbiAgbWFpbjogY3JlYXRlRE9NRmFjdG9yeSgnbWFpbicpLFxuICBtYXA6IGNyZWF0ZURPTUZhY3RvcnkoJ21hcCcpLFxuICBtYXJrOiBjcmVhdGVET01GYWN0b3J5KCdtYXJrJyksXG4gIG1lbnU6IGNyZWF0ZURPTUZhY3RvcnkoJ21lbnUnKSxcbiAgbWVudWl0ZW06IGNyZWF0ZURPTUZhY3RvcnkoJ21lbnVpdGVtJyksXG4gIG1ldGE6IGNyZWF0ZURPTUZhY3RvcnkoJ21ldGEnKSxcbiAgbWV0ZXI6IGNyZWF0ZURPTUZhY3RvcnkoJ21ldGVyJyksXG4gIG5hdjogY3JlYXRlRE9NRmFjdG9yeSgnbmF2JyksXG4gIG5vc2NyaXB0OiBjcmVhdGVET01GYWN0b3J5KCdub3NjcmlwdCcpLFxuICBvYmplY3Q6IGNyZWF0ZURPTUZhY3RvcnkoJ29iamVjdCcpLFxuICBvbDogY3JlYXRlRE9NRmFjdG9yeSgnb2wnKSxcbiAgb3B0Z3JvdXA6IGNyZWF0ZURPTUZhY3RvcnkoJ29wdGdyb3VwJyksXG4gIG9wdGlvbjogY3JlYXRlRE9NRmFjdG9yeSgnb3B0aW9uJyksXG4gIG91dHB1dDogY3JlYXRlRE9NRmFjdG9yeSgnb3V0cHV0JyksXG4gIHA6IGNyZWF0ZURPTUZhY3RvcnkoJ3AnKSxcbiAgcGFyYW06IGNyZWF0ZURPTUZhY3RvcnkoJ3BhcmFtJyksXG4gIHBpY3R1cmU6IGNyZWF0ZURPTUZhY3RvcnkoJ3BpY3R1cmUnKSxcbiAgcHJlOiBjcmVhdGVET01GYWN0b3J5KCdwcmUnKSxcbiAgcHJvZ3Jlc3M6IGNyZWF0ZURPTUZhY3RvcnkoJ3Byb2dyZXNzJyksXG4gIHE6IGNyZWF0ZURPTUZhY3RvcnkoJ3EnKSxcbiAgcnA6IGNyZWF0ZURPTUZhY3RvcnkoJ3JwJyksXG4gIHJ0OiBjcmVhdGVET01GYWN0b3J5KCdydCcpLFxuICBydWJ5OiBjcmVhdGVET01GYWN0b3J5KCdydWJ5JyksXG4gIHM6IGNyZWF0ZURPTUZhY3RvcnkoJ3MnKSxcbiAgc2FtcDogY3JlYXRlRE9NRmFjdG9yeSgnc2FtcCcpLFxuICBzY3JpcHQ6IGNyZWF0ZURPTUZhY3RvcnkoJ3NjcmlwdCcpLFxuICBzZWN0aW9uOiBjcmVhdGVET01GYWN0b3J5KCdzZWN0aW9uJyksXG4gIHNlbGVjdDogY3JlYXRlRE9NRmFjdG9yeSgnc2VsZWN0JyksXG4gIHNtYWxsOiBjcmVhdGVET01GYWN0b3J5KCdzbWFsbCcpLFxuICBzb3VyY2U6IGNyZWF0ZURPTUZhY3RvcnkoJ3NvdXJjZScpLFxuICBzcGFuOiBjcmVhdGVET01GYWN0b3J5KCdzcGFuJyksXG4gIHN0cm9uZzogY3JlYXRlRE9NRmFjdG9yeSgnc3Ryb25nJyksXG4gIHN0eWxlOiBjcmVhdGVET01GYWN0b3J5KCdzdHlsZScpLFxuICBzdWI6IGNyZWF0ZURPTUZhY3RvcnkoJ3N1YicpLFxuICBzdW1tYXJ5OiBjcmVhdGVET01GYWN0b3J5KCdzdW1tYXJ5JyksXG4gIHN1cDogY3JlYXRlRE9NRmFjdG9yeSgnc3VwJyksXG4gIHRhYmxlOiBjcmVhdGVET01GYWN0b3J5KCd0YWJsZScpLFxuICB0Ym9keTogY3JlYXRlRE9NRmFjdG9yeSgndGJvZHknKSxcbiAgdGQ6IGNyZWF0ZURPTUZhY3RvcnkoJ3RkJyksXG4gIHRleHRhcmVhOiBjcmVhdGVET01GYWN0b3J5KCd0ZXh0YXJlYScpLFxuICB0Zm9vdDogY3JlYXRlRE9NRmFjdG9yeSgndGZvb3QnKSxcbiAgdGg6IGNyZWF0ZURPTUZhY3RvcnkoJ3RoJyksXG4gIHRoZWFkOiBjcmVhdGVET01GYWN0b3J5KCd0aGVhZCcpLFxuICB0aW1lOiBjcmVhdGVET01GYWN0b3J5KCd0aW1lJyksXG4gIHRpdGxlOiBjcmVhdGVET01GYWN0b3J5KCd0aXRsZScpLFxuICB0cjogY3JlYXRlRE9NRmFjdG9yeSgndHInKSxcbiAgdHJhY2s6IGNyZWF0ZURPTUZhY3RvcnkoJ3RyYWNrJyksXG4gIHU6IGNyZWF0ZURPTUZhY3RvcnkoJ3UnKSxcbiAgdWw6IGNyZWF0ZURPTUZhY3RvcnkoJ3VsJyksXG4gICd2YXInOiBjcmVhdGVET01GYWN0b3J5KCd2YXInKSxcbiAgdmlkZW86IGNyZWF0ZURPTUZhY3RvcnkoJ3ZpZGVvJyksXG4gIHdicjogY3JlYXRlRE9NRmFjdG9yeSgnd2JyJyksXG5cbiAgLy8gU1ZHXG4gIGNpcmNsZTogY3JlYXRlRE9NRmFjdG9yeSgnY2lyY2xlJyksXG4gIGNsaXBQYXRoOiBjcmVhdGVET01GYWN0b3J5KCdjbGlwUGF0aCcpLFxuICBkZWZzOiBjcmVhdGVET01GYWN0b3J5KCdkZWZzJyksXG4gIGVsbGlwc2U6IGNyZWF0ZURPTUZhY3RvcnkoJ2VsbGlwc2UnKSxcbiAgZzogY3JlYXRlRE9NRmFjdG9yeSgnZycpLFxuICBpbWFnZTogY3JlYXRlRE9NRmFjdG9yeSgnaW1hZ2UnKSxcbiAgbGluZTogY3JlYXRlRE9NRmFjdG9yeSgnbGluZScpLFxuICBsaW5lYXJHcmFkaWVudDogY3JlYXRlRE9NRmFjdG9yeSgnbGluZWFyR3JhZGllbnQnKSxcbiAgbWFzazogY3JlYXRlRE9NRmFjdG9yeSgnbWFzaycpLFxuICBwYXRoOiBjcmVhdGVET01GYWN0b3J5KCdwYXRoJyksXG4gIHBhdHRlcm46IGNyZWF0ZURPTUZhY3RvcnkoJ3BhdHRlcm4nKSxcbiAgcG9seWdvbjogY3JlYXRlRE9NRmFjdG9yeSgncG9seWdvbicpLFxuICBwb2x5bGluZTogY3JlYXRlRE9NRmFjdG9yeSgncG9seWxpbmUnKSxcbiAgcmFkaWFsR3JhZGllbnQ6IGNyZWF0ZURPTUZhY3RvcnkoJ3JhZGlhbEdyYWRpZW50JyksXG4gIHJlY3Q6IGNyZWF0ZURPTUZhY3RvcnkoJ3JlY3QnKSxcbiAgc3RvcDogY3JlYXRlRE9NRmFjdG9yeSgnc3RvcCcpLFxuICBzdmc6IGNyZWF0ZURPTUZhY3RvcnkoJ3N2ZycpLFxuICB0ZXh0OiBjcmVhdGVET01GYWN0b3J5KCd0ZXh0JyksXG4gIHRzcGFuOiBjcmVhdGVET01GYWN0b3J5KCd0c3BhbicpXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NRmFjdG9yaWVzOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50JyksXG4gICAgaXNWYWxpZEVsZW1lbnQgPSBfcmVxdWlyZS5pc1ZhbGlkRWxlbWVudDtcblxudmFyIGZhY3RvcnkgPSByZXF1aXJlKCdwcm9wLXR5cGVzL2ZhY3RvcnknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KGlzVmFsaWRFbGVtZW50KTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICcxNS42LjEnOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgZW1wdHlPYmplY3QgPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eU9iamVjdCcpO1xudmFyIF9pbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG59XG5cbnZhciBNSVhJTlNfS0VZID0gJ21peGlucyc7XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBhbGxvdyB0aGUgY3JlYXRpb24gb2YgYW5vbnltb3VzIGZ1bmN0aW9ucyB3aGljaCBkbyBub3Rcbi8vIGhhdmUgLm5hbWUgc2V0IHRvIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBiZWluZyBhc3NpZ25lZCB0by5cbmZ1bmN0aW9uIGlkZW50aXR5KGZuKSB7XG4gIHJldHVybiBmbjtcbn1cblxudmFyIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSB7XG4gICAgcHJvcDogJ3Byb3AnLFxuICAgIGNvbnRleHQ6ICdjb250ZXh0JyxcbiAgICBjaGlsZENvbnRleHQ6ICdjaGlsZCBjb250ZXh0J1xuICB9O1xufSBlbHNlIHtcbiAgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSB7fTtcbn1cblxuZnVuY3Rpb24gZmFjdG9yeShSZWFjdENvbXBvbmVudCwgaXNWYWxpZEVsZW1lbnQsIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlKSB7XG4gIC8qKlxuICAgKiBQb2xpY2llcyB0aGF0IGRlc2NyaWJlIG1ldGhvZHMgaW4gYFJlYWN0Q2xhc3NJbnRlcmZhY2VgLlxuICAgKi9cblxuICB2YXIgaW5qZWN0ZWRNaXhpbnMgPSBbXTtcblxuICAvKipcbiAgICogQ29tcG9zaXRlIGNvbXBvbmVudHMgYXJlIGhpZ2hlci1sZXZlbCBjb21wb25lbnRzIHRoYXQgY29tcG9zZSBvdGhlciBjb21wb3NpdGVcbiAgICogb3IgaG9zdCBjb21wb25lbnRzLlxuICAgKlxuICAgKiBUbyBjcmVhdGUgYSBuZXcgdHlwZSBvZiBgUmVhY3RDbGFzc2AsIHBhc3MgYSBzcGVjaWZpY2F0aW9uIG9mXG4gICAqIHlvdXIgbmV3IGNsYXNzIHRvIGBSZWFjdC5jcmVhdGVDbGFzc2AuIFRoZSBvbmx5IHJlcXVpcmVtZW50IG9mIHlvdXIgY2xhc3NcbiAgICogc3BlY2lmaWNhdGlvbiBpcyB0aGF0IHlvdSBpbXBsZW1lbnQgYSBgcmVuZGVyYCBtZXRob2QuXG4gICAqXG4gICAqICAgdmFyIE15Q29tcG9uZW50ID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICAgcmVuZGVyOiBmdW5jdGlvbigpIHtcbiAgICogICAgICAgcmV0dXJuIDxkaXY+SGVsbG8gV29ybGQ8L2Rpdj47XG4gICAqICAgICB9XG4gICAqICAgfSk7XG4gICAqXG4gICAqIFRoZSBjbGFzcyBzcGVjaWZpY2F0aW9uIHN1cHBvcnRzIGEgc3BlY2lmaWMgcHJvdG9jb2wgb2YgbWV0aG9kcyB0aGF0IGhhdmVcbiAgICogc3BlY2lhbCBtZWFuaW5nIChlLmcuIGByZW5kZXJgKS4gU2VlIGBSZWFjdENsYXNzSW50ZXJmYWNlYCBmb3JcbiAgICogbW9yZSB0aGUgY29tcHJlaGVuc2l2ZSBwcm90b2NvbC4gQW55IG90aGVyIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgaW4gdGhlXG4gICAqIGNsYXNzIHNwZWNpZmljYXRpb24gd2lsbCBiZSBhdmFpbGFibGUgb24gdGhlIHByb3RvdHlwZS5cbiAgICpcbiAgICogQGludGVyZmFjZSBSZWFjdENsYXNzSW50ZXJmYWNlXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdmFyIFJlYWN0Q2xhc3NJbnRlcmZhY2UgPSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgTWl4aW4gb2JqZWN0cyB0byBpbmNsdWRlIHdoZW4gZGVmaW5pbmcgeW91ciBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7YXJyYXl9XG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgbWl4aW5zOiAnREVGSU5FX01BTlknLFxuXG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydGllcyBhbmQgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBkZWZpbmVkIG9uXG4gICAgICogdGhlIGNvbXBvbmVudCdzIGNvbnN0cnVjdG9yIGluc3RlYWQgb2YgaXRzIHByb3RvdHlwZSAoc3RhdGljIG1ldGhvZHMpLlxuICAgICAqXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKiBAb3B0aW9uYWxcbiAgICAgKi9cbiAgICBzdGF0aWNzOiAnREVGSU5FX01BTlknLFxuXG4gICAgLyoqXG4gICAgICogRGVmaW5pdGlvbiBvZiBwcm9wIHR5cGVzIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgcHJvcFR5cGVzOiAnREVGSU5FX01BTlknLFxuXG4gICAgLyoqXG4gICAgICogRGVmaW5pdGlvbiBvZiBjb250ZXh0IHR5cGVzIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgY29udGV4dFR5cGVzOiAnREVGSU5FX01BTlknLFxuXG4gICAgLyoqXG4gICAgICogRGVmaW5pdGlvbiBvZiBjb250ZXh0IHR5cGVzIHRoaXMgY29tcG9uZW50IHNldHMgZm9yIGl0cyBjaGlsZHJlbi5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgY2hpbGRDb250ZXh0VHlwZXM6ICdERUZJTkVfTUFOWScsXG5cbiAgICAvLyA9PT09IERlZmluaXRpb24gbWV0aG9kcyA9PT09XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBtb3VudGVkLiBWYWx1ZXMgaW4gdGhlIG1hcHBpbmcgd2lsbCBiZSBzZXQgb25cbiAgICAgKiBgdGhpcy5wcm9wc2AgaWYgdGhhdCBwcm9wIGlzIG5vdCBzcGVjaWZpZWQgKGkuZS4gdXNpbmcgYW4gYGluYCBjaGVjaykuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJlZm9yZSBgZ2V0SW5pdGlhbFN0YXRlYCBhbmQgdGhlcmVmb3JlIGNhbm5vdCByZWx5XG4gICAgICogb24gYHRoaXMuc3RhdGVgIG9yIHVzZSBgdGhpcy5zZXRTdGF0ZWAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgZ2V0RGVmYXVsdFByb3BzOiAnREVGSU5FX01BTllfTUVSR0VEJyxcblxuICAgIC8qKlxuICAgICAqIEludm9rZWQgb25jZSBiZWZvcmUgdGhlIGNvbXBvbmVudCBpcyBtb3VudGVkLiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdXNlZFxuICAgICAqIGFzIHRoZSBpbml0aWFsIHZhbHVlIG9mIGB0aGlzLnN0YXRlYC5cbiAgICAgKlxuICAgICAqICAgZ2V0SW5pdGlhbFN0YXRlOiBmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgcmV0dXJuIHtcbiAgICAgKiAgICAgICBpc09uOiBmYWxzZSxcbiAgICAgKiAgICAgICBmb29CYXo6IG5ldyBCYXpGb28oKVxuICAgICAqICAgICB9XG4gICAgICogICB9XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgZ2V0SW5pdGlhbFN0YXRlOiAnREVGSU5FX01BTllfTUVSR0VEJyxcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge29iamVjdH1cbiAgICAgKiBAb3B0aW9uYWxcbiAgICAgKi9cbiAgICBnZXRDaGlsZENvbnRleHQ6ICdERUZJTkVfTUFOWV9NRVJHRUQnLFxuXG4gICAgLyoqXG4gICAgICogVXNlcyBwcm9wcyBmcm9tIGB0aGlzLnByb3BzYCBhbmQgc3RhdGUgZnJvbSBgdGhpcy5zdGF0ZWAgdG8gcmVuZGVyIHRoZVxuICAgICAqIHN0cnVjdHVyZSBvZiB0aGUgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogTm8gZ3VhcmFudGVlcyBhcmUgbWFkZSBhYm91dCB3aGVuIG9yIGhvdyBvZnRlbiB0aGlzIG1ldGhvZCBpcyBpbnZva2VkLCBzb1xuICAgICAqIGl0IG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzLlxuICAgICAqXG4gICAgICogICByZW5kZXI6IGZ1bmN0aW9uKCkge1xuICAgICAqICAgICB2YXIgbmFtZSA9IHRoaXMucHJvcHMubmFtZTtcbiAgICAgKiAgICAgcmV0dXJuIDxkaXY+SGVsbG8sIHtuYW1lfSE8L2Rpdj47XG4gICAgICogICB9XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtSZWFjdENvbXBvbmVudH1cbiAgICAgKiBAcmVxdWlyZWRcbiAgICAgKi9cbiAgICByZW5kZXI6ICdERUZJTkVfT05DRScsXG5cbiAgICAvLyA9PT09IERlbGVnYXRlIG1ldGhvZHMgPT09PVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgaW5pdGlhbGx5IGNyZWF0ZWQgYW5kIGFib3V0IHRvIGJlIG1vdW50ZWQuXG4gICAgICogVGhpcyBtYXkgaGF2ZSBzaWRlIGVmZmVjdHMsIGJ1dCBhbnkgZXh0ZXJuYWwgc3Vic2NyaXB0aW9ucyBvciBkYXRhIGNyZWF0ZWRcbiAgICAgKiBieSB0aGlzIG1ldGhvZCBtdXN0IGJlIGNsZWFuZWQgdXAgaW4gYGNvbXBvbmVudFdpbGxVbm1vdW50YC5cbiAgICAgKlxuICAgICAqIEBvcHRpb25hbFxuICAgICAqL1xuICAgIGNvbXBvbmVudFdpbGxNb3VudDogJ0RFRklORV9NQU5ZJyxcblxuICAgIC8qKlxuICAgICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGhhcyBiZWVuIG1vdW50ZWQgYW5kIGhhcyBhIERPTSByZXByZXNlbnRhdGlvbi5cbiAgICAgKiBIb3dldmVyLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgRE9NIG5vZGUgaXMgaW4gdGhlIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gb3BlcmF0ZSBvbiB0aGUgRE9NIHdoZW4gdGhlIGNvbXBvbmVudCBoYXNcbiAgICAgKiBiZWVuIG1vdW50ZWQgKGluaXRpYWxpemVkIGFuZCByZW5kZXJlZCkgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtET01FbGVtZW50fSByb290Tm9kZSBET00gZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGNvbXBvbmVudC5cbiAgICAgKiBAb3B0aW9uYWxcbiAgICAgKi9cbiAgICBjb21wb25lbnREaWRNb3VudDogJ0RFRklORV9NQU5ZJyxcblxuICAgIC8qKlxuICAgICAqIEludm9rZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgcmVjZWl2ZXMgbmV3IHByb3BzLlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhY3QgdG8gYSBwcm9wIHRyYW5zaXRpb24gYnkgdXBkYXRpbmcgdGhlXG4gICAgICogc3RhdGUgdXNpbmcgYHRoaXMuc2V0U3RhdGVgLiBDdXJyZW50IHByb3BzIGFyZSBhY2Nlc3NlZCB2aWEgYHRoaXMucHJvcHNgLlxuICAgICAqXG4gICAgICogICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzOiBmdW5jdGlvbihuZXh0UHJvcHMsIG5leHRDb250ZXh0KSB7XG4gICAgICogICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAqICAgICAgIGxpa2VzSW5jcmVhc2luZzogbmV4dFByb3BzLmxpa2VDb3VudCA+IHRoaXMucHJvcHMubGlrZUNvdW50XG4gICAgICogICAgIH0pO1xuICAgICAqICAgfVxuICAgICAqXG4gICAgICogTk9URTogVGhlcmUgaXMgbm8gZXF1aXZhbGVudCBgY29tcG9uZW50V2lsbFJlY2VpdmVTdGF0ZWAuIEFuIGluY29taW5nIHByb3BcbiAgICAgKiB0cmFuc2l0aW9uIG1heSBjYXVzZSBhIHN0YXRlIGNoYW5nZSwgYnV0IHRoZSBvcHBvc2l0ZSBpcyBub3QgdHJ1ZS4gSWYgeW91XG4gICAgICogbmVlZCBpdCwgeW91IGFyZSBwcm9iYWJseSBsb29raW5nIGZvciBgY29tcG9uZW50V2lsbFVwZGF0ZWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gbmV4dFByb3BzXG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczogJ0RFRklORV9NQU5ZJyxcblxuICAgIC8qKlxuICAgICAqIEludm9rZWQgd2hpbGUgZGVjaWRpbmcgaWYgdGhlIGNvbXBvbmVudCBzaG91bGQgYmUgdXBkYXRlZCBhcyBhIHJlc3VsdCBvZlxuICAgICAqIHJlY2VpdmluZyBuZXcgcHJvcHMsIHN0YXRlIGFuZC9vciBjb250ZXh0LlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gYHJldHVybiBmYWxzZWAgd2hlbiB5b3UncmUgY2VydGFpbiB0aGF0IHRoZVxuICAgICAqIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBwcm9wcy9zdGF0ZS9jb250ZXh0IHdpbGwgbm90IHJlcXVpcmUgYSBjb21wb25lbnRcbiAgICAgKiB1cGRhdGUuXG4gICAgICpcbiAgICAgKiAgIHNob3VsZENvbXBvbmVudFVwZGF0ZTogZnVuY3Rpb24obmV4dFByb3BzLCBuZXh0U3RhdGUsIG5leHRDb250ZXh0KSB7XG4gICAgICogICAgIHJldHVybiAhZXF1YWwobmV4dFByb3BzLCB0aGlzLnByb3BzKSB8fFxuICAgICAqICAgICAgICFlcXVhbChuZXh0U3RhdGUsIHRoaXMuc3RhdGUpIHx8XG4gICAgICogICAgICAgIWVxdWFsKG5leHRDb250ZXh0LCB0aGlzLmNvbnRleHQpO1xuICAgICAqICAgfVxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG5leHRQcm9wc1xuICAgICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dFN0YXRlXG4gICAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0Q29udGV4dFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGNvbXBvbmVudCBzaG91bGQgdXBkYXRlLlxuICAgICAqIEBvcHRpb25hbFxuICAgICAqL1xuICAgIHNob3VsZENvbXBvbmVudFVwZGF0ZTogJ0RFRklORV9PTkNFJyxcblxuICAgIC8qKlxuICAgICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGFib3V0IHRvIHVwZGF0ZSBkdWUgdG8gYSB0cmFuc2l0aW9uIGZyb21cbiAgICAgKiBgdGhpcy5wcm9wc2AsIGB0aGlzLnN0YXRlYCBhbmQgYHRoaXMuY29udGV4dGAgdG8gYG5leHRQcm9wc2AsIGBuZXh0U3RhdGVgXG4gICAgICogYW5kIGBuZXh0Q29udGV4dGAuXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBwZXJmb3JtIHByZXBhcmF0aW9uIGJlZm9yZSBhbiB1cGRhdGUgb2NjdXJzLlxuICAgICAqXG4gICAgICogTk9URTogWW91ICoqY2Fubm90KiogdXNlIGB0aGlzLnNldFN0YXRlKClgIGluIHRoaXMgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG5leHRQcm9wc1xuICAgICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dFN0YXRlXG4gICAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0Q29udGV4dFxuICAgICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICAgKiBAb3B0aW9uYWxcbiAgICAgKi9cbiAgICBjb21wb25lbnRXaWxsVXBkYXRlOiAnREVGSU5FX01BTlknLFxuXG4gICAgLyoqXG4gICAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQncyBET00gcmVwcmVzZW50YXRpb24gaGFzIGJlZW4gdXBkYXRlZC5cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIG9wZXJhdGUgb24gdGhlIERPTSB3aGVuIHRoZSBjb21wb25lbnQgaGFzXG4gICAgICogYmVlbiB1cGRhdGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHByZXZQcm9wc1xuICAgICAqIEBwYXJhbSB7P29iamVjdH0gcHJldlN0YXRlXG4gICAgICogQHBhcmFtIHs/b2JqZWN0fSBwcmV2Q29udGV4dFxuICAgICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gcm9vdE5vZGUgRE9NIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBjb21wb25lbnQuXG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgY29tcG9uZW50RGlkVXBkYXRlOiAnREVGSU5FX01BTlknLFxuXG4gICAgLyoqXG4gICAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgYWJvdXQgdG8gYmUgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQgYW5kIGhhdmVcbiAgICAgKiBpdHMgRE9NIHJlcHJlc2VudGF0aW9uIGRlc3Ryb3llZC5cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIGRlYWxsb2NhdGUgYW55IGV4dGVybmFsIHJlc291cmNlcy5cbiAgICAgKlxuICAgICAqIE5PVEU6IFRoZXJlIGlzIG5vIGBjb21wb25lbnREaWRVbm1vdW50YCBzaW5jZSB5b3VyIGNvbXBvbmVudCB3aWxsIGhhdmUgYmVlblxuICAgICAqIGRlc3Ryb3llZCBieSB0aGF0IHBvaW50LlxuICAgICAqXG4gICAgICogQG9wdGlvbmFsXG4gICAgICovXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQ6ICdERUZJTkVfTUFOWScsXG5cbiAgICAvLyA9PT09IEFkdmFuY2VkIG1ldGhvZHMgPT09PVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgY29tcG9uZW50J3MgY3VycmVudGx5IG1vdW50ZWQgRE9NIHJlcHJlc2VudGF0aW9uLlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCwgdGhpcyBpbXBsZW1lbnRzIFJlYWN0J3MgcmVuZGVyaW5nIGFuZCByZWNvbmNpbGlhdGlvbiBhbGdvcml0aG0uXG4gICAgICogU29waGlzdGljYXRlZCBjbGllbnRzIG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAgICogQGludGVybmFsXG4gICAgICogQG92ZXJyaWRhYmxlXG4gICAgICovXG4gICAgdXBkYXRlQ29tcG9uZW50OiAnT1ZFUlJJREVfQkFTRSdcbiAgfTtcblxuICAvKipcbiAgICogTWFwcGluZyBmcm9tIGNsYXNzIHNwZWNpZmljYXRpb24ga2V5cyB0byBzcGVjaWFsIHByb2Nlc3NpbmcgZnVuY3Rpb25zLlxuICAgKlxuICAgKiBBbHRob3VnaCB0aGVzZSBhcmUgZGVjbGFyZWQgbGlrZSBpbnN0YW5jZSBwcm9wZXJ0aWVzIGluIHRoZSBzcGVjaWZpY2F0aW9uXG4gICAqIHdoZW4gZGVmaW5pbmcgY2xhc3NlcyB1c2luZyBgUmVhY3QuY3JlYXRlQ2xhc3NgLCB0aGV5IGFyZSBhY3R1YWxseSBzdGF0aWNcbiAgICogYW5kIGFyZSBhY2Nlc3NpYmxlIG9uIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mIHRoZSBwcm90b3R5cGUuIERlc3BpdGVcbiAgICogYmVpbmcgc3RhdGljLCB0aGV5IG11c3QgYmUgZGVmaW5lZCBvdXRzaWRlIG9mIHRoZSBcInN0YXRpY3NcIiBrZXkgdW5kZXJcbiAgICogd2hpY2ggYWxsIG90aGVyIHN0YXRpYyBtZXRob2RzIGFyZSBkZWZpbmVkLlxuICAgKi9cbiAgdmFyIFJFU0VSVkVEX1NQRUNfS0VZUyA9IHtcbiAgICBkaXNwbGF5TmFtZTogZnVuY3Rpb24oQ29uc3RydWN0b3IsIGRpc3BsYXlOYW1lKSB7XG4gICAgICBDb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuICAgIH0sXG4gICAgbWl4aW5zOiBmdW5jdGlvbihDb25zdHJ1Y3RvciwgbWl4aW5zKSB7XG4gICAgICBpZiAobWl4aW5zKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWl4aW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgbWl4U3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIG1peGluc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGNoaWxkQ29udGV4dFR5cGVzOiBmdW5jdGlvbihDb25zdHJ1Y3RvciwgY2hpbGRDb250ZXh0VHlwZXMpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHZhbGlkYXRlVHlwZURlZihDb25zdHJ1Y3RvciwgY2hpbGRDb250ZXh0VHlwZXMsICdjaGlsZENvbnRleHQnKTtcbiAgICAgIH1cbiAgICAgIENvbnN0cnVjdG9yLmNoaWxkQ29udGV4dFR5cGVzID0gX2Fzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIENvbnN0cnVjdG9yLmNoaWxkQ29udGV4dFR5cGVzLFxuICAgICAgICBjaGlsZENvbnRleHRUeXBlc1xuICAgICAgKTtcbiAgICB9LFxuICAgIGNvbnRleHRUeXBlczogZnVuY3Rpb24oQ29uc3RydWN0b3IsIGNvbnRleHRUeXBlcykge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgdmFsaWRhdGVUeXBlRGVmKENvbnN0cnVjdG9yLCBjb250ZXh0VHlwZXMsICdjb250ZXh0Jyk7XG4gICAgICB9XG4gICAgICBDb25zdHJ1Y3Rvci5jb250ZXh0VHlwZXMgPSBfYXNzaWduKFxuICAgICAgICB7fSxcbiAgICAgICAgQ29uc3RydWN0b3IuY29udGV4dFR5cGVzLFxuICAgICAgICBjb250ZXh0VHlwZXNcbiAgICAgICk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBTcGVjaWFsIGNhc2UgZ2V0RGVmYXVsdFByb3BzIHdoaWNoIHNob3VsZCBtb3ZlIGludG8gc3RhdGljcyBidXQgcmVxdWlyZXNcbiAgICAgKiBhdXRvbWF0aWMgbWVyZ2luZy5cbiAgICAgKi9cbiAgICBnZXREZWZhdWx0UHJvcHM6IGZ1bmN0aW9uKENvbnN0cnVjdG9yLCBnZXREZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzID0gY3JlYXRlTWVyZ2VkUmVzdWx0RnVuY3Rpb24oXG4gICAgICAgICAgQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzLFxuICAgICAgICAgIGdldERlZmF1bHRQcm9wc1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzID0gZ2V0RGVmYXVsdFByb3BzO1xuICAgICAgfVxuICAgIH0sXG4gICAgcHJvcFR5cGVzOiBmdW5jdGlvbihDb25zdHJ1Y3RvciwgcHJvcFR5cGVzKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB2YWxpZGF0ZVR5cGVEZWYoQ29uc3RydWN0b3IsIHByb3BUeXBlcywgJ3Byb3AnKTtcbiAgICAgIH1cbiAgICAgIENvbnN0cnVjdG9yLnByb3BUeXBlcyA9IF9hc3NpZ24oe30sIENvbnN0cnVjdG9yLnByb3BUeXBlcywgcHJvcFR5cGVzKTtcbiAgICB9LFxuICAgIHN0YXRpY3M6IGZ1bmN0aW9uKENvbnN0cnVjdG9yLCBzdGF0aWNzKSB7XG4gICAgICBtaXhTdGF0aWNTcGVjSW50b0NvbXBvbmVudChDb25zdHJ1Y3Rvciwgc3RhdGljcyk7XG4gICAgfSxcbiAgICBhdXRvYmluZDogZnVuY3Rpb24oKSB7fVxuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlVHlwZURlZihDb25zdHJ1Y3RvciwgdHlwZURlZiwgbG9jYXRpb24pIHtcbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiB0eXBlRGVmKSB7XG4gICAgICBpZiAodHlwZURlZi5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgLy8gdXNlIGEgd2FybmluZyBpbnN0ZWFkIG9mIGFuIF9pbnZhcmlhbnQgc28gY29tcG9uZW50c1xuICAgICAgICAvLyBkb24ndCBzaG93IHVwIGluIHByb2QgYnV0IG9ubHkgaW4gX19ERVZfX1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIHdhcm5pbmcoXG4gICAgICAgICAgICB0eXBlb2YgdHlwZURlZltwcm9wTmFtZV0gPT09ICdmdW5jdGlvbicsXG4gICAgICAgICAgICAnJXM6ICVzIHR5cGUgYCVzYCBpcyBpbnZhbGlkOyBpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSAnICtcbiAgICAgICAgICAgICAgJ1JlYWN0LlByb3BUeXBlcy4nLFxuICAgICAgICAgICAgQ29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgJ1JlYWN0Q2xhc3MnLFxuICAgICAgICAgICAgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dLFxuICAgICAgICAgICAgcHJvcE5hbWVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdmFsaWRhdGVNZXRob2RPdmVycmlkZShpc0FscmVhZHlEZWZpbmVkLCBuYW1lKSB7XG4gICAgdmFyIHNwZWNQb2xpY3kgPSBSZWFjdENsYXNzSW50ZXJmYWNlLmhhc093blByb3BlcnR5KG5hbWUpXG4gICAgICA/IFJlYWN0Q2xhc3NJbnRlcmZhY2VbbmFtZV1cbiAgICAgIDogbnVsbDtcblxuICAgIC8vIERpc2FsbG93IG92ZXJyaWRpbmcgb2YgYmFzZSBjbGFzcyBtZXRob2RzIHVubGVzcyBleHBsaWNpdGx5IGFsbG93ZWQuXG4gICAgaWYgKFJlYWN0Q2xhc3NNaXhpbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgX2ludmFyaWFudChcbiAgICAgICAgc3BlY1BvbGljeSA9PT0gJ09WRVJSSURFX0JBU0UnLFxuICAgICAgICAnUmVhY3RDbGFzc0ludGVyZmFjZTogWW91IGFyZSBhdHRlbXB0aW5nIHRvIG92ZXJyaWRlICcgK1xuICAgICAgICAgICdgJXNgIGZyb20geW91ciBjbGFzcyBzcGVjaWZpY2F0aW9uLiBFbnN1cmUgdGhhdCB5b3VyIG1ldGhvZCBuYW1lcyAnICtcbiAgICAgICAgICAnZG8gbm90IG92ZXJsYXAgd2l0aCBSZWFjdCBtZXRob2RzLicsXG4gICAgICAgIG5hbWVcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRGlzYWxsb3cgZGVmaW5pbmcgbWV0aG9kcyBtb3JlIHRoYW4gb25jZSB1bmxlc3MgZXhwbGljaXRseSBhbGxvd2VkLlxuICAgIGlmIChpc0FscmVhZHlEZWZpbmVkKSB7XG4gICAgICBfaW52YXJpYW50KFxuICAgICAgICBzcGVjUG9saWN5ID09PSAnREVGSU5FX01BTlknIHx8IHNwZWNQb2xpY3kgPT09ICdERUZJTkVfTUFOWV9NRVJHRUQnLFxuICAgICAgICAnUmVhY3RDbGFzc0ludGVyZmFjZTogWW91IGFyZSBhdHRlbXB0aW5nIHRvIGRlZmluZSAnICtcbiAgICAgICAgICAnYCVzYCBvbiB5b3VyIGNvbXBvbmVudCBtb3JlIHRoYW4gb25jZS4gVGhpcyBjb25mbGljdCBtYXkgYmUgZHVlICcgK1xuICAgICAgICAgICd0byBhIG1peGluLicsXG4gICAgICAgIG5hbWVcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1peGluIGhlbHBlciB3aGljaCBoYW5kbGVzIHBvbGljeSB2YWxpZGF0aW9uIGFuZCByZXNlcnZlZFxuICAgKiBzcGVjaWZpY2F0aW9uIGtleXMgd2hlbiBidWlsZGluZyBSZWFjdCBjbGFzc2VzLlxuICAgKi9cbiAgZnVuY3Rpb24gbWl4U3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIHNwZWMpIHtcbiAgICBpZiAoIXNwZWMpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHZhciB0eXBlb2ZTcGVjID0gdHlwZW9mIHNwZWM7XG4gICAgICAgIHZhciBpc01peGluVmFsaWQgPSB0eXBlb2ZTcGVjID09PSAnb2JqZWN0JyAmJiBzcGVjICE9PSBudWxsO1xuXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgd2FybmluZyhcbiAgICAgICAgICAgIGlzTWl4aW5WYWxpZCxcbiAgICAgICAgICAgIFwiJXM6IFlvdSdyZSBhdHRlbXB0aW5nIHRvIGluY2x1ZGUgYSBtaXhpbiB0aGF0IGlzIGVpdGhlciBudWxsIFwiICtcbiAgICAgICAgICAgICAgJ29yIG5vdCBhbiBvYmplY3QuIENoZWNrIHRoZSBtaXhpbnMgaW5jbHVkZWQgYnkgdGhlIGNvbXBvbmVudCwgJyArXG4gICAgICAgICAgICAgICdhcyB3ZWxsIGFzIGFueSBtaXhpbnMgdGhleSBpbmNsdWRlIHRoZW1zZWx2ZXMuICcgK1xuICAgICAgICAgICAgICAnRXhwZWN0ZWQgb2JqZWN0IGJ1dCBnb3QgJXMuJyxcbiAgICAgICAgICAgIENvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8ICdSZWFjdENsYXNzJyxcbiAgICAgICAgICAgIHNwZWMgPT09IG51bGwgPyBudWxsIDogdHlwZW9mU3BlY1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF9pbnZhcmlhbnQoXG4gICAgICB0eXBlb2Ygc3BlYyAhPT0gJ2Z1bmN0aW9uJyxcbiAgICAgIFwiUmVhY3RDbGFzczogWW91J3JlIGF0dGVtcHRpbmcgdG8gXCIgK1xuICAgICAgICAndXNlIGEgY29tcG9uZW50IGNsYXNzIG9yIGZ1bmN0aW9uIGFzIGEgbWl4aW4uIEluc3RlYWQsIGp1c3QgdXNlIGEgJyArXG4gICAgICAgICdyZWd1bGFyIG9iamVjdC4nXG4gICAgKTtcbiAgICBfaW52YXJpYW50KFxuICAgICAgIWlzVmFsaWRFbGVtZW50KHNwZWMpLFxuICAgICAgXCJSZWFjdENsYXNzOiBZb3UncmUgYXR0ZW1wdGluZyB0byBcIiArXG4gICAgICAgICd1c2UgYSBjb21wb25lbnQgYXMgYSBtaXhpbi4gSW5zdGVhZCwganVzdCB1c2UgYSByZWd1bGFyIG9iamVjdC4nXG4gICAgKTtcblxuICAgIHZhciBwcm90byA9IENvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgICB2YXIgYXV0b0JpbmRQYWlycyA9IHByb3RvLl9fcmVhY3RBdXRvQmluZFBhaXJzO1xuXG4gICAgLy8gQnkgaGFuZGxpbmcgbWl4aW5zIGJlZm9yZSBhbnkgb3RoZXIgcHJvcGVydGllcywgd2UgZW5zdXJlIHRoZSBzYW1lXG4gICAgLy8gY2hhaW5pbmcgb3JkZXIgaXMgYXBwbGllZCB0byBtZXRob2RzIHdpdGggREVGSU5FX01BTlkgcG9saWN5LCB3aGV0aGVyXG4gICAgLy8gbWl4aW5zIGFyZSBsaXN0ZWQgYmVmb3JlIG9yIGFmdGVyIHRoZXNlIG1ldGhvZHMgaW4gdGhlIHNwZWMuXG4gICAgaWYgKHNwZWMuaGFzT3duUHJvcGVydHkoTUlYSU5TX0tFWSkpIHtcbiAgICAgIFJFU0VSVkVEX1NQRUNfS0VZUy5taXhpbnMoQ29uc3RydWN0b3IsIHNwZWMubWl4aW5zKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBuYW1lIGluIHNwZWMpIHtcbiAgICAgIGlmICghc3BlYy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5hbWUgPT09IE1JWElOU19LRVkpIHtcbiAgICAgICAgLy8gV2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWQgbWl4aW5zIGluIGEgc3BlY2lhbCBjYXNlIGFib3ZlLlxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHByb3BlcnR5ID0gc3BlY1tuYW1lXTtcbiAgICAgIHZhciBpc0FscmVhZHlEZWZpbmVkID0gcHJvdG8uaGFzT3duUHJvcGVydHkobmFtZSk7XG4gICAgICB2YWxpZGF0ZU1ldGhvZE92ZXJyaWRlKGlzQWxyZWFkeURlZmluZWQsIG5hbWUpO1xuXG4gICAgICBpZiAoUkVTRVJWRURfU1BFQ19LRVlTLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIFJFU0VSVkVEX1NQRUNfS0VZU1tuYW1lXShDb25zdHJ1Y3RvciwgcHJvcGVydHkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU2V0dXAgbWV0aG9kcyBvbiBwcm90b3R5cGU6XG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgbWVtYmVyIG1ldGhvZHMgc2hvdWxkIG5vdCBiZSBhdXRvbWF0aWNhbGx5IGJvdW5kOlxuICAgICAgICAvLyAxLiBFeHBlY3RlZCBSZWFjdENsYXNzIG1ldGhvZHMgKGluIHRoZSBcImludGVyZmFjZVwiKS5cbiAgICAgICAgLy8gMi4gT3ZlcnJpZGRlbiBtZXRob2RzICh0aGF0IHdlcmUgbWl4ZWQgaW4pLlxuICAgICAgICB2YXIgaXNSZWFjdENsYXNzTWV0aG9kID0gUmVhY3RDbGFzc0ludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKTtcbiAgICAgICAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2YgcHJvcGVydHkgPT09ICdmdW5jdGlvbic7XG4gICAgICAgIHZhciBzaG91bGRBdXRvQmluZCA9XG4gICAgICAgICAgaXNGdW5jdGlvbiAmJlxuICAgICAgICAgICFpc1JlYWN0Q2xhc3NNZXRob2QgJiZcbiAgICAgICAgICAhaXNBbHJlYWR5RGVmaW5lZCAmJlxuICAgICAgICAgIHNwZWMuYXV0b2JpbmQgIT09IGZhbHNlO1xuXG4gICAgICAgIGlmIChzaG91bGRBdXRvQmluZCkge1xuICAgICAgICAgIGF1dG9CaW5kUGFpcnMucHVzaChuYW1lLCBwcm9wZXJ0eSk7XG4gICAgICAgICAgcHJvdG9bbmFtZV0gPSBwcm9wZXJ0eTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaXNBbHJlYWR5RGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIHNwZWNQb2xpY3kgPSBSZWFjdENsYXNzSW50ZXJmYWNlW25hbWVdO1xuXG4gICAgICAgICAgICAvLyBUaGVzZSBjYXNlcyBzaG91bGQgYWxyZWFkeSBiZSBjYXVnaHQgYnkgdmFsaWRhdGVNZXRob2RPdmVycmlkZS5cbiAgICAgICAgICAgIF9pbnZhcmlhbnQoXG4gICAgICAgICAgICAgIGlzUmVhY3RDbGFzc01ldGhvZCAmJlxuICAgICAgICAgICAgICAgIChzcGVjUG9saWN5ID09PSAnREVGSU5FX01BTllfTUVSR0VEJyB8fFxuICAgICAgICAgICAgICAgICAgc3BlY1BvbGljeSA9PT0gJ0RFRklORV9NQU5ZJyksXG4gICAgICAgICAgICAgICdSZWFjdENsYXNzOiBVbmV4cGVjdGVkIHNwZWMgcG9saWN5ICVzIGZvciBrZXkgJXMgJyArXG4gICAgICAgICAgICAgICAgJ3doZW4gbWl4aW5nIGluIGNvbXBvbmVudCBzcGVjcy4nLFxuICAgICAgICAgICAgICBzcGVjUG9saWN5LFxuICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBGb3IgbWV0aG9kcyB3aGljaCBhcmUgZGVmaW5lZCBtb3JlIHRoYW4gb25jZSwgY2FsbCB0aGUgZXhpc3RpbmdcbiAgICAgICAgICAgIC8vIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgdGhlIG5ldyBwcm9wZXJ0eSwgbWVyZ2luZyBpZiBhcHByb3ByaWF0ZS5cbiAgICAgICAgICAgIGlmIChzcGVjUG9saWN5ID09PSAnREVGSU5FX01BTllfTUVSR0VEJykge1xuICAgICAgICAgICAgICBwcm90b1tuYW1lXSA9IGNyZWF0ZU1lcmdlZFJlc3VsdEZ1bmN0aW9uKHByb3RvW25hbWVdLCBwcm9wZXJ0eSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNwZWNQb2xpY3kgPT09ICdERUZJTkVfTUFOWScpIHtcbiAgICAgICAgICAgICAgcHJvdG9bbmFtZV0gPSBjcmVhdGVDaGFpbmVkRnVuY3Rpb24ocHJvdG9bbmFtZV0sIHByb3BlcnR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJvdG9bbmFtZV0gPSBwcm9wZXJ0eTtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgIC8vIEFkZCB2ZXJib3NlIGRpc3BsYXlOYW1lIHRvIHRoZSBmdW5jdGlvbiwgd2hpY2ggaGVscHMgd2hlbiBsb29raW5nXG4gICAgICAgICAgICAgIC8vIGF0IHByb2ZpbGluZyB0b29scy5cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJyAmJiBzcGVjLmRpc3BsYXlOYW1lKSB7XG4gICAgICAgICAgICAgICAgcHJvdG9bbmFtZV0uZGlzcGxheU5hbWUgPSBzcGVjLmRpc3BsYXlOYW1lICsgJ18nICsgbmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1peFN0YXRpY1NwZWNJbnRvQ29tcG9uZW50KENvbnN0cnVjdG9yLCBzdGF0aWNzKSB7XG4gICAgaWYgKCFzdGF0aWNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAodmFyIG5hbWUgaW4gc3RhdGljcykge1xuICAgICAgdmFyIHByb3BlcnR5ID0gc3RhdGljc1tuYW1lXTtcbiAgICAgIGlmICghc3RhdGljcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGlzUmVzZXJ2ZWQgPSBuYW1lIGluIFJFU0VSVkVEX1NQRUNfS0VZUztcbiAgICAgIF9pbnZhcmlhbnQoXG4gICAgICAgICFpc1Jlc2VydmVkLFxuICAgICAgICAnUmVhY3RDbGFzczogWW91IGFyZSBhdHRlbXB0aW5nIHRvIGRlZmluZSBhIHJlc2VydmVkICcgK1xuICAgICAgICAgICdwcm9wZXJ0eSwgYCVzYCwgdGhhdCBzaG91bGRuXFwndCBiZSBvbiB0aGUgXCJzdGF0aWNzXCIga2V5LiBEZWZpbmUgaXQgJyArXG4gICAgICAgICAgJ2FzIGFuIGluc3RhbmNlIHByb3BlcnR5IGluc3RlYWQ7IGl0IHdpbGwgc3RpbGwgYmUgYWNjZXNzaWJsZSBvbiB0aGUgJyArXG4gICAgICAgICAgJ2NvbnN0cnVjdG9yLicsXG4gICAgICAgIG5hbWVcbiAgICAgICk7XG5cbiAgICAgIHZhciBpc0luaGVyaXRlZCA9IG5hbWUgaW4gQ29uc3RydWN0b3I7XG4gICAgICBfaW52YXJpYW50KFxuICAgICAgICAhaXNJbmhlcml0ZWQsXG4gICAgICAgICdSZWFjdENsYXNzOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gZGVmaW5lICcgK1xuICAgICAgICAgICdgJXNgIG9uIHlvdXIgY29tcG9uZW50IG1vcmUgdGhhbiBvbmNlLiBUaGlzIGNvbmZsaWN0IG1heSBiZSAnICtcbiAgICAgICAgICAnZHVlIHRvIGEgbWl4aW4uJyxcbiAgICAgICAgbmFtZVxuICAgICAgKTtcbiAgICAgIENvbnN0cnVjdG9yW25hbWVdID0gcHJvcGVydHk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIHR3byBvYmplY3RzLCBidXQgdGhyb3cgaWYgYm90aCBjb250YWluIHRoZSBzYW1lIGtleS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9uZSBUaGUgZmlyc3Qgb2JqZWN0LCB3aGljaCBpcyBtdXRhdGVkLlxuICAgKiBAcGFyYW0ge29iamVjdH0gdHdvIFRoZSBzZWNvbmQgb2JqZWN0XG4gICAqIEByZXR1cm4ge29iamVjdH0gb25lIGFmdGVyIGl0IGhhcyBiZWVuIG11dGF0ZWQgdG8gY29udGFpbiBldmVyeXRoaW5nIGluIHR3by5cbiAgICovXG4gIGZ1bmN0aW9uIG1lcmdlSW50b1dpdGhOb0R1cGxpY2F0ZUtleXMob25lLCB0d28pIHtcbiAgICBfaW52YXJpYW50KFxuICAgICAgb25lICYmIHR3byAmJiB0eXBlb2Ygb25lID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdHdvID09PSAnb2JqZWN0JyxcbiAgICAgICdtZXJnZUludG9XaXRoTm9EdXBsaWNhdGVLZXlzKCk6IENhbm5vdCBtZXJnZSBub24tb2JqZWN0cy4nXG4gICAgKTtcblxuICAgIGZvciAodmFyIGtleSBpbiB0d28pIHtcbiAgICAgIGlmICh0d28uaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBfaW52YXJpYW50KFxuICAgICAgICAgIG9uZVtrZXldID09PSB1bmRlZmluZWQsXG4gICAgICAgICAgJ21lcmdlSW50b1dpdGhOb0R1cGxpY2F0ZUtleXMoKTogJyArXG4gICAgICAgICAgICAnVHJpZWQgdG8gbWVyZ2UgdHdvIG9iamVjdHMgd2l0aCB0aGUgc2FtZSBrZXk6IGAlc2AuIFRoaXMgY29uZmxpY3QgJyArXG4gICAgICAgICAgICAnbWF5IGJlIGR1ZSB0byBhIG1peGluOyBpbiBwYXJ0aWN1bGFyLCB0aGlzIG1heSBiZSBjYXVzZWQgYnkgdHdvICcgK1xuICAgICAgICAgICAgJ2dldEluaXRpYWxTdGF0ZSgpIG9yIGdldERlZmF1bHRQcm9wcygpIG1ldGhvZHMgcmV0dXJuaW5nIG9iamVjdHMgJyArXG4gICAgICAgICAgICAnd2l0aCBjbGFzaGluZyBrZXlzLicsXG4gICAgICAgICAga2V5XG4gICAgICAgICk7XG4gICAgICAgIG9uZVtrZXldID0gdHdvW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvbmU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0d28gZnVuY3Rpb25zIGFuZCBtZXJnZXMgdGhlaXIgcmV0dXJuIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gb25lIEZ1bmN0aW9uIHRvIGludm9rZSBmaXJzdC5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gdHdvIEZ1bmN0aW9uIHRvIGludm9rZSBzZWNvbmQuXG4gICAqIEByZXR1cm4ge2Z1bmN0aW9ufSBGdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIHR3byBhcmd1bWVudCBmdW5jdGlvbnMuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVNZXJnZWRSZXN1bHRGdW5jdGlvbihvbmUsIHR3bykge1xuICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZWRSZXN1bHQoKSB7XG4gICAgICB2YXIgYSA9IG9uZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgdmFyIGIgPSB0d28uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIGlmIChhID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGI7XG4gICAgICB9IGVsc2UgaWYgKGIgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gYTtcbiAgICAgIH1cbiAgICAgIHZhciBjID0ge307XG4gICAgICBtZXJnZUludG9XaXRoTm9EdXBsaWNhdGVLZXlzKGMsIGEpO1xuICAgICAgbWVyZ2VJbnRvV2l0aE5vRHVwbGljYXRlS2V5cyhjLCBiKTtcbiAgICAgIHJldHVybiBjO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0d28gZnVuY3Rpb25zIGFuZCBpZ25vcmVzIHRoZWlyIHJldHVybiB2YWxlcy5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gb25lIEZ1bmN0aW9uIHRvIGludm9rZSBmaXJzdC5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gdHdvIEZ1bmN0aW9uIHRvIGludm9rZSBzZWNvbmQuXG4gICAqIEByZXR1cm4ge2Z1bmN0aW9ufSBGdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIHR3byBhcmd1bWVudCBmdW5jdGlvbnMuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVDaGFpbmVkRnVuY3Rpb24ob25lLCB0d28pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gY2hhaW5lZEZ1bmN0aW9uKCkge1xuICAgICAgb25lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB0d28uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIGEgbWV0aG9kIHRvIHRoZSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb21wb25lbnQgQ29tcG9uZW50IHdob3NlIG1ldGhvZCBpcyBnb2luZyB0byBiZSBib3VuZC5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gbWV0aG9kIE1ldGhvZCB0byBiZSBib3VuZC5cbiAgICogQHJldHVybiB7ZnVuY3Rpb259IFRoZSBib3VuZCBtZXRob2QuXG4gICAqL1xuICBmdW5jdGlvbiBiaW5kQXV0b0JpbmRNZXRob2QoY29tcG9uZW50LCBtZXRob2QpIHtcbiAgICB2YXIgYm91bmRNZXRob2QgPSBtZXRob2QuYmluZChjb21wb25lbnQpO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBib3VuZE1ldGhvZC5fX3JlYWN0Qm91bmRDb250ZXh0ID0gY29tcG9uZW50O1xuICAgICAgYm91bmRNZXRob2QuX19yZWFjdEJvdW5kTWV0aG9kID0gbWV0aG9kO1xuICAgICAgYm91bmRNZXRob2QuX19yZWFjdEJvdW5kQXJndW1lbnRzID0gbnVsbDtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gY29tcG9uZW50LmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lO1xuICAgICAgdmFyIF9iaW5kID0gYm91bmRNZXRob2QuYmluZDtcbiAgICAgIGJvdW5kTWV0aG9kLmJpbmQgPSBmdW5jdGlvbihuZXdUaGlzKSB7XG4gICAgICAgIGZvciAoXG4gICAgICAgICAgdmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICAgICAgYXJncyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSxcbiAgICAgICAgICAgIF9rZXkgPSAxO1xuICAgICAgICAgIF9rZXkgPCBfbGVuO1xuICAgICAgICAgIF9rZXkrK1xuICAgICAgICApIHtcbiAgICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZXIgaXMgdHJ5aW5nIHRvIGJpbmQoKSBhbiBhdXRvYm91bmQgbWV0aG9kOyB3ZSBlZmZlY3RpdmVseSB3aWxsXG4gICAgICAgIC8vIGlnbm9yZSB0aGUgdmFsdWUgb2YgXCJ0aGlzXCIgdGhhdCB0aGUgdXNlciBpcyB0cnlpbmcgdG8gdXNlLCBzb1xuICAgICAgICAvLyBsZXQncyB3YXJuLlxuICAgICAgICBpZiAobmV3VGhpcyAhPT0gY29tcG9uZW50ICYmIG5ld1RoaXMgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgd2FybmluZyhcbiAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICdiaW5kKCk6IFJlYWN0IGNvbXBvbmVudCBtZXRob2RzIG1heSBvbmx5IGJlIGJvdW5kIHRvIHRoZSAnICtcbiAgICAgICAgICAgICAgICAnY29tcG9uZW50IGluc3RhbmNlLiBTZWUgJXMnLFxuICAgICAgICAgICAgICBjb21wb25lbnROYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgd2FybmluZyhcbiAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICdiaW5kKCk6IFlvdSBhcmUgYmluZGluZyBhIGNvbXBvbmVudCBtZXRob2QgdG8gdGhlIGNvbXBvbmVudC4gJyArXG4gICAgICAgICAgICAgICAgJ1JlYWN0IGRvZXMgdGhpcyBmb3IgeW91IGF1dG9tYXRpY2FsbHkgaW4gYSBoaWdoLXBlcmZvcm1hbmNlICcgK1xuICAgICAgICAgICAgICAgICd3YXksIHNvIHlvdSBjYW4gc2FmZWx5IHJlbW92ZSB0aGlzIGNhbGwuIFNlZSAlcycsXG4gICAgICAgICAgICAgIGNvbXBvbmVudE5hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBib3VuZE1ldGhvZDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVib3VuZE1ldGhvZCA9IF9iaW5kLmFwcGx5KGJvdW5kTWV0aG9kLCBhcmd1bWVudHMpO1xuICAgICAgICByZWJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZENvbnRleHQgPSBjb21wb25lbnQ7XG4gICAgICAgIHJlYm91bmRNZXRob2QuX19yZWFjdEJvdW5kTWV0aG9kID0gbWV0aG9kO1xuICAgICAgICByZWJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZEFyZ3VtZW50cyA9IGFyZ3M7XG4gICAgICAgIHJldHVybiByZWJvdW5kTWV0aG9kO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGJvdW5kTWV0aG9kO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIGFsbCBhdXRvLWJvdW5kIG1ldGhvZHMgaW4gYSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb21wb25lbnQgQ29tcG9uZW50IHdob3NlIG1ldGhvZCBpcyBnb2luZyB0byBiZSBib3VuZC5cbiAgICovXG4gIGZ1bmN0aW9uIGJpbmRBdXRvQmluZE1ldGhvZHMoY29tcG9uZW50KSB7XG4gICAgdmFyIHBhaXJzID0gY29tcG9uZW50Ll9fcmVhY3RBdXRvQmluZFBhaXJzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFpcnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIHZhciBhdXRvQmluZEtleSA9IHBhaXJzW2ldO1xuICAgICAgdmFyIG1ldGhvZCA9IHBhaXJzW2kgKyAxXTtcbiAgICAgIGNvbXBvbmVudFthdXRvQmluZEtleV0gPSBiaW5kQXV0b0JpbmRNZXRob2QoY29tcG9uZW50LCBtZXRob2QpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBJc01vdW50ZWRQcmVNaXhpbiA9IHtcbiAgICBjb21wb25lbnREaWRNb3VudDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLl9faXNNb3VudGVkID0gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIElzTW91bnRlZFBvc3RNaXhpbiA9IHtcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLl9faXNNb3VudGVkID0gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBBZGQgbW9yZSB0byB0aGUgUmVhY3RDbGFzcyBiYXNlIGNsYXNzLiBUaGVzZSBhcmUgYWxsIGxlZ2FjeSBmZWF0dXJlcyBhbmRcbiAgICogdGhlcmVmb3JlIG5vdCBhbHJlYWR5IHBhcnQgb2YgdGhlIG1vZGVybiBSZWFjdENvbXBvbmVudC5cbiAgICovXG4gIHZhciBSZWFjdENsYXNzTWl4aW4gPSB7XG4gICAgLyoqXG4gICAgICogVE9ETzogVGhpcyB3aWxsIGJlIGRlcHJlY2F0ZWQgYmVjYXVzZSBzdGF0ZSBzaG91bGQgYWx3YXlzIGtlZXAgYSBjb25zaXN0ZW50XG4gICAgICogdHlwZSBzaWduYXR1cmUgYW5kIHRoZSBvbmx5IHVzZSBjYXNlIGZvciB0aGlzLCBpcyB0byBhdm9pZCB0aGF0LlxuICAgICAqL1xuICAgIHJlcGxhY2VTdGF0ZTogZnVuY3Rpb24obmV3U3RhdGUsIGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZSh0aGlzLCBuZXdTdGF0ZSwgY2FsbGJhY2spO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhpcyBjb21wb3NpdGUgY29tcG9uZW50IGlzIG1vdW50ZWQuXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb3VudGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqIEBmaW5hbFxuICAgICAqL1xuICAgIGlzTW91bnRlZDogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB3YXJuaW5nKFxuICAgICAgICAgIHRoaXMuX19kaWRXYXJuSXNNb3VudGVkLFxuICAgICAgICAgICclczogaXNNb3VudGVkIGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIG1ha2Ugc3VyZSB0byBjbGVhbiB1cCAnICtcbiAgICAgICAgICAgICdzdWJzY3JpcHRpb25zIGFuZCBwZW5kaW5nIHJlcXVlc3RzIGluIGNvbXBvbmVudFdpbGxVbm1vdW50IHRvICcgK1xuICAgICAgICAgICAgJ3ByZXZlbnQgbWVtb3J5IGxlYWtzLicsXG4gICAgICAgICAgKHRoaXMuY29uc3RydWN0b3IgJiYgdGhpcy5jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSkgfHxcbiAgICAgICAgICAgIHRoaXMubmFtZSB8fFxuICAgICAgICAgICAgJ0NvbXBvbmVudCdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fX2RpZFdhcm5Jc01vdW50ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuICEhdGhpcy5fX2lzTW91bnRlZDtcbiAgICB9XG4gIH07XG5cbiAgdmFyIFJlYWN0Q2xhc3NDb21wb25lbnQgPSBmdW5jdGlvbigpIHt9O1xuICBfYXNzaWduKFxuICAgIFJlYWN0Q2xhc3NDb21wb25lbnQucHJvdG90eXBlLFxuICAgIFJlYWN0Q29tcG9uZW50LnByb3RvdHlwZSxcbiAgICBSZWFjdENsYXNzTWl4aW5cbiAgKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNvbXBvc2l0ZSBjb21wb25lbnQgY2xhc3MgZ2l2ZW4gYSBjbGFzcyBzcGVjaWZpY2F0aW9uLlxuICAgKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3QuY3JlYXRlY2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHNwZWMgQ2xhc3Mgc3BlY2lmaWNhdGlvbiAod2hpY2ggbXVzdCBkZWZpbmUgYHJlbmRlcmApLlxuICAgKiBAcmV0dXJuIHtmdW5jdGlvbn0gQ29tcG9uZW50IGNvbnN0cnVjdG9yIGZ1bmN0aW9uLlxuICAgKiBAcHVibGljXG4gICAqL1xuICBmdW5jdGlvbiBjcmVhdGVDbGFzcyhzcGVjKSB7XG4gICAgLy8gVG8ga2VlcCBvdXIgd2FybmluZ3MgbW9yZSB1bmRlcnN0YW5kYWJsZSwgd2UnbGwgdXNlIGEgbGl0dGxlIGhhY2sgaGVyZSB0b1xuICAgIC8vIGVuc3VyZSB0aGF0IENvbnN0cnVjdG9yLm5hbWUgIT09ICdDb25zdHJ1Y3RvcicuIFRoaXMgbWFrZXMgc3VyZSB3ZSBkb24ndFxuICAgIC8vIHVubmVjZXNzYXJpbHkgaWRlbnRpZnkgYSBjbGFzcyB3aXRob3V0IGRpc3BsYXlOYW1lIGFzICdDb25zdHJ1Y3RvcicuXG4gICAgdmFyIENvbnN0cnVjdG9yID0gaWRlbnRpdHkoZnVuY3Rpb24ocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHtcbiAgICAgIC8vIFRoaXMgY29uc3RydWN0b3IgZ2V0cyBvdmVycmlkZGVuIGJ5IG1vY2tzLiBUaGUgYXJndW1lbnQgaXMgdXNlZFxuICAgICAgLy8gYnkgbW9ja3MgdG8gYXNzZXJ0IG9uIHdoYXQgZ2V0cyBtb3VudGVkLlxuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB3YXJuaW5nKFxuICAgICAgICAgIHRoaXMgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcixcbiAgICAgICAgICAnU29tZXRoaW5nIGlzIGNhbGxpbmcgYSBSZWFjdCBjb21wb25lbnQgZGlyZWN0bHkuIFVzZSBhIGZhY3Rvcnkgb3IgJyArXG4gICAgICAgICAgICAnSlNYIGluc3RlYWQuIFNlZTogaHR0cHM6Ly9mYi5tZS9yZWFjdC1sZWdhY3lmYWN0b3J5J1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBXaXJlIHVwIGF1dG8tYmluZGluZ1xuICAgICAgaWYgKHRoaXMuX19yZWFjdEF1dG9CaW5kUGFpcnMubGVuZ3RoKSB7XG4gICAgICAgIGJpbmRBdXRvQmluZE1ldGhvZHModGhpcyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICB0aGlzLnJlZnMgPSBlbXB0eU9iamVjdDtcbiAgICAgIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG5cbiAgICAgIHRoaXMuc3RhdGUgPSBudWxsO1xuXG4gICAgICAvLyBSZWFjdENsYXNzZXMgZG9lc24ndCBoYXZlIGNvbnN0cnVjdG9ycy4gSW5zdGVhZCwgdGhleSB1c2UgdGhlXG4gICAgICAvLyBnZXRJbml0aWFsU3RhdGUgYW5kIGNvbXBvbmVudFdpbGxNb3VudCBtZXRob2RzIGZvciBpbml0aWFsaXphdGlvbi5cblxuICAgICAgdmFyIGluaXRpYWxTdGF0ZSA9IHRoaXMuZ2V0SW5pdGlhbFN0YXRlID8gdGhpcy5nZXRJbml0aWFsU3RhdGUoKSA6IG51bGw7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAvLyBXZSBhbGxvdyBhdXRvLW1vY2tzIHRvIHByb2NlZWQgYXMgaWYgdGhleSdyZSByZXR1cm5pbmcgbnVsbC5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGluaXRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgdGhpcy5nZXRJbml0aWFsU3RhdGUuX2lzTW9ja0Z1bmN0aW9uXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgYmFkIHByYWN0aWNlLiBDb25zaWRlciB3YXJuaW5nIGhlcmUgYW5kXG4gICAgICAgICAgLy8gZGVwcmVjYXRpbmcgdGhpcyBjb252ZW5pZW5jZS5cbiAgICAgICAgICBpbml0aWFsU3RhdGUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfaW52YXJpYW50KFxuICAgICAgICB0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShpbml0aWFsU3RhdGUpLFxuICAgICAgICAnJXMuZ2V0SW5pdGlhbFN0YXRlKCk6IG11c3QgcmV0dXJuIGFuIG9iamVjdCBvciBudWxsJyxcbiAgICAgICAgQ29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50J1xuICAgICAgKTtcblxuICAgICAgdGhpcy5zdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgICB9KTtcbiAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBuZXcgUmVhY3RDbGFzc0NvbXBvbmVudCgpO1xuICAgIENvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbnN0cnVjdG9yO1xuICAgIENvbnN0cnVjdG9yLnByb3RvdHlwZS5fX3JlYWN0QXV0b0JpbmRQYWlycyA9IFtdO1xuXG4gICAgaW5qZWN0ZWRNaXhpbnMuZm9yRWFjaChtaXhTcGVjSW50b0NvbXBvbmVudC5iaW5kKG51bGwsIENvbnN0cnVjdG9yKSk7XG5cbiAgICBtaXhTcGVjSW50b0NvbXBvbmVudChDb25zdHJ1Y3RvciwgSXNNb3VudGVkUHJlTWl4aW4pO1xuICAgIG1peFNwZWNJbnRvQ29tcG9uZW50KENvbnN0cnVjdG9yLCBzcGVjKTtcbiAgICBtaXhTcGVjSW50b0NvbXBvbmVudChDb25zdHJ1Y3RvciwgSXNNb3VudGVkUG9zdE1peGluKTtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIGRlZmF1bHRQcm9wcyBwcm9wZXJ0eSBhZnRlciBhbGwgbWl4aW5zIGhhdmUgYmVlbiBtZXJnZWQuXG4gICAgaWYgKENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcykge1xuICAgICAgQ29uc3RydWN0b3IuZGVmYXVsdFByb3BzID0gQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzKCk7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIC8vIFRoaXMgaXMgYSB0YWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdXNlIG9mIHRoZXNlIG1ldGhvZCBuYW1lcyBpcyBvayxcbiAgICAgIC8vIHNpbmNlIGl0J3MgdXNlZCB3aXRoIGNyZWF0ZUNsYXNzLiBJZiBpdCdzIG5vdCwgdGhlbiBpdCdzIGxpa2VseSBhXG4gICAgICAvLyBtaXN0YWtlIHNvIHdlJ2xsIHdhcm4geW91IHRvIHVzZSB0aGUgc3RhdGljIHByb3BlcnR5LCBwcm9wZXJ0eVxuICAgICAgLy8gaW5pdGlhbGl6ZXIgb3IgY29uc3RydWN0b3IgcmVzcGVjdGl2ZWx5LlxuICAgICAgaWYgKENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcykge1xuICAgICAgICBDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQgPSB7fTtcbiAgICAgIH1cbiAgICAgIGlmIChDb25zdHJ1Y3Rvci5wcm90b3R5cGUuZ2V0SW5pdGlhbFN0YXRlKSB7XG4gICAgICAgIENvbnN0cnVjdG9yLnByb3RvdHlwZS5nZXRJbml0aWFsU3RhdGUuaXNSZWFjdENsYXNzQXBwcm92ZWQgPSB7fTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfaW52YXJpYW50KFxuICAgICAgQ29uc3RydWN0b3IucHJvdG90eXBlLnJlbmRlcixcbiAgICAgICdjcmVhdGVDbGFzcyguLi4pOiBDbGFzcyBzcGVjaWZpY2F0aW9uIG11c3QgaW1wbGVtZW50IGEgYHJlbmRlcmAgbWV0aG9kLidcbiAgICApO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHdhcm5pbmcoXG4gICAgICAgICFDb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29tcG9uZW50U2hvdWxkVXBkYXRlLFxuICAgICAgICAnJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICtcbiAgICAgICAgICAnY29tcG9uZW50U2hvdWxkVXBkYXRlKCkuIERpZCB5b3UgbWVhbiBzaG91bGRDb21wb25lbnRVcGRhdGUoKT8gJyArXG4gICAgICAgICAgJ1RoZSBuYW1lIGlzIHBocmFzZWQgYXMgYSBxdWVzdGlvbiBiZWNhdXNlIHRoZSBmdW5jdGlvbiBpcyAnICtcbiAgICAgICAgICAnZXhwZWN0ZWQgdG8gcmV0dXJuIGEgdmFsdWUuJyxcbiAgICAgICAgc3BlYy5kaXNwbGF5TmFtZSB8fCAnQSBjb21wb25lbnQnXG4gICAgICApO1xuICAgICAgd2FybmluZyhcbiAgICAgICAgIUNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzLFxuICAgICAgICAnJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICtcbiAgICAgICAgICAnY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsXG4gICAgICAgIHNwZWMuZGlzcGxheU5hbWUgfHwgJ0EgY29tcG9uZW50J1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBSZWR1Y2UgdGltZSBzcGVudCBkb2luZyBsb29rdXBzIGJ5IHNldHRpbmcgdGhlc2Ugb24gdGhlIHByb3RvdHlwZS5cbiAgICBmb3IgKHZhciBtZXRob2ROYW1lIGluIFJlYWN0Q2xhc3NJbnRlcmZhY2UpIHtcbiAgICAgIGlmICghQ29uc3RydWN0b3IucHJvdG90eXBlW21ldGhvZE5hbWVdKSB7XG4gICAgICAgIENvbnN0cnVjdG9yLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUNsYXNzO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZhY3Rvcnk7XG4iLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCcuL1JlYWN0QmFzZUNsYXNzZXMnKSxcbiAgICBDb21wb25lbnQgPSBfcmVxdWlyZS5Db21wb25lbnQ7XG5cbnZhciBfcmVxdWlyZTIgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudCcpLFxuICAgIGlzVmFsaWRFbGVtZW50ID0gX3JlcXVpcmUyLmlzVmFsaWRFbGVtZW50O1xuXG52YXIgUmVhY3ROb29wVXBkYXRlUXVldWUgPSByZXF1aXJlKCcuL1JlYWN0Tm9vcFVwZGF0ZVF1ZXVlJyk7XG52YXIgZmFjdG9yeSA9IHJlcXVpcmUoJ2NyZWF0ZS1yZWFjdC1jbGFzcy9mYWN0b3J5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShDb21wb25lbnQsIGlzVmFsaWRFbGVtZW50LCBSZWFjdE5vb3BVcGRhdGVRdWV1ZSk7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBSZWFjdEVsZW1lbnQgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgaW4gYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuIGFuZCB2ZXJpZmllcyB0aGF0IHRoZXJlXG4gKiBpcyBvbmx5IG9uZSBjaGlsZCBpbiB0aGUgY29sbGVjdGlvbi5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3QuY2hpbGRyZW4ub25seVxuICpcbiAqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGEgc2luZ2xlIGNoaWxkIGdldHNcbiAqIHBhc3NlZCB3aXRob3V0IGEgd3JhcHBlciwgYnV0IHRoZSBwdXJwb3NlIG9mIHRoaXMgaGVscGVyIGZ1bmN0aW9uIGlzIHRvXG4gKiBhYnN0cmFjdCBhd2F5IHRoZSBwYXJ0aWN1bGFyIHN0cnVjdHVyZSBvZiBjaGlsZHJlbi5cbiAqXG4gKiBAcGFyYW0gez9vYmplY3R9IGNoaWxkcmVuIENoaWxkIGNvbGxlY3Rpb24gc3RydWN0dXJlLlxuICogQHJldHVybiB7UmVhY3RFbGVtZW50fSBUaGUgZmlyc3QgYW5kIG9ubHkgYFJlYWN0RWxlbWVudGAgY29udGFpbmVkIGluIHRoZVxuICogc3RydWN0dXJlLlxuICovXG5mdW5jdGlvbiBvbmx5Q2hpbGQoY2hpbGRyZW4pIHtcbiAgIVJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudChjaGlsZHJlbikgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3QuQ2hpbGRyZW4ub25seSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuJykgOiBfcHJvZEludmFyaWFudCgnMTQzJykgOiB2b2lkIDA7XG4gIHJldHVybiBjaGlsZHJlbjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvbmx5Q2hpbGQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdEJhc2VDbGFzc2VzID0gcmVxdWlyZSgnLi9SZWFjdEJhc2VDbGFzc2VzJyk7XG52YXIgUmVhY3RDaGlsZHJlbiA9IHJlcXVpcmUoJy4vUmVhY3RDaGlsZHJlbicpO1xudmFyIFJlYWN0RE9NRmFjdG9yaWVzID0gcmVxdWlyZSgnLi9SZWFjdERPTUZhY3RvcmllcycpO1xudmFyIFJlYWN0RWxlbWVudCA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50Jyk7XG52YXIgUmVhY3RQcm9wVHlwZXMgPSByZXF1aXJlKCcuL1JlYWN0UHJvcFR5cGVzJyk7XG52YXIgUmVhY3RWZXJzaW9uID0gcmVxdWlyZSgnLi9SZWFjdFZlcnNpb24nKTtcblxudmFyIGNyZWF0ZVJlYWN0Q2xhc3MgPSByZXF1aXJlKCcuL2NyZWF0ZUNsYXNzJyk7XG52YXIgb25seUNoaWxkID0gcmVxdWlyZSgnLi9vbmx5Q2hpbGQnKTtcblxudmFyIGNyZWF0ZUVsZW1lbnQgPSBSZWFjdEVsZW1lbnQuY3JlYXRlRWxlbWVudDtcbnZhciBjcmVhdGVGYWN0b3J5ID0gUmVhY3RFbGVtZW50LmNyZWF0ZUZhY3Rvcnk7XG52YXIgY2xvbmVFbGVtZW50ID0gUmVhY3RFbGVtZW50LmNsb25lRWxlbWVudDtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIGxvd1ByaW9yaXR5V2FybmluZyA9IHJlcXVpcmUoJy4vbG93UHJpb3JpdHlXYXJuaW5nJyk7XG4gIHZhciBjYW5EZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vY2FuRGVmaW5lUHJvcGVydHknKTtcbiAgdmFyIFJlYWN0RWxlbWVudFZhbGlkYXRvciA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50VmFsaWRhdG9yJyk7XG4gIHZhciBkaWRXYXJuUHJvcFR5cGVzRGVwcmVjYXRlZCA9IGZhbHNlO1xuICBjcmVhdGVFbGVtZW50ID0gUmVhY3RFbGVtZW50VmFsaWRhdG9yLmNyZWF0ZUVsZW1lbnQ7XG4gIGNyZWF0ZUZhY3RvcnkgPSBSZWFjdEVsZW1lbnRWYWxpZGF0b3IuY3JlYXRlRmFjdG9yeTtcbiAgY2xvbmVFbGVtZW50ID0gUmVhY3RFbGVtZW50VmFsaWRhdG9yLmNsb25lRWxlbWVudDtcbn1cblxudmFyIF9fc3ByZWFkID0gX2Fzc2lnbjtcbnZhciBjcmVhdGVNaXhpbiA9IGZ1bmN0aW9uIChtaXhpbikge1xuICByZXR1cm4gbWl4aW47XG59O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgd2FybmVkRm9yU3ByZWFkID0gZmFsc2U7XG4gIHZhciB3YXJuZWRGb3JDcmVhdGVNaXhpbiA9IGZhbHNlO1xuICBfX3NwcmVhZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBsb3dQcmlvcml0eVdhcm5pbmcod2FybmVkRm9yU3ByZWFkLCAnUmVhY3QuX19zcHJlYWQgaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLiBVc2UgJyArICdPYmplY3QuYXNzaWduIGRpcmVjdGx5IG9yIGFub3RoZXIgaGVscGVyIGZ1bmN0aW9uIHdpdGggc2ltaWxhciAnICsgJ3NlbWFudGljcy4gWW91IG1heSBiZSBzZWVpbmcgdGhpcyB3YXJuaW5nIGR1ZSB0byB5b3VyIGNvbXBpbGVyLiAnICsgJ1NlZSBodHRwczovL2ZiLm1lL3JlYWN0LXNwcmVhZC1kZXByZWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICAgIHdhcm5lZEZvclNwcmVhZCA9IHRydWU7XG4gICAgcmV0dXJuIF9hc3NpZ24uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgfTtcblxuICBjcmVhdGVNaXhpbiA9IGZ1bmN0aW9uIChtaXhpbikge1xuICAgIGxvd1ByaW9yaXR5V2FybmluZyh3YXJuZWRGb3JDcmVhdGVNaXhpbiwgJ1JlYWN0LmNyZWF0ZU1peGluIGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4gJyArICdJbiBSZWFjdCB2MTYuMCwgaXQgd2lsbCBiZSByZW1vdmVkLiAnICsgJ1lvdSBjYW4gdXNlIHRoaXMgbWl4aW4gZGlyZWN0bHkgaW5zdGVhZC4gJyArICdTZWUgaHR0cHM6Ly9mYi5tZS9jcmVhdGVtaXhpbi13YXMtbmV2ZXItaW1wbGVtZW50ZWQgZm9yIG1vcmUgaW5mby4nKTtcbiAgICB3YXJuZWRGb3JDcmVhdGVNaXhpbiA9IHRydWU7XG4gICAgcmV0dXJuIG1peGluO1xuICB9O1xufVxuXG52YXIgUmVhY3QgPSB7XG4gIC8vIE1vZGVyblxuXG4gIENoaWxkcmVuOiB7XG4gICAgbWFwOiBSZWFjdENoaWxkcmVuLm1hcCxcbiAgICBmb3JFYWNoOiBSZWFjdENoaWxkcmVuLmZvckVhY2gsXG4gICAgY291bnQ6IFJlYWN0Q2hpbGRyZW4uY291bnQsXG4gICAgdG9BcnJheTogUmVhY3RDaGlsZHJlbi50b0FycmF5LFxuICAgIG9ubHk6IG9ubHlDaGlsZFxuICB9LFxuXG4gIENvbXBvbmVudDogUmVhY3RCYXNlQ2xhc3Nlcy5Db21wb25lbnQsXG4gIFB1cmVDb21wb25lbnQ6IFJlYWN0QmFzZUNsYXNzZXMuUHVyZUNvbXBvbmVudCxcblxuICBjcmVhdGVFbGVtZW50OiBjcmVhdGVFbGVtZW50LFxuICBjbG9uZUVsZW1lbnQ6IGNsb25lRWxlbWVudCxcbiAgaXNWYWxpZEVsZW1lbnQ6IFJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudCxcblxuICAvLyBDbGFzc2ljXG5cbiAgUHJvcFR5cGVzOiBSZWFjdFByb3BUeXBlcyxcbiAgY3JlYXRlQ2xhc3M6IGNyZWF0ZVJlYWN0Q2xhc3MsXG4gIGNyZWF0ZUZhY3Rvcnk6IGNyZWF0ZUZhY3RvcnksXG4gIGNyZWF0ZU1peGluOiBjcmVhdGVNaXhpbixcblxuICAvLyBUaGlzIGxvb2tzIERPTSBzcGVjaWZpYyBidXQgdGhlc2UgYXJlIGFjdHVhbGx5IGlzb21vcnBoaWMgaGVscGVyc1xuICAvLyBzaW5jZSB0aGV5IGFyZSBqdXN0IGdlbmVyYXRpbmcgRE9NIHN0cmluZ3MuXG4gIERPTTogUmVhY3RET01GYWN0b3JpZXMsXG5cbiAgdmVyc2lvbjogUmVhY3RWZXJzaW9uLFxuXG4gIC8vIERlcHJlY2F0ZWQgaG9vayBmb3IgSlNYIHNwcmVhZCwgZG9uJ3QgdXNlIHRoaXMgZm9yIGFueXRoaW5nLlxuICBfX3NwcmVhZDogX19zcHJlYWRcbn07XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciB3YXJuZWRGb3JDcmVhdGVDbGFzcyA9IGZhbHNlO1xuICBpZiAoY2FuRGVmaW5lUHJvcGVydHkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhY3QsICdQcm9wVHlwZXMnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbG93UHJpb3JpdHlXYXJuaW5nKGRpZFdhcm5Qcm9wVHlwZXNEZXByZWNhdGVkLCAnQWNjZXNzaW5nIFByb3BUeXBlcyB2aWEgdGhlIG1haW4gUmVhY3QgcGFja2FnZSBpcyBkZXByZWNhdGVkLCcgKyAnIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gIFJlYWN0IHYxNi4wLicgKyAnIFVzZSB0aGUgbGF0ZXN0IGF2YWlsYWJsZSB2MTUuKiBwcm9wLXR5cGVzIHBhY2thZ2UgZnJvbSBucG0gaW5zdGVhZC4nICsgJyBGb3IgaW5mbyBvbiB1c2FnZSwgY29tcGF0aWJpbGl0eSwgbWlncmF0aW9uIGFuZCBtb3JlLCBzZWUgJyArICdodHRwczovL2ZiLm1lL3Byb3AtdHlwZXMtZG9jcycpO1xuICAgICAgICBkaWRXYXJuUHJvcFR5cGVzRGVwcmVjYXRlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBSZWFjdFByb3BUeXBlcztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFjdCwgJ2NyZWF0ZUNsYXNzJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxvd1ByaW9yaXR5V2FybmluZyh3YXJuZWRGb3JDcmVhdGVDbGFzcywgJ0FjY2Vzc2luZyBjcmVhdGVDbGFzcyB2aWEgdGhlIG1haW4gUmVhY3QgcGFja2FnZSBpcyBkZXByZWNhdGVkLCcgKyAnIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgdjE2LjAuJyArIFwiIFVzZSBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MgaW5zdGVhZC4gSWYgeW91J3JlIG5vdCB5ZXQgXCIgKyAncmVhZHkgdG8gbWlncmF0ZSwgY3JlYXRlLXJlYWN0LWNsYXNzIHYxNS4qIGlzIGF2YWlsYWJsZSAnICsgJ29uIG5wbSBhcyBhIHRlbXBvcmFyeSwgZHJvcC1pbiByZXBsYWNlbWVudC4gJyArICdGb3IgbW9yZSBpbmZvIHNlZSBodHRwczovL2ZiLm1lL3JlYWN0LWNyZWF0ZS1jbGFzcycpO1xuICAgICAgICB3YXJuZWRGb3JDcmVhdGVDbGFzcyA9IHRydWU7XG4gICAgICAgIHJldHVybiBjcmVhdGVSZWFjdENsYXNzO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gUmVhY3QuRE9NIGZhY3RvcmllcyBhcmUgZGVwcmVjYXRlZC4gV3JhcCB0aGVzZSBtZXRob2RzIHNvIHRoYXRcbiAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIFJlYWN0LkRPTSBuYW1lc3BhY2UgYW5kIGFsZXJ0IHVzZXJzIHRvIHN3aXRjaFxuICAvLyB0byB0aGUgYHJlYWN0LWRvbS1mYWN0b3JpZXNgIHBhY2thZ2UuXG4gIFJlYWN0LkRPTSA9IHt9O1xuICB2YXIgd2FybmVkRm9yRmFjdG9yaWVzID0gZmFsc2U7XG4gIE9iamVjdC5rZXlzKFJlYWN0RE9NRmFjdG9yaWVzKS5mb3JFYWNoKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgUmVhY3QuRE9NW2ZhY3RvcnldID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCF3YXJuZWRGb3JGYWN0b3JpZXMpIHtcbiAgICAgICAgbG93UHJpb3JpdHlXYXJuaW5nKGZhbHNlLCAnQWNjZXNzaW5nIGZhY3RvcmllcyBsaWtlIFJlYWN0LkRPTS4lcyBoYXMgYmVlbiBkZXByZWNhdGVkICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB2MTYuMCsuIFVzZSB0aGUgJyArICdyZWFjdC1kb20tZmFjdG9yaWVzIHBhY2thZ2UgaW5zdGVhZC4gJyArICcgVmVyc2lvbiAxLjAgcHJvdmlkZXMgYSBkcm9wLWluIHJlcGxhY2VtZW50LicgKyAnIEZvciBtb3JlIGluZm8sIHNlZSBodHRwczovL2ZiLm1lL3JlYWN0LWRvbS1mYWN0b3JpZXMnLCBmYWN0b3J5KTtcbiAgICAgICAgd2FybmVkRm9yRmFjdG9yaWVzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBSZWFjdERPTUZhY3Rvcmllc1tmYWN0b3J5XS5hcHBseShSZWFjdERPTUZhY3RvcmllcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG52YXIgcHJvcFR5cGVzRmFjdG9yeSA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMvZmFjdG9yeScpO1xuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3QnKTtcbnZhciBQcm9wVHlwZXMgPSBwcm9wVHlwZXNGYWN0b3J5KFJlYWN0LmlzVmFsaWRFbGVtZW50KTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBoYXNSZWFkT25seVZhbHVlID0ge1xuICBidXR0b246IHRydWUsXG4gIGNoZWNrYm94OiB0cnVlLFxuICBpbWFnZTogdHJ1ZSxcbiAgaGlkZGVuOiB0cnVlLFxuICByYWRpbzogdHJ1ZSxcbiAgcmVzZXQ6IHRydWUsXG4gIHN1Ym1pdDogdHJ1ZVxufTtcblxuZnVuY3Rpb24gX2Fzc2VydFNpbmdsZUxpbmsoaW5wdXRQcm9wcykge1xuICAhKGlucHV0UHJvcHMuY2hlY2tlZExpbmsgPT0gbnVsbCB8fCBpbnB1dFByb3BzLnZhbHVlTGluayA9PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW5ub3QgcHJvdmlkZSBhIGNoZWNrZWRMaW5rIGFuZCBhIHZhbHVlTGluay4gSWYgeW91IHdhbnQgdG8gdXNlIGNoZWNrZWRMaW5rLCB5b3UgcHJvYmFibHkgZG9uXFwndCB3YW50IHRvIHVzZSB2YWx1ZUxpbmsgYW5kIHZpY2UgdmVyc2EuJykgOiBfcHJvZEludmFyaWFudCgnODcnKSA6IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIF9hc3NlcnRWYWx1ZUxpbmsoaW5wdXRQcm9wcykge1xuICBfYXNzZXJ0U2luZ2xlTGluayhpbnB1dFByb3BzKTtcbiAgIShpbnB1dFByb3BzLnZhbHVlID09IG51bGwgJiYgaW5wdXRQcm9wcy5vbkNoYW5nZSA9PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW5ub3QgcHJvdmlkZSBhIHZhbHVlTGluayBhbmQgYSB2YWx1ZSBvciBvbkNoYW5nZSBldmVudC4gSWYgeW91IHdhbnQgdG8gdXNlIHZhbHVlIG9yIG9uQ2hhbmdlLCB5b3UgcHJvYmFibHkgZG9uXFwndCB3YW50IHRvIHVzZSB2YWx1ZUxpbmsuJykgOiBfcHJvZEludmFyaWFudCgnODgnKSA6IHZvaWQgMDtcbn1cblxuZnVuY3Rpb24gX2Fzc2VydENoZWNrZWRMaW5rKGlucHV0UHJvcHMpIHtcbiAgX2Fzc2VydFNpbmdsZUxpbmsoaW5wdXRQcm9wcyk7XG4gICEoaW5wdXRQcm9wcy5jaGVja2VkID09IG51bGwgJiYgaW5wdXRQcm9wcy5vbkNoYW5nZSA9PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW5ub3QgcHJvdmlkZSBhIGNoZWNrZWRMaW5rIGFuZCBhIGNoZWNrZWQgcHJvcGVydHkgb3Igb25DaGFuZ2UgZXZlbnQuIElmIHlvdSB3YW50IHRvIHVzZSBjaGVja2VkIG9yIG9uQ2hhbmdlLCB5b3UgcHJvYmFibHkgZG9uXFwndCB3YW50IHRvIHVzZSBjaGVja2VkTGluaycpIDogX3Byb2RJbnZhcmlhbnQoJzg5JykgOiB2b2lkIDA7XG59XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIHZhbHVlOiBmdW5jdGlvbiAocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7XG4gICAgaWYgKCFwcm9wc1twcm9wTmFtZV0gfHwgaGFzUmVhZE9ubHlWYWx1ZVtwcm9wcy50eXBlXSB8fCBwcm9wcy5vbkNoYW5nZSB8fCBwcm9wcy5yZWFkT25seSB8fCBwcm9wcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRXJyb3IoJ1lvdSBwcm92aWRlZCBhIGB2YWx1ZWAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiAnICsgJ2BvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgJyArICd0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0VmFsdWVgLiBPdGhlcndpc2UsICcgKyAnc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuJyk7XG4gIH0sXG4gIGNoZWNrZWQ6IGZ1bmN0aW9uIChwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHtcbiAgICBpZiAoIXByb3BzW3Byb3BOYW1lXSB8fCBwcm9wcy5vbkNoYW5nZSB8fCBwcm9wcy5yZWFkT25seSB8fCBwcm9wcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRXJyb3IoJ1lvdSBwcm92aWRlZCBhIGBjaGVja2VkYCBwcm9wIHRvIGEgZm9ybSBmaWVsZCB3aXRob3V0IGFuICcgKyAnYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiAnICsgJ3RoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRDaGVja2VkYC4gT3RoZXJ3aXNlLCAnICsgJ3NldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLicpO1xuICB9LFxuICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbnZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShvd25lcikge1xuICBpZiAob3duZXIpIHtcbiAgICB2YXIgbmFtZSA9IG93bmVyLmdldE5hbWUoKTtcbiAgICBpZiAobmFtZSkge1xuICAgICAgcmV0dXJuICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIFByb3ZpZGUgYSBsaW5rZWQgYHZhbHVlYCBhdHRyaWJ1dGUgZm9yIGNvbnRyb2xsZWQgZm9ybXMuIFlvdSBzaG91bGQgbm90IHVzZVxuICogdGhpcyBvdXRzaWRlIG9mIHRoZSBSZWFjdERPTSBjb250cm9sbGVkIGZvcm0gY29tcG9uZW50cy5cbiAqL1xudmFyIExpbmtlZFZhbHVlVXRpbHMgPSB7XG4gIGNoZWNrUHJvcFR5cGVzOiBmdW5jdGlvbiAodGFnTmFtZSwgcHJvcHMsIG93bmVyKSB7XG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gcHJvcFR5cGVzKSB7XG4gICAgICBpZiAocHJvcFR5cGVzLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3IgPSBwcm9wVHlwZXNbcHJvcE5hbWVdKHByb3BzLCBwcm9wTmFtZSwgdGFnTmFtZSwgJ3Byb3AnLCBudWxsLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yLm1lc3NhZ2VdID0gdHJ1ZTtcblxuICAgICAgICB2YXIgYWRkZW5kdW0gPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0ob3duZXIpO1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ZhaWxlZCBmb3JtIHByb3BUeXBlOiAlcyVzJywgZXJyb3IubWVzc2FnZSwgYWRkZW5kdW0pIDogdm9pZCAwO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGlucHV0UHJvcHMgUHJvcHMgZm9yIGZvcm0gY29tcG9uZW50XG4gICAqIEByZXR1cm4geyp9IGN1cnJlbnQgdmFsdWUgb2YgdGhlIGlucHV0IGVpdGhlciBmcm9tIHZhbHVlIHByb3Agb3IgbGluay5cbiAgICovXG4gIGdldFZhbHVlOiBmdW5jdGlvbiAoaW5wdXRQcm9wcykge1xuICAgIGlmIChpbnB1dFByb3BzLnZhbHVlTGluaykge1xuICAgICAgX2Fzc2VydFZhbHVlTGluayhpbnB1dFByb3BzKTtcbiAgICAgIHJldHVybiBpbnB1dFByb3BzLnZhbHVlTGluay52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0UHJvcHMudmFsdWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dFByb3BzIFByb3BzIGZvciBmb3JtIGNvbXBvbmVudFxuICAgKiBAcmV0dXJuIHsqfSBjdXJyZW50IGNoZWNrZWQgc3RhdHVzIG9mIHRoZSBpbnB1dCBlaXRoZXIgZnJvbSBjaGVja2VkIHByb3BcbiAgICogICAgICAgICAgICAgb3IgbGluay5cbiAgICovXG4gIGdldENoZWNrZWQ6IGZ1bmN0aW9uIChpbnB1dFByb3BzKSB7XG4gICAgaWYgKGlucHV0UHJvcHMuY2hlY2tlZExpbmspIHtcbiAgICAgIF9hc3NlcnRDaGVja2VkTGluayhpbnB1dFByb3BzKTtcbiAgICAgIHJldHVybiBpbnB1dFByb3BzLmNoZWNrZWRMaW5rLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRQcm9wcy5jaGVja2VkO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gaW5wdXRQcm9wcyBQcm9wcyBmb3IgZm9ybSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgY2hhbmdlIGV2ZW50IHRvIGhhbmRsZVxuICAgKi9cbiAgZXhlY3V0ZU9uQ2hhbmdlOiBmdW5jdGlvbiAoaW5wdXRQcm9wcywgZXZlbnQpIHtcbiAgICBpZiAoaW5wdXRQcm9wcy52YWx1ZUxpbmspIHtcbiAgICAgIF9hc3NlcnRWYWx1ZUxpbmsoaW5wdXRQcm9wcyk7XG4gICAgICByZXR1cm4gaW5wdXRQcm9wcy52YWx1ZUxpbmsucmVxdWVzdENoYW5nZShldmVudC50YXJnZXQudmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoaW5wdXRQcm9wcy5jaGVja2VkTGluaykge1xuICAgICAgX2Fzc2VydENoZWNrZWRMaW5rKGlucHV0UHJvcHMpO1xuICAgICAgcmV0dXJuIGlucHV0UHJvcHMuY2hlY2tlZExpbmsucmVxdWVzdENoYW5nZShldmVudC50YXJnZXQuY2hlY2tlZCk7XG4gICAgfSBlbHNlIGlmIChpbnB1dFByb3BzLm9uQ2hhbmdlKSB7XG4gICAgICByZXR1cm4gaW5wdXRQcm9wcy5vbkNoYW5nZS5jYWxsKHVuZGVmaW5lZCwgZXZlbnQpO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBMaW5rZWRWYWx1ZVV0aWxzOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50JyksXG4gICAgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIERPTVByb3BlcnR5T3BlcmF0aW9ucyA9IHJlcXVpcmUoJy4vRE9NUHJvcGVydHlPcGVyYXRpb25zJyk7XG52YXIgTGlua2VkVmFsdWVVdGlscyA9IHJlcXVpcmUoJy4vTGlua2VkVmFsdWVVdGlscycpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RVcGRhdGVzID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZXMnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBkaWRXYXJuVmFsdWVMaW5rID0gZmFsc2U7XG52YXIgZGlkV2FybkNoZWNrZWRMaW5rID0gZmFsc2U7XG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gZmFsc2U7XG52YXIgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSBmYWxzZTtcbnZhciBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGZvcmNlVXBkYXRlSWZNb3VudGVkKCkge1xuICBpZiAodGhpcy5fcm9vdE5vZGVJRCkge1xuICAgIC8vIERPTSBjb21wb25lbnQgaXMgc3RpbGwgbW91bnRlZDsgdXBkYXRlXG4gICAgUmVhY3RET01JbnB1dC51cGRhdGVXcmFwcGVyKHRoaXMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ29udHJvbGxlZChwcm9wcykge1xuICB2YXIgdXNlc0NoZWNrZWQgPSBwcm9wcy50eXBlID09PSAnY2hlY2tib3gnIHx8IHByb3BzLnR5cGUgPT09ICdyYWRpbyc7XG4gIHJldHVybiB1c2VzQ2hlY2tlZCA/IHByb3BzLmNoZWNrZWQgIT0gbnVsbCA6IHByb3BzLnZhbHVlICE9IG51bGw7XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBhbiA8aW5wdXQ+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIHNldHRpbmcgdGhlc2Ugb3B0aW9uYWxcbiAqIHByb3BzOiBgY2hlY2tlZGAsIGB2YWx1ZWAsIGBkZWZhdWx0Q2hlY2tlZGAsIGFuZCBgZGVmYXVsdFZhbHVlYC5cbiAqXG4gKiBJZiBgY2hlY2tlZGAgb3IgYHZhbHVlYCBhcmUgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9uc1xuICogdGhhdCBhZmZlY3QgdGhlIGNoZWNrZWQgc3RhdGUgb3IgdmFsdWUgd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogSWYgdGhleSBhcmUgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIG5vdFxuICogdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LiBJbnN0ZWFkLCB0aGUgcHJvcHMgbXVzdCBjaGFuZ2UgaW4gb3JkZXIgZm9yXG4gKiB0aGUgcmVuZGVyZWQgZWxlbWVudCB0byBiZSB1cGRhdGVkLlxuICpcbiAqIFRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgYmUgaW5pdGlhbGl6ZWQgYXMgdW5jaGVja2VkIChvciBgZGVmYXVsdENoZWNrZWRgKVxuICogd2l0aCBhbiBlbXB0eSB2YWx1ZSAob3IgYGRlZmF1bHRWYWx1ZWApLlxuICpcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMi9XRC1odG1sNS0yMDEyMTAyNS90aGUtaW5wdXQtZWxlbWVudC5odG1sXG4gKi9cbnZhciBSZWFjdERPTUlucHV0ID0ge1xuICBnZXRIb3N0UHJvcHM6IGZ1bmN0aW9uIChpbnN0LCBwcm9wcykge1xuICAgIHZhciB2YWx1ZSA9IExpbmtlZFZhbHVlVXRpbHMuZ2V0VmFsdWUocHJvcHMpO1xuICAgIHZhciBjaGVja2VkID0gTGlua2VkVmFsdWVVdGlscy5nZXRDaGVja2VkKHByb3BzKTtcblxuICAgIHZhciBob3N0UHJvcHMgPSBfYXNzaWduKHtcbiAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzZXQgLnR5cGUgYmVmb3JlIGFueSBvdGhlciBwcm9wZXJ0aWVzIChzZXR0aW5nIC52YWx1ZVxuICAgICAgLy8gYmVmb3JlIC50eXBlIG1lYW5zIC52YWx1ZSBpcyBsb3N0IGluIElFMTEgYW5kIGJlbG93KVxuICAgICAgdHlwZTogdW5kZWZpbmVkLFxuICAgICAgLy8gTWFrZSBzdXJlIHdlIHNldCAuc3RlcCBiZWZvcmUgLnZhbHVlIChzZXR0aW5nIC52YWx1ZSBiZWZvcmUgLnN0ZXBcbiAgICAgIC8vIG1lYW5zIC52YWx1ZSBpcyByb3VuZGVkIG9uIG1vdW50LCBiYXNlZCB1cG9uIHN0ZXAgcHJlY2lzaW9uKVxuICAgICAgc3RlcDogdW5kZWZpbmVkLFxuICAgICAgLy8gTWFrZSBzdXJlIHdlIHNldCAubWluICYgLm1heCBiZWZvcmUgLnZhbHVlICh0byBlbnN1cmUgcHJvcGVyIG9yZGVyXG4gICAgICAvLyBpbiBjb3JuZXIgY2FzZXMgc3VjaCBhcyBtaW4gb3IgbWF4IGRlcml2aW5nIGZyb20gdmFsdWUsIGUuZy4gSXNzdWUgIzcxNzApXG4gICAgICBtaW46IHVuZGVmaW5lZCxcbiAgICAgIG1heDogdW5kZWZpbmVkXG4gICAgfSwgcHJvcHMsIHtcbiAgICAgIGRlZmF1bHRDaGVja2VkOiB1bmRlZmluZWQsXG4gICAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgIHZhbHVlOiB2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiBpbnN0Ll93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlLFxuICAgICAgY2hlY2tlZDogY2hlY2tlZCAhPSBudWxsID8gY2hlY2tlZCA6IGluc3QuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZCxcbiAgICAgIG9uQ2hhbmdlOiBpbnN0Ll93cmFwcGVyU3RhdGUub25DaGFuZ2VcbiAgICB9KTtcblxuICAgIHJldHVybiBob3N0UHJvcHM7XG4gIH0sXG5cbiAgbW91bnRXcmFwcGVyOiBmdW5jdGlvbiAoaW5zdCwgcHJvcHMpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgTGlua2VkVmFsdWVVdGlscy5jaGVja1Byb3BUeXBlcygnaW5wdXQnLCBwcm9wcywgaW5zdC5fY3VycmVudEVsZW1lbnQuX293bmVyKTtcblxuICAgICAgdmFyIG93bmVyID0gaW5zdC5fY3VycmVudEVsZW1lbnQuX293bmVyO1xuXG4gICAgICBpZiAocHJvcHMudmFsdWVMaW5rICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZUxpbmspIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdgdmFsdWVMaW5rYCBwcm9wIG9uIGBpbnB1dGAgaXMgZGVwcmVjYXRlZDsgc2V0IGB2YWx1ZWAgYW5kIGBvbkNoYW5nZWAgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgICAgICAgZGlkV2FyblZhbHVlTGluayA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMuY2hlY2tlZExpbmsgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FybkNoZWNrZWRMaW5rKSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYGNoZWNrZWRMaW5rYCBwcm9wIG9uIGBpbnB1dGAgaXMgZGVwcmVjYXRlZDsgc2V0IGB2YWx1ZWAgYW5kIGBvbkNoYW5nZWAgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgICAgICAgZGlkV2FybkNoZWNrZWRMaW5rID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5jaGVja2VkICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdENoZWNrZWQgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCkge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzIGNvbnRhaW5zIGFuIGlucHV0IG9mIHR5cGUgJXMgd2l0aCBib3RoIGNoZWNrZWQgYW5kIGRlZmF1bHRDaGVja2VkIHByb3BzLiAnICsgJ0lucHV0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSBjaGVja2VkIHByb3AsIG9yIHRoZSBkZWZhdWx0Q2hlY2tlZCBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9mYi5tZS9yZWFjdC1jb250cm9sbGVkLWNvbXBvbmVudHMnLCBvd25lciAmJiBvd25lci5nZXROYW1lKCkgfHwgJ0EgY29tcG9uZW50JywgcHJvcHMudHlwZSkgOiB2b2lkIDA7XG4gICAgICAgIGRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSkge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzIGNvbnRhaW5zIGFuIGlucHV0IG9mIHR5cGUgJXMgd2l0aCBib3RoIHZhbHVlIGFuZCBkZWZhdWx0VmFsdWUgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vZmIubWUvcmVhY3QtY29udHJvbGxlZC1jb21wb25lbnRzJywgb3duZXIgJiYgb3duZXIuZ2V0TmFtZSgpIHx8ICdBIGNvbXBvbmVudCcsIHByb3BzLnR5cGUpIDogdm9pZCAwO1xuICAgICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWU7XG4gICAgaW5zdC5fd3JhcHBlclN0YXRlID0ge1xuICAgICAgaW5pdGlhbENoZWNrZWQ6IHByb3BzLmNoZWNrZWQgIT0gbnVsbCA/IHByb3BzLmNoZWNrZWQgOiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCxcbiAgICAgIGluaXRpYWxWYWx1ZTogcHJvcHMudmFsdWUgIT0gbnVsbCA/IHByb3BzLnZhbHVlIDogZGVmYXVsdFZhbHVlLFxuICAgICAgbGlzdGVuZXJzOiBudWxsLFxuICAgICAgb25DaGFuZ2U6IF9oYW5kbGVDaGFuZ2UuYmluZChpbnN0KSxcbiAgICAgIGNvbnRyb2xsZWQ6IGlzQ29udHJvbGxlZChwcm9wcylcbiAgICB9O1xuICB9LFxuXG4gIHVwZGF0ZVdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgdmFyIHByb3BzID0gaW5zdC5fY3VycmVudEVsZW1lbnQucHJvcHM7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIGNvbnRyb2xsZWQgPSBpc0NvbnRyb2xsZWQocHJvcHMpO1xuICAgICAgdmFyIG93bmVyID0gaW5zdC5fY3VycmVudEVsZW1lbnQuX293bmVyO1xuXG4gICAgICBpZiAoIWluc3QuX3dyYXBwZXJTdGF0ZS5jb250cm9sbGVkICYmIGNvbnRyb2xsZWQgJiYgIWRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyBpcyBjaGFuZ2luZyBhbiB1bmNvbnRyb2xsZWQgaW5wdXQgb2YgdHlwZSAlcyB0byBiZSBjb250cm9sbGVkLiAnICsgJ0lucHV0IGVsZW1lbnRzIHNob3VsZCBub3Qgc3dpdGNoIGZyb20gdW5jb250cm9sbGVkIHRvIGNvbnRyb2xsZWQgKG9yIHZpY2UgdmVyc2EpLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cycsIG93bmVyICYmIG93bmVyLmdldE5hbWUoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKSA6IHZvaWQgMDtcbiAgICAgICAgZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaW5zdC5fd3JhcHBlclN0YXRlLmNvbnRyb2xsZWQgJiYgIWNvbnRyb2xsZWQgJiYgIWRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyBpcyBjaGFuZ2luZyBhIGNvbnRyb2xsZWQgaW5wdXQgb2YgdHlwZSAlcyB0byBiZSB1bmNvbnRyb2xsZWQuICcgKyAnSW5wdXQgZWxlbWVudHMgc2hvdWxkIG5vdCBzd2l0Y2ggZnJvbSBjb250cm9sbGVkIHRvIHVuY29udHJvbGxlZCAob3IgdmljZSB2ZXJzYSkuICcgKyAnRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29tcG9uZW50LiBNb3JlIGluZm86IGh0dHBzOi8vZmIubWUvcmVhY3QtY29udHJvbGxlZC1jb21wb25lbnRzJywgb3duZXIgJiYgb3duZXIuZ2V0TmFtZSgpIHx8ICdBIGNvbXBvbmVudCcsIHByb3BzLnR5cGUpIDogdm9pZCAwO1xuICAgICAgICBkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPOiBTaG91bGRuJ3QgdGhpcyBiZSBnZXRDaGVja2VkKHByb3BzKT9cbiAgICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG4gICAgaWYgKGNoZWNrZWQgIT0gbnVsbCkge1xuICAgICAgRE9NUHJvcGVydHlPcGVyYXRpb25zLnNldFZhbHVlRm9yUHJvcGVydHkoUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCksICdjaGVja2VkJywgY2hlY2tlZCB8fCBmYWxzZSk7XG4gICAgfVxuXG4gICAgdmFyIG5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTtcbiAgICB2YXIgdmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTtcbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgaWYgKHZhbHVlID09PSAwICYmIG5vZGUudmFsdWUgPT09ICcnKSB7XG4gICAgICAgIG5vZGUudmFsdWUgPSAnMCc7XG4gICAgICAgIC8vIE5vdGU6IElFOSByZXBvcnRzIGEgbnVtYmVyIGlucHV0cyBhcyAndGV4dCcsIHNvIGNoZWNrIHByb3BzIGluc3RlYWQuXG4gICAgICB9IGVsc2UgaWYgKHByb3BzLnR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIC8vIFNpbXVsYXRlIGBpbnB1dC52YWx1ZUFzTnVtYmVyYC4gSUU5IGRvZXMgbm90IHN1cHBvcnQgaXRcbiAgICAgICAgdmFyIHZhbHVlQXNOdW1iZXIgPSBwYXJzZUZsb2F0KG5vZGUudmFsdWUsIDEwKSB8fCAwO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgIHZhbHVlICE9IHZhbHVlQXNOdW1iZXIgfHxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgIHZhbHVlID09IHZhbHVlQXNOdW1iZXIgJiYgbm9kZS52YWx1ZSAhPSB2YWx1ZSkge1xuICAgICAgICAgIC8vIENhc3QgYHZhbHVlYCB0byBhIHN0cmluZyB0byBlbnN1cmUgdGhlIHZhbHVlIGlzIHNldCBjb3JyZWN0bHkuIFdoaWxlXG4gICAgICAgICAgLy8gYnJvd3NlcnMgdHlwaWNhbGx5IGRvIHRoaXMgYXMgbmVjZXNzYXJ5LCBqc2RvbSBkb2Vzbid0LlxuICAgICAgICAgIG5vZGUudmFsdWUgPSAnJyArIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudmFsdWUgIT09ICcnICsgdmFsdWUpIHtcbiAgICAgICAgLy8gQ2FzdCBgdmFsdWVgIHRvIGEgc3RyaW5nIHRvIGVuc3VyZSB0aGUgdmFsdWUgaXMgc2V0IGNvcnJlY3RseS4gV2hpbGVcbiAgICAgICAgLy8gYnJvd3NlcnMgdHlwaWNhbGx5IGRvIHRoaXMgYXMgbmVjZXNzYXJ5LCBqc2RvbSBkb2Vzbid0LlxuICAgICAgICBub2RlLnZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByb3BzLnZhbHVlID09IG51bGwgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgLy8gSW4gQ2hyb21lLCBhc3NpZ25pbmcgZGVmYXVsdFZhbHVlIHRvIGNlcnRhaW4gaW5wdXQgdHlwZXMgdHJpZ2dlcnMgaW5wdXQgdmFsaWRhdGlvbi5cbiAgICAgICAgLy8gRm9yIG51bWJlciBpbnB1dHMsIHRoZSBkaXNwbGF5IHZhbHVlIGxvc2VzIHRyYWlsaW5nIGRlY2ltYWwgcG9pbnRzLiBGb3IgZW1haWwgaW5wdXRzLFxuICAgICAgICAvLyBDaHJvbWUgcmFpc2VzIFwiVGhlIHNwZWNpZmllZCB2YWx1ZSA8eD4gaXMgbm90IGEgdmFsaWQgZW1haWwgYWRkcmVzc1wiLlxuICAgICAgICAvL1xuICAgICAgICAvLyBIZXJlIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUgZGVmYXVsdFZhbHVlIGhhcyBhY3R1YWxseSBjaGFuZ2VkLCBhdm9pZGluZyB0aGVzZSBwcm9ibGVtc1xuICAgICAgICAvLyB3aGVuIHRoZSB1c2VyIGlzIGlucHV0dGluZyB0ZXh0XG4gICAgICAgIC8vXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzI1M1xuICAgICAgICBpZiAobm9kZS5kZWZhdWx0VmFsdWUgIT09ICcnICsgcHJvcHMuZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSAnJyArIHByb3BzLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByb3BzLmNoZWNrZWQgPT0gbnVsbCAmJiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCAhPSBudWxsKSB7XG4gICAgICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhIXByb3BzLmRlZmF1bHRDaGVja2VkO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBwb3N0TW91bnRXcmFwcGVyOiBmdW5jdGlvbiAoaW5zdCkge1xuICAgIHZhciBwcm9wcyA9IGluc3QuX2N1cnJlbnRFbGVtZW50LnByb3BzO1xuXG4gICAgLy8gVGhpcyBpcyBpbiBwb3N0TW91bnQgYmVjYXVzZSB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgRE9NIG5vZGUsIHdoaWNoIGlzIG5vdFxuICAgIC8vIGF2YWlsYWJsZSB1bnRpbCBhZnRlciB0aGUgY29tcG9uZW50IGhhcyBtb3VudGVkLlxuICAgIHZhciBub2RlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCk7XG5cbiAgICAvLyBEZXRhY2ggdmFsdWUgZnJvbSBkZWZhdWx0VmFsdWUuIFdlIHdvbid0IGRvIGFueXRoaW5nIGlmIHdlJ3JlIHdvcmtpbmcgb25cbiAgICAvLyBzdWJtaXQgb3IgcmVzZXQgaW5wdXRzIGFzIHRob3NlIHZhbHVlcyAmIGRlZmF1bHRWYWx1ZXMgYXJlIGxpbmtlZC4gVGhleVxuICAgIC8vIGFyZSBub3QgcmVzZXRhYmxlIG5vZGVzIHNvIHRoaXMgb3BlcmF0aW9uIGRvZXNuJ3QgbWF0dGVyIGFuZCBhY3R1YWxseVxuICAgIC8vIHJlbW92ZXMgYnJvd3Nlci1kZWZhdWx0IHZhbHVlcyAoZWcgXCJTdWJtaXQgUXVlcnlcIikgd2hlbiBubyB2YWx1ZSBpc1xuICAgIC8vIHByb3ZpZGVkLlxuXG4gICAgc3dpdGNoIChwcm9wcy50eXBlKSB7XG4gICAgICBjYXNlICdzdWJtaXQnOlxuICAgICAgY2FzZSAncmVzZXQnOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NvbG9yJzpcbiAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgY2FzZSAnZGF0ZXRpbWUnOlxuICAgICAgY2FzZSAnZGF0ZXRpbWUtbG9jYWwnOlxuICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgY2FzZSAndGltZSc6XG4gICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgLy8gVGhpcyBmaXhlcyB0aGUgbm8tc2hvdyBpc3N1ZSBvbiBpT1MgU2FmYXJpIGFuZCBBbmRyb2lkIENocm9tZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy83MjMzXG4gICAgICAgIG5vZGUudmFsdWUgPSAnJztcbiAgICAgICAgbm9kZS52YWx1ZSA9IG5vZGUuZGVmYXVsdFZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIG5vZGUudmFsdWUgPSBub2RlLnZhbHVlO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyBOb3JtYWxseSwgd2UnZCBqdXN0IGRvIGBub2RlLmNoZWNrZWQgPSBub2RlLmNoZWNrZWRgIHVwb24gaW5pdGlhbCBtb3VudCwgbGVzcyB0aGlzIGJ1Z1xuICAgIC8vIHRoaXMgaXMgbmVlZGVkIHRvIHdvcmsgYXJvdW5kIGEgY2hyb21lIGJ1ZyB3aGVyZSBzZXR0aW5nIGRlZmF1bHRDaGVja2VkXG4gICAgLy8gd2lsbCBzb21ldGltZXMgaW5mbHVlbmNlIHRoZSB2YWx1ZSBvZiBjaGVja2VkIChldmVuIGFmdGVyIGRldGFjaG1lbnQpLlxuICAgIC8vIFJlZmVyZW5jZTogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NjA4NDE2XG4gICAgLy8gV2UgbmVlZCB0byB0ZW1wb3JhcmlseSB1bnNldCBuYW1lIHRvIGF2b2lkIGRpc3J1cHRpbmcgcmFkaW8gYnV0dG9uIGdyb3Vwcy5cbiAgICB2YXIgbmFtZSA9IG5vZGUubmFtZTtcbiAgICBpZiAobmFtZSAhPT0gJycpIHtcbiAgICAgIG5vZGUubmFtZSA9ICcnO1xuICAgIH1cbiAgICBub2RlLmRlZmF1bHRDaGVja2VkID0gIW5vZGUuZGVmYXVsdENoZWNrZWQ7XG4gICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICFub2RlLmRlZmF1bHRDaGVja2VkO1xuICAgIGlmIChuYW1lICE9PSAnJykge1xuICAgICAgbm9kZS5uYW1lID0gbmFtZTtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIF9oYW5kbGVDaGFuZ2UoZXZlbnQpIHtcbiAgdmFyIHByb3BzID0gdGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7XG5cbiAgdmFyIHJldHVyblZhbHVlID0gTGlua2VkVmFsdWVVdGlscy5leGVjdXRlT25DaGFuZ2UocHJvcHMsIGV2ZW50KTtcblxuICAvLyBIZXJlIHdlIHVzZSBhc2FwIHRvIHdhaXQgdW50aWwgYWxsIHVwZGF0ZXMgaGF2ZSBwcm9wYWdhdGVkLCB3aGljaFxuICAvLyBpcyBpbXBvcnRhbnQgd2hlbiB1c2luZyBjb250cm9sbGVkIGNvbXBvbmVudHMgd2l0aGluIGxheWVyczpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjk4XG4gIFJlYWN0VXBkYXRlcy5hc2FwKGZvcmNlVXBkYXRlSWZNb3VudGVkLCB0aGlzKTtcblxuICB2YXIgbmFtZSA9IHByb3BzLm5hbWU7XG4gIGlmIChwcm9wcy50eXBlID09PSAncmFkaW8nICYmIG5hbWUgIT0gbnVsbCkge1xuICAgIHZhciByb290Tm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHRoaXMpO1xuICAgIHZhciBxdWVyeVJvb3QgPSByb290Tm9kZTtcblxuICAgIHdoaWxlIChxdWVyeVJvb3QucGFyZW50Tm9kZSkge1xuICAgICAgcXVlcnlSb290ID0gcXVlcnlSb290LnBhcmVudE5vZGU7XG4gICAgfVxuXG4gICAgLy8gSWYgYHJvb3ROb2RlLmZvcm1gIHdhcyBub24tbnVsbCwgdGhlbiB3ZSBjb3VsZCB0cnkgYGZvcm0uZWxlbWVudHNgLFxuICAgIC8vIGJ1dCB0aGF0IHNvbWV0aW1lcyBiZWhhdmVzIHN0cmFuZ2VseSBpbiBJRTguIFdlIGNvdWxkIGFsc28gdHJ5IHVzaW5nXG4gICAgLy8gYGZvcm0uZ2V0RWxlbWVudHNCeU5hbWVgLCBidXQgdGhhdCB3aWxsIG9ubHkgcmV0dXJuIGRpcmVjdCBjaGlsZHJlblxuICAgIC8vIGFuZCB3b24ndCBpbmNsdWRlIGlucHV0cyB0aGF0IHVzZSB0aGUgSFRNTDUgYGZvcm09YCBhdHRyaWJ1dGUuIFNpbmNlXG4gICAgLy8gdGhlIGlucHV0IG1pZ2h0IG5vdCBldmVuIGJlIGluIGEgZm9ybSwgbGV0J3MganVzdCB1c2UgdGhlIGdsb2JhbFxuICAgIC8vIGBxdWVyeVNlbGVjdG9yQWxsYCB0byBlbnN1cmUgd2UgZG9uJ3QgbWlzcyBhbnl0aGluZy5cbiAgICB2YXIgZ3JvdXAgPSBxdWVyeVJvb3QucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbbmFtZT0nICsgSlNPTi5zdHJpbmdpZnkoJycgKyBuYW1lKSArICddW3R5cGU9XCJyYWRpb1wiXScpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG90aGVyTm9kZSA9IGdyb3VwW2ldO1xuICAgICAgaWYgKG90aGVyTm9kZSA9PT0gcm9vdE5vZGUgfHwgb3RoZXJOb2RlLmZvcm0gIT09IHJvb3ROb2RlLmZvcm0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgaWYgcmFkaW8gYnV0dG9ucyByZW5kZXJlZCBieSBkaWZmZXJlbnQgY29waWVzIG9mIFJlYWN0XG4gICAgICAvLyBhbmQgdGhlIHNhbWUgbmFtZSBhcmUgcmVuZGVyZWQgaW50byB0aGUgc2FtZSBmb3JtIChzYW1lIGFzICMxOTM5KS5cbiAgICAgIC8vIFRoYXQncyBwcm9iYWJseSBva2F5OyB3ZSBkb24ndCBzdXBwb3J0IGl0IGp1c3QgYXMgd2UgZG9uJ3Qgc3VwcG9ydFxuICAgICAgLy8gbWl4aW5nIFJlYWN0IHJhZGlvIGJ1dHRvbnMgd2l0aCBub24tUmVhY3Qgb25lcy5cbiAgICAgIHZhciBvdGhlckluc3RhbmNlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUob3RoZXJOb2RlKTtcbiAgICAgICFvdGhlckluc3RhbmNlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0RE9NSW5wdXQ6IE1peGluZyBSZWFjdCBhbmQgbm9uLVJlYWN0IHJhZGlvIGlucHV0cyB3aXRoIHRoZSBzYW1lIGBuYW1lYCBpcyBub3Qgc3VwcG9ydGVkLicpIDogX3Byb2RJbnZhcmlhbnQoJzkwJykgOiB2b2lkIDA7XG4gICAgICAvLyBJZiB0aGlzIGlzIGEgY29udHJvbGxlZCByYWRpbyBidXR0b24gZ3JvdXAsIGZvcmNpbmcgdGhlIGlucHV0IHRoYXRcbiAgICAgIC8vIHdhcyBwcmV2aW91c2x5IGNoZWNrZWQgdG8gdXBkYXRlIHdpbGwgY2F1c2UgaXQgdG8gYmUgY29tZSByZS1jaGVja2VkXG4gICAgICAvLyBhcyBhcHByb3ByaWF0ZS5cbiAgICAgIFJlYWN0VXBkYXRlcy5hc2FwKGZvcmNlVXBkYXRlSWZNb3VudGVkLCBvdGhlckluc3RhbmNlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0dXJuVmFsdWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01JbnB1dDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIExpbmtlZFZhbHVlVXRpbHMgPSByZXF1aXJlKCcuL0xpbmtlZFZhbHVlVXRpbHMnKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xudmFyIFJlYWN0VXBkYXRlcyA9IHJlcXVpcmUoJy4vUmVhY3RVcGRhdGVzJyk7XG5cbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgZGlkV2FyblZhbHVlTGluayA9IGZhbHNlO1xudmFyIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSA9IGZhbHNlO1xuXG5mdW5jdGlvbiB1cGRhdGVPcHRpb25zSWZQZW5kaW5nVXBkYXRlQW5kTW91bnRlZCgpIHtcbiAgaWYgKHRoaXMuX3Jvb3ROb2RlSUQgJiYgdGhpcy5fd3JhcHBlclN0YXRlLnBlbmRpbmdVcGRhdGUpIHtcbiAgICB0aGlzLl93cmFwcGVyU3RhdGUucGVuZGluZ1VwZGF0ZSA9IGZhbHNlO1xuXG4gICAgdmFyIHByb3BzID0gdGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7XG4gICAgdmFyIHZhbHVlID0gTGlua2VkVmFsdWVVdGlscy5nZXRWYWx1ZShwcm9wcyk7XG5cbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgdXBkYXRlT3B0aW9ucyh0aGlzLCBCb29sZWFuKHByb3BzLm11bHRpcGxlKSwgdmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0ob3duZXIpIHtcbiAgaWYgKG93bmVyKSB7XG4gICAgdmFyIG5hbWUgPSBvd25lci5nZXROYW1lKCk7XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxudmFyIHZhbHVlUHJvcE5hbWVzID0gWyd2YWx1ZScsICdkZWZhdWx0VmFsdWUnXTtcblxuLyoqXG4gKiBWYWxpZGF0aW9uIGZ1bmN0aW9uIGZvciBgdmFsdWVgIGFuZCBgZGVmYXVsdFZhbHVlYC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrU2VsZWN0UHJvcFR5cGVzKGluc3QsIHByb3BzKSB7XG4gIHZhciBvd25lciA9IGluc3QuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjtcbiAgTGlua2VkVmFsdWVVdGlscy5jaGVja1Byb3BUeXBlcygnc2VsZWN0JywgcHJvcHMsIG93bmVyKTtcblxuICBpZiAocHJvcHMudmFsdWVMaW5rICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZUxpbmspIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2B2YWx1ZUxpbmtgIHByb3Agb24gYHNlbGVjdGAgaXMgZGVwcmVjYXRlZDsgc2V0IGB2YWx1ZWAgYW5kIGBvbkNoYW5nZWAgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgICBkaWRXYXJuVmFsdWVMaW5rID0gdHJ1ZTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVQcm9wTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHJvcE5hbWUgPSB2YWx1ZVByb3BOYW1lc1tpXTtcbiAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkocHJvcHNbcHJvcE5hbWVdKTtcbiAgICBpZiAocHJvcHMubXVsdGlwbGUgJiYgIWlzQXJyYXkpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVGhlIGAlc2AgcHJvcCBzdXBwbGllZCB0byA8c2VsZWN0PiBtdXN0IGJlIGFuIGFycmF5IGlmICcgKyAnYG11bHRpcGxlYCBpcyB0cnVlLiVzJywgcHJvcE5hbWUsIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShvd25lcikpIDogdm9pZCAwO1xuICAgIH0gZWxzZSBpZiAoIXByb3BzLm11bHRpcGxlICYmIGlzQXJyYXkpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVGhlIGAlc2AgcHJvcCBzdXBwbGllZCB0byA8c2VsZWN0PiBtdXN0IGJlIGEgc2NhbGFyICcgKyAndmFsdWUgaWYgYG11bHRpcGxlYCBpcyBmYWxzZS4lcycsIHByb3BOYW1lLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0ob3duZXIpKSA6IHZvaWQgMDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JlYWN0RE9NQ29tcG9uZW50fSBpbnN0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IG11bHRpcGxlXG4gKiBAcGFyYW0geyp9IHByb3BWYWx1ZSBBIHN0cmluZ2FibGUgKHdpdGggYG11bHRpcGxlYCwgYSBsaXN0IG9mIHN0cmluZ2FibGVzKS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZU9wdGlvbnMoaW5zdCwgbXVsdGlwbGUsIHByb3BWYWx1ZSkge1xuICB2YXIgc2VsZWN0ZWRWYWx1ZSwgaTtcbiAgdmFyIG9wdGlvbnMgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KS5vcHRpb25zO1xuXG4gIGlmIChtdWx0aXBsZSkge1xuICAgIHNlbGVjdGVkVmFsdWUgPSB7fTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgcHJvcFZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBzZWxlY3RlZFZhbHVlWycnICsgcHJvcFZhbHVlW2ldXSA9IHRydWU7XG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCBvcHRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VsZWN0ZWQgPSBzZWxlY3RlZFZhbHVlLmhhc093blByb3BlcnR5KG9wdGlvbnNbaV0udmFsdWUpO1xuICAgICAgaWYgKG9wdGlvbnNbaV0uc2VsZWN0ZWQgIT09IHNlbGVjdGVkKSB7XG4gICAgICAgIG9wdGlvbnNbaV0uc2VsZWN0ZWQgPSBzZWxlY3RlZDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gRG8gbm90IHNldCBgc2VsZWN0LnZhbHVlYCBhcyBleGFjdCBiZWhhdmlvciBpc24ndCBjb25zaXN0ZW50IGFjcm9zcyBhbGxcbiAgICAvLyBicm93c2VycyBmb3IgYWxsIGNhc2VzLlxuICAgIHNlbGVjdGVkVmFsdWUgPSAnJyArIHByb3BWYWx1ZTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG9wdGlvbnNbaV0udmFsdWUgPT09IHNlbGVjdGVkVmFsdWUpIHtcbiAgICAgICAgb3B0aW9uc1tpXS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICBvcHRpb25zWzBdLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgPHNlbGVjdD4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgb3B0aW9uYWxseSBzZXR0aW5nIHRoZVxuICogcHJvcHMgYHZhbHVlYCBhbmQgYGRlZmF1bHRWYWx1ZWAuIElmIGBtdWx0aXBsZWAgaXMgZmFsc2UsIHRoZSBwcm9wIG11c3QgYmUgYVxuICogc3RyaW5nYWJsZS4gSWYgYG11bHRpcGxlYCBpcyB0cnVlLCB0aGUgcHJvcCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ2FibGVzLlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0aGF0IGNoYW5nZSB0aGVcbiAqIHNlbGVjdGVkIG9wdGlvbiB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgcmVuZGVyZWQgb3B0aW9ucy5cbiAqXG4gKiBJZiBpdCBpcyBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBvcHRpb25zIHdpbGwgbm90XG4gKiB1cGRhdGUgaW4gcmVzcG9uc2UgdG8gdXNlciBhY3Rpb25zLiBJbnN0ZWFkLCB0aGUgYHZhbHVlYCBwcm9wIG11c3QgY2hhbmdlIGluXG4gKiBvcmRlciBmb3IgdGhlIHJlbmRlcmVkIG9wdGlvbnMgdG8gdXBkYXRlLlxuICpcbiAqIElmIGBkZWZhdWx0VmFsdWVgIGlzIHByb3ZpZGVkLCBhbnkgb3B0aW9ucyB3aXRoIHRoZSBzdXBwbGllZCB2YWx1ZXMgd2lsbCBiZVxuICogc2VsZWN0ZWQuXG4gKi9cbnZhciBSZWFjdERPTVNlbGVjdCA9IHtcbiAgZ2V0SG9zdFByb3BzOiBmdW5jdGlvbiAoaW5zdCwgcHJvcHMpIHtcbiAgICByZXR1cm4gX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgIG9uQ2hhbmdlOiBpbnN0Ll93cmFwcGVyU3RhdGUub25DaGFuZ2UsXG4gICAgICB2YWx1ZTogdW5kZWZpbmVkXG4gICAgfSk7XG4gIH0sXG5cbiAgbW91bnRXcmFwcGVyOiBmdW5jdGlvbiAoaW5zdCwgcHJvcHMpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgY2hlY2tTZWxlY3RQcm9wVHlwZXMoaW5zdCwgcHJvcHMpO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZSA9IExpbmtlZFZhbHVlVXRpbHMuZ2V0VmFsdWUocHJvcHMpO1xuICAgIGluc3QuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICAgIHBlbmRpbmdVcGRhdGU6IGZhbHNlLFxuICAgICAgaW5pdGlhbFZhbHVlOiB2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiBwcm9wcy5kZWZhdWx0VmFsdWUsXG4gICAgICBsaXN0ZW5lcnM6IG51bGwsXG4gICAgICBvbkNoYW5nZTogX2hhbmRsZUNoYW5nZS5iaW5kKGluc3QpLFxuICAgICAgd2FzTXVsdGlwbGU6IEJvb2xlYW4ocHJvcHMubXVsdGlwbGUpXG4gICAgfTtcblxuICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnU2VsZWN0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBzZWxlY3QgJyArICdlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9mYi5tZS9yZWFjdC1jb250cm9sbGVkLWNvbXBvbmVudHMnKSA6IHZvaWQgMDtcbiAgICAgIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIGdldFNlbGVjdFZhbHVlQ29udGV4dDogZnVuY3Rpb24gKGluc3QpIHtcbiAgICAvLyBSZWFjdERPTU9wdGlvbiBsb29rcyBhdCB0aGlzIGluaXRpYWwgdmFsdWUgc28gdGhlIGluaXRpYWwgZ2VuZXJhdGVkXG4gICAgLy8gbWFya3VwIGhhcyBjb3JyZWN0IGBzZWxlY3RlZGAgYXR0cmlidXRlc1xuICAgIHJldHVybiBpbnN0Ll93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlO1xuICB9LFxuXG4gIHBvc3RVcGRhdGVXcmFwcGVyOiBmdW5jdGlvbiAoaW5zdCkge1xuICAgIHZhciBwcm9wcyA9IGluc3QuX2N1cnJlbnRFbGVtZW50LnByb3BzO1xuXG4gICAgLy8gQWZ0ZXIgdGhlIGluaXRpYWwgbW91bnQsIHdlIGNvbnRyb2wgc2VsZWN0ZWQtbmVzcyBtYW51YWxseSBzbyBkb24ndCBwYXNzXG4gICAgLy8gdGhpcyB2YWx1ZSBkb3duXG4gICAgaW5zdC5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSA9IHVuZGVmaW5lZDtcblxuICAgIHZhciB3YXNNdWx0aXBsZSA9IGluc3QuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZTtcbiAgICBpbnN0Ll93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGUgPSBCb29sZWFuKHByb3BzLm11bHRpcGxlKTtcblxuICAgIHZhciB2YWx1ZSA9IExpbmtlZFZhbHVlVXRpbHMuZ2V0VmFsdWUocHJvcHMpO1xuICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpbnN0Ll93cmFwcGVyU3RhdGUucGVuZGluZ1VwZGF0ZSA9IGZhbHNlO1xuICAgICAgdXBkYXRlT3B0aW9ucyhpbnN0LCBCb29sZWFuKHByb3BzLm11bHRpcGxlKSwgdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAod2FzTXVsdGlwbGUgIT09IEJvb2xlYW4ocHJvcHMubXVsdGlwbGUpKSB7XG4gICAgICAvLyBGb3Igc2ltcGxpY2l0eSwgcmVhcHBseSBgZGVmYXVsdFZhbHVlYCBpZiBgbXVsdGlwbGVgIGlzIHRvZ2dsZWQuXG4gICAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgdXBkYXRlT3B0aW9ucyhpbnN0LCBCb29sZWFuKHByb3BzLm11bHRpcGxlKSwgcHJvcHMuZGVmYXVsdFZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJldmVydCB0aGUgc2VsZWN0IGJhY2sgdG8gaXRzIGRlZmF1bHQgdW5zZWxlY3RlZCBzdGF0ZS5cbiAgICAgICAgdXBkYXRlT3B0aW9ucyhpbnN0LCBCb29sZWFuKHByb3BzLm11bHRpcGxlKSwgcHJvcHMubXVsdGlwbGUgPyBbXSA6ICcnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIF9oYW5kbGVDaGFuZ2UoZXZlbnQpIHtcbiAgdmFyIHByb3BzID0gdGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7XG4gIHZhciByZXR1cm5WYWx1ZSA9IExpbmtlZFZhbHVlVXRpbHMuZXhlY3V0ZU9uQ2hhbmdlKHByb3BzLCBldmVudCk7XG5cbiAgaWYgKHRoaXMuX3Jvb3ROb2RlSUQpIHtcbiAgICB0aGlzLl93cmFwcGVyU3RhdGUucGVuZGluZ1VwZGF0ZSA9IHRydWU7XG4gIH1cbiAgUmVhY3RVcGRhdGVzLmFzYXAodXBkYXRlT3B0aW9uc0lmUGVuZGluZ1VwZGF0ZUFuZE1vdW50ZWQsIHRoaXMpO1xuICByZXR1cm4gcmV0dXJuVmFsdWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01TZWxlY3Q7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdCcpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RET01TZWxlY3QgPSByZXF1aXJlKCcuL1JlYWN0RE9NU2VsZWN0Jyk7XG5cbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xudmFyIGRpZFdhcm5JbnZhbGlkT3B0aW9uQ2hpbGRyZW4gPSBmYWxzZTtcblxuZnVuY3Rpb24gZmxhdHRlbkNoaWxkcmVuKGNoaWxkcmVuKSB7XG4gIHZhciBjb250ZW50ID0gJyc7XG5cbiAgLy8gRmxhdHRlbiBjaGlsZHJlbiBhbmQgd2FybiBpZiB0aGV5IGFyZW4ndCBzdHJpbmdzIG9yIG51bWJlcnM7XG4gIC8vIGludmFsaWQgdHlwZXMgYXJlIGlnbm9yZWQuXG4gIFJlYWN0LkNoaWxkcmVuLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIGlmIChjaGlsZCA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBjaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbnRlbnQgKz0gY2hpbGQ7XG4gICAgfSBlbHNlIGlmICghZGlkV2FybkludmFsaWRPcHRpb25DaGlsZHJlbikge1xuICAgICAgZGlkV2FybkludmFsaWRPcHRpb25DaGlsZHJlbiA9IHRydWU7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ09ubHkgc3RyaW5ncyBhbmQgbnVtYmVycyBhcmUgc3VwcG9ydGVkIGFzIDxvcHRpb24+IGNoaWxkcmVuLicpIDogdm9pZCAwO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBhbiA8b3B0aW9uPiBob3N0IGNvbXBvbmVudCB0aGF0IHdhcm5zIHdoZW4gYHNlbGVjdGVkYCBpcyBzZXQuXG4gKi9cbnZhciBSZWFjdERPTU9wdGlvbiA9IHtcbiAgbW91bnRXcmFwcGVyOiBmdW5jdGlvbiAoaW5zdCwgcHJvcHMsIGhvc3RQYXJlbnQpIHtcbiAgICAvLyBUT0RPICh5dW5nc3RlcnMpOiBSZW1vdmUgc3VwcG9ydCBmb3IgYHNlbGVjdGVkYCBpbiA8b3B0aW9uPi5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcocHJvcHMuc2VsZWN0ZWQgPT0gbnVsbCwgJ1VzZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBvbiA8c2VsZWN0PiBpbnN0ZWFkIG9mICcgKyAnc2V0dGluZyBgc2VsZWN0ZWRgIG9uIDxvcHRpb24+LicpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIC8vIExvb2sgdXAgd2hldGhlciB0aGlzIG9wdGlvbiBpcyAnc2VsZWN0ZWQnXG4gICAgdmFyIHNlbGVjdFZhbHVlID0gbnVsbDtcbiAgICBpZiAoaG9zdFBhcmVudCAhPSBudWxsKSB7XG4gICAgICB2YXIgc2VsZWN0UGFyZW50ID0gaG9zdFBhcmVudDtcblxuICAgICAgaWYgKHNlbGVjdFBhcmVudC5fdGFnID09PSAnb3B0Z3JvdXAnKSB7XG4gICAgICAgIHNlbGVjdFBhcmVudCA9IHNlbGVjdFBhcmVudC5faG9zdFBhcmVudDtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGVjdFBhcmVudCAhPSBudWxsICYmIHNlbGVjdFBhcmVudC5fdGFnID09PSAnc2VsZWN0Jykge1xuICAgICAgICBzZWxlY3RWYWx1ZSA9IFJlYWN0RE9NU2VsZWN0LmdldFNlbGVjdFZhbHVlQ29udGV4dChzZWxlY3RQYXJlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBudWxsIChlLmcuLCBubyBzcGVjaWZpZWQgdmFsdWUgb3IgYWZ0ZXIgaW5pdGlhbCBtb3VudClcbiAgICAvLyBvciBtaXNzaW5nIChlLmcuLCBmb3IgPGRhdGFsaXN0PiksIHdlIGRvbid0IGNoYW5nZSBwcm9wcy5zZWxlY3RlZFxuICAgIHZhciBzZWxlY3RlZCA9IG51bGw7XG4gICAgaWYgKHNlbGVjdFZhbHVlICE9IG51bGwpIHtcbiAgICAgIHZhciB2YWx1ZTtcbiAgICAgIGlmIChwcm9wcy52YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHZhbHVlID0gcHJvcHMudmFsdWUgKyAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gZmxhdHRlbkNoaWxkcmVuKHByb3BzLmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICAgIHNlbGVjdGVkID0gZmFsc2U7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3RWYWx1ZSkpIHtcbiAgICAgICAgLy8gbXVsdGlwbGVcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICgnJyArIHNlbGVjdFZhbHVlW2ldID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZCA9ICcnICsgc2VsZWN0VmFsdWUgPT09IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGluc3QuX3dyYXBwZXJTdGF0ZSA9IHsgc2VsZWN0ZWQ6IHNlbGVjdGVkIH07XG4gIH0sXG5cbiAgcG9zdE1vdW50V3JhcHBlcjogZnVuY3Rpb24gKGluc3QpIHtcbiAgICAvLyB2YWx1ZT1cIlwiIHNob3VsZCBtYWtlIGEgdmFsdWUgYXR0cmlidXRlICgjNjIxOSlcbiAgICB2YXIgcHJvcHMgPSBpbnN0Ll9jdXJyZW50RWxlbWVudC5wcm9wcztcbiAgICBpZiAocHJvcHMudmFsdWUgIT0gbnVsbCkge1xuICAgICAgdmFyIG5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCd2YWx1ZScsIHByb3BzLnZhbHVlKTtcbiAgICB9XG4gIH0sXG5cbiAgZ2V0SG9zdFByb3BzOiBmdW5jdGlvbiAoaW5zdCwgcHJvcHMpIHtcbiAgICB2YXIgaG9zdFByb3BzID0gX2Fzc2lnbih7IHNlbGVjdGVkOiB1bmRlZmluZWQsIGNoaWxkcmVuOiB1bmRlZmluZWQgfSwgcHJvcHMpO1xuXG4gICAgLy8gUmVhZCBzdGF0ZSBvbmx5IGZyb20gaW5pdGlhbCBtb3VudCBiZWNhdXNlIDxzZWxlY3Q+IHVwZGF0ZXMgdmFsdWVcbiAgICAvLyBtYW51YWxseTsgd2UgbmVlZCB0aGUgaW5pdGlhbCBzdGF0ZSBvbmx5IGZvciBzZXJ2ZXIgcmVuZGVyaW5nXG4gICAgaWYgKGluc3QuX3dyYXBwZXJTdGF0ZS5zZWxlY3RlZCAhPSBudWxsKSB7XG4gICAgICBob3N0UHJvcHMuc2VsZWN0ZWQgPSBpbnN0Ll93cmFwcGVyU3RhdGUuc2VsZWN0ZWQ7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRlbnQgPSBmbGF0dGVuQ2hpbGRyZW4ocHJvcHMuY2hpbGRyZW4pO1xuXG4gICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgIGhvc3RQcm9wcy5jaGlsZHJlbiA9IGNvbnRlbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhvc3RQcm9wcztcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTU9wdGlvbjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpLFxuICAgIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBMaW5rZWRWYWx1ZVV0aWxzID0gcmVxdWlyZSgnLi9MaW5rZWRWYWx1ZVV0aWxzJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIGRpZFdhcm5WYWx1ZUxpbmsgPSBmYWxzZTtcbnZhciBkaWRXYXJuVmFsRGVmYXVsdFZhbCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBmb3JjZVVwZGF0ZUlmTW91bnRlZCgpIHtcbiAgaWYgKHRoaXMuX3Jvb3ROb2RlSUQpIHtcbiAgICAvLyBET00gY29tcG9uZW50IGlzIHN0aWxsIG1vdW50ZWQ7IHVwZGF0ZVxuICAgIFJlYWN0RE9NVGV4dGFyZWEudXBkYXRlV3JhcHBlcih0aGlzKTtcbiAgfVxufVxuXG4vKipcbiAqIEltcGxlbWVudHMgYSA8dGV4dGFyZWE+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIHNldHRpbmcgYHZhbHVlYCwgYW5kXG4gKiBgZGVmYXVsdFZhbHVlYC4gVGhpcyBkaWZmZXJzIGZyb20gdGhlIHRyYWRpdGlvbmFsIERPTSBBUEkgYmVjYXVzZSB2YWx1ZSBpc1xuICogdXN1YWxseSBzZXQgYXMgUENEQVRBIGNoaWxkcmVuLlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0aGF0IGFmZmVjdCB0aGVcbiAqIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsXG4gKiBub3QgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LiBJbnN0ZWFkLCB0aGUgYHZhbHVlYCBwcm9wIG11c3QgY2hhbmdlIGluXG4gKiBvcmRlciBmb3IgdGhlIHJlbmRlcmVkIGVsZW1lbnQgdG8gYmUgdXBkYXRlZC5cbiAqXG4gKiBUaGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggYW4gZW1wdHkgdmFsdWUsIHRoZSBwcm9wXG4gKiBgZGVmYXVsdFZhbHVlYCBpZiBzcGVjaWZpZWQsIG9yIHRoZSBjaGlsZHJlbiBjb250ZW50IChkZXByZWNhdGVkKS5cbiAqL1xudmFyIFJlYWN0RE9NVGV4dGFyZWEgPSB7XG4gIGdldEhvc3RQcm9wczogZnVuY3Rpb24gKGluc3QsIHByb3BzKSB7XG4gICAgIShwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgIGRvZXMgbm90IG1ha2Ugc2Vuc2Ugb24gPHRleHRhcmVhPi4nKSA6IF9wcm9kSW52YXJpYW50KCc5MScpIDogdm9pZCAwO1xuXG4gICAgLy8gQWx3YXlzIHNldCBjaGlsZHJlbiB0byB0aGUgc2FtZSB0aGluZy4gSW4gSUU5LCB0aGUgc2VsZWN0aW9uIHJhbmdlIHdpbGxcbiAgICAvLyBnZXQgcmVzZXQgaWYgYHRleHRDb250ZW50YCBpcyBtdXRhdGVkLiAgV2UgY291bGQgYWRkIGEgY2hlY2sgaW4gc2V0VGV4dENvbnRlbnRcbiAgICAvLyB0byBvbmx5IHNldCB0aGUgdmFsdWUgaWYvd2hlbiB0aGUgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBub2RlIHZhbHVlICh3aGljaCB3b3VsZFxuICAgIC8vIGNvbXBsZXRlbHkgc29sdmUgdGhpcyBJRTkgYnVnKSwgYnV0IFNlYmFzdGlhbitCZW4gc2VlbWVkIHRvIGxpa2UgdGhpcyBzb2x1dGlvbi5cbiAgICAvLyBUaGUgdmFsdWUgY2FuIGJlIGEgYm9vbGVhbiBvciBvYmplY3Qgc28gdGhhdCdzIHdoeSBpdCdzIGZvcmNlZCB0byBiZSBhIHN0cmluZy5cbiAgICB2YXIgaG9zdFByb3BzID0gX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgIGNoaWxkcmVuOiAnJyArIGluc3QuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUsXG4gICAgICBvbkNoYW5nZTogaW5zdC5fd3JhcHBlclN0YXRlLm9uQ2hhbmdlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaG9zdFByb3BzO1xuICB9LFxuXG4gIG1vdW50V3JhcHBlcjogZnVuY3Rpb24gKGluc3QsIHByb3BzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIExpbmtlZFZhbHVlVXRpbHMuY2hlY2tQcm9wVHlwZXMoJ3RleHRhcmVhJywgcHJvcHMsIGluc3QuX2N1cnJlbnRFbGVtZW50Ll9vd25lcik7XG4gICAgICBpZiAocHJvcHMudmFsdWVMaW5rICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZUxpbmspIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdgdmFsdWVMaW5rYCBwcm9wIG9uIGB0ZXh0YXJlYWAgaXMgZGVwcmVjYXRlZDsgc2V0IGB2YWx1ZWAgYW5kIGBvbkNoYW5nZWAgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgICAgICAgZGlkV2FyblZhbHVlTGluayA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbERlZmF1bHRWYWwpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdUZXh0YXJlYSBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgdGV4dGFyZWEgJyArICdhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vZmIubWUvcmVhY3QtY29udHJvbGxlZC1jb21wb25lbnRzJykgOiB2b2lkIDA7XG4gICAgICAgIGRpZFdhcm5WYWxEZWZhdWx0VmFsID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTtcbiAgICB2YXIgaW5pdGlhbFZhbHVlID0gdmFsdWU7XG5cbiAgICAvLyBPbmx5IGJvdGhlciBmZXRjaGluZyBkZWZhdWx0IHZhbHVlIGlmIHdlJ3JlIGdvaW5nIHRvIHVzZSBpdFxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICB2YXIgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlO1xuICAgICAgLy8gVE9ETyAoeXVuZ3N0ZXJzKTogUmVtb3ZlIHN1cHBvcnQgZm9yIGNoaWxkcmVuIGNvbnRlbnQgaW4gPHRleHRhcmVhPi5cbiAgICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1VzZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBpbnN0ZWFkIG9mIHNldHRpbmcgJyArICdjaGlsZHJlbiBvbiA8dGV4dGFyZWE+LicpIDogdm9pZCAwO1xuICAgICAgICB9XG4gICAgICAgICEoZGVmYXVsdFZhbHVlID09IG51bGwpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0lmIHlvdSBzdXBwbHkgYGRlZmF1bHRWYWx1ZWAgb24gYSA8dGV4dGFyZWE+LCBkbyBub3QgcGFzcyBjaGlsZHJlbi4nKSA6IF9wcm9kSW52YXJpYW50KCc5MicpIDogdm9pZCAwO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgICAhKGNoaWxkcmVuLmxlbmd0aCA8PSAxKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICc8dGV4dGFyZWE+IGNhbiBvbmx5IGhhdmUgYXQgbW9zdCBvbmUgY2hpbGQuJykgOiBfcHJvZEludmFyaWFudCgnOTMnKSA6IHZvaWQgMDtcbiAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdFZhbHVlID0gJycgKyBjaGlsZHJlbjtcbiAgICAgIH1cbiAgICAgIGlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkge1xuICAgICAgICBkZWZhdWx0VmFsdWUgPSAnJztcbiAgICAgIH1cbiAgICAgIGluaXRpYWxWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICBpbnN0Ll93cmFwcGVyU3RhdGUgPSB7XG4gICAgICBpbml0aWFsVmFsdWU6ICcnICsgaW5pdGlhbFZhbHVlLFxuICAgICAgbGlzdGVuZXJzOiBudWxsLFxuICAgICAgb25DaGFuZ2U6IF9oYW5kbGVDaGFuZ2UuYmluZChpbnN0KVxuICAgIH07XG4gIH0sXG5cbiAgdXBkYXRlV3JhcHBlcjogZnVuY3Rpb24gKGluc3QpIHtcbiAgICB2YXIgcHJvcHMgPSBpbnN0Ll9jdXJyZW50RWxlbWVudC5wcm9wcztcblxuICAgIHZhciBub2RlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCk7XG4gICAgdmFyIHZhbHVlID0gTGlua2VkVmFsdWVVdGlscy5nZXRWYWx1ZShwcm9wcyk7XG4gICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIC8vIENhc3QgYHZhbHVlYCB0byBhIHN0cmluZyB0byBlbnN1cmUgdGhlIHZhbHVlIGlzIHNldCBjb3JyZWN0bHkuIFdoaWxlXG4gICAgICAvLyBicm93c2VycyB0eXBpY2FsbHkgZG8gdGhpcyBhcyBuZWNlc3NhcnksIGpzZG9tIGRvZXNuJ3QuXG4gICAgICB2YXIgbmV3VmFsdWUgPSAnJyArIHZhbHVlO1xuXG4gICAgICAvLyBUbyBhdm9pZCBzaWRlIGVmZmVjdHMgKHN1Y2ggYXMgbG9zaW5nIHRleHQgc2VsZWN0aW9uKSwgb25seSBzZXQgdmFsdWUgaWYgY2hhbmdlZFxuICAgICAgaWYgKG5ld1ZhbHVlICE9PSBub2RlLnZhbHVlKSB7XG4gICAgICAgIG5vZGUudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgPT0gbnVsbCkge1xuICAgICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlICE9IG51bGwpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgfSxcblxuICBwb3N0TW91bnRXcmFwcGVyOiBmdW5jdGlvbiAoaW5zdCkge1xuICAgIC8vIFRoaXMgaXMgaW4gcG9zdE1vdW50IGJlY2F1c2Ugd2UgbmVlZCBhY2Nlc3MgdG8gdGhlIERPTSBub2RlLCB3aGljaCBpcyBub3RcbiAgICAvLyBhdmFpbGFibGUgdW50aWwgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgbW91bnRlZC5cbiAgICB2YXIgbm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpO1xuICAgIHZhciB0ZXh0Q29udGVudCA9IG5vZGUudGV4dENvbnRlbnQ7XG5cbiAgICAvLyBPbmx5IHNldCBub2RlLnZhbHVlIGlmIHRleHRDb250ZW50IGlzIGVxdWFsIHRvIHRoZSBleHBlY3RlZFxuICAgIC8vIGluaXRpYWwgdmFsdWUuIEluIElFMTAvSUUxMSB0aGVyZSBpcyBhIGJ1ZyB3aGVyZSB0aGUgcGxhY2Vob2xkZXIgYXR0cmlidXRlXG4gICAgLy8gd2lsbCBwb3B1bGF0ZSB0ZXh0Q29udGVudCBhcyB3ZWxsLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzEwMTUyNS9cbiAgICBpZiAodGV4dENvbnRlbnQgPT09IGluc3QuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpIHtcbiAgICAgIG5vZGUudmFsdWUgPSB0ZXh0Q29udGVudDtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIF9oYW5kbGVDaGFuZ2UoZXZlbnQpIHtcbiAgdmFyIHByb3BzID0gdGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7XG4gIHZhciByZXR1cm5WYWx1ZSA9IExpbmtlZFZhbHVlVXRpbHMuZXhlY3V0ZU9uQ2hhbmdlKHByb3BzLCBldmVudCk7XG4gIFJlYWN0VXBkYXRlcy5hc2FwKGZvcmNlVXBkYXRlSWZNb3VudGVkLCB0aGlzKTtcbiAgcmV0dXJuIHJldHVyblZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NVGV4dGFyZWE7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbnZhciBpbmplY3RlZCA9IGZhbHNlO1xuXG52YXIgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCA9IHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgaW5qZWN0YWJsZSBob29rIGZvciBzd2FwcGluZyBvdXQgbW91bnQgaW1hZ2VzIGluIHRoZSBtaWRkbGUgb2ZcbiAgICogdGhlIHRyZWUuXG4gICAqL1xuICByZXBsYWNlTm9kZVdpdGhNYXJrdXA6IG51bGwsXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgaW5qZWN0YWJsZSBob29rIGZvciBwcm9jZXNzaW5nIGEgcXVldWUgb2YgY2hpbGQgdXBkYXRlcy4gV2lsbFxuICAgKiBsYXRlciBtb3ZlIGludG8gTXVsdGlDaGlsZENvbXBvbmVudHMuXG4gICAqL1xuICBwcm9jZXNzQ2hpbGRyZW5VcGRhdGVzOiBudWxsLFxuXG4gIGluamVjdGlvbjoge1xuICAgIGluamVjdEVudmlyb25tZW50OiBmdW5jdGlvbiAoZW52aXJvbm1lbnQpIHtcbiAgICAgICEhaW5qZWN0ZWQgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQ6IGluamVjdEVudmlyb25tZW50KCkgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuJykgOiBfcHJvZEludmFyaWFudCgnMTA0JykgOiB2b2lkIDA7XG4gICAgICBSZWFjdENvbXBvbmVudEVudmlyb25tZW50LnJlcGxhY2VOb2RlV2l0aE1hcmt1cCA9IGVudmlyb25tZW50LnJlcGxhY2VOb2RlV2l0aE1hcmt1cDtcbiAgICAgIFJlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQucHJvY2Vzc0NoaWxkcmVuVXBkYXRlcyA9IGVudmlyb25tZW50LnByb2Nlc3NDaGlsZHJlblVwZGF0ZXM7XG4gICAgICBpbmplY3RlZCA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBgUmVhY3RJbnN0YW5jZU1hcGAgbWFpbnRhaW5zIGEgbWFwcGluZyBmcm9tIGEgcHVibGljIGZhY2luZyBzdGF0ZWZ1bFxuICogaW5zdGFuY2UgKGtleSkgYW5kIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAodmFsdWUpLiBUaGlzIGFsbG93cyBwdWJsaWNcbiAqIG1ldGhvZHMgdG8gYWNjZXB0IHRoZSB1c2VyIGZhY2luZyBpbnN0YW5jZSBhcyBhbiBhcmd1bWVudCBhbmQgbWFwIHRoZW0gYmFja1xuICogdG8gaW50ZXJuYWwgbWV0aG9kcy5cbiAqL1xuXG4vLyBUT0RPOiBSZXBsYWNlIHRoaXMgd2l0aCBFUzY6IHZhciBSZWFjdEluc3RhbmNlTWFwID0gbmV3IE1hcCgpO1xuXG52YXIgUmVhY3RJbnN0YW5jZU1hcCA9IHtcbiAgLyoqXG4gICAqIFRoaXMgQVBJIHNob3VsZCBiZSBjYWxsZWQgYGRlbGV0ZWAgYnV0IHdlJ2QgaGF2ZSB0byBtYWtlIHN1cmUgdG8gYWx3YXlzXG4gICAqIHRyYW5zZm9ybSB0aGVzZSB0byBzdHJpbmdzIGZvciBJRSBzdXBwb3J0LiBXaGVuIHRoaXMgdHJhbnNmb3JtIGlzIGZ1bGx5XG4gICAqIHN1cHBvcnRlZCB3ZSBjYW4gcmVuYW1lIGl0LlxuICAgKi9cbiAgcmVtb3ZlOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAga2V5Ll9yZWFjdEludGVybmFsSW5zdGFuY2UgPSB1bmRlZmluZWQ7XG4gIH0sXG5cbiAgZ2V0OiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIGtleS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlO1xuICB9LFxuXG4gIGhhczogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBrZXkuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSAhPT0gdW5kZWZpbmVkO1xuICB9LFxuXG4gIHNldDogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICBrZXkuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSA9IHZhbHVlO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0SW5zdGFuY2VNYXA7IiwiZXhwb3J0IGRlZmF1bHQgdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6XG4gICAgICAgICAgICB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOlxuICAgICAgICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbi8vIGJhc2VkIG9mZiBodHRwczovL2dpdGh1Yi5jb20vZGVmdW5jdHpvbWJpZS9ub2RlLXByb2Nlc3MvYmxvYi9tYXN0ZXIvYnJvd3Nlci5qc1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbnZhciBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuaWYgKHR5cGVvZiBnbG9iYWwuc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xufVxuaWYgKHR5cGVvZiBnbG9iYWwuY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xufVxuXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5leHBvcnQgZnVuY3Rpb24gbmV4dFRpY2soZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn1cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5leHBvcnQgdmFyIHRpdGxlID0gJ2Jyb3dzZXInO1xuZXhwb3J0IHZhciBwbGF0Zm9ybSA9ICdicm93c2VyJztcbmV4cG9ydCB2YXIgYnJvd3NlciA9IHRydWU7XG5leHBvcnQgdmFyIGVudiA9IHt9O1xuZXhwb3J0IHZhciBhcmd2ID0gW107XG5leHBvcnQgdmFyIHZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbmV4cG9ydCB2YXIgdmVyc2lvbnMgPSB7fTtcbmV4cG9ydCB2YXIgcmVsZWFzZSA9IHt9O1xuZXhwb3J0IHZhciBjb25maWcgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbmV4cG9ydCB2YXIgb24gPSBub29wO1xuZXhwb3J0IHZhciBhZGRMaXN0ZW5lciA9IG5vb3A7XG5leHBvcnQgdmFyIG9uY2UgPSBub29wO1xuZXhwb3J0IHZhciBvZmYgPSBub29wO1xuZXhwb3J0IHZhciByZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5leHBvcnQgdmFyIHJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5leHBvcnQgdmFyIGVtaXQgPSBub29wO1xuXG5leHBvcnQgZnVuY3Rpb24gYmluZGluZyhuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3dkICgpIHsgcmV0dXJuICcvJyB9XG5leHBvcnQgZnVuY3Rpb24gY2hkaXIgKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIHVtYXNrKCkgeyByZXR1cm4gMDsgfVxuXG4vLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9rdW1hdmlzL2Jyb3dzZXItcHJvY2Vzcy1ocnRpbWUvYmxvYi9tYXN0ZXIvaW5kZXguanNcbnZhciBwZXJmb3JtYW5jZSA9IGdsb2JhbC5wZXJmb3JtYW5jZSB8fCB7fVxudmFyIHBlcmZvcm1hbmNlTm93ID1cbiAgcGVyZm9ybWFuY2Uubm93ICAgICAgICB8fFxuICBwZXJmb3JtYW5jZS5tb3pOb3cgICAgIHx8XG4gIHBlcmZvcm1hbmNlLm1zTm93ICAgICAgfHxcbiAgcGVyZm9ybWFuY2Uub05vdyAgICAgICB8fFxuICBwZXJmb3JtYW5jZS53ZWJraXROb3cgIHx8XG4gIGZ1bmN0aW9uKCl7IHJldHVybiAobmV3IERhdGUoKSkuZ2V0VGltZSgpIH1cblxuLy8gZ2VuZXJhdGUgdGltZXN0YW1wIG9yIGRlbHRhXG4vLyBzZWUgaHR0cDovL25vZGVqcy5vcmcvYXBpL3Byb2Nlc3MuaHRtbCNwcm9jZXNzX3Byb2Nlc3NfaHJ0aW1lXG5leHBvcnQgZnVuY3Rpb24gaHJ0aW1lKHByZXZpb3VzVGltZXN0YW1wKXtcbiAgdmFyIGNsb2NrdGltZSA9IHBlcmZvcm1hbmNlTm93LmNhbGwocGVyZm9ybWFuY2UpKjFlLTNcbiAgdmFyIHNlY29uZHMgPSBNYXRoLmZsb29yKGNsb2NrdGltZSlcbiAgdmFyIG5hbm9zZWNvbmRzID0gTWF0aC5mbG9vcigoY2xvY2t0aW1lJTEpKjFlOSlcbiAgaWYgKHByZXZpb3VzVGltZXN0YW1wKSB7XG4gICAgc2Vjb25kcyA9IHNlY29uZHMgLSBwcmV2aW91c1RpbWVzdGFtcFswXVxuICAgIG5hbm9zZWNvbmRzID0gbmFub3NlY29uZHMgLSBwcmV2aW91c1RpbWVzdGFtcFsxXVxuICAgIGlmIChuYW5vc2Vjb25kczwwKSB7XG4gICAgICBzZWNvbmRzLS1cbiAgICAgIG5hbm9zZWNvbmRzICs9IDFlOVxuICAgIH1cbiAgfVxuICByZXR1cm4gW3NlY29uZHMsbmFub3NlY29uZHNdXG59XG5cbnZhciBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xuZXhwb3J0IGZ1bmN0aW9uIHVwdGltZSgpIHtcbiAgdmFyIGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKTtcbiAgdmFyIGRpZiA9IGN1cnJlbnRUaW1lIC0gc3RhcnRUaW1lO1xuICByZXR1cm4gZGlmIC8gMTAwMDtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuZXh0VGljazogbmV4dFRpY2ssXG4gIHRpdGxlOiB0aXRsZSxcbiAgYnJvd3NlcjogYnJvd3NlcixcbiAgZW52OiBlbnYsXG4gIGFyZ3Y6IGFyZ3YsXG4gIHZlcnNpb246IHZlcnNpb24sXG4gIHZlcnNpb25zOiB2ZXJzaW9ucyxcbiAgb246IG9uLFxuICBhZGRMaXN0ZW5lcjogYWRkTGlzdGVuZXIsXG4gIG9uY2U6IG9uY2UsXG4gIG9mZjogb2ZmLFxuICByZW1vdmVMaXN0ZW5lcjogcmVtb3ZlTGlzdGVuZXIsXG4gIHJlbW92ZUFsbExpc3RlbmVyczogcmVtb3ZlQWxsTGlzdGVuZXJzLFxuICBlbWl0OiBlbWl0LFxuICBiaW5kaW5nOiBiaW5kaW5nLFxuICBjd2Q6IGN3ZCxcbiAgY2hkaXI6IGNoZGlyLFxuICB1bWFzazogdW1hc2ssXG4gIGhydGltZTogaHJ0aW1lLFxuICBwbGF0Zm9ybTogcGxhdGZvcm0sXG4gIHJlbGVhc2U6IHJlbGVhc2UsXG4gIGNvbmZpZzogY29uZmlnLFxuICB1cHRpbWU6IHVwdGltZVxufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0Tm9kZVR5cGVzID0ge1xuICBIT1NUOiAwLFxuICBDT01QT1NJVEU6IDEsXG4gIEVNUFRZOiAyLFxuXG4gIGdldFR5cGU6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBSZWFjdE5vZGVUeXBlcy5FTVBUWTtcbiAgICB9IGVsc2UgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XG4gICAgICBpZiAodHlwZW9mIG5vZGUudHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gUmVhY3ROb2RlVHlwZXMuQ09NUE9TSVRFO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFJlYWN0Tm9kZVR5cGVzLkhPU1Q7XG4gICAgICB9XG4gICAgfVxuICAgICFmYWxzZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdVbmV4cGVjdGVkIG5vZGU6ICVzJywgbm9kZSkgOiBfcHJvZEludmFyaWFudCgnMjYnLCBub2RlKSA6IHZvaWQgMDtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdE5vZGVUeXBlczsiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHR5cGVjaGVja3NcbiAqIFxuICovXG5cbi8qZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAqL1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICAvLyBTYW1lVmFsdWUgYWxnb3JpdGhtXG4gIGlmICh4ID09PSB5KSB7XG4gICAgLy8gU3RlcHMgMS01LCA3LTEwXG4gICAgLy8gU3RlcHMgNi5iLTYuZTogKzAgIT0gLTBcbiAgICAvLyBBZGRlZCB0aGUgbm9uemVybyB5IGNoZWNrIHRvIG1ha2UgRmxvdyBoYXBweSwgYnV0IGl0IGlzIHJlZHVuZGFudFxuICAgIHJldHVybiB4ICE9PSAwIHx8IHkgIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICB9IGVsc2Uge1xuICAgIC8vIFN0ZXAgNi5hOiBOYU4gPT0gTmFOXG4gICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgfVxufVxuXG4vKipcbiAqIFBlcmZvcm1zIGVxdWFsaXR5IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGtleXMgb24gYW4gb2JqZWN0IGFuZCByZXR1cm5pbmcgZmFsc2VcbiAqIHdoZW4gYW55IGtleSBoYXMgdmFsdWVzIHdoaWNoIGFyZSBub3Qgc3RyaWN0bHkgZXF1YWwgYmV0d2VlbiB0aGUgYXJndW1lbnRzLlxuICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHZhbHVlcyBvZiBhbGwga2V5cyBhcmUgc3RyaWN0bHkgZXF1YWwuXG4gKi9cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gIGlmIChpcyhvYmpBLCBvYmpCKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSAnb2JqZWN0JyB8fCBvYmpBID09PSBudWxsIHx8IHR5cGVvZiBvYmpCICE9PSAnb2JqZWN0JyB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRlc3QgZm9yIEEncyBrZXlzIGRpZmZlcmVudCBmcm9tIEIuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5c0EubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwob2JqQiwga2V5c0FbaV0pIHx8ICFpcyhvYmpBW2tleXNBW2ldXSwgb2JqQltrZXlzQVtpXV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hhbGxvd0VxdWFsOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogR2l2ZW4gYSBgcHJldkVsZW1lbnRgIGFuZCBgbmV4dEVsZW1lbnRgLCBkZXRlcm1pbmVzIGlmIHRoZSBleGlzdGluZ1xuICogaW5zdGFuY2Ugc2hvdWxkIGJlIHVwZGF0ZWQgYXMgb3Bwb3NlZCB0byBiZWluZyBkZXN0cm95ZWQgb3IgcmVwbGFjZWQgYnkgYSBuZXdcbiAqIGluc3RhbmNlLiBCb3RoIGFyZ3VtZW50cyBhcmUgZWxlbWVudHMuIFRoaXMgZW5zdXJlcyB0aGF0IHRoaXMgbG9naWMgY2FuXG4gKiBvcGVyYXRlIG9uIHN0YXRlbGVzcyB0cmVlcyB3aXRob3V0IGFueSBiYWNraW5nIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSB7P29iamVjdH0gcHJldkVsZW1lbnRcbiAqIEBwYXJhbSB7P29iamVjdH0gbmV4dEVsZW1lbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGV4aXN0aW5nIGluc3RhbmNlIHNob3VsZCBiZSB1cGRhdGVkLlxuICogQHByb3RlY3RlZFxuICovXG5cbmZ1bmN0aW9uIHNob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50KHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCkge1xuICB2YXIgcHJldkVtcHR5ID0gcHJldkVsZW1lbnQgPT09IG51bGwgfHwgcHJldkVsZW1lbnQgPT09IGZhbHNlO1xuICB2YXIgbmV4dEVtcHR5ID0gbmV4dEVsZW1lbnQgPT09IG51bGwgfHwgbmV4dEVsZW1lbnQgPT09IGZhbHNlO1xuICBpZiAocHJldkVtcHR5IHx8IG5leHRFbXB0eSkge1xuICAgIHJldHVybiBwcmV2RW1wdHkgPT09IG5leHRFbXB0eTtcbiAgfVxuXG4gIHZhciBwcmV2VHlwZSA9IHR5cGVvZiBwcmV2RWxlbWVudDtcbiAgdmFyIG5leHRUeXBlID0gdHlwZW9mIG5leHRFbGVtZW50O1xuICBpZiAocHJldlR5cGUgPT09ICdzdHJpbmcnIHx8IHByZXZUeXBlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBuZXh0VHlwZSA9PT0gJ3N0cmluZycgfHwgbmV4dFR5cGUgPT09ICdudW1iZXInO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgcHJldkVsZW1lbnQudHlwZSA9PT0gbmV4dEVsZW1lbnQudHlwZSAmJiBwcmV2RWxlbWVudC5rZXkgPT09IG5leHRFbGVtZW50LmtleTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50JyksXG4gICAgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Jyk7XG52YXIgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCA9IHJlcXVpcmUoJy4vUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCcpO1xudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q3VycmVudE93bmVyJyk7XG52YXIgUmVhY3RFcnJvclV0aWxzID0gcmVxdWlyZSgnLi9SZWFjdEVycm9yVXRpbHMnKTtcbnZhciBSZWFjdEluc3RhbmNlTWFwID0gcmVxdWlyZSgnLi9SZWFjdEluc3RhbmNlTWFwJyk7XG52YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSByZXF1aXJlKCcuL1JlYWN0SW5zdHJ1bWVudGF0aW9uJyk7XG52YXIgUmVhY3ROb2RlVHlwZXMgPSByZXF1aXJlKCcuL1JlYWN0Tm9kZVR5cGVzJyk7XG52YXIgUmVhY3RSZWNvbmNpbGVyID0gcmVxdWlyZSgnLi9SZWFjdFJlY29uY2lsZXInKTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIGNoZWNrUmVhY3RUeXBlU3BlYyA9IHJlcXVpcmUoJy4vY2hlY2tSZWFjdFR5cGVTcGVjJyk7XG59XG5cbnZhciBlbXB0eU9iamVjdCA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5T2JqZWN0Jyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgc2hhbGxvd0VxdWFsID0gcmVxdWlyZSgnZmJqcy9saWIvc2hhbGxvd0VxdWFsJyk7XG52YXIgc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQgPSByZXF1aXJlKCcuL3Nob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIENvbXBvc2l0ZVR5cGVzID0ge1xuICBJbXB1cmVDbGFzczogMCxcbiAgUHVyZUNsYXNzOiAxLFxuICBTdGF0ZWxlc3NGdW5jdGlvbmFsOiAyXG59O1xuXG5mdW5jdGlvbiBTdGF0ZWxlc3NDb21wb25lbnQoQ29tcG9uZW50KSB7fVxuU3RhdGVsZXNzQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBDb21wb25lbnQgPSBSZWFjdEluc3RhbmNlTWFwLmdldCh0aGlzKS5fY3VycmVudEVsZW1lbnQudHlwZTtcbiAgdmFyIGVsZW1lbnQgPSBDb21wb25lbnQodGhpcy5wcm9wcywgdGhpcy5jb250ZXh0LCB0aGlzLnVwZGF0ZXIpO1xuICB3YXJuSWZJbnZhbGlkRWxlbWVudChDb21wb25lbnQsIGVsZW1lbnQpO1xuICByZXR1cm4gZWxlbWVudDtcbn07XG5cbmZ1bmN0aW9uIHdhcm5JZkludmFsaWRFbGVtZW50KENvbXBvbmVudCwgZWxlbWVudCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGVsZW1lbnQgPT09IG51bGwgfHwgZWxlbWVudCA9PT0gZmFsc2UgfHwgUmVhY3QuaXNWYWxpZEVsZW1lbnQoZWxlbWVudCksICclcyguLi4pOiBBIHZhbGlkIFJlYWN0IGVsZW1lbnQgKG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQuIFlvdSBtYXkgaGF2ZSAnICsgJ3JldHVybmVkIHVuZGVmaW5lZCwgYW4gYXJyYXkgb3Igc29tZSBvdGhlciBpbnZhbGlkIG9iamVjdC4nLCBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFDb21wb25lbnQuY2hpbGRDb250ZXh0VHlwZXMsICclcyguLi4pOiBjaGlsZENvbnRleHRUeXBlcyBjYW5ub3QgYmUgZGVmaW5lZCBvbiBhIGZ1bmN0aW9uYWwgY29tcG9uZW50LicsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JykgOiB2b2lkIDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkge1xuICByZXR1cm4gISEoQ29tcG9uZW50LnByb3RvdHlwZSAmJiBDb21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBpc1B1cmVDb21wb25lbnQoQ29tcG9uZW50KSB7XG4gIHJldHVybiAhIShDb21wb25lbnQucHJvdG90eXBlICYmIENvbXBvbmVudC5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQpO1xufVxuXG4vLyBTZXBhcmF0ZWQgaW50byBhIGZ1bmN0aW9uIHRvIGNvbnRhaW4gZGVvcHRpbWl6YXRpb25zIGNhdXNlZCBieSB0cnkvZmluYWxseS5cbmZ1bmN0aW9uIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZuLCBkZWJ1Z0lELCB0aW1lclR5cGUpIHtcbiAgaWYgKGRlYnVnSUQgPT09IDApIHtcbiAgICAvLyBUb3AtbGV2ZWwgd3JhcHBlcnMgKHNlZSBSZWFjdE1vdW50KSBhbmQgZW1wdHkgY29tcG9uZW50cyAoc2VlXG4gICAgLy8gUmVhY3RET01FbXB0eUNvbXBvbmVudCkgYXJlIGludmlzaWJsZSB0byBob29rcyBhbmQgZGV2dG9vbHMuXG4gICAgLy8gQm90aCBhcmUgaW1wbGVtZW50YXRpb24gZGV0YWlscyB0aGF0IHNob3VsZCBnbyBhd2F5IGluIHRoZSBmdXR1cmUuXG4gICAgcmV0dXJuIGZuKCk7XG4gIH1cblxuICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWdpbkxpZmVDeWNsZVRpbWVyKGRlYnVnSUQsIHRpbWVyVHlwZSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uRW5kTGlmZUN5Y2xlVGltZXIoZGVidWdJRCwgdGltZXJUeXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLSBUaGUgTGlmZS1DeWNsZSBvZiBhIENvbXBvc2l0ZSBDb21wb25lbnQgLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogLSBjb25zdHJ1Y3RvcjogSW5pdGlhbGl6YXRpb24gb2Ygc3RhdGUuIFRoZSBpbnN0YW5jZSBpcyBub3cgcmV0YWluZWQuXG4gKiAgIC0gY29tcG9uZW50V2lsbE1vdW50XG4gKiAgIC0gcmVuZGVyXG4gKiAgIC0gW2NoaWxkcmVuJ3MgY29uc3RydWN0b3JzXVxuICogICAgIC0gW2NoaWxkcmVuJ3MgY29tcG9uZW50V2lsbE1vdW50IGFuZCByZW5kZXJdXG4gKiAgICAgLSBbY2hpbGRyZW4ncyBjb21wb25lbnREaWRNb3VudF1cbiAqICAgICAtIGNvbXBvbmVudERpZE1vdW50XG4gKlxuICogICAgICAgVXBkYXRlIFBoYXNlczpcbiAqICAgICAgIC0gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAob25seSBjYWxsZWQgaWYgcGFyZW50IHVwZGF0ZWQpXG4gKiAgICAgICAtIHNob3VsZENvbXBvbmVudFVwZGF0ZVxuICogICAgICAgICAtIGNvbXBvbmVudFdpbGxVcGRhdGVcbiAqICAgICAgICAgICAtIHJlbmRlclxuICogICAgICAgICAgIC0gW2NoaWxkcmVuJ3MgY29uc3RydWN0b3JzIG9yIHJlY2VpdmUgcHJvcHMgcGhhc2VzXVxuICogICAgICAgICAtIGNvbXBvbmVudERpZFVwZGF0ZVxuICpcbiAqICAgICAtIGNvbXBvbmVudFdpbGxVbm1vdW50XG4gKiAgICAgLSBbY2hpbGRyZW4ncyBjb21wb25lbnRXaWxsVW5tb3VudF1cbiAqICAgLSBbY2hpbGRyZW4gZGVzdHJveWVkXVxuICogLSAoZGVzdHJveWVkKTogVGhlIGluc3RhbmNlIGlzIG5vdyBibGFuaywgcmVsZWFzZWQgYnkgUmVhY3QgYW5kIHJlYWR5IGZvciBHQy5cbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbi8qKlxuICogQW4gaW5jcmVtZW50aW5nIElEIGFzc2lnbmVkIHRvIGVhY2ggY29tcG9uZW50IHdoZW4gaXQgaXMgbW91bnRlZC4gVGhpcyBpc1xuICogdXNlZCB0byBlbmZvcmNlIHRoZSBvcmRlciBpbiB3aGljaCBgUmVhY3RVcGRhdGVzYCB1cGRhdGVzIGRpcnR5IGNvbXBvbmVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xudmFyIG5leHRNb3VudElEID0gMTtcblxuLyoqXG4gKiBAbGVuZHMge1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50LnByb3RvdHlwZX1cbiAqL1xudmFyIFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50ID0ge1xuICAvKipcbiAgICogQmFzZSBjb25zdHJ1Y3RvciBmb3IgYWxsIGNvbXBvc2l0ZSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50XG4gICAqIEBmaW5hbFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGNvbnN0cnVjdDogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5fcm9vdE5vZGVJRCA9IDA7XG4gICAgdGhpcy5fY29tcG9zaXRlVHlwZSA9IG51bGw7XG4gICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgIHRoaXMuX2hvc3RQYXJlbnQgPSBudWxsO1xuICAgIHRoaXMuX2hvc3RDb250YWluZXJJbmZvID0gbnVsbDtcblxuICAgIC8vIFNlZSBSZWFjdFVwZGF0ZVF1ZXVlXG4gICAgdGhpcy5fdXBkYXRlQmF0Y2hOdW1iZXIgPSBudWxsO1xuICAgIHRoaXMuX3BlbmRpbmdFbGVtZW50ID0gbnVsbDtcbiAgICB0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSA9IG51bGw7XG4gICAgdGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5fcmVuZGVyZWROb2RlVHlwZSA9IG51bGw7XG4gICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQgPSBudWxsO1xuICAgIHRoaXMuX2NvbnRleHQgPSBudWxsO1xuICAgIHRoaXMuX21vdW50T3JkZXIgPSAwO1xuICAgIHRoaXMuX3RvcExldmVsV3JhcHBlciA9IG51bGw7XG5cbiAgICAvLyBTZWUgUmVhY3RVcGRhdGVzIGFuZCBSZWFjdFVwZGF0ZVF1ZXVlLlxuICAgIHRoaXMuX3BlbmRpbmdDYWxsYmFja3MgPSBudWxsO1xuXG4gICAgLy8gQ29tcG9uZW50V2lsbFVubW91bnQgc2hhbGwgb25seSBiZSBjYWxsZWQgb25jZVxuICAgIHRoaXMuX2NhbGxlZENvbXBvbmVudFdpbGxVbm1vdW50ID0gZmFsc2U7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdGhpcy5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSBmYWxzZTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQsIHJlbmRlcnMgbWFya3VwLCBhbmQgcmVnaXN0ZXJzIGV2ZW50IGxpc3RlbmVycy5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7P29iamVjdH0gaG9zdFBhcmVudFxuICAgKiBAcGFyYW0gez9vYmplY3R9IGhvc3RDb250YWluZXJJbmZvXG4gICAqIEBwYXJhbSB7P29iamVjdH0gY29udGV4dFxuICAgKiBAcmV0dXJuIHs/c3RyaW5nfSBSZW5kZXJlZCBtYXJrdXAgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NLlxuICAgKiBAZmluYWxcbiAgICogQGludGVybmFsXG4gICAqL1xuICBtb3VudENvbXBvbmVudDogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgY29udGV4dCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgICB0aGlzLl9tb3VudE9yZGVyID0gbmV4dE1vdW50SUQrKztcbiAgICB0aGlzLl9ob3N0UGFyZW50ID0gaG9zdFBhcmVudDtcbiAgICB0aGlzLl9ob3N0Q29udGFpbmVySW5mbyA9IGhvc3RDb250YWluZXJJbmZvO1xuXG4gICAgdmFyIHB1YmxpY1Byb3BzID0gdGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7XG4gICAgdmFyIHB1YmxpY0NvbnRleHQgPSB0aGlzLl9wcm9jZXNzQ29udGV4dChjb250ZXh0KTtcblxuICAgIHZhciBDb21wb25lbnQgPSB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO1xuXG4gICAgdmFyIHVwZGF0ZVF1ZXVlID0gdHJhbnNhY3Rpb24uZ2V0VXBkYXRlUXVldWUoKTtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIHB1YmxpYyBjbGFzc1xuICAgIHZhciBkb0NvbnN0cnVjdCA9IHNob3VsZENvbnN0cnVjdChDb21wb25lbnQpO1xuICAgIHZhciBpbnN0ID0gdGhpcy5fY29uc3RydWN0Q29tcG9uZW50KGRvQ29uc3RydWN0LCBwdWJsaWNQcm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRlUXVldWUpO1xuICAgIHZhciByZW5kZXJlZEVsZW1lbnQ7XG5cbiAgICAvLyBTdXBwb3J0IGZ1bmN0aW9uYWwgY29tcG9uZW50c1xuICAgIGlmICghZG9Db25zdHJ1Y3QgJiYgKGluc3QgPT0gbnVsbCB8fCBpbnN0LnJlbmRlciA9PSBudWxsKSkge1xuICAgICAgcmVuZGVyZWRFbGVtZW50ID0gaW5zdDtcbiAgICAgIHdhcm5JZkludmFsaWRFbGVtZW50KENvbXBvbmVudCwgcmVuZGVyZWRFbGVtZW50KTtcbiAgICAgICEoaW5zdCA9PT0gbnVsbCB8fCBpbnN0ID09PSBmYWxzZSB8fCBSZWFjdC5pc1ZhbGlkRWxlbWVudChpbnN0KSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMoLi4uKTogQSB2YWxpZCBSZWFjdCBlbGVtZW50IChvciBudWxsKSBtdXN0IGJlIHJldHVybmVkLiBZb3UgbWF5IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLCBhbiBhcnJheSBvciBzb21lIG90aGVyIGludmFsaWQgb2JqZWN0LicsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnMTA1JywgQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnKSA6IHZvaWQgMDtcbiAgICAgIGluc3QgPSBuZXcgU3RhdGVsZXNzQ29tcG9uZW50KENvbXBvbmVudCk7XG4gICAgICB0aGlzLl9jb21wb3NpdGVUeXBlID0gQ29tcG9zaXRlVHlwZXMuU3RhdGVsZXNzRnVuY3Rpb25hbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzUHVyZUNvbXBvbmVudChDb21wb25lbnQpKSB7XG4gICAgICAgIHRoaXMuX2NvbXBvc2l0ZVR5cGUgPSBDb21wb3NpdGVUeXBlcy5QdXJlQ2xhc3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jb21wb3NpdGVUeXBlID0gQ29tcG9zaXRlVHlwZXMuSW1wdXJlQ2xhc3M7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBsYXRlciBpbiBfcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50LCBidXQgYWRkIGFuIGVhcmx5XG4gICAgICAvLyB3YXJuaW5nIG5vdyB0byBoZWxwIGRlYnVnZ2luZ1xuICAgICAgaWYgKGluc3QucmVuZGVyID09IG51bGwpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyguLi4pOiBObyBgcmVuZGVyYCBtZXRob2QgZm91bmQgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudCAnICsgJ2luc3RhbmNlOiB5b3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIGRlZmluZSBgcmVuZGVyYC4nLCBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJvcHNNdXRhdGVkID0gaW5zdC5wcm9wcyAhPT0gcHVibGljUHJvcHM7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoaW5zdC5wcm9wcyA9PT0gdW5kZWZpbmVkIHx8ICFwcm9wc011dGF0ZWQsICclcyguLi4pOiBXaGVuIGNhbGxpbmcgc3VwZXIoKSBpbiBgJXNgLCBtYWtlIHN1cmUgdG8gcGFzcyAnICsgXCJ1cCB0aGUgc2FtZSBwcm9wcyB0aGF0IHlvdXIgY29tcG9uZW50J3MgY29uc3RydWN0b3Igd2FzIHBhc3NlZC5cIiwgY29tcG9uZW50TmFtZSwgY29tcG9uZW50TmFtZSkgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgLy8gVGhlc2Ugc2hvdWxkIGJlIHNldCB1cCBpbiB0aGUgY29uc3RydWN0b3IsIGJ1dCBhcyBhIGNvbnZlbmllbmNlIGZvclxuICAgIC8vIHNpbXBsZXIgY2xhc3MgYWJzdHJhY3Rpb25zLCB3ZSBzZXQgdGhlbSB1cCBhZnRlciB0aGUgZmFjdC5cbiAgICBpbnN0LnByb3BzID0gcHVibGljUHJvcHM7XG4gICAgaW5zdC5jb250ZXh0ID0gcHVibGljQ29udGV4dDtcbiAgICBpbnN0LnJlZnMgPSBlbXB0eU9iamVjdDtcbiAgICBpbnN0LnVwZGF0ZXIgPSB1cGRhdGVRdWV1ZTtcblxuICAgIHRoaXMuX2luc3RhbmNlID0gaW5zdDtcblxuICAgIC8vIFN0b3JlIGEgcmVmZXJlbmNlIGZyb20gdGhlIGluc3RhbmNlIGJhY2sgdG8gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uXG4gICAgUmVhY3RJbnN0YW5jZU1hcC5zZXQoaW5zdCwgdGhpcyk7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgLy8gU2luY2UgcGxhaW4gSlMgY2xhc3NlcyBhcmUgZGVmaW5lZCB3aXRob3V0IGFueSBzcGVjaWFsIGluaXRpYWxpemF0aW9uXG4gICAgICAvLyBsb2dpYywgd2UgY2FuIG5vdCBjYXRjaCBjb21tb24gZXJyb3JzIGVhcmx5LiBUaGVyZWZvcmUsIHdlIGhhdmUgdG9cbiAgICAgIC8vIGNhdGNoIHRoZW0gaGVyZSwgYXQgaW5pdGlhbGl6YXRpb24gdGltZSwgaW5zdGVhZC5cbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFpbnN0LmdldEluaXRpYWxTdGF0ZSB8fCBpbnN0LmdldEluaXRpYWxTdGF0ZS5pc1JlYWN0Q2xhc3NBcHByb3ZlZCB8fCBpbnN0LnN0YXRlLCAnZ2V0SW5pdGlhbFN0YXRlIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBkZWZpbmUgYSBzdGF0ZSBwcm9wZXJ0eSBpbnN0ZWFkPycsIHRoaXMuZ2V0TmFtZSgpIHx8ICdhIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWluc3QuZ2V0RGVmYXVsdFByb3BzIHx8IGluc3QuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkLCAnZ2V0RGVmYXVsdFByb3BzIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ1VzZSBhIHN0YXRpYyBwcm9wZXJ0eSB0byBkZWZpbmUgZGVmYXVsdFByb3BzIGluc3RlYWQuJywgdGhpcy5nZXROYW1lKCkgfHwgJ2EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghaW5zdC5wcm9wVHlwZXMsICdwcm9wVHlwZXMgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBwcm9wVHlwZXMgaW5zdGVhZC4nLCB0aGlzLmdldE5hbWUoKSB8fCAnYSBjb21wb25lbnQnKSA6IHZvaWQgMDtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFpbnN0LmNvbnRleHRUeXBlcywgJ2NvbnRleHRUeXBlcyB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgJyArICdzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGNvbnRleHRUeXBlcyBpbnN0ZWFkLicsIHRoaXMuZ2V0TmFtZSgpIHx8ICdhIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcodHlwZW9mIGluc3QuY29tcG9uZW50U2hvdWxkVXBkYXRlICE9PSAnZnVuY3Rpb24nLCAnJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudFNob3VsZFVwZGF0ZSgpLiBEaWQgeW91IG1lYW4gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk/ICcgKyAnVGhlIG5hbWUgaXMgcGhyYXNlZCBhcyBhIHF1ZXN0aW9uIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGlzICcgKyAnZXhwZWN0ZWQgdG8gcmV0dXJuIGEgdmFsdWUuJywgdGhpcy5nZXROYW1lKCkgfHwgJ0EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyh0eXBlb2YgaW5zdC5jb21wb25lbnREaWRVbm1vdW50ICE9PSAnZnVuY3Rpb24nLCAnJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudERpZFVubW91bnQoKS4gQnV0IHRoZXJlIGlzIG5vIHN1Y2ggbGlmZWN5Y2xlIG1ldGhvZC4gJyArICdEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFVubW91bnQoKT8nLCB0aGlzLmdldE5hbWUoKSB8fCAnQSBjb21wb25lbnQnKSA6IHZvaWQgMDtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHR5cGVvZiBpbnN0LmNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgIT09ICdmdW5jdGlvbicsICclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsIHRoaXMuZ2V0TmFtZSgpIHx8ICdBIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIHZhciBpbml0aWFsU3RhdGUgPSBpbnN0LnN0YXRlO1xuICAgIGlmIChpbml0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5zdC5zdGF0ZSA9IGluaXRpYWxTdGF0ZSA9IG51bGw7XG4gICAgfVxuICAgICEodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoaW5pdGlhbFN0YXRlKSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMuc3RhdGU6IG11c3QgYmUgc2V0IHRvIGFuIG9iamVjdCBvciBudWxsJywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnMTA2JywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2b2lkIDA7XG5cbiAgICB0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSA9IG51bGw7XG4gICAgdGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSA9IGZhbHNlO1xuXG4gICAgdmFyIG1hcmt1cDtcbiAgICBpZiAoaW5zdC51bnN0YWJsZV9oYW5kbGVFcnJvcikge1xuICAgICAgbWFya3VwID0gdGhpcy5wZXJmb3JtSW5pdGlhbE1vdW50V2l0aEVycm9ySGFuZGxpbmcocmVuZGVyZWRFbGVtZW50LCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXJrdXAgPSB0aGlzLnBlcmZvcm1Jbml0aWFsTW91bnQocmVuZGVyZWRFbGVtZW50LCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgIH1cblxuICAgIGlmIChpbnN0LmNvbXBvbmVudERpZE1vdW50KSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlUGVyZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zdC5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICAgIH0sIF90aGlzLl9kZWJ1Z0lELCAnY29tcG9uZW50RGlkTW91bnQnKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGluc3QuY29tcG9uZW50RGlkTW91bnQsIGluc3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXJrdXA7XG4gIH0sXG5cbiAgX2NvbnN0cnVjdENvbXBvbmVudDogZnVuY3Rpb24gKGRvQ29uc3RydWN0LCBwdWJsaWNQcm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRlUXVldWUpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCA9IHRoaXM7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uc3RydWN0Q29tcG9uZW50V2l0aG91dE93bmVyKGRvQ29uc3RydWN0LCBwdWJsaWNQcm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRlUXVldWUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9jb25zdHJ1Y3RDb21wb25lbnRXaXRob3V0T3duZXIoZG9Db25zdHJ1Y3QsIHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1ZSk7XG4gICAgfVxuICB9LFxuXG4gIF9jb25zdHJ1Y3RDb21wb25lbnRXaXRob3V0T3duZXI6IGZ1bmN0aW9uIChkb0NvbnN0cnVjdCwgcHVibGljUHJvcHMsIHB1YmxpY0NvbnRleHQsIHVwZGF0ZVF1ZXVlKSB7XG4gICAgdmFyIENvbXBvbmVudCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7XG5cbiAgICBpZiAoZG9Db25zdHJ1Y3QpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBtZWFzdXJlTGlmZUN5Y2xlUGVyZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnQocHVibGljUHJvcHMsIHB1YmxpY0NvbnRleHQsIHVwZGF0ZVF1ZXVlKTtcbiAgICAgICAgfSwgdGhpcy5fZGVidWdJRCwgJ2N0b3InKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50KHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhpcyBjYW4gc3RpbGwgYmUgYW4gaW5zdGFuY2UgaW4gY2FzZSBvZiBmYWN0b3J5IGNvbXBvbmVudHNcbiAgICAvLyBidXQgd2UnbGwgY291bnQgdGhpcyBhcyB0aW1lIHNwZW50IHJlbmRlcmluZyBhcyB0aGUgbW9yZSBjb21tb24gY2FzZS5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgcmV0dXJuIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIENvbXBvbmVudChwdWJsaWNQcm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRlUXVldWUpO1xuICAgICAgfSwgdGhpcy5fZGVidWdJRCwgJ3JlbmRlcicpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gQ29tcG9uZW50KHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1ZSk7XG4gICAgfVxuICB9LFxuXG4gIHBlcmZvcm1Jbml0aWFsTW91bnRXaXRoRXJyb3JIYW5kbGluZzogZnVuY3Rpb24gKHJlbmRlcmVkRWxlbWVudCwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgdmFyIG1hcmt1cDtcbiAgICB2YXIgY2hlY2twb2ludCA9IHRyYW5zYWN0aW9uLmNoZWNrcG9pbnQoKTtcbiAgICB0cnkge1xuICAgICAgbWFya3VwID0gdGhpcy5wZXJmb3JtSW5pdGlhbE1vdW50KHJlbmRlcmVkRWxlbWVudCwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBSb2xsIGJhY2sgdG8gY2hlY2twb2ludCwgaGFuZGxlIGVycm9yICh3aGljaCBtYXkgYWRkIGl0ZW1zIHRvIHRoZSB0cmFuc2FjdGlvbiksIGFuZCB0YWtlIGEgbmV3IGNoZWNrcG9pbnRcbiAgICAgIHRyYW5zYWN0aW9uLnJvbGxiYWNrKGNoZWNrcG9pbnQpO1xuICAgICAgdGhpcy5faW5zdGFuY2UudW5zdGFibGVfaGFuZGxlRXJyb3IoZSk7XG4gICAgICBpZiAodGhpcy5fcGVuZGluZ1N0YXRlUXVldWUpIHtcbiAgICAgICAgdGhpcy5faW5zdGFuY2Uuc3RhdGUgPSB0aGlzLl9wcm9jZXNzUGVuZGluZ1N0YXRlKHRoaXMuX2luc3RhbmNlLnByb3BzLCB0aGlzLl9pbnN0YW5jZS5jb250ZXh0KTtcbiAgICAgIH1cbiAgICAgIGNoZWNrcG9pbnQgPSB0cmFuc2FjdGlvbi5jaGVja3BvaW50KCk7XG5cbiAgICAgIHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50LnVubW91bnRDb21wb25lbnQodHJ1ZSk7XG4gICAgICB0cmFuc2FjdGlvbi5yb2xsYmFjayhjaGVja3BvaW50KTtcblxuICAgICAgLy8gVHJ5IGFnYWluIC0gd2UndmUgaW5mb3JtZWQgdGhlIGNvbXBvbmVudCBhYm91dCB0aGUgZXJyb3IsIHNvIHRoZXkgY2FuIHJlbmRlciBhbiBlcnJvciBtZXNzYWdlIHRoaXMgdGltZS5cbiAgICAgIC8vIElmIHRoaXMgdGhyb3dzIGFnYWluLCB0aGUgZXJyb3Igd2lsbCBidWJibGUgdXAgKGFuZCBjYW4gYmUgY2F1Z2h0IGJ5IGEgaGlnaGVyIGVycm9yIGJvdW5kYXJ5KS5cbiAgICAgIG1hcmt1cCA9IHRoaXMucGVyZm9ybUluaXRpYWxNb3VudChyZW5kZXJlZEVsZW1lbnQsIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBtYXJrdXA7XG4gIH0sXG5cbiAgcGVyZm9ybUluaXRpYWxNb3VudDogZnVuY3Rpb24gKHJlbmRlcmVkRWxlbWVudCwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgdmFyIGluc3QgPSB0aGlzLl9pbnN0YW5jZTtcblxuICAgIHZhciBkZWJ1Z0lEID0gMDtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgZGVidWdJRCA9IHRoaXMuX2RlYnVnSUQ7XG4gICAgfVxuXG4gICAgaWYgKGluc3QuY29tcG9uZW50V2lsbE1vdW50KSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlUGVyZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGluc3QuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICAgIH0sIGRlYnVnSUQsICdjb21wb25lbnRXaWxsTW91bnQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluc3QuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICB9XG4gICAgICAvLyBXaGVuIG1vdW50aW5nLCBjYWxscyB0byBgc2V0U3RhdGVgIGJ5IGBjb21wb25lbnRXaWxsTW91bnRgIHdpbGwgc2V0XG4gICAgICAvLyBgdGhpcy5fcGVuZGluZ1N0YXRlUXVldWVgIHdpdGhvdXQgdHJpZ2dlcmluZyBhIHJlLXJlbmRlci5cbiAgICAgIGlmICh0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSkge1xuICAgICAgICBpbnN0LnN0YXRlID0gdGhpcy5fcHJvY2Vzc1BlbmRpbmdTdGF0ZShpbnN0LnByb3BzLCBpbnN0LmNvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIG5vdCBhIHN0YXRlbGVzcyBjb21wb25lbnQsIHdlIG5vdyByZW5kZXJcbiAgICBpZiAocmVuZGVyZWRFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlbmRlcmVkRWxlbWVudCA9IHRoaXMuX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudCgpO1xuICAgIH1cblxuICAgIHZhciBub2RlVHlwZSA9IFJlYWN0Tm9kZVR5cGVzLmdldFR5cGUocmVuZGVyZWRFbGVtZW50KTtcbiAgICB0aGlzLl9yZW5kZXJlZE5vZGVUeXBlID0gbm9kZVR5cGU7XG4gICAgdmFyIGNoaWxkID0gdGhpcy5faW5zdGFudGlhdGVSZWFjdENvbXBvbmVudChyZW5kZXJlZEVsZW1lbnQsIG5vZGVUeXBlICE9PSBSZWFjdE5vZGVUeXBlcy5FTVBUWSAvKiBzaG91bGRIYXZlRGVidWdJRCAqL1xuICAgICk7XG4gICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQgPSBjaGlsZDtcblxuICAgIHZhciBtYXJrdXAgPSBSZWFjdFJlY29uY2lsZXIubW91bnRDb21wb25lbnQoY2hpbGQsIHRyYW5zYWN0aW9uLCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgdGhpcy5fcHJvY2Vzc0NoaWxkQ29udGV4dChjb250ZXh0KSwgZGVidWdJRCk7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKGRlYnVnSUQgIT09IDApIHtcbiAgICAgICAgdmFyIGNoaWxkRGVidWdJRHMgPSBjaGlsZC5fZGVidWdJRCAhPT0gMCA/IFtjaGlsZC5fZGVidWdJRF0gOiBbXTtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uU2V0Q2hpbGRyZW4oZGVidWdJRCwgY2hpbGREZWJ1Z0lEcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcmt1cDtcbiAgfSxcblxuICBnZXRIb3N0Tm9kZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBSZWFjdFJlY29uY2lsZXIuZ2V0SG9zdE5vZGUodGhpcy5fcmVuZGVyZWRDb21wb25lbnQpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSBgbW91bnRDb21wb25lbnRgLlxuICAgKlxuICAgKiBAZmluYWxcbiAgICogQGludGVybmFsXG4gICAqL1xuICB1bm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoc2FmZWx5KSB7XG4gICAgaWYgKCF0aGlzLl9yZW5kZXJlZENvbXBvbmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBpbnN0ID0gdGhpcy5faW5zdGFuY2U7XG5cbiAgICBpZiAoaW5zdC5jb21wb25lbnRXaWxsVW5tb3VudCAmJiAhaW5zdC5fY2FsbGVkQ29tcG9uZW50V2lsbFVubW91bnQpIHtcbiAgICAgIGluc3QuX2NhbGxlZENvbXBvbmVudFdpbGxVbm1vdW50ID0gdHJ1ZTtcblxuICAgICAgaWYgKHNhZmVseSkge1xuICAgICAgICB2YXIgbmFtZSA9IHRoaXMuZ2V0TmFtZSgpICsgJy5jb21wb25lbnRXaWxsVW5tb3VudCgpJztcbiAgICAgICAgUmVhY3RFcnJvclV0aWxzLmludm9rZUd1YXJkZWRDYWxsYmFjayhuYW1lLCBpbnN0LmNvbXBvbmVudFdpbGxVbm1vdW50LmJpbmQoaW5zdCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlUGVyZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zdC5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuICAgICAgICAgIH0sIHRoaXMuX2RlYnVnSUQsICdjb21wb25lbnRXaWxsVW5tb3VudCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluc3QuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9yZW5kZXJlZENvbXBvbmVudCkge1xuICAgICAgUmVhY3RSZWNvbmNpbGVyLnVubW91bnRDb21wb25lbnQodGhpcy5fcmVuZGVyZWRDb21wb25lbnQsIHNhZmVseSk7XG4gICAgICB0aGlzLl9yZW5kZXJlZE5vZGVUeXBlID0gbnVsbDtcbiAgICAgIHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBwZW5kaW5nIGZpZWxkc1xuICAgIC8vIEV2ZW4gaWYgdGhpcyBjb21wb25lbnQgaXMgc2NoZWR1bGVkIGZvciBhbm90aGVyIHVwZGF0ZSBpbiBSZWFjdFVwZGF0ZXMsXG4gICAgLy8gaXQgd291bGQgc3RpbGwgYmUgaWdub3JlZCBiZWNhdXNlIHRoZXNlIGZpZWxkcyBhcmUgcmVzZXQuXG4gICAgdGhpcy5fcGVuZGluZ1N0YXRlUXVldWUgPSBudWxsO1xuICAgIHRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGUgPSBmYWxzZTtcbiAgICB0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGUgPSBmYWxzZTtcbiAgICB0aGlzLl9wZW5kaW5nQ2FsbGJhY2tzID0gbnVsbDtcbiAgICB0aGlzLl9wZW5kaW5nRWxlbWVudCA9IG51bGw7XG5cbiAgICAvLyBUaGVzZSBmaWVsZHMgZG8gbm90IHJlYWxseSBuZWVkIHRvIGJlIHJlc2V0IHNpbmNlIHRoaXMgb2JqZWN0IGlzIG5vXG4gICAgLy8gbG9uZ2VyIGFjY2Vzc2libGUuXG4gICAgdGhpcy5fY29udGV4dCA9IG51bGw7XG4gICAgdGhpcy5fcm9vdE5vZGVJRCA9IDA7XG4gICAgdGhpcy5fdG9wTGV2ZWxXcmFwcGVyID0gbnVsbDtcblxuICAgIC8vIERlbGV0ZSB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGluc3RhbmNlIHRvIHRoaXMgaW50ZXJuYWwgcmVwcmVzZW50YXRpb25cbiAgICAvLyB3aGljaCBhbGxvdyB0aGUgaW50ZXJuYWxzIHRvIGJlIHByb3Blcmx5IGNsZWFuZWQgdXAgZXZlbiBpZiB0aGUgdXNlclxuICAgIC8vIGxlYWtzIGEgcmVmZXJlbmNlIHRvIHRoZSBwdWJsaWMgaW5zdGFuY2UuXG4gICAgUmVhY3RJbnN0YW5jZU1hcC5yZW1vdmUoaW5zdCk7XG5cbiAgICAvLyBTb21lIGV4aXN0aW5nIGNvbXBvbmVudHMgcmVseSBvbiBpbnN0LnByb3BzIGV2ZW4gYWZ0ZXIgdGhleSd2ZSBiZWVuXG4gICAgLy8gZGVzdHJveWVkIChpbiBldmVudCBoYW5kbGVycykuXG4gICAgLy8gVE9ETzogaW5zdC5wcm9wcyA9IG51bGw7XG4gICAgLy8gVE9ETzogaW5zdC5zdGF0ZSA9IG51bGw7XG4gICAgLy8gVE9ETzogaW5zdC5jb250ZXh0ID0gbnVsbDtcbiAgfSxcblxuICAvKipcbiAgICogRmlsdGVycyB0aGUgY29udGV4dCBvYmplY3QgdG8gb25seSBjb250YWluIGtleXMgc3BlY2lmaWVkIGluXG4gICAqIGBjb250ZXh0VHlwZXNgXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0XG4gICAqIEByZXR1cm4gez9vYmplY3R9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfbWFza0NvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgdmFyIENvbXBvbmVudCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7XG4gICAgdmFyIGNvbnRleHRUeXBlcyA9IENvbXBvbmVudC5jb250ZXh0VHlwZXM7XG4gICAgaWYgKCFjb250ZXh0VHlwZXMpIHtcbiAgICAgIHJldHVybiBlbXB0eU9iamVjdDtcbiAgICB9XG4gICAgdmFyIG1hc2tlZENvbnRleHQgPSB7fTtcbiAgICBmb3IgKHZhciBjb250ZXh0TmFtZSBpbiBjb250ZXh0VHlwZXMpIHtcbiAgICAgIG1hc2tlZENvbnRleHRbY29udGV4dE5hbWVdID0gY29udGV4dFtjb250ZXh0TmFtZV07XG4gICAgfVxuICAgIHJldHVybiBtYXNrZWRDb250ZXh0O1xuICB9LFxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIHRoZSBjb250ZXh0IG9iamVjdCB0byBvbmx5IGNvbnRhaW4ga2V5cyBzcGVjaWZpZWQgaW5cbiAgICogYGNvbnRleHRUeXBlc2AsIGFuZCBhc3NlcnRzIHRoYXQgdGhleSBhcmUgdmFsaWQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0XG4gICAqIEByZXR1cm4gez9vYmplY3R9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcHJvY2Vzc0NvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgdmFyIG1hc2tlZENvbnRleHQgPSB0aGlzLl9tYXNrQ29udGV4dChjb250ZXh0KTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIENvbXBvbmVudCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7XG4gICAgICBpZiAoQ29tcG9uZW50LmNvbnRleHRUeXBlcykge1xuICAgICAgICB0aGlzLl9jaGVja0NvbnRleHRUeXBlcyhDb21wb25lbnQuY29udGV4dFR5cGVzLCBtYXNrZWRDb250ZXh0LCAnY29udGV4dCcpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFza2VkQ29udGV4dDtcbiAgfSxcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGN1cnJlbnRDb250ZXh0XG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wcm9jZXNzQ2hpbGRDb250ZXh0OiBmdW5jdGlvbiAoY3VycmVudENvbnRleHQpIHtcbiAgICB2YXIgQ29tcG9uZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTtcbiAgICB2YXIgaW5zdCA9IHRoaXMuX2luc3RhbmNlO1xuICAgIHZhciBjaGlsZENvbnRleHQ7XG5cbiAgICBpZiAoaW5zdC5nZXRDaGlsZENvbnRleHQpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZ2luUHJvY2Vzc2luZ0NoaWxkQ29udGV4dCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNoaWxkQ29udGV4dCA9IGluc3QuZ2V0Q2hpbGRDb250ZXh0KCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uRW5kUHJvY2Vzc2luZ0NoaWxkQ29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGlsZENvbnRleHQgPSBpbnN0LmdldENoaWxkQ29udGV4dCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGlsZENvbnRleHQpIHtcbiAgICAgICEodHlwZW9mIENvbXBvbmVudC5jaGlsZENvbnRleHRUeXBlcyA9PT0gJ29iamVjdCcpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzLmdldENoaWxkQ29udGV4dCgpOiBjaGlsZENvbnRleHRUeXBlcyBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgdG8gdXNlIGdldENoaWxkQ29udGV4dCgpLicsIHRoaXMuZ2V0TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogX3Byb2RJbnZhcmlhbnQoJzEwNycsIHRoaXMuZ2V0TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tDb250ZXh0VHlwZXMoQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzLCBjaGlsZENvbnRleHQsICdjaGlsZCBjb250ZXh0Jyk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBuYW1lIGluIGNoaWxkQ29udGV4dCkge1xuICAgICAgICAhKG5hbWUgaW4gQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICclcy5nZXRDaGlsZENvbnRleHQoKToga2V5IFwiJXNcIiBpcyBub3QgZGVmaW5lZCBpbiBjaGlsZENvbnRleHRUeXBlcy4nLCB0aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnLCBuYW1lKSA6IF9wcm9kSW52YXJpYW50KCcxMDgnLCB0aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnLCBuYW1lKSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBfYXNzaWduKHt9LCBjdXJyZW50Q29udGV4dCwgY2hpbGRDb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRDb250ZXh0O1xuICB9LFxuXG4gIC8qKlxuICAgKiBBc3NlcnQgdGhhdCB0aGUgY29udGV4dCB0eXBlcyBhcmUgdmFsaWRcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHR5cGVTcGVjcyBNYXAgb2YgY29udGV4dCBmaWVsZCB0byBhIFJlYWN0UHJvcFR5cGVcbiAgICogQHBhcmFtIHtvYmplY3R9IHZhbHVlcyBSdW50aW1lIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgdHlwZS1jaGVja2VkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBlLmcuIFwicHJvcFwiLCBcImNvbnRleHRcIiwgXCJjaGlsZCBjb250ZXh0XCJcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jaGVja0NvbnRleHRUeXBlczogZnVuY3Rpb24gKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbikge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBjaGVja1JlYWN0VHlwZVNwZWModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCB0aGlzLmdldE5hbWUoKSwgbnVsbCwgdGhpcy5fZGVidWdJRCk7XG4gICAgfVxuICB9LFxuXG4gIHJlY2VpdmVDb21wb25lbnQ6IGZ1bmN0aW9uIChuZXh0RWxlbWVudCwgdHJhbnNhY3Rpb24sIG5leHRDb250ZXh0KSB7XG4gICAgdmFyIHByZXZFbGVtZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQ7XG4gICAgdmFyIHByZXZDb250ZXh0ID0gdGhpcy5fY29udGV4dDtcblxuICAgIHRoaXMuX3BlbmRpbmdFbGVtZW50ID0gbnVsbDtcblxuICAgIHRoaXMudXBkYXRlQ29tcG9uZW50KHRyYW5zYWN0aW9uLCBwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQsIHByZXZDb250ZXh0LCBuZXh0Q29udGV4dCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIElmIGFueSBvZiBgX3BlbmRpbmdFbGVtZW50YCwgYF9wZW5kaW5nU3RhdGVRdWV1ZWAsIG9yIGBfcGVuZGluZ0ZvcmNlVXBkYXRlYFxuICAgKiBpcyBzZXQsIHVwZGF0ZSB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5OiBmdW5jdGlvbiAodHJhbnNhY3Rpb24pIHtcbiAgICBpZiAodGhpcy5fcGVuZGluZ0VsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgUmVhY3RSZWNvbmNpbGVyLnJlY2VpdmVDb21wb25lbnQodGhpcywgdGhpcy5fcGVuZGluZ0VsZW1lbnQsIHRyYW5zYWN0aW9uLCB0aGlzLl9jb250ZXh0KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlICE9PSBudWxsIHx8IHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSkge1xuICAgICAgdGhpcy51cGRhdGVDb21wb25lbnQodHJhbnNhY3Rpb24sIHRoaXMuX2N1cnJlbnRFbGVtZW50LCB0aGlzLl9jdXJyZW50RWxlbWVudCwgdGhpcy5fY29udGV4dCwgdGhpcy5fY29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3VwZGF0ZUJhdGNoTnVtYmVyID0gbnVsbDtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYW4gdXBkYXRlIHRvIGEgbW91bnRlZCBjb21wb25lbnQuIFRoZSBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGFuZFxuICAgKiBzaG91bGRDb21wb25lbnRVcGRhdGUgbWV0aG9kcyBhcmUgY2FsbGVkLCB0aGVuIChhc3N1bWluZyB0aGUgdXBkYXRlIGlzbid0XG4gICAqIHNraXBwZWQpIHRoZSByZW1haW5pbmcgdXBkYXRlIGxpZmVjeWNsZSBtZXRob2RzIGFyZSBjYWxsZWQgYW5kIHRoZSBET01cbiAgICogcmVwcmVzZW50YXRpb24gaXMgdXBkYXRlZC5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgdGhpcyBpbXBsZW1lbnRzIFJlYWN0J3MgcmVuZGVyaW5nIGFuZCByZWNvbmNpbGlhdGlvbiBhbGdvcml0aG0uXG4gICAqIFNvcGhpc3RpY2F0ZWQgY2xpZW50cyBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBwcmV2UGFyZW50RWxlbWVudFxuICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4dFBhcmVudEVsZW1lbnRcbiAgICogQGludGVybmFsXG4gICAqIEBvdmVycmlkYWJsZVxuICAgKi9cbiAgdXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAodHJhbnNhY3Rpb24sIHByZXZQYXJlbnRFbGVtZW50LCBuZXh0UGFyZW50RWxlbWVudCwgcHJldlVubWFza2VkQ29udGV4dCwgbmV4dFVubWFza2VkQ29udGV4dCkge1xuICAgIHZhciBpbnN0ID0gdGhpcy5faW5zdGFuY2U7XG4gICAgIShpbnN0ICE9IG51bGwpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0F0dGVtcHRlZCB0byB1cGRhdGUgY29tcG9uZW50IGAlc2AgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHVubW91bnRlZCAob3IgZmFpbGVkIHRvIG1vdW50KS4nLCB0aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IF9wcm9kSW52YXJpYW50KCcxMzYnLCB0aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IHZvaWQgMDtcblxuICAgIHZhciB3aWxsUmVjZWl2ZSA9IGZhbHNlO1xuICAgIHZhciBuZXh0Q29udGV4dDtcblxuICAgIC8vIERldGVybWluZSBpZiB0aGUgY29udGV4dCBoYXMgY2hhbmdlZCBvciBub3RcbiAgICBpZiAodGhpcy5fY29udGV4dCA9PT0gbmV4dFVubWFza2VkQ29udGV4dCkge1xuICAgICAgbmV4dENvbnRleHQgPSBpbnN0LmNvbnRleHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRDb250ZXh0ID0gdGhpcy5fcHJvY2Vzc0NvbnRleHQobmV4dFVubWFza2VkQ29udGV4dCk7XG4gICAgICB3aWxsUmVjZWl2ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgdmFyIHByZXZQcm9wcyA9IHByZXZQYXJlbnRFbGVtZW50LnByb3BzO1xuICAgIHZhciBuZXh0UHJvcHMgPSBuZXh0UGFyZW50RWxlbWVudC5wcm9wcztcblxuICAgIC8vIE5vdCBhIHNpbXBsZSBzdGF0ZSB1cGRhdGUgYnV0IGEgcHJvcHMgdXBkYXRlXG4gICAgaWYgKHByZXZQYXJlbnRFbGVtZW50ICE9PSBuZXh0UGFyZW50RWxlbWVudCkge1xuICAgICAgd2lsbFJlY2VpdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIEFuIHVwZGF0ZSBoZXJlIHdpbGwgc2NoZWR1bGUgYW4gdXBkYXRlIGJ1dCBpbW1lZGlhdGVseSBzZXRcbiAgICAvLyBfcGVuZGluZ1N0YXRlUXVldWUgd2hpY2ggd2lsbCBlbnN1cmUgdGhhdCBhbnkgc3RhdGUgdXBkYXRlcyBnZXRzXG4gICAgLy8gaW1tZWRpYXRlbHkgcmVjb25jaWxlZCBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZSBuZXh0IGJhdGNoLlxuICAgIGlmICh3aWxsUmVjZWl2ZSAmJiBpbnN0LmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gaW5zdC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcywgbmV4dENvbnRleHQpO1xuICAgICAgICB9LCB0aGlzLl9kZWJ1Z0lELCAnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5zdC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcywgbmV4dENvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBuZXh0U3RhdGUgPSB0aGlzLl9wcm9jZXNzUGVuZGluZ1N0YXRlKG5leHRQcm9wcywgbmV4dENvbnRleHQpO1xuICAgIHZhciBzaG91bGRVcGRhdGUgPSB0cnVlO1xuXG4gICAgaWYgKCF0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGUpIHtcbiAgICAgIGlmIChpbnN0LnNob3VsZENvbXBvbmVudFVwZGF0ZSkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIHNob3VsZFVwZGF0ZSA9IG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnN0LnNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgICAgIH0sIHRoaXMuX2RlYnVnSUQsICdzaG91bGRDb21wb25lbnRVcGRhdGUnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG91bGRVcGRhdGUgPSBpbnN0LnNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5fY29tcG9zaXRlVHlwZSA9PT0gQ29tcG9zaXRlVHlwZXMuUHVyZUNsYXNzKSB7XG4gICAgICAgICAgc2hvdWxkVXBkYXRlID0gIXNoYWxsb3dFcXVhbChwcmV2UHJvcHMsIG5leHRQcm9wcykgfHwgIXNoYWxsb3dFcXVhbChpbnN0LnN0YXRlLCBuZXh0U3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHNob3VsZFVwZGF0ZSAhPT0gdW5kZWZpbmVkLCAnJXMuc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk6IFJldHVybmVkIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIGEgJyArICdib29sZWFuIHZhbHVlLiBNYWtlIHN1cmUgdG8gcmV0dXJuIHRydWUgb3IgZmFsc2UuJywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlQmF0Y2hOdW1iZXIgPSBudWxsO1xuICAgIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAgIHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgLy8gV2lsbCBzZXQgYHRoaXMucHJvcHNgLCBgdGhpcy5zdGF0ZWAgYW5kIGB0aGlzLmNvbnRleHRgLlxuICAgICAgdGhpcy5fcGVyZm9ybUNvbXBvbmVudFVwZGF0ZShuZXh0UGFyZW50RWxlbWVudCwgbmV4dFByb3BzLCBuZXh0U3RhdGUsIG5leHRDb250ZXh0LCB0cmFuc2FjdGlvbiwgbmV4dFVubWFza2VkQ29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIGl0J3MgZGV0ZXJtaW5lZCB0aGF0IGEgY29tcG9uZW50IHNob3VsZCBub3QgdXBkYXRlLCB3ZSBzdGlsbCB3YW50XG4gICAgICAvLyB0byBzZXQgcHJvcHMgYW5kIHN0YXRlIGJ1dCB3ZSBzaG9ydGN1dCB0aGUgcmVzdCBvZiB0aGUgdXBkYXRlLlxuICAgICAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSBuZXh0UGFyZW50RWxlbWVudDtcbiAgICAgIHRoaXMuX2NvbnRleHQgPSBuZXh0VW5tYXNrZWRDb250ZXh0O1xuICAgICAgaW5zdC5wcm9wcyA9IG5leHRQcm9wcztcbiAgICAgIGluc3Quc3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgICBpbnN0LmNvbnRleHQgPSBuZXh0Q29udGV4dDtcbiAgICB9XG4gIH0sXG5cbiAgX3Byb2Nlc3NQZW5kaW5nU3RhdGU6IGZ1bmN0aW9uIChwcm9wcywgY29udGV4dCkge1xuICAgIHZhciBpbnN0ID0gdGhpcy5faW5zdGFuY2U7XG4gICAgdmFyIHF1ZXVlID0gdGhpcy5fcGVuZGluZ1N0YXRlUXVldWU7XG4gICAgdmFyIHJlcGxhY2UgPSB0aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlO1xuICAgIHRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGUgPSBmYWxzZTtcbiAgICB0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSA9IG51bGw7XG5cbiAgICBpZiAoIXF1ZXVlKSB7XG4gICAgICByZXR1cm4gaW5zdC5zdGF0ZTtcbiAgICB9XG5cbiAgICBpZiAocmVwbGFjZSAmJiBxdWV1ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBxdWV1ZVswXTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dFN0YXRlID0gX2Fzc2lnbih7fSwgcmVwbGFjZSA/IHF1ZXVlWzBdIDogaW5zdC5zdGF0ZSk7XG4gICAgZm9yICh2YXIgaSA9IHJlcGxhY2UgPyAxIDogMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFydGlhbCA9IHF1ZXVlW2ldO1xuICAgICAgX2Fzc2lnbihuZXh0U3RhdGUsIHR5cGVvZiBwYXJ0aWFsID09PSAnZnVuY3Rpb24nID8gcGFydGlhbC5jYWxsKGluc3QsIG5leHRTdGF0ZSwgcHJvcHMsIGNvbnRleHQpIDogcGFydGlhbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgfSxcblxuICAvKipcbiAgICogTWVyZ2VzIG5ldyBwcm9wcyBhbmQgc3RhdGUsIG5vdGlmaWVzIGRlbGVnYXRlIG1ldGhvZHMgb2YgdXBkYXRlIGFuZFxuICAgKiBwZXJmb3JtcyB1cGRhdGUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0RWxlbWVudCBOZXh0IGVsZW1lbnRcbiAgICogQHBhcmFtIHtvYmplY3R9IG5leHRQcm9wcyBOZXh0IHB1YmxpYyBvYmplY3QgdG8gc2V0IGFzIHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dFN0YXRlIE5leHQgb2JqZWN0IHRvIHNldCBhcyBzdGF0ZS5cbiAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0Q29udGV4dCBOZXh0IHB1YmxpYyBvYmplY3QgdG8gc2V0IGFzIGNvbnRleHQuXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHs/b2JqZWN0fSB1bm1hc2tlZENvbnRleHRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wZXJmb3JtQ29tcG9uZW50VXBkYXRlOiBmdW5jdGlvbiAobmV4dEVsZW1lbnQsIG5leHRQcm9wcywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCwgdHJhbnNhY3Rpb24sIHVubWFza2VkQ29udGV4dCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIGluc3QgPSB0aGlzLl9pbnN0YW5jZTtcblxuICAgIHZhciBoYXNDb21wb25lbnREaWRVcGRhdGUgPSBCb29sZWFuKGluc3QuY29tcG9uZW50RGlkVXBkYXRlKTtcbiAgICB2YXIgcHJldlByb3BzO1xuICAgIHZhciBwcmV2U3RhdGU7XG4gICAgdmFyIHByZXZDb250ZXh0O1xuICAgIGlmIChoYXNDb21wb25lbnREaWRVcGRhdGUpIHtcbiAgICAgIHByZXZQcm9wcyA9IGluc3QucHJvcHM7XG4gICAgICBwcmV2U3RhdGUgPSBpbnN0LnN0YXRlO1xuICAgICAgcHJldkNvbnRleHQgPSBpbnN0LmNvbnRleHQ7XG4gICAgfVxuXG4gICAgaWYgKGluc3QuY29tcG9uZW50V2lsbFVwZGF0ZSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgbWVhc3VyZUxpZmVDeWNsZVBlcmYoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBpbnN0LmNvbXBvbmVudFdpbGxVcGRhdGUobmV4dFByb3BzLCBuZXh0U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgICAgfSwgdGhpcy5fZGVidWdJRCwgJ2NvbXBvbmVudFdpbGxVcGRhdGUnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluc3QuY29tcG9uZW50V2lsbFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbmV4dEVsZW1lbnQ7XG4gICAgdGhpcy5fY29udGV4dCA9IHVubWFza2VkQ29udGV4dDtcbiAgICBpbnN0LnByb3BzID0gbmV4dFByb3BzO1xuICAgIGluc3Quc3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgaW5zdC5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG5cbiAgICB0aGlzLl91cGRhdGVSZW5kZXJlZENvbXBvbmVudCh0cmFuc2FjdGlvbiwgdW5tYXNrZWRDb250ZXh0KTtcblxuICAgIGlmIChoYXNDb21wb25lbnREaWRVcGRhdGUpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGluc3QuY29tcG9uZW50RGlkVXBkYXRlLmJpbmQoaW5zdCwgcHJldlByb3BzLCBwcmV2U3RhdGUsIHByZXZDb250ZXh0KSwgX3RoaXMyLl9kZWJ1Z0lELCAnY29tcG9uZW50RGlkVXBkYXRlJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShpbnN0LmNvbXBvbmVudERpZFVwZGF0ZS5iaW5kKGluc3QsIHByZXZQcm9wcywgcHJldlN0YXRlLCBwcmV2Q29udGV4dCksIGluc3QpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQ2FsbCB0aGUgY29tcG9uZW50J3MgYHJlbmRlcmAgbWV0aG9kIGFuZCB1cGRhdGUgdGhlIERPTSBhY2NvcmRpbmdseS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF91cGRhdGVSZW5kZXJlZENvbXBvbmVudDogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgdmFyIHByZXZDb21wb25lbnRJbnN0YW5jZSA9IHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50O1xuICAgIHZhciBwcmV2UmVuZGVyZWRFbGVtZW50ID0gcHJldkNvbXBvbmVudEluc3RhbmNlLl9jdXJyZW50RWxlbWVudDtcbiAgICB2YXIgbmV4dFJlbmRlcmVkRWxlbWVudCA9IHRoaXMuX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudCgpO1xuXG4gICAgdmFyIGRlYnVnSUQgPSAwO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBkZWJ1Z0lEID0gdGhpcy5fZGVidWdJRDtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQocHJldlJlbmRlcmVkRWxlbWVudCwgbmV4dFJlbmRlcmVkRWxlbWVudCkpIHtcbiAgICAgIFJlYWN0UmVjb25jaWxlci5yZWNlaXZlQ29tcG9uZW50KHByZXZDb21wb25lbnRJbnN0YW5jZSwgbmV4dFJlbmRlcmVkRWxlbWVudCwgdHJhbnNhY3Rpb24sIHRoaXMuX3Byb2Nlc3NDaGlsZENvbnRleHQoY29udGV4dCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgb2xkSG9zdE5vZGUgPSBSZWFjdFJlY29uY2lsZXIuZ2V0SG9zdE5vZGUocHJldkNvbXBvbmVudEluc3RhbmNlKTtcbiAgICAgIFJlYWN0UmVjb25jaWxlci51bm1vdW50Q29tcG9uZW50KHByZXZDb21wb25lbnRJbnN0YW5jZSwgZmFsc2UpO1xuXG4gICAgICB2YXIgbm9kZVR5cGUgPSBSZWFjdE5vZGVUeXBlcy5nZXRUeXBlKG5leHRSZW5kZXJlZEVsZW1lbnQpO1xuICAgICAgdGhpcy5fcmVuZGVyZWROb2RlVHlwZSA9IG5vZGVUeXBlO1xuICAgICAgdmFyIGNoaWxkID0gdGhpcy5faW5zdGFudGlhdGVSZWFjdENvbXBvbmVudChuZXh0UmVuZGVyZWRFbGVtZW50LCBub2RlVHlwZSAhPT0gUmVhY3ROb2RlVHlwZXMuRU1QVFkgLyogc2hvdWxkSGF2ZURlYnVnSUQgKi9cbiAgICAgICk7XG4gICAgICB0aGlzLl9yZW5kZXJlZENvbXBvbmVudCA9IGNoaWxkO1xuXG4gICAgICB2YXIgbmV4dE1hcmt1cCA9IFJlYWN0UmVjb25jaWxlci5tb3VudENvbXBvbmVudChjaGlsZCwgdHJhbnNhY3Rpb24sIHRoaXMuX2hvc3RQYXJlbnQsIHRoaXMuX2hvc3RDb250YWluZXJJbmZvLCB0aGlzLl9wcm9jZXNzQ2hpbGRDb250ZXh0KGNvbnRleHQpLCBkZWJ1Z0lEKTtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgaWYgKGRlYnVnSUQgIT09IDApIHtcbiAgICAgICAgICB2YXIgY2hpbGREZWJ1Z0lEcyA9IGNoaWxkLl9kZWJ1Z0lEICE9PSAwID8gW2NoaWxkLl9kZWJ1Z0lEXSA6IFtdO1xuICAgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblNldENoaWxkcmVuKGRlYnVnSUQsIGNoaWxkRGVidWdJRHMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3JlcGxhY2VOb2RlV2l0aE1hcmt1cChvbGRIb3N0Tm9kZSwgbmV4dE1hcmt1cCwgcHJldkNvbXBvbmVudEluc3RhbmNlKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRkZW4gaW4gc2hhbGxvdyByZW5kZXJpbmcuXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIF9yZXBsYWNlTm9kZVdpdGhNYXJrdXA6IGZ1bmN0aW9uIChvbGRIb3N0Tm9kZSwgbmV4dE1hcmt1cCwgcHJldkluc3RhbmNlKSB7XG4gICAgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudC5yZXBsYWNlTm9kZVdpdGhNYXJrdXAob2xkSG9zdE5vZGUsIG5leHRNYXJrdXAsIHByZXZJbnN0YW5jZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIF9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnRXaXRob3V0T3duZXJPckNvbnRleHQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaW5zdCA9IHRoaXMuX2luc3RhbmNlO1xuICAgIHZhciByZW5kZXJlZEVsZW1lbnQ7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgcmVuZGVyZWRFbGVtZW50ID0gbWVhc3VyZUxpZmVDeWNsZVBlcmYoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gaW5zdC5yZW5kZXIoKTtcbiAgICAgIH0sIHRoaXMuX2RlYnVnSUQsICdyZW5kZXInKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVuZGVyZWRFbGVtZW50ID0gaW5zdC5yZW5kZXIoKTtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgLy8gV2UgYWxsb3cgYXV0by1tb2NrcyB0byBwcm9jZWVkIGFzIGlmIHRoZXkncmUgcmV0dXJuaW5nIG51bGwuXG4gICAgICBpZiAocmVuZGVyZWRFbGVtZW50ID09PSB1bmRlZmluZWQgJiYgaW5zdC5yZW5kZXIuX2lzTW9ja0Z1bmN0aW9uKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgYmFkIHByYWN0aWNlLiBDb25zaWRlciB3YXJuaW5nIGhlcmUgYW5kXG4gICAgICAgIC8vIGRlcHJlY2F0aW5nIHRoaXMgY29udmVuaWVuY2UuXG4gICAgICAgIHJlbmRlcmVkRWxlbWVudCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbmRlcmVkRWxlbWVudDtcbiAgfSxcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVuZGVyZWRFbGVtZW50O1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nIHx8IHRoaXMuX2NvbXBvc2l0ZVR5cGUgIT09IENvbXBvc2l0ZVR5cGVzLlN0YXRlbGVzc0Z1bmN0aW9uYWwpIHtcbiAgICAgIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgPSB0aGlzO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVuZGVyZWRFbGVtZW50ID0gdGhpcy5fcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50V2l0aG91dE93bmVyT3JDb250ZXh0KCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVuZGVyZWRFbGVtZW50ID0gdGhpcy5fcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50V2l0aG91dE93bmVyT3JDb250ZXh0KCk7XG4gICAgfVxuICAgICEoXG4gICAgLy8gVE9ETzogQW4gYGlzVmFsaWROb2RlYCBmdW5jdGlvbiB3b3VsZCBwcm9iYWJseSBiZSBtb3JlIGFwcHJvcHJpYXRlXG4gICAgcmVuZGVyZWRFbGVtZW50ID09PSBudWxsIHx8IHJlbmRlcmVkRWxlbWVudCA9PT0gZmFsc2UgfHwgUmVhY3QuaXNWYWxpZEVsZW1lbnQocmVuZGVyZWRFbGVtZW50KSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMucmVuZGVyKCk6IEEgdmFsaWQgUmVhY3QgZWxlbWVudCAob3IgbnVsbCkgbXVzdCBiZSByZXR1cm5lZC4gWW91IG1heSBoYXZlIHJldHVybmVkIHVuZGVmaW5lZCwgYW4gYXJyYXkgb3Igc29tZSBvdGhlciBpbnZhbGlkIG9iamVjdC4nLCB0aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IF9wcm9kSW52YXJpYW50KCcxMDknLCB0aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IHZvaWQgMDtcblxuICAgIHJldHVybiByZW5kZXJlZEVsZW1lbnQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIExhemlseSBhbGxvY2F0ZXMgdGhlIHJlZnMgb2JqZWN0IGFuZCBzdG9yZXMgYGNvbXBvbmVudGAgYXMgYHJlZmAuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWYgUmVmZXJlbmNlIG5hbWUuXG4gICAqIEBwYXJhbSB7Y29tcG9uZW50fSBjb21wb25lbnQgQ29tcG9uZW50IHRvIHN0b3JlIGFzIGByZWZgLlxuICAgKiBAZmluYWxcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGF0dGFjaFJlZjogZnVuY3Rpb24gKHJlZiwgY29tcG9uZW50KSB7XG4gICAgdmFyIGluc3QgPSB0aGlzLmdldFB1YmxpY0luc3RhbmNlKCk7XG4gICAgIShpbnN0ICE9IG51bGwpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1N0YXRlbGVzcyBmdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBoYXZlIHJlZnMuJykgOiBfcHJvZEludmFyaWFudCgnMTEwJykgOiB2b2lkIDA7XG4gICAgdmFyIHB1YmxpY0NvbXBvbmVudEluc3RhbmNlID0gY29tcG9uZW50LmdldFB1YmxpY0luc3RhbmNlKCk7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gY29tcG9uZW50ICYmIGNvbXBvbmVudC5nZXROYW1lID8gY29tcG9uZW50LmdldE5hbWUoKSA6ICdhIGNvbXBvbmVudCc7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhwdWJsaWNDb21wb25lbnRJbnN0YW5jZSAhPSBudWxsIHx8IGNvbXBvbmVudC5fY29tcG9zaXRlVHlwZSAhPT0gQ29tcG9zaXRlVHlwZXMuU3RhdGVsZXNzRnVuY3Rpb25hbCwgJ1N0YXRlbGVzcyBmdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBiZSBnaXZlbiByZWZzICcgKyAnKFNlZSByZWYgXCIlc1wiIGluICVzIGNyZWF0ZWQgYnkgJXMpLiAnICsgJ0F0dGVtcHRzIHRvIGFjY2VzcyB0aGlzIHJlZiB3aWxsIGZhaWwuJywgcmVmLCBjb21wb25lbnROYW1lLCB0aGlzLmdldE5hbWUoKSkgOiB2b2lkIDA7XG4gICAgfVxuICAgIHZhciByZWZzID0gaW5zdC5yZWZzID09PSBlbXB0eU9iamVjdCA/IGluc3QucmVmcyA9IHt9IDogaW5zdC5yZWZzO1xuICAgIHJlZnNbcmVmXSA9IHB1YmxpY0NvbXBvbmVudEluc3RhbmNlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZXRhY2hlcyBhIHJlZmVyZW5jZSBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmIE5hbWUgdG8gZGVyZWZlcmVuY2UuXG4gICAqIEBmaW5hbFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGV0YWNoUmVmOiBmdW5jdGlvbiAocmVmKSB7XG4gICAgdmFyIHJlZnMgPSB0aGlzLmdldFB1YmxpY0luc3RhbmNlKCkucmVmcztcbiAgICBkZWxldGUgcmVmc1tyZWZdO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgYSB0ZXh0IGRlc2NyaXB0aW9uIG9mIHRoZSBjb21wb25lbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSBpdFxuICAgKiBpbiBlcnJvciBtZXNzYWdlcy5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgbmFtZSBvciBudWxsLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGdldE5hbWU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdHlwZSA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7XG4gICAgdmFyIGNvbnN0cnVjdG9yID0gdGhpcy5faW5zdGFuY2UgJiYgdGhpcy5faW5zdGFuY2UuY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgY29uc3RydWN0b3IgJiYgY29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IGNvbnN0cnVjdG9yICYmIGNvbnN0cnVjdG9yLm5hbWUgfHwgbnVsbDtcbiAgfSxcblxuICAvKipcbiAgICogR2V0IHRoZSBwdWJsaWNseSBhY2Nlc3NpYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29tcG9uZW50IC0gaS5lLiB3aGF0XG4gICAqIGlzIGV4cG9zZWQgYnkgcmVmcyBhbmQgcmV0dXJuZWQgYnkgcmVuZGVyLiBDYW4gYmUgbnVsbCBmb3Igc3RhdGVsZXNzXG4gICAqIGNvbXBvbmVudHMuXG4gICAqXG4gICAqIEByZXR1cm4ge1JlYWN0Q29tcG9uZW50fSB0aGUgcHVibGljIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXRQdWJsaWNJbnN0YW5jZTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBpbnN0ID0gdGhpcy5faW5zdGFuY2U7XG4gICAgaWYgKHRoaXMuX2NvbXBvc2l0ZVR5cGUgPT09IENvbXBvc2l0ZVR5cGVzLlN0YXRlbGVzc0Z1bmN0aW9uYWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gaW5zdDtcbiAgfSxcblxuICAvLyBTdHViXG4gIF9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50OiBudWxsXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBlbXB0eUNvbXBvbmVudEZhY3Rvcnk7XG5cbnZhciBSZWFjdEVtcHR5Q29tcG9uZW50SW5qZWN0aW9uID0ge1xuICBpbmplY3RFbXB0eUNvbXBvbmVudEZhY3Rvcnk6IGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZW1wdHlDb21wb25lbnRGYWN0b3J5ID0gZmFjdG9yeTtcbiAgfVxufTtcblxudmFyIFJlYWN0RW1wdHlDb21wb25lbnQgPSB7XG4gIGNyZWF0ZTogZnVuY3Rpb24gKGluc3RhbnRpYXRlKSB7XG4gICAgcmV0dXJuIGVtcHR5Q29tcG9uZW50RmFjdG9yeShpbnN0YW50aWF0ZSk7XG4gIH1cbn07XG5cblJlYWN0RW1wdHlDb21wb25lbnQuaW5qZWN0aW9uID0gUmVhY3RFbXB0eUNvbXBvbmVudEluamVjdGlvbjtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEVtcHR5Q29tcG9uZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxudmFyIGdlbmVyaWNDb21wb25lbnRDbGFzcyA9IG51bGw7XG52YXIgdGV4dENvbXBvbmVudENsYXNzID0gbnVsbDtcblxudmFyIFJlYWN0SG9zdENvbXBvbmVudEluamVjdGlvbiA9IHtcbiAgLy8gVGhpcyBhY2NlcHRzIGEgY2xhc3MgdGhhdCByZWNlaXZlcyB0aGUgdGFnIHN0cmluZy4gVGhpcyBpcyBhIGNhdGNoIGFsbFxuICAvLyB0aGF0IGNhbiByZW5kZXIgYW55IGtpbmQgb2YgdGFnLlxuICBpbmplY3RHZW5lcmljQ29tcG9uZW50Q2xhc3M6IGZ1bmN0aW9uIChjb21wb25lbnRDbGFzcykge1xuICAgIGdlbmVyaWNDb21wb25lbnRDbGFzcyA9IGNvbXBvbmVudENsYXNzO1xuICB9LFxuICAvLyBUaGlzIGFjY2VwdHMgYSB0ZXh0IGNvbXBvbmVudCBjbGFzcyB0aGF0IHRha2VzIHRoZSB0ZXh0IHN0cmluZyB0byBiZVxuICAvLyByZW5kZXJlZCBhcyBwcm9wcy5cbiAgaW5qZWN0VGV4dENvbXBvbmVudENsYXNzOiBmdW5jdGlvbiAoY29tcG9uZW50Q2xhc3MpIHtcbiAgICB0ZXh0Q29tcG9uZW50Q2xhc3MgPSBjb21wb25lbnRDbGFzcztcbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgYSBob3N0IGludGVybmFsIGNvbXBvbmVudCBjbGFzcyBmb3IgYSBzcGVjaWZpYyB0YWcuXG4gKlxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gY3JlYXRlLlxuICogQHJldHVybiB7ZnVuY3Rpb259IFRoZSBpbnRlcm5hbCBjbGFzcyBjb25zdHJ1Y3RvciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW50ZXJuYWxDb21wb25lbnQoZWxlbWVudCkge1xuICAhZ2VuZXJpY0NvbXBvbmVudENsYXNzID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1RoZXJlIGlzIG5vIHJlZ2lzdGVyZWQgY29tcG9uZW50IGZvciB0aGUgdGFnICVzJywgZWxlbWVudC50eXBlKSA6IF9wcm9kSW52YXJpYW50KCcxMTEnLCBlbGVtZW50LnR5cGUpIDogdm9pZCAwO1xuICByZXR1cm4gbmV3IGdlbmVyaWNDb21wb25lbnRDbGFzcyhlbGVtZW50KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JlYWN0VGV4dH0gdGV4dFxuICogQHJldHVybiB7UmVhY3RDb21wb25lbnR9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlRm9yVGV4dCh0ZXh0KSB7XG4gIHJldHVybiBuZXcgdGV4dENvbXBvbmVudENsYXNzKHRleHQpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGNvbXBvbmVudFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNUZXh0Q29tcG9uZW50KGNvbXBvbmVudCkge1xuICByZXR1cm4gY29tcG9uZW50IGluc3RhbmNlb2YgdGV4dENvbXBvbmVudENsYXNzO1xufVxuXG52YXIgUmVhY3RIb3N0Q29tcG9uZW50ID0ge1xuICBjcmVhdGVJbnRlcm5hbENvbXBvbmVudDogY3JlYXRlSW50ZXJuYWxDb21wb25lbnQsXG4gIGNyZWF0ZUluc3RhbmNlRm9yVGV4dDogY3JlYXRlSW5zdGFuY2VGb3JUZXh0LFxuICBpc1RleHRDb21wb25lbnQ6IGlzVGV4dENvbXBvbmVudCxcbiAgaW5qZWN0aW9uOiBSZWFjdEhvc3RDb21wb25lbnRJbmplY3Rpb25cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RIb3N0Q29tcG9uZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIG5leHREZWJ1Z0lEID0gMTtcblxuZnVuY3Rpb24gZ2V0TmV4dERlYnVnSUQoKSB7XG4gIHJldHVybiBuZXh0RGVidWdJRCsrO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE5leHREZWJ1Z0lEOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50JyksXG4gICAgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpO1xudmFyIFJlYWN0RW1wdHlDb21wb25lbnQgPSByZXF1aXJlKCcuL1JlYWN0RW1wdHlDb21wb25lbnQnKTtcbnZhciBSZWFjdEhvc3RDb21wb25lbnQgPSByZXF1aXJlKCcuL1JlYWN0SG9zdENvbXBvbmVudCcpO1xuXG52YXIgZ2V0TmV4dERlYnVnSUQgPSByZXF1aXJlKCdyZWFjdC9saWIvZ2V0TmV4dERlYnVnSUQnKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG4vLyBUbyBhdm9pZCBhIGN5Y2xpYyBkZXBlbmRlbmN5LCB3ZSBjcmVhdGUgdGhlIGZpbmFsIGNsYXNzIGluIHRoaXMgbW9kdWxlXG52YXIgUmVhY3RDb21wb3NpdGVDb21wb25lbnRXcmFwcGVyID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgdGhpcy5jb25zdHJ1Y3QoZWxlbWVudCk7XG59O1xuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0ob3duZXIpIHtcbiAgaWYgKG93bmVyKSB7XG4gICAgdmFyIG5hbWUgPSBvd25lci5nZXROYW1lKCk7XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgdHlwZSByZWZlcmVuY2UgaXMgYSBrbm93biBpbnRlcm5hbCB0eXBlLiBJLmUuIG5vdCBhIHVzZXJcbiAqIHByb3ZpZGVkIGNvbXBvc2l0ZSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHR5cGVcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgdmFsaWQgaW50ZXJuYWwgdHlwZS5cbiAqL1xuZnVuY3Rpb24gaXNJbnRlcm5hbENvbXBvbmVudFR5cGUodHlwZSkge1xuICByZXR1cm4gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHR5cGUucHJvdG90eXBlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgdHlwZS5wcm90b3R5cGUubW91bnRDb21wb25lbnQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHR5cGUucHJvdG90eXBlLnJlY2VpdmVDb21wb25lbnQgPT09ICdmdW5jdGlvbic7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBSZWFjdE5vZGUsIGNyZWF0ZSBhbiBpbnN0YW5jZSB0aGF0IHdpbGwgYWN0dWFsbHkgYmUgbW91bnRlZC5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZVxuICogQHBhcmFtIHtib29sZWFufSBzaG91bGRIYXZlRGVidWdJRFxuICogQHJldHVybiB7b2JqZWN0fSBBIG5ldyBpbnN0YW5jZSBvZiB0aGUgZWxlbWVudCdzIGNvbnN0cnVjdG9yLlxuICogQHByb3RlY3RlZFxuICovXG5mdW5jdGlvbiBpbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KG5vZGUsIHNob3VsZEhhdmVEZWJ1Z0lEKSB7XG4gIHZhciBpbnN0YW5jZTtcblxuICBpZiAobm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSBmYWxzZSkge1xuICAgIGluc3RhbmNlID0gUmVhY3RFbXB0eUNvbXBvbmVudC5jcmVhdGUoaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG5vZGUgPT09ICdvYmplY3QnKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBub2RlO1xuICAgIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuICAgIGlmICh0eXBlb2YgdHlwZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHZhciBpbmZvID0gJyc7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGluZm8gKz0gJyBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSAnICsgXCJpdCdzIGRlZmluZWQgaW4uXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGluZm8gKz0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKGVsZW1lbnQuX293bmVyKTtcbiAgICAgICFmYWxzZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFbGVtZW50IHR5cGUgaXMgaW52YWxpZDogZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciBidWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlIGNvbXBvbmVudHMpIGJ1dCBnb3Q6ICVzLiVzJywgdHlwZSA9PSBudWxsID8gdHlwZSA6IHR5cGVvZiB0eXBlLCBpbmZvKSA6IF9wcm9kSW52YXJpYW50KCcxMzAnLCB0eXBlID09IG51bGwgPyB0eXBlIDogdHlwZW9mIHR5cGUsIGluZm8pIDogdm9pZCAwO1xuICAgIH1cblxuICAgIC8vIFNwZWNpYWwgY2FzZSBzdHJpbmcgdmFsdWVzXG4gICAgaWYgKHR5cGVvZiBlbGVtZW50LnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpbnN0YW5jZSA9IFJlYWN0SG9zdENvbXBvbmVudC5jcmVhdGVJbnRlcm5hbENvbXBvbmVudChlbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKGlzSW50ZXJuYWxDb21wb25lbnRUeXBlKGVsZW1lbnQudHlwZSkpIHtcbiAgICAgIC8vIFRoaXMgaXMgdGVtcG9yYXJpbHkgYXZhaWxhYmxlIGZvciBjdXN0b20gY29tcG9uZW50cyB0aGF0IGFyZSBub3Qgc3RyaW5nXG4gICAgICAvLyByZXByZXNlbnRhdGlvbnMuIEkuZS4gQVJULiBPbmNlIHRob3NlIGFyZSB1cGRhdGVkIHRvIHVzZSB0aGUgc3RyaW5nXG4gICAgICAvLyByZXByZXNlbnRhdGlvbiwgd2UgY2FuIGRyb3AgdGhpcyBjb2RlIHBhdGguXG4gICAgICBpbnN0YW5jZSA9IG5ldyBlbGVtZW50LnR5cGUoZWxlbWVudCk7XG5cbiAgICAgIC8vIFdlIHJlbmFtZWQgdGhpcy4gQWxsb3cgdGhlIG9sZCBuYW1lIGZvciBjb21wYXQuIDooXG4gICAgICBpZiAoIWluc3RhbmNlLmdldEhvc3ROb2RlKSB7XG4gICAgICAgIGluc3RhbmNlLmdldEhvc3ROb2RlID0gaW5zdGFuY2UuZ2V0TmF0aXZlTm9kZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UgPSBuZXcgUmVhY3RDb21wb3NpdGVDb21wb25lbnRXcmFwcGVyKGVsZW1lbnQpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2Ygbm9kZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5vZGUgPT09ICdudW1iZXInKSB7XG4gICAgaW5zdGFuY2UgPSBSZWFjdEhvc3RDb21wb25lbnQuY3JlYXRlSW5zdGFuY2VGb3JUZXh0KG5vZGUpO1xuICB9IGVsc2Uge1xuICAgICFmYWxzZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFbmNvdW50ZXJlZCBpbnZhbGlkIFJlYWN0IG5vZGUgb2YgdHlwZSAlcycsIHR5cGVvZiBub2RlKSA6IF9wcm9kSW52YXJpYW50KCcxMzEnLCB0eXBlb2Ygbm9kZSkgOiB2b2lkIDA7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHR5cGVvZiBpbnN0YW5jZS5tb3VudENvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UucmVjZWl2ZUNvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UuZ2V0SG9zdE5vZGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLnVubW91bnRDb21wb25lbnQgPT09ICdmdW5jdGlvbicsICdPbmx5IFJlYWN0IENvbXBvbmVudHMgY2FuIGJlIG1vdW50ZWQuJykgOiB2b2lkIDA7XG4gIH1cblxuICAvLyBUaGVzZSB0d28gZmllbGRzIGFyZSB1c2VkIGJ5IHRoZSBET00gYW5kIEFSVCBkaWZmaW5nIGFsZ29yaXRobXNcbiAgLy8gcmVzcGVjdGl2ZWx5LiBJbnN0ZWFkIG9mIHVzaW5nIGV4cGFuZG9zIG9uIGNvbXBvbmVudHMsIHdlIHNob3VsZCBiZVxuICAvLyBzdG9yaW5nIHRoZSBzdGF0ZSBuZWVkZWQgYnkgdGhlIGRpZmZpbmcgYWxnb3JpdGhtcyBlbHNld2hlcmUuXG4gIGluc3RhbmNlLl9tb3VudEluZGV4ID0gMDtcbiAgaW5zdGFuY2UuX21vdW50SW1hZ2UgPSBudWxsO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaW5zdGFuY2UuX2RlYnVnSUQgPSBzaG91bGRIYXZlRGVidWdJRCA/IGdldE5leHREZWJ1Z0lEKCkgOiAwO1xuICB9XG5cbiAgLy8gSW50ZXJuYWwgaW5zdGFuY2VzIHNob3VsZCBmdWxseSBjb25zdHJ1Y3RlZCBhdCB0aGlzIHBvaW50LCBzbyB0aGV5IHNob3VsZFxuICAvLyBub3QgZ2V0IGFueSBuZXcgZmllbGRzIGFkZGVkIHRvIHRoZW0gYXQgdGhpcyBwb2ludC5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKSB7XG4gICAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cblxuX2Fzc2lnbihSZWFjdENvbXBvc2l0ZUNvbXBvbmVudFdyYXBwZXIucHJvdG90eXBlLCBSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCwge1xuICBfaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudDogaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRXNjYXBlIGFuZCB3cmFwIGtleSBzbyBpdCBpcyBzYWZlIHRvIHVzZSBhcyBhIHJlYWN0aWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRvIGJlIGVzY2FwZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBlc2NhcGVkIGtleS5cbiAqL1xuXG5mdW5jdGlvbiBlc2NhcGUoa2V5KSB7XG4gIHZhciBlc2NhcGVSZWdleCA9IC9bPTpdL2c7XG4gIHZhciBlc2NhcGVyTG9va3VwID0ge1xuICAgICc9JzogJz0wJyxcbiAgICAnOic6ICc9MidcbiAgfTtcbiAgdmFyIGVzY2FwZWRTdHJpbmcgPSAoJycgKyBrZXkpLnJlcGxhY2UoZXNjYXBlUmVnZXgsIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgIHJldHVybiBlc2NhcGVyTG9va3VwW21hdGNoXTtcbiAgfSk7XG5cbiAgcmV0dXJuICckJyArIGVzY2FwZWRTdHJpbmc7XG59XG5cbi8qKlxuICogVW5lc2NhcGUgYW5kIHVud3JhcCBrZXkgZm9yIGh1bWFuLXJlYWRhYmxlIGRpc3BsYXlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRvIHVuZXNjYXBlLlxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgdW5lc2NhcGVkIGtleS5cbiAqL1xuZnVuY3Rpb24gdW5lc2NhcGUoa2V5KSB7XG4gIHZhciB1bmVzY2FwZVJlZ2V4ID0gLyg9MHw9MikvZztcbiAgdmFyIHVuZXNjYXBlckxvb2t1cCA9IHtcbiAgICAnPTAnOiAnPScsXG4gICAgJz0yJzogJzonXG4gIH07XG4gIHZhciBrZXlTdWJzdHJpbmcgPSBrZXlbMF0gPT09ICcuJyAmJiBrZXlbMV0gPT09ICckJyA/IGtleS5zdWJzdHJpbmcoMikgOiBrZXkuc3Vic3RyaW5nKDEpO1xuXG4gIHJldHVybiAoJycgKyBrZXlTdWJzdHJpbmcpLnJlcGxhY2UodW5lc2NhcGVSZWdleCwgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgcmV0dXJuIHVuZXNjYXBlckxvb2t1cFttYXRjaF07XG4gIH0pO1xufVxuXG52YXIgS2V5RXNjYXBlVXRpbHMgPSB7XG4gIGVzY2FwZTogZXNjYXBlLFxuICB1bmVzY2FwZTogdW5lc2NhcGVcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gS2V5RXNjYXBlVXRpbHM7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQgdHlwZS4gSWYgdGhlcmUgaXMgbm8gbmF0aXZlIFN5bWJvbFxuLy8gbm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlLlxuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2xbJ2ZvciddICYmIFN5bWJvbFsnZm9yJ10oJ3JlYWN0LmVsZW1lbnQnKSB8fCAweGVhYzc7XG5cbm1vZHVsZS5leHBvcnRzID0gUkVBQ1RfRUxFTUVOVF9UWVBFOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsIFN5bWJvbCAqL1xuXG52YXIgSVRFUkFUT1JfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaXRlcmF0b3I7XG52YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7IC8vIEJlZm9yZSBTeW1ib2wgc3BlYy5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpdGVyYXRvciBtZXRob2QgZnVuY3Rpb24gY29udGFpbmVkIG9uIHRoZSBpdGVyYWJsZSBvYmplY3QuXG4gKlxuICogQmUgc3VyZSB0byBpbnZva2UgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGl0ZXJhYmxlIGFzIGNvbnRleHQ6XG4gKlxuICogICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihteUl0ZXJhYmxlKTtcbiAqICAgICBpZiAoaXRlcmF0b3JGbikge1xuICogICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG15SXRlcmFibGUpO1xuICogICAgICAgLi4uXG4gKiAgICAgfVxuICpcbiAqIEBwYXJhbSB7P29iamVjdH0gbWF5YmVJdGVyYWJsZVxuICogQHJldHVybiB7P2Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgdmFyIGl0ZXJhdG9yRm4gPSBtYXliZUl0ZXJhYmxlICYmIChJVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtJVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdKTtcbiAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGl0ZXJhdG9yRm47XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRJdGVyYXRvckZuOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdEN1cnJlbnRPd25lcicpO1xudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50U3ltYm9sJyk7XG5cbnZhciBnZXRJdGVyYXRvckZuID0gcmVxdWlyZSgnLi9nZXRJdGVyYXRvckZuJyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgS2V5RXNjYXBlVXRpbHMgPSByZXF1aXJlKCcuL0tleUVzY2FwZVV0aWxzJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIFNFUEFSQVRPUiA9ICcuJztcbnZhciBTVUJTRVBBUkFUT1IgPSAnOic7XG5cbi8qKlxuICogVGhpcyBpcyBpbmxpbmVkIGZyb20gUmVhY3RFbGVtZW50IHNpbmNlIHRoaXMgZmlsZSBpcyBzaGFyZWQgYmV0d2VlblxuICogaXNvbW9ycGhpYyBhbmQgcmVuZGVyZXJzLiBXZSBjb3VsZCBleHRyYWN0IHRoaXMgdG8gYVxuICpcbiAqL1xuXG4vKipcbiAqIFRPRE86IFRlc3QgdGhhdCBhIHNpbmdsZSBjaGlsZCBhbmQgYW4gYXJyYXkgd2l0aCBvbmUgaXRlbSBoYXZlIHRoZSBzYW1lIGtleVxuICogcGF0dGVybi5cbiAqL1xuXG52YXIgZGlkV2FybkFib3V0TWFwcyA9IGZhbHNlO1xuXG4vKipcbiAqIEdlbmVyYXRlIGEga2V5IHN0cmluZyB0aGF0IGlkZW50aWZpZXMgYSBjb21wb25lbnQgd2l0aGluIGEgc2V0LlxuICpcbiAqIEBwYXJhbSB7Kn0gY29tcG9uZW50IEEgY29tcG9uZW50IHRoYXQgY291bGQgY29udGFpbiBhIG1hbnVhbCBrZXkuXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggdGhhdCBpcyB1c2VkIGlmIGEgbWFudWFsIGtleSBpcyBub3QgcHJvdmlkZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldENvbXBvbmVudEtleShjb21wb25lbnQsIGluZGV4KSB7XG4gIC8vIERvIHNvbWUgdHlwZWNoZWNraW5nIGhlcmUgc2luY2Ugd2UgY2FsbCB0aGlzIGJsaW5kbHkuIFdlIHdhbnQgdG8gZW5zdXJlXG4gIC8vIHRoYXQgd2UgZG9uJ3QgYmxvY2sgcG90ZW50aWFsIGZ1dHVyZSBFUyBBUElzLlxuICBpZiAoY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQgPT09ICdvYmplY3QnICYmIGNvbXBvbmVudC5rZXkgIT0gbnVsbCkge1xuICAgIC8vIEV4cGxpY2l0IGtleVxuICAgIHJldHVybiBLZXlFc2NhcGVVdGlscy5lc2NhcGUoY29tcG9uZW50LmtleSk7XG4gIH1cbiAgLy8gSW1wbGljaXQga2V5IGRldGVybWluZWQgYnkgdGhlIGluZGV4IGluIHRoZSBzZXRcbiAgcmV0dXJuIGluZGV4LnRvU3RyaW5nKDM2KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7IXN0cmluZ30gbmFtZVNvRmFyIE5hbWUgb2YgdGhlIGtleSBwYXRoIHNvIGZhci5cbiAqIEBwYXJhbSB7IWZ1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayB0byBpbnZva2Ugd2l0aCBlYWNoIGNoaWxkIGZvdW5kLlxuICogQHBhcmFtIHs/Kn0gdHJhdmVyc2VDb250ZXh0IFVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0aHJvdWdob3V0IHRoZSB0cmF2ZXJzYWxcbiAqIHByb2Nlc3MuXG4gKiBAcmV0dXJuIHshbnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHRoaXMgc3VidHJlZS5cbiAqL1xuZnVuY3Rpb24gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGRyZW4sIG5hbWVTb0ZhciwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiBjaGlsZHJlbjtcblxuICBpZiAodHlwZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgLy8gQWxsIG9mIHRoZSBhYm92ZSBhcmUgcGVyY2VpdmVkIGFzIG51bGwuXG4gICAgY2hpbGRyZW4gPSBudWxsO1xuICB9XG5cbiAgaWYgKGNoaWxkcmVuID09PSBudWxsIHx8IHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICdudW1iZXInIHx8XG4gIC8vIFRoZSBmb2xsb3dpbmcgaXMgaW5saW5lZCBmcm9tIFJlYWN0RWxlbWVudC4gVGhpcyBtZWFucyB3ZSBjYW4gb3B0aW1pemVcbiAgLy8gc29tZSBjaGVja3MuIFJlYWN0IEZpYmVyIGFsc28gaW5saW5lcyB0aGlzIGxvZ2ljIGZvciBzaW1pbGFyIHB1cnBvc2VzLlxuICB0eXBlID09PSAnb2JqZWN0JyAmJiBjaGlsZHJlbi4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgY2FsbGJhY2sodHJhdmVyc2VDb250ZXh0LCBjaGlsZHJlbixcbiAgICAvLyBJZiBpdCdzIHRoZSBvbmx5IGNoaWxkLCB0cmVhdCB0aGUgbmFtZSBhcyBpZiBpdCB3YXMgd3JhcHBlZCBpbiBhbiBhcnJheVxuICAgIC8vIHNvIHRoYXQgaXQncyBjb25zaXN0ZW50IGlmIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gZ3Jvd3MuXG4gICAgbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiArIGdldENvbXBvbmVudEtleShjaGlsZHJlbiwgMCkgOiBuYW1lU29GYXIpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgdmFyIGNoaWxkO1xuICB2YXIgbmV4dE5hbWU7XG4gIHZhciBzdWJ0cmVlQ291bnQgPSAwOyAvLyBDb3VudCBvZiBjaGlsZHJlbiBmb3VuZCBpbiB0aGUgY3VycmVudCBzdWJ0cmVlLlxuICB2YXIgbmV4dE5hbWVQcmVmaXggPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SIDogbmFtZVNvRmFyICsgU1VCU0VQQVJBVE9SO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkLCBpKTtcbiAgICAgIHN1YnRyZWVDb3VudCArPSB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZCwgbmV4dE5hbWUsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4oY2hpbGRyZW4pO1xuICAgIGlmIChpdGVyYXRvckZuKSB7XG4gICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoY2hpbGRyZW4pO1xuICAgICAgdmFyIHN0ZXA7XG4gICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gY2hpbGRyZW4uZW50cmllcykge1xuICAgICAgICB2YXIgaWkgPSAwO1xuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgY2hpbGQgPSBzdGVwLnZhbHVlO1xuICAgICAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRDb21wb25lbnRLZXkoY2hpbGQsIGlpKyspO1xuICAgICAgICAgIHN1YnRyZWVDb3VudCArPSB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZCwgbmV4dE5hbWUsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIHZhciBtYXBzQXNDaGlsZHJlbkFkZGVuZHVtID0gJyc7XG4gICAgICAgICAgaWYgKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHZhciBtYXBzQXNDaGlsZHJlbk93bmVyTmFtZSA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuZ2V0TmFtZSgpO1xuICAgICAgICAgICAgaWYgKG1hcHNBc0NoaWxkcmVuT3duZXJOYW1lKSB7XG4gICAgICAgICAgICAgIG1hcHNBc0NoaWxkcmVuQWRkZW5kdW0gPSAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbWFwc0FzQ2hpbGRyZW5Pd25lck5hbWUgKyAnYC4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhkaWRXYXJuQWJvdXRNYXBzLCAnVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3QgeWV0IGZ1bGx5IHN1cHBvcnRlZC4gSXQgaXMgYW4gJyArICdleHBlcmltZW50YWwgZmVhdHVyZSB0aGF0IG1pZ2h0IGJlIHJlbW92ZWQuIENvbnZlcnQgaXQgdG8gYSAnICsgJ3NlcXVlbmNlIC8gaXRlcmFibGUgb2Yga2V5ZWQgUmVhY3RFbGVtZW50cyBpbnN0ZWFkLiVzJywgbWFwc0FzQ2hpbGRyZW5BZGRlbmR1bSkgOiB2b2lkIDA7XG4gICAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSXRlcmF0b3Igd2lsbCBwcm92aWRlIGVudHJ5IFtrLHZdIHR1cGxlcyByYXRoZXIgdGhhbiB2YWx1ZXMuXG4gICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlO1xuICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgY2hpbGQgPSBlbnRyeVsxXTtcbiAgICAgICAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBLZXlFc2NhcGVVdGlscy5lc2NhcGUoZW50cnlbMF0pICsgU1VCU0VQQVJBVE9SICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkLCAwKTtcbiAgICAgICAgICAgIHN1YnRyZWVDb3VudCArPSB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZCwgbmV4dE5hbWUsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBhZGRlbmR1bSA9ICcnO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgYWRkZW5kdW0gPSAnIElmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgJyArICdpbnN0ZWFkIG9yIHdyYXAgdGhlIG9iamVjdCB1c2luZyBjcmVhdGVGcmFnbWVudChvYmplY3QpIGZyb20gdGhlICcgKyAnUmVhY3QgYWRkLW9ucy4nO1xuICAgICAgICBpZiAoY2hpbGRyZW4uX2lzUmVhY3RFbGVtZW50KSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSBcIiBJdCBsb29rcyBsaWtlIHlvdSdyZSB1c2luZyBhbiBlbGVtZW50IGNyZWF0ZWQgYnkgYSBkaWZmZXJlbnQgXCIgKyAndmVyc2lvbiBvZiBSZWFjdC4gTWFrZSBzdXJlIHRvIHVzZSBvbmx5IG9uZSBjb3B5IG9mIFJlYWN0Lic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICAgICAgICB2YXIgbmFtZSA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuZ2V0TmFtZSgpO1xuICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICBhZGRlbmR1bSArPSAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgY2hpbGRyZW5TdHJpbmcgPSBTdHJpbmcoY2hpbGRyZW4pO1xuICAgICAgIWZhbHNlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ09iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogJXMpLiVzJywgY2hpbGRyZW5TdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjaGlsZHJlbikuam9pbignLCAnKSArICd9JyA6IGNoaWxkcmVuU3RyaW5nLCBhZGRlbmR1bSkgOiBfcHJvZEludmFyaWFudCgnMzEnLCBjaGlsZHJlblN0cmluZyA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKGNoaWxkcmVuKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRyZW5TdHJpbmcsIGFkZGVuZHVtKSA6IHZvaWQgMDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3VidHJlZUNvdW50O1xufVxuXG4vKipcbiAqIFRyYXZlcnNlcyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAsIGJ1dFxuICogbWlnaHQgYWxzbyBiZSBzcGVjaWZpZWQgdGhyb3VnaCBhdHRyaWJ1dGVzOlxuICpcbiAqIC0gYHRyYXZlcnNlQWxsQ2hpbGRyZW4odGhpcy5wcm9wcy5jaGlsZHJlbiwgLi4uKWBcbiAqIC0gYHRyYXZlcnNlQWxsQ2hpbGRyZW4odGhpcy5wcm9wcy5sZWZ0UGFuZWxDaGlsZHJlbiwgLi4uKWBcbiAqXG4gKiBUaGUgYHRyYXZlcnNlQ29udGV4dGAgaXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdGhyb3VnaCB0aGVcbiAqIGVudGlyZSB0cmF2ZXJzYWwuIEl0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIGFjY3VtdWxhdGlvbnMgb3IgYW55dGhpbmcgZWxzZSB0aGF0XG4gKiB0aGUgY2FsbGJhY2sgbWlnaHQgZmluZCByZWxldmFudC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIG9iamVjdC5cbiAqIEBwYXJhbSB7IWZ1bmN0aW9ufSBjYWxsYmFjayBUbyBpbnZva2UgdXBvbiB0cmF2ZXJzaW5nIGVhY2ggY2hpbGQuXG4gKiBAcGFyYW0gez8qfSB0cmF2ZXJzZUNvbnRleHQgQ29udGV4dCBmb3IgdHJhdmVyc2FsLlxuICogQHJldHVybiB7IW51bWJlcn0gVGhlIG51bWJlciBvZiBjaGlsZHJlbiBpbiB0aGlzIHN1YnRyZWUuXG4gKi9cbmZ1bmN0aW9uIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZHJlbiwgJycsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRyYXZlcnNlQWxsQ2hpbGRyZW47IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNi1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSByZXF1aXJlKCcuL1JlYWN0Q3VycmVudE93bmVyJyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG5mdW5jdGlvbiBpc05hdGl2ZShmbikge1xuICAvLyBCYXNlZCBvbiBpc05hdGl2ZSgpIGZyb20gTG9kYXNoXG4gIHZhciBmdW5jVG9TdHJpbmcgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7XG4gIHZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG4gIHZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArIGZ1bmNUb1N0cmluZ1xuICAvLyBUYWtlIGFuIGV4YW1wbGUgbmF0aXZlIGZ1bmN0aW9uIHNvdXJjZSBmb3IgY29tcGFyaXNvblxuICAuY2FsbChoYXNPd25Qcm9wZXJ0eVxuICAvLyBTdHJpcCByZWdleCBjaGFyYWN0ZXJzIHNvIHdlIGNhbiB1c2UgaXQgZm9yIHJlZ2V4XG4gICkucmVwbGFjZSgvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2csICdcXFxcJCYnXG4gIC8vIFJlbW92ZSBoYXNPd25Qcm9wZXJ0eSBmcm9tIHRoZSB0ZW1wbGF0ZSB0byBtYWtlIGl0IGdlbmVyaWNcbiAgKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcXFxcKCl8IGZvciAuKz8oPz1cXFxcXFxdKS9nLCAnJDEuKj8nKSArICckJyk7XG4gIHRyeSB7XG4gICAgdmFyIHNvdXJjZSA9IGZ1bmNUb1N0cmluZy5jYWxsKGZuKTtcbiAgICByZXR1cm4gcmVJc05hdGl2ZS50ZXN0KHNvdXJjZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG52YXIgY2FuVXNlQ29sbGVjdGlvbnMgPVxuLy8gQXJyYXkuZnJvbVxudHlwZW9mIEFycmF5LmZyb20gPT09ICdmdW5jdGlvbicgJiZcbi8vIE1hcFxudHlwZW9mIE1hcCA9PT0gJ2Z1bmN0aW9uJyAmJiBpc05hdGl2ZShNYXApICYmXG4vLyBNYXAucHJvdG90eXBlLmtleXNcbk1hcC5wcm90b3R5cGUgIT0gbnVsbCAmJiB0eXBlb2YgTWFwLnByb3RvdHlwZS5rZXlzID09PSAnZnVuY3Rpb24nICYmIGlzTmF0aXZlKE1hcC5wcm90b3R5cGUua2V5cykgJiZcbi8vIFNldFxudHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJyAmJiBpc05hdGl2ZShTZXQpICYmXG4vLyBTZXQucHJvdG90eXBlLmtleXNcblNldC5wcm90b3R5cGUgIT0gbnVsbCAmJiB0eXBlb2YgU2V0LnByb3RvdHlwZS5rZXlzID09PSAnZnVuY3Rpb24nICYmIGlzTmF0aXZlKFNldC5wcm90b3R5cGUua2V5cyk7XG5cbnZhciBzZXRJdGVtO1xudmFyIGdldEl0ZW07XG52YXIgcmVtb3ZlSXRlbTtcbnZhciBnZXRJdGVtSURzO1xudmFyIGFkZFJvb3Q7XG52YXIgcmVtb3ZlUm9vdDtcbnZhciBnZXRSb290SURzO1xuXG5pZiAoY2FuVXNlQ29sbGVjdGlvbnMpIHtcbiAgdmFyIGl0ZW1NYXAgPSBuZXcgTWFwKCk7XG4gIHZhciByb290SURTZXQgPSBuZXcgU2V0KCk7XG5cbiAgc2V0SXRlbSA9IGZ1bmN0aW9uIChpZCwgaXRlbSkge1xuICAgIGl0ZW1NYXAuc2V0KGlkLCBpdGVtKTtcbiAgfTtcbiAgZ2V0SXRlbSA9IGZ1bmN0aW9uIChpZCkge1xuICAgIHJldHVybiBpdGVtTWFwLmdldChpZCk7XG4gIH07XG4gIHJlbW92ZUl0ZW0gPSBmdW5jdGlvbiAoaWQpIHtcbiAgICBpdGVtTWFwWydkZWxldGUnXShpZCk7XG4gIH07XG4gIGdldEl0ZW1JRHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oaXRlbU1hcC5rZXlzKCkpO1xuICB9O1xuXG4gIGFkZFJvb3QgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICByb290SURTZXQuYWRkKGlkKTtcbiAgfTtcbiAgcmVtb3ZlUm9vdCA9IGZ1bmN0aW9uIChpZCkge1xuICAgIHJvb3RJRFNldFsnZGVsZXRlJ10oaWQpO1xuICB9O1xuICBnZXRSb290SURzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHJvb3RJRFNldC5rZXlzKCkpO1xuICB9O1xufSBlbHNlIHtcbiAgdmFyIGl0ZW1CeUtleSA9IHt9O1xuICB2YXIgcm9vdEJ5S2V5ID0ge307XG5cbiAgLy8gVXNlIG5vbi1udW1lcmljIGtleXMgdG8gcHJldmVudCBWOCBwZXJmb3JtYW5jZSBpc3N1ZXM6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzcyMzJcbiAgdmFyIGdldEtleUZyb21JRCA9IGZ1bmN0aW9uIChpZCkge1xuICAgIHJldHVybiAnLicgKyBpZDtcbiAgfTtcbiAgdmFyIGdldElERnJvbUtleSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gcGFyc2VJbnQoa2V5LnN1YnN0cigxKSwgMTApO1xuICB9O1xuXG4gIHNldEl0ZW0gPSBmdW5jdGlvbiAoaWQsIGl0ZW0pIHtcbiAgICB2YXIga2V5ID0gZ2V0S2V5RnJvbUlEKGlkKTtcbiAgICBpdGVtQnlLZXlba2V5XSA9IGl0ZW07XG4gIH07XG4gIGdldEl0ZW0gPSBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIga2V5ID0gZ2V0S2V5RnJvbUlEKGlkKTtcbiAgICByZXR1cm4gaXRlbUJ5S2V5W2tleV07XG4gIH07XG4gIHJlbW92ZUl0ZW0gPSBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIga2V5ID0gZ2V0S2V5RnJvbUlEKGlkKTtcbiAgICBkZWxldGUgaXRlbUJ5S2V5W2tleV07XG4gIH07XG4gIGdldEl0ZW1JRHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGl0ZW1CeUtleSkubWFwKGdldElERnJvbUtleSk7XG4gIH07XG5cbiAgYWRkUm9vdCA9IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBrZXkgPSBnZXRLZXlGcm9tSUQoaWQpO1xuICAgIHJvb3RCeUtleVtrZXldID0gdHJ1ZTtcbiAgfTtcbiAgcmVtb3ZlUm9vdCA9IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBrZXkgPSBnZXRLZXlGcm9tSUQoaWQpO1xuICAgIGRlbGV0ZSByb290QnlLZXlba2V5XTtcbiAgfTtcbiAgZ2V0Um9vdElEcyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocm9vdEJ5S2V5KS5tYXAoZ2V0SURGcm9tS2V5KTtcbiAgfTtcbn1cblxudmFyIHVubW91bnRlZElEcyA9IFtdO1xuXG5mdW5jdGlvbiBwdXJnZURlZXAoaWQpIHtcbiAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTtcbiAgaWYgKGl0ZW0pIHtcbiAgICB2YXIgY2hpbGRJRHMgPSBpdGVtLmNoaWxkSURzO1xuXG4gICAgcmVtb3ZlSXRlbShpZCk7XG4gICAgY2hpbGRJRHMuZm9yRWFjaChwdXJnZURlZXApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlQ29tcG9uZW50RnJhbWUobmFtZSwgc291cmNlLCBvd25lck5hbWUpIHtcbiAgcmV0dXJuICdcXG4gICAgaW4gJyArIChuYW1lIHx8ICdVbmtub3duJykgKyAoc291cmNlID8gJyAoYXQgJyArIHNvdXJjZS5maWxlTmFtZS5yZXBsYWNlKC9eLipbXFxcXFxcL10vLCAnJykgKyAnOicgKyBzb3VyY2UubGluZU51bWJlciArICcpJyA6IG93bmVyTmFtZSA/ICcgKGNyZWF0ZWQgYnkgJyArIG93bmVyTmFtZSArICcpJyA6ICcnKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGlzcGxheU5hbWUoZWxlbWVudCkge1xuICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuICcjZW1wdHknO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZWxlbWVudCA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gJyN0ZXh0JztcbiAgfSBlbHNlIGlmICh0eXBlb2YgZWxlbWVudC50eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBlbGVtZW50LnR5cGU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGVsZW1lbnQudHlwZS5kaXNwbGF5TmFtZSB8fCBlbGVtZW50LnR5cGUubmFtZSB8fCAnVW5rbm93bic7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVJRChpZCkge1xuICB2YXIgbmFtZSA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RGlzcGxheU5hbWUoaWQpO1xuICB2YXIgZWxlbWVudCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RWxlbWVudChpZCk7XG4gIHZhciBvd25lcklEID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRPd25lcklEKGlkKTtcbiAgdmFyIG93bmVyTmFtZTtcbiAgaWYgKG93bmVySUQpIHtcbiAgICBvd25lck5hbWUgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldERpc3BsYXlOYW1lKG93bmVySUQpO1xuICB9XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGVsZW1lbnQsICdSZWFjdENvbXBvbmVudFRyZWVIb29rOiBNaXNzaW5nIFJlYWN0IGVsZW1lbnQgZm9yIGRlYnVnSUQgJXMgd2hlbiAnICsgJ2J1aWxkaW5nIHN0YWNrJywgaWQpIDogdm9pZCAwO1xuICByZXR1cm4gZGVzY3JpYmVDb21wb25lbnRGcmFtZShuYW1lLCBlbGVtZW50ICYmIGVsZW1lbnQuX3NvdXJjZSwgb3duZXJOYW1lKTtcbn1cblxudmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSB7XG4gIG9uU2V0Q2hpbGRyZW46IGZ1bmN0aW9uIChpZCwgbmV4dENoaWxkSURzKSB7XG4gICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTtcbiAgICAhaXRlbSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdJdGVtIG11c3QgaGF2ZSBiZWVuIHNldCcpIDogX3Byb2RJbnZhcmlhbnQoJzE0NCcpIDogdm9pZCAwO1xuICAgIGl0ZW0uY2hpbGRJRHMgPSBuZXh0Q2hpbGRJRHM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5leHRDaGlsZElEcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5leHRDaGlsZElEID0gbmV4dENoaWxkSURzW2ldO1xuICAgICAgdmFyIG5leHRDaGlsZCA9IGdldEl0ZW0obmV4dENoaWxkSUQpO1xuICAgICAgIW5leHRDaGlsZCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCBob29rIGV2ZW50cyB0byBmaXJlIGZvciB0aGUgY2hpbGQgYmVmb3JlIGl0cyBwYXJlbnQgaW5jbHVkZXMgaXQgaW4gb25TZXRDaGlsZHJlbigpLicpIDogX3Byb2RJbnZhcmlhbnQoJzE0MCcpIDogdm9pZCAwO1xuICAgICAgIShuZXh0Q2hpbGQuY2hpbGRJRHMgIT0gbnVsbCB8fCB0eXBlb2YgbmV4dENoaWxkLmVsZW1lbnQgIT09ICdvYmplY3QnIHx8IG5leHRDaGlsZC5lbGVtZW50ID09IG51bGwpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V4cGVjdGVkIG9uU2V0Q2hpbGRyZW4oKSB0byBmaXJlIGZvciBhIGNvbnRhaW5lciBjaGlsZCBiZWZvcmUgaXRzIHBhcmVudCBpbmNsdWRlcyBpdCBpbiBvblNldENoaWxkcmVuKCkuJykgOiBfcHJvZEludmFyaWFudCgnMTQxJykgOiB2b2lkIDA7XG4gICAgICAhbmV4dENoaWxkLmlzTW91bnRlZCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCBvbk1vdW50Q29tcG9uZW50KCkgdG8gZmlyZSBmb3IgdGhlIGNoaWxkIGJlZm9yZSBpdHMgcGFyZW50IGluY2x1ZGVzIGl0IGluIG9uU2V0Q2hpbGRyZW4oKS4nKSA6IF9wcm9kSW52YXJpYW50KCc3MScpIDogdm9pZCAwO1xuICAgICAgaWYgKG5leHRDaGlsZC5wYXJlbnRJRCA9PSBudWxsKSB7XG4gICAgICAgIG5leHRDaGlsZC5wYXJlbnRJRCA9IGlkO1xuICAgICAgICAvLyBUT0RPOiBUaGlzIHNob3VsZG4ndCBiZSBuZWNlc3NhcnkgYnV0IG1vdW50aW5nIGEgbmV3IHJvb3QgZHVyaW5nIGluXG4gICAgICAgIC8vIGNvbXBvbmVudFdpbGxNb3VudCBjdXJyZW50bHkgY2F1c2VzIG5vdC15ZXQtbW91bnRlZCBjb21wb25lbnRzIHRvXG4gICAgICAgIC8vIGJlIHB1cmdlZCBmcm9tIG91ciB0cmVlIGRhdGEgc28gdGhlaXIgcGFyZW50IGlkIGlzIG1pc3NpbmcuXG4gICAgICB9XG4gICAgICAhKG5leHRDaGlsZC5wYXJlbnRJRCA9PT0gaWQpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V4cGVjdGVkIG9uQmVmb3JlTW91bnRDb21wb25lbnQoKSBwYXJlbnQgYW5kIG9uU2V0Q2hpbGRyZW4oKSB0byBiZSBjb25zaXN0ZW50ICglcyBoYXMgcGFyZW50cyAlcyBhbmQgJXMpLicsIG5leHRDaGlsZElELCBuZXh0Q2hpbGQucGFyZW50SUQsIGlkKSA6IF9wcm9kSW52YXJpYW50KCcxNDInLCBuZXh0Q2hpbGRJRCwgbmV4dENoaWxkLnBhcmVudElELCBpZCkgOiB2b2lkIDA7XG4gICAgfVxuICB9LFxuICBvbkJlZm9yZU1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoaWQsIGVsZW1lbnQsIHBhcmVudElEKSB7XG4gICAgdmFyIGl0ZW0gPSB7XG4gICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgcGFyZW50SUQ6IHBhcmVudElELFxuICAgICAgdGV4dDogbnVsbCxcbiAgICAgIGNoaWxkSURzOiBbXSxcbiAgICAgIGlzTW91bnRlZDogZmFsc2UsXG4gICAgICB1cGRhdGVDb3VudDogMFxuICAgIH07XG4gICAgc2V0SXRlbShpZCwgaXRlbSk7XG4gIH0sXG4gIG9uQmVmb3JlVXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAoaWQsIGVsZW1lbnQpIHtcbiAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpO1xuICAgIGlmICghaXRlbSB8fCAhaXRlbS5pc01vdW50ZWQpIHtcbiAgICAgIC8vIFdlIG1heSBlbmQgdXAgaGVyZSBhcyBhIHJlc3VsdCBvZiBzZXRTdGF0ZSgpIGluIGNvbXBvbmVudFdpbGxVbm1vdW50KCkuXG4gICAgICAvLyBJbiB0aGlzIGNhc2UsIGlnbm9yZSB0aGUgZWxlbWVudC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXRlbS5lbGVtZW50ID0gZWxlbWVudDtcbiAgfSxcbiAgb25Nb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTtcbiAgICAhaXRlbSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdJdGVtIG11c3QgaGF2ZSBiZWVuIHNldCcpIDogX3Byb2RJbnZhcmlhbnQoJzE0NCcpIDogdm9pZCAwO1xuICAgIGl0ZW0uaXNNb3VudGVkID0gdHJ1ZTtcbiAgICB2YXIgaXNSb290ID0gaXRlbS5wYXJlbnRJRCA9PT0gMDtcbiAgICBpZiAoaXNSb290KSB7XG4gICAgICBhZGRSb290KGlkKTtcbiAgICB9XG4gIH0sXG4gIG9uVXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpO1xuICAgIGlmICghaXRlbSB8fCAhaXRlbS5pc01vdW50ZWQpIHtcbiAgICAgIC8vIFdlIG1heSBlbmQgdXAgaGVyZSBhcyBhIHJlc3VsdCBvZiBzZXRTdGF0ZSgpIGluIGNvbXBvbmVudFdpbGxVbm1vdW50KCkuXG4gICAgICAvLyBJbiB0aGlzIGNhc2UsIGlnbm9yZSB0aGUgZWxlbWVudC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXRlbS51cGRhdGVDb3VudCsrO1xuICB9LFxuICBvblVubW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7XG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgaXQgZXhpc3RzLlxuICAgICAgLy8gYGl0ZW1gIG1pZ2h0IG5vdCBleGlzdCBpZiBpdCBpcyBpbnNpZGUgYW4gZXJyb3IgYm91bmRhcnksIGFuZCBhIHNpYmxpbmdcbiAgICAgIC8vIGVycm9yIGJvdW5kYXJ5IGNoaWxkIHRocmV3IHdoaWxlIG1vdW50aW5nLiBUaGVuIHRoaXMgaW5zdGFuY2UgbmV2ZXJcbiAgICAgIC8vIGdvdCBhIGNoYW5jZSB0byBtb3VudCwgYnV0IGl0IHN0aWxsIGdldHMgYW4gdW5tb3VudGluZyBldmVudCBkdXJpbmdcbiAgICAgIC8vIHRoZSBlcnJvciBib3VuZGFyeSBjbGVhbnVwLlxuICAgICAgaXRlbS5pc01vdW50ZWQgPSBmYWxzZTtcbiAgICAgIHZhciBpc1Jvb3QgPSBpdGVtLnBhcmVudElEID09PSAwO1xuICAgICAgaWYgKGlzUm9vdCkge1xuICAgICAgICByZW1vdmVSb290KGlkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdW5tb3VudGVkSURzLnB1c2goaWQpO1xuICB9LFxuICBwdXJnZVVubW91bnRlZENvbXBvbmVudHM6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoUmVhY3RDb21wb25lbnRUcmVlSG9vay5fcHJldmVudFB1cmdpbmcpIHtcbiAgICAgIC8vIFNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHRlc3RpbmcuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1bm1vdW50ZWRJRHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpZCA9IHVubW91bnRlZElEc1tpXTtcbiAgICAgIHB1cmdlRGVlcChpZCk7XG4gICAgfVxuICAgIHVubW91bnRlZElEcy5sZW5ndGggPSAwO1xuICB9LFxuICBpc01vdW50ZWQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7XG4gICAgcmV0dXJuIGl0ZW0gPyBpdGVtLmlzTW91bnRlZCA6IGZhbHNlO1xuICB9LFxuICBnZXRDdXJyZW50U3RhY2tBZGRlbmR1bTogZnVuY3Rpb24gKHRvcEVsZW1lbnQpIHtcbiAgICB2YXIgaW5mbyA9ICcnO1xuICAgIGlmICh0b3BFbGVtZW50KSB7XG4gICAgICB2YXIgbmFtZSA9IGdldERpc3BsYXlOYW1lKHRvcEVsZW1lbnQpO1xuICAgICAgdmFyIG93bmVyID0gdG9wRWxlbWVudC5fb3duZXI7XG4gICAgICBpbmZvICs9IGRlc2NyaWJlQ29tcG9uZW50RnJhbWUobmFtZSwgdG9wRWxlbWVudC5fc291cmNlLCBvd25lciAmJiBvd25lci5nZXROYW1lKCkpO1xuICAgIH1cblxuICAgIHZhciBjdXJyZW50T3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuICAgIHZhciBpZCA9IGN1cnJlbnRPd25lciAmJiBjdXJyZW50T3duZXIuX2RlYnVnSUQ7XG5cbiAgICBpbmZvICs9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQoaWQpO1xuICAgIHJldHVybiBpbmZvO1xuICB9LFxuICBnZXRTdGFja0FkZGVuZHVtQnlJRDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGluZm8gPSAnJztcbiAgICB3aGlsZSAoaWQpIHtcbiAgICAgIGluZm8gKz0gZGVzY3JpYmVJRChpZCk7XG4gICAgICBpZCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0UGFyZW50SUQoaWQpO1xuICAgIH1cbiAgICByZXR1cm4gaW5mbztcbiAgfSxcbiAgZ2V0Q2hpbGRJRHM6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7XG4gICAgcmV0dXJuIGl0ZW0gPyBpdGVtLmNoaWxkSURzIDogW107XG4gIH0sXG4gIGdldERpc3BsYXlOYW1lOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgZWxlbWVudCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RWxlbWVudChpZCk7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGdldERpc3BsYXlOYW1lKGVsZW1lbnQpO1xuICB9LFxuICBnZXRFbGVtZW50OiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpO1xuICAgIHJldHVybiBpdGVtID8gaXRlbS5lbGVtZW50IDogbnVsbDtcbiAgfSxcbiAgZ2V0T3duZXJJRDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEVsZW1lbnQoaWQpO1xuICAgIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5fb3duZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudC5fb3duZXIuX2RlYnVnSUQ7XG4gIH0sXG4gIGdldFBhcmVudElEOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpO1xuICAgIHJldHVybiBpdGVtID8gaXRlbS5wYXJlbnRJRCA6IG51bGw7XG4gIH0sXG4gIGdldFNvdXJjZTogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0gPyBpdGVtLmVsZW1lbnQgOiBudWxsO1xuICAgIHZhciBzb3VyY2UgPSBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50Ll9zb3VyY2UgOiBudWxsO1xuICAgIHJldHVybiBzb3VyY2U7XG4gIH0sXG4gIGdldFRleHQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBlbGVtZW50ID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRFbGVtZW50KGlkKTtcbiAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuICcnICsgZWxlbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LFxuICBnZXRVcGRhdGVDb3VudDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTtcbiAgICByZXR1cm4gaXRlbSA/IGl0ZW0udXBkYXRlQ291bnQgOiAwO1xuICB9LFxuXG5cbiAgZ2V0Um9vdElEczogZ2V0Um9vdElEcyxcbiAgZ2V0UmVnaXN0ZXJlZElEczogZ2V0SXRlbUlEcyxcblxuICBwdXNoTm9uU3RhbmRhcmRXYXJuaW5nU3RhY2s6IGZ1bmN0aW9uIChpc0NyZWF0aW5nRWxlbWVudCwgY3VycmVudFNvdXJjZSkge1xuICAgIGlmICh0eXBlb2YgY29uc29sZS5yZWFjdFN0YWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHN0YWNrID0gW107XG4gICAgdmFyIGN1cnJlbnRPd25lciA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ7XG4gICAgdmFyIGlkID0gY3VycmVudE93bmVyICYmIGN1cnJlbnRPd25lci5fZGVidWdJRDtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoaXNDcmVhdGluZ0VsZW1lbnQpIHtcbiAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgbmFtZTogaWQgPyBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldERpc3BsYXlOYW1lKGlkKSA6IG51bGwsXG4gICAgICAgICAgZmlsZU5hbWU6IGN1cnJlbnRTb3VyY2UgPyBjdXJyZW50U291cmNlLmZpbGVOYW1lIDogbnVsbCxcbiAgICAgICAgICBsaW5lTnVtYmVyOiBjdXJyZW50U291cmNlID8gY3VycmVudFNvdXJjZS5saW5lTnVtYmVyIDogbnVsbFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKGlkKSB7XG4gICAgICAgIHZhciBlbGVtZW50ID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRFbGVtZW50KGlkKTtcbiAgICAgICAgdmFyIHBhcmVudElEID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRQYXJlbnRJRChpZCk7XG4gICAgICAgIHZhciBvd25lcklEID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRPd25lcklEKGlkKTtcbiAgICAgICAgdmFyIG93bmVyTmFtZSA9IG93bmVySUQgPyBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldERpc3BsYXlOYW1lKG93bmVySUQpIDogbnVsbDtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGVsZW1lbnQgJiYgZWxlbWVudC5fc291cmNlO1xuICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBvd25lck5hbWUsXG4gICAgICAgICAgZmlsZU5hbWU6IHNvdXJjZSA/IHNvdXJjZS5maWxlTmFtZSA6IG51bGwsXG4gICAgICAgICAgbGluZU51bWJlcjogc291cmNlID8gc291cmNlLmxpbmVOdW1iZXIgOiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgICBpZCA9IHBhcmVudElEO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gSW50ZXJuYWwgc3RhdGUgaXMgbWVzc2VkIHVwLlxuICAgICAgLy8gU3RvcCBidWlsZGluZyB0aGUgc3RhY2sgKGl0J3MganVzdCBhIG5pY2UgdG8gaGF2ZSkuXG4gICAgfVxuXG4gICAgY29uc29sZS5yZWFjdFN0YWNrKHN0YWNrKTtcbiAgfSxcbiAgcG9wTm9uU3RhbmRhcmRXYXJuaW5nU3RhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUucmVhY3RTdGFja0VuZCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zb2xlLnJlYWN0U3RhY2tFbmQoKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFJlY29uY2lsZXIgPSByZXF1aXJlKCcuL1JlYWN0UmVjb25jaWxlcicpO1xuXG52YXIgaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudCA9IHJlcXVpcmUoJy4vaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudCcpO1xudmFyIEtleUVzY2FwZVV0aWxzID0gcmVxdWlyZSgnLi9LZXlFc2NhcGVVdGlscycpO1xudmFyIHNob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9zaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudCcpO1xudmFyIHRyYXZlcnNlQWxsQ2hpbGRyZW4gPSByZXF1aXJlKCcuL3RyYXZlcnNlQWxsQ2hpbGRyZW4nKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vaztcblxuaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnKSB7XG4gIC8vIFRlbXBvcmFyeSBoYWNrLlxuICAvLyBJbmxpbmUgcmVxdWlyZXMgZG9uJ3Qgd29yayB3ZWxsIHdpdGggSmVzdDpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy83MjQwXG4gIC8vIFJlbW92ZSB0aGUgaW5saW5lIHJlcXVpcmVzIHdoZW4gd2UgZG9uJ3QgbmVlZCB0aGVtIGFueW1vcmU6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzcxNzhcbiAgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG59XG5cbmZ1bmN0aW9uIGluc3RhbnRpYXRlQ2hpbGQoY2hpbGRJbnN0YW5jZXMsIGNoaWxkLCBuYW1lLCBzZWxmRGVidWdJRCkge1xuICAvLyBXZSBmb3VuZCBhIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgdmFyIGtleVVuaXF1ZSA9IGNoaWxkSW5zdGFuY2VzW25hbWVdID09PSB1bmRlZmluZWQ7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKCFSZWFjdENvbXBvbmVudFRyZWVIb29rKSB7XG4gICAgICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcbiAgICB9XG4gICAgaWYgKCFrZXlVbmlxdWUpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnZmxhdHRlbkNoaWxkcmVuKC4uLik6IEVuY291bnRlcmVkIHR3byBjaGlsZHJlbiB3aXRoIHRoZSBzYW1lIGtleSwgJyArICdgJXNgLiBDaGlsZCBrZXlzIG11c3QgYmUgdW5pcXVlOyB3aGVuIHR3byBjaGlsZHJlbiBzaGFyZSBhIGtleSwgb25seSAnICsgJ3RoZSBmaXJzdCBjaGlsZCB3aWxsIGJlIHVzZWQuJXMnLCBLZXlFc2NhcGVVdGlscy51bmVzY2FwZShuYW1lKSwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChzZWxmRGVidWdJRCkpIDogdm9pZCAwO1xuICAgIH1cbiAgfVxuICBpZiAoY2hpbGQgIT0gbnVsbCAmJiBrZXlVbmlxdWUpIHtcbiAgICBjaGlsZEluc3RhbmNlc1tuYW1lXSA9IGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQoY2hpbGQsIHRydWUpO1xuICB9XG59XG5cbi8qKlxuICogUmVhY3RDaGlsZFJlY29uY2lsZXIgcHJvdmlkZXMgaGVscGVycyBmb3IgaW5pdGlhbGl6aW5nIG9yIHVwZGF0aW5nIGEgc2V0IG9mXG4gKiBjaGlsZHJlbi4gSXRzIG91dHB1dCBpcyBzdWl0YWJsZSBmb3IgcGFzc2luZyBpdCBvbnRvIFJlYWN0TXVsdGlDaGlsZCB3aGljaFxuICogZG9lcyBkaWZmZWQgcmVvcmRlcmluZyBhbmQgaW5zZXJ0aW9uLlxuICovXG52YXIgUmVhY3RDaGlsZFJlY29uY2lsZXIgPSB7XG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBcIm1vdW50IGltYWdlXCIgZm9yIGVhY2ggb2YgdGhlIHN1cHBsaWVkIGNoaWxkcmVuLiBJbiB0aGUgY2FzZVxuICAgKiBvZiBgUmVhY3RET01Db21wb25lbnRgLCBhIG1vdW50IGltYWdlIGlzIGEgc3RyaW5nIG9mIG1hcmt1cC5cbiAgICpcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXN0ZWRDaGlsZE5vZGVzIE5lc3RlZCBjaGlsZCBtYXBzLlxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBBIHNldCBvZiBjaGlsZCBpbnN0YW5jZXMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgaW5zdGFudGlhdGVDaGlsZHJlbjogZnVuY3Rpb24gKG5lc3RlZENoaWxkTm9kZXMsIHRyYW5zYWN0aW9uLCBjb250ZXh0LCBzZWxmRGVidWdJRCkgLy8gMCBpbiBwcm9kdWN0aW9uIGFuZCBmb3Igcm9vdHNcbiAge1xuICAgIGlmIChuZXN0ZWRDaGlsZE5vZGVzID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgY2hpbGRJbnN0YW5jZXMgPSB7fTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB0cmF2ZXJzZUFsbENoaWxkcmVuKG5lc3RlZENoaWxkTm9kZXMsIGZ1bmN0aW9uIChjaGlsZEluc3RzLCBjaGlsZCwgbmFtZSkge1xuICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVDaGlsZChjaGlsZEluc3RzLCBjaGlsZCwgbmFtZSwgc2VsZkRlYnVnSUQpO1xuICAgICAgfSwgY2hpbGRJbnN0YW5jZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmF2ZXJzZUFsbENoaWxkcmVuKG5lc3RlZENoaWxkTm9kZXMsIGluc3RhbnRpYXRlQ2hpbGQsIGNoaWxkSW5zdGFuY2VzKTtcbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkSW5zdGFuY2VzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSByZW5kZXJlZCBjaGlsZHJlbiBhbmQgcmV0dXJucyBhIG5ldyBzZXQgb2YgY2hpbGRyZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7P29iamVjdH0gcHJldkNoaWxkcmVuIFByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgc2V0IG9mIGNoaWxkcmVuLlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHRDaGlsZHJlbiBGbGF0IGNoaWxkIGVsZW1lbnQgbWFwcy5cbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dFxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBBIG5ldyBzZXQgb2YgY2hpbGQgaW5zdGFuY2VzLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHVwZGF0ZUNoaWxkcmVuOiBmdW5jdGlvbiAocHJldkNoaWxkcmVuLCBuZXh0Q2hpbGRyZW4sIG1vdW50SW1hZ2VzLCByZW1vdmVkTm9kZXMsIHRyYW5zYWN0aW9uLCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgY29udGV4dCwgc2VsZkRlYnVnSUQpIC8vIDAgaW4gcHJvZHVjdGlvbiBhbmQgZm9yIHJvb3RzXG4gIHtcbiAgICAvLyBXZSBjdXJyZW50bHkgZG9uJ3QgaGF2ZSBhIHdheSB0byB0cmFjayBtb3ZlcyBoZXJlIGJ1dCBpZiB3ZSB1c2UgaXRlcmF0b3JzXG4gICAgLy8gaW5zdGVhZCBvZiBmb3IuLmluIHdlIGNhbiB6aXAgdGhlIGl0ZXJhdG9ycyBhbmQgY2hlY2sgaWYgYW4gaXRlbSBoYXNcbiAgICAvLyBtb3ZlZC5cbiAgICAvLyBUT0RPOiBJZiBub3RoaW5nIGhhcyBjaGFuZ2VkLCByZXR1cm4gdGhlIHByZXZDaGlsZHJlbiBvYmplY3Qgc28gdGhhdCB3ZVxuICAgIC8vIGNhbiBxdWlja2x5IGJhaWxvdXQgaWYgbm90aGluZyBoYXMgY2hhbmdlZC5cbiAgICBpZiAoIW5leHRDaGlsZHJlbiAmJiAhcHJldkNoaWxkcmVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBuYW1lO1xuICAgIHZhciBwcmV2Q2hpbGQ7XG4gICAgZm9yIChuYW1lIGluIG5leHRDaGlsZHJlbikge1xuICAgICAgaWYgKCFuZXh0Q2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBwcmV2Q2hpbGQgPSBwcmV2Q2hpbGRyZW4gJiYgcHJldkNoaWxkcmVuW25hbWVdO1xuICAgICAgdmFyIHByZXZFbGVtZW50ID0gcHJldkNoaWxkICYmIHByZXZDaGlsZC5fY3VycmVudEVsZW1lbnQ7XG4gICAgICB2YXIgbmV4dEVsZW1lbnQgPSBuZXh0Q2hpbGRyZW5bbmFtZV07XG4gICAgICBpZiAocHJldkNoaWxkICE9IG51bGwgJiYgc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQocHJldkVsZW1lbnQsIG5leHRFbGVtZW50KSkge1xuICAgICAgICBSZWFjdFJlY29uY2lsZXIucmVjZWl2ZUNvbXBvbmVudChwcmV2Q2hpbGQsIG5leHRFbGVtZW50LCB0cmFuc2FjdGlvbiwgY29udGV4dCk7XG4gICAgICAgIG5leHRDaGlsZHJlbltuYW1lXSA9IHByZXZDaGlsZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcmV2Q2hpbGQpIHtcbiAgICAgICAgICByZW1vdmVkTm9kZXNbbmFtZV0gPSBSZWFjdFJlY29uY2lsZXIuZ2V0SG9zdE5vZGUocHJldkNoaWxkKTtcbiAgICAgICAgICBSZWFjdFJlY29uY2lsZXIudW5tb3VudENvbXBvbmVudChwcmV2Q2hpbGQsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgY2hpbGQgbXVzdCBiZSBpbnN0YW50aWF0ZWQgYmVmb3JlIGl0J3MgbW91bnRlZC5cbiAgICAgICAgdmFyIG5leHRDaGlsZEluc3RhbmNlID0gaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudChuZXh0RWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIG5leHRDaGlsZHJlbltuYW1lXSA9IG5leHRDaGlsZEluc3RhbmNlO1xuICAgICAgICAvLyBDcmVhdGluZyBtb3VudCBpbWFnZSBub3cgZW5zdXJlcyByZWZzIGFyZSByZXNvbHZlZCBpbiByaWdodCBvcmRlclxuICAgICAgICAvLyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzcxMDEgZm9yIGV4cGxhbmF0aW9uKS5cbiAgICAgICAgdmFyIG5leHRDaGlsZE1vdW50SW1hZ2UgPSBSZWFjdFJlY29uY2lsZXIubW91bnRDb21wb25lbnQobmV4dENoaWxkSW5zdGFuY2UsIHRyYW5zYWN0aW9uLCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgY29udGV4dCwgc2VsZkRlYnVnSUQpO1xuICAgICAgICBtb3VudEltYWdlcy5wdXNoKG5leHRDaGlsZE1vdW50SW1hZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBVbm1vdW50IGNoaWxkcmVuIHRoYXQgYXJlIG5vIGxvbmdlciBwcmVzZW50LlxuICAgIGZvciAobmFtZSBpbiBwcmV2Q2hpbGRyZW4pIHtcbiAgICAgIGlmIChwcmV2Q2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkgJiYgIShuZXh0Q2hpbGRyZW4gJiYgbmV4dENoaWxkcmVuLmhhc093blByb3BlcnR5KG5hbWUpKSkge1xuICAgICAgICBwcmV2Q2hpbGQgPSBwcmV2Q2hpbGRyZW5bbmFtZV07XG4gICAgICAgIHJlbW92ZWROb2Rlc1tuYW1lXSA9IFJlYWN0UmVjb25jaWxlci5nZXRIb3N0Tm9kZShwcmV2Q2hpbGQpO1xuICAgICAgICBSZWFjdFJlY29uY2lsZXIudW5tb3VudENvbXBvbmVudChwcmV2Q2hpbGQsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFVubW91bnRzIGFsbCByZW5kZXJlZCBjaGlsZHJlbi4gVGhpcyBzaG91bGQgYmUgdXNlZCB0byBjbGVhbiB1cCBjaGlsZHJlblxuICAgKiB3aGVuIHRoaXMgY29tcG9uZW50IGlzIHVubW91bnRlZC5cbiAgICpcbiAgICogQHBhcmFtIHs/b2JqZWN0fSByZW5kZXJlZENoaWxkcmVuIFByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgc2V0IG9mIGNoaWxkcmVuLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHVubW91bnRDaGlsZHJlbjogZnVuY3Rpb24gKHJlbmRlcmVkQ2hpbGRyZW4sIHNhZmVseSkge1xuICAgIGZvciAodmFyIG5hbWUgaW4gcmVuZGVyZWRDaGlsZHJlbikge1xuICAgICAgaWYgKHJlbmRlcmVkQ2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgdmFyIHJlbmRlcmVkQ2hpbGQgPSByZW5kZXJlZENoaWxkcmVuW25hbWVdO1xuICAgICAgICBSZWFjdFJlY29uY2lsZXIudW5tb3VudENvbXBvbmVudChyZW5kZXJlZENoaWxkLCBzYWZlbHkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdENoaWxkUmVjb25jaWxlcjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBLZXlFc2NhcGVVdGlscyA9IHJlcXVpcmUoJy4vS2V5RXNjYXBlVXRpbHMnKTtcbnZhciB0cmF2ZXJzZUFsbENoaWxkcmVuID0gcmVxdWlyZSgnLi90cmF2ZXJzZUFsbENoaWxkcmVuJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2s7XG5cbmlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5lbnYgJiYgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0Jykge1xuICAvLyBUZW1wb3JhcnkgaGFjay5cbiAgLy8gSW5saW5lIHJlcXVpcmVzIGRvbid0IHdvcmsgd2VsbCB3aXRoIEplc3Q6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzI0MFxuICAvLyBSZW1vdmUgdGhlIGlubGluZSByZXF1aXJlcyB3aGVuIHdlIGRvbid0IG5lZWQgdGhlbSBhbnltb3JlOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC83MTc4XG4gIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3RDb21wb25lbnRUcmVlSG9vaycpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHRyYXZlcnNlQ29udGV4dCBDb250ZXh0IHBhc3NlZCB0aHJvdWdoIHRyYXZlcnNhbC5cbiAqIEBwYXJhbSB7P1JlYWN0Q29tcG9uZW50fSBjaGlsZCBSZWFjdCBjaGlsZCBjb21wb25lbnQuXG4gKiBAcGFyYW0geyFzdHJpbmd9IG5hbWUgU3RyaW5nIG5hbWUgb2Yga2V5IHBhdGggdG8gY2hpbGQuXG4gKiBAcGFyYW0ge251bWJlcj19IHNlbGZEZWJ1Z0lEIE9wdGlvbmFsIGRlYnVnSUQgb2YgdGhlIGN1cnJlbnQgaW50ZXJuYWwgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5TaW5nbGVDaGlsZEludG9Db250ZXh0KHRyYXZlcnNlQ29udGV4dCwgY2hpbGQsIG5hbWUsIHNlbGZEZWJ1Z0lEKSB7XG4gIC8vIFdlIGZvdW5kIGEgY29tcG9uZW50IGluc3RhbmNlLlxuICBpZiAodHJhdmVyc2VDb250ZXh0ICYmIHR5cGVvZiB0cmF2ZXJzZUNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgdmFyIHJlc3VsdCA9IHRyYXZlcnNlQ29udGV4dDtcbiAgICB2YXIga2V5VW5pcXVlID0gcmVzdWx0W25hbWVdID09PSB1bmRlZmluZWQ7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmICghUmVhY3RDb21wb25lbnRUcmVlSG9vaykge1xuICAgICAgICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcbiAgICAgIH1cbiAgICAgIGlmICgha2V5VW5pcXVlKSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnZmxhdHRlbkNoaWxkcmVuKC4uLik6IEVuY291bnRlcmVkIHR3byBjaGlsZHJlbiB3aXRoIHRoZSBzYW1lIGtleSwgJyArICdgJXNgLiBDaGlsZCBrZXlzIG11c3QgYmUgdW5pcXVlOyB3aGVuIHR3byBjaGlsZHJlbiBzaGFyZSBhIGtleSwgb25seSAnICsgJ3RoZSBmaXJzdCBjaGlsZCB3aWxsIGJlIHVzZWQuJXMnLCBLZXlFc2NhcGVVdGlscy51bmVzY2FwZShuYW1lKSwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChzZWxmRGVidWdJRCkpIDogdm9pZCAwO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5VW5pcXVlICYmIGNoaWxkICE9IG51bGwpIHtcbiAgICAgIHJlc3VsdFtuYW1lXSA9IGNoaWxkO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEZsYXR0ZW5zIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYC4gQW55IG51bGxcbiAqIGNoaWxkcmVuIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgb2JqZWN0LlxuICogQHJldHVybiB7IW9iamVjdH0gZmxhdHRlbmVkIGNoaWxkcmVuIGtleWVkIGJ5IG5hbWUuXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5DaGlsZHJlbihjaGlsZHJlbiwgc2VsZkRlYnVnSUQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgZnVuY3Rpb24gKHRyYXZlcnNlQ29udGV4dCwgY2hpbGQsIG5hbWUpIHtcbiAgICAgIHJldHVybiBmbGF0dGVuU2luZ2xlQ2hpbGRJbnRvQ29udGV4dCh0cmF2ZXJzZUNvbnRleHQsIGNoaWxkLCBuYW1lLCBzZWxmRGVidWdJRCk7XG4gICAgfSwgcmVzdWx0KTtcbiAgfSBlbHNlIHtcbiAgICB0cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLCBmbGF0dGVuU2luZ2xlQ2hpbGRJbnRvQ29udGV4dCwgcmVzdWx0KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZsYXR0ZW5DaGlsZHJlbjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCA9IHJlcXVpcmUoJy4vUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCcpO1xudmFyIFJlYWN0SW5zdGFuY2VNYXAgPSByZXF1aXJlKCcuL1JlYWN0SW5zdGFuY2VNYXAnKTtcbnZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0cnVtZW50YXRpb24nKTtcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q3VycmVudE93bmVyJyk7XG52YXIgUmVhY3RSZWNvbmNpbGVyID0gcmVxdWlyZSgnLi9SZWFjdFJlY29uY2lsZXInKTtcbnZhciBSZWFjdENoaWxkUmVjb25jaWxlciA9IHJlcXVpcmUoJy4vUmVhY3RDaGlsZFJlY29uY2lsZXInKTtcblxudmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eUZ1bmN0aW9uJyk7XG52YXIgZmxhdHRlbkNoaWxkcmVuID0gcmVxdWlyZSgnLi9mbGF0dGVuQ2hpbGRyZW4nKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBNYWtlIGFuIHVwZGF0ZSBmb3IgbWFya3VwIHRvIGJlIHJlbmRlcmVkIGFuZCBpbnNlcnRlZCBhdCBhIHN1cHBsaWVkIGluZGV4LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrdXAgTWFya3VwIHRoYXQgcmVuZGVycyBpbnRvIGFuIGVsZW1lbnQuXG4gKiBAcGFyYW0ge251bWJlcn0gdG9JbmRleCBEZXN0aW5hdGlvbiBpbmRleC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIG1ha2VJbnNlcnRNYXJrdXAobWFya3VwLCBhZnRlck5vZGUsIHRvSW5kZXgpIHtcbiAgLy8gTk9URTogTnVsbCB2YWx1ZXMgcmVkdWNlIGhpZGRlbiBjbGFzc2VzLlxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdJTlNFUlRfTUFSS1VQJyxcbiAgICBjb250ZW50OiBtYXJrdXAsXG4gICAgZnJvbUluZGV4OiBudWxsLFxuICAgIGZyb21Ob2RlOiBudWxsLFxuICAgIHRvSW5kZXg6IHRvSW5kZXgsXG4gICAgYWZ0ZXJOb2RlOiBhZnRlck5vZGVcbiAgfTtcbn1cblxuLyoqXG4gKiBNYWtlIGFuIHVwZGF0ZSBmb3IgbW92aW5nIGFuIGV4aXN0aW5nIGVsZW1lbnQgdG8gYW5vdGhlciBpbmRleC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFNvdXJjZSBpbmRleCBvZiB0aGUgZXhpc3RpbmcgZWxlbWVudC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB0b0luZGV4IERlc3RpbmF0aW9uIGluZGV4IG9mIHRoZSBlbGVtZW50LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gbWFrZU1vdmUoY2hpbGQsIGFmdGVyTm9kZSwgdG9JbmRleCkge1xuICAvLyBOT1RFOiBOdWxsIHZhbHVlcyByZWR1Y2UgaGlkZGVuIGNsYXNzZXMuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ01PVkVfRVhJU1RJTkcnLFxuICAgIGNvbnRlbnQ6IG51bGwsXG4gICAgZnJvbUluZGV4OiBjaGlsZC5fbW91bnRJbmRleCxcbiAgICBmcm9tTm9kZTogUmVhY3RSZWNvbmNpbGVyLmdldEhvc3ROb2RlKGNoaWxkKSxcbiAgICB0b0luZGV4OiB0b0luZGV4LFxuICAgIGFmdGVyTm9kZTogYWZ0ZXJOb2RlXG4gIH07XG59XG5cbi8qKlxuICogTWFrZSBhbiB1cGRhdGUgZm9yIHJlbW92aW5nIGFuIGVsZW1lbnQgYXQgYW4gaW5kZXguXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBJbmRleCBvZiB0aGUgZWxlbWVudCB0byByZW1vdmUuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBtYWtlUmVtb3ZlKGNoaWxkLCBub2RlKSB7XG4gIC8vIE5PVEU6IE51bGwgdmFsdWVzIHJlZHVjZSBoaWRkZW4gY2xhc3Nlcy5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnUkVNT1ZFX05PREUnLFxuICAgIGNvbnRlbnQ6IG51bGwsXG4gICAgZnJvbUluZGV4OiBjaGlsZC5fbW91bnRJbmRleCxcbiAgICBmcm9tTm9kZTogbm9kZSxcbiAgICB0b0luZGV4OiBudWxsLFxuICAgIGFmdGVyTm9kZTogbnVsbFxuICB9O1xufVxuXG4vKipcbiAqIE1ha2UgYW4gdXBkYXRlIGZvciBzZXR0aW5nIHRoZSBtYXJrdXAgb2YgYSBub2RlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrdXAgTWFya3VwIHRoYXQgcmVuZGVycyBpbnRvIGFuIGVsZW1lbnQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBtYWtlU2V0TWFya3VwKG1hcmt1cCkge1xuICAvLyBOT1RFOiBOdWxsIHZhbHVlcyByZWR1Y2UgaGlkZGVuIGNsYXNzZXMuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1NFVF9NQVJLVVAnLFxuICAgIGNvbnRlbnQ6IG1hcmt1cCxcbiAgICBmcm9tSW5kZXg6IG51bGwsXG4gICAgZnJvbU5vZGU6IG51bGwsXG4gICAgdG9JbmRleDogbnVsbCxcbiAgICBhZnRlck5vZGU6IG51bGxcbiAgfTtcbn1cblxuLyoqXG4gKiBNYWtlIGFuIHVwZGF0ZSBmb3Igc2V0dGluZyB0aGUgdGV4dCBjb250ZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0Q29udGVudCBUZXh0IGNvbnRlbnQgdG8gc2V0LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gbWFrZVRleHRDb250ZW50KHRleHRDb250ZW50KSB7XG4gIC8vIE5PVEU6IE51bGwgdmFsdWVzIHJlZHVjZSBoaWRkZW4gY2xhc3Nlcy5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnVEVYVF9DT05URU5UJyxcbiAgICBjb250ZW50OiB0ZXh0Q29udGVudCxcbiAgICBmcm9tSW5kZXg6IG51bGwsXG4gICAgZnJvbU5vZGU6IG51bGwsXG4gICAgdG9JbmRleDogbnVsbCxcbiAgICBhZnRlck5vZGU6IG51bGxcbiAgfTtcbn1cblxuLyoqXG4gKiBQdXNoIGFuIHVwZGF0ZSwgaWYgYW55LCBvbnRvIHRoZSBxdWV1ZS4gQ3JlYXRlcyBhIG5ldyBxdWV1ZSBpZiBub25lIGlzXG4gKiBwYXNzZWQgYW5kIGFsd2F5cyByZXR1cm5zIHRoZSBxdWV1ZS4gTXV0YXRpdmUuXG4gKi9cbmZ1bmN0aW9uIGVucXVldWUocXVldWUsIHVwZGF0ZSkge1xuICBpZiAodXBkYXRlKSB7XG4gICAgcXVldWUgPSBxdWV1ZSB8fCBbXTtcbiAgICBxdWV1ZS5wdXNoKHVwZGF0ZSk7XG4gIH1cbiAgcmV0dXJuIHF1ZXVlO1xufVxuXG4vKipcbiAqIFByb2Nlc3NlcyBhbnkgZW5xdWV1ZWQgdXBkYXRlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBwcm9jZXNzUXVldWUoaW5zdCwgdXBkYXRlUXVldWUpIHtcbiAgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudC5wcm9jZXNzQ2hpbGRyZW5VcGRhdGVzKGluc3QsIHVwZGF0ZVF1ZXVlKTtcbn1cblxudmFyIHNldENoaWxkcmVuRm9ySW5zdHJ1bWVudGF0aW9uID0gZW1wdHlGdW5jdGlvbjtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBnZXREZWJ1Z0lEID0gZnVuY3Rpb24gKGluc3QpIHtcbiAgICBpZiAoIWluc3QuX2RlYnVnSUQpIHtcbiAgICAgIC8vIENoZWNrIGZvciBBUlQtbGlrZSBpbnN0YW5jZXMuIFRPRE86IFRoaXMgaXMgc2lsbHkvZ3Jvc3MuXG4gICAgICB2YXIgaW50ZXJuYWw7XG4gICAgICBpZiAoaW50ZXJuYWwgPSBSZWFjdEluc3RhbmNlTWFwLmdldChpbnN0KSkge1xuICAgICAgICBpbnN0ID0gaW50ZXJuYWw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbnN0Ll9kZWJ1Z0lEO1xuICB9O1xuICBzZXRDaGlsZHJlbkZvckluc3RydW1lbnRhdGlvbiA9IGZ1bmN0aW9uIChjaGlsZHJlbikge1xuICAgIHZhciBkZWJ1Z0lEID0gZ2V0RGVidWdJRCh0aGlzKTtcbiAgICAvLyBUT0RPOiBSZWFjdCBOYXRpdmUgZW1wdHkgY29tcG9uZW50cyBhcmUgYWxzbyBtdWx0aWNoaWxkLlxuICAgIC8vIFRoaXMgbWVhbnMgdGhleSBzdGlsbCBnZXQgaW50byB0aGlzIG1ldGhvZCBidXQgZG9uJ3QgaGF2ZSBfZGVidWdJRC5cbiAgICBpZiAoZGVidWdJRCAhPT0gMCkge1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uU2V0Q2hpbGRyZW4oZGVidWdJRCwgY2hpbGRyZW4gPyBPYmplY3Qua2V5cyhjaGlsZHJlbikubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuW2tleV0uX2RlYnVnSUQ7XG4gICAgICB9KSA6IFtdKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUmVhY3RNdWx0aUNoaWxkIGFyZSBjYXBhYmxlIG9mIHJlY29uY2lsaW5nIG11bHRpcGxlIGNoaWxkcmVuLlxuICpcbiAqIEBjbGFzcyBSZWFjdE11bHRpQ2hpbGRcbiAqIEBpbnRlcm5hbFxuICovXG52YXIgUmVhY3RNdWx0aUNoaWxkID0ge1xuICAvKipcbiAgICogUHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkgZm9yIGNvbXBvbmVudHMgdGhhdCBtdXN0IHJlY29uY2lsZSBtdWx0aXBsZVxuICAgKiBjaGlsZHJlbi4gVGhpcyBpcyB1c2VkIGJ5IGBSZWFjdERPTUNvbXBvbmVudGAgdG8gbW91bnQsIHVwZGF0ZSwgYW5kXG4gICAqIHVubW91bnQgY2hpbGQgY29tcG9uZW50cy5cbiAgICpcbiAgICogQGxlbmRzIHtSZWFjdE11bHRpQ2hpbGQucHJvdG90eXBlfVxuICAgKi9cbiAgTWl4aW46IHtcbiAgICBfcmVjb25jaWxlckluc3RhbnRpYXRlQ2hpbGRyZW46IGZ1bmN0aW9uIChuZXN0ZWRDaGlsZHJlbiwgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHZhciBzZWxmRGVidWdJRCA9IGdldERlYnVnSUQodGhpcyk7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50RWxlbWVudCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQuX293bmVyO1xuICAgICAgICAgICAgcmV0dXJuIFJlYWN0Q2hpbGRSZWNvbmNpbGVyLmluc3RhbnRpYXRlQ2hpbGRyZW4obmVzdGVkQ2hpbGRyZW4sIHRyYW5zYWN0aW9uLCBjb250ZXh0LCBzZWxmRGVidWdJRCk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIFJlYWN0Q2hpbGRSZWNvbmNpbGVyLmluc3RhbnRpYXRlQ2hpbGRyZW4obmVzdGVkQ2hpbGRyZW4sIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcbiAgICB9LFxuXG4gICAgX3JlY29uY2lsZXJVcGRhdGVDaGlsZHJlbjogZnVuY3Rpb24gKHByZXZDaGlsZHJlbiwgbmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMsIG1vdW50SW1hZ2VzLCByZW1vdmVkTm9kZXMsIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgICB2YXIgbmV4dENoaWxkcmVuO1xuICAgICAgdmFyIHNlbGZEZWJ1Z0lEID0gMDtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHNlbGZEZWJ1Z0lEID0gZ2V0RGVidWdJRCh0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5fb3duZXI7XG4gICAgICAgICAgICBuZXh0Q2hpbGRyZW4gPSBmbGF0dGVuQ2hpbGRyZW4obmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMsIHNlbGZEZWJ1Z0lEKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIFJlYWN0Q2hpbGRSZWNvbmNpbGVyLnVwZGF0ZUNoaWxkcmVuKHByZXZDaGlsZHJlbiwgbmV4dENoaWxkcmVuLCBtb3VudEltYWdlcywgcmVtb3ZlZE5vZGVzLCB0cmFuc2FjdGlvbiwgdGhpcywgdGhpcy5faG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQsIHNlbGZEZWJ1Z0lEKTtcbiAgICAgICAgICByZXR1cm4gbmV4dENoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBuZXh0Q2hpbGRyZW4gPSBmbGF0dGVuQ2hpbGRyZW4obmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMsIHNlbGZEZWJ1Z0lEKTtcbiAgICAgIFJlYWN0Q2hpbGRSZWNvbmNpbGVyLnVwZGF0ZUNoaWxkcmVuKHByZXZDaGlsZHJlbiwgbmV4dENoaWxkcmVuLCBtb3VudEltYWdlcywgcmVtb3ZlZE5vZGVzLCB0cmFuc2FjdGlvbiwgdGhpcywgdGhpcy5faG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQsIHNlbGZEZWJ1Z0lEKTtcbiAgICAgIHJldHVybiBuZXh0Q2hpbGRyZW47XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIFwibW91bnQgaW1hZ2VcIiBmb3IgZWFjaCBvZiB0aGUgc3VwcGxpZWQgY2hpbGRyZW4uIEluIHRoZSBjYXNlXG4gICAgICogb2YgYFJlYWN0RE9NQ29tcG9uZW50YCwgYSBtb3VudCBpbWFnZSBpcyBhIHN0cmluZyBvZiBtYXJrdXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gez9vYmplY3R9IG5lc3RlZENoaWxkcmVuIE5lc3RlZCBjaGlsZCBtYXBzLlxuICAgICAqIEByZXR1cm4ge2FycmF5fSBBbiBhcnJheSBvZiBtb3VudGVkIHJlcHJlc2VudGF0aW9ucy5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBtb3VudENoaWxkcmVuOiBmdW5jdGlvbiAobmVzdGVkQ2hpbGRyZW4sIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLl9yZWNvbmNpbGVySW5zdGFudGlhdGVDaGlsZHJlbihuZXN0ZWRDaGlsZHJlbiwgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgICAgdGhpcy5fcmVuZGVyZWRDaGlsZHJlbiA9IGNoaWxkcmVuO1xuXG4gICAgICB2YXIgbW91bnRJbWFnZXMgPSBbXTtcbiAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICBmb3IgKHZhciBuYW1lIGluIGNoaWxkcmVuKSB7XG4gICAgICAgIGlmIChjaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW25hbWVdO1xuICAgICAgICAgIHZhciBzZWxmRGVidWdJRCA9IDA7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIHNlbGZEZWJ1Z0lEID0gZ2V0RGVidWdJRCh0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG1vdW50SW1hZ2UgPSBSZWFjdFJlY29uY2lsZXIubW91bnRDb21wb25lbnQoY2hpbGQsIHRyYW5zYWN0aW9uLCB0aGlzLCB0aGlzLl9ob3N0Q29udGFpbmVySW5mbywgY29udGV4dCwgc2VsZkRlYnVnSUQpO1xuICAgICAgICAgIGNoaWxkLl9tb3VudEluZGV4ID0gaW5kZXgrKztcbiAgICAgICAgICBtb3VudEltYWdlcy5wdXNoKG1vdW50SW1hZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHNldENoaWxkcmVuRm9ySW5zdHJ1bWVudGF0aW9uLmNhbGwodGhpcywgY2hpbGRyZW4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbW91bnRJbWFnZXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2VzIGFueSByZW5kZXJlZCBjaGlsZHJlbiB3aXRoIGEgdGV4dCBjb250ZW50IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXh0Q29udGVudCBTdHJpbmcgb2YgY29udGVudC5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB1cGRhdGVUZXh0Q29udGVudDogZnVuY3Rpb24gKG5leHRDb250ZW50KSB7XG4gICAgICB2YXIgcHJldkNoaWxkcmVuID0gdGhpcy5fcmVuZGVyZWRDaGlsZHJlbjtcbiAgICAgIC8vIFJlbW92ZSBhbnkgcmVuZGVyZWQgY2hpbGRyZW4uXG4gICAgICBSZWFjdENoaWxkUmVjb25jaWxlci51bm1vdW50Q2hpbGRyZW4ocHJldkNoaWxkcmVuLCBmYWxzZSk7XG4gICAgICBmb3IgKHZhciBuYW1lIGluIHByZXZDaGlsZHJlbikge1xuICAgICAgICBpZiAocHJldkNoaWxkcmVuLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgIWZhbHNlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3VwZGF0ZVRleHRDb250ZW50IGNhbGxlZCBvbiBub24tZW1wdHkgY29tcG9uZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzExOCcpIDogdm9pZCAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTZXQgbmV3IHRleHQgY29udGVudC5cbiAgICAgIHZhciB1cGRhdGVzID0gW21ha2VUZXh0Q29udGVudChuZXh0Q29udGVudCldO1xuICAgICAgcHJvY2Vzc1F1ZXVlKHRoaXMsIHVwZGF0ZXMpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlcyBhbnkgcmVuZGVyZWQgY2hpbGRyZW4gd2l0aCBhIG1hcmt1cCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV4dE1hcmt1cCBTdHJpbmcgb2YgbWFya3VwLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHVwZGF0ZU1hcmt1cDogZnVuY3Rpb24gKG5leHRNYXJrdXApIHtcbiAgICAgIHZhciBwcmV2Q2hpbGRyZW4gPSB0aGlzLl9yZW5kZXJlZENoaWxkcmVuO1xuICAgICAgLy8gUmVtb3ZlIGFueSByZW5kZXJlZCBjaGlsZHJlbi5cbiAgICAgIFJlYWN0Q2hpbGRSZWNvbmNpbGVyLnVubW91bnRDaGlsZHJlbihwcmV2Q2hpbGRyZW4sIGZhbHNlKTtcbiAgICAgIGZvciAodmFyIG5hbWUgaW4gcHJldkNoaWxkcmVuKSB7XG4gICAgICAgIGlmIChwcmV2Q2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAhZmFsc2UgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndXBkYXRlVGV4dENvbnRlbnQgY2FsbGVkIG9uIG5vbi1lbXB0eSBjb21wb25lbnQuJykgOiBfcHJvZEludmFyaWFudCgnMTE4JykgOiB2b2lkIDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciB1cGRhdGVzID0gW21ha2VTZXRNYXJrdXAobmV4dE1hcmt1cCldO1xuICAgICAgcHJvY2Vzc1F1ZXVlKHRoaXMsIHVwZGF0ZXMpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSByZW5kZXJlZCBjaGlsZHJlbiB3aXRoIG5ldyBjaGlsZHJlbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMgTmVzdGVkIGNoaWxkIGVsZW1lbnQgbWFwcy5cbiAgICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdXBkYXRlQ2hpbGRyZW46IGZ1bmN0aW9uIChuZXh0TmVzdGVkQ2hpbGRyZW5FbGVtZW50cywgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHtcbiAgICAgIC8vIEhvb2sgdXNlZCBieSBSZWFjdCBBUlRcbiAgICAgIHRoaXMuX3VwZGF0ZUNoaWxkcmVuKG5leHROZXN0ZWRDaGlsZHJlbkVsZW1lbnRzLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMgTmVzdGVkIGNoaWxkIGVsZW1lbnQgbWFwcy5cbiAgICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAgICogQGZpbmFsXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIF91cGRhdGVDaGlsZHJlbjogZnVuY3Rpb24gKG5leHROZXN0ZWRDaGlsZHJlbkVsZW1lbnRzLCB0cmFuc2FjdGlvbiwgY29udGV4dCkge1xuICAgICAgdmFyIHByZXZDaGlsZHJlbiA9IHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW47XG4gICAgICB2YXIgcmVtb3ZlZE5vZGVzID0ge307XG4gICAgICB2YXIgbW91bnRJbWFnZXMgPSBbXTtcbiAgICAgIHZhciBuZXh0Q2hpbGRyZW4gPSB0aGlzLl9yZWNvbmNpbGVyVXBkYXRlQ2hpbGRyZW4ocHJldkNoaWxkcmVuLCBuZXh0TmVzdGVkQ2hpbGRyZW5FbGVtZW50cywgbW91bnRJbWFnZXMsIHJlbW92ZWROb2RlcywgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgICAgaWYgKCFuZXh0Q2hpbGRyZW4gJiYgIXByZXZDaGlsZHJlbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgdXBkYXRlcyA9IG51bGw7XG4gICAgICB2YXIgbmFtZTtcbiAgICAgIC8vIGBuZXh0SW5kZXhgIHdpbGwgaW5jcmVtZW50IGZvciBlYWNoIGNoaWxkIGluIGBuZXh0Q2hpbGRyZW5gLCBidXRcbiAgICAgIC8vIGBsYXN0SW5kZXhgIHdpbGwgYmUgdGhlIGxhc3QgaW5kZXggdmlzaXRlZCBpbiBgcHJldkNoaWxkcmVuYC5cbiAgICAgIHZhciBuZXh0SW5kZXggPSAwO1xuICAgICAgdmFyIGxhc3RJbmRleCA9IDA7XG4gICAgICAvLyBgbmV4dE1vdW50SW5kZXhgIHdpbGwgaW5jcmVtZW50IGZvciBlYWNoIG5ld2x5IG1vdW50ZWQgY2hpbGQuXG4gICAgICB2YXIgbmV4dE1vdW50SW5kZXggPSAwO1xuICAgICAgdmFyIGxhc3RQbGFjZWROb2RlID0gbnVsbDtcbiAgICAgIGZvciAobmFtZSBpbiBuZXh0Q2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKCFuZXh0Q2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJldkNoaWxkID0gcHJldkNoaWxkcmVuICYmIHByZXZDaGlsZHJlbltuYW1lXTtcbiAgICAgICAgdmFyIG5leHRDaGlsZCA9IG5leHRDaGlsZHJlbltuYW1lXTtcbiAgICAgICAgaWYgKHByZXZDaGlsZCA9PT0gbmV4dENoaWxkKSB7XG4gICAgICAgICAgdXBkYXRlcyA9IGVucXVldWUodXBkYXRlcywgdGhpcy5tb3ZlQ2hpbGQocHJldkNoaWxkLCBsYXN0UGxhY2VkTm9kZSwgbmV4dEluZGV4LCBsYXN0SW5kZXgpKTtcbiAgICAgICAgICBsYXN0SW5kZXggPSBNYXRoLm1heChwcmV2Q2hpbGQuX21vdW50SW5kZXgsIGxhc3RJbmRleCk7XG4gICAgICAgICAgcHJldkNoaWxkLl9tb3VudEluZGV4ID0gbmV4dEluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChwcmV2Q2hpbGQpIHtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBgbGFzdEluZGV4YCBiZWZvcmUgYF9tb3VudEluZGV4YCBnZXRzIHVuc2V0IGJ5IHVubW91bnRpbmcuXG4gICAgICAgICAgICBsYXN0SW5kZXggPSBNYXRoLm1heChwcmV2Q2hpbGQuX21vdW50SW5kZXgsIGxhc3RJbmRleCk7XG4gICAgICAgICAgICAvLyBUaGUgYHJlbW92ZWROb2Rlc2AgbG9vcCBiZWxvdyB3aWxsIGFjdHVhbGx5IHJlbW92ZSB0aGUgY2hpbGQuXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFRoZSBjaGlsZCBtdXN0IGJlIGluc3RhbnRpYXRlZCBiZWZvcmUgaXQncyBtb3VudGVkLlxuICAgICAgICAgIHVwZGF0ZXMgPSBlbnF1ZXVlKHVwZGF0ZXMsIHRoaXMuX21vdW50Q2hpbGRBdEluZGV4KG5leHRDaGlsZCwgbW91bnRJbWFnZXNbbmV4dE1vdW50SW5kZXhdLCBsYXN0UGxhY2VkTm9kZSwgbmV4dEluZGV4LCB0cmFuc2FjdGlvbiwgY29udGV4dCkpO1xuICAgICAgICAgIG5leHRNb3VudEluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dEluZGV4Kys7XG4gICAgICAgIGxhc3RQbGFjZWROb2RlID0gUmVhY3RSZWNvbmNpbGVyLmdldEhvc3ROb2RlKG5leHRDaGlsZCk7XG4gICAgICB9XG4gICAgICAvLyBSZW1vdmUgY2hpbGRyZW4gdGhhdCBhcmUgbm8gbG9uZ2VyIHByZXNlbnQuXG4gICAgICBmb3IgKG5hbWUgaW4gcmVtb3ZlZE5vZGVzKSB7XG4gICAgICAgIGlmIChyZW1vdmVkTm9kZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICB1cGRhdGVzID0gZW5xdWV1ZSh1cGRhdGVzLCB0aGlzLl91bm1vdW50Q2hpbGQocHJldkNoaWxkcmVuW25hbWVdLCByZW1vdmVkTm9kZXNbbmFtZV0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZXMpIHtcbiAgICAgICAgcHJvY2Vzc1F1ZXVlKHRoaXMsIHVwZGF0ZXMpO1xuICAgICAgfVxuICAgICAgdGhpcy5fcmVuZGVyZWRDaGlsZHJlbiA9IG5leHRDaGlsZHJlbjtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgc2V0Q2hpbGRyZW5Gb3JJbnN0cnVtZW50YXRpb24uY2FsbCh0aGlzLCBuZXh0Q2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVbm1vdW50cyBhbGwgcmVuZGVyZWQgY2hpbGRyZW4uIFRoaXMgc2hvdWxkIGJlIHVzZWQgdG8gY2xlYW4gdXAgY2hpbGRyZW5cbiAgICAgKiB3aGVuIHRoaXMgY29tcG9uZW50IGlzIHVubW91bnRlZC4gSXQgZG9lcyBub3QgYWN0dWFsbHkgcGVyZm9ybSBhbnlcbiAgICAgKiBiYWNrZW5kIG9wZXJhdGlvbnMuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB1bm1vdW50Q2hpbGRyZW46IGZ1bmN0aW9uIChzYWZlbHkpIHtcbiAgICAgIHZhciByZW5kZXJlZENoaWxkcmVuID0gdGhpcy5fcmVuZGVyZWRDaGlsZHJlbjtcbiAgICAgIFJlYWN0Q2hpbGRSZWNvbmNpbGVyLnVubW91bnRDaGlsZHJlbihyZW5kZXJlZENoaWxkcmVuLCBzYWZlbHkpO1xuICAgICAgdGhpcy5fcmVuZGVyZWRDaGlsZHJlbiA9IG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGEgY2hpbGQgY29tcG9uZW50IHRvIHRoZSBzdXBwbGllZCBpbmRleC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGNoaWxkIENvbXBvbmVudCB0byBtb3ZlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0b0luZGV4IERlc3RpbmF0aW9uIGluZGV4IG9mIHRoZSBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsYXN0SW5kZXggTGFzdCBpbmRleCB2aXNpdGVkIG9mIHRoZSBzaWJsaW5ncyBvZiBgY2hpbGRgLlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBtb3ZlQ2hpbGQ6IGZ1bmN0aW9uIChjaGlsZCwgYWZ0ZXJOb2RlLCB0b0luZGV4LCBsYXN0SW5kZXgpIHtcbiAgICAgIC8vIElmIHRoZSBpbmRleCBvZiBgY2hpbGRgIGlzIGxlc3MgdGhhbiBgbGFzdEluZGV4YCwgdGhlbiBpdCBuZWVkcyB0b1xuICAgICAgLy8gYmUgbW92ZWQuIE90aGVyd2lzZSwgd2UgZG8gbm90IG5lZWQgdG8gbW92ZSBpdCBiZWNhdXNlIGEgY2hpbGQgd2lsbCBiZVxuICAgICAgLy8gaW5zZXJ0ZWQgb3IgbW92ZWQgYmVmb3JlIGBjaGlsZGAuXG4gICAgICBpZiAoY2hpbGQuX21vdW50SW5kZXggPCBsYXN0SW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VNb3ZlKGNoaWxkLCBhZnRlck5vZGUsIHRvSW5kZXgpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2hpbGQgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY2hpbGQgQ29tcG9uZW50IHRvIGNyZWF0ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW91bnRJbWFnZSBNYXJrdXAgdG8gaW5zZXJ0LlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBjcmVhdGVDaGlsZDogZnVuY3Rpb24gKGNoaWxkLCBhZnRlck5vZGUsIG1vdW50SW1hZ2UpIHtcbiAgICAgIHJldHVybiBtYWtlSW5zZXJ0TWFya3VwKG1vdW50SW1hZ2UsIGFmdGVyTm9kZSwgY2hpbGQuX21vdW50SW5kZXgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgY2hpbGQgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY2hpbGQgQ2hpbGQgdG8gcmVtb3ZlLlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICByZW1vdmVDaGlsZDogZnVuY3Rpb24gKGNoaWxkLCBub2RlKSB7XG4gICAgICByZXR1cm4gbWFrZVJlbW92ZShjaGlsZCwgbm9kZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE1vdW50cyBhIGNoaWxkIHdpdGggdGhlIHN1cHBsaWVkIG5hbWUuXG4gICAgICpcbiAgICAgKiBOT1RFOiBUaGlzIGlzIHBhcnQgb2YgYHVwZGF0ZUNoaWxkcmVuYCBhbmQgaXMgaGVyZSBmb3IgcmVhZGFiaWxpdHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjaGlsZCBDb21wb25lbnQgdG8gbW91bnQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgY2hpbGQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IGF0IHdoaWNoIHRvIGluc2VydCB0aGUgY2hpbGQuXG4gICAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX21vdW50Q2hpbGRBdEluZGV4OiBmdW5jdGlvbiAoY2hpbGQsIG1vdW50SW1hZ2UsIGFmdGVyTm9kZSwgaW5kZXgsIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgICBjaGlsZC5fbW91bnRJbmRleCA9IGluZGV4O1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQ2hpbGQoY2hpbGQsIGFmdGVyTm9kZSwgbW91bnRJbWFnZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVubW91bnRzIGEgcmVuZGVyZWQgY2hpbGQuXG4gICAgICpcbiAgICAgKiBOT1RFOiBUaGlzIGlzIHBhcnQgb2YgYHVwZGF0ZUNoaWxkcmVuYCBhbmQgaXMgaGVyZSBmb3IgcmVhZGFiaWxpdHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjaGlsZCBDb21wb25lbnQgdG8gdW5tb3VudC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF91bm1vdW50Q2hpbGQ6IGZ1bmN0aW9uIChjaGlsZCwgbm9kZSkge1xuICAgICAgdmFyIHVwZGF0ZSA9IHRoaXMucmVtb3ZlQ2hpbGQoY2hpbGQsIG5vZGUpO1xuICAgICAgY2hpbGQuX21vdW50SW5kZXggPSBudWxsO1xuICAgICAgcmV0dXJuIHVwZGF0ZTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RNdWx0aUNoaWxkOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTUtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdEN1cnJlbnRPd25lcicpO1xudmFyIFJlYWN0SW5zdGFuY2VNYXAgPSByZXF1aXJlKCcuL1JlYWN0SW5zdGFuY2VNYXAnKTtcbnZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0cnVtZW50YXRpb24nKTtcbnZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxuZnVuY3Rpb24gZW5xdWV1ZVVwZGF0ZShpbnRlcm5hbEluc3RhbmNlKSB7XG4gIFJlYWN0VXBkYXRlcy5lbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2UpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVbmV4cGVjdGVkQXJndW1lbnQoYXJnKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGFyZztcbiAgaWYgKHR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cbiAgdmFyIGRpc3BsYXlOYW1lID0gYXJnLmNvbnN0cnVjdG9yICYmIGFyZy5jb25zdHJ1Y3Rvci5uYW1lIHx8IHR5cGU7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYXJnKTtcbiAgaWYgKGtleXMubGVuZ3RoID4gMCAmJiBrZXlzLmxlbmd0aCA8IDIwKSB7XG4gICAgcmV0dXJuIGRpc3BsYXlOYW1lICsgJyAoa2V5czogJyArIGtleXMuam9pbignLCAnKSArICcpJztcbiAgfVxuICByZXR1cm4gZGlzcGxheU5hbWU7XG59XG5cbmZ1bmN0aW9uIGdldEludGVybmFsSW5zdGFuY2VSZWFkeUZvclVwZGF0ZShwdWJsaWNJbnN0YW5jZSwgY2FsbGVyTmFtZSkge1xuICB2YXIgaW50ZXJuYWxJbnN0YW5jZSA9IFJlYWN0SW5zdGFuY2VNYXAuZ2V0KHB1YmxpY0luc3RhbmNlKTtcbiAgaWYgKCFpbnRlcm5hbEluc3RhbmNlKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBjdG9yID0gcHVibGljSW5zdGFuY2UuY29uc3RydWN0b3I7XG4gICAgICAvLyBPbmx5IHdhcm4gd2hlbiB3ZSBoYXZlIGEgY2FsbGVyTmFtZS4gT3RoZXJ3aXNlIHdlIHNob3VsZCBiZSBzaWxlbnQuXG4gICAgICAvLyBXZSdyZSBwcm9iYWJseSBjYWxsaW5nIGZyb20gZW5xdWV1ZUNhbGxiYWNrLiBXZSBkb24ndCB3YW50IHRvIHdhcm5cbiAgICAgIC8vIHRoZXJlIGJlY2F1c2Ugd2UgYWxyZWFkeSB3YXJuZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGxpZmVjeWNsZSBtZXRob2QuXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghY2FsbGVyTmFtZSwgJyVzKC4uLik6IENhbiBvbmx5IHVwZGF0ZSBhIG1vdW50ZWQgb3IgbW91bnRpbmcgY29tcG9uZW50LiAnICsgJ1RoaXMgdXN1YWxseSBtZWFucyB5b3UgY2FsbGVkICVzKCkgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4gJyArICdUaGlzIGlzIGEgbm8tb3AuIFBsZWFzZSBjaGVjayB0aGUgY29kZSBmb3IgdGhlICVzIGNvbXBvbmVudC4nLCBjYWxsZXJOYW1lLCBjYWxsZXJOYW1lLCBjdG9yICYmIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgfHwgJ1JlYWN0Q2xhc3MnKSA6IHZvaWQgMDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgPT0gbnVsbCwgJyVzKC4uLik6IENhbm5vdCB1cGRhdGUgZHVyaW5nIGFuIGV4aXN0aW5nIHN0YXRlIHRyYW5zaXRpb24gKHN1Y2ggYXMgJyArIFwid2l0aGluIGByZW5kZXJgIG9yIGFub3RoZXIgY29tcG9uZW50J3MgY29uc3RydWN0b3IpLiBSZW5kZXIgbWV0aG9kcyBcIiArICdzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZTsgY29uc3RydWN0b3IgJyArICdzaWRlLWVmZmVjdHMgYXJlIGFuIGFudGktcGF0dGVybiwgYnV0IGNhbiBiZSBtb3ZlZCB0byAnICsgJ2Bjb21wb25lbnRXaWxsTW91bnRgLicsIGNhbGxlck5hbWUpIDogdm9pZCAwO1xuICB9XG5cbiAgcmV0dXJuIGludGVybmFsSW5zdGFuY2U7XG59XG5cbi8qKlxuICogUmVhY3RVcGRhdGVRdWV1ZSBhbGxvd3MgZm9yIHN0YXRlIHVwZGF0ZXMgdG8gYmUgc2NoZWR1bGVkIGludG8gYSBsYXRlclxuICogcmVjb25jaWxpYXRpb24gc3RlcC5cbiAqL1xudmFyIFJlYWN0VXBkYXRlUXVldWUgPSB7XG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhpcyBjb21wb3NpdGUgY29tcG9uZW50IGlzIG1vdW50ZWQuXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHdlIHdhbnQgdG8gdGVzdC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb3VudGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGZpbmFsXG4gICAqL1xuICBpc01vdW50ZWQ6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuICAgICAgaWYgKG93bmVyICE9PSBudWxsKSB7XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKG93bmVyLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciwgJyVzIGlzIGFjY2Vzc2luZyBpc01vdW50ZWQgaW5zaWRlIGl0cyByZW5kZXIoKSBmdW5jdGlvbi4gJyArICdyZW5kZXIoKSBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4gSXQgc2hvdWxkICcgKyAnbmV2ZXIgYWNjZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIHN0YWxlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgJyArICdyZW5kZXIsIHN1Y2ggYXMgcmVmcy4gTW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFuZCAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZSBpbnN0ZWFkLicsIG93bmVyLmdldE5hbWUoKSB8fCAnQSBjb21wb25lbnQnKSA6IHZvaWQgMDtcbiAgICAgICAgb3duZXIuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGludGVybmFsSW5zdGFuY2UgPSBSZWFjdEluc3RhbmNlTWFwLmdldChwdWJsaWNJbnN0YW5jZSk7XG4gICAgaWYgKGludGVybmFsSW5zdGFuY2UpIHtcbiAgICAgIC8vIER1cmluZyBjb21wb25lbnRXaWxsTW91bnQgYW5kIHJlbmRlciB0aGlzIHdpbGwgc3RpbGwgYmUgbnVsbCBidXQgYWZ0ZXJcbiAgICAgIC8vIHRoYXQgd2lsbCBhbHdheXMgcmVuZGVyIHRvIHNvbWV0aGluZy4gQXQgbGVhc3QgZm9yIG5vdy4gU28gd2UgY2FuIHVzZVxuICAgICAgLy8gdGhpcyBoYWNrLlxuICAgICAgcmV0dXJuICEhaW50ZXJuYWxJbnN0YW5jZS5fcmVuZGVyZWRDb21wb25lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEVucXVldWUgYSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgYWxsIHRoZSBwZW5kaW5nIHVwZGF0ZXNcbiAgICogaGF2ZSBwcm9jZXNzZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRvIHVzZSBhcyBgdGhpc2AgY29udGV4dC5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGVyTmFtZSBOYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVDYWxsYmFjazogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIFJlYWN0VXBkYXRlUXVldWUudmFsaWRhdGVDYWxsYmFjayhjYWxsYmFjaywgY2FsbGVyTmFtZSk7XG4gICAgdmFyIGludGVybmFsSW5zdGFuY2UgPSBnZXRJbnRlcm5hbEluc3RhbmNlUmVhZHlGb3JVcGRhdGUocHVibGljSW5zdGFuY2UpO1xuXG4gICAgLy8gUHJldmlvdXNseSB3ZSB3b3VsZCB0aHJvdyBhbiBlcnJvciBpZiB3ZSBkaWRuJ3QgaGF2ZSBhbiBpbnRlcm5hbFxuICAgIC8vIGluc3RhbmNlLiBTaW5jZSB3ZSB3YW50IHRvIG1ha2UgaXQgYSBuby1vcCBpbnN0ZWFkLCB3ZSBtaXJyb3IgdGhlIHNhbWVcbiAgICAvLyBiZWhhdmlvciB3ZSBoYXZlIGluIG90aGVyIGVucXVldWUqIG1ldGhvZHMuXG4gICAgLy8gV2UgYWxzbyBuZWVkIHRvIGlnbm9yZSBjYWxsYmFja3MgaW4gY29tcG9uZW50V2lsbE1vdW50LiBTZWVcbiAgICAvLyBlbnF1ZXVlVXBkYXRlcy5cbiAgICBpZiAoIWludGVybmFsSW5zdGFuY2UpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nQ2FsbGJhY2tzKSB7XG4gICAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nQ2FsbGJhY2tzID0gW2NhbGxiYWNrXTtcbiAgICB9XG4gICAgLy8gVE9ETzogVGhlIGNhbGxiYWNrIGhlcmUgaXMgaWdub3JlZCB3aGVuIHNldFN0YXRlIGlzIGNhbGxlZCBmcm9tXG4gICAgLy8gY29tcG9uZW50V2lsbE1vdW50LiBFaXRoZXIgZml4IGl0IG9yIGRpc2FsbG93IGRvaW5nIHNvIGNvbXBsZXRlbHkgaW5cbiAgICAvLyBmYXZvciBvZiBnZXRJbml0aWFsU3RhdGUuIEFsdGVybmF0aXZlbHksIHdlIGNhbiBkaXNhbGxvd1xuICAgIC8vIGNvbXBvbmVudFdpbGxNb3VudCBkdXJpbmcgc2VydmVyLXNpZGUgcmVuZGVyaW5nLlxuICAgIGVucXVldWVVcGRhdGUoaW50ZXJuYWxJbnN0YW5jZSk7XG4gIH0sXG5cbiAgZW5xdWV1ZUNhbGxiYWNrSW50ZXJuYWw6IGZ1bmN0aW9uIChpbnRlcm5hbEluc3RhbmNlLCBjYWxsYmFjaykge1xuICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nQ2FsbGJhY2tzKSB7XG4gICAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nQ2FsbGJhY2tzID0gW2NhbGxiYWNrXTtcbiAgICB9XG4gICAgZW5xdWV1ZVVwZGF0ZShpbnRlcm5hbEluc3RhbmNlKTtcbiAgfSxcblxuICAvKipcbiAgICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICAgKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipub3QqKiBpbiBhIERPTSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICAgKiBjb21wb25lbnQncyBzdGF0ZSBoYXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC5cbiAgICpcbiAgICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICAgKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnREaWRVcGRhdGVgLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkge1xuICAgIHZhciBpbnRlcm5hbEluc3RhbmNlID0gZ2V0SW50ZXJuYWxJbnN0YW5jZVJlYWR5Rm9yVXBkYXRlKHB1YmxpY0luc3RhbmNlLCAnZm9yY2VVcGRhdGUnKTtcblxuICAgIGlmICghaW50ZXJuYWxJbnN0YW5jZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdGb3JjZVVwZGF0ZSA9IHRydWU7XG5cbiAgICBlbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2UpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgb3IgYHNldFN0YXRlYCB0byBtdXRhdGUgc3RhdGUuXG4gICAqIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAgICpcbiAgICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc29cbiAgICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb21wbGV0ZVN0YXRlIE5leHQgc3RhdGUuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjb21wbGV0ZVN0YXRlLCBjYWxsYmFjaykge1xuICAgIHZhciBpbnRlcm5hbEluc3RhbmNlID0gZ2V0SW50ZXJuYWxJbnN0YW5jZVJlYWR5Rm9yVXBkYXRlKHB1YmxpY0luc3RhbmNlLCAncmVwbGFjZVN0YXRlJyk7XG5cbiAgICBpZiAoIWludGVybmFsSW5zdGFuY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nU3RhdGVRdWV1ZSA9IFtjb21wbGV0ZVN0YXRlXTtcbiAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nUmVwbGFjZVN0YXRlID0gdHJ1ZTtcblxuICAgIC8vIEZ1dHVyZS1wcm9vZiAxNS41XG4gICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIFJlYWN0VXBkYXRlUXVldWUudmFsaWRhdGVDYWxsYmFjayhjYWxsYmFjaywgJ3JlcGxhY2VTdGF0ZScpO1xuICAgICAgaWYgKGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdDYWxsYmFja3MpIHtcbiAgICAgICAgaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0NhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdDYWxsYmFja3MgPSBbY2FsbGJhY2tdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGVucXVldWVVcGRhdGUoaW50ZXJuYWxJbnN0YW5jZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBUaGlzIG9ubHkgZXhpc3RzIGJlY2F1c2UgX3BlbmRpbmdTdGF0ZSBpc1xuICAgKiBpbnRlcm5hbC4gVGhpcyBwcm92aWRlcyBhIG1lcmdpbmcgc3RyYXRlZ3kgdGhhdCBpcyBub3QgYXZhaWxhYmxlIHRvIGRlZXBcbiAgICogcHJvcGVydGllcyB3aGljaCBpcyBjb25mdXNpbmcuIFRPRE86IEV4cG9zZSBwZW5kaW5nU3RhdGUgb3IgZG9uJ3QgdXNlIGl0XG4gICAqIGR1cmluZyB0aGUgbWVyZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBzdGF0ZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgcGFydGlhbFN0YXRlKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblNldFN0YXRlKCk7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhwYXJ0aWFsU3RhdGUgIT0gbnVsbCwgJ3NldFN0YXRlKC4uLik6IFlvdSBwYXNzZWQgYW4gdW5kZWZpbmVkIG9yIG51bGwgc3RhdGUgb2JqZWN0OyAnICsgJ2luc3RlYWQsIHVzZSBmb3JjZVVwZGF0ZSgpLicpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIHZhciBpbnRlcm5hbEluc3RhbmNlID0gZ2V0SW50ZXJuYWxJbnN0YW5jZVJlYWR5Rm9yVXBkYXRlKHB1YmxpY0luc3RhbmNlLCAnc2V0U3RhdGUnKTtcblxuICAgIGlmICghaW50ZXJuYWxJbnN0YW5jZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBxdWV1ZSA9IGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdTdGF0ZVF1ZXVlIHx8IChpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nU3RhdGVRdWV1ZSA9IFtdKTtcbiAgICBxdWV1ZS5wdXNoKHBhcnRpYWxTdGF0ZSk7XG5cbiAgICBlbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2UpO1xuICB9LFxuXG4gIGVucXVldWVFbGVtZW50SW50ZXJuYWw6IGZ1bmN0aW9uIChpbnRlcm5hbEluc3RhbmNlLCBuZXh0RWxlbWVudCwgbmV4dENvbnRleHQpIHtcbiAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nRWxlbWVudCA9IG5leHRFbGVtZW50O1xuICAgIC8vIFRPRE86IGludHJvZHVjZSBfcGVuZGluZ0NvbnRleHQgaW5zdGVhZCBvZiBzZXR0aW5nIGl0IGRpcmVjdGx5LlxuICAgIGludGVybmFsSW5zdGFuY2UuX2NvbnRleHQgPSBuZXh0Q29udGV4dDtcbiAgICBlbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2UpO1xuICB9LFxuXG4gIHZhbGlkYXRlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgICEoIWNhbGxiYWNrIHx8IHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMoLi4uKTogRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1bWVudCB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsZXJOYW1lLCBmb3JtYXRVbmV4cGVjdGVkQXJndW1lbnQoY2FsbGJhY2spKSA6IF9wcm9kSW52YXJpYW50KCcxMjInLCBjYWxsZXJOYW1lLCBmb3JtYXRVbmV4cGVjdGVkQXJndW1lbnQoY2FsbGJhY2spKSA6IHZvaWQgMDtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFVwZGF0ZVF1ZXVlOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTUtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIFJlYWN0VXBkYXRlUXVldWUgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlUXVldWUnKTtcblxudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbmZ1bmN0aW9uIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCBjYWxsZXJOYW1lKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdmFyIGNvbnN0cnVjdG9yID0gcHVibGljSW5zdGFuY2UuY29uc3RydWN0b3I7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyguLi4pOiBDYW4gb25seSB1cGRhdGUgYSBtb3VudGluZyBjb21wb25lbnQuICcgKyAnVGhpcyB1c3VhbGx5IG1lYW5zIHlvdSBjYWxsZWQgJXMoKSBvdXRzaWRlIGNvbXBvbmVudFdpbGxNb3VudCgpIG9uIHRoZSBzZXJ2ZXIuICcgKyAnVGhpcyBpcyBhIG5vLW9wLiBQbGVhc2UgY2hlY2sgdGhlIGNvZGUgZm9yIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFtZSwgY2FsbGVyTmFtZSwgY29uc3RydWN0b3IgJiYgKGNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IGNvbnN0cnVjdG9yLm5hbWUpIHx8ICdSZWFjdENsYXNzJykgOiB2b2lkIDA7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSB1cGRhdGUgcXVldWUgdXNlZCBmb3Igc2VydmVyIHJlbmRlcmluZy5cbiAqIEl0IGRlbGVnYXRlcyB0byBSZWFjdFVwZGF0ZVF1ZXVlIHdoaWxlIHNlcnZlciByZW5kZXJpbmcgaXMgaW4gcHJvZ3Jlc3MgYW5kXG4gKiBzd2l0Y2hlcyB0byBSZWFjdE5vb3BVcGRhdGVRdWV1ZSBhZnRlciB0aGUgdHJhbnNhY3Rpb24gaGFzIGNvbXBsZXRlZC5cbiAqIEBjbGFzcyBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICovXG5cbnZhciBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlKHRyYW5zYWN0aW9uKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlYWN0U2VydmVyVXBkYXRlUXVldWUpO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvc2l0ZSBjb21wb25lbnQgaXMgbW91bnRlZC5cbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2Ugd2Ugd2FudCB0byB0ZXN0LlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIG1vdW50ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHByb3RlY3RlZFxuICAgKiBAZmluYWxcbiAgICovXG5cblxuICBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlLnByb3RvdHlwZS5pc01vdW50ZWQgPSBmdW5jdGlvbiBpc01vdW50ZWQocHVibGljSW5zdGFuY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIEVucXVldWUgYSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgYWxsIHRoZSBwZW5kaW5nIHVwZGF0ZXNcbiAgICogaGF2ZSBwcm9jZXNzZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRvIHVzZSBhcyBgdGhpc2AgY29udGV4dC5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG5cblxuICBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlLnByb3RvdHlwZS5lbnF1ZXVlQ2FsbGJhY2sgPSBmdW5jdGlvbiBlbnF1ZXVlQ2FsbGJhY2socHVibGljSW5zdGFuY2UsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uaXNJblRyYW5zYWN0aW9uKCkpIHtcbiAgICAgIFJlYWN0VXBkYXRlUXVldWUuZW5xdWV1ZUNhbGxiYWNrKHB1YmxpY0luc3RhbmNlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBGb3JjZXMgYW4gdXBkYXRlLiBUaGlzIHNob3VsZCBvbmx5IGJlIGludm9rZWQgd2hlbiBpdCBpcyBrbm93biB3aXRoXG4gICAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBZb3UgbWF5IHdhbnQgdG8gY2FsbCB0aGlzIHdoZW4geW91IGtub3cgdGhhdCBzb21lIGRlZXBlciBhc3BlY3Qgb2YgdGhlXG4gICAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICAgKlxuICAgKiBUaGlzIHdpbGwgbm90IGludm9rZSBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCwgYnV0IGl0IHdpbGwgaW52b2tlXG4gICAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG5cblxuICBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlLnByb3RvdHlwZS5lbnF1ZXVlRm9yY2VVcGRhdGUgPSBmdW5jdGlvbiBlbnF1ZXVlRm9yY2VVcGRhdGUocHVibGljSW5zdGFuY2UpIHtcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5pc0luVHJhbnNhY3Rpb24oKSkge1xuICAgICAgUmVhY3RVcGRhdGVRdWV1ZS5lbnF1ZXVlRm9yY2VVcGRhdGUocHVibGljSW5zdGFuY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ2ZvcmNlVXBkYXRlJyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgb3IgYHNldFN0YXRlYCB0byBtdXRhdGUgc3RhdGUuXG4gICAqIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAgICpcbiAgICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc29cbiAgICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fGZ1bmN0aW9ufSBjb21wbGV0ZVN0YXRlIE5leHQgc3RhdGUuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cblxuXG4gIFJlYWN0U2VydmVyVXBkYXRlUXVldWUucHJvdG90eXBlLmVucXVldWVSZXBsYWNlU3RhdGUgPSBmdW5jdGlvbiBlbnF1ZXVlUmVwbGFjZVN0YXRlKHB1YmxpY0luc3RhbmNlLCBjb21wbGV0ZVN0YXRlKSB7XG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uaXNJblRyYW5zYWN0aW9uKCkpIHtcbiAgICAgIFJlYWN0VXBkYXRlUXVldWUuZW5xdWV1ZVJlcGxhY2VTdGF0ZShwdWJsaWNJbnN0YW5jZSwgY29tcGxldGVTdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAncmVwbGFjZVN0YXRlJyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gVGhpcyBvbmx5IGV4aXN0cyBiZWNhdXNlIF9wZW5kaW5nU3RhdGUgaXNcbiAgICogaW50ZXJuYWwuIFRoaXMgcHJvdmlkZXMgYSBtZXJnaW5nIHN0cmF0ZWd5IHRoYXQgaXMgbm90IGF2YWlsYWJsZSB0byBkZWVwXG4gICAqIHByb3BlcnRpZXMgd2hpY2ggaXMgY29uZnVzaW5nLiBUT0RPOiBFeHBvc2UgcGVuZGluZ1N0YXRlIG9yIGRvbid0IHVzZSBpdFxuICAgKiBkdXJpbmcgdGhlIG1lcmdlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rpb259IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggc3RhdGUuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cblxuXG4gIFJlYWN0U2VydmVyVXBkYXRlUXVldWUucHJvdG90eXBlLmVucXVldWVTZXRTdGF0ZSA9IGZ1bmN0aW9uIGVucXVldWVTZXRTdGF0ZShwdWJsaWNJbnN0YW5jZSwgcGFydGlhbFN0YXRlKSB7XG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uaXNJblRyYW5zYWN0aW9uKCkpIHtcbiAgICAgIFJlYWN0VXBkYXRlUXVldWUuZW5xdWV1ZVNldFN0YXRlKHB1YmxpY0luc3RhbmNlLCBwYXJ0aWFsU3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3NldFN0YXRlJyk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlO1xufSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0U2VydmVyVXBkYXRlUXVldWU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBQb29sZWRDbGFzcyA9IHJlcXVpcmUoJy4vUG9vbGVkQ2xhc3MnKTtcbnZhciBUcmFuc2FjdGlvbiA9IHJlcXVpcmUoJy4vVHJhbnNhY3Rpb24nKTtcbnZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0cnVtZW50YXRpb24nKTtcbnZhciBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlID0gcmVxdWlyZSgnLi9SZWFjdFNlcnZlclVwZGF0ZVF1ZXVlJyk7XG5cbi8qKlxuICogRXhlY3V0ZWQgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgYFRyYW5zYWN0aW9uYCBpbnN0YW5jZS4gQ29uc2lkZXIgdGhlc2UgYXNcbiAqIGJlaW5nIG1lbWJlciBtZXRob2RzLCBidXQgd2l0aCBhbiBpbXBsaWVkIG9yZGVyaW5nIHdoaWxlIGJlaW5nIGlzb2xhdGVkIGZyb21cbiAqIGVhY2ggb3RoZXIuXG4gKi9cbnZhciBUUkFOU0FDVElPTl9XUkFQUEVSUyA9IFtdO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBUUkFOU0FDVElPTl9XUkFQUEVSUy5wdXNoKHtcbiAgICBpbml0aWFsaXplOiBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWdpbkZsdXNoLFxuICAgIGNsb3NlOiBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25FbmRGbHVzaFxuICB9KTtcbn1cblxudmFyIG5vb3BDYWxsYmFja1F1ZXVlID0ge1xuICBlbnF1ZXVlOiBmdW5jdGlvbiAoKSB7fVxufTtcblxuLyoqXG4gKiBAY2xhc3MgUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvblxuICogQHBhcmFtIHtib29sZWFufSByZW5kZXJUb1N0YXRpY01hcmt1cFxuICovXG5mdW5jdGlvbiBSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9uKHJlbmRlclRvU3RhdGljTWFya3VwKSB7XG4gIHRoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKTtcbiAgdGhpcy5yZW5kZXJUb1N0YXRpY01hcmt1cCA9IHJlbmRlclRvU3RhdGljTWFya3VwO1xuICB0aGlzLnVzZUNyZWF0ZUVsZW1lbnQgPSBmYWxzZTtcbiAgdGhpcy51cGRhdGVRdWV1ZSA9IG5ldyBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlKHRoaXMpO1xufVxuXG52YXIgTWl4aW4gPSB7XG4gIC8qKlxuICAgKiBAc2VlIFRyYW5zYWN0aW9uXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAZmluYWxcbiAgICogQHJldHVybiB7YXJyYXl9IEVtcHR5IGxpc3Qgb2Ygb3BlcmF0aW9uIHdyYXAgcHJvY2VkdXJlcy5cbiAgICovXG4gIGdldFRyYW5zYWN0aW9uV3JhcHBlcnM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gVFJBTlNBQ1RJT05fV1JBUFBFUlM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge29iamVjdH0gVGhlIHF1ZXVlIHRvIGNvbGxlY3QgYG9uRE9NUmVhZHlgIGNhbGxiYWNrcyB3aXRoLlxuICAgKi9cbiAgZ2V0UmVhY3RNb3VudFJlYWR5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5vb3BDYWxsYmFja1F1ZXVlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBxdWV1ZSB0byBjb2xsZWN0IFJlYWN0IGFzeW5jIGV2ZW50cy5cbiAgICovXG4gIGdldFVwZGF0ZVF1ZXVlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlUXVldWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGBQb29sZWRDbGFzc2AgbG9va3MgZm9yIHRoaXMsIGFuZCB3aWxsIGludm9rZSB0aGlzIGJlZm9yZSBhbGxvd2luZyB0aGlzXG4gICAqIGluc3RhbmNlIHRvIGJlIHJldXNlZC5cbiAgICovXG4gIGRlc3RydWN0b3I6IGZ1bmN0aW9uICgpIHt9LFxuXG4gIGNoZWNrcG9pbnQ6IGZ1bmN0aW9uICgpIHt9LFxuXG4gIHJvbGxiYWNrOiBmdW5jdGlvbiAoKSB7fVxufTtcblxuX2Fzc2lnbihSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9uLnByb3RvdHlwZSwgVHJhbnNhY3Rpb24sIE1peGluKTtcblxuUG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb247IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbi8qIGdsb2JhbCBoYXNPd25Qcm9wZXJ0eTp0cnVlICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKSxcbiAgICBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgQXV0b0ZvY3VzVXRpbHMgPSByZXF1aXJlKCcuL0F1dG9Gb2N1c1V0aWxzJyk7XG52YXIgQ1NTUHJvcGVydHlPcGVyYXRpb25zID0gcmVxdWlyZSgnLi9DU1NQcm9wZXJ0eU9wZXJhdGlvbnMnKTtcbnZhciBET01MYXp5VHJlZSA9IHJlcXVpcmUoJy4vRE9NTGF6eVRyZWUnKTtcbnZhciBET01OYW1lc3BhY2VzID0gcmVxdWlyZSgnLi9ET01OYW1lc3BhY2VzJyk7XG52YXIgRE9NUHJvcGVydHkgPSByZXF1aXJlKCcuL0RPTVByb3BlcnR5Jyk7XG52YXIgRE9NUHJvcGVydHlPcGVyYXRpb25zID0gcmVxdWlyZSgnLi9ET01Qcm9wZXJ0eU9wZXJhdGlvbnMnKTtcbnZhciBFdmVudFBsdWdpbkh1YiA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5IdWInKTtcbnZhciBFdmVudFBsdWdpblJlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpblJlZ2lzdHJ5Jyk7XG52YXIgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnLi9SZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXInKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudEZsYWdzID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudEZsYWdzJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdERPTUlucHV0ID0gcmVxdWlyZSgnLi9SZWFjdERPTUlucHV0Jyk7XG52YXIgUmVhY3RET01PcHRpb24gPSByZXF1aXJlKCcuL1JlYWN0RE9NT3B0aW9uJyk7XG52YXIgUmVhY3RET01TZWxlY3QgPSByZXF1aXJlKCcuL1JlYWN0RE9NU2VsZWN0Jyk7XG52YXIgUmVhY3RET01UZXh0YXJlYSA9IHJlcXVpcmUoJy4vUmVhY3RET01UZXh0YXJlYScpO1xudmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xudmFyIFJlYWN0TXVsdGlDaGlsZCA9IHJlcXVpcmUoJy4vUmVhY3RNdWx0aUNoaWxkJyk7XG52YXIgUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbicpO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTtcbnZhciBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIgPSByZXF1aXJlKCcuL2VzY2FwZVRleHRDb250ZW50Rm9yQnJvd3NlcicpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIGlzRXZlbnRTdXBwb3J0ZWQgPSByZXF1aXJlKCcuL2lzRXZlbnRTdXBwb3J0ZWQnKTtcbnZhciBzaGFsbG93RXF1YWwgPSByZXF1aXJlKCdmYmpzL2xpYi9zaGFsbG93RXF1YWwnKTtcbnZhciBpbnB1dFZhbHVlVHJhY2tpbmcgPSByZXF1aXJlKCcuL2lucHV0VmFsdWVUcmFja2luZycpO1xudmFyIHZhbGlkYXRlRE9NTmVzdGluZyA9IHJlcXVpcmUoJy4vdmFsaWRhdGVET01OZXN0aW5nJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIEZsYWdzID0gUmVhY3RET01Db21wb25lbnRGbGFncztcbnZhciBkZWxldGVMaXN0ZW5lciA9IEV2ZW50UGx1Z2luSHViLmRlbGV0ZUxpc3RlbmVyO1xudmFyIGdldE5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZTtcbnZhciBsaXN0ZW5UbyA9IFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5saXN0ZW5UbztcbnZhciByZWdpc3RyYXRpb25OYW1lTW9kdWxlcyA9IEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXM7XG5cbi8vIEZvciBxdWlja2x5IG1hdGNoaW5nIGNoaWxkcmVuIHR5cGUsIHRvIHRlc3QgaWYgY2FuIGJlIHRyZWF0ZWQgYXMgY29udGVudC5cbnZhciBDT05URU5UX1RZUEVTID0geyBzdHJpbmc6IHRydWUsIG51bWJlcjogdHJ1ZSB9O1xuXG52YXIgU1RZTEUgPSAnc3R5bGUnO1xudmFyIEhUTUwgPSAnX19odG1sJztcbnZhciBSRVNFUlZFRF9QUk9QUyA9IHtcbiAgY2hpbGRyZW46IG51bGwsXG4gIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiBudWxsLFxuICBzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmc6IG51bGxcbn07XG5cbi8vIE5vZGUgdHlwZSBmb3IgZG9jdW1lbnQgZnJhZ21lbnRzIChOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpLlxudmFyIERPQ19GUkFHTUVOVF9UWVBFID0gMTE7XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShpbnRlcm5hbEluc3RhbmNlKSB7XG4gIGlmIChpbnRlcm5hbEluc3RhbmNlKSB7XG4gICAgdmFyIG93bmVyID0gaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQuX293bmVyIHx8IG51bGw7XG4gICAgaWYgKG93bmVyKSB7XG4gICAgICB2YXIgbmFtZSA9IG93bmVyLmdldE5hbWUoKTtcbiAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgIHJldHVybiAnIFRoaXMgRE9NIG5vZGUgd2FzIHJlbmRlcmVkIGJ5IGAnICsgbmFtZSArICdgLic7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZnJpZW5kbHlTdHJpbmdpZnkob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIHJldHVybiAnWycgKyBvYmoubWFwKGZyaWVuZGx5U3RyaW5naWZ5KS5qb2luKCcsICcpICsgJ10nO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcGFpcnMgPSBbXTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICB2YXIga2V5RXNjYXBlZCA9IC9eW2EteiRfXVtcXHckX10qJC9pLnRlc3Qoa2V5KSA/IGtleSA6IEpTT04uc3RyaW5naWZ5KGtleSk7XG4gICAgICAgICAgcGFpcnMucHVzaChrZXlFc2NhcGVkICsgJzogJyArIGZyaWVuZGx5U3RyaW5naWZ5KG9ialtrZXldKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAneycgKyBwYWlycy5qb2luKCcsICcpICsgJ30nO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmopO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gJ1tmdW5jdGlvbiBvYmplY3RdJztcbiAgfVxuICAvLyBEaWZmZXJzIGZyb20gSlNPTi5zdHJpbmdpZnkgaW4gdGhhdCB1bmRlZmluZWQgYmVjYXVzZSB1bmRlZmluZWQgYW5kIHRoYXRcbiAgLy8gaW5mIGFuZCBuYW4gZG9uJ3QgYmVjb21lIG51bGxcbiAgcmV0dXJuIFN0cmluZyhvYmopO1xufVxuXG52YXIgc3R5bGVNdXRhdGlvbldhcm5pbmcgPSB7fTtcblxuZnVuY3Rpb24gY2hlY2tBbmRXYXJuRm9yTXV0YXRlZFN0eWxlKHN0eWxlMSwgc3R5bGUyLCBjb21wb25lbnQpIHtcbiAgaWYgKHN0eWxlMSA9PSBudWxsIHx8IHN0eWxlMiA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChzaGFsbG93RXF1YWwoc3R5bGUxLCBzdHlsZTIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnQuX3RhZztcbiAgdmFyIG93bmVyID0gY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5fb3duZXI7XG4gIHZhciBvd25lck5hbWU7XG4gIGlmIChvd25lcikge1xuICAgIG93bmVyTmFtZSA9IG93bmVyLmdldE5hbWUoKTtcbiAgfVxuXG4gIHZhciBoYXNoID0gb3duZXJOYW1lICsgJ3wnICsgY29tcG9uZW50TmFtZTtcblxuICBpZiAoc3R5bGVNdXRhdGlvbldhcm5pbmcuaGFzT3duUHJvcGVydHkoaGFzaCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdHlsZU11dGF0aW9uV2FybmluZ1toYXNoXSA9IHRydWU7XG5cbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdgJXNgIHdhcyBwYXNzZWQgYSBzdHlsZSBvYmplY3QgdGhhdCBoYXMgcHJldmlvdXNseSBiZWVuIG11dGF0ZWQuICcgKyAnTXV0YXRpbmcgYHN0eWxlYCBpcyBkZXByZWNhdGVkLiBDb25zaWRlciBjbG9uaW5nIGl0IGJlZm9yZWhhbmQuIENoZWNrICcgKyAndGhlIGByZW5kZXJgICVzLiBQcmV2aW91cyBzdHlsZTogJXMuIE11dGF0ZWQgc3R5bGU6ICVzLicsIGNvbXBvbmVudE5hbWUsIG93bmVyID8gJ29mIGAnICsgb3duZXJOYW1lICsgJ2AnIDogJ3VzaW5nIDwnICsgY29tcG9uZW50TmFtZSArICc+JywgZnJpZW5kbHlTdHJpbmdpZnkoc3R5bGUxKSwgZnJpZW5kbHlTdHJpbmdpZnkoc3R5bGUyKSkgOiB2b2lkIDA7XG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGNvbXBvbmVudFxuICogQHBhcmFtIHs/b2JqZWN0fSBwcm9wc1xuICovXG5mdW5jdGlvbiBhc3NlcnRWYWxpZFByb3BzKGNvbXBvbmVudCwgcHJvcHMpIHtcbiAgaWYgKCFwcm9wcykge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBOb3RlIHRoZSB1c2Ugb2YgYD09YCB3aGljaCBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkLlxuICBpZiAodm9pZEVsZW1lbnRUYWdzW2NvbXBvbmVudC5fdGFnXSkge1xuICAgICEocHJvcHMuY2hpbGRyZW4gPT0gbnVsbCAmJiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICclcyBpcyBhIHZvaWQgZWxlbWVudCB0YWcgYW5kIG11c3QgbmVpdGhlciBoYXZlIGBjaGlsZHJlbmAgbm9yIHVzZSBgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLiVzJywgY29tcG9uZW50Ll90YWcsIGNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQuX293bmVyID8gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiAnICsgY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5fb3duZXIuZ2V0TmFtZSgpICsgJy4nIDogJycpIDogX3Byb2RJbnZhcmlhbnQoJzEzNycsIGNvbXBvbmVudC5fdGFnLCBjb21wb25lbnQuX2N1cnJlbnRFbGVtZW50Ll9vd25lciA/ICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgJyArIGNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQuX293bmVyLmdldE5hbWUoKSArICcuJyA6ICcnKSA6IHZvaWQgMDtcbiAgfVxuICBpZiAocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgICEocHJvcHMuY2hpbGRyZW4gPT0gbnVsbCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnQ2FuIG9ubHkgc2V0IG9uZSBvZiBgY2hpbGRyZW5gIG9yIGBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAuJykgOiBfcHJvZEludmFyaWFudCgnNjAnKSA6IHZvaWQgMDtcbiAgICAhKHR5cGVvZiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PT0gJ29iamVjdCcgJiYgSFRNTCBpbiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnYHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYCBtdXN0IGJlIGluIHRoZSBmb3JtIGB7X19odG1sOiAuLi59YC4gUGxlYXNlIHZpc2l0IGh0dHBzOi8vZmIubWUvcmVhY3QtaW52YXJpYW50LWRhbmdlcm91c2x5LXNldC1pbm5lci1odG1sIGZvciBtb3JlIGluZm9ybWF0aW9uLicpIDogX3Byb2RJbnZhcmlhbnQoJzYxJykgOiB2b2lkIDA7XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhwcm9wcy5pbm5lckhUTUwgPT0gbnVsbCwgJ0RpcmVjdGx5IHNldHRpbmcgcHJvcGVydHkgYGlubmVySFRNTGAgaXMgbm90IHBlcm1pdHRlZC4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgbG9va3VwIGRvY3VtZW50YXRpb24gb24gYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKSA6IHZvaWQgMDtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhwcm9wcy5zdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgfHwgIXByb3BzLmNvbnRlbnRFZGl0YWJsZSB8fCBwcm9wcy5jaGlsZHJlbiA9PSBudWxsLCAnQSBjb21wb25lbnQgaXMgYGNvbnRlbnRFZGl0YWJsZWAgYW5kIGNvbnRhaW5zIGBjaGlsZHJlbmAgbWFuYWdlZCBieSAnICsgJ1JlYWN0LiBJdCBpcyBub3cgeW91ciByZXNwb25zaWJpbGl0eSB0byBndWFyYW50ZWUgdGhhdCBub25lIG9mICcgKyAndGhvc2Ugbm9kZXMgYXJlIHVuZXhwZWN0ZWRseSBtb2RpZmllZCBvciBkdXBsaWNhdGVkLiBUaGlzIGlzICcgKyAncHJvYmFibHkgbm90IGludGVudGlvbmFsLicpIDogdm9pZCAwO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHByb3BzLm9uRm9jdXNJbiA9PSBudWxsICYmIHByb3BzLm9uRm9jdXNPdXQgPT0gbnVsbCwgJ1JlYWN0IHVzZXMgb25Gb2N1cyBhbmQgb25CbHVyIGluc3RlYWQgb2Ygb25Gb2N1c0luIGFuZCBvbkZvY3VzT3V0LiAnICsgJ0FsbCBSZWFjdCBldmVudHMgYXJlIG5vcm1hbGl6ZWQgdG8gYnViYmxlLCBzbyBvbkZvY3VzSW4gYW5kIG9uRm9jdXNPdXQgJyArICdhcmUgbm90IG5lZWRlZC9zdXBwb3J0ZWQgYnkgUmVhY3QuJykgOiB2b2lkIDA7XG4gIH1cbiAgIShwcm9wcy5zdHlsZSA9PSBudWxsIHx8IHR5cGVvZiBwcm9wcy5zdHlsZSA9PT0gJ29iamVjdCcpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1RoZSBgc3R5bGVgIHByb3AgZXhwZWN0cyBhIG1hcHBpbmcgZnJvbSBzdHlsZSBwcm9wZXJ0aWVzIHRvIHZhbHVlcywgbm90IGEgc3RyaW5nLiBGb3IgZXhhbXBsZSwgc3R5bGU9e3ttYXJnaW5SaWdodDogc3BhY2luZyArIFxcJ2VtXFwnfX0gd2hlbiB1c2luZyBKU1guJXMnLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oY29tcG9uZW50KSkgOiBfcHJvZEludmFyaWFudCgnNjInLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oY29tcG9uZW50KSkgOiB2b2lkIDA7XG59XG5cbmZ1bmN0aW9uIGVucXVldWVQdXRMaXN0ZW5lcihpbnN0LCByZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lciwgdHJhbnNhY3Rpb24pIHtcbiAgaWYgKHRyYW5zYWN0aW9uIGluc3RhbmNlb2YgUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIC8vIElFOCBoYXMgbm8gQVBJIGZvciBldmVudCBjYXB0dXJpbmcgYW5kIHRoZSBgb25TY3JvbGxgIGV2ZW50IGRvZXNuJ3RcbiAgICAvLyBidWJibGUuXG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcocmVnaXN0cmF0aW9uTmFtZSAhPT0gJ29uU2Nyb2xsJyB8fCBpc0V2ZW50U3VwcG9ydGVkKCdzY3JvbGwnLCB0cnVlKSwgXCJUaGlzIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IHRoZSBgb25TY3JvbGxgIGV2ZW50XCIpIDogdm9pZCAwO1xuICB9XG4gIHZhciBjb250YWluZXJJbmZvID0gaW5zdC5faG9zdENvbnRhaW5lckluZm87XG4gIHZhciBpc0RvY3VtZW50RnJhZ21lbnQgPSBjb250YWluZXJJbmZvLl9ub2RlICYmIGNvbnRhaW5lckluZm8uX25vZGUubm9kZVR5cGUgPT09IERPQ19GUkFHTUVOVF9UWVBFO1xuICB2YXIgZG9jID0gaXNEb2N1bWVudEZyYWdtZW50ID8gY29udGFpbmVySW5mby5fbm9kZSA6IGNvbnRhaW5lckluZm8uX293bmVyRG9jdW1lbnQ7XG4gIGxpc3RlblRvKHJlZ2lzdHJhdGlvbk5hbWUsIGRvYyk7XG4gIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUocHV0TGlzdGVuZXIsIHtcbiAgICBpbnN0OiBpbnN0LFxuICAgIHJlZ2lzdHJhdGlvbk5hbWU6IHJlZ2lzdHJhdGlvbk5hbWUsXG4gICAgbGlzdGVuZXI6IGxpc3RlbmVyXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwdXRMaXN0ZW5lcigpIHtcbiAgdmFyIGxpc3RlbmVyVG9QdXQgPSB0aGlzO1xuICBFdmVudFBsdWdpbkh1Yi5wdXRMaXN0ZW5lcihsaXN0ZW5lclRvUHV0Lmluc3QsIGxpc3RlbmVyVG9QdXQucmVnaXN0cmF0aW9uTmFtZSwgbGlzdGVuZXJUb1B1dC5saXN0ZW5lcik7XG59XG5cbmZ1bmN0aW9uIGlucHV0UG9zdE1vdW50KCkge1xuICB2YXIgaW5zdCA9IHRoaXM7XG4gIFJlYWN0RE9NSW5wdXQucG9zdE1vdW50V3JhcHBlcihpbnN0KTtcbn1cblxuZnVuY3Rpb24gdGV4dGFyZWFQb3N0TW91bnQoKSB7XG4gIHZhciBpbnN0ID0gdGhpcztcbiAgUmVhY3RET01UZXh0YXJlYS5wb3N0TW91bnRXcmFwcGVyKGluc3QpO1xufVxuXG5mdW5jdGlvbiBvcHRpb25Qb3N0TW91bnQoKSB7XG4gIHZhciBpbnN0ID0gdGhpcztcbiAgUmVhY3RET01PcHRpb24ucG9zdE1vdW50V3JhcHBlcihpbnN0KTtcbn1cblxudmFyIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2ID0gZW1wdHlGdW5jdGlvbjtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2ID0gZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgICB2YXIgaGFzRXhpc3RpbmdDb250ZW50ID0gdGhpcy5fY29udGVudERlYnVnSUQgIT0gbnVsbDtcbiAgICB2YXIgZGVidWdJRCA9IHRoaXMuX2RlYnVnSUQ7XG4gICAgLy8gVGhpcyBJRCByZXByZXNlbnRzIHRoZSBpbmxpbmVkIGNoaWxkIHRoYXQgaGFzIG5vIGJhY2tpbmcgaW5zdGFuY2U6XG4gICAgdmFyIGNvbnRlbnREZWJ1Z0lEID0gLWRlYnVnSUQ7XG5cbiAgICBpZiAoY29udGVudCA9PSBudWxsKSB7XG4gICAgICBpZiAoaGFzRXhpc3RpbmdDb250ZW50KSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblVubW91bnRDb21wb25lbnQodGhpcy5fY29udGVudERlYnVnSUQpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY29udGVudERlYnVnSUQgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBTdHJpbmcoY29udGVudCksIHRoaXMsIHRoaXMuX2FuY2VzdG9ySW5mbyk7XG4gICAgdGhpcy5fY29udGVudERlYnVnSUQgPSBjb250ZW50RGVidWdJRDtcbiAgICBpZiAoaGFzRXhpc3RpbmdDb250ZW50KSB7XG4gICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWZvcmVVcGRhdGVDb21wb25lbnQoY29udGVudERlYnVnSUQsIGNvbnRlbnQpO1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uVXBkYXRlQ29tcG9uZW50KGNvbnRlbnREZWJ1Z0lEKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVmb3JlTW91bnRDb21wb25lbnQoY29udGVudERlYnVnSUQsIGNvbnRlbnQsIGRlYnVnSUQpO1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uTW91bnRDb21wb25lbnQoY29udGVudERlYnVnSUQpO1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uU2V0Q2hpbGRyZW4oZGVidWdJRCwgW2NvbnRlbnREZWJ1Z0lEXSk7XG4gICAgfVxuICB9O1xufVxuXG4vLyBUaGVyZSBhcmUgc28gbWFueSBtZWRpYSBldmVudHMsIGl0IG1ha2VzIHNlbnNlIHRvIGp1c3Rcbi8vIG1haW50YWluIGEgbGlzdCByYXRoZXIgdGhhbiBjcmVhdGUgYSBgdHJhcEJ1YmJsZWRFdmVudGAgZm9yIGVhY2hcbnZhciBtZWRpYUV2ZW50cyA9IHtcbiAgdG9wQWJvcnQ6ICdhYm9ydCcsXG4gIHRvcENhblBsYXk6ICdjYW5wbGF5JyxcbiAgdG9wQ2FuUGxheVRocm91Z2g6ICdjYW5wbGF5dGhyb3VnaCcsXG4gIHRvcER1cmF0aW9uQ2hhbmdlOiAnZHVyYXRpb25jaGFuZ2UnLFxuICB0b3BFbXB0aWVkOiAnZW1wdGllZCcsXG4gIHRvcEVuY3J5cHRlZDogJ2VuY3J5cHRlZCcsXG4gIHRvcEVuZGVkOiAnZW5kZWQnLFxuICB0b3BFcnJvcjogJ2Vycm9yJyxcbiAgdG9wTG9hZGVkRGF0YTogJ2xvYWRlZGRhdGEnLFxuICB0b3BMb2FkZWRNZXRhZGF0YTogJ2xvYWRlZG1ldGFkYXRhJyxcbiAgdG9wTG9hZFN0YXJ0OiAnbG9hZHN0YXJ0JyxcbiAgdG9wUGF1c2U6ICdwYXVzZScsXG4gIHRvcFBsYXk6ICdwbGF5JyxcbiAgdG9wUGxheWluZzogJ3BsYXlpbmcnLFxuICB0b3BQcm9ncmVzczogJ3Byb2dyZXNzJyxcbiAgdG9wUmF0ZUNoYW5nZTogJ3JhdGVjaGFuZ2UnLFxuICB0b3BTZWVrZWQ6ICdzZWVrZWQnLFxuICB0b3BTZWVraW5nOiAnc2Vla2luZycsXG4gIHRvcFN0YWxsZWQ6ICdzdGFsbGVkJyxcbiAgdG9wU3VzcGVuZDogJ3N1c3BlbmQnLFxuICB0b3BUaW1lVXBkYXRlOiAndGltZXVwZGF0ZScsXG4gIHRvcFZvbHVtZUNoYW5nZTogJ3ZvbHVtZWNoYW5nZScsXG4gIHRvcFdhaXRpbmc6ICd3YWl0aW5nJ1xufTtcblxuZnVuY3Rpb24gdHJhY2tJbnB1dFZhbHVlKCkge1xuICBpbnB1dFZhbHVlVHJhY2tpbmcudHJhY2sodGhpcyk7XG59XG5cbmZ1bmN0aW9uIHRyYXBCdWJibGVkRXZlbnRzTG9jYWwoKSB7XG4gIHZhciBpbnN0ID0gdGhpcztcbiAgLy8gSWYgYSBjb21wb25lbnQgcmVuZGVycyB0byBudWxsIG9yIGlmIGFub3RoZXIgY29tcG9uZW50IGZhdGFscyBhbmQgY2F1c2VzXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgdHJlZSB0byBiZSBjb3JydXB0ZWQsIGBub2RlYCBoZXJlIGNhbiBiZSBudWxsLlxuICAhaW5zdC5fcm9vdE5vZGVJRCA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdNdXN0IGJlIG1vdW50ZWQgdG8gdHJhcCBldmVudHMnKSA6IF9wcm9kSW52YXJpYW50KCc2MycpIDogdm9pZCAwO1xuICB2YXIgbm9kZSA9IGdldE5vZGUoaW5zdCk7XG4gICFub2RlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3RyYXBCdWJibGVkRXZlbnQoLi4uKTogUmVxdWlyZXMgbm9kZSB0byBiZSByZW5kZXJlZC4nKSA6IF9wcm9kSW52YXJpYW50KCc2NCcpIDogdm9pZCAwO1xuXG4gIHN3aXRjaCAoaW5zdC5fdGFnKSB7XG4gICAgY2FzZSAnaWZyYW1lJzpcbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgaW5zdC5fd3JhcHBlclN0YXRlLmxpc3RlbmVycyA9IFtSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wTG9hZCcsICdsb2FkJywgbm9kZSldO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndmlkZW8nOlxuICAgIGNhc2UgJ2F1ZGlvJzpcbiAgICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnMgPSBbXTtcbiAgICAgIC8vIENyZWF0ZSBsaXN0ZW5lciBmb3IgZWFjaCBtZWRpYSBldmVudFxuICAgICAgZm9yICh2YXIgZXZlbnQgaW4gbWVkaWFFdmVudHMpIHtcbiAgICAgICAgaWYgKG1lZGlhRXZlbnRzLmhhc093blByb3BlcnR5KGV2ZW50KSkge1xuICAgICAgICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnMucHVzaChSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudChldmVudCwgbWVkaWFFdmVudHNbZXZlbnRdLCBub2RlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NvdXJjZSc6XG4gICAgICBpbnN0Ll93cmFwcGVyU3RhdGUubGlzdGVuZXJzID0gW1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci50cmFwQnViYmxlZEV2ZW50KCd0b3BFcnJvcicsICdlcnJvcicsIG5vZGUpXTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ltZyc6XG4gICAgICBpbnN0Ll93cmFwcGVyU3RhdGUubGlzdGVuZXJzID0gW1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci50cmFwQnViYmxlZEV2ZW50KCd0b3BFcnJvcicsICdlcnJvcicsIG5vZGUpLCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wTG9hZCcsICdsb2FkJywgbm9kZSldO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZm9ybSc6XG4gICAgICBpbnN0Ll93cmFwcGVyU3RhdGUubGlzdGVuZXJzID0gW1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci50cmFwQnViYmxlZEV2ZW50KCd0b3BSZXNldCcsICdyZXNldCcsIG5vZGUpLCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wU3VibWl0JywgJ3N1Ym1pdCcsIG5vZGUpXTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnMgPSBbUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcEludmFsaWQnLCAnaW52YWxpZCcsIG5vZGUpXTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvc3RVcGRhdGVTZWxlY3RXcmFwcGVyKCkge1xuICBSZWFjdERPTVNlbGVjdC5wb3N0VXBkYXRlV3JhcHBlcih0aGlzKTtcbn1cblxuLy8gRm9yIEhUTUwsIGNlcnRhaW4gdGFncyBzaG91bGQgb21pdCB0aGVpciBjbG9zZSB0YWcuIFdlIGtlZXAgYSB3aGl0ZWxpc3QgZm9yXG4vLyB0aG9zZSBzcGVjaWFsLWNhc2UgdGFncy5cblxudmFyIG9taXR0ZWRDbG9zZVRhZ3MgPSB7XG4gIGFyZWE6IHRydWUsXG4gIGJhc2U6IHRydWUsXG4gIGJyOiB0cnVlLFxuICBjb2w6IHRydWUsXG4gIGVtYmVkOiB0cnVlLFxuICBocjogdHJ1ZSxcbiAgaW1nOiB0cnVlLFxuICBpbnB1dDogdHJ1ZSxcbiAga2V5Z2VuOiB0cnVlLFxuICBsaW5rOiB0cnVlLFxuICBtZXRhOiB0cnVlLFxuICBwYXJhbTogdHJ1ZSxcbiAgc291cmNlOiB0cnVlLFxuICB0cmFjazogdHJ1ZSxcbiAgd2JyOiB0cnVlXG4gIC8vIE5PVEU6IG1lbnVpdGVtJ3MgY2xvc2UgdGFnIHNob3VsZCBiZSBvbWl0dGVkLCBidXQgdGhhdCBjYXVzZXMgcHJvYmxlbXMuXG59O1xuXG52YXIgbmV3bGluZUVhdGluZ1RhZ3MgPSB7XG4gIGxpc3Rpbmc6IHRydWUsXG4gIHByZTogdHJ1ZSxcbiAgdGV4dGFyZWE6IHRydWVcbn07XG5cbi8vIEZvciBIVE1MLCBjZXJ0YWluIHRhZ3MgY2Fubm90IGhhdmUgY2hpbGRyZW4uIFRoaXMgaGFzIHRoZSBzYW1lIHB1cnBvc2UgYXNcbi8vIGBvbWl0dGVkQ2xvc2VUYWdzYCBleGNlcHQgdGhhdCBgbWVudWl0ZW1gIHNob3VsZCBzdGlsbCBoYXZlIGl0cyBjbG9zaW5nIHRhZy5cblxudmFyIHZvaWRFbGVtZW50VGFncyA9IF9hc3NpZ24oe1xuICBtZW51aXRlbTogdHJ1ZVxufSwgb21pdHRlZENsb3NlVGFncyk7XG5cbi8vIFdlIGFjY2VwdCBhbnkgdGFnIHRvIGJlIHJlbmRlcmVkIGJ1dCBzaW5jZSB0aGlzIGdldHMgaW5qZWN0ZWQgaW50byBhcmJpdHJhcnlcbi8vIEhUTUwsIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgaXQncyBhIHNhZmUgdGFnLlxuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC8jTlQtTmFtZVxuXG52YXIgVkFMSURfVEFHX1JFR0VYID0gL15bYS16QS1aXVthLXpBLVo6X1xcLlxcLVxcZF0qJC87IC8vIFNpbXBsaWZpZWQgc3Vic2V0XG52YXIgdmFsaWRhdGVkVGFnQ2FjaGUgPSB7fTtcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiB2YWxpZGF0ZURhbmdlcm91c1RhZyh0YWcpIHtcbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbGlkYXRlZFRhZ0NhY2hlLCB0YWcpKSB7XG4gICAgIVZBTElEX1RBR19SRUdFWC50ZXN0KHRhZykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnSW52YWxpZCB0YWc6ICVzJywgdGFnKSA6IF9wcm9kSW52YXJpYW50KCc2NScsIHRhZykgOiB2b2lkIDA7XG4gICAgdmFsaWRhdGVkVGFnQ2FjaGVbdGFnXSA9IHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDdXN0b21Db21wb25lbnQodGFnTmFtZSwgcHJvcHMpIHtcbiAgcmV0dXJuIHRhZ05hbWUuaW5kZXhPZignLScpID49IDAgfHwgcHJvcHMuaXMgIT0gbnVsbDtcbn1cblxudmFyIGdsb2JhbElkQ291bnRlciA9IDE7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBSZWFjdCBjbGFzcyB0aGF0IGlzIGlkZW1wb3RlbnQgYW5kIGNhcGFibGUgb2YgY29udGFpbmluZyBvdGhlclxuICogUmVhY3QgY29tcG9uZW50cy4gSXQgYWNjZXB0cyBldmVudCBsaXN0ZW5lcnMgYW5kIERPTSBwcm9wZXJ0aWVzIHRoYXQgYXJlXG4gKiB2YWxpZCBhY2NvcmRpbmcgdG8gYERPTVByb3BlcnR5YC5cbiAqXG4gKiAgLSBFdmVudCBsaXN0ZW5lcnM6IGBvbkNsaWNrYCwgYG9uTW91c2VEb3duYCwgZXRjLlxuICogIC0gRE9NIHByb3BlcnRpZXM6IGBjbGFzc05hbWVgLCBgbmFtZWAsIGB0aXRsZWAsIGV0Yy5cbiAqXG4gKiBUaGUgYHN0eWxlYCBwcm9wZXJ0eSBmdW5jdGlvbnMgZGlmZmVyZW50bHkgZnJvbSB0aGUgRE9NIEFQSS4gSXQgYWNjZXB0cyBhblxuICogb2JqZWN0IG1hcHBpbmcgb2Ygc3R5bGUgcHJvcGVydGllcyB0byB2YWx1ZXMuXG4gKlxuICogQGNvbnN0cnVjdG9yIFJlYWN0RE9NQ29tcG9uZW50XG4gKiBAZXh0ZW5kcyBSZWFjdE11bHRpQ2hpbGRcbiAqL1xuZnVuY3Rpb24gUmVhY3RET01Db21wb25lbnQoZWxlbWVudCkge1xuICB2YXIgdGFnID0gZWxlbWVudC50eXBlO1xuICB2YWxpZGF0ZURhbmdlcm91c1RhZyh0YWcpO1xuICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IGVsZW1lbnQ7XG4gIHRoaXMuX3RhZyA9IHRhZy50b0xvd2VyQ2FzZSgpO1xuICB0aGlzLl9uYW1lc3BhY2VVUkkgPSBudWxsO1xuICB0aGlzLl9yZW5kZXJlZENoaWxkcmVuID0gbnVsbDtcbiAgdGhpcy5fcHJldmlvdXNTdHlsZSA9IG51bGw7XG4gIHRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5ID0gbnVsbDtcbiAgdGhpcy5faG9zdE5vZGUgPSBudWxsO1xuICB0aGlzLl9ob3N0UGFyZW50ID0gbnVsbDtcbiAgdGhpcy5fcm9vdE5vZGVJRCA9IDA7XG4gIHRoaXMuX2RvbUlEID0gMDtcbiAgdGhpcy5faG9zdENvbnRhaW5lckluZm8gPSBudWxsO1xuICB0aGlzLl93cmFwcGVyU3RhdGUgPSBudWxsO1xuICB0aGlzLl90b3BMZXZlbFdyYXBwZXIgPSBudWxsO1xuICB0aGlzLl9mbGFncyA9IDA7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdGhpcy5fYW5jZXN0b3JJbmZvID0gbnVsbDtcbiAgICBzZXRBbmRWYWxpZGF0ZUNvbnRlbnRDaGlsZERldi5jYWxsKHRoaXMsIG51bGwpO1xuICB9XG59XG5cblJlYWN0RE9NQ29tcG9uZW50LmRpc3BsYXlOYW1lID0gJ1JlYWN0RE9NQ29tcG9uZW50JztcblxuUmVhY3RET01Db21wb25lbnQuTWl4aW4gPSB7XG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgcm9vdCB0YWcgbWFya3VwIHRoZW4gcmVjdXJzZXMuIFRoaXMgbWV0aG9kIGhhcyBzaWRlIGVmZmVjdHMgYW5kXG4gICAqIGlzIG5vdCBpZGVtcG90ZW50LlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7P1JlYWN0RE9NQ29tcG9uZW50fSB0aGUgcGFyZW50IGNvbXBvbmVudCBpbnN0YW5jZVxuICAgKiBAcGFyYW0gez9vYmplY3R9IGluZm8gYWJvdXQgdGhlIGhvc3QgY29udGFpbmVyXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0XG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbXB1dGVkIG1hcmt1cC5cbiAgICovXG4gIG1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAodHJhbnNhY3Rpb24sIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCBjb250ZXh0KSB7XG4gICAgdGhpcy5fcm9vdE5vZGVJRCA9IGdsb2JhbElkQ291bnRlcisrO1xuICAgIHRoaXMuX2RvbUlEID0gaG9zdENvbnRhaW5lckluZm8uX2lkQ291bnRlcisrO1xuICAgIHRoaXMuX2hvc3RQYXJlbnQgPSBob3N0UGFyZW50O1xuICAgIHRoaXMuX2hvc3RDb250YWluZXJJbmZvID0gaG9zdENvbnRhaW5lckluZm87XG5cbiAgICB2YXIgcHJvcHMgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcztcblxuICAgIHN3aXRjaCAodGhpcy5fdGFnKSB7XG4gICAgICBjYXNlICdhdWRpbyc6XG4gICAgICBjYXNlICdmb3JtJzpcbiAgICAgIGNhc2UgJ2lmcmFtZSc6XG4gICAgICBjYXNlICdpbWcnOlxuICAgICAgY2FzZSAnbGluayc6XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgY2FzZSAnc291cmNlJzpcbiAgICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICAgICAgdGhpcy5fd3JhcHBlclN0YXRlID0ge1xuICAgICAgICAgIGxpc3RlbmVyczogbnVsbFxuICAgICAgICB9O1xuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHRyYXBCdWJibGVkRXZlbnRzTG9jYWwsIHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgICAgUmVhY3RET01JbnB1dC5tb3VudFdyYXBwZXIodGhpcywgcHJvcHMsIGhvc3RQYXJlbnQpO1xuICAgICAgICBwcm9wcyA9IFJlYWN0RE9NSW5wdXQuZ2V0SG9zdFByb3BzKHRoaXMsIHByb3BzKTtcbiAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZSh0cmFja0lucHV0VmFsdWUsIHRoaXMpO1xuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHRyYXBCdWJibGVkRXZlbnRzTG9jYWwsIHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAgIFJlYWN0RE9NT3B0aW9uLm1vdW50V3JhcHBlcih0aGlzLCBwcm9wcywgaG9zdFBhcmVudCk7XG4gICAgICAgIHByb3BzID0gUmVhY3RET01PcHRpb24uZ2V0SG9zdFByb3BzKHRoaXMsIHByb3BzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICBSZWFjdERPTVNlbGVjdC5tb3VudFdyYXBwZXIodGhpcywgcHJvcHMsIGhvc3RQYXJlbnQpO1xuICAgICAgICBwcm9wcyA9IFJlYWN0RE9NU2VsZWN0LmdldEhvc3RQcm9wcyh0aGlzLCBwcm9wcyk7XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUodHJhcEJ1YmJsZWRFdmVudHNMb2NhbCwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgICBSZWFjdERPTVRleHRhcmVhLm1vdW50V3JhcHBlcih0aGlzLCBwcm9wcywgaG9zdFBhcmVudCk7XG4gICAgICAgIHByb3BzID0gUmVhY3RET01UZXh0YXJlYS5nZXRIb3N0UHJvcHModGhpcywgcHJvcHMpO1xuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHRyYWNrSW5wdXRWYWx1ZSwgdGhpcyk7XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUodHJhcEJ1YmJsZWRFdmVudHNMb2NhbCwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGFzc2VydFZhbGlkUHJvcHModGhpcywgcHJvcHMpO1xuXG4gICAgLy8gV2UgY3JlYXRlIHRhZ3MgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGVpciBwYXJlbnQgY29udGFpbmVyLCBleGNlcHQgSFRNTFxuICAgIC8vIHRhZ3MgZ2V0IG5vIG5hbWVzcGFjZS5cbiAgICB2YXIgbmFtZXNwYWNlVVJJO1xuICAgIHZhciBwYXJlbnRUYWc7XG4gICAgaWYgKGhvc3RQYXJlbnQgIT0gbnVsbCkge1xuICAgICAgbmFtZXNwYWNlVVJJID0gaG9zdFBhcmVudC5fbmFtZXNwYWNlVVJJO1xuICAgICAgcGFyZW50VGFnID0gaG9zdFBhcmVudC5fdGFnO1xuICAgIH0gZWxzZSBpZiAoaG9zdENvbnRhaW5lckluZm8uX3RhZykge1xuICAgICAgbmFtZXNwYWNlVVJJID0gaG9zdENvbnRhaW5lckluZm8uX25hbWVzcGFjZVVSSTtcbiAgICAgIHBhcmVudFRhZyA9IGhvc3RDb250YWluZXJJbmZvLl90YWc7XG4gICAgfVxuICAgIGlmIChuYW1lc3BhY2VVUkkgPT0gbnVsbCB8fCBuYW1lc3BhY2VVUkkgPT09IERPTU5hbWVzcGFjZXMuc3ZnICYmIHBhcmVudFRhZyA9PT0gJ2ZvcmVpZ25vYmplY3QnKSB7XG4gICAgICBuYW1lc3BhY2VVUkkgPSBET01OYW1lc3BhY2VzLmh0bWw7XG4gICAgfVxuICAgIGlmIChuYW1lc3BhY2VVUkkgPT09IERPTU5hbWVzcGFjZXMuaHRtbCkge1xuICAgICAgaWYgKHRoaXMuX3RhZyA9PT0gJ3N2ZycpIHtcbiAgICAgICAgbmFtZXNwYWNlVVJJID0gRE9NTmFtZXNwYWNlcy5zdmc7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX3RhZyA9PT0gJ21hdGgnKSB7XG4gICAgICAgIG5hbWVzcGFjZVVSSSA9IERPTU5hbWVzcGFjZXMubWF0aG1sO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHBhcmVudEluZm87XG4gICAgICBpZiAoaG9zdFBhcmVudCAhPSBudWxsKSB7XG4gICAgICAgIHBhcmVudEluZm8gPSBob3N0UGFyZW50Ll9hbmNlc3RvckluZm87XG4gICAgICB9IGVsc2UgaWYgKGhvc3RDb250YWluZXJJbmZvLl90YWcpIHtcbiAgICAgICAgcGFyZW50SW5mbyA9IGhvc3RDb250YWluZXJJbmZvLl9hbmNlc3RvckluZm87XG4gICAgICB9XG4gICAgICBpZiAocGFyZW50SW5mbykge1xuICAgICAgICAvLyBwYXJlbnRJbmZvIHNob3VsZCBhbHdheXMgYmUgcHJlc2VudCBleGNlcHQgZm9yIHRoZSB0b3AtbGV2ZWxcbiAgICAgICAgLy8gY29tcG9uZW50IHdoZW4gc2VydmVyIHJlbmRlcmluZ1xuICAgICAgICB2YWxpZGF0ZURPTU5lc3RpbmcodGhpcy5fdGFnLCBudWxsLCB0aGlzLCBwYXJlbnRJbmZvKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2FuY2VzdG9ySW5mbyA9IHZhbGlkYXRlRE9NTmVzdGluZy51cGRhdGVkQW5jZXN0b3JJbmZvKHBhcmVudEluZm8sIHRoaXMuX3RhZywgdGhpcyk7XG4gICAgfVxuXG4gICAgdmFyIG1vdW50SW1hZ2U7XG4gICAgaWYgKHRyYW5zYWN0aW9uLnVzZUNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lckRvY3VtZW50ID0gaG9zdENvbnRhaW5lckluZm8uX293bmVyRG9jdW1lbnQ7XG4gICAgICB2YXIgZWw7XG4gICAgICBpZiAobmFtZXNwYWNlVVJJID09PSBET01OYW1lc3BhY2VzLmh0bWwpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RhZyA9PT0gJ3NjcmlwdCcpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgdGhlIHNjcmlwdCB2aWEgLmlubmVySFRNTCBzbyBpdHMgXCJwYXJzZXItaW5zZXJ0ZWRcIiBmbGFnIGlzXG4gICAgICAgICAgLy8gc2V0IHRvIHRydWUgYW5kIGl0IGRvZXMgbm90IGV4ZWN1dGVcbiAgICAgICAgICB2YXIgZGl2ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICB2YXIgdHlwZSA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7XG4gICAgICAgICAgZGl2LmlubmVySFRNTCA9ICc8JyArIHR5cGUgKyAnPjwvJyArIHR5cGUgKyAnPic7XG4gICAgICAgICAgZWwgPSBkaXYucmVtb3ZlQ2hpbGQoZGl2LmZpcnN0Q2hpbGQpO1xuICAgICAgICB9IGVsc2UgaWYgKHByb3BzLmlzKSB7XG4gICAgICAgICAgZWwgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSwgcHJvcHMuaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNlcGFyYXRlIGVsc2UgYnJhbmNoIGluc3RlYWQgb2YgdXNpbmcgYHByb3BzLmlzIHx8IHVuZGVmaW5lZGAgYWJvdmUgYmVjdWFzZSBvZiBhIEZpcmVmb3ggYnVnLlxuICAgICAgICAgIC8vIFNlZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzY4OTZcbiAgICAgICAgICAvLyBhbmQgZGlzY3Vzc2lvbiBpbiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjc2MjQwXG4gICAgICAgICAgZWwgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlKTtcbiAgICAgIH1cbiAgICAgIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5wcmVjYWNoZU5vZGUodGhpcywgZWwpO1xuICAgICAgdGhpcy5fZmxhZ3MgfD0gRmxhZ3MuaGFzQ2FjaGVkQ2hpbGROb2RlcztcbiAgICAgIGlmICghdGhpcy5faG9zdFBhcmVudCkge1xuICAgICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuc2V0QXR0cmlidXRlRm9yUm9vdChlbCk7XG4gICAgICB9XG4gICAgICB0aGlzLl91cGRhdGVET01Qcm9wZXJ0aWVzKG51bGwsIHByb3BzLCB0cmFuc2FjdGlvbik7XG4gICAgICB2YXIgbGF6eVRyZWUgPSBET01MYXp5VHJlZShlbCk7XG4gICAgICB0aGlzLl9jcmVhdGVJbml0aWFsQ2hpbGRyZW4odHJhbnNhY3Rpb24sIHByb3BzLCBjb250ZXh0LCBsYXp5VHJlZSk7XG4gICAgICBtb3VudEltYWdlID0gbGF6eVRyZWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0YWdPcGVuID0gdGhpcy5fY3JlYXRlT3BlblRhZ01hcmt1cEFuZFB1dExpc3RlbmVycyh0cmFuc2FjdGlvbiwgcHJvcHMpO1xuICAgICAgdmFyIHRhZ0NvbnRlbnQgPSB0aGlzLl9jcmVhdGVDb250ZW50TWFya3VwKHRyYW5zYWN0aW9uLCBwcm9wcywgY29udGV4dCk7XG4gICAgICBpZiAoIXRhZ0NvbnRlbnQgJiYgb21pdHRlZENsb3NlVGFnc1t0aGlzLl90YWddKSB7XG4gICAgICAgIG1vdW50SW1hZ2UgPSB0YWdPcGVuICsgJy8+JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1vdW50SW1hZ2UgPSB0YWdPcGVuICsgJz4nICsgdGFnQ29udGVudCArICc8LycgKyB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlICsgJz4nO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy5fdGFnKSB7XG4gICAgICBjYXNlICdpbnB1dCc6XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoaW5wdXRQb3N0TW91bnQsIHRoaXMpO1xuICAgICAgICBpZiAocHJvcHMuYXV0b0ZvY3VzKSB7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShBdXRvRm9jdXNVdGlscy5mb2N1c0RPTUNvbXBvbmVudCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUodGV4dGFyZWFQb3N0TW91bnQsIHRoaXMpO1xuICAgICAgICBpZiAocHJvcHMuYXV0b0ZvY3VzKSB7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShBdXRvRm9jdXNVdGlscy5mb2N1c0RPTUNvbXBvbmVudCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICBpZiAocHJvcHMuYXV0b0ZvY3VzKSB7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShBdXRvRm9jdXNVdGlscy5mb2N1c0RPTUNvbXBvbmVudCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICBpZiAocHJvcHMuYXV0b0ZvY3VzKSB7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShBdXRvRm9jdXNVdGlscy5mb2N1c0RPTUNvbXBvbmVudCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdvcHRpb24nOlxuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKG9wdGlvblBvc3RNb3VudCwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBtb3VudEltYWdlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG1hcmt1cCBmb3IgdGhlIG9wZW4gdGFnIGFuZCBhbGwgYXR0cmlidXRlcy5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgaGFzIHNpZGUgZWZmZWN0cyBiZWNhdXNlIGV2ZW50cyBnZXQgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICogSXRlcmF0aW5nIG92ZXIgb2JqZWN0IHByb3BlcnRpZXMgaXMgZmFzdGVyIHRoYW4gaXRlcmF0aW5nIG92ZXIgYXJyYXlzLlxuICAgKiBAc2VlIGh0dHA6Ly9qc3BlcmYuY29tL29iai12cy1hcnItaXRlcmF0aW9uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbnxSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge29iamVjdH0gcHJvcHNcbiAgICogQHJldHVybiB7c3RyaW5nfSBNYXJrdXAgb2Ygb3BlbmluZyB0YWcuXG4gICAqL1xuICBfY3JlYXRlT3BlblRhZ01hcmt1cEFuZFB1dExpc3RlbmVyczogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBwcm9wcykge1xuICAgIHZhciByZXQgPSAnPCcgKyB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO1xuXG4gICAgZm9yICh2YXIgcHJvcEtleSBpbiBwcm9wcykge1xuICAgICAgaWYgKCFwcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wS2V5XTtcbiAgICAgIGlmIChwcm9wVmFsdWUgPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lTW9kdWxlcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgICBpZiAocHJvcFZhbHVlKSB7XG4gICAgICAgICAgZW5xdWV1ZVB1dExpc3RlbmVyKHRoaXMsIHByb3BLZXksIHByb3BWYWx1ZSwgdHJhbnNhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgICAgICBpZiAocHJvcFZhbHVlKSB7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAvLyBTZWUgYF91cGRhdGVET01Qcm9wZXJ0aWVzYC4gc3R5bGUgYmxvY2tcbiAgICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNTdHlsZSA9IHByb3BWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb3BWYWx1ZSA9IHRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5ID0gX2Fzc2lnbih7fSwgcHJvcHMuc3R5bGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcm9wVmFsdWUgPSBDU1NQcm9wZXJ0eU9wZXJhdGlvbnMuY3JlYXRlTWFya3VwRm9yU3R5bGVzKHByb3BWYWx1ZSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1hcmt1cCA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLl90YWcgIT0gbnVsbCAmJiBpc0N1c3RvbUNvbXBvbmVudCh0aGlzLl90YWcsIHByb3BzKSkge1xuICAgICAgICAgIGlmICghUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgICAgICAgIG1hcmt1cCA9IERPTVByb3BlcnR5T3BlcmF0aW9ucy5jcmVhdGVNYXJrdXBGb3JDdXN0b21BdHRyaWJ1dGUocHJvcEtleSwgcHJvcFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWFya3VwID0gRE9NUHJvcGVydHlPcGVyYXRpb25zLmNyZWF0ZU1hcmt1cEZvclByb3BlcnR5KHByb3BLZXksIHByb3BWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hcmt1cCkge1xuICAgICAgICAgIHJldCArPSAnICcgKyBtYXJrdXA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGb3Igc3RhdGljIHBhZ2VzLCBubyBuZWVkIHRvIHB1dCBSZWFjdCBJRCBhbmQgY2hlY2tzdW0uIFNhdmVzIGxvdHMgb2ZcbiAgICAvLyBieXRlcy5cbiAgICBpZiAodHJhbnNhY3Rpb24ucmVuZGVyVG9TdGF0aWNNYXJrdXApIHtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9ob3N0UGFyZW50KSB7XG4gICAgICByZXQgKz0gJyAnICsgRE9NUHJvcGVydHlPcGVyYXRpb25zLmNyZWF0ZU1hcmt1cEZvclJvb3QoKTtcbiAgICB9XG4gICAgcmV0ICs9ICcgJyArIERPTVByb3BlcnR5T3BlcmF0aW9ucy5jcmVhdGVNYXJrdXBGb3JJRCh0aGlzLl9kb21JRCk7XG4gICAgcmV0dXJuIHJldDtcbiAgfSxcblxuICAvKipcbiAgICogQ3JlYXRlcyBtYXJrdXAgZm9yIHRoZSBjb250ZW50IGJldHdlZW4gdGhlIHRhZ3MuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbnxSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge29iamVjdH0gcHJvcHNcbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHRcbiAgICogQHJldHVybiB7c3RyaW5nfSBDb250ZW50IG1hcmt1cC5cbiAgICovXG4gIF9jcmVhdGVDb250ZW50TWFya3VwOiBmdW5jdGlvbiAodHJhbnNhY3Rpb24sIHByb3BzLCBjb250ZXh0KSB7XG4gICAgdmFyIHJldCA9ICcnO1xuXG4gICAgLy8gSW50ZW50aW9uYWwgdXNlIG9mICE9IHRvIGF2b2lkIGNhdGNoaW5nIHplcm8vZmFsc2UuXG4gICAgdmFyIGlubmVySFRNTCA9IHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MO1xuICAgIGlmIChpbm5lckhUTUwgIT0gbnVsbCkge1xuICAgICAgaWYgKGlubmVySFRNTC5fX2h0bWwgIT0gbnVsbCkge1xuICAgICAgICByZXQgPSBpbm5lckhUTUwuX19odG1sO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgY29udGVudFRvVXNlID0gQ09OVEVOVF9UWVBFU1t0eXBlb2YgcHJvcHMuY2hpbGRyZW5dID8gcHJvcHMuY2hpbGRyZW4gOiBudWxsO1xuICAgICAgdmFyIGNoaWxkcmVuVG9Vc2UgPSBjb250ZW50VG9Vc2UgIT0gbnVsbCA/IG51bGwgOiBwcm9wcy5jaGlsZHJlbjtcbiAgICAgIGlmIChjb250ZW50VG9Vc2UgIT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSB0aGF0IHRleHQgaXMgYWxsb3dlZCBhcyBhIGNoaWxkIG9mIHRoaXMgbm9kZVxuICAgICAgICByZXQgPSBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIoY29udGVudFRvVXNlKTtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBzZXRBbmRWYWxpZGF0ZUNvbnRlbnRDaGlsZERldi5jYWxsKHRoaXMsIGNvbnRlbnRUb1VzZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2hpbGRyZW5Ub1VzZSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBtb3VudEltYWdlcyA9IHRoaXMubW91bnRDaGlsZHJlbihjaGlsZHJlblRvVXNlLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7XG4gICAgICAgIHJldCA9IG1vdW50SW1hZ2VzLmpvaW4oJycpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobmV3bGluZUVhdGluZ1RhZ3NbdGhpcy5fdGFnXSAmJiByZXQuY2hhckF0KDApID09PSAnXFxuJykge1xuICAgICAgLy8gdGV4dC9odG1sIGlnbm9yZXMgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGVzZSB0YWdzIGlmIGl0J3MgYSBuZXdsaW5lXG4gICAgICAvLyBQcmVmZXIgdG8gYnJlYWsgYXBwbGljYXRpb24veG1sIG92ZXIgdGV4dC9odG1sIChmb3Igbm93KSBieSBhZGRpbmdcbiAgICAgIC8vIGEgbmV3bGluZSBzcGVjaWZpY2FsbHkgdG8gZ2V0IGVhdGVuIGJ5IHRoZSBwYXJzZXIuIChBbHRlcm5hdGVseSBmb3JcbiAgICAgIC8vIHRleHRhcmVhcywgcmVwbGFjaW5nIFwiXlxcblwiIHdpdGggXCJcXHJcXG5cIiBkb2Vzbid0IGdldCBlYXRlbiwgYW5kIHRoZSBmaXJzdFxuICAgICAgLy8gXFxyIGlzIG5vcm1hbGl6ZWQgb3V0IGJ5IEhUTUxUZXh0QXJlYUVsZW1lbnQjdmFsdWUuKVxuICAgICAgLy8gU2VlOiA8aHR0cDovL3d3dy53My5vcmcvVFIvaHRtbC1wb2x5Z2xvdC8jbmV3bGluZXMtaW4tdGV4dGFyZWEtYW5kLXByZT5cbiAgICAgIC8vIFNlZTogPGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L3N5bnRheC5odG1sI2VsZW1lbnQtcmVzdHJpY3Rpb25zPlxuICAgICAgLy8gU2VlOiA8aHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUvc3ludGF4Lmh0bWwjbmV3bGluZXM+XG4gICAgICAvLyBTZWU6IFBhcnNpbmcgb2YgXCJ0ZXh0YXJlYVwiIFwibGlzdGluZ1wiIGFuZCBcInByZVwiIGVsZW1lbnRzXG4gICAgICAvLyAgZnJvbSA8aHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluYm9keT5cbiAgICAgIHJldHVybiAnXFxuJyArIHJldDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gIH0sXG5cbiAgX2NyZWF0ZUluaXRpYWxDaGlsZHJlbjogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBwcm9wcywgY29udGV4dCwgbGF6eVRyZWUpIHtcbiAgICAvLyBJbnRlbnRpb25hbCB1c2Ugb2YgIT0gdG8gYXZvaWQgY2F0Y2hpbmcgemVyby9mYWxzZS5cbiAgICB2YXIgaW5uZXJIVE1MID0gcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw7XG4gICAgaWYgKGlubmVySFRNTCAhPSBudWxsKSB7XG4gICAgICBpZiAoaW5uZXJIVE1MLl9faHRtbCAhPSBudWxsKSB7XG4gICAgICAgIERPTUxhenlUcmVlLnF1ZXVlSFRNTChsYXp5VHJlZSwgaW5uZXJIVE1MLl9faHRtbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjb250ZW50VG9Vc2UgPSBDT05URU5UX1RZUEVTW3R5cGVvZiBwcm9wcy5jaGlsZHJlbl0gPyBwcm9wcy5jaGlsZHJlbiA6IG51bGw7XG4gICAgICB2YXIgY2hpbGRyZW5Ub1VzZSA9IGNvbnRlbnRUb1VzZSAhPSBudWxsID8gbnVsbCA6IHByb3BzLmNoaWxkcmVuO1xuICAgICAgLy8gVE9ETzogVmFsaWRhdGUgdGhhdCB0ZXh0IGlzIGFsbG93ZWQgYXMgYSBjaGlsZCBvZiB0aGlzIG5vZGVcbiAgICAgIGlmIChjb250ZW50VG9Vc2UgIT0gbnVsbCkge1xuICAgICAgICAvLyBBdm9pZCBzZXR0aW5nIHRleHRDb250ZW50IHdoZW4gdGhlIHRleHQgaXMgZW1wdHkuIEluIElFMTEgc2V0dGluZ1xuICAgICAgICAvLyB0ZXh0Q29udGVudCBvbiBhIHRleHQgYXJlYSB3aWxsIGNhdXNlIHRoZSBwbGFjZWhvbGRlciB0byBub3RcbiAgICAgICAgLy8gc2hvdyB3aXRoaW4gdGhlIHRleHRhcmVhIHVudGlsIGl0IGhhcyBiZWVuIGZvY3VzZWQgYW5kIGJsdXJyZWQgYWdhaW4uXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNjczMSNpc3N1ZWNvbW1lbnQtMjU0ODc0NTUzXG4gICAgICAgIGlmIChjb250ZW50VG9Vc2UgIT09ICcnKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2LmNhbGwodGhpcywgY29udGVudFRvVXNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgRE9NTGF6eVRyZWUucXVldWVUZXh0KGxhenlUcmVlLCBjb250ZW50VG9Vc2UpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNoaWxkcmVuVG9Vc2UgIT0gbnVsbCkge1xuICAgICAgICB2YXIgbW91bnRJbWFnZXMgPSB0aGlzLm1vdW50Q2hpbGRyZW4oY2hpbGRyZW5Ub1VzZSwgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vdW50SW1hZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgRE9NTGF6eVRyZWUucXVldWVDaGlsZChsYXp5VHJlZSwgbW91bnRJbWFnZXNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBSZWNlaXZlcyBhIG5leHQgZWxlbWVudCBhbmQgdXBkYXRlcyB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IG5leHRFbGVtZW50XG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbnxSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dFxuICAgKi9cbiAgcmVjZWl2ZUNvbXBvbmVudDogZnVuY3Rpb24gKG5leHRFbGVtZW50LCB0cmFuc2FjdGlvbiwgY29udGV4dCkge1xuICAgIHZhciBwcmV2RWxlbWVudCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50O1xuICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbmV4dEVsZW1lbnQ7XG4gICAgdGhpcy51cGRhdGVDb21wb25lbnQodHJhbnNhY3Rpb24sIHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCwgY29udGV4dCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgYSBET00gY29tcG9uZW50IGFmdGVyIGl0IGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGFuZFxuICAgKiBhdHRhY2hlZCB0byB0aGUgRE9NLiBSZWNvbmNpbGVzIHRoZSByb290IERPTSBub2RlLCB0aGVuIHJlY3Vyc2VzLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBwcmV2RWxlbWVudFxuICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4dEVsZW1lbnRcbiAgICogQGludGVybmFsXG4gICAqIEBvdmVycmlkYWJsZVxuICAgKi9cbiAgdXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAodHJhbnNhY3Rpb24sIHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCwgY29udGV4dCkge1xuICAgIHZhciBsYXN0UHJvcHMgPSBwcmV2RWxlbWVudC5wcm9wcztcbiAgICB2YXIgbmV4dFByb3BzID0gdGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7XG5cbiAgICBzd2l0Y2ggKHRoaXMuX3RhZykge1xuICAgICAgY2FzZSAnaW5wdXQnOlxuICAgICAgICBsYXN0UHJvcHMgPSBSZWFjdERPTUlucHV0LmdldEhvc3RQcm9wcyh0aGlzLCBsYXN0UHJvcHMpO1xuICAgICAgICBuZXh0UHJvcHMgPSBSZWFjdERPTUlucHV0LmdldEhvc3RQcm9wcyh0aGlzLCBuZXh0UHJvcHMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAgIGxhc3RQcm9wcyA9IFJlYWN0RE9NT3B0aW9uLmdldEhvc3RQcm9wcyh0aGlzLCBsYXN0UHJvcHMpO1xuICAgICAgICBuZXh0UHJvcHMgPSBSZWFjdERPTU9wdGlvbi5nZXRIb3N0UHJvcHModGhpcywgbmV4dFByb3BzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICBsYXN0UHJvcHMgPSBSZWFjdERPTVNlbGVjdC5nZXRIb3N0UHJvcHModGhpcywgbGFzdFByb3BzKTtcbiAgICAgICAgbmV4dFByb3BzID0gUmVhY3RET01TZWxlY3QuZ2V0SG9zdFByb3BzKHRoaXMsIG5leHRQcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgICBsYXN0UHJvcHMgPSBSZWFjdERPTVRleHRhcmVhLmdldEhvc3RQcm9wcyh0aGlzLCBsYXN0UHJvcHMpO1xuICAgICAgICBuZXh0UHJvcHMgPSBSZWFjdERPTVRleHRhcmVhLmdldEhvc3RQcm9wcyh0aGlzLCBuZXh0UHJvcHMpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBhc3NlcnRWYWxpZFByb3BzKHRoaXMsIG5leHRQcm9wcyk7XG4gICAgdGhpcy5fdXBkYXRlRE9NUHJvcGVydGllcyhsYXN0UHJvcHMsIG5leHRQcm9wcywgdHJhbnNhY3Rpb24pO1xuICAgIHRoaXMuX3VwZGF0ZURPTUNoaWxkcmVuKGxhc3RQcm9wcywgbmV4dFByb3BzLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7XG5cbiAgICBzd2l0Y2ggKHRoaXMuX3RhZykge1xuICAgICAgY2FzZSAnaW5wdXQnOlxuICAgICAgICAvLyBVcGRhdGUgdGhlIHdyYXBwZXIgYXJvdW5kIGlucHV0cyAqYWZ0ZXIqIHVwZGF0aW5nIHByb3BzLiBUaGlzIGhhcyB0b1xuICAgICAgICAvLyBoYXBwZW4gYWZ0ZXIgYF91cGRhdGVET01Qcm9wZXJ0aWVzYC4gT3RoZXJ3aXNlIEhUTUw1IGlucHV0IHZhbGlkYXRpb25zXG4gICAgICAgIC8vIHJhaXNlIHdhcm5pbmdzIGFuZCBwcmV2ZW50IHRoZSBuZXcgdmFsdWUgZnJvbSBiZWluZyBhc3NpZ25lZC5cbiAgICAgICAgUmVhY3RET01JbnB1dC51cGRhdGVXcmFwcGVyKHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgICAgUmVhY3RET01UZXh0YXJlYS51cGRhdGVXcmFwcGVyKHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIC8vIDxzZWxlY3Q+IHZhbHVlIHVwZGF0ZSBuZWVkcyB0byBvY2N1ciBhZnRlciA8b3B0aW9uPiBjaGlsZHJlblxuICAgICAgICAvLyByZWNvbmNpbGlhdGlvblxuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHBvc3RVcGRhdGVTZWxlY3RXcmFwcGVyLCB0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBSZWNvbmNpbGVzIHRoZSBwcm9wZXJ0aWVzIGJ5IGRldGVjdGluZyBkaWZmZXJlbmNlcyBpbiBwcm9wZXJ0eSB2YWx1ZXMgYW5kXG4gICAqIHVwZGF0aW5nIHRoZSBET00gYXMgbmVjZXNzYXJ5LiBUaGlzIGZ1bmN0aW9uIGlzIHByb2JhYmx5IHRoZSBzaW5nbGUgbW9zdFxuICAgKiBjcml0aWNhbCBwYXRoIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uXG4gICAqXG4gICAqIFRPRE86IEJlbmNobWFyayB3aGV0aGVyIGNoZWNraW5nIGZvciBjaGFuZ2VkIHZhbHVlcyBpbiBtZW1vcnkgYWN0dWFsbHlcbiAgICogICAgICAgaW1wcm92ZXMgcGVyZm9ybWFuY2UgKGVzcGVjaWFsbHkgc3RhdGljYWxseSBwb3NpdGlvbmVkIGVsZW1lbnRzKS5cbiAgICogVE9ETzogQmVuY2htYXJrIHRoZSBlZmZlY3RzIG9mIHB1dHRpbmcgdGhpcyBhdCB0aGUgdG9wIHNpbmNlIDk5JSBvZiBwcm9wc1xuICAgKiAgICAgICBkbyBub3QgY2hhbmdlIGZvciBhIGdpdmVuIHJlY29uY2lsaWF0aW9uLlxuICAgKiBUT0RPOiBCZW5jaG1hcmsgYXJlYXMgdGhhdCBjYW4gYmUgaW1wcm92ZWQgd2l0aCBjYWNoaW5nLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge29iamVjdH0gbGFzdFByb3BzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBuZXh0UHJvcHNcbiAgICogQHBhcmFtIHs/RE9NRWxlbWVudH0gbm9kZVxuICAgKi9cbiAgX3VwZGF0ZURPTVByb3BlcnRpZXM6IGZ1bmN0aW9uIChsYXN0UHJvcHMsIG5leHRQcm9wcywgdHJhbnNhY3Rpb24pIHtcbiAgICB2YXIgcHJvcEtleTtcbiAgICB2YXIgc3R5bGVOYW1lO1xuICAgIHZhciBzdHlsZVVwZGF0ZXM7XG4gICAgZm9yIChwcm9wS2V5IGluIGxhc3RQcm9wcykge1xuICAgICAgaWYgKG5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCAhbGFzdFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8IGxhc3RQcm9wc1twcm9wS2V5XSA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICAgIHZhciBsYXN0U3R5bGUgPSB0aGlzLl9wcmV2aW91c1N0eWxlQ29weTtcbiAgICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbGFzdFN0eWxlKSB7XG4gICAgICAgICAgaWYgKGxhc3RTdHlsZS5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSBzdHlsZVVwZGF0ZXMgfHwge307XG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wcmV2aW91c1N0eWxlQ29weSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICAgIGlmIChsYXN0UHJvcHNbcHJvcEtleV0pIHtcbiAgICAgICAgICAvLyBPbmx5IGNhbGwgZGVsZXRlTGlzdGVuZXIgaWYgdGhlcmUgd2FzIGEgbGlzdGVuZXIgcHJldmlvdXNseSBvclxuICAgICAgICAgIC8vIGVsc2Ugd2lsbERlbGV0ZUxpc3RlbmVyIGdldHMgY2FsbGVkIHdoZW4gdGhlcmUgd2Fzbid0IGFjdHVhbGx5IGFcbiAgICAgICAgICAvLyBsaXN0ZW5lciAoZS5nLiwgb25DbGljaz17bnVsbH0pXG4gICAgICAgICAgZGVsZXRlTGlzdGVuZXIodGhpcywgcHJvcEtleSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDdXN0b21Db21wb25lbnQodGhpcy5fdGFnLCBsYXN0UHJvcHMpKSB7XG4gICAgICAgIGlmICghUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuZGVsZXRlVmFsdWVGb3JBdHRyaWJ1dGUoZ2V0Tm9kZSh0aGlzKSwgcHJvcEtleSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoRE9NUHJvcGVydHkucHJvcGVydGllc1twcm9wS2V5XSB8fCBET01Qcm9wZXJ0eS5pc0N1c3RvbUF0dHJpYnV0ZShwcm9wS2V5KSkge1xuICAgICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuZGVsZXRlVmFsdWVGb3JQcm9wZXJ0eShnZXROb2RlKHRoaXMpLCBwcm9wS2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChwcm9wS2V5IGluIG5leHRQcm9wcykge1xuICAgICAgdmFyIG5leHRQcm9wID0gbmV4dFByb3BzW3Byb3BLZXldO1xuICAgICAgdmFyIGxhc3RQcm9wID0gcHJvcEtleSA9PT0gU1RZTEUgPyB0aGlzLl9wcmV2aW91c1N0eWxlQ29weSA6IGxhc3RQcm9wcyAhPSBudWxsID8gbGFzdFByb3BzW3Byb3BLZXldIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbmV4dFByb3AgPT09IGxhc3RQcm9wIHx8IG5leHRQcm9wID09IG51bGwgJiYgbGFzdFByb3AgPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgICBpZiAobmV4dFByb3ApIHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgY2hlY2tBbmRXYXJuRm9yTXV0YXRlZFN0eWxlKHRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5LCB0aGlzLl9wcmV2aW91c1N0eWxlLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzU3R5bGUgPSBuZXh0UHJvcDtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV4dFByb3AgPSB0aGlzLl9wcmV2aW91c1N0eWxlQ29weSA9IF9hc3NpZ24oe30sIG5leHRQcm9wKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9wcmV2aW91c1N0eWxlQ29weSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhc3RQcm9wKSB7XG4gICAgICAgICAgLy8gVW5zZXQgc3R5bGVzIG9uIGBsYXN0UHJvcGAgYnV0IG5vdCBvbiBgbmV4dFByb3BgLlxuICAgICAgICAgIGZvciAoc3R5bGVOYW1lIGluIGxhc3RQcm9wKSB7XG4gICAgICAgICAgICBpZiAobGFzdFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSAmJiAoIW5leHRQcm9wIHx8ICFuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSkge1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSBzdHlsZVVwZGF0ZXMgfHwge307XG4gICAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFVwZGF0ZSBzdHlsZXMgdGhhdCBjaGFuZ2VkIHNpbmNlIGBsYXN0UHJvcGAuXG4gICAgICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbmV4dFByb3ApIHtcbiAgICAgICAgICAgIGlmIChuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmIGxhc3RQcm9wW3N0eWxlTmFtZV0gIT09IG5leHRQcm9wW3N0eWxlTmFtZV0pIHtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0gc3R5bGVVcGRhdGVzIHx8IHt9O1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9IG5leHRQcm9wW3N0eWxlTmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFJlbGllcyBvbiBgdXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLlxuICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IG5leHRQcm9wO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICAgIGlmIChuZXh0UHJvcCkge1xuICAgICAgICAgIGVucXVldWVQdXRMaXN0ZW5lcih0aGlzLCBwcm9wS2V5LCBuZXh0UHJvcCwgdHJhbnNhY3Rpb24pO1xuICAgICAgICB9IGVsc2UgaWYgKGxhc3RQcm9wKSB7XG4gICAgICAgICAgZGVsZXRlTGlzdGVuZXIodGhpcywgcHJvcEtleSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDdXN0b21Db21wb25lbnQodGhpcy5fdGFnLCBuZXh0UHJvcHMpKSB7XG4gICAgICAgIGlmICghUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuc2V0VmFsdWVGb3JBdHRyaWJ1dGUoZ2V0Tm9kZSh0aGlzKSwgcHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKERPTVByb3BlcnR5LnByb3BlcnRpZXNbcHJvcEtleV0gfHwgRE9NUHJvcGVydHkuaXNDdXN0b21BdHRyaWJ1dGUocHJvcEtleSkpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBnZXROb2RlKHRoaXMpO1xuICAgICAgICAvLyBJZiB3ZSdyZSB1cGRhdGluZyB0byBudWxsIG9yIHVuZGVmaW5lZCwgd2Ugc2hvdWxkIHJlbW92ZSB0aGUgcHJvcGVydHlcbiAgICAgICAgLy8gZnJvbSB0aGUgRE9NIG5vZGUgaW5zdGVhZCBvZiBpbmFkdmVydGVudGx5IHNldHRpbmcgdG8gYSBzdHJpbmcuIFRoaXNcbiAgICAgICAgLy8gYnJpbmdzIHVzIGluIGxpbmUgd2l0aCB0aGUgc2FtZSBiZWhhdmlvciB3ZSBoYXZlIG9uIGluaXRpYWwgcmVuZGVyLlxuICAgICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICAgIERPTVByb3BlcnR5T3BlcmF0aW9ucy5zZXRWYWx1ZUZvclByb3BlcnR5KG5vZGUsIHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuZGVsZXRlVmFsdWVGb3JQcm9wZXJ0eShub2RlLCBwcm9wS2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3R5bGVVcGRhdGVzKSB7XG4gICAgICBDU1NQcm9wZXJ0eU9wZXJhdGlvbnMuc2V0VmFsdWVGb3JTdHlsZXMoZ2V0Tm9kZSh0aGlzKSwgc3R5bGVVcGRhdGVzLCB0aGlzKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlY29uY2lsZXMgdGhlIGNoaWxkcmVuIHdpdGggdGhlIHZhcmlvdXMgcHJvcGVydGllcyB0aGF0IGFmZmVjdCB0aGVcbiAgICogY2hpbGRyZW4gY29udGVudC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGxhc3RQcm9wc1xuICAgKiBAcGFyYW0ge29iamVjdH0gbmV4dFByb3BzXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHRcbiAgICovXG4gIF91cGRhdGVET01DaGlsZHJlbjogZnVuY3Rpb24gKGxhc3RQcm9wcywgbmV4dFByb3BzLCB0cmFuc2FjdGlvbiwgY29udGV4dCkge1xuICAgIHZhciBsYXN0Q29udGVudCA9IENPTlRFTlRfVFlQRVNbdHlwZW9mIGxhc3RQcm9wcy5jaGlsZHJlbl0gPyBsYXN0UHJvcHMuY2hpbGRyZW4gOiBudWxsO1xuICAgIHZhciBuZXh0Q29udGVudCA9IENPTlRFTlRfVFlQRVNbdHlwZW9mIG5leHRQcm9wcy5jaGlsZHJlbl0gPyBuZXh0UHJvcHMuY2hpbGRyZW4gOiBudWxsO1xuXG4gICAgdmFyIGxhc3RIdG1sID0gbGFzdFByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICYmIGxhc3RQcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWw7XG4gICAgdmFyIG5leHRIdG1sID0gbmV4dFByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICYmIG5leHRQcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWw7XG5cbiAgICAvLyBOb3RlIHRoZSB1c2Ugb2YgYCE9YCB3aGljaCBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkLlxuICAgIHZhciBsYXN0Q2hpbGRyZW4gPSBsYXN0Q29udGVudCAhPSBudWxsID8gbnVsbCA6IGxhc3RQcm9wcy5jaGlsZHJlbjtcbiAgICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dENvbnRlbnQgIT0gbnVsbCA/IG51bGwgOiBuZXh0UHJvcHMuY2hpbGRyZW47XG5cbiAgICAvLyBJZiB3ZSdyZSBzd2l0Y2hpbmcgZnJvbSBjaGlsZHJlbiB0byBjb250ZW50L2h0bWwgb3IgdmljZSB2ZXJzYSwgcmVtb3ZlXG4gICAgLy8gdGhlIG9sZCBjb250ZW50XG4gICAgdmFyIGxhc3RIYXNDb250ZW50T3JIdG1sID0gbGFzdENvbnRlbnQgIT0gbnVsbCB8fCBsYXN0SHRtbCAhPSBudWxsO1xuICAgIHZhciBuZXh0SGFzQ29udGVudE9ySHRtbCA9IG5leHRDb250ZW50ICE9IG51bGwgfHwgbmV4dEh0bWwgIT0gbnVsbDtcbiAgICBpZiAobGFzdENoaWxkcmVuICE9IG51bGwgJiYgbmV4dENoaWxkcmVuID09IG51bGwpIHtcbiAgICAgIHRoaXMudXBkYXRlQ2hpbGRyZW4obnVsbCwgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgIH0gZWxzZSBpZiAobGFzdEhhc0NvbnRlbnRPckh0bWwgJiYgIW5leHRIYXNDb250ZW50T3JIdG1sKSB7XG4gICAgICB0aGlzLnVwZGF0ZVRleHRDb250ZW50KCcnKTtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblNldENoaWxkcmVuKHRoaXMuX2RlYnVnSUQsIFtdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmV4dENvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgaWYgKGxhc3RDb250ZW50ICE9PSBuZXh0Q29udGVudCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVRleHRDb250ZW50KCcnICsgbmV4dENvbnRlbnQpO1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2LmNhbGwodGhpcywgbmV4dENvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7XG4gICAgICBpZiAobGFzdEh0bWwgIT09IG5leHRIdG1sKSB7XG4gICAgICAgIHRoaXMudXBkYXRlTWFya3VwKCcnICsgbmV4dEh0bWwpO1xuICAgICAgfVxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uU2V0Q2hpbGRyZW4odGhpcy5fZGVidWdJRCwgW10pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobmV4dENoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2LmNhbGwodGhpcywgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlQ2hpbGRyZW4obmV4dENoaWxkcmVuLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7XG4gICAgfVxuICB9LFxuXG4gIGdldEhvc3ROb2RlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldE5vZGUodGhpcyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIGFsbCBldmVudCByZWdpc3RyYXRpb25zIGZvciB0aGlzIGluc3RhbmNlLiBEb2VzIG5vdCByZW1vdmUgZnJvbVxuICAgKiB0aGUgRE9NLiBUaGF0IG11c3QgYmUgZG9uZSBieSB0aGUgcGFyZW50LlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHVubW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChzYWZlbHkpIHtcbiAgICBzd2l0Y2ggKHRoaXMuX3RhZykge1xuICAgICAgY2FzZSAnYXVkaW8nOlxuICAgICAgY2FzZSAnZm9ybSc6XG4gICAgICBjYXNlICdpZnJhbWUnOlxuICAgICAgY2FzZSAnaW1nJzpcbiAgICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIGNhc2UgJ3NvdXJjZSc6XG4gICAgICBjYXNlICd2aWRlbyc6XG4gICAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl93cmFwcGVyU3RhdGUubGlzdGVuZXJzO1xuICAgICAgICBpZiAobGlzdGVuZXJzKSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxpc3RlbmVyc1tpXS5yZW1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdpbnB1dCc6XG4gICAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAgIGlucHV0VmFsdWVUcmFja2luZy5zdG9wVHJhY2tpbmcodGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICBjYXNlICdoZWFkJzpcbiAgICAgIGNhc2UgJ2JvZHknOlxuICAgICAgICAvKipcbiAgICAgICAgICogQ29tcG9uZW50cyBsaWtlIDxodG1sPiA8aGVhZD4gYW5kIDxib2R5PiBjYW4ndCBiZSByZW1vdmVkIG9yIGFkZGVkXG4gICAgICAgICAqIGVhc2lseSBpbiBhIGNyb3NzLWJyb3dzZXIgd2F5LCBob3dldmVyIGl0J3MgdmFsdWFibGUgdG8gYmUgYWJsZSB0b1xuICAgICAgICAgKiB0YWtlIGFkdmFudGFnZSBvZiBSZWFjdCdzIHJlY29uY2lsaWF0aW9uIGZvciBzdHlsaW5nIGFuZCA8dGl0bGU+XG4gICAgICAgICAqIG1hbmFnZW1lbnQuIFNvIHdlIGp1c3QgZG9jdW1lbnQgaXQgYW5kIHRocm93IGluIGRhbmdlcm91cyBjYXNlcy5cbiAgICAgICAgICovXG4gICAgICAgICFmYWxzZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICc8JXM+IHRyaWVkIHRvIHVubW91bnQuIEJlY2F1c2Ugb2YgY3Jvc3MtYnJvd3NlciBxdWlya3MgaXQgaXMgaW1wb3NzaWJsZSB0byB1bm1vdW50IHNvbWUgdG9wLWxldmVsIGNvbXBvbmVudHMgKGVnIDxodG1sPiwgPGhlYWQ+LCBhbmQgPGJvZHk+KSByZWxpYWJseSBhbmQgZWZmaWNpZW50bHkuIFRvIGZpeCB0aGlzLCBoYXZlIGEgc2luZ2xlIHRvcC1sZXZlbCBjb21wb25lbnQgdGhhdCBuZXZlciB1bm1vdW50cyByZW5kZXIgdGhlc2UgZWxlbWVudHMuJywgdGhpcy5fdGFnKSA6IF9wcm9kSW52YXJpYW50KCc2NicsIHRoaXMuX3RhZykgOiB2b2lkIDA7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMudW5tb3VudENoaWxkcmVuKHNhZmVseSk7XG4gICAgUmVhY3RET01Db21wb25lbnRUcmVlLnVuY2FjaGVOb2RlKHRoaXMpO1xuICAgIEV2ZW50UGx1Z2luSHViLmRlbGV0ZUFsbExpc3RlbmVycyh0aGlzKTtcbiAgICB0aGlzLl9yb290Tm9kZUlEID0gMDtcbiAgICB0aGlzLl9kb21JRCA9IDA7XG4gICAgdGhpcy5fd3JhcHBlclN0YXRlID0gbnVsbDtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBzZXRBbmRWYWxpZGF0ZUNvbnRlbnRDaGlsZERldi5jYWxsKHRoaXMsIG51bGwpO1xuICAgIH1cbiAgfSxcblxuICBnZXRQdWJsaWNJbnN0YW5jZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXROb2RlKHRoaXMpO1xuICB9XG59O1xuXG5fYXNzaWduKFJlYWN0RE9NQ29tcG9uZW50LnByb3RvdHlwZSwgUmVhY3RET01Db21wb25lbnQuTWl4aW4sIFJlYWN0TXVsdGlDaGlsZC5NaXhpbik7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01Db21wb25lbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBET01MYXp5VHJlZSA9IHJlcXVpcmUoJy4vRE9NTGF6eVRyZWUnKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xuXG52YXIgUmVhY3RET01FbXB0eUNvbXBvbmVudCA9IGZ1bmN0aW9uIChpbnN0YW50aWF0ZSkge1xuICAvLyBSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCB1c2VzIHRoaXM6XG4gIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbnVsbDtcbiAgLy8gUmVhY3RET01Db21wb25lbnRUcmVlIHVzZXMgdGhlc2U6XG4gIHRoaXMuX2hvc3ROb2RlID0gbnVsbDtcbiAgdGhpcy5faG9zdFBhcmVudCA9IG51bGw7XG4gIHRoaXMuX2hvc3RDb250YWluZXJJbmZvID0gbnVsbDtcbiAgdGhpcy5fZG9tSUQgPSAwO1xufTtcbl9hc3NpZ24oUmVhY3RET01FbXB0eUNvbXBvbmVudC5wcm90b3R5cGUsIHtcbiAgbW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQpIHtcbiAgICB2YXIgZG9tSUQgPSBob3N0Q29udGFpbmVySW5mby5faWRDb3VudGVyKys7XG4gICAgdGhpcy5fZG9tSUQgPSBkb21JRDtcbiAgICB0aGlzLl9ob3N0UGFyZW50ID0gaG9zdFBhcmVudDtcbiAgICB0aGlzLl9ob3N0Q29udGFpbmVySW5mbyA9IGhvc3RDb250YWluZXJJbmZvO1xuXG4gICAgdmFyIG5vZGVWYWx1ZSA9ICcgcmVhY3QtZW1wdHk6ICcgKyB0aGlzLl9kb21JRCArICcgJztcbiAgICBpZiAodHJhbnNhY3Rpb24udXNlQ3JlYXRlRWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyRG9jdW1lbnQgPSBob3N0Q29udGFpbmVySW5mby5fb3duZXJEb2N1bWVudDtcbiAgICAgIHZhciBub2RlID0gb3duZXJEb2N1bWVudC5jcmVhdGVDb21tZW50KG5vZGVWYWx1ZSk7XG4gICAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUucHJlY2FjaGVOb2RlKHRoaXMsIG5vZGUpO1xuICAgICAgcmV0dXJuIERPTUxhenlUcmVlKG5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHJhbnNhY3Rpb24ucmVuZGVyVG9TdGF0aWNNYXJrdXApIHtcbiAgICAgICAgLy8gTm9ybWFsbHkgd2UnZCBpbnNlcnQgYSBjb21tZW50IG5vZGUsIGJ1dCBzaW5jZSB0aGlzIGlzIGEgc2l0dWF0aW9uXG4gICAgICAgIC8vIHdoZXJlIFJlYWN0IHdvbid0IHRha2Ugb3ZlciAoc3RhdGljIHBhZ2VzKSwgd2UgY2FuIHNpbXBseSByZXR1cm5cbiAgICAgICAgLy8gbm90aGluZy5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgICAgcmV0dXJuICc8IS0tJyArIG5vZGVWYWx1ZSArICctLT4nO1xuICAgIH1cbiAgfSxcbiAgcmVjZWl2ZUNvbXBvbmVudDogZnVuY3Rpb24gKCkge30sXG4gIGdldEhvc3ROb2RlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHRoaXMpO1xuICB9LFxuICB1bm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgUmVhY3RET01Db21wb25lbnRUcmVlLnVuY2FjaGVOb2RlKHRoaXMpO1xuICB9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUVtcHR5Q29tcG9uZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTUtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxvd2VzdCBjb21tb24gYW5jZXN0b3Igb2YgQSBhbmQgQiwgb3IgbnVsbCBpZiB0aGV5IGFyZSBpblxuICogZGlmZmVyZW50IHRyZWVzLlxuICovXG5mdW5jdGlvbiBnZXRMb3dlc3RDb21tb25BbmNlc3RvcihpbnN0QSwgaW5zdEIpIHtcbiAgISgnX2hvc3ROb2RlJyBpbiBpbnN0QSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnZ2V0Tm9kZUZyb21JbnN0YW5jZTogSW52YWxpZCBhcmd1bWVudC4nKSA6IF9wcm9kSW52YXJpYW50KCczMycpIDogdm9pZCAwO1xuICAhKCdfaG9zdE5vZGUnIGluIGluc3RCKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdnZXROb2RlRnJvbUluc3RhbmNlOiBJbnZhbGlkIGFyZ3VtZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzMzJykgOiB2b2lkIDA7XG5cbiAgdmFyIGRlcHRoQSA9IDA7XG4gIGZvciAodmFyIHRlbXBBID0gaW5zdEE7IHRlbXBBOyB0ZW1wQSA9IHRlbXBBLl9ob3N0UGFyZW50KSB7XG4gICAgZGVwdGhBKys7XG4gIH1cbiAgdmFyIGRlcHRoQiA9IDA7XG4gIGZvciAodmFyIHRlbXBCID0gaW5zdEI7IHRlbXBCOyB0ZW1wQiA9IHRlbXBCLl9ob3N0UGFyZW50KSB7XG4gICAgZGVwdGhCKys7XG4gIH1cblxuICAvLyBJZiBBIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG4gIHdoaWxlIChkZXB0aEEgLSBkZXB0aEIgPiAwKSB7XG4gICAgaW5zdEEgPSBpbnN0QS5faG9zdFBhcmVudDtcbiAgICBkZXB0aEEtLTtcbiAgfVxuXG4gIC8vIElmIEIgaXMgZGVlcGVyLCBjcmF3bCB1cC5cbiAgd2hpbGUgKGRlcHRoQiAtIGRlcHRoQSA+IDApIHtcbiAgICBpbnN0QiA9IGluc3RCLl9ob3N0UGFyZW50O1xuICAgIGRlcHRoQi0tO1xuICB9XG5cbiAgLy8gV2FsayBpbiBsb2Nrc3RlcCB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guXG4gIHZhciBkZXB0aCA9IGRlcHRoQTtcbiAgd2hpbGUgKGRlcHRoLS0pIHtcbiAgICBpZiAoaW5zdEEgPT09IGluc3RCKSB7XG4gICAgICByZXR1cm4gaW5zdEE7XG4gICAgfVxuICAgIGluc3RBID0gaW5zdEEuX2hvc3RQYXJlbnQ7XG4gICAgaW5zdEIgPSBpbnN0Qi5faG9zdFBhcmVudDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gaWYgQSBpcyBhbiBhbmNlc3RvciBvZiBCLlxuICovXG5mdW5jdGlvbiBpc0FuY2VzdG9yKGluc3RBLCBpbnN0Qikge1xuICAhKCdfaG9zdE5vZGUnIGluIGluc3RBKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdpc0FuY2VzdG9yOiBJbnZhbGlkIGFyZ3VtZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzM1JykgOiB2b2lkIDA7XG4gICEoJ19ob3N0Tm9kZScgaW4gaW5zdEIpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2lzQW5jZXN0b3I6IEludmFsaWQgYXJndW1lbnQuJykgOiBfcHJvZEludmFyaWFudCgnMzUnKSA6IHZvaWQgMDtcblxuICB3aGlsZSAoaW5zdEIpIHtcbiAgICBpZiAoaW5zdEIgPT09IGluc3RBKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaW5zdEIgPSBpbnN0Qi5faG9zdFBhcmVudDtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBwYXJlbnQgaW5zdGFuY2Ugb2YgdGhlIHBhc3NlZC1pbiBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gZ2V0UGFyZW50SW5zdGFuY2UoaW5zdCkge1xuICAhKCdfaG9zdE5vZGUnIGluIGluc3QpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2dldFBhcmVudEluc3RhbmNlOiBJbnZhbGlkIGFyZ3VtZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzM2JykgOiB2b2lkIDA7XG5cbiAgcmV0dXJuIGluc3QuX2hvc3RQYXJlbnQ7XG59XG5cbi8qKlxuICogU2ltdWxhdGVzIHRoZSB0cmF2ZXJzYWwgb2YgYSB0d28tcGhhc2UsIGNhcHR1cmUvYnViYmxlIGV2ZW50IGRpc3BhdGNoLlxuICovXG5mdW5jdGlvbiB0cmF2ZXJzZVR3b1BoYXNlKGluc3QsIGZuLCBhcmcpIHtcbiAgdmFyIHBhdGggPSBbXTtcbiAgd2hpbGUgKGluc3QpIHtcbiAgICBwYXRoLnB1c2goaW5zdCk7XG4gICAgaW5zdCA9IGluc3QuX2hvc3RQYXJlbnQ7XG4gIH1cbiAgdmFyIGk7XG4gIGZvciAoaSA9IHBhdGgubGVuZ3RoOyBpLS0gPiAwOykge1xuICAgIGZuKHBhdGhbaV0sICdjYXB0dXJlZCcsIGFyZyk7XG4gIH1cbiAgZm9yIChpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBmbihwYXRoW2ldLCAnYnViYmxlZCcsIGFyZyk7XG4gIH1cbn1cblxuLyoqXG4gKiBUcmF2ZXJzZXMgdGhlIElEIGhpZXJhcmNoeSBhbmQgaW52b2tlcyB0aGUgc3VwcGxpZWQgYGNiYCBvbiBhbnkgSURzIHRoYXRcbiAqIHNob3VsZCB3b3VsZCByZWNlaXZlIGEgYG1vdXNlRW50ZXJgIG9yIGBtb3VzZUxlYXZlYCBldmVudC5cbiAqXG4gKiBEb2VzIG5vdCBpbnZva2UgdGhlIGNhbGxiYWNrIG9uIHRoZSBuZWFyZXN0IGNvbW1vbiBhbmNlc3RvciBiZWNhdXNlIG5vdGhpbmdcbiAqIFwiZW50ZXJlZFwiIG9yIFwibGVmdFwiIHRoYXQgZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gdHJhdmVyc2VFbnRlckxlYXZlKGZyb20sIHRvLCBmbiwgYXJnRnJvbSwgYXJnVG8pIHtcbiAgdmFyIGNvbW1vbiA9IGZyb20gJiYgdG8gPyBnZXRMb3dlc3RDb21tb25BbmNlc3Rvcihmcm9tLCB0bykgOiBudWxsO1xuICB2YXIgcGF0aEZyb20gPSBbXTtcbiAgd2hpbGUgKGZyb20gJiYgZnJvbSAhPT0gY29tbW9uKSB7XG4gICAgcGF0aEZyb20ucHVzaChmcm9tKTtcbiAgICBmcm9tID0gZnJvbS5faG9zdFBhcmVudDtcbiAgfVxuICB2YXIgcGF0aFRvID0gW107XG4gIHdoaWxlICh0byAmJiB0byAhPT0gY29tbW9uKSB7XG4gICAgcGF0aFRvLnB1c2godG8pO1xuICAgIHRvID0gdG8uX2hvc3RQYXJlbnQ7XG4gIH1cbiAgdmFyIGk7XG4gIGZvciAoaSA9IDA7IGkgPCBwYXRoRnJvbS5sZW5ndGg7IGkrKykge1xuICAgIGZuKHBhdGhGcm9tW2ldLCAnYnViYmxlZCcsIGFyZ0Zyb20pO1xuICB9XG4gIGZvciAoaSA9IHBhdGhUby5sZW5ndGg7IGktLSA+IDA7KSB7XG4gICAgZm4ocGF0aFRvW2ldLCAnY2FwdHVyZWQnLCBhcmdUbyk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQW5jZXN0b3I6IGlzQW5jZXN0b3IsXG4gIGdldExvd2VzdENvbW1vbkFuY2VzdG9yOiBnZXRMb3dlc3RDb21tb25BbmNlc3RvcixcbiAgZ2V0UGFyZW50SW5zdGFuY2U6IGdldFBhcmVudEluc3RhbmNlLFxuICB0cmF2ZXJzZVR3b1BoYXNlOiB0cmF2ZXJzZVR3b1BoYXNlLFxuICB0cmF2ZXJzZUVudGVyTGVhdmU6IHRyYXZlcnNlRW50ZXJMZWF2ZVxufTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpLFxuICAgIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBET01DaGlsZHJlbk9wZXJhdGlvbnMgPSByZXF1aXJlKCcuL0RPTUNoaWxkcmVuT3BlcmF0aW9ucycpO1xudmFyIERPTUxhenlUcmVlID0gcmVxdWlyZSgnLi9ET01MYXp5VHJlZScpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG5cbnZhciBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIgPSByZXF1aXJlKCcuL2VzY2FwZVRleHRDb250ZW50Rm9yQnJvd3NlcicpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHZhbGlkYXRlRE9NTmVzdGluZyA9IHJlcXVpcmUoJy4vdmFsaWRhdGVET01OZXN0aW5nJyk7XG5cbi8qKlxuICogVGV4dCBub2RlcyB2aW9sYXRlIGEgY291cGxlIGFzc3VtcHRpb25zIHRoYXQgUmVhY3QgbWFrZXMgYWJvdXQgY29tcG9uZW50czpcbiAqXG4gKiAgLSBXaGVuIG1vdW50aW5nIHRleHQgaW50byB0aGUgRE9NLCBhZGphY2VudCB0ZXh0IG5vZGVzIGFyZSBtZXJnZWQuXG4gKiAgLSBUZXh0IG5vZGVzIGNhbm5vdCBiZSBhc3NpZ25lZCBhIFJlYWN0IHJvb3QgSUQuXG4gKlxuICogVGhpcyBjb21wb25lbnQgaXMgdXNlZCB0byB3cmFwIHN0cmluZ3MgYmV0d2VlbiBjb21tZW50IG5vZGVzIHNvIHRoYXQgdGhleVxuICogY2FuIHVuZGVyZ28gdGhlIHNhbWUgcmVjb25jaWxpYXRpb24gdGhhdCBpcyBhcHBsaWVkIHRvIGVsZW1lbnRzLlxuICpcbiAqIFRPRE86IEludmVzdGlnYXRlIHJlcHJlc2VudGluZyBSZWFjdCBjb21wb25lbnRzIGluIHRoZSBET00gd2l0aCB0ZXh0IG5vZGVzLlxuICpcbiAqIEBjbGFzcyBSZWFjdERPTVRleHRDb21wb25lbnRcbiAqIEBleHRlbmRzIFJlYWN0Q29tcG9uZW50XG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIFJlYWN0RE9NVGV4dENvbXBvbmVudCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gIC8vIFRPRE86IFRoaXMgaXMgcmVhbGx5IGEgUmVhY3RUZXh0IChSZWFjdE5vZGUpLCBub3QgYSBSZWFjdEVsZW1lbnRcbiAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSB0ZXh0O1xuICB0aGlzLl9zdHJpbmdUZXh0ID0gJycgKyB0ZXh0O1xuICAvLyBSZWFjdERPTUNvbXBvbmVudFRyZWUgdXNlcyB0aGVzZTpcbiAgdGhpcy5faG9zdE5vZGUgPSBudWxsO1xuICB0aGlzLl9ob3N0UGFyZW50ID0gbnVsbDtcblxuICAvLyBQcm9wZXJ0aWVzXG4gIHRoaXMuX2RvbUlEID0gMDtcbiAgdGhpcy5fbW91bnRJbmRleCA9IDA7XG4gIHRoaXMuX2Nsb3NpbmdDb21tZW50ID0gbnVsbDtcbiAgdGhpcy5fY29tbWVudE5vZGVzID0gbnVsbDtcbn07XG5cbl9hc3NpZ24oUmVhY3RET01UZXh0Q29tcG9uZW50LnByb3RvdHlwZSwge1xuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgbWFya3VwIGZvciB0aGlzIHRleHQgbm9kZS4gVGhpcyBub2RlIGlzIG5vdCBpbnRlbmRlZCB0byBoYXZlXG4gICAqIGFueSBmZWF0dXJlcyBiZXNpZGVzIGNvbnRhaW5pbmcgdGV4dCBjb250ZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb258UmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7c3RyaW5nfSBNYXJrdXAgZm9yIHRoaXMgdGV4dCBub2RlLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAodHJhbnNhY3Rpb24sIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCBjb250ZXh0KSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBwYXJlbnRJbmZvO1xuICAgICAgaWYgKGhvc3RQYXJlbnQgIT0gbnVsbCkge1xuICAgICAgICBwYXJlbnRJbmZvID0gaG9zdFBhcmVudC5fYW5jZXN0b3JJbmZvO1xuICAgICAgfSBlbHNlIGlmIChob3N0Q29udGFpbmVySW5mbyAhPSBudWxsKSB7XG4gICAgICAgIHBhcmVudEluZm8gPSBob3N0Q29udGFpbmVySW5mby5fYW5jZXN0b3JJbmZvO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmVudEluZm8pIHtcbiAgICAgICAgLy8gcGFyZW50SW5mbyBzaG91bGQgYWx3YXlzIGJlIHByZXNlbnQgZXhjZXB0IGZvciB0aGUgdG9wLWxldmVsXG4gICAgICAgIC8vIGNvbXBvbmVudCB3aGVuIHNlcnZlciByZW5kZXJpbmdcbiAgICAgICAgdmFsaWRhdGVET01OZXN0aW5nKG51bGwsIHRoaXMuX3N0cmluZ1RleHQsIHRoaXMsIHBhcmVudEluZm8pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkb21JRCA9IGhvc3RDb250YWluZXJJbmZvLl9pZENvdW50ZXIrKztcbiAgICB2YXIgb3BlbmluZ1ZhbHVlID0gJyByZWFjdC10ZXh0OiAnICsgZG9tSUQgKyAnICc7XG4gICAgdmFyIGNsb3NpbmdWYWx1ZSA9ICcgL3JlYWN0LXRleHQgJztcbiAgICB0aGlzLl9kb21JRCA9IGRvbUlEO1xuICAgIHRoaXMuX2hvc3RQYXJlbnQgPSBob3N0UGFyZW50O1xuICAgIGlmICh0cmFuc2FjdGlvbi51c2VDcmVhdGVFbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXJEb2N1bWVudCA9IGhvc3RDb250YWluZXJJbmZvLl9vd25lckRvY3VtZW50O1xuICAgICAgdmFyIG9wZW5pbmdDb21tZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVDb21tZW50KG9wZW5pbmdWYWx1ZSk7XG4gICAgICB2YXIgY2xvc2luZ0NvbW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoY2xvc2luZ1ZhbHVlKTtcbiAgICAgIHZhciBsYXp5VHJlZSA9IERPTUxhenlUcmVlKG93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtcbiAgICAgIERPTUxhenlUcmVlLnF1ZXVlQ2hpbGQobGF6eVRyZWUsIERPTUxhenlUcmVlKG9wZW5pbmdDb21tZW50KSk7XG4gICAgICBpZiAodGhpcy5fc3RyaW5nVGV4dCkge1xuICAgICAgICBET01MYXp5VHJlZS5xdWV1ZUNoaWxkKGxhenlUcmVlLCBET01MYXp5VHJlZShvd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMuX3N0cmluZ1RleHQpKSk7XG4gICAgICB9XG4gICAgICBET01MYXp5VHJlZS5xdWV1ZUNoaWxkKGxhenlUcmVlLCBET01MYXp5VHJlZShjbG9zaW5nQ29tbWVudCkpO1xuICAgICAgUmVhY3RET01Db21wb25lbnRUcmVlLnByZWNhY2hlTm9kZSh0aGlzLCBvcGVuaW5nQ29tbWVudCk7XG4gICAgICB0aGlzLl9jbG9zaW5nQ29tbWVudCA9IGNsb3NpbmdDb21tZW50O1xuICAgICAgcmV0dXJuIGxhenlUcmVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZXNjYXBlZFRleHQgPSBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIodGhpcy5fc3RyaW5nVGV4dCk7XG5cbiAgICAgIGlmICh0cmFuc2FjdGlvbi5yZW5kZXJUb1N0YXRpY01hcmt1cCkge1xuICAgICAgICAvLyBOb3JtYWxseSB3ZSdkIHdyYXAgdGhpcyBiZXR3ZWVuIGNvbW1lbnQgbm9kZXMgZm9yIHRoZSByZWFzb25zIHN0YXRlZFxuICAgICAgICAvLyBhYm92ZSwgYnV0IHNpbmNlIHRoaXMgaXMgYSBzaXR1YXRpb24gd2hlcmUgUmVhY3Qgd29uJ3QgdGFrZSBvdmVyXG4gICAgICAgIC8vIChzdGF0aWMgcGFnZXMpLCB3ZSBjYW4gc2ltcGx5IHJldHVybiB0aGUgdGV4dCBhcyBpdCBpcy5cbiAgICAgICAgcmV0dXJuIGVzY2FwZWRUZXh0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJzwhLS0nICsgb3BlbmluZ1ZhbHVlICsgJy0tPicgKyBlc2NhcGVkVGV4dCArICc8IS0tJyArIGNsb3NpbmdWYWx1ZSArICctLT4nO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogVXBkYXRlcyB0aGlzIGNvbXBvbmVudCBieSB1cGRhdGluZyB0aGUgdGV4dCBjb250ZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0VGV4dH0gbmV4dFRleHQgVGhlIG5leHQgdGV4dCBjb250ZW50XG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQGludGVybmFsXG4gICAqL1xuICByZWNlaXZlQ29tcG9uZW50OiBmdW5jdGlvbiAobmV4dFRleHQsIHRyYW5zYWN0aW9uKSB7XG4gICAgaWYgKG5leHRUZXh0ICE9PSB0aGlzLl9jdXJyZW50RWxlbWVudCkge1xuICAgICAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSBuZXh0VGV4dDtcbiAgICAgIHZhciBuZXh0U3RyaW5nVGV4dCA9ICcnICsgbmV4dFRleHQ7XG4gICAgICBpZiAobmV4dFN0cmluZ1RleHQgIT09IHRoaXMuX3N0cmluZ1RleHQpIHtcbiAgICAgICAgLy8gVE9ETzogU2F2ZSB0aGlzIGFzIHBlbmRpbmcgcHJvcHMgYW5kIHVzZSBwZXJmb3JtVXBkYXRlSWZOZWNlc3NhcnlcbiAgICAgICAgLy8gYW5kL29yIHVwZGF0ZUNvbXBvbmVudCB0byBkbyB0aGUgYWN0dWFsIHVwZGF0ZSBmb3IgY29uc2lzdGVuY3kgd2l0aFxuICAgICAgICAvLyBvdGhlciBjb21wb25lbnQgdHlwZXM/XG4gICAgICAgIHRoaXMuX3N0cmluZ1RleHQgPSBuZXh0U3RyaW5nVGV4dDtcbiAgICAgICAgdmFyIGNvbW1lbnROb2RlcyA9IHRoaXMuZ2V0SG9zdE5vZGUoKTtcbiAgICAgICAgRE9NQ2hpbGRyZW5PcGVyYXRpb25zLnJlcGxhY2VEZWxpbWl0ZWRUZXh0KGNvbW1lbnROb2Rlc1swXSwgY29tbWVudE5vZGVzWzFdLCBuZXh0U3RyaW5nVGV4dCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGdldEhvc3ROb2RlOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhvc3ROb2RlID0gdGhpcy5fY29tbWVudE5vZGVzO1xuICAgIGlmIChob3N0Tm9kZSkge1xuICAgICAgcmV0dXJuIGhvc3ROb2RlO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2Nsb3NpbmdDb21tZW50KSB7XG4gICAgICB2YXIgb3BlbmluZ0NvbW1lbnQgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0aGlzKTtcbiAgICAgIHZhciBub2RlID0gb3BlbmluZ0NvbW1lbnQubmV4dFNpYmxpbmc7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAhKG5vZGUgIT0gbnVsbCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnTWlzc2luZyBjbG9zaW5nIGNvbW1lbnQgZm9yIHRleHQgY29tcG9uZW50ICVzJywgdGhpcy5fZG9tSUQpIDogX3Byb2RJbnZhcmlhbnQoJzY3JywgdGhpcy5fZG9tSUQpIDogdm9pZCAwO1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gOCAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gJyAvcmVhY3QtdGV4dCAnKSB7XG4gICAgICAgICAgdGhpcy5fY2xvc2luZ0NvbW1lbnQgPSBub2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgICBob3N0Tm9kZSA9IFt0aGlzLl9ob3N0Tm9kZSwgdGhpcy5fY2xvc2luZ0NvbW1lbnRdO1xuICAgIHRoaXMuX2NvbW1lbnROb2RlcyA9IGhvc3ROb2RlO1xuICAgIHJldHVybiBob3N0Tm9kZTtcbiAgfSxcblxuICB1bm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fY2xvc2luZ0NvbW1lbnQgPSBudWxsO1xuICAgIHRoaXMuX2NvbW1lbnROb2RlcyA9IG51bGw7XG4gICAgUmVhY3RET01Db21wb25lbnRUcmVlLnVuY2FjaGVOb2RlKHRoaXMpO1xuICB9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTVRleHRDb21wb25lbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpO1xudmFyIFRyYW5zYWN0aW9uID0gcmVxdWlyZSgnLi9UcmFuc2FjdGlvbicpO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTtcblxudmFyIFJFU0VUX0JBVENIRURfVVBEQVRFUyA9IHtcbiAgaW5pdGlhbGl6ZTogZW1wdHlGdW5jdGlvbixcbiAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICBSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5LmlzQmF0Y2hpbmdVcGRhdGVzID0gZmFsc2U7XG4gIH1cbn07XG5cbnZhciBGTFVTSF9CQVRDSEVEX1VQREFURVMgPSB7XG4gIGluaXRpYWxpemU6IGVtcHR5RnVuY3Rpb24sXG4gIGNsb3NlOiBSZWFjdFVwZGF0ZXMuZmx1c2hCYXRjaGVkVXBkYXRlcy5iaW5kKFJlYWN0VXBkYXRlcylcbn07XG5cbnZhciBUUkFOU0FDVElPTl9XUkFQUEVSUyA9IFtGTFVTSF9CQVRDSEVEX1VQREFURVMsIFJFU0VUX0JBVENIRURfVVBEQVRFU107XG5cbmZ1bmN0aW9uIFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3lUcmFuc2FjdGlvbigpIHtcbiAgdGhpcy5yZWluaXRpYWxpemVUcmFuc2FjdGlvbigpO1xufVxuXG5fYXNzaWduKFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3lUcmFuc2FjdGlvbi5wcm90b3R5cGUsIFRyYW5zYWN0aW9uLCB7XG4gIGdldFRyYW5zYWN0aW9uV3JhcHBlcnM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gVFJBTlNBQ1RJT05fV1JBUFBFUlM7XG4gIH1cbn0pO1xuXG52YXIgdHJhbnNhY3Rpb24gPSBuZXcgUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneVRyYW5zYWN0aW9uKCk7XG5cbnZhciBSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5ID0ge1xuICBpc0JhdGNoaW5nVXBkYXRlczogZmFsc2UsXG5cbiAgLyoqXG4gICAqIENhbGwgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGluIGEgY29udGV4dCB3aXRoaW4gd2hpY2ggY2FsbHMgdG8gYHNldFN0YXRlYFxuICAgKiBhbmQgZnJpZW5kcyBhcmUgYmF0Y2hlZCBzdWNoIHRoYXQgY29tcG9uZW50cyBhcmVuJ3QgdXBkYXRlZCB1bm5lY2Vzc2FyaWx5LlxuICAgKi9cbiAgYmF0Y2hlZFVwZGF0ZXM6IGZ1bmN0aW9uIChjYWxsYmFjaywgYSwgYiwgYywgZCwgZSkge1xuICAgIHZhciBhbHJlYWR5QmF0Y2hpbmdVcGRhdGVzID0gUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneS5pc0JhdGNoaW5nVXBkYXRlcztcblxuICAgIFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3kuaXNCYXRjaGluZ1VwZGF0ZXMgPSB0cnVlO1xuXG4gICAgLy8gVGhlIGNvZGUgaXMgd3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCBleHRyYSBhbGxvY2F0aW9uc1xuICAgIGlmIChhbHJlYWR5QmF0Y2hpbmdVcGRhdGVzKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soYSwgYiwgYywgZCwgZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cmFuc2FjdGlvbi5wZXJmb3JtKGNhbGxiYWNrLCBudWxsLCBhLCBiLCBjLCBkLCBlKTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneTsiLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbnZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9lbXB0eUZ1bmN0aW9uJyk7XG5cbi8qKlxuICogVXBzdHJlYW0gdmVyc2lvbiBvZiBldmVudCBsaXN0ZW5lci4gRG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgc3BlY2lmaWNcbiAqIG5hdHVyZSBvZiBwbGF0Zm9ybS5cbiAqL1xudmFyIEV2ZW50TGlzdGVuZXIgPSB7XG4gIC8qKlxuICAgKiBMaXN0ZW4gdG8gRE9NIGV2ZW50cyBkdXJpbmcgdGhlIGJ1YmJsZSBwaGFzZS5cbiAgICpcbiAgICogQHBhcmFtIHtET01FdmVudFRhcmdldH0gdGFyZ2V0IERPTSBlbGVtZW50IHRvIHJlZ2lzdGVyIGxpc3RlbmVyIG9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRUeXBlIEV2ZW50IHR5cGUsIGUuZy4gJ2NsaWNrJyBvciAnbW91c2VvdmVyJy5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IHdpdGggYSBgcmVtb3ZlYCBtZXRob2QuXG4gICAqL1xuICBsaXN0ZW46IGZ1bmN0aW9uIGxpc3Rlbih0YXJnZXQsIGV2ZW50VHlwZSwgY2FsbGJhY2spIHtcbiAgICBpZiAodGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2ssIGZhbHNlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2ssIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHRhcmdldC5hdHRhY2hFdmVudCkge1xuICAgICAgdGFyZ2V0LmF0dGFjaEV2ZW50KCdvbicgKyBldmVudFR5cGUsIGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgICAgIHRhcmdldC5kZXRhY2hFdmVudCgnb24nICsgZXZlbnRUeXBlLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gdG8gRE9NIGV2ZW50cyBkdXJpbmcgdGhlIGNhcHR1cmUgcGhhc2UuXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRXZlbnRUYXJnZXR9IHRhcmdldCBET00gZWxlbWVudCB0byByZWdpc3RlciBsaXN0ZW5lciBvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50VHlwZSBFdmVudCB0eXBlLCBlLmcuICdjbGljaycgb3IgJ21vdXNlb3ZlcicuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IE9iamVjdCB3aXRoIGEgYHJlbW92ZWAgbWV0aG9kLlxuICAgKi9cbiAgY2FwdHVyZTogZnVuY3Rpb24gY2FwdHVyZSh0YXJnZXQsIGV2ZW50VHlwZSwgY2FsbGJhY2spIHtcbiAgICBpZiAodGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2ssIHRydWUpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBjYWxsYmFjaywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0F0dGVtcHRlZCB0byBsaXN0ZW4gdG8gZXZlbnRzIGR1cmluZyB0aGUgY2FwdHVyZSBwaGFzZSBvbiBhICcgKyAnYnJvd3NlciB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhlIGNhcHR1cmUgcGhhc2UuIFlvdXIgYXBwbGljYXRpb24gJyArICd3aWxsIG5vdCByZWNlaXZlIHNvbWUgZXZlbnRzLicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVtb3ZlOiBlbXB0eUZ1bmN0aW9uXG4gICAgICB9O1xuICAgIH1cbiAgfSxcblxuICByZWdpc3RlckRlZmF1bHQ6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdCgpIHt9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50TGlzdGVuZXI7IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEdldHMgdGhlIHNjcm9sbCBwb3NpdGlvbiBvZiB0aGUgc3VwcGxpZWQgZWxlbWVudCBvciB3aW5kb3cuXG4gKlxuICogVGhlIHJldHVybiB2YWx1ZXMgYXJlIHVuYm91bmRlZCwgdW5saWtlIGBnZXRTY3JvbGxQb3NpdGlvbmAuIFRoaXMgbWVhbnMgdGhleVxuICogbWF5IGJlIG5lZ2F0aXZlIG9yIGV4Y2VlZCB0aGUgZWxlbWVudCBib3VuZGFyaWVzICh3aGljaCBpcyBwb3NzaWJsZSB1c2luZ1xuICogaW5lcnRpYWwgc2Nyb2xsaW5nKS5cbiAqXG4gKiBAcGFyYW0ge0RPTVdpbmRvd3xET01FbGVtZW50fSBzY3JvbGxhYmxlXG4gKiBAcmV0dXJuIHtvYmplY3R9IE1hcCB3aXRoIGB4YCBhbmQgYHlgIGtleXMuXG4gKi9cblxuZnVuY3Rpb24gZ2V0VW5ib3VuZGVkU2Nyb2xsUG9zaXRpb24oc2Nyb2xsYWJsZSkge1xuICBpZiAoc2Nyb2xsYWJsZS5XaW5kb3cgJiYgc2Nyb2xsYWJsZSBpbnN0YW5jZW9mIHNjcm9sbGFibGUuV2luZG93KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHNjcm9sbGFibGUucGFnZVhPZmZzZXQgfHwgc2Nyb2xsYWJsZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCxcbiAgICAgIHk6IHNjcm9sbGFibGUucGFnZVlPZmZzZXQgfHwgc2Nyb2xsYWJsZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHg6IHNjcm9sbGFibGUuc2Nyb2xsTGVmdCxcbiAgICB5OiBzY3JvbGxhYmxlLnNjcm9sbFRvcFxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFVuYm91bmRlZFNjcm9sbFBvc2l0aW9uOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgRXZlbnRMaXN0ZW5lciA9IHJlcXVpcmUoJ2ZianMvbGliL0V2ZW50TGlzdGVuZXInKTtcbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG52YXIgUG9vbGVkQ2xhc3MgPSByZXF1aXJlKCcuL1Bvb2xlZENsYXNzJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpO1xuXG52YXIgZ2V0RXZlbnRUYXJnZXQgPSByZXF1aXJlKCcuL2dldEV2ZW50VGFyZ2V0Jyk7XG52YXIgZ2V0VW5ib3VuZGVkU2Nyb2xsUG9zaXRpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9nZXRVbmJvdW5kZWRTY3JvbGxQb3NpdGlvbicpO1xuXG4vKipcbiAqIEZpbmQgdGhlIGRlZXBlc3QgUmVhY3QgY29tcG9uZW50IGNvbXBsZXRlbHkgY29udGFpbmluZyB0aGUgcm9vdCBvZiB0aGVcbiAqIHBhc3NlZC1pbiBpbnN0YW5jZSAoZm9yIHVzZSB3aGVuIGVudGlyZSBSZWFjdCB0cmVlcyBhcmUgbmVzdGVkIHdpdGhpbiBlYWNoXG4gKiBvdGhlcikuIElmIFJlYWN0IHRyZWVzIGFyZSBub3QgbmVzdGVkLCByZXR1cm5zIG51bGwuXG4gKi9cbmZ1bmN0aW9uIGZpbmRQYXJlbnQoaW5zdCkge1xuICAvLyBUT0RPOiBJdCBtYXkgYmUgYSBnb29kIGlkZWEgdG8gY2FjaGUgdGhpcyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IERPTVxuICAvLyB0cmF2ZXJzYWwsIGJ1dCBjYWNoaW5nIGlzIGRpZmZpY3VsdCB0byBkbyBjb3JyZWN0bHkgd2l0aG91dCB1c2luZyBhXG4gIC8vIG11dGF0aW9uIG9ic2VydmVyIHRvIGxpc3RlbiBmb3IgYWxsIERPTSBjaGFuZ2VzLlxuICB3aGlsZSAoaW5zdC5faG9zdFBhcmVudCkge1xuICAgIGluc3QgPSBpbnN0Ll9ob3N0UGFyZW50O1xuICB9XG4gIHZhciByb290Tm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpO1xuICB2YXIgY29udGFpbmVyID0gcm9vdE5vZGUucGFyZW50Tm9kZTtcbiAgcmV0dXJuIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShjb250YWluZXIpO1xufVxuXG4vLyBVc2VkIHRvIHN0b3JlIGFuY2VzdG9yIGhpZXJhcmNoeSBpbiB0b3AgbGV2ZWwgY2FsbGJhY2tcbmZ1bmN0aW9uIFRvcExldmVsQ2FsbGJhY2tCb29rS2VlcGluZyh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSB7XG4gIHRoaXMudG9wTGV2ZWxUeXBlID0gdG9wTGV2ZWxUeXBlO1xuICB0aGlzLm5hdGl2ZUV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gIHRoaXMuYW5jZXN0b3JzID0gW107XG59XG5fYXNzaWduKFRvcExldmVsQ2FsbGJhY2tCb29rS2VlcGluZy5wcm90b3R5cGUsIHtcbiAgZGVzdHJ1Y3RvcjogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMudG9wTGV2ZWxUeXBlID0gbnVsbDtcbiAgICB0aGlzLm5hdGl2ZUV2ZW50ID0gbnVsbDtcbiAgICB0aGlzLmFuY2VzdG9ycy5sZW5ndGggPSAwO1xuICB9XG59KTtcblBvb2xlZENsYXNzLmFkZFBvb2xpbmdUbyhUb3BMZXZlbENhbGxiYWNrQm9va0tlZXBpbmcsIFBvb2xlZENsYXNzLnR3b0FyZ3VtZW50UG9vbGVyKTtcblxuZnVuY3Rpb24gaGFuZGxlVG9wTGV2ZWxJbXBsKGJvb2tLZWVwaW5nKSB7XG4gIHZhciBuYXRpdmVFdmVudFRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KGJvb2tLZWVwaW5nLm5hdGl2ZUV2ZW50KTtcbiAgdmFyIHRhcmdldEluc3QgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIC8vIExvb3AgdGhyb3VnaCB0aGUgaGllcmFyY2h5LCBpbiBjYXNlIHRoZXJlJ3MgYW55IG5lc3RlZCBjb21wb25lbnRzLlxuICAvLyBJdCdzIGltcG9ydGFudCB0aGF0IHdlIGJ1aWxkIHRoZSBhcnJheSBvZiBhbmNlc3RvcnMgYmVmb3JlIGNhbGxpbmcgYW55XG4gIC8vIGV2ZW50IGhhbmRsZXJzLCBiZWNhdXNlIGV2ZW50IGhhbmRsZXJzIGNhbiBtb2RpZnkgdGhlIERPTSwgbGVhZGluZyB0b1xuICAvLyBpbmNvbnNpc3RlbmNpZXMgd2l0aCBSZWFjdE1vdW50J3Mgbm9kZSBjYWNoZS4gU2VlICMxMTA1LlxuICB2YXIgYW5jZXN0b3IgPSB0YXJnZXRJbnN0O1xuICBkbyB7XG4gICAgYm9va0tlZXBpbmcuYW5jZXN0b3JzLnB1c2goYW5jZXN0b3IpO1xuICAgIGFuY2VzdG9yID0gYW5jZXN0b3IgJiYgZmluZFBhcmVudChhbmNlc3Rvcik7XG4gIH0gd2hpbGUgKGFuY2VzdG9yKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGJvb2tLZWVwaW5nLmFuY2VzdG9ycy5sZW5ndGg7IGkrKykge1xuICAgIHRhcmdldEluc3QgPSBib29rS2VlcGluZy5hbmNlc3RvcnNbaV07XG4gICAgUmVhY3RFdmVudExpc3RlbmVyLl9oYW5kbGVUb3BMZXZlbChib29rS2VlcGluZy50b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIGJvb2tLZWVwaW5nLm5hdGl2ZUV2ZW50LCBnZXRFdmVudFRhcmdldChib29rS2VlcGluZy5uYXRpdmVFdmVudCkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNjcm9sbFZhbHVlTW9uaXRvcihjYikge1xuICB2YXIgc2Nyb2xsUG9zaXRpb24gPSBnZXRVbmJvdW5kZWRTY3JvbGxQb3NpdGlvbih3aW5kb3cpO1xuICBjYihzY3JvbGxQb3NpdGlvbik7XG59XG5cbnZhciBSZWFjdEV2ZW50TGlzdGVuZXIgPSB7XG4gIF9lbmFibGVkOiB0cnVlLFxuICBfaGFuZGxlVG9wTGV2ZWw6IG51bGwsXG5cbiAgV0lORE9XX0hBTkRMRTogRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NID8gd2luZG93IDogbnVsbCxcblxuICBzZXRIYW5kbGVUb3BMZXZlbDogZnVuY3Rpb24gKGhhbmRsZVRvcExldmVsKSB7XG4gICAgUmVhY3RFdmVudExpc3RlbmVyLl9oYW5kbGVUb3BMZXZlbCA9IGhhbmRsZVRvcExldmVsO1xuICB9LFxuXG4gIHNldEVuYWJsZWQ6IGZ1bmN0aW9uIChlbmFibGVkKSB7XG4gICAgUmVhY3RFdmVudExpc3RlbmVyLl9lbmFibGVkID0gISFlbmFibGVkO1xuICB9LFxuXG4gIGlzRW5hYmxlZDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBSZWFjdEV2ZW50TGlzdGVuZXIuX2VuYWJsZWQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRyYXBzIHRvcC1sZXZlbCBldmVudHMgYnkgdXNpbmcgZXZlbnQgYnViYmxpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b3BMZXZlbFR5cGUgUmVjb3JkIGZyb20gYEV2ZW50Q29uc3RhbnRzYC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGhhbmRsZXJCYXNlTmFtZSBFdmVudCBuYW1lIChlLmcuIFwiY2xpY2tcIikuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBlbGVtZW50IEVsZW1lbnQgb24gd2hpY2ggdG8gYXR0YWNoIGxpc3RlbmVyLlxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBBbiBvYmplY3Qgd2l0aCBhIHJlbW92ZSBmdW5jdGlvbiB3aGljaCB3aWxsIGZvcmNlZnVsbHlcbiAgICogICAgICAgICAgICAgICAgICByZW1vdmUgdGhlIGxpc3RlbmVyLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHRyYXBCdWJibGVkRXZlbnQ6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIGhhbmRsZXJCYXNlTmFtZSwgZWxlbWVudCkge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBFdmVudExpc3RlbmVyLmxpc3RlbihlbGVtZW50LCBoYW5kbGVyQmFzZU5hbWUsIFJlYWN0RXZlbnRMaXN0ZW5lci5kaXNwYXRjaEV2ZW50LmJpbmQobnVsbCwgdG9wTGV2ZWxUeXBlKSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRyYXBzIGEgdG9wLWxldmVsIGV2ZW50IGJ5IHVzaW5nIGV2ZW50IGNhcHR1cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRvcExldmVsVHlwZSBSZWNvcmQgZnJvbSBgRXZlbnRDb25zdGFudHNgLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGFuZGxlckJhc2VOYW1lIEV2ZW50IG5hbWUgKGUuZy4gXCJjbGlja1wiKS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGVsZW1lbnQgRWxlbWVudCBvbiB3aGljaCB0byBhdHRhY2ggbGlzdGVuZXIuXG4gICAqIEByZXR1cm4gez9vYmplY3R9IEFuIG9iamVjdCB3aXRoIGEgcmVtb3ZlIGZ1bmN0aW9uIHdoaWNoIHdpbGwgZm9yY2VmdWxseVxuICAgKiAgICAgICAgICAgICAgICAgIHJlbW92ZSB0aGUgbGlzdGVuZXIuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdHJhcENhcHR1cmVkRXZlbnQ6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIGhhbmRsZXJCYXNlTmFtZSwgZWxlbWVudCkge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBFdmVudExpc3RlbmVyLmNhcHR1cmUoZWxlbWVudCwgaGFuZGxlckJhc2VOYW1lLCBSZWFjdEV2ZW50TGlzdGVuZXIuZGlzcGF0Y2hFdmVudC5iaW5kKG51bGwsIHRvcExldmVsVHlwZSkpO1xuICB9LFxuXG4gIG1vbml0b3JTY3JvbGxWYWx1ZTogZnVuY3Rpb24gKHJlZnJlc2gpIHtcbiAgICB2YXIgY2FsbGJhY2sgPSBzY3JvbGxWYWx1ZU1vbml0b3IuYmluZChudWxsLCByZWZyZXNoKTtcbiAgICBFdmVudExpc3RlbmVyLmxpc3Rlbih3aW5kb3csICdzY3JvbGwnLCBjYWxsYmFjayk7XG4gIH0sXG5cbiAgZGlzcGF0Y2hFdmVudDogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpIHtcbiAgICBpZiAoIVJlYWN0RXZlbnRMaXN0ZW5lci5fZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBib29rS2VlcGluZyA9IFRvcExldmVsQ2FsbGJhY2tCb29rS2VlcGluZy5nZXRQb29sZWQodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEV2ZW50IHF1ZXVlIGJlaW5nIHByb2Nlc3NlZCBpbiB0aGUgc2FtZSBjeWNsZSBhbGxvd3NcbiAgICAgIC8vIGBwcmV2ZW50RGVmYXVsdGAuXG4gICAgICBSZWFjdFVwZGF0ZXMuYmF0Y2hlZFVwZGF0ZXMoaGFuZGxlVG9wTGV2ZWxJbXBsLCBib29rS2VlcGluZyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIFRvcExldmVsQ2FsbGJhY2tCb29rS2VlcGluZy5yZWxlYXNlKGJvb2tLZWVwaW5nKTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RFdmVudExpc3RlbmVyOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBET01Qcm9wZXJ0eSA9IHJlcXVpcmUoJy4vRE9NUHJvcGVydHknKTtcbnZhciBFdmVudFBsdWdpbkh1YiA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5IdWInKTtcbnZhciBFdmVudFBsdWdpblV0aWxzID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpblV0aWxzJyk7XG52YXIgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCA9IHJlcXVpcmUoJy4vUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCcpO1xudmFyIFJlYWN0RW1wdHlDb21wb25lbnQgPSByZXF1aXJlKCcuL1JlYWN0RW1wdHlDb21wb25lbnQnKTtcbnZhciBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCcuL1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlcicpO1xudmFyIFJlYWN0SG9zdENvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RIb3N0Q29tcG9uZW50Jyk7XG52YXIgUmVhY3RVcGRhdGVzID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZXMnKTtcblxudmFyIFJlYWN0SW5qZWN0aW9uID0ge1xuICBDb21wb25lbnQ6IFJlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQuaW5qZWN0aW9uLFxuICBET01Qcm9wZXJ0eTogRE9NUHJvcGVydHkuaW5qZWN0aW9uLFxuICBFbXB0eUNvbXBvbmVudDogUmVhY3RFbXB0eUNvbXBvbmVudC5pbmplY3Rpb24sXG4gIEV2ZW50UGx1Z2luSHViOiBFdmVudFBsdWdpbkh1Yi5pbmplY3Rpb24sXG4gIEV2ZW50UGx1Z2luVXRpbHM6IEV2ZW50UGx1Z2luVXRpbHMuaW5qZWN0aW9uLFxuICBFdmVudEVtaXR0ZXI6IFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5pbmplY3Rpb24sXG4gIEhvc3RDb21wb25lbnQ6IFJlYWN0SG9zdENvbXBvbmVudC5pbmplY3Rpb24sXG4gIFVwZGF0ZXM6IFJlYWN0VXBkYXRlcy5pbmplY3Rpb25cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RJbmplY3Rpb247IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBHaXZlbiBhbnkgbm9kZSByZXR1cm4gdGhlIGZpcnN0IGxlYWYgbm9kZSB3aXRob3V0IGNoaWxkcmVuLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHJldHVybiB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX1cbiAqL1xuXG5mdW5jdGlvbiBnZXRMZWFmTm9kZShub2RlKSB7XG4gIHdoaWxlIChub2RlICYmIG5vZGUuZmlyc3RDaGlsZCkge1xuICAgIG5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gIH1cbiAgcmV0dXJuIG5vZGU7XG59XG5cbi8qKlxuICogR2V0IHRoZSBuZXh0IHNpYmxpbmcgd2l0aGluIGEgY29udGFpbmVyLiBUaGlzIHdpbGwgd2FsayB1cCB0aGVcbiAqIERPTSBpZiBhIG5vZGUncyBzaWJsaW5ncyBoYXZlIGJlZW4gZXhoYXVzdGVkLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHJldHVybiB7P0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9XG4gKi9cbmZ1bmN0aW9uIGdldFNpYmxpbmdOb2RlKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5uZXh0U2libGluZykge1xuICAgICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XG4gICAgfVxuICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIG5vZGVzIHdoaWNoIGNvbnRhaW4gY2hhcmFjdGVycyBhdCBvZmZzZXQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSByb290XG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KHJvb3QsIG9mZnNldCkge1xuICB2YXIgbm9kZSA9IGdldExlYWZOb2RlKHJvb3QpO1xuICB2YXIgbm9kZVN0YXJ0ID0gMDtcbiAgdmFyIG5vZGVFbmQgPSAwO1xuXG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgIG5vZGVFbmQgPSBub2RlU3RhcnQgKyBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcblxuICAgICAgaWYgKG5vZGVTdGFydCA8PSBvZmZzZXQgJiYgbm9kZUVuZCA+PSBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgIG9mZnNldDogb2Zmc2V0IC0gbm9kZVN0YXJ0XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIG5vZGVTdGFydCA9IG5vZGVFbmQ7XG4gICAgfVxuXG4gICAgbm9kZSA9IGdldExlYWZOb2RlKGdldFNpYmxpbmdOb2RlKG5vZGUpKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gcmVxdWlyZSgnZmJqcy9saWIvRXhlY3V0aW9uRW52aXJvbm1lbnQnKTtcblxudmFyIGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQgPSByZXF1aXJlKCcuL2dldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQnKTtcbnZhciBnZXRUZXh0Q29udGVudEFjY2Vzc29yID0gcmVxdWlyZSgnLi9nZXRUZXh0Q29udGVudEFjY2Vzc29yJyk7XG5cbi8qKlxuICogV2hpbGUgYGlzQ29sbGFwc2VkYCBpcyBhdmFpbGFibGUgb24gdGhlIFNlbGVjdGlvbiBvYmplY3QgYW5kIGBjb2xsYXBzZWRgXG4gKiBpcyBhdmFpbGFibGUgb24gdGhlIFJhbmdlIG9iamVjdCwgSUUxMSBzb21ldGltZXMgZ2V0cyB0aGVtIHdyb25nLlxuICogSWYgdGhlIGFuY2hvci9mb2N1cyBub2RlcyBhbmQgb2Zmc2V0cyBhcmUgdGhlIHNhbWUsIHRoZSByYW5nZSBpcyBjb2xsYXBzZWQuXG4gKi9cbmZ1bmN0aW9uIGlzQ29sbGFwc2VkKGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCkge1xuICByZXR1cm4gYW5jaG9yTm9kZSA9PT0gZm9jdXNOb2RlICYmIGFuY2hvck9mZnNldCA9PT0gZm9jdXNPZmZzZXQ7XG59XG5cbi8qKlxuICogR2V0IHRoZSBhcHByb3ByaWF0ZSBhbmNob3IgYW5kIGZvY3VzIG5vZGUvb2Zmc2V0IHBhaXJzIGZvciBJRS5cbiAqXG4gKiBUaGUgY2F0Y2ggaGVyZSBpcyB0aGF0IElFJ3Mgc2VsZWN0aW9uIEFQSSBkb2Vzbid0IHByb3ZpZGUgaW5mb3JtYXRpb25cbiAqIGFib3V0IHdoZXRoZXIgdGhlIHNlbGVjdGlvbiBpcyBmb3J3YXJkIG9yIGJhY2t3YXJkLCBzbyB3ZSBoYXZlIHRvXG4gKiBiZWhhdmUgYXMgdGhvdWdoIGl0J3MgYWx3YXlzIGZvcndhcmQuXG4gKlxuICogSUUgdGV4dCBkaWZmZXJzIGZyb20gbW9kZXJuIHNlbGVjdGlvbiBpbiB0aGF0IGl0IGJlaGF2ZXMgYXMgdGhvdWdoXG4gKiBibG9jayBlbGVtZW50cyBlbmQgd2l0aCBhIG5ldyBsaW5lLiBUaGlzIG1lYW5zIGNoYXJhY3RlciBvZmZzZXRzIHdpbGxcbiAqIGRpZmZlciBiZXR3ZWVuIHRoZSB0d28gQVBJcy5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZnVuY3Rpb24gZ2V0SUVPZmZzZXRzKG5vZGUpIHtcbiAgdmFyIHNlbGVjdGlvbiA9IGRvY3VtZW50LnNlbGVjdGlvbjtcbiAgdmFyIHNlbGVjdGVkUmFuZ2UgPSBzZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtcbiAgdmFyIHNlbGVjdGVkTGVuZ3RoID0gc2VsZWN0ZWRSYW5nZS50ZXh0Lmxlbmd0aDtcblxuICAvLyBEdXBsaWNhdGUgc2VsZWN0aW9uIHNvIHdlIGNhbiBtb3ZlIHJhbmdlIHdpdGhvdXQgYnJlYWtpbmcgdXNlciBzZWxlY3Rpb24uXG4gIHZhciBmcm9tU3RhcnQgPSBzZWxlY3RlZFJhbmdlLmR1cGxpY2F0ZSgpO1xuICBmcm9tU3RhcnQubW92ZVRvRWxlbWVudFRleHQobm9kZSk7XG4gIGZyb21TdGFydC5zZXRFbmRQb2ludCgnRW5kVG9TdGFydCcsIHNlbGVjdGVkUmFuZ2UpO1xuXG4gIHZhciBzdGFydE9mZnNldCA9IGZyb21TdGFydC50ZXh0Lmxlbmd0aDtcbiAgdmFyIGVuZE9mZnNldCA9IHN0YXJ0T2Zmc2V0ICsgc2VsZWN0ZWRMZW5ndGg7XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydDogc3RhcnRPZmZzZXQsXG4gICAgZW5kOiBlbmRPZmZzZXRcbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEByZXR1cm4gez9vYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGdldE1vZGVybk9mZnNldHMobm9kZSkge1xuICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbiAmJiB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBhbmNob3JOb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGU7XG4gIHZhciBhbmNob3JPZmZzZXQgPSBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0O1xuICB2YXIgZm9jdXNOb2RlID0gc2VsZWN0aW9uLmZvY3VzTm9kZTtcbiAgdmFyIGZvY3VzT2Zmc2V0ID0gc2VsZWN0aW9uLmZvY3VzT2Zmc2V0O1xuXG4gIHZhciBjdXJyZW50UmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcblxuICAvLyBJbiBGaXJlZm94LCByYW5nZS5zdGFydENvbnRhaW5lciBhbmQgcmFuZ2UuZW5kQ29udGFpbmVyIGNhbiBiZSBcImFub255bW91c1xuICAvLyBkaXZzXCIsIGUuZy4gdGhlIHVwL2Rvd24gYnV0dG9ucyBvbiBhbiA8aW5wdXQgdHlwZT1cIm51bWJlclwiPi4gQW5vbnltb3VzXG4gIC8vIGRpdnMgZG8gbm90IHNlZW0gdG8gZXhwb3NlIHByb3BlcnRpZXMsIHRyaWdnZXJpbmcgYSBcIlBlcm1pc3Npb24gZGVuaWVkXG4gIC8vIGVycm9yXCIgaWYgYW55IG9mIGl0cyBwcm9wZXJ0aWVzIGFyZSBhY2Nlc3NlZC4gVGhlIG9ubHkgc2VlbWluZ2x5IHBvc3NpYmxlXG4gIC8vIHdheSB0byBhdm9pZCBlcnJvcmluZyBpcyB0byBhY2Nlc3MgYSBwcm9wZXJ0eSB0aGF0IHR5cGljYWxseSB3b3JrcyBmb3JcbiAgLy8gbm9uLWFub255bW91cyBkaXZzIGFuZCBjYXRjaCBhbnkgZXJyb3IgdGhhdCBtYXkgb3RoZXJ3aXNlIGFyaXNlLiBTZWVcbiAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjA4NDI3XG4gIHRyeSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gICAgY3VycmVudFJhbmdlLnN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlO1xuICAgIGN1cnJlbnRSYW5nZS5lbmRDb250YWluZXIubm9kZVR5cGU7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtZXhwcmVzc2lvbnMgKi9cbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gSWYgdGhlIG5vZGUgYW5kIG9mZnNldCB2YWx1ZXMgYXJlIHRoZSBzYW1lLCB0aGUgc2VsZWN0aW9uIGlzIGNvbGxhcHNlZC5cbiAgLy8gYFNlbGVjdGlvbi5pc0NvbGxhcHNlZGAgaXMgYXZhaWxhYmxlIG5hdGl2ZWx5LCBidXQgSUUgc29tZXRpbWVzIGdldHNcbiAgLy8gdGhpcyB2YWx1ZSB3cm9uZy5cbiAgdmFyIGlzU2VsZWN0aW9uQ29sbGFwc2VkID0gaXNDb2xsYXBzZWQoc2VsZWN0aW9uLmFuY2hvck5vZGUsIHNlbGVjdGlvbi5hbmNob3JPZmZzZXQsIHNlbGVjdGlvbi5mb2N1c05vZGUsIHNlbGVjdGlvbi5mb2N1c09mZnNldCk7XG5cbiAgdmFyIHJhbmdlTGVuZ3RoID0gaXNTZWxlY3Rpb25Db2xsYXBzZWQgPyAwIDogY3VycmVudFJhbmdlLnRvU3RyaW5nKCkubGVuZ3RoO1xuXG4gIHZhciB0ZW1wUmFuZ2UgPSBjdXJyZW50UmFuZ2UuY2xvbmVSYW5nZSgpO1xuICB0ZW1wUmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKG5vZGUpO1xuICB0ZW1wUmFuZ2Uuc2V0RW5kKGN1cnJlbnRSYW5nZS5zdGFydENvbnRhaW5lciwgY3VycmVudFJhbmdlLnN0YXJ0T2Zmc2V0KTtcblxuICB2YXIgaXNUZW1wUmFuZ2VDb2xsYXBzZWQgPSBpc0NvbGxhcHNlZCh0ZW1wUmFuZ2Uuc3RhcnRDb250YWluZXIsIHRlbXBSYW5nZS5zdGFydE9mZnNldCwgdGVtcFJhbmdlLmVuZENvbnRhaW5lciwgdGVtcFJhbmdlLmVuZE9mZnNldCk7XG5cbiAgdmFyIHN0YXJ0ID0gaXNUZW1wUmFuZ2VDb2xsYXBzZWQgPyAwIDogdGVtcFJhbmdlLnRvU3RyaW5nKCkubGVuZ3RoO1xuICB2YXIgZW5kID0gc3RhcnQgKyByYW5nZUxlbmd0aDtcblxuICAvLyBEZXRlY3Qgd2hldGhlciB0aGUgc2VsZWN0aW9uIGlzIGJhY2t3YXJkLlxuICB2YXIgZGV0ZWN0aW9uUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICBkZXRlY3Rpb25SYW5nZS5zZXRTdGFydChhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQpO1xuICBkZXRlY3Rpb25SYW5nZS5zZXRFbmQoZm9jdXNOb2RlLCBmb2N1c09mZnNldCk7XG4gIHZhciBpc0JhY2t3YXJkID0gZGV0ZWN0aW9uUmFuZ2UuY29sbGFwc2VkO1xuXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IGlzQmFja3dhcmQgPyBlbmQgOiBzdGFydCxcbiAgICBlbmQ6IGlzQmFja3dhcmQgPyBzdGFydCA6IGVuZFxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHBhcmFtIHtvYmplY3R9IG9mZnNldHNcbiAqL1xuZnVuY3Rpb24gc2V0SUVPZmZzZXRzKG5vZGUsIG9mZnNldHMpIHtcbiAgdmFyIHJhbmdlID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkuZHVwbGljYXRlKCk7XG4gIHZhciBzdGFydCwgZW5kO1xuXG4gIGlmIChvZmZzZXRzLmVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhcnQgPSBvZmZzZXRzLnN0YXJ0O1xuICAgIGVuZCA9IHN0YXJ0O1xuICB9IGVsc2UgaWYgKG9mZnNldHMuc3RhcnQgPiBvZmZzZXRzLmVuZCkge1xuICAgIHN0YXJ0ID0gb2Zmc2V0cy5lbmQ7XG4gICAgZW5kID0gb2Zmc2V0cy5zdGFydDtcbiAgfSBlbHNlIHtcbiAgICBzdGFydCA9IG9mZnNldHMuc3RhcnQ7XG4gICAgZW5kID0gb2Zmc2V0cy5lbmQ7XG4gIH1cblxuICByYW5nZS5tb3ZlVG9FbGVtZW50VGV4dChub2RlKTtcbiAgcmFuZ2UubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCBzdGFydCk7XG4gIHJhbmdlLnNldEVuZFBvaW50KCdFbmRUb1N0YXJ0JywgcmFuZ2UpO1xuICByYW5nZS5tb3ZlRW5kKCdjaGFyYWN0ZXInLCBlbmQgLSBzdGFydCk7XG4gIHJhbmdlLnNlbGVjdCgpO1xufVxuXG4vKipcbiAqIEluIG1vZGVybiBub24tSUUgYnJvd3NlcnMsIHdlIGNhbiBzdXBwb3J0IGJvdGggZm9yd2FyZCBhbmQgYmFja3dhcmRcbiAqIHNlbGVjdGlvbnMuXG4gKlxuICogTm90ZTogSUUxMCsgc3VwcG9ydHMgdGhlIFNlbGVjdGlvbiBvYmplY3QsIGJ1dCBpdCBkb2VzIG5vdCBzdXBwb3J0XG4gKiB0aGUgYGV4dGVuZGAgbWV0aG9kLCB3aGljaCBtZWFucyB0aGF0IGV2ZW4gaW4gbW9kZXJuIElFLCBpdCdzIG5vdCBwb3NzaWJsZVxuICogdG8gcHJvZ3JhbW1hdGljYWxseSBjcmVhdGUgYSBiYWNrd2FyZCBzZWxlY3Rpb24uIFRodXMsIGZvciBhbGwgSUVcbiAqIHZlcnNpb25zLCB3ZSB1c2UgdGhlIG9sZCBJRSBBUEkgdG8gY3JlYXRlIG91ciBzZWxlY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHBhcmFtIHtvYmplY3R9IG9mZnNldHNcbiAqL1xuZnVuY3Rpb24gc2V0TW9kZXJuT2Zmc2V0cyhub2RlLCBvZmZzZXRzKSB7XG4gIGlmICghd2luZG93LmdldFNlbGVjdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gIHZhciBsZW5ndGggPSBub2RlW2dldFRleHRDb250ZW50QWNjZXNzb3IoKV0ubGVuZ3RoO1xuICB2YXIgc3RhcnQgPSBNYXRoLm1pbihvZmZzZXRzLnN0YXJ0LCBsZW5ndGgpO1xuICB2YXIgZW5kID0gb2Zmc2V0cy5lbmQgPT09IHVuZGVmaW5lZCA/IHN0YXJ0IDogTWF0aC5taW4ob2Zmc2V0cy5lbmQsIGxlbmd0aCk7XG5cbiAgLy8gSUUgMTEgdXNlcyBtb2Rlcm4gc2VsZWN0aW9uLCBidXQgZG9lc24ndCBzdXBwb3J0IHRoZSBleHRlbmQgbWV0aG9kLlxuICAvLyBGbGlwIGJhY2t3YXJkIHNlbGVjdGlvbnMsIHNvIHdlIGNhbiBzZXQgd2l0aCBhIHNpbmdsZSByYW5nZS5cbiAgaWYgKCFzZWxlY3Rpb24uZXh0ZW5kICYmIHN0YXJ0ID4gZW5kKSB7XG4gICAgdmFyIHRlbXAgPSBlbmQ7XG4gICAgZW5kID0gc3RhcnQ7XG4gICAgc3RhcnQgPSB0ZW1wO1xuICB9XG5cbiAgdmFyIHN0YXJ0TWFya2VyID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChub2RlLCBzdGFydCk7XG4gIHZhciBlbmRNYXJrZXIgPSBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KG5vZGUsIGVuZCk7XG5cbiAgaWYgKHN0YXJ0TWFya2VyICYmIGVuZE1hcmtlcikge1xuICAgIHZhciByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2V0U3RhcnQoc3RhcnRNYXJrZXIubm9kZSwgc3RhcnRNYXJrZXIub2Zmc2V0KTtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG5cbiAgICBpZiAoc3RhcnQgPiBlbmQpIHtcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICBzZWxlY3Rpb24uZXh0ZW5kKGVuZE1hcmtlci5ub2RlLCBlbmRNYXJrZXIub2Zmc2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmFuZ2Uuc2V0RW5kKGVuZE1hcmtlci5ub2RlLCBlbmRNYXJrZXIub2Zmc2V0KTtcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgfVxuICB9XG59XG5cbnZhciB1c2VJRU9mZnNldHMgPSBFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gJiYgJ3NlbGVjdGlvbicgaW4gZG9jdW1lbnQgJiYgISgnZ2V0U2VsZWN0aW9uJyBpbiB3aW5kb3cpO1xuXG52YXIgUmVhY3RET01TZWxlY3Rpb24gPSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAgICovXG4gIGdldE9mZnNldHM6IHVzZUlFT2Zmc2V0cyA/IGdldElFT2Zmc2V0cyA6IGdldE1vZGVybk9mZnNldHMsXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICAgKiBAcGFyYW0ge29iamVjdH0gb2Zmc2V0c1xuICAgKi9cbiAgc2V0T2Zmc2V0czogdXNlSUVPZmZzZXRzID8gc2V0SUVPZmZzZXRzIDogc2V0TW9kZXJuT2Zmc2V0c1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTVNlbGVjdGlvbjsiLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbi8qKlxuICogQHBhcmFtIHsqfSBvYmplY3QgVGhlIG9iamVjdCB0byBjaGVjay5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgb3Igbm90IHRoZSBvYmplY3QgaXMgYSBET00gbm9kZS5cbiAqL1xuZnVuY3Rpb24gaXNOb2RlKG9iamVjdCkge1xuICB2YXIgZG9jID0gb2JqZWN0ID8gb2JqZWN0Lm93bmVyRG9jdW1lbnQgfHwgb2JqZWN0IDogZG9jdW1lbnQ7XG4gIHZhciBkZWZhdWx0VmlldyA9IGRvYy5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gIHJldHVybiAhIShvYmplY3QgJiYgKHR5cGVvZiBkZWZhdWx0Vmlldy5Ob2RlID09PSAnZnVuY3Rpb24nID8gb2JqZWN0IGluc3RhbmNlb2YgZGVmYXVsdFZpZXcuTm9kZSA6IHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIHR5cGVvZiBvYmplY3Qubm9kZVR5cGUgPT09ICdudW1iZXInICYmIHR5cGVvZiBvYmplY3Qubm9kZU5hbWUgPT09ICdzdHJpbmcnKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNOb2RlOyIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxudmFyIGlzTm9kZSA9IHJlcXVpcmUoJy4vaXNOb2RlJyk7XG5cbi8qKlxuICogQHBhcmFtIHsqfSBvYmplY3QgVGhlIG9iamVjdCB0byBjaGVjay5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgb3Igbm90IHRoZSBvYmplY3QgaXMgYSBET00gdGV4dCBub2RlLlxuICovXG5mdW5jdGlvbiBpc1RleHROb2RlKG9iamVjdCkge1xuICByZXR1cm4gaXNOb2RlKG9iamVjdCkgJiYgb2JqZWN0Lm5vZGVUeXBlID09IDM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNUZXh0Tm9kZTsiLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG52YXIgaXNUZXh0Tm9kZSA9IHJlcXVpcmUoJy4vaXNUZXh0Tm9kZScpO1xuXG4vKmVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UgKi9cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBET00gbm9kZSBjb250YWlucyBvciBpcyBhbm90aGVyIERPTSBub2RlLlxuICovXG5mdW5jdGlvbiBjb250YWluc05vZGUob3V0ZXJOb2RlLCBpbm5lck5vZGUpIHtcbiAgaWYgKCFvdXRlck5vZGUgfHwgIWlubmVyTm9kZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChvdXRlck5vZGUgPT09IGlubmVyTm9kZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGlzVGV4dE5vZGUob3V0ZXJOb2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChpc1RleHROb2RlKGlubmVyTm9kZSkpIHtcbiAgICByZXR1cm4gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlLnBhcmVudE5vZGUpO1xuICB9IGVsc2UgaWYgKCdjb250YWlucycgaW4gb3V0ZXJOb2RlKSB7XG4gICAgcmV0dXJuIG91dGVyTm9kZS5jb250YWlucyhpbm5lck5vZGUpO1xuICB9IGVsc2UgaWYgKG91dGVyTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgIHJldHVybiAhIShvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaW5uZXJOb2RlKSAmIDE2KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb250YWluc05vZGU7IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHR5cGVjaGVja3NcbiAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBmYi13d3cvdHlwZW9mLXVuZGVmaW5lZCAqL1xuXG4vKipcbiAqIFNhbWUgYXMgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBidXQgd3JhcHMgaW4gYSB0cnktY2F0Y2ggYmxvY2suIEluIElFIGl0IGlzXG4gKiBub3Qgc2FmZSB0byBjYWxsIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaWYgdGhlcmUgaXMgbm90aGluZyBmb2N1c2VkLlxuICpcbiAqIFRoZSBhY3RpdmVFbGVtZW50IHdpbGwgYmUgbnVsbCBvbmx5IGlmIHRoZSBkb2N1bWVudCBvciBkb2N1bWVudCBib2R5IGlzIG5vdFxuICogeWV0IGRlZmluZWQuXG4gKlxuICogQHBhcmFtIHs/RE9NRG9jdW1lbnR9IGRvYyBEZWZhdWx0cyB0byBjdXJyZW50IGRvY3VtZW50LlxuICogQHJldHVybiB7P0RPTUVsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIGdldEFjdGl2ZUVsZW1lbnQoZG9jKSAvKj9ET01FbGVtZW50Ki97XG4gIGRvYyA9IGRvYyB8fCAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IGRvY3VtZW50IDogdW5kZWZpbmVkKTtcbiAgaWYgKHR5cGVvZiBkb2MgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gZG9jLmFjdGl2ZUVsZW1lbnQgfHwgZG9jLmJvZHk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZG9jLmJvZHk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRBY3RpdmVFbGVtZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdERPTVNlbGVjdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RET01TZWxlY3Rpb24nKTtcblxudmFyIGNvbnRhaW5zTm9kZSA9IHJlcXVpcmUoJ2ZianMvbGliL2NvbnRhaW5zTm9kZScpO1xudmFyIGZvY3VzTm9kZSA9IHJlcXVpcmUoJ2ZianMvbGliL2ZvY3VzTm9kZScpO1xudmFyIGdldEFjdGl2ZUVsZW1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9nZXRBY3RpdmVFbGVtZW50Jyk7XG5cbmZ1bmN0aW9uIGlzSW5Eb2N1bWVudChub2RlKSB7XG4gIHJldHVybiBjb250YWluc05vZGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBub2RlKTtcbn1cblxuLyoqXG4gKiBAUmVhY3RJbnB1dFNlbGVjdGlvbjogUmVhY3QgaW5wdXQgc2VsZWN0aW9uIG1vZHVsZS4gQmFzZWQgb24gU2VsZWN0aW9uLmpzLFxuICogYnV0IG1vZGlmaWVkIHRvIGJlIHN1aXRhYmxlIGZvciByZWFjdCBhbmQgaGFzIGEgY291cGxlIG9mIGJ1ZyBmaXhlcyAoZG9lc24ndFxuICogYXNzdW1lIGJ1dHRvbnMgaGF2ZSByYW5nZSBzZWxlY3Rpb25zIGFsbG93ZWQpLlxuICogSW5wdXQgc2VsZWN0aW9uIG1vZHVsZSBmb3IgUmVhY3QuXG4gKi9cbnZhciBSZWFjdElucHV0U2VsZWN0aW9uID0ge1xuICBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXM6IGZ1bmN0aW9uIChlbGVtKSB7XG4gICAgdmFyIG5vZGVOYW1lID0gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gbm9kZU5hbWUgJiYgKG5vZGVOYW1lID09PSAnaW5wdXQnICYmIGVsZW0udHlwZSA9PT0gJ3RleHQnIHx8IG5vZGVOYW1lID09PSAndGV4dGFyZWEnIHx8IGVsZW0uY29udGVudEVkaXRhYmxlID09PSAndHJ1ZScpO1xuICB9LFxuXG4gIGdldFNlbGVjdGlvbkluZm9ybWF0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxlbWVudCgpO1xuICAgIHJldHVybiB7XG4gICAgICBmb2N1c2VkRWxlbTogZm9jdXNlZEVsZW0sXG4gICAgICBzZWxlY3Rpb25SYW5nZTogUmVhY3RJbnB1dFNlbGVjdGlvbi5oYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZm9jdXNlZEVsZW0pID8gUmVhY3RJbnB1dFNlbGVjdGlvbi5nZXRTZWxlY3Rpb24oZm9jdXNlZEVsZW0pIDogbnVsbFxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIEByZXN0b3JlU2VsZWN0aW9uOiBJZiBhbnkgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHdhcyBwb3RlbnRpYWxseSBsb3N0LFxuICAgKiByZXN0b3JlIGl0LiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHBlcmZvcm1pbmcgb3BlcmF0aW9ucyB0aGF0IGNvdWxkIHJlbW92ZSBkb21cbiAgICogbm9kZXMgYW5kIHBsYWNlIHRoZW0gYmFjayBpbiwgcmVzdWx0aW5nIGluIGZvY3VzIGJlaW5nIGxvc3QuXG4gICAqL1xuICByZXN0b3JlU2VsZWN0aW9uOiBmdW5jdGlvbiAocHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbikge1xuICAgIHZhciBjdXJGb2N1c2VkRWxlbSA9IGdldEFjdGl2ZUVsZW1lbnQoKTtcbiAgICB2YXIgcHJpb3JGb2N1c2VkRWxlbSA9IHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24uZm9jdXNlZEVsZW07XG4gICAgdmFyIHByaW9yU2VsZWN0aW9uUmFuZ2UgPSBwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uLnNlbGVjdGlvblJhbmdlO1xuICAgIGlmIChjdXJGb2N1c2VkRWxlbSAhPT0gcHJpb3JGb2N1c2VkRWxlbSAmJiBpc0luRG9jdW1lbnQocHJpb3JGb2N1c2VkRWxlbSkpIHtcbiAgICAgIGlmIChSZWFjdElucHV0U2VsZWN0aW9uLmhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhwcmlvckZvY3VzZWRFbGVtKSkge1xuICAgICAgICBSZWFjdElucHV0U2VsZWN0aW9uLnNldFNlbGVjdGlvbihwcmlvckZvY3VzZWRFbGVtLCBwcmlvclNlbGVjdGlvblJhbmdlKTtcbiAgICAgIH1cbiAgICAgIGZvY3VzTm9kZShwcmlvckZvY3VzZWRFbGVtKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBnZXRTZWxlY3Rpb246IEdldHMgdGhlIHNlbGVjdGlvbiBib3VuZHMgb2YgYSBmb2N1c2VkIHRleHRhcmVhLCBpbnB1dCBvclxuICAgKiBjb250ZW50RWRpdGFibGUgbm9kZS5cbiAgICogLUBpbnB1dDogTG9vayB1cCBzZWxlY3Rpb24gYm91bmRzIG9mIHRoaXMgaW5wdXRcbiAgICogLUByZXR1cm4ge3N0YXJ0OiBzZWxlY3Rpb25TdGFydCwgZW5kOiBzZWxlY3Rpb25FbmR9XG4gICAqL1xuICBnZXRTZWxlY3Rpb246IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgIHZhciBzZWxlY3Rpb247XG5cbiAgICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgICAgLy8gTW9kZXJuIGJyb3dzZXIgd2l0aCBpbnB1dCBvciB0ZXh0YXJlYS5cbiAgICAgIHNlbGVjdGlvbiA9IHtcbiAgICAgICAgc3RhcnQ6IGlucHV0LnNlbGVjdGlvblN0YXJ0LFxuICAgICAgICBlbmQ6IGlucHV0LnNlbGVjdGlvbkVuZFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LnNlbGVjdGlvbiAmJiBpbnB1dC5ub2RlTmFtZSAmJiBpbnB1dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnKSB7XG4gICAgICAvLyBJRTggaW5wdXQuXG4gICAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtcbiAgICAgIC8vIFRoZXJlIGNhbiBvbmx5IGJlIG9uZSBzZWxlY3Rpb24gcGVyIGRvY3VtZW50IGluIElFLCBzbyBpdCBtdXN0XG4gICAgICAvLyBiZSBpbiBvdXIgZWxlbWVudC5cbiAgICAgIGlmIChyYW5nZS5wYXJlbnRFbGVtZW50KCkgPT09IGlucHV0KSB7XG4gICAgICAgIHNlbGVjdGlvbiA9IHtcbiAgICAgICAgICBzdGFydDogLXJhbmdlLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgLWlucHV0LnZhbHVlLmxlbmd0aCksXG4gICAgICAgICAgZW5kOiAtcmFuZ2UubW92ZUVuZCgnY2hhcmFjdGVyJywgLWlucHV0LnZhbHVlLmxlbmd0aClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udGVudCBlZGl0YWJsZSBvciBvbGQgSUUgdGV4dGFyZWEuXG4gICAgICBzZWxlY3Rpb24gPSBSZWFjdERPTVNlbGVjdGlvbi5nZXRPZmZzZXRzKGlucHV0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0aW9uIHx8IHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBAc2V0U2VsZWN0aW9uOiBTZXRzIHRoZSBzZWxlY3Rpb24gYm91bmRzIG9mIGEgdGV4dGFyZWEgb3IgaW5wdXQgYW5kIGZvY3VzZXNcbiAgICogdGhlIGlucHV0LlxuICAgKiAtQGlucHV0ICAgICBTZXQgc2VsZWN0aW9uIGJvdW5kcyBvZiB0aGlzIGlucHV0IG9yIHRleHRhcmVhXG4gICAqIC1Ab2Zmc2V0cyAgIE9iamVjdCBvZiBzYW1lIGZvcm0gdGhhdCBpcyByZXR1cm5lZCBmcm9tIGdldCpcbiAgICovXG4gIHNldFNlbGVjdGlvbjogZnVuY3Rpb24gKGlucHV0LCBvZmZzZXRzKSB7XG4gICAgdmFyIHN0YXJ0ID0gb2Zmc2V0cy5zdGFydDtcbiAgICB2YXIgZW5kID0gb2Zmc2V0cy5lbmQ7XG4gICAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmQgPSBzdGFydDtcbiAgICB9XG5cbiAgICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgICAgaW5wdXQuc2VsZWN0aW9uU3RhcnQgPSBzdGFydDtcbiAgICAgIGlucHV0LnNlbGVjdGlvbkVuZCA9IE1hdGgubWluKGVuZCwgaW5wdXQudmFsdWUubGVuZ3RoKTtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LnNlbGVjdGlvbiAmJiBpbnB1dC5ub2RlTmFtZSAmJiBpbnB1dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnKSB7XG4gICAgICB2YXIgcmFuZ2UgPSBpbnB1dC5jcmVhdGVUZXh0UmFuZ2UoKTtcbiAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgcmFuZ2UubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCBzdGFydCk7XG4gICAgICByYW5nZS5tb3ZlRW5kKCdjaGFyYWN0ZXInLCBlbmQgLSBzdGFydCk7XG4gICAgICByYW5nZS5zZWxlY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3RET01TZWxlY3Rpb24uc2V0T2Zmc2V0cyhpbnB1dCwgb2Zmc2V0cyk7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0SW5wdXRTZWxlY3Rpb247IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBDYWxsYmFja1F1ZXVlID0gcmVxdWlyZSgnLi9DYWxsYmFja1F1ZXVlJyk7XG52YXIgUG9vbGVkQ2xhc3MgPSByZXF1aXJlKCcuL1Bvb2xlZENsYXNzJyk7XG52YXIgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnLi9SZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXInKTtcbnZhciBSZWFjdElucHV0U2VsZWN0aW9uID0gcmVxdWlyZSgnLi9SZWFjdElucHV0U2VsZWN0aW9uJyk7XG52YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSByZXF1aXJlKCcuL1JlYWN0SW5zdHJ1bWVudGF0aW9uJyk7XG52YXIgVHJhbnNhY3Rpb24gPSByZXF1aXJlKCcuL1RyYW5zYWN0aW9uJyk7XG52YXIgUmVhY3RVcGRhdGVRdWV1ZSA9IHJlcXVpcmUoJy4vUmVhY3RVcGRhdGVRdWV1ZScpO1xuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCwgd2hlbiBwb3NzaWJsZSwgdGhlIHNlbGVjdGlvbiByYW5nZSAoY3VycmVudGx5IHNlbGVjdGVkIHRleHRcbiAqIGlucHV0KSBpcyBub3QgZGlzdHVyYmVkIGJ5IHBlcmZvcm1pbmcgdGhlIHRyYW5zYWN0aW9uLlxuICovXG52YXIgU0VMRUNUSU9OX1JFU1RPUkFUSU9OID0ge1xuICAvKipcbiAgICogQHJldHVybiB7U2VsZWN0aW9ufSBTZWxlY3Rpb24gaW5mb3JtYXRpb24uXG4gICAqL1xuICBpbml0aWFsaXplOiBSZWFjdElucHV0U2VsZWN0aW9uLmdldFNlbGVjdGlvbkluZm9ybWF0aW9uLFxuICAvKipcbiAgICogQHBhcmFtIHtTZWxlY3Rpb259IHNlbCBTZWxlY3Rpb24gaW5mb3JtYXRpb24gcmV0dXJuZWQgZnJvbSBgaW5pdGlhbGl6ZWAuXG4gICAqL1xuICBjbG9zZTogUmVhY3RJbnB1dFNlbGVjdGlvbi5yZXN0b3JlU2VsZWN0aW9uXG59O1xuXG4vKipcbiAqIFN1cHByZXNzZXMgZXZlbnRzIChibHVyL2ZvY3VzKSB0aGF0IGNvdWxkIGJlIGluYWR2ZXJ0ZW50bHkgZGlzcGF0Y2hlZCBkdWUgdG9cbiAqIGhpZ2ggbGV2ZWwgRE9NIG1hbmlwdWxhdGlvbnMgKGxpa2UgdGVtcG9yYXJpbHkgcmVtb3ZpbmcgYSB0ZXh0IGlucHV0IGZyb20gdGhlXG4gKiBET00pLlxuICovXG52YXIgRVZFTlRfU1VQUFJFU1NJT04gPSB7XG4gIC8qKlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUaGUgZW5hYmxlZCBzdGF0dXMgb2YgYFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlcmAgYmVmb3JlXG4gICAqIHRoZSByZWNvbmNpbGlhdGlvbi5cbiAgICovXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY3VycmVudGx5RW5hYmxlZCA9IFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5pc0VuYWJsZWQoKTtcbiAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuc2V0RW5hYmxlZChmYWxzZSk7XG4gICAgcmV0dXJuIGN1cnJlbnRseUVuYWJsZWQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcHJldmlvdXNseUVuYWJsZWQgRW5hYmxlZCBzdGF0dXMgb2ZcbiAgICogICBgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyYCBiZWZvcmUgdGhlIHJlY29uY2lsaWF0aW9uIG9jY3VycmVkLiBgY2xvc2VgXG4gICAqICAgcmVzdG9yZXMgdGhlIHByZXZpb3VzIHZhbHVlLlxuICAgKi9cbiAgY2xvc2U6IGZ1bmN0aW9uIChwcmV2aW91c2x5RW5hYmxlZCkge1xuICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5zZXRFbmFibGVkKHByZXZpb3VzbHlFbmFibGVkKTtcbiAgfVxufTtcblxuLyoqXG4gKiBQcm92aWRlcyBhIHF1ZXVlIGZvciBjb2xsZWN0aW5nIGBjb21wb25lbnREaWRNb3VudGAgYW5kXG4gKiBgY29tcG9uZW50RGlkVXBkYXRlYCBjYWxsYmFja3MgZHVyaW5nIHRoZSB0cmFuc2FjdGlvbi5cbiAqL1xudmFyIE9OX0RPTV9SRUFEWV9RVUVVRUlORyA9IHtcbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBpbnRlcm5hbCBgb25ET01SZWFkeWAgcXVldWUuXG4gICAqL1xuICBpbml0aWFsaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5yZWFjdE1vdW50UmVhZHkucmVzZXQoKTtcbiAgfSxcblxuICAvKipcbiAgICogQWZ0ZXIgRE9NIGlzIGZsdXNoZWQsIGludm9rZSBhbGwgcmVnaXN0ZXJlZCBgb25ET01SZWFkeWAgY2FsbGJhY2tzLlxuICAgKi9cbiAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnJlYWN0TW91bnRSZWFkeS5ub3RpZnlBbGwoKTtcbiAgfVxufTtcblxuLyoqXG4gKiBFeGVjdXRlZCB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBgVHJhbnNhY3Rpb25gIGluc3RhbmNlLiBDb25zaWRlciB0aGVzZSBhc1xuICogYmVpbmcgbWVtYmVyIG1ldGhvZHMsIGJ1dCB3aXRoIGFuIGltcGxpZWQgb3JkZXJpbmcgd2hpbGUgYmVpbmcgaXNvbGF0ZWQgZnJvbVxuICogZWFjaCBvdGhlci5cbiAqL1xudmFyIFRSQU5TQUNUSU9OX1dSQVBQRVJTID0gW1NFTEVDVElPTl9SRVNUT1JBVElPTiwgRVZFTlRfU1VQUFJFU1NJT04sIE9OX0RPTV9SRUFEWV9RVUVVRUlOR107XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFRSQU5TQUNUSU9OX1dSQVBQRVJTLnB1c2goe1xuICAgIGluaXRpYWxpemU6IFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZ2luRmx1c2gsXG4gICAgY2xvc2U6IFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkVuZEZsdXNoXG4gIH0pO1xufVxuXG4vKipcbiAqIEN1cnJlbnRseTpcbiAqIC0gVGhlIG9yZGVyIHRoYXQgdGhlc2UgYXJlIGxpc3RlZCBpbiB0aGUgdHJhbnNhY3Rpb24gaXMgY3JpdGljYWw6XG4gKiAtIFN1cHByZXNzZXMgZXZlbnRzLlxuICogLSBSZXN0b3JlcyBzZWxlY3Rpb24gcmFuZ2UuXG4gKlxuICogRnV0dXJlOlxuICogLSBSZXN0b3JlIGRvY3VtZW50L292ZXJmbG93IHNjcm9sbCBwb3NpdGlvbnMgdGhhdCB3ZXJlIHVuaW50ZW50aW9uYWxseVxuICogICBtb2RpZmllZCB2aWEgRE9NIGluc2VydGlvbnMgYWJvdmUgdGhlIHRvcCB2aWV3cG9ydCBib3VuZGFyeS5cbiAqIC0gSW1wbGVtZW50L2ludGVncmF0ZSB3aXRoIGN1c3RvbWl6ZWQgY29uc3RyYWludCBiYXNlZCBsYXlvdXQgc3lzdGVtIGFuZCBrZWVwXG4gKiAgIHRyYWNrIG9mIHdoaWNoIGRpbWVuc2lvbnMgbXVzdCBiZSByZW1lYXN1cmVkLlxuICpcbiAqIEBjbGFzcyBSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uXG4gKi9cbmZ1bmN0aW9uIFJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24odXNlQ3JlYXRlRWxlbWVudCkge1xuICB0aGlzLnJlaW5pdGlhbGl6ZVRyYW5zYWN0aW9uKCk7XG4gIC8vIE9ubHkgc2VydmVyLXNpZGUgcmVuZGVyaW5nIHJlYWxseSBuZWVkcyB0aGlzIG9wdGlvbiAoc2VlXG4gIC8vIGBSZWFjdFNlcnZlclJlbmRlcmluZ2ApLCBidXQgc2VydmVyLXNpZGUgdXNlc1xuICAvLyBgUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbmAgaW5zdGVhZC4gVGhpcyBvcHRpb24gaXMgaGVyZSBzbyB0aGF0IGl0J3NcbiAgLy8gYWNjZXNzaWJsZSBhbmQgZGVmYXVsdHMgdG8gZmFsc2Ugd2hlbiBgUmVhY3RET01Db21wb25lbnRgIGFuZFxuICAvLyBgUmVhY3RET01UZXh0Q29tcG9uZW50YCBjaGVja3MgaXQgaW4gYG1vdW50Q29tcG9uZW50YC5gXG4gIHRoaXMucmVuZGVyVG9TdGF0aWNNYXJrdXAgPSBmYWxzZTtcbiAgdGhpcy5yZWFjdE1vdW50UmVhZHkgPSBDYWxsYmFja1F1ZXVlLmdldFBvb2xlZChudWxsKTtcbiAgdGhpcy51c2VDcmVhdGVFbGVtZW50ID0gdXNlQ3JlYXRlRWxlbWVudDtcbn1cblxudmFyIE1peGluID0ge1xuICAvKipcbiAgICogQHNlZSBUcmFuc2FjdGlvblxuICAgKiBAYWJzdHJhY3RcbiAgICogQGZpbmFsXG4gICAqIEByZXR1cm4ge2FycmF5PG9iamVjdD59IExpc3Qgb2Ygb3BlcmF0aW9uIHdyYXAgcHJvY2VkdXJlcy5cbiAgICogICBUT0RPOiBjb252ZXJ0IHRvIGFycmF5PFRyYW5zYWN0aW9uV3JhcHBlcj5cbiAgICovXG4gIGdldFRyYW5zYWN0aW9uV3JhcHBlcnM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gVFJBTlNBQ1RJT05fV1JBUFBFUlM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge29iamVjdH0gVGhlIHF1ZXVlIHRvIGNvbGxlY3QgYG9uRE9NUmVhZHlgIGNhbGxiYWNrcyB3aXRoLlxuICAgKi9cbiAgZ2V0UmVhY3RNb3VudFJlYWR5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhY3RNb3VudFJlYWR5O1xuICB9LFxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBxdWV1ZSB0byBjb2xsZWN0IFJlYWN0IGFzeW5jIGV2ZW50cy5cbiAgICovXG4gIGdldFVwZGF0ZVF1ZXVlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFJlYWN0VXBkYXRlUXVldWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNhdmUgY3VycmVudCB0cmFuc2FjdGlvbiBzdGF0ZSAtLSBpZiB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhpcyBtZXRob2QgaXNcbiAgICogcGFzc2VkIHRvIGByb2xsYmFja2AsIHRoZSB0cmFuc2FjdGlvbiB3aWxsIGJlIHJlc2V0IHRvIHRoYXQgc3RhdGUuXG4gICAqL1xuICBjaGVja3BvaW50OiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gcmVhY3RNb3VudFJlYWR5IGlzIHRoZSBvdXIgb25seSBzdGF0ZWZ1bCB3cmFwcGVyXG4gICAgcmV0dXJuIHRoaXMucmVhY3RNb3VudFJlYWR5LmNoZWNrcG9pbnQoKTtcbiAgfSxcblxuICByb2xsYmFjazogZnVuY3Rpb24gKGNoZWNrcG9pbnQpIHtcbiAgICB0aGlzLnJlYWN0TW91bnRSZWFkeS5yb2xsYmFjayhjaGVja3BvaW50KTtcbiAgfSxcblxuICAvKipcbiAgICogYFBvb2xlZENsYXNzYCBsb29rcyBmb3IgdGhpcywgYW5kIHdpbGwgaW52b2tlIHRoaXMgYmVmb3JlIGFsbG93aW5nIHRoaXNcbiAgICogaW5zdGFuY2UgdG8gYmUgcmV1c2VkLlxuICAgKi9cbiAgZGVzdHJ1Y3RvcjogZnVuY3Rpb24gKCkge1xuICAgIENhbGxiYWNrUXVldWUucmVsZWFzZSh0aGlzLnJlYWN0TW91bnRSZWFkeSk7XG4gICAgdGhpcy5yZWFjdE1vdW50UmVhZHkgPSBudWxsO1xuICB9XG59O1xuXG5fYXNzaWduKFJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24ucHJvdG90eXBlLCBUcmFuc2FjdGlvbiwgTWl4aW4pO1xuXG5Qb29sZWRDbGFzcy5hZGRQb29saW5nVG8oUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbik7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgTlMgPSB7XG4gIHhsaW5rOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsXG4gIHhtbDogJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSdcbn07XG5cbi8vIFdlIHVzZSBhdHRyaWJ1dGVzIGZvciBldmVyeXRoaW5nIFNWRyBzbyBsZXQncyBhdm9pZCBzb21lIGR1cGxpY2F0aW9uIGFuZCBydW5cbi8vIGNvZGUgaW5zdGVhZC5cbi8vIFRoZSBmb2xsb3dpbmcgYXJlIGFsbCBzcGVjaWZpZWQgaW4gdGhlIEhUTUwgY29uZmlnIGFscmVhZHkgc28gd2UgZXhjbHVkZSBoZXJlLlxuLy8gLSBjbGFzcyAoYXMgY2xhc3NOYW1lKVxuLy8gLSBjb2xvclxuLy8gLSBoZWlnaHRcbi8vIC0gaWRcbi8vIC0gbGFuZ1xuLy8gLSBtYXhcbi8vIC0gbWVkaWFcbi8vIC0gbWV0aG9kXG4vLyAtIG1pblxuLy8gLSBuYW1lXG4vLyAtIHN0eWxlXG4vLyAtIHRhcmdldFxuLy8gLSB0eXBlXG4vLyAtIHdpZHRoXG52YXIgQVRUUlMgPSB7XG4gIGFjY2VudEhlaWdodDogJ2FjY2VudC1oZWlnaHQnLFxuICBhY2N1bXVsYXRlOiAwLFxuICBhZGRpdGl2ZTogMCxcbiAgYWxpZ25tZW50QmFzZWxpbmU6ICdhbGlnbm1lbnQtYmFzZWxpbmUnLFxuICBhbGxvd1Jlb3JkZXI6ICdhbGxvd1Jlb3JkZXInLFxuICBhbHBoYWJldGljOiAwLFxuICBhbXBsaXR1ZGU6IDAsXG4gIGFyYWJpY0Zvcm06ICdhcmFiaWMtZm9ybScsXG4gIGFzY2VudDogMCxcbiAgYXR0cmlidXRlTmFtZTogJ2F0dHJpYnV0ZU5hbWUnLFxuICBhdHRyaWJ1dGVUeXBlOiAnYXR0cmlidXRlVHlwZScsXG4gIGF1dG9SZXZlcnNlOiAnYXV0b1JldmVyc2UnLFxuICBhemltdXRoOiAwLFxuICBiYXNlRnJlcXVlbmN5OiAnYmFzZUZyZXF1ZW5jeScsXG4gIGJhc2VQcm9maWxlOiAnYmFzZVByb2ZpbGUnLFxuICBiYXNlbGluZVNoaWZ0OiAnYmFzZWxpbmUtc2hpZnQnLFxuICBiYm94OiAwLFxuICBiZWdpbjogMCxcbiAgYmlhczogMCxcbiAgYnk6IDAsXG4gIGNhbGNNb2RlOiAnY2FsY01vZGUnLFxuICBjYXBIZWlnaHQ6ICdjYXAtaGVpZ2h0JyxcbiAgY2xpcDogMCxcbiAgY2xpcFBhdGg6ICdjbGlwLXBhdGgnLFxuICBjbGlwUnVsZTogJ2NsaXAtcnVsZScsXG4gIGNsaXBQYXRoVW5pdHM6ICdjbGlwUGF0aFVuaXRzJyxcbiAgY29sb3JJbnRlcnBvbGF0aW9uOiAnY29sb3ItaW50ZXJwb2xhdGlvbicsXG4gIGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6ICdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnLFxuICBjb2xvclByb2ZpbGU6ICdjb2xvci1wcm9maWxlJyxcbiAgY29sb3JSZW5kZXJpbmc6ICdjb2xvci1yZW5kZXJpbmcnLFxuICBjb250ZW50U2NyaXB0VHlwZTogJ2NvbnRlbnRTY3JpcHRUeXBlJyxcbiAgY29udGVudFN0eWxlVHlwZTogJ2NvbnRlbnRTdHlsZVR5cGUnLFxuICBjdXJzb3I6IDAsXG4gIGN4OiAwLFxuICBjeTogMCxcbiAgZDogMCxcbiAgZGVjZWxlcmF0ZTogMCxcbiAgZGVzY2VudDogMCxcbiAgZGlmZnVzZUNvbnN0YW50OiAnZGlmZnVzZUNvbnN0YW50JyxcbiAgZGlyZWN0aW9uOiAwLFxuICBkaXNwbGF5OiAwLFxuICBkaXZpc29yOiAwLFxuICBkb21pbmFudEJhc2VsaW5lOiAnZG9taW5hbnQtYmFzZWxpbmUnLFxuICBkdXI6IDAsXG4gIGR4OiAwLFxuICBkeTogMCxcbiAgZWRnZU1vZGU6ICdlZGdlTW9kZScsXG4gIGVsZXZhdGlvbjogMCxcbiAgZW5hYmxlQmFja2dyb3VuZDogJ2VuYWJsZS1iYWNrZ3JvdW5kJyxcbiAgZW5kOiAwLFxuICBleHBvbmVudDogMCxcbiAgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZDogJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLFxuICBmaWxsOiAwLFxuICBmaWxsT3BhY2l0eTogJ2ZpbGwtb3BhY2l0eScsXG4gIGZpbGxSdWxlOiAnZmlsbC1ydWxlJyxcbiAgZmlsdGVyOiAwLFxuICBmaWx0ZXJSZXM6ICdmaWx0ZXJSZXMnLFxuICBmaWx0ZXJVbml0czogJ2ZpbHRlclVuaXRzJyxcbiAgZmxvb2RDb2xvcjogJ2Zsb29kLWNvbG9yJyxcbiAgZmxvb2RPcGFjaXR5OiAnZmxvb2Qtb3BhY2l0eScsXG4gIGZvY3VzYWJsZTogMCxcbiAgZm9udEZhbWlseTogJ2ZvbnQtZmFtaWx5JyxcbiAgZm9udFNpemU6ICdmb250LXNpemUnLFxuICBmb250U2l6ZUFkanVzdDogJ2ZvbnQtc2l6ZS1hZGp1c3QnLFxuICBmb250U3RyZXRjaDogJ2ZvbnQtc3RyZXRjaCcsXG4gIGZvbnRTdHlsZTogJ2ZvbnQtc3R5bGUnLFxuICBmb250VmFyaWFudDogJ2ZvbnQtdmFyaWFudCcsXG4gIGZvbnRXZWlnaHQ6ICdmb250LXdlaWdodCcsXG4gIGZvcm1hdDogMCxcbiAgZnJvbTogMCxcbiAgZng6IDAsXG4gIGZ5OiAwLFxuICBnMTogMCxcbiAgZzI6IDAsXG4gIGdseXBoTmFtZTogJ2dseXBoLW5hbWUnLFxuICBnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbDogJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnLFxuICBnbHlwaE9yaWVudGF0aW9uVmVydGljYWw6ICdnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCcsXG4gIGdseXBoUmVmOiAnZ2x5cGhSZWYnLFxuICBncmFkaWVudFRyYW5zZm9ybTogJ2dyYWRpZW50VHJhbnNmb3JtJyxcbiAgZ3JhZGllbnRVbml0czogJ2dyYWRpZW50VW5pdHMnLFxuICBoYW5naW5nOiAwLFxuICBob3JpekFkdlg6ICdob3Jpei1hZHYteCcsXG4gIGhvcml6T3JpZ2luWDogJ2hvcml6LW9yaWdpbi14JyxcbiAgaWRlb2dyYXBoaWM6IDAsXG4gIGltYWdlUmVuZGVyaW5nOiAnaW1hZ2UtcmVuZGVyaW5nJyxcbiAgJ2luJzogMCxcbiAgaW4yOiAwLFxuICBpbnRlcmNlcHQ6IDAsXG4gIGs6IDAsXG4gIGsxOiAwLFxuICBrMjogMCxcbiAgazM6IDAsXG4gIGs0OiAwLFxuICBrZXJuZWxNYXRyaXg6ICdrZXJuZWxNYXRyaXgnLFxuICBrZXJuZWxVbml0TGVuZ3RoOiAna2VybmVsVW5pdExlbmd0aCcsXG4gIGtlcm5pbmc6IDAsXG4gIGtleVBvaW50czogJ2tleVBvaW50cycsXG4gIGtleVNwbGluZXM6ICdrZXlTcGxpbmVzJyxcbiAga2V5VGltZXM6ICdrZXlUaW1lcycsXG4gIGxlbmd0aEFkanVzdDogJ2xlbmd0aEFkanVzdCcsXG4gIGxldHRlclNwYWNpbmc6ICdsZXR0ZXItc3BhY2luZycsXG4gIGxpZ2h0aW5nQ29sb3I6ICdsaWdodGluZy1jb2xvcicsXG4gIGxpbWl0aW5nQ29uZUFuZ2xlOiAnbGltaXRpbmdDb25lQW5nbGUnLFxuICBsb2NhbDogMCxcbiAgbWFya2VyRW5kOiAnbWFya2VyLWVuZCcsXG4gIG1hcmtlck1pZDogJ21hcmtlci1taWQnLFxuICBtYXJrZXJTdGFydDogJ21hcmtlci1zdGFydCcsXG4gIG1hcmtlckhlaWdodDogJ21hcmtlckhlaWdodCcsXG4gIG1hcmtlclVuaXRzOiAnbWFya2VyVW5pdHMnLFxuICBtYXJrZXJXaWR0aDogJ21hcmtlcldpZHRoJyxcbiAgbWFzazogMCxcbiAgbWFza0NvbnRlbnRVbml0czogJ21hc2tDb250ZW50VW5pdHMnLFxuICBtYXNrVW5pdHM6ICdtYXNrVW5pdHMnLFxuICBtYXRoZW1hdGljYWw6IDAsXG4gIG1vZGU6IDAsXG4gIG51bU9jdGF2ZXM6ICdudW1PY3RhdmVzJyxcbiAgb2Zmc2V0OiAwLFxuICBvcGFjaXR5OiAwLFxuICBvcGVyYXRvcjogMCxcbiAgb3JkZXI6IDAsXG4gIG9yaWVudDogMCxcbiAgb3JpZW50YXRpb246IDAsXG4gIG9yaWdpbjogMCxcbiAgb3ZlcmZsb3c6IDAsXG4gIG92ZXJsaW5lUG9zaXRpb246ICdvdmVybGluZS1wb3NpdGlvbicsXG4gIG92ZXJsaW5lVGhpY2tuZXNzOiAnb3ZlcmxpbmUtdGhpY2tuZXNzJyxcbiAgcGFpbnRPcmRlcjogJ3BhaW50LW9yZGVyJyxcbiAgcGFub3NlMTogJ3Bhbm9zZS0xJyxcbiAgcGF0aExlbmd0aDogJ3BhdGhMZW5ndGgnLFxuICBwYXR0ZXJuQ29udGVudFVuaXRzOiAncGF0dGVybkNvbnRlbnRVbml0cycsXG4gIHBhdHRlcm5UcmFuc2Zvcm06ICdwYXR0ZXJuVHJhbnNmb3JtJyxcbiAgcGF0dGVyblVuaXRzOiAncGF0dGVyblVuaXRzJyxcbiAgcG9pbnRlckV2ZW50czogJ3BvaW50ZXItZXZlbnRzJyxcbiAgcG9pbnRzOiAwLFxuICBwb2ludHNBdFg6ICdwb2ludHNBdFgnLFxuICBwb2ludHNBdFk6ICdwb2ludHNBdFknLFxuICBwb2ludHNBdFo6ICdwb2ludHNBdFonLFxuICBwcmVzZXJ2ZUFscGhhOiAncHJlc2VydmVBbHBoYScsXG4gIHByZXNlcnZlQXNwZWN0UmF0aW86ICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJyxcbiAgcHJpbWl0aXZlVW5pdHM6ICdwcmltaXRpdmVVbml0cycsXG4gIHI6IDAsXG4gIHJhZGl1czogMCxcbiAgcmVmWDogJ3JlZlgnLFxuICByZWZZOiAncmVmWScsXG4gIHJlbmRlcmluZ0ludGVudDogJ3JlbmRlcmluZy1pbnRlbnQnLFxuICByZXBlYXRDb3VudDogJ3JlcGVhdENvdW50JyxcbiAgcmVwZWF0RHVyOiAncmVwZWF0RHVyJyxcbiAgcmVxdWlyZWRFeHRlbnNpb25zOiAncmVxdWlyZWRFeHRlbnNpb25zJyxcbiAgcmVxdWlyZWRGZWF0dXJlczogJ3JlcXVpcmVkRmVhdHVyZXMnLFxuICByZXN0YXJ0OiAwLFxuICByZXN1bHQ6IDAsXG4gIHJvdGF0ZTogMCxcbiAgcng6IDAsXG4gIHJ5OiAwLFxuICBzY2FsZTogMCxcbiAgc2VlZDogMCxcbiAgc2hhcGVSZW5kZXJpbmc6ICdzaGFwZS1yZW5kZXJpbmcnLFxuICBzbG9wZTogMCxcbiAgc3BhY2luZzogMCxcbiAgc3BlY3VsYXJDb25zdGFudDogJ3NwZWN1bGFyQ29uc3RhbnQnLFxuICBzcGVjdWxhckV4cG9uZW50OiAnc3BlY3VsYXJFeHBvbmVudCcsXG4gIHNwZWVkOiAwLFxuICBzcHJlYWRNZXRob2Q6ICdzcHJlYWRNZXRob2QnLFxuICBzdGFydE9mZnNldDogJ3N0YXJ0T2Zmc2V0JyxcbiAgc3RkRGV2aWF0aW9uOiAnc3RkRGV2aWF0aW9uJyxcbiAgc3RlbWg6IDAsXG4gIHN0ZW12OiAwLFxuICBzdGl0Y2hUaWxlczogJ3N0aXRjaFRpbGVzJyxcbiAgc3RvcENvbG9yOiAnc3RvcC1jb2xvcicsXG4gIHN0b3BPcGFjaXR5OiAnc3RvcC1vcGFjaXR5JyxcbiAgc3RyaWtldGhyb3VnaFBvc2l0aW9uOiAnc3RyaWtldGhyb3VnaC1wb3NpdGlvbicsXG4gIHN0cmlrZXRocm91Z2hUaGlja25lc3M6ICdzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcycsXG4gIHN0cmluZzogMCxcbiAgc3Ryb2tlOiAwLFxuICBzdHJva2VEYXNoYXJyYXk6ICdzdHJva2UtZGFzaGFycmF5JyxcbiAgc3Ryb2tlRGFzaG9mZnNldDogJ3N0cm9rZS1kYXNob2Zmc2V0JyxcbiAgc3Ryb2tlTGluZWNhcDogJ3N0cm9rZS1saW5lY2FwJyxcbiAgc3Ryb2tlTGluZWpvaW46ICdzdHJva2UtbGluZWpvaW4nLFxuICBzdHJva2VNaXRlcmxpbWl0OiAnc3Ryb2tlLW1pdGVybGltaXQnLFxuICBzdHJva2VPcGFjaXR5OiAnc3Ryb2tlLW9wYWNpdHknLFxuICBzdHJva2VXaWR0aDogJ3N0cm9rZS13aWR0aCcsXG4gIHN1cmZhY2VTY2FsZTogJ3N1cmZhY2VTY2FsZScsXG4gIHN5c3RlbUxhbmd1YWdlOiAnc3lzdGVtTGFuZ3VhZ2UnLFxuICB0YWJsZVZhbHVlczogJ3RhYmxlVmFsdWVzJyxcbiAgdGFyZ2V0WDogJ3RhcmdldFgnLFxuICB0YXJnZXRZOiAndGFyZ2V0WScsXG4gIHRleHRBbmNob3I6ICd0ZXh0LWFuY2hvcicsXG4gIHRleHREZWNvcmF0aW9uOiAndGV4dC1kZWNvcmF0aW9uJyxcbiAgdGV4dFJlbmRlcmluZzogJ3RleHQtcmVuZGVyaW5nJyxcbiAgdGV4dExlbmd0aDogJ3RleHRMZW5ndGgnLFxuICB0bzogMCxcbiAgdHJhbnNmb3JtOiAwLFxuICB1MTogMCxcbiAgdTI6IDAsXG4gIHVuZGVybGluZVBvc2l0aW9uOiAndW5kZXJsaW5lLXBvc2l0aW9uJyxcbiAgdW5kZXJsaW5lVGhpY2tuZXNzOiAndW5kZXJsaW5lLXRoaWNrbmVzcycsXG4gIHVuaWNvZGU6IDAsXG4gIHVuaWNvZGVCaWRpOiAndW5pY29kZS1iaWRpJyxcbiAgdW5pY29kZVJhbmdlOiAndW5pY29kZS1yYW5nZScsXG4gIHVuaXRzUGVyRW06ICd1bml0cy1wZXItZW0nLFxuICB2QWxwaGFiZXRpYzogJ3YtYWxwaGFiZXRpYycsXG4gIHZIYW5naW5nOiAndi1oYW5naW5nJyxcbiAgdklkZW9ncmFwaGljOiAndi1pZGVvZ3JhcGhpYycsXG4gIHZNYXRoZW1hdGljYWw6ICd2LW1hdGhlbWF0aWNhbCcsXG4gIHZhbHVlczogMCxcbiAgdmVjdG9yRWZmZWN0OiAndmVjdG9yLWVmZmVjdCcsXG4gIHZlcnNpb246IDAsXG4gIHZlcnRBZHZZOiAndmVydC1hZHYteScsXG4gIHZlcnRPcmlnaW5YOiAndmVydC1vcmlnaW4teCcsXG4gIHZlcnRPcmlnaW5ZOiAndmVydC1vcmlnaW4teScsXG4gIHZpZXdCb3g6ICd2aWV3Qm94JyxcbiAgdmlld1RhcmdldDogJ3ZpZXdUYXJnZXQnLFxuICB2aXNpYmlsaXR5OiAwLFxuICB3aWR0aHM6IDAsXG4gIHdvcmRTcGFjaW5nOiAnd29yZC1zcGFjaW5nJyxcbiAgd3JpdGluZ01vZGU6ICd3cml0aW5nLW1vZGUnLFxuICB4OiAwLFxuICB4SGVpZ2h0OiAneC1oZWlnaHQnLFxuICB4MTogMCxcbiAgeDI6IDAsXG4gIHhDaGFubmVsU2VsZWN0b3I6ICd4Q2hhbm5lbFNlbGVjdG9yJyxcbiAgeGxpbmtBY3R1YXRlOiAneGxpbms6YWN0dWF0ZScsXG4gIHhsaW5rQXJjcm9sZTogJ3hsaW5rOmFyY3JvbGUnLFxuICB4bGlua0hyZWY6ICd4bGluazpocmVmJyxcbiAgeGxpbmtSb2xlOiAneGxpbms6cm9sZScsXG4gIHhsaW5rU2hvdzogJ3hsaW5rOnNob3cnLFxuICB4bGlua1RpdGxlOiAneGxpbms6dGl0bGUnLFxuICB4bGlua1R5cGU6ICd4bGluazp0eXBlJyxcbiAgeG1sQmFzZTogJ3htbDpiYXNlJyxcbiAgeG1sbnM6IDAsXG4gIHhtbG5zWGxpbms6ICd4bWxuczp4bGluaycsXG4gIHhtbExhbmc6ICd4bWw6bGFuZycsXG4gIHhtbFNwYWNlOiAneG1sOnNwYWNlJyxcbiAgeTogMCxcbiAgeTE6IDAsXG4gIHkyOiAwLFxuICB5Q2hhbm5lbFNlbGVjdG9yOiAneUNoYW5uZWxTZWxlY3RvcicsXG4gIHo6IDAsXG4gIHpvb21BbmRQYW46ICd6b29tQW5kUGFuJ1xufTtcblxudmFyIFNWR0RPTVByb3BlcnR5Q29uZmlnID0ge1xuICBQcm9wZXJ0aWVzOiB7fSxcbiAgRE9NQXR0cmlidXRlTmFtZXNwYWNlczoge1xuICAgIHhsaW5rQWN0dWF0ZTogTlMueGxpbmssXG4gICAgeGxpbmtBcmNyb2xlOiBOUy54bGluayxcbiAgICB4bGlua0hyZWY6IE5TLnhsaW5rLFxuICAgIHhsaW5rUm9sZTogTlMueGxpbmssXG4gICAgeGxpbmtTaG93OiBOUy54bGluayxcbiAgICB4bGlua1RpdGxlOiBOUy54bGluayxcbiAgICB4bGlua1R5cGU6IE5TLnhsaW5rLFxuICAgIHhtbEJhc2U6IE5TLnhtbCxcbiAgICB4bWxMYW5nOiBOUy54bWwsXG4gICAgeG1sU3BhY2U6IE5TLnhtbFxuICB9LFxuICBET01BdHRyaWJ1dGVOYW1lczoge31cbn07XG5cbk9iamVjdC5rZXlzKEFUVFJTKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgU1ZHRE9NUHJvcGVydHlDb25maWcuUHJvcGVydGllc1trZXldID0gMDtcbiAgaWYgKEFUVFJTW2tleV0pIHtcbiAgICBTVkdET01Qcm9wZXJ0eUNvbmZpZy5ET01BdHRyaWJ1dGVOYW1lc1trZXldID0gQVRUUlNba2V5XTtcbiAgfVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU1ZHRE9NUHJvcGVydHlDb25maWc7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEV2ZW50UHJvcGFnYXRvcnMgPSByZXF1aXJlKCcuL0V2ZW50UHJvcGFnYXRvcnMnKTtcbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdElucHV0U2VsZWN0aW9uID0gcmVxdWlyZSgnLi9SZWFjdElucHV0U2VsZWN0aW9uJyk7XG52YXIgU3ludGhldGljRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0V2ZW50Jyk7XG5cbnZhciBnZXRBY3RpdmVFbGVtZW50ID0gcmVxdWlyZSgnZmJqcy9saWIvZ2V0QWN0aXZlRWxlbWVudCcpO1xudmFyIGlzVGV4dElucHV0RWxlbWVudCA9IHJlcXVpcmUoJy4vaXNUZXh0SW5wdXRFbGVtZW50Jyk7XG52YXIgc2hhbGxvd0VxdWFsID0gcmVxdWlyZSgnZmJqcy9saWIvc2hhbGxvd0VxdWFsJyk7XG5cbnZhciBza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQgPSBFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gJiYgJ2RvY3VtZW50TW9kZScgaW4gZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDw9IDExO1xuXG52YXIgZXZlbnRUeXBlcyA9IHtcbiAgc2VsZWN0OiB7XG4gICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHtcbiAgICAgIGJ1YmJsZWQ6ICdvblNlbGVjdCcsXG4gICAgICBjYXB0dXJlZDogJ29uU2VsZWN0Q2FwdHVyZSdcbiAgICB9LFxuICAgIGRlcGVuZGVuY2llczogWyd0b3BCbHVyJywgJ3RvcENvbnRleHRNZW51JywgJ3RvcEZvY3VzJywgJ3RvcEtleURvd24nLCAndG9wS2V5VXAnLCAndG9wTW91c2VEb3duJywgJ3RvcE1vdXNlVXAnLCAndG9wU2VsZWN0aW9uQ2hhbmdlJ11cbiAgfVxufTtcblxudmFyIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xudmFyIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbnZhciBsYXN0U2VsZWN0aW9uID0gbnVsbDtcbnZhciBtb3VzZURvd24gPSBmYWxzZTtcblxuLy8gVHJhY2sgd2hldGhlciBhIGxpc3RlbmVyIGV4aXN0cyBmb3IgdGhpcyBwbHVnaW4uIElmIG5vbmUgZXhpc3QsIHdlIGRvXG4vLyBub3QgZXh0cmFjdCBldmVudHMuIFNlZSAjMzYzOS5cbnZhciBoYXNMaXN0ZW5lciA9IGZhbHNlO1xuXG4vKipcbiAqIEdldCBhbiBvYmplY3Qgd2hpY2ggaXMgYSB1bmlxdWUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxuICpcbiAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBub3QgYmUgY29uc2lzdGVudCBhY3Jvc3Mgbm9kZXMgb3IgYnJvd3NlcnMsIGJ1dFxuICogdHdvIGlkZW50aWNhbCBzZWxlY3Rpb25zIG9uIHRoZSBzYW1lIG5vZGUgd2lsbCByZXR1cm4gaWRlbnRpY2FsIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbihub2RlKSB7XG4gIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIG5vZGUgJiYgUmVhY3RJbnB1dFNlbGVjdGlvbi5oYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMobm9kZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IG5vZGUuc2VsZWN0aW9uU3RhcnQsXG4gICAgICBlbmQ6IG5vZGUuc2VsZWN0aW9uRW5kXG4gICAgfTtcbiAgfSBlbHNlIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKSB7XG4gICAgdmFyIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICByZXR1cm4ge1xuICAgICAgYW5jaG9yTm9kZTogc2VsZWN0aW9uLmFuY2hvck5vZGUsXG4gICAgICBhbmNob3JPZmZzZXQ6IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQsXG4gICAgICBmb2N1c05vZGU6IHNlbGVjdGlvbi5mb2N1c05vZGUsXG4gICAgICBmb2N1c09mZnNldDogc2VsZWN0aW9uLmZvY3VzT2Zmc2V0XG4gICAgfTtcbiAgfSBlbHNlIGlmIChkb2N1bWVudC5zZWxlY3Rpb24pIHtcbiAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyZW50RWxlbWVudDogcmFuZ2UucGFyZW50RWxlbWVudCgpLFxuICAgICAgdGV4dDogcmFuZ2UudGV4dCxcbiAgICAgIHRvcDogcmFuZ2UuYm91bmRpbmdUb3AsXG4gICAgICBsZWZ0OiByYW5nZS5ib3VuZGluZ0xlZnRcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogUG9sbCBzZWxlY3Rpb24gdG8gc2VlIHdoZXRoZXIgaXQncyBjaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHJldHVybiB7P1N5bnRoZXRpY0V2ZW50fVxuICovXG5mdW5jdGlvbiBjb25zdHJ1Y3RTZWxlY3RFdmVudChuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgLy8gRW5zdXJlIHdlIGhhdmUgdGhlIHJpZ2h0IGVsZW1lbnQsIGFuZCB0aGF0IHRoZSB1c2VyIGlzIG5vdCBkcmFnZ2luZyBhXG4gIC8vIHNlbGVjdGlvbiAodGhpcyBtYXRjaGVzIG5hdGl2ZSBgc2VsZWN0YCBldmVudCBiZWhhdmlvcikuIEluIEhUTUw1LCBzZWxlY3RcbiAgLy8gZmlyZXMgb25seSBvbiBpbnB1dCBhbmQgdGV4dGFyZWEgdGh1cyBpZiB0aGVyZSdzIG5vIGZvY3VzZWQgZWxlbWVudCB3ZVxuICAvLyB3b24ndCBkaXNwYXRjaC5cbiAgaWYgKG1vdXNlRG93biB8fCBhY3RpdmVFbGVtZW50ID09IG51bGwgfHwgYWN0aXZlRWxlbWVudCAhPT0gZ2V0QWN0aXZlRWxlbWVudCgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBPbmx5IGZpcmUgd2hlbiBzZWxlY3Rpb24gaGFzIGFjdHVhbGx5IGNoYW5nZWQuXG4gIHZhciBjdXJyZW50U2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKGFjdGl2ZUVsZW1lbnQpO1xuICBpZiAoIWxhc3RTZWxlY3Rpb24gfHwgIXNoYWxsb3dFcXVhbChsYXN0U2VsZWN0aW9uLCBjdXJyZW50U2VsZWN0aW9uKSkge1xuICAgIGxhc3RTZWxlY3Rpb24gPSBjdXJyZW50U2VsZWN0aW9uO1xuXG4gICAgdmFyIHN5bnRoZXRpY0V2ZW50ID0gU3ludGhldGljRXZlbnQuZ2V0UG9vbGVkKGV2ZW50VHlwZXMuc2VsZWN0LCBhY3RpdmVFbGVtZW50SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICAgIHN5bnRoZXRpY0V2ZW50LnR5cGUgPSAnc2VsZWN0JztcbiAgICBzeW50aGV0aWNFdmVudC50YXJnZXQgPSBhY3RpdmVFbGVtZW50O1xuXG4gICAgRXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKHN5bnRoZXRpY0V2ZW50KTtcblxuICAgIHJldHVybiBzeW50aGV0aWNFdmVudDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFRoaXMgcGx1Z2luIGNyZWF0ZXMgYW4gYG9uU2VsZWN0YCBldmVudCB0aGF0IG5vcm1hbGl6ZXMgc2VsZWN0IGV2ZW50c1xuICogYWNyb3NzIGZvcm0gZWxlbWVudHMuXG4gKlxuICogU3VwcG9ydGVkIGVsZW1lbnRzIGFyZTpcbiAqIC0gaW5wdXQgKHNlZSBgaXNUZXh0SW5wdXRFbGVtZW50YClcbiAqIC0gdGV4dGFyZWFcbiAqIC0gY29udGVudEVkaXRhYmxlXG4gKlxuICogVGhpcyBkaWZmZXJzIGZyb20gbmF0aXZlIGJyb3dzZXIgaW1wbGVtZW50YXRpb25zIGluIHRoZSBmb2xsb3dpbmcgd2F5czpcbiAqIC0gRmlyZXMgb24gY29udGVudEVkaXRhYmxlIGZpZWxkcyBhcyB3ZWxsIGFzIGlucHV0cy5cbiAqIC0gRmlyZXMgZm9yIGNvbGxhcHNlZCBzZWxlY3Rpb24uXG4gKiAtIEZpcmVzIGFmdGVyIHVzZXIgaW5wdXQuXG4gKi9cbnZhciBTZWxlY3RFdmVudFBsdWdpbiA9IHtcbiAgZXZlbnRUeXBlczogZXZlbnRUeXBlcyxcblxuICBleHRyYWN0RXZlbnRzOiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICBpZiAoIWhhc0xpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0Tm9kZSA9IHRhcmdldEluc3QgPyBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KSA6IHdpbmRvdztcblxuICAgIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7XG4gICAgICAvLyBUcmFjayB0aGUgaW5wdXQgbm9kZSB0aGF0IGhhcyBmb2N1cy5cbiAgICAgIGNhc2UgJ3RvcEZvY3VzJzpcbiAgICAgICAgaWYgKGlzVGV4dElucHV0RWxlbWVudCh0YXJnZXROb2RlKSB8fCB0YXJnZXROb2RlLmNvbnRlbnRFZGl0YWJsZSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgYWN0aXZlRWxlbWVudCA9IHRhcmdldE5vZGU7XG4gICAgICAgICAgYWN0aXZlRWxlbWVudEluc3QgPSB0YXJnZXRJbnN0O1xuICAgICAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wQmx1cic6XG4gICAgICAgIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xuICAgICAgICBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG4gICAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICBicmVhaztcbiAgICAgIC8vIERvbid0IGZpcmUgdGhlIGV2ZW50IHdoaWxlIHRoZSB1c2VyIGlzIGRyYWdnaW5nLiBUaGlzIG1hdGNoZXMgdGhlXG4gICAgICAvLyBzZW1hbnRpY3Mgb2YgdGhlIG5hdGl2ZSBzZWxlY3QgZXZlbnQuXG4gICAgICBjYXNlICd0b3BNb3VzZURvd24nOlxuICAgICAgICBtb3VzZURvd24gPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcENvbnRleHRNZW51JzpcbiAgICAgIGNhc2UgJ3RvcE1vdXNlVXAnOlxuICAgICAgICBtb3VzZURvd24gPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGNvbnN0cnVjdFNlbGVjdEV2ZW50KG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICAvLyBDaHJvbWUgYW5kIElFIGZpcmUgbm9uLXN0YW5kYXJkIGV2ZW50IHdoZW4gc2VsZWN0aW9uIGlzIGNoYW5nZWQgKGFuZFxuICAgICAgLy8gc29tZXRpbWVzIHdoZW4gaXQgaGFzbid0KS4gSUUncyBldmVudCBmaXJlcyBvdXQgb2Ygb3JkZXIgd2l0aCByZXNwZWN0XG4gICAgICAvLyB0byBrZXkgYW5kIGlucHV0IGV2ZW50cyBvbiBkZWxldGlvbiwgc28gd2UgZGlzY2FyZCBpdC5cbiAgICAgIC8vXG4gICAgICAvLyBGaXJlZm94IGRvZXNuJ3Qgc3VwcG9ydCBzZWxlY3Rpb25jaGFuZ2UsIHNvIGNoZWNrIHNlbGVjdGlvbiBzdGF0dXNcbiAgICAgIC8vIGFmdGVyIGVhY2gga2V5IGVudHJ5LiBUaGUgc2VsZWN0aW9uIGNoYW5nZXMgYWZ0ZXIga2V5ZG93biBhbmQgYmVmb3JlXG4gICAgICAvLyBrZXl1cCwgYnV0IHdlIGNoZWNrIG9uIGtleWRvd24gYXMgd2VsbCBpbiB0aGUgY2FzZSBvZiBob2xkaW5nIGRvd24gYVxuICAgICAgLy8ga2V5LCB3aGVuIG11bHRpcGxlIGtleWRvd24gZXZlbnRzIGFyZSBmaXJlZCBidXQgb25seSBvbmUga2V5dXAgaXMuXG4gICAgICAvLyBUaGlzIGlzIGFsc28gb3VyIGFwcHJvYWNoIGZvciBJRSBoYW5kbGluZywgZm9yIHRoZSByZWFzb24gYWJvdmUuXG4gICAgICBjYXNlICd0b3BTZWxlY3Rpb25DaGFuZ2UnOlxuICAgICAgICBpZiAoc2tpcFNlbGVjdGlvbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICAgIGNhc2UgJ3RvcEtleURvd24nOlxuICAgICAgY2FzZSAndG9wS2V5VXAnOlxuICAgICAgICByZXR1cm4gY29uc3RydWN0U2VsZWN0RXZlbnQobmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcblxuICBkaWRQdXRMaXN0ZW5lcjogZnVuY3Rpb24gKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUsIGxpc3RlbmVyKSB7XG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgPT09ICdvblNlbGVjdCcpIHtcbiAgICAgIGhhc0xpc3RlbmVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gU2VsZWN0RXZlbnRQbHVnaW47IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY0V2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNFdmVudCcpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1hbmltYXRpb25zLyNBbmltYXRpb25FdmVudC1pbnRlcmZhY2VcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0FuaW1hdGlvbkV2ZW50XG4gKi9cbnZhciBBbmltYXRpb25FdmVudEludGVyZmFjZSA9IHtcbiAgYW5pbWF0aW9uTmFtZTogbnVsbCxcbiAgZWxhcHNlZFRpbWU6IG51bGwsXG4gIHBzZXVkb0VsZW1lbnQ6IG51bGxcbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY0V2ZW50fVxuICovXG5mdW5jdGlvbiBTeW50aGV0aWNBbmltYXRpb25FdmVudChkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICByZXR1cm4gU3ludGhldGljRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cblN5bnRoZXRpY0V2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNBbmltYXRpb25FdmVudCwgQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBTeW50aGV0aWNFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljRXZlbnQnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NsaXBib2FyZC1hcGlzL1xuICovXG52YXIgQ2xpcGJvYXJkRXZlbnRJbnRlcmZhY2UgPSB7XG4gIGNsaXBib2FyZERhdGE6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnY2xpcGJvYXJkRGF0YScgaW4gZXZlbnQgPyBldmVudC5jbGlwYm9hcmREYXRhIDogd2luZG93LmNsaXBib2FyZERhdGE7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9XG4gKi9cbmZ1bmN0aW9uIFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBTeW50aGV0aWNFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuU3ludGhldGljRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50LCBDbGlwYm9hcmRFdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljQ2xpcGJvYXJkRXZlbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY1VJRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY1VJRXZlbnQnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIEZvY3VzRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG52YXIgRm9jdXNFdmVudEludGVyZmFjZSA9IHtcbiAgcmVsYXRlZFRhcmdldDogbnVsbFxufTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAZXh0ZW5kcyB7U3ludGhldGljVUlFdmVudH1cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljRm9jdXNFdmVudChkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICByZXR1cm4gU3ludGhldGljVUlFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuU3ludGhldGljVUlFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljRm9jdXNFdmVudCwgRm9jdXNFdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljRm9jdXNFdmVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIGBjaGFyQ29kZWAgcmVwcmVzZW50cyB0aGUgYWN0dWFsIFwiY2hhcmFjdGVyIGNvZGVcIiBhbmQgaXMgc2FmZSB0byB1c2Ugd2l0aFxuICogYFN0cmluZy5mcm9tQ2hhckNvZGVgLiBBcyBzdWNoLCBvbmx5IGtleXMgdGhhdCBjb3JyZXNwb25kIHRvIHByaW50YWJsZVxuICogY2hhcmFjdGVycyBwcm9kdWNlIGEgdmFsaWQgYGNoYXJDb2RlYCwgdGhlIG9ubHkgZXhjZXB0aW9uIHRvIHRoaXMgaXMgRW50ZXIuXG4gKiBUaGUgVGFiLWtleSBpcyBjb25zaWRlcmVkIG5vbi1wcmludGFibGUgYW5kIGRvZXMgbm90IGhhdmUgYSBgY2hhckNvZGVgLFxuICogcHJlc3VtYWJseSBiZWNhdXNlIGl0IGRvZXMgbm90IHByb2R1Y2UgYSB0YWItY2hhcmFjdGVyIGluIGJyb3dzZXJzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge251bWJlcn0gTm9ybWFsaXplZCBgY2hhckNvZGVgIHByb3BlcnR5LlxuICovXG5cbmZ1bmN0aW9uIGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGNoYXJDb2RlO1xuICB2YXIga2V5Q29kZSA9IG5hdGl2ZUV2ZW50LmtleUNvZGU7XG5cbiAgaWYgKCdjaGFyQ29kZScgaW4gbmF0aXZlRXZlbnQpIHtcbiAgICBjaGFyQ29kZSA9IG5hdGl2ZUV2ZW50LmNoYXJDb2RlO1xuXG4gICAgLy8gRkYgZG9lcyBub3Qgc2V0IGBjaGFyQ29kZWAgZm9yIHRoZSBFbnRlci1rZXksIGNoZWNrIGFnYWluc3QgYGtleUNvZGVgLlxuICAgIGlmIChjaGFyQ29kZSA9PT0gMCAmJiBrZXlDb2RlID09PSAxMykge1xuICAgICAgY2hhckNvZGUgPSAxMztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSUU4IGRvZXMgbm90IGltcGxlbWVudCBgY2hhckNvZGVgLCBidXQgYGtleUNvZGVgIGhhcyB0aGUgY29ycmVjdCB2YWx1ZS5cbiAgICBjaGFyQ29kZSA9IGtleUNvZGU7XG4gIH1cblxuICAvLyBTb21lIG5vbi1wcmludGFibGUga2V5cyBhcmUgcmVwb3J0ZWQgaW4gYGNoYXJDb2RlYC9ga2V5Q29kZWAsIGRpc2NhcmQgdGhlbS5cbiAgLy8gTXVzdCBub3QgZGlzY2FyZCB0aGUgKG5vbi0pcHJpbnRhYmxlIEVudGVyLWtleS5cbiAgaWYgKGNoYXJDb2RlID49IDMyIHx8IGNoYXJDb2RlID09PSAxMykge1xuICAgIHJldHVybiBjaGFyQ29kZTtcbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEV2ZW50Q2hhckNvZGU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGdldEV2ZW50Q2hhckNvZGUgPSByZXF1aXJlKCcuL2dldEV2ZW50Q2hhckNvZGUnKTtcblxuLyoqXG4gKiBOb3JtYWxpemF0aW9uIG9mIGRlcHJlY2F0ZWQgSFRNTDUgYGtleWAgdmFsdWVzXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50I0tleV9uYW1lc1xuICovXG52YXIgbm9ybWFsaXplS2V5ID0ge1xuICBFc2M6ICdFc2NhcGUnLFxuICBTcGFjZWJhcjogJyAnLFxuICBMZWZ0OiAnQXJyb3dMZWZ0JyxcbiAgVXA6ICdBcnJvd1VwJyxcbiAgUmlnaHQ6ICdBcnJvd1JpZ2h0JyxcbiAgRG93bjogJ0Fycm93RG93bicsXG4gIERlbDogJ0RlbGV0ZScsXG4gIFdpbjogJ09TJyxcbiAgTWVudTogJ0NvbnRleHRNZW51JyxcbiAgQXBwczogJ0NvbnRleHRNZW51JyxcbiAgU2Nyb2xsOiAnU2Nyb2xsTG9jaycsXG4gIE1velByaW50YWJsZUtleTogJ1VuaWRlbnRpZmllZCdcbn07XG5cbi8qKlxuICogVHJhbnNsYXRpb24gZnJvbSBsZWdhY3kgYGtleUNvZGVgIHRvIEhUTUw1IGBrZXlgXG4gKiBPbmx5IHNwZWNpYWwga2V5cyBzdXBwb3J0ZWQsIGFsbCBvdGhlcnMgZGVwZW5kIG9uIGtleWJvYXJkIGxheW91dCBvciBicm93c2VyXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50I0tleV9uYW1lc1xuICovXG52YXIgdHJhbnNsYXRlVG9LZXkgPSB7XG4gIDg6ICdCYWNrc3BhY2UnLFxuICA5OiAnVGFiJyxcbiAgMTI6ICdDbGVhcicsXG4gIDEzOiAnRW50ZXInLFxuICAxNjogJ1NoaWZ0JyxcbiAgMTc6ICdDb250cm9sJyxcbiAgMTg6ICdBbHQnLFxuICAxOTogJ1BhdXNlJyxcbiAgMjA6ICdDYXBzTG9jaycsXG4gIDI3OiAnRXNjYXBlJyxcbiAgMzI6ICcgJyxcbiAgMzM6ICdQYWdlVXAnLFxuICAzNDogJ1BhZ2VEb3duJyxcbiAgMzU6ICdFbmQnLFxuICAzNjogJ0hvbWUnLFxuICAzNzogJ0Fycm93TGVmdCcsXG4gIDM4OiAnQXJyb3dVcCcsXG4gIDM5OiAnQXJyb3dSaWdodCcsXG4gIDQwOiAnQXJyb3dEb3duJyxcbiAgNDU6ICdJbnNlcnQnLFxuICA0NjogJ0RlbGV0ZScsXG4gIDExMjogJ0YxJyxcbiAgMTEzOiAnRjInLFxuICAxMTQ6ICdGMycsXG4gIDExNTogJ0Y0JyxcbiAgMTE2OiAnRjUnLFxuICAxMTc6ICdGNicsXG4gIDExODogJ0Y3JyxcbiAgMTE5OiAnRjgnLFxuICAxMjA6ICdGOScsXG4gIDEyMTogJ0YxMCcsXG4gIDEyMjogJ0YxMScsXG4gIDEyMzogJ0YxMicsXG4gIDE0NDogJ051bUxvY2snLFxuICAxNDU6ICdTY3JvbGxMb2NrJyxcbiAgMjI0OiAnTWV0YSdcbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7c3RyaW5nfSBOb3JtYWxpemVkIGBrZXlgIHByb3BlcnR5LlxuICovXG5mdW5jdGlvbiBnZXRFdmVudEtleShuYXRpdmVFdmVudCkge1xuICBpZiAobmF0aXZlRXZlbnQua2V5KSB7XG4gICAgLy8gTm9ybWFsaXplIGluY29uc2lzdGVudCB2YWx1ZXMgcmVwb3J0ZWQgYnkgYnJvd3NlcnMgZHVlIHRvXG4gICAgLy8gaW1wbGVtZW50YXRpb25zIG9mIGEgd29ya2luZyBkcmFmdCBzcGVjaWZpY2F0aW9uLlxuXG4gICAgLy8gRmlyZUZveCBpbXBsZW1lbnRzIGBrZXlgIGJ1dCByZXR1cm5zIGBNb3pQcmludGFibGVLZXlgIGZvciBhbGxcbiAgICAvLyBwcmludGFibGUgY2hhcmFjdGVycyAobm9ybWFsaXplZCB0byBgVW5pZGVudGlmaWVkYCksIGlnbm9yZSBpdC5cbiAgICB2YXIga2V5ID0gbm9ybWFsaXplS2V5W25hdGl2ZUV2ZW50LmtleV0gfHwgbmF0aXZlRXZlbnQua2V5O1xuICAgIGlmIChrZXkgIT09ICdVbmlkZW50aWZpZWQnKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgfVxuXG4gIC8vIEJyb3dzZXIgZG9lcyBub3QgaW1wbGVtZW50IGBrZXlgLCBwb2x5ZmlsbCBhcyBtdWNoIG9mIGl0IGFzIHdlIGNhbi5cbiAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICB2YXIgY2hhckNvZGUgPSBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KTtcblxuICAgIC8vIFRoZSBlbnRlci1rZXkgaXMgdGVjaG5pY2FsbHkgYm90aCBwcmludGFibGUgYW5kIG5vbi1wcmludGFibGUgYW5kIGNhblxuICAgIC8vIHRodXMgYmUgY2FwdHVyZWQgYnkgYGtleXByZXNzYCwgbm8gb3RoZXIgbm9uLXByaW50YWJsZSBrZXkgc2hvdWxkLlxuICAgIHJldHVybiBjaGFyQ29kZSA9PT0gMTMgPyAnRW50ZXInIDogU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gIH1cbiAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBuYXRpdmVFdmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgLy8gV2hpbGUgdXNlciBrZXlib2FyZCBsYXlvdXQgZGV0ZXJtaW5lcyB0aGUgYWN0dWFsIG1lYW5pbmcgb2YgZWFjaFxuICAgIC8vIGBrZXlDb2RlYCB2YWx1ZSwgYWxtb3N0IGFsbCBmdW5jdGlvbiBrZXlzIGhhdmUgYSB1bml2ZXJzYWwgdmFsdWUuXG4gICAgcmV0dXJuIHRyYW5zbGF0ZVRvS2V5W25hdGl2ZUV2ZW50LmtleUNvZGVdIHx8ICdVbmlkZW50aWZpZWQnO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRFdmVudEtleTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3ludGhldGljVUlFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljVUlFdmVudCcpO1xuXG52YXIgZ2V0RXZlbnRDaGFyQ29kZSA9IHJlcXVpcmUoJy4vZ2V0RXZlbnRDaGFyQ29kZScpO1xudmFyIGdldEV2ZW50S2V5ID0gcmVxdWlyZSgnLi9nZXRFdmVudEtleScpO1xudmFyIGdldEV2ZW50TW9kaWZpZXJTdGF0ZSA9IHJlcXVpcmUoJy4vZ2V0RXZlbnRNb2RpZmllclN0YXRlJyk7XG5cbi8qKlxuICogQGludGVyZmFjZSBLZXlib2FyZEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xudmFyIEtleWJvYXJkRXZlbnRJbnRlcmZhY2UgPSB7XG4gIGtleTogZ2V0RXZlbnRLZXksXG4gIGxvY2F0aW9uOiBudWxsLFxuICBjdHJsS2V5OiBudWxsLFxuICBzaGlmdEtleTogbnVsbCxcbiAgYWx0S2V5OiBudWxsLFxuICBtZXRhS2V5OiBudWxsLFxuICByZXBlYXQ6IG51bGwsXG4gIGxvY2FsZTogbnVsbCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlLFxuICAvLyBMZWdhY3kgSW50ZXJmYWNlXG4gIGNoYXJDb2RlOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBgY2hhckNvZGVgIGlzIHRoZSByZXN1bHQgb2YgYSBLZXlQcmVzcyBldmVudCBhbmQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2ZcbiAgICAvLyB0aGUgYWN0dWFsIHByaW50YWJsZSBjaGFyYWN0ZXIuXG5cbiAgICAvLyBLZXlQcmVzcyBpcyBkZXByZWNhdGVkLCBidXQgaXRzIHJlcGxhY2VtZW50IGlzIG5vdCB5ZXQgZmluYWwgYW5kIG5vdFxuICAgIC8vIGltcGxlbWVudGVkIGluIGFueSBtYWpvciBicm93c2VyLiBPbmx5IEtleVByZXNzIGhhcyBjaGFyQ29kZS5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgcmV0dXJuIGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAga2V5Q29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYGtleUNvZGVgIGlzIHRoZSByZXN1bHQgb2YgYSBLZXlEb3duL1VwIGV2ZW50IGFuZCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZlxuICAgIC8vIHBoeXNpY2FsIGtleWJvYXJkIGtleS5cblxuICAgIC8vIFRoZSBhY3R1YWwgbWVhbmluZyBvZiB0aGUgdmFsdWUgZGVwZW5kcyBvbiB0aGUgdXNlcnMnIGtleWJvYXJkIGxheW91dFxuICAgIC8vIHdoaWNoIGNhbm5vdCBiZSBkZXRlY3RlZC4gQXNzdW1pbmcgdGhhdCBpdCBpcyBhIFVTIGtleWJvYXJkIGxheW91dFxuICAgIC8vIHByb3ZpZGVzIGEgc3VycHJpc2luZ2x5IGFjY3VyYXRlIG1hcHBpbmcgZm9yIFVTIGFuZCBFdXJvcGVhbiB1c2Vycy5cbiAgICAvLyBEdWUgdG8gdGhpcywgaXQgaXMgbGVmdCB0byB0aGUgdXNlciB0byBpbXBsZW1lbnQgYXQgdGhpcyB0aW1lLlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5ZG93bicgfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgICAgcmV0dXJuIGV2ZW50LmtleUNvZGU7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9LFxuICB3aGljaDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYHdoaWNoYCBpcyBhbiBhbGlhcyBmb3IgZWl0aGVyIGBrZXlDb2RlYCBvciBgY2hhckNvZGVgIGRlcGVuZGluZyBvbiB0aGVcbiAgICAvLyB0eXBlIG9mIHRoZSBldmVudC5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgcmV0dXJuIGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpO1xuICAgIH1cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgIHJldHVybiBldmVudC5rZXlDb2RlO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAZXh0ZW5kcyB7U3ludGhldGljVUlFdmVudH1cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljS2V5Ym9hcmRFdmVudChkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICByZXR1cm4gU3ludGhldGljVUlFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuU3ludGhldGljVUlFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljS2V5Ym9hcmRFdmVudCwgS2V5Ym9hcmRFdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljS2V5Ym9hcmRFdmVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3ludGhldGljTW91c2VFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljTW91c2VFdmVudCcpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRHJhZ0V2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xudmFyIERyYWdFdmVudEludGVyZmFjZSA9IHtcbiAgZGF0YVRyYW5zZmVyOiBudWxsXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEBleHRlbmRzIHtTeW50aGV0aWNVSUV2ZW50fVxuICovXG5mdW5jdGlvbiBTeW50aGV0aWNEcmFnRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY01vdXNlRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cblN5bnRoZXRpY01vdXNlRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY0RyYWdFdmVudCwgRHJhZ0V2ZW50SW50ZXJmYWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNEcmFnRXZlbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY1VJRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY1VJRXZlbnQnKTtcblxudmFyIGdldEV2ZW50TW9kaWZpZXJTdGF0ZSA9IHJlcXVpcmUoJy4vZ2V0RXZlbnRNb2RpZmllclN0YXRlJyk7XG5cbi8qKlxuICogQGludGVyZmFjZSBUb3VjaEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3RvdWNoLWV2ZW50cy9cbiAqL1xudmFyIFRvdWNoRXZlbnRJbnRlcmZhY2UgPSB7XG4gIHRvdWNoZXM6IG51bGwsXG4gIHRhcmdldFRvdWNoZXM6IG51bGwsXG4gIGNoYW5nZWRUb3VjaGVzOiBudWxsLFxuICBhbHRLZXk6IG51bGwsXG4gIG1ldGFLZXk6IG51bGwsXG4gIGN0cmxLZXk6IG51bGwsXG4gIHNoaWZ0S2V5OiBudWxsLFxuICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGVcbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9XG4gKi9cbmZ1bmN0aW9uIFN5bnRoZXRpY1RvdWNoRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY1VJRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cblN5bnRoZXRpY1VJRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY1RvdWNoRXZlbnQsIFRvdWNoRXZlbnRJbnRlcmZhY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY1RvdWNoRXZlbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY0V2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNFdmVudCcpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwOS9XRC1jc3MzLXRyYW5zaXRpb25zLTIwMDkwMzIwLyN0cmFuc2l0aW9uLWV2ZW50cy1cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RyYW5zaXRpb25FdmVudFxuICovXG52YXIgVHJhbnNpdGlvbkV2ZW50SW50ZXJmYWNlID0ge1xuICBwcm9wZXJ0eU5hbWU6IG51bGwsXG4gIGVsYXBzZWRUaW1lOiBudWxsLFxuICBwc2V1ZG9FbGVtZW50OiBudWxsXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEBleHRlbmRzIHtTeW50aGV0aWNFdmVudH1cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljVHJhbnNpdGlvbkV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBTeW50aGV0aWNFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuU3ludGhldGljRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudCwgVHJhbnNpdGlvbkV2ZW50SW50ZXJmYWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY01vdXNlRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY01vdXNlRXZlbnQnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIFdoZWVsRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG52YXIgV2hlZWxFdmVudEludGVyZmFjZSA9IHtcbiAgZGVsdGFYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2RlbHRhWCcgaW4gZXZlbnQgPyBldmVudC5kZWx0YVggOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YVhgIGZvciBXZWJraXQgYW5kIG5vcm1hbGl6ZSAocmlnaHQgaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhWCcgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YVggOiAwO1xuICB9LFxuICBkZWx0YVk6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnZGVsdGFZJyBpbiBldmVudCA/IGV2ZW50LmRlbHRhWSA6IC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhWWAgZm9yIFdlYmtpdCBhbmQgbm9ybWFsaXplIChkb3duIGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YVknIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGFZIDogLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFgIGZvciBJRTw5IGFuZCBub3JtYWxpemUgKGRvd24gaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhIDogMDtcbiAgfSxcbiAgZGVsdGFaOiBudWxsLFxuXG4gIC8vIEJyb3dzZXJzIHdpdGhvdXQgXCJkZWx0YU1vZGVcIiBpcyByZXBvcnRpbmcgaW4gcmF3IHdoZWVsIGRlbHRhIHdoZXJlIG9uZVxuICAvLyBub3RjaCBvbiB0aGUgc2Nyb2xsIGlzIGFsd2F5cyArLy0gMTIwLCByb3VnaGx5IGVxdWl2YWxlbnQgdG8gcGl4ZWxzLlxuICAvLyBBIGdvb2QgYXBwcm94aW1hdGlvbiBvZiBET01fREVMVEFfTElORSAoMSkgaXMgNSUgb2Ygdmlld3BvcnQgc2l6ZSBvclxuICAvLyB+NDAgcGl4ZWxzLCBmb3IgRE9NX0RFTFRBX1NDUkVFTiAoMikgaXQgaXMgODcuNSUgb2Ygdmlld3BvcnQgc2l6ZS5cbiAgZGVsdGFNb2RlOiBudWxsXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEBleHRlbmRzIHtTeW50aGV0aWNNb3VzZUV2ZW50fVxuICovXG5mdW5jdGlvbiBTeW50aGV0aWNXaGVlbEV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBTeW50aGV0aWNNb3VzZUV2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNNb3VzZUV2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNXaGVlbEV2ZW50LCBXaGVlbEV2ZW50SW50ZXJmYWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNXaGVlbEV2ZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIEV2ZW50TGlzdGVuZXIgPSByZXF1aXJlKCdmYmpzL2xpYi9FdmVudExpc3RlbmVyJyk7XG52YXIgRXZlbnRQcm9wYWdhdG9ycyA9IHJlcXVpcmUoJy4vRXZlbnRQcm9wYWdhdG9ycycpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgU3ludGhldGljQW5pbWF0aW9uRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0FuaW1hdGlvbkV2ZW50Jyk7XG52YXIgU3ludGhldGljQ2xpcGJvYXJkRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0NsaXBib2FyZEV2ZW50Jyk7XG52YXIgU3ludGhldGljRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0V2ZW50Jyk7XG52YXIgU3ludGhldGljRm9jdXNFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljRm9jdXNFdmVudCcpO1xudmFyIFN5bnRoZXRpY0tleWJvYXJkRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0tleWJvYXJkRXZlbnQnKTtcbnZhciBTeW50aGV0aWNNb3VzZUV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNNb3VzZUV2ZW50Jyk7XG52YXIgU3ludGhldGljRHJhZ0V2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNEcmFnRXZlbnQnKTtcbnZhciBTeW50aGV0aWNUb3VjaEV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNUb3VjaEV2ZW50Jyk7XG52YXIgU3ludGhldGljVHJhbnNpdGlvbkV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQnKTtcbnZhciBTeW50aGV0aWNVSUV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNVSUV2ZW50Jyk7XG52YXIgU3ludGhldGljV2hlZWxFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljV2hlZWxFdmVudCcpO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTtcbnZhciBnZXRFdmVudENoYXJDb2RlID0gcmVxdWlyZSgnLi9nZXRFdmVudENoYXJDb2RlJyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogVHVybnNcbiAqIFsnYWJvcnQnLCAuLi5dXG4gKiBpbnRvXG4gKiBldmVudFR5cGVzID0ge1xuICogICAnYWJvcnQnOiB7XG4gKiAgICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHtcbiAqICAgICAgIGJ1YmJsZWQ6ICdvbkFib3J0JyxcbiAqICAgICAgIGNhcHR1cmVkOiAnb25BYm9ydENhcHR1cmUnLFxuICogICAgIH0sXG4gKiAgICAgZGVwZW5kZW5jaWVzOiBbJ3RvcEFib3J0J10sXG4gKiAgIH0sXG4gKiAgIC4uLlxuICogfTtcbiAqIHRvcExldmVsRXZlbnRzVG9EaXNwYXRjaENvbmZpZyA9IHtcbiAqICAgJ3RvcEFib3J0JzogeyBzYW1lQ29uZmlnIH1cbiAqIH07XG4gKi9cbnZhciBldmVudFR5cGVzID0ge307XG52YXIgdG9wTGV2ZWxFdmVudHNUb0Rpc3BhdGNoQ29uZmlnID0ge307XG5bJ2Fib3J0JywgJ2FuaW1hdGlvbkVuZCcsICdhbmltYXRpb25JdGVyYXRpb24nLCAnYW5pbWF0aW9uU3RhcnQnLCAnYmx1cicsICdjYW5QbGF5JywgJ2NhblBsYXlUaHJvdWdoJywgJ2NsaWNrJywgJ2NvbnRleHRNZW51JywgJ2NvcHknLCAnY3V0JywgJ2RvdWJsZUNsaWNrJywgJ2RyYWcnLCAnZHJhZ0VuZCcsICdkcmFnRW50ZXInLCAnZHJhZ0V4aXQnLCAnZHJhZ0xlYXZlJywgJ2RyYWdPdmVyJywgJ2RyYWdTdGFydCcsICdkcm9wJywgJ2R1cmF0aW9uQ2hhbmdlJywgJ2VtcHRpZWQnLCAnZW5jcnlwdGVkJywgJ2VuZGVkJywgJ2Vycm9yJywgJ2ZvY3VzJywgJ2lucHV0JywgJ2ludmFsaWQnLCAna2V5RG93bicsICdrZXlQcmVzcycsICdrZXlVcCcsICdsb2FkJywgJ2xvYWRlZERhdGEnLCAnbG9hZGVkTWV0YWRhdGEnLCAnbG9hZFN0YXJ0JywgJ21vdXNlRG93bicsICdtb3VzZU1vdmUnLCAnbW91c2VPdXQnLCAnbW91c2VPdmVyJywgJ21vdXNlVXAnLCAncGFzdGUnLCAncGF1c2UnLCAncGxheScsICdwbGF5aW5nJywgJ3Byb2dyZXNzJywgJ3JhdGVDaGFuZ2UnLCAncmVzZXQnLCAnc2Nyb2xsJywgJ3NlZWtlZCcsICdzZWVraW5nJywgJ3N0YWxsZWQnLCAnc3VibWl0JywgJ3N1c3BlbmQnLCAndGltZVVwZGF0ZScsICd0b3VjaENhbmNlbCcsICd0b3VjaEVuZCcsICd0b3VjaE1vdmUnLCAndG91Y2hTdGFydCcsICd0cmFuc2l0aW9uRW5kJywgJ3ZvbHVtZUNoYW5nZScsICd3YWl0aW5nJywgJ3doZWVsJ10uZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgdmFyIGNhcGl0YWxpemVkRXZlbnQgPSBldmVudFswXS50b1VwcGVyQ2FzZSgpICsgZXZlbnQuc2xpY2UoMSk7XG4gIHZhciBvbkV2ZW50ID0gJ29uJyArIGNhcGl0YWxpemVkRXZlbnQ7XG4gIHZhciB0b3BFdmVudCA9ICd0b3AnICsgY2FwaXRhbGl6ZWRFdmVudDtcblxuICB2YXIgdHlwZSA9IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogb25FdmVudCxcbiAgICAgIGNhcHR1cmVkOiBvbkV2ZW50ICsgJ0NhcHR1cmUnXG4gICAgfSxcbiAgICBkZXBlbmRlbmNpZXM6IFt0b3BFdmVudF1cbiAgfTtcbiAgZXZlbnRUeXBlc1tldmVudF0gPSB0eXBlO1xuICB0b3BMZXZlbEV2ZW50c1RvRGlzcGF0Y2hDb25maWdbdG9wRXZlbnRdID0gdHlwZTtcbn0pO1xuXG52YXIgb25DbGlja0xpc3RlbmVycyA9IHt9O1xuXG5mdW5jdGlvbiBnZXREaWN0aW9uYXJ5S2V5KGluc3QpIHtcbiAgLy8gUHJldmVudHMgVjggcGVyZm9ybWFuY2UgaXNzdWU6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzcyMzJcbiAgcmV0dXJuICcuJyArIGluc3QuX3Jvb3ROb2RlSUQ7XG59XG5cbmZ1bmN0aW9uIGlzSW50ZXJhY3RpdmUodGFnKSB7XG4gIHJldHVybiB0YWcgPT09ICdidXR0b24nIHx8IHRhZyA9PT0gJ2lucHV0JyB8fCB0YWcgPT09ICdzZWxlY3QnIHx8IHRhZyA9PT0gJ3RleHRhcmVhJztcbn1cblxudmFyIFNpbXBsZUV2ZW50UGx1Z2luID0ge1xuICBldmVudFR5cGVzOiBldmVudFR5cGVzLFxuXG4gIGV4dHJhY3RFdmVudHM6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIHZhciBkaXNwYXRjaENvbmZpZyA9IHRvcExldmVsRXZlbnRzVG9EaXNwYXRjaENvbmZpZ1t0b3BMZXZlbFR5cGVdO1xuICAgIGlmICghZGlzcGF0Y2hDb25maWcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgRXZlbnRDb25zdHJ1Y3RvcjtcbiAgICBzd2l0Y2ggKHRvcExldmVsVHlwZSkge1xuICAgICAgY2FzZSAndG9wQWJvcnQnOlxuICAgICAgY2FzZSAndG9wQ2FuUGxheSc6XG4gICAgICBjYXNlICd0b3BDYW5QbGF5VGhyb3VnaCc6XG4gICAgICBjYXNlICd0b3BEdXJhdGlvbkNoYW5nZSc6XG4gICAgICBjYXNlICd0b3BFbXB0aWVkJzpcbiAgICAgIGNhc2UgJ3RvcEVuY3J5cHRlZCc6XG4gICAgICBjYXNlICd0b3BFbmRlZCc6XG4gICAgICBjYXNlICd0b3BFcnJvcic6XG4gICAgICBjYXNlICd0b3BJbnB1dCc6XG4gICAgICBjYXNlICd0b3BJbnZhbGlkJzpcbiAgICAgIGNhc2UgJ3RvcExvYWQnOlxuICAgICAgY2FzZSAndG9wTG9hZGVkRGF0YSc6XG4gICAgICBjYXNlICd0b3BMb2FkZWRNZXRhZGF0YSc6XG4gICAgICBjYXNlICd0b3BMb2FkU3RhcnQnOlxuICAgICAgY2FzZSAndG9wUGF1c2UnOlxuICAgICAgY2FzZSAndG9wUGxheSc6XG4gICAgICBjYXNlICd0b3BQbGF5aW5nJzpcbiAgICAgIGNhc2UgJ3RvcFByb2dyZXNzJzpcbiAgICAgIGNhc2UgJ3RvcFJhdGVDaGFuZ2UnOlxuICAgICAgY2FzZSAndG9wUmVzZXQnOlxuICAgICAgY2FzZSAndG9wU2Vla2VkJzpcbiAgICAgIGNhc2UgJ3RvcFNlZWtpbmcnOlxuICAgICAgY2FzZSAndG9wU3RhbGxlZCc6XG4gICAgICBjYXNlICd0b3BTdWJtaXQnOlxuICAgICAgY2FzZSAndG9wU3VzcGVuZCc6XG4gICAgICBjYXNlICd0b3BUaW1lVXBkYXRlJzpcbiAgICAgIGNhc2UgJ3RvcFZvbHVtZUNoYW5nZSc6XG4gICAgICBjYXNlICd0b3BXYWl0aW5nJzpcbiAgICAgICAgLy8gSFRNTCBFdmVudHNcbiAgICAgICAgLy8gQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNS9pbmRleC5odG1sI2V2ZW50cy0wXG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNFdmVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3BLZXlQcmVzcyc6XG4gICAgICAgIC8vIEZpcmVmb3ggY3JlYXRlcyBhIGtleXByZXNzIGV2ZW50IGZvciBmdW5jdGlvbiBrZXlzIHRvby4gVGhpcyByZW1vdmVzXG4gICAgICAgIC8vIHRoZSB1bndhbnRlZCBrZXlwcmVzcyBldmVudHMuIEVudGVyIGlzIGhvd2V2ZXIgYm90aCBwcmludGFibGUgYW5kXG4gICAgICAgIC8vIG5vbi1wcmludGFibGUuIE9uZSB3b3VsZCBleHBlY3QgVGFiIHRvIGJlIGFzIHdlbGwgKGJ1dCBpdCBpc24ndCkuXG4gICAgICAgIGlmIChnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KSA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlICd0b3BLZXlEb3duJzpcbiAgICAgIGNhc2UgJ3RvcEtleVVwJzpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY0tleWJvYXJkRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wQmx1cic6XG4gICAgICBjYXNlICd0b3BGb2N1cyc6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcENsaWNrJzpcbiAgICAgICAgLy8gRmlyZWZveCBjcmVhdGVzIGEgY2xpY2sgZXZlbnQgb24gcmlnaHQgbW91c2UgY2xpY2tzLiBUaGlzIHJlbW92ZXMgdGhlXG4gICAgICAgIC8vIHVud2FudGVkIGNsaWNrIGV2ZW50cy5cbiAgICAgICAgaWYgKG5hdGl2ZUV2ZW50LmJ1dHRvbiA9PT0gMikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlICd0b3BEb3VibGVDbGljayc6XG4gICAgICBjYXNlICd0b3BNb3VzZURvd24nOlxuICAgICAgY2FzZSAndG9wTW91c2VNb3ZlJzpcbiAgICAgIGNhc2UgJ3RvcE1vdXNlVXAnOlxuICAgICAgLy8gVE9ETzogRGlzYWJsZWQgZWxlbWVudHMgc2hvdWxkIG5vdCByZXNwb25kIHRvIG1vdXNlIGV2ZW50c1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSAndG9wTW91c2VPdXQnOlxuICAgICAgY2FzZSAndG9wTW91c2VPdmVyJzpcbiAgICAgIGNhc2UgJ3RvcENvbnRleHRNZW51JzpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY01vdXNlRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wRHJhZyc6XG4gICAgICBjYXNlICd0b3BEcmFnRW5kJzpcbiAgICAgIGNhc2UgJ3RvcERyYWdFbnRlcic6XG4gICAgICBjYXNlICd0b3BEcmFnRXhpdCc6XG4gICAgICBjYXNlICd0b3BEcmFnTGVhdmUnOlxuICAgICAgY2FzZSAndG9wRHJhZ092ZXInOlxuICAgICAgY2FzZSAndG9wRHJhZ1N0YXJ0JzpcbiAgICAgIGNhc2UgJ3RvcERyb3AnOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljRHJhZ0V2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcFRvdWNoQ2FuY2VsJzpcbiAgICAgIGNhc2UgJ3RvcFRvdWNoRW5kJzpcbiAgICAgIGNhc2UgJ3RvcFRvdWNoTW92ZSc6XG4gICAgICBjYXNlICd0b3BUb3VjaFN0YXJ0JzpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY1RvdWNoRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wQW5pbWF0aW9uRW5kJzpcbiAgICAgIGNhc2UgJ3RvcEFuaW1hdGlvbkl0ZXJhdGlvbic6XG4gICAgICBjYXNlICd0b3BBbmltYXRpb25TdGFydCc6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNBbmltYXRpb25FdmVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3BUcmFuc2l0aW9uRW5kJzpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3BTY3JvbGwnOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljVUlFdmVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3BXaGVlbCc6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNXaGVlbEV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcENvcHknOlxuICAgICAgY2FzZSAndG9wQ3V0JzpcbiAgICAgIGNhc2UgJ3RvcFBhc3RlJzpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgIUV2ZW50Q29uc3RydWN0b3IgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnU2ltcGxlRXZlbnRQbHVnaW46IFVuaGFuZGxlZCBldmVudCB0eXBlLCBgJXNgLicsIHRvcExldmVsVHlwZSkgOiBfcHJvZEludmFyaWFudCgnODYnLCB0b3BMZXZlbFR5cGUpIDogdm9pZCAwO1xuICAgIHZhciBldmVudCA9IEV2ZW50Q29uc3RydWN0b3IuZ2V0UG9vbGVkKGRpc3BhdGNoQ29uZmlnLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIEV2ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhldmVudCk7XG4gICAgcmV0dXJuIGV2ZW50O1xuICB9LFxuXG4gIGRpZFB1dExpc3RlbmVyOiBmdW5jdGlvbiAoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSwgbGlzdGVuZXIpIHtcbiAgICAvLyBNb2JpbGUgU2FmYXJpIGRvZXMgbm90IGZpcmUgcHJvcGVybHkgYnViYmxlIGNsaWNrIGV2ZW50cyBvblxuICAgIC8vIG5vbi1pbnRlcmFjdGl2ZSBlbGVtZW50cywgd2hpY2ggbWVhbnMgZGVsZWdhdGVkIGNsaWNrIGxpc3RlbmVycyBkbyBub3RcbiAgICAvLyBmaXJlLiBUaGUgd29ya2Fyb3VuZCBmb3IgdGhpcyBidWcgaW52b2x2ZXMgYXR0YWNoaW5nIGFuIGVtcHR5IGNsaWNrXG4gICAgLy8gbGlzdGVuZXIgb24gdGhlIHRhcmdldCBub2RlLlxuICAgIC8vIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDEwLzA5L2NsaWNrX2V2ZW50X2RlbC5odG1sXG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgPT09ICdvbkNsaWNrJyAmJiAhaXNJbnRlcmFjdGl2ZShpbnN0Ll90YWcpKSB7XG4gICAgICB2YXIga2V5ID0gZ2V0RGljdGlvbmFyeUtleShpbnN0KTtcbiAgICAgIHZhciBub2RlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCk7XG4gICAgICBpZiAoIW9uQ2xpY2tMaXN0ZW5lcnNba2V5XSkge1xuICAgICAgICBvbkNsaWNrTGlzdGVuZXJzW2tleV0gPSBFdmVudExpc3RlbmVyLmxpc3Rlbihub2RlLCAnY2xpY2snLCBlbXB0eUZ1bmN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgd2lsbERlbGV0ZUxpc3RlbmVyOiBmdW5jdGlvbiAoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkge1xuICAgIGlmIChyZWdpc3RyYXRpb25OYW1lID09PSAnb25DbGljaycgJiYgIWlzSW50ZXJhY3RpdmUoaW5zdC5fdGFnKSkge1xuICAgICAgdmFyIGtleSA9IGdldERpY3Rpb25hcnlLZXkoaW5zdCk7XG4gICAgICBvbkNsaWNrTGlzdGVuZXJzW2tleV0ucmVtb3ZlKCk7XG4gICAgICBkZWxldGUgb25DbGlja0xpc3RlbmVyc1trZXldO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBTaW1wbGVFdmVudFBsdWdpbjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgQVJJQURPTVByb3BlcnR5Q29uZmlnID0gcmVxdWlyZSgnLi9BUklBRE9NUHJvcGVydHlDb25maWcnKTtcbnZhciBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luID0gcmVxdWlyZSgnLi9CZWZvcmVJbnB1dEV2ZW50UGx1Z2luJyk7XG52YXIgQ2hhbmdlRXZlbnRQbHVnaW4gPSByZXF1aXJlKCcuL0NoYW5nZUV2ZW50UGx1Z2luJyk7XG52YXIgRGVmYXVsdEV2ZW50UGx1Z2luT3JkZXIgPSByZXF1aXJlKCcuL0RlZmF1bHRFdmVudFBsdWdpbk9yZGVyJyk7XG52YXIgRW50ZXJMZWF2ZUV2ZW50UGx1Z2luID0gcmVxdWlyZSgnLi9FbnRlckxlYXZlRXZlbnRQbHVnaW4nKTtcbnZhciBIVE1MRE9NUHJvcGVydHlDb25maWcgPSByZXF1aXJlKCcuL0hUTUxET01Qcm9wZXJ0eUNvbmZpZycpO1xudmFyIFJlYWN0Q29tcG9uZW50QnJvd3NlckVudmlyb25tZW50ID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudCcpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudCcpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RET01FbXB0eUNvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RET01FbXB0eUNvbXBvbmVudCcpO1xudmFyIFJlYWN0RE9NVHJlZVRyYXZlcnNhbCA9IHJlcXVpcmUoJy4vUmVhY3RET01UcmVlVHJhdmVyc2FsJyk7XG52YXIgUmVhY3RET01UZXh0Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdERPTVRleHRDb21wb25lbnQnKTtcbnZhciBSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5ID0gcmVxdWlyZSgnLi9SZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5Jyk7XG52YXIgUmVhY3RFdmVudExpc3RlbmVyID0gcmVxdWlyZSgnLi9SZWFjdEV2ZW50TGlzdGVuZXInKTtcbnZhciBSZWFjdEluamVjdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbmplY3Rpb24nKTtcbnZhciBSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uID0gcmVxdWlyZSgnLi9SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uJyk7XG52YXIgU1ZHRE9NUHJvcGVydHlDb25maWcgPSByZXF1aXJlKCcuL1NWR0RPTVByb3BlcnR5Q29uZmlnJyk7XG52YXIgU2VsZWN0RXZlbnRQbHVnaW4gPSByZXF1aXJlKCcuL1NlbGVjdEV2ZW50UGx1Z2luJyk7XG52YXIgU2ltcGxlRXZlbnRQbHVnaW4gPSByZXF1aXJlKCcuL1NpbXBsZUV2ZW50UGx1Z2luJyk7XG5cbnZhciBhbHJlYWR5SW5qZWN0ZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gaW5qZWN0KCkge1xuICBpZiAoYWxyZWFkeUluamVjdGVkKSB7XG4gICAgLy8gVE9ETzogVGhpcyBpcyBjdXJyZW50bHkgdHJ1ZSBiZWNhdXNlIHRoZXNlIGluamVjdGlvbnMgYXJlIHNoYXJlZCBiZXR3ZWVuXG4gICAgLy8gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlciBwYWNrYWdlLiBUaGV5IHNob3VsZCBiZSBidWlsdCBpbmRlcGVuZGVudGx5XG4gICAgLy8gYW5kIG5vdCBzaGFyZSBhbnkgaW5qZWN0aW9uIHN0YXRlLiBUaGVuIHRoaXMgcHJvYmxlbSB3aWxsIGJlIHNvbHZlZC5cbiAgICByZXR1cm47XG4gIH1cbiAgYWxyZWFkeUluamVjdGVkID0gdHJ1ZTtcblxuICBSZWFjdEluamVjdGlvbi5FdmVudEVtaXR0ZXIuaW5qZWN0UmVhY3RFdmVudExpc3RlbmVyKFJlYWN0RXZlbnRMaXN0ZW5lcik7XG5cbiAgLyoqXG4gICAqIEluamVjdCBtb2R1bGVzIGZvciByZXNvbHZpbmcgRE9NIGhpZXJhcmNoeSBhbmQgcGx1Z2luIG9yZGVyaW5nLlxuICAgKi9cbiAgUmVhY3RJbmplY3Rpb24uRXZlbnRQbHVnaW5IdWIuaW5qZWN0RXZlbnRQbHVnaW5PcmRlcihEZWZhdWx0RXZlbnRQbHVnaW5PcmRlcik7XG4gIFJlYWN0SW5qZWN0aW9uLkV2ZW50UGx1Z2luVXRpbHMuaW5qZWN0Q29tcG9uZW50VHJlZShSZWFjdERPTUNvbXBvbmVudFRyZWUpO1xuICBSZWFjdEluamVjdGlvbi5FdmVudFBsdWdpblV0aWxzLmluamVjdFRyZWVUcmF2ZXJzYWwoUmVhY3RET01UcmVlVHJhdmVyc2FsKTtcblxuICAvKipcbiAgICogU29tZSBpbXBvcnRhbnQgZXZlbnQgcGx1Z2lucyBpbmNsdWRlZCBieSBkZWZhdWx0ICh3aXRob3V0IGhhdmluZyB0byByZXF1aXJlXG4gICAqIHRoZW0pLlxuICAgKi9cbiAgUmVhY3RJbmplY3Rpb24uRXZlbnRQbHVnaW5IdWIuaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lKHtcbiAgICBTaW1wbGVFdmVudFBsdWdpbjogU2ltcGxlRXZlbnRQbHVnaW4sXG4gICAgRW50ZXJMZWF2ZUV2ZW50UGx1Z2luOiBFbnRlckxlYXZlRXZlbnRQbHVnaW4sXG4gICAgQ2hhbmdlRXZlbnRQbHVnaW46IENoYW5nZUV2ZW50UGx1Z2luLFxuICAgIFNlbGVjdEV2ZW50UGx1Z2luOiBTZWxlY3RFdmVudFBsdWdpbixcbiAgICBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luOiBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luXG4gIH0pO1xuXG4gIFJlYWN0SW5qZWN0aW9uLkhvc3RDb21wb25lbnQuaW5qZWN0R2VuZXJpY0NvbXBvbmVudENsYXNzKFJlYWN0RE9NQ29tcG9uZW50KTtcblxuICBSZWFjdEluamVjdGlvbi5Ib3N0Q29tcG9uZW50LmluamVjdFRleHRDb21wb25lbnRDbGFzcyhSZWFjdERPTVRleHRDb21wb25lbnQpO1xuXG4gIFJlYWN0SW5qZWN0aW9uLkRPTVByb3BlcnR5LmluamVjdERPTVByb3BlcnR5Q29uZmlnKEFSSUFET01Qcm9wZXJ0eUNvbmZpZyk7XG4gIFJlYWN0SW5qZWN0aW9uLkRPTVByb3BlcnR5LmluamVjdERPTVByb3BlcnR5Q29uZmlnKEhUTUxET01Qcm9wZXJ0eUNvbmZpZyk7XG4gIFJlYWN0SW5qZWN0aW9uLkRPTVByb3BlcnR5LmluamVjdERPTVByb3BlcnR5Q29uZmlnKFNWR0RPTVByb3BlcnR5Q29uZmlnKTtcblxuICBSZWFjdEluamVjdGlvbi5FbXB0eUNvbXBvbmVudC5pbmplY3RFbXB0eUNvbXBvbmVudEZhY3RvcnkoZnVuY3Rpb24gKGluc3RhbnRpYXRlKSB7XG4gICAgcmV0dXJuIG5ldyBSZWFjdERPTUVtcHR5Q29tcG9uZW50KGluc3RhbnRpYXRlKTtcbiAgfSk7XG5cbiAgUmVhY3RJbmplY3Rpb24uVXBkYXRlcy5pbmplY3RSZWNvbmNpbGVUcmFuc2FjdGlvbihSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uKTtcbiAgUmVhY3RJbmplY3Rpb24uVXBkYXRlcy5pbmplY3RCYXRjaGluZ1N0cmF0ZWd5KFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3kpO1xuXG4gIFJlYWN0SW5qZWN0aW9uLkNvbXBvbmVudC5pbmplY3RFbnZpcm9ubWVudChSZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpbmplY3Q6IGluamVjdFxufTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgdmFsaWRhdGVET01OZXN0aW5nID0gcmVxdWlyZSgnLi92YWxpZGF0ZURPTU5lc3RpbmcnKTtcblxudmFyIERPQ19OT0RFX1RZUEUgPSA5O1xuXG5mdW5jdGlvbiBSZWFjdERPTUNvbnRhaW5lckluZm8odG9wTGV2ZWxXcmFwcGVyLCBub2RlKSB7XG4gIHZhciBpbmZvID0ge1xuICAgIF90b3BMZXZlbFdyYXBwZXI6IHRvcExldmVsV3JhcHBlcixcbiAgICBfaWRDb3VudGVyOiAxLFxuICAgIF9vd25lckRvY3VtZW50OiBub2RlID8gbm9kZS5ub2RlVHlwZSA9PT0gRE9DX05PREVfVFlQRSA/IG5vZGUgOiBub2RlLm93bmVyRG9jdW1lbnQgOiBudWxsLFxuICAgIF9ub2RlOiBub2RlLFxuICAgIF90YWc6IG5vZGUgPyBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgOiBudWxsLFxuICAgIF9uYW1lc3BhY2VVUkk6IG5vZGUgPyBub2RlLm5hbWVzcGFjZVVSSSA6IG51bGxcbiAgfTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpbmZvLl9hbmNlc3RvckluZm8gPSBub2RlID8gdmFsaWRhdGVET01OZXN0aW5nLnVwZGF0ZWRBbmNlc3RvckluZm8obnVsbCwgaW5mby5fdGFnLCBudWxsKSA6IG51bGw7XG4gIH1cbiAgcmV0dXJuIGluZm87XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01Db250YWluZXJJbmZvOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdERPTUZlYXR1cmVGbGFncyA9IHtcbiAgdXNlQ3JlYXRlRWxlbWVudDogdHJ1ZSxcbiAgdXNlRmliZXI6IGZhbHNlXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NRmVhdHVyZUZsYWdzOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIE1PRCA9IDY1NTIxO1xuXG4vLyBhZGxlcjMyIGlzIG5vdCBjcnlwdG9ncmFwaGljYWxseSBzdHJvbmcsIGFuZCBpcyBvbmx5IHVzZWQgdG8gc2FuaXR5IGNoZWNrIHRoYXRcbi8vIG1hcmt1cCBnZW5lcmF0ZWQgb24gdGhlIHNlcnZlciBtYXRjaGVzIHRoZSBtYXJrdXAgZ2VuZXJhdGVkIG9uIHRoZSBjbGllbnQuXG4vLyBUaGlzIGltcGxlbWVudGF0aW9uIChhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIFNoZWV0SlMgdmVyc2lvbikgaGFzIGJlZW4gb3B0aW1pemVkXG4vLyBmb3Igb3VyIHVzZSBjYXNlLCBhdCB0aGUgZXhwZW5zZSBvZiBjb25mb3JtaW5nIHRvIHRoZSBhZGxlcjMyIHNwZWNpZmljYXRpb25cbi8vIGZvciBub24tYXNjaWkgaW5wdXRzLlxuZnVuY3Rpb24gYWRsZXIzMihkYXRhKSB7XG4gIHZhciBhID0gMTtcbiAgdmFyIGIgPSAwO1xuICB2YXIgaSA9IDA7XG4gIHZhciBsID0gZGF0YS5sZW5ndGg7XG4gIHZhciBtID0gbCAmIH4weDM7XG4gIHdoaWxlIChpIDwgbSkge1xuICAgIHZhciBuID0gTWF0aC5taW4oaSArIDQwOTYsIG0pO1xuICAgIGZvciAoOyBpIDwgbjsgaSArPSA0KSB7XG4gICAgICBiICs9IChhICs9IGRhdGEuY2hhckNvZGVBdChpKSkgKyAoYSArPSBkYXRhLmNoYXJDb2RlQXQoaSArIDEpKSArIChhICs9IGRhdGEuY2hhckNvZGVBdChpICsgMikpICsgKGEgKz0gZGF0YS5jaGFyQ29kZUF0KGkgKyAzKSk7XG4gICAgfVxuICAgIGEgJT0gTU9EO1xuICAgIGIgJT0gTU9EO1xuICB9XG4gIGZvciAoOyBpIDwgbDsgaSsrKSB7XG4gICAgYiArPSBhICs9IGRhdGEuY2hhckNvZGVBdChpKTtcbiAgfVxuICBhICU9IE1PRDtcbiAgYiAlPSBNT0Q7XG4gIHJldHVybiBhIHwgYiA8PCAxNjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhZGxlcjMyOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBhZGxlcjMyID0gcmVxdWlyZSgnLi9hZGxlcjMyJyk7XG5cbnZhciBUQUdfRU5EID0gL1xcLz8+LztcbnZhciBDT01NRU5UX1NUQVJUID0gL148XFwhXFwtXFwtLztcblxudmFyIFJlYWN0TWFya3VwQ2hlY2tzdW0gPSB7XG4gIENIRUNLU1VNX0FUVFJfTkFNRTogJ2RhdGEtcmVhY3QtY2hlY2tzdW0nLFxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWFya3VwIE1hcmt1cCBzdHJpbmdcbiAgICogQHJldHVybiB7c3RyaW5nfSBNYXJrdXAgc3RyaW5nIHdpdGggY2hlY2tzdW0gYXR0cmlidXRlIGF0dGFjaGVkXG4gICAqL1xuICBhZGRDaGVja3N1bVRvTWFya3VwOiBmdW5jdGlvbiAobWFya3VwKSB7XG4gICAgdmFyIGNoZWNrc3VtID0gYWRsZXIzMihtYXJrdXApO1xuXG4gICAgLy8gQWRkIGNoZWNrc3VtIChoYW5kbGUgYm90aCBwYXJlbnQgdGFncywgY29tbWVudHMgYW5kIHNlbGYtY2xvc2luZyB0YWdzKVxuICAgIGlmIChDT01NRU5UX1NUQVJULnRlc3QobWFya3VwKSkge1xuICAgICAgcmV0dXJuIG1hcmt1cDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1hcmt1cC5yZXBsYWNlKFRBR19FTkQsICcgJyArIFJlYWN0TWFya3VwQ2hlY2tzdW0uQ0hFQ0tTVU1fQVRUUl9OQU1FICsgJz1cIicgKyBjaGVja3N1bSArICdcIiQmJyk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWFya3VwIHRvIHVzZVxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGVsZW1lbnQgcm9vdCBSZWFjdCBlbGVtZW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIG9yIG5vdCB0aGUgbWFya3VwIGlzIHRoZSBzYW1lXG4gICAqL1xuICBjYW5SZXVzZU1hcmt1cDogZnVuY3Rpb24gKG1hcmt1cCwgZWxlbWVudCkge1xuICAgIHZhciBleGlzdGluZ0NoZWNrc3VtID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoUmVhY3RNYXJrdXBDaGVja3N1bS5DSEVDS1NVTV9BVFRSX05BTUUpO1xuICAgIGV4aXN0aW5nQ2hlY2tzdW0gPSBleGlzdGluZ0NoZWNrc3VtICYmIHBhcnNlSW50KGV4aXN0aW5nQ2hlY2tzdW0sIDEwKTtcbiAgICB2YXIgbWFya3VwQ2hlY2tzdW0gPSBhZGxlcjMyKG1hcmt1cCk7XG4gICAgcmV0dXJuIG1hcmt1cENoZWNrc3VtID09PSBleGlzdGluZ0NoZWNrc3VtO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0TWFya3VwQ2hlY2tzdW07IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIERPTUxhenlUcmVlID0gcmVxdWlyZSgnLi9ET01MYXp5VHJlZScpO1xudmFyIERPTVByb3BlcnR5ID0gcmVxdWlyZSgnLi9ET01Qcm9wZXJ0eScpO1xudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Jyk7XG52YXIgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnLi9SZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXInKTtcbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdEN1cnJlbnRPd25lcicpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RET01Db250YWluZXJJbmZvID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbnRhaW5lckluZm8nKTtcbnZhciBSZWFjdERPTUZlYXR1cmVGbGFncyA9IHJlcXVpcmUoJy4vUmVhY3RET01GZWF0dXJlRmxhZ3MnKTtcbnZhciBSZWFjdEZlYXR1cmVGbGFncyA9IHJlcXVpcmUoJy4vUmVhY3RGZWF0dXJlRmxhZ3MnKTtcbnZhciBSZWFjdEluc3RhbmNlTWFwID0gcmVxdWlyZSgnLi9SZWFjdEluc3RhbmNlTWFwJyk7XG52YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSByZXF1aXJlKCcuL1JlYWN0SW5zdHJ1bWVudGF0aW9uJyk7XG52YXIgUmVhY3RNYXJrdXBDaGVja3N1bSA9IHJlcXVpcmUoJy4vUmVhY3RNYXJrdXBDaGVja3N1bScpO1xudmFyIFJlYWN0UmVjb25jaWxlciA9IHJlcXVpcmUoJy4vUmVhY3RSZWNvbmNpbGVyJyk7XG52YXIgUmVhY3RVcGRhdGVRdWV1ZSA9IHJlcXVpcmUoJy4vUmVhY3RVcGRhdGVRdWV1ZScpO1xudmFyIFJlYWN0VXBkYXRlcyA9IHJlcXVpcmUoJy4vUmVhY3RVcGRhdGVzJyk7XG5cbnZhciBlbXB0eU9iamVjdCA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5T2JqZWN0Jyk7XG52YXIgaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudCA9IHJlcXVpcmUoJy4vaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudCcpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHNldElubmVySFRNTCA9IHJlcXVpcmUoJy4vc2V0SW5uZXJIVE1MJyk7XG52YXIgc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQgPSByZXF1aXJlKCcuL3Nob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIEFUVFJfTkFNRSA9IERPTVByb3BlcnR5LklEX0FUVFJJQlVURV9OQU1FO1xudmFyIFJPT1RfQVRUUl9OQU1FID0gRE9NUHJvcGVydHkuUk9PVF9BVFRSSUJVVEVfTkFNRTtcblxudmFyIEVMRU1FTlRfTk9ERV9UWVBFID0gMTtcbnZhciBET0NfTk9ERV9UWVBFID0gOTtcbnZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFX1RZUEUgPSAxMTtcblxudmFyIGluc3RhbmNlc0J5UmVhY3RSb290SUQgPSB7fTtcblxuLyoqXG4gKiBGaW5kcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlclxuICogdGhhdCdzIG5vdCBjb21tb24gYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHN0cmluZ3MuXG4gKlxuICogQHJldHVybiB7bnVtYmVyfSB0aGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciB3aGVyZSB0aGUgc3RyaW5ncyBkaXZlcmdlXG4gKi9cbmZ1bmN0aW9uIGZpcnN0RGlmZmVyZW5jZUluZGV4KHN0cmluZzEsIHN0cmluZzIpIHtcbiAgdmFyIG1pbkxlbiA9IE1hdGgubWluKHN0cmluZzEubGVuZ3RoLCBzdHJpbmcyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbWluTGVuOyBpKyspIHtcbiAgICBpZiAoc3RyaW5nMS5jaGFyQXQoaSkgIT09IHN0cmluZzIuY2hhckF0KGkpKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cmluZzEubGVuZ3RoID09PSBzdHJpbmcyLmxlbmd0aCA/IC0xIDogbWluTGVuO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01Eb2N1bWVudH0gY29udGFpbmVyIERPTSBlbGVtZW50IHRoYXQgbWF5IGNvbnRhaW5cbiAqIGEgUmVhY3QgY29tcG9uZW50XG4gKiBAcmV0dXJuIHs/Kn0gRE9NIGVsZW1lbnQgdGhhdCBtYXkgaGF2ZSB0aGUgcmVhY3RSb290IElELCBvciBudWxsLlxuICovXG5mdW5jdGlvbiBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKSB7XG4gIGlmICghY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBET0NfTk9ERV9UWVBFKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5kb2N1bWVudEVsZW1lbnQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5maXJzdENoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludGVybmFsR2V0SUQobm9kZSkge1xuICAvLyBJZiBub2RlIGlzIHNvbWV0aGluZyBsaWtlIGEgd2luZG93LCBkb2N1bWVudCwgb3IgdGV4dCBub2RlLCBub25lIG9mXG4gIC8vIHdoaWNoIHN1cHBvcnQgYXR0cmlidXRlcyBvciBhIC5nZXRBdHRyaWJ1dGUgbWV0aG9kLCBncmFjZWZ1bGx5IHJldHVyblxuICAvLyB0aGUgZW1wdHkgc3RyaW5nLCBhcyBpZiB0aGUgYXR0cmlidXRlIHdlcmUgbWlzc2luZy5cbiAgcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSkgfHwgJyc7XG59XG5cbi8qKlxuICogTW91bnRzIHRoaXMgY29tcG9uZW50IGFuZCBpbnNlcnRzIGl0IGludG8gdGhlIERPTS5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjb21wb25lbnRJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdG8gbW91bnQuXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciBET00gZWxlbWVudCB0byBtb3VudCBpbnRvLlxuICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICogQHBhcmFtIHtib29sZWFufSBzaG91bGRSZXVzZU1hcmt1cCBJZiB0cnVlLCBkbyBub3QgaW5zZXJ0IG1hcmt1cFxuICovXG5mdW5jdGlvbiBtb3VudENvbXBvbmVudEludG9Ob2RlKHdyYXBwZXJJbnN0YW5jZSwgY29udGFpbmVyLCB0cmFuc2FjdGlvbiwgc2hvdWxkUmV1c2VNYXJrdXAsIGNvbnRleHQpIHtcbiAgdmFyIG1hcmtlck5hbWU7XG4gIGlmIChSZWFjdEZlYXR1cmVGbGFncy5sb2dUb3BMZXZlbFJlbmRlcnMpIHtcbiAgICB2YXIgd3JhcHBlZEVsZW1lbnQgPSB3cmFwcGVySW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50LnByb3BzLmNoaWxkO1xuICAgIHZhciB0eXBlID0gd3JhcHBlZEVsZW1lbnQudHlwZTtcbiAgICBtYXJrZXJOYW1lID0gJ1JlYWN0IG1vdW50OiAnICsgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyA/IHR5cGUgOiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSk7XG4gICAgY29uc29sZS50aW1lKG1hcmtlck5hbWUpO1xuICB9XG5cbiAgdmFyIG1hcmt1cCA9IFJlYWN0UmVjb25jaWxlci5tb3VudENvbXBvbmVudCh3cmFwcGVySW5zdGFuY2UsIHRyYW5zYWN0aW9uLCBudWxsLCBSZWFjdERPTUNvbnRhaW5lckluZm8od3JhcHBlckluc3RhbmNlLCBjb250YWluZXIpLCBjb250ZXh0LCAwIC8qIHBhcmVudERlYnVnSUQgKi9cbiAgKTtcblxuICBpZiAobWFya2VyTmFtZSkge1xuICAgIGNvbnNvbGUudGltZUVuZChtYXJrZXJOYW1lKTtcbiAgfVxuXG4gIHdyYXBwZXJJbnN0YW5jZS5fcmVuZGVyZWRDb21wb25lbnQuX3RvcExldmVsV3JhcHBlciA9IHdyYXBwZXJJbnN0YW5jZTtcbiAgUmVhY3RNb3VudC5fbW91bnRJbWFnZUludG9Ob2RlKG1hcmt1cCwgY29udGFpbmVyLCB3cmFwcGVySW5zdGFuY2UsIHNob3VsZFJldXNlTWFya3VwLCB0cmFuc2FjdGlvbik7XG59XG5cbi8qKlxuICogQmF0Y2hlZCBtb3VudC5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjb21wb25lbnRJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdG8gbW91bnQuXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciBET00gZWxlbWVudCB0byBtb3VudCBpbnRvLlxuICogQHBhcmFtIHtib29sZWFufSBzaG91bGRSZXVzZU1hcmt1cCBJZiB0cnVlLCBkbyBub3QgaW5zZXJ0IG1hcmt1cFxuICovXG5mdW5jdGlvbiBiYXRjaGVkTW91bnRDb21wb25lbnRJbnRvTm9kZShjb21wb25lbnRJbnN0YW5jZSwgY29udGFpbmVyLCBzaG91bGRSZXVzZU1hcmt1cCwgY29udGV4dCkge1xuICB2YXIgdHJhbnNhY3Rpb24gPSBSZWFjdFVwZGF0ZXMuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5nZXRQb29sZWQoXG4gIC8qIHVzZUNyZWF0ZUVsZW1lbnQgKi9cbiAgIXNob3VsZFJldXNlTWFya3VwICYmIFJlYWN0RE9NRmVhdHVyZUZsYWdzLnVzZUNyZWF0ZUVsZW1lbnQpO1xuICB0cmFuc2FjdGlvbi5wZXJmb3JtKG1vdW50Q29tcG9uZW50SW50b05vZGUsIG51bGwsIGNvbXBvbmVudEluc3RhbmNlLCBjb250YWluZXIsIHRyYW5zYWN0aW9uLCBzaG91bGRSZXVzZU1hcmt1cCwgY29udGV4dCk7XG4gIFJlYWN0VXBkYXRlcy5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uLnJlbGVhc2UodHJhbnNhY3Rpb24pO1xufVxuXG4vKipcbiAqIFVubW91bnRzIGEgY29tcG9uZW50IGFuZCByZW1vdmVzIGl0IGZyb20gdGhlIERPTS5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBpbnN0YW5jZSBSZWFjdCBjb21wb25lbnQgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciBET00gZWxlbWVudCB0byB1bm1vdW50IGZyb20uXG4gKiBAZmluYWxcbiAqIEBpbnRlcm5hbFxuICogQHNlZSB7UmVhY3RNb3VudC51bm1vdW50Q29tcG9uZW50QXROb2RlfVxuICovXG5mdW5jdGlvbiB1bm1vdW50Q29tcG9uZW50RnJvbU5vZGUoaW5zdGFuY2UsIGNvbnRhaW5lciwgc2FmZWx5KSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVnaW5GbHVzaCgpO1xuICB9XG4gIFJlYWN0UmVjb25jaWxlci51bm1vdW50Q29tcG9uZW50KGluc3RhbmNlLCBzYWZlbHkpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkVuZEZsdXNoKCk7XG4gIH1cblxuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBET0NfTk9ERV9UWVBFKSB7XG4gICAgY29udGFpbmVyID0gY29udGFpbmVyLmRvY3VtZW50RWxlbWVudDtcbiAgfVxuXG4gIC8vIGh0dHA6Ly9qc3BlcmYuY29tL2VtcHR5aW5nLWEtbm9kZVxuICB3aGlsZSAoY29udGFpbmVyLmxhc3RDaGlsZCkge1xuICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjb250YWluZXIubGFzdENoaWxkKTtcbiAgfVxufVxuXG4vKipcbiAqIFRydWUgaWYgdGhlIHN1cHBsaWVkIERPTSBub2RlIGhhcyBhIGRpcmVjdCBSZWFjdC1yZW5kZXJlZCBjaGlsZCB0aGF0IGlzXG4gKiBub3QgYSBSZWFjdCByb290IGVsZW1lbnQuIFVzZWZ1bCBmb3Igd2FybmluZyBpbiBgcmVuZGVyYCxcbiAqIGB1bm1vdW50Q29tcG9uZW50QXROb2RlYCwgZXRjLlxuICpcbiAqIEBwYXJhbSB7P0RPTUVsZW1lbnR9IG5vZGUgVGhlIGNhbmRpZGF0ZSBET00gbm9kZS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIERPTSBlbGVtZW50IGNvbnRhaW5zIGEgZGlyZWN0IGNoaWxkIHRoYXQgd2FzXG4gKiByZW5kZXJlZCBieSBSZWFjdCBidXQgaXMgbm90IGEgcm9vdCBlbGVtZW50LlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGhhc05vblJvb3RSZWFjdENoaWxkKGNvbnRhaW5lcikge1xuICB2YXIgcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gIGlmIChyb290RWwpIHtcbiAgICB2YXIgaW5zdCA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKHJvb3RFbCk7XG4gICAgcmV0dXJuICEhKGluc3QgJiYgaW5zdC5faG9zdFBhcmVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUcnVlIGlmIHRoZSBzdXBwbGllZCBET00gbm9kZSBpcyBhIFJlYWN0IERPTSBlbGVtZW50IGFuZFxuICogaXQgaGFzIGJlZW4gcmVuZGVyZWQgYnkgYW5vdGhlciBjb3B5IG9mIFJlYWN0LlxuICpcbiAqIEBwYXJhbSB7P0RPTUVsZW1lbnR9IG5vZGUgVGhlIGNhbmRpZGF0ZSBET00gbm9kZS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIERPTSBoYXMgYmVlbiByZW5kZXJlZCBieSBhbm90aGVyIGNvcHkgb2YgUmVhY3RcbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBub2RlSXNSZW5kZXJlZEJ5T3RoZXJJbnN0YW5jZShjb250YWluZXIpIHtcbiAgdmFyIHJvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICByZXR1cm4gISEocm9vdEVsICYmIGlzUmVhY3ROb2RlKHJvb3RFbCkgJiYgIVJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKHJvb3RFbCkpO1xufVxuXG4vKipcbiAqIFRydWUgaWYgdGhlIHN1cHBsaWVkIERPTSBub2RlIGlzIGEgdmFsaWQgbm9kZSBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7P0RPTUVsZW1lbnR9IG5vZGUgVGhlIGNhbmRpZGF0ZSBET00gbm9kZS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIERPTSBpcyBhIHZhbGlkIERPTSBub2RlLlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRDb250YWluZXIobm9kZSkge1xuICByZXR1cm4gISEobm9kZSAmJiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFX1RZUEUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DX05PREVfVFlQRSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFX1RZUEUpKTtcbn1cblxuLyoqXG4gKiBUcnVlIGlmIHRoZSBzdXBwbGllZCBET00gbm9kZSBpcyBhIHZhbGlkIFJlYWN0IG5vZGUgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0gez9ET01FbGVtZW50fSBub2RlIFRoZSBjYW5kaWRhdGUgRE9NIG5vZGUuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBET00gaXMgYSB2YWxpZCBSZWFjdCBET00gbm9kZS5cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBpc1JlYWN0Tm9kZShub2RlKSB7XG4gIHJldHVybiBpc1ZhbGlkQ29udGFpbmVyKG5vZGUpICYmIChub2RlLmhhc0F0dHJpYnV0ZShST09UX0FUVFJfTkFNRSkgfHwgbm9kZS5oYXNBdHRyaWJ1dGUoQVRUUl9OQU1FKSk7XG59XG5cbmZ1bmN0aW9uIGdldEhvc3RSb290SW5zdGFuY2VJbkNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgdmFyIHJvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICB2YXIgcHJldkhvc3RJbnN0YW5jZSA9IHJvb3RFbCAmJiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShyb290RWwpO1xuICByZXR1cm4gcHJldkhvc3RJbnN0YW5jZSAmJiAhcHJldkhvc3RJbnN0YW5jZS5faG9zdFBhcmVudCA/IHByZXZIb3N0SW5zdGFuY2UgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRUb3BMZXZlbFdyYXBwZXJJbkNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgdmFyIHJvb3QgPSBnZXRIb3N0Um9vdEluc3RhbmNlSW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgcmV0dXJuIHJvb3QgPyByb290Ll9ob3N0Q29udGFpbmVySW5mby5fdG9wTGV2ZWxXcmFwcGVyIDogbnVsbDtcbn1cblxuLyoqXG4gKiBUZW1wb3JhcnkgKD8pIGhhY2sgc28gdGhhdCB3ZSBjYW4gc3RvcmUgYWxsIHRvcC1sZXZlbCBwZW5kaW5nIHVwZGF0ZXMgb25cbiAqIGNvbXBvc2l0ZXMgaW5zdGVhZCBvZiBoYXZpbmcgdG8gd29ycnkgYWJvdXQgZGlmZmVyZW50IHR5cGVzIG9mIGNvbXBvbmVudHNcbiAqIGhlcmUuXG4gKi9cbnZhciB0b3BMZXZlbFJvb3RDb3VudGVyID0gMTtcbnZhciBUb3BMZXZlbFdyYXBwZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMucm9vdElEID0gdG9wTGV2ZWxSb290Q291bnRlcisrO1xufTtcblRvcExldmVsV3JhcHBlci5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCA9IHt9O1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgVG9wTGV2ZWxXcmFwcGVyLmRpc3BsYXlOYW1lID0gJ1RvcExldmVsV3JhcHBlcic7XG59XG5Ub3BMZXZlbFdyYXBwZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGQ7XG59O1xuVG9wTGV2ZWxXcmFwcGVyLmlzUmVhY3RUb3BMZXZlbFdyYXBwZXIgPSB0cnVlO1xuXG4vKipcbiAqIE1vdW50aW5nIGlzIHRoZSBwcm9jZXNzIG9mIGluaXRpYWxpemluZyBhIFJlYWN0IGNvbXBvbmVudCBieSBjcmVhdGluZyBpdHNcbiAqIHJlcHJlc2VudGF0aXZlIERPTSBlbGVtZW50cyBhbmQgaW5zZXJ0aW5nIHRoZW0gaW50byBhIHN1cHBsaWVkIGBjb250YWluZXJgLlxuICogQW55IHByaW9yIGNvbnRlbnQgaW5zaWRlIGBjb250YWluZXJgIGlzIGRlc3Ryb3llZCBpbiB0aGUgcHJvY2Vzcy5cbiAqXG4gKiAgIFJlYWN0TW91bnQucmVuZGVyKFxuICogICAgIGNvbXBvbmVudCxcbiAqICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyJylcbiAqICAgKTtcbiAqXG4gKiAgIDxkaXYgaWQ9XCJjb250YWluZXJcIj4gICAgICAgICAgICAgICAgICAgPC0tIFN1cHBsaWVkIGBjb250YWluZXJgLlxuICogICAgIDxkaXYgZGF0YS1yZWFjdGlkPVwiLjNcIj4gICAgICAgICAgICAgIDwtLSBSZW5kZXJlZCByZWFjdFJvb3Qgb2YgUmVhY3RcbiAqICAgICAgIC8vIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5cbiAqICAgICA8L2Rpdj5cbiAqICAgPC9kaXY+XG4gKlxuICogSW5zaWRlIG9mIGBjb250YWluZXJgLCB0aGUgZmlyc3QgZWxlbWVudCByZW5kZXJlZCBpcyB0aGUgXCJyZWFjdFJvb3RcIi5cbiAqL1xudmFyIFJlYWN0TW91bnQgPSB7XG4gIFRvcExldmVsV3JhcHBlcjogVG9wTGV2ZWxXcmFwcGVyLFxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGRldnRvb2xzLiBUaGUga2V5cyBhcmUgbm90IGltcG9ydGFudC5cbiAgICovXG4gIF9pbnN0YW5jZXNCeVJlYWN0Um9vdElEOiBpbnN0YW5jZXNCeVJlYWN0Um9vdElELFxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIGEgaG9vayBwcm92aWRlZCB0byBzdXBwb3J0IHJlbmRlcmluZyBSZWFjdCBjb21wb25lbnRzIHdoaWxlXG4gICAqIGVuc3VyaW5nIHRoYXQgdGhlIGFwcGFyZW50IHNjcm9sbCBwb3NpdGlvbiBvZiBpdHMgYGNvbnRhaW5lcmAgZG9lcyBub3RcbiAgICogY2hhbmdlLlxuICAgKlxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciBUaGUgYGNvbnRhaW5lcmAgYmVpbmcgcmVuZGVyZWQgaW50by5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gcmVuZGVyQ2FsbGJhY2sgVGhpcyBtdXN0IGJlIGNhbGxlZCBvbmNlIHRvIGRvIHRoZSByZW5kZXIuXG4gICAqL1xuICBzY3JvbGxNb25pdG9yOiBmdW5jdGlvbiAoY29udGFpbmVyLCByZW5kZXJDYWxsYmFjaykge1xuICAgIHJlbmRlckNhbGxiYWNrKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRha2UgYSBjb21wb25lbnQgdGhhdCdzIGFscmVhZHkgbW91bnRlZCBpbnRvIHRoZSBET00gYW5kIHJlcGxhY2UgaXRzIHByb3BzXG4gICAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IHByZXZDb21wb25lbnQgY29tcG9uZW50IGluc3RhbmNlIGFscmVhZHkgaW4gdGhlIERPTVxuICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4dEVsZW1lbnQgY29tcG9uZW50IGluc3RhbmNlIHRvIHJlbmRlclxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciBjb250YWluZXIgdG8gcmVuZGVyIGludG9cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIHRyaWdnZXJlZCBvbiBjb21wbGV0aW9uXG4gICAqL1xuICBfdXBkYXRlUm9vdENvbXBvbmVudDogZnVuY3Rpb24gKHByZXZDb21wb25lbnQsIG5leHRFbGVtZW50LCBuZXh0Q29udGV4dCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICAgIFJlYWN0TW91bnQuc2Nyb2xsTW9uaXRvcihjb250YWluZXIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIFJlYWN0VXBkYXRlUXVldWUuZW5xdWV1ZUVsZW1lbnRJbnRlcm5hbChwcmV2Q29tcG9uZW50LCBuZXh0RWxlbWVudCwgbmV4dENvbnRleHQpO1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIFJlYWN0VXBkYXRlUXVldWUuZW5xdWV1ZUNhbGxiYWNrSW50ZXJuYWwocHJldkNvbXBvbmVudCwgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHByZXZDb21wb25lbnQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlbmRlciBhIG5ldyBjb21wb25lbnQgaW50byB0aGUgRE9NLiBIb29rZWQgYnkgaG9va3MhXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0RWxlbWVudCBlbGVtZW50IHRvIHJlbmRlclxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciBjb250YWluZXIgdG8gcmVuZGVyIGludG9cbiAgICogQHBhcmFtIHtib29sZWFufSBzaG91bGRSZXVzZU1hcmt1cCBpZiB3ZSBzaG91bGQgc2tpcCB0aGUgbWFya3VwIGluc2VydGlvblxuICAgKiBAcmV0dXJuIHtSZWFjdENvbXBvbmVudH0gbmV4dENvbXBvbmVudFxuICAgKi9cbiAgX3JlbmRlck5ld1Jvb3RDb21wb25lbnQ6IGZ1bmN0aW9uIChuZXh0RWxlbWVudCwgY29udGFpbmVyLCBzaG91bGRSZXVzZU1hcmt1cCwgY29udGV4dCkge1xuICAgIC8vIFZhcmlvdXMgcGFydHMgb2Ygb3VyIGNvZGUgKHN1Y2ggYXMgUmVhY3RDb21wb3NpdGVDb21wb25lbnQnc1xuICAgIC8vIF9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQpIGFzc3VtZSB0aGF0IGNhbGxzIHRvIHJlbmRlciBhcmVuJ3QgbmVzdGVkO1xuICAgIC8vIHZlcmlmeSB0aGF0IHRoYXQncyB0aGUgY2FzZS5cbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID09IG51bGwsICdfcmVuZGVyTmV3Um9vdENvbXBvbmVudCgpOiBSZW5kZXIgbWV0aG9kcyBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uICcgKyAnb2YgcHJvcHMgYW5kIHN0YXRlOyB0cmlnZ2VyaW5nIG5lc3RlZCBjb21wb25lbnQgdXBkYXRlcyBmcm9tICcgKyAncmVuZGVyIGlzIG5vdCBhbGxvd2VkLiBJZiBuZWNlc3NhcnksIHRyaWdnZXIgbmVzdGVkIHVwZGF0ZXMgaW4gJyArICdjb21wb25lbnREaWRVcGRhdGUuIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mICVzLicsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2b2lkIDA7XG5cbiAgICAhaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ19yZWdpc3RlckNvbXBvbmVudCguLi4pOiBUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzM3JykgOiB2b2lkIDA7XG5cbiAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuZW5zdXJlU2Nyb2xsVmFsdWVNb25pdG9yaW5nKCk7XG4gICAgdmFyIGNvbXBvbmVudEluc3RhbmNlID0gaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudChuZXh0RWxlbWVudCwgZmFsc2UpO1xuXG4gICAgLy8gVGhlIGluaXRpYWwgcmVuZGVyIGlzIHN5bmNocm9ub3VzIGJ1dCBhbnkgdXBkYXRlcyB0aGF0IGhhcHBlbiBkdXJpbmdcbiAgICAvLyByZW5kZXJpbmcsIGluIGNvbXBvbmVudFdpbGxNb3VudCBvciBjb21wb25lbnREaWRNb3VudCwgd2lsbCBiZSBiYXRjaGVkXG4gICAgLy8gYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGJhdGNoaW5nIHN0cmF0ZWd5LlxuXG4gICAgUmVhY3RVcGRhdGVzLmJhdGNoZWRVcGRhdGVzKGJhdGNoZWRNb3VudENvbXBvbmVudEludG9Ob2RlLCBjb21wb25lbnRJbnN0YW5jZSwgY29udGFpbmVyLCBzaG91bGRSZXVzZU1hcmt1cCwgY29udGV4dCk7XG5cbiAgICB2YXIgd3JhcHBlcklEID0gY29tcG9uZW50SW5zdGFuY2UuX2luc3RhbmNlLnJvb3RJRDtcbiAgICBpbnN0YW5jZXNCeVJlYWN0Um9vdElEW3dyYXBwZXJJRF0gPSBjb21wb25lbnRJbnN0YW5jZTtcblxuICAgIHJldHVybiBjb21wb25lbnRJbnN0YW5jZTtcbiAgfSxcblxuICAvKipcbiAgICogUmVuZGVycyBhIFJlYWN0IGNvbXBvbmVudCBpbnRvIHRoZSBET00gaW4gdGhlIHN1cHBsaWVkIGBjb250YWluZXJgLlxuICAgKlxuICAgKiBJZiB0aGUgUmVhY3QgY29tcG9uZW50IHdhcyBwcmV2aW91c2x5IHJlbmRlcmVkIGludG8gYGNvbnRhaW5lcmAsIHRoaXMgd2lsbFxuICAgKiBwZXJmb3JtIGFuIHVwZGF0ZSBvbiBpdCBhbmQgb25seSBtdXRhdGUgdGhlIERPTSBhcyBuZWNlc3NhcnkgdG8gcmVmbGVjdCB0aGVcbiAgICogbGF0ZXN0IFJlYWN0IGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gcGFyZW50Q29tcG9uZW50IFRoZSBjb25jZXB0dWFsIHBhcmVudCBvZiB0aGlzIHJlbmRlciB0cmVlLlxuICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4dEVsZW1lbnQgQ29tcG9uZW50IGVsZW1lbnQgdG8gcmVuZGVyLlxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciBET00gZWxlbWVudCB0byByZW5kZXIgaW50by5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIHRyaWdnZXJlZCBvbiBjb21wbGV0aW9uXG4gICAqIEByZXR1cm4ge1JlYWN0Q29tcG9uZW50fSBDb21wb25lbnQgaW5zdGFuY2UgcmVuZGVyZWQgaW4gYGNvbnRhaW5lcmAuXG4gICAqL1xuICByZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjogZnVuY3Rpb24gKHBhcmVudENvbXBvbmVudCwgbmV4dEVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spIHtcbiAgICAhKHBhcmVudENvbXBvbmVudCAhPSBudWxsICYmIFJlYWN0SW5zdGFuY2VNYXAuaGFzKHBhcmVudENvbXBvbmVudCkpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3BhcmVudENvbXBvbmVudCBtdXN0IGJlIGEgdmFsaWQgUmVhY3QgQ29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnMzgnKSA6IHZvaWQgMDtcbiAgICByZXR1cm4gUmVhY3RNb3VudC5fcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBuZXh0RWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjayk7XG4gIH0sXG5cbiAgX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyOiBmdW5jdGlvbiAocGFyZW50Q29tcG9uZW50LCBuZXh0RWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICAgIFJlYWN0VXBkYXRlUXVldWUudmFsaWRhdGVDYWxsYmFjayhjYWxsYmFjaywgJ1JlYWN0RE9NLnJlbmRlcicpO1xuICAgICFSZWFjdC5pc1ZhbGlkRWxlbWVudChuZXh0RWxlbWVudCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RET00ucmVuZGVyKCk6IEludmFsaWQgY29tcG9uZW50IGVsZW1lbnQuJXMnLCB0eXBlb2YgbmV4dEVsZW1lbnQgPT09ICdzdHJpbmcnID8gXCIgSW5zdGVhZCBvZiBwYXNzaW5nIGEgc3RyaW5nIGxpa2UgJ2RpdicsIHBhc3MgXCIgKyBcIlJlYWN0LmNyZWF0ZUVsZW1lbnQoJ2RpdicpIG9yIDxkaXYgLz4uXCIgOiB0eXBlb2YgbmV4dEVsZW1lbnQgPT09ICdmdW5jdGlvbicgPyAnIEluc3RlYWQgb2YgcGFzc2luZyBhIGNsYXNzIGxpa2UgRm9vLCBwYXNzICcgKyAnUmVhY3QuY3JlYXRlRWxlbWVudChGb28pIG9yIDxGb28gLz4uJyA6IC8vIENoZWNrIGlmIGl0IHF1YWNrcyBsaWtlIGFuIGVsZW1lbnRcbiAgICBuZXh0RWxlbWVudCAhPSBudWxsICYmIG5leHRFbGVtZW50LnByb3BzICE9PSB1bmRlZmluZWQgPyAnIFRoaXMgbWF5IGJlIGNhdXNlZCBieSB1bmludGVudGlvbmFsbHkgbG9hZGluZyB0d28gaW5kZXBlbmRlbnQgJyArICdjb3BpZXMgb2YgUmVhY3QuJyA6ICcnKSA6IF9wcm9kSW52YXJpYW50KCczOScsIHR5cGVvZiBuZXh0RWxlbWVudCA9PT0gJ3N0cmluZycgPyBcIiBJbnN0ZWFkIG9mIHBhc3NpbmcgYSBzdHJpbmcgbGlrZSAnZGl2JywgcGFzcyBcIiArIFwiUmVhY3QuY3JlYXRlRWxlbWVudCgnZGl2Jykgb3IgPGRpdiAvPi5cIiA6IHR5cGVvZiBuZXh0RWxlbWVudCA9PT0gJ2Z1bmN0aW9uJyA/ICcgSW5zdGVhZCBvZiBwYXNzaW5nIGEgY2xhc3MgbGlrZSBGb28sIHBhc3MgJyArICdSZWFjdC5jcmVhdGVFbGVtZW50KEZvbykgb3IgPEZvbyAvPi4nIDogbmV4dEVsZW1lbnQgIT0gbnVsbCAmJiBuZXh0RWxlbWVudC5wcm9wcyAhPT0gdW5kZWZpbmVkID8gJyBUaGlzIG1heSBiZSBjYXVzZWQgYnkgdW5pbnRlbnRpb25hbGx5IGxvYWRpbmcgdHdvIGluZGVwZW5kZW50ICcgKyAnY29waWVzIG9mIFJlYWN0LicgOiAnJykgOiB2b2lkIDA7XG5cbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghY29udGFpbmVyIHx8ICFjb250YWluZXIudGFnTmFtZSB8fCBjb250YWluZXIudGFnTmFtZS50b1VwcGVyQ2FzZSgpICE9PSAnQk9EWScsICdyZW5kZXIoKTogUmVuZGVyaW5nIGNvbXBvbmVudHMgZGlyZWN0bHkgaW50byBkb2N1bWVudC5ib2R5IGlzICcgKyAnZGlzY291cmFnZWQsIHNpbmNlIGl0cyBjaGlsZHJlbiBhcmUgb2Z0ZW4gbWFuaXB1bGF0ZWQgYnkgdGhpcmQtcGFydHkgJyArICdzY3JpcHRzIGFuZCBicm93c2VyIGV4dGVuc2lvbnMuIFRoaXMgbWF5IGxlYWQgdG8gc3VidGxlICcgKyAncmVjb25jaWxpYXRpb24gaXNzdWVzLiBUcnkgcmVuZGVyaW5nIGludG8gYSBjb250YWluZXIgZWxlbWVudCBjcmVhdGVkICcgKyAnZm9yIHlvdXIgYXBwLicpIDogdm9pZCAwO1xuXG4gICAgdmFyIG5leHRXcmFwcGVkRWxlbWVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9wTGV2ZWxXcmFwcGVyLCB7XG4gICAgICBjaGlsZDogbmV4dEVsZW1lbnRcbiAgICB9KTtcblxuICAgIHZhciBuZXh0Q29udGV4dDtcbiAgICBpZiAocGFyZW50Q29tcG9uZW50KSB7XG4gICAgICB2YXIgcGFyZW50SW5zdCA9IFJlYWN0SW5zdGFuY2VNYXAuZ2V0KHBhcmVudENvbXBvbmVudCk7XG4gICAgICBuZXh0Q29udGV4dCA9IHBhcmVudEluc3QuX3Byb2Nlc3NDaGlsZENvbnRleHQocGFyZW50SW5zdC5fY29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRDb250ZXh0ID0gZW1wdHlPYmplY3Q7XG4gICAgfVxuXG4gICAgdmFyIHByZXZDb21wb25lbnQgPSBnZXRUb3BMZXZlbFdyYXBwZXJJbkNvbnRhaW5lcihjb250YWluZXIpO1xuXG4gICAgaWYgKHByZXZDb21wb25lbnQpIHtcbiAgICAgIHZhciBwcmV2V3JhcHBlZEVsZW1lbnQgPSBwcmV2Q29tcG9uZW50Ll9jdXJyZW50RWxlbWVudDtcbiAgICAgIHZhciBwcmV2RWxlbWVudCA9IHByZXZXcmFwcGVkRWxlbWVudC5wcm9wcy5jaGlsZDtcbiAgICAgIGlmIChzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudChwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQpKSB7XG4gICAgICAgIHZhciBwdWJsaWNJbnN0ID0gcHJldkNvbXBvbmVudC5fcmVuZGVyZWRDb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKTtcbiAgICAgICAgdmFyIHVwZGF0ZWRDYWxsYmFjayA9IGNhbGxiYWNrICYmIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjYWxsYmFjay5jYWxsKHB1YmxpY0luc3QpO1xuICAgICAgICB9O1xuICAgICAgICBSZWFjdE1vdW50Ll91cGRhdGVSb290Q29tcG9uZW50KHByZXZDb21wb25lbnQsIG5leHRXcmFwcGVkRWxlbWVudCwgbmV4dENvbnRleHQsIGNvbnRhaW5lciwgdXBkYXRlZENhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuIHB1YmxpY0luc3Q7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBSZWFjdE1vdW50LnVubW91bnRDb21wb25lbnRBdE5vZGUoY29udGFpbmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcmVhY3RSb290RWxlbWVudCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICAgIHZhciBjb250YWluZXJIYXNSZWFjdE1hcmt1cCA9IHJlYWN0Um9vdEVsZW1lbnQgJiYgISFpbnRlcm5hbEdldElEKHJlYWN0Um9vdEVsZW1lbnQpO1xuICAgIHZhciBjb250YWluZXJIYXNOb25Sb290UmVhY3RDaGlsZCA9IGhhc05vblJvb3RSZWFjdENoaWxkKGNvbnRhaW5lcik7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWNvbnRhaW5lckhhc05vblJvb3RSZWFjdENoaWxkLCAncmVuZGVyKC4uLik6IFJlcGxhY2luZyBSZWFjdC1yZW5kZXJlZCBjaGlsZHJlbiB3aXRoIGEgbmV3IHJvb3QgJyArICdjb21wb25lbnQuIElmIHlvdSBpbnRlbmRlZCB0byB1cGRhdGUgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSwgJyArICd5b3Ugc2hvdWxkIGluc3RlYWQgaGF2ZSB0aGUgZXhpc3RpbmcgY2hpbGRyZW4gdXBkYXRlIHRoZWlyIHN0YXRlICcgKyAnYW5kIHJlbmRlciB0aGUgbmV3IGNvbXBvbmVudHMgaW5zdGVhZCBvZiBjYWxsaW5nIFJlYWN0RE9NLnJlbmRlci4nKSA6IHZvaWQgMDtcblxuICAgICAgaWYgKCFjb250YWluZXJIYXNSZWFjdE1hcmt1cCB8fCByZWFjdFJvb3RFbGVtZW50Lm5leHRTaWJsaW5nKSB7XG4gICAgICAgIHZhciByb290RWxlbWVudFNpYmxpbmcgPSByZWFjdFJvb3RFbGVtZW50O1xuICAgICAgICB3aGlsZSAocm9vdEVsZW1lbnRTaWJsaW5nKSB7XG4gICAgICAgICAgaWYgKGludGVybmFsR2V0SUQocm9vdEVsZW1lbnRTaWJsaW5nKSkge1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdyZW5kZXIoKTogVGFyZ2V0IG5vZGUgaGFzIG1hcmt1cCByZW5kZXJlZCBieSBSZWFjdCwgYnV0IHRoZXJlICcgKyAnYXJlIHVucmVsYXRlZCBub2RlcyBhcyB3ZWxsLiBUaGlzIGlzIG1vc3QgY29tbW9ubHkgY2F1c2VkIGJ5ICcgKyAnd2hpdGUtc3BhY2UgaW5zZXJ0ZWQgYXJvdW5kIHNlcnZlci1yZW5kZXJlZCBtYXJrdXAuJykgOiB2b2lkIDA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcm9vdEVsZW1lbnRTaWJsaW5nID0gcm9vdEVsZW1lbnRTaWJsaW5nLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNob3VsZFJldXNlTWFya3VwID0gY29udGFpbmVySGFzUmVhY3RNYXJrdXAgJiYgIXByZXZDb21wb25lbnQgJiYgIWNvbnRhaW5lckhhc05vblJvb3RSZWFjdENoaWxkO1xuICAgIHZhciBjb21wb25lbnQgPSBSZWFjdE1vdW50Ll9yZW5kZXJOZXdSb290Q29tcG9uZW50KG5leHRXcmFwcGVkRWxlbWVudCwgY29udGFpbmVyLCBzaG91bGRSZXVzZU1hcmt1cCwgbmV4dENvbnRleHQpLl9yZW5kZXJlZENvbXBvbmVudC5nZXRQdWJsaWNJbnN0YW5jZSgpO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2suY2FsbChjb21wb25lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGEgUmVhY3QgY29tcG9uZW50IGludG8gdGhlIERPTSBpbiB0aGUgc3VwcGxpZWQgYGNvbnRhaW5lcmAuXG4gICAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdGRvbS5yZW5kZXJcbiAgICpcbiAgICogSWYgdGhlIFJlYWN0IGNvbXBvbmVudCB3YXMgcHJldmlvdXNseSByZW5kZXJlZCBpbnRvIGBjb250YWluZXJgLCB0aGlzIHdpbGxcbiAgICogcGVyZm9ybSBhbiB1cGRhdGUgb24gaXQgYW5kIG9ubHkgbXV0YXRlIHRoZSBET00gYXMgbmVjZXNzYXJ5IHRvIHJlZmxlY3QgdGhlXG4gICAqIGxhdGVzdCBSZWFjdCBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0RWxlbWVudCBDb21wb25lbnQgZWxlbWVudCB0byByZW5kZXIuXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIERPTSBlbGVtZW50IHRvIHJlbmRlciBpbnRvLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24gdHJpZ2dlcmVkIG9uIGNvbXBsZXRpb25cbiAgICogQHJldHVybiB7UmVhY3RDb21wb25lbnR9IENvbXBvbmVudCBpbnN0YW5jZSByZW5kZXJlZCBpbiBgY29udGFpbmVyYC5cbiAgICovXG4gIHJlbmRlcjogZnVuY3Rpb24gKG5leHRFbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIFJlYWN0TW91bnQuX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKG51bGwsIG5leHRFbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKTtcbiAgfSxcblxuICAvKipcbiAgICogVW5tb3VudHMgYW5kIGRlc3Ryb3lzIHRoZSBSZWFjdCBjb21wb25lbnQgcmVuZGVyZWQgaW4gdGhlIGBjb250YWluZXJgLlxuICAgKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3Rkb20udW5tb3VudGNvbXBvbmVudGF0bm9kZVxuICAgKlxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciBET00gZWxlbWVudCBjb250YWluaW5nIGEgUmVhY3QgY29tcG9uZW50LlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGEgY29tcG9uZW50IHdhcyBmb3VuZCBpbiBhbmQgdW5tb3VudGVkIGZyb21cbiAgICogICAgICAgICAgICAgICAgICAgYGNvbnRhaW5lcmBcbiAgICovXG4gIHVubW91bnRDb21wb25lbnRBdE5vZGU6IGZ1bmN0aW9uIChjb250YWluZXIpIHtcbiAgICAvLyBWYXJpb3VzIHBhcnRzIG9mIG91ciBjb2RlIChzdWNoIGFzIFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50J3NcbiAgICAvLyBfcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50KSBhc3N1bWUgdGhhdCBjYWxscyB0byByZW5kZXIgYXJlbid0IG5lc3RlZDtcbiAgICAvLyB2ZXJpZnkgdGhhdCB0aGF0J3MgdGhlIGNhc2UuIChTdHJpY3RseSBzcGVha2luZywgdW5tb3VudGluZyB3b24ndCBjYXVzZSBhXG4gICAgLy8gcmVuZGVyIGJ1dCB3ZSBzdGlsbCBkb24ndCBleHBlY3QgdG8gYmUgaW4gYSByZW5kZXIgY2FsbCBoZXJlLilcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID09IG51bGwsICd1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFJlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gJyArICdvZiBwcm9wcyBhbmQgc3RhdGU7IHRyaWdnZXJpbmcgbmVzdGVkIGNvbXBvbmVudCB1cGRhdGVzIGZyb20gcmVuZGVyICcgKyAnaXMgbm90IGFsbG93ZWQuIElmIG5lY2Vzc2FyeSwgdHJpZ2dlciBuZXN0ZWQgdXBkYXRlcyBpbiAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgJXMuJywgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IHZvaWQgMDtcblxuICAgICFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndW5tb3VudENvbXBvbmVudEF0Tm9kZSguLi4pOiBUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzQwJykgOiB2b2lkIDA7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIW5vZGVJc1JlbmRlcmVkQnlPdGhlckluc3RhbmNlKGNvbnRhaW5lciksIFwidW5tb3VudENvbXBvbmVudEF0Tm9kZSgpOiBUaGUgbm9kZSB5b3UncmUgYXR0ZW1wdGluZyB0byB1bm1vdW50IFwiICsgJ3dhcyByZW5kZXJlZCBieSBhbm90aGVyIGNvcHkgb2YgUmVhY3QuJykgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgdmFyIHByZXZDb21wb25lbnQgPSBnZXRUb3BMZXZlbFdyYXBwZXJJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICAgIGlmICghcHJldkNvbXBvbmVudCkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIG5vZGUgYmVpbmcgdW5tb3VudGVkIHdhcyByZW5kZXJlZCBieSBSZWFjdCwgYnV0IGlzbid0IGFcbiAgICAgIC8vIHJvb3Qgbm9kZS5cbiAgICAgIHZhciBjb250YWluZXJIYXNOb25Sb290UmVhY3RDaGlsZCA9IGhhc05vblJvb3RSZWFjdENoaWxkKGNvbnRhaW5lcik7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgaXRzZWxmIGlzIGEgUmVhY3Qgcm9vdCBub2RlLlxuICAgICAgdmFyIGlzQ29udGFpbmVyUmVhY3RSb290ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSAxICYmIGNvbnRhaW5lci5oYXNBdHRyaWJ1dGUoUk9PVF9BVFRSX05BTUUpO1xuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghY29udGFpbmVySGFzTm9uUm9vdFJlYWN0Q2hpbGQsIFwidW5tb3VudENvbXBvbmVudEF0Tm9kZSgpOiBUaGUgbm9kZSB5b3UncmUgYXR0ZW1wdGluZyB0byB1bm1vdW50IFwiICsgJ3dhcyByZW5kZXJlZCBieSBSZWFjdCBhbmQgaXMgbm90IGEgdG9wLWxldmVsIGNvbnRhaW5lci4gJXMnLCBpc0NvbnRhaW5lclJlYWN0Um9vdCA/ICdZb3UgbWF5IGhhdmUgYWNjaWRlbnRhbGx5IHBhc3NlZCBpbiBhIFJlYWN0IHJvb3Qgbm9kZSBpbnN0ZWFkICcgKyAnb2YgaXRzIGNvbnRhaW5lci4nIDogJ0luc3RlYWQsIGhhdmUgdGhlIHBhcmVudCBjb21wb25lbnQgdXBkYXRlIGl0cyBzdGF0ZSBhbmQgJyArICdyZXJlbmRlciBpbiBvcmRlciB0byByZW1vdmUgdGhpcyBjb21wb25lbnQuJykgOiB2b2lkIDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZGVsZXRlIGluc3RhbmNlc0J5UmVhY3RSb290SURbcHJldkNvbXBvbmVudC5faW5zdGFuY2Uucm9vdElEXTtcbiAgICBSZWFjdFVwZGF0ZXMuYmF0Y2hlZFVwZGF0ZXModW5tb3VudENvbXBvbmVudEZyb21Ob2RlLCBwcmV2Q29tcG9uZW50LCBjb250YWluZXIsIGZhbHNlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcblxuICBfbW91bnRJbWFnZUludG9Ob2RlOiBmdW5jdGlvbiAobWFya3VwLCBjb250YWluZXIsIGluc3RhbmNlLCBzaG91bGRSZXVzZU1hcmt1cCwgdHJhbnNhY3Rpb24pIHtcbiAgICAhaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ21vdW50Q29tcG9uZW50SW50b05vZGUoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgdmFsaWQuJykgOiBfcHJvZEludmFyaWFudCgnNDEnKSA6IHZvaWQgMDtcblxuICAgIGlmIChzaG91bGRSZXVzZU1hcmt1cCkge1xuICAgICAgdmFyIHJvb3RFbGVtZW50ID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gICAgICBpZiAoUmVhY3RNYXJrdXBDaGVja3N1bS5jYW5SZXVzZU1hcmt1cChtYXJrdXAsIHJvb3RFbGVtZW50KSkge1xuICAgICAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUucHJlY2FjaGVOb2RlKGluc3RhbmNlLCByb290RWxlbWVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBjaGVja3N1bSA9IHJvb3RFbGVtZW50LmdldEF0dHJpYnV0ZShSZWFjdE1hcmt1cENoZWNrc3VtLkNIRUNLU1VNX0FUVFJfTkFNRSk7XG4gICAgICAgIHJvb3RFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShSZWFjdE1hcmt1cENoZWNrc3VtLkNIRUNLU1VNX0FUVFJfTkFNRSk7XG5cbiAgICAgICAgdmFyIHJvb3RNYXJrdXAgPSByb290RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZShSZWFjdE1hcmt1cENoZWNrc3VtLkNIRUNLU1VNX0FUVFJfTkFNRSwgY2hlY2tzdW0pO1xuXG4gICAgICAgIHZhciBub3JtYWxpemVkTWFya3VwID0gbWFya3VwO1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIC8vIGJlY2F1c2Ugcm9vdE1hcmt1cCBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgRE9NLCB2YXJpb3VzIG5vcm1hbGl6YXRpb25zXG4gICAgICAgICAgLy8gd2lsbCBoYXZlIG9jY3VycmVkIHdoaWNoIHdpbGwgbm90IGJlIHByZXNlbnQgaW4gYG1hcmt1cGAuIEhlcmUsXG4gICAgICAgICAgLy8gaW5zZXJ0IG1hcmt1cCBpbnRvIGEgPGRpdj4gb3IgPGlmcmFtZT4gZGVwZW5kaW5nIG9uIHRoZSBjb250YWluZXJcbiAgICAgICAgICAvLyB0eXBlIHRvIHBlcmZvcm0gdGhlIHNhbWUgbm9ybWFsaXphdGlvbnMgYmVmb3JlIGNvbXBhcmluZy5cbiAgICAgICAgICB2YXIgbm9ybWFsaXplcjtcbiAgICAgICAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREVfVFlQRSkge1xuICAgICAgICAgICAgbm9ybWFsaXplciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgbm9ybWFsaXplci5pbm5lckhUTUwgPSBtYXJrdXA7XG4gICAgICAgICAgICBub3JtYWxpemVkTWFya3VwID0gbm9ybWFsaXplci5pbm5lckhUTUw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vcm1hbGl6ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobm9ybWFsaXplcik7XG4gICAgICAgICAgICBub3JtYWxpemVyLmNvbnRlbnREb2N1bWVudC53cml0ZShtYXJrdXApO1xuICAgICAgICAgICAgbm9ybWFsaXplZE1hcmt1cCA9IG5vcm1hbGl6ZXIuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKG5vcm1hbGl6ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkaWZmSW5kZXggPSBmaXJzdERpZmZlcmVuY2VJbmRleChub3JtYWxpemVkTWFya3VwLCByb290TWFya3VwKTtcbiAgICAgICAgdmFyIGRpZmZlcmVuY2UgPSAnIChjbGllbnQpICcgKyBub3JtYWxpemVkTWFya3VwLnN1YnN0cmluZyhkaWZmSW5kZXggLSAyMCwgZGlmZkluZGV4ICsgMjApICsgJ1xcbiAoc2VydmVyKSAnICsgcm9vdE1hcmt1cC5zdWJzdHJpbmcoZGlmZkluZGV4IC0gMjAsIGRpZmZJbmRleCArIDIwKTtcblxuICAgICAgICAhKGNvbnRhaW5lci5ub2RlVHlwZSAhPT0gRE9DX05PREVfVFlQRSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnWW91XFwncmUgdHJ5aW5nIHRvIHJlbmRlciBhIGNvbXBvbmVudCB0byB0aGUgZG9jdW1lbnQgdXNpbmcgc2VydmVyIHJlbmRlcmluZyBidXQgdGhlIGNoZWNrc3VtIHdhcyBpbnZhbGlkLiBUaGlzIHVzdWFsbHkgbWVhbnMgeW91IHJlbmRlcmVkIGEgZGlmZmVyZW50IGNvbXBvbmVudCB0eXBlIG9yIHByb3BzIG9uIHRoZSBjbGllbnQgZnJvbSB0aGUgb25lIG9uIHRoZSBzZXJ2ZXIsIG9yIHlvdXIgcmVuZGVyKCkgbWV0aG9kcyBhcmUgaW1wdXJlLiBSZWFjdCBjYW5ub3QgaGFuZGxlIHRoaXMgY2FzZSBkdWUgdG8gY3Jvc3MtYnJvd3NlciBxdWlya3MgYnkgcmVuZGVyaW5nIGF0IHRoZSBkb2N1bWVudCByb290LiBZb3Ugc2hvdWxkIGxvb2sgZm9yIGVudmlyb25tZW50IGRlcGVuZGVudCBjb2RlIGluIHlvdXIgY29tcG9uZW50cyBhbmQgZW5zdXJlIHRoZSBwcm9wcyBhcmUgdGhlIHNhbWUgY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZTpcXG4lcycsIGRpZmZlcmVuY2UpIDogX3Byb2RJbnZhcmlhbnQoJzQyJywgZGlmZmVyZW5jZSkgOiB2b2lkIDA7XG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1JlYWN0IGF0dGVtcHRlZCB0byByZXVzZSBtYXJrdXAgaW4gYSBjb250YWluZXIgYnV0IHRoZSAnICsgJ2NoZWNrc3VtIHdhcyBpbnZhbGlkLiBUaGlzIGdlbmVyYWxseSBtZWFucyB0aGF0IHlvdSBhcmUgJyArICd1c2luZyBzZXJ2ZXIgcmVuZGVyaW5nIGFuZCB0aGUgbWFya3VwIGdlbmVyYXRlZCBvbiB0aGUgJyArICdzZXJ2ZXIgd2FzIG5vdCB3aGF0IHRoZSBjbGllbnQgd2FzIGV4cGVjdGluZy4gUmVhY3QgaW5qZWN0ZWQgJyArICduZXcgbWFya3VwIHRvIGNvbXBlbnNhdGUgd2hpY2ggd29ya3MgYnV0IHlvdSBoYXZlIGxvc3QgbWFueSAnICsgJ29mIHRoZSBiZW5lZml0cyBvZiBzZXJ2ZXIgcmVuZGVyaW5nLiBJbnN0ZWFkLCBmaWd1cmUgb3V0ICcgKyAnd2h5IHRoZSBtYXJrdXAgYmVpbmcgZ2VuZXJhdGVkIGlzIGRpZmZlcmVudCBvbiB0aGUgY2xpZW50ICcgKyAnb3Igc2VydmVyOlxcbiVzJywgZGlmZmVyZW5jZSkgOiB2b2lkIDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAhKGNvbnRhaW5lci5ub2RlVHlwZSAhPT0gRE9DX05PREVfVFlQRSkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnWW91XFwncmUgdHJ5aW5nIHRvIHJlbmRlciBhIGNvbXBvbmVudCB0byB0aGUgZG9jdW1lbnQgYnV0IHlvdSBkaWRuXFwndCB1c2Ugc2VydmVyIHJlbmRlcmluZy4gV2UgY2FuXFwndCBkbyB0aGlzIHdpdGhvdXQgdXNpbmcgc2VydmVyIHJlbmRlcmluZyBkdWUgdG8gY3Jvc3MtYnJvd3NlciBxdWlya3MuIFNlZSBSZWFjdERPTVNlcnZlci5yZW5kZXJUb1N0cmluZygpIGZvciBzZXJ2ZXIgcmVuZGVyaW5nLicpIDogX3Byb2RJbnZhcmlhbnQoJzQzJykgOiB2b2lkIDA7XG5cbiAgICBpZiAodHJhbnNhY3Rpb24udXNlQ3JlYXRlRWxlbWVudCkge1xuICAgICAgd2hpbGUgKGNvbnRhaW5lci5sYXN0Q2hpbGQpIHtcbiAgICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGNvbnRhaW5lci5sYXN0Q2hpbGQpO1xuICAgICAgfVxuICAgICAgRE9NTGF6eVRyZWUuaW5zZXJ0VHJlZUJlZm9yZShjb250YWluZXIsIG1hcmt1cCwgbnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldElubmVySFRNTChjb250YWluZXIsIG1hcmt1cCk7XG4gICAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUucHJlY2FjaGVOb2RlKGluc3RhbmNlLCBjb250YWluZXIuZmlyc3RDaGlsZCk7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBob3N0Tm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKGNvbnRhaW5lci5maXJzdENoaWxkKTtcbiAgICAgIGlmIChob3N0Tm9kZS5fZGVidWdJRCAhPT0gMCkge1xuICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgICAgICBpbnN0YW5jZUlEOiBob3N0Tm9kZS5fZGVidWdJRCxcbiAgICAgICAgICB0eXBlOiAnbW91bnQnLFxuICAgICAgICAgIHBheWxvYWQ6IG1hcmt1cC50b1N0cmluZygpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdE1vdW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gJzE1LjYuMSc7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0Tm9kZVR5cGVzID0gcmVxdWlyZSgnLi9SZWFjdE5vZGVUeXBlcycpO1xuXG5mdW5jdGlvbiBnZXRIb3N0Q29tcG9uZW50RnJvbUNvbXBvc2l0ZShpbnN0KSB7XG4gIHZhciB0eXBlO1xuXG4gIHdoaWxlICgodHlwZSA9IGluc3QuX3JlbmRlcmVkTm9kZVR5cGUpID09PSBSZWFjdE5vZGVUeXBlcy5DT01QT1NJVEUpIHtcbiAgICBpbnN0ID0gaW5zdC5fcmVuZGVyZWRDb21wb25lbnQ7XG4gIH1cblxuICBpZiAodHlwZSA9PT0gUmVhY3ROb2RlVHlwZXMuSE9TVCkge1xuICAgIHJldHVybiBpbnN0Ll9yZW5kZXJlZENvbXBvbmVudDtcbiAgfSBlbHNlIGlmICh0eXBlID09PSBSZWFjdE5vZGVUeXBlcy5FTVBUWSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0SG9zdENvbXBvbmVudEZyb21Db21wb3NpdGU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q3VycmVudE93bmVyJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdEluc3RhbmNlTWFwID0gcmVxdWlyZSgnLi9SZWFjdEluc3RhbmNlTWFwJyk7XG5cbnZhciBnZXRIb3N0Q29tcG9uZW50RnJvbUNvbXBvc2l0ZSA9IHJlcXVpcmUoJy4vZ2V0SG9zdENvbXBvbmVudEZyb21Db21wb3NpdGUnKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIERPTSBub2RlIHJlbmRlcmVkIGJ5IHRoaXMgZWxlbWVudC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3Rkb20uZmluZGRvbW5vZGVcbiAqXG4gKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fERPTUVsZW1lbnR9IGNvbXBvbmVudE9yRWxlbWVudFxuICogQHJldHVybiB7P0RPTUVsZW1lbnR9IFRoZSByb290IG5vZGUgb2YgdGhpcyBlbGVtZW50LlxuICovXG5mdW5jdGlvbiBmaW5kRE9NTm9kZShjb21wb25lbnRPckVsZW1lbnQpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuICAgIGlmIChvd25lciAhPT0gbnVsbCkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcob3duZXIuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyLCAnJXMgaXMgYWNjZXNzaW5nIGZpbmRET01Ob2RlIGluc2lkZSBpdHMgcmVuZGVyKCkuICcgKyAncmVuZGVyKCkgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuIEl0IHNob3VsZCAnICsgJ25ldmVyIGFjY2VzcyBzb21ldGhpbmcgdGhhdCByZXF1aXJlcyBzdGFsZSBkYXRhIGZyb20gdGhlIHByZXZpb3VzICcgKyAncmVuZGVyLCBzdWNoIGFzIHJlZnMuIE1vdmUgdGhpcyBsb2dpYyB0byBjb21wb25lbnREaWRNb3VudCBhbmQgJyArICdjb21wb25lbnREaWRVcGRhdGUgaW5zdGVhZC4nLCBvd25lci5nZXROYW1lKCkgfHwgJ0EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICBvd25lci5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBpZiAoY29tcG9uZW50T3JFbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoY29tcG9uZW50T3JFbGVtZW50Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgcmV0dXJuIGNvbXBvbmVudE9yRWxlbWVudDtcbiAgfVxuXG4gIHZhciBpbnN0ID0gUmVhY3RJbnN0YW5jZU1hcC5nZXQoY29tcG9uZW50T3JFbGVtZW50KTtcbiAgaWYgKGluc3QpIHtcbiAgICBpbnN0ID0gZ2V0SG9zdENvbXBvbmVudEZyb21Db21wb3NpdGUoaW5zdCk7XG4gICAgcmV0dXJuIGluc3QgPyBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KSA6IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIGNvbXBvbmVudE9yRWxlbWVudC5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAhZmFsc2UgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnZmluZERPTU5vZGUgd2FzIGNhbGxlZCBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzQ0JykgOiB2b2lkIDA7XG4gIH0gZWxzZSB7XG4gICAgIWZhbHNlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0VsZW1lbnQgYXBwZWFycyB0byBiZSBuZWl0aGVyIFJlYWN0Q29tcG9uZW50IG5vciBET01Ob2RlIChrZXlzOiAlcyknLCBPYmplY3Qua2V5cyhjb21wb25lbnRPckVsZW1lbnQpKSA6IF9wcm9kSW52YXJpYW50KCc0NScsIE9iamVjdC5rZXlzKGNvbXBvbmVudE9yRWxlbWVudCkpIDogdm9pZCAwO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmluZERPTU5vZGU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0TW91bnQgPSByZXF1aXJlKCcuL1JlYWN0TW91bnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdE1vdW50LnJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4vKiBnbG9iYWxzIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3REZWZhdWx0SW5qZWN0aW9uID0gcmVxdWlyZSgnLi9SZWFjdERlZmF1bHRJbmplY3Rpb24nKTtcbnZhciBSZWFjdE1vdW50ID0gcmVxdWlyZSgnLi9SZWFjdE1vdW50Jyk7XG52YXIgUmVhY3RSZWNvbmNpbGVyID0gcmVxdWlyZSgnLi9SZWFjdFJlY29uY2lsZXInKTtcbnZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpO1xudmFyIFJlYWN0VmVyc2lvbiA9IHJlcXVpcmUoJy4vUmVhY3RWZXJzaW9uJyk7XG5cbnZhciBmaW5kRE9NTm9kZSA9IHJlcXVpcmUoJy4vZmluZERPTU5vZGUnKTtcbnZhciBnZXRIb3N0Q29tcG9uZW50RnJvbUNvbXBvc2l0ZSA9IHJlcXVpcmUoJy4vZ2V0SG9zdENvbXBvbmVudEZyb21Db21wb3NpdGUnKTtcbnZhciByZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lciA9IHJlcXVpcmUoJy4vcmVuZGVyU3VidHJlZUludG9Db250YWluZXInKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG5SZWFjdERlZmF1bHRJbmplY3Rpb24uaW5qZWN0KCk7XG5cbnZhciBSZWFjdERPTSA9IHtcbiAgZmluZERPTU5vZGU6IGZpbmRET01Ob2RlLFxuICByZW5kZXI6IFJlYWN0TW91bnQucmVuZGVyLFxuICB1bm1vdW50Q29tcG9uZW50QXROb2RlOiBSZWFjdE1vdW50LnVubW91bnRDb21wb25lbnRBdE5vZGUsXG4gIHZlcnNpb246IFJlYWN0VmVyc2lvbixcblxuICAvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbiAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXM6IFJlYWN0VXBkYXRlcy5iYXRjaGVkVXBkYXRlcyxcbiAgdW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXI6IHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyXG4gIC8qIGVzbGludC1lbmFibGUgY2FtZWxjYXNlICovXG59O1xuXG4vLyBJbmplY3QgdGhlIHJ1bnRpbWUgaW50byBhIGRldnRvb2xzIGdsb2JhbCBob29rIHJlZ2FyZGxlc3Mgb2YgYnJvd3Nlci5cbi8vIEFsbG93cyBmb3IgZGVidWdnaW5nIHdoZW4gdGhlIGhvb2sgaXMgaW5qZWN0ZWQgb24gdGhlIHBhZ2UuXG5pZiAodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5pbmplY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmluamVjdCh7XG4gICAgQ29tcG9uZW50VHJlZToge1xuICAgICAgZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGU6IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSxcbiAgICAgIGdldE5vZGVGcm9tSW5zdGFuY2U6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgICAgIC8vIGluc3QgaXMgYW4gaW50ZXJuYWwgaW5zdGFuY2UgKGJ1dCBjb3VsZCBiZSBhIGNvbXBvc2l0ZSlcbiAgICAgICAgaWYgKGluc3QuX3JlbmRlcmVkQ29tcG9uZW50KSB7XG4gICAgICAgICAgaW5zdCA9IGdldEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlKGluc3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnN0KSB7XG4gICAgICAgICAgcmV0dXJuIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBNb3VudDogUmVhY3RNb3VudCxcbiAgICBSZWNvbmNpbGVyOiBSZWFjdFJlY29uY2lsZXJcbiAgfSk7XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG4gIGlmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gJiYgd2luZG93LnRvcCA9PT0gd2luZG93LnNlbGYpIHtcbiAgICAvLyBGaXJzdCBjaGVjayBpZiBkZXZ0b29scyBpcyBub3QgaW5zdGFsbGVkXG4gICAgaWYgKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBJZiB3ZSdyZSBpbiBDaHJvbWUgb3IgRmlyZWZveCwgcHJvdmlkZSBhIGRvd25sb2FkIGxpbmsgaWYgbm90IGluc3RhbGxlZC5cbiAgICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0Nocm9tZScpID4gLTEgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdFZGdlJykgPT09IC0xIHx8IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRmlyZWZveCcpID4gLTEpIHtcbiAgICAgICAgLy8gRmlyZWZveCBkb2VzIG5vdCBoYXZlIHRoZSBpc3N1ZSB3aXRoIGRldnRvb2xzIGxvYWRlZCBvdmVyIGZpbGU6Ly9cbiAgICAgICAgdmFyIHNob3dGaWxlVXJsTWVzc2FnZSA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbC5pbmRleE9mKCdodHRwJykgPT09IC0xICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRmlyZWZveCcpID09PSAtMTtcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnRG93bmxvYWQgdGhlIFJlYWN0IERldlRvb2xzICcgKyAoc2hvd0ZpbGVVcmxNZXNzYWdlID8gJ2FuZCB1c2UgYW4gSFRUUCBzZXJ2ZXIgKGluc3RlYWQgb2YgYSBmaWxlOiBVUkwpICcgOiAnJykgKyAnZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6ICcgKyAnaHR0cHM6Ly9mYi5tZS9yZWFjdC1kZXZ0b29scycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB0ZXN0RnVuYyA9IGZ1bmN0aW9uIHRlc3RGbigpIHt9O1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCh0ZXN0RnVuYy5uYW1lIHx8IHRlc3RGdW5jLnRvU3RyaW5nKCkpLmluZGV4T2YoJ3Rlc3RGbicpICE9PSAtMSwgXCJJdCBsb29rcyBsaWtlIHlvdSdyZSB1c2luZyBhIG1pbmlmaWVkIGNvcHkgb2YgdGhlIGRldmVsb3BtZW50IGJ1aWxkIFwiICsgJ29mIFJlYWN0LiBXaGVuIGRlcGxveWluZyBSZWFjdCBhcHBzIHRvIHByb2R1Y3Rpb24sIG1ha2Ugc3VyZSB0byB1c2UgJyArICd0aGUgcHJvZHVjdGlvbiBidWlsZCB3aGljaCBza2lwcyBkZXZlbG9wbWVudCB3YXJuaW5ncyBhbmQgaXMgZmFzdGVyLiAnICsgJ1NlZSBodHRwczovL2ZiLm1lL3JlYWN0LW1pbmlmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLicpIDogdm9pZCAwO1xuXG4gICAgLy8gSWYgd2UncmUgaW4gSUU4LCBjaGVjayB0byBzZWUgaWYgd2UgYXJlIGluIGNvbXBhdGliaWxpdHkgbW9kZSBhbmQgcHJvdmlkZVxuICAgIC8vIGluZm9ybWF0aW9uIG9uIHByZXZlbnRpbmcgY29tcGF0aWJpbGl0eSBtb2RlXG4gICAgdmFyIGllQ29tcGF0aWJpbGl0eU1vZGUgPSBkb2N1bWVudC5kb2N1bWVudE1vZGUgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDwgODtcblxuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFpZUNvbXBhdGliaWxpdHlNb2RlLCAnSW50ZXJuZXQgRXhwbG9yZXIgaXMgcnVubmluZyBpbiBjb21wYXRpYmlsaXR5IG1vZGU7IHBsZWFzZSBhZGQgdGhlICcgKyAnZm9sbG93aW5nIHRhZyB0byB5b3VyIEhUTUwgdG8gcHJldmVudCB0aGlzIGZyb20gaGFwcGVuaW5nOiAnICsgJzxtZXRhIGh0dHAtZXF1aXY9XCJYLVVBLUNvbXBhdGlibGVcIiBjb250ZW50PVwiSUU9ZWRnZVwiIC8+JykgOiB2b2lkIDA7XG5cbiAgICB2YXIgZXhwZWN0ZWRGZWF0dXJlcyA9IFtcbiAgICAvLyBzaGltc1xuICAgIEFycmF5LmlzQXJyYXksIEFycmF5LnByb3RvdHlwZS5ldmVyeSwgQXJyYXkucHJvdG90eXBlLmZvckVhY2gsIEFycmF5LnByb3RvdHlwZS5pbmRleE9mLCBBcnJheS5wcm90b3R5cGUubWFwLCBEYXRlLm5vdywgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQsIE9iamVjdC5rZXlzLCBTdHJpbmcucHJvdG90eXBlLnRyaW1dO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHBlY3RlZEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWV4cGVjdGVkRmVhdHVyZXNbaV0pIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdPbmUgb3IgbW9yZSBFUzUgc2hpbXMgZXhwZWN0ZWQgYnkgUmVhY3QgYXJlIG5vdCBhdmFpbGFibGU6ICcgKyAnaHR0cHM6Ly9mYi5tZS9yZWFjdC13YXJuaW5nLXBvbHlmaWxscycpIDogdm9pZCAwO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xuICB2YXIgUmVhY3RET01Vbmtub3duUHJvcGVydHlIb29rID0gcmVxdWlyZSgnLi9SZWFjdERPTVVua25vd25Qcm9wZXJ0eUhvb2snKTtcbiAgdmFyIFJlYWN0RE9NTnVsbElucHV0VmFsdWVQcm9wSG9vayA9IHJlcXVpcmUoJy4vUmVhY3RET01OdWxsSW5wdXRWYWx1ZVByb3BIb29rJyk7XG4gIHZhciBSZWFjdERPTUludmFsaWRBUklBSG9vayA9IHJlcXVpcmUoJy4vUmVhY3RET01JbnZhbGlkQVJJQUhvb2snKTtcblxuICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wuYWRkSG9vayhSZWFjdERPTVVua25vd25Qcm9wZXJ0eUhvb2spO1xuICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wuYWRkSG9vayhSZWFjdERPTU51bGxJbnB1dFZhbHVlUHJvcEhvb2spO1xuICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wuYWRkSG9vayhSZWFjdERPTUludmFsaWRBUklBSG9vayk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET007IiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL1JlYWN0RE9NJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvUmVhY3QnKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2lzUGxhY2Vob2xkZXIoYSkge1xuICByZXR1cm4gYSAhPSBudWxsICYmXG4gICAgICAgICB0eXBlb2YgYSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIGFbJ0BAZnVuY3Rpb25hbC9wbGFjZWhvbGRlciddID09PSB0cnVlO1xufTtcbiIsInZhciBfaXNQbGFjZWhvbGRlciA9IHJlcXVpcmUoJy4vX2lzUGxhY2Vob2xkZXInKTtcblxuXG4vKipcbiAqIE9wdGltaXplZCBpbnRlcm5hbCBvbmUtYXJpdHkgY3VycnkgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBjdXJyaWVkIGZ1bmN0aW9uLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9jdXJyeTEoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGYxKGEpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCB8fCBfaXNQbGFjZWhvbGRlcihhKSkge1xuICAgICAgcmV0dXJuIGYxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH07XG59O1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFsd2F5cyByZXR1cm5zIHRoZSBnaXZlbiB2YWx1ZS4gTm90ZSB0aGF0IGZvclxuICogbm9uLXByaW1pdGl2ZXMgdGhlIHZhbHVlIHJldHVybmVkIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGtub3duIGFzIGBjb25zdGAsIGBjb25zdGFudGAsIG9yIGBLYCAoZm9yIEsgY29tYmluYXRvcikgaW5cbiAqIG90aGVyIGxhbmd1YWdlcyBhbmQgbGlicmFyaWVzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIGEgLT4gKCogLT4gYSlcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB3cmFwIGluIGEgZnVuY3Rpb25cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIEZ1bmN0aW9uIDo6ICogLT4gdmFsLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciB0ID0gUi5hbHdheXMoJ1RlZScpO1xuICogICAgICB0KCk7IC8vPT4gJ1RlZSdcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkxKGZ1bmN0aW9uIGFsd2F5cyh2YWwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB2YWw7XG4gIH07XG59KTtcbiIsInZhciBhbHdheXMgPSByZXF1aXJlKCcuL2Fsd2F5cycpO1xuXG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGFsd2F5cyByZXR1cm5zIGBmYWxzZWAuIEFueSBwYXNzZWQgaW4gcGFyYW1ldGVycyBhcmUgaWdub3JlZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC45LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAqIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn1cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAc2VlIFIuYWx3YXlzLCBSLlRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLkYoKTsgLy89PiBmYWxzZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGFsd2F5cyhmYWxzZSk7XG4iLCJ2YXIgYWx3YXlzID0gcmVxdWlyZSgnLi9hbHdheXMnKTtcblxuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBhbHdheXMgcmV0dXJucyBgdHJ1ZWAuIEFueSBwYXNzZWQgaW4gcGFyYW1ldGVycyBhcmUgaWdub3JlZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC45LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAqIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn1cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAc2VlIFIuYWx3YXlzLCBSLkZcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLlQoKTsgLy89PiB0cnVlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gYWx3YXlzKHRydWUpO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWwgcGxhY2Vob2xkZXIgdmFsdWUgdXNlZCB0byBzcGVjaWZ5IFwiZ2Fwc1wiIHdpdGhpbiBjdXJyaWVkIGZ1bmN0aW9ucyxcbiAqIGFsbG93aW5nIHBhcnRpYWwgYXBwbGljYXRpb24gb2YgYW55IGNvbWJpbmF0aW9uIG9mIGFyZ3VtZW50cywgcmVnYXJkbGVzcyBvZlxuICogdGhlaXIgcG9zaXRpb25zLlxuICpcbiAqIElmIGBnYCBpcyBhIGN1cnJpZWQgdGVybmFyeSBmdW5jdGlvbiBhbmQgYF9gIGlzIGBSLl9fYCwgdGhlIGZvbGxvd2luZyBhcmVcbiAqIGVxdWl2YWxlbnQ6XG4gKlxuICogICAtIGBnKDEsIDIsIDMpYFxuICogICAtIGBnKF8sIDIsIDMpKDEpYFxuICogICAtIGBnKF8sIF8sIDMpKDEpKDIpYFxuICogICAtIGBnKF8sIF8sIDMpKDEsIDIpYFxuICogICAtIGBnKF8sIDIsIF8pKDEsIDMpYFxuICogICAtIGBnKF8sIDIpKDEpKDMpYFxuICogICAtIGBnKF8sIDIpKDEsIDMpYFxuICogICAtIGBnKF8sIDIpKF8sIDMpKDEpYFxuICpcbiAqIEBjb25zdGFudFxuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC42LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBncmVldCA9IFIucmVwbGFjZSgne25hbWV9JywgUi5fXywgJ0hlbGxvLCB7bmFtZX0hJyk7XG4gKiAgICAgIGdyZWV0KCdBbGljZScpOyAvLz0+ICdIZWxsbywgQWxpY2UhJ1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IHsnQEBmdW5jdGlvbmFsL3BsYWNlaG9sZGVyJzogdHJ1ZX07XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vX2N1cnJ5MScpO1xudmFyIF9pc1BsYWNlaG9sZGVyID0gcmVxdWlyZSgnLi9faXNQbGFjZWhvbGRlcicpO1xuXG5cbi8qKlxuICogT3B0aW1pemVkIGludGVybmFsIHR3by1hcml0eSBjdXJyeSBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGN1cnJpZWQgZnVuY3Rpb24uXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2N1cnJ5Mihmbikge1xuICByZXR1cm4gZnVuY3Rpb24gZjIoYSwgYikge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gZjI7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSA/IGYyXG4gICAgICAgICAgICAgOiBfY3VycnkxKGZ1bmN0aW9uKF9iKSB7IHJldHVybiBmbihhLCBfYik7IH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIF9pc1BsYWNlaG9sZGVyKGEpICYmIF9pc1BsYWNlaG9sZGVyKGIpID8gZjJcbiAgICAgICAgICAgICA6IF9pc1BsYWNlaG9sZGVyKGEpID8gX2N1cnJ5MShmdW5jdGlvbihfYSkgeyByZXR1cm4gZm4oX2EsIGIpOyB9KVxuICAgICAgICAgICAgIDogX2lzUGxhY2Vob2xkZXIoYikgPyBfY3VycnkxKGZ1bmN0aW9uKF9iKSB7IHJldHVybiBmbihhLCBfYik7IH0pXG4gICAgICAgICAgICAgOiBmbihhLCBiKTtcbiAgICB9XG4gIH07XG59O1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIEFkZHMgdHdvIHZhbHVlcy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gTnVtYmVyXG4gKiBAcGFyYW0ge051bWJlcn0gYVxuICogQHBhcmFtIHtOdW1iZXJ9IGJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBzZWUgUi5zdWJ0cmFjdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuYWRkKDIsIDMpOyAgICAgICAvLz0+ICA1XG4gKiAgICAgIFIuYWRkKDcpKDEwKTsgICAgICAvLz0+IDE3XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBhZGQoYSwgYikge1xuICByZXR1cm4gTnVtYmVyKGEpICsgTnVtYmVyKGIpO1xufSk7XG4iLCIvKipcbiAqIFByaXZhdGUgYGNvbmNhdGAgZnVuY3Rpb24gdG8gbWVyZ2UgdHdvIGFycmF5LWxpa2Ugb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxBcmd1bWVudHN9IFtzZXQxPVtdXSBBbiBhcnJheS1saWtlIG9iamVjdC5cbiAqIEBwYXJhbSB7QXJyYXl8QXJndW1lbnRzfSBbc2V0Mj1bXV0gQW4gYXJyYXktbGlrZSBvYmplY3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcsIG1lcmdlZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBfY29uY2F0KFs0LCA1LCA2XSwgWzEsIDIsIDNdKTsgLy89PiBbNCwgNSwgNiwgMSwgMiwgM11cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfY29uY2F0KHNldDEsIHNldDIpIHtcbiAgc2V0MSA9IHNldDEgfHwgW107XG4gIHNldDIgPSBzZXQyIHx8IFtdO1xuICB2YXIgaWR4O1xuICB2YXIgbGVuMSA9IHNldDEubGVuZ3RoO1xuICB2YXIgbGVuMiA9IHNldDIubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gW107XG5cbiAgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IGxlbjEpIHtcbiAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBzZXQxW2lkeF07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IGxlbjIpIHtcbiAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBzZXQyW2lkeF07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9hcml0eShuLCBmbikge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICBzd2l0Y2ggKG4pIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24oYTApIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24oYTAsIGExKSB7IHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uKGEwLCBhMSwgYTIpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSA0OiByZXR1cm4gZnVuY3Rpb24oYTAsIGExLCBhMiwgYTMpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSA1OiByZXR1cm4gZnVuY3Rpb24oYTAsIGExLCBhMiwgYTMsIGE0KSB7IHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9O1xuICAgIGNhc2UgNjogcmV0dXJuIGZ1bmN0aW9uKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSA3OiByZXR1cm4gZnVuY3Rpb24oYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSA4OiByZXR1cm4gZnVuY3Rpb24oYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSB7IHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9O1xuICAgIGNhc2UgOTogcmV0dXJuIGZ1bmN0aW9uKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgY2FzZSAxMDogcmV0dXJuIGZ1bmN0aW9uKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7IHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9O1xuICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcignRmlyc3QgYXJndW1lbnQgdG8gX2FyaXR5IG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciBubyBncmVhdGVyIHRoYW4gdGVuJyk7XG4gIH1cbn07XG4iLCJ2YXIgX2FyaXR5ID0gcmVxdWlyZSgnLi9fYXJpdHknKTtcbnZhciBfaXNQbGFjZWhvbGRlciA9IHJlcXVpcmUoJy4vX2lzUGxhY2Vob2xkZXInKTtcblxuXG4vKipcbiAqIEludGVybmFsIGN1cnJ5TiBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge051bWJlcn0gbGVuZ3RoIFRoZSBhcml0eSBvZiB0aGUgY3VycmllZCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXl9IHJlY2VpdmVkIEFuIGFycmF5IG9mIGFyZ3VtZW50cyByZWNlaXZlZCB0aHVzIGZhci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjdXJyeS5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY3VycmllZCBmdW5jdGlvbi5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfY3VycnlOKGxlbmd0aCwgcmVjZWl2ZWQsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY29tYmluZWQgPSBbXTtcbiAgICB2YXIgYXJnc0lkeCA9IDA7XG4gICAgdmFyIGxlZnQgPSBsZW5ndGg7XG4gICAgdmFyIGNvbWJpbmVkSWR4ID0gMDtcbiAgICB3aGlsZSAoY29tYmluZWRJZHggPCByZWNlaXZlZC5sZW5ndGggfHwgYXJnc0lkeCA8IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICBpZiAoY29tYmluZWRJZHggPCByZWNlaXZlZC5sZW5ndGggJiZcbiAgICAgICAgICAoIV9pc1BsYWNlaG9sZGVyKHJlY2VpdmVkW2NvbWJpbmVkSWR4XSkgfHxcbiAgICAgICAgICAgYXJnc0lkeCA+PSBhcmd1bWVudHMubGVuZ3RoKSkge1xuICAgICAgICByZXN1bHQgPSByZWNlaXZlZFtjb21iaW5lZElkeF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBhcmd1bWVudHNbYXJnc0lkeF07XG4gICAgICAgIGFyZ3NJZHggKz0gMTtcbiAgICAgIH1cbiAgICAgIGNvbWJpbmVkW2NvbWJpbmVkSWR4XSA9IHJlc3VsdDtcbiAgICAgIGlmICghX2lzUGxhY2Vob2xkZXIocmVzdWx0KSkge1xuICAgICAgICBsZWZ0IC09IDE7XG4gICAgICB9XG4gICAgICBjb21iaW5lZElkeCArPSAxO1xuICAgIH1cbiAgICByZXR1cm4gbGVmdCA8PSAwID8gZm4uYXBwbHkodGhpcywgY29tYmluZWQpXG4gICAgICAgICAgICAgICAgICAgICA6IF9hcml0eShsZWZ0LCBfY3VycnlOKGxlbmd0aCwgY29tYmluZWQsIGZuKSk7XG4gIH07XG59O1xuIiwidmFyIF9hcml0eSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2FyaXR5Jyk7XG52YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xudmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcbnZhciBfY3VycnlOID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnlOJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgY3VycmllZCBlcXVpdmFsZW50IG9mIHRoZSBwcm92aWRlZCBmdW5jdGlvbiwgd2l0aCB0aGUgc3BlY2lmaWVkXG4gKiBhcml0eS4gVGhlIGN1cnJpZWQgZnVuY3Rpb24gaGFzIHR3byB1bnVzdWFsIGNhcGFiaWxpdGllcy4gRmlyc3QsIGl0c1xuICogYXJndW1lbnRzIG5lZWRuJ3QgYmUgcHJvdmlkZWQgb25lIGF0IGEgdGltZS4gSWYgYGdgIGlzIGBSLmN1cnJ5TigzLCBmKWAsIHRoZVxuICogZm9sbG93aW5nIGFyZSBlcXVpdmFsZW50OlxuICpcbiAqICAgLSBgZygxKSgyKSgzKWBcbiAqICAgLSBgZygxKSgyLCAzKWBcbiAqICAgLSBgZygxLCAyKSgzKWBcbiAqICAgLSBgZygxLCAyLCAzKWBcbiAqXG4gKiBTZWNvbmRseSwgdGhlIHNwZWNpYWwgcGxhY2Vob2xkZXIgdmFsdWUgYFIuX19gIG1heSBiZSB1c2VkIHRvIHNwZWNpZnlcbiAqIFwiZ2Fwc1wiLCBhbGxvd2luZyBwYXJ0aWFsIGFwcGxpY2F0aW9uIG9mIGFueSBjb21iaW5hdGlvbiBvZiBhcmd1bWVudHMsXG4gKiByZWdhcmRsZXNzIG9mIHRoZWlyIHBvc2l0aW9ucy4gSWYgYGdgIGlzIGFzIGFib3ZlIGFuZCBgX2AgaXMgYFIuX19gLCB0aGVcbiAqIGZvbGxvd2luZyBhcmUgZXF1aXZhbGVudDpcbiAqXG4gKiAgIC0gYGcoMSwgMiwgMylgXG4gKiAgIC0gYGcoXywgMiwgMykoMSlgXG4gKiAgIC0gYGcoXywgXywgMykoMSkoMilgXG4gKiAgIC0gYGcoXywgXywgMykoMSwgMilgXG4gKiAgIC0gYGcoXywgMikoMSkoMylgXG4gKiAgIC0gYGcoXywgMikoMSwgMylgXG4gKiAgIC0gYGcoXywgMikoXywgMykoMSlgXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuNS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgTnVtYmVyIC0+ICgqIC0+IGEpIC0+ICgqIC0+IGEpXG4gKiBAcGFyYW0ge051bWJlcn0gbGVuZ3RoIFRoZSBhcml0eSBmb3IgdGhlIHJldHVybmVkIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICogQHJldHVybiB7RnVuY3Rpb259IEEgbmV3LCBjdXJyaWVkIGZ1bmN0aW9uLlxuICogQHNlZSBSLmN1cnJ5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIHN1bUFyZ3MgPSAoLi4uYXJncykgPT4gUi5zdW0oYXJncyk7XG4gKlxuICogICAgICB2YXIgY3VycmllZEFkZEZvdXJOdW1iZXJzID0gUi5jdXJyeU4oNCwgc3VtQXJncyk7XG4gKiAgICAgIHZhciBmID0gY3VycmllZEFkZEZvdXJOdW1iZXJzKDEsIDIpO1xuICogICAgICB2YXIgZyA9IGYoMyk7XG4gKiAgICAgIGcoNCk7IC8vPT4gMTBcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIGN1cnJ5TihsZW5ndGgsIGZuKSB7XG4gIGlmIChsZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gX2N1cnJ5MShmbik7XG4gIH1cbiAgcmV0dXJuIF9hcml0eShsZW5ndGgsIF9jdXJyeU4obGVuZ3RoLCBbXSwgZm4pKTtcbn0pO1xuIiwidmFyIF9jb25jYXQgPSByZXF1aXJlKCcuL2ludGVybmFsL19jb25jYXQnKTtcbnZhciBfY3VycnkxID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkxJyk7XG52YXIgY3VycnlOID0gcmVxdWlyZSgnLi9jdXJyeU4nKTtcblxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbGlzdCBpdGVyYXRpb24gZnVuY3Rpb24gZnJvbSBhbiBleGlzdGluZyBvbmUgYnkgYWRkaW5nIHR3byBuZXdcbiAqIHBhcmFtZXRlcnMgdG8gaXRzIGNhbGxiYWNrIGZ1bmN0aW9uOiB0aGUgY3VycmVudCBpbmRleCwgYW5kIHRoZSBlbnRpcmUgbGlzdC5cbiAqXG4gKiBUaGlzIHdvdWxkIHR1cm4sIGZvciBpbnN0YW5jZSwgUmFtZGEncyBzaW1wbGUgYG1hcGAgZnVuY3Rpb24gaW50byBvbmUgdGhhdFxuICogbW9yZSBjbG9zZWx5IHJlc2VtYmxlcyBgQXJyYXkucHJvdG90eXBlLm1hcGAuIE5vdGUgdGhhdCB0aGlzIHdpbGwgb25seSB3b3JrXG4gKiBmb3IgZnVuY3Rpb25zIGluIHdoaWNoIHRoZSBpdGVyYXRpb24gY2FsbGJhY2sgZnVuY3Rpb24gaXMgdGhlIGZpcnN0XG4gKiBwYXJhbWV0ZXIsIGFuZCB3aGVyZSB0aGUgbGlzdCBpcyB0aGUgbGFzdCBwYXJhbWV0ZXIuIChUaGlzIGxhdHRlciBtaWdodCBiZVxuICogdW5pbXBvcnRhbnQgaWYgdGhlIGxpc3QgcGFyYW1ldGVyIGlzIG5vdCB1c2VkLilcbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICgoYSAuLi4gLT4gYikgLi4uIC0+IFthXSAtPiAqKSAtPiAoYSAuLi4sIEludCwgW2FdIC0+IGIpIC4uLiAtPiBbYV0gLT4gKilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEEgbGlzdCBpdGVyYXRpb24gZnVuY3Rpb24gdGhhdCBkb2VzIG5vdCBwYXNzIGluZGV4IG9yIGxpc3QgdG8gaXRzIGNhbGxiYWNrXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQW4gYWx0ZXJlZCBsaXN0IGl0ZXJhdGlvbiBmdW5jdGlvbiB0aGF0IHBhc3NlcyAoaXRlbSwgaW5kZXgsIGxpc3QpIHRvIGl0cyBjYWxsYmFja1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBtYXBJbmRleGVkID0gUi5hZGRJbmRleChSLm1hcCk7XG4gKiAgICAgIG1hcEluZGV4ZWQoKHZhbCwgaWR4KSA9PiBpZHggKyAnLScgKyB2YWwsIFsnZicsICdvJywgJ28nLCAnYicsICdhJywgJ3InXSk7XG4gKiAgICAgIC8vPT4gWycwLWYnLCAnMS1vJywgJzItbycsICczLWInLCAnNC1hJywgJzUtciddXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MShmdW5jdGlvbiBhZGRJbmRleChmbikge1xuICByZXR1cm4gY3VycnlOKGZuLmxlbmd0aCwgZnVuY3Rpb24oKSB7XG4gICAgdmFyIGlkeCA9IDA7XG4gICAgdmFyIG9yaWdGbiA9IGFyZ3VtZW50c1swXTtcbiAgICB2YXIgbGlzdCA9IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV07XG4gICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICAgIGFyZ3NbMF0gPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByZXN1bHQgPSBvcmlnRm4uYXBwbHkodGhpcywgX2NvbmNhdChhcmd1bWVudHMsIFtpZHgsIGxpc3RdKSk7XG4gICAgICBpZHggKz0gMTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncyk7XG4gIH0pO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vX2N1cnJ5MScpO1xudmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL19jdXJyeTInKTtcbnZhciBfaXNQbGFjZWhvbGRlciA9IHJlcXVpcmUoJy4vX2lzUGxhY2Vob2xkZXInKTtcblxuXG4vKipcbiAqIE9wdGltaXplZCBpbnRlcm5hbCB0aHJlZS1hcml0eSBjdXJyeSBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIGN1cnJpZWQgZnVuY3Rpb24uXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2N1cnJ5Myhmbikge1xuICByZXR1cm4gZnVuY3Rpb24gZjMoYSwgYiwgYykge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gZjM7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSA/IGYzXG4gICAgICAgICAgICAgOiBfY3VycnkyKGZ1bmN0aW9uKF9iLCBfYykgeyByZXR1cm4gZm4oYSwgX2IsIF9jKTsgfSk7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiBfaXNQbGFjZWhvbGRlcihhKSAmJiBfaXNQbGFjZWhvbGRlcihiKSA/IGYzXG4gICAgICAgICAgICAgOiBfaXNQbGFjZWhvbGRlcihhKSA/IF9jdXJyeTIoZnVuY3Rpb24oX2EsIF9jKSB7IHJldHVybiBmbihfYSwgYiwgX2MpOyB9KVxuICAgICAgICAgICAgIDogX2lzUGxhY2Vob2xkZXIoYikgPyBfY3VycnkyKGZ1bmN0aW9uKF9iLCBfYykgeyByZXR1cm4gZm4oYSwgX2IsIF9jKTsgfSlcbiAgICAgICAgICAgICA6IF9jdXJyeTEoZnVuY3Rpb24oX2MpIHsgcmV0dXJuIGZuKGEsIGIsIF9jKTsgfSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gX2lzUGxhY2Vob2xkZXIoYSkgJiYgX2lzUGxhY2Vob2xkZXIoYikgJiYgX2lzUGxhY2Vob2xkZXIoYykgPyBmM1xuICAgICAgICAgICAgIDogX2lzUGxhY2Vob2xkZXIoYSkgJiYgX2lzUGxhY2Vob2xkZXIoYikgPyBfY3VycnkyKGZ1bmN0aW9uKF9hLCBfYikgeyByZXR1cm4gZm4oX2EsIF9iLCBjKTsgfSlcbiAgICAgICAgICAgICA6IF9pc1BsYWNlaG9sZGVyKGEpICYmIF9pc1BsYWNlaG9sZGVyKGMpID8gX2N1cnJ5MihmdW5jdGlvbihfYSwgX2MpIHsgcmV0dXJuIGZuKF9hLCBiLCBfYyk7IH0pXG4gICAgICAgICAgICAgOiBfaXNQbGFjZWhvbGRlcihiKSAmJiBfaXNQbGFjZWhvbGRlcihjKSA/IF9jdXJyeTIoZnVuY3Rpb24oX2IsIF9jKSB7IHJldHVybiBmbihhLCBfYiwgX2MpOyB9KVxuICAgICAgICAgICAgIDogX2lzUGxhY2Vob2xkZXIoYSkgPyBfY3VycnkxKGZ1bmN0aW9uKF9hKSB7IHJldHVybiBmbihfYSwgYiwgYyk7IH0pXG4gICAgICAgICAgICAgOiBfaXNQbGFjZWhvbGRlcihiKSA/IF9jdXJyeTEoZnVuY3Rpb24oX2IpIHsgcmV0dXJuIGZuKGEsIF9iLCBjKTsgfSlcbiAgICAgICAgICAgICA6IF9pc1BsYWNlaG9sZGVyKGMpID8gX2N1cnJ5MShmdW5jdGlvbihfYykgeyByZXR1cm4gZm4oYSwgYiwgX2MpOyB9KVxuICAgICAgICAgICAgIDogZm4oYSwgYiwgYyk7XG4gICAgfVxuICB9O1xufTtcbiIsInZhciBfY29uY2F0ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY29uY2F0Jyk7XG52YXIgX2N1cnJ5MyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MycpO1xuXG5cbi8qKlxuICogQXBwbGllcyBhIGZ1bmN0aW9uIHRvIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gaW5kZXggb2YgYW4gYXJyYXksIHJldHVybmluZyBhXG4gKiBuZXcgY29weSBvZiB0aGUgYXJyYXkgd2l0aCB0aGUgZWxlbWVudCBhdCB0aGUgZ2l2ZW4gaW5kZXggcmVwbGFjZWQgd2l0aCB0aGVcbiAqIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gYXBwbGljYXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTQuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEgLT4gYSkgLT4gTnVtYmVyIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBhcHBseS5cbiAqIEBwYXJhbSB7TnVtYmVyfSBpZHggVGhlIGluZGV4LlxuICogQHBhcmFtIHtBcnJheXxBcmd1bWVudHN9IGxpc3QgQW4gYXJyYXktbGlrZSBvYmplY3Qgd2hvc2UgdmFsdWVcbiAqICAgICAgICBhdCB0aGUgc3VwcGxpZWQgaW5kZXggd2lsbCBiZSByZXBsYWNlZC5cbiAqIEByZXR1cm4ge0FycmF5fSBBIGNvcHkgb2YgdGhlIHN1cHBsaWVkIGFycmF5LWxpa2Ugb2JqZWN0IHdpdGhcbiAqICAgICAgICAgdGhlIGVsZW1lbnQgYXQgaW5kZXggYGlkeGAgcmVwbGFjZWQgd2l0aCB0aGUgdmFsdWVcbiAqICAgICAgICAgcmV0dXJuZWQgYnkgYXBwbHlpbmcgYGZuYCB0byB0aGUgZXhpc3RpbmcgZWxlbWVudC5cbiAqIEBzZWUgUi51cGRhdGVcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmFkanVzdChSLmFkZCgxMCksIDEsIFsxLCAyLCAzXSk7ICAgICAvLz0+IFsxLCAxMiwgM11cbiAqICAgICAgUi5hZGp1c3QoUi5hZGQoMTApKSgxKShbMSwgMiwgM10pOyAgICAgLy89PiBbMSwgMTIsIDNdXG4gKiBAc3ltYiBSLmFkanVzdChmLCAtMSwgW2EsIGJdKSA9IFthLCBmKGIpXVxuICogQHN5bWIgUi5hZGp1c3QoZiwgMCwgW2EsIGJdKSA9IFtmKGEpLCBiXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTMoZnVuY3Rpb24gYWRqdXN0KGZuLCBpZHgsIGxpc3QpIHtcbiAgaWYgKGlkeCA+PSBsaXN0Lmxlbmd0aCB8fCBpZHggPCAtbGlzdC5sZW5ndGgpIHtcbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuICB2YXIgc3RhcnQgPSBpZHggPCAwID8gbGlzdC5sZW5ndGggOiAwO1xuICB2YXIgX2lkeCA9IHN0YXJ0ICsgaWR4O1xuICB2YXIgX2xpc3QgPSBfY29uY2F0KGxpc3QpO1xuICBfbGlzdFtfaWR4XSA9IGZuKGxpc3RbX2lkeF0pO1xuICByZXR1cm4gX2xpc3Q7XG59KTtcbiIsIi8qKlxuICogVGVzdHMgd2hldGhlciBvciBub3QgYW4gb2JqZWN0IGlzIGFuIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgb2JqZWN0IHRvIHRlc3QuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBgdHJ1ZWAgaWYgYHZhbGAgaXMgYW4gYXJyYXksIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIF9pc0FycmF5KFtdKTsgLy89PiB0cnVlXG4gKiAgICAgIF9pc0FycmF5KG51bGwpOyAvLz0+IGZhbHNlXG4gKiAgICAgIF9pc0FycmF5KHt9KTsgLy89PiBmYWxzZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gX2lzQXJyYXkodmFsKSB7XG4gIHJldHVybiAodmFsICE9IG51bGwgJiZcbiAgICAgICAgICB2YWwubGVuZ3RoID49IDAgJiZcbiAgICAgICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXldJyk7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfaXNUcmFuc2Zvcm1lcihvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmpbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPT09ICdmdW5jdGlvbic7XG59O1xuIiwidmFyIF9pc0FycmF5ID0gcmVxdWlyZSgnLi9faXNBcnJheScpO1xudmFyIF9pc1RyYW5zZm9ybWVyID0gcmVxdWlyZSgnLi9faXNUcmFuc2Zvcm1lcicpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgZGlzcGF0Y2hlcyB3aXRoIGRpZmZlcmVudCBzdHJhdGVnaWVzIGJhc2VkIG9uIHRoZVxuICogb2JqZWN0IGluIGxpc3QgcG9zaXRpb24gKGxhc3QgYXJndW1lbnQpLiBJZiBpdCBpcyBhbiBhcnJheSwgZXhlY3V0ZXMgW2ZuXS5cbiAqIE90aGVyd2lzZSwgaWYgaXQgaGFzIGEgZnVuY3Rpb24gd2l0aCBvbmUgb2YgdGhlIGdpdmVuIG1ldGhvZCBuYW1lcywgaXQgd2lsbFxuICogZXhlY3V0ZSB0aGF0IGZ1bmN0aW9uIChmdW5jdG9yIGNhc2UpLiBPdGhlcndpc2UsIGlmIGl0IGlzIGEgdHJhbnNmb3JtZXIsXG4gKiB1c2VzIHRyYW5zZHVjZXIgW3hmXSB0byByZXR1cm4gYSBuZXcgdHJhbnNmb3JtZXIgKHRyYW5zZHVjZXIgY2FzZSkuXG4gKiBPdGhlcndpc2UsIGl0IHdpbGwgZGVmYXVsdCB0byBleGVjdXRpbmcgW2ZuXS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gbWV0aG9kTmFtZXMgcHJvcGVydGllcyB0byBjaGVjayBmb3IgYSBjdXN0b20gaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHhmIHRyYW5zZHVjZXIgdG8gaW5pdGlhbGl6ZSBpZiBvYmplY3QgaXMgdHJhbnNmb3JtZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIGRlZmF1bHQgcmFtZGEgaW1wbGVtZW50YXRpb25cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgZGlzcGF0Y2hlcyBvbiBvYmplY3QgaW4gbGlzdCBwb3NpdGlvblxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9kaXNwYXRjaGFibGUobWV0aG9kTmFtZXMsIHhmLCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH1cbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gICAgdmFyIG9iaiA9IGFyZ3MucG9wKCk7XG4gICAgaWYgKCFfaXNBcnJheShvYmopKSB7XG4gICAgICB2YXIgaWR4ID0gMDtcbiAgICAgIHdoaWxlIChpZHggPCBtZXRob2ROYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmpbbWV0aG9kTmFtZXNbaWR4XV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gb2JqW21ldGhvZE5hbWVzW2lkeF1dLmFwcGx5KG9iaiwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgaWR4ICs9IDE7XG4gICAgICB9XG4gICAgICBpZiAoX2lzVHJhbnNmb3JtZXIob2JqKSkge1xuICAgICAgICB2YXIgdHJhbnNkdWNlciA9IHhmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgICAgICByZXR1cm4gdHJhbnNkdWNlcihvYmopO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9yZWR1Y2VkKHgpIHtcbiAgcmV0dXJuIHggJiYgeFsnQEB0cmFuc2R1Y2VyL3JlZHVjZWQnXSA/IHggOlxuICAgIHtcbiAgICAgICdAQHRyYW5zZHVjZXIvdmFsdWUnOiB4LFxuICAgICAgJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJzogdHJ1ZVxuICAgIH07XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIGluaXQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvaW5pdCddKCk7XG4gIH0sXG4gIHJlc3VsdDogZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShyZXN1bHQpO1xuICB9XG59O1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL19jdXJyeTInKTtcbnZhciBfcmVkdWNlZCA9IHJlcXVpcmUoJy4vX3JlZHVjZWQnKTtcbnZhciBfeGZCYXNlID0gcmVxdWlyZSgnLi9feGZCYXNlJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIFhBbGwoZiwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5mID0gZjtcbiAgICB0aGlzLmFsbCA9IHRydWU7XG4gIH1cbiAgWEFsbC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhBbGwucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbihyZXN1bHQpIHtcbiAgICBpZiAodGhpcy5hbGwpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShyZXN1bHQpO1xuICB9O1xuICBYQWxsLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uKHJlc3VsdCwgaW5wdXQpIHtcbiAgICBpZiAoIXRoaXMuZihpbnB1dCkpIHtcbiAgICAgIHRoaXMuYWxsID0gZmFsc2U7XG4gICAgICByZXN1bHQgPSBfcmVkdWNlZCh0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgZmFsc2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICByZXR1cm4gX2N1cnJ5MihmdW5jdGlvbiBfeGFsbChmLCB4ZikgeyByZXR1cm4gbmV3IFhBbGwoZiwgeGYpOyB9KTtcbn0oKSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIF9kaXNwYXRjaGFibGUgPSByZXF1aXJlKCcuL2ludGVybmFsL19kaXNwYXRjaGFibGUnKTtcbnZhciBfeGFsbCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX3hhbGwnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBvZiB0aGUgbGlzdCBtYXRjaCB0aGUgcHJlZGljYXRlLCBgZmFsc2VgIGlmXG4gKiB0aGVyZSBhcmUgYW55IHRoYXQgZG9uJ3QuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGFsbGAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gW2FdIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgcHJlZGljYXRlIGlzIHNhdGlzZmllZCBieSBldmVyeSBlbGVtZW50LCBgZmFsc2VgXG4gKiAgICAgICAgIG90aGVyd2lzZS5cbiAqIEBzZWUgUi5hbnksIFIubm9uZSwgUi50cmFuc2R1Y2VcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgZXF1YWxzMyA9IFIuZXF1YWxzKDMpO1xuICogICAgICBSLmFsbChlcXVhbHMzKShbMywgMywgMywgM10pOyAvLz0+IHRydWVcbiAqICAgICAgUi5hbGwoZXF1YWxzMykoWzMsIDMsIDEsIDNdKTsgLy89PiBmYWxzZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoX2Rpc3BhdGNoYWJsZShbJ2FsbCddLCBfeGFsbCwgZnVuY3Rpb24gYWxsKGZuLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICBpZiAoIWZuKGxpc3RbaWR4XSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59KSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGFyZ2VyIG9mIGl0cyB0d28gYXJndW1lbnRzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIE9yZCBhID0+IGEgLT4gYSAtPiBhXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5tYXhCeSwgUi5taW5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm1heCg3ODksIDEyMyk7IC8vPT4gNzg5XG4gKiAgICAgIFIubWF4KCdhJywgJ2InKTsgLy89PiAnYidcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIG1heChhLCBiKSB7IHJldHVybiBiID4gYSA/IGIgOiBhOyB9KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX21hcChmbiwgZnVuY3Rvcikge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGZ1bmN0b3IubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gQXJyYXkobGVuKTtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIHJlc3VsdFtpZHhdID0gZm4oZnVuY3RvcltpZHhdKTtcbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBYV3JhcChmbikge1xuICAgIHRoaXMuZiA9IGZuO1xuICB9XG4gIFhXcmFwLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IGZ1bmN0aW9uKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW5pdCBub3QgaW1wbGVtZW50ZWQgb24gWFdyYXAnKTtcbiAgfTtcbiAgWFdyYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbihhY2MpIHsgcmV0dXJuIGFjYzsgfTtcbiAgWFdyYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24oYWNjLCB4KSB7XG4gICAgcmV0dXJuIHRoaXMuZihhY2MsIHgpO1xuICB9O1xuXG4gIHJldHVybiBmdW5jdGlvbiBfeHdyYXAoZm4pIHsgcmV0dXJuIG5ldyBYV3JhcChmbik7IH07XG59KCkpO1xuIiwidmFyIF9hcml0eSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2FyaXR5Jyk7XG52YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgYm91bmQgdG8gYSBjb250ZXh0LlxuICogTm90ZTogYFIuYmluZGAgZG9lcyBub3QgcHJvdmlkZSB0aGUgYWRkaXRpb25hbCBhcmd1bWVudC1iaW5kaW5nIGNhcGFiaWxpdGllcyBvZlxuICogW0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9GdW5jdGlvbi9iaW5kKS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC42LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyAoKiAtPiAqKSAtPiB7Kn0gLT4gKCogLT4gKilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBiaW5kIHRvIGNvbnRleHRcbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzT2JqIFRoZSBjb250ZXh0IHRvIGJpbmQgYGZuYCB0b1xuICogQHJldHVybiB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCB3aWxsIGV4ZWN1dGUgaW4gdGhlIGNvbnRleHQgb2YgYHRoaXNPYmpgLlxuICogQHNlZSBSLnBhcnRpYWxcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgbG9nID0gUi5iaW5kKGNvbnNvbGUubG9nLCBjb25zb2xlKTtcbiAqICAgICAgUi5waXBlKFIuYXNzb2MoJ2EnLCAyKSwgUi50YXAobG9nKSwgUi5hc3NvYygnYScsIDMpKSh7YTogMX0pOyAvLz0+IHthOiAzfVxuICogICAgICAvLyBsb2dzIHthOiAyfVxuICogQHN5bWIgUi5iaW5kKGYsIG8pKGEsIGIpID0gZi5jYWxsKG8sIGEsIGIpXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBiaW5kKGZuLCB0aGlzT2JqKSB7XG4gIHJldHVybiBfYXJpdHkoZm4ubGVuZ3RoLCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhpc09iaiwgYXJndW1lbnRzKTtcbiAgfSk7XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2lzU3RyaW5nKHgpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgU3RyaW5nXSc7XG59O1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcbnZhciBfaXNBcnJheSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2lzQXJyYXknKTtcbnZhciBfaXNTdHJpbmcgPSByZXF1aXJlKCcuL2ludGVybmFsL19pc1N0cmluZycpO1xuXG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBvciBub3QgYW4gb2JqZWN0IGlzIHNpbWlsYXIgdG8gYW4gYXJyYXkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuNS4wXG4gKiBAY2F0ZWdvcnkgVHlwZVxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKiAtPiBCb29sZWFuXG4gKiBAcGFyYW0geyp9IHggVGhlIG9iamVjdCB0byB0ZXN0LlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIGB4YCBoYXMgYSBudW1lcmljIGxlbmd0aCBwcm9wZXJ0eSBhbmQgZXh0cmVtZSBpbmRpY2VzIGRlZmluZWQ7IGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogQGRlcHJlY2F0ZWQgc2luY2UgdjAuMjMuMFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaXNBcnJheUxpa2UoW10pOyAvLz0+IHRydWVcbiAqICAgICAgUi5pc0FycmF5TGlrZSh0cnVlKTsgLy89PiBmYWxzZVxuICogICAgICBSLmlzQXJyYXlMaWtlKHt9KTsgLy89PiBmYWxzZVxuICogICAgICBSLmlzQXJyYXlMaWtlKHtsZW5ndGg6IDEwfSk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5pc0FycmF5TGlrZSh7MDogJ3plcm8nLCA5OiAnbmluZScsIGxlbmd0aDogMTB9KTsgLy89PiB0cnVlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MShmdW5jdGlvbiBpc0FycmF5TGlrZSh4KSB7XG4gIGlmIChfaXNBcnJheSh4KSkgeyByZXR1cm4gdHJ1ZTsgfVxuICBpZiAoIXgpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmICh0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmIChfaXNTdHJpbmcoeCkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIGlmICh4Lm5vZGVUeXBlID09PSAxKSB7IHJldHVybiAhIXgubGVuZ3RoOyB9XG4gIGlmICh4Lmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gdHJ1ZTsgfVxuICBpZiAoeC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHguaGFzT3duUHJvcGVydHkoMCkgJiYgeC5oYXNPd25Qcm9wZXJ0eSh4Lmxlbmd0aCAtIDEpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn0pO1xuIiwidmFyIF94d3JhcCA9IHJlcXVpcmUoJy4vX3h3cmFwJyk7XG52YXIgYmluZCA9IHJlcXVpcmUoJy4uL2JpbmQnKTtcbnZhciBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2lzQXJyYXlMaWtlJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIF9hcnJheVJlZHVjZSh4ZiwgYWNjLCBsaXN0KSB7XG4gICAgdmFyIGlkeCA9IDA7XG4gICAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICAgIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICAgIGFjYyA9IHhmWydAQHRyYW5zZHVjZXIvc3RlcCddKGFjYywgbGlzdFtpZHhdKTtcbiAgICAgIGlmIChhY2MgJiYgYWNjWydAQHRyYW5zZHVjZXIvcmVkdWNlZCddKSB7XG4gICAgICAgIGFjYyA9IGFjY1snQEB0cmFuc2R1Y2VyL3ZhbHVlJ107XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWR4ICs9IDE7XG4gICAgfVxuICAgIHJldHVybiB4ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKGFjYyk7XG4gIH1cblxuICBmdW5jdGlvbiBfaXRlcmFibGVSZWR1Y2UoeGYsIGFjYywgaXRlcikge1xuICAgIHZhciBzdGVwID0gaXRlci5uZXh0KCk7XG4gICAgd2hpbGUgKCFzdGVwLmRvbmUpIHtcbiAgICAgIGFjYyA9IHhmWydAQHRyYW5zZHVjZXIvc3RlcCddKGFjYywgc3RlcC52YWx1ZSk7XG4gICAgICBpZiAoYWNjICYmIGFjY1snQEB0cmFuc2R1Y2VyL3JlZHVjZWQnXSkge1xuICAgICAgICBhY2MgPSBhY2NbJ0BAdHJhbnNkdWNlci92YWx1ZSddO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0ZXAgPSBpdGVyLm5leHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10oYWNjKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9tZXRob2RSZWR1Y2UoeGYsIGFjYywgb2JqKSB7XG4gICAgcmV0dXJuIHhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10ob2JqLnJlZHVjZShiaW5kKHhmWydAQHRyYW5zZHVjZXIvc3RlcCddLCB4ZiksIGFjYykpO1xuICB9XG5cbiAgdmFyIHN5bUl0ZXJhdG9yID0gKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnKSA/IFN5bWJvbC5pdGVyYXRvciA6ICdAQGl0ZXJhdG9yJztcbiAgcmV0dXJuIGZ1bmN0aW9uIF9yZWR1Y2UoZm4sIGFjYywgbGlzdCkge1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZuID0gX3h3cmFwKGZuKTtcbiAgICB9XG4gICAgaWYgKGlzQXJyYXlMaWtlKGxpc3QpKSB7XG4gICAgICByZXR1cm4gX2FycmF5UmVkdWNlKGZuLCBhY2MsIGxpc3QpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGxpc3QucmVkdWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gX21ldGhvZFJlZHVjZShmbiwgYWNjLCBsaXN0KTtcbiAgICB9XG4gICAgaWYgKGxpc3Rbc3ltSXRlcmF0b3JdICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBfaXRlcmFibGVSZWR1Y2UoZm4sIGFjYywgbGlzdFtzeW1JdGVyYXRvcl0oKSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbGlzdC5uZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gX2l0ZXJhYmxlUmVkdWNlKGZuLCBhY2MsIGxpc3QpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWR1Y2U6IGxpc3QgbXVzdCBiZSBhcnJheSBvciBpdGVyYWJsZScpO1xuICB9O1xufSgpKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9fY3VycnkyJyk7XG52YXIgX3hmQmFzZSA9IHJlcXVpcmUoJy4vX3hmQmFzZScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBYTWFwKGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gIH1cbiAgWE1hcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhNYXAucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBfeGZCYXNlLnJlc3VsdDtcbiAgWE1hcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbihyZXN1bHQsIGlucHV0KSB7XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCB0aGlzLmYoaW5wdXQpKTtcbiAgfTtcblxuICByZXR1cm4gX2N1cnJ5MihmdW5jdGlvbiBfeG1hcChmLCB4ZikgeyByZXR1cm4gbmV3IFhNYXAoZiwgeGYpOyB9KTtcbn0oKSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9oYXMocHJvcCwgb2JqKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn07XG4iLCJ2YXIgX2hhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcmd1bWVudHMpID09PSAnW29iamVjdCBBcmd1bWVudHNdJyA/XG4gICAgZnVuY3Rpb24gX2lzQXJndW1lbnRzKHgpIHsgcmV0dXJuIHRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nOyB9IDpcbiAgICBmdW5jdGlvbiBfaXNBcmd1bWVudHMoeCkgeyByZXR1cm4gX2hhcygnY2FsbGVlJywgeCk7IH07XG59KCkpO1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcbnZhciBfaGFzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9faGFzJyk7XG52YXIgX2lzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9faXNBcmd1bWVudHMnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBsaXN0IGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGFsbCB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBvZlxuICogdGhlIHN1cHBsaWVkIG9iamVjdC5cbiAqIE5vdGUgdGhhdCB0aGUgb3JkZXIgb2YgdGhlIG91dHB1dCBhcnJheSBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBjb25zaXN0ZW50XG4gKiBhY3Jvc3MgZGlmZmVyZW50IEpTIHBsYXRmb3Jtcy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcge2s6IHZ9IC0+IFtrXVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGV4dHJhY3QgcHJvcGVydGllcyBmcm9tXG4gKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgdGhlIG9iamVjdCdzIG93biBwcm9wZXJ0aWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIua2V5cyh7YTogMSwgYjogMiwgYzogM30pOyAvLz0+IFsnYScsICdiJywgJ2MnXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgLy8gY292ZXIgSUUgPCA5IGtleXMgaXNzdWVzXG4gIHZhciBoYXNFbnVtQnVnID0gISh7dG9TdHJpbmc6IG51bGx9KS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgndG9TdHJpbmcnKTtcbiAgdmFyIG5vbkVudW1lcmFibGVQcm9wcyA9IFsnY29uc3RydWN0b3InLCAndmFsdWVPZicsICdpc1Byb3RvdHlwZU9mJywgJ3RvU3RyaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcGVydHlJc0VudW1lcmFibGUnLCAnaGFzT3duUHJvcGVydHknLCAndG9Mb2NhbGVTdHJpbmcnXTtcbiAgLy8gU2FmYXJpIGJ1Z1xuICB2YXIgaGFzQXJnc0VudW1CdWcgPSAoZnVuY3Rpb24oKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuICAgIHJldHVybiBhcmd1bWVudHMucHJvcGVydHlJc0VudW1lcmFibGUoJ2xlbmd0aCcpO1xuICB9KCkpO1xuXG4gIHZhciBjb250YWlucyA9IGZ1bmN0aW9uIGNvbnRhaW5zKGxpc3QsIGl0ZW0pIHtcbiAgICB2YXIgaWR4ID0gMDtcbiAgICB3aGlsZSAoaWR4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICAgIGlmIChsaXN0W2lkeF0gPT09IGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZHggKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIHJldHVybiB0eXBlb2YgT2JqZWN0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgIWhhc0FyZ3NFbnVtQnVnID9cbiAgICBfY3VycnkxKGZ1bmN0aW9uIGtleXMob2JqKSB7XG4gICAgICByZXR1cm4gT2JqZWN0KG9iaikgIT09IG9iaiA/IFtdIDogT2JqZWN0LmtleXMob2JqKTtcbiAgICB9KSA6XG4gICAgX2N1cnJ5MShmdW5jdGlvbiBrZXlzKG9iaikge1xuICAgICAgaWYgKE9iamVjdChvYmopICE9PSBvYmopIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIHByb3AsIG5JZHg7XG4gICAgICB2YXIga3MgPSBbXTtcbiAgICAgIHZhciBjaGVja0FyZ3NMZW5ndGggPSBoYXNBcmdzRW51bUJ1ZyAmJiBfaXNBcmd1bWVudHMob2JqKTtcbiAgICAgIGZvciAocHJvcCBpbiBvYmopIHtcbiAgICAgICAgaWYgKF9oYXMocHJvcCwgb2JqKSAmJiAoIWNoZWNrQXJnc0xlbmd0aCB8fCBwcm9wICE9PSAnbGVuZ3RoJykpIHtcbiAgICAgICAgICBrc1trcy5sZW5ndGhdID0gcHJvcDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGhhc0VudW1CdWcpIHtcbiAgICAgICAgbklkeCA9IG5vbkVudW1lcmFibGVQcm9wcy5sZW5ndGggLSAxO1xuICAgICAgICB3aGlsZSAobklkeCA+PSAwKSB7XG4gICAgICAgICAgcHJvcCA9IG5vbkVudW1lcmFibGVQcm9wc1tuSWR4XTtcbiAgICAgICAgICBpZiAoX2hhcyhwcm9wLCBvYmopICYmICFjb250YWlucyhrcywgcHJvcCkpIHtcbiAgICAgICAgICAgIGtzW2tzLmxlbmd0aF0gPSBwcm9wO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuSWR4IC09IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBrcztcbiAgICB9KTtcbn0oKSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIF9kaXNwYXRjaGFibGUgPSByZXF1aXJlKCcuL2ludGVybmFsL19kaXNwYXRjaGFibGUnKTtcbnZhciBfbWFwID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fbWFwJyk7XG52YXIgX3JlZHVjZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX3JlZHVjZScpO1xudmFyIF94bWFwID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9feG1hcCcpO1xudmFyIGN1cnJ5TiA9IHJlcXVpcmUoJy4vY3VycnlOJyk7XG52YXIga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG5cbi8qKlxuICogVGFrZXMgYSBmdW5jdGlvbiBhbmRcbiAqIGEgW2Z1bmN0b3JdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjZnVuY3RvciksXG4gKiBhcHBsaWVzIHRoZSBmdW5jdGlvbiB0byBlYWNoIG9mIHRoZSBmdW5jdG9yJ3MgdmFsdWVzLCBhbmQgcmV0dXJuc1xuICogYSBmdW5jdG9yIG9mIHRoZSBzYW1lIHNoYXBlLlxuICpcbiAqIFJhbWRhIHByb3ZpZGVzIHN1aXRhYmxlIGBtYXBgIGltcGxlbWVudGF0aW9ucyBmb3IgYEFycmF5YCBhbmQgYE9iamVjdGAsXG4gKiBzbyB0aGlzIGZ1bmN0aW9uIG1heSBiZSBhcHBsaWVkIHRvIGBbMSwgMiwgM11gIG9yIGB7eDogMSwgeTogMiwgejogM31gLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBtYXBgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBBbHNvIHRyZWF0cyBmdW5jdGlvbnMgYXMgZnVuY3RvcnMgYW5kIHdpbGwgY29tcG9zZSB0aGVtIHRvZ2V0aGVyLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgRnVuY3RvciBmID0+IChhIC0+IGIpIC0+IGYgYSAtPiBmIGJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gZXZlcnkgZWxlbWVudCBvZiB0aGUgaW5wdXQgYGxpc3RgLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBiZSBpdGVyYXRlZCBvdmVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBuZXcgbGlzdC5cbiAqIEBzZWUgUi50cmFuc2R1Y2UsIFIuYWRkSW5kZXhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgZG91YmxlID0geCA9PiB4ICogMjtcbiAqXG4gKiAgICAgIFIubWFwKGRvdWJsZSwgWzEsIDIsIDNdKTsgLy89PiBbMiwgNCwgNl1cbiAqXG4gKiAgICAgIFIubWFwKGRvdWJsZSwge3g6IDEsIHk6IDIsIHo6IDN9KTsgLy89PiB7eDogMiwgeTogNCwgejogNn1cbiAqIEBzeW1iIFIubWFwKGYsIFthLCBiXSkgPSBbZihhKSwgZihiKV1cbiAqIEBzeW1iIFIubWFwKGYsIHsgeDogYSwgeTogYiB9KSA9IHsgeDogZihhKSwgeTogZihiKSB9XG4gKiBAc3ltYiBSLm1hcChmLCBmdW5jdG9yX28pID0gZnVuY3Rvcl9vLm1hcChmKVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoX2Rpc3BhdGNoYWJsZShbJ21hcCddLCBfeG1hcCwgZnVuY3Rpb24gbWFwKGZuLCBmdW5jdG9yKSB7XG4gIHN3aXRjaCAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGZ1bmN0b3IpKSB7XG4gICAgY2FzZSAnW29iamVjdCBGdW5jdGlvbl0nOlxuICAgICAgcmV0dXJuIGN1cnJ5TihmdW5jdG9yLmxlbmd0aCwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBmbi5jYWxsKHRoaXMsIGZ1bmN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgICB9KTtcbiAgICBjYXNlICdbb2JqZWN0IE9iamVjdF0nOlxuICAgICAgcmV0dXJuIF9yZWR1Y2UoZnVuY3Rpb24oYWNjLCBrZXkpIHtcbiAgICAgICAgYWNjW2tleV0gPSBmbihmdW5jdG9yW2tleV0pO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30sIGtleXMoZnVuY3RvcikpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gX21hcChmbiwgZnVuY3Rvcik7XG4gIH1cbn0pKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aGVuIHN1cHBsaWVkIGFuIG9iamVjdCByZXR1cm5zIHRoZSBpbmRpY2F0ZWRcbiAqIHByb3BlcnR5IG9mIHRoYXQgb2JqZWN0LCBpZiBpdCBleGlzdHMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHMgLT4ge3M6IGF9IC0+IGEgfCBVbmRlZmluZWRcbiAqIEBwYXJhbSB7U3RyaW5nfSBwIFRoZSBwcm9wZXJ0eSBuYW1lXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcXVlcnlcbiAqIEByZXR1cm4geyp9IFRoZSB2YWx1ZSBhdCBgb2JqLnBgLlxuICogQHNlZSBSLnBhdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnByb3AoJ3gnLCB7eDogMTAwfSk7IC8vPT4gMTAwXG4gKiAgICAgIFIucHJvcCgneCcsIHt9KTsgLy89PiB1bmRlZmluZWRcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIHByb3AocCwgb2JqKSB7IHJldHVybiBvYmpbcF07IH0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcbnZhciBtYXAgPSByZXF1aXJlKCcuL21hcCcpO1xudmFyIHByb3AgPSByZXF1aXJlKCcuL3Byb3AnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBieSBwbHVja2luZyB0aGUgc2FtZSBuYW1lZCBwcm9wZXJ0eSBvZmYgYWxsIG9iamVjdHMgaW5cbiAqIHRoZSBsaXN0IHN1cHBsaWVkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgayAtPiBbe2s6IHZ9XSAtPiBbdl1cbiAqIEBwYXJhbSB7TnVtYmVyfFN0cmluZ30ga2V5IFRoZSBrZXkgbmFtZSB0byBwbHVjayBvZmYgb2YgZWFjaCBvYmplY3QuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgbGlzdCBvZiB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBrZXkuXG4gKiBAc2VlIFIucHJvcHNcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnBsdWNrKCdhJykoW3thOiAxfSwge2E6IDJ9XSk7IC8vPT4gWzEsIDJdXG4gKiAgICAgIFIucGx1Y2soMCkoW1sxLCAyXSwgWzMsIDRdXSk7ICAgLy89PiBbMSwgM11cbiAqIEBzeW1iIFIucGx1Y2soJ3gnLCBbe3g6IDEsIHk6IDJ9LCB7eDogMywgeTogNH0sIHt4OiA1LCB5OiA2fV0pID0gWzEsIDMsIDVdXG4gKiBAc3ltYiBSLnBsdWNrKDAsIFtbMSwgMl0sIFszLCA0XSwgWzUsIDZdXSkgPSBbMSwgMywgNV1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIHBsdWNrKHAsIGxpc3QpIHtcbiAgcmV0dXJuIG1hcChwcm9wKHApLCBsaXN0KTtcbn0pO1xuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcbnZhciBfcmVkdWNlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fcmVkdWNlJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGxpc3QsIHN1Y2Nlc3NpdmVseSBjYWxsaW5nXG4gKiB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gYW5kIHBhc3NpbmcgaXQgYW4gYWNjdW11bGF0b3IgdmFsdWUgYW5kIHRoZSBjdXJyZW50XG4gKiB2YWx1ZSBmcm9tIHRoZSBhcnJheSwgYW5kIHRoZW4gcGFzc2luZyB0aGUgcmVzdWx0IHRvIHRoZSBuZXh0IGNhbGwuXG4gKlxuICogVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIHJlY2VpdmVzIHR3byB2YWx1ZXM6ICooYWNjLCB2YWx1ZSkqLiBJdCBtYXkgdXNlXG4gKiBgUi5yZWR1Y2VkYCB0byBzaG9ydGN1dCB0aGUgaXRlcmF0aW9uLlxuICpcbiAqIFRoZSBhcmd1bWVudHMnIG9yZGVyIG9mIGByZWR1Y2VSaWdodGAncyBpdGVyYXRvciBmdW5jdGlvbiBpcyAqKHZhbHVlLCBhY2MpKi5cbiAqXG4gKiBOb3RlOiBgUi5yZWR1Y2VgIGRvZXMgbm90IHNraXAgZGVsZXRlZCBvciB1bmFzc2lnbmVkIGluZGljZXMgKHNwYXJzZVxuICogYXJyYXlzKSwgdW5saWtlIHRoZSBuYXRpdmUgYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VgIG1ldGhvZC4gRm9yIG1vcmUgZGV0YWlsc1xuICogb24gdGhpcyBiZWhhdmlvciwgc2VlOlxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvcmVkdWNlI0Rlc2NyaXB0aW9uXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYHJlZHVjZWAgbWV0aG9kIG9mIHRoZSB0aGlyZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICgoYSwgYikgLT4gYSkgLT4gYSAtPiBbYl0gLT4gYVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uLiBSZWNlaXZlcyB0d28gdmFsdWVzLCB0aGUgYWNjdW11bGF0b3IgYW5kIHRoZVxuICogICAgICAgIGN1cnJlbnQgZWxlbWVudCBmcm9tIHRoZSBhcnJheS5cbiAqIEBwYXJhbSB7Kn0gYWNjIFRoZSBhY2N1bXVsYXRvciB2YWx1ZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybiB7Kn0gVGhlIGZpbmFsLCBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqIEBzZWUgUi5yZWR1Y2VkLCBSLmFkZEluZGV4LCBSLnJlZHVjZVJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5yZWR1Y2UoUi5zdWJ0cmFjdCwgMCwgWzEsIDIsIDMsIDRdKSAvLyA9PiAoKCgoMCAtIDEpIC0gMikgLSAzKSAtIDQpID0gLTEwXG4gKiAgICAgICAgICAgICAgICAtICAgICAgICAgICAgICAgLTEwXG4gKiAgICAgICAgICAgICAgIC8gXFwgICAgICAgICAgICAgIC8gXFxcbiAqICAgICAgICAgICAgICAtICAgNCAgICAgICAgICAgLTYgICA0XG4gKiAgICAgICAgICAgICAvIFxcICAgICAgICAgICAgICAvIFxcXG4gKiAgICAgICAgICAgIC0gICAzICAgPT0+ICAgICAtMyAgIDNcbiAqICAgICAgICAgICAvIFxcICAgICAgICAgICAgICAvIFxcXG4gKiAgICAgICAgICAtICAgMiAgICAgICAgICAgLTEgICAyXG4gKiAgICAgICAgIC8gXFwgICAgICAgICAgICAgIC8gXFxcbiAqICAgICAgICAwICAgMSAgICAgICAgICAgIDAgICAxXG4gKlxuICogQHN5bWIgUi5yZWR1Y2UoZiwgYSwgW2IsIGMsIGRdKSA9IGYoZihmKGEsIGIpLCBjKSwgZClcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkzKF9yZWR1Y2UpO1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcbnZhciBjdXJyeU4gPSByZXF1aXJlKCcuL2N1cnJ5TicpO1xudmFyIG1heCA9IHJlcXVpcmUoJy4vbWF4Jyk7XG52YXIgcGx1Y2sgPSByZXF1aXJlKCcuL3BsdWNrJyk7XG52YXIgcmVkdWNlID0gcmVxdWlyZSgnLi9yZWR1Y2UnKTtcblxuXG4vKipcbiAqIFRha2VzIGEgbGlzdCBvZiBwcmVkaWNhdGVzIGFuZCByZXR1cm5zIGEgcHJlZGljYXRlIHRoYXQgcmV0dXJucyB0cnVlIGZvciBhXG4gKiBnaXZlbiBsaXN0IG9mIGFyZ3VtZW50cyBpZiBldmVyeSBvbmUgb2YgdGhlIHByb3ZpZGVkIHByZWRpY2F0ZXMgaXMgc2F0aXNmaWVkXG4gKiBieSB0aG9zZSBhcmd1bWVudHMuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHJldHVybmVkIGlzIGEgY3VycmllZCBmdW5jdGlvbiB3aG9zZSBhcml0eSBtYXRjaGVzIHRoYXQgb2YgdGhlXG4gKiBoaWdoZXN0LWFyaXR5IHByZWRpY2F0ZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC45LjBcbiAqIEBjYXRlZ29yeSBMb2dpY1xuICogQHNpZyBbKCouLi4gLT4gQm9vbGVhbildIC0+ICgqLi4uIC0+IEJvb2xlYW4pXG4gKiBAcGFyYW0ge0FycmF5fSBwcmVkaWNhdGVzIEFuIGFycmF5IG9mIHByZWRpY2F0ZXMgdG8gY2hlY2tcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgY29tYmluZWQgcHJlZGljYXRlXG4gKiBAc2VlIFIuYW55UGFzc1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBpc1F1ZWVuID0gUi5wcm9wRXEoJ3JhbmsnLCAnUScpO1xuICogICAgICB2YXIgaXNTcGFkZSA9IFIucHJvcEVxKCdzdWl0JywgJ+KZoO+4jicpO1xuICogICAgICB2YXIgaXNRdWVlbk9mU3BhZGVzID0gUi5hbGxQYXNzKFtpc1F1ZWVuLCBpc1NwYWRlXSk7XG4gKlxuICogICAgICBpc1F1ZWVuT2ZTcGFkZXMoe3Jhbms6ICdRJywgc3VpdDogJ+KZo++4jid9KTsgLy89PiBmYWxzZVxuICogICAgICBpc1F1ZWVuT2ZTcGFkZXMoe3Jhbms6ICdRJywgc3VpdDogJ+KZoO+4jid9KTsgLy89PiB0cnVlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MShmdW5jdGlvbiBhbGxQYXNzKHByZWRzKSB7XG4gIHJldHVybiBjdXJyeU4ocmVkdWNlKG1heCwgMCwgcGx1Y2soJ2xlbmd0aCcsIHByZWRzKSksIGZ1bmN0aW9uKCkge1xuICAgIHZhciBpZHggPSAwO1xuICAgIHZhciBsZW4gPSBwcmVkcy5sZW5ndGg7XG4gICAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgICAgaWYgKCFwcmVkc1tpZHhdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWR4ICs9IDE7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIGJvdGggYXJndW1lbnRzIGFyZSBgdHJ1ZWA7IGBmYWxzZWAgb3RoZXJ3aXNlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExvZ2ljXG4gKiBAc2lnIGEgLT4gYiAtPiBhIHwgYlxuICogQHBhcmFtIHtBbnl9IGFcbiAqIEBwYXJhbSB7QW55fSBiXG4gKiBAcmV0dXJuIHtBbnl9IHRoZSBmaXJzdCBhcmd1bWVudCBpZiBpdCBpcyBmYWxzeSwgb3RoZXJ3aXNlIHRoZSBzZWNvbmQgYXJndW1lbnQuXG4gKiBAc2VlIFIuYm90aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuYW5kKHRydWUsIHRydWUpOyAvLz0+IHRydWVcbiAqICAgICAgUi5hbmQodHJ1ZSwgZmFsc2UpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuYW5kKGZhbHNlLCB0cnVlKTsgLy89PiBmYWxzZVxuICogICAgICBSLmFuZChmYWxzZSwgZmFsc2UpOyAvLz0+IGZhbHNlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBhbmQoYSwgYikge1xuICByZXR1cm4gYSAmJiBiO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vX2N1cnJ5MicpO1xudmFyIF9yZWR1Y2VkID0gcmVxdWlyZSgnLi9fcmVkdWNlZCcpO1xudmFyIF94ZkJhc2UgPSByZXF1aXJlKCcuL194ZkJhc2UnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gWEFueShmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICAgIHRoaXMuYW55ID0gZmFsc2U7XG4gIH1cbiAgWEFueS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhBbnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbihyZXN1bHQpIHtcbiAgICBpZiAoIXRoaXMuYW55KSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgZmFsc2UpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gIH07XG4gIFhBbnkucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24ocmVzdWx0LCBpbnB1dCkge1xuICAgIGlmICh0aGlzLmYoaW5wdXQpKSB7XG4gICAgICB0aGlzLmFueSA9IHRydWU7XG4gICAgICByZXN1bHQgPSBfcmVkdWNlZCh0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdHJ1ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHJldHVybiBfY3VycnkyKGZ1bmN0aW9uIF94YW55KGYsIHhmKSB7IHJldHVybiBuZXcgWEFueShmLCB4Zik7IH0pO1xufSgpKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2Rpc3BhdGNoYWJsZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZScpO1xudmFyIF94YW55ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9feGFueScpO1xuXG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgYXQgbGVhc3Qgb25lIG9mIGVsZW1lbnRzIG9mIHRoZSBsaXN0IG1hdGNoIHRoZSBwcmVkaWNhdGUsXG4gKiBgZmFsc2VgIG90aGVyd2lzZS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgYW55YCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBCb29sZWFuKSAtPiBbYV0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBwcmVkaWNhdGUgaXMgc2F0aXNmaWVkIGJ5IGF0IGxlYXN0IG9uZSBlbGVtZW50LCBgZmFsc2VgXG4gKiAgICAgICAgIG90aGVyd2lzZS5cbiAqIEBzZWUgUi5hbGwsIFIubm9uZSwgUi50cmFuc2R1Y2VcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgbGVzc1RoYW4wID0gUi5mbGlwKFIubHQpKDApO1xuICogICAgICB2YXIgbGVzc1RoYW4yID0gUi5mbGlwKFIubHQpKDIpO1xuICogICAgICBSLmFueShsZXNzVGhhbjApKFsxLCAyXSk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5hbnkobGVzc1RoYW4yKShbMSwgMl0pOyAvLz0+IHRydWVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKF9kaXNwYXRjaGFibGUoWydhbnknXSwgX3hhbnksIGZ1bmN0aW9uIGFueShmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IGxpc3QubGVuZ3RoKSB7XG4gICAgaWYgKGZuKGxpc3RbaWR4XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59KSk7XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xudmFyIGN1cnJ5TiA9IHJlcXVpcmUoJy4vY3VycnlOJyk7XG52YXIgbWF4ID0gcmVxdWlyZSgnLi9tYXgnKTtcbnZhciBwbHVjayA9IHJlcXVpcmUoJy4vcGx1Y2snKTtcbnZhciByZWR1Y2UgPSByZXF1aXJlKCcuL3JlZHVjZScpO1xuXG5cbi8qKlxuICogVGFrZXMgYSBsaXN0IG9mIHByZWRpY2F0ZXMgYW5kIHJldHVybnMgYSBwcmVkaWNhdGUgdGhhdCByZXR1cm5zIHRydWUgZm9yIGFcbiAqIGdpdmVuIGxpc3Qgb2YgYXJndW1lbnRzIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgcHJvdmlkZWQgcHJlZGljYXRlcyBpc1xuICogc2F0aXNmaWVkIGJ5IHRob3NlIGFyZ3VtZW50cy5cbiAqXG4gKiBUaGUgZnVuY3Rpb24gcmV0dXJuZWQgaXMgYSBjdXJyaWVkIGZ1bmN0aW9uIHdob3NlIGFyaXR5IG1hdGNoZXMgdGhhdCBvZiB0aGVcbiAqIGhpZ2hlc3QtYXJpdHkgcHJlZGljYXRlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjkuMFxuICogQGNhdGVnb3J5IExvZ2ljXG4gKiBAc2lnIFsoKi4uLiAtPiBCb29sZWFuKV0gLT4gKCouLi4gLT4gQm9vbGVhbilcbiAqIEBwYXJhbSB7QXJyYXl9IHByZWRpY2F0ZXMgQW4gYXJyYXkgb2YgcHJlZGljYXRlcyB0byBjaGVja1xuICogQHJldHVybiB7RnVuY3Rpb259IFRoZSBjb21iaW5lZCBwcmVkaWNhdGVcbiAqIEBzZWUgUi5hbGxQYXNzXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGlzQ2x1YiA9IFIucHJvcEVxKCdzdWl0JywgJ+KZoycpO1xuICogICAgICB2YXIgaXNTcGFkZSA9IFIucHJvcEVxKCdzdWl0JywgJ+KZoCcpO1xuICogICAgICB2YXIgaXNCbGFja0NhcmQgPSBSLmFueVBhc3MoW2lzQ2x1YiwgaXNTcGFkZV0pO1xuICpcbiAqICAgICAgaXNCbGFja0NhcmQoe3Jhbms6ICcxMCcsIHN1aXQ6ICfimaMnfSk7IC8vPT4gdHJ1ZVxuICogICAgICBpc0JsYWNrQ2FyZCh7cmFuazogJ1EnLCBzdWl0OiAn4pmgJ30pOyAvLz0+IHRydWVcbiAqICAgICAgaXNCbGFja0NhcmQoe3Jhbms6ICdRJywgc3VpdDogJ+KZpid9KTsgLy89PiBmYWxzZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoZnVuY3Rpb24gYW55UGFzcyhwcmVkcykge1xuICByZXR1cm4gY3VycnlOKHJlZHVjZShtYXgsIDAsIHBsdWNrKCdsZW5ndGgnLCBwcmVkcykpLCBmdW5jdGlvbigpIHtcbiAgICB2YXIgaWR4ID0gMDtcbiAgICB2YXIgbGVuID0gcHJlZHMubGVuZ3RoO1xuICAgIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICAgIGlmIChwcmVkc1tpZHhdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZHggKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbn0pO1xuIiwidmFyIF9jb25jYXQgPSByZXF1aXJlKCcuL2ludGVybmFsL19jb25jYXQnKTtcbnZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX3JlZHVjZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX3JlZHVjZScpO1xudmFyIG1hcCA9IHJlcXVpcmUoJy4vbWFwJyk7XG5cblxuLyoqXG4gKiBhcCBhcHBsaWVzIGEgbGlzdCBvZiBmdW5jdGlvbnMgdG8gYSBsaXN0IG9mIHZhbHVlcy5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgYXBgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LiBBbHNvXG4gKiB0cmVhdHMgY3VycmllZCBmdW5jdGlvbnMgYXMgYXBwbGljYXRpdmVzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjMuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIFthIC0+IGJdIC0+IFthXSAtPiBbYl1cbiAqIEBzaWcgQXBwbHkgZiA9PiBmIChhIC0+IGIpIC0+IGYgYSAtPiBmIGJcbiAqIEBwYXJhbSB7QXJyYXl9IGZucyBBbiBhcnJheSBvZiBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7QXJyYXl9IHZzIEFuIGFycmF5IG9mIHZhbHVlc1xuICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHJlc3VsdHMgb2YgYXBwbHlpbmcgZWFjaCBvZiBgZm5zYCB0byBhbGwgb2YgYHZzYCBpbiB0dXJuLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuYXAoW1IubXVsdGlwbHkoMiksIFIuYWRkKDMpXSwgWzEsMiwzXSk7IC8vPT4gWzIsIDQsIDYsIDQsIDUsIDZdXG4gKiAgICAgIFIuYXAoW1IuY29uY2F0KCd0YXN0eSAnKSwgUi50b1VwcGVyXSwgWydwaXp6YScsICdzYWxhZCddKTsgLy89PiBbXCJ0YXN0eSBwaXp6YVwiLCBcInRhc3R5IHNhbGFkXCIsIFwiUElaWkFcIiwgXCJTQUxBRFwiXVxuICogQHN5bWIgUi5hcChbZiwgZ10sIFthLCBiXSkgPSBbZihhKSwgZihiKSwgZyhhKSwgZyhiKV1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIGFwKGFwcGxpY2F0aXZlLCBmbikge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBhcHBsaWNhdGl2ZS5hcCA9PT0gJ2Z1bmN0aW9uJyA/XG4gICAgICBhcHBsaWNhdGl2ZS5hcChmbikgOlxuICAgIHR5cGVvZiBhcHBsaWNhdGl2ZSA9PT0gJ2Z1bmN0aW9uJyA/XG4gICAgICBmdW5jdGlvbih4KSB7IHJldHVybiBhcHBsaWNhdGl2ZSh4KShmbih4KSk7IH0gOlxuICAgIC8vIGVsc2VcbiAgICAgIF9yZWR1Y2UoZnVuY3Rpb24oYWNjLCBmKSB7IHJldHVybiBfY29uY2F0KGFjYywgbWFwKGYsIGZuKSk7IH0sIFtdLCBhcHBsaWNhdGl2ZSlcbiAgKTtcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfYXBlcnR1cmUobiwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxpbWl0ID0gbGlzdC5sZW5ndGggLSAobiAtIDEpO1xuICB2YXIgYWNjID0gbmV3IEFycmF5KGxpbWl0ID49IDAgPyBsaW1pdCA6IDApO1xuICB3aGlsZSAoaWR4IDwgbGltaXQpIHtcbiAgICBhY2NbaWR4XSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIGlkeCwgaWR4ICsgbik7XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIGFjYztcbn07XG4iLCJ2YXIgX2NvbmNhdCA9IHJlcXVpcmUoJy4vX2NvbmNhdCcpO1xudmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL19jdXJyeTInKTtcbnZhciBfeGZCYXNlID0gcmVxdWlyZSgnLi9feGZCYXNlJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIFhBcGVydHVyZShuLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLnBvcyA9IDA7XG4gICAgdGhpcy5mdWxsID0gZmFsc2U7XG4gICAgdGhpcy5hY2MgPSBuZXcgQXJyYXkobik7XG4gIH1cbiAgWEFwZXJ0dXJlLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcbiAgWEFwZXJ0dXJlLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgdGhpcy5hY2MgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10ocmVzdWx0KTtcbiAgfTtcbiAgWEFwZXJ0dXJlLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uKHJlc3VsdCwgaW5wdXQpIHtcbiAgICB0aGlzLnN0b3JlKGlucHV0KTtcbiAgICByZXR1cm4gdGhpcy5mdWxsID8gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIHRoaXMuZ2V0Q29weSgpKSA6IHJlc3VsdDtcbiAgfTtcbiAgWEFwZXJ0dXJlLnByb3RvdHlwZS5zdG9yZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgdGhpcy5hY2NbdGhpcy5wb3NdID0gaW5wdXQ7XG4gICAgdGhpcy5wb3MgKz0gMTtcbiAgICBpZiAodGhpcy5wb3MgPT09IHRoaXMuYWNjLmxlbmd0aCkge1xuICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgdGhpcy5mdWxsID0gdHJ1ZTtcbiAgICB9XG4gIH07XG4gIFhBcGVydHVyZS5wcm90b3R5cGUuZ2V0Q29weSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBfY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuYWNjLCB0aGlzLnBvcyksXG4gICAgICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5hY2MsIDAsIHRoaXMucG9zKSk7XG4gIH07XG5cbiAgcmV0dXJuIF9jdXJyeTIoZnVuY3Rpb24gX3hhcGVydHVyZShuLCB4ZikgeyByZXR1cm4gbmV3IFhBcGVydHVyZShuLCB4Zik7IH0pO1xufSgpKTtcbiIsInZhciBfYXBlcnR1cmUgPSByZXF1aXJlKCcuL2ludGVybmFsL19hcGVydHVyZScpO1xudmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcbnZhciBfZGlzcGF0Y2hhYmxlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlJyk7XG52YXIgX3hhcGVydHVyZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX3hhcGVydHVyZScpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIG5ldyBsaXN0LCBjb21wb3NlZCBvZiBuLXR1cGxlcyBvZiBjb25zZWN1dGl2ZSBlbGVtZW50cyBJZiBgbmAgaXNcbiAqIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0LCBhbiBlbXB0eSBsaXN0IGlzIHJldHVybmVkLlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gW2FdIC0+IFtbYV1dXG4gKiBAcGFyYW0ge051bWJlcn0gbiBUaGUgc2l6ZSBvZiB0aGUgdHVwbGVzIHRvIGNyZWF0ZVxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBzcGxpdCBpbnRvIGBuYC1sZW5ndGggdHVwbGVzXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIHJlc3VsdGluZyBsaXN0IG9mIGBuYC1sZW5ndGggdHVwbGVzXG4gKiBAc2VlIFIudHJhbnNkdWNlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5hcGVydHVyZSgyLCBbMSwgMiwgMywgNCwgNV0pOyAvLz0+IFtbMSwgMl0sIFsyLCAzXSwgWzMsIDRdLCBbNCwgNV1dXG4gKiAgICAgIFIuYXBlcnR1cmUoMywgWzEsIDIsIDMsIDQsIDVdKTsgLy89PiBbWzEsIDIsIDNdLCBbMiwgMywgNF0sIFszLCA0LCA1XV1cbiAqICAgICAgUi5hcGVydHVyZSg3LCBbMSwgMiwgMywgNCwgNV0pOyAvLz0+IFtdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihfZGlzcGF0Y2hhYmxlKFtdLCBfeGFwZXJ0dXJlLCBfYXBlcnR1cmUpKTtcbiIsInZhciBfY29uY2F0ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY29uY2F0Jyk7XG52YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBsaXN0LCBmb2xsb3dlZCBieVxuICogdGhlIGdpdmVuIGVsZW1lbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7Kn0gZWwgVGhlIGVsZW1lbnQgdG8gYWRkIHRvIHRoZSBlbmQgb2YgdGhlIG5ldyBsaXN0LlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCBvZiBlbGVtZW50cyB0byBhZGQgYSBuZXcgaXRlbSB0by5cbiAqICAgICAgICBsaXN0LlxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhlIG9sZCBsaXN0IGZvbGxvd2VkIGJ5IGBlbGAuXG4gKiBAc2VlIFIucHJlcGVuZFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuYXBwZW5kKCd0ZXN0cycsIFsnd3JpdGUnLCAnbW9yZSddKTsgLy89PiBbJ3dyaXRlJywgJ21vcmUnLCAndGVzdHMnXVxuICogICAgICBSLmFwcGVuZCgndGVzdHMnLCBbXSk7IC8vPT4gWyd0ZXN0cyddXG4gKiAgICAgIFIuYXBwZW5kKFsndGVzdHMnXSwgWyd3cml0ZScsICdtb3JlJ10pOyAvLz0+IFsnd3JpdGUnLCAnbW9yZScsIFsndGVzdHMnXV1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIGFwcGVuZChlbCwgbGlzdCkge1xuICByZXR1cm4gX2NvbmNhdChsaXN0LCBbZWxdKTtcbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIEFwcGxpZXMgZnVuY3Rpb24gYGZuYCB0byB0aGUgYXJndW1lbnQgbGlzdCBgYXJnc2AuIFRoaXMgaXMgdXNlZnVsIGZvclxuICogY3JlYXRpbmcgYSBmaXhlZC1hcml0eSBmdW5jdGlvbiBmcm9tIGEgdmFyaWFkaWMgZnVuY3Rpb24uIGBmbmAgc2hvdWxkIGJlIGFcbiAqIGJvdW5kIGZ1bmN0aW9uIGlmIGNvbnRleHQgaXMgc2lnbmlmaWNhbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuNy4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKCouLi4gLT4gYSkgLT4gWypdIC0+IGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aXRoIGBhcmdzYFxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGNhbGwgYGZuYCB3aXRoXG4gKiBAcmV0dXJuIHsqfSByZXN1bHQgVGhlIHJlc3VsdCwgZXF1aXZhbGVudCB0byBgZm4oLi4uYXJncylgXG4gKiBAc2VlIFIuY2FsbCwgUi51bmFwcGx5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIG51bXMgPSBbMSwgMiwgMywgLTk5LCA0MiwgNiwgN107XG4gKiAgICAgIFIuYXBwbHkoTWF0aC5tYXgsIG51bXMpOyAvLz0+IDQyXG4gKiBAc3ltYiBSLmFwcGx5KGYsIFthLCBiLCBjXSkgPSBmKGEsIGIsIGMpXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBhcHBseShmbiwgYXJncykge1xuICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncyk7XG59KTtcbiIsInZhciBfY3VycnkxID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkxJyk7XG52YXIga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBzdXBwbGllZCBvYmplY3QuXG4gKiBOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBvdXRwdXQgYXJyYXkgaXMgbm90IGd1YXJhbnRlZWQgYWNyb3NzIGRpZmZlcmVudFxuICogSlMgcGxhdGZvcm1zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7azogdn0gLT4gW3ZdXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gZXh0cmFjdCB2YWx1ZXMgZnJvbVxuICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHRoZSB2YWx1ZXMgb2YgdGhlIG9iamVjdCdzIG93biBwcm9wZXJ0aWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudmFsdWVzKHthOiAxLCBiOiAyLCBjOiAzfSk7IC8vPT4gWzEsIDIsIDNdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MShmdW5jdGlvbiB2YWx1ZXMob2JqKSB7XG4gIHZhciBwcm9wcyA9IGtleXMob2JqKTtcbiAgdmFyIGxlbiA9IHByb3BzLmxlbmd0aDtcbiAgdmFyIHZhbHMgPSBbXTtcbiAgdmFyIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICB2YWxzW2lkeF0gPSBvYmpbcHJvcHNbaWR4XV07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHZhbHM7XG59KTtcbiIsInZhciBfY3VycnkxID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkxJyk7XG52YXIgYXBwbHkgPSByZXF1aXJlKCcuL2FwcGx5Jyk7XG52YXIgY3VycnlOID0gcmVxdWlyZSgnLi9jdXJyeU4nKTtcbnZhciBtYXAgPSByZXF1aXJlKCcuL21hcCcpO1xudmFyIG1heCA9IHJlcXVpcmUoJy4vbWF4Jyk7XG52YXIgcGx1Y2sgPSByZXF1aXJlKCcuL3BsdWNrJyk7XG52YXIgcmVkdWNlID0gcmVxdWlyZSgnLi9yZWR1Y2UnKTtcbnZhciB2YWx1ZXMgPSByZXF1aXJlKCcuL3ZhbHVlcycpO1xuXG5cbi8qKlxuICogR2l2ZW4gYSBzcGVjIG9iamVjdCByZWN1cnNpdmVseSBtYXBwaW5nIHByb3BlcnRpZXMgdG8gZnVuY3Rpb25zLCBjcmVhdGVzIGFcbiAqIGZ1bmN0aW9uIHByb2R1Y2luZyBhbiBvYmplY3Qgb2YgdGhlIHNhbWUgc3RydWN0dXJlLCBieSBtYXBwaW5nIGVhY2ggcHJvcGVydHlcbiAqIHRvIHRoZSByZXN1bHQgb2YgY2FsbGluZyBpdHMgYXNzb2NpYXRlZCBmdW5jdGlvbiB3aXRoIHRoZSBzdXBwbGllZCBhcmd1bWVudHMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjAuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIHtrOiAoKGEsIGIsIC4uLiwgbSkgLT4gdil9IC0+ICgoYSwgYiwgLi4uLCBtKSAtPiB7azogdn0pXG4gKiBAcGFyYW0ge09iamVjdH0gc3BlYyBhbiBvYmplY3QgcmVjdXJzaXZlbHkgbWFwcGluZyBwcm9wZXJ0aWVzIHRvIGZ1bmN0aW9ucyBmb3JcbiAqICAgICAgICBwcm9kdWNpbmcgdGhlIHZhbHVlcyBmb3IgdGhlc2UgcHJvcGVydGllcy5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBvYmplY3Qgb2YgdGhlIHNhbWUgc3RydWN0dXJlXG4gKiBhcyBgc3BlYycsIHdpdGggZWFjaCBwcm9wZXJ0eSBzZXQgdG8gdGhlIHZhbHVlIHJldHVybmVkIGJ5IGNhbGxpbmcgaXRzXG4gKiBhc3NvY2lhdGVkIGZ1bmN0aW9uIHdpdGggdGhlIHN1cHBsaWVkIGFyZ3VtZW50cy5cbiAqIEBzZWUgUi5jb252ZXJnZSwgUi5qdXh0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGdldE1ldHJpY3MgPSBSLmFwcGx5U3BlYyh7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtOiBSLmFkZCxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWQ6IHsgbXVsOiBSLm11bHRpcGx5IH1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAqICAgICAgZ2V0TWV0cmljcygyLCA0KTsgLy8gPT4geyBzdW06IDYsIG5lc3RlZDogeyBtdWw6IDggfSB9XG4gKiBAc3ltYiBSLmFwcGx5U3BlYyh7IHg6IGYsIHk6IHsgejogZyB9IH0pKGEsIGIpID0geyB4OiBmKGEsIGIpLCB5OiB7IHo6IGcoYSwgYikgfSB9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MShmdW5jdGlvbiBhcHBseVNwZWMoc3BlYykge1xuICBzcGVjID0gbWFwKGZ1bmN0aW9uKHYpIHsgcmV0dXJuIHR5cGVvZiB2ID09ICdmdW5jdGlvbicgPyB2IDogYXBwbHlTcGVjKHYpOyB9LFxuICAgICAgICAgICAgIHNwZWMpO1xuICByZXR1cm4gY3VycnlOKHJlZHVjZShtYXgsIDAsIHBsdWNrKCdsZW5ndGgnLCB2YWx1ZXMoc3BlYykpKSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcChmdW5jdGlvbihmKSB7IHJldHVybiBhcHBseShmLCBhcmdzKTsgfSwgc3BlYyk7XG4gICAgICAgICAgICAgICAgfSk7XG59KTtcbiIsInZhciBfY3VycnkzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkzJyk7XG5cblxuLyoqXG4gKiBNYWtlcyBhbiBhc2NlbmRpbmcgY29tcGFyYXRvciBmdW5jdGlvbiBvdXQgb2YgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSB2YWx1ZVxuICogdGhhdCBjYW4gYmUgY29tcGFyZWQgd2l0aCBgPGAgYW5kIGA+YC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yMy4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgT3JkIGIgPT4gKGEgLT4gYikgLT4gYSAtPiBhIC0+IE51bWJlclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gQSBmdW5jdGlvbiBvZiBhcml0eSBvbmUgdGhhdCByZXR1cm5zIGEgdmFsdWUgdGhhdCBjYW4gYmUgY29tcGFyZWRcbiAqIEBwYXJhbSB7Kn0gYSBUaGUgZmlyc3QgaXRlbSB0byBiZSBjb21wYXJlZC5cbiAqIEBwYXJhbSB7Kn0gYiBUaGUgc2Vjb25kIGl0ZW0gdG8gYmUgY29tcGFyZWQuXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IGAtMWAgaWYgZm4oYSkgPCBmbihiKSwgYDFgIGlmIGZuKGIpIDwgZm4oYSksIG90aGVyd2lzZSBgMGBcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgYnlBZ2UgPSBSLmFzY2VuZChSLnByb3AoJ2FnZScpKTtcbiAqICAgICAgdmFyIHBlb3BsZSA9IFtcbiAqICAgICAgICAvLyAuLi5cbiAqICAgICAgXTtcbiAqICAgICAgdmFyIHBlb3BsZUJ5WW91bmdlc3RGaXJzdCA9IFIuc29ydChieUFnZSwgcGVvcGxlKTtcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkzKGZ1bmN0aW9uIGFzY2VuZChmbiwgYSwgYikge1xuICB2YXIgYWEgPSBmbihhKTtcbiAgdmFyIGJiID0gZm4oYik7XG4gIHJldHVybiBhYSA8IGJiID8gLTEgOiBhYSA+IGJiID8gMSA6IDA7XG59KTtcbiIsInZhciBfY3VycnkzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkzJyk7XG5cblxuLyoqXG4gKiBNYWtlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYW4gb2JqZWN0LCBzZXR0aW5nIG9yIG92ZXJyaWRpbmcgdGhlIHNwZWNpZmllZFxuICogcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuIE5vdGUgdGhhdCB0aGlzIGNvcGllcyBhbmQgZmxhdHRlbnMgcHJvdG90eXBlXG4gKiBwcm9wZXJ0aWVzIG9udG8gdGhlIG5ldyBvYmplY3QgYXMgd2VsbC4gQWxsIG5vbi1wcmltaXRpdmUgcHJvcGVydGllcyBhcmVcbiAqIGNvcGllZCBieSByZWZlcmVuY2UuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIFN0cmluZyAtPiBhIC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wIFRoZSBwcm9wZXJ0eSBuYW1lIHRvIHNldFxuICogQHBhcmFtIHsqfSB2YWwgVGhlIG5ldyB2YWx1ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW5hbCBleGNlcHQgZm9yIHRoZSBjaGFuZ2VkIHByb3BlcnR5LlxuICogQHNlZSBSLmRpc3NvY1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuYXNzb2MoJ2MnLCAzLCB7YTogMSwgYjogMn0pOyAvLz0+IHthOiAxLCBiOiAyLCBjOiAzfVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTMoZnVuY3Rpb24gYXNzb2MocHJvcCwgdmFsLCBvYmopIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIG9iaikge1xuICAgIHJlc3VsdFtwXSA9IG9ialtwXTtcbiAgfVxuICByZXN1bHRbcHJvcF0gPSB2YWw7XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbiIsIi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBwYXNzZWQgYXJndW1lbnQgaXMgYW4gaW50ZWdlci5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBuXG4gKiBAY2F0ZWdvcnkgVHlwZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBOdW1iZXIuaXNJbnRlZ2VyIHx8IGZ1bmN0aW9uIF9pc0ludGVnZXIobikge1xuICByZXR1cm4gKG4gPDwgMCkgPT09IG47XG59O1xuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcbnZhciBfaGFzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9faGFzJyk7XG52YXIgX2lzQXJyYXkgPSByZXF1aXJlKCcuL2ludGVybmFsL19pc0FycmF5Jyk7XG52YXIgX2lzSW50ZWdlciA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2lzSW50ZWdlcicpO1xudmFyIGFzc29jID0gcmVxdWlyZSgnLi9hc3NvYycpO1xuXG5cbi8qKlxuICogTWFrZXMgYSBzaGFsbG93IGNsb25lIG9mIGFuIG9iamVjdCwgc2V0dGluZyBvciBvdmVycmlkaW5nIHRoZSBub2RlcyByZXF1aXJlZFxuICogdG8gY3JlYXRlIHRoZSBnaXZlbiBwYXRoLCBhbmQgcGxhY2luZyB0aGUgc3BlY2lmaWMgdmFsdWUgYXQgdGhlIHRhaWwgZW5kIG9mXG4gKiB0aGF0IHBhdGguIE5vdGUgdGhhdCB0aGlzIGNvcGllcyBhbmQgZmxhdHRlbnMgcHJvdG90eXBlIHByb3BlcnRpZXMgb250byB0aGVcbiAqIG5ldyBvYmplY3QgYXMgd2VsbC4gQWxsIG5vbi1wcmltaXRpdmUgcHJvcGVydGllcyBhcmUgY29waWVkIGJ5IHJlZmVyZW5jZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC44LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnRcbiAqIEBzaWcgW0lkeF0gLT4gYSAtPiB7YX0gLT4ge2F9XG4gKiBAcGFyYW0ge0FycmF5fSBwYXRoIHRoZSBwYXRoIHRvIHNldFxuICogQHBhcmFtIHsqfSB2YWwgVGhlIG5ldyB2YWx1ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNsb25lXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCBlcXVpdmFsZW50IHRvIHRoZSBvcmlnaW5hbCBleGNlcHQgYWxvbmcgdGhlIHNwZWNpZmllZCBwYXRoLlxuICogQHNlZSBSLmRpc3NvY1BhdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmFzc29jUGF0aChbJ2EnLCAnYicsICdjJ10sIDQyLCB7YToge2I6IHtjOiAwfX19KTsgLy89PiB7YToge2I6IHtjOiA0Mn19fVxuICpcbiAqICAgICAgLy8gQW55IG1pc3Npbmcgb3Igbm9uLW9iamVjdCBrZXlzIGluIHBhdGggd2lsbCBiZSBvdmVycmlkZGVuXG4gKiAgICAgIFIuYXNzb2NQYXRoKFsnYScsICdiJywgJ2MnXSwgNDIsIHthOiA1fSk7IC8vPT4ge2E6IHtiOiB7YzogNDJ9fX1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkzKGZ1bmN0aW9uIGFzc29jUGF0aChwYXRoLCB2YWwsIG9iaikge1xuICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHZhciBpZHggPSBwYXRoWzBdO1xuICBpZiAocGF0aC5sZW5ndGggPiAxKSB7XG4gICAgdmFyIG5leHRPYmogPSBfaGFzKGlkeCwgb2JqKSA/IG9ialtpZHhdIDogX2lzSW50ZWdlcihwYXRoWzFdKSA/IFtdIDoge307XG4gICAgdmFsID0gYXNzb2NQYXRoKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHBhdGgsIDEpLCB2YWwsIG5leHRPYmopO1xuICB9XG4gIGlmIChfaXNJbnRlZ2VyKGlkeCkgJiYgX2lzQXJyYXkob2JqKSkge1xuICAgIHZhciBhcnIgPSBbXS5jb25jYXQob2JqKTtcbiAgICBhcnJbaWR4XSA9IHZhbDtcbiAgICByZXR1cm4gYXJyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhc3NvYyhpZHgsIHZhbCwgb2JqKTtcbiAgfVxufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogV3JhcHMgYSBmdW5jdGlvbiBvZiBhbnkgYXJpdHkgKGluY2x1ZGluZyBudWxsYXJ5KSBpbiBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0c1xuICogZXhhY3RseSBgbmAgcGFyYW1ldGVycy4gQW55IGV4dHJhbmVvdXMgcGFyYW1ldGVycyB3aWxsIG5vdCBiZSBwYXNzZWQgdG8gdGhlXG4gKiBzdXBwbGllZCBmdW5jdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBOdW1iZXIgLT4gKCogLT4gYSkgLT4gKCogLT4gYSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBuIFRoZSBkZXNpcmVkIGFyaXR5IG9mIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG5ldyBmdW5jdGlvbiB3cmFwcGluZyBgZm5gLiBUaGUgbmV3IGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gYmUgb2ZcbiAqICAgICAgICAgYXJpdHkgYG5gLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciB0YWtlc1R3b0FyZ3MgPSAoYSwgYikgPT4gW2EsIGJdO1xuICpcbiAqICAgICAgdGFrZXNUd29BcmdzLmxlbmd0aDsgLy89PiAyXG4gKiAgICAgIHRha2VzVHdvQXJncygxLCAyKTsgLy89PiBbMSwgMl1cbiAqXG4gKiAgICAgIHZhciB0YWtlc09uZUFyZyA9IFIubkFyeSgxLCB0YWtlc1R3b0FyZ3MpO1xuICogICAgICB0YWtlc09uZUFyZy5sZW5ndGg7IC8vPT4gMVxuICogICAgICAvLyBPbmx5IGBuYCBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byB0aGUgd3JhcHBlZCBmdW5jdGlvblxuICogICAgICB0YWtlc09uZUFyZygxLCAyKTsgLy89PiBbMSwgdW5kZWZpbmVkXVxuICogQHN5bWIgUi5uQXJ5KDAsIGYpKGEsIGIpID0gZigpXG4gKiBAc3ltYiBSLm5BcnkoMSwgZikoYSwgYikgPSBmKGEpXG4gKiBAc3ltYiBSLm5BcnkoMiwgZikoYSwgYikgPSBmKGEsIGIpXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBuQXJ5KG4sIGZuKSB7XG4gIHN3aXRjaCAobikge1xuICAgIGNhc2UgMDogcmV0dXJuIGZ1bmN0aW9uKCkge3JldHVybiBmbi5jYWxsKHRoaXMpO307XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24oYTApIHtyZXR1cm4gZm4uY2FsbCh0aGlzLCBhMCk7fTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbihhMCwgYTEpIHtyZXR1cm4gZm4uY2FsbCh0aGlzLCBhMCwgYTEpO307XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24oYTAsIGExLCBhMikge3JldHVybiBmbi5jYWxsKHRoaXMsIGEwLCBhMSwgYTIpO307XG4gICAgY2FzZSA0OiByZXR1cm4gZnVuY3Rpb24oYTAsIGExLCBhMiwgYTMpIHtyZXR1cm4gZm4uY2FsbCh0aGlzLCBhMCwgYTEsIGEyLCBhMyk7fTtcbiAgICBjYXNlIDU6IHJldHVybiBmdW5jdGlvbihhMCwgYTEsIGEyLCBhMywgYTQpIHtyZXR1cm4gZm4uY2FsbCh0aGlzLCBhMCwgYTEsIGEyLCBhMywgYTQpO307XG4gICAgY2FzZSA2OiByZXR1cm4gZnVuY3Rpb24oYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkge3JldHVybiBmbi5jYWxsKHRoaXMsIGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpO307XG4gICAgY2FzZSA3OiByZXR1cm4gZnVuY3Rpb24oYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIHtyZXR1cm4gZm4uY2FsbCh0aGlzLCBhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNik7fTtcbiAgICBjYXNlIDg6IHJldHVybiBmdW5jdGlvbihhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpIHtyZXR1cm4gZm4uY2FsbCh0aGlzLCBhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpO307XG4gICAgY2FzZSA5OiByZXR1cm4gZnVuY3Rpb24oYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkge3JldHVybiBmbi5jYWxsKHRoaXMsIGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpO307XG4gICAgY2FzZSAxMDogcmV0dXJuIGZ1bmN0aW9uKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5KSB7cmV0dXJuIGZuLmNhbGwodGhpcywgYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpO307XG4gICAgZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCdGaXJzdCBhcmd1bWVudCB0byBuQXJ5IG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciBubyBncmVhdGVyIHRoYW4gdGVuJyk7XG4gIH1cbn0pO1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcbnZhciBuQXJ5ID0gcmVxdWlyZSgnLi9uQXJ5Jyk7XG5cblxuLyoqXG4gKiBXcmFwcyBhIGZ1bmN0aW9uIG9mIGFueSBhcml0eSAoaW5jbHVkaW5nIG51bGxhcnkpIGluIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzXG4gKiBleGFjdGx5IDIgcGFyYW1ldGVycy4gQW55IGV4dHJhbmVvdXMgcGFyYW1ldGVycyB3aWxsIG5vdCBiZSBwYXNzZWQgdG8gdGhlXG4gKiBzdXBwbGllZCBmdW5jdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKiAtPiBjKSAtPiAoYSwgYiAtPiBjKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcgZnVuY3Rpb24gd3JhcHBpbmcgYGZuYC4gVGhlIG5ldyBmdW5jdGlvbiBpcyBndWFyYW50ZWVkIHRvIGJlIG9mXG4gKiAgICAgICAgIGFyaXR5IDIuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIHRha2VzVGhyZWVBcmdzID0gZnVuY3Rpb24oYSwgYiwgYykge1xuICogICAgICAgIHJldHVybiBbYSwgYiwgY107XG4gKiAgICAgIH07XG4gKiAgICAgIHRha2VzVGhyZWVBcmdzLmxlbmd0aDsgLy89PiAzXG4gKiAgICAgIHRha2VzVGhyZWVBcmdzKDEsIDIsIDMpOyAvLz0+IFsxLCAyLCAzXVxuICpcbiAqICAgICAgdmFyIHRha2VzVHdvQXJncyA9IFIuYmluYXJ5KHRha2VzVGhyZWVBcmdzKTtcbiAqICAgICAgdGFrZXNUd29BcmdzLmxlbmd0aDsgLy89PiAyXG4gKiAgICAgIC8vIE9ubHkgMiBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byB0aGUgd3JhcHBlZCBmdW5jdGlvblxuICogICAgICB0YWtlc1R3b0FyZ3MoMSwgMiwgMyk7IC8vPT4gWzEsIDIsIHVuZGVmaW5lZF1cbiAqIEBzeW1iIFIuYmluYXJ5KGYpKGEsIGIsIGMpID0gZihhLCBiKVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoZnVuY3Rpb24gYmluYXJ5KGZuKSB7XG4gIHJldHVybiBuQXJ5KDIsIGZuKTtcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfaXNGdW5jdGlvbih4KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59O1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcbnZhciBfcmVkdWNlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fcmVkdWNlJyk7XG52YXIgYXAgPSByZXF1aXJlKCcuL2FwJyk7XG52YXIgY3VycnlOID0gcmVxdWlyZSgnLi9jdXJyeU4nKTtcbnZhciBtYXAgPSByZXF1aXJlKCcuL21hcCcpO1xuXG5cbi8qKlxuICogXCJsaWZ0c1wiIGEgZnVuY3Rpb24gdG8gYmUgdGhlIHNwZWNpZmllZCBhcml0eSwgc28gdGhhdCBpdCBtYXkgXCJtYXAgb3ZlclwiIHRoYXRcbiAqIG1hbnkgbGlzdHMsIEZ1bmN0aW9ucyBvciBvdGhlciBvYmplY3RzIHRoYXQgc2F0aXNmeSB0aGUgW0ZhbnRhc3lMYW5kIEFwcGx5IHNwZWNdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjYXBwbHkpLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjcuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIE51bWJlciAtPiAoKi4uLiAtPiAqKSAtPiAoWypdLi4uIC0+IFsqXSlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBsaWZ0IGludG8gaGlnaGVyIGNvbnRleHRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgbGlmdGVkIGZ1bmN0aW9uLlxuICogQHNlZSBSLmxpZnQsIFIuYXBcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgbWFkZDMgPSBSLmxpZnROKDMsICguLi5hcmdzKSA9PiBSLnN1bShhcmdzKSk7XG4gKiAgICAgIG1hZGQzKFsxLDIsM10sIFsxLDIsM10sIFsxXSk7IC8vPT4gWzMsIDQsIDUsIDQsIDUsIDYsIDUsIDYsIDddXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBsaWZ0Tihhcml0eSwgZm4pIHtcbiAgdmFyIGxpZnRlZCA9IGN1cnJ5Tihhcml0eSwgZm4pO1xuICByZXR1cm4gY3VycnlOKGFyaXR5LCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gX3JlZHVjZShhcCwgbWFwKGxpZnRlZCwgYXJndW1lbnRzWzBdKSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7XG4gIH0pO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xudmFyIGxpZnROID0gcmVxdWlyZSgnLi9saWZ0TicpO1xuXG5cbi8qKlxuICogXCJsaWZ0c1wiIGEgZnVuY3Rpb24gb2YgYXJpdHkgPiAxIHNvIHRoYXQgaXQgbWF5IFwibWFwIG92ZXJcIiBhIGxpc3QsIEZ1bmN0aW9uIG9yIG90aGVyXG4gKiBvYmplY3QgdGhhdCBzYXRpc2ZpZXMgdGhlIFtGYW50YXN5TGFuZCBBcHBseSBzcGVjXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI2FwcGx5KS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC43LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKi4uLiAtPiAqKSAtPiAoWypdLi4uIC0+IFsqXSlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBsaWZ0IGludG8gaGlnaGVyIGNvbnRleHRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgbGlmdGVkIGZ1bmN0aW9uLlxuICogQHNlZSBSLmxpZnROXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIG1hZGQzID0gUi5saWZ0KChhLCBiLCBjKSA9PiBhICsgYiArIGMpO1xuICpcbiAqICAgICAgbWFkZDMoWzEsMiwzXSwgWzEsMiwzXSwgWzFdKTsgLy89PiBbMywgNCwgNSwgNCwgNSwgNiwgNSwgNiwgN11cbiAqXG4gKiAgICAgIHZhciBtYWRkNSA9IFIubGlmdCgoYSwgYiwgYywgZCwgZSkgPT4gYSArIGIgKyBjICsgZCArIGUpO1xuICpcbiAqICAgICAgbWFkZDUoWzEsMl0sIFszXSwgWzQsIDVdLCBbNl0sIFs3LCA4XSk7IC8vPT4gWzIxLCAyMiwgMjIsIDIzLCAyMiwgMjMsIDIzLCAyNF1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkxKGZ1bmN0aW9uIGxpZnQoZm4pIHtcbiAgcmV0dXJuIGxpZnROKGZuLmxlbmd0aCwgZm4pO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIF9pc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9faXNGdW5jdGlvbicpO1xudmFyIGFuZCA9IHJlcXVpcmUoJy4vYW5kJyk7XG52YXIgbGlmdCA9IHJlcXVpcmUoJy4vbGlmdCcpO1xuXG5cbi8qKlxuICogQSBmdW5jdGlvbiB3aGljaCBjYWxscyB0aGUgdHdvIHByb3ZpZGVkIGZ1bmN0aW9ucyBhbmQgcmV0dXJucyB0aGUgYCYmYFxuICogb2YgdGhlIHJlc3VsdHMuXG4gKiBJdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGZpcnN0IGZ1bmN0aW9uIGlmIGl0IGlzIGZhbHNlLXkgYW5kIHRoZSByZXN1bHRcbiAqIG9mIHRoZSBzZWNvbmQgZnVuY3Rpb24gb3RoZXJ3aXNlLiBOb3RlIHRoYXQgdGhpcyBpcyBzaG9ydC1jaXJjdWl0ZWQsXG4gKiBtZWFuaW5nIHRoYXQgdGhlIHNlY29uZCBmdW5jdGlvbiB3aWxsIG5vdCBiZSBpbnZva2VkIGlmIHRoZSBmaXJzdCByZXR1cm5zIGFcbiAqIGZhbHNlLXkgdmFsdWUuXG4gKlxuICogSW4gYWRkaXRpb24gdG8gZnVuY3Rpb25zLCBgUi5ib3RoYCBhbHNvIGFjY2VwdHMgYW55IGZhbnRhc3ktbGFuZCBjb21wYXRpYmxlXG4gKiBhcHBsaWNhdGl2ZSBmdW5jdG9yLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEyLjBcbiAqIEBjYXRlZ29yeSBMb2dpY1xuICogQHNpZyAoKi4uLiAtPiBCb29sZWFuKSAtPiAoKi4uLiAtPiBCb29sZWFuKSAtPiAoKi4uLiAtPiBCb29sZWFuKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZiBBIHByZWRpY2F0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZyBBbm90aGVyIHByZWRpY2F0ZVxuICogQHJldHVybiB7RnVuY3Rpb259IGEgZnVuY3Rpb24gdGhhdCBhcHBsaWVzIGl0cyBhcmd1bWVudHMgdG8gYGZgIGFuZCBgZ2AgYW5kIGAmJmBzIHRoZWlyIG91dHB1dHMgdG9nZXRoZXIuXG4gKiBAc2VlIFIuYW5kXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGd0MTAgPSBSLmd0KFIuX18sIDEwKVxuICogICAgICB2YXIgbHQyMCA9IFIubHQoUi5fXywgMjApXG4gKiAgICAgIHZhciBmID0gUi5ib3RoKGd0MTAsIGx0MjApO1xuICogICAgICBmKDE1KTsgLy89PiB0cnVlXG4gKiAgICAgIGYoMzApOyAvLz0+IGZhbHNlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBib3RoKGYsIGcpIHtcbiAgcmV0dXJuIF9pc0Z1bmN0aW9uKGYpID9cbiAgICBmdW5jdGlvbiBfYm90aCgpIHtcbiAgICAgIHJldHVybiBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgJiYgZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0gOlxuICAgIGxpZnQoYW5kKShmLCBnKTtcbn0pO1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcbnZhciBjdXJyeU4gPSByZXF1aXJlKCcuL2N1cnJ5TicpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIGN1cnJpZWQgZXF1aXZhbGVudCBvZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uIFRoZSBjdXJyaWVkIGZ1bmN0aW9uXG4gKiBoYXMgdHdvIHVudXN1YWwgY2FwYWJpbGl0aWVzLiBGaXJzdCwgaXRzIGFyZ3VtZW50cyBuZWVkbid0IGJlIHByb3ZpZGVkIG9uZVxuICogYXQgYSB0aW1lLiBJZiBgZmAgaXMgYSB0ZXJuYXJ5IGZ1bmN0aW9uIGFuZCBgZ2AgaXMgYFIuY3VycnkoZilgLCB0aGVcbiAqIGZvbGxvd2luZyBhcmUgZXF1aXZhbGVudDpcbiAqXG4gKiAgIC0gYGcoMSkoMikoMylgXG4gKiAgIC0gYGcoMSkoMiwgMylgXG4gKiAgIC0gYGcoMSwgMikoMylgXG4gKiAgIC0gYGcoMSwgMiwgMylgXG4gKlxuICogU2Vjb25kbHksIHRoZSBzcGVjaWFsIHBsYWNlaG9sZGVyIHZhbHVlIGBSLl9fYCBtYXkgYmUgdXNlZCB0byBzcGVjaWZ5XG4gKiBcImdhcHNcIiwgYWxsb3dpbmcgcGFydGlhbCBhcHBsaWNhdGlvbiBvZiBhbnkgY29tYmluYXRpb24gb2YgYXJndW1lbnRzLFxuICogcmVnYXJkbGVzcyBvZiB0aGVpciBwb3NpdGlvbnMuIElmIGBnYCBpcyBhcyBhYm92ZSBhbmQgYF9gIGlzIGBSLl9fYCwgdGhlXG4gKiBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6XG4gKlxuICogICAtIGBnKDEsIDIsIDMpYFxuICogICAtIGBnKF8sIDIsIDMpKDEpYFxuICogICAtIGBnKF8sIF8sIDMpKDEpKDIpYFxuICogICAtIGBnKF8sIF8sIDMpKDEsIDIpYFxuICogICAtIGBnKF8sIDIpKDEpKDMpYFxuICogICAtIGBnKF8sIDIpKDEsIDMpYFxuICogICAtIGBnKF8sIDIpKF8sIDMpKDEpYFxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICgqIC0+IGEpIC0+ICgqIC0+IGEpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcsIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAc2VlIFIuY3VycnlOXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGFkZEZvdXJOdW1iZXJzID0gKGEsIGIsIGMsIGQpID0+IGEgKyBiICsgYyArIGQ7XG4gKlxuICogICAgICB2YXIgY3VycmllZEFkZEZvdXJOdW1iZXJzID0gUi5jdXJyeShhZGRGb3VyTnVtYmVycyk7XG4gKiAgICAgIHZhciBmID0gY3VycmllZEFkZEZvdXJOdW1iZXJzKDEsIDIpO1xuICogICAgICB2YXIgZyA9IGYoMyk7XG4gKiAgICAgIGcoNCk7IC8vPT4gMTBcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkxKGZ1bmN0aW9uIGN1cnJ5KGZuKSB7XG4gIHJldHVybiBjdXJyeU4oZm4ubGVuZ3RoLCBmbik7XG59KTtcbiIsInZhciBjdXJyeSA9IHJlcXVpcmUoJy4vY3VycnknKTtcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGl0cyBmaXJzdCBhcmd1bWVudCB3aXRoIHRoZSByZW1haW5pbmdcbiAqIGFyZ3VtZW50cy4gVGhpcyBpcyBvY2Nhc2lvbmFsbHkgdXNlZnVsIGFzIGEgY29udmVyZ2luZyBmdW5jdGlvbiBmb3JcbiAqIGBSLmNvbnZlcmdlYDogdGhlIGxlZnQgYnJhbmNoIGNhbiBwcm9kdWNlIGEgZnVuY3Rpb24gd2hpbGUgdGhlIHJpZ2h0IGJyYW5jaFxuICogcHJvZHVjZXMgYSB2YWx1ZSB0byBiZSBwYXNzZWQgdG8gdGhhdCBmdW5jdGlvbiBhcyBhbiBhcmd1bWVudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC45LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKi4uLiAtPiBhKSwqLi4uIC0+IGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBhcHBseSB0byB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7Li4uKn0gYXJncyBBbnkgbnVtYmVyIG9mIHBvc2l0aW9uYWwgYXJndW1lbnRzLlxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5hcHBseVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuY2FsbChSLmFkZCwgMSwgMik7IC8vPT4gM1xuICpcbiAqICAgICAgdmFyIGluZGVudE4gPSBSLnBpcGUoUi50aW1lcyhSLmFsd2F5cygnICcpKSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5qb2luKCcnKSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5yZXBsYWNlKC9eKD8hJCkvZ20pKTtcbiAqXG4gKiAgICAgIHZhciBmb3JtYXQgPSBSLmNvbnZlcmdlKFIuY2FsbCwgW1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5waXBlKFIucHJvcCgnaW5kZW50JyksIGluZGVudE4pLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5wcm9wKCd2YWx1ZScpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pO1xuICpcbiAqICAgICAgZm9ybWF0KHtpbmRlbnQ6IDIsIHZhbHVlOiAnZm9vXFxuYmFyXFxuYmF6XFxuJ30pOyAvLz0+ICcgIGZvb1xcbiAgYmFyXFxuICBiYXpcXG4nXG4gKiBAc3ltYiBSLmNhbGwoZiwgYSwgYikgPSBmKGEsIGIpXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gY3VycnkoZnVuY3Rpb24gY2FsbChmbikge1xuICByZXR1cm4gZm4uYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7XG59KTtcbiIsInZhciBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4uL2lzQXJyYXlMaWtlJyk7XG5cblxuLyoqXG4gKiBgX21ha2VGbGF0YCBpcyBhIGhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBvbmUtbGV2ZWwgb3IgZnVsbHkgcmVjdXJzaXZlXG4gKiBmdW5jdGlvbiBiYXNlZCBvbiB0aGUgZmxhZyBwYXNzZWQgaW4uXG4gKlxuICogQHByaXZhdGVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfbWFrZUZsYXQocmVjdXJzaXZlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmbGF0dChsaXN0KSB7XG4gICAgdmFyIHZhbHVlLCBqbGVuLCBqO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgaWR4ID0gMDtcbiAgICB2YXIgaWxlbiA9IGxpc3QubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGlkeCA8IGlsZW4pIHtcbiAgICAgIGlmIChpc0FycmF5TGlrZShsaXN0W2lkeF0pKSB7XG4gICAgICAgIHZhbHVlID0gcmVjdXJzaXZlID8gZmxhdHQobGlzdFtpZHhdKSA6IGxpc3RbaWR4XTtcbiAgICAgICAgaiA9IDA7XG4gICAgICAgIGpsZW4gPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgIHdoaWxlIChqIDwgamxlbikge1xuICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHZhbHVlW2pdO1xuICAgICAgICAgIGogKz0gMTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gbGlzdFtpZHhdO1xuICAgICAgfVxuICAgICAgaWR4ICs9IDE7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfZm9yY2VSZWR1Y2VkKHgpIHtcbiAgcmV0dXJuIHtcbiAgICAnQEB0cmFuc2R1Y2VyL3ZhbHVlJzogeCxcbiAgICAnQEB0cmFuc2R1Y2VyL3JlZHVjZWQnOiB0cnVlXG4gIH07XG59O1xuIiwidmFyIF9mb3JjZVJlZHVjZWQgPSByZXF1aXJlKCcuL19mb3JjZVJlZHVjZWQnKTtcbnZhciBfcmVkdWNlID0gcmVxdWlyZSgnLi9fcmVkdWNlJyk7XG52YXIgX3hmQmFzZSA9IHJlcXVpcmUoJy4vX3hmQmFzZScpO1xudmFyIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi4vaXNBcnJheUxpa2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciBwcmVzZXJ2aW5nUmVkdWNlZCA9IGZ1bmN0aW9uKHhmKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdAQHRyYW5zZHVjZXIvaW5pdCc6IF94ZkJhc2UuaW5pdCxcbiAgICAgICdAQHRyYW5zZHVjZXIvcmVzdWx0JzogZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgIHJldHVybiB4ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHJlc3VsdCk7XG4gICAgICB9LFxuICAgICAgJ0BAdHJhbnNkdWNlci9zdGVwJzogZnVuY3Rpb24ocmVzdWx0LCBpbnB1dCkge1xuICAgICAgICB2YXIgcmV0ID0geGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCBpbnB1dCk7XG4gICAgICAgIHJldHVybiByZXRbJ0BAdHJhbnNkdWNlci9yZWR1Y2VkJ10gPyBfZm9yY2VSZWR1Y2VkKHJldCkgOiByZXQ7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICByZXR1cm4gZnVuY3Rpb24gX3hjYXQoeGYpIHtcbiAgICB2YXIgcnhmID0gcHJlc2VydmluZ1JlZHVjZWQoeGYpO1xuICAgIHJldHVybiB7XG4gICAgICAnQEB0cmFuc2R1Y2VyL2luaXQnOiBfeGZCYXNlLmluaXQsXG4gICAgICAnQEB0cmFuc2R1Y2VyL3Jlc3VsdCc6IGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gcnhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10ocmVzdWx0KTtcbiAgICAgIH0sXG4gICAgICAnQEB0cmFuc2R1Y2VyL3N0ZXAnOiBmdW5jdGlvbihyZXN1bHQsIGlucHV0KSB7XG4gICAgICAgIHJldHVybiAhaXNBcnJheUxpa2UoaW5wdXQpID8gX3JlZHVjZShyeGYsIHJlc3VsdCwgW2lucHV0XSkgOiBfcmVkdWNlKHJ4ZiwgcmVzdWx0LCBpbnB1dCk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbn0oKSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vX2N1cnJ5MicpO1xudmFyIF9mbGF0Q2F0ID0gcmVxdWlyZSgnLi9fZmxhdENhdCcpO1xudmFyIG1hcCA9IHJlcXVpcmUoJy4uL21hcCcpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBfeGNoYWluKGYsIHhmKSB7XG4gIHJldHVybiBtYXAoZiwgX2ZsYXRDYXQoeGYpKTtcbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcbnZhciBfZGlzcGF0Y2hhYmxlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlJyk7XG52YXIgX21ha2VGbGF0ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fbWFrZUZsYXQnKTtcbnZhciBfeGNoYWluID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9feGNoYWluJyk7XG52YXIgbWFwID0gcmVxdWlyZSgnLi9tYXAnKTtcblxuXG4vKipcbiAqIGBjaGFpbmAgbWFwcyBhIGZ1bmN0aW9uIG92ZXIgYSBsaXN0IGFuZCBjb25jYXRlbmF0ZXMgdGhlIHJlc3VsdHMuIGBjaGFpbmBcbiAqIGlzIGFsc28ga25vd24gYXMgYGZsYXRNYXBgIGluIHNvbWUgbGlicmFyaWVzXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGNoYWluYCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudCxcbiAqIGFjY29yZGluZyB0byB0aGUgW0ZhbnRhc3lMYW5kIENoYWluIHNwZWNdKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjY2hhaW4pLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjMuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgQ2hhaW4gbSA9PiAoYSAtPiBtIGIpIC0+IG0gYSAtPiBtIGJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtYXAgd2l0aFxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBtYXAgb3ZlclxuICogQHJldHVybiB7QXJyYXl9IFRoZSByZXN1bHQgb2YgZmxhdC1tYXBwaW5nIGBsaXN0YCB3aXRoIGBmbmBcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgZHVwbGljYXRlID0gbiA9PiBbbiwgbl07XG4gKiAgICAgIFIuY2hhaW4oZHVwbGljYXRlLCBbMSwgMiwgM10pOyAvLz0+IFsxLCAxLCAyLCAyLCAzLCAzXVxuICpcbiAqICAgICAgUi5jaGFpbihSLmFwcGVuZCwgUi5oZWFkKShbMSwgMiwgM10pOyAvLz0+IFsxLCAyLCAzLCAxXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoX2Rpc3BhdGNoYWJsZShbJ2NoYWluJ10sIF94Y2hhaW4sIGZ1bmN0aW9uIGNoYWluKGZuLCBtb25hZCkge1xuICBpZiAodHlwZW9mIG1vbmFkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIGZuKG1vbmFkKHgpKSh4KTsgfTtcbiAgfVxuICByZXR1cm4gX21ha2VGbGF0KGZhbHNlKShtYXAoZm4sIG1vbmFkKSk7XG59KSk7XG4iLCJ2YXIgX2N1cnJ5MyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MycpO1xuXG4vKipcbiAqIFJlc3RyaWN0cyBhIG51bWJlciB0byBiZSB3aXRoaW4gYSByYW5nZS5cbiAqXG4gKiBBbHNvIHdvcmtzIGZvciBvdGhlciBvcmRlcmVkIHR5cGVzIHN1Y2ggYXMgU3RyaW5ncyBhbmQgRGF0ZXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjAuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIE9yZCBhID0+IGEgLT4gYSAtPiBhIC0+IGFcbiAqIEBwYXJhbSB7TnVtYmVyfSBtaW5pbXVtIFRoZSBsb3dlciBsaW1pdCBvZiB0aGUgY2xhbXAgKGluY2x1c2l2ZSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtYXhpbXVtIFRoZSB1cHBlciBsaW1pdCBvZiB0aGUgY2xhbXAgKGluY2x1c2l2ZSlcbiAqIEBwYXJhbSB7TnVtYmVyfSB2YWx1ZSBWYWx1ZSB0byBiZSBjbGFtcGVkXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IFJldHVybnMgYG1pbmltdW1gIHdoZW4gYHZhbCA8IG1pbmltdW1gLCBgbWF4aW11bWAgd2hlbiBgdmFsID4gbWF4aW11bWAsIHJldHVybnMgYHZhbGAgb3RoZXJ3aXNlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5jbGFtcCgxLCAxMCwgLTUpIC8vID0+IDFcbiAqICAgICAgUi5jbGFtcCgxLCAxMCwgMTUpIC8vID0+IDEwXG4gKiAgICAgIFIuY2xhbXAoMSwgMTAsIDQpICAvLyA9PiA0XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MyhmdW5jdGlvbiBjbGFtcChtaW4sIG1heCwgdmFsdWUpIHtcbiAgaWYgKG1pbiA+IG1heCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWluIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBtYXggaW4gY2xhbXAobWluLCBtYXgsIHZhbHVlKScpO1xuICB9XG4gIHJldHVybiB2YWx1ZSA8IG1pbiA/IG1pbiA6XG4gICAgICAgICB2YWx1ZSA+IG1heCA/IG1heCA6XG4gICAgICAgICB2YWx1ZTtcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfY2xvbmVSZWdFeHAocGF0dGVybikge1xuICByZXR1cm4gbmV3IFJlZ0V4cChwYXR0ZXJuLnNvdXJjZSwgKHBhdHRlcm4uZ2xvYmFsICAgICA/ICdnJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGF0dGVybi5pZ25vcmVDYXNlID8gJ2knIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXR0ZXJuLm11bHRpbGluZSAgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhdHRlcm4uc3RpY2t5ICAgICA/ICd5JyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGF0dGVybi51bmljb2RlICAgID8gJ3UnIDogJycpKTtcbn07XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xuXG5cbi8qKlxuICogR2l2ZXMgYSBzaW5nbGUtd29yZCBzdHJpbmcgZGVzY3JpcHRpb24gb2YgdGhlIChuYXRpdmUpIHR5cGUgb2YgYSB2YWx1ZSxcbiAqIHJldHVybmluZyBzdWNoIGFuc3dlcnMgYXMgJ09iamVjdCcsICdOdW1iZXInLCAnQXJyYXknLCBvciAnTnVsbCcuIERvZXMgbm90XG4gKiBhdHRlbXB0IHRvIGRpc3Rpbmd1aXNoIHVzZXIgT2JqZWN0IHR5cGVzIGFueSBmdXJ0aGVyLCByZXBvcnRpbmcgdGhlbSBhbGwgYXNcbiAqICdPYmplY3QnLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjguMFxuICogQGNhdGVnb3J5IFR5cGVcbiAqIEBzaWcgKCogLT4geyp9KSAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi50eXBlKHt9KTsgLy89PiBcIk9iamVjdFwiXG4gKiAgICAgIFIudHlwZSgxKTsgLy89PiBcIk51bWJlclwiXG4gKiAgICAgIFIudHlwZShmYWxzZSk7IC8vPT4gXCJCb29sZWFuXCJcbiAqICAgICAgUi50eXBlKCdzJyk7IC8vPT4gXCJTdHJpbmdcIlxuICogICAgICBSLnR5cGUobnVsbCk7IC8vPT4gXCJOdWxsXCJcbiAqICAgICAgUi50eXBlKFtdKTsgLy89PiBcIkFycmF5XCJcbiAqICAgICAgUi50eXBlKC9bQS16XS8pOyAvLz0+IFwiUmVnRXhwXCJcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkxKGZ1bmN0aW9uIHR5cGUodmFsKSB7XG4gIHJldHVybiB2YWwgPT09IG51bGwgICAgICA/ICdOdWxsJyAgICAgIDpcbiAgICAgICAgIHZhbCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOlxuICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkuc2xpY2UoOCwgLTEpO1xufSk7XG4iLCJ2YXIgX2Nsb25lUmVnRXhwID0gcmVxdWlyZSgnLi9fY2xvbmVSZWdFeHAnKTtcbnZhciB0eXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5cbi8qKlxuICogQ29waWVzIGFuIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgY29waWVkXG4gKiBAcGFyYW0ge0FycmF5fSByZWZGcm9tIEFycmF5IGNvbnRhaW5pbmcgdGhlIHNvdXJjZSByZWZlcmVuY2VzXG4gKiBAcGFyYW0ge0FycmF5fSByZWZUbyBBcnJheSBjb250YWluaW5nIHRoZSBjb3BpZWQgc291cmNlIHJlZmVyZW5jZXNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVlcCBXaGV0aGVyIG9yIG5vdCB0byBwZXJmb3JtIGRlZXAgY2xvbmluZy5cbiAqIEByZXR1cm4geyp9IFRoZSBjb3BpZWQgdmFsdWUuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2Nsb25lKHZhbHVlLCByZWZGcm9tLCByZWZUbywgZGVlcCkge1xuICB2YXIgY29weSA9IGZ1bmN0aW9uIGNvcHkoY29waWVkVmFsdWUpIHtcbiAgICB2YXIgbGVuID0gcmVmRnJvbS5sZW5ndGg7XG4gICAgdmFyIGlkeCA9IDA7XG4gICAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgICAgaWYgKHZhbHVlID09PSByZWZGcm9tW2lkeF0pIHtcbiAgICAgICAgcmV0dXJuIHJlZlRvW2lkeF07XG4gICAgICB9XG4gICAgICBpZHggKz0gMTtcbiAgICB9XG4gICAgcmVmRnJvbVtpZHggKyAxXSA9IHZhbHVlO1xuICAgIHJlZlRvW2lkeCArIDFdID0gY29waWVkVmFsdWU7XG4gICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICBjb3BpZWRWYWx1ZVtrZXldID0gZGVlcCA/XG4gICAgICAgIF9jbG9uZSh2YWx1ZVtrZXldLCByZWZGcm9tLCByZWZUbywgdHJ1ZSkgOiB2YWx1ZVtrZXldO1xuICAgIH1cbiAgICByZXR1cm4gY29waWVkVmFsdWU7XG4gIH07XG4gIHN3aXRjaCAodHlwZSh2YWx1ZSkpIHtcbiAgICBjYXNlICdPYmplY3QnOiAgcmV0dXJuIGNvcHkoe30pO1xuICAgIGNhc2UgJ0FycmF5JzogICByZXR1cm4gY29weShbXSk7XG4gICAgY2FzZSAnRGF0ZSc6ICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZS52YWx1ZU9mKCkpO1xuICAgIGNhc2UgJ1JlZ0V4cCc6ICByZXR1cm4gX2Nsb25lUmVnRXhwKHZhbHVlKTtcbiAgICBkZWZhdWx0OiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICB9XG59O1xuIiwidmFyIF9jbG9uZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2Nsb25lJyk7XG52YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xuXG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlZXAgY29weSBvZiB0aGUgdmFsdWUgd2hpY2ggbWF5IGNvbnRhaW4gKG5lc3RlZCkgYEFycmF5YHMgYW5kXG4gKiBgT2JqZWN0YHMsIGBOdW1iZXJgcywgYFN0cmluZ2BzLCBgQm9vbGVhbmBzIGFuZCBgRGF0ZWBzLiBgRnVuY3Rpb25gcyBhcmVcbiAqIGFzc2lnbmVkIGJ5IHJlZmVyZW5jZSByYXRoZXIgdGhhbiBjb3BpZWRcbiAqXG4gKiBEaXNwYXRjaGVzIHRvIGEgYGNsb25lYCBtZXRob2QgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgeyp9IC0+IHsqfVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgb2JqZWN0IG9yIGFycmF5IHRvIGNsb25lXG4gKiBAcmV0dXJuIHsqfSBBIGRlZXBseSBjbG9uZWQgY29weSBvZiBgdmFsYFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBvYmplY3RzID0gW3t9LCB7fSwge31dO1xuICogICAgICB2YXIgb2JqZWN0c0Nsb25lID0gUi5jbG9uZShvYmplY3RzKTtcbiAqICAgICAgb2JqZWN0cyA9PT0gb2JqZWN0c0Nsb25lOyAvLz0+IGZhbHNlXG4gKiAgICAgIG9iamVjdHNbMF0gPT09IG9iamVjdHNDbG9uZVswXTsgLy89PiBmYWxzZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoZnVuY3Rpb24gY2xvbmUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlLmNsb25lID09PSAnZnVuY3Rpb24nID9cbiAgICB2YWx1ZS5jbG9uZSgpIDpcbiAgICBfY2xvbmUodmFsdWUsIFtdLCBbXSwgdHJ1ZSk7XG59KTtcbiIsInZhciBfY3VycnkxID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkxJyk7XG5cblxuLyoqXG4gKiBNYWtlcyBhIGNvbXBhcmF0b3IgZnVuY3Rpb24gb3V0IG9mIGEgZnVuY3Rpb24gdGhhdCByZXBvcnRzIHdoZXRoZXIgdGhlIGZpcnN0XG4gKiBlbGVtZW50IGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIChhLCBiIC0+IEJvb2xlYW4pIC0+IChhLCBiIC0+IE51bWJlcilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgQSBwcmVkaWNhdGUgZnVuY3Rpb24gb2YgYXJpdHkgdHdvIHdoaWNoIHdpbGwgcmV0dXJuIGB0cnVlYCBpZiB0aGUgZmlyc3QgYXJndW1lbnRcbiAqIGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kLCBgZmFsc2VgIG90aGVyd2lzZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgRnVuY3Rpb24gOjogYSAtPiBiIC0+IEludCB0aGF0IHJldHVybnMgYC0xYCBpZiBhIDwgYiwgYDFgIGlmIGIgPCBhLCBvdGhlcndpc2UgYDBgXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGJ5QWdlID0gUi5jb21wYXJhdG9yKChhLCBiKSA9PiBhLmFnZSA8IGIuYWdlKTtcbiAqICAgICAgdmFyIHBlb3BsZSA9IFtcbiAqICAgICAgICAvLyAuLi5cbiAqICAgICAgXTtcbiAqICAgICAgdmFyIHBlb3BsZUJ5SW5jcmVhc2luZ0FnZSA9IFIuc29ydChieUFnZSwgcGVvcGxlKTtcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkxKGZ1bmN0aW9uIGNvbXBhcmF0b3IocHJlZCkge1xuICByZXR1cm4gZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBwcmVkKGEsIGIpID8gLTEgOiBwcmVkKGIsIGEpID8gMSA6IDA7XG4gIH07XG59KTtcbiIsInZhciBfY3VycnkxID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkxJyk7XG5cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgYCFgIG9mIGl0cyBhcmd1bWVudC4gSXQgd2lsbCByZXR1cm4gYHRydWVgIHdoZW5cbiAqIHBhc3NlZCBmYWxzZS15IHZhbHVlLCBhbmQgYGZhbHNlYCB3aGVuIHBhc3NlZCBhIHRydXRoLXkgb25lLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExvZ2ljXG4gKiBAc2lnICogLT4gQm9vbGVhblxuICogQHBhcmFtIHsqfSBhIGFueSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn0gdGhlIGxvZ2ljYWwgaW52ZXJzZSBvZiBwYXNzZWQgYXJndW1lbnQuXG4gKiBAc2VlIFIuY29tcGxlbWVudFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIubm90KHRydWUpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIubm90KGZhbHNlKTsgLy89PiB0cnVlXG4gKiAgICAgIFIubm90KDApOyAvLz0+IHRydWVcbiAqICAgICAgUi5ub3QoMSk7IC8vPT4gZmFsc2VcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkxKGZ1bmN0aW9uIG5vdChhKSB7XG4gIHJldHVybiAhYTtcbn0pO1xuIiwidmFyIGxpZnQgPSByZXF1aXJlKCcuL2xpZnQnKTtcbnZhciBub3QgPSByZXF1aXJlKCcuL25vdCcpO1xuXG5cbi8qKlxuICogVGFrZXMgYSBmdW5jdGlvbiBgZmAgYW5kIHJldHVybnMgYSBmdW5jdGlvbiBgZ2Agc3VjaCB0aGF0IGlmIGNhbGxlZCB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50c1xuICogd2hlbiBgZmAgcmV0dXJucyBhIFwidHJ1dGh5XCIgdmFsdWUsIGBnYCByZXR1cm5zIGBmYWxzZWAgYW5kIHdoZW4gYGZgIHJldHVybnMgYSBcImZhbHN5XCIgdmFsdWUgYGdgIHJldHVybnMgYHRydWVgLlxuICpcbiAqIGBSLmNvbXBsZW1lbnRgIG1heSBiZSBhcHBsaWVkIHRvIGFueSBmdW5jdG9yXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTIuMFxuICogQGNhdGVnb3J5IExvZ2ljXG4gKiBAc2lnICgqLi4uIC0+ICopIC0+ICgqLi4uIC0+IEJvb2xlYW4pXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBzZWUgUi5ub3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgaXNOb3ROaWwgPSBSLmNvbXBsZW1lbnQoUi5pc05pbCk7XG4gKiAgICAgIGlzTmlsKG51bGwpOyAvLz0+IHRydWVcbiAqICAgICAgaXNOb3ROaWwobnVsbCk7IC8vPT4gZmFsc2VcbiAqICAgICAgaXNOaWwoNyk7IC8vPT4gZmFsc2VcbiAqICAgICAgaXNOb3ROaWwoNyk7IC8vPT4gdHJ1ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGxpZnQobm90KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX3BpcGUoZiwgZykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGcuY2FsbCh0aGlzLCBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9O1xufTtcbiIsInZhciBfaXNBcnJheSA9IHJlcXVpcmUoJy4vX2lzQXJyYXknKTtcblxuXG4vKipcbiAqIFRoaXMgY2hlY2tzIHdoZXRoZXIgYSBmdW5jdGlvbiBoYXMgYSBbbWV0aG9kbmFtZV0gZnVuY3Rpb24uIElmIGl0IGlzbid0IGFuXG4gKiBhcnJheSBpdCB3aWxsIGV4ZWN1dGUgdGhhdCBmdW5jdGlvbiBvdGhlcndpc2UgaXQgd2lsbCBkZWZhdWx0IHRvIHRoZSByYW1kYVxuICogaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIHJhbWRhIGltcGxlbXRhdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZG5hbWUgcHJvcGVydHkgdG8gY2hlY2sgZm9yIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uXG4gKiBAcmV0dXJuIHtPYmplY3R9IFdoYXRldmVyIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIG1ldGhvZCBpcy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfY2hlY2tGb3JNZXRob2QobWV0aG9kbmFtZSwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH1cbiAgICB2YXIgb2JqID0gYXJndW1lbnRzW2xlbmd0aCAtIDFdO1xuICAgIHJldHVybiAoX2lzQXJyYXkob2JqKSB8fCB0eXBlb2Ygb2JqW21ldGhvZG5hbWVdICE9PSAnZnVuY3Rpb24nKSA/XG4gICAgICBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDpcbiAgICAgIG9ialttZXRob2RuYW1lXS5hcHBseShvYmosIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgbGVuZ3RoIC0gMSkpO1xuICB9O1xufTtcbiIsInZhciBfY2hlY2tGb3JNZXRob2QgPSByZXF1aXJlKCcuL2ludGVybmFsL19jaGVja0Zvck1ldGhvZCcpO1xudmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBsaXN0IG9yIHN0cmluZyAob3Igb2JqZWN0IHdpdGggYSBgc2xpY2VgXG4gKiBtZXRob2QpIGZyb20gYGZyb21JbmRleGAgKGluY2x1c2l2ZSkgdG8gYHRvSW5kZXhgIChleGNsdXNpdmUpLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBzbGljZWAgbWV0aG9kIG9mIHRoZSB0aGlyZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjRcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gW2FdIC0+IFthXVxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBmcm9tSW5kZXggVGhlIHN0YXJ0IGluZGV4IChpbmNsdXNpdmUpLlxuICogQHBhcmFtIHtOdW1iZXJ9IHRvSW5kZXggVGhlIGVuZCBpbmRleCAoZXhjbHVzaXZlKS5cbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Kn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnNsaWNlKDEsIDMsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAgIC8vPT4gWydiJywgJ2MnXVxuICogICAgICBSLnNsaWNlKDEsIEluZmluaXR5LCBbJ2EnLCAnYicsICdjJywgJ2QnXSk7IC8vPT4gWydiJywgJ2MnLCAnZCddXG4gKiAgICAgIFIuc2xpY2UoMCwgLTEsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAgLy89PiBbJ2EnLCAnYicsICdjJ11cbiAqICAgICAgUi5zbGljZSgtMywgLTEsIFsnYScsICdiJywgJ2MnLCAnZCddKTsgICAgICAvLz0+IFsnYicsICdjJ11cbiAqICAgICAgUi5zbGljZSgwLCAzLCAncmFtZGEnKTsgICAgICAgICAgICAgICAgICAgICAvLz0+ICdyYW0nXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MyhfY2hlY2tGb3JNZXRob2QoJ3NsaWNlJywgZnVuY3Rpb24gc2xpY2UoZnJvbUluZGV4LCB0b0luZGV4LCBsaXN0KSB7XG4gIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChsaXN0LCBmcm9tSW5kZXgsIHRvSW5kZXgpO1xufSkpO1xuIiwidmFyIF9jaGVja0Zvck1ldGhvZCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2NoZWNrRm9yTWV0aG9kJyk7XG52YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xudmFyIHNsaWNlID0gcmVxdWlyZSgnLi9zbGljZScpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhbGwgYnV0IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBnaXZlbiBsaXN0IG9yIHN0cmluZyAob3Igb2JqZWN0XG4gKiB3aXRoIGEgYHRhaWxgIG1ldGhvZCkuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYHNsaWNlYCBtZXRob2Qgb2YgdGhlIGZpcnN0IGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW2FdIC0+IFthXVxuICogQHNpZyBTdHJpbmcgLT4gU3RyaW5nXG4gKiBAcGFyYW0geyp9IGxpc3RcbiAqIEByZXR1cm4geyp9XG4gKiBAc2VlIFIuaGVhZCwgUi5pbml0LCBSLmxhc3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnRhaWwoWzEsIDIsIDNdKTsgIC8vPT4gWzIsIDNdXG4gKiAgICAgIFIudGFpbChbMSwgMl0pOyAgICAgLy89PiBbMl1cbiAqICAgICAgUi50YWlsKFsxXSk7ICAgICAgICAvLz0+IFtdXG4gKiAgICAgIFIudGFpbChbXSk7ICAgICAgICAgLy89PiBbXVxuICpcbiAqICAgICAgUi50YWlsKCdhYmMnKTsgIC8vPT4gJ2JjJ1xuICogICAgICBSLnRhaWwoJ2FiJyk7ICAgLy89PiAnYidcbiAqICAgICAgUi50YWlsKCdhJyk7ICAgIC8vPT4gJydcbiAqICAgICAgUi50YWlsKCcnKTsgICAgIC8vPT4gJydcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkxKF9jaGVja0Zvck1ldGhvZCgndGFpbCcsIHNsaWNlKDEsIEluZmluaXR5KSkpO1xuIiwidmFyIF9hcml0eSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2FyaXR5Jyk7XG52YXIgX3BpcGUgPSByZXF1aXJlKCcuL2ludGVybmFsL19waXBlJyk7XG52YXIgcmVkdWNlID0gcmVxdWlyZSgnLi9yZWR1Y2UnKTtcbnZhciB0YWlsID0gcmVxdWlyZSgnLi90YWlsJyk7XG5cblxuLyoqXG4gKiBQZXJmb3JtcyBsZWZ0LXRvLXJpZ2h0IGZ1bmN0aW9uIGNvbXBvc2l0aW9uLiBUaGUgbGVmdG1vc3QgZnVuY3Rpb24gbWF5IGhhdmVcbiAqIGFueSBhcml0eTsgdGhlIHJlbWFpbmluZyBmdW5jdGlvbnMgbXVzdCBiZSB1bmFyeS5cbiAqXG4gKiBJbiBzb21lIGxpYnJhcmllcyB0aGlzIGZ1bmN0aW9uIGlzIG5hbWVkIGBzZXF1ZW5jZWAuXG4gKlxuICogKipOb3RlOioqIFRoZSByZXN1bHQgb2YgcGlwZSBpcyBub3QgYXV0b21hdGljYWxseSBjdXJyaWVkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICgoKGEsIGIsIC4uLiwgbikgLT4gbyksIChvIC0+IHApLCAuLi4sICh4IC0+IHkpLCAoeSAtPiB6KSkgLT4gKChhLCBiLCAuLi4sIG4pIC0+IHopXG4gKiBAcGFyYW0gey4uLkZ1bmN0aW9ufSBmdW5jdGlvbnNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQHNlZSBSLmNvbXBvc2VcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgZiA9IFIucGlwZShNYXRoLnBvdywgUi5uZWdhdGUsIFIuaW5jKTtcbiAqXG4gKiAgICAgIGYoMywgNCk7IC8vIC0oM140KSArIDFcbiAqIEBzeW1iIFIucGlwZShmLCBnLCBoKShhLCBiKSA9IGgoZyhmKGEsIGIpKSlcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwaXBlKCkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcigncGlwZSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgYXJndW1lbnQnKTtcbiAgfVxuICByZXR1cm4gX2FyaXR5KGFyZ3VtZW50c1swXS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgcmVkdWNlKF9waXBlLCBhcmd1bWVudHNbMF0sIHRhaWwoYXJndW1lbnRzKSkpO1xufTtcbiIsInZhciBfY3VycnkxID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkxJyk7XG52YXIgX2lzU3RyaW5nID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9faXNTdHJpbmcnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCBvciBzdHJpbmcgd2l0aCB0aGUgZWxlbWVudHMgb3IgY2hhcmFjdGVycyBpbiByZXZlcnNlXG4gKiBvcmRlci5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFthXSAtPiBbYV1cbiAqIEBzaWcgU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IGxpc3RcbiAqIEByZXR1cm4ge0FycmF5fFN0cmluZ31cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnJldmVyc2UoWzEsIDIsIDNdKTsgIC8vPT4gWzMsIDIsIDFdXG4gKiAgICAgIFIucmV2ZXJzZShbMSwgMl0pOyAgICAgLy89PiBbMiwgMV1cbiAqICAgICAgUi5yZXZlcnNlKFsxXSk7ICAgICAgICAvLz0+IFsxXVxuICogICAgICBSLnJldmVyc2UoW10pOyAgICAgICAgIC8vPT4gW11cbiAqXG4gKiAgICAgIFIucmV2ZXJzZSgnYWJjJyk7ICAgICAgLy89PiAnY2JhJ1xuICogICAgICBSLnJldmVyc2UoJ2FiJyk7ICAgICAgIC8vPT4gJ2JhJ1xuICogICAgICBSLnJldmVyc2UoJ2EnKTsgICAgICAgIC8vPT4gJ2EnXG4gKiAgICAgIFIucmV2ZXJzZSgnJyk7ICAgICAgICAgLy89PiAnJ1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoZnVuY3Rpb24gcmV2ZXJzZShsaXN0KSB7XG4gIHJldHVybiBfaXNTdHJpbmcobGlzdCkgPyBsaXN0LnNwbGl0KCcnKS5yZXZlcnNlKCkuam9pbignJykgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobGlzdCwgMCkucmV2ZXJzZSgpO1xufSk7XG4iLCJ2YXIgcGlwZSA9IHJlcXVpcmUoJy4vcGlwZScpO1xudmFyIHJldmVyc2UgPSByZXF1aXJlKCcuL3JldmVyc2UnKTtcblxuXG4vKipcbiAqIFBlcmZvcm1zIHJpZ2h0LXRvLWxlZnQgZnVuY3Rpb24gY29tcG9zaXRpb24uIFRoZSByaWdodG1vc3QgZnVuY3Rpb24gbWF5IGhhdmVcbiAqIGFueSBhcml0eTsgdGhlIHJlbWFpbmluZyBmdW5jdGlvbnMgbXVzdCBiZSB1bmFyeS5cbiAqXG4gKiAqKk5vdGU6KiogVGhlIHJlc3VsdCBvZiBjb21wb3NlIGlzIG5vdCBhdXRvbWF0aWNhbGx5IGN1cnJpZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKCh5IC0+IHopLCAoeCAtPiB5KSwgLi4uLCAobyAtPiBwKSwgKChhLCBiLCAuLi4sIG4pIC0+IG8pKSAtPiAoKGEsIGIsIC4uLiwgbikgLT4geilcbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IC4uLmZ1bmN0aW9ucyBUaGUgZnVuY3Rpb25zIHRvIGNvbXBvc2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQHNlZSBSLnBpcGVcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgY2xhc3N5R3JlZXRpbmcgPSAoZmlyc3ROYW1lLCBsYXN0TmFtZSkgPT4gXCJUaGUgbmFtZSdzIFwiICsgbGFzdE5hbWUgKyBcIiwgXCIgKyBmaXJzdE5hbWUgKyBcIiBcIiArIGxhc3ROYW1lXG4gKiAgICAgIHZhciB5ZWxsR3JlZXRpbmcgPSBSLmNvbXBvc2UoUi50b1VwcGVyLCBjbGFzc3lHcmVldGluZyk7XG4gKiAgICAgIHllbGxHcmVldGluZygnSmFtZXMnLCAnQm9uZCcpOyAvLz0+IFwiVEhFIE5BTUUnUyBCT05ELCBKQU1FUyBCT05EXCJcbiAqXG4gKiAgICAgIFIuY29tcG9zZShNYXRoLmFicywgUi5hZGQoMSksIFIubXVsdGlwbHkoMikpKC00KSAvLz0+IDdcbiAqXG4gKiBAc3ltYiBSLmNvbXBvc2UoZiwgZywgaCkoYSwgYikgPSBmKGcoaChhLCBiKSkpXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY29tcG9zZSgpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbXBvc2UgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50Jyk7XG4gIH1cbiAgcmV0dXJuIHBpcGUuYXBwbHkodGhpcywgcmV2ZXJzZShhcmd1bWVudHMpKTtcbn07XG4iLCJ2YXIgY2hhaW4gPSByZXF1aXJlKCcuL2NoYWluJyk7XG52YXIgY29tcG9zZSA9IHJlcXVpcmUoJy4vY29tcG9zZScpO1xudmFyIG1hcCA9IHJlcXVpcmUoJy4vbWFwJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByaWdodC10by1sZWZ0IEtsZWlzbGkgY29tcG9zaXRpb24gb2YgdGhlIHByb3ZpZGVkIGZ1bmN0aW9ucyxcbiAqIGVhY2ggb2Ygd2hpY2ggbXVzdCByZXR1cm4gYSB2YWx1ZSBvZiBhIHR5cGUgc3VwcG9ydGVkIGJ5IFtgY2hhaW5gXSgjY2hhaW4pLlxuICpcbiAqIGBSLmNvbXBvc2VLKGgsIGcsIGYpYCBpcyBlcXVpdmFsZW50IHRvIGBSLmNvbXBvc2UoUi5jaGFpbihoKSwgUi5jaGFpbihnKSwgUi5jaGFpbihmKSlgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBDaGFpbiBtID0+ICgoeSAtPiBtIHopLCAoeCAtPiBtIHkpLCAuLi4sIChhIC0+IG0gYikpIC0+IChhIC0+IG0geilcbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IC4uLmZ1bmN0aW9ucyBUaGUgZnVuY3Rpb25zIHRvIGNvbXBvc2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQHNlZSBSLnBpcGVLXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgIC8vICBnZXQgOjogU3RyaW5nIC0+IE9iamVjdCAtPiBNYXliZSAqXG4gKiAgICAgICB2YXIgZ2V0ID0gUi5jdXJyeSgocHJvcE5hbWUsIG9iaikgPT4gTWF5YmUob2JqW3Byb3BOYW1lXSkpXG4gKlxuICogICAgICAgLy8gIGdldFN0YXRlQ29kZSA6OiBNYXliZSBTdHJpbmcgLT4gTWF5YmUgU3RyaW5nXG4gKiAgICAgICB2YXIgZ2V0U3RhdGVDb2RlID0gUi5jb21wb3NlSyhcbiAqICAgICAgICAgUi5jb21wb3NlKE1heWJlLm9mLCBSLnRvVXBwZXIpLFxuICogICAgICAgICBnZXQoJ3N0YXRlJyksXG4gKiAgICAgICAgIGdldCgnYWRkcmVzcycpLFxuICogICAgICAgICBnZXQoJ3VzZXInKSxcbiAqICAgICAgICk7XG4gKiAgICAgICBnZXRTdGF0ZUNvZGUoe1widXNlclwiOntcImFkZHJlc3NcIjp7XCJzdGF0ZVwiOlwibnlcIn19fSk7IC8vPT4gTWF5YmUuSnVzdChcIk5ZXCIpXG4gKiAgICAgICBnZXRTdGF0ZUNvZGUoe30pOyAvLz0+IE1heWJlLk5vdGhpbmcoKVxuICogQHN5bWIgUi5jb21wb3NlSyhmLCBnLCBoKShhKSA9IFIuY2hhaW4oZiwgUi5jaGFpbihnLCBoKGEpKSlcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb21wb3NlSygpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbXBvc2VLIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBhcmd1bWVudCcpO1xuICB9XG4gIHZhciBpbml0ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgdmFyIGxhc3QgPSBpbml0LnBvcCgpO1xuICByZXR1cm4gY29tcG9zZShjb21wb3NlLmFwcGx5KHRoaXMsIG1hcChjaGFpbiwgaW5pdCkpLCBsYXN0KTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9waXBlUChmLCBnKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY3R4ID0gdGhpcztcbiAgICByZXR1cm4gZi5hcHBseShjdHgsIGFyZ3VtZW50cykudGhlbihmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gZy5jYWxsKGN0eCwgeCk7XG4gICAgfSk7XG4gIH07XG59O1xuIiwidmFyIF9hcml0eSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2FyaXR5Jyk7XG52YXIgX3BpcGVQID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fcGlwZVAnKTtcbnZhciByZWR1Y2UgPSByZXF1aXJlKCcuL3JlZHVjZScpO1xudmFyIHRhaWwgPSByZXF1aXJlKCcuL3RhaWwnKTtcblxuXG4vKipcbiAqIFBlcmZvcm1zIGxlZnQtdG8tcmlnaHQgY29tcG9zaXRpb24gb2Ygb25lIG9yIG1vcmUgUHJvbWlzZS1yZXR1cm5pbmdcbiAqIGZ1bmN0aW9ucy4gVGhlIGxlZnRtb3N0IGZ1bmN0aW9uIG1heSBoYXZlIGFueSBhcml0eTsgdGhlIHJlbWFpbmluZyBmdW5jdGlvbnNcbiAqIG11c3QgYmUgdW5hcnkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTAuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICgoYSAtPiBQcm9taXNlIGIpLCAoYiAtPiBQcm9taXNlIGMpLCAuLi4sICh5IC0+IFByb21pc2UgeikpIC0+IChhIC0+IFByb21pc2UgeilcbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IGZ1bmN0aW9uc1xuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAc2VlIFIuY29tcG9zZVBcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICAvLyAgZm9sbG93ZXJzRm9yVXNlciA6OiBTdHJpbmcgLT4gUHJvbWlzZSBbVXNlcl1cbiAqICAgICAgdmFyIGZvbGxvd2Vyc0ZvclVzZXIgPSBSLnBpcGVQKGRiLmdldFVzZXJCeUlkLCBkYi5nZXRGb2xsb3dlcnMpO1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBpcGVQKCkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcigncGlwZVAgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50Jyk7XG4gIH1cbiAgcmV0dXJuIF9hcml0eShhcmd1bWVudHNbMF0ubGVuZ3RoLFxuICAgICAgICAgICAgICAgIHJlZHVjZShfcGlwZVAsIGFyZ3VtZW50c1swXSwgdGFpbChhcmd1bWVudHMpKSk7XG59O1xuIiwidmFyIHBpcGVQID0gcmVxdWlyZSgnLi9waXBlUCcpO1xudmFyIHJldmVyc2UgPSByZXF1aXJlKCcuL3JldmVyc2UnKTtcblxuXG4vKipcbiAqIFBlcmZvcm1zIHJpZ2h0LXRvLWxlZnQgY29tcG9zaXRpb24gb2Ygb25lIG9yIG1vcmUgUHJvbWlzZS1yZXR1cm5pbmdcbiAqIGZ1bmN0aW9ucy4gVGhlIHJpZ2h0bW9zdCBmdW5jdGlvbiBtYXkgaGF2ZSBhbnkgYXJpdHk7IHRoZSByZW1haW5pbmdcbiAqIGZ1bmN0aW9ucyBtdXN0IGJlIHVuYXJ5LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEwLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKHkgLT4gUHJvbWlzZSB6KSwgKHggLT4gUHJvbWlzZSB5KSwgLi4uLCAoYSAtPiBQcm9taXNlIGIpKSAtPiAoYSAtPiBQcm9taXNlIHopXG4gKiBAcGFyYW0gey4uLkZ1bmN0aW9ufSBmdW5jdGlvbnMgVGhlIGZ1bmN0aW9ucyB0byBjb21wb3NlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBzZWUgUi5waXBlUFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBkYiA9IHtcbiAqICAgICAgICB1c2Vyczoge1xuICogICAgICAgICAgSk9FOiB7XG4gKiAgICAgICAgICAgIG5hbWU6ICdKb2UnLFxuICogICAgICAgICAgICBmb2xsb3dlcnM6IFsnU1RFVkUnLCAnU1VaWSddXG4gKiAgICAgICAgICB9XG4gKiAgICAgICAgfVxuICogICAgICB9XG4gKlxuICogICAgICAvLyBXZSdsbCBwcmV0ZW5kIHRvIGRvIGEgZGIgbG9va3VwIHdoaWNoIHJldHVybnMgYSBwcm9taXNlXG4gKiAgICAgIHZhciBsb29rdXBVc2VyID0gKHVzZXJJZCkgPT4gUHJvbWlzZS5yZXNvbHZlKGRiLnVzZXJzW3VzZXJJZF0pXG4gKiAgICAgIHZhciBsb29rdXBGb2xsb3dlcnMgPSAodXNlcikgPT4gUHJvbWlzZS5yZXNvbHZlKHVzZXIuZm9sbG93ZXJzKVxuICogICAgICBsb29rdXBVc2VyKCdKT0UnKS50aGVuKGxvb2t1cEZvbGxvd2VycylcbiAqXG4gKiAgICAgIC8vICBmb2xsb3dlcnNGb3JVc2VyIDo6IFN0cmluZyAtPiBQcm9taXNlIFtVc2VySWRdXG4gKiAgICAgIHZhciBmb2xsb3dlcnNGb3JVc2VyID0gUi5jb21wb3NlUChsb29rdXBGb2xsb3dlcnMsIGxvb2t1cFVzZXIpO1xuICogICAgICBmb2xsb3dlcnNGb3JVc2VyKCdKT0UnKS50aGVuKGZvbGxvd2VycyA9PiBjb25zb2xlLmxvZygnRm9sbG93ZXJzOicsIGZvbGxvd2VycykpXG4gKiAgICAgIC8vIEZvbGxvd2VyczogW1wiU1RFVkVcIixcIlNVWllcIl1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb21wb3NlUCgpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbXBvc2VQIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBhcmd1bWVudCcpO1xuICB9XG4gIHJldHVybiBwaXBlUC5hcHBseSh0aGlzLCByZXZlcnNlKGFyZ3VtZW50cykpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2FycmF5RnJvbUl0ZXJhdG9yKGl0ZXIpIHtcbiAgdmFyIGxpc3QgPSBbXTtcbiAgdmFyIG5leHQ7XG4gIHdoaWxlICghKG5leHQgPSBpdGVyLm5leHQoKSkuZG9uZSkge1xuICAgIGxpc3QucHVzaChuZXh0LnZhbHVlKTtcbiAgfVxuICByZXR1cm4gbGlzdDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9mdW5jdGlvbk5hbWUoZikge1xuICAvLyBTdHJpbmcoeCA9PiB4KSBldmFsdWF0ZXMgdG8gXCJ4ID0+IHhcIiwgc28gdGhlIHBhdHRlcm4gbWF5IG5vdCBtYXRjaC5cbiAgdmFyIG1hdGNoID0gU3RyaW5nKGYpLm1hdGNoKC9eZnVuY3Rpb24gKFxcdyopLyk7XG4gIHJldHVybiBtYXRjaCA9PSBudWxsID8gJycgOiBtYXRjaFsxXTtcbn07XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGl0cyBhcmd1bWVudHMgYXJlIGlkZW50aWNhbCwgZmFsc2Ugb3RoZXJ3aXNlLiBWYWx1ZXMgYXJlXG4gKiBpZGVudGljYWwgaWYgdGhleSByZWZlcmVuY2UgdGhlIHNhbWUgbWVtb3J5LiBgTmFOYCBpcyBpZGVudGljYWwgdG8gYE5hTmA7XG4gKiBgMGAgYW5kIGAtMGAgYXJlIG5vdCBpZGVudGljYWwuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTUuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIGEgLT4gYSAtPiBCb29sZWFuXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgbyA9IHt9O1xuICogICAgICBSLmlkZW50aWNhbChvLCBvKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaWRlbnRpY2FsKDEsIDEpOyAvLz0+IHRydWVcbiAqICAgICAgUi5pZGVudGljYWwoMSwgJzEnKTsgLy89PiBmYWxzZVxuICogICAgICBSLmlkZW50aWNhbChbXSwgW10pOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaWRlbnRpY2FsKDAsIC0wKTsgLy89PiBmYWxzZVxuICogICAgICBSLmlkZW50aWNhbChOYU4sIE5hTik7IC8vPT4gdHJ1ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gaWRlbnRpY2FsKGEsIGIpIHtcbiAgLy8gU2FtZVZhbHVlIGFsZ29yaXRobVxuICBpZiAoYSA9PT0gYikgeyAvLyBTdGVwcyAxLTUsIDctMTBcbiAgICAvLyBTdGVwcyA2LmItNi5lOiArMCAhPSAtMFxuICAgIHJldHVybiBhICE9PSAwIHx8IDEgLyBhID09PSAxIC8gYjtcbiAgfSBlbHNlIHtcbiAgICAvLyBTdGVwIDYuYTogTmFOID09IE5hTlxuICAgIHJldHVybiBhICE9PSBhICYmIGIgIT09IGI7XG4gIH1cbn0pO1xuIiwidmFyIF9hcnJheUZyb21JdGVyYXRvciA9IHJlcXVpcmUoJy4vX2FycmF5RnJvbUl0ZXJhdG9yJyk7XG52YXIgX2Z1bmN0aW9uTmFtZSA9IHJlcXVpcmUoJy4vX2Z1bmN0aW9uTmFtZScpO1xudmFyIF9oYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBpZGVudGljYWwgPSByZXF1aXJlKCcuLi9pZGVudGljYWwnKTtcbnZhciBrZXlzID0gcmVxdWlyZSgnLi4va2V5cycpO1xudmFyIHR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfZXF1YWxzKGEsIGIsIHN0YWNrQSwgc3RhY2tCKSB7XG4gIGlmIChpZGVudGljYWwoYSwgYikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlKGEpICE9PSB0eXBlKGIpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIGEuZXF1YWxzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBiLmVxdWFscyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlb2YgYS5lcXVhbHMgPT09ICdmdW5jdGlvbicgJiYgYS5lcXVhbHMoYikgJiZcbiAgICAgICAgICAgdHlwZW9mIGIuZXF1YWxzID09PSAnZnVuY3Rpb24nICYmIGIuZXF1YWxzKGEpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKGEpKSB7XG4gICAgY2FzZSAnQXJndW1lbnRzJzpcbiAgICBjYXNlICdBcnJheSc6XG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIGlmICh0eXBlb2YgYS5jb25zdHJ1Y3RvciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICAgIF9mdW5jdGlvbk5hbWUoYS5jb25zdHJ1Y3RvcikgPT09ICdQcm9taXNlJykge1xuICAgICAgICByZXR1cm4gYSA9PT0gYjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgIGNhc2UgJ051bWJlcic6XG4gICAgY2FzZSAnU3RyaW5nJzpcbiAgICAgIGlmICghKHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBpZGVudGljYWwoYS52YWx1ZU9mKCksIGIudmFsdWVPZigpKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnRGF0ZSc6XG4gICAgICBpZiAoIWlkZW50aWNhbChhLnZhbHVlT2YoKSwgYi52YWx1ZU9mKCkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0Vycm9yJzpcbiAgICAgIHJldHVybiBhLm5hbWUgPT09IGIubmFtZSAmJiBhLm1lc3NhZ2UgPT09IGIubWVzc2FnZTtcbiAgICBjYXNlICdSZWdFeHAnOlxuICAgICAgaWYgKCEoYS5zb3VyY2UgPT09IGIuc291cmNlICYmXG4gICAgICAgICAgICBhLmdsb2JhbCA9PT0gYi5nbG9iYWwgJiZcbiAgICAgICAgICAgIGEuaWdub3JlQ2FzZSA9PT0gYi5pZ25vcmVDYXNlICYmXG4gICAgICAgICAgICBhLm11bHRpbGluZSA9PT0gYi5tdWx0aWxpbmUgJiZcbiAgICAgICAgICAgIGEuc3RpY2t5ID09PSBiLnN0aWNreSAmJlxuICAgICAgICAgICAgYS51bmljb2RlID09PSBiLnVuaWNvZGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ01hcCc6XG4gICAgY2FzZSAnU2V0JzpcbiAgICAgIGlmICghX2VxdWFscyhfYXJyYXlGcm9tSXRlcmF0b3IoYS5lbnRyaWVzKCkpLCBfYXJyYXlGcm9tSXRlcmF0b3IoYi5lbnRyaWVzKCkpLCBzdGFja0EsIHN0YWNrQikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnSW50OEFycmF5JzpcbiAgICBjYXNlICdVaW50OEFycmF5JzpcbiAgICBjYXNlICdVaW50OENsYW1wZWRBcnJheSc6XG4gICAgY2FzZSAnSW50MTZBcnJheSc6XG4gICAgY2FzZSAnVWludDE2QXJyYXknOlxuICAgIGNhc2UgJ0ludDMyQXJyYXknOlxuICAgIGNhc2UgJ1VpbnQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDMyQXJyYXknOlxuICAgIGNhc2UgJ0Zsb2F0NjRBcnJheSc6XG4gICAgICBicmVhaztcbiAgICBjYXNlICdBcnJheUJ1ZmZlcic6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gVmFsdWVzIG9mIG90aGVyIHR5cGVzIGFyZSBvbmx5IGVxdWFsIGlmIGlkZW50aWNhbC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBrZXlzQSA9IGtleXMoYSk7XG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXMoYikubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGlkeCA9IHN0YWNrQS5sZW5ndGggLSAxO1xuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICBpZiAoc3RhY2tBW2lkeF0gPT09IGEpIHtcbiAgICAgIHJldHVybiBzdGFja0JbaWR4XSA9PT0gYjtcbiAgICB9XG4gICAgaWR4IC09IDE7XG4gIH1cblxuICBzdGFja0EucHVzaChhKTtcbiAgc3RhY2tCLnB1c2goYik7XG4gIGlkeCA9IGtleXNBLmxlbmd0aCAtIDE7XG4gIHdoaWxlIChpZHggPj0gMCkge1xuICAgIHZhciBrZXkgPSBrZXlzQVtpZHhdO1xuICAgIGlmICghKF9oYXMoa2V5LCBiKSAmJiBfZXF1YWxzKGJba2V5XSwgYVtrZXldLCBzdGFja0EsIHN0YWNrQikpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlkeCAtPSAxO1xuICB9XG4gIHN0YWNrQS5wb3AoKTtcbiAgc3RhY2tCLnBvcCgpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIF9lcXVhbHMgPSByZXF1aXJlKCcuL2ludGVybmFsL19lcXVhbHMnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIGl0cyBhcmd1bWVudHMgYXJlIGVxdWl2YWxlbnQsIGBmYWxzZWAgb3RoZXJ3aXNlLiBIYW5kbGVzXG4gKiBjeWNsaWNhbCBkYXRhIHN0cnVjdHVyZXMuXG4gKlxuICogRGlzcGF0Y2hlcyBzeW1tZXRyaWNhbGx5IHRvIHRoZSBgZXF1YWxzYCBtZXRob2RzIG9mIGJvdGggYXJndW1lbnRzLCBpZlxuICogcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgYSAtPiBiIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuZXF1YWxzKDEsIDEpOyAvLz0+IHRydWVcbiAqICAgICAgUi5lcXVhbHMoMSwgJzEnKTsgLy89PiBmYWxzZVxuICogICAgICBSLmVxdWFscyhbMSwgMiwgM10sIFsxLCAyLCAzXSk7IC8vPT4gdHJ1ZVxuICpcbiAqICAgICAgdmFyIGEgPSB7fTsgYS52ID0gYTtcbiAqICAgICAgdmFyIGIgPSB7fTsgYi52ID0gYjtcbiAqICAgICAgUi5lcXVhbHMoYSwgYik7IC8vPT4gdHJ1ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIF9lcXVhbHMoYSwgYiwgW10sIFtdKTtcbn0pO1xuIiwidmFyIGVxdWFscyA9IHJlcXVpcmUoJy4uL2VxdWFscycpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2luZGV4T2YobGlzdCwgYSwgaWR4KSB7XG4gIHZhciBpbmYsIGl0ZW07XG4gIC8vIEFycmF5LnByb3RvdHlwZS5pbmRleE9mIGRvZXNuJ3QgZXhpc3QgYmVsb3cgSUU5XG4gIGlmICh0eXBlb2YgbGlzdC5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc3dpdGNoICh0eXBlb2YgYSkge1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgaWYgKGEgPT09IDApIHtcbiAgICAgICAgICAvLyBtYW51YWxseSBjcmF3bCB0aGUgbGlzdCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuICswIGFuZCAtMFxuICAgICAgICAgIGluZiA9IDEgLyBhO1xuICAgICAgICAgIHdoaWxlIChpZHggPCBsaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgaXRlbSA9IGxpc3RbaWR4XTtcbiAgICAgICAgICAgIGlmIChpdGVtID09PSAwICYmIDEgLyBpdGVtID09PSBpbmYpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGlkeDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlkeCArPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH0gZWxzZSBpZiAoYSAhPT0gYSkge1xuICAgICAgICAgIC8vIE5hTlxuICAgICAgICAgIHdoaWxlIChpZHggPCBsaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgaXRlbSA9IGxpc3RbaWR4XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ251bWJlcicgJiYgaXRlbSAhPT0gaXRlbSkge1xuICAgICAgICAgICAgICByZXR1cm4gaWR4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWR4ICs9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICAvLyBub24temVybyBudW1iZXJzIGNhbiB1dGlsaXNlIFNldFxuICAgICAgICByZXR1cm4gbGlzdC5pbmRleE9mKGEsIGlkeCk7XG5cbiAgICAgIC8vIGFsbCB0aGVzZSB0eXBlcyBjYW4gdXRpbGlzZSBTZXRcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIHJldHVybiBsaXN0LmluZGV4T2YoYSwgaWR4KTtcblxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgaWYgKGEgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBudWxsIGNhbiB1dGlsaXNlIFNldFxuICAgICAgICAgIHJldHVybiBsaXN0LmluZGV4T2YoYSwgaWR4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBhbnl0aGluZyBlbHNlIG5vdCBjb3ZlcmVkIGFib3ZlLCBkZWZlciB0byBSLmVxdWFsc1xuICB3aGlsZSAoaWR4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICBpZiAoZXF1YWxzKGxpc3RbaWR4XSwgYSkpIHtcbiAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiAtMTtcbn07XG4iLCJ2YXIgX2luZGV4T2YgPSByZXF1aXJlKCcuL19pbmRleE9mJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfY29udGFpbnMoYSwgbGlzdCkge1xuICByZXR1cm4gX2luZGV4T2YobGlzdCwgYSwgMCkgPj0gMDtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9xdW90ZShzKSB7XG4gIHZhciBlc2NhcGVkID0gc1xuICAgIC5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpXG4gICAgLnJlcGxhY2UoL1tcXGJdL2csICdcXFxcYicpICAvLyBcXGIgbWF0Y2hlcyB3b3JkIGJvdW5kYXJ5OyBbXFxiXSBtYXRjaGVzIGJhY2tzcGFjZVxuICAgIC5yZXBsYWNlKC9cXGYvZywgJ1xcXFxmJylcbiAgICAucmVwbGFjZSgvXFxuL2csICdcXFxcbicpXG4gICAgLnJlcGxhY2UoL1xcci9nLCAnXFxcXHInKVxuICAgIC5yZXBsYWNlKC9cXHQvZywgJ1xcXFx0JylcbiAgICAucmVwbGFjZSgvXFx2L2csICdcXFxcdicpXG4gICAgLnJlcGxhY2UoL1xcMC9nLCAnXFxcXDAnKTtcblxuICByZXR1cm4gJ1wiJyArIGVzY2FwZWQucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpICsgJ1wiJztcbn07XG4iLCIvKipcbiAqIFBvbHlmaWxsIGZyb20gPGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGUvdG9JU09TdHJpbmc+LlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgdmFyIHBhZCA9IGZ1bmN0aW9uIHBhZChuKSB7IHJldHVybiAobiA8IDEwID8gJzAnIDogJycpICsgbjsgfTtcblxuICByZXR1cm4gdHlwZW9mIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nID09PSAnZnVuY3Rpb24nID9cbiAgICBmdW5jdGlvbiBfdG9JU09TdHJpbmcoZCkge1xuICAgICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKTtcbiAgICB9IDpcbiAgICBmdW5jdGlvbiBfdG9JU09TdHJpbmcoZCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgZC5nZXRVVENGdWxsWWVhcigpICsgJy0nICtcbiAgICAgICAgcGFkKGQuZ2V0VVRDTW9udGgoKSArIDEpICsgJy0nICtcbiAgICAgICAgcGFkKGQuZ2V0VVRDRGF0ZSgpKSArICdUJyArXG4gICAgICAgIHBhZChkLmdldFVUQ0hvdXJzKCkpICsgJzonICtcbiAgICAgICAgcGFkKGQuZ2V0VVRDTWludXRlcygpKSArICc6JyArXG4gICAgICAgIHBhZChkLmdldFVUQ1NlY29uZHMoKSkgKyAnLicgK1xuICAgICAgICAoZC5nZXRVVENNaWxsaXNlY29uZHMoKSAvIDEwMDApLnRvRml4ZWQoMykuc2xpY2UoMiwgNSkgKyAnWidcbiAgICAgICk7XG4gICAgfTtcbn0oKSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9jb21wbGVtZW50KGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAhZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2ZpbHRlcihmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gW107XG5cbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGlmIChmbihsaXN0W2lkeF0pKSB7XG4gICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBsaXN0W2lkeF07XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfaXNPYmplY3QoeCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBPYmplY3RdJztcbn07XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vX2N1cnJ5MicpO1xudmFyIF94ZkJhc2UgPSByZXF1aXJlKCcuL194ZkJhc2UnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gWEZpbHRlcihmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICB9XG4gIFhGaWx0ZXIucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYRmlsdGVyLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gX3hmQmFzZS5yZXN1bHQ7XG4gIFhGaWx0ZXIucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24ocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLmYoaW5wdXQpID8gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KSA6IHJlc3VsdDtcbiAgfTtcblxuICByZXR1cm4gX2N1cnJ5MihmdW5jdGlvbiBfeGZpbHRlcihmLCB4ZikgeyByZXR1cm4gbmV3IFhGaWx0ZXIoZiwgeGYpOyB9KTtcbn0oKSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIF9kaXNwYXRjaGFibGUgPSByZXF1aXJlKCcuL2ludGVybmFsL19kaXNwYXRjaGFibGUnKTtcbnZhciBfZmlsdGVyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fZmlsdGVyJyk7XG52YXIgX2lzT2JqZWN0ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9faXNPYmplY3QnKTtcbnZhciBfcmVkdWNlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fcmVkdWNlJyk7XG52YXIgX3hmaWx0ZXIgPSByZXF1aXJlKCcuL2ludGVybmFsL194ZmlsdGVyJyk7XG52YXIga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG5cbi8qKlxuICogVGFrZXMgYSBwcmVkaWNhdGUgYW5kIGEgXCJmaWx0ZXJhYmxlXCIsIGFuZCByZXR1cm5zIGEgbmV3IGZpbHRlcmFibGUgb2YgdGhlXG4gKiBzYW1lIHR5cGUgY29udGFpbmluZyB0aGUgbWVtYmVycyBvZiB0aGUgZ2l2ZW4gZmlsdGVyYWJsZSB3aGljaCBzYXRpc2Z5IHRoZVxuICogZ2l2ZW4gcHJlZGljYXRlLlxuICpcbiAqIERpc3BhdGNoZXMgdG8gdGhlIGBmaWx0ZXJgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIEZpbHRlcmFibGUgZiA9PiAoYSAtPiBCb29sZWFuKSAtPiBmIGEgLT4gZiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkXG4gKiBAcGFyYW0ge0FycmF5fSBmaWx0ZXJhYmxlXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBzZWUgUi5yZWplY3QsIFIudHJhbnNkdWNlLCBSLmFkZEluZGV4XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGlzRXZlbiA9IG4gPT4gbiAlIDIgPT09IDA7XG4gKlxuICogICAgICBSLmZpbHRlcihpc0V2ZW4sIFsxLCAyLCAzLCA0XSk7IC8vPT4gWzIsIDRdXG4gKlxuICogICAgICBSLmZpbHRlcihpc0V2ZW4sIHthOiAxLCBiOiAyLCBjOiAzLCBkOiA0fSk7IC8vPT4ge2I6IDIsIGQ6IDR9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihfZGlzcGF0Y2hhYmxlKFsnZmlsdGVyJ10sIF94ZmlsdGVyLCBmdW5jdGlvbihwcmVkLCBmaWx0ZXJhYmxlKSB7XG4gIHJldHVybiAoXG4gICAgX2lzT2JqZWN0KGZpbHRlcmFibGUpID9cbiAgICAgIF9yZWR1Y2UoZnVuY3Rpb24oYWNjLCBrZXkpIHtcbiAgICAgICAgaWYgKHByZWQoZmlsdGVyYWJsZVtrZXldKSkge1xuICAgICAgICAgIGFjY1trZXldID0gZmlsdGVyYWJsZVtrZXldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSwga2V5cyhmaWx0ZXJhYmxlKSkgOlxuICAgIC8vIGVsc2VcbiAgICAgIF9maWx0ZXIocHJlZCwgZmlsdGVyYWJsZSlcbiAgKTtcbn0pKTtcbiIsInZhciBfY29tcGxlbWVudCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2NvbXBsZW1lbnQnKTtcbnZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgZmlsdGVyID0gcmVxdWlyZSgnLi9maWx0ZXInKTtcblxuXG4vKipcbiAqIFRoZSBjb21wbGVtZW50IG9mIGBmaWx0ZXJgLlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIEZpbHRlcmFibGUgZiA9PiAoYSAtPiBCb29sZWFuKSAtPiBmIGEgLT4gZiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkXG4gKiBAcGFyYW0ge0FycmF5fSBmaWx0ZXJhYmxlXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBzZWUgUi5maWx0ZXIsIFIudHJhbnNkdWNlLCBSLmFkZEluZGV4XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGlzT2RkID0gKG4pID0+IG4gJSAyID09PSAxO1xuICpcbiAqICAgICAgUi5yZWplY3QoaXNPZGQsIFsxLCAyLCAzLCA0XSk7IC8vPT4gWzIsIDRdXG4gKlxuICogICAgICBSLnJlamVjdChpc09kZCwge2E6IDEsIGI6IDIsIGM6IDMsIGQ6IDR9KTsgLy89PiB7YjogMiwgZDogNH1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIHJlamVjdChwcmVkLCBmaWx0ZXJhYmxlKSB7XG4gIHJldHVybiBmaWx0ZXIoX2NvbXBsZW1lbnQocHJlZCksIGZpbHRlcmFibGUpO1xufSk7XG4iLCJ2YXIgX2NvbnRhaW5zID0gcmVxdWlyZSgnLi9fY29udGFpbnMnKTtcbnZhciBfbWFwID0gcmVxdWlyZSgnLi9fbWFwJyk7XG52YXIgX3F1b3RlID0gcmVxdWlyZSgnLi9fcXVvdGUnKTtcbnZhciBfdG9JU09TdHJpbmcgPSByZXF1aXJlKCcuL190b0lTT1N0cmluZycpO1xudmFyIGtleXMgPSByZXF1aXJlKCcuLi9rZXlzJyk7XG52YXIgcmVqZWN0ID0gcmVxdWlyZSgnLi4vcmVqZWN0Jyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfdG9TdHJpbmcoeCwgc2Vlbikge1xuICB2YXIgcmVjdXIgPSBmdW5jdGlvbiByZWN1cih5KSB7XG4gICAgdmFyIHhzID0gc2Vlbi5jb25jYXQoW3hdKTtcbiAgICByZXR1cm4gX2NvbnRhaW5zKHksIHhzKSA/ICc8Q2lyY3VsYXI+JyA6IF90b1N0cmluZyh5LCB4cyk7XG4gIH07XG5cbiAgLy8gIG1hcFBhaXJzIDo6IChPYmplY3QsIFtTdHJpbmddKSAtPiBbU3RyaW5nXVxuICB2YXIgbWFwUGFpcnMgPSBmdW5jdGlvbihvYmosIGtleXMpIHtcbiAgICByZXR1cm4gX21hcChmdW5jdGlvbihrKSB7IHJldHVybiBfcXVvdGUoaykgKyAnOiAnICsgcmVjdXIob2JqW2tdKTsgfSwga2V5cy5zbGljZSgpLnNvcnQoKSk7XG4gIH07XG5cbiAgc3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCkpIHtcbiAgICBjYXNlICdbb2JqZWN0IEFyZ3VtZW50c10nOlxuICAgICAgcmV0dXJuICcoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oJyArIF9tYXAocmVjdXIsIHgpLmpvaW4oJywgJykgKyAnKSknO1xuICAgIGNhc2UgJ1tvYmplY3QgQXJyYXldJzpcbiAgICAgIHJldHVybiAnWycgKyBfbWFwKHJlY3VyLCB4KS5jb25jYXQobWFwUGFpcnMoeCwgcmVqZWN0KGZ1bmN0aW9uKGspIHsgcmV0dXJuIC9eXFxkKyQvLnRlc3Qoayk7IH0sIGtleXMoeCkpKSkuam9pbignLCAnKSArICddJztcbiAgICBjYXNlICdbb2JqZWN0IEJvb2xlYW5dJzpcbiAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgPyAnbmV3IEJvb2xlYW4oJyArIHJlY3VyKHgudmFsdWVPZigpKSArICcpJyA6IHgudG9TdHJpbmcoKTtcbiAgICBjYXNlICdbb2JqZWN0IERhdGVdJzpcbiAgICAgIHJldHVybiAnbmV3IERhdGUoJyArIChpc05hTih4LnZhbHVlT2YoKSkgPyByZWN1cihOYU4pIDogX3F1b3RlKF90b0lTT1N0cmluZyh4KSkpICsgJyknO1xuICAgIGNhc2UgJ1tvYmplY3QgTnVsbF0nOlxuICAgICAgcmV0dXJuICdudWxsJztcbiAgICBjYXNlICdbb2JqZWN0IE51bWJlcl0nOlxuICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnb2JqZWN0JyA/ICduZXcgTnVtYmVyKCcgKyByZWN1cih4LnZhbHVlT2YoKSkgKyAnKScgOiAxIC8geCA9PT0gLUluZmluaXR5ID8gJy0wJyA6IHgudG9TdHJpbmcoMTApO1xuICAgIGNhc2UgJ1tvYmplY3QgU3RyaW5nXSc6XG4gICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdvYmplY3QnID8gJ25ldyBTdHJpbmcoJyArIHJlY3VyKHgudmFsdWVPZigpKSArICcpJyA6IF9xdW90ZSh4KTtcbiAgICBjYXNlICdbb2JqZWN0IFVuZGVmaW5lZF0nOlxuICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodHlwZW9mIHgudG9TdHJpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIHJlcHIgPSB4LnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChyZXByICE9PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgICAgIHJldHVybiByZXByO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gJ3snICsgbWFwUGFpcnMoeCwga2V5cyh4KSkuam9pbignLCAnKSArICd9JztcbiAgfVxufTtcbiIsInZhciBfY3VycnkxID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkxJyk7XG52YXIgX3RvU3RyaW5nID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fdG9TdHJpbmcnKTtcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdmFsdWUuIGBldmFsYCdpbmcgdGhlIG91dHB1dFxuICogc2hvdWxkIHJlc3VsdCBpbiBhIHZhbHVlIGVxdWl2YWxlbnQgdG8gdGhlIGlucHV0IHZhbHVlLiBNYW55IG9mIHRoZSBidWlsdC1pblxuICogYHRvU3RyaW5nYCBtZXRob2RzIGRvIG5vdCBzYXRpc2Z5IHRoaXMgcmVxdWlyZW1lbnQuXG4gKlxuICogSWYgdGhlIGdpdmVuIHZhbHVlIGlzIGFuIGBbb2JqZWN0IE9iamVjdF1gIHdpdGggYSBgdG9TdHJpbmdgIG1ldGhvZCBvdGhlclxuICogdGhhbiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AsIHRoaXMgbWV0aG9kIGlzIGludm9rZWQgd2l0aCBubyBhcmd1bWVudHNcbiAqIHRvIHByb2R1Y2UgdGhlIHJldHVybiB2YWx1ZS4gVGhpcyBtZWFucyB1c2VyLWRlZmluZWQgY29uc3RydWN0b3IgZnVuY3Rpb25zXG4gKiBjYW4gcHJvdmlkZSBhIHN1aXRhYmxlIGB0b1N0cmluZ2AgbWV0aG9kLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgZnVuY3Rpb24gUG9pbnQoeCwgeSkge1xuICogICAgICAgdGhpcy54ID0geDtcbiAqICAgICAgIHRoaXMueSA9IHk7XG4gKiAgICAgfVxuICpcbiAqICAgICBQb2ludC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAqICAgICAgIHJldHVybiAnbmV3IFBvaW50KCcgKyB0aGlzLnggKyAnLCAnICsgdGhpcy55ICsgJyknO1xuICogICAgIH07XG4gKlxuICogICAgIFIudG9TdHJpbmcobmV3IFBvaW50KDEsIDIpKTsgLy89PiAnbmV3IFBvaW50KDEsIDIpJ1xuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE0LjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBzaWcgKiAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7Kn0gdmFsXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi50b1N0cmluZyg0Mik7IC8vPT4gJzQyJ1xuICogICAgICBSLnRvU3RyaW5nKCdhYmMnKTsgLy89PiAnXCJhYmNcIidcbiAqICAgICAgUi50b1N0cmluZyhbMSwgMiwgM10pOyAvLz0+ICdbMSwgMiwgM10nXG4gKiAgICAgIFIudG9TdHJpbmcoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9KTsgLy89PiAne1wiYmFyXCI6IDIsIFwiYmF6XCI6IDMsIFwiZm9vXCI6IDF9J1xuICogICAgICBSLnRvU3RyaW5nKG5ldyBEYXRlKCcyMDAxLTAyLTAzVDA0OjA1OjA2WicpKTsgLy89PiAnbmV3IERhdGUoXCIyMDAxLTAyLTAzVDA0OjA1OjA2LjAwMFpcIiknXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MShmdW5jdGlvbiB0b1N0cmluZyh2YWwpIHsgcmV0dXJuIF90b1N0cmluZyh2YWwsIFtdKTsgfSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIF9pc0FycmF5ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9faXNBcnJheScpO1xudmFyIF9pc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9faXNGdW5jdGlvbicpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi90b1N0cmluZycpO1xuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbmNhdGVuYXRpbmcgdGhlIGdpdmVuIGxpc3RzIG9yIHN0cmluZ3MuXG4gKlxuICogTm90ZTogYFIuY29uY2F0YCBleHBlY3RzIGJvdGggYXJndW1lbnRzIHRvIGJlIG9mIHRoZSBzYW1lIHR5cGUsXG4gKiB1bmxpa2UgdGhlIG5hdGl2ZSBgQXJyYXkucHJvdG90eXBlLmNvbmNhdGAgbWV0aG9kLiBJdCB3aWxsIHRocm93XG4gKiBhbiBlcnJvciBpZiB5b3UgYGNvbmNhdGAgYW4gQXJyYXkgd2l0aCBhIG5vbi1BcnJheSB2YWx1ZS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgY29uY2F0YCBtZXRob2Qgb2YgdGhlIGZpcnN0IGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW2FdIC0+IFthXSAtPiBbYV1cbiAqIEBzaWcgU3RyaW5nIC0+IFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSBmaXJzdExpc3QgVGhlIGZpcnN0IGxpc3RcbiAqIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSBzZWNvbmRMaXN0IFRoZSBzZWNvbmQgbGlzdFxuICogQHJldHVybiB7QXJyYXl8U3RyaW5nfSBBIGxpc3QgY29uc2lzdGluZyBvZiB0aGUgZWxlbWVudHMgb2YgYGZpcnN0TGlzdGAgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzIG9mXG4gKiBgc2Vjb25kTGlzdGAuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuY29uY2F0KCdBQkMnLCAnREVGJyk7IC8vICdBQkNERUYnXG4gKiAgICAgIFIuY29uY2F0KFs0LCA1LCA2XSwgWzEsIDIsIDNdKTsgLy89PiBbNCwgNSwgNiwgMSwgMiwgM11cbiAqICAgICAgUi5jb25jYXQoW10sIFtdKTsgLy89PiBbXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gY29uY2F0KGEsIGIpIHtcbiAgaWYgKGEgPT0gbnVsbCB8fCAhX2lzRnVuY3Rpb24oYS5jb25jYXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcih0b1N0cmluZyhhKSArICcgZG9lcyBub3QgaGF2ZSBhIG1ldGhvZCBuYW1lZCBcImNvbmNhdFwiJyk7XG4gIH1cbiAgaWYgKF9pc0FycmF5KGEpICYmICFfaXNBcnJheShiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IodG9TdHJpbmcoYikgKyAnIGlzIG5vdCBhbiBhcnJheScpO1xuICB9XG4gIHJldHVybiBhLmNvbmNhdChiKTtcbn0pO1xuIiwidmFyIF9hcml0eSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2FyaXR5Jyk7XG52YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xudmFyIG1hcCA9IHJlcXVpcmUoJy4vbWFwJyk7XG52YXIgbWF4ID0gcmVxdWlyZSgnLi9tYXgnKTtcbnZhciByZWR1Y2UgPSByZXF1aXJlKCcuL3JlZHVjZScpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uLCBgZm5gLCB3aGljaCBlbmNhcHN1bGF0ZXMgYGlmL2Vsc2UsIGlmL2Vsc2UsIC4uLmAgbG9naWMuXG4gKiBgUi5jb25kYCB0YWtlcyBhIGxpc3Qgb2YgW3ByZWRpY2F0ZSwgdHJhbnNmb3JtZXJdIHBhaXJzLiBBbGwgb2YgdGhlIGFyZ3VtZW50c1xuICogdG8gYGZuYCBhcmUgYXBwbGllZCB0byBlYWNoIG9mIHRoZSBwcmVkaWNhdGVzIGluIHR1cm4gdW50aWwgb25lIHJldHVybnMgYVxuICogXCJ0cnV0aHlcIiB2YWx1ZSwgYXQgd2hpY2ggcG9pbnQgYGZuYCByZXR1cm5zIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgaXRzXG4gKiBhcmd1bWVudHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdHJhbnNmb3JtZXIuIElmIG5vbmUgb2YgdGhlIHByZWRpY2F0ZXNcbiAqIG1hdGNoZXMsIGBmbmAgcmV0dXJucyB1bmRlZmluZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuNi4wXG4gKiBAY2F0ZWdvcnkgTG9naWNcbiAqIEBzaWcgW1soKi4uLiAtPiBCb29sZWFuKSwoKi4uLiAtPiAqKV1dIC0+ICgqLi4uIC0+ICopXG4gKiBAcGFyYW0ge0FycmF5fSBwYWlycyBBIGxpc3Qgb2YgW3ByZWRpY2F0ZSwgdHJhbnNmb3JtZXJdXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgZm4gPSBSLmNvbmQoW1xuICogICAgICAgIFtSLmVxdWFscygwKSwgICBSLmFsd2F5cygnd2F0ZXIgZnJlZXplcyBhdCAwwrBDJyldLFxuICogICAgICAgIFtSLmVxdWFscygxMDApLCBSLmFsd2F5cygnd2F0ZXIgYm9pbHMgYXQgMTAwwrBDJyldLFxuICogICAgICAgIFtSLlQsICAgICAgICAgICB0ZW1wID0+ICdub3RoaW5nIHNwZWNpYWwgaGFwcGVucyBhdCAnICsgdGVtcCArICfCsEMnXVxuICogICAgICBdKTtcbiAqICAgICAgZm4oMCk7IC8vPT4gJ3dhdGVyIGZyZWV6ZXMgYXQgMMKwQydcbiAqICAgICAgZm4oNTApOyAvLz0+ICdub3RoaW5nIHNwZWNpYWwgaGFwcGVucyBhdCA1MMKwQydcbiAqICAgICAgZm4oMTAwKTsgLy89PiAnd2F0ZXIgYm9pbHMgYXQgMTAwwrBDJ1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoZnVuY3Rpb24gY29uZChwYWlycykge1xuICB2YXIgYXJpdHkgPSByZWR1Y2UobWF4LFxuICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgIG1hcChmdW5jdGlvbihwYWlyKSB7IHJldHVybiBwYWlyWzBdLmxlbmd0aDsgfSwgcGFpcnMpKTtcbiAgcmV0dXJuIF9hcml0eShhcml0eSwgZnVuY3Rpb24oKSB7XG4gICAgdmFyIGlkeCA9IDA7XG4gICAgd2hpbGUgKGlkeCA8IHBhaXJzLmxlbmd0aCkge1xuICAgICAgaWYgKHBhaXJzW2lkeF1bMF0uYXBwbHkodGhpcywgYXJndW1lbnRzKSkge1xuICAgICAgICByZXR1cm4gcGFpcnNbaWR4XVsxXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgICAgaWR4ICs9IDE7XG4gICAgfVxuICB9KTtcbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcbnZhciBjdXJyeSA9IHJlcXVpcmUoJy4vY3VycnknKTtcbnZhciBuQXJ5ID0gcmVxdWlyZSgnLi9uQXJ5Jyk7XG5cblxuLyoqXG4gKiBXcmFwcyBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGluc2lkZSBhIGN1cnJpZWQgZnVuY3Rpb24gdGhhdCBjYW4gYmUgY2FsbGVkXG4gKiB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cyBhbmQgcmV0dXJucyB0aGUgc2FtZSB0eXBlLiBUaGUgYXJpdHkgb2YgdGhlIGZ1bmN0aW9uXG4gKiByZXR1cm5lZCBpcyBzcGVjaWZpZWQgdG8gYWxsb3cgdXNpbmcgdmFyaWFkaWMgY29uc3RydWN0b3IgZnVuY3Rpb25zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjQuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIE51bWJlciAtPiAoKiAtPiB7Kn0pIC0+ICgqIC0+IHsqfSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBuIFRoZSBhcml0eSBvZiB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBGbiBUaGUgY29uc3RydWN0b3IgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHdyYXBwZWQsIGN1cnJpZWQgY29uc3RydWN0b3IgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgLy8gVmFyaWFkaWMgQ29uc3RydWN0b3IgZnVuY3Rpb25cbiAqICAgICAgZnVuY3Rpb24gU2FsYWQoKSB7XG4gKiAgICAgICAgdGhpcy5pbmdyZWRpZW50cyA9IGFyZ3VtZW50cztcbiAqICAgICAgfTtcbiAqICAgICAgU2FsYWQucHJvdG90eXBlLnJlY2lwZSA9IGZ1bmN0aW9uKCkge1xuICogICAgICAgIHZhciBpbnN0cnVjdGlvbnMgPSBSLm1hcCgoaW5ncmVkaWVudCkgPT4gKFxuICogICAgICAgICAgJ0FkZCBhIHdob2xsb3Agb2YgJyArIGluZ3JlZGllbnQsIHRoaXMuaW5ncmVkaWVudHMpXG4gKiAgICAgICAgKVxuICogICAgICAgIHJldHVybiBSLmpvaW4oJ1xcbicsIGluc3RydWN0aW9ucylcbiAqICAgICAgfVxuICpcbiAqICAgICAgdmFyIFRocmVlTGF5ZXJTYWxhZCA9IFIuY29uc3RydWN0TigzLCBTYWxhZClcbiAqXG4gKiAgICAgIC8vIE5vdGljZSB3ZSBubyBsb25nZXIgbmVlZCB0aGUgJ25ldycga2V5d29yZCwgYW5kIHRoZSBjb25zdHJ1Y3RvciBpcyBjdXJyaWVkIGZvciAzIGFyZ3VtZW50cy5cbiAqICAgICAgdmFyIHNhbGFkID0gVGhyZWVMYXllclNhbGFkKCdNYXlvbm5haXNlJykoJ1BvdGF0byBDaGlwcycpKCdLZXRjaHVwJylcbiAqICAgICAgY29uc29sZS5sb2coc2FsYWQucmVjaXBlKCkpO1xuICogICAgICAvLyBBZGQgYSB3aG9sbG9wIG9mIE1heW9ubmFpc2VcbiAqICAgICAgLy8gQWRkIGEgd2hvbGxvcCBvZiBQb3RhdG8gQ2hpcHNcbiAqICAgICAgLy8gQWRkIGEgd2hvbGxvcCBvZiBQb3RhdG8gS2V0Y2h1cFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gY29uc3RydWN0TihuLCBGbikge1xuICBpZiAobiA+IDEwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb25zdHJ1Y3RvciB3aXRoIGdyZWF0ZXIgdGhhbiB0ZW4gYXJndW1lbnRzJyk7XG4gIH1cbiAgaWYgKG4gPT09IDApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgRm4oKTsgfTtcbiAgfVxuICByZXR1cm4gY3VycnkobkFyeShuLCBmdW5jdGlvbigkMCwgJDEsICQyLCAkMywgJDQsICQ1LCAkNiwgJDcsICQ4LCAkOSkge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgY2FzZSAgMTogcmV0dXJuIG5ldyBGbigkMCk7XG4gICAgICBjYXNlICAyOiByZXR1cm4gbmV3IEZuKCQwLCAkMSk7XG4gICAgICBjYXNlICAzOiByZXR1cm4gbmV3IEZuKCQwLCAkMSwgJDIpO1xuICAgICAgY2FzZSAgNDogcmV0dXJuIG5ldyBGbigkMCwgJDEsICQyLCAkMyk7XG4gICAgICBjYXNlICA1OiByZXR1cm4gbmV3IEZuKCQwLCAkMSwgJDIsICQzLCAkNCk7XG4gICAgICBjYXNlICA2OiByZXR1cm4gbmV3IEZuKCQwLCAkMSwgJDIsICQzLCAkNCwgJDUpO1xuICAgICAgY2FzZSAgNzogcmV0dXJuIG5ldyBGbigkMCwgJDEsICQyLCAkMywgJDQsICQ1LCAkNik7XG4gICAgICBjYXNlICA4OiByZXR1cm4gbmV3IEZuKCQwLCAkMSwgJDIsICQzLCAkNCwgJDUsICQ2LCAkNyk7XG4gICAgICBjYXNlICA5OiByZXR1cm4gbmV3IEZuKCQwLCAkMSwgJDIsICQzLCAkNCwgJDUsICQ2LCAkNywgJDgpO1xuICAgICAgY2FzZSAxMDogcmV0dXJuIG5ldyBGbigkMCwgJDEsICQyLCAkMywgJDQsICQ1LCAkNiwgJDcsICQ4LCAkOSk7XG4gICAgfVxuICB9KSk7XG59KTtcbiIsInZhciBfY3VycnkxID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkxJyk7XG52YXIgY29uc3RydWN0TiA9IHJlcXVpcmUoJy4vY29uc3RydWN0TicpO1xuXG5cbi8qKlxuICogV3JhcHMgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBpbnNpZGUgYSBjdXJyaWVkIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGNhbGxlZFxuICogd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMgYW5kIHJldHVybnMgdGhlIHNhbWUgdHlwZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKiAtPiB7Kn0pIC0+ICgqIC0+IHsqfSlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB0byB3cmFwLlxuICogQHJldHVybiB7RnVuY3Rpb259IEEgd3JhcHBlZCwgY3VycmllZCBjb25zdHJ1Y3RvciBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvblxuICogICAgICBmdW5jdGlvbiBBbmltYWwoa2luZCkge1xuICogICAgICAgIHRoaXMua2luZCA9IGtpbmQ7XG4gKiAgICAgIH07XG4gKiAgICAgIEFuaW1hbC5wcm90b3R5cGUuc2lnaHRpbmcgPSBmdW5jdGlvbigpIHtcbiAqICAgICAgICByZXR1cm4gXCJJdCdzIGEgXCIgKyB0aGlzLmtpbmQgKyBcIiFcIjtcbiAqICAgICAgfVxuICpcbiAqICAgICAgdmFyIEFuaW1hbENvbnN0cnVjdG9yID0gUi5jb25zdHJ1Y3QoQW5pbWFsKVxuICpcbiAqICAgICAgLy8gTm90aWNlIHdlIG5vIGxvbmdlciBuZWVkIHRoZSAnbmV3JyBrZXl3b3JkOlxuICogICAgICBBbmltYWxDb25zdHJ1Y3RvcignUGlnJyk7IC8vPT4ge1wia2luZFwiOiBcIlBpZ1wiLCBcInNpZ2h0aW5nXCI6IGZ1bmN0aW9uICgpey4uLn19O1xuICpcbiAqICAgICAgdmFyIGFuaW1hbFR5cGVzID0gW1wiTGlvblwiLCBcIlRpZ2VyXCIsIFwiQmVhclwiXTtcbiAqICAgICAgdmFyIGFuaW1hbFNpZ2h0aW5nID0gUi5pbnZva2VyKDAsICdzaWdodGluZycpO1xuICogICAgICB2YXIgc2lnaHROZXdBbmltYWwgPSBSLmNvbXBvc2UoYW5pbWFsU2lnaHRpbmcsIEFuaW1hbENvbnN0cnVjdG9yKTtcbiAqICAgICAgUi5tYXAoc2lnaHROZXdBbmltYWwsIGFuaW1hbFR5cGVzKTsgLy89PiBbXCJJdCdzIGEgTGlvbiFcIiwgXCJJdCdzIGEgVGlnZXIhXCIsIFwiSXQncyBhIEJlYXIhXCJdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MShmdW5jdGlvbiBjb25zdHJ1Y3QoRm4pIHtcbiAgcmV0dXJuIGNvbnN0cnVjdE4oRm4ubGVuZ3RoLCBGbik7XG59KTtcbiIsInZhciBfY29udGFpbnMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jb250YWlucycpO1xudmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgZXF1YWwsIGluIGBSLmVxdWFsc2AgdGVybXMsIHRvIGF0XG4gKiBsZWFzdCBvbmUgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gbGlzdDsgYGZhbHNlYCBvdGhlcndpc2UuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IFthXSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge09iamVjdH0gYSBUaGUgaXRlbSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiBhbiBlcXVpdmFsZW50IGl0ZW0gaXMgaW4gdGhlIGxpc3QsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICogQHNlZSBSLmFueVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuY29udGFpbnMoMywgWzEsIDIsIDNdKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuY29udGFpbnMoNCwgWzEsIDIsIDNdKTsgLy89PiBmYWxzZVxuICogICAgICBSLmNvbnRhaW5zKHsgbmFtZTogJ0ZyZWQnIH0sIFt7IG5hbWU6ICdGcmVkJyB9XSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmNvbnRhaW5zKFs0Ml0sIFtbNDJdXSk7IC8vPT4gdHJ1ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoX2NvbnRhaW5zKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX21hcCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX21hcCcpO1xudmFyIGN1cnJ5TiA9IHJlcXVpcmUoJy4vY3VycnlOJyk7XG52YXIgbWF4ID0gcmVxdWlyZSgnLi9tYXgnKTtcbnZhciBwbHVjayA9IHJlcXVpcmUoJy4vcGx1Y2snKTtcbnZhciByZWR1Y2UgPSByZXF1aXJlKCcuL3JlZHVjZScpO1xuXG5cbi8qKlxuICogQWNjZXB0cyBhIGNvbnZlcmdpbmcgZnVuY3Rpb24gYW5kIGEgbGlzdCBvZiBicmFuY2hpbmcgZnVuY3Rpb25zIGFuZCByZXR1cm5zXG4gKiBhIG5ldyBmdW5jdGlvbi4gV2hlbiBpbnZva2VkLCB0aGlzIG5ldyBmdW5jdGlvbiBpcyBhcHBsaWVkIHRvIHNvbWVcbiAqIGFyZ3VtZW50cywgZWFjaCBicmFuY2hpbmcgZnVuY3Rpb24gaXMgYXBwbGllZCB0byB0aG9zZSBzYW1lIGFyZ3VtZW50cy4gVGhlXG4gKiByZXN1bHRzIG9mIGVhY2ggYnJhbmNoaW5nIGZ1bmN0aW9uIGFyZSBwYXNzZWQgYXMgYXJndW1lbnRzIHRvIHRoZSBjb252ZXJnaW5nXG4gKiBmdW5jdGlvbiB0byBwcm9kdWNlIHRoZSByZXR1cm4gdmFsdWUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuNC4yXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKHgxIC0+IHgyIC0+IC4uLiAtPiB6KSAtPiBbKGEgLT4gYiAtPiAuLi4gLT4geDEpLCAoYSAtPiBiIC0+IC4uLiAtPiB4MiksIC4uLl0gLT4gKGEgLT4gYiAtPiAuLi4gLT4geilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGFmdGVyIEEgZnVuY3Rpb24uIGBhZnRlcmAgd2lsbCBiZSBpbnZva2VkIHdpdGggdGhlIHJldHVybiB2YWx1ZXMgb2ZcbiAqICAgICAgICBgZm4xYCBhbmQgYGZuMmAgYXMgaXRzIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7QXJyYXl9IGZ1bmN0aW9ucyBBIGxpc3Qgb2YgZnVuY3Rpb25zLlxuICogQHJldHVybiB7RnVuY3Rpb259IEEgbmV3IGZ1bmN0aW9uLlxuICogQHNlZSBSLnVzZVdpdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgYXZlcmFnZSA9IFIuY29udmVyZ2UoUi5kaXZpZGUsIFtSLnN1bSwgUi5sZW5ndGhdKVxuICogICAgICBhdmVyYWdlKFsxLCAyLCAzLCA0LCA1LCA2LCA3XSkgLy89PiA0XG4gKlxuICogICAgICB2YXIgc3RyYW5nZUNvbmNhdCA9IFIuY29udmVyZ2UoUi5jb25jYXQsIFtSLnRvVXBwZXIsIFIudG9Mb3dlcl0pXG4gKiAgICAgIHN0cmFuZ2VDb25jYXQoXCJZb2RlbFwiKSAvLz0+IFwiWU9ERUx5b2RlbFwiXG4gKlxuICogQHN5bWIgUi5jb252ZXJnZShmLCBbZywgaF0pKGEsIGIpID0gZihnKGEsIGIpLCBoKGEsIGIpKVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gY29udmVyZ2UoYWZ0ZXIsIGZucykge1xuICByZXR1cm4gY3VycnlOKHJlZHVjZShtYXgsIDAsIHBsdWNrKCdsZW5ndGgnLCBmbnMpKSwgZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgIHJldHVybiBhZnRlci5hcHBseShjb250ZXh0LCBfbWFwKGZ1bmN0aW9uKGZuKSB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgfSwgZm5zKSk7XG4gIH0pO1xufSk7XG4iLCJ2YXIgX2N1cnJ5TiA9IHJlcXVpcmUoJy4vX2N1cnJ5TicpO1xudmFyIF9oYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBfeGZCYXNlID0gcmVxdWlyZSgnLi9feGZCYXNlJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIFhSZWR1Y2VCeSh2YWx1ZUZuLCB2YWx1ZUFjYywga2V5Rm4sIHhmKSB7XG4gICAgdGhpcy52YWx1ZUZuID0gdmFsdWVGbjtcbiAgICB0aGlzLnZhbHVlQWNjID0gdmFsdWVBY2M7XG4gICAgdGhpcy5rZXlGbiA9IGtleUZuO1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmlucHV0cyA9IHt9O1xuICB9XG4gIFhSZWR1Y2VCeS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhSZWR1Y2VCeS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgIHZhciBrZXk7XG4gICAgZm9yIChrZXkgaW4gdGhpcy5pbnB1dHMpIHtcbiAgICAgIGlmIChfaGFzKGtleSwgdGhpcy5pbnB1dHMpKSB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCB0aGlzLmlucHV0c1trZXldKTtcbiAgICAgICAgaWYgKHJlc3VsdFsnQEB0cmFuc2R1Y2VyL3JlZHVjZWQnXSkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdFsnQEB0cmFuc2R1Y2VyL3ZhbHVlJ107XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5pbnB1dHMgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10ocmVzdWx0KTtcbiAgfTtcbiAgWFJlZHVjZUJ5LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uKHJlc3VsdCwgaW5wdXQpIHtcbiAgICB2YXIga2V5ID0gdGhpcy5rZXlGbihpbnB1dCk7XG4gICAgdGhpcy5pbnB1dHNba2V5XSA9IHRoaXMuaW5wdXRzW2tleV0gfHwgW2tleSwgdGhpcy52YWx1ZUFjY107XG4gICAgdGhpcy5pbnB1dHNba2V5XVsxXSA9IHRoaXMudmFsdWVGbih0aGlzLmlucHV0c1trZXldWzFdLCBpbnB1dCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICByZXR1cm4gX2N1cnJ5Tig0LCBbXSxcbiAgICAgICAgICAgICAgICAgZnVuY3Rpb24gX3hyZWR1Y2VCeSh2YWx1ZUZuLCB2YWx1ZUFjYywga2V5Rm4sIHhmKSB7XG4gICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYUmVkdWNlQnkodmFsdWVGbiwgdmFsdWVBY2MsIGtleUZuLCB4Zik7XG4gICAgICAgICAgICAgICAgIH0pO1xufSgpKTtcbiIsInZhciBfY3VycnlOID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnlOJyk7XG52YXIgX2Rpc3BhdGNoYWJsZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZScpO1xudmFyIF9oYXMgPSByZXF1aXJlKCcuL2ludGVybmFsL19oYXMnKTtcbnZhciBfcmVkdWNlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fcmVkdWNlJyk7XG52YXIgX3hyZWR1Y2VCeSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX3hyZWR1Y2VCeScpO1xuXG5cbi8qKlxuICogR3JvdXBzIHRoZSBlbGVtZW50cyBvZiB0aGUgbGlzdCBhY2NvcmRpbmcgdG8gdGhlIHJlc3VsdCBvZiBjYWxsaW5nXG4gKiB0aGUgU3RyaW5nLXJldHVybmluZyBmdW5jdGlvbiBga2V5Rm5gIG9uIGVhY2ggZWxlbWVudCBhbmQgcmVkdWNlcyB0aGUgZWxlbWVudHNcbiAqIG9mIGVhY2ggZ3JvdXAgdG8gYSBzaW5nbGUgdmFsdWUgdmlhIHRoZSByZWR1Y2VyIGZ1bmN0aW9uIGB2YWx1ZUZuYC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBhIG1vcmUgZ2VuZXJhbCBgZ3JvdXBCeWAgZnVuY3Rpb24uXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIwLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnICgoYSwgYikgLT4gYSkgLT4gYSAtPiAoYiAtPiBTdHJpbmcpIC0+IFtiXSAtPiB7U3RyaW5nOiBhfVxuICogQHBhcmFtIHtGdW5jdGlvbn0gdmFsdWVGbiBUaGUgZnVuY3Rpb24gdGhhdCByZWR1Y2VzIHRoZSBlbGVtZW50cyBvZiBlYWNoIGdyb3VwIHRvIGEgc2luZ2xlXG4gKiAgICAgICAgdmFsdWUuIFJlY2VpdmVzIHR3byB2YWx1ZXMsIGFjY3VtdWxhdG9yIGZvciBhIHBhcnRpY3VsYXIgZ3JvdXAgYW5kIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gKiBAcGFyYW0geyp9IGFjYyBUaGUgKGluaXRpYWwpIGFjY3VtdWxhdG9yIHZhbHVlIGZvciBlYWNoIGdyb3VwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5Rm4gVGhlIGZ1bmN0aW9uIHRoYXQgbWFwcyB0aGUgbGlzdCdzIGVsZW1lbnQgaW50byBhIGtleS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGdyb3VwLlxuICogQHJldHVybiB7T2JqZWN0fSBBbiBvYmplY3Qgd2l0aCB0aGUgb3V0cHV0IG9mIGBrZXlGbmAgZm9yIGtleXMsIG1hcHBlZCB0byB0aGUgb3V0cHV0IG9mXG4gKiAgICAgICAgIGB2YWx1ZUZuYCBmb3IgZWxlbWVudHMgd2hpY2ggcHJvZHVjZWQgdGhhdCBrZXkgd2hlbiBwYXNzZWQgdG8gYGtleUZuYC5cbiAqIEBzZWUgUi5ncm91cEJ5LCBSLnJlZHVjZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciByZWR1Y2VUb05hbWVzQnkgPSBSLnJlZHVjZUJ5KChhY2MsIHN0dWRlbnQpID0+IGFjYy5jb25jYXQoc3R1ZGVudC5uYW1lKSwgW10pO1xuICogICAgICB2YXIgbmFtZXNCeUdyYWRlID0gcmVkdWNlVG9OYW1lc0J5KGZ1bmN0aW9uKHN0dWRlbnQpIHtcbiAqICAgICAgICB2YXIgc2NvcmUgPSBzdHVkZW50LnNjb3JlO1xuICogICAgICAgIHJldHVybiBzY29yZSA8IDY1ID8gJ0YnIDpcbiAqICAgICAgICAgICAgICAgc2NvcmUgPCA3MCA/ICdEJyA6XG4gKiAgICAgICAgICAgICAgIHNjb3JlIDwgODAgPyAnQycgOlxuICogICAgICAgICAgICAgICBzY29yZSA8IDkwID8gJ0InIDogJ0EnO1xuICogICAgICB9KTtcbiAqICAgICAgdmFyIHN0dWRlbnRzID0gW3tuYW1lOiAnTHVjeScsIHNjb3JlOiA5Mn0sXG4gKiAgICAgICAgICAgICAgICAgICAgICB7bmFtZTogJ0RyZXcnLCBzY29yZTogODV9LFxuICogICAgICAgICAgICAgICAgICAgICAgLy8gLi4uXG4gKiAgICAgICAgICAgICAgICAgICAgICB7bmFtZTogJ0JhcnQnLCBzY29yZTogNjJ9XTtcbiAqICAgICAgbmFtZXNCeUdyYWRlKHN0dWRlbnRzKTtcbiAqICAgICAgLy8ge1xuICogICAgICAvLyAgICdBJzogWydMdWN5J10sXG4gKiAgICAgIC8vICAgJ0InOiBbJ0RyZXcnXVxuICogICAgICAvLyAgIC8vIC4uLixcbiAqICAgICAgLy8gICAnRic6IFsnQmFydCddXG4gKiAgICAgIC8vIH1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnlOKDQsIFtdLCBfZGlzcGF0Y2hhYmxlKFtdLCBfeHJlZHVjZUJ5LFxuICBmdW5jdGlvbiByZWR1Y2VCeSh2YWx1ZUZuLCB2YWx1ZUFjYywga2V5Rm4sIGxpc3QpIHtcbiAgICByZXR1cm4gX3JlZHVjZShmdW5jdGlvbihhY2MsIGVsdCkge1xuICAgICAgdmFyIGtleSA9IGtleUZuKGVsdCk7XG4gICAgICBhY2Nba2V5XSA9IHZhbHVlRm4oX2hhcyhrZXksIGFjYykgPyBhY2Nba2V5XSA6IHZhbHVlQWNjLCBlbHQpO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSwgbGlzdCk7XG4gIH0pKTtcbiIsInZhciByZWR1Y2VCeSA9IHJlcXVpcmUoJy4vcmVkdWNlQnknKTtcblxuXG4vKipcbiAqIENvdW50cyB0aGUgZWxlbWVudHMgb2YgYSBsaXN0IGFjY29yZGluZyB0byBob3cgbWFueSBtYXRjaCBlYWNoIHZhbHVlIG9mIGFcbiAqIGtleSBnZW5lcmF0ZWQgYnkgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uLiBSZXR1cm5zIGFuIG9iamVjdCBtYXBwaW5nIHRoZSBrZXlzXG4gKiBwcm9kdWNlZCBieSBgZm5gIHRvIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgaW4gdGhlIGxpc3QuIE5vdGUgdGhhdCBhbGxcbiAqIGtleXMgYXJlIGNvZXJjZWQgdG8gc3RyaW5ncyBiZWNhdXNlIG9mIGhvdyBKYXZhU2NyaXB0IG9iamVjdHMgd29yay5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgKGEgLT4gU3RyaW5nKSAtPiBbYV0gLT4geyp9XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdXNlZCB0byBtYXAgdmFsdWVzIHRvIGtleXMuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIGNvdW50IGVsZW1lbnRzIGZyb20uXG4gKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCBtYXBwaW5nIGtleXMgdG8gbnVtYmVyIG9mIG9jY3VycmVuY2VzIGluIHRoZSBsaXN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBudW1iZXJzID0gWzEuMCwgMS4xLCAxLjIsIDIuMCwgMy4wLCAyLjJdO1xuICogICAgICBSLmNvdW50QnkoTWF0aC5mbG9vcikobnVtYmVycyk7ICAgIC8vPT4geycxJzogMywgJzInOiAyLCAnMyc6IDF9XG4gKlxuICogICAgICB2YXIgbGV0dGVycyA9IFsnYScsICdiJywgJ0EnLCAnYScsICdCJywgJ2MnXTtcbiAqICAgICAgUi5jb3VudEJ5KFIudG9Mb3dlcikobGV0dGVycyk7ICAgLy89PiB7J2EnOiAzLCAnYic6IDIsICdjJzogMX1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSByZWR1Y2VCeShmdW5jdGlvbihhY2MsIGVsZW0pIHsgcmV0dXJuIGFjYyArIDE7IH0sIDApO1xuIiwidmFyIGFkZCA9IHJlcXVpcmUoJy4vYWRkJyk7XG5cblxuLyoqXG4gKiBEZWNyZW1lbnRzIGl0cyBhcmd1bWVudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC45LjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IG4gLSAxXG4gKiBAc2VlIFIuaW5jXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5kZWMoNDIpOyAvLz0+IDQxXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gYWRkKC0xKTtcbiIsInZhciBfY3VycnkzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkzJyk7XG5cblxuLyoqXG4gKiBNYWtlcyBhIGRlc2NlbmRpbmcgY29tcGFyYXRvciBmdW5jdGlvbiBvdXQgb2YgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSB2YWx1ZVxuICogdGhhdCBjYW4gYmUgY29tcGFyZWQgd2l0aCBgPGAgYW5kIGA+YC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yMy4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgT3JkIGIgPT4gKGEgLT4gYikgLT4gYSAtPiBhIC0+IE51bWJlclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gQSBmdW5jdGlvbiBvZiBhcml0eSBvbmUgdGhhdCByZXR1cm5zIGEgdmFsdWUgdGhhdCBjYW4gYmUgY29tcGFyZWRcbiAqIEBwYXJhbSB7Kn0gYSBUaGUgZmlyc3QgaXRlbSB0byBiZSBjb21wYXJlZC5cbiAqIEBwYXJhbSB7Kn0gYiBUaGUgc2Vjb25kIGl0ZW0gdG8gYmUgY29tcGFyZWQuXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IGAtMWAgaWYgZm4oYSkgPiBmbihiKSwgYDFgIGlmIGZuKGIpID4gZm4oYSksIG90aGVyd2lzZSBgMGBcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgYnlBZ2UgPSBSLmRlc2NlbmQoUi5wcm9wKCdhZ2UnKSk7XG4gKiAgICAgIHZhciBwZW9wbGUgPSBbXG4gKiAgICAgICAgLy8gLi4uXG4gKiAgICAgIF07XG4gKiAgICAgIHZhciBwZW9wbGVCeU9sZGVzdEZpcnN0ID0gUi5zb3J0KGJ5QWdlLCBwZW9wbGUpO1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTMoZnVuY3Rpb24gZGVzY2VuZChmbiwgYSwgYikge1xuICB2YXIgYWEgPSBmbihhKTtcbiAgdmFyIGJiID0gZm4oYik7XG4gIHJldHVybiBhYSA+IGJiID8gLTEgOiBhYSA8IGJiID8gMSA6IDA7XG59KTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzZWNvbmQgYXJndW1lbnQgaWYgaXQgaXMgbm90IGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYE5hTmBcbiAqIG90aGVyd2lzZSB0aGUgZmlyc3QgYXJndW1lbnQgaXMgcmV0dXJuZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTAuMFxuICogQGNhdGVnb3J5IExvZ2ljXG4gKiBAc2lnIGEgLT4gYiAtPiBhIHwgYlxuICogQHBhcmFtIHthfSBkZWZhdWx0IFRoZSBkZWZhdWx0IHZhbHVlLlxuICogQHBhcmFtIHtifSB2YWwgYHZhbGAgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkIG9mIGBkZWZhdWx0YCB1bmxlc3MgYHZhbGAgaXMgYG51bGxgLCBgdW5kZWZpbmVkYCBvciBgTmFOYC5cbiAqIEByZXR1cm4geyp9IFRoZSBzZWNvbmQgdmFsdWUgaWYgaXQgaXMgbm90IGBudWxsYCwgYHVuZGVmaW5lZGAgb3IgYE5hTmAsIG90aGVyd2lzZSB0aGUgZGVmYXVsdCB2YWx1ZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBkZWZhdWx0VG80MiA9IFIuZGVmYXVsdFRvKDQyKTtcbiAqXG4gKiAgICAgIGRlZmF1bHRUbzQyKG51bGwpOyAgLy89PiA0MlxuICogICAgICBkZWZhdWx0VG80Mih1bmRlZmluZWQpOyAgLy89PiA0MlxuICogICAgICBkZWZhdWx0VG80MignUmFtZGEnKTsgIC8vPT4gJ1JhbWRhJ1xuICogICAgICAvLyBwYXJzZUludCgnc3RyaW5nJykgcmVzdWx0cyBpbiBOYU5cbiAqICAgICAgZGVmYXVsdFRvNDIocGFyc2VJbnQoJ3N0cmluZycpKTsgLy89PiA0MlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gZGVmYXVsdFRvKGQsIHYpIHtcbiAgcmV0dXJuIHYgPT0gbnVsbCB8fCB2ICE9PSB2ID8gZCA6IHY7XG59KTtcbiIsInZhciBfY29udGFpbnMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jb250YWlucycpO1xudmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIEZpbmRzIHRoZSBzZXQgKGkuZS4gbm8gZHVwbGljYXRlcykgb2YgYWxsIGVsZW1lbnRzIGluIHRoZSBmaXJzdCBsaXN0IG5vdFxuICogY29udGFpbmVkIGluIHRoZSBzZWNvbmQgbGlzdC4gT2JqZWN0cyBhbmQgQXJyYXlzIGFyZSBjb21wYXJlZCBhcmUgY29tcGFyZWRcbiAqIGluIHRlcm1zIG9mIHZhbHVlIGVxdWFsaXR5LCBub3QgcmVmZXJlbmNlIGVxdWFsaXR5LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIFsqXSAtPiBbKl0gLT4gWypdXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MSBUaGUgZmlyc3QgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QyIFRoZSBzZWNvbmQgbGlzdC5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgZWxlbWVudHMgaW4gYGxpc3QxYCB0aGF0IGFyZSBub3QgaW4gYGxpc3QyYC5cbiAqIEBzZWUgUi5kaWZmZXJlbmNlV2l0aCwgUi5zeW1tZXRyaWNEaWZmZXJlbmNlLCBSLnN5bW1ldHJpY0RpZmZlcmVuY2VXaXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5kaWZmZXJlbmNlKFsxLDIsMyw0XSwgWzcsNiw1LDQsM10pOyAvLz0+IFsxLDJdXG4gKiAgICAgIFIuZGlmZmVyZW5jZShbNyw2LDUsNCwzXSwgWzEsMiwzLDRdKTsgLy89PiBbNyw2LDVdXG4gKiAgICAgIFIuZGlmZmVyZW5jZShbe2E6IDF9LCB7YjogMn1dLCBbe2E6IDF9LCB7YzogM31dKSAvLz0+IFt7YjogMn1dXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBkaWZmZXJlbmNlKGZpcnN0LCBzZWNvbmQpIHtcbiAgdmFyIG91dCA9IFtdO1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGZpcnN0TGVuID0gZmlyc3QubGVuZ3RoO1xuICB3aGlsZSAoaWR4IDwgZmlyc3RMZW4pIHtcbiAgICBpZiAoIV9jb250YWlucyhmaXJzdFtpZHhdLCBzZWNvbmQpICYmICFfY29udGFpbnMoZmlyc3RbaWR4XSwgb3V0KSkge1xuICAgICAgb3V0W291dC5sZW5ndGhdID0gZmlyc3RbaWR4XTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfY29udGFpbnNXaXRoKHByZWQsIHgsIGxpc3QpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBsaXN0Lmxlbmd0aDtcblxuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgaWYgKHByZWQoeCwgbGlzdFtpZHhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG4iLCJ2YXIgX2NvbnRhaW5zV2l0aCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2NvbnRhaW5zV2l0aCcpO1xudmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcblxuXG4vKipcbiAqIEZpbmRzIHRoZSBzZXQgKGkuZS4gbm8gZHVwbGljYXRlcykgb2YgYWxsIGVsZW1lbnRzIGluIHRoZSBmaXJzdCBsaXN0IG5vdFxuICogY29udGFpbmVkIGluIHRoZSBzZWNvbmQgbGlzdC4gRHVwbGljYXRpb24gaXMgZGV0ZXJtaW5lZCBhY2NvcmRpbmcgdG8gdGhlXG4gKiB2YWx1ZSByZXR1cm5lZCBieSBhcHBseWluZyB0aGUgc3VwcGxpZWQgcHJlZGljYXRlIHRvIHR3byBsaXN0IGVsZW1lbnRzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnICgoYSwgYSkgLT4gQm9vbGVhbikgLT4gW2FdIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgQSBwcmVkaWNhdGUgdXNlZCB0byB0ZXN0IHdoZXRoZXIgdHdvIGl0ZW1zIGFyZSBlcXVhbC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QxIFRoZSBmaXJzdCBsaXN0LlxuICogQHBhcmFtIHtBcnJheX0gbGlzdDIgVGhlIHNlY29uZCBsaXN0LlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBlbGVtZW50cyBpbiBgbGlzdDFgIHRoYXQgYXJlIG5vdCBpbiBgbGlzdDJgLlxuICogQHNlZSBSLmRpZmZlcmVuY2UsIFIuc3ltbWV0cmljRGlmZmVyZW5jZSwgUi5zeW1tZXRyaWNEaWZmZXJlbmNlV2l0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBjbXAgPSAoeCwgeSkgPT4geC5hID09PSB5LmE7XG4gKiAgICAgIHZhciBsMSA9IFt7YTogMX0sIHthOiAyfSwge2E6IDN9XTtcbiAqICAgICAgdmFyIGwyID0gW3thOiAzfSwge2E6IDR9XTtcbiAqICAgICAgUi5kaWZmZXJlbmNlV2l0aChjbXAsIGwxLCBsMik7IC8vPT4gW3thOiAxfSwge2E6IDJ9XVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTMoZnVuY3Rpb24gZGlmZmVyZW5jZVdpdGgocHJlZCwgZmlyc3QsIHNlY29uZCkge1xuICB2YXIgb3V0ID0gW107XG4gIHZhciBpZHggPSAwO1xuICB2YXIgZmlyc3RMZW4gPSBmaXJzdC5sZW5ndGg7XG4gIHdoaWxlIChpZHggPCBmaXJzdExlbikge1xuICAgIGlmICghX2NvbnRhaW5zV2l0aChwcmVkLCBmaXJzdFtpZHhdLCBzZWNvbmQpICYmXG4gICAgICAgICFfY29udGFpbnNXaXRoKHByZWQsIGZpcnN0W2lkeF0sIG91dCkpIHtcbiAgICAgIG91dC5wdXNoKGZpcnN0W2lkeF0pO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gb3V0O1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIG5ldyBvYmplY3QgdGhhdCBkb2VzIG5vdCBjb250YWluIGEgYHByb3BgIHByb3BlcnR5LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEwLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgU3RyaW5nIC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBkaXNzb2NpYXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2xvbmVcbiAqIEByZXR1cm4ge09iamVjdH0gQSBuZXcgb2JqZWN0IGVxdWl2YWxlbnQgdG8gdGhlIG9yaWdpbmFsIGJ1dCB3aXRob3V0IHRoZSBzcGVjaWZpZWQgcHJvcGVydHlcbiAqIEBzZWUgUi5hc3NvY1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuZGlzc29jKCdiJywge2E6IDEsIGI6IDIsIGM6IDN9KTsgLy89PiB7YTogMSwgYzogM31cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIGRpc3NvYyhwcm9wLCBvYmopIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIG9iaikge1xuICAgIHJlc3VsdFtwXSA9IG9ialtwXTtcbiAgfVxuICBkZWxldGUgcmVzdWx0W3Byb3BdO1xuICByZXR1cm4gcmVzdWx0O1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIGFzc29jID0gcmVxdWlyZSgnLi9hc3NvYycpO1xudmFyIGRpc3NvYyA9IHJlcXVpcmUoJy4vZGlzc29jJyk7XG5cblxuLyoqXG4gKiBNYWtlcyBhIHNoYWxsb3cgY2xvbmUgb2YgYW4gb2JqZWN0LCBvbWl0dGluZyB0aGUgcHJvcGVydHkgYXQgdGhlIGdpdmVuIHBhdGguXG4gKiBOb3RlIHRoYXQgdGhpcyBjb3BpZXMgYW5kIGZsYXR0ZW5zIHByb3RvdHlwZSBwcm9wZXJ0aWVzIG9udG8gdGhlIG5ldyBvYmplY3RcbiAqIGFzIHdlbGwuIEFsbCBub24tcHJpbWl0aXZlIHByb3BlcnRpZXMgYXJlIGNvcGllZCBieSByZWZlcmVuY2UuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyBbU3RyaW5nXSAtPiB7azogdn0gLT4ge2s6IHZ9XG4gKiBAcGFyYW0ge0FycmF5fSBwYXRoIFRoZSBwYXRoIHRvIHRoZSB2YWx1ZSB0byBvbWl0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2xvbmVcbiAqIEByZXR1cm4ge09iamVjdH0gQSBuZXcgb2JqZWN0IHdpdGhvdXQgdGhlIHByb3BlcnR5IGF0IHBhdGhcbiAqIEBzZWUgUi5hc3NvY1BhdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmRpc3NvY1BhdGgoWydhJywgJ2InLCAnYyddLCB7YToge2I6IHtjOiA0Mn19fSk7IC8vPT4ge2E6IHtiOiB7fX19XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBkaXNzb2NQYXRoKHBhdGgsIG9iaikge1xuICBzd2l0Y2ggKHBhdGgubGVuZ3RoKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIG9iajtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gZGlzc29jKHBhdGhbMF0sIG9iaik7XG4gICAgZGVmYXVsdDpcbiAgICAgIHZhciBoZWFkID0gcGF0aFswXTtcbiAgICAgIHZhciB0YWlsID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocGF0aCwgMSk7XG4gICAgICByZXR1cm4gb2JqW2hlYWRdID09IG51bGwgPyBvYmogOiBhc3NvYyhoZWFkLCBkaXNzb2NQYXRoKHRhaWwsIG9ialtoZWFkXSksIG9iaik7XG4gIH1cbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIERpdmlkZXMgdHdvIG51bWJlcnMuIEVxdWl2YWxlbnQgdG8gYGEgLyBiYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gTnVtYmVyXG4gKiBAcGFyYW0ge051bWJlcn0gYSBUaGUgZmlyc3QgdmFsdWUuXG4gKiBAcGFyYW0ge051bWJlcn0gYiBUaGUgc2Vjb25kIHZhbHVlLlxuICogQHJldHVybiB7TnVtYmVyfSBUaGUgcmVzdWx0IG9mIGBhIC8gYmAuXG4gKiBAc2VlIFIubXVsdGlwbHlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmRpdmlkZSg3MSwgMTAwKTsgLy89PiAwLjcxXG4gKlxuICogICAgICB2YXIgaGFsZiA9IFIuZGl2aWRlKFIuX18sIDIpO1xuICogICAgICBoYWxmKDQyKTsgLy89PiAyMVxuICpcbiAqICAgICAgdmFyIHJlY2lwcm9jYWwgPSBSLmRpdmlkZSgxKTtcbiAqICAgICAgcmVjaXByb2NhbCg0KTsgICAvLz0+IDAuMjVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIGRpdmlkZShhLCBiKSB7IHJldHVybiBhIC8gYjsgfSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vX2N1cnJ5MicpO1xudmFyIF94ZkJhc2UgPSByZXF1aXJlKCcuL194ZkJhc2UnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gWERyb3AobiwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5uID0gbjtcbiAgfVxuICBYRHJvcC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhEcm9wLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gX3hmQmFzZS5yZXN1bHQ7XG4gIFhEcm9wLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uKHJlc3VsdCwgaW5wdXQpIHtcbiAgICBpZiAodGhpcy5uID4gMCkge1xuICAgICAgdGhpcy5uIC09IDE7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KTtcbiAgfTtcblxuICByZXR1cm4gX2N1cnJ5MihmdW5jdGlvbiBfeGRyb3AobiwgeGYpIHsgcmV0dXJuIG5ldyBYRHJvcChuLCB4Zik7IH0pO1xufSgpKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2Rpc3BhdGNoYWJsZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZScpO1xudmFyIF94ZHJvcCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX3hkcm9wJyk7XG52YXIgc2xpY2UgPSByZXF1aXJlKCcuL3NsaWNlJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFsbCBidXQgdGhlIGZpcnN0IGBuYCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gbGlzdCwgc3RyaW5nLCBvclxuICogdHJhbnNkdWNlci90cmFuc2Zvcm1lciAob3Igb2JqZWN0IHdpdGggYSBgZHJvcGAgbWV0aG9kKS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgZHJvcGAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gW2FdIC0+IFthXVxuICogQHNpZyBOdW1iZXIgLT4gU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHtOdW1iZXJ9IG5cbiAqIEBwYXJhbSB7W2FdfSBsaXN0XG4gKiBAcmV0dXJuIHtbYV19IEEgY29weSBvZiBsaXN0IHdpdGhvdXQgdGhlIGZpcnN0IGBuYCBlbGVtZW50c1xuICogQHNlZSBSLnRha2UsIFIudHJhbnNkdWNlLCBSLmRyb3BMYXN0LCBSLmRyb3BXaGlsZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuZHJvcCgxLCBbJ2ZvbycsICdiYXInLCAnYmF6J10pOyAvLz0+IFsnYmFyJywgJ2JheiddXG4gKiAgICAgIFIuZHJvcCgyLCBbJ2ZvbycsICdiYXInLCAnYmF6J10pOyAvLz0+IFsnYmF6J11cbiAqICAgICAgUi5kcm9wKDMsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gW11cbiAqICAgICAgUi5kcm9wKDQsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gW11cbiAqICAgICAgUi5kcm9wKDMsICdyYW1kYScpOyAgICAgICAgICAgICAgIC8vPT4gJ2RhJ1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoX2Rpc3BhdGNoYWJsZShbJ2Ryb3AnXSwgX3hkcm9wLCBmdW5jdGlvbiBkcm9wKG4sIHhzKSB7XG4gIHJldHVybiBzbGljZShNYXRoLm1heCgwLCBuKSwgSW5maW5pdHksIHhzKTtcbn0pKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9fY3VycnkyJyk7XG52YXIgX3JlZHVjZWQgPSByZXF1aXJlKCcuL19yZWR1Y2VkJyk7XG52YXIgX3hmQmFzZSA9IHJlcXVpcmUoJy4vX3hmQmFzZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gWFRha2UobiwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5uID0gbjtcbiAgICB0aGlzLmkgPSAwO1xuICB9XG4gIFhUYWtlLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcbiAgWFRha2UucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBfeGZCYXNlLnJlc3VsdDtcbiAgWFRha2UucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24ocmVzdWx0LCBpbnB1dCkge1xuICAgIHRoaXMuaSArPSAxO1xuICAgIHZhciByZXQgPSB0aGlzLm4gPT09IDAgPyByZXN1bHQgOiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgaW5wdXQpO1xuICAgIHJldHVybiB0aGlzLmkgPj0gdGhpcy5uID8gX3JlZHVjZWQocmV0KSA6IHJldDtcbiAgfTtcblxuICByZXR1cm4gX2N1cnJ5MihmdW5jdGlvbiBfeHRha2UobiwgeGYpIHsgcmV0dXJuIG5ldyBYVGFrZShuLCB4Zik7IH0pO1xufSgpKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2Rpc3BhdGNoYWJsZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZScpO1xudmFyIF94dGFrZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX3h0YWtlJyk7XG52YXIgc2xpY2UgPSByZXF1aXJlKCcuL3NsaWNlJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBgbmAgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGxpc3QsIHN0cmluZywgb3JcbiAqIHRyYW5zZHVjZXIvdHJhbnNmb3JtZXIgKG9yIG9iamVjdCB3aXRoIGEgYHRha2VgIG1ldGhvZCkuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYHRha2VgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgTnVtYmVyIC0+IFthXSAtPiBbYV1cbiAqIEBzaWcgTnVtYmVyIC0+IFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gKiBAcGFyYW0geyp9IGxpc3RcbiAqIEByZXR1cm4geyp9XG4gKiBAc2VlIFIuZHJvcFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudGFrZSgxLCBbJ2ZvbycsICdiYXInLCAnYmF6J10pOyAvLz0+IFsnZm9vJ11cbiAqICAgICAgUi50YWtlKDIsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydmb28nLCAnYmFyJ11cbiAqICAgICAgUi50YWtlKDMsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydmb28nLCAnYmFyJywgJ2JheiddXG4gKiAgICAgIFIudGFrZSg0LCBbJ2ZvbycsICdiYXInLCAnYmF6J10pOyAvLz0+IFsnZm9vJywgJ2JhcicsICdiYXonXVxuICogICAgICBSLnRha2UoMywgJ3JhbWRhJyk7ICAgICAgICAgICAgICAgLy89PiAncmFtJ1xuICpcbiAqICAgICAgdmFyIHBlcnNvbm5lbCA9IFtcbiAqICAgICAgICAnRGF2ZSBCcnViZWNrJyxcbiAqICAgICAgICAnUGF1bCBEZXNtb25kJyxcbiAqICAgICAgICAnRXVnZW5lIFdyaWdodCcsXG4gKiAgICAgICAgJ0pvZSBNb3JlbGxvJyxcbiAqICAgICAgICAnR2VycnkgTXVsbGlnYW4nLFxuICogICAgICAgICdCb2IgQmF0ZXMnLFxuICogICAgICAgICdKb2UgRG9kZ2UnLFxuICogICAgICAgICdSb24gQ3JvdHR5J1xuICogICAgICBdO1xuICpcbiAqICAgICAgdmFyIHRha2VGaXZlID0gUi50YWtlKDUpO1xuICogICAgICB0YWtlRml2ZShwZXJzb25uZWwpO1xuICogICAgICAvLz0+IFsnRGF2ZSBCcnViZWNrJywgJ1BhdWwgRGVzbW9uZCcsICdFdWdlbmUgV3JpZ2h0JywgJ0pvZSBNb3JlbGxvJywgJ0dlcnJ5IE11bGxpZ2FuJ11cbiAqIEBzeW1iIFIudGFrZSgtMSwgW2EsIGJdKSA9IFthLCBiXVxuICogQHN5bWIgUi50YWtlKDAsIFthLCBiXSkgPSBbXVxuICogQHN5bWIgUi50YWtlKDEsIFthLCBiXSkgPSBbYV1cbiAqIEBzeW1iIFIudGFrZSgyLCBbYSwgYl0pID0gW2EsIGJdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihfZGlzcGF0Y2hhYmxlKFsndGFrZSddLCBfeHRha2UsIGZ1bmN0aW9uIHRha2UobiwgeHMpIHtcbiAgcmV0dXJuIHNsaWNlKDAsIG4gPCAwID8gSW5maW5pdHkgOiBuLCB4cyk7XG59KSk7XG4iLCJ2YXIgdGFrZSA9IHJlcXVpcmUoJy4uL3Rha2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkcm9wTGFzdChuLCB4cykge1xuICByZXR1cm4gdGFrZShuIDwgeHMubGVuZ3RoID8geHMubGVuZ3RoIC0gbiA6IDAsIHhzKTtcbn07XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vX2N1cnJ5MicpO1xudmFyIF94ZkJhc2UgPSByZXF1aXJlKCcuL194ZkJhc2UnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gWERyb3BMYXN0KG4sIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMucG9zID0gMDtcbiAgICB0aGlzLmZ1bGwgPSBmYWxzZTtcbiAgICB0aGlzLmFjYyA9IG5ldyBBcnJheShuKTtcbiAgfVxuICBYRHJvcExhc3QucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYRHJvcExhc3QucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSAgZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgdGhpcy5hY2MgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10ocmVzdWx0KTtcbiAgfTtcbiAgWERyb3BMYXN0LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uKHJlc3VsdCwgaW5wdXQpIHtcbiAgICBpZiAodGhpcy5mdWxsKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdGhpcy5hY2NbdGhpcy5wb3NdKTtcbiAgICB9XG4gICAgdGhpcy5zdG9yZShpbnB1dCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgWERyb3BMYXN0LnByb3RvdHlwZS5zdG9yZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgdGhpcy5hY2NbdGhpcy5wb3NdID0gaW5wdXQ7XG4gICAgdGhpcy5wb3MgKz0gMTtcbiAgICBpZiAodGhpcy5wb3MgPT09IHRoaXMuYWNjLmxlbmd0aCkge1xuICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgdGhpcy5mdWxsID0gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIF9jdXJyeTIoZnVuY3Rpb24gX3hkcm9wTGFzdChuLCB4ZikgeyByZXR1cm4gbmV3IFhEcm9wTGFzdChuLCB4Zik7IH0pO1xufSgpKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2Rpc3BhdGNoYWJsZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZScpO1xudmFyIF9kcm9wTGFzdCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2Ryb3BMYXN0Jyk7XG52YXIgX3hkcm9wTGFzdCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX3hkcm9wTGFzdCcpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIGxpc3QgY29udGFpbmluZyBhbGwgYnV0IHRoZSBsYXN0IGBuYCBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gYGxpc3RgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIE51bWJlciAtPiBbYV0gLT4gW2FdXG4gKiBAc2lnIE51bWJlciAtPiBTdHJpbmcgLT4gU3RyaW5nXG4gKiBAcGFyYW0ge051bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIGBsaXN0YCB0byBza2lwLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCBvZiBlbGVtZW50cyB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBBIGNvcHkgb2YgdGhlIGxpc3Qgd2l0aCBvbmx5IHRoZSBmaXJzdCBgbGlzdC5sZW5ndGggLSBuYCBlbGVtZW50c1xuICogQHNlZSBSLnRha2VMYXN0LCBSLmRyb3AsIFIuZHJvcFdoaWxlLCBSLmRyb3BMYXN0V2hpbGVcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmRyb3BMYXN0KDEsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydmb28nLCAnYmFyJ11cbiAqICAgICAgUi5kcm9wTGFzdCgyLCBbJ2ZvbycsICdiYXInLCAnYmF6J10pOyAvLz0+IFsnZm9vJ11cbiAqICAgICAgUi5kcm9wTGFzdCgzLCBbJ2ZvbycsICdiYXInLCAnYmF6J10pOyAvLz0+IFtdXG4gKiAgICAgIFIuZHJvcExhc3QoNCwgWydmb28nLCAnYmFyJywgJ2JheiddKTsgLy89PiBbXVxuICogICAgICBSLmRyb3BMYXN0KDMsICdyYW1kYScpOyAgICAgICAgICAgICAgIC8vPT4gJ3JhJ1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoX2Rpc3BhdGNoYWJsZShbXSwgX3hkcm9wTGFzdCwgX2Ryb3BMYXN0KSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRyb3BMYXN0V2hpbGUocHJlZCwgbGlzdCkge1xuICB2YXIgaWR4ID0gbGlzdC5sZW5ndGggLSAxO1xuICB3aGlsZSAoaWR4ID49IDAgJiYgcHJlZChsaXN0W2lkeF0pKSB7XG4gICAgaWR4IC09IDE7XG4gIH1cbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIDAsIGlkeCArIDEpO1xufTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9fY3VycnkyJyk7XG52YXIgX3JlZHVjZSA9IHJlcXVpcmUoJy4vX3JlZHVjZScpO1xudmFyIF94ZkJhc2UgPSByZXF1aXJlKCcuL194ZkJhc2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIFhEcm9wTGFzdFdoaWxlKGZuLCB4Zikge1xuICAgIHRoaXMuZiA9IGZuO1xuICAgIHRoaXMucmV0YWluZWQgPSBbXTtcbiAgICB0aGlzLnhmID0geGY7XG4gIH1cbiAgWERyb3BMYXN0V2hpbGUucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYRHJvcExhc3RXaGlsZS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgIHRoaXMucmV0YWluZWQgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10ocmVzdWx0KTtcbiAgfTtcbiAgWERyb3BMYXN0V2hpbGUucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvc3RlcCddID0gZnVuY3Rpb24ocmVzdWx0LCBpbnB1dCkge1xuICAgIHJldHVybiB0aGlzLmYoaW5wdXQpID8gdGhpcy5yZXRhaW4ocmVzdWx0LCBpbnB1dClcbiAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZmx1c2gocmVzdWx0LCBpbnB1dCk7XG4gIH07XG4gIFhEcm9wTGFzdFdoaWxlLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKHJlc3VsdCwgaW5wdXQpIHtcbiAgICByZXN1bHQgPSBfcmVkdWNlKFxuICAgICAgdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSxcbiAgICAgIHJlc3VsdCxcbiAgICAgIHRoaXMucmV0YWluZWRcbiAgICApO1xuICAgIHRoaXMucmV0YWluZWQgPSBbXTtcbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KTtcbiAgfTtcbiAgWERyb3BMYXN0V2hpbGUucHJvdG90eXBlLnJldGFpbiA9IGZ1bmN0aW9uKHJlc3VsdCwgaW5wdXQpIHtcbiAgICB0aGlzLnJldGFpbmVkLnB1c2goaW5wdXQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgcmV0dXJuIF9jdXJyeTIoZnVuY3Rpb24gX3hkcm9wTGFzdFdoaWxlKGZuLCB4ZikgeyByZXR1cm4gbmV3IFhEcm9wTGFzdFdoaWxlKGZuLCB4Zik7IH0pO1xufSgpKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2Rpc3BhdGNoYWJsZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZScpO1xudmFyIF9kcm9wTGFzdFdoaWxlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fZHJvcExhc3RXaGlsZScpO1xudmFyIF94ZHJvcExhc3RXaGlsZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX3hkcm9wTGFzdFdoaWxlJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3QgZXhjbHVkaW5nIGFsbCB0aGUgdGFpbGluZyBlbGVtZW50cyBvZiBhIGdpdmVuIGxpc3Qgd2hpY2hcbiAqIHNhdGlzZnkgdGhlIHN1cHBsaWVkIHByZWRpY2F0ZSBmdW5jdGlvbi4gSXQgcGFzc2VzIGVhY2ggdmFsdWUgZnJvbSB0aGUgcmlnaHRcbiAqIHRvIHRoZSBzdXBwbGllZCBwcmVkaWNhdGUgZnVuY3Rpb24sIHNraXBwaW5nIGVsZW1lbnRzIHVudGlsIHRoZSBwcmVkaWNhdGVcbiAqIGZ1bmN0aW9uIHJldHVybnMgYSBgZmFsc3lgIHZhbHVlLiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uIGlzIGFwcGxpZWQgdG8gb25lIGFyZ3VtZW50OlxuICogKih2YWx1ZSkqLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGVhY2ggZWxlbWVudFxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgYXJyYXkgd2l0aG91dCBhbnkgdHJhaWxpbmcgZWxlbWVudHMgdGhhdCByZXR1cm4gYGZhbHN5YCB2YWx1ZXMgZnJvbSB0aGUgYHByZWRpY2F0ZWAuXG4gKiBAc2VlIFIudGFrZUxhc3RXaGlsZSwgUi5hZGRJbmRleCwgUi5kcm9wLCBSLmRyb3BXaGlsZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBsdGVUaHJlZSA9IHggPT4geCA8PSAzO1xuICpcbiAqICAgICAgUi5kcm9wTGFzdFdoaWxlKGx0ZVRocmVlLCBbMSwgMiwgMywgNCwgMywgMiwgMV0pOyAvLz0+IFsxLCAyLCAzLCA0XVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoX2Rpc3BhdGNoYWJsZShbXSwgX3hkcm9wTGFzdFdoaWxlLCBfZHJvcExhc3RXaGlsZSkpO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL19jdXJyeTInKTtcbnZhciBfeGZCYXNlID0gcmVxdWlyZSgnLi9feGZCYXNlJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIFhEcm9wUmVwZWF0c1dpdGgocHJlZCwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5wcmVkID0gcHJlZDtcbiAgICB0aGlzLmxhc3RWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNlZW5GaXJzdFZhbHVlID0gZmFsc2U7XG4gIH1cblxuICBYRHJvcFJlcGVhdHNXaXRoLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcbiAgWERyb3BSZXBlYXRzV2l0aC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IF94ZkJhc2UucmVzdWx0O1xuICBYRHJvcFJlcGVhdHNXaXRoLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uKHJlc3VsdCwgaW5wdXQpIHtcbiAgICB2YXIgc2FtZUFzTGFzdCA9IGZhbHNlO1xuICAgIGlmICghdGhpcy5zZWVuRmlyc3RWYWx1ZSkge1xuICAgICAgdGhpcy5zZWVuRmlyc3RWYWx1ZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLnByZWQodGhpcy5sYXN0VmFsdWUsIGlucHV0KSkge1xuICAgICAgc2FtZUFzTGFzdCA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMubGFzdFZhbHVlID0gaW5wdXQ7XG4gICAgcmV0dXJuIHNhbWVBc0xhc3QgPyByZXN1bHQgOiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgaW5wdXQpO1xuICB9O1xuXG4gIHJldHVybiBfY3VycnkyKGZ1bmN0aW9uIF94ZHJvcFJlcGVhdHNXaXRoKHByZWQsIHhmKSB7IHJldHVybiBuZXcgWERyb3BSZXBlYXRzV2l0aChwcmVkLCB4Zik7IH0pO1xufSgpKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2lzU3RyaW5nID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9faXNTdHJpbmcnKTtcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIG50aCBlbGVtZW50IG9mIHRoZSBnaXZlbiBsaXN0IG9yIHN0cmluZy4gSWYgbiBpcyBuZWdhdGl2ZSB0aGVcbiAqIGVsZW1lbnQgYXQgaW5kZXggbGVuZ3RoICsgbiBpcyByZXR1cm5lZC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIE51bWJlciAtPiBbYV0gLT4gYSB8IFVuZGVmaW5lZFxuICogQHNpZyBOdW1iZXIgLT4gU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldFxuICogQHBhcmFtIHsqfSBsaXN0XG4gKiBAcmV0dXJuIHsqfVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBsaXN0ID0gWydmb28nLCAnYmFyJywgJ2JheicsICdxdXV4J107XG4gKiAgICAgIFIubnRoKDEsIGxpc3QpOyAvLz0+ICdiYXInXG4gKiAgICAgIFIubnRoKC0xLCBsaXN0KTsgLy89PiAncXV1eCdcbiAqICAgICAgUi5udGgoLTk5LCBsaXN0KTsgLy89PiB1bmRlZmluZWRcbiAqXG4gKiAgICAgIFIubnRoKDIsICdhYmMnKTsgLy89PiAnYydcbiAqICAgICAgUi5udGgoMywgJ2FiYycpOyAvLz0+ICcnXG4gKiBAc3ltYiBSLm50aCgtMSwgW2EsIGIsIGNdKSA9IGNcbiAqIEBzeW1iIFIubnRoKDAsIFthLCBiLCBjXSkgPSBhXG4gKiBAc3ltYiBSLm50aCgxLCBbYSwgYiwgY10pID0gYlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gbnRoKG9mZnNldCwgbGlzdCkge1xuICB2YXIgaWR4ID0gb2Zmc2V0IDwgMCA/IGxpc3QubGVuZ3RoICsgb2Zmc2V0IDogb2Zmc2V0O1xuICByZXR1cm4gX2lzU3RyaW5nKGxpc3QpID8gbGlzdC5jaGFyQXQoaWR4KSA6IGxpc3RbaWR4XTtcbn0pO1xuIiwidmFyIG50aCA9IHJlcXVpcmUoJy4vbnRoJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIGdpdmVuIGxpc3Qgb3Igc3RyaW5nLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuNFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW2FdIC0+IGEgfCBVbmRlZmluZWRcbiAqIEBzaWcgU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHsqfSBsaXN0XG4gKiBAcmV0dXJuIHsqfVxuICogQHNlZSBSLmluaXQsIFIuaGVhZCwgUi50YWlsXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5sYXN0KFsnZmknLCAnZm8nLCAnZnVtJ10pOyAvLz0+ICdmdW0nXG4gKiAgICAgIFIubGFzdChbXSk7IC8vPT4gdW5kZWZpbmVkXG4gKlxuICogICAgICBSLmxhc3QoJ2FiYycpOyAvLz0+ICdjJ1xuICogICAgICBSLmxhc3QoJycpOyAvLz0+ICcnXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gbnRoKC0xKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2Rpc3BhdGNoYWJsZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZScpO1xudmFyIF94ZHJvcFJlcGVhdHNXaXRoID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9feGRyb3BSZXBlYXRzV2l0aCcpO1xudmFyIGxhc3QgPSByZXF1aXJlKCcuL2xhc3QnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCB3aXRob3V0IGFueSBjb25zZWN1dGl2ZWx5IHJlcGVhdGluZyBlbGVtZW50cy4gRXF1YWxpdHkgaXNcbiAqIGRldGVybWluZWQgYnkgYXBwbHlpbmcgdGhlIHN1cHBsaWVkIHByZWRpY2F0ZSB0byBlYWNoIHBhaXIgb2YgY29uc2VjdXRpdmUgZWxlbWVudHMuIFRoZVxuICogZmlyc3QgZWxlbWVudCBpbiBhIHNlcmllcyBvZiBlcXVhbCBlbGVtZW50cyB3aWxsIGJlIHByZXNlcnZlZC5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTQuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEsIGEgLT4gQm9vbGVhbikgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCBBIHByZWRpY2F0ZSB1c2VkIHRvIHRlc3Qgd2hldGhlciB0d28gaXRlbXMgYXJlIGVxdWFsLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gYGxpc3RgIHdpdGhvdXQgcmVwZWF0aW5nIGVsZW1lbnRzLlxuICogQHNlZSBSLnRyYW5zZHVjZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBsID0gWzEsIC0xLCAxLCAzLCA0LCAtNCwgLTQsIC01LCA1LCAzLCAzXTtcbiAqICAgICAgUi5kcm9wUmVwZWF0c1dpdGgoUi5lcUJ5KE1hdGguYWJzKSwgbCk7IC8vPT4gWzEsIDMsIDQsIC01LCAzXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoX2Rpc3BhdGNoYWJsZShbXSwgX3hkcm9wUmVwZWF0c1dpdGgsIGZ1bmN0aW9uIGRyb3BSZXBlYXRzV2l0aChwcmVkLCBsaXN0KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGlkeCA9IDE7XG4gIHZhciBsZW4gPSBsaXN0Lmxlbmd0aDtcbiAgaWYgKGxlbiAhPT0gMCkge1xuICAgIHJlc3VsdFswXSA9IGxpc3RbMF07XG4gICAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgICAgaWYgKCFwcmVkKGxhc3QocmVzdWx0KSwgbGlzdFtpZHhdKSkge1xuICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBsaXN0W2lkeF07XG4gICAgICB9XG4gICAgICBpZHggKz0gMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pKTtcblxuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcbnZhciBfZGlzcGF0Y2hhYmxlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlJyk7XG52YXIgX3hkcm9wUmVwZWF0c1dpdGggPSByZXF1aXJlKCcuL2ludGVybmFsL194ZHJvcFJlcGVhdHNXaXRoJyk7XG52YXIgZHJvcFJlcGVhdHNXaXRoID0gcmVxdWlyZSgnLi9kcm9wUmVwZWF0c1dpdGgnKTtcbnZhciBlcXVhbHMgPSByZXF1aXJlKCcuL2VxdWFscycpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIG5ldyBsaXN0IHdpdGhvdXQgYW55IGNvbnNlY3V0aXZlbHkgcmVwZWF0aW5nIGVsZW1lbnRzLiBgUi5lcXVhbHNgXG4gKiBpcyB1c2VkIHRvIGRldGVybWluZSBlcXVhbGl0eS5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTQuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW2FdIC0+IFthXVxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gYGxpc3RgIHdpdGhvdXQgcmVwZWF0aW5nIGVsZW1lbnRzLlxuICogQHNlZSBSLnRyYW5zZHVjZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgUi5kcm9wUmVwZWF0cyhbMSwgMSwgMSwgMiwgMywgNCwgNCwgMiwgMl0pOyAvLz0+IFsxLCAyLCAzLCA0LCAyXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoX2Rpc3BhdGNoYWJsZShbXSwgX3hkcm9wUmVwZWF0c1dpdGgoZXF1YWxzKSwgZHJvcFJlcGVhdHNXaXRoKGVxdWFscykpKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9fY3VycnkyJyk7XG52YXIgX3hmQmFzZSA9IHJlcXVpcmUoJy4vX3hmQmFzZScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBYRHJvcFdoaWxlKGYsIHhmKSB7XG4gICAgdGhpcy54ZiA9IHhmO1xuICAgIHRoaXMuZiA9IGY7XG4gIH1cbiAgWERyb3BXaGlsZS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhEcm9wV2hpbGUucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBfeGZCYXNlLnJlc3VsdDtcbiAgWERyb3BXaGlsZS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbihyZXN1bHQsIGlucHV0KSB7XG4gICAgaWYgKHRoaXMuZikge1xuICAgICAgaWYgKHRoaXMuZihpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHRoaXMuZiA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgaW5wdXQpO1xuICB9O1xuXG4gIHJldHVybiBfY3VycnkyKGZ1bmN0aW9uIF94ZHJvcFdoaWxlKGYsIHhmKSB7IHJldHVybiBuZXcgWERyb3BXaGlsZShmLCB4Zik7IH0pO1xufSgpKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2Rpc3BhdGNoYWJsZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZScpO1xudmFyIF94ZHJvcFdoaWxlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9feGRyb3BXaGlsZScpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIG5ldyBsaXN0IGV4Y2x1ZGluZyB0aGUgbGVhZGluZyBlbGVtZW50cyBvZiBhIGdpdmVuIGxpc3Qgd2hpY2hcbiAqIHNhdGlzZnkgdGhlIHN1cHBsaWVkIHByZWRpY2F0ZSBmdW5jdGlvbi4gSXQgcGFzc2VzIGVhY2ggdmFsdWUgdG8gdGhlIHN1cHBsaWVkXG4gKiBwcmVkaWNhdGUgZnVuY3Rpb24sIHNraXBwaW5nIGVsZW1lbnRzIHdoaWxlIHRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gcmV0dXJuc1xuICogYHRydWVgLiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uIGlzIGFwcGxpZWQgdG8gb25lIGFyZ3VtZW50OiAqKHZhbHVlKSouXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGRyb3BXaGlsZWAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjkuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgYXJyYXkuXG4gKiBAc2VlIFIudGFrZVdoaWxlLCBSLnRyYW5zZHVjZSwgUi5hZGRJbmRleFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBsdGVUd28gPSB4ID0+IHggPD0gMjtcbiAqXG4gKiAgICAgIFIuZHJvcFdoaWxlKGx0ZVR3bywgWzEsIDIsIDMsIDQsIDMsIDIsIDFdKTsgLy89PiBbMywgNCwgMywgMiwgMV1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKF9kaXNwYXRjaGFibGUoWydkcm9wV2hpbGUnXSwgX3hkcm9wV2hpbGUsIGZ1bmN0aW9uIGRyb3BXaGlsZShwcmVkLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gIHdoaWxlIChpZHggPCBsZW4gJiYgcHJlZChsaXN0W2lkeF0pKSB7XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIGlkeCk7XG59KSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgb25lIG9yIGJvdGggb2YgaXRzIGFyZ3VtZW50cyBhcmUgYHRydWVgLiBSZXR1cm5zIGBmYWxzZWBcbiAqIGlmIGJvdGggYXJndW1lbnRzIGFyZSBgZmFsc2VgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExvZ2ljXG4gKiBAc2lnIGEgLT4gYiAtPiBhIHwgYlxuICogQHBhcmFtIHtBbnl9IGFcbiAqIEBwYXJhbSB7QW55fSBiXG4gKiBAcmV0dXJuIHtBbnl9IHRoZSBmaXJzdCBhcmd1bWVudCBpZiB0cnV0aHksIG90aGVyd2lzZSB0aGUgc2Vjb25kIGFyZ3VtZW50LlxuICogQHNlZSBSLmVpdGhlclxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIub3IodHJ1ZSwgdHJ1ZSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLm9yKHRydWUsIGZhbHNlKTsgLy89PiB0cnVlXG4gKiAgICAgIFIub3IoZmFsc2UsIHRydWUpOyAvLz0+IHRydWVcbiAqICAgICAgUi5vcihmYWxzZSwgZmFsc2UpOyAvLz0+IGZhbHNlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBvcihhLCBiKSB7XG4gIHJldHVybiBhIHx8IGI7XG59KTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2lzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2ludGVybmFsL19pc0Z1bmN0aW9uJyk7XG52YXIgbGlmdCA9IHJlcXVpcmUoJy4vbGlmdCcpO1xudmFyIG9yID0gcmVxdWlyZSgnLi9vcicpO1xuXG5cbi8qKlxuICogQSBmdW5jdGlvbiB3cmFwcGluZyBjYWxscyB0byB0aGUgdHdvIGZ1bmN0aW9ucyBpbiBhbiBgfHxgIG9wZXJhdGlvbixcbiAqIHJldHVybmluZyB0aGUgcmVzdWx0IG9mIHRoZSBmaXJzdCBmdW5jdGlvbiBpZiBpdCBpcyB0cnV0aC15IGFuZCB0aGUgcmVzdWx0XG4gKiBvZiB0aGUgc2Vjb25kIGZ1bmN0aW9uIG90aGVyd2lzZS4gTm90ZSB0aGF0IHRoaXMgaXMgc2hvcnQtY2lyY3VpdGVkLFxuICogbWVhbmluZyB0aGF0IHRoZSBzZWNvbmQgZnVuY3Rpb24gd2lsbCBub3QgYmUgaW52b2tlZCBpZiB0aGUgZmlyc3QgcmV0dXJucyBhXG4gKiB0cnV0aC15IHZhbHVlLlxuICpcbiAqIEluIGFkZGl0aW9uIHRvIGZ1bmN0aW9ucywgYFIuZWl0aGVyYCBhbHNvIGFjY2VwdHMgYW55IGZhbnRhc3ktbGFuZCBjb21wYXRpYmxlXG4gKiBhcHBsaWNhdGl2ZSBmdW5jdG9yLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEyLjBcbiAqIEBjYXRlZ29yeSBMb2dpY1xuICogQHNpZyAoKi4uLiAtPiBCb29sZWFuKSAtPiAoKi4uLiAtPiBCb29sZWFuKSAtPiAoKi4uLiAtPiBCb29sZWFuKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZiBhIHByZWRpY2F0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZyBhbm90aGVyIHByZWRpY2F0ZVxuICogQHJldHVybiB7RnVuY3Rpb259IGEgZnVuY3Rpb24gdGhhdCBhcHBsaWVzIGl0cyBhcmd1bWVudHMgdG8gYGZgIGFuZCBgZ2AgYW5kIGB8fGBzIHRoZWlyIG91dHB1dHMgdG9nZXRoZXIuXG4gKiBAc2VlIFIub3JcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgZ3QxMCA9IHggPT4geCA+IDEwO1xuICogICAgICB2YXIgZXZlbiA9IHggPT4geCAlIDIgPT09IDA7XG4gKiAgICAgIHZhciBmID0gUi5laXRoZXIoZ3QxMCwgZXZlbik7XG4gKiAgICAgIGYoMTAxKTsgLy89PiB0cnVlXG4gKiAgICAgIGYoOCk7IC8vPT4gdHJ1ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gZWl0aGVyKGYsIGcpIHtcbiAgcmV0dXJuIF9pc0Z1bmN0aW9uKGYpID9cbiAgICBmdW5jdGlvbiBfZWl0aGVyKCkge1xuICAgICAgcmV0dXJuIGYuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCBnLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSA6XG4gICAgbGlmdChvcikoZiwgZyk7XG59KTtcbiIsInZhciBfY3VycnkxID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkxJyk7XG52YXIgX2lzQXJndW1lbnRzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9faXNBcmd1bWVudHMnKTtcbnZhciBfaXNBcnJheSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2lzQXJyYXknKTtcbnZhciBfaXNPYmplY3QgPSByZXF1aXJlKCcuL2ludGVybmFsL19pc09iamVjdCcpO1xudmFyIF9pc1N0cmluZyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2lzU3RyaW5nJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBlbXB0eSB2YWx1ZSBvZiBpdHMgYXJndW1lbnQncyB0eXBlLiBSYW1kYSBkZWZpbmVzIHRoZSBlbXB0eVxuICogdmFsdWUgb2YgQXJyYXkgKGBbXWApLCBPYmplY3QgKGB7fWApLCBTdHJpbmcgKGAnJ2ApLCBhbmQgQXJndW1lbnRzLiBPdGhlclxuICogdHlwZXMgYXJlIHN1cHBvcnRlZCBpZiB0aGV5IGRlZmluZSBgPFR5cGU+LmVtcHR5YCBhbmQvb3JcbiAqIGA8VHlwZT4ucHJvdG90eXBlLmVtcHR5YC5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgZW1wdHlgIG1ldGhvZCBvZiB0aGUgZmlyc3QgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMy4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgYSAtPiBhXG4gKiBAcGFyYW0geyp9IHhcbiAqIEByZXR1cm4geyp9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5lbXB0eShKdXN0KDQyKSk7ICAgICAgLy89PiBOb3RoaW5nKClcbiAqICAgICAgUi5lbXB0eShbMSwgMiwgM10pOyAgICAgLy89PiBbXVxuICogICAgICBSLmVtcHR5KCd1bmljb3JucycpOyAgICAvLz0+ICcnXG4gKiAgICAgIFIuZW1wdHkoe3g6IDEsIHk6IDJ9KTsgIC8vPT4ge31cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkxKGZ1bmN0aW9uIGVtcHR5KHgpIHtcbiAgcmV0dXJuIChcbiAgICAoeCAhPSBudWxsICYmIHR5cGVvZiB4LmVtcHR5ID09PSAnZnVuY3Rpb24nKSA/XG4gICAgICB4LmVtcHR5KCkgOlxuICAgICh4ICE9IG51bGwgJiYgeC5jb25zdHJ1Y3RvciAhPSBudWxsICYmIHR5cGVvZiB4LmNvbnN0cnVjdG9yLmVtcHR5ID09PSAnZnVuY3Rpb24nKSA/XG4gICAgICB4LmNvbnN0cnVjdG9yLmVtcHR5KCkgOlxuICAgIF9pc0FycmF5KHgpID9cbiAgICAgIFtdIDpcbiAgICBfaXNTdHJpbmcoeCkgP1xuICAgICAgJycgOlxuICAgIF9pc09iamVjdCh4KSA/XG4gICAgICB7fSA6XG4gICAgX2lzQXJndW1lbnRzKHgpID9cbiAgICAgIChmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA6XG4gICAgLy8gZWxzZVxuICAgICAgdm9pZCAwXG4gICk7XG59KTtcbiIsInZhciBfY3VycnkzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkzJyk7XG52YXIgZXF1YWxzID0gcmVxdWlyZSgnLi9lcXVhbHMnKTtcblxuXG4vKipcbiAqIFRha2VzIGEgZnVuY3Rpb24gYW5kIHR3byB2YWx1ZXMgaW4gaXRzIGRvbWFpbiBhbmQgcmV0dXJucyBgdHJ1ZWAgaWYgdGhlXG4gKiB2YWx1ZXMgbWFwIHRvIHRoZSBzYW1lIHZhbHVlIGluIHRoZSBjb2RvbWFpbjsgYGZhbHNlYCBvdGhlcndpc2UuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTguMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIChhIC0+IGIpIC0+IGEgLT4gYSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmXG4gKiBAcGFyYW0geyp9IHhcbiAqIEBwYXJhbSB7Kn0geVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmVxQnkoTWF0aC5hYnMsIDUsIC01KTsgLy89PiB0cnVlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MyhmdW5jdGlvbiBlcUJ5KGYsIHgsIHkpIHtcbiAgcmV0dXJuIGVxdWFscyhmKHgpLCBmKHkpKTtcbn0pO1xuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcbnZhciBlcXVhbHMgPSByZXF1aXJlKCcuL2VxdWFscycpO1xuXG5cbi8qKlxuICogUmVwb3J0cyB3aGV0aGVyIHR3byBvYmplY3RzIGhhdmUgdGhlIHNhbWUgdmFsdWUsIGluIGBSLmVxdWFsc2AgdGVybXMsIGZvclxuICogdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4gVXNlZnVsIGFzIGEgY3VycmllZCBwcmVkaWNhdGUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIGsgLT4ge2s6IHZ9IC0+IHtrOiB2fSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJvcCBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY29tcGFyZVxuICogQHBhcmFtIHtPYmplY3R9IG9iajFcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoyXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgbzEgPSB7IGE6IDEsIGI6IDIsIGM6IDMsIGQ6IDQgfTtcbiAqICAgICAgdmFyIG8yID0geyBhOiAxMCwgYjogMjAsIGM6IDMsIGQ6IDQwIH07XG4gKiAgICAgIFIuZXFQcm9wcygnYScsIG8xLCBvMik7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5lcVByb3BzKCdjJywgbzEsIG8yKTsgLy89PiB0cnVlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MyhmdW5jdGlvbiBlcVByb3BzKHByb3AsIG9iajEsIG9iajIpIHtcbiAgcmV0dXJuIGVxdWFscyhvYmoxW3Byb3BdLCBvYmoyW3Byb3BdKTtcbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IGJ5IHJlY3Vyc2l2ZWx5IGV2b2x2aW5nIGEgc2hhbGxvdyBjb3B5IG9mIGBvYmplY3RgLFxuICogYWNjb3JkaW5nIHRvIHRoZSBgdHJhbnNmb3JtYXRpb25gIGZ1bmN0aW9ucy4gQWxsIG5vbi1wcmltaXRpdmUgcHJvcGVydGllc1xuICogYXJlIGNvcGllZCBieSByZWZlcmVuY2UuXG4gKlxuICogQSBgdHJhbnNmb3JtYXRpb25gIGZ1bmN0aW9uIHdpbGwgbm90IGJlIGludm9rZWQgaWYgaXRzIGNvcnJlc3BvbmRpbmcga2V5XG4gKiBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZXZvbHZlZCBvYmplY3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHtrOiAodiAtPiB2KX0gLT4ge2s6IHZ9IC0+IHtrOiB2fVxuICogQHBhcmFtIHtPYmplY3R9IHRyYW5zZm9ybWF0aW9ucyBUaGUgb2JqZWN0IHNwZWNpZnlpbmcgdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25zIHRvIGFwcGx5XG4gKiAgICAgICAgdG8gdGhlIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBiZSB0cmFuc2Zvcm1lZC5cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHRyYW5zZm9ybWVkIG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgdG9tYXRvICA9IHtmaXJzdE5hbWU6ICcgIFRvbWF0byAnLCBkYXRhOiB7ZWxhcHNlZDogMTAwLCByZW1haW5pbmc6IDE0MDB9LCBpZDoxMjN9O1xuICogICAgICB2YXIgdHJhbnNmb3JtYXRpb25zID0ge1xuICogICAgICAgIGZpcnN0TmFtZTogUi50cmltLFxuICogICAgICAgIGxhc3ROYW1lOiBSLnRyaW0sIC8vIFdpbGwgbm90IGdldCBpbnZva2VkLlxuICogICAgICAgIGRhdGE6IHtlbGFwc2VkOiBSLmFkZCgxKSwgcmVtYWluaW5nOiBSLmFkZCgtMSl9XG4gKiAgICAgIH07XG4gKiAgICAgIFIuZXZvbHZlKHRyYW5zZm9ybWF0aW9ucywgdG9tYXRvKTsgLy89PiB7Zmlyc3ROYW1lOiAnVG9tYXRvJywgZGF0YToge2VsYXBzZWQ6IDEwMSwgcmVtYWluaW5nOiAxMzk5fSwgaWQ6MTIzfVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gZXZvbHZlKHRyYW5zZm9ybWF0aW9ucywgb2JqZWN0KSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgdmFyIHRyYW5zZm9ybWF0aW9uLCBrZXksIHR5cGU7XG4gIGZvciAoa2V5IGluIG9iamVjdCkge1xuICAgIHRyYW5zZm9ybWF0aW9uID0gdHJhbnNmb3JtYXRpb25zW2tleV07XG4gICAgdHlwZSA9IHR5cGVvZiB0cmFuc2Zvcm1hdGlvbjtcbiAgICByZXN1bHRba2V5XSA9IHR5cGUgPT09ICdmdW5jdGlvbicgICAgICAgICAgICAgICAgID8gdHJhbnNmb3JtYXRpb24ob2JqZWN0W2tleV0pXG4gICAgICAgICAgICAgICAgOiB0cmFuc2Zvcm1hdGlvbiAmJiB0eXBlID09PSAnb2JqZWN0JyA/IGV2b2x2ZSh0cmFuc2Zvcm1hdGlvbiwgb2JqZWN0W2tleV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG9iamVjdFtrZXldO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9fY3VycnkyJyk7XG52YXIgX3JlZHVjZWQgPSByZXF1aXJlKCcuL19yZWR1Y2VkJyk7XG52YXIgX3hmQmFzZSA9IHJlcXVpcmUoJy4vX3hmQmFzZScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBYRmluZChmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICAgIHRoaXMuZm91bmQgPSBmYWxzZTtcbiAgfVxuICBYRmluZC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9pbml0J10gPSBfeGZCYXNlLmluaXQ7XG4gIFhGaW5kLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddID0gZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgaWYgKCF0aGlzLmZvdW5kKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnhmWydAQHRyYW5zZHVjZXIvc3RlcCddKHJlc3VsdCwgdm9pZCAwKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShyZXN1bHQpO1xuICB9O1xuICBYRmluZC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbihyZXN1bHQsIGlucHV0KSB7XG4gICAgaWYgKHRoaXMuZihpbnB1dCkpIHtcbiAgICAgIHRoaXMuZm91bmQgPSB0cnVlO1xuICAgICAgcmVzdWx0ID0gX3JlZHVjZWQodGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIGlucHV0KSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgcmV0dXJuIF9jdXJyeTIoZnVuY3Rpb24gX3hmaW5kKGYsIHhmKSB7IHJldHVybiBuZXcgWEZpbmQoZiwgeGYpOyB9KTtcbn0oKSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIF9kaXNwYXRjaGFibGUgPSByZXF1aXJlKCcuL2ludGVybmFsL19kaXNwYXRjaGFibGUnKTtcbnZhciBfeGZpbmQgPSByZXF1aXJlKCcuL2ludGVybmFsL194ZmluZCcpO1xuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCB3aGljaCBtYXRjaGVzIHRoZSBwcmVkaWNhdGUsIG9yXG4gKiBgdW5kZWZpbmVkYCBpZiBubyBlbGVtZW50IG1hdGNoZXMuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGZpbmRgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBhIHwgdW5kZWZpbmVkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBlbGVtZW50IGlzIHRoZVxuICogICAgICAgIGRlc2lyZWQgb25lLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBlbGVtZW50IGZvdW5kLCBvciBgdW5kZWZpbmVkYC5cbiAqIEBzZWUgUi50cmFuc2R1Y2VcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgeHMgPSBbe2E6IDF9LCB7YTogMn0sIHthOiAzfV07XG4gKiAgICAgIFIuZmluZChSLnByb3BFcSgnYScsIDIpKSh4cyk7IC8vPT4ge2E6IDJ9XG4gKiAgICAgIFIuZmluZChSLnByb3BFcSgnYScsIDQpKSh4cyk7IC8vPT4gdW5kZWZpbmVkXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihfZGlzcGF0Y2hhYmxlKFsnZmluZCddLCBfeGZpbmQsIGZ1bmN0aW9uIGZpbmQoZm4sIGxpc3QpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBsaXN0Lmxlbmd0aDtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGlmIChmbihsaXN0W2lkeF0pKSB7XG4gICAgICByZXR1cm4gbGlzdFtpZHhdO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxufSkpO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL19jdXJyeTInKTtcbnZhciBfcmVkdWNlZCA9IHJlcXVpcmUoJy4vX3JlZHVjZWQnKTtcbnZhciBfeGZCYXNlID0gcmVxdWlyZSgnLi9feGZCYXNlJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIFhGaW5kSW5kZXgoZiwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5mID0gZjtcbiAgICB0aGlzLmlkeCA9IC0xO1xuICAgIHRoaXMuZm91bmQgPSBmYWxzZTtcbiAgfVxuICBYRmluZEluZGV4LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcbiAgWEZpbmRJbmRleC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgIGlmICghdGhpcy5mb3VuZCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIC0xKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMueGZbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXShyZXN1bHQpO1xuICB9O1xuICBYRmluZEluZGV4LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uKHJlc3VsdCwgaW5wdXQpIHtcbiAgICB0aGlzLmlkeCArPSAxO1xuICAgIGlmICh0aGlzLmYoaW5wdXQpKSB7XG4gICAgICB0aGlzLmZvdW5kID0gdHJ1ZTtcbiAgICAgIHJlc3VsdCA9IF9yZWR1Y2VkKHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCB0aGlzLmlkeCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHJldHVybiBfY3VycnkyKGZ1bmN0aW9uIF94ZmluZEluZGV4KGYsIHhmKSB7IHJldHVybiBuZXcgWEZpbmRJbmRleChmLCB4Zik7IH0pO1xufSgpKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2Rpc3BhdGNoYWJsZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZScpO1xudmFyIF94ZmluZEluZGV4ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9feGZpbmRJbmRleCcpO1xuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3Qgd2hpY2ggbWF0Y2hlcyB0aGVcbiAqIHByZWRpY2F0ZSwgb3IgYC0xYCBpZiBubyBlbGVtZW50IG1hdGNoZXMuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMVxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gW2FdIC0+IE51bWJlclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgZWxlbWVudCBpcyB0aGVcbiAqIGRlc2lyZWQgb25lLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBmb3VuZCwgb3IgYC0xYC5cbiAqIEBzZWUgUi50cmFuc2R1Y2VcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgeHMgPSBbe2E6IDF9LCB7YTogMn0sIHthOiAzfV07XG4gKiAgICAgIFIuZmluZEluZGV4KFIucHJvcEVxKCdhJywgMikpKHhzKTsgLy89PiAxXG4gKiAgICAgIFIuZmluZEluZGV4KFIucHJvcEVxKCdhJywgNCkpKHhzKTsgLy89PiAtMVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoX2Rpc3BhdGNoYWJsZShbXSwgX3hmaW5kSW5kZXgsIGZ1bmN0aW9uIGZpbmRJbmRleChmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgaWYgKGZuKGxpc3RbaWR4XSkpIHtcbiAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiAtMTtcbn0pKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9fY3VycnkyJyk7XG52YXIgX3hmQmFzZSA9IHJlcXVpcmUoJy4vX3hmQmFzZScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBYRmluZExhc3QoZiwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5mID0gZjtcbiAgfVxuICBYRmluZExhc3QucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYRmluZExhc3QucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvcmVzdWx0J10gPSBmdW5jdGlvbihyZXN1bHQpIHtcbiAgICByZXR1cm4gdGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3Jlc3VsdCddKHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCB0aGlzLmxhc3QpKTtcbiAgfTtcbiAgWEZpbmRMYXN0LnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uKHJlc3VsdCwgaW5wdXQpIHtcbiAgICBpZiAodGhpcy5mKGlucHV0KSkge1xuICAgICAgdGhpcy5sYXN0ID0gaW5wdXQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgcmV0dXJuIF9jdXJyeTIoZnVuY3Rpb24gX3hmaW5kTGFzdChmLCB4ZikgeyByZXR1cm4gbmV3IFhGaW5kTGFzdChmLCB4Zik7IH0pO1xufSgpKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2Rpc3BhdGNoYWJsZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZScpO1xudmFyIF94ZmluZExhc3QgPSByZXF1aXJlKCcuL2ludGVybmFsL194ZmluZExhc3QnKTtcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgbGlzdCB3aGljaCBtYXRjaGVzIHRoZSBwcmVkaWNhdGUsIG9yXG4gKiBgdW5kZWZpbmVkYCBpZiBubyBlbGVtZW50IG1hdGNoZXMuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMVxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gW2FdIC0+IGEgfCB1bmRlZmluZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGVsZW1lbnQgaXMgdGhlXG4gKiBkZXNpcmVkIG9uZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgZWxlbWVudCBmb3VuZCwgb3IgYHVuZGVmaW5lZGAuXG4gKiBAc2VlIFIudHJhbnNkdWNlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIHhzID0gW3thOiAxLCBiOiAwfSwge2E6MSwgYjogMX1dO1xuICogICAgICBSLmZpbmRMYXN0KFIucHJvcEVxKCdhJywgMSkpKHhzKTsgLy89PiB7YTogMSwgYjogMX1cbiAqICAgICAgUi5maW5kTGFzdChSLnByb3BFcSgnYScsIDQpKSh4cyk7IC8vPT4gdW5kZWZpbmVkXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihfZGlzcGF0Y2hhYmxlKFtdLCBfeGZpbmRMYXN0LCBmdW5jdGlvbiBmaW5kTGFzdChmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gbGlzdC5sZW5ndGggLSAxO1xuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICBpZiAoZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmV0dXJuIGxpc3RbaWR4XTtcbiAgICB9XG4gICAgaWR4IC09IDE7XG4gIH1cbn0pKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9fY3VycnkyJyk7XG52YXIgX3hmQmFzZSA9IHJlcXVpcmUoJy4vX3hmQmFzZScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBYRmluZExhc3RJbmRleChmLCB4Zikge1xuICAgIHRoaXMueGYgPSB4ZjtcbiAgICB0aGlzLmYgPSBmO1xuICAgIHRoaXMuaWR4ID0gLTE7XG4gICAgdGhpcy5sYXN0SWR4ID0gLTE7XG4gIH1cbiAgWEZpbmRMYXN0SW5kZXgucHJvdG90eXBlWydAQHRyYW5zZHVjZXIvaW5pdCddID0gX3hmQmFzZS5pbml0O1xuICBYRmluZExhc3RJbmRleC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgIHJldHVybiB0aGlzLnhmWydAQHRyYW5zZHVjZXIvcmVzdWx0J10odGhpcy54ZlsnQEB0cmFuc2R1Y2VyL3N0ZXAnXShyZXN1bHQsIHRoaXMubGFzdElkeCkpO1xuICB9O1xuICBYRmluZExhc3RJbmRleC5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9zdGVwJ10gPSBmdW5jdGlvbihyZXN1bHQsIGlucHV0KSB7XG4gICAgdGhpcy5pZHggKz0gMTtcbiAgICBpZiAodGhpcy5mKGlucHV0KSkge1xuICAgICAgdGhpcy5sYXN0SWR4ID0gdGhpcy5pZHg7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgcmV0dXJuIF9jdXJyeTIoZnVuY3Rpb24gX3hmaW5kTGFzdEluZGV4KGYsIHhmKSB7IHJldHVybiBuZXcgWEZpbmRMYXN0SW5kZXgoZiwgeGYpOyB9KTtcbn0oKSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIF9kaXNwYXRjaGFibGUgPSByZXF1aXJlKCcuL2ludGVybmFsL19kaXNwYXRjaGFibGUnKTtcbnZhciBfeGZpbmRMYXN0SW5kZXggPSByZXF1aXJlKCcuL2ludGVybmFsL194ZmluZExhc3RJbmRleCcpO1xuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgbGlzdCB3aGljaCBtYXRjaGVzIHRoZVxuICogcHJlZGljYXRlLCBvciBgLTFgIGlmIG5vIGVsZW1lbnQgbWF0Y2hlcy5cbiAqXG4gKiBBY3RzIGFzIGEgdHJhbnNkdWNlciBpZiBhIHRyYW5zZm9ybWVyIGlzIGdpdmVuIGluIGxpc3QgcG9zaXRpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4xXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBCb29sZWFuKSAtPiBbYV0gLT4gTnVtYmVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBlbGVtZW50IGlzIHRoZVxuICogZGVzaXJlZCBvbmUuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge051bWJlcn0gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IGZvdW5kLCBvciBgLTFgLlxuICogQHNlZSBSLnRyYW5zZHVjZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciB4cyA9IFt7YTogMSwgYjogMH0sIHthOjEsIGI6IDF9XTtcbiAqICAgICAgUi5maW5kTGFzdEluZGV4KFIucHJvcEVxKCdhJywgMSkpKHhzKTsgLy89PiAxXG4gKiAgICAgIFIuZmluZExhc3RJbmRleChSLnByb3BFcSgnYScsIDQpKSh4cyk7IC8vPT4gLTFcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKF9kaXNwYXRjaGFibGUoW10sIF94ZmluZExhc3RJbmRleCwgZnVuY3Rpb24gZmluZExhc3RJbmRleChmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gbGlzdC5sZW5ndGggLSAxO1xuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICBpZiAoZm4obGlzdFtpZHhdKSkge1xuICAgICAgcmV0dXJuIGlkeDtcbiAgICB9XG4gICAgaWR4IC09IDE7XG4gIH1cbiAgcmV0dXJuIC0xO1xufSkpO1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcbnZhciBfbWFrZUZsYXQgPSByZXF1aXJlKCcuL2ludGVybmFsL19tYWtlRmxhdCcpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIG5ldyBsaXN0IGJ5IHB1bGxpbmcgZXZlcnkgaXRlbSBvdXQgb2YgaXQgKGFuZCBhbGwgaXRzIHN1Yi1hcnJheXMpXG4gKiBhbmQgcHV0dGluZyB0aGVtIGluIGEgbmV3IGFycmF5LCBkZXB0aC1maXJzdC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFthXSAtPiBbYl1cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBmbGF0dGVuZWQgbGlzdC5cbiAqIEBzZWUgUi51bm5lc3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmZsYXR0ZW4oWzEsIDIsIFszLCA0XSwgNSwgWzYsIFs3LCA4LCBbOSwgWzEwLCAxMV0sIDEyXV1dXSk7XG4gKiAgICAgIC8vPT4gWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTJdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MShfbWFrZUZsYXQodHJ1ZSkpO1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcbnZhciBjdXJyeSA9IHJlcXVpcmUoJy4vY3VycnknKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgZnVuY3Rpb24gbXVjaCBsaWtlIHRoZSBzdXBwbGllZCBvbmUsIGV4Y2VwdCB0aGF0IHRoZSBmaXJzdCB0d29cbiAqIGFyZ3VtZW50cycgb3JkZXIgaXMgcmV2ZXJzZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKGEgLT4gYiAtPiBjIC0+IC4uLiAtPiB6KSAtPiAoYiAtPiBhIC0+IGMgLT4gLi4uIC0+IHopXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gaW52b2tlIHdpdGggaXRzIGZpcnN0IHR3byBwYXJhbWV0ZXJzIHJldmVyc2VkLlxuICogQHJldHVybiB7Kn0gVGhlIHJlc3VsdCBvZiBpbnZva2luZyBgZm5gIHdpdGggaXRzIGZpcnN0IHR3byBwYXJhbWV0ZXJzJyBvcmRlciByZXZlcnNlZC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgbWVyZ2VUaHJlZSA9IChhLCBiLCBjKSA9PiBbXS5jb25jYXQoYSwgYiwgYyk7XG4gKlxuICogICAgICBtZXJnZVRocmVlKDEsIDIsIDMpOyAvLz0+IFsxLCAyLCAzXVxuICpcbiAqICAgICAgUi5mbGlwKG1lcmdlVGhyZWUpKDEsIDIsIDMpOyAvLz0+IFsyLCAxLCAzXVxuICogQHN5bWIgUi5mbGlwKGYpKGEsIGIsIGMpID0gZihiLCBhLCBjKVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoZnVuY3Rpb24gZmxpcChmbikge1xuICByZXR1cm4gY3VycnkoZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgICBhcmdzWzBdID0gYjtcbiAgICBhcmdzWzFdID0gYTtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncyk7XG4gIH0pO1xufSk7XG4iLCJ2YXIgX2NoZWNrRm9yTWV0aG9kID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY2hlY2tGb3JNZXRob2QnKTtcbnZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYW4gaW5wdXQgYGxpc3RgLCBjYWxsaW5nIGEgcHJvdmlkZWQgZnVuY3Rpb24gYGZuYCBmb3IgZWFjaFxuICogZWxlbWVudCBpbiB0aGUgbGlzdC5cbiAqXG4gKiBgZm5gIHJlY2VpdmVzIG9uZSBhcmd1bWVudDogKih2YWx1ZSkqLlxuICpcbiAqIE5vdGU6IGBSLmZvckVhY2hgIGRvZXMgbm90IHNraXAgZGVsZXRlZCBvciB1bmFzc2lnbmVkIGluZGljZXMgKHNwYXJzZVxuICogYXJyYXlzKSwgdW5saWtlIHRoZSBuYXRpdmUgYEFycmF5LnByb3RvdHlwZS5mb3JFYWNoYCBtZXRob2QuIEZvciBtb3JlXG4gKiBkZXRhaWxzIG9uIHRoaXMgYmVoYXZpb3IsIHNlZTpcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZvckVhY2gjRGVzY3JpcHRpb25cbiAqXG4gKiBBbHNvIG5vdGUgdGhhdCwgdW5saWtlIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAsIFJhbWRhJ3MgYGZvckVhY2hgIHJldHVybnNcbiAqIHRoZSBvcmlnaW5hbCBhcnJheS4gSW4gc29tZSBsaWJyYXJpZXMgdGhpcyBmdW5jdGlvbiBpcyBuYW1lZCBgZWFjaGAuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGZvckVhY2hgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMVxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEgLT4gKikgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGludm9rZS4gUmVjZWl2ZXMgb25lIGFyZ3VtZW50LCBgdmFsdWVgLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIG9yaWdpbmFsIGxpc3QuXG4gKiBAc2VlIFIuYWRkSW5kZXhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgcHJpbnRYUGx1c0ZpdmUgPSB4ID0+IGNvbnNvbGUubG9nKHggKyA1KTtcbiAqICAgICAgUi5mb3JFYWNoKHByaW50WFBsdXNGaXZlLCBbMSwgMiwgM10pOyAvLz0+IFsxLCAyLCAzXVxuICogICAgICAvLyBsb2dzIDZcbiAqICAgICAgLy8gbG9ncyA3XG4gKiAgICAgIC8vIGxvZ3MgOFxuICogQHN5bWIgUi5mb3JFYWNoKGYsIFthLCBiLCBjXSkgPSBbYSwgYiwgY11cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKF9jaGVja0Zvck1ldGhvZCgnZm9yRWFjaCcsIGZ1bmN0aW9uIGZvckVhY2goZm4sIGxpc3QpIHtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIGZuKGxpc3RbaWR4XSk7XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIGxpc3Q7XG59KSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIGtleXMgPSByZXF1aXJlKCcuL2tleXMnKTtcblxuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbiBpbnB1dCBgb2JqZWN0YCwgY2FsbGluZyBhIHByb3ZpZGVkIGZ1bmN0aW9uIGBmbmAgZm9yIGVhY2hcbiAqIGtleSBhbmQgdmFsdWUgaW4gdGhlIG9iamVjdC5cbiAqXG4gKiBgZm5gIHJlY2VpdmVzIHRocmVlIGFyZ3VtZW50OiAqKHZhbHVlLCBrZXksIG9iaikqLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIzLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKChhLCBTdHJpbmcsIFN0ck1hcCBhKSAtPiBBbnkpIC0+IFN0ck1hcCBhIC0+IFN0ck1hcCBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLiBSZWNlaXZlcyB0aHJlZSBhcmd1bWVudCwgYHZhbHVlYCwgYGtleWAsIGBvYmpgLlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIG9yaWdpbmFsIG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgcHJpbnRLZXlDb25jYXRWYWx1ZSA9ICh2YWx1ZSwga2V5KSA9PiBjb25zb2xlLmxvZyhrZXkgKyAnOicgKyB2YWx1ZSk7XG4gKiAgICAgIFIuZm9yRWFjaE9iakluZGV4ZWQocHJpbnRLZXlDb25jYXRWYWx1ZSwge3g6IDEsIHk6IDJ9KTsgLy89PiB7eDogMSwgeTogMn1cbiAqICAgICAgLy8gbG9ncyB4OjFcbiAqICAgICAgLy8gbG9ncyB5OjJcbiAqIEBzeW1iIFIuZm9yRWFjaE9iakluZGV4ZWQoZiwge3g6IGEsIHk6IGJ9KSA9IHt4OiBhLCB5OiBifVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gZm9yRWFjaE9iakluZGV4ZWQoZm4sIG9iaikge1xuICB2YXIga2V5TGlzdCA9IGtleXMob2JqKTtcbiAgdmFyIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBrZXlMaXN0Lmxlbmd0aCkge1xuICAgIHZhciBrZXkgPSBrZXlMaXN0W2lkeF07XG4gICAgZm4ob2JqW2tleV0sIGtleSwgb2JqKTtcbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gb2JqO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xuXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBvYmplY3QgZnJvbSBhIGxpc3Qga2V5LXZhbHVlIHBhaXJzLiBJZiBhIGtleSBhcHBlYXJzIGluXG4gKiBtdWx0aXBsZSBwYWlycywgdGhlIHJpZ2h0bW9zdCBwYWlyIGlzIGluY2x1ZGVkIGluIHRoZSBvYmplY3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMy4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbW2ssdl1dIC0+IHtrOiB2fVxuICogQHBhcmFtIHtBcnJheX0gcGFpcnMgQW4gYXJyYXkgb2YgdHdvLWVsZW1lbnQgYXJyYXlzIHRoYXQgd2lsbCBiZSB0aGUga2V5cyBhbmQgdmFsdWVzIG9mIHRoZSBvdXRwdXQgb2JqZWN0LlxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgb2JqZWN0IG1hZGUgYnkgcGFpcmluZyB1cCBga2V5c2AgYW5kIGB2YWx1ZXNgLlxuICogQHNlZSBSLnRvUGFpcnMsIFIucGFpclxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuZnJvbVBhaXJzKFtbJ2EnLCAxXSwgWydiJywgMl0sIFsnYycsIDNdXSk7IC8vPT4ge2E6IDEsIGI6IDIsIGM6IDN9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MShmdW5jdGlvbiBmcm9tUGFpcnMocGFpcnMpIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IHBhaXJzLmxlbmd0aCkge1xuICAgIHJlc3VsdFtwYWlyc1tpZHhdWzBdXSA9IHBhaXJzW2lkeF1bMV07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuIiwidmFyIF9jaGVja0Zvck1ldGhvZCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2NoZWNrRm9yTWV0aG9kJyk7XG52YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIHJlZHVjZUJ5ID0gcmVxdWlyZSgnLi9yZWR1Y2VCeScpO1xuXG4vKipcbiAqIFNwbGl0cyBhIGxpc3QgaW50byBzdWItbGlzdHMgc3RvcmVkIGluIGFuIG9iamVjdCwgYmFzZWQgb24gdGhlIHJlc3VsdCBvZlxuICogY2FsbGluZyBhIFN0cmluZy1yZXR1cm5pbmcgZnVuY3Rpb24gb24gZWFjaCBlbGVtZW50LCBhbmQgZ3JvdXBpbmcgdGhlXG4gKiByZXN1bHRzIGFjY29yZGluZyB0byB2YWx1ZXMgcmV0dXJuZWQuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYGdyb3VwQnlgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IFN0cmluZykgLT4gW2FdIC0+IHtTdHJpbmc6IFthXX1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIDo6IGEgLT4gU3RyaW5nXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBncm91cFxuICogQHJldHVybiB7T2JqZWN0fSBBbiBvYmplY3Qgd2l0aCB0aGUgb3V0cHV0IG9mIGBmbmAgZm9yIGtleXMsIG1hcHBlZCB0byBhcnJheXMgb2YgZWxlbWVudHNcbiAqICAgICAgICAgdGhhdCBwcm9kdWNlZCB0aGF0IGtleSB3aGVuIHBhc3NlZCB0byBgZm5gLlxuICogQHNlZSBSLnRyYW5zZHVjZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBieUdyYWRlID0gUi5ncm91cEJ5KGZ1bmN0aW9uKHN0dWRlbnQpIHtcbiAqICAgICAgICB2YXIgc2NvcmUgPSBzdHVkZW50LnNjb3JlO1xuICogICAgICAgIHJldHVybiBzY29yZSA8IDY1ID8gJ0YnIDpcbiAqICAgICAgICAgICAgICAgc2NvcmUgPCA3MCA/ICdEJyA6XG4gKiAgICAgICAgICAgICAgIHNjb3JlIDwgODAgPyAnQycgOlxuICogICAgICAgICAgICAgICBzY29yZSA8IDkwID8gJ0InIDogJ0EnO1xuICogICAgICB9KTtcbiAqICAgICAgdmFyIHN0dWRlbnRzID0gW3tuYW1lOiAnQWJieScsIHNjb3JlOiA4NH0sXG4gKiAgICAgICAgICAgICAgICAgICAgICB7bmFtZTogJ0VkZHknLCBzY29yZTogNTh9LFxuICogICAgICAgICAgICAgICAgICAgICAgLy8gLi4uXG4gKiAgICAgICAgICAgICAgICAgICAgICB7bmFtZTogJ0phY2snLCBzY29yZTogNjl9XTtcbiAqICAgICAgYnlHcmFkZShzdHVkZW50cyk7XG4gKiAgICAgIC8vIHtcbiAqICAgICAgLy8gICAnQSc6IFt7bmFtZTogJ0RpYW5uZScsIHNjb3JlOiA5OX1dLFxuICogICAgICAvLyAgICdCJzogW3tuYW1lOiAnQWJieScsIHNjb3JlOiA4NH1dXG4gKiAgICAgIC8vICAgLy8gLi4uLFxuICogICAgICAvLyAgICdGJzogW3tuYW1lOiAnRWRkeScsIHNjb3JlOiA1OH1dXG4gKiAgICAgIC8vIH1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKF9jaGVja0Zvck1ldGhvZCgnZ3JvdXBCeScsIHJlZHVjZUJ5KGZ1bmN0aW9uKGFjYywgaXRlbSkge1xuICBpZiAoYWNjID09IG51bGwpIHtcbiAgICBhY2MgPSBbXTtcbiAgfVxuICBhY2MucHVzaChpdGVtKTtcbiAgcmV0dXJuIGFjYztcbn0sIG51bGwpKSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG4vKipcbiAqIFRha2VzIGEgbGlzdCBhbmQgcmV0dXJucyBhIGxpc3Qgb2YgbGlzdHMgd2hlcmUgZWFjaCBzdWJsaXN0J3MgZWxlbWVudHMgYXJlXG4gKiBhbGwgXCJlcXVhbFwiIGFjY29yZGluZyB0byB0aGUgcHJvdmlkZWQgZXF1YWxpdHkgZnVuY3Rpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKChhLCBhKSDihpIgQm9vbGVhbikg4oaSIFthXSDihpIgW1thXV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIHR3byBnaXZlbiAoYWRqYWNlbnQpXG4gKiAgICAgICAgZWxlbWVudHMgc2hvdWxkIGJlIGluIHRoZSBzYW1lIGdyb3VwXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBncm91cC4gQWxzbyBhY2NlcHRzIGEgc3RyaW5nLCB3aGljaCB3aWxsIGJlXG4gKiAgICAgICAgdHJlYXRlZCBhcyBhIGxpc3Qgb2YgY2hhcmFjdGVycy5cbiAqIEByZXR1cm4ge0xpc3R9IEEgbGlzdCB0aGF0IGNvbnRhaW5zIHN1Ymxpc3RzIG9mIGVxdWFsIGVsZW1lbnRzLFxuICogICAgICAgICB3aG9zZSBjb25jYXRlbmF0aW9ucyBhcmUgZXF1YWwgdG8gdGhlIG9yaWdpbmFsIGxpc3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqIFIuZ3JvdXBXaXRoKFIuZXF1YWxzLCBbMCwgMSwgMSwgMiwgMywgNSwgOCwgMTMsIDIxXSlcbiAqIC8vPT4gW1swXSwgWzEsIDFdLCBbMl0sIFszXSwgWzVdLCBbOF0sIFsxM10sIFsyMV1dXG4gKlxuICogUi5ncm91cFdpdGgoKGEsIGIpID0+IGEgJSAyID09PSBiICUgMiwgWzAsIDEsIDEsIDIsIDMsIDUsIDgsIDEzLCAyMV0pXG4gKiAvLz0+IFtbMF0sIFsxLCAxXSwgWzJdLCBbMywgNV0sIFs4XSwgWzEzLCAyMV1dXG4gKlxuICogUi5ncm91cFdpdGgoUi5lcUJ5KGlzVm93ZWwpLCAnYWVzdGlvdScpXG4gKiAvLz0+IFsnYWUnLCAnc3QnLCAnaW91J11cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uKGZuLCBsaXN0KSB7XG4gIHZhciByZXMgPSBbXTtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBsaXN0Lmxlbmd0aDtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIHZhciBuZXh0aWR4ID0gaWR4ICsgMTtcbiAgICB3aGlsZSAobmV4dGlkeCA8IGxlbiAmJiBmbihsaXN0W2lkeF0sIGxpc3RbbmV4dGlkeF0pKSB7XG4gICAgICBuZXh0aWR4ICs9IDE7XG4gICAgfVxuICAgIHJlcy5wdXNoKGxpc3Quc2xpY2UoaWR4LCBuZXh0aWR4KSk7XG4gICAgaWR4ID0gbmV4dGlkeDtcbiAgfVxuICByZXR1cm4gcmVzO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kOyBgZmFsc2VgXG4gKiBvdGhlcndpc2UuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgT3JkIGEgPT4gYSAtPiBhIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHNlZSBSLmx0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5ndCgyLCAxKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuZ3QoMiwgMik7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5ndCgyLCAzKTsgLy89PiBmYWxzZVxuICogICAgICBSLmd0KCdhJywgJ3onKTsgLy89PiBmYWxzZVxuICogICAgICBSLmd0KCd6JywgJ2EnKTsgLy89PiB0cnVlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBndChhLCBiKSB7IHJldHVybiBhID4gYjsgfSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc2Vjb25kO1xuICogYGZhbHNlYCBvdGhlcndpc2UuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgT3JkIGEgPT4gYSAtPiBhIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7TnVtYmVyfSBhXG4gKiBAcGFyYW0ge051bWJlcn0gYlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBzZWUgUi5sdGVcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmd0ZSgyLCAxKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuZ3RlKDIsIDIpOyAvLz0+IHRydWVcbiAqICAgICAgUi5ndGUoMiwgMyk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5ndGUoJ2EnLCAneicpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIuZ3RlKCd6JywgJ2EnKTsgLy89PiB0cnVlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBndGUoYSwgYikgeyByZXR1cm4gYSA+PSBiOyB9KTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2hhcyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2hhcycpO1xuXG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhbiBvYmplY3QgaGFzIGFuIG93biBwcm9wZXJ0eSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZVxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjcuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyBzIC0+IHtzOiB4fSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJvcCBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY2hlY2sgZm9yLlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybiB7Qm9vbGVhbn0gV2hldGhlciB0aGUgcHJvcGVydHkgZXhpc3RzLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBoYXNOYW1lID0gUi5oYXMoJ25hbWUnKTtcbiAqICAgICAgaGFzTmFtZSh7bmFtZTogJ2FsaWNlJ30pOyAgIC8vPT4gdHJ1ZVxuICogICAgICBoYXNOYW1lKHtuYW1lOiAnYm9iJ30pOyAgICAgLy89PiB0cnVlXG4gKiAgICAgIGhhc05hbWUoe30pOyAgICAgICAgICAgICAgICAvLz0+IGZhbHNlXG4gKlxuICogICAgICB2YXIgcG9pbnQgPSB7eDogMCwgeTogMH07XG4gKiAgICAgIHZhciBwb2ludEhhcyA9IFIuaGFzKFIuX18sIHBvaW50KTtcbiAqICAgICAgcG9pbnRIYXMoJ3gnKTsgIC8vPT4gdHJ1ZVxuICogICAgICBwb2ludEhhcygneScpOyAgLy89PiB0cnVlXG4gKiAgICAgIHBvaW50SGFzKCd6Jyk7ICAvLz0+IGZhbHNlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihfaGFzKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGFuIG9iamVjdCBvciBpdHMgcHJvdG90eXBlIGNoYWluIGhhcyBhIHByb3BlcnR5IHdpdGhcbiAqIHRoZSBzcGVjaWZpZWQgbmFtZVxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjcuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyBzIC0+IHtzOiB4fSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJvcCBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY2hlY2sgZm9yLlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybiB7Qm9vbGVhbn0gV2hldGhlciB0aGUgcHJvcGVydHkgZXhpc3RzLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIGZ1bmN0aW9uIFJlY3RhbmdsZSh3aWR0aCwgaGVpZ2h0KSB7XG4gKiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICogICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICogICAgICB9XG4gKiAgICAgIFJlY3RhbmdsZS5wcm90b3R5cGUuYXJlYSA9IGZ1bmN0aW9uKCkge1xuICogICAgICAgIHJldHVybiB0aGlzLndpZHRoICogdGhpcy5oZWlnaHQ7XG4gKiAgICAgIH07XG4gKlxuICogICAgICB2YXIgc3F1YXJlID0gbmV3IFJlY3RhbmdsZSgyLCAyKTtcbiAqICAgICAgUi5oYXNJbignd2lkdGgnLCBzcXVhcmUpOyAgLy89PiB0cnVlXG4gKiAgICAgIFIuaGFzSW4oJ2FyZWEnLCBzcXVhcmUpOyAgLy89PiB0cnVlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBoYXNJbihwcm9wLCBvYmopIHtcbiAgcmV0dXJuIHByb3AgaW4gb2JqO1xufSk7XG4iLCJ2YXIgbnRoID0gcmVxdWlyZSgnLi9udGgnKTtcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGdpdmVuIGxpc3Qgb3Igc3RyaW5nLiBJbiBzb21lIGxpYnJhcmllc1xuICogdGhpcyBmdW5jdGlvbiBpcyBuYW1lZCBgZmlyc3RgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW2FdIC0+IGEgfCBVbmRlZmluZWRcbiAqIEBzaWcgU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IGxpc3RcbiAqIEByZXR1cm4geyp9XG4gKiBAc2VlIFIudGFpbCwgUi5pbml0LCBSLmxhc3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmhlYWQoWydmaScsICdmbycsICdmdW0nXSk7IC8vPT4gJ2ZpJ1xuICogICAgICBSLmhlYWQoW10pOyAvLz0+IHVuZGVmaW5lZFxuICpcbiAqICAgICAgUi5oZWFkKCdhYmMnKTsgLy89PiAnYSdcbiAqICAgICAgUi5oZWFkKCcnKTsgLy89PiAnJ1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IG50aCgwKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2lkZW50aXR5KHgpIHsgcmV0dXJuIHg7IH07XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xudmFyIF9pZGVudGl0eSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2lkZW50aXR5Jyk7XG5cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3RoaW5nIGJ1dCByZXR1cm4gdGhlIHBhcmFtZXRlciBzdXBwbGllZCB0byBpdC4gR29vZFxuICogYXMgYSBkZWZhdWx0IG9yIHBsYWNlaG9sZGVyIGZ1bmN0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIGEgLT4gYVxuICogQHBhcmFtIHsqfSB4IFRoZSB2YWx1ZSB0byByZXR1cm4uXG4gKiBAcmV0dXJuIHsqfSBUaGUgaW5wdXQgdmFsdWUsIGB4YC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmlkZW50aXR5KDEpOyAvLz0+IDFcbiAqXG4gKiAgICAgIHZhciBvYmogPSB7fTtcbiAqICAgICAgUi5pZGVudGl0eShvYmopID09PSBvYmo7IC8vPT4gdHJ1ZVxuICogQHN5bWIgUi5pZGVudGl0eShhKSA9IGFcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkxKF9pZGVudGl0eSk7XG4iLCJ2YXIgX2N1cnJ5MyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MycpO1xudmFyIGN1cnJ5TiA9IHJlcXVpcmUoJy4vY3VycnlOJyk7XG5cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3aWxsIHByb2Nlc3MgZWl0aGVyIHRoZSBgb25UcnVlYCBvciB0aGUgYG9uRmFsc2VgXG4gKiBmdW5jdGlvbiBkZXBlbmRpbmcgdXBvbiB0aGUgcmVzdWx0IG9mIHRoZSBgY29uZGl0aW9uYCBwcmVkaWNhdGUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOC4wXG4gKiBAY2F0ZWdvcnkgTG9naWNcbiAqIEBzaWcgKCouLi4gLT4gQm9vbGVhbikgLT4gKCouLi4gLT4gKikgLT4gKCouLi4gLT4gKikgLT4gKCouLi4gLT4gKilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbmRpdGlvbiBBIHByZWRpY2F0ZSBmdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gb25UcnVlIEEgZnVuY3Rpb24gdG8gaW52b2tlIHdoZW4gdGhlIGBjb25kaXRpb25gIGV2YWx1YXRlcyB0byBhIHRydXRoeSB2YWx1ZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRmFsc2UgQSBmdW5jdGlvbiB0byBpbnZva2Ugd2hlbiB0aGUgYGNvbmRpdGlvbmAgZXZhbHVhdGVzIHRvIGEgZmFsc3kgdmFsdWUuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcgdW5hcnkgZnVuY3Rpb24gdGhhdCB3aWxsIHByb2Nlc3MgZWl0aGVyIHRoZSBgb25UcnVlYCBvciB0aGUgYG9uRmFsc2VgXG4gKiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZGVwZW5kaW5nIHVwb24gdGhlIHJlc3VsdCBvZiB0aGUgYGNvbmRpdGlvbmAgcHJlZGljYXRlLlxuICogQHNlZSBSLnVubGVzcywgUi53aGVuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGluY0NvdW50ID0gUi5pZkVsc2UoXG4gKiAgICAgICAgUi5oYXMoJ2NvdW50JyksXG4gKiAgICAgICAgUi5vdmVyKFIubGVuc1Byb3AoJ2NvdW50JyksIFIuaW5jKSxcbiAqICAgICAgICBSLmFzc29jKCdjb3VudCcsIDEpXG4gKiAgICAgICk7XG4gKiAgICAgIGluY0NvdW50KHt9KTsgICAgICAgICAgIC8vPT4geyBjb3VudDogMSB9XG4gKiAgICAgIGluY0NvdW50KHsgY291bnQ6IDEgfSk7IC8vPT4geyBjb3VudDogMiB9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MyhmdW5jdGlvbiBpZkVsc2UoY29uZGl0aW9uLCBvblRydWUsIG9uRmFsc2UpIHtcbiAgcmV0dXJuIGN1cnJ5TihNYXRoLm1heChjb25kaXRpb24ubGVuZ3RoLCBvblRydWUubGVuZ3RoLCBvbkZhbHNlLmxlbmd0aCksXG4gICAgZnVuY3Rpb24gX2lmRWxzZSgpIHtcbiAgICAgIHJldHVybiBjb25kaXRpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKSA/IG9uVHJ1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogb25GYWxzZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgKTtcbn0pO1xuIiwidmFyIGFkZCA9IHJlcXVpcmUoJy4vYWRkJyk7XG5cblxuLyoqXG4gKiBJbmNyZW1lbnRzIGl0cyBhcmd1bWVudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC45LjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IG4gKyAxXG4gKiBAc2VlIFIuZGVjXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pbmMoNDIpOyAvLz0+IDQzXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gYWRkKDEpO1xuIiwidmFyIHJlZHVjZUJ5ID0gcmVxdWlyZSgnLi9yZWR1Y2VCeScpO1xuXG5cbi8qKlxuICogR2l2ZW4gYSBmdW5jdGlvbiB0aGF0IGdlbmVyYXRlcyBhIGtleSwgdHVybnMgYSBsaXN0IG9mIG9iamVjdHMgaW50byBhblxuICogb2JqZWN0IGluZGV4aW5nIHRoZSBvYmplY3RzIGJ5IHRoZSBnaXZlbiBrZXkuIE5vdGUgdGhhdCBpZiBtdWx0aXBsZVxuICogb2JqZWN0cyBnZW5lcmF0ZSB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhlIGluZGV4aW5nIGtleSBvbmx5IHRoZSBsYXN0IHZhbHVlXG4gKiB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgb2JqZWN0LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBTdHJpbmcpIC0+IFt7azogdn1dIC0+IHtrOiB7azogdn19XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiA6OiBhIC0+IFN0cmluZ1xuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IG9mIG9iamVjdHMgdG8gaW5kZXhcbiAqIEByZXR1cm4ge09iamVjdH0gQW4gb2JqZWN0IGluZGV4aW5nIGVhY2ggYXJyYXkgZWxlbWVudCBieSB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGxpc3QgPSBbe2lkOiAneHl6JywgdGl0bGU6ICdBJ30sIHtpZDogJ2FiYycsIHRpdGxlOiAnQid9XTtcbiAqICAgICAgUi5pbmRleEJ5KFIucHJvcCgnaWQnKSwgbGlzdCk7XG4gKiAgICAgIC8vPT4ge2FiYzoge2lkOiAnYWJjJywgdGl0bGU6ICdCJ30sIHh5ejoge2lkOiAneHl6JywgdGl0bGU6ICdBJ319XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gcmVkdWNlQnkoZnVuY3Rpb24oYWNjLCBlbGVtKSB7IHJldHVybiBlbGVtOyB9LCBudWxsKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2luZGV4T2YgPSByZXF1aXJlKCcuL2ludGVybmFsL19pbmRleE9mJyk7XG52YXIgX2lzQXJyYXkgPSByZXF1aXJlKCcuL2ludGVybmFsL19pc0FycmF5Jyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhbiBpdGVtIGluIGFuIGFycmF5LCBvciAtMVxuICogaWYgdGhlIGl0ZW0gaXMgbm90IGluY2x1ZGVkIGluIHRoZSBhcnJheS4gYFIuZXF1YWxzYCBpcyB1c2VkIHRvIGRldGVybWluZVxuICogZXF1YWxpdHkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IFthXSAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSBpdGVtIHRvIGZpbmQuXG4gKiBAcGFyYW0ge0FycmF5fSB4cyBUaGUgYXJyYXkgdG8gc2VhcmNoIGluLlxuICogQHJldHVybiB7TnVtYmVyfSB0aGUgaW5kZXggb2YgdGhlIHRhcmdldCwgb3IgLTEgaWYgdGhlIHRhcmdldCBpcyBub3QgZm91bmQuXG4gKiBAc2VlIFIubGFzdEluZGV4T2ZcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmluZGV4T2YoMywgWzEsMiwzLDRdKTsgLy89PiAyXG4gKiAgICAgIFIuaW5kZXhPZigxMCwgWzEsMiwzLDRdKTsgLy89PiAtMVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gaW5kZXhPZih0YXJnZXQsIHhzKSB7XG4gIHJldHVybiB0eXBlb2YgeHMuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJyAmJiAhX2lzQXJyYXkoeHMpID9cbiAgICB4cy5pbmRleE9mKHRhcmdldCkgOlxuICAgIF9pbmRleE9mKHhzLCB0YXJnZXQsIDApO1xufSk7XG4iLCJ2YXIgc2xpY2UgPSByZXF1aXJlKCcuL3NsaWNlJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFsbCBidXQgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gbGlzdCBvciBzdHJpbmcuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2FdXG4gKiBAc2lnIFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7Kn0gbGlzdFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5sYXN0LCBSLmhlYWQsIFIudGFpbFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaW5pdChbMSwgMiwgM10pOyAgLy89PiBbMSwgMl1cbiAqICAgICAgUi5pbml0KFsxLCAyXSk7ICAgICAvLz0+IFsxXVxuICogICAgICBSLmluaXQoWzFdKTsgICAgICAgIC8vPT4gW11cbiAqICAgICAgUi5pbml0KFtdKTsgICAgICAgICAvLz0+IFtdXG4gKlxuICogICAgICBSLmluaXQoJ2FiYycpOyAgLy89PiAnYWInXG4gKiAgICAgIFIuaW5pdCgnYWInKTsgICAvLz0+ICdhJ1xuICogICAgICBSLmluaXQoJ2EnKTsgICAgLy89PiAnJ1xuICogICAgICBSLmluaXQoJycpOyAgICAgLy89PiAnJ1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IHNsaWNlKDAsIC0xKTtcbiIsInZhciBfY3VycnkzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkzJyk7XG5cblxuLyoqXG4gKiBJbnNlcnRzIHRoZSBzdXBwbGllZCBlbGVtZW50IGludG8gdGhlIGxpc3QsIGF0IGluZGV4IGBpbmRleGAuIF9Ob3RlIHRoYXRcbiAqIHRoaXMgaXMgbm90IGRlc3RydWN0aXZlXzogaXQgcmV0dXJucyBhIGNvcHkgb2YgdGhlIGxpc3Qgd2l0aCB0aGUgY2hhbmdlcy5cbiAqIDxzbWFsbD5ObyBsaXN0cyBoYXZlIGJlZW4gaGFybWVkIGluIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLjwvc21hbGw+XG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMi4yXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gYSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge051bWJlcn0gaW5kZXggVGhlIHBvc2l0aW9uIHRvIGluc2VydCB0aGUgZWxlbWVudFxuICogQHBhcmFtIHsqfSBlbHQgVGhlIGVsZW1lbnQgdG8gaW5zZXJ0IGludG8gdGhlIEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIGluc2VydCBpbnRvXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgQXJyYXkgd2l0aCBgZWx0YCBpbnNlcnRlZCBhdCBgaW5kZXhgLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaW5zZXJ0KDIsICd4JywgWzEsMiwzLDRdKTsgLy89PiBbMSwyLCd4JywzLDRdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MyhmdW5jdGlvbiBpbnNlcnQoaWR4LCBlbHQsIGxpc3QpIHtcbiAgaWR4ID0gaWR4IDwgbGlzdC5sZW5ndGggJiYgaWR4ID49IDAgPyBpZHggOiBsaXN0Lmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIDApO1xuICByZXN1bHQuc3BsaWNlKGlkeCwgMCwgZWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcblxuXG4vKipcbiAqIEluc2VydHMgdGhlIHN1Yi1saXN0IGludG8gdGhlIGxpc3QsIGF0IGluZGV4IGBpbmRleGAuIF9Ob3RlIHRoYXQgdGhpcyBpcyBub3RcbiAqIGRlc3RydWN0aXZlXzogaXQgcmV0dXJucyBhIGNvcHkgb2YgdGhlIGxpc3Qgd2l0aCB0aGUgY2hhbmdlcy5cbiAqIDxzbWFsbD5ObyBsaXN0cyBoYXZlIGJlZW4gaGFybWVkIGluIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLjwvc21hbGw+XG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gW2FdIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleCBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRoZSBzdWItbGlzdFxuICogQHBhcmFtIHtBcnJheX0gZWx0cyBUaGUgc3ViLWxpc3QgdG8gaW5zZXJ0IGludG8gdGhlIEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIGluc2VydCB0aGUgc3ViLWxpc3QgaW50b1xuICogQHJldHVybiB7QXJyYXl9IEEgbmV3IEFycmF5IHdpdGggYGVsdHNgIGluc2VydGVkIHN0YXJ0aW5nIGF0IGBpbmRleGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pbnNlcnRBbGwoMiwgWyd4JywneScsJ3onXSwgWzEsMiwzLDRdKTsgLy89PiBbMSwyLCd4JywneScsJ3onLDMsNF1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkzKGZ1bmN0aW9uIGluc2VydEFsbChpZHgsIGVsdHMsIGxpc3QpIHtcbiAgaWR4ID0gaWR4IDwgbGlzdC5sZW5ndGggJiYgaWR4ID49IDAgPyBpZHggOiBsaXN0Lmxlbmd0aDtcbiAgcmV0dXJuIFtdLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChsaXN0LCAwLCBpZHgpLFxuICAgICAgICAgICAgICAgICAgIGVsdHMsXG4gICAgICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobGlzdCwgaWR4KSk7XG59KTtcbiIsInZhciBfY29udGFpbnMgPSByZXF1aXJlKCcuL19jb250YWlucycpO1xuXG5cbi8vIEEgc2ltcGxlIFNldCB0eXBlIHRoYXQgaG9ub3VycyBSLmVxdWFscyBzZW1hbnRpY3Ncbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBfU2V0KCkge1xuICAgIC8qIGdsb2JhbHMgU2V0ICovXG4gICAgdGhpcy5fbmF0aXZlU2V0ID0gdHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBTZXQoKSA6IG51bGw7XG4gICAgdGhpcy5faXRlbXMgPSB7fTtcbiAgfVxuXG4gIC8vIHVudGlsIHdlIGZpZ3VyZSBvdXQgd2h5IGpzZG9jIGNob2tlcyBvbiB0aGlzXG4gIC8vIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRvIGFkZCB0byB0aGUgU2V0XG4gIC8vIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBpdGVtIGRpZCBub3QgZXhpc3QgcHJpb3IsIG90aGVyd2lzZSBmYWxzZVxuICAvL1xuICBfU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihpdGVtKSB7XG4gICAgcmV0dXJuICFoYXNPckFkZChpdGVtLCB0cnVlLCB0aGlzKTtcbiAgfTtcblxuICAvL1xuICAvLyBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0byBjaGVjayBmb3IgZXhpc3RlbmNlIGluIHRoZSBTZXRcbiAgLy8gQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdGhlIGl0ZW0gZXhpc3RzIGluIHRoZSBTZXQsIG90aGVyd2lzZSBmYWxzZVxuICAvL1xuICBfU2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbihpdGVtKSB7XG4gICAgcmV0dXJuIGhhc09yQWRkKGl0ZW0sIGZhbHNlLCB0aGlzKTtcbiAgfTtcblxuICAvL1xuICAvLyBDb21iaW5lcyB0aGUgbG9naWMgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gaXRlbSBpcyBhIG1lbWJlciBvZiB0aGUgc2V0IGFuZFxuICAvLyBmb3IgYWRkaW5nIGEgbmV3IGl0ZW0gdG8gdGhlIHNldC5cbiAgLy9cbiAgLy8gQHBhcmFtIGl0ZW0gICAgICAgVGhlIGl0ZW0gdG8gY2hlY2sgb3IgYWRkIHRvIHRoZSBTZXQgaW5zdGFuY2UuXG4gIC8vIEBwYXJhbSBzaG91bGRBZGQgIElmIHRydWUsIHRoZSBpdGVtIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNldCBpZiBpdCBkb2Vzbid0XG4gIC8vICAgICAgICAgICAgICAgICAgIGFscmVhZHkgZXhpc3QuXG4gIC8vIEBwYXJhbSBzZXQgICAgICAgIFRoZSBzZXQgaW5zdGFuY2UgdG8gY2hlY2sgb3IgYWRkIHRvLlxuICAvLyBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBpdGVtIGFscmVhZHkgZXhpc3RlZCwgb3RoZXJ3aXNlIGZhbHNlLlxuICAvL1xuICBmdW5jdGlvbiBoYXNPckFkZChpdGVtLCBzaG91bGRBZGQsIHNldCkge1xuICAgIHZhciB0eXBlID0gdHlwZW9mIGl0ZW07XG4gICAgdmFyIHByZXZTaXplLCBuZXdTaXplO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIC8vIGRpc3Rpbmd1aXNoIGJldHdlZW4gKzAgYW5kIC0wXG4gICAgICAgIGlmIChpdGVtID09PSAwICYmIDEgLyBpdGVtID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICBpZiAoc2V0Ll9pdGVtc1snLTAnXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbiAgICAgICAgICAgICAgc2V0Ll9pdGVtc1snLTAnXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHRoZXNlIHR5cGVzIGNhbiBhbGwgdXRpbGlzZSB0aGUgbmF0aXZlIFNldFxuICAgICAgICBpZiAoc2V0Ll9uYXRpdmVTZXQgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICBwcmV2U2l6ZSA9IHNldC5fbmF0aXZlU2V0LnNpemU7XG4gICAgICAgICAgICBzZXQuX25hdGl2ZVNldC5hZGQoaXRlbSk7XG4gICAgICAgICAgICBuZXdTaXplID0gc2V0Ll9uYXRpdmVTZXQuc2l6ZTtcbiAgICAgICAgICAgIHJldHVybiBuZXdTaXplID09PSBwcmV2U2l6ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHNldC5fbmF0aXZlU2V0LmhhcyhpdGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCEodHlwZSBpbiBzZXQuX2l0ZW1zKSkge1xuICAgICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdID0ge307XG4gICAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV1baXRlbV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbiBzZXQuX2l0ZW1zW3R5cGVdKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdW2l0ZW1dID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIC8vIHNldC5faXRlbXNbJ2Jvb2xlYW4nXSBob2xkcyBhIHR3byBlbGVtZW50IGFycmF5XG4gICAgICAgIC8vIHJlcHJlc2VudGluZyBbIGZhbHNlRXhpc3RzLCB0cnVlRXhpc3RzIF1cbiAgICAgICAgaWYgKHR5cGUgaW4gc2V0Ll9pdGVtcykge1xuICAgICAgICAgIHZhciBiSWR4ID0gaXRlbSA/IDEgOiAwO1xuICAgICAgICAgIGlmIChzZXQuX2l0ZW1zW3R5cGVdW2JJZHhdKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdW2JJZHhdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXSA9IGl0ZW0gPyBbZmFsc2UsIHRydWVdIDogW3RydWUsIGZhbHNlXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgLy8gY29tcGFyZSBmdW5jdGlvbnMgZm9yIHJlZmVyZW5jZSBlcXVhbGl0eVxuICAgICAgICBpZiAoc2V0Ll9uYXRpdmVTZXQgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICBwcmV2U2l6ZSA9IHNldC5fbmF0aXZlU2V0LnNpemU7XG4gICAgICAgICAgICBzZXQuX25hdGl2ZVNldC5hZGQoaXRlbSk7XG4gICAgICAgICAgICBuZXdTaXplID0gc2V0Ll9uYXRpdmVTZXQuc2l6ZTtcbiAgICAgICAgICAgIHJldHVybiBuZXdTaXplID09PSBwcmV2U2l6ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHNldC5fbmF0aXZlU2V0LmhhcyhpdGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCEodHlwZSBpbiBzZXQuX2l0ZW1zKSkge1xuICAgICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdID0gW2l0ZW1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIV9jb250YWlucyhpdGVtLCBzZXQuX2l0ZW1zW3R5cGVdKSkge1xuICAgICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIGlmIChzZXQuX2l0ZW1zW3R5cGVdKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuICAgICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBpZiAoaXRlbSA9PT0gbnVsbCkge1xuICAgICAgICAgIGlmICghc2V0Ll9pdGVtc1snbnVsbCddKSB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICAgIHNldC5faXRlbXNbJ251bGwnXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyByZWR1Y2UgdGhlIHNlYXJjaCBzaXplIG9mIGhldGVyb2dlbmVvdXMgc2V0cyBieSBjcmVhdGluZyBidWNrZXRzXG4gICAgICAgIC8vIGZvciBlYWNoIHR5cGUuXG4gICAgICAgIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlbSk7XG4gICAgICAgIGlmICghKHR5cGUgaW4gc2V0Ll9pdGVtcykpIHtcbiAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdID0gW2l0ZW1dO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2NhbiB0aHJvdWdoIGFsbCBwcmV2aW91c2x5IGFwcGxpZWQgaXRlbXNcbiAgICAgICAgaWYgKCFfY29udGFpbnMoaXRlbSwgc2V0Ll9pdGVtc1t0eXBlXSkpIHtcbiAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4gICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdLnB1c2goaXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIF9TZXQ7XG59KCkpO1xuIiwidmFyIF9TZXQgPSByZXF1aXJlKCcuL2ludGVybmFsL19TZXQnKTtcbnZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyBvbmx5IG9uZSBjb3B5IG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgb3JpZ2luYWxcbiAqIGxpc3QsIGJhc2VkIHVwb24gdGhlIHZhbHVlIHJldHVybmVkIGJ5IGFwcGx5aW5nIHRoZSBzdXBwbGllZCBmdW5jdGlvbiB0b1xuICogZWFjaCBsaXN0IGVsZW1lbnQuIFByZWZlcnMgdGhlIGZpcnN0IGl0ZW0gaWYgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIHByb2R1Y2VzXG4gKiB0aGUgc2FtZSB2YWx1ZSBvbiB0d28gaXRlbXMuIGBSLmVxdWFsc2AgaXMgdXNlZCBmb3IgY29tcGFyaXNvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNi4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBiKSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBBIGZ1bmN0aW9uIHVzZWQgdG8gcHJvZHVjZSBhIHZhbHVlIHRvIHVzZSBkdXJpbmcgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgbGlzdCBvZiB1bmlxdWUgaXRlbXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi51bmlxQnkoTWF0aC5hYnMsIFstMSwgLTUsIDIsIDEwLCAxLCAyXSk7IC8vPT4gWy0xLCAtNSwgMiwgMTBdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiB1bmlxQnkoZm4sIGxpc3QpIHtcbiAgdmFyIHNldCA9IG5ldyBfU2V0KCk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBhcHBsaWVkSXRlbSwgaXRlbTtcblxuICB3aGlsZSAoaWR4IDwgbGlzdC5sZW5ndGgpIHtcbiAgICBpdGVtID0gbGlzdFtpZHhdO1xuICAgIGFwcGxpZWRJdGVtID0gZm4oaXRlbSk7XG4gICAgaWYgKHNldC5hZGQoYXBwbGllZEl0ZW0pKSB7XG4gICAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuIiwidmFyIGlkZW50aXR5ID0gcmVxdWlyZSgnLi9pZGVudGl0eScpO1xudmFyIHVuaXFCeSA9IHJlcXVpcmUoJy4vdW5pcUJ5Jyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyBvbmx5IG9uZSBjb3B5IG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgb3JpZ2luYWxcbiAqIGxpc3QuIGBSLmVxdWFsc2AgaXMgdXNlZCB0byBkZXRlcm1pbmUgZXF1YWxpdHkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgbGlzdCBvZiB1bmlxdWUgaXRlbXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi51bmlxKFsxLCAxLCAyLCAxXSk7IC8vPT4gWzEsIDJdXG4gKiAgICAgIFIudW5pcShbMSwgJzEnXSk7ICAgICAvLz0+IFsxLCAnMSddXG4gKiAgICAgIFIudW5pcShbWzQyXSwgWzQyXV0pOyAvLz0+IFtbNDJdXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IHVuaXFCeShpZGVudGl0eSk7XG4iLCJ2YXIgX2NvbnRhaW5zID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY29udGFpbnMnKTtcbnZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2ZpbHRlciA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2ZpbHRlcicpO1xudmFyIGZsaXAgPSByZXF1aXJlKCcuL2ZsaXAnKTtcbnZhciB1bmlxID0gcmVxdWlyZSgnLi91bmlxJyk7XG5cblxuLyoqXG4gKiBDb21iaW5lcyB0d28gbGlzdHMgaW50byBhIHNldCAoaS5lLiBubyBkdXBsaWNhdGVzKSBjb21wb3NlZCBvZiB0aG9zZVxuICogZWxlbWVudHMgY29tbW9uIHRvIGJvdGggbGlzdHMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgWypdIC0+IFsqXSAtPiBbKl1cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QxIFRoZSBmaXJzdCBsaXN0LlxuICogQHBhcmFtIHtBcnJheX0gbGlzdDIgVGhlIHNlY29uZCBsaXN0LlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIGVsZW1lbnRzIGZvdW5kIGluIGJvdGggYGxpc3QxYCBhbmQgYGxpc3QyYC5cbiAqIEBzZWUgUi5pbnRlcnNlY3Rpb25XaXRoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pbnRlcnNlY3Rpb24oWzEsMiwzLDRdLCBbNyw2LDUsNCwzXSk7IC8vPT4gWzQsIDNdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBpbnRlcnNlY3Rpb24obGlzdDEsIGxpc3QyKSB7XG4gIHZhciBsb29rdXBMaXN0LCBmaWx0ZXJlZExpc3Q7XG4gIGlmIChsaXN0MS5sZW5ndGggPiBsaXN0Mi5sZW5ndGgpIHtcbiAgICBsb29rdXBMaXN0ID0gbGlzdDE7XG4gICAgZmlsdGVyZWRMaXN0ID0gbGlzdDI7XG4gIH0gZWxzZSB7XG4gICAgbG9va3VwTGlzdCA9IGxpc3QyO1xuICAgIGZpbHRlcmVkTGlzdCA9IGxpc3QxO1xuICB9XG4gIHJldHVybiB1bmlxKF9maWx0ZXIoZmxpcChfY29udGFpbnMpKGxvb2t1cExpc3QpLCBmaWx0ZXJlZExpc3QpKTtcbn0pO1xuIiwidmFyIF9jb250YWluc1dpdGggPSByZXF1aXJlKCcuL2ludGVybmFsL19jb250YWluc1dpdGgnKTtcbnZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyBvbmx5IG9uZSBjb3B5IG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgb3JpZ2luYWxcbiAqIGxpc3QsIGJhc2VkIHVwb24gdGhlIHZhbHVlIHJldHVybmVkIGJ5IGFwcGx5aW5nIHRoZSBzdXBwbGllZCBwcmVkaWNhdGUgdG9cbiAqIHR3byBsaXN0IGVsZW1lbnRzLiBQcmVmZXJzIHRoZSBmaXJzdCBpdGVtIGlmIHR3byBpdGVtcyBjb21wYXJlIGVxdWFsIGJhc2VkXG4gKiBvbiB0aGUgcHJlZGljYXRlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEsIGEgLT4gQm9vbGVhbikgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZCBBIHByZWRpY2F0ZSB1c2VkIHRvIHRlc3Qgd2hldGhlciB0d28gaXRlbXMgYXJlIGVxdWFsLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGxpc3Qgb2YgdW5pcXVlIGl0ZW1zLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBzdHJFcSA9IFIuZXFCeShTdHJpbmcpO1xuICogICAgICBSLnVuaXFXaXRoKHN0ckVxKShbMSwgJzEnLCAyLCAxXSk7IC8vPT4gWzEsIDJdXG4gKiAgICAgIFIudW5pcVdpdGgoc3RyRXEpKFt7fSwge31dKTsgICAgICAgLy89PiBbe31dXG4gKiAgICAgIFIudW5pcVdpdGgoc3RyRXEpKFsxLCAnMScsIDFdKTsgICAgLy89PiBbMV1cbiAqICAgICAgUi51bmlxV2l0aChzdHJFcSkoWycxJywgMSwgMV0pOyAgICAvLz0+IFsnMSddXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiB1bmlxV2l0aChwcmVkLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGl0ZW07XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBpdGVtID0gbGlzdFtpZHhdO1xuICAgIGlmICghX2NvbnRhaW5zV2l0aChwcmVkLCBpdGVtLCByZXN1bHQpKSB7XG4gICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSBpdGVtO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG4iLCJ2YXIgX2NvbnRhaW5zV2l0aCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2NvbnRhaW5zV2l0aCcpO1xudmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcbnZhciB1bmlxV2l0aCA9IHJlcXVpcmUoJy4vdW5pcVdpdGgnKTtcblxuXG4vKipcbiAqIENvbWJpbmVzIHR3byBsaXN0cyBpbnRvIGEgc2V0IChpLmUuIG5vIGR1cGxpY2F0ZXMpIGNvbXBvc2VkIG9mIHRob3NlXG4gKiBlbGVtZW50cyBjb21tb24gdG8gYm90aCBsaXN0cy4gRHVwbGljYXRpb24gaXMgZGV0ZXJtaW5lZCBhY2NvcmRpbmcgdG8gdGhlXG4gKiB2YWx1ZSByZXR1cm5lZCBieSBhcHBseWluZyB0aGUgc3VwcGxpZWQgcHJlZGljYXRlIHRvIHR3byBsaXN0IGVsZW1lbnRzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnICgoYSwgYSkgLT4gQm9vbGVhbikgLT4gW2FdIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgQSBwcmVkaWNhdGUgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXJcbiAqICAgICAgICB0aGUgdHdvIHN1cHBsaWVkIGVsZW1lbnRzIGFyZSBlcXVhbC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QxIE9uZSBsaXN0IG9mIGl0ZW1zIHRvIGNvbXBhcmVcbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QyIEEgc2Vjb25kIGxpc3Qgb2YgaXRlbXMgdG8gY29tcGFyZVxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3IGxpc3QgY29udGFpbmluZyB0aG9zZSBlbGVtZW50cyBjb21tb24gdG8gYm90aCBsaXN0cy5cbiAqIEBzZWUgUi5pbnRlcnNlY3Rpb25cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgYnVmZmFsb1NwcmluZ2ZpZWxkID0gW1xuICogICAgICAgIHtpZDogODI0LCBuYW1lOiAnUmljaGllIEZ1cmF5J30sXG4gKiAgICAgICAge2lkOiA5NTYsIG5hbWU6ICdEZXdleSBNYXJ0aW4nfSxcbiAqICAgICAgICB7aWQ6IDMxMywgbmFtZTogJ0JydWNlIFBhbG1lcid9LFxuICogICAgICAgIHtpZDogNDU2LCBuYW1lOiAnU3RlcGhlbiBTdGlsbHMnfSxcbiAqICAgICAgICB7aWQ6IDE3NywgbmFtZTogJ05laWwgWW91bmcnfVxuICogICAgICBdO1xuICogICAgICB2YXIgY3NueSA9IFtcbiAqICAgICAgICB7aWQ6IDIwNCwgbmFtZTogJ0RhdmlkIENyb3NieSd9LFxuICogICAgICAgIHtpZDogNDU2LCBuYW1lOiAnU3RlcGhlbiBTdGlsbHMnfSxcbiAqICAgICAgICB7aWQ6IDUzOSwgbmFtZTogJ0dyYWhhbSBOYXNoJ30sXG4gKiAgICAgICAge2lkOiAxNzcsIG5hbWU6ICdOZWlsIFlvdW5nJ31cbiAqICAgICAgXTtcbiAqXG4gKiAgICAgIFIuaW50ZXJzZWN0aW9uV2l0aChSLmVxQnkoUi5wcm9wKCdpZCcpKSwgYnVmZmFsb1NwcmluZ2ZpZWxkLCBjc255KTtcbiAqICAgICAgLy89PiBbe2lkOiA0NTYsIG5hbWU6ICdTdGVwaGVuIFN0aWxscyd9LCB7aWQ6IDE3NywgbmFtZTogJ05laWwgWW91bmcnfV1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkzKGZ1bmN0aW9uIGludGVyc2VjdGlvbldpdGgocHJlZCwgbGlzdDEsIGxpc3QyKSB7XG4gIHZhciBsb29rdXBMaXN0LCBmaWx0ZXJlZExpc3Q7XG4gIGlmIChsaXN0MS5sZW5ndGggPiBsaXN0Mi5sZW5ndGgpIHtcbiAgICBsb29rdXBMaXN0ID0gbGlzdDE7XG4gICAgZmlsdGVyZWRMaXN0ID0gbGlzdDI7XG4gIH0gZWxzZSB7XG4gICAgbG9va3VwTGlzdCA9IGxpc3QyO1xuICAgIGZpbHRlcmVkTGlzdCA9IGxpc3QxO1xuICB9XG4gIHZhciByZXN1bHRzID0gW107XG4gIHZhciBpZHggPSAwO1xuICB3aGlsZSAoaWR4IDwgZmlsdGVyZWRMaXN0Lmxlbmd0aCkge1xuICAgIGlmIChfY29udGFpbnNXaXRoKHByZWQsIGZpbHRlcmVkTGlzdFtpZHhdLCBsb29rdXBMaXN0KSkge1xuICAgICAgcmVzdWx0c1tyZXN1bHRzLmxlbmd0aF0gPSBmaWx0ZXJlZExpc3RbaWR4XTtcbiAgICB9XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHVuaXFXaXRoKHByZWQsIHJlc3VsdHMpO1xufSk7XG4iLCJ2YXIgX2NoZWNrRm9yTWV0aG9kID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY2hlY2tGb3JNZXRob2QnKTtcbnZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGxpc3Qgd2l0aCB0aGUgc2VwYXJhdG9yIGludGVycG9zZWQgYmV0d2VlbiBlbGVtZW50cy5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgaW50ZXJzcGVyc2VgIG1ldGhvZCBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBwcmVzZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE0LjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIGEgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHsqfSBzZXBhcmF0b3IgVGhlIGVsZW1lbnQgdG8gYWRkIHRvIHRoZSBsaXN0LlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBiZSBpbnRlcnBvc2VkLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBuZXcgbGlzdC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmludGVyc3BlcnNlKCduJywgWydiYScsICdhJywgJ2EnXSk7IC8vPT4gWydiYScsICduJywgJ2EnLCAnbicsICdhJ11cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKF9jaGVja0Zvck1ldGhvZCgnaW50ZXJzcGVyc2UnLCBmdW5jdGlvbiBpbnRlcnNwZXJzZShzZXBhcmF0b3IsIGxpc3QpIHtcbiAgdmFyIG91dCA9IFtdO1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICB3aGlsZSAoaWR4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGlkeCA9PT0gbGVuZ3RoIC0gMSkge1xuICAgICAgb3V0LnB1c2gobGlzdFtpZHhdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0LnB1c2gobGlzdFtpZHhdLCBzZXBhcmF0b3IpO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gb3V0O1xufSkpO1xuIiwidmFyIF9oYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2Fzc2lnblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfb2JqZWN0QXNzaWduKHRhcmdldCkge1xuICBpZiAodGFyZ2V0ID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgfVxuXG4gIHZhciBvdXRwdXQgPSBPYmplY3QodGFyZ2V0KTtcbiAgdmFyIGlkeCA9IDE7XG4gIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB3aGlsZSAoaWR4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpZHhdO1xuICAgIGlmIChzb3VyY2UgIT0gbnVsbCkge1xuICAgICAgZm9yICh2YXIgbmV4dEtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKF9oYXMobmV4dEtleSwgc291cmNlKSkge1xuICAgICAgICAgIG91dHB1dFtuZXh0S2V5XSA9IHNvdXJjZVtuZXh0S2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufTtcbiIsInZhciBfb2JqZWN0QXNzaWduID0gcmVxdWlyZSgnLi9fb2JqZWN0QXNzaWduJyk7XG5cbm1vZHVsZS5leHBvcnRzID1cbiAgdHlwZW9mIE9iamVjdC5hc3NpZ24gPT09ICdmdW5jdGlvbicgPyBPYmplY3QuYXNzaWduIDogX29iamVjdEFzc2lnbjtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCBjb250YWluaW5nIGEgc2luZ2xlIGtleTp2YWx1ZSBwYWlyLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE4LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgU3RyaW5nIC0+IGEgLT4ge1N0cmluZzphfVxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHBhcmFtIHsqfSB2YWxcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBzZWUgUi5wYWlyXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIG1hdGNoUGhyYXNlcyA9IFIuY29tcG9zZShcbiAqICAgICAgICBSLm9iak9mKCdtdXN0JyksXG4gKiAgICAgICAgUi5tYXAoUi5vYmpPZignbWF0Y2hfcGhyYXNlJykpXG4gKiAgICAgICk7XG4gKiAgICAgIG1hdGNoUGhyYXNlcyhbJ2ZvbycsICdiYXInLCAnYmF6J10pOyAvLz0+IHttdXN0OiBbe21hdGNoX3BocmFzZTogJ2Zvbyd9LCB7bWF0Y2hfcGhyYXNlOiAnYmFyJ30sIHttYXRjaF9waHJhc2U6ICdiYXonfV19XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBvYmpPZihrZXksIHZhbCkge1xuICB2YXIgb2JqID0ge307XG4gIG9ialtrZXldID0gdmFsO1xuICByZXR1cm4gb2JqO1xufSk7XG4iLCJ2YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJy4vX2Fzc2lnbicpO1xudmFyIF9pZGVudGl0eSA9IHJlcXVpcmUoJy4vX2lkZW50aXR5Jyk7XG52YXIgX2lzVHJhbnNmb3JtZXIgPSByZXF1aXJlKCcuL19pc1RyYW5zZm9ybWVyJyk7XG52YXIgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuLi9pc0FycmF5TGlrZScpO1xudmFyIG9iak9mID0gcmVxdWlyZSgnLi4vb2JqT2YnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgdmFyIF9zdGVwQ2F0QXJyYXkgPSB7XG4gICAgJ0BAdHJhbnNkdWNlci9pbml0JzogQXJyYXksXG4gICAgJ0BAdHJhbnNkdWNlci9zdGVwJzogZnVuY3Rpb24oeHMsIHgpIHtcbiAgICAgIHhzLnB1c2goeCk7XG4gICAgICByZXR1cm4geHM7XG4gICAgfSxcbiAgICAnQEB0cmFuc2R1Y2VyL3Jlc3VsdCc6IF9pZGVudGl0eVxuICB9O1xuICB2YXIgX3N0ZXBDYXRTdHJpbmcgPSB7XG4gICAgJ0BAdHJhbnNkdWNlci9pbml0JzogU3RyaW5nLFxuICAgICdAQHRyYW5zZHVjZXIvc3RlcCc6IGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGEgKyBiOyB9LFxuICAgICdAQHRyYW5zZHVjZXIvcmVzdWx0JzogX2lkZW50aXR5XG4gIH07XG4gIHZhciBfc3RlcENhdE9iamVjdCA9IHtcbiAgICAnQEB0cmFuc2R1Y2VyL2luaXQnOiBPYmplY3QsXG4gICAgJ0BAdHJhbnNkdWNlci9zdGVwJzogZnVuY3Rpb24ocmVzdWx0LCBpbnB1dCkge1xuICAgICAgcmV0dXJuIF9hc3NpZ24oXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgaXNBcnJheUxpa2UoaW5wdXQpID8gb2JqT2YoaW5wdXRbMF0sIGlucHV0WzFdKSA6IGlucHV0XG4gICAgICApO1xuICAgIH0sXG4gICAgJ0BAdHJhbnNkdWNlci9yZXN1bHQnOiBfaWRlbnRpdHlcbiAgfTtcblxuICByZXR1cm4gZnVuY3Rpb24gX3N0ZXBDYXQob2JqKSB7XG4gICAgaWYgKF9pc1RyYW5zZm9ybWVyKG9iaikpIHtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIGlmIChpc0FycmF5TGlrZShvYmopKSB7XG4gICAgICByZXR1cm4gX3N0ZXBDYXRBcnJheTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gX3N0ZXBDYXRTdHJpbmc7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIF9zdGVwQ2F0T2JqZWN0O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgdHJhbnNmb3JtZXIgZm9yICcgKyBvYmopO1xuICB9O1xufSgpKTtcbiIsInZhciBfY2xvbmUgPSByZXF1aXJlKCcuL2ludGVybmFsL19jbG9uZScpO1xudmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcbnZhciBfaXNUcmFuc2Zvcm1lciA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2lzVHJhbnNmb3JtZXInKTtcbnZhciBfcmVkdWNlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fcmVkdWNlJyk7XG52YXIgX3N0ZXBDYXQgPSByZXF1aXJlKCcuL2ludGVybmFsL19zdGVwQ2F0Jyk7XG5cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSBpdGVtcyBvZiB0aGUgbGlzdCB3aXRoIHRoZSB0cmFuc2R1Y2VyIGFuZCBhcHBlbmRzIHRoZVxuICogdHJhbnNmb3JtZWQgaXRlbXMgdG8gdGhlIGFjY3VtdWxhdG9yIHVzaW5nIGFuIGFwcHJvcHJpYXRlIGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKiBiYXNlZCBvbiB0aGUgYWNjdW11bGF0b3IgdHlwZS5cbiAqXG4gKiBUaGUgYWNjdW11bGF0b3IgY2FuIGJlIGFuIGFycmF5LCBzdHJpbmcsIG9iamVjdCBvciBhIHRyYW5zZm9ybWVyLiBJdGVyYXRlZFxuICogaXRlbXMgd2lsbCBiZSBhcHBlbmRlZCB0byBhcnJheXMgYW5kIGNvbmNhdGVuYXRlZCB0byBzdHJpbmdzLiBPYmplY3RzIHdpbGxcbiAqIGJlIG1lcmdlZCBkaXJlY3RseSBvciAyLWl0ZW0gYXJyYXlzIHdpbGwgYmUgbWVyZ2VkIGFzIGtleSwgdmFsdWUgcGFpcnMuXG4gKlxuICogVGhlIGFjY3VtdWxhdG9yIGNhbiBhbHNvIGJlIGEgdHJhbnNmb3JtZXIgb2JqZWN0IHRoYXQgcHJvdmlkZXMgYSAyLWFyaXR5XG4gKiByZWR1Y2luZyBpdGVyYXRvciBmdW5jdGlvbiwgc3RlcCwgMC1hcml0eSBpbml0aWFsIHZhbHVlIGZ1bmN0aW9uLCBpbml0LCBhbmRcbiAqIDEtYXJpdHkgcmVzdWx0IGV4dHJhY3Rpb24gZnVuY3Rpb24gcmVzdWx0LiBUaGUgc3RlcCBmdW5jdGlvbiBpcyB1c2VkIGFzIHRoZVxuICogaXRlcmF0b3IgZnVuY3Rpb24gaW4gcmVkdWNlLiBUaGUgcmVzdWx0IGZ1bmN0aW9uIGlzIHVzZWQgdG8gY29udmVydCB0aGVcbiAqIGZpbmFsIGFjY3VtdWxhdG9yIGludG8gdGhlIHJldHVybiB0eXBlIGFuZCBpbiBtb3N0IGNhc2VzIGlzIFIuaWRlbnRpdHkuIFRoZVxuICogaW5pdCBmdW5jdGlvbiBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGluaXRpYWwgYWNjdW11bGF0b3IuXG4gKlxuICogVGhlIGl0ZXJhdGlvbiBpcyBwZXJmb3JtZWQgd2l0aCBSLnJlZHVjZSBhZnRlciBpbml0aWFsaXppbmcgdGhlIHRyYW5zZHVjZXIuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTIuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgYSAtPiAoYiAtPiBiKSAtPiBbY10gLT4gYVxuICogQHBhcmFtIHsqfSBhY2MgVGhlIGluaXRpYWwgYWNjdW11bGF0b3IgdmFsdWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB4ZiBUaGUgdHJhbnNkdWNlciBmdW5jdGlvbi4gUmVjZWl2ZXMgYSB0cmFuc2Zvcm1lciBhbmQgcmV0dXJucyBhIHRyYW5zZm9ybWVyLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJuIHsqfSBUaGUgZmluYWwsIGFjY3VtdWxhdGVkIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBudW1iZXJzID0gWzEsIDIsIDMsIDRdO1xuICogICAgICB2YXIgdHJhbnNkdWNlciA9IFIuY29tcG9zZShSLm1hcChSLmFkZCgxKSksIFIudGFrZSgyKSk7XG4gKlxuICogICAgICBSLmludG8oW10sIHRyYW5zZHVjZXIsIG51bWJlcnMpOyAvLz0+IFsyLCAzXVxuICpcbiAqICAgICAgdmFyIGludG9BcnJheSA9IFIuaW50byhbXSk7XG4gKiAgICAgIGludG9BcnJheSh0cmFuc2R1Y2VyLCBudW1iZXJzKTsgLy89PiBbMiwgM11cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkzKGZ1bmN0aW9uIGludG8oYWNjLCB4ZiwgbGlzdCkge1xuICByZXR1cm4gX2lzVHJhbnNmb3JtZXIoYWNjKSA/XG4gICAgX3JlZHVjZSh4ZihhY2MpLCBhY2NbJ0BAdHJhbnNkdWNlci9pbml0J10oKSwgbGlzdCkgOlxuICAgIF9yZWR1Y2UoeGYoX3N0ZXBDYXQoYWNjKSksIF9jbG9uZShhY2MsIFtdLCBbXSwgZmFsc2UpLCBsaXN0KTtcbn0pO1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcbnZhciBfaGFzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9faGFzJyk7XG52YXIga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG5cbi8qKlxuICogU2FtZSBhcyBSLmludmVydE9iaiwgaG93ZXZlciB0aGlzIGFjY291bnRzIGZvciBvYmplY3RzIHdpdGggZHVwbGljYXRlIHZhbHVlc1xuICogYnkgcHV0dGluZyB0aGUgdmFsdWVzIGludG8gYW4gYXJyYXkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHtzOiB4fSAtPiB7eDogWyBzLCAuLi4gXX1cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCBvciBhcnJheSB0byBpbnZlcnRcbiAqIEByZXR1cm4ge09iamVjdH0gb3V0IEEgbmV3IG9iamVjdCB3aXRoIGtleXNcbiAqIGluIGFuIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciByYWNlUmVzdWx0c0J5Rmlyc3ROYW1lID0ge1xuICogICAgICAgIGZpcnN0OiAnYWxpY2UnLFxuICogICAgICAgIHNlY29uZDogJ2pha2UnLFxuICogICAgICAgIHRoaXJkOiAnYWxpY2UnLFxuICogICAgICB9O1xuICogICAgICBSLmludmVydChyYWNlUmVzdWx0c0J5Rmlyc3ROYW1lKTtcbiAqICAgICAgLy89PiB7ICdhbGljZSc6IFsnZmlyc3QnLCAndGhpcmQnXSwgJ2pha2UnOlsnc2Vjb25kJ10gfVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoZnVuY3Rpb24gaW52ZXJ0KG9iaikge1xuICB2YXIgcHJvcHMgPSBrZXlzKG9iaik7XG4gIHZhciBsZW4gPSBwcm9wcy5sZW5ndGg7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgb3V0ID0ge307XG5cbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIHZhciBrZXkgPSBwcm9wc1tpZHhdO1xuICAgIHZhciB2YWwgPSBvYmpba2V5XTtcbiAgICB2YXIgbGlzdCA9IF9oYXModmFsLCBvdXQpID8gb3V0W3ZhbF0gOiAob3V0W3ZhbF0gPSBbXSk7XG4gICAgbGlzdFtsaXN0Lmxlbmd0aF0gPSBrZXk7XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn0pO1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcbnZhciBrZXlzID0gcmVxdWlyZSgnLi9rZXlzJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBrZXlzIG9mIHRoZSBnaXZlbiBvYmplY3QgYXMgdmFsdWVzLCBhbmQgdGhlXG4gKiB2YWx1ZXMgb2YgdGhlIGdpdmVuIG9iamVjdCwgd2hpY2ggYXJlIGNvZXJjZWQgdG8gc3RyaW5ncywgYXMga2V5cy4gTm90ZVxuICogdGhhdCB0aGUgbGFzdCBrZXkgZm91bmQgaXMgcHJlZmVycmVkIHdoZW4gaGFuZGxpbmcgdGhlIHNhbWUgdmFsdWUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHtzOiB4fSAtPiB7eDogc31cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCBvciBhcnJheSB0byBpbnZlcnRcbiAqIEByZXR1cm4ge09iamVjdH0gb3V0IEEgbmV3IG9iamVjdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciByYWNlUmVzdWx0cyA9IHtcbiAqICAgICAgICBmaXJzdDogJ2FsaWNlJyxcbiAqICAgICAgICBzZWNvbmQ6ICdqYWtlJ1xuICogICAgICB9O1xuICogICAgICBSLmludmVydE9iaihyYWNlUmVzdWx0cyk7XG4gKiAgICAgIC8vPT4geyAnYWxpY2UnOiAnZmlyc3QnLCAnamFrZSc6J3NlY29uZCcgfVxuICpcbiAqICAgICAgLy8gQWx0ZXJuYXRpdmVseTpcbiAqICAgICAgdmFyIHJhY2VSZXN1bHRzID0gWydhbGljZScsICdqYWtlJ107XG4gKiAgICAgIFIuaW52ZXJ0T2JqKHJhY2VSZXN1bHRzKTtcbiAqICAgICAgLy89PiB7ICdhbGljZSc6ICcwJywgJ2pha2UnOicxJyB9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MShmdW5jdGlvbiBpbnZlcnRPYmoob2JqKSB7XG4gIHZhciBwcm9wcyA9IGtleXMob2JqKTtcbiAgdmFyIGxlbiA9IHByb3BzLmxlbmd0aDtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBvdXQgPSB7fTtcblxuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgdmFyIGtleSA9IHByb3BzW2lkeF07XG4gICAgb3V0W29ialtrZXldXSA9IGtleTtcbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gb3V0O1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIF9pc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9faXNGdW5jdGlvbicpO1xudmFyIGN1cnJ5TiA9IHJlcXVpcmUoJy4vY3VycnlOJyk7XG52YXIgdG9TdHJpbmcgPSByZXF1aXJlKCcuL3RvU3RyaW5nJyk7XG5cblxuLyoqXG4gKiBUdXJucyBhIG5hbWVkIG1ldGhvZCB3aXRoIGEgc3BlY2lmaWVkIGFyaXR5IGludG8gYSBmdW5jdGlvbiB0aGF0IGNhbiBiZVxuICogY2FsbGVkIGRpcmVjdGx5IHN1cHBsaWVkIHdpdGggYXJndW1lbnRzIGFuZCBhIHRhcmdldCBvYmplY3QuXG4gKlxuICogVGhlIHJldHVybmVkIGZ1bmN0aW9uIGlzIGN1cnJpZWQgYW5kIGFjY2VwdHMgYGFyaXR5ICsgMWAgcGFyYW1ldGVycyB3aGVyZVxuICogdGhlIGZpbmFsIHBhcmFtZXRlciBpcyB0aGUgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBOdW1iZXIgLT4gU3RyaW5nIC0+IChhIC0+IGIgLT4gLi4uIC0+IG4gLT4gT2JqZWN0IC0+ICopXG4gKiBAcGFyYW0ge051bWJlcn0gYXJpdHkgTnVtYmVyIG9mIGFyZ3VtZW50cyB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gc2hvdWxkIHRha2VcbiAqICAgICAgICBiZWZvcmUgdGhlIHRhcmdldCBvYmplY3QuXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kIE5hbWUgb2YgdGhlIG1ldGhvZCB0byBjYWxsLlxuICogQHJldHVybiB7RnVuY3Rpb259IEEgbmV3IGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIHNsaWNlRnJvbSA9IFIuaW52b2tlcigxLCAnc2xpY2UnKTtcbiAqICAgICAgc2xpY2VGcm9tKDYsICdhYmNkZWZnaGlqa2xtJyk7IC8vPT4gJ2doaWprbG0nXG4gKiAgICAgIHZhciBzbGljZUZyb202ID0gUi5pbnZva2VyKDIsICdzbGljZScpKDYpO1xuICogICAgICBzbGljZUZyb202KDgsICdhYmNkZWZnaGlqa2xtJyk7IC8vPT4gJ2doJ1xuICogQHN5bWIgUi5pbnZva2VyKDAsICdtZXRob2QnKShvKSA9IG9bJ21ldGhvZCddKClcbiAqIEBzeW1iIFIuaW52b2tlcigxLCAnbWV0aG9kJykoYSwgbykgPSBvWydtZXRob2QnXShhKVxuICogQHN5bWIgUi5pbnZva2VyKDIsICdtZXRob2QnKShhLCBiLCBvKSA9IG9bJ21ldGhvZCddKGEsIGIpXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBpbnZva2VyKGFyaXR5LCBtZXRob2QpIHtcbiAgcmV0dXJuIGN1cnJ5Tihhcml0eSArIDEsIGZ1bmN0aW9uKCkge1xuICAgIHZhciB0YXJnZXQgPSBhcmd1bWVudHNbYXJpdHldO1xuICAgIGlmICh0YXJnZXQgIT0gbnVsbCAmJiBfaXNGdW5jdGlvbih0YXJnZXRbbWV0aG9kXSkpIHtcbiAgICAgIHJldHVybiB0YXJnZXRbbWV0aG9kXS5hcHBseSh0YXJnZXQsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCwgYXJpdHkpKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcih0b1N0cmluZyh0YXJnZXQpICsgJyBkb2VzIG5vdCBoYXZlIGEgbWV0aG9kIG5hbWVkIFwiJyArIG1ldGhvZCArICdcIicpO1xuICB9KTtcbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIFNlZSBpZiBhbiBvYmplY3QgKGB2YWxgKSBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3VwcGxpZWQgY29uc3RydWN0b3IuIFRoaXNcbiAqIGZ1bmN0aW9uIHdpbGwgY2hlY2sgdXAgdGhlIGluaGVyaXRhbmNlIGNoYWluLCBpZiBhbnkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMy4wXG4gKiBAY2F0ZWdvcnkgVHlwZVxuICogQHNpZyAoKiAtPiB7Kn0pIC0+IGEgLT4gQm9vbGVhblxuICogQHBhcmFtIHtPYmplY3R9IGN0b3IgQSBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5pcyhPYmplY3QsIHt9KTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaXMoTnVtYmVyLCAxKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaXMoT2JqZWN0LCAxKTsgLy89PiBmYWxzZVxuICogICAgICBSLmlzKFN0cmluZywgJ3MnKTsgLy89PiB0cnVlXG4gKiAgICAgIFIuaXMoU3RyaW5nLCBuZXcgU3RyaW5nKCcnKSk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmlzKE9iamVjdCwgbmV3IFN0cmluZygnJykpOyAvLz0+IHRydWVcbiAqICAgICAgUi5pcyhPYmplY3QsICdzJyk7IC8vPT4gZmFsc2VcbiAqICAgICAgUi5pcyhOdW1iZXIsIHt9KTsgLy89PiBmYWxzZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gaXMoQ3RvciwgdmFsKSB7XG4gIHJldHVybiB2YWwgIT0gbnVsbCAmJiB2YWwuY29uc3RydWN0b3IgPT09IEN0b3IgfHwgdmFsIGluc3RhbmNlb2YgQ3Rvcjtcbn0pO1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcbnZhciBlbXB0eSA9IHJlcXVpcmUoJy4vZW1wdHknKTtcbnZhciBlcXVhbHMgPSByZXF1aXJlKCcuL2VxdWFscycpO1xuXG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGl0cyB0eXBlJ3MgZW1wdHkgdmFsdWU7IGBmYWxzZWBcbiAqIG90aGVyd2lzZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMb2dpY1xuICogQHNpZyBhIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0geFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBzZWUgUi5lbXB0eVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuaXNFbXB0eShbMSwgMiwgM10pOyAgIC8vPT4gZmFsc2VcbiAqICAgICAgUi5pc0VtcHR5KFtdKTsgICAgICAgICAgLy89PiB0cnVlXG4gKiAgICAgIFIuaXNFbXB0eSgnJyk7ICAgICAgICAgIC8vPT4gdHJ1ZVxuICogICAgICBSLmlzRW1wdHkobnVsbCk7ICAgICAgICAvLz0+IGZhbHNlXG4gKiAgICAgIFIuaXNFbXB0eSh7fSk7ICAgICAgICAgIC8vPT4gdHJ1ZVxuICogICAgICBSLmlzRW1wdHkoe2xlbmd0aDogMH0pOyAvLz0+IGZhbHNlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MShmdW5jdGlvbiBpc0VtcHR5KHgpIHtcbiAgcmV0dXJuIHggIT0gbnVsbCAmJiBlcXVhbHMoeCwgZW1wdHkoeCkpO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xuXG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBpbnB1dCB2YWx1ZSBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOS4wXG4gKiBAY2F0ZWdvcnkgVHlwZVxuICogQHNpZyAqIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0geCBUaGUgdmFsdWUgdG8gdGVzdC5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiBgeGAgaXMgYHVuZGVmaW5lZGAgb3IgYG51bGxgLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmlzTmlsKG51bGwpOyAvLz0+IHRydWVcbiAqICAgICAgUi5pc05pbCh1bmRlZmluZWQpOyAvLz0+IHRydWVcbiAqICAgICAgUi5pc05pbCgwKTsgLy89PiBmYWxzZVxuICogICAgICBSLmlzTmlsKFtdKTsgLy89PiBmYWxzZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoZnVuY3Rpb24gaXNOaWwoeCkgeyByZXR1cm4geCA9PSBudWxsOyB9KTtcbiIsInZhciBpbnZva2VyID0gcmVxdWlyZSgnLi9pbnZva2VyJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIG1hZGUgYnkgaW5zZXJ0aW5nIHRoZSBgc2VwYXJhdG9yYCBiZXR3ZWVuIGVhY2ggZWxlbWVudCBhbmRcbiAqIGNvbmNhdGVuYXRpbmcgYWxsIHRoZSBlbGVtZW50cyBpbnRvIGEgc2luZ2xlIHN0cmluZy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFN0cmluZyAtPiBbYV0gLT4gU3RyaW5nXG4gKiBAcGFyYW0ge051bWJlcnxTdHJpbmd9IHNlcGFyYXRvciBUaGUgc3RyaW5nIHVzZWQgdG8gc2VwYXJhdGUgdGhlIGVsZW1lbnRzLlxuICogQHBhcmFtIHtBcnJheX0geHMgVGhlIGVsZW1lbnRzIHRvIGpvaW4gaW50byBhIHN0cmluZy5cbiAqIEByZXR1cm4ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgbWFkZSBieSBjb25jYXRlbmF0aW5nIGB4c2Agd2l0aCBgc2VwYXJhdG9yYC5cbiAqIEBzZWUgUi5zcGxpdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBzcGFjZXIgPSBSLmpvaW4oJyAnKTtcbiAqICAgICAgc3BhY2VyKFsnYScsIDIsIDMuNF0pOyAgIC8vPT4gJ2EgMiAzLjQnXG4gKiAgICAgIFIuam9pbignfCcsIFsxLCAyLCAzXSk7ICAgIC8vPT4gJzF8MnwzJ1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IGludm9rZXIoMSwgJ2pvaW4nKTtcbiIsInZhciBfY3VycnkxID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkxJyk7XG52YXIgY29udmVyZ2UgPSByZXF1aXJlKCcuL2NvbnZlcmdlJyk7XG5cblxuLyoqXG4gKiBqdXh0IGFwcGxpZXMgYSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBhIGxpc3Qgb2YgdmFsdWVzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE5LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBbKGEsIGIsIC4uLiwgbSkgLT4gbl0gLT4gKChhLCBiLCAuLi4sIG0pIC0+IFtuXSlcbiAqIEBwYXJhbSB7QXJyYXl9IGZucyBBbiBhcnJheSBvZiBmdW5jdGlvbnNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGxpc3Qgb2YgdmFsdWVzIGFmdGVyIGFwcGx5aW5nIGVhY2ggb2YgdGhlIG9yaWdpbmFsIGBmbnNgIHRvIGl0cyBwYXJhbWV0ZXJzLlxuICogQHNlZSBSLmFwcGx5U3BlY1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBnZXRSYW5nZSA9IFIuanV4dChbTWF0aC5taW4sIE1hdGgubWF4XSk7XG4gKiAgICAgIGdldFJhbmdlKDMsIDQsIDksIC0zKTsgLy89PiBbLTMsIDldXG4gKiBAc3ltYiBSLmp1eHQoW2YsIGcsIGhdKShhLCBiKSA9IFtmKGEsIGIpLCBnKGEsIGIpLCBoKGEsIGIpXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoZnVuY3Rpb24ganV4dChmbnMpIHtcbiAgcmV0dXJuIGNvbnZlcmdlKGZ1bmN0aW9uKCkgeyByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTsgfSwgZm5zKTtcbn0pO1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBsaXN0IGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGFsbCB0aGUgcHJvcGVydGllcyBvZiB0aGUgc3VwcGxpZWRcbiAqIG9iamVjdCwgaW5jbHVkaW5nIHByb3RvdHlwZSBwcm9wZXJ0aWVzLlxuICogTm90ZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUgb3V0cHV0IGFycmF5IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbnNpc3RlbnRcbiAqIGFjcm9zcyBkaWZmZXJlbnQgSlMgcGxhdGZvcm1zLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7azogdn0gLT4gW2tdXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gZXh0cmFjdCBwcm9wZXJ0aWVzIGZyb21cbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiB0aGUgb2JqZWN0J3Mgb3duIGFuZCBwcm90b3R5cGUgcHJvcGVydGllcy5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgRiA9IGZ1bmN0aW9uKCkgeyB0aGlzLnggPSAnWCc7IH07XG4gKiAgICAgIEYucHJvdG90eXBlLnkgPSAnWSc7XG4gKiAgICAgIHZhciBmID0gbmV3IEYoKTtcbiAqICAgICAgUi5rZXlzSW4oZik7IC8vPT4gWyd4JywgJ3knXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoZnVuY3Rpb24ga2V5c0luKG9iaikge1xuICB2YXIgcHJvcDtcbiAgdmFyIGtzID0gW107XG4gIGZvciAocHJvcCBpbiBvYmopIHtcbiAgICBrc1trcy5sZW5ndGhdID0gcHJvcDtcbiAgfVxuICByZXR1cm4ga3M7XG59KTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2lzQXJyYXkgPSByZXF1aXJlKCcuL2ludGVybmFsL19pc0FycmF5Jyk7XG52YXIgZXF1YWxzID0gcmVxdWlyZSgnLi9lcXVhbHMnKTtcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgYW4gaXRlbSBpbiBhbiBhcnJheSwgb3IgLTEgaWZcbiAqIHRoZSBpdGVtIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgYXJyYXkuIGBSLmVxdWFsc2AgaXMgdXNlZCB0byBkZXRlcm1pbmVcbiAqIGVxdWFsaXR5LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgYSAtPiBbYV0gLT4gTnVtYmVyXG4gKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgaXRlbSB0byBmaW5kLlxuICogQHBhcmFtIHtBcnJheX0geHMgVGhlIGFycmF5IHRvIHNlYXJjaCBpbi5cbiAqIEByZXR1cm4ge051bWJlcn0gdGhlIGluZGV4IG9mIHRoZSB0YXJnZXQsIG9yIC0xIGlmIHRoZSB0YXJnZXQgaXMgbm90IGZvdW5kLlxuICogQHNlZSBSLmluZGV4T2ZcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmxhc3RJbmRleE9mKDMsIFstMSwzLDMsMCwxLDIsMyw0XSk7IC8vPT4gNlxuICogICAgICBSLmxhc3RJbmRleE9mKDEwLCBbMSwyLDMsNF0pOyAvLz0+IC0xXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBsYXN0SW5kZXhPZih0YXJnZXQsIHhzKSB7XG4gIGlmICh0eXBlb2YgeHMubGFzdEluZGV4T2YgPT09ICdmdW5jdGlvbicgJiYgIV9pc0FycmF5KHhzKSkge1xuICAgIHJldHVybiB4cy5sYXN0SW5kZXhPZih0YXJnZXQpO1xuICB9IGVsc2Uge1xuICAgIHZhciBpZHggPSB4cy5sZW5ndGggLSAxO1xuICAgIHdoaWxlIChpZHggPj0gMCkge1xuICAgICAgaWYgKGVxdWFscyh4c1tpZHhdLCB0YXJnZXQpKSB7XG4gICAgICAgIHJldHVybiBpZHg7XG4gICAgICB9XG4gICAgICBpZHggLT0gMTtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX2lzTnVtYmVyKHgpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgTnVtYmVyXSc7XG59O1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcbnZhciBfaXNOdW1iZXIgPSByZXF1aXJlKCcuL2ludGVybmFsL19pc051bWJlcicpO1xuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheSBieSByZXR1cm5pbmcgYGxpc3QubGVuZ3RoYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4zLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFthXSAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBsZW5ndGggb2YgdGhlIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIubGVuZ3RoKFtdKTsgLy89PiAwXG4gKiAgICAgIFIubGVuZ3RoKFsxLCAyLCAzXSk7IC8vPT4gM1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoZnVuY3Rpb24gbGVuZ3RoKGxpc3QpIHtcbiAgcmV0dXJuIGxpc3QgIT0gbnVsbCAmJiBfaXNOdW1iZXIobGlzdC5sZW5ndGgpID8gbGlzdC5sZW5ndGggOiBOYU47XG59KTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgbWFwID0gcmVxdWlyZSgnLi9tYXAnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBsZW5zIGZvciB0aGUgZ2l2ZW4gZ2V0dGVyIGFuZCBzZXR0ZXIgZnVuY3Rpb25zLiBUaGUgZ2V0dGVyIFwiZ2V0c1wiXG4gKiB0aGUgdmFsdWUgb2YgdGhlIGZvY3VzOyB0aGUgc2V0dGVyIFwic2V0c1wiIHRoZSB2YWx1ZSBvZiB0aGUgZm9jdXMuIFRoZSBzZXR0ZXJcbiAqIHNob3VsZCBub3QgbXV0YXRlIHRoZSBkYXRhIHN0cnVjdHVyZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC44LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIChzIC0+IGEpIC0+ICgoYSwgcykgLT4gcykgLT4gTGVucyBzIGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGdldHRlclxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyXG4gKiBAcmV0dXJuIHtMZW5zfVxuICogQHNlZSBSLnZpZXcsIFIuc2V0LCBSLm92ZXIsIFIubGVuc0luZGV4LCBSLmxlbnNQcm9wXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIHhMZW5zID0gUi5sZW5zKFIucHJvcCgneCcpLCBSLmFzc29jKCd4JykpO1xuICpcbiAqICAgICAgUi52aWV3KHhMZW5zLCB7eDogMSwgeTogMn0pOyAgICAgICAgICAgIC8vPT4gMVxuICogICAgICBSLnNldCh4TGVucywgNCwge3g6IDEsIHk6IDJ9KTsgICAgICAgICAgLy89PiB7eDogNCwgeTogMn1cbiAqICAgICAgUi5vdmVyKHhMZW5zLCBSLm5lZ2F0ZSwge3g6IDEsIHk6IDJ9KTsgIC8vPT4ge3g6IC0xLCB5OiAyfVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gbGVucyhnZXR0ZXIsIHNldHRlcikge1xuICByZXR1cm4gZnVuY3Rpb24odG9GdW5jdG9yRm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICByZXR1cm4gbWFwKFxuICAgICAgICBmdW5jdGlvbihmb2N1cykge1xuICAgICAgICAgIHJldHVybiBzZXR0ZXIoZm9jdXMsIHRhcmdldCk7XG4gICAgICAgIH0sXG4gICAgICAgIHRvRnVuY3RvckZuKGdldHRlcih0YXJnZXQpKVxuICAgICAgKTtcbiAgICB9O1xuICB9O1xufSk7XG4iLCJ2YXIgX2N1cnJ5MyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MycpO1xudmFyIGFkanVzdCA9IHJlcXVpcmUoJy4vYWRqdXN0Jyk7XG52YXIgYWx3YXlzID0gcmVxdWlyZSgnLi9hbHdheXMnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgY29weSBvZiB0aGUgYXJyYXkgd2l0aCB0aGUgZWxlbWVudCBhdCB0aGUgcHJvdmlkZWQgaW5kZXhcbiAqIHJlcGxhY2VkIHdpdGggdGhlIGdpdmVuIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE0LjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIE51bWJlciAtPiBhIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7TnVtYmVyfSBpZHggVGhlIGluZGV4IHRvIHVwZGF0ZS5cbiAqIEBwYXJhbSB7Kn0geCBUaGUgdmFsdWUgdG8gZXhpc3QgYXQgdGhlIGdpdmVuIGluZGV4IG9mIHRoZSByZXR1cm5lZCBhcnJheS5cbiAqIEBwYXJhbSB7QXJyYXl8QXJndW1lbnRzfSBsaXN0IFRoZSBzb3VyY2UgYXJyYXktbGlrZSBvYmplY3QgdG8gYmUgdXBkYXRlZC5cbiAqIEByZXR1cm4ge0FycmF5fSBBIGNvcHkgb2YgYGxpc3RgIHdpdGggdGhlIHZhbHVlIGF0IGluZGV4IGBpZHhgIHJlcGxhY2VkIHdpdGggYHhgLlxuICogQHNlZSBSLmFkanVzdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudXBkYXRlKDEsIDExLCBbMCwgMSwgMl0pOyAgICAgLy89PiBbMCwgMTEsIDJdXG4gKiAgICAgIFIudXBkYXRlKDEpKDExKShbMCwgMSwgMl0pOyAgICAgLy89PiBbMCwgMTEsIDJdXG4gKiBAc3ltYiBSLnVwZGF0ZSgtMSwgYSwgW2IsIGNdKSA9IFtiLCBhXVxuICogQHN5bWIgUi51cGRhdGUoMCwgYSwgW2IsIGNdKSA9IFthLCBjXVxuICogQHN5bWIgUi51cGRhdGUoMSwgYSwgW2IsIGNdKSA9IFtiLCBhXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTMoZnVuY3Rpb24gdXBkYXRlKGlkeCwgeCwgbGlzdCkge1xuICByZXR1cm4gYWRqdXN0KGFsd2F5cyh4KSwgaWR4LCBsaXN0KTtcbn0pO1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcbnZhciBsZW5zID0gcmVxdWlyZSgnLi9sZW5zJyk7XG52YXIgbnRoID0gcmVxdWlyZSgnLi9udGgnKTtcbnZhciB1cGRhdGUgPSByZXF1aXJlKCcuL3VwZGF0ZScpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIGxlbnMgd2hvc2UgZm9jdXMgaXMgdGhlIHNwZWNpZmllZCBpbmRleC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gTGVucyBzIGEgPSBGdW5jdG9yIGYgPT4gKGEgLT4gZiBhKSAtPiBzIC0+IGYgc1xuICogQHNpZyBOdW1iZXIgLT4gTGVucyBzIGFcbiAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gKiBAcmV0dXJuIHtMZW5zfVxuICogQHNlZSBSLnZpZXcsIFIuc2V0LCBSLm92ZXJcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgaGVhZExlbnMgPSBSLmxlbnNJbmRleCgwKTtcbiAqXG4gKiAgICAgIFIudmlldyhoZWFkTGVucywgWydhJywgJ2InLCAnYyddKTsgICAgICAgICAgICAvLz0+ICdhJ1xuICogICAgICBSLnNldChoZWFkTGVucywgJ3gnLCBbJ2EnLCAnYicsICdjJ10pOyAgICAgICAgLy89PiBbJ3gnLCAnYicsICdjJ11cbiAqICAgICAgUi5vdmVyKGhlYWRMZW5zLCBSLnRvVXBwZXIsIFsnYScsICdiJywgJ2MnXSk7IC8vPT4gWydBJywgJ2InLCAnYyddXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MShmdW5jdGlvbiBsZW5zSW5kZXgobikge1xuICByZXR1cm4gbGVucyhudGgobiksIHVwZGF0ZShuKSk7XG59KTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgdmFsdWUgYXQgYSBnaXZlbiBwYXRoLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludFxuICogQHNpZyBbSWR4XSAtPiB7YX0gLT4gYSB8IFVuZGVmaW5lZFxuICogQHBhcmFtIHtBcnJheX0gcGF0aCBUaGUgcGF0aCB0byB1c2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcmV0cmlldmUgdGhlIG5lc3RlZCBwcm9wZXJ0eSBmcm9tLlxuICogQHJldHVybiB7Kn0gVGhlIGRhdGEgYXQgYHBhdGhgLlxuICogQHNlZSBSLnByb3BcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnBhdGgoWydhJywgJ2InXSwge2E6IHtiOiAyfX0pOyAvLz0+IDJcbiAqICAgICAgUi5wYXRoKFsnYScsICdiJ10sIHtjOiB7YjogMn19KTsgLy89PiB1bmRlZmluZWRcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIHBhdGgocGF0aHMsIG9iaikge1xuICB2YXIgdmFsID0gb2JqO1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IHBhdGhzLmxlbmd0aCkge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YWwgPSB2YWxbcGF0aHNbaWR4XV07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHZhbDtcbn0pO1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcbnZhciBhc3NvY1BhdGggPSByZXF1aXJlKCcuL2Fzc29jUGF0aCcpO1xudmFyIGxlbnMgPSByZXF1aXJlKCcuL2xlbnMnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgnLi9wYXRoJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgbGVucyB3aG9zZSBmb2N1cyBpcyB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIElkeCA9IFN0cmluZyB8IEludFxuICogQHR5cGVkZWZuIExlbnMgcyBhID0gRnVuY3RvciBmID0+IChhIC0+IGYgYSkgLT4gcyAtPiBmIHNcbiAqIEBzaWcgW0lkeF0gLT4gTGVucyBzIGFcbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gdXNlLlxuICogQHJldHVybiB7TGVuc31cbiAqIEBzZWUgUi52aWV3LCBSLnNldCwgUi5vdmVyXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIHhIZWFkWUxlbnMgPSBSLmxlbnNQYXRoKFsneCcsIDAsICd5J10pO1xuICpcbiAqICAgICAgUi52aWV3KHhIZWFkWUxlbnMsIHt4OiBbe3k6IDIsIHo6IDN9LCB7eTogNCwgejogNX1dfSk7XG4gKiAgICAgIC8vPT4gMlxuICogICAgICBSLnNldCh4SGVhZFlMZW5zLCAxLCB7eDogW3t5OiAyLCB6OiAzfSwge3k6IDQsIHo6IDV9XX0pO1xuICogICAgICAvLz0+IHt4OiBbe3k6IDEsIHo6IDN9LCB7eTogNCwgejogNX1dfVxuICogICAgICBSLm92ZXIoeEhlYWRZTGVucywgUi5uZWdhdGUsIHt4OiBbe3k6IDIsIHo6IDN9LCB7eTogNCwgejogNX1dfSk7XG4gKiAgICAgIC8vPT4ge3g6IFt7eTogLTIsIHo6IDN9LCB7eTogNCwgejogNX1dfVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoZnVuY3Rpb24gbGVuc1BhdGgocCkge1xuICByZXR1cm4gbGVucyhwYXRoKHApLCBhc3NvY1BhdGgocCkpO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xudmFyIGFzc29jID0gcmVxdWlyZSgnLi9hc3NvYycpO1xudmFyIGxlbnMgPSByZXF1aXJlKCcuL2xlbnMnKTtcbnZhciBwcm9wID0gcmVxdWlyZSgnLi9wcm9wJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgbGVucyB3aG9zZSBmb2N1cyBpcyB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE0LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIFN0cmluZyAtPiBMZW5zIHMgYVxuICogQHBhcmFtIHtTdHJpbmd9IGtcbiAqIEByZXR1cm4ge0xlbnN9XG4gKiBAc2VlIFIudmlldywgUi5zZXQsIFIub3ZlclxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciB4TGVucyA9IFIubGVuc1Byb3AoJ3gnKTtcbiAqXG4gKiAgICAgIFIudmlldyh4TGVucywge3g6IDEsIHk6IDJ9KTsgICAgICAgICAgICAvLz0+IDFcbiAqICAgICAgUi5zZXQoeExlbnMsIDQsIHt4OiAxLCB5OiAyfSk7ICAgICAgICAgIC8vPT4ge3g6IDQsIHk6IDJ9XG4gKiAgICAgIFIub3Zlcih4TGVucywgUi5uZWdhdGUsIHt4OiAxLCB5OiAyfSk7ICAvLz0+IHt4OiAtMSwgeTogMn1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkxKGZ1bmN0aW9uIGxlbnNQcm9wKGspIHtcbiAgcmV0dXJuIGxlbnMocHJvcChrKSwgYXNzb2MoaykpO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGxlc3MgdGhhbiB0aGUgc2Vjb25kOyBgZmFsc2VgXG4gKiBvdGhlcndpc2UuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgT3JkIGEgPT4gYSAtPiBhIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0gYVxuICogQHBhcmFtIHsqfSBiXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHNlZSBSLmd0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5sdCgyLCAxKTsgLy89PiBmYWxzZVxuICogICAgICBSLmx0KDIsIDIpOyAvLz0+IGZhbHNlXG4gKiAgICAgIFIubHQoMiwgMyk7IC8vPT4gdHJ1ZVxuICogICAgICBSLmx0KCdhJywgJ3onKTsgLy89PiB0cnVlXG4gKiAgICAgIFIubHQoJ3onLCAnYScpOyAvLz0+IGZhbHNlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBsdChhLCBiKSB7IHJldHVybiBhIDwgYjsgfSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2Vjb25kO1xuICogYGZhbHNlYCBvdGhlcndpc2UuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgT3JkIGEgPT4gYSAtPiBhIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7TnVtYmVyfSBhXG4gKiBAcGFyYW0ge051bWJlcn0gYlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBzZWUgUi5ndGVcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLmx0ZSgyLCAxKTsgLy89PiBmYWxzZVxuICogICAgICBSLmx0ZSgyLCAyKTsgLy89PiB0cnVlXG4gKiAgICAgIFIubHRlKDIsIDMpOyAvLz0+IHRydWVcbiAqICAgICAgUi5sdGUoJ2EnLCAneicpOyAvLz0+IHRydWVcbiAqICAgICAgUi5sdGUoJ3onLCAnYScpOyAvLz0+IGZhbHNlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBsdGUoYSwgYikgeyByZXR1cm4gYSA8PSBiOyB9KTtcbiIsInZhciBfY3VycnkzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkzJyk7XG5cblxuLyoqXG4gKiBUaGUgbWFwQWNjdW0gZnVuY3Rpb24gYmVoYXZlcyBsaWtlIGEgY29tYmluYXRpb24gb2YgbWFwIGFuZCByZWR1Y2U7IGl0XG4gKiBhcHBsaWVzIGEgZnVuY3Rpb24gdG8gZWFjaCBlbGVtZW50IG9mIGEgbGlzdCwgcGFzc2luZyBhbiBhY2N1bXVsYXRpbmdcbiAqIHBhcmFtZXRlciBmcm9tIGxlZnQgdG8gcmlnaHQsIGFuZCByZXR1cm5pbmcgYSBmaW5hbCB2YWx1ZSBvZiB0aGlzXG4gKiBhY2N1bXVsYXRvciB0b2dldGhlciB3aXRoIHRoZSBuZXcgbGlzdC5cbiAqXG4gKiBUaGUgaXRlcmF0b3IgZnVuY3Rpb24gcmVjZWl2ZXMgdHdvIGFyZ3VtZW50cywgKmFjYyogYW5kICp2YWx1ZSosIGFuZCBzaG91bGRcbiAqIHJldHVybiBhIHR1cGxlICpbYWNjLCB2YWx1ZV0qLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEwLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhY2MgLT4geCAtPiAoYWNjLCB5KSkgLT4gYWNjIC0+IFt4XSAtPiAoYWNjLCBbeV0pXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGV2ZXJ5IGVsZW1lbnQgb2YgdGhlIGlucHV0IGBsaXN0YC5cbiAqIEBwYXJhbSB7Kn0gYWNjIFRoZSBhY2N1bXVsYXRvciB2YWx1ZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybiB7Kn0gVGhlIGZpbmFsLCBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqIEBzZWUgUi5hZGRJbmRleCwgUi5tYXBBY2N1bVJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGRpZ2l0cyA9IFsnMScsICcyJywgJzMnLCAnNCddO1xuICogICAgICB2YXIgYXBwZW5kZXIgPSAoYSwgYikgPT4gW2EgKyBiLCBhICsgYl07XG4gKlxuICogICAgICBSLm1hcEFjY3VtKGFwcGVuZGVyLCAwLCBkaWdpdHMpOyAvLz0+IFsnMDEyMzQnLCBbJzAxJywgJzAxMicsICcwMTIzJywgJzAxMjM0J11dXG4gKiBAc3ltYiBSLm1hcEFjY3VtKGYsIGEsIFtiLCBjLCBkXSkgPSBbXG4gKiAgIGYoZihmKGEsIGIpWzBdLCBjKVswXSwgZClbMF0sXG4gKiAgIFtcbiAqICAgICBmKGEsIGIpWzFdLFxuICogICAgIGYoZihhLCBiKVswXSwgYylbMV0sXG4gKiAgICAgZihmKGYoYSwgYilbMF0sIGMpWzBdLCBkKVsxXVxuICogICBdXG4gKiBdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MyhmdW5jdGlvbiBtYXBBY2N1bShmbiwgYWNjLCBsaXN0KSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIHR1cGxlID0gW2FjY107XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICB0dXBsZSA9IGZuKHR1cGxlWzBdLCBsaXN0W2lkeF0pO1xuICAgIHJlc3VsdFtpZHhdID0gdHVwbGVbMV07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIFt0dXBsZVswXSwgcmVzdWx0XTtcbn0pO1xuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcblxuXG4vKipcbiAqIFRoZSBtYXBBY2N1bVJpZ2h0IGZ1bmN0aW9uIGJlaGF2ZXMgbGlrZSBhIGNvbWJpbmF0aW9uIG9mIG1hcCBhbmQgcmVkdWNlOyBpdFxuICogYXBwbGllcyBhIGZ1bmN0aW9uIHRvIGVhY2ggZWxlbWVudCBvZiBhIGxpc3QsIHBhc3NpbmcgYW4gYWNjdW11bGF0aW5nXG4gKiBwYXJhbWV0ZXIgZnJvbSByaWdodCB0byBsZWZ0LCBhbmQgcmV0dXJuaW5nIGEgZmluYWwgdmFsdWUgb2YgdGhpc1xuICogYWNjdW11bGF0b3IgdG9nZXRoZXIgd2l0aCB0aGUgbmV3IGxpc3QuXG4gKlxuICogU2ltaWxhciB0byBgbWFwQWNjdW1gLCBleGNlcHQgbW92ZXMgdGhyb3VnaCB0aGUgaW5wdXQgbGlzdCBmcm9tIHRoZSByaWdodCB0b1xuICogdGhlIGxlZnQuXG4gKlxuICogVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIHJlY2VpdmVzIHR3byBhcmd1bWVudHMsICp2YWx1ZSogYW5kICphY2MqLCBhbmQgc2hvdWxkXG4gKiByZXR1cm4gYSB0dXBsZSAqW3ZhbHVlLCBhY2NdKi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xMC4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoeC0+IGFjYyAtPiAoeSwgYWNjKSkgLT4gYWNjIC0+IFt4XSAtPiAoW3ldLCBhY2MpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGV2ZXJ5IGVsZW1lbnQgb2YgdGhlIGlucHV0IGBsaXN0YC5cbiAqIEBwYXJhbSB7Kn0gYWNjIFRoZSBhY2N1bXVsYXRvciB2YWx1ZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybiB7Kn0gVGhlIGZpbmFsLCBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqIEBzZWUgUi5hZGRJbmRleCwgUi5tYXBBY2N1bVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBkaWdpdHMgPSBbJzEnLCAnMicsICczJywgJzQnXTtcbiAqICAgICAgdmFyIGFwcGVuZCA9IChhLCBiKSA9PiBbYSArIGIsIGEgKyBiXTtcbiAqXG4gKiAgICAgIFIubWFwQWNjdW1SaWdodChhcHBlbmQsIDUsIGRpZ2l0cyk7IC8vPT4gW1snMTIzNDUnLCAnMjM0NScsICczNDUnLCAnNDUnXSwgJzEyMzQ1J11cbiAqIEBzeW1iIFIubWFwQWNjdW1SaWdodChmLCBhLCBbYiwgYywgZF0pID0gW1xuICogICBbXG4gKiAgICAgZihiLCBmKGMsIGYoZCwgYSlbMF0pWzBdKVsxXSxcbiAqICAgICBmKGMsIGYoZCwgYSlbMF0pWzFdLFxuICogICAgIGYoZCwgYSlbMV0sXG4gKiAgIF1cbiAqICAgZihiLCBmKGMsIGYoZCwgYSlbMF0pWzBdKVswXSxcbiAqIF1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkzKGZ1bmN0aW9uIG1hcEFjY3VtUmlnaHQoZm4sIGFjYywgbGlzdCkge1xuICB2YXIgaWR4ID0gbGlzdC5sZW5ndGggLSAxO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciB0dXBsZSA9IFthY2NdO1xuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICB0dXBsZSA9IGZuKGxpc3RbaWR4XSwgdHVwbGVbMF0pO1xuICAgIHJlc3VsdFtpZHhdID0gdHVwbGVbMV07XG4gICAgaWR4IC09IDE7XG4gIH1cbiAgcmV0dXJuIFtyZXN1bHQsIHR1cGxlWzBdXTtcbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcbnZhciBfcmVkdWNlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fcmVkdWNlJyk7XG52YXIga2V5cyA9IHJlcXVpcmUoJy4va2V5cycpO1xuXG5cbi8qKlxuICogQW4gT2JqZWN0LXNwZWNpZmljIHZlcnNpb24gb2YgYG1hcGAuIFRoZSBmdW5jdGlvbiBpcyBhcHBsaWVkIHRvIHRocmVlXG4gKiBhcmd1bWVudHM6ICoodmFsdWUsIGtleSwgb2JqKSouIElmIG9ubHkgdGhlIHZhbHVlIGlzIHNpZ25pZmljYW50LCB1c2VcbiAqIGBtYXBgIGluc3RlYWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnICgoKiwgU3RyaW5nLCBPYmplY3QpIC0+ICopIC0+IE9iamVjdCAtPiBPYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAc2VlIFIubWFwXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIHZhbHVlcyA9IHsgeDogMSwgeTogMiwgejogMyB9O1xuICogICAgICB2YXIgcHJlcGVuZEtleUFuZERvdWJsZSA9IChudW0sIGtleSwgb2JqKSA9PiBrZXkgKyAobnVtICogMik7XG4gKlxuICogICAgICBSLm1hcE9iakluZGV4ZWQocHJlcGVuZEtleUFuZERvdWJsZSwgdmFsdWVzKTsgLy89PiB7IHg6ICd4MicsIHk6ICd5NCcsIHo6ICd6NicgfVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gbWFwT2JqSW5kZXhlZChmbiwgb2JqKSB7XG4gIHJldHVybiBfcmVkdWNlKGZ1bmN0aW9uKGFjYywga2V5KSB7XG4gICAgYWNjW2tleV0gPSBmbihvYmpba2V5XSwga2V5LCBvYmopO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9LCBrZXlzKG9iaikpO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogVGVzdHMgYSByZWd1bGFyIGV4cHJlc3Npb24gYWdhaW5zdCBhIFN0cmluZy4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbFxuICogcmV0dXJuIGFuIGVtcHR5IGFycmF5IHdoZW4gdGhlcmUgYXJlIG5vIG1hdGNoZXMuIFRoaXMgZGlmZmVycyBmcm9tXG4gKiBbYFN0cmluZy5wcm90b3R5cGUubWF0Y2hgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvbWF0Y2gpXG4gKiB3aGljaCByZXR1cm5zIGBudWxsYCB3aGVuIHRoZXJlIGFyZSBubyBtYXRjaGVzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHNpZyBSZWdFeHAgLT4gU3RyaW5nIC0+IFtTdHJpbmcgfCBVbmRlZmluZWRdXG4gKiBAcGFyYW0ge1JlZ0V4cH0gcnggQSByZWd1bGFyIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBzdHJpbmcgdG8gbWF0Y2ggYWdhaW5zdFxuICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIG1hdGNoZXMgb3IgZW1wdHkgYXJyYXkuXG4gKiBAc2VlIFIudGVzdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIubWF0Y2goLyhbYS16XWEpL2csICdiYW5hbmFzJyk7IC8vPT4gWydiYScsICduYScsICduYSddXG4gKiAgICAgIFIubWF0Y2goL2EvLCAnYicpOyAvLz0+IFtdXG4gKiAgICAgIFIubWF0Y2goL2EvLCBudWxsKTsgLy89PiBUeXBlRXJyb3I6IG51bGwgZG9lcyBub3QgaGF2ZSBhIG1ldGhvZCBuYW1lZCBcIm1hdGNoXCJcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIG1hdGNoKHJ4LCBzdHIpIHtcbiAgcmV0dXJuIHN0ci5tYXRjaChyeCkgfHwgW107XG59KTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2lzSW50ZWdlciA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2lzSW50ZWdlcicpO1xuXG5cbi8qKlxuICogbWF0aE1vZCBiZWhhdmVzIGxpa2UgdGhlIG1vZHVsbyBvcGVyYXRvciBzaG91bGQgbWF0aGVtYXRpY2FsbHksIHVubGlrZSB0aGVcbiAqIGAlYCBvcGVyYXRvciAoYW5kIGJ5IGV4dGVuc2lvbiwgUi5tb2R1bG8pLiBTbyB3aGlsZSBcIi0xNyAlIDVcIiBpcyAtMixcbiAqIG1hdGhNb2QoLTE3LCA1KSBpcyAzLiBtYXRoTW9kIHJlcXVpcmVzIEludGVnZXIgYXJndW1lbnRzLCBhbmQgcmV0dXJucyBOYU5cbiAqIHdoZW4gdGhlIG1vZHVsdXMgaXMgemVybyBvciBuZWdhdGl2ZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4zLjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAc2lnIE51bWJlciAtPiBOdW1iZXIgLT4gTnVtYmVyXG4gKiBAcGFyYW0ge051bWJlcn0gbSBUaGUgZGl2aWRlbmQuXG4gKiBAcGFyYW0ge051bWJlcn0gcCB0aGUgbW9kdWx1cy5cbiAqIEByZXR1cm4ge051bWJlcn0gVGhlIHJlc3VsdCBvZiBgYiBtb2QgYWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5tYXRoTW9kKC0xNywgNSk7ICAvLz0+IDNcbiAqICAgICAgUi5tYXRoTW9kKDE3LCA1KTsgICAvLz0+IDJcbiAqICAgICAgUi5tYXRoTW9kKDE3LCAtNSk7ICAvLz0+IE5hTlxuICogICAgICBSLm1hdGhNb2QoMTcsIDApOyAgIC8vPT4gTmFOXG4gKiAgICAgIFIubWF0aE1vZCgxNy4yLCA1KTsgLy89PiBOYU5cbiAqICAgICAgUi5tYXRoTW9kKDE3LCA1LjMpOyAvLz0+IE5hTlxuICpcbiAqICAgICAgdmFyIGNsb2NrID0gUi5tYXRoTW9kKFIuX18sIDEyKTtcbiAqICAgICAgY2xvY2soMTUpOyAvLz0+IDNcbiAqICAgICAgY2xvY2soMjQpOyAvLz0+IDBcbiAqXG4gKiAgICAgIHZhciBzZXZlbnRlZW5Nb2QgPSBSLm1hdGhNb2QoMTcpO1xuICogICAgICBzZXZlbnRlZW5Nb2QoMyk7ICAvLz0+IDJcbiAqICAgICAgc2V2ZW50ZWVuTW9kKDQpOyAgLy89PiAxXG4gKiAgICAgIHNldmVudGVlbk1vZCgxMCk7IC8vPT4gN1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gbWF0aE1vZChtLCBwKSB7XG4gIGlmICghX2lzSW50ZWdlcihtKSkgeyByZXR1cm4gTmFOOyB9XG4gIGlmICghX2lzSW50ZWdlcihwKSB8fCBwIDwgMSkgeyByZXR1cm4gTmFOOyB9XG4gIHJldHVybiAoKG0gJSBwKSArIHApICUgcDtcbn0pO1xuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcblxuXG4vKipcbiAqIFRha2VzIGEgZnVuY3Rpb24gYW5kIHR3byB2YWx1ZXMsIGFuZCByZXR1cm5zIHdoaWNoZXZlciB2YWx1ZSBwcm9kdWNlcyB0aGVcbiAqIGxhcmdlciByZXN1bHQgd2hlbiBwYXNzZWQgdG8gdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjguMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIE9yZCBiID0+IChhIC0+IGIpIC0+IGEgLT4gYSAtPiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5tYXgsIFIubWluQnlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICAvLyAgc3F1YXJlIDo6IE51bWJlciAtPiBOdW1iZXJcbiAqICAgICAgdmFyIHNxdWFyZSA9IG4gPT4gbiAqIG47XG4gKlxuICogICAgICBSLm1heEJ5KHNxdWFyZSwgLTMsIDIpOyAvLz0+IC0zXG4gKlxuICogICAgICBSLnJlZHVjZShSLm1heEJ5KHNxdWFyZSksIDAsIFszLCAtNSwgNCwgMSwgLTJdKTsgLy89PiAtNVxuICogICAgICBSLnJlZHVjZShSLm1heEJ5KHNxdWFyZSksIDAsIFtdKTsgLy89PiAwXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MyhmdW5jdGlvbiBtYXhCeShmLCBhLCBiKSB7XG4gIHJldHVybiBmKGIpID4gZihhKSA/IGIgOiBhO1xufSk7XG4iLCJ2YXIgYWRkID0gcmVxdWlyZSgnLi9hZGQnKTtcbnZhciByZWR1Y2UgPSByZXF1aXJlKCcuL3JlZHVjZScpO1xuXG5cbi8qKlxuICogQWRkcyB0b2dldGhlciBhbGwgdGhlIGVsZW1lbnRzIG9mIGEgbGlzdC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAc2lnIFtOdW1iZXJdIC0+IE51bWJlclxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBBbiBhcnJheSBvZiBudW1iZXJzXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBzdW0gb2YgYWxsIHRoZSBudW1iZXJzIGluIHRoZSBsaXN0LlxuICogQHNlZSBSLnJlZHVjZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuc3VtKFsyLDQsNiw4LDEwMCwxXSk7IC8vPT4gMTIxXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gcmVkdWNlKGFkZCwgMCk7XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xudmFyIHN1bSA9IHJlcXVpcmUoJy4vc3VtJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtZWFuIG9mIHRoZSBnaXZlbiBsaXN0IG9mIG51bWJlcnMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTQuMFxuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBzaWcgW051bWJlcl0gLT4gTnVtYmVyXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0XG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5tZWFuKFsyLCA3LCA5XSk7IC8vPT4gNlxuICogICAgICBSLm1lYW4oW10pOyAvLz0+IE5hTlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoZnVuY3Rpb24gbWVhbihsaXN0KSB7XG4gIHJldHVybiBzdW0obGlzdCkgLyBsaXN0Lmxlbmd0aDtcbn0pO1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcbnZhciBtZWFuID0gcmVxdWlyZSgnLi9tZWFuJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtZWRpYW4gb2YgdGhlIGdpdmVuIGxpc3Qgb2YgbnVtYmVycy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNC4wXG4gKiBAY2F0ZWdvcnkgTWF0aFxuICogQHNpZyBbTnVtYmVyXSAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3RcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm1lZGlhbihbMiwgOSwgN10pOyAvLz0+IDdcbiAqICAgICAgUi5tZWRpYW4oWzcsIDIsIDEwLCA5XSk7IC8vPT4gOFxuICogICAgICBSLm1lZGlhbihbXSk7IC8vPT4gTmFOXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MShmdW5jdGlvbiBtZWRpYW4obGlzdCkge1xuICB2YXIgbGVuID0gbGlzdC5sZW5ndGg7XG4gIGlmIChsZW4gPT09IDApIHtcbiAgICByZXR1cm4gTmFOO1xuICB9XG4gIHZhciB3aWR0aCA9IDIgLSBsZW4gJSAyO1xuICB2YXIgaWR4ID0gKGxlbiAtIHdpZHRoKSAvIDI7XG4gIHJldHVybiBtZWFuKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIDApLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDtcbiAgfSkuc2xpY2UoaWR4LCBpZHggKyB3aWR0aCkpO1xufSk7XG4iLCJ2YXIgX2FyaXR5ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fYXJpdHknKTtcbnZhciBfY3VycnkxID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkxJyk7XG52YXIgX2hhcyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2hhcycpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi90b1N0cmluZycpO1xuXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmdW5jdGlvbiB0aGF0LCB3aGVuIGludm9rZWQsIGNhY2hlcyB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgYGZuYFxuICogZm9yIGEgZ2l2ZW4gYXJndW1lbnQgc2V0IGFuZCByZXR1cm5zIHRoZSByZXN1bHQuIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlXG4gKiBtZW1vaXplZCBgZm5gIHdpdGggdGhlIHNhbWUgYXJndW1lbnQgc2V0IHdpbGwgbm90IHJlc3VsdCBpbiBhbiBhZGRpdGlvbmFsXG4gKiBjYWxsIHRvIGBmbmA7IGluc3RlYWQsIHRoZSBjYWNoZWQgcmVzdWx0IGZvciB0aGF0IHNldCBvZiBhcmd1bWVudHMgd2lsbCBiZVxuICogcmV0dXJuZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKCouLi4gLT4gYSkgLT4gKCouLi4gLT4gYSlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtZW1vaXplLlxuICogQHJldHVybiB7RnVuY3Rpb259IE1lbW9pemVkIHZlcnNpb24gb2YgYGZuYC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgY291bnQgPSAwO1xuICogICAgICB2YXIgZmFjdG9yaWFsID0gUi5tZW1vaXplKG4gPT4ge1xuICogICAgICAgIGNvdW50ICs9IDE7XG4gKiAgICAgICAgcmV0dXJuIFIucHJvZHVjdChSLnJhbmdlKDEsIG4gKyAxKSk7XG4gKiAgICAgIH0pO1xuICogICAgICBmYWN0b3JpYWwoNSk7IC8vPT4gMTIwXG4gKiAgICAgIGZhY3RvcmlhbCg1KTsgLy89PiAxMjBcbiAqICAgICAgZmFjdG9yaWFsKDUpOyAvLz0+IDEyMFxuICogICAgICBjb3VudDsgLy89PiAxXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MShmdW5jdGlvbiBtZW1vaXplKGZuKSB7XG4gIHZhciBjYWNoZSA9IHt9O1xuICByZXR1cm4gX2FyaXR5KGZuLmxlbmd0aCwgZnVuY3Rpb24oKSB7XG4gICAgdmFyIGtleSA9IHRvU3RyaW5nKGFyZ3VtZW50cyk7XG4gICAgaWYgKCFfaGFzKGtleSwgY2FjaGUpKSB7XG4gICAgICBjYWNoZVtrZXldID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlW2tleV07XG4gIH0pO1xufSk7XG4iLCJ2YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2Fzc2lnbicpO1xudmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIGZpcnN0IG9iamVjdCBtZXJnZWQgd2l0aFxuICogdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBzZWNvbmQgb2JqZWN0LiBJZiBhIGtleSBleGlzdHMgaW4gYm90aCBvYmplY3RzLFxuICogdGhlIHZhbHVlIGZyb20gdGhlIHNlY29uZCBvYmplY3Qgd2lsbCBiZSB1c2VkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7azogdn0gLT4ge2s6IHZ9IC0+IHtrOiB2fVxuICogQHBhcmFtIHtPYmplY3R9IGxcbiAqIEBwYXJhbSB7T2JqZWN0fSByXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAc2VlIFIubWVyZ2VXaXRoLCBSLm1lcmdlV2l0aEtleVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIubWVyZ2UoeyAnbmFtZSc6ICdmcmVkJywgJ2FnZSc6IDEwIH0sIHsgJ2FnZSc6IDQwIH0pO1xuICogICAgICAvLz0+IHsgJ25hbWUnOiAnZnJlZCcsICdhZ2UnOiA0MCB9XG4gKlxuICogICAgICB2YXIgcmVzZXRUb0RlZmF1bHQgPSBSLm1lcmdlKFIuX18sIHt4OiAwfSk7XG4gKiAgICAgIHJlc2V0VG9EZWZhdWx0KHt4OiA1LCB5OiAyfSk7IC8vPT4ge3g6IDAsIHk6IDJ9XG4gKiBAc3ltYiBSLm1lcmdlKHsgeDogMSwgeTogMiB9LCB7IHk6IDUsIHo6IDMgfSkgPSB7IHg6IDEsIHk6IDUsIHo6IDMgfVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gbWVyZ2UobCwgcikge1xuICByZXR1cm4gX2Fzc2lnbih7fSwgbCwgcik7XG59KTtcbiIsInZhciBfYXNzaWduID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fYXNzaWduJyk7XG52YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xuXG5cbi8qKlxuICogTWVyZ2VzIGEgbGlzdCBvZiBvYmplY3RzIHRvZ2V0aGVyIGludG8gb25lIG9iamVjdC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xMC4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbe2s6IHZ9XSAtPiB7azogdn1cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgQW4gYXJyYXkgb2Ygb2JqZWN0c1xuICogQHJldHVybiB7T2JqZWN0fSBBIG1lcmdlZCBvYmplY3QuXG4gKiBAc2VlIFIucmVkdWNlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5tZXJnZUFsbChbe2ZvbzoxfSx7YmFyOjJ9LHtiYXo6M31dKTsgLy89PiB7Zm9vOjEsYmFyOjIsYmF6OjN9XG4gKiAgICAgIFIubWVyZ2VBbGwoW3tmb286MX0se2ZvbzoyfSx7YmFyOjJ9XSk7IC8vPT4ge2ZvbzoyLGJhcjoyfVxuICogQHN5bWIgUi5tZXJnZUFsbChbeyB4OiAxIH0sIHsgeTogMiB9LCB7IHo6IDMgfV0pID0geyB4OiAxLCB5OiAyLCB6OiAzIH1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkxKGZ1bmN0aW9uIG1lcmdlQWxsKGxpc3QpIHtcbiAgcmV0dXJuIF9hc3NpZ24uYXBwbHkobnVsbCwgW3t9XS5jb25jYXQobGlzdCkpO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MycpO1xudmFyIF9oYXMgPSByZXF1aXJlKCcuL2ludGVybmFsL19oYXMnKTtcblxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSB0d28gcHJvdmlkZWQgb2JqZWN0cy4gSWZcbiAqIGEga2V5IGV4aXN0cyBpbiBib3RoIG9iamVjdHMsIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBpcyBhcHBsaWVkIHRvIHRoZSBrZXlcbiAqIGFuZCB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGluIGVhY2ggb2JqZWN0LCB3aXRoIHRoZSByZXN1bHQgYmVpbmdcbiAqIHVzZWQgYXMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBvYmplY3QuIFRoZSBrZXlcbiAqIHdpbGwgYmUgZXhjbHVkZWQgZnJvbSB0aGUgcmV0dXJuZWQgb2JqZWN0IGlmIHRoZSByZXN1bHRpbmcgdmFsdWUgaXNcbiAqIGB1bmRlZmluZWRgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE5LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcgKFN0cmluZyAtPiBhIC0+IGEgLT4gYSkgLT4ge2F9IC0+IHthfSAtPiB7YX1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge09iamVjdH0gbFxuICogQHBhcmFtIHtPYmplY3R9IHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBzZWUgUi5tZXJnZSwgUi5tZXJnZVdpdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBsZXQgY29uY2F0VmFsdWVzID0gKGssIGwsIHIpID0+IGsgPT0gJ3ZhbHVlcycgPyBSLmNvbmNhdChsLCByKSA6IHJcbiAqICAgICAgUi5tZXJnZVdpdGhLZXkoY29uY2F0VmFsdWVzLFxuICogICAgICAgICAgICAgICAgICAgICB7IGE6IHRydWUsIHRoaW5nOiAnZm9vJywgdmFsdWVzOiBbMTAsIDIwXSB9LFxuICogICAgICAgICAgICAgICAgICAgICB7IGI6IHRydWUsIHRoaW5nOiAnYmFyJywgdmFsdWVzOiBbMTUsIDM1XSB9KTtcbiAqICAgICAgLy89PiB7IGE6IHRydWUsIGI6IHRydWUsIHRoaW5nOiAnYmFyJywgdmFsdWVzOiBbMTAsIDIwLCAxNSwgMzVdIH1cbiAqIEBzeW1iIFIubWVyZ2VXaXRoS2V5KGYsIHsgeDogMSwgeTogMiB9LCB7IHk6IDUsIHo6IDMgfSkgPSB7IHg6IDEsIHk6IGYoJ3knLCAyLCA1KSwgejogMyB9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MyhmdW5jdGlvbiBtZXJnZVdpdGhLZXkoZm4sIGwsIHIpIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICB2YXIgaztcblxuICBmb3IgKGsgaW4gbCkge1xuICAgIGlmIChfaGFzKGssIGwpKSB7XG4gICAgICByZXN1bHRba10gPSBfaGFzKGssIHIpID8gZm4oaywgbFtrXSwgcltrXSkgOiBsW2tdO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoayBpbiByKSB7XG4gICAgaWYgKF9oYXMoaywgcikgJiYgIShfaGFzKGssIHJlc3VsdCkpKSB7XG4gICAgICByZXN1bHRba10gPSByW2tdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59KTtcbiIsInZhciBfY3VycnkzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkzJyk7XG52YXIgbWVyZ2VXaXRoS2V5ID0gcmVxdWlyZSgnLi9tZXJnZVdpdGhLZXknKTtcblxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHdpdGggdGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSB0d28gcHJvdmlkZWQgb2JqZWN0cy4gSWZcbiAqIGEga2V5IGV4aXN0cyBpbiBib3RoIG9iamVjdHMsIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBpcyBhcHBsaWVkIHRvIHRoZSB2YWx1ZXNcbiAqIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGluIGVhY2ggb2JqZWN0LCB3aXRoIHRoZSByZXN1bHQgYmVpbmcgdXNlZCBhcyB0aGVcbiAqIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBvYmplY3QuIFRoZSBrZXkgd2lsbCBiZVxuICogZXhjbHVkZWQgZnJvbSB0aGUgcmV0dXJuZWQgb2JqZWN0IGlmIHRoZSByZXN1bHRpbmcgdmFsdWUgaXMgYHVuZGVmaW5lZGAuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyAoYSAtPiBhIC0+IGEpIC0+IHthfSAtPiB7YX0gLT4ge2F9XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtPYmplY3R9IGxcbiAqIEBwYXJhbSB7T2JqZWN0fSByXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAc2VlIFIubWVyZ2UsIFIubWVyZ2VXaXRoS2V5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5tZXJnZVdpdGgoUi5jb25jYXQsXG4gKiAgICAgICAgICAgICAgICAgIHsgYTogdHJ1ZSwgdmFsdWVzOiBbMTAsIDIwXSB9LFxuICogICAgICAgICAgICAgICAgICB7IGI6IHRydWUsIHZhbHVlczogWzE1LCAzNV0gfSk7XG4gKiAgICAgIC8vPT4geyBhOiB0cnVlLCBiOiB0cnVlLCB2YWx1ZXM6IFsxMCwgMjAsIDE1LCAzNV0gfVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTMoZnVuY3Rpb24gbWVyZ2VXaXRoKGZuLCBsLCByKSB7XG4gIHJldHVybiBtZXJnZVdpdGhLZXkoZnVuY3Rpb24oXywgX2wsIF9yKSB7XG4gICAgcmV0dXJuIGZuKF9sLCBfcik7XG4gIH0sIGwsIHIpO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgc21hbGxlciBvZiBpdHMgdHdvIGFyZ3VtZW50cy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBPcmQgYSA9PiBhIC0+IGEgLT4gYVxuICogQHBhcmFtIHsqfSBhXG4gKiBAcGFyYW0geyp9IGJcbiAqIEByZXR1cm4geyp9XG4gKiBAc2VlIFIubWluQnksIFIubWF4XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5taW4oNzg5LCAxMjMpOyAvLz0+IDEyM1xuICogICAgICBSLm1pbignYScsICdiJyk7IC8vPT4gJ2EnXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBtaW4oYSwgYikgeyByZXR1cm4gYiA8IGEgPyBiIDogYTsgfSk7XG4iLCJ2YXIgX2N1cnJ5MyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MycpO1xuXG5cbi8qKlxuICogVGFrZXMgYSBmdW5jdGlvbiBhbmQgdHdvIHZhbHVlcywgYW5kIHJldHVybnMgd2hpY2hldmVyIHZhbHVlIHByb2R1Y2VzIHRoZVxuICogc21hbGxlciByZXN1bHQgd2hlbiBwYXNzZWQgdG8gdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjguMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIE9yZCBiID0+IChhIC0+IGIpIC0+IGEgLT4gYSAtPiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmXG4gKiBAcGFyYW0geyp9IGFcbiAqIEBwYXJhbSB7Kn0gYlxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5taW4sIFIubWF4QnlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICAvLyAgc3F1YXJlIDo6IE51bWJlciAtPiBOdW1iZXJcbiAqICAgICAgdmFyIHNxdWFyZSA9IG4gPT4gbiAqIG47XG4gKlxuICogICAgICBSLm1pbkJ5KHNxdWFyZSwgLTMsIDIpOyAvLz0+IDJcbiAqXG4gKiAgICAgIFIucmVkdWNlKFIubWluQnkoc3F1YXJlKSwgSW5maW5pdHksIFszLCAtNSwgNCwgMSwgLTJdKTsgLy89PiAxXG4gKiAgICAgIFIucmVkdWNlKFIubWluQnkoc3F1YXJlKSwgSW5maW5pdHksIFtdKTsgLy89PiBJbmZpbml0eVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTMoZnVuY3Rpb24gbWluQnkoZiwgYSwgYikge1xuICByZXR1cm4gZihiKSA8IGYoYSkgPyBiIDogYTtcbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIERpdmlkZXMgdGhlIGZpcnN0IHBhcmFtZXRlciBieSB0aGUgc2Vjb25kIGFuZCByZXR1cm5zIHRoZSByZW1haW5kZXIuIE5vdGVcbiAqIHRoYXQgdGhpcyBmdW5jdGlvbiBwcmVzZXJ2ZXMgdGhlIEphdmFTY3JpcHQtc3R5bGUgYmVoYXZpb3IgZm9yIG1vZHVsby4gRm9yXG4gKiBtYXRoZW1hdGljYWwgbW9kdWxvIHNlZSBgbWF0aE1vZGAuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4xXG4gKiBAY2F0ZWdvcnkgTWF0aFxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IE51bWJlclxuICogQHBhcmFtIHtOdW1iZXJ9IGEgVGhlIHZhbHVlIHRvIHRoZSBkaXZpZGUuXG4gKiBAcGFyYW0ge051bWJlcn0gYiBUaGUgcHNldWRvLW1vZHVsdXNcbiAqIEByZXR1cm4ge051bWJlcn0gVGhlIHJlc3VsdCBvZiBgYiAlIGFgLlxuICogQHNlZSBSLm1hdGhNb2RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm1vZHVsbygxNywgMyk7IC8vPT4gMlxuICogICAgICAvLyBKUyBiZWhhdmlvcjpcbiAqICAgICAgUi5tb2R1bG8oLTE3LCAzKTsgLy89PiAtMlxuICogICAgICBSLm1vZHVsbygxNywgLTMpOyAvLz0+IDJcbiAqXG4gKiAgICAgIHZhciBpc09kZCA9IFIubW9kdWxvKFIuX18sIDIpO1xuICogICAgICBpc09kZCg0Mik7IC8vPT4gMFxuICogICAgICBpc09kZCgyMSk7IC8vPT4gMVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gbW9kdWxvKGEsIGIpIHsgcmV0dXJuIGEgJSBiOyB9KTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBudW1iZXJzLiBFcXVpdmFsZW50IHRvIGBhICogYmAgYnV0IGN1cnJpZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTWF0aFxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IE51bWJlclxuICogQHBhcmFtIHtOdW1iZXJ9IGEgVGhlIGZpcnN0IHZhbHVlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGIgVGhlIHNlY29uZCB2YWx1ZS5cbiAqIEByZXR1cm4ge051bWJlcn0gVGhlIHJlc3VsdCBvZiBgYSAqIGJgLlxuICogQHNlZSBSLmRpdmlkZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBkb3VibGUgPSBSLm11bHRpcGx5KDIpO1xuICogICAgICB2YXIgdHJpcGxlID0gUi5tdWx0aXBseSgzKTtcbiAqICAgICAgZG91YmxlKDMpOyAgICAgICAvLz0+ICA2XG4gKiAgICAgIHRyaXBsZSg0KTsgICAgICAgLy89PiAxMlxuICogICAgICBSLm11bHRpcGx5KDIsIDUpOyAgLy89PiAxMFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gbXVsdGlwbHkoYSwgYikgeyByZXR1cm4gYSAqIGI7IH0pO1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcblxuXG4vKipcbiAqIE5lZ2F0ZXMgaXRzIGFyZ3VtZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjkuMFxuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBzaWcgTnVtYmVyIC0+IE51bWJlclxuICogQHBhcmFtIHtOdW1iZXJ9IG5cbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLm5lZ2F0ZSg0Mik7IC8vPT4gLTQyXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MShmdW5jdGlvbiBuZWdhdGUobikgeyByZXR1cm4gLW47IH0pO1xuIiwidmFyIF9jb21wbGVtZW50ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY29tcGxlbWVudCcpO1xudmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcbnZhciBfZGlzcGF0Y2hhYmxlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fZGlzcGF0Y2hhYmxlJyk7XG52YXIgX3hhbnkgPSByZXF1aXJlKCcuL2ludGVybmFsL194YW55Jyk7XG52YXIgYW55ID0gcmVxdWlyZSgnLi9hbnknKTtcblxuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIG5vIGVsZW1lbnRzIG9mIHRoZSBsaXN0IG1hdGNoIHRoZSBwcmVkaWNhdGUsIGBmYWxzZWBcbiAqIG90aGVyd2lzZS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgYW55YCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBCb29sZWFuKSAtPiBbYV0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBwcmVkaWNhdGUgaXMgbm90IHNhdGlzZmllZCBieSBldmVyeSBlbGVtZW50LCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEBzZWUgUi5hbGwsIFIuYW55XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGlzRXZlbiA9IG4gPT4gbiAlIDIgPT09IDA7XG4gKlxuICogICAgICBSLm5vbmUoaXNFdmVuLCBbMSwgMywgNSwgNywgOSwgMTFdKTsgLy89PiB0cnVlXG4gKiAgICAgIFIubm9uZShpc0V2ZW4sIFsxLCAzLCA1LCA3LCA4LCAxMV0pOyAvLz0+IGZhbHNlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihfY29tcGxlbWVudChfZGlzcGF0Y2hhYmxlKFsnYW55J10sIF94YW55LCBhbnkpKSk7XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xudmFyIGN1cnJ5TiA9IHJlcXVpcmUoJy4vY3VycnlOJyk7XG52YXIgbnRoID0gcmVxdWlyZSgnLi9udGgnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGl0cyBudGggYXJndW1lbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgTnVtYmVyIC0+ICouLi4gLT4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIubnRoQXJnKDEpKCdhJywgJ2InLCAnYycpOyAvLz0+ICdiJ1xuICogICAgICBSLm50aEFyZygtMSkoJ2EnLCAnYicsICdjJyk7IC8vPT4gJ2MnXG4gKiBAc3ltYiBSLm50aEFyZygtMSkoYSwgYiwgYykgPSBjXG4gKiBAc3ltYiBSLm50aEFyZygwKShhLCBiLCBjKSA9IGFcbiAqIEBzeW1iIFIubnRoQXJnKDEpKGEsIGIsIGMpID0gYlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoZnVuY3Rpb24gbnRoQXJnKG4pIHtcbiAgdmFyIGFyaXR5ID0gbiA8IDAgPyAxIDogbiArIDE7XG4gIHJldHVybiBjdXJyeU4oYXJpdHksIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBudGgobiwgYXJndW1lbnRzKTtcbiAgfSk7XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gX29mKHgpIHsgcmV0dXJuIFt4XTsgfTtcbiIsInZhciBfY3VycnkxID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkxJyk7XG52YXIgX29mID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fb2YnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBzaW5nbGV0b24gYXJyYXkgY29udGFpbmluZyB0aGUgdmFsdWUgcHJvdmlkZWQuXG4gKlxuICogTm90ZSB0aGlzIGBvZmAgaXMgZGlmZmVyZW50IGZyb20gdGhlIEVTNiBgb2ZgOyBTZWVcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L29mXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMy4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgYSAtPiBbYV1cbiAqIEBwYXJhbSB7Kn0geCBhbnkgdmFsdWVcbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSB3cmFwcGluZyBgeGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5vZihudWxsKTsgLy89PiBbbnVsbF1cbiAqICAgICAgUi5vZihbNDJdKTsgLy89PiBbWzQyXV1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkxKF9vZik7XG4iLCJ2YXIgX2NvbnRhaW5zID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY29udGFpbnMnKTtcbnZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgcGFydGlhbCBjb3B5IG9mIGFuIG9iamVjdCBvbWl0dGluZyB0aGUga2V5cyBzcGVjaWZpZWQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIFtTdHJpbmddIC0+IHtTdHJpbmc6ICp9IC0+IHtTdHJpbmc6ICp9XG4gKiBAcGFyYW0ge0FycmF5fSBuYW1lcyBhbiBhcnJheSBvZiBTdHJpbmcgcHJvcGVydHkgbmFtZXMgdG8gb21pdCBmcm9tIHRoZSBuZXcgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY29weSBmcm9tXG4gKiBAcmV0dXJuIHtPYmplY3R9IEEgbmV3IG9iamVjdCB3aXRoIHByb3BlcnRpZXMgZnJvbSBgbmFtZXNgIG5vdCBvbiBpdC5cbiAqIEBzZWUgUi5waWNrXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5vbWl0KFsnYScsICdkJ10sIHthOiAxLCBiOiAyLCBjOiAzLCBkOiA0fSk7IC8vPT4ge2I6IDIsIGM6IDN9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBvbWl0KG5hbWVzLCBvYmopIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xuICAgIGlmICghX2NvbnRhaW5zKHByb3AsIG5hbWVzKSkge1xuICAgICAgcmVzdWx0W3Byb3BdID0gb2JqW3Byb3BdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG4iLCJ2YXIgX2FyaXR5ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fYXJpdHknKTtcbnZhciBfY3VycnkxID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkxJyk7XG5cblxuLyoqXG4gKiBBY2NlcHRzIGEgZnVuY3Rpb24gYGZuYCBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgZ3VhcmRzIGludm9jYXRpb24gb2ZcbiAqIGBmbmAgc3VjaCB0aGF0IGBmbmAgY2FuIG9ubHkgZXZlciBiZSBjYWxsZWQgb25jZSwgbm8gbWF0dGVyIGhvdyBtYW55IHRpbWVzXG4gKiB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gaXMgaW52b2tlZC4gVGhlIGZpcnN0IHZhbHVlIGNhbGN1bGF0ZWQgaXMgcmV0dXJuZWQgaW5cbiAqIHN1YnNlcXVlbnQgaW52b2NhdGlvbnMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKGEuLi4gLT4gYikgLT4gKGEuLi4gLT4gYilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byB3cmFwIGluIGEgY2FsbC1vbmx5LW9uY2Ugd3JhcHBlci5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgd3JhcHBlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgYWRkT25lT25jZSA9IFIub25jZSh4ID0+IHggKyAxKTtcbiAqICAgICAgYWRkT25lT25jZSgxMCk7IC8vPT4gMTFcbiAqICAgICAgYWRkT25lT25jZShhZGRPbmVPbmNlKDUwKSk7IC8vPT4gMTFcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkxKGZ1bmN0aW9uIG9uY2UoZm4pIHtcbiAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuICB2YXIgcmVzdWx0O1xuICByZXR1cm4gX2FyaXR5KGZuLmxlbmd0aCwgZnVuY3Rpb24oKSB7XG4gICAgaWYgKGNhbGxlZCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgY2FsbGVkID0gdHJ1ZTtcbiAgICByZXN1bHQgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MycpO1xuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIFwic2V0dGluZ1wiIHRoZSBwb3J0aW9uIG9mIHRoZSBnaXZlbiBkYXRhIHN0cnVjdHVyZVxuICogZm9jdXNlZCBieSB0aGUgZ2l2ZW4gbGVucyB0byB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnaXZlbiBmdW5jdGlvbiB0b1xuICogdGhlIGZvY3VzZWQgdmFsdWUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTYuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIExlbnMgcyBhID0gRnVuY3RvciBmID0+IChhIC0+IGYgYSkgLT4gcyAtPiBmIHNcbiAqIEBzaWcgTGVucyBzIGEgLT4gKGEgLT4gYSkgLT4gcyAtPiBzXG4gKiBAcGFyYW0ge0xlbnN9IGxlbnNcbiAqIEBwYXJhbSB7Kn0gdlxuICogQHBhcmFtIHsqfSB4XG4gKiBAcmV0dXJuIHsqfVxuICogQHNlZSBSLnByb3AsIFIubGVuc0luZGV4LCBSLmxlbnNQcm9wXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGhlYWRMZW5zID0gUi5sZW5zSW5kZXgoMCk7XG4gKlxuICogICAgICBSLm92ZXIoaGVhZExlbnMsIFIudG9VcHBlciwgWydmb28nLCAnYmFyJywgJ2JheiddKTsgLy89PiBbJ0ZPTycsICdiYXInLCAnYmF6J11cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24oKSB7XG4gIC8vIGBJZGVudGl0eWAgaXMgYSBmdW5jdG9yIHRoYXQgaG9sZHMgYSBzaW5nbGUgdmFsdWUsIHdoZXJlIGBtYXBgIHNpbXBseVxuICAvLyB0cmFuc2Zvcm1zIHRoZSBoZWxkIHZhbHVlIHdpdGggdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLlxuICB2YXIgSWRlbnRpdHkgPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHt2YWx1ZTogeCwgbWFwOiBmdW5jdGlvbihmKSB7IHJldHVybiBJZGVudGl0eShmKHgpKTsgfX07XG4gIH07XG5cbiAgcmV0dXJuIF9jdXJyeTMoZnVuY3Rpb24gb3ZlcihsZW5zLCBmLCB4KSB7XG4gICAgLy8gVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBnZXR0ZXIgZnVuY3Rpb24gaXMgZmlyc3QgdHJhbnNmb3JtZWQgd2l0aCBgZmAsXG4gICAgLy8gdGhlbiBzZXQgYXMgdGhlIHZhbHVlIG9mIGFuIGBJZGVudGl0eWAuIFRoaXMgaXMgdGhlbiBtYXBwZWQgb3ZlciB3aXRoIHRoZVxuICAgIC8vIHNldHRlciBmdW5jdGlvbiBvZiB0aGUgbGVucy5cbiAgICByZXR1cm4gbGVucyhmdW5jdGlvbih5KSB7IHJldHVybiBJZGVudGl0eShmKHkpKTsgfSkoeCkudmFsdWU7XG4gIH0pO1xufSgpKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cblxuLyoqXG4gKiBUYWtlcyB0d28gYXJndW1lbnRzLCBgZnN0YCBhbmQgYHNuZGAsIGFuZCByZXR1cm5zIGBbZnN0LCBzbmRdYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOC4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IGIgLT4gKGEsYilcbiAqIEBwYXJhbSB7Kn0gZnN0XG4gKiBAcGFyYW0geyp9IHNuZFxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAc2VlIFIub2JqT2YsIFIub2ZcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnBhaXIoJ2ZvbycsICdiYXInKTsgLy89PiBbJ2ZvbycsICdiYXInXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gcGFpcihmc3QsIHNuZCkgeyByZXR1cm4gW2ZzdCwgc25kXTsgfSk7XG4iLCJ2YXIgX2FyaXR5ID0gcmVxdWlyZSgnLi9fYXJpdHknKTtcbnZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9fY3VycnkyJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBfY3JlYXRlUGFydGlhbEFwcGxpY2F0b3IoY29uY2F0KSB7XG4gIHJldHVybiBfY3VycnkyKGZ1bmN0aW9uKGZuLCBhcmdzKSB7XG4gICAgcmV0dXJuIF9hcml0eShNYXRoLm1heCgwLCBmbi5sZW5ndGggLSBhcmdzLmxlbmd0aCksIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGNvbmNhdChhcmdzLCBhcmd1bWVudHMpKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuIiwidmFyIF9jb25jYXQgPSByZXF1aXJlKCcuL2ludGVybmFsL19jb25jYXQnKTtcbnZhciBfY3JlYXRlUGFydGlhbEFwcGxpY2F0b3IgPSByZXF1aXJlKCcuL2ludGVybmFsL19jcmVhdGVQYXJ0aWFsQXBwbGljYXRvcicpO1xuXG5cbi8qKlxuICogVGFrZXMgYSBmdW5jdGlvbiBgZmAgYW5kIGEgbGlzdCBvZiBhcmd1bWVudHMsIGFuZCByZXR1cm5zIGEgZnVuY3Rpb24gYGdgLlxuICogV2hlbiBhcHBsaWVkLCBgZ2AgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIGBmYCB0byB0aGUgYXJndW1lbnRzXG4gKiBwcm92aWRlZCBpbml0aWFsbHkgZm9sbG93ZWQgYnkgdGhlIGFyZ3VtZW50cyBwcm92aWRlZCB0byBgZ2AuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTAuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICgoYSwgYiwgYywgLi4uLCBuKSAtPiB4KSAtPiBbYSwgYiwgYywgLi4uXSAtPiAoKGQsIGUsIGYsIC4uLiwgbikgLT4geClcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3NcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQHNlZSBSLnBhcnRpYWxSaWdodFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBtdWx0aXBseTIgPSAoYSwgYikgPT4gYSAqIGI7XG4gKiAgICAgIHZhciBkb3VibGUgPSBSLnBhcnRpYWwobXVsdGlwbHkyLCBbMl0pO1xuICogICAgICBkb3VibGUoMik7IC8vPT4gNFxuICpcbiAqICAgICAgdmFyIGdyZWV0ID0gKHNhbHV0YXRpb24sIHRpdGxlLCBmaXJzdE5hbWUsIGxhc3ROYW1lKSA9PlxuICogICAgICAgIHNhbHV0YXRpb24gKyAnLCAnICsgdGl0bGUgKyAnICcgKyBmaXJzdE5hbWUgKyAnICcgKyBsYXN0TmFtZSArICchJztcbiAqXG4gKiAgICAgIHZhciBzYXlIZWxsbyA9IFIucGFydGlhbChncmVldCwgWydIZWxsbyddKTtcbiAqICAgICAgdmFyIHNheUhlbGxvVG9NcyA9IFIucGFydGlhbChzYXlIZWxsbywgWydNcy4nXSk7XG4gKiAgICAgIHNheUhlbGxvVG9NcygnSmFuZScsICdKb25lcycpOyAvLz0+ICdIZWxsbywgTXMuIEphbmUgSm9uZXMhJ1xuICogQHN5bWIgUi5wYXJ0aWFsKGYsIFthLCBiXSkoYywgZCkgPSBmKGEsIGIsIGMsIGQpXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2NyZWF0ZVBhcnRpYWxBcHBsaWNhdG9yKF9jb25jYXQpO1xuIiwidmFyIF9jb25jYXQgPSByZXF1aXJlKCcuL2ludGVybmFsL19jb25jYXQnKTtcbnZhciBfY3JlYXRlUGFydGlhbEFwcGxpY2F0b3IgPSByZXF1aXJlKCcuL2ludGVybmFsL19jcmVhdGVQYXJ0aWFsQXBwbGljYXRvcicpO1xudmFyIGZsaXAgPSByZXF1aXJlKCcuL2ZsaXAnKTtcblxuXG4vKipcbiAqIFRha2VzIGEgZnVuY3Rpb24gYGZgIGFuZCBhIGxpc3Qgb2YgYXJndW1lbnRzLCBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIGBnYC5cbiAqIFdoZW4gYXBwbGllZCwgYGdgIHJldHVybnMgdGhlIHJlc3VsdCBvZiBhcHBseWluZyBgZmAgdG8gdGhlIGFyZ3VtZW50c1xuICogcHJvdmlkZWQgdG8gYGdgIGZvbGxvd2VkIGJ5IHRoZSBhcmd1bWVudHMgcHJvdmlkZWQgaW5pdGlhbGx5LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEwLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKGEsIGIsIGMsIC4uLiwgbikgLT4geCkgLT4gW2QsIGUsIGYsIC4uLiwgbl0gLT4gKChhLCBiLCBjLCAuLi4pIC0+IHgpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBzZWUgUi5wYXJ0aWFsXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGdyZWV0ID0gKHNhbHV0YXRpb24sIHRpdGxlLCBmaXJzdE5hbWUsIGxhc3ROYW1lKSA9PlxuICogICAgICAgIHNhbHV0YXRpb24gKyAnLCAnICsgdGl0bGUgKyAnICcgKyBmaXJzdE5hbWUgKyAnICcgKyBsYXN0TmFtZSArICchJztcbiAqXG4gKiAgICAgIHZhciBncmVldE1zSmFuZUpvbmVzID0gUi5wYXJ0aWFsUmlnaHQoZ3JlZXQsIFsnTXMuJywgJ0phbmUnLCAnSm9uZXMnXSk7XG4gKlxuICogICAgICBncmVldE1zSmFuZUpvbmVzKCdIZWxsbycpOyAvLz0+ICdIZWxsbywgTXMuIEphbmUgSm9uZXMhJ1xuICogQHN5bWIgUi5wYXJ0aWFsUmlnaHQoZiwgW2EsIGJdKShjLCBkKSA9IGYoYywgZCwgYSwgYilcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3JlYXRlUGFydGlhbEFwcGxpY2F0b3IoZmxpcChfY29uY2F0KSk7XG4iLCJ2YXIgZmlsdGVyID0gcmVxdWlyZSgnLi9maWx0ZXInKTtcbnZhciBqdXh0ID0gcmVxdWlyZSgnLi9qdXh0Jyk7XG52YXIgcmVqZWN0ID0gcmVxdWlyZSgnLi9yZWplY3QnKTtcblxuXG4vKipcbiAqIFRha2VzIGEgcHJlZGljYXRlIGFuZCBhIGxpc3Qgb3Igb3RoZXIgXCJmaWx0ZXJhYmxlXCIgb2JqZWN0IGFuZCByZXR1cm5zIHRoZVxuICogcGFpciBvZiBmaWx0ZXJhYmxlIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBvZiBlbGVtZW50cyB3aGljaCBkbyBhbmQgZG8gbm90XG4gKiBzYXRpc2Z5LCB0aGUgcHJlZGljYXRlLCByZXNwZWN0aXZlbHkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS40XG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBGaWx0ZXJhYmxlIGYgPT4gKGEgLT4gQm9vbGVhbikgLT4gZiBhIC0+IFtmIGEsIGYgYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgQSBwcmVkaWNhdGUgdG8gZGV0ZXJtaW5lIHdoaWNoIHNpZGUgdGhlIGVsZW1lbnQgYmVsb25ncyB0by5cbiAqIEBwYXJhbSB7QXJyYXl9IGZpbHRlcmFibGUgdGhlIGxpc3QgKG9yIG90aGVyIGZpbHRlcmFibGUpIHRvIHBhcnRpdGlvbi5cbiAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSwgY29udGFpbmluZyBmaXJzdCB0aGUgc3Vic2V0IG9mIGVsZW1lbnRzIHRoYXQgc2F0aXNmeSB0aGVcbiAqICAgICAgICAgcHJlZGljYXRlLCBhbmQgc2Vjb25kIHRoZSBzdWJzZXQgb2YgZWxlbWVudHMgdGhhdCBkbyBub3Qgc2F0aXNmeS5cbiAqIEBzZWUgUi5maWx0ZXIsIFIucmVqZWN0XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wYXJ0aXRpb24oUi5jb250YWlucygncycpLCBbJ3NzcycsICd0dHQnLCAnZm9vJywgJ2JhcnMnXSk7XG4gKiAgICAgIC8vID0+IFsgWyAnc3NzJywgJ2JhcnMnIF0sICBbICd0dHQnLCAnZm9vJyBdIF1cbiAqXG4gKiAgICAgIFIucGFydGl0aW9uKFIuY29udGFpbnMoJ3MnKSwgeyBhOiAnc3NzJywgYjogJ3R0dCcsIGZvbzogJ2JhcnMnIH0pO1xuICogICAgICAvLyA9PiBbIHsgYTogJ3NzcycsIGZvbzogJ2JhcnMnIH0sIHsgYjogJ3R0dCcgfSAgXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGp1eHQoW2ZpbHRlciwgcmVqZWN0XSk7XG4iLCJ2YXIgX2N1cnJ5MyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MycpO1xudmFyIGVxdWFscyA9IHJlcXVpcmUoJy4vZXF1YWxzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4vcGF0aCcpO1xuXG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgbmVzdGVkIHBhdGggb24gYW4gb2JqZWN0IGhhcyBhIHNwZWNpZmljIHZhbHVlLCBpblxuICogYFIuZXF1YWxzYCB0ZXJtcy4gTW9zdCBsaWtlbHkgdXNlZCB0byBmaWx0ZXIgYSBsaXN0LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjcuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAdHlwZWRlZm4gSWR4ID0gU3RyaW5nIHwgSW50XG4gKiBAc2lnIFtJZHhdIC0+IGEgLT4ge2F9IC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggb2YgdGhlIG5lc3RlZCBwcm9wZXJ0eSB0byB1c2VcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byBjb21wYXJlIHRoZSBuZXN0ZWQgcHJvcGVydHkgd2l0aFxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNoZWNrIHRoZSBuZXN0ZWQgcHJvcGVydHkgaW5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmFsdWUgZXF1YWxzIHRoZSBuZXN0ZWQgb2JqZWN0IHByb3BlcnR5LFxuICogICAgICAgICBgZmFsc2VgIG90aGVyd2lzZS5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgdXNlcjEgPSB7IGFkZHJlc3M6IHsgemlwQ29kZTogOTAyMTAgfSB9O1xuICogICAgICB2YXIgdXNlcjIgPSB7IGFkZHJlc3M6IHsgemlwQ29kZTogNTU1NTUgfSB9O1xuICogICAgICB2YXIgdXNlcjMgPSB7IG5hbWU6ICdCb2InIH07XG4gKiAgICAgIHZhciB1c2VycyA9IFsgdXNlcjEsIHVzZXIyLCB1c2VyMyBdO1xuICogICAgICB2YXIgaXNGYW1vdXMgPSBSLnBhdGhFcShbJ2FkZHJlc3MnLCAnemlwQ29kZSddLCA5MDIxMCk7XG4gKiAgICAgIFIuZmlsdGVyKGlzRmFtb3VzLCB1c2Vycyk7IC8vPT4gWyB1c2VyMSBdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MyhmdW5jdGlvbiBwYXRoRXEoX3BhdGgsIHZhbCwgb2JqKSB7XG4gIHJldHVybiBlcXVhbHMocGF0aChfcGF0aCwgb2JqKSwgdmFsKTtcbn0pO1xuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcbnZhciBkZWZhdWx0VG8gPSByZXF1aXJlKCcuL2RlZmF1bHRUbycpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuL3BhdGgnKTtcblxuXG4vKipcbiAqIElmIHRoZSBnaXZlbiwgbm9uLW51bGwgb2JqZWN0IGhhcyBhIHZhbHVlIGF0IHRoZSBnaXZlbiBwYXRoLCByZXR1cm5zIHRoZVxuICogdmFsdWUgYXQgdGhhdCBwYXRoLiBPdGhlcndpc2UgcmV0dXJucyB0aGUgcHJvdmlkZWQgZGVmYXVsdCB2YWx1ZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAdHlwZWRlZm4gSWR4ID0gU3RyaW5nIHwgSW50XG4gKiBAc2lnIGEgLT4gW0lkeF0gLT4ge2F9IC0+IGFcbiAqIEBwYXJhbSB7Kn0gZCBUaGUgZGVmYXVsdCB2YWx1ZS5cbiAqIEBwYXJhbSB7QXJyYXl9IHAgVGhlIHBhdGggdG8gdXNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHJldHJpZXZlIHRoZSBuZXN0ZWQgcHJvcGVydHkgZnJvbS5cbiAqIEByZXR1cm4geyp9IFRoZSBkYXRhIGF0IGBwYXRoYCBvZiB0aGUgc3VwcGxpZWQgb2JqZWN0IG9yIHRoZSBkZWZhdWx0IHZhbHVlLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucGF0aE9yKCdOL0EnLCBbJ2EnLCAnYiddLCB7YToge2I6IDJ9fSk7IC8vPT4gMlxuICogICAgICBSLnBhdGhPcignTi9BJywgWydhJywgJ2InXSwge2M6IHtiOiAyfX0pOyAvLz0+IFwiTi9BXCJcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkzKGZ1bmN0aW9uIHBhdGhPcihkLCBwLCBvYmopIHtcbiAgcmV0dXJuIGRlZmF1bHRUbyhkLCBwYXRoKHAsIG9iaikpO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MycpO1xudmFyIHBhdGggPSByZXF1aXJlKCcuL3BhdGgnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByb3BlcnR5IGF0IGdpdmVuIHBhdGggc2F0aXNmaWVzIHRoZVxuICogZ2l2ZW4gcHJlZGljYXRlOyBgZmFsc2VgIG90aGVyd2lzZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOS4wXG4gKiBAY2F0ZWdvcnkgTG9naWNcbiAqIEB0eXBlZGVmbiBJZHggPSBTdHJpbmcgfCBJbnRcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gW0lkeF0gLT4ge2F9IC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRcbiAqIEBwYXJhbSB7QXJyYXl9IHByb3BQYXRoXG4gKiBAcGFyYW0geyp9IG9ialxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBzZWUgUi5wcm9wU2F0aXNmaWVzLCBSLnBhdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnBhdGhTYXRpc2ZpZXMoeSA9PiB5ID4gMCwgWyd4JywgJ3knXSwge3g6IHt5OiAyfX0pOyAvLz0+IHRydWVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkzKGZ1bmN0aW9uIHBhdGhTYXRpc2ZpZXMocHJlZCwgcHJvcFBhdGgsIG9iaikge1xuICByZXR1cm4gcHJvcFBhdGgubGVuZ3RoID4gMCAmJiBwcmVkKHBhdGgocHJvcFBhdGgsIG9iaikpO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIHBhcnRpYWwgY29weSBvZiBhbiBvYmplY3QgY29udGFpbmluZyBvbmx5IHRoZSBrZXlzIHNwZWNpZmllZC4gSWZcbiAqIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QsIHRoZSBwcm9wZXJ0eSBpcyBpZ25vcmVkLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyBba10gLT4ge2s6IHZ9IC0+IHtrOiB2fVxuICogQHBhcmFtIHtBcnJheX0gbmFtZXMgYW4gYXJyYXkgb2YgU3RyaW5nIHByb3BlcnR5IG5hbWVzIHRvIGNvcHkgb250byBhIG5ldyBvYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBjb3B5IGZyb21cbiAqIEByZXR1cm4ge09iamVjdH0gQSBuZXcgb2JqZWN0IHdpdGggb25seSBwcm9wZXJ0aWVzIGZyb20gYG5hbWVzYCBvbiBpdC5cbiAqIEBzZWUgUi5vbWl0LCBSLnByb3BzXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5waWNrKFsnYScsICdkJ10sIHthOiAxLCBiOiAyLCBjOiAzLCBkOiA0fSk7IC8vPT4ge2E6IDEsIGQ6IDR9XG4gKiAgICAgIFIucGljayhbJ2EnLCAnZScsICdmJ10sIHthOiAxLCBiOiAyLCBjOiAzLCBkOiA0fSk7IC8vPT4ge2E6IDF9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBwaWNrKG5hbWVzLCBvYmopIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICB2YXIgaWR4ID0gMDtcbiAgd2hpbGUgKGlkeCA8IG5hbWVzLmxlbmd0aCkge1xuICAgIGlmIChuYW1lc1tpZHhdIGluIG9iaikge1xuICAgICAgcmVzdWx0W25hbWVzW2lkeF1dID0gb2JqW25hbWVzW2lkeF1dO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogU2ltaWxhciB0byBgcGlja2AgZXhjZXB0IHRoYXQgdGhpcyBvbmUgaW5jbHVkZXMgYSBga2V5OiB1bmRlZmluZWRgIHBhaXIgZm9yXG4gKiBwcm9wZXJ0aWVzIHRoYXQgZG9uJ3QgZXhpc3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIFtrXSAtPiB7azogdn0gLT4ge2s6IHZ9XG4gKiBAcGFyYW0ge0FycmF5fSBuYW1lcyBhbiBhcnJheSBvZiBTdHJpbmcgcHJvcGVydHkgbmFtZXMgdG8gY29weSBvbnRvIGEgbmV3IG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNvcHkgZnJvbVxuICogQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3Qgd2l0aCBvbmx5IHByb3BlcnRpZXMgZnJvbSBgbmFtZXNgIG9uIGl0LlxuICogQHNlZSBSLnBpY2tcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnBpY2tBbGwoWydhJywgJ2QnXSwge2E6IDEsIGI6IDIsIGM6IDMsIGQ6IDR9KTsgLy89PiB7YTogMSwgZDogNH1cbiAqICAgICAgUi5waWNrQWxsKFsnYScsICdlJywgJ2YnXSwge2E6IDEsIGI6IDIsIGM6IDMsIGQ6IDR9KTsgLy89PiB7YTogMSwgZTogdW5kZWZpbmVkLCBmOiB1bmRlZmluZWR9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBwaWNrQWxsKG5hbWVzLCBvYmopIHtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IG5hbWVzLmxlbmd0aDtcbiAgd2hpbGUgKGlkeCA8IGxlbikge1xuICAgIHZhciBuYW1lID0gbmFtZXNbaWR4XTtcbiAgICByZXN1bHRbbmFtZV0gPSBvYmpbbmFtZV07XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBwYXJ0aWFsIGNvcHkgb2YgYW4gb2JqZWN0IGNvbnRhaW5pbmcgb25seSB0aGUga2V5cyB0aGF0IHNhdGlzZnlcbiAqIHRoZSBzdXBwbGllZCBwcmVkaWNhdGUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnICh2LCBrIC0+IEJvb2xlYW4pIC0+IHtrOiB2fSAtPiB7azogdn1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgQSBwcmVkaWNhdGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGEga2V5XG4gKiAgICAgICAgc2hvdWxkIGJlIGluY2x1ZGVkIG9uIHRoZSBvdXRwdXQgb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGNvcHkgZnJvbVxuICogQHJldHVybiB7T2JqZWN0fSBBIG5ldyBvYmplY3Qgd2l0aCBvbmx5IHByb3BlcnRpZXMgdGhhdCBzYXRpc2Z5IGBwcmVkYFxuICogICAgICAgICBvbiBpdC5cbiAqIEBzZWUgUi5waWNrLCBSLmZpbHRlclxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBpc1VwcGVyQ2FzZSA9ICh2YWwsIGtleSkgPT4ga2V5LnRvVXBwZXJDYXNlKCkgPT09IGtleTtcbiAqICAgICAgUi5waWNrQnkoaXNVcHBlckNhc2UsIHthOiAxLCBiOiAyLCBBOiAzLCBCOiA0fSk7IC8vPT4ge0E6IDMsIEI6IDR9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBwaWNrQnkodGVzdCwgb2JqKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHtcbiAgICBpZiAodGVzdChvYmpbcHJvcF0sIHByb3AsIG9iaikpIHtcbiAgICAgIHJlc3VsdFtwcm9wXSA9IG9ialtwcm9wXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0pO1xuIiwidmFyIGNvbXBvc2VLID0gcmVxdWlyZSgnLi9jb21wb3NlSycpO1xudmFyIHJldmVyc2UgPSByZXF1aXJlKCcuL3JldmVyc2UnKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsZWZ0LXRvLXJpZ2h0IEtsZWlzbGkgY29tcG9zaXRpb24gb2YgdGhlIHByb3ZpZGVkIGZ1bmN0aW9ucyxcbiAqIGVhY2ggb2Ygd2hpY2ggbXVzdCByZXR1cm4gYSB2YWx1ZSBvZiBhIHR5cGUgc3VwcG9ydGVkIGJ5IFtgY2hhaW5gXSgjY2hhaW4pLlxuICpcbiAqIGBSLnBpcGVLKGYsIGcsIGgpYCBpcyBlcXVpdmFsZW50IHRvIGBSLnBpcGUoUi5jaGFpbihmKSwgUi5jaGFpbihnKSwgUi5jaGFpbihoKSlgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyBDaGFpbiBtID0+ICgoYSAtPiBtIGIpLCAoYiAtPiBtIGMpLCAuLi4sICh5IC0+IG0geikpIC0+IChhIC0+IG0geilcbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBzZWUgUi5jb21wb3NlS1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIC8vICBwYXJzZUpzb24gOjogU3RyaW5nIC0+IE1heWJlICpcbiAqICAgICAgLy8gIGdldCA6OiBTdHJpbmcgLT4gT2JqZWN0IC0+IE1heWJlICpcbiAqXG4gKiAgICAgIC8vICBnZXRTdGF0ZUNvZGUgOjogTWF5YmUgU3RyaW5nIC0+IE1heWJlIFN0cmluZ1xuICogICAgICB2YXIgZ2V0U3RhdGVDb2RlID0gUi5waXBlSyhcbiAqICAgICAgICBwYXJzZUpzb24sXG4gKiAgICAgICAgZ2V0KCd1c2VyJyksXG4gKiAgICAgICAgZ2V0KCdhZGRyZXNzJyksXG4gKiAgICAgICAgZ2V0KCdzdGF0ZScpLFxuICogICAgICAgIFIuY29tcG9zZShNYXliZS5vZiwgUi50b1VwcGVyKVxuICogICAgICApO1xuICpcbiAqICAgICAgZ2V0U3RhdGVDb2RlKCd7XCJ1c2VyXCI6e1wiYWRkcmVzc1wiOntcInN0YXRlXCI6XCJueVwifX19Jyk7XG4gKiAgICAgIC8vPT4gSnVzdCgnTlknKVxuICogICAgICBnZXRTdGF0ZUNvZGUoJ1tJbnZhbGlkIEpTT05dJyk7XG4gKiAgICAgIC8vPT4gTm90aGluZygpXG4gKiBAc3ltYiBSLnBpcGVLKGYsIGcsIGgpKGEpID0gUi5jaGFpbihoLCBSLmNoYWluKGcsIGYoYSkpKVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHBpcGVLKCkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcigncGlwZUsgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50Jyk7XG4gIH1cbiAgcmV0dXJuIGNvbXBvc2VLLmFwcGx5KHRoaXMsIHJldmVyc2UoYXJndW1lbnRzKSk7XG59O1xuIiwidmFyIF9jb25jYXQgPSByZXF1aXJlKCcuL2ludGVybmFsL19jb25jYXQnKTtcbnZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGxpc3Qgd2l0aCB0aGUgZ2l2ZW4gZWxlbWVudCBhdCB0aGUgZnJvbnQsIGZvbGxvd2VkIGJ5IHRoZVxuICogY29udGVudHMgb2YgdGhlIGxpc3QuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7Kn0gZWwgVGhlIGl0ZW0gdG8gYWRkIHRvIHRoZSBoZWFkIG9mIHRoZSBvdXRwdXQgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGFkZCB0byB0aGUgdGFpbCBvZiB0aGUgb3V0cHV0IGxpc3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgYXJyYXkuXG4gKiBAc2VlIFIuYXBwZW5kXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wcmVwZW5kKCdmZWUnLCBbJ2ZpJywgJ2ZvJywgJ2Z1bSddKTsgLy89PiBbJ2ZlZScsICdmaScsICdmbycsICdmdW0nXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gcHJlcGVuZChlbCwgbGlzdCkge1xuICByZXR1cm4gX2NvbmNhdChbZWxdLCBsaXN0KTtcbn0pO1xuIiwidmFyIG11bHRpcGx5ID0gcmVxdWlyZSgnLi9tdWx0aXBseScpO1xudmFyIHJlZHVjZSA9IHJlcXVpcmUoJy4vcmVkdWNlJyk7XG5cblxuLyoqXG4gKiBNdWx0aXBsaWVzIHRvZ2V0aGVyIGFsbCB0aGUgZWxlbWVudHMgb2YgYSBsaXN0LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBzaWcgW051bWJlcl0gLT4gTnVtYmVyXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IEFuIGFycmF5IG9mIG51bWJlcnNcbiAqIEByZXR1cm4ge051bWJlcn0gVGhlIHByb2R1Y3Qgb2YgYWxsIHRoZSBudW1iZXJzIGluIHRoZSBsaXN0LlxuICogQHNlZSBSLnJlZHVjZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucHJvZHVjdChbMiw0LDYsOCwxMDAsMV0pOyAvLz0+IDM4NDAwXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gcmVkdWNlKG11bHRpcGx5LCAxKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgY3VycnlOID0gcmVxdWlyZSgnLi9jdXJyeU4nKTtcblxuXG4vKipcbiAqIEFjY2VwdHMgYSBmdW5jdGlvbiBgZm5gIGFuZCBhIGxpc3Qgb2YgdHJhbnNmb3JtZXIgZnVuY3Rpb25zIGFuZCByZXR1cm5zIGFcbiAqIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLiBXaGVuIHRoZSBuZXcgZnVuY3Rpb24gaXMgaW52b2tlZCwgaXQgY2FsbHMgdGhlXG4gKiBmdW5jdGlvbiBgZm5gIHdpdGggcGFyYW1ldGVycyBjb25zaXN0aW5nIG9mIHRoZSByZXN1bHQgb2YgY2FsbGluZyBlYWNoXG4gKiBzdXBwbGllZCBoYW5kbGVyIG9uIHN1Y2Nlc3NpdmUgYXJndW1lbnRzIHRvIHRoZSBuZXcgZnVuY3Rpb24uXG4gKlxuICogSWYgbW9yZSBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gdGhhbiB0cmFuc2Zvcm1lclxuICogZnVuY3Rpb25zLCB0aG9zZSBhcmd1bWVudHMgYXJlIHBhc3NlZCBkaXJlY3RseSB0byBgZm5gIGFzIGFkZGl0aW9uYWxcbiAqIHBhcmFtZXRlcnMuIElmIHlvdSBleHBlY3QgYWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCBkb24ndCBuZWVkIHRvIGJlXG4gKiB0cmFuc2Zvcm1lZCwgYWx0aG91Z2ggeW91IGNhbiBpZ25vcmUgdGhlbSwgaXQncyBiZXN0IHRvIHBhc3MgYW4gaWRlbnRpdHlcbiAqIGZ1bmN0aW9uIHNvIHRoYXQgdGhlIG5ldyBmdW5jdGlvbiByZXBvcnRzIHRoZSBjb3JyZWN0IGFyaXR5LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICh4MSAtPiB4MiAtPiAuLi4gLT4geikgLT4gWyhhIC0+IHgxKSwgKGIgLT4geDIpLCAuLi5dIC0+IChhIC0+IGIgLT4gLi4uIC0+IHopXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gd3JhcC5cbiAqIEBwYXJhbSB7QXJyYXl9IHRyYW5zZm9ybWVycyBBIGxpc3Qgb2YgdHJhbnNmb3JtZXIgZnVuY3Rpb25zXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIHdyYXBwZWQgZnVuY3Rpb24uXG4gKiBAc2VlIFIuY29udmVyZ2VcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnVzZVdpdGgoTWF0aC5wb3csIFtSLmlkZW50aXR5LCBSLmlkZW50aXR5XSkoMywgNCk7IC8vPT4gODFcbiAqICAgICAgUi51c2VXaXRoKE1hdGgucG93LCBbUi5pZGVudGl0eSwgUi5pZGVudGl0eV0pKDMpKDQpOyAvLz0+IDgxXG4gKiAgICAgIFIudXNlV2l0aChNYXRoLnBvdywgW1IuZGVjLCBSLmluY10pKDMsIDQpOyAvLz0+IDMyXG4gKiAgICAgIFIudXNlV2l0aChNYXRoLnBvdywgW1IuZGVjLCBSLmluY10pKDMpKDQpOyAvLz0+IDMyXG4gKiBAc3ltYiBSLnVzZVdpdGgoZiwgW2csIGhdKShhLCBiKSA9IGYoZyhhKSwgaChiKSlcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIHVzZVdpdGgoZm4sIHRyYW5zZm9ybWVycykge1xuICByZXR1cm4gY3VycnlOKHRyYW5zZm9ybWVycy5sZW5ndGgsIGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgdmFyIGlkeCA9IDA7XG4gICAgd2hpbGUgKGlkeCA8IHRyYW5zZm9ybWVycy5sZW5ndGgpIHtcbiAgICAgIGFyZ3MucHVzaCh0cmFuc2Zvcm1lcnNbaWR4XS5jYWxsKHRoaXMsIGFyZ3VtZW50c1tpZHhdKSk7XG4gICAgICBpZHggKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3MuY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgdHJhbnNmb3JtZXJzLmxlbmd0aCkpKTtcbiAgfSk7XG59KTtcbiIsInZhciBfbWFwID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fbWFwJyk7XG52YXIgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5Jyk7XG52YXIgcGlja0FsbCA9IHJlcXVpcmUoJy4vcGlja0FsbCcpO1xudmFyIHVzZVdpdGggPSByZXF1aXJlKCcuL3VzZVdpdGgnKTtcblxuXG4vKipcbiAqIFJlYXNvbmFibGUgYW5hbG9nIHRvIFNRTCBgc2VsZWN0YCBzdGF0ZW1lbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAY2F0ZWdvcnkgUmVsYXRpb25cbiAqIEBzaWcgW2tdIC0+IFt7azogdn1dIC0+IFt7azogdn1dXG4gKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gcHJvamVjdFxuICogQHBhcmFtIHtBcnJheX0gb2JqcyBUaGUgb2JqZWN0cyB0byBxdWVyeVxuICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIG9iamVjdHMgd2l0aCBqdXN0IHRoZSBgcHJvcHNgIHByb3BlcnRpZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGFiYnkgPSB7bmFtZTogJ0FiYnknLCBhZ2U6IDcsIGhhaXI6ICdibG9uZCcsIGdyYWRlOiAyfTtcbiAqICAgICAgdmFyIGZyZWQgPSB7bmFtZTogJ0ZyZWQnLCBhZ2U6IDEyLCBoYWlyOiAnYnJvd24nLCBncmFkZTogN307XG4gKiAgICAgIHZhciBraWRzID0gW2FiYnksIGZyZWRdO1xuICogICAgICBSLnByb2plY3QoWyduYW1lJywgJ2dyYWRlJ10sIGtpZHMpOyAvLz0+IFt7bmFtZTogJ0FiYnknLCBncmFkZTogMn0sIHtuYW1lOiAnRnJlZCcsIGdyYWRlOiA3fV1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSB1c2VXaXRoKF9tYXAsIFtwaWNrQWxsLCBpZGVudGl0eV0pOyAvLyBwYXNzaW5nIGBpZGVudGl0eWAgZ2l2ZXMgY29ycmVjdCBhcml0eVxuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcbnZhciBlcXVhbHMgPSByZXF1aXJlKCcuL2VxdWFscycpO1xuXG5cbi8qKlxuICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgcHJvcGVydHkgaXMgZXF1YWwsIGluIGBSLmVxdWFsc2BcbiAqIHRlcm1zLCB0byB0aGUgZ2l2ZW4gdmFsdWU7IGBmYWxzZWAgb3RoZXJ3aXNlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIFN0cmluZyAtPiBhIC0+IE9iamVjdCAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHBhcmFtIHsqfSB2YWxcbiAqIEBwYXJhbSB7Kn0gb2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHNlZSBSLmVxdWFscywgUi5wcm9wU2F0aXNmaWVzXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGFiYnkgPSB7bmFtZTogJ0FiYnknLCBhZ2U6IDcsIGhhaXI6ICdibG9uZCd9O1xuICogICAgICB2YXIgZnJlZCA9IHtuYW1lOiAnRnJlZCcsIGFnZTogMTIsIGhhaXI6ICdicm93bid9O1xuICogICAgICB2YXIgcnVzdHkgPSB7bmFtZTogJ1J1c3R5JywgYWdlOiAxMCwgaGFpcjogJ2Jyb3duJ307XG4gKiAgICAgIHZhciBhbG9pcyA9IHtuYW1lOiAnQWxvaXMnLCBhZ2U6IDE1LCBkaXNwb3NpdGlvbjogJ3N1cmx5J307XG4gKiAgICAgIHZhciBraWRzID0gW2FiYnksIGZyZWQsIHJ1c3R5LCBhbG9pc107XG4gKiAgICAgIHZhciBoYXNCcm93bkhhaXIgPSBSLnByb3BFcSgnaGFpcicsICdicm93bicpO1xuICogICAgICBSLmZpbHRlcihoYXNCcm93bkhhaXIsIGtpZHMpOyAvLz0+IFtmcmVkLCBydXN0eV1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkzKGZ1bmN0aW9uIHByb3BFcShuYW1lLCB2YWwsIG9iaikge1xuICByZXR1cm4gZXF1YWxzKHZhbCwgb2JqW25hbWVdKTtcbn0pO1xuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcbnZhciBpcyA9IHJlcXVpcmUoJy4vaXMnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByb3BlcnR5IGlzIG9mIHRoZSBnaXZlbiB0eXBlO1xuICogYGZhbHNlYCBvdGhlcndpc2UuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTYuMFxuICogQGNhdGVnb3J5IFR5cGVcbiAqIEBzaWcgVHlwZSAtPiBTdHJpbmcgLT4gT2JqZWN0IC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHR5cGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0geyp9IG9ialxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBzZWUgUi5pcywgUi5wcm9wU2F0aXNmaWVzXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wcm9wSXMoTnVtYmVyLCAneCcsIHt4OiAxLCB5OiAyfSk7ICAvLz0+IHRydWVcbiAqICAgICAgUi5wcm9wSXMoTnVtYmVyLCAneCcsIHt4OiAnZm9vJ30pOyAgICAvLz0+IGZhbHNlXG4gKiAgICAgIFIucHJvcElzKE51bWJlciwgJ3gnLCB7fSk7ICAgICAgICAgICAgLy89PiBmYWxzZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTMoZnVuY3Rpb24gcHJvcElzKHR5cGUsIG5hbWUsIG9iaikge1xuICByZXR1cm4gaXModHlwZSwgb2JqW25hbWVdKTtcbn0pO1xuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcbnZhciBfaGFzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9faGFzJyk7XG5cblxuLyoqXG4gKiBJZiB0aGUgZ2l2ZW4sIG5vbi1udWxsIG9iamVjdCBoYXMgYW4gb3duIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLFxuICogcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhhdCBwcm9wZXJ0eS4gT3RoZXJ3aXNlIHJldHVybnMgdGhlIHByb3ZpZGVkIGRlZmF1bHRcbiAqIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjYuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyBhIC0+IFN0cmluZyAtPiBPYmplY3QgLT4gYVxuICogQHBhcmFtIHsqfSB2YWwgVGhlIGRlZmF1bHQgdmFsdWUuXG4gKiBAcGFyYW0ge1N0cmluZ30gcCBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcmV0dXJuLlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybiB7Kn0gVGhlIHZhbHVlIG9mIGdpdmVuIHByb3BlcnR5IG9mIHRoZSBzdXBwbGllZCBvYmplY3Qgb3IgdGhlIGRlZmF1bHQgdmFsdWUuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGFsaWNlID0ge1xuICogICAgICAgIG5hbWU6ICdBTElDRScsXG4gKiAgICAgICAgYWdlOiAxMDFcbiAqICAgICAgfTtcbiAqICAgICAgdmFyIGZhdm9yaXRlID0gUi5wcm9wKCdmYXZvcml0ZUxpYnJhcnknKTtcbiAqICAgICAgdmFyIGZhdm9yaXRlV2l0aERlZmF1bHQgPSBSLnByb3BPcignUmFtZGEnLCAnZmF2b3JpdGVMaWJyYXJ5Jyk7XG4gKlxuICogICAgICBmYXZvcml0ZShhbGljZSk7ICAvLz0+IHVuZGVmaW5lZFxuICogICAgICBmYXZvcml0ZVdpdGhEZWZhdWx0KGFsaWNlKTsgIC8vPT4gJ1JhbWRhJ1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTMoZnVuY3Rpb24gcHJvcE9yKHZhbCwgcCwgb2JqKSB7XG4gIHJldHVybiAob2JqICE9IG51bGwgJiYgX2hhcyhwLCBvYmopKSA/IG9ialtwXSA6IHZhbDtcbn0pO1xuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByb3BlcnR5IHNhdGlzZmllcyB0aGUgZ2l2ZW5cbiAqIHByZWRpY2F0ZTsgYGZhbHNlYCBvdGhlcndpc2UuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTYuMFxuICogQGNhdGVnb3J5IExvZ2ljXG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFN0cmluZyAtPiB7U3RyaW5nOiBhfSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHBhcmFtIHsqfSBvYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAc2VlIFIucHJvcEVxLCBSLnByb3BJc1xuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIucHJvcFNhdGlzZmllcyh4ID0+IHggPiAwLCAneCcsIHt4OiAxLCB5OiAyfSk7IC8vPT4gdHJ1ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTMoZnVuY3Rpb24gcHJvcFNhdGlzZmllcyhwcmVkLCBuYW1lLCBvYmopIHtcbiAgcmV0dXJuIHByZWQob2JqW25hbWVdKTtcbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIEFjdHMgYXMgbXVsdGlwbGUgYHByb3BgOiBhcnJheSBvZiBrZXlzIGluLCBhcnJheSBvZiB2YWx1ZXMgb3V0LiBQcmVzZXJ2ZXNcbiAqIG9yZGVyLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyBba10gLT4ge2s6IHZ9IC0+IFt2XVxuICogQHBhcmFtIHtBcnJheX0gcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGZldGNoXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcXVlcnlcbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgb3IgcGFydGlhbGx5IGFwcGxpZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5wcm9wcyhbJ3gnLCAneSddLCB7eDogMSwgeTogMn0pOyAvLz0+IFsxLCAyXVxuICogICAgICBSLnByb3BzKFsnYycsICdhJywgJ2InXSwge2I6IDIsIGE6IDF9KTsgLy89PiBbdW5kZWZpbmVkLCAxLCAyXVxuICpcbiAqICAgICAgdmFyIGZ1bGxOYW1lID0gUi5jb21wb3NlKFIuam9pbignICcpLCBSLnByb3BzKFsnZmlyc3QnLCAnbGFzdCddKSk7XG4gKiAgICAgIGZ1bGxOYW1lKHtsYXN0OiAnQnVsbGV0LVRvb3RoJywgYWdlOiAzMywgZmlyc3Q6ICdUb255J30pOyAvLz0+ICdUb255IEJ1bGxldC1Ub290aCdcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIHByb3BzKHBzLCBvYmopIHtcbiAgdmFyIGxlbiA9IHBzLmxlbmd0aDtcbiAgdmFyIG91dCA9IFtdO1xuICB2YXIgaWR4ID0gMDtcblxuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgb3V0W2lkeF0gPSBvYmpbcHNbaWR4XV07XG4gICAgaWR4ICs9IDE7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIF9pc051bWJlciA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2lzTnVtYmVyJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgbGlzdCBvZiBudW1iZXJzIGZyb20gYGZyb21gIChpbmNsdXNpdmUpIHRvIGB0b2AgKGV4Y2x1c2l2ZSkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gTnVtYmVyIC0+IFtOdW1iZXJdXG4gKiBAcGFyYW0ge051bWJlcn0gZnJvbSBUaGUgZmlyc3QgbnVtYmVyIGluIHRoZSBsaXN0LlxuICogQHBhcmFtIHtOdW1iZXJ9IHRvIE9uZSBtb3JlIHRoYW4gdGhlIGxhc3QgbnVtYmVyIGluIHRoZSBsaXN0LlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIG51bWJlcnMgaW4gdHRoZSBzZXQgYFthLCBiKWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5yYW5nZSgxLCA1KTsgICAgLy89PiBbMSwgMiwgMywgNF1cbiAqICAgICAgUi5yYW5nZSg1MCwgNTMpOyAgLy89PiBbNTAsIDUxLCA1Ml1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIHJhbmdlKGZyb20sIHRvKSB7XG4gIGlmICghKF9pc051bWJlcihmcm9tKSAmJiBfaXNOdW1iZXIodG8pKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JvdGggYXJndW1lbnRzIHRvIHJhbmdlIG11c3QgYmUgbnVtYmVycycpO1xuICB9XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIG4gPSBmcm9tO1xuICB3aGlsZSAobiA8IHRvKSB7XG4gICAgcmVzdWx0LnB1c2gobik7XG4gICAgbiArPSAxO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbiIsInZhciBfY3VycnkzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkzJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgc2luZ2xlIGl0ZW0gYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGxpc3QsIHN1Y2Nlc3NpdmVseSBjYWxsaW5nXG4gKiB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gYW5kIHBhc3NpbmcgaXQgYW4gYWNjdW11bGF0b3IgdmFsdWUgYW5kIHRoZSBjdXJyZW50XG4gKiB2YWx1ZSBmcm9tIHRoZSBhcnJheSwgYW5kIHRoZW4gcGFzc2luZyB0aGUgcmVzdWx0IHRvIHRoZSBuZXh0IGNhbGwuXG4gKlxuICogU2ltaWxhciB0byBgcmVkdWNlYCwgZXhjZXB0IG1vdmVzIHRocm91Z2ggdGhlIGlucHV0IGxpc3QgZnJvbSB0aGUgcmlnaHQgdG9cbiAqIHRoZSBsZWZ0LlxuICpcbiAqIFRoZSBpdGVyYXRvciBmdW5jdGlvbiByZWNlaXZlcyB0d28gdmFsdWVzOiAqKHZhbHVlLCBhY2MpKiwgd2hpbGUgdGhlIGFyZ3VtZW50cydcbiAqIG9yZGVyIG9mIGByZWR1Y2VgJ3MgaXRlcmF0b3IgZnVuY3Rpb24gaXMgKihhY2MsIHZhbHVlKSouXG4gKlxuICogTm90ZTogYFIucmVkdWNlUmlnaHRgIGRvZXMgbm90IHNraXAgZGVsZXRlZCBvciB1bmFzc2lnbmVkIGluZGljZXMgKHNwYXJzZVxuICogYXJyYXlzKSwgdW5saWtlIHRoZSBuYXRpdmUgYEFycmF5LnByb3RvdHlwZS5yZWR1Y2VgIG1ldGhvZC4gRm9yIG1vcmUgZGV0YWlsc1xuICogb24gdGhpcyBiZWhhdmlvciwgc2VlOlxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvcmVkdWNlUmlnaHQjRGVzY3JpcHRpb25cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhLCBiIC0+IGIpIC0+IGIgLT4gW2FdIC0+IGJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBpdGVyYXRvciBmdW5jdGlvbi4gUmVjZWl2ZXMgdHdvIHZhbHVlcywgdGhlIGN1cnJlbnQgZWxlbWVudCBmcm9tIHRoZSBhcnJheVxuICogICAgICAgIGFuZCB0aGUgYWNjdW11bGF0b3IuXG4gKiBAcGFyYW0geyp9IGFjYyBUaGUgYWNjdW11bGF0b3IgdmFsdWUuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEByZXR1cm4geyp9IFRoZSBmaW5hbCwgYWNjdW11bGF0ZWQgdmFsdWUuXG4gKiBAc2VlIFIucmVkdWNlLCBSLmFkZEluZGV4XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5yZWR1Y2VSaWdodChSLnN1YnRyYWN0LCAwLCBbMSwgMiwgMywgNF0pIC8vID0+ICgxIC0gKDIgLSAoMyAtICg0IC0gMCkpKSkgPSAtMlxuICogICAgICAgICAgLSAgICAgICAgICAgICAgIC0yXG4gKiAgICAgICAgIC8gXFwgICAgICAgICAgICAgIC8gXFxcbiAqICAgICAgICAxICAgLSAgICAgICAgICAgIDEgICAzXG4gKiAgICAgICAgICAgLyBcXCAgICAgICAgICAgICAgLyBcXFxuICogICAgICAgICAgMiAgIC0gICAgID09PiAgICAyICAtMVxuICogICAgICAgICAgICAgLyBcXCAgICAgICAgICAgICAgLyBcXFxuICogICAgICAgICAgICAzICAgLSAgICAgICAgICAgIDMgICA0XG4gKiAgICAgICAgICAgICAgIC8gXFwgICAgICAgICAgICAgIC8gXFxcbiAqICAgICAgICAgICAgICA0ICAgMCAgICAgICAgICAgIDQgICAwXG4gKlxuICogQHN5bWIgUi5yZWR1Y2VSaWdodChmLCBhLCBbYiwgYywgZF0pID0gZihiLCBmKGMsIGYoZCwgYSkpKVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTMoZnVuY3Rpb24gcmVkdWNlUmlnaHQoZm4sIGFjYywgbGlzdCkge1xuICB2YXIgaWR4ID0gbGlzdC5sZW5ndGggLSAxO1xuICB3aGlsZSAoaWR4ID49IDApIHtcbiAgICBhY2MgPSBmbihsaXN0W2lkeF0sIGFjYyk7XG4gICAgaWR4IC09IDE7XG4gIH1cbiAgcmV0dXJuIGFjYztcbn0pO1xuIiwidmFyIF9jdXJyeU4gPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeU4nKTtcbnZhciBfcmVkdWNlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fcmVkdWNlJyk7XG52YXIgX3JlZHVjZWQgPSByZXF1aXJlKCcuL2ludGVybmFsL19yZWR1Y2VkJyk7XG5cblxuLyoqXG4gKiBMaWtlIGByZWR1Y2VgLCBgcmVkdWNlV2hpbGVgIHJldHVybnMgYSBzaW5nbGUgaXRlbSBieSBpdGVyYXRpbmcgdGhyb3VnaFxuICogdGhlIGxpc3QsIHN1Y2Nlc3NpdmVseSBjYWxsaW5nIHRoZSBpdGVyYXRvciBmdW5jdGlvbi4gYHJlZHVjZVdoaWxlYCBhbHNvXG4gKiB0YWtlcyBhIHByZWRpY2F0ZSB0aGF0IGlzIGV2YWx1YXRlZCBiZWZvcmUgZWFjaCBzdGVwLiBJZiB0aGUgcHJlZGljYXRlIHJldHVybnNcbiAqIGBmYWxzZWAsIGl0IFwic2hvcnQtY2lyY3VpdHNcIiB0aGUgaXRlcmF0aW9uIGFuZCByZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlXG4gKiBvZiB0aGUgYWNjdW11bGF0b3IuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjIuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKChhLCBiKSAtPiBCb29sZWFuKSAtPiAoKGEsIGIpIC0+IGEpIC0+IGEgLT4gW2JdIC0+IGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgVGhlIHByZWRpY2F0ZS4gSXQgaXMgcGFzc2VkIHRoZSBhY2N1bXVsYXRvciBhbmQgdGhlXG4gKiAgICAgICAgY3VycmVudCBlbGVtZW50LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uLiBSZWNlaXZlcyB0d28gdmFsdWVzLCB0aGVcbiAqICAgICAgICBhY2N1bXVsYXRvciBhbmQgdGhlIGN1cnJlbnQgZWxlbWVudC5cbiAqIEBwYXJhbSB7Kn0gYSBUaGUgYWNjdW11bGF0b3IgdmFsdWUuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBsaXN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEByZXR1cm4geyp9IFRoZSBmaW5hbCwgYWNjdW11bGF0ZWQgdmFsdWUuXG4gKiBAc2VlIFIucmVkdWNlLCBSLnJlZHVjZWRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgaXNPZGQgPSAoYWNjLCB4KSA9PiB4ICUgMiA9PT0gMTtcbiAqICAgICAgdmFyIHhzID0gWzEsIDMsIDUsIDYwLCA3NzcsIDgwMF07XG4gKiAgICAgIFIucmVkdWNlV2hpbGUoaXNPZGQsIFIuYWRkLCAwLCB4cyk7IC8vPT4gOVxuICpcbiAqICAgICAgdmFyIHlzID0gWzIsIDQsIDZdXG4gKiAgICAgIFIucmVkdWNlV2hpbGUoaXNPZGQsIFIuYWRkLCAxMTEsIHlzKTsgLy89PiAxMTFcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnlOKDQsIFtdLCBmdW5jdGlvbiBfcmVkdWNlV2hpbGUocHJlZCwgZm4sIGEsIGxpc3QpIHtcbiAgcmV0dXJuIF9yZWR1Y2UoZnVuY3Rpb24oYWNjLCB4KSB7XG4gICAgcmV0dXJuIHByZWQoYWNjLCB4KSA/IGZuKGFjYywgeCkgOiBfcmVkdWNlZChhY2MpO1xuICB9LCBhLCBsaXN0KTtcbn0pO1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcbnZhciBfcmVkdWNlZCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX3JlZHVjZWQnKTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgdmFsdWUgd3JhcHBlZCB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIHRoZSBmaW5hbCB2YWx1ZSBvZiB0aGUgcmVkdWNlXG4gKiBhbmQgdHJhbnNkdWNlIGZ1bmN0aW9ucy4gVGhlIHJldHVybmVkIHZhbHVlIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgYmxhY2tcbiAqIGJveDogdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBzdGFibGUuXG4gKlxuICogTm90ZTogdGhpcyBvcHRpbWl6YXRpb24gaXMgdW5hdmFpbGFibGUgdG8gZnVuY3Rpb25zIG5vdCBleHBsaWNpdGx5IGxpc3RlZFxuICogYWJvdmUuIEZvciBpbnN0YW5jZSwgaXQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgcmVkdWNlUmlnaHQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTUuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgYSAtPiAqXG4gKiBAcGFyYW0geyp9IHggVGhlIGZpbmFsIHZhbHVlIG9mIHRoZSByZWR1Y2UuXG4gKiBAcmV0dXJuIHsqfSBUaGUgd3JhcHBlZCB2YWx1ZS5cbiAqIEBzZWUgUi5yZWR1Y2UsIFIudHJhbnNkdWNlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5yZWR1Y2UoXG4gKiAgICAgICAgUi5waXBlKFIuYWRkLCBSLndoZW4oUi5ndGUoUi5fXywgMTApLCBSLnJlZHVjZWQpKSxcbiAqICAgICAgICAwLFxuICogICAgICAgIFsxLCAyLCAzLCA0LCA1XSkgLy8gMTBcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoX3JlZHVjZWQpO1xuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcblxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIHN1Yi1saXN0IG9mIGBsaXN0YCBzdGFydGluZyBhdCBpbmRleCBgc3RhcnRgIGFuZCBjb250YWluaW5nXG4gKiBgY291bnRgIGVsZW1lbnRzLiBfTm90ZSB0aGF0IHRoaXMgaXMgbm90IGRlc3RydWN0aXZlXzogaXQgcmV0dXJucyBhIGNvcHkgb2ZcbiAqIHRoZSBsaXN0IHdpdGggdGhlIGNoYW5nZXMuXG4gKiA8c21hbGw+Tm8gbGlzdHMgaGF2ZSBiZWVuIGhhcm1lZCBpbiB0aGUgYXBwbGljYXRpb24gb2YgdGhpcyBmdW5jdGlvbi48L3NtYWxsPlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjIuMlxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgTnVtYmVyIC0+IE51bWJlciAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge051bWJlcn0gc3RhcnQgVGhlIHBvc2l0aW9uIHRvIHN0YXJ0IHJlbW92aW5nIGVsZW1lbnRzXG4gKiBAcGFyYW0ge051bWJlcn0gY291bnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byByZW1vdmVcbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gcmVtb3ZlIGZyb21cbiAqIEByZXR1cm4ge0FycmF5fSBBIG5ldyBBcnJheSB3aXRoIGBjb3VudGAgZWxlbWVudHMgZnJvbSBgc3RhcnRgIHJlbW92ZWQuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5yZW1vdmUoMiwgMywgWzEsMiwzLDQsNSw2LDcsOF0pOyAvLz0+IFsxLDIsNiw3LDhdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MyhmdW5jdGlvbiByZW1vdmUoc3RhcnQsIGNvdW50LCBsaXN0KSB7XG4gIHZhciByZXN1bHQgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChsaXN0LCAwKTtcbiAgcmVzdWx0LnNwbGljZShzdGFydCwgY291bnQpO1xuICByZXR1cm4gcmVzdWx0O1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogQ2FsbHMgYW4gaW5wdXQgZnVuY3Rpb24gYG5gIHRpbWVzLCByZXR1cm5pbmcgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgcmVzdWx0c1xuICogb2YgdGhvc2UgZnVuY3Rpb24gY2FsbHMuXG4gKlxuICogYGZuYCBpcyBwYXNzZWQgb25lIGFyZ3VtZW50OiBUaGUgY3VycmVudCB2YWx1ZSBvZiBgbmAsIHdoaWNoIGJlZ2lucyBhdCBgMGBcbiAqIGFuZCBpcyBncmFkdWFsbHkgaW5jcmVtZW50ZWQgdG8gYG4gLSAxYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yLjNcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChOdW1iZXIgLT4gYSkgLT4gTnVtYmVyIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGludm9rZS4gUGFzc2VkIG9uZSBhcmd1bWVudCwgdGhlIGN1cnJlbnQgdmFsdWUgb2YgYG5gLlxuICogQHBhcmFtIHtOdW1iZXJ9IG4gQSB2YWx1ZSBiZXR3ZWVuIGAwYCBhbmQgYG4gLSAxYC4gSW5jcmVtZW50cyBhZnRlciBlYWNoIGZ1bmN0aW9uIGNhbGwuXG4gKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgY29udGFpbmluZyB0aGUgcmV0dXJuIHZhbHVlcyBvZiBhbGwgY2FsbHMgdG8gYGZuYC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnRpbWVzKFIuaWRlbnRpdHksIDUpOyAvLz0+IFswLCAxLCAyLCAzLCA0XVxuICogQHN5bWIgUi50aW1lcyhmLCAwKSA9IFtdXG4gKiBAc3ltYiBSLnRpbWVzKGYsIDEpID0gW2YoMCldXG4gKiBAc3ltYiBSLnRpbWVzKGYsIDIpID0gW2YoMCksIGYoMSldXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiB0aW1lcyhmbiwgbikge1xuICB2YXIgbGVuID0gTnVtYmVyKG4pO1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxpc3Q7XG5cbiAgaWYgKGxlbiA8IDAgfHwgaXNOYU4obGVuKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCduIG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyJyk7XG4gIH1cbiAgbGlzdCA9IG5ldyBBcnJheShsZW4pO1xuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgbGlzdFtpZHhdID0gZm4oaWR4KTtcbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gbGlzdDtcbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcbnZhciBhbHdheXMgPSByZXF1aXJlKCcuL2Fsd2F5cycpO1xudmFyIHRpbWVzID0gcmVxdWlyZSgnLi90aW1lcycpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIGZpeGVkIGxpc3Qgb2Ygc2l6ZSBgbmAgY29udGFpbmluZyBhIHNwZWNpZmllZCBpZGVudGljYWwgdmFsdWUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4xXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBhIC0+IG4gLT4gW2FdXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZXBlYXQuXG4gKiBAcGFyYW0ge051bWJlcn0gbiBUaGUgZGVzaXJlZCBzaXplIG9mIHRoZSBvdXRwdXQgbGlzdC5cbiAqIEByZXR1cm4ge0FycmF5fSBBIG5ldyBhcnJheSBjb250YWluaW5nIGBuYCBgdmFsdWVgcy5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnJlcGVhdCgnaGknLCA1KTsgLy89PiBbJ2hpJywgJ2hpJywgJ2hpJywgJ2hpJywgJ2hpJ11cbiAqXG4gKiAgICAgIHZhciBvYmogPSB7fTtcbiAqICAgICAgdmFyIHJlcGVhdGVkT2JqcyA9IFIucmVwZWF0KG9iaiwgNSk7IC8vPT4gW3t9LCB7fSwge30sIHt9LCB7fV1cbiAqICAgICAgcmVwZWF0ZWRPYmpzWzBdID09PSByZXBlYXRlZE9ianNbMV07IC8vPT4gdHJ1ZVxuICogQHN5bWIgUi5yZXBlYXQoYSwgMCkgPSBbXVxuICogQHN5bWIgUi5yZXBlYXQoYSwgMSkgPSBbYV1cbiAqIEBzeW1iIFIucmVwZWF0KGEsIDIpID0gW2EsIGFdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiByZXBlYXQodmFsdWUsIG4pIHtcbiAgcmV0dXJuIHRpbWVzKGFsd2F5cyh2YWx1ZSksIG4pO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MycpO1xuXG5cbi8qKlxuICogUmVwbGFjZSBhIHN1YnN0cmluZyBvciByZWdleCBtYXRjaCBpbiBhIHN0cmluZyB3aXRoIGEgcmVwbGFjZW1lbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuNy4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAc2lnIFJlZ0V4cHxTdHJpbmcgLT4gU3RyaW5nIC0+IFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7UmVnRXhwfFN0cmluZ30gcGF0dGVybiBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBvciBhIHN1YnN0cmluZyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7U3RyaW5nfSByZXBsYWNlbWVudCBUaGUgc3RyaW5nIHRvIHJlcGxhY2UgdGhlIG1hdGNoZXMgd2l0aC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIFN0cmluZyB0byBkbyB0aGUgc2VhcmNoIGFuZCByZXBsYWNlbWVudCBpbi5cbiAqIEByZXR1cm4ge1N0cmluZ30gVGhlIHJlc3VsdC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnJlcGxhY2UoJ2ZvbycsICdiYXInLCAnZm9vIGZvbyBmb28nKTsgLy89PiAnYmFyIGZvbyBmb28nXG4gKiAgICAgIFIucmVwbGFjZSgvZm9vLywgJ2JhcicsICdmb28gZm9vIGZvbycpOyAvLz0+ICdiYXIgZm9vIGZvbydcbiAqXG4gKiAgICAgIC8vIFVzZSB0aGUgXCJnXCIgKGdsb2JhbCkgZmxhZyB0byByZXBsYWNlIGFsbCBvY2N1cnJlbmNlczpcbiAqICAgICAgUi5yZXBsYWNlKC9mb28vZywgJ2JhcicsICdmb28gZm9vIGZvbycpOyAvLz0+ICdiYXIgYmFyIGJhcidcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkzKGZ1bmN0aW9uIHJlcGxhY2UocmVnZXgsIHJlcGxhY2VtZW50LCBzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKHJlZ2V4LCByZXBsYWNlbWVudCk7XG59KTtcbiIsInZhciBfY3VycnkzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkzJyk7XG5cblxuLyoqXG4gKiBTY2FuIGlzIHNpbWlsYXIgdG8gcmVkdWNlLCBidXQgcmV0dXJucyBhIGxpc3Qgb2Ygc3VjY2Vzc2l2ZWx5IHJlZHVjZWQgdmFsdWVzXG4gKiBmcm9tIHRoZSBsZWZ0XG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTAuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEsYiAtPiBhKSAtPiBhIC0+IFtiXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBpdGVyYXRvciBmdW5jdGlvbi4gUmVjZWl2ZXMgdHdvIHZhbHVlcywgdGhlIGFjY3VtdWxhdG9yIGFuZCB0aGVcbiAqICAgICAgICBjdXJyZW50IGVsZW1lbnQgZnJvbSB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7Kn0gYWNjIFRoZSBhY2N1bXVsYXRvciB2YWx1ZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybiB7QXJyYXl9IEEgbGlzdCBvZiBhbGwgaW50ZXJtZWRpYXRlbHkgcmVkdWNlZCB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIG51bWJlcnMgPSBbMSwgMiwgMywgNF07XG4gKiAgICAgIHZhciBmYWN0b3JpYWxzID0gUi5zY2FuKFIubXVsdGlwbHksIDEsIG51bWJlcnMpOyAvLz0+IFsxLCAxLCAyLCA2LCAyNF1cbiAqIEBzeW1iIFIuc2NhbihmLCBhLCBbYiwgY10pID0gW2EsIGYoYSwgYiksIGYoZihhLCBiKSwgYyldXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MyhmdW5jdGlvbiBzY2FuKGZuLCBhY2MsIGxpc3QpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBsaXN0Lmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IFthY2NdO1xuICB3aGlsZSAoaWR4IDwgbGVuKSB7XG4gICAgYWNjID0gZm4oYWNjLCBsaXN0W2lkeF0pO1xuICAgIHJlc3VsdFtpZHggKyAxXSA9IGFjYztcbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIGFwID0gcmVxdWlyZSgnLi9hcCcpO1xudmFyIG1hcCA9IHJlcXVpcmUoJy4vbWFwJyk7XG52YXIgcHJlcGVuZCA9IHJlcXVpcmUoJy4vcHJlcGVuZCcpO1xudmFyIHJlZHVjZVJpZ2h0ID0gcmVxdWlyZSgnLi9yZWR1Y2VSaWdodCcpO1xuXG5cbi8qKlxuICogVHJhbnNmb3JtcyBhIFtUcmF2ZXJzYWJsZV0oaHR0cHM6Ly9naXRodWIuY29tL2ZhbnRhc3lsYW5kL2ZhbnRhc3ktbGFuZCN0cmF2ZXJzYWJsZSlcbiAqIG9mIFtBcHBsaWNhdGl2ZV0oaHR0cHM6Ly9naXRodWIuY29tL2ZhbnRhc3lsYW5kL2ZhbnRhc3ktbGFuZCNhcHBsaWNhdGl2ZSkgaW50byBhblxuICogQXBwbGljYXRpdmUgb2YgVHJhdmVyc2FibGUuXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYHNlcXVlbmNlYCBtZXRob2Qgb2YgdGhlIHNlY29uZCBhcmd1bWVudCwgaWYgcHJlc2VudC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoQXBwbGljYXRpdmUgZiwgVHJhdmVyc2FibGUgdCkgPT4gKGEgLT4gZiBhKSAtPiB0IChmIGEpIC0+IGYgKHQgYSlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9mXG4gKiBAcGFyYW0geyp9IHRyYXZlcnNhYmxlXG4gKiBAcmV0dXJuIHsqfVxuICogQHNlZSBSLnRyYXZlcnNlXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5zZXF1ZW5jZShNYXliZS5vZiwgW0p1c3QoMSksIEp1c3QoMiksIEp1c3QoMyldKTsgICAvLz0+IEp1c3QoWzEsIDIsIDNdKVxuICogICAgICBSLnNlcXVlbmNlKE1heWJlLm9mLCBbSnVzdCgxKSwgSnVzdCgyKSwgTm90aGluZygpXSk7IC8vPT4gTm90aGluZygpXG4gKlxuICogICAgICBSLnNlcXVlbmNlKFIub2YsIEp1c3QoWzEsIDIsIDNdKSk7IC8vPT4gW0p1c3QoMSksIEp1c3QoMiksIEp1c3QoMyldXG4gKiAgICAgIFIuc2VxdWVuY2UoUi5vZiwgTm90aGluZygpKTsgICAgICAgLy89PiBbTm90aGluZygpXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gc2VxdWVuY2Uob2YsIHRyYXZlcnNhYmxlKSB7XG4gIHJldHVybiB0eXBlb2YgdHJhdmVyc2FibGUuc2VxdWVuY2UgPT09ICdmdW5jdGlvbicgP1xuICAgIHRyYXZlcnNhYmxlLnNlcXVlbmNlKG9mKSA6XG4gICAgcmVkdWNlUmlnaHQoZnVuY3Rpb24oeCwgYWNjKSB7IHJldHVybiBhcChtYXAocHJlcGVuZCwgeCksIGFjYyk7IH0sXG4gICAgICAgICAgICAgICAgb2YoW10pLFxuICAgICAgICAgICAgICAgIHRyYXZlcnNhYmxlKTtcbn0pO1xuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcbnZhciBhbHdheXMgPSByZXF1aXJlKCcuL2Fsd2F5cycpO1xudmFyIG92ZXIgPSByZXF1aXJlKCcuL292ZXInKTtcblxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBcInNldHRpbmdcIiB0aGUgcG9ydGlvbiBvZiB0aGUgZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmVcbiAqIGZvY3VzZWQgYnkgdGhlIGdpdmVuIGxlbnMgdG8gdGhlIGdpdmVuIHZhbHVlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE2LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEB0eXBlZGVmbiBMZW5zIHMgYSA9IEZ1bmN0b3IgZiA9PiAoYSAtPiBmIGEpIC0+IHMgLT4gZiBzXG4gKiBAc2lnIExlbnMgcyBhIC0+IGEgLT4gcyAtPiBzXG4gKiBAcGFyYW0ge0xlbnN9IGxlbnNcbiAqIEBwYXJhbSB7Kn0gdlxuICogQHBhcmFtIHsqfSB4XG4gKiBAcmV0dXJuIHsqfVxuICogQHNlZSBSLnByb3AsIFIubGVuc0luZGV4LCBSLmxlbnNQcm9wXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIHhMZW5zID0gUi5sZW5zUHJvcCgneCcpO1xuICpcbiAqICAgICAgUi5zZXQoeExlbnMsIDQsIHt4OiAxLCB5OiAyfSk7ICAvLz0+IHt4OiA0LCB5OiAyfVxuICogICAgICBSLnNldCh4TGVucywgOCwge3g6IDEsIHk6IDJ9KTsgIC8vPT4ge3g6IDgsIHk6IDJ9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MyhmdW5jdGlvbiBzZXQobGVucywgdiwgeCkge1xuICByZXR1cm4gb3ZlcihsZW5zLCBhbHdheXModiksIHgpO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIGxpc3QsIHNvcnRlZCBhY2NvcmRpbmcgdG8gdGhlIGNvbXBhcmF0b3IgZnVuY3Rpb24sXG4gKiB3aGljaCBzaG91bGQgYWNjZXB0IHR3byB2YWx1ZXMgYXQgYSB0aW1lIGFuZCByZXR1cm4gYSBuZWdhdGl2ZSBudW1iZXIgaWYgdGhlXG4gKiBmaXJzdCB2YWx1ZSBpcyBzbWFsbGVyLCBhIHBvc2l0aXZlIG51bWJlciBpZiBpdCdzIGxhcmdlciwgYW5kIHplcm8gaWYgdGhleVxuICogYXJlIGVxdWFsLiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgaXMgYSAqKmNvcHkqKiBvZiB0aGUgbGlzdC4gSXQgZG9lcyBub3RcbiAqIG1vZGlmeSB0aGUgb3JpZ2luYWwuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSxhIC0+IE51bWJlcikgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBBIHNvcnRpbmcgZnVuY3Rpb24gOjogYSAtPiBiIC0+IEludFxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBzb3J0XG4gKiBAcmV0dXJuIHtBcnJheX0gYSBuZXcgYXJyYXkgd2l0aCBpdHMgZWxlbWVudHMgc29ydGVkIGJ5IHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBkaWZmID0gZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gYSAtIGI7IH07XG4gKiAgICAgIFIuc29ydChkaWZmLCBbNCwyLDcsNV0pOyAvLz0+IFsyLCA0LCA1LCA3XVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gc29ydChjb21wYXJhdG9yLCBsaXN0KSB7XG4gIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChsaXN0LCAwKS5zb3J0KGNvbXBhcmF0b3IpO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogU29ydHMgdGhlIGxpc3QgYWNjb3JkaW5nIHRvIHRoZSBzdXBwbGllZCBmdW5jdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBPcmQgYiA9PiAoYSAtPiBiKSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBzb3J0LlxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3IGxpc3Qgc29ydGVkIGJ5IHRoZSBrZXlzIGdlbmVyYXRlZCBieSBgZm5gLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBzb3J0QnlGaXJzdEl0ZW0gPSBSLnNvcnRCeShSLnByb3AoMCkpO1xuICogICAgICB2YXIgc29ydEJ5TmFtZUNhc2VJbnNlbnNpdGl2ZSA9IFIuc29ydEJ5KFIuY29tcG9zZShSLnRvTG93ZXIsIFIucHJvcCgnbmFtZScpKSk7XG4gKiAgICAgIHZhciBwYWlycyA9IFtbLTEsIDFdLCBbLTIsIDJdLCBbLTMsIDNdXTtcbiAqICAgICAgc29ydEJ5Rmlyc3RJdGVtKHBhaXJzKTsgLy89PiBbWy0zLCAzXSwgWy0yLCAyXSwgWy0xLCAxXV1cbiAqICAgICAgdmFyIGFsaWNlID0ge1xuICogICAgICAgIG5hbWU6ICdBTElDRScsXG4gKiAgICAgICAgYWdlOiAxMDFcbiAqICAgICAgfTtcbiAqICAgICAgdmFyIGJvYiA9IHtcbiAqICAgICAgICBuYW1lOiAnQm9iJyxcbiAqICAgICAgICBhZ2U6IC0xMFxuICogICAgICB9O1xuICogICAgICB2YXIgY2xhcmEgPSB7XG4gKiAgICAgICAgbmFtZTogJ2NsYXJhJyxcbiAqICAgICAgICBhZ2U6IDMxNC4xNTlcbiAqICAgICAgfTtcbiAqICAgICAgdmFyIHBlb3BsZSA9IFtjbGFyYSwgYm9iLCBhbGljZV07XG4gKiAgICAgIHNvcnRCeU5hbWVDYXNlSW5zZW5zaXRpdmUocGVvcGxlKTsgLy89PiBbYWxpY2UsIGJvYiwgY2xhcmFdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBzb3J0QnkoZm4sIGxpc3QpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIDApLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciBhYSA9IGZuKGEpO1xuICAgIHZhciBiYiA9IGZuKGIpO1xuICAgIHJldHVybiBhYSA8IGJiID8gLTEgOiBhYSA+IGJiID8gMSA6IDA7XG4gIH0pO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogU29ydHMgYSBsaXN0IGFjY29yZGluZyB0byBhIGxpc3Qgb2YgY29tcGFyYXRvcnMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMjMuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIFthIC0+IGEgLT4gTnVtYmVyXSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0FycmF5fSBmdW5jdGlvbnMgQSBsaXN0IG9mIGNvbXBhcmF0b3IgZnVuY3Rpb25zLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgbGlzdCB0byBzb3J0LlxuICogQHJldHVybiB7QXJyYXl9IEEgbmV3IGxpc3Qgc29ydGVkIGFjY29yZGluZyB0byB0aGUgY29tYXJhdG9yIGZ1bmN0aW9ucy5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgYWxpY2UgPSB7XG4gKiAgICAgICAgbmFtZTogJ2FsaWNlJyxcbiAqICAgICAgICBhZ2U6IDQwXG4gKiAgICAgIH07XG4gKiAgICAgIHZhciBib2IgPSB7XG4gKiAgICAgICAgbmFtZTogJ2JvYicsXG4gKiAgICAgICAgYWdlOiAzMFxuICogICAgICB9O1xuICogICAgICB2YXIgY2xhcmEgPSB7XG4gKiAgICAgICAgbmFtZTogJ2NsYXJhJyxcbiAqICAgICAgICBhZ2U6IDQwXG4gKiAgICAgIH07XG4gKiAgICAgIHZhciBwZW9wbGUgPSBbY2xhcmEsIGJvYiwgYWxpY2VdO1xuICogICAgICB2YXIgYWdlTmFtZVNvcnQgPSBSLnNvcnRXaXRoKFtcbiAqICAgICAgICBSLmRlc2NlbmQoUi5wcm9wKCdhZ2UnKSksXG4gKiAgICAgICAgUi5hc2NlbmQoUi5wcm9wKCduYW1lJykpXG4gKiAgICAgIF0pO1xuICogICAgICBhZ2VOYW1lU29ydChwZW9wbGUpOyAvLz0+IFthbGljZSwgY2xhcmEsIGJvYl1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIHNvcnRXaXRoKGZucywgbGlzdCkge1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobGlzdCwgMCkuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgdmFyIHJlc3VsdCA9IDA7XG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChyZXN1bHQgPT09IDAgJiYgaSA8IGZucy5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdCA9IGZuc1tpXShhLCBiKTtcbiAgICAgIGkgKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG59KTtcbiIsInZhciBpbnZva2VyID0gcmVxdWlyZSgnLi9pbnZva2VyJyk7XG5cblxuLyoqXG4gKiBTcGxpdHMgYSBzdHJpbmcgaW50byBhbiBhcnJheSBvZiBzdHJpbmdzIGJhc2VkIG9uIHRoZSBnaXZlblxuICogc2VwYXJhdG9yLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHNpZyAoU3RyaW5nIHwgUmVnRXhwKSAtPiBTdHJpbmcgLT4gW1N0cmluZ11cbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gc2VwIFRoZSBwYXR0ZXJuLlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIHNlcGFyYXRlIGludG8gYW4gYXJyYXkuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGFycmF5IG9mIHN0cmluZ3MgZnJvbSBgc3RyYCBzZXBhcmF0ZWQgYnkgYHN0cmAuXG4gKiBAc2VlIFIuam9pblxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBwYXRoQ29tcG9uZW50cyA9IFIuc3BsaXQoJy8nKTtcbiAqICAgICAgUi50YWlsKHBhdGhDb21wb25lbnRzKCcvdXNyL2xvY2FsL2Jpbi9ub2RlJykpOyAvLz0+IFsndXNyJywgJ2xvY2FsJywgJ2JpbicsICdub2RlJ11cbiAqXG4gKiAgICAgIFIuc3BsaXQoJy4nLCAnYS5iLmMueHl6LmQnKTsgLy89PiBbJ2EnLCAnYicsICdjJywgJ3h5eicsICdkJ11cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBpbnZva2VyKDEsICdzcGxpdCcpO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcbnZhciBsZW5ndGggPSByZXF1aXJlKCcuL2xlbmd0aCcpO1xudmFyIHNsaWNlID0gcmVxdWlyZSgnLi9zbGljZScpO1xuXG5cbi8qKlxuICogU3BsaXRzIGEgZ2l2ZW4gbGlzdCBvciBzdHJpbmcgYXQgYSBnaXZlbiBpbmRleC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBOdW1iZXIgLT4gW2FdIC0+IFtbYV0sIFthXV1cbiAqIEBzaWcgTnVtYmVyIC0+IFN0cmluZyAtPiBbU3RyaW5nLCBTdHJpbmddXG4gKiBAcGFyYW0ge051bWJlcn0gaW5kZXggVGhlIGluZGV4IHdoZXJlIHRoZSBhcnJheS9zdHJpbmcgaXMgc3BsaXQuXG4gKiBAcGFyYW0ge0FycmF5fFN0cmluZ30gYXJyYXkgVGhlIGFycmF5L3N0cmluZyB0byBiZSBzcGxpdC5cbiAqIEByZXR1cm4ge0FycmF5fVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuc3BsaXRBdCgxLCBbMSwgMiwgM10pOyAgICAgICAgICAvLz0+IFtbMV0sIFsyLCAzXV1cbiAqICAgICAgUi5zcGxpdEF0KDUsICdoZWxsbyB3b3JsZCcpOyAgICAgIC8vPT4gWydoZWxsbycsICcgd29ybGQnXVxuICogICAgICBSLnNwbGl0QXQoLTEsICdmb29iYXInKTsgICAgICAgICAgLy89PiBbJ2Zvb2JhJywgJ3InXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gc3BsaXRBdChpbmRleCwgYXJyYXkpIHtcbiAgcmV0dXJuIFtzbGljZSgwLCBpbmRleCwgYXJyYXkpLCBzbGljZShpbmRleCwgbGVuZ3RoKGFycmF5KSwgYXJyYXkpXTtcbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcbnZhciBzbGljZSA9IHJlcXVpcmUoJy4vc2xpY2UnKTtcblxuXG4vKipcbiAqIFNwbGl0cyBhIGNvbGxlY3Rpb24gaW50byBzbGljZXMgb2YgdGhlIHNwZWNpZmllZCBsZW5ndGguXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTYuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgTnVtYmVyIC0+IFthXSAtPiBbW2FdXVxuICogQHNpZyBOdW1iZXIgLT4gU3RyaW5nIC0+IFtTdHJpbmddXG4gKiBAcGFyYW0ge051bWJlcn0gblxuICogQHBhcmFtIHtBcnJheX0gbGlzdFxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5zcGxpdEV2ZXJ5KDMsIFsxLCAyLCAzLCA0LCA1LCA2LCA3XSk7IC8vPT4gW1sxLCAyLCAzXSwgWzQsIDUsIDZdLCBbN11dXG4gKiAgICAgIFIuc3BsaXRFdmVyeSgzLCAnZm9vYmFyYmF6Jyk7IC8vPT4gWydmb28nLCAnYmFyJywgJ2JheiddXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBzcGxpdEV2ZXJ5KG4sIGxpc3QpIHtcbiAgaWYgKG4gPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmlyc3QgYXJndW1lbnQgdG8gc3BsaXRFdmVyeSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcicpO1xuICB9XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGlkeCA9IDA7XG4gIHdoaWxlIChpZHggPCBsaXN0Lmxlbmd0aCkge1xuICAgIHJlc3VsdC5wdXNoKHNsaWNlKGlkeCwgaWR4ICs9IG4sIGxpc3QpKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogVGFrZXMgYSBsaXN0IGFuZCBhIHByZWRpY2F0ZSBhbmQgcmV0dXJucyBhIHBhaXIgb2YgbGlzdHMgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogIC0gdGhlIHJlc3VsdCBvZiBjb25jYXRlbmF0aW5nIHRoZSB0d28gb3V0cHV0IGxpc3RzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGlucHV0IGxpc3Q7XG4gKiAgLSBub25lIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgZmlyc3Qgb3V0cHV0IGxpc3Qgc2F0aXNmaWVzIHRoZSBwcmVkaWNhdGU7IGFuZFxuICogIC0gaWYgdGhlIHNlY29uZCBvdXRwdXQgbGlzdCBpcyBub24tZW1wdHksIGl0cyBmaXJzdCBlbGVtZW50IHNhdGlzZmllcyB0aGUgcHJlZGljYXRlLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE5LjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IEJvb2xlYW4pIC0+IFthXSAtPiBbW2FdLCBbYV1dXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkIFRoZSBwcmVkaWNhdGUgdGhhdCBkZXRlcm1pbmVzIHdoZXJlIHRoZSBhcnJheSBpcyBzcGxpdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGFycmF5IHRvIGJlIHNwbGl0LlxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi5zcGxpdFdoZW4oUi5lcXVhbHMoMiksIFsxLCAyLCAzLCAxLCAyLCAzXSk7ICAgLy89PiBbWzFdLCBbMiwgMywgMSwgMiwgM11dXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiBzcGxpdFdoZW4ocHJlZCwgbGlzdCkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IGxpc3QubGVuZ3RoO1xuICB2YXIgcHJlZml4ID0gW107XG5cbiAgd2hpbGUgKGlkeCA8IGxlbiAmJiAhcHJlZChsaXN0W2lkeF0pKSB7XG4gICAgcHJlZml4LnB1c2gobGlzdFtpZHhdKTtcbiAgICBpZHggKz0gMTtcbiAgfVxuXG4gIHJldHVybiBbcHJlZml4LCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChsaXN0LCBpZHgpXTtcbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIFN1YnRyYWN0cyBpdHMgc2Vjb25kIGFyZ3VtZW50IGZyb20gaXRzIGZpcnN0IGFyZ3VtZW50LlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBzaWcgTnVtYmVyIC0+IE51bWJlciAtPiBOdW1iZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBhIFRoZSBmaXJzdCB2YWx1ZS5cbiAqIEBwYXJhbSB7TnVtYmVyfSBiIFRoZSBzZWNvbmQgdmFsdWUuXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSByZXN1bHQgb2YgYGEgLSBiYC5cbiAqIEBzZWUgUi5hZGRcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnN1YnRyYWN0KDEwLCA4KTsgLy89PiAyXG4gKlxuICogICAgICB2YXIgbWludXM1ID0gUi5zdWJ0cmFjdChSLl9fLCA1KTtcbiAqICAgICAgbWludXM1KDE3KTsgLy89PiAxMlxuICpcbiAqICAgICAgdmFyIGNvbXBsZW1lbnRhcnlBbmdsZSA9IFIuc3VidHJhY3QoOTApO1xuICogICAgICBjb21wbGVtZW50YXJ5QW5nbGUoMzApOyAvLz0+IDYwXG4gKiAgICAgIGNvbXBsZW1lbnRhcnlBbmdsZSg3Mik7IC8vPT4gMThcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIHN1YnRyYWN0KGEsIGIpIHtcbiAgcmV0dXJuIE51bWJlcihhKSAtIE51bWJlcihiKTtcbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcbnZhciBjb25jYXQgPSByZXF1aXJlKCcuL2NvbmNhdCcpO1xudmFyIGRpZmZlcmVuY2UgPSByZXF1aXJlKCcuL2RpZmZlcmVuY2UnKTtcblxuXG4vKipcbiAqIEZpbmRzIHRoZSBzZXQgKGkuZS4gbm8gZHVwbGljYXRlcykgb2YgYWxsIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgZmlyc3Qgb3JcbiAqIHNlY29uZCBsaXN0LCBidXQgbm90IGJvdGguXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIFsqXSAtPiBbKl0gLT4gWypdXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MSBUaGUgZmlyc3QgbGlzdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QyIFRoZSBzZWNvbmQgbGlzdC5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgZWxlbWVudHMgaW4gYGxpc3QxYCBvciBgbGlzdDJgLCBidXQgbm90IGJvdGguXG4gKiBAc2VlIFIuc3ltbWV0cmljRGlmZmVyZW5jZVdpdGgsIFIuZGlmZmVyZW5jZSwgUi5kaWZmZXJlbmNlV2l0aFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIuc3ltbWV0cmljRGlmZmVyZW5jZShbMSwyLDMsNF0sIFs3LDYsNSw0LDNdKTsgLy89PiBbMSwyLDcsNiw1XVxuICogICAgICBSLnN5bW1ldHJpY0RpZmZlcmVuY2UoWzcsNiw1LDQsM10sIFsxLDIsMyw0XSk7IC8vPT4gWzcsNiw1LDEsMl1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIHN5bW1ldHJpY0RpZmZlcmVuY2UobGlzdDEsIGxpc3QyKSB7XG4gIHJldHVybiBjb25jYXQoZGlmZmVyZW5jZShsaXN0MSwgbGlzdDIpLCBkaWZmZXJlbmNlKGxpc3QyLCBsaXN0MSkpO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MycpO1xudmFyIGNvbmNhdCA9IHJlcXVpcmUoJy4vY29uY2F0Jyk7XG52YXIgZGlmZmVyZW5jZVdpdGggPSByZXF1aXJlKCcuL2RpZmZlcmVuY2VXaXRoJyk7XG5cblxuLyoqXG4gKiBGaW5kcyB0aGUgc2V0IChpLmUuIG5vIGR1cGxpY2F0ZXMpIG9mIGFsbCBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIGZpcnN0IG9yXG4gKiBzZWNvbmQgbGlzdCwgYnV0IG5vdCBib3RoLiBEdXBsaWNhdGlvbiBpcyBkZXRlcm1pbmVkIGFjY29yZGluZyB0byB0aGUgdmFsdWVcbiAqIHJldHVybmVkIGJ5IGFwcGx5aW5nIHRoZSBzdXBwbGllZCBwcmVkaWNhdGUgdG8gdHdvIGxpc3QgZWxlbWVudHMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnICgoYSwgYSkgLT4gQm9vbGVhbikgLT4gW2FdIC0+IFthXSAtPiBbYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgQSBwcmVkaWNhdGUgdXNlZCB0byB0ZXN0IHdoZXRoZXIgdHdvIGl0ZW1zIGFyZSBlcXVhbC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QxIFRoZSBmaXJzdCBsaXN0LlxuICogQHBhcmFtIHtBcnJheX0gbGlzdDIgVGhlIHNlY29uZCBsaXN0LlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBlbGVtZW50cyBpbiBgbGlzdDFgIG9yIGBsaXN0MmAsIGJ1dCBub3QgYm90aC5cbiAqIEBzZWUgUi5zeW1tZXRyaWNEaWZmZXJlbmNlLCBSLmRpZmZlcmVuY2UsIFIuZGlmZmVyZW5jZVdpdGhcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgZXFBID0gUi5lcUJ5KFIucHJvcCgnYScpKTtcbiAqICAgICAgdmFyIGwxID0gW3thOiAxfSwge2E6IDJ9LCB7YTogM30sIHthOiA0fV07XG4gKiAgICAgIHZhciBsMiA9IFt7YTogM30sIHthOiA0fSwge2E6IDV9LCB7YTogNn1dO1xuICogICAgICBSLnN5bW1ldHJpY0RpZmZlcmVuY2VXaXRoKGVxQSwgbDEsIGwyKTsgLy89PiBbe2E6IDF9LCB7YTogMn0sIHthOiA1fSwge2E6IDZ9XVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTMoZnVuY3Rpb24gc3ltbWV0cmljRGlmZmVyZW5jZVdpdGgocHJlZCwgbGlzdDEsIGxpc3QyKSB7XG4gIHJldHVybiBjb25jYXQoZGlmZmVyZW5jZVdpdGgocHJlZCwgbGlzdDEsIGxpc3QyKSwgZGlmZmVyZW5jZVdpdGgocHJlZCwgbGlzdDIsIGxpc3QxKSk7XG59KTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgZHJvcCA9IHJlcXVpcmUoJy4vZHJvcCcpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIGxhc3QgYG5gIGVsZW1lbnRzIG9mIHRoZSBnaXZlbiBsaXN0LlxuICogSWYgYG4gPiBsaXN0Lmxlbmd0aGAsIHJldHVybnMgYSBsaXN0IG9mIGBsaXN0Lmxlbmd0aGAgZWxlbWVudHMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTYuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgTnVtYmVyIC0+IFthXSAtPiBbYV1cbiAqIEBzaWcgTnVtYmVyIC0+IFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmV0dXJuLlxuICogQHBhcmFtIHtBcnJheX0geHMgVGhlIGNvbGxlY3Rpb24gdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBzZWUgUi5kcm9wTGFzdFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudGFrZUxhc3QoMSwgWydmb28nLCAnYmFyJywgJ2JheiddKTsgLy89PiBbJ2JheiddXG4gKiAgICAgIFIudGFrZUxhc3QoMiwgWydmb28nLCAnYmFyJywgJ2JheiddKTsgLy89PiBbJ2JhcicsICdiYXonXVxuICogICAgICBSLnRha2VMYXN0KDMsIFsnZm9vJywgJ2JhcicsICdiYXonXSk7IC8vPT4gWydmb28nLCAnYmFyJywgJ2JheiddXG4gKiAgICAgIFIudGFrZUxhc3QoNCwgWydmb28nLCAnYmFyJywgJ2JheiddKTsgLy89PiBbJ2ZvbycsICdiYXInLCAnYmF6J11cbiAqICAgICAgUi50YWtlTGFzdCgzLCAncmFtZGEnKTsgICAgICAgICAgICAgICAvLz0+ICdtZGEnXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiB0YWtlTGFzdChuLCB4cykge1xuICByZXR1cm4gZHJvcChuID49IDAgPyB4cy5sZW5ndGggLSBuIDogMCwgeHMpO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIGxhc3QgYG5gIGVsZW1lbnRzIG9mIGEgZ2l2ZW4gbGlzdCwgcGFzc2luZ1xuICogZWFjaCB2YWx1ZSB0byB0aGUgc3VwcGxpZWQgcHJlZGljYXRlIGZ1bmN0aW9uLCBhbmQgdGVybWluYXRpbmcgd2hlbiB0aGVcbiAqIHByZWRpY2F0ZSBmdW5jdGlvbiByZXR1cm5zIGBmYWxzZWAuIEV4Y2x1ZGVzIHRoZSBlbGVtZW50IHRoYXQgY2F1c2VkIHRoZVxuICogcHJlZGljYXRlIGZ1bmN0aW9uIHRvIGZhaWwuIFRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gaXMgcGFzc2VkIG9uZSBhcmd1bWVudDpcbiAqICoodmFsdWUpKi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xNi4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyAoYSAtPiBCb29sZWFuKSAtPiBbYV0gLT4gW2FdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gY2FsbGVkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0IFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEByZXR1cm4ge0FycmF5fSBBIG5ldyBhcnJheS5cbiAqIEBzZWUgUi5kcm9wTGFzdFdoaWxlLCBSLmFkZEluZGV4XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGlzTm90T25lID0geCA9PiB4ICE9PSAxO1xuICpcbiAqICAgICAgUi50YWtlTGFzdFdoaWxlKGlzTm90T25lLCBbMSwgMiwgMywgNF0pOyAvLz0+IFsyLCAzLCA0XVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gdGFrZUxhc3RXaGlsZShmbiwgbGlzdCkge1xuICB2YXIgaWR4ID0gbGlzdC5sZW5ndGggLSAxO1xuICB3aGlsZSAoaWR4ID49IDAgJiYgZm4obGlzdFtpZHhdKSkge1xuICAgIGlkeCAtPSAxO1xuICB9XG4gIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChsaXN0LCBpZHggKyAxKTtcbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL19jdXJyeTInKTtcbnZhciBfcmVkdWNlZCA9IHJlcXVpcmUoJy4vX3JlZHVjZWQnKTtcbnZhciBfeGZCYXNlID0gcmVxdWlyZSgnLi9feGZCYXNlJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIFhUYWtlV2hpbGUoZiwgeGYpIHtcbiAgICB0aGlzLnhmID0geGY7XG4gICAgdGhpcy5mID0gZjtcbiAgfVxuICBYVGFrZVdoaWxlLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL2luaXQnXSA9IF94ZkJhc2UuaW5pdDtcbiAgWFRha2VXaGlsZS5wcm90b3R5cGVbJ0BAdHJhbnNkdWNlci9yZXN1bHQnXSA9IF94ZkJhc2UucmVzdWx0O1xuICBYVGFrZVdoaWxlLnByb3RvdHlwZVsnQEB0cmFuc2R1Y2VyL3N0ZXAnXSA9IGZ1bmN0aW9uKHJlc3VsdCwgaW5wdXQpIHtcbiAgICByZXR1cm4gdGhpcy5mKGlucHV0KSA/IHRoaXMueGZbJ0BAdHJhbnNkdWNlci9zdGVwJ10ocmVzdWx0LCBpbnB1dCkgOiBfcmVkdWNlZChyZXN1bHQpO1xuICB9O1xuXG4gIHJldHVybiBfY3VycnkyKGZ1bmN0aW9uIF94dGFrZVdoaWxlKGYsIHhmKSB7IHJldHVybiBuZXcgWFRha2VXaGlsZShmLCB4Zik7IH0pO1xufSgpKTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG52YXIgX2Rpc3BhdGNoYWJsZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2Rpc3BhdGNoYWJsZScpO1xudmFyIF94dGFrZVdoaWxlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9feHRha2VXaGlsZScpO1xuXG5cbi8qKlxuICogUmV0dXJucyBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgdGhlIGZpcnN0IGBuYCBlbGVtZW50cyBvZiBhIGdpdmVuIGxpc3QsXG4gKiBwYXNzaW5nIGVhY2ggdmFsdWUgdG8gdGhlIHN1cHBsaWVkIHByZWRpY2F0ZSBmdW5jdGlvbiwgYW5kIHRlcm1pbmF0aW5nIHdoZW5cbiAqIHRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gcmV0dXJucyBgZmFsc2VgLiBFeGNsdWRlcyB0aGUgZWxlbWVudCB0aGF0IGNhdXNlZCB0aGVcbiAqIHByZWRpY2F0ZSBmdW5jdGlvbiB0byBmYWlsLiBUaGUgcHJlZGljYXRlIGZ1bmN0aW9uIGlzIHBhc3NlZCBvbmUgYXJndW1lbnQ6XG4gKiAqKHZhbHVlKSouXG4gKlxuICogRGlzcGF0Y2hlcyB0byB0aGUgYHRha2VXaGlsZWAgbWV0aG9kIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQWN0cyBhcyBhIHRyYW5zZHVjZXIgaWYgYSB0cmFuc2Zvcm1lciBpcyBnaXZlbiBpbiBsaXN0IHBvc2l0aW9uLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBuZXcgYXJyYXkuXG4gKiBAc2VlIFIuZHJvcFdoaWxlLCBSLnRyYW5zZHVjZSwgUi5hZGRJbmRleFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBpc05vdEZvdXIgPSB4ID0+IHggIT09IDQ7XG4gKlxuICogICAgICBSLnRha2VXaGlsZShpc05vdEZvdXIsIFsxLCAyLCAzLCA0LCAzLCAyLCAxXSk7IC8vPT4gWzEsIDIsIDNdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihfZGlzcGF0Y2hhYmxlKFsndGFrZVdoaWxlJ10sIF94dGFrZVdoaWxlLCBmdW5jdGlvbiB0YWtlV2hpbGUoZm4sIGxpc3QpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBsZW4gPSBsaXN0Lmxlbmd0aDtcbiAgd2hpbGUgKGlkeCA8IGxlbiAmJiBmbihsaXN0W2lkeF0pKSB7XG4gICAgaWR4ICs9IDE7XG4gIH1cbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGxpc3QsIDAsIGlkeCk7XG59KSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogUnVucyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCB0aGUgc3VwcGxpZWQgb2JqZWN0LCB0aGVuIHJldHVybnMgdGhlIG9iamVjdC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoYSAtPiAqKSAtPiBhIC0+IGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdpdGggYHhgLiBUaGUgcmV0dXJuIHZhbHVlIG9mIGBmbmAgd2lsbCBiZSB0aHJvd24gYXdheS5cbiAqIEBwYXJhbSB7Kn0geFxuICogQHJldHVybiB7Kn0gYHhgLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBzYXlYID0geCA9PiBjb25zb2xlLmxvZygneCBpcyAnICsgeCk7XG4gKiAgICAgIFIudGFwKHNheVgsIDEwMCk7IC8vPT4gMTAwXG4gKiAgICAgIC8vIGxvZ3MgJ3ggaXMgMTAwJ1xuICogQHN5bWIgUi50YXAoZiwgYSkgPSBhXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiB0YXAoZm4sIHgpIHtcbiAgZm4oeCk7XG4gIHJldHVybiB4O1xufSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIF9pc1JlZ0V4cCh4KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufTtcbiIsInZhciBfY2xvbmVSZWdFeHAgPSByZXF1aXJlKCcuL2ludGVybmFsL19jbG9uZVJlZ0V4cCcpO1xudmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcbnZhciBfaXNSZWdFeHAgPSByZXF1aXJlKCcuL2ludGVybmFsL19pc1JlZ0V4cCcpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi90b1N0cmluZycpO1xuXG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgZ2l2ZW4gc3RyaW5nIG1hdGNoZXMgYSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTIuMFxuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHNpZyBSZWdFeHAgLT4gU3RyaW5nIC0+IEJvb2xlYW5cbiAqIEBwYXJhbSB7UmVnRXhwfSBwYXR0ZXJuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHNlZSBSLm1hdGNoXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi50ZXN0KC9eeC8sICd4eXonKTsgLy89PiB0cnVlXG4gKiAgICAgIFIudGVzdCgvXnkvLCAneHl6Jyk7IC8vPT4gZmFsc2VcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIHRlc3QocGF0dGVybiwgc3RyKSB7XG4gIGlmICghX2lzUmVnRXhwKHBhdHRlcm4pKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcign4oCYdGVzdOKAmSByZXF1aXJlcyBhIHZhbHVlIG9mIHR5cGUgUmVnRXhwIGFzIGl0cyBmaXJzdCBhcmd1bWVudDsgcmVjZWl2ZWQgJyArIHRvU3RyaW5nKHBhdHRlcm4pKTtcbiAgfVxuICByZXR1cm4gX2Nsb25lUmVnRXhwKHBhdHRlcm4pLnRlc3Qoc3RyKTtcbn0pO1xuIiwidmFyIGludm9rZXIgPSByZXF1aXJlKCcuL2ludm9rZXInKTtcblxuXG4vKipcbiAqIFRoZSBsb3dlciBjYXNlIHZlcnNpb24gb2YgYSBzdHJpbmcuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuOS4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAc2lnIFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byBsb3dlciBjYXNlLlxuICogQHJldHVybiB7U3RyaW5nfSBUaGUgbG93ZXIgY2FzZSB2ZXJzaW9uIG9mIGBzdHJgLlxuICogQHNlZSBSLnRvVXBwZXJcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnRvTG93ZXIoJ1hZWicpOyAvLz0+ICd4eXonXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gaW52b2tlcigwLCAndG9Mb3dlckNhc2UnKTtcbiIsInZhciBfY3VycnkxID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkxJyk7XG52YXIgX2hhcyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2hhcycpO1xuXG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IGludG8gYW4gYXJyYXkgb2Yga2V5LCB2YWx1ZSBhcnJheXMuIE9ubHkgdGhlIG9iamVjdCdzXG4gKiBvd24gcHJvcGVydGllcyBhcmUgdXNlZC5cbiAqIE5vdGUgdGhhdCB0aGUgb3JkZXIgb2YgdGhlIG91dHB1dCBhcnJheSBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBjb25zaXN0ZW50XG4gKiBhY3Jvc3MgZGlmZmVyZW50IEpTIHBsYXRmb3Jtcy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC40LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcge1N0cmluZzogKn0gLT4gW1tTdHJpbmcsKl1dXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gZXh0cmFjdCBmcm9tXG4gKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2Yga2V5LCB2YWx1ZSBhcnJheXMgZnJvbSB0aGUgb2JqZWN0J3Mgb3duIHByb3BlcnRpZXMuXG4gKiBAc2VlIFIuZnJvbVBhaXJzXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi50b1BhaXJzKHthOiAxLCBiOiAyLCBjOiAzfSk7IC8vPT4gW1snYScsIDFdLCBbJ2InLCAyXSwgWydjJywgM11dXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MShmdW5jdGlvbiB0b1BhaXJzKG9iaikge1xuICB2YXIgcGFpcnMgPSBbXTtcbiAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHtcbiAgICBpZiAoX2hhcyhwcm9wLCBvYmopKSB7XG4gICAgICBwYWlyc1twYWlycy5sZW5ndGhdID0gW3Byb3AsIG9ialtwcm9wXV07XG4gICAgfVxuICB9XG4gIHJldHVybiBwYWlycztcbn0pO1xuIiwidmFyIF9jdXJyeTEgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTEnKTtcblxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBpbnRvIGFuIGFycmF5IG9mIGtleSwgdmFsdWUgYXJyYXlzLiBUaGUgb2JqZWN0J3Mgb3duXG4gKiBwcm9wZXJ0aWVzIGFuZCBwcm90b3R5cGUgcHJvcGVydGllcyBhcmUgdXNlZC4gTm90ZSB0aGF0IHRoZSBvcmRlciBvZiB0aGVcbiAqIG91dHB1dCBhcnJheSBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBjb25zaXN0ZW50IGFjcm9zcyBkaWZmZXJlbnQgSlNcbiAqIHBsYXRmb3Jtcy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC40LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBzaWcge1N0cmluZzogKn0gLT4gW1tTdHJpbmcsKl1dXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gZXh0cmFjdCBmcm9tXG4gKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2Yga2V5LCB2YWx1ZSBhcnJheXMgZnJvbSB0aGUgb2JqZWN0J3Mgb3duXG4gKiAgICAgICAgIGFuZCBwcm90b3R5cGUgcHJvcGVydGllcy5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgRiA9IGZ1bmN0aW9uKCkgeyB0aGlzLnggPSAnWCc7IH07XG4gKiAgICAgIEYucHJvdG90eXBlLnkgPSAnWSc7XG4gKiAgICAgIHZhciBmID0gbmV3IEYoKTtcbiAqICAgICAgUi50b1BhaXJzSW4oZik7IC8vPT4gW1sneCcsJ1gnXSwgWyd5JywnWSddXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoZnVuY3Rpb24gdG9QYWlyc0luKG9iaikge1xuICB2YXIgcGFpcnMgPSBbXTtcbiAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHtcbiAgICBwYWlyc1twYWlycy5sZW5ndGhdID0gW3Byb3AsIG9ialtwcm9wXV07XG4gIH1cbiAgcmV0dXJuIHBhaXJzO1xufSk7XG4iLCJ2YXIgaW52b2tlciA9IHJlcXVpcmUoJy4vaW52b2tlcicpO1xuXG5cbi8qKlxuICogVGhlIHVwcGVyIGNhc2UgdmVyc2lvbiBvZiBhIHN0cmluZy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC45LjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBzaWcgU3RyaW5nIC0+IFN0cmluZ1xuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgc3RyaW5nIHRvIHVwcGVyIGNhc2UuXG4gKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSB1cHBlciBjYXNlIHZlcnNpb24gb2YgYHN0cmAuXG4gKiBAc2VlIFIudG9Mb3dlclxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudG9VcHBlcignYWJjJyk7IC8vPT4gJ0FCQydcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBpbnZva2VyKDAsICd0b1VwcGVyQ2FzZScpO1xuIiwidmFyIF9yZWR1Y2UgPSByZXF1aXJlKCcuL2ludGVybmFsL19yZWR1Y2UnKTtcbnZhciBfeHdyYXAgPSByZXF1aXJlKCcuL2ludGVybmFsL194d3JhcCcpO1xudmFyIGN1cnJ5TiA9IHJlcXVpcmUoJy4vY3VycnlOJyk7XG5cblxuLyoqXG4gKiBJbml0aWFsaXplcyBhIHRyYW5zZHVjZXIgdXNpbmcgc3VwcGxpZWQgaXRlcmF0b3IgZnVuY3Rpb24uIFJldHVybnMgYSBzaW5nbGVcbiAqIGl0ZW0gYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGxpc3QsIHN1Y2Nlc3NpdmVseSBjYWxsaW5nIHRoZSB0cmFuc2Zvcm1lZFxuICogaXRlcmF0b3IgZnVuY3Rpb24gYW5kIHBhc3NpbmcgaXQgYW4gYWNjdW11bGF0b3IgdmFsdWUgYW5kIHRoZSBjdXJyZW50IHZhbHVlXG4gKiBmcm9tIHRoZSBhcnJheSwgYW5kIHRoZW4gcGFzc2luZyB0aGUgcmVzdWx0IHRvIHRoZSBuZXh0IGNhbGwuXG4gKlxuICogVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIHJlY2VpdmVzIHR3byB2YWx1ZXM6ICooYWNjLCB2YWx1ZSkqLiBJdCB3aWxsIGJlXG4gKiB3cmFwcGVkIGFzIGEgdHJhbnNmb3JtZXIgdG8gaW5pdGlhbGl6ZSB0aGUgdHJhbnNkdWNlci4gQSB0cmFuc2Zvcm1lciBjYW4gYmVcbiAqIHBhc3NlZCBkaXJlY3RseSBpbiBwbGFjZSBvZiBhbiBpdGVyYXRvciBmdW5jdGlvbi4gSW4gYm90aCBjYXNlcywgaXRlcmF0aW9uXG4gKiBtYXkgYmUgc3RvcHBlZCBlYXJseSB3aXRoIHRoZSBgUi5yZWR1Y2VkYCBmdW5jdGlvbi5cbiAqXG4gKiBBIHRyYW5zZHVjZXIgaXMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSB0cmFuc2Zvcm1lciBhbmQgcmV0dXJucyBhXG4gKiB0cmFuc2Zvcm1lciBhbmQgY2FuIGJlIGNvbXBvc2VkIGRpcmVjdGx5LlxuICpcbiAqIEEgdHJhbnNmb3JtZXIgaXMgYW4gYW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgYSAyLWFyaXR5IHJlZHVjaW5nIGl0ZXJhdG9yXG4gKiBmdW5jdGlvbiwgc3RlcCwgMC1hcml0eSBpbml0aWFsIHZhbHVlIGZ1bmN0aW9uLCBpbml0LCBhbmQgMS1hcml0eSByZXN1bHRcbiAqIGV4dHJhY3Rpb24gZnVuY3Rpb24sIHJlc3VsdC4gVGhlIHN0ZXAgZnVuY3Rpb24gaXMgdXNlZCBhcyB0aGUgaXRlcmF0b3JcbiAqIGZ1bmN0aW9uIGluIHJlZHVjZS4gVGhlIHJlc3VsdCBmdW5jdGlvbiBpcyB1c2VkIHRvIGNvbnZlcnQgdGhlIGZpbmFsXG4gKiBhY2N1bXVsYXRvciBpbnRvIHRoZSByZXR1cm4gdHlwZSBhbmQgaW4gbW9zdCBjYXNlcyBpcyBSLmlkZW50aXR5LiBUaGUgaW5pdFxuICogZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhbiBpbml0aWFsIGFjY3VtdWxhdG9yLCBidXQgaXMgaWdub3JlZCBieVxuICogdHJhbnNkdWNlLlxuICpcbiAqIFRoZSBpdGVyYXRpb24gaXMgcGVyZm9ybWVkIHdpdGggUi5yZWR1Y2UgYWZ0ZXIgaW5pdGlhbGl6aW5nIHRoZSB0cmFuc2R1Y2VyLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEyLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChjIC0+IGMpIC0+IChhLGIgLT4gYSkgLT4gYSAtPiBbYl0gLT4gYVxuICogQHBhcmFtIHtGdW5jdGlvbn0geGYgVGhlIHRyYW5zZHVjZXIgZnVuY3Rpb24uIFJlY2VpdmVzIGEgdHJhbnNmb3JtZXIgYW5kIHJldHVybnMgYSB0cmFuc2Zvcm1lci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBpdGVyYXRvciBmdW5jdGlvbi4gUmVjZWl2ZXMgdHdvIHZhbHVlcywgdGhlIGFjY3VtdWxhdG9yIGFuZCB0aGVcbiAqICAgICAgICBjdXJyZW50IGVsZW1lbnQgZnJvbSB0aGUgYXJyYXkuIFdyYXBwZWQgYXMgdHJhbnNmb3JtZXIsIGlmIG5lY2Vzc2FyeSwgYW5kIHVzZWQgdG9cbiAqICAgICAgICBpbml0aWFsaXplIHRoZSB0cmFuc2R1Y2VyXG4gKiBAcGFyYW0geyp9IGFjYyBUaGUgaW5pdGlhbCBhY2N1bXVsYXRvciB2YWx1ZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QgVGhlIGxpc3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHJldHVybiB7Kn0gVGhlIGZpbmFsLCBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqIEBzZWUgUi5yZWR1Y2UsIFIucmVkdWNlZCwgUi5pbnRvXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIG51bWJlcnMgPSBbMSwgMiwgMywgNF07XG4gKiAgICAgIHZhciB0cmFuc2R1Y2VyID0gUi5jb21wb3NlKFIubWFwKFIuYWRkKDEpKSwgUi50YWtlKDIpKTtcbiAqXG4gKiAgICAgIFIudHJhbnNkdWNlKHRyYW5zZHVjZXIsIFIuZmxpcChSLmFwcGVuZCksIFtdLCBudW1iZXJzKTsgLy89PiBbMiwgM11cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBjdXJyeU4oNCwgZnVuY3Rpb24gdHJhbnNkdWNlKHhmLCBmbiwgYWNjLCBsaXN0KSB7XG4gIHJldHVybiBfcmVkdWNlKHhmKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyA/IF94d3JhcChmbikgOiBmbiksIGFjYywgbGlzdCk7XG59KTtcbiIsInZhciBfY3VycnkxID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkxJyk7XG5cblxuLyoqXG4gKiBUcmFuc3Bvc2VzIHRoZSByb3dzIGFuZCBjb2x1bW5zIG9mIGEgMkQgbGlzdC5cbiAqIFdoZW4gcGFzc2VkIGEgbGlzdCBvZiBgbmAgbGlzdHMgb2YgbGVuZ3RoIGB4YCxcbiAqIHJldHVybnMgYSBsaXN0IG9mIGB4YCBsaXN0cyBvZiBsZW5ndGggYG5gLlxuICpcbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbW2FdXSAtPiBbW2FdXVxuICogQHBhcmFtIHtBcnJheX0gbGlzdCBBIDJEIGxpc3RcbiAqIEByZXR1cm4ge0FycmF5fSBBIDJEIGxpc3RcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnRyYW5zcG9zZShbWzEsICdhJ10sIFsyLCAnYiddLCBbMywgJ2MnXV0pIC8vPT4gW1sxLCAyLCAzXSwgWydhJywgJ2InLCAnYyddXVxuICogICAgICBSLnRyYW5zcG9zZShbWzEsIDIsIDNdLCBbJ2EnLCAnYicsICdjJ11dKSAvLz0+IFtbMSwgJ2EnXSwgWzIsICdiJ10sIFszLCAnYyddXVxuICpcbiAqIElmIHNvbWUgb2YgdGhlIHJvd3MgYXJlIHNob3J0ZXIgdGhhbiB0aGUgZm9sbG93aW5nIHJvd3MsIHRoZWlyIGVsZW1lbnRzIGFyZSBza2lwcGVkOlxuICpcbiAqICAgICAgUi50cmFuc3Bvc2UoW1sxMCwgMTFdLCBbMjBdLCBbXSwgWzMwLCAzMSwgMzJdXSkgLy89PiBbWzEwLCAyMCwgMzBdLCBbMTEsIDMxXSwgWzMyXV1cbiAqIEBzeW1iIFIudHJhbnNwb3NlKFtbYV0sIFtiXSwgW2NdXSkgPSBbYSwgYiwgY11cbiAqIEBzeW1iIFIudHJhbnNwb3NlKFtbYSwgYl0sIFtjLCBkXV0pID0gW1thLCBjXSwgW2IsIGRdXVxuICogQHN5bWIgUi50cmFuc3Bvc2UoW1thLCBiXSwgW2NdXSkgPSBbW2EsIGNdLCBbYl1dXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MShmdW5jdGlvbiB0cmFuc3Bvc2Uob3V0ZXJsaXN0KSB7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB3aGlsZSAoaSA8IG91dGVybGlzdC5sZW5ndGgpIHtcbiAgICB2YXIgaW5uZXJsaXN0ID0gb3V0ZXJsaXN0W2ldO1xuICAgIHZhciBqID0gMDtcbiAgICB3aGlsZSAoaiA8IGlubmVybGlzdC5sZW5ndGgpIHtcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0W2pdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXN1bHRbal0gPSBbXTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdFtqXS5wdXNoKGlubmVybGlzdFtqXSk7XG4gICAgICBqICs9IDE7XG4gICAgfVxuICAgIGkgKz0gMTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG4iLCJ2YXIgX2N1cnJ5MyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MycpO1xudmFyIG1hcCA9IHJlcXVpcmUoJy4vbWFwJyk7XG52YXIgc2VxdWVuY2UgPSByZXF1aXJlKCcuL3NlcXVlbmNlJyk7XG5cblxuLyoqXG4gKiBNYXBzIGFuIFtBcHBsaWNhdGl2ZV0oaHR0cHM6Ly9naXRodWIuY29tL2ZhbnRhc3lsYW5kL2ZhbnRhc3ktbGFuZCNhcHBsaWNhdGl2ZSktcmV0dXJuaW5nXG4gKiBmdW5jdGlvbiBvdmVyIGEgW1RyYXZlcnNhYmxlXShodHRwczovL2dpdGh1Yi5jb20vZmFudGFzeWxhbmQvZmFudGFzeS1sYW5kI3RyYXZlcnNhYmxlKSxcbiAqIHRoZW4gdXNlcyBbYHNlcXVlbmNlYF0oI3NlcXVlbmNlKSB0byB0cmFuc2Zvcm0gdGhlIHJlc3VsdGluZyBUcmF2ZXJzYWJsZSBvZiBBcHBsaWNhdGl2ZVxuICogaW50byBhbiBBcHBsaWNhdGl2ZSBvZiBUcmF2ZXJzYWJsZS5cbiAqXG4gKiBEaXNwYXRjaGVzIHRvIHRoZSBgc2VxdWVuY2VgIG1ldGhvZCBvZiB0aGUgdGhpcmQgYXJndW1lbnQsIGlmIHByZXNlbnQuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTkuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKEFwcGxpY2F0aXZlIGYsIFRyYXZlcnNhYmxlIHQpID0+IChhIC0+IGYgYSkgLT4gKGEgLT4gZiBiKSAtPiB0IGEgLT4gZiAodCBiKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gb2ZcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZcbiAqIEBwYXJhbSB7Kn0gdHJhdmVyc2FibGVcbiAqIEByZXR1cm4geyp9XG4gKiBAc2VlIFIuc2VxdWVuY2VcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICAvLyBSZXR1cm5zIGBOb3RoaW5nYCBpZiB0aGUgZ2l2ZW4gZGl2aXNvciBpcyBgMGBcbiAqICAgICAgc2FmZURpdiA9IG4gPT4gZCA9PiBkID09PSAwID8gTm90aGluZygpIDogSnVzdChuIC8gZClcbiAqXG4gKiAgICAgIFIudHJhdmVyc2UoTWF5YmUub2YsIHNhZmVEaXYoMTApLCBbMiwgNCwgNV0pOyAvLz0+IEp1c3QoWzUsIDIuNSwgMl0pXG4gKiAgICAgIFIudHJhdmVyc2UoTWF5YmUub2YsIHNhZmVEaXYoMTApLCBbMiwgMCwgNV0pOyAvLz0+IE5vdGhpbmdcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkzKGZ1bmN0aW9uIHRyYXZlcnNlKG9mLCBmLCB0cmF2ZXJzYWJsZSkge1xuICByZXR1cm4gc2VxdWVuY2Uob2YsIG1hcChmLCB0cmF2ZXJzYWJsZSkpO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MScpO1xuXG5cbi8qKlxuICogUmVtb3ZlcyAoc3RyaXBzKSB3aGl0ZXNwYWNlIGZyb20gYm90aCBlbmRzIG9mIHRoZSBzdHJpbmcuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuNi4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAc2lnIFN0cmluZyAtPiBTdHJpbmdcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byB0cmltLlxuICogQHJldHVybiB7U3RyaW5nfSBUcmltbWVkIHZlcnNpb24gb2YgYHN0cmAuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgUi50cmltKCcgICB4eXogICcpOyAvLz0+ICd4eXonXG4gKiAgICAgIFIubWFwKFIudHJpbSwgUi5zcGxpdCgnLCcsICd4LCB5LCB6JykpOyAvLz0+IFsneCcsICd5JywgJ3onXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbiAgdmFyIHdzID0gJ1xceDA5XFx4MEFcXHgwQlxceDBDXFx4MERcXHgyMFxceEEwXFx1MTY4MFxcdTE4MEVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzJyArXG4gICAgICAgICAgICdcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBBXFx1MjAyRlxcdTIwNUZcXHUzMDAwXFx1MjAyOCcgK1xuICAgICAgICAgICAnXFx1MjAyOVxcdUZFRkYnO1xuICB2YXIgemVyb1dpZHRoID0gJ1xcdTIwMGInO1xuICB2YXIgaGFzUHJvdG9UcmltID0gKHR5cGVvZiBTdHJpbmcucHJvdG90eXBlLnRyaW0gPT09ICdmdW5jdGlvbicpO1xuICBpZiAoIWhhc1Byb3RvVHJpbSB8fCAod3MudHJpbSgpIHx8ICF6ZXJvV2lkdGgudHJpbSgpKSkge1xuICAgIHJldHVybiBfY3VycnkxKGZ1bmN0aW9uIHRyaW0oc3RyKSB7XG4gICAgICB2YXIgYmVnaW5SeCA9IG5ldyBSZWdFeHAoJ15bJyArIHdzICsgJ11bJyArIHdzICsgJ10qJyk7XG4gICAgICB2YXIgZW5kUnggPSBuZXcgUmVnRXhwKCdbJyArIHdzICsgJ11bJyArIHdzICsgJ10qJCcpO1xuICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKGJlZ2luUngsICcnKS5yZXBsYWNlKGVuZFJ4LCAnJyk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIF9jdXJyeTEoZnVuY3Rpb24gdHJpbShzdHIpIHtcbiAgICAgIHJldHVybiBzdHIudHJpbSgpO1xuICAgIH0pO1xuICB9XG59KCkpO1xuIiwidmFyIF9hcml0eSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2FyaXR5Jyk7XG52YXIgX2NvbmNhdCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2NvbmNhdCcpO1xudmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcblxuXG4vKipcbiAqIGB0cnlDYXRjaGAgdGFrZXMgdHdvIGZ1bmN0aW9ucywgYSBgdHJ5ZXJgIGFuZCBhIGBjYXRjaGVyYC4gVGhlIHJldHVybmVkXG4gKiBmdW5jdGlvbiBldmFsdWF0ZXMgdGhlIGB0cnllcmA7IGlmIGl0IGRvZXMgbm90IHRocm93LCBpdCBzaW1wbHkgcmV0dXJucyB0aGVcbiAqIHJlc3VsdC4gSWYgdGhlIGB0cnllcmAgKmRvZXMqIHRocm93LCB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gZXZhbHVhdGVzIHRoZVxuICogYGNhdGNoZXJgIGZ1bmN0aW9uIGFuZCByZXR1cm5zIGl0cyByZXN1bHQuIE5vdGUgdGhhdCBmb3IgZWZmZWN0aXZlXG4gKiBjb21wb3NpdGlvbiB3aXRoIHRoaXMgZnVuY3Rpb24sIGJvdGggdGhlIGB0cnllcmAgYW5kIGBjYXRjaGVyYCBmdW5jdGlvbnNcbiAqIG11c3QgcmV0dXJuIHRoZSBzYW1lIHR5cGUgb2YgcmVzdWx0cy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yMC4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBzaWcgKC4uLnggLT4gYSkgLT4gKChlLCAuLi54KSAtPiBhKSAtPiAoLi4ueCAtPiBhKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJ5ZXIgVGhlIGZ1bmN0aW9uIHRoYXQgbWF5IHRocm93LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2F0Y2hlciBUaGUgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV2YWx1YXRlZCBpZiBgdHJ5ZXJgIHRocm93cy5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIG5ldyBmdW5jdGlvbiB0aGF0IHdpbGwgY2F0Y2ggZXhjZXB0aW9ucyBhbmQgc2VuZCB0aGVuIHRvIHRoZSBjYXRjaGVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIudHJ5Q2F0Y2goUi5wcm9wKCd4JyksIFIuRikoe3g6IHRydWV9KTsgLy89PiB0cnVlXG4gKiAgICAgIFIudHJ5Q2F0Y2goUi5wcm9wKCd4JyksIFIuRikobnVsbCk7ICAgICAgLy89PiBmYWxzZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gX3RyeUNhdGNoKHRyeWVyLCBjYXRjaGVyKSB7XG4gIHJldHVybiBfYXJpdHkodHJ5ZXIubGVuZ3RoLCBmdW5jdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRyeWVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGNhdGNoZXIuYXBwbHkodGhpcywgX2NvbmNhdChbZV0sIGFyZ3VtZW50cykpO1xuICAgIH1cbiAgfSk7XG59KTtcbiIsInZhciBfY3VycnkxID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkxJyk7XG5cblxuLyoqXG4gKiBUYWtlcyBhIGZ1bmN0aW9uIGBmbmAsIHdoaWNoIHRha2VzIGEgc2luZ2xlIGFycmF5IGFyZ3VtZW50LCBhbmQgcmV0dXJucyBhXG4gKiBmdW5jdGlvbiB3aGljaDpcbiAqXG4gKiAgIC0gdGFrZXMgYW55IG51bWJlciBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50cztcbiAqICAgLSBwYXNzZXMgdGhlc2UgYXJndW1lbnRzIHRvIGBmbmAgYXMgYW4gYXJyYXk7IGFuZFxuICogICAtIHJldHVybnMgdGhlIHJlc3VsdC5cbiAqXG4gKiBJbiBvdGhlciB3b3JkcywgUi51bmFwcGx5IGRlcml2ZXMgYSB2YXJpYWRpYyBmdW5jdGlvbiBmcm9tIGEgZnVuY3Rpb24gd2hpY2hcbiAqIHRha2VzIGFuIGFycmF5LiBSLnVuYXBwbHkgaXMgdGhlIGludmVyc2Ugb2YgUi5hcHBseS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC44LjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoWyouLi5dIC0+IGEpIC0+ICgqLi4uIC0+IGEpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAc2VlIFIuYXBwbHlcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnVuYXBwbHkoSlNPTi5zdHJpbmdpZnkpKDEsIDIsIDMpOyAvLz0+ICdbMSwyLDNdJ1xuICogQHN5bWIgUi51bmFwcGx5KGYpKGEsIGIpID0gZihbYSwgYl0pXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MShmdW5jdGlvbiB1bmFwcGx5KGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZm4oQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKSk7XG4gIH07XG59KTtcbiIsInZhciBfY3VycnkxID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkxJyk7XG52YXIgbkFyeSA9IHJlcXVpcmUoJy4vbkFyeScpO1xuXG5cbi8qKlxuICogV3JhcHMgYSBmdW5jdGlvbiBvZiBhbnkgYXJpdHkgKGluY2x1ZGluZyBudWxsYXJ5KSBpbiBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0c1xuICogZXhhY3RseSAxIHBhcmFtZXRlci4gQW55IGV4dHJhbmVvdXMgcGFyYW1ldGVycyB3aWxsIG5vdCBiZSBwYXNzZWQgdG8gdGhlXG4gKiBzdXBwbGllZCBmdW5jdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHNpZyAoKiAtPiBiKSAtPiAoYSAtPiBiKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcgZnVuY3Rpb24gd3JhcHBpbmcgYGZuYC4gVGhlIG5ldyBmdW5jdGlvbiBpcyBndWFyYW50ZWVkIHRvIGJlIG9mXG4gKiAgICAgICAgIGFyaXR5IDEuXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIHRha2VzVHdvQXJncyA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAqICAgICAgICByZXR1cm4gW2EsIGJdO1xuICogICAgICB9O1xuICogICAgICB0YWtlc1R3b0FyZ3MubGVuZ3RoOyAvLz0+IDJcbiAqICAgICAgdGFrZXNUd29BcmdzKDEsIDIpOyAvLz0+IFsxLCAyXVxuICpcbiAqICAgICAgdmFyIHRha2VzT25lQXJnID0gUi51bmFyeSh0YWtlc1R3b0FyZ3MpO1xuICogICAgICB0YWtlc09uZUFyZy5sZW5ndGg7IC8vPT4gMVxuICogICAgICAvLyBPbmx5IDEgYXJndW1lbnQgaXMgcGFzc2VkIHRvIHRoZSB3cmFwcGVkIGZ1bmN0aW9uXG4gKiAgICAgIHRha2VzT25lQXJnKDEsIDIpOyAvLz0+IFsxLCB1bmRlZmluZWRdXG4gKiBAc3ltYiBSLnVuYXJ5KGYpKGEsIGIsIGMpID0gZihhKVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTEoZnVuY3Rpb24gdW5hcnkoZm4pIHtcbiAgcmV0dXJuIG5BcnkoMSwgZm4pO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIGN1cnJ5TiA9IHJlcXVpcmUoJy4vY3VycnlOJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gb2YgYXJpdHkgYG5gIGZyb20gYSAobWFudWFsbHkpIGN1cnJpZWQgZnVuY3Rpb24uXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTQuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnIE51bWJlciAtPiAoYSAtPiBiKSAtPiAoYSAtPiBjKVxuICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgYXJpdHkgZm9yIHRoZSByZXR1cm5lZCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byB1bmN1cnJ5LlxuICogQHJldHVybiB7RnVuY3Rpb259IEEgbmV3IGZ1bmN0aW9uLlxuICogQHNlZSBSLmN1cnJ5XG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgdmFyIGFkZEZvdXIgPSBhID0+IGIgPT4gYyA9PiBkID0+IGEgKyBiICsgYyArIGQ7XG4gKlxuICogICAgICB2YXIgdW5jdXJyaWVkQWRkRm91ciA9IFIudW5jdXJyeU4oNCwgYWRkRm91cik7XG4gKiAgICAgIHVuY3VycmllZEFkZEZvdXIoMSwgMiwgMywgNCk7IC8vPT4gMTBcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIHVuY3VycnlOKGRlcHRoLCBmbikge1xuICByZXR1cm4gY3VycnlOKGRlcHRoLCBmdW5jdGlvbigpIHtcbiAgICB2YXIgY3VycmVudERlcHRoID0gMTtcbiAgICB2YXIgdmFsdWUgPSBmbjtcbiAgICB2YXIgaWR4ID0gMDtcbiAgICB2YXIgZW5kSWR4O1xuICAgIHdoaWxlIChjdXJyZW50RGVwdGggPD0gZGVwdGggJiYgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlbmRJZHggPSBjdXJyZW50RGVwdGggPT09IGRlcHRoID8gYXJndW1lbnRzLmxlbmd0aCA6IGlkeCArIHZhbHVlLmxlbmd0aDtcbiAgICAgIHZhbHVlID0gdmFsdWUuYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCBpZHgsIGVuZElkeCkpO1xuICAgICAgY3VycmVudERlcHRoICs9IDE7XG4gICAgICBpZHggPSBlbmRJZHg7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfSk7XG59KTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cblxuLyoqXG4gKiBCdWlsZHMgYSBsaXN0IGZyb20gYSBzZWVkIHZhbHVlLiBBY2NlcHRzIGFuIGl0ZXJhdG9yIGZ1bmN0aW9uLCB3aGljaCByZXR1cm5zXG4gKiBlaXRoZXIgZmFsc2UgdG8gc3RvcCBpdGVyYXRpb24gb3IgYW4gYXJyYXkgb2YgbGVuZ3RoIDIgY29udGFpbmluZyB0aGUgdmFsdWVcbiAqIHRvIGFkZCB0byB0aGUgcmVzdWx0aW5nIGxpc3QgYW5kIHRoZSBzZWVkIHRvIGJlIHVzZWQgaW4gdGhlIG5leHQgY2FsbCB0byB0aGVcbiAqIGl0ZXJhdG9yIGZ1bmN0aW9uLlxuICpcbiAqIFRoZSBpdGVyYXRvciBmdW5jdGlvbiByZWNlaXZlcyBvbmUgYXJndW1lbnQ6ICooc2VlZCkqLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEwLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIChhIC0+IFtiXSkgLT4gKiAtPiBbYl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBpdGVyYXRvciBmdW5jdGlvbi4gcmVjZWl2ZXMgb25lIGFyZ3VtZW50LCBgc2VlZGAsIGFuZCByZXR1cm5zXG4gKiAgICAgICAgZWl0aGVyIGZhbHNlIHRvIHF1aXQgaXRlcmF0aW9uIG9yIGFuIGFycmF5IG9mIGxlbmd0aCB0d28gdG8gcHJvY2VlZC4gVGhlIGVsZW1lbnRcbiAqICAgICAgICBhdCBpbmRleCAwIG9mIHRoaXMgYXJyYXkgd2lsbCBiZSBhZGRlZCB0byB0aGUgcmVzdWx0aW5nIGFycmF5LCBhbmQgdGhlIGVsZW1lbnRcbiAqICAgICAgICBhdCBpbmRleCAxIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBuZXh0IGNhbGwgdG8gYGZuYC5cbiAqIEBwYXJhbSB7Kn0gc2VlZCBUaGUgc2VlZCB2YWx1ZS5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgZmluYWwgbGlzdC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgZiA9IG4gPT4gbiA+IDUwID8gZmFsc2UgOiBbLW4sIG4gKyAxMF07XG4gKiAgICAgIFIudW5mb2xkKGYsIDEwKTsgLy89PiBbLTEwLCAtMjAsIC0zMCwgLTQwLCAtNTBdXG4gKiBAc3ltYiBSLnVuZm9sZChmLCB4KSA9IFtmKHgpWzBdLCBmKGYoeClbMV0pWzBdLCBmKGYoZih4KVsxXSlbMV0pWzBdLCAuLi5dXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiB1bmZvbGQoZm4sIHNlZWQpIHtcbiAgdmFyIHBhaXIgPSBmbihzZWVkKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB3aGlsZSAocGFpciAmJiBwYWlyLmxlbmd0aCkge1xuICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHBhaXJbMF07XG4gICAgcGFpciA9IGZuKHBhaXJbMV0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59KTtcbiIsInZhciBfY29uY2F0ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY29uY2F0Jyk7XG52YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIGNvbXBvc2UgPSByZXF1aXJlKCcuL2NvbXBvc2UnKTtcbnZhciB1bmlxID0gcmVxdWlyZSgnLi91bmlxJyk7XG5cblxuLyoqXG4gKiBDb21iaW5lcyB0d28gbGlzdHMgaW50byBhIHNldCAoaS5lLiBubyBkdXBsaWNhdGVzKSBjb21wb3NlZCBvZiB0aGUgZWxlbWVudHNcbiAqIG9mIGVhY2ggbGlzdC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xLjBcbiAqIEBjYXRlZ29yeSBSZWxhdGlvblxuICogQHNpZyBbKl0gLT4gWypdIC0+IFsqXVxuICogQHBhcmFtIHtBcnJheX0gYXMgVGhlIGZpcnN0IGxpc3QuXG4gKiBAcGFyYW0ge0FycmF5fSBicyBUaGUgc2Vjb25kIGxpc3QuXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGZpcnN0IGFuZCBzZWNvbmQgbGlzdHMgY29uY2F0ZW5hdGVkLCB3aXRoXG4gKiAgICAgICAgIGR1cGxpY2F0ZXMgcmVtb3ZlZC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnVuaW9uKFsxLCAyLCAzXSwgWzIsIDMsIDRdKTsgLy89PiBbMSwgMiwgMywgNF1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGNvbXBvc2UodW5pcSwgX2NvbmNhdCkpO1xuIiwidmFyIF9jb25jYXQgPSByZXF1aXJlKCcuL2ludGVybmFsL19jb25jYXQnKTtcbnZhciBfY3VycnkzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkzJyk7XG52YXIgdW5pcVdpdGggPSByZXF1aXJlKCcuL3VuaXFXaXRoJyk7XG5cblxuLyoqXG4gKiBDb21iaW5lcyB0d28gbGlzdHMgaW50byBhIHNldCAoaS5lLiBubyBkdXBsaWNhdGVzKSBjb21wb3NlZCBvZiB0aGUgZWxlbWVudHNcbiAqIG9mIGVhY2ggbGlzdC4gRHVwbGljYXRpb24gaXMgZGV0ZXJtaW5lZCBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIHJldHVybmVkIGJ5XG4gKiBhcHBseWluZyB0aGUgc3VwcGxpZWQgcHJlZGljYXRlIHRvIHR3byBsaXN0IGVsZW1lbnRzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IFJlbGF0aW9uXG4gKiBAc2lnIChhIC0+IGEgLT4gQm9vbGVhbikgLT4gWypdIC0+IFsqXSAtPiBbKl1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgQSBwcmVkaWNhdGUgdXNlZCB0byB0ZXN0IHdoZXRoZXIgdHdvIGl0ZW1zIGFyZSBlcXVhbC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QxIFRoZSBmaXJzdCBsaXN0LlxuICogQHBhcmFtIHtBcnJheX0gbGlzdDIgVGhlIHNlY29uZCBsaXN0LlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBmaXJzdCBhbmQgc2Vjb25kIGxpc3RzIGNvbmNhdGVuYXRlZCwgd2l0aFxuICogICAgICAgICBkdXBsaWNhdGVzIHJlbW92ZWQuXG4gKiBAc2VlIFIudW5pb25cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgbDEgPSBbe2E6IDF9LCB7YTogMn1dO1xuICogICAgICB2YXIgbDIgPSBbe2E6IDF9LCB7YTogNH1dO1xuICogICAgICBSLnVuaW9uV2l0aChSLmVxQnkoUi5wcm9wKCdhJykpLCBsMSwgbDIpOyAvLz0+IFt7YTogMX0sIHthOiAyfSwge2E6IDR9XVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTMoZnVuY3Rpb24gdW5pb25XaXRoKHByZWQsIGxpc3QxLCBsaXN0Mikge1xuICByZXR1cm4gdW5pcVdpdGgocHJlZCwgX2NvbmNhdChsaXN0MSwgbGlzdDIpKTtcbn0pO1xuIiwidmFyIF9jdXJyeTMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTMnKTtcblxuXG4vKipcbiAqIFRlc3RzIHRoZSBmaW5hbCBhcmd1bWVudCBieSBwYXNzaW5nIGl0IHRvIHRoZSBnaXZlbiBwcmVkaWNhdGUgZnVuY3Rpb24uIElmXG4gKiB0aGUgcHJlZGljYXRlIGlzIG5vdCBzYXRpc2ZpZWQsIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgcmVzdWx0IG9mXG4gKiBjYWxsaW5nIHRoZSBgd2hlbkZhbHNlRm5gIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgYXJndW1lbnQuIElmIHRoZSBwcmVkaWNhdGVcbiAqIGlzIHNhdGlzZmllZCwgdGhlIGFyZ3VtZW50IGlzIHJldHVybmVkIGFzIGlzLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjE4LjBcbiAqIEBjYXRlZ29yeSBMb2dpY1xuICogQHNpZyAoYSAtPiBCb29sZWFuKSAtPiAoYSAtPiBhKSAtPiBhIC0+IGFcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWQgICAgICAgIEEgcHJlZGljYXRlIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB3aGVuRmFsc2VGbiBBIGZ1bmN0aW9uIHRvIGludm9rZSB3aGVuIHRoZSBgcHJlZGAgZXZhbHVhdGVzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhIGZhbHN5IHZhbHVlLlxuICogQHBhcmFtIHsqfSAgICAgICAgeCAgICAgICAgICAgQW4gb2JqZWN0IHRvIHRlc3Qgd2l0aCB0aGUgYHByZWRgIGZ1bmN0aW9uIGFuZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyB0byBgd2hlbkZhbHNlRm5gIGlmIG5lY2Vzc2FyeS5cbiAqIEByZXR1cm4geyp9IEVpdGhlciBgeGAgb3IgdGhlIHJlc3VsdCBvZiBhcHBseWluZyBgeGAgdG8gYHdoZW5GYWxzZUZuYC5cbiAqIEBzZWUgUi5pZkVsc2UsIFIud2hlblxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIC8vIGNvZXJjZUFycmF5IDo6IChhfFthXSkgLT4gW2FdXG4gKiAgICAgIHZhciBjb2VyY2VBcnJheSA9IFIudW5sZXNzKFIuaXNBcnJheUxpa2UsIFIub2YpO1xuICogICAgICBjb2VyY2VBcnJheShbMSwgMiwgM10pOyAvLz0+IFsxLCAyLCAzXVxuICogICAgICBjb2VyY2VBcnJheSgxKTsgICAgICAgICAvLz0+IFsxXVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTMoZnVuY3Rpb24gdW5sZXNzKHByZWQsIHdoZW5GYWxzZUZuLCB4KSB7XG4gIHJldHVybiBwcmVkKHgpID8geCA6IHdoZW5GYWxzZUZuKHgpO1xufSk7XG4iLCJ2YXIgX2lkZW50aXR5ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9faWRlbnRpdHknKTtcbnZhciBjaGFpbiA9IHJlcXVpcmUoJy4vY2hhaW4nKTtcblxuXG4vKipcbiAqIFNob3J0aGFuZCBmb3IgYFIuY2hhaW4oUi5pZGVudGl0eSlgLCB3aGljaCByZW1vdmVzIG9uZSBsZXZlbCBvZiBuZXN0aW5nIGZyb21cbiAqIGFueSBbQ2hhaW5dKGh0dHBzOi8vZ2l0aHViLmNvbS9mYW50YXN5bGFuZC9mYW50YXN5LWxhbmQjY2hhaW4pLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjMuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgQ2hhaW4gYyA9PiBjIChjIGEpIC0+IGMgYVxuICogQHBhcmFtIHsqfSBsaXN0XG4gKiBAcmV0dXJuIHsqfVxuICogQHNlZSBSLmZsYXR0ZW4sIFIuY2hhaW5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnVubmVzdChbMSwgWzJdLCBbWzNdXV0pOyAvLz0+IFsxLCAyLCBbM11dXG4gKiAgICAgIFIudW5uZXN0KFtbMSwgMl0sIFszLCA0XSwgWzUsIDZdXSk7IC8vPT4gWzEsIDIsIDMsIDQsIDUsIDZdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gY2hhaW4oX2lkZW50aXR5KTtcbiIsInZhciBfY3VycnkzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkzJyk7XG5cblxuLyoqXG4gKiBUYWtlcyBhIHByZWRpY2F0ZSwgYSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiwgYW5kIGFuIGluaXRpYWwgdmFsdWUsXG4gKiBhbmQgcmV0dXJucyBhIHZhbHVlIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGluaXRpYWwgdmFsdWUuXG4gKiBJdCBkb2VzIHNvIGJ5IGFwcGx5aW5nIHRoZSB0cmFuc2Zvcm1hdGlvbiB1bnRpbCB0aGUgcHJlZGljYXRlIGlzIHNhdGlzZmllZCxcbiAqIGF0IHdoaWNoIHBvaW50IGl0IHJldHVybnMgdGhlIHNhdGlzZmFjdG9yeSB2YWx1ZS5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4yMC4wXG4gKiBAY2F0ZWdvcnkgTG9naWNcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gKGEgLT4gYSkgLT4gYSAtPiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkIEEgcHJlZGljYXRlIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgaXRlcmF0b3IgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Kn0gaW5pdCBJbml0aWFsIHZhbHVlXG4gKiBAcmV0dXJuIHsqfSBGaW5hbCB2YWx1ZSB0aGF0IHNhdGlzZmllcyBwcmVkaWNhdGVcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnVudGlsKFIuZ3QoUi5fXywgMTAwKSwgUi5tdWx0aXBseSgyKSkoMSkgLy8gPT4gMTI4XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MyhmdW5jdGlvbiB1bnRpbChwcmVkLCBmbiwgaW5pdCkge1xuICB2YXIgdmFsID0gaW5pdDtcbiAgd2hpbGUgKCFwcmVkKHZhbCkpIHtcbiAgICB2YWwgPSBmbih2YWwpO1xuICB9XG4gIHJldHVybiB2YWw7XG59KTtcbiIsInZhciBfY3VycnkxID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkxJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIHByb3BlcnRpZXMsIGluY2x1ZGluZyBwcm90b3R5cGUgcHJvcGVydGllcywgb2YgdGhlXG4gKiBzdXBwbGllZCBvYmplY3QuXG4gKiBOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBvdXRwdXQgYXJyYXkgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgY29uc2lzdGVudFxuICogYWNyb3NzIGRpZmZlcmVudCBKUyBwbGF0Zm9ybXMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMi4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAc2lnIHtrOiB2fSAtPiBbdl1cbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBleHRyYWN0IHZhbHVlcyBmcm9tXG4gKiBAcmV0dXJuIHtBcnJheX0gQW4gYXJyYXkgb2YgdGhlIHZhbHVlcyBvZiB0aGUgb2JqZWN0J3Mgb3duIGFuZCBwcm90b3R5cGUgcHJvcGVydGllcy5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgRiA9IGZ1bmN0aW9uKCkgeyB0aGlzLnggPSAnWCc7IH07XG4gKiAgICAgIEYucHJvdG90eXBlLnkgPSAnWSc7XG4gKiAgICAgIHZhciBmID0gbmV3IEYoKTtcbiAqICAgICAgUi52YWx1ZXNJbihmKTsgLy89PiBbJ1gnLCAnWSddXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MShmdW5jdGlvbiB2YWx1ZXNJbihvYmopIHtcbiAgdmFyIHByb3A7XG4gIHZhciB2cyA9IFtdO1xuICBmb3IgKHByb3AgaW4gb2JqKSB7XG4gICAgdnNbdnMubGVuZ3RoXSA9IG9ialtwcm9wXTtcbiAgfVxuICByZXR1cm4gdnM7XG59KTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cblxuLyoqXG4gKiBSZXR1cm5zIGEgXCJ2aWV3XCIgb2YgdGhlIGdpdmVuIGRhdGEgc3RydWN0dXJlLCBkZXRlcm1pbmVkIGJ5IHRoZSBnaXZlbiBsZW5zLlxuICogVGhlIGxlbnMncyBmb2N1cyBkZXRlcm1pbmVzIHdoaWNoIHBvcnRpb24gb2YgdGhlIGRhdGEgc3RydWN0dXJlIGlzIHZpc2libGUuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTYuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHR5cGVkZWZuIExlbnMgcyBhID0gRnVuY3RvciBmID0+IChhIC0+IGYgYSkgLT4gcyAtPiBmIHNcbiAqIEBzaWcgTGVucyBzIGEgLT4gcyAtPiBhXG4gKiBAcGFyYW0ge0xlbnN9IGxlbnNcbiAqIEBwYXJhbSB7Kn0geFxuICogQHJldHVybiB7Kn1cbiAqIEBzZWUgUi5wcm9wLCBSLmxlbnNJbmRleCwgUi5sZW5zUHJvcFxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciB4TGVucyA9IFIubGVuc1Byb3AoJ3gnKTtcbiAqXG4gKiAgICAgIFIudmlldyh4TGVucywge3g6IDEsIHk6IDJ9KTsgIC8vPT4gMVxuICogICAgICBSLnZpZXcoeExlbnMsIHt4OiA0LCB5OiAyfSk7ICAvLz0+IDRcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24oKSB7XG4gIC8vIGBDb25zdGAgaXMgYSBmdW5jdG9yIHRoYXQgZWZmZWN0aXZlbHkgaWdub3JlcyB0aGUgZnVuY3Rpb24gZ2l2ZW4gdG8gYG1hcGAuXG4gIHZhciBDb25zdCA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4ge3ZhbHVlOiB4LCBtYXA6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfX07XG4gIH07XG5cbiAgcmV0dXJuIF9jdXJyeTIoZnVuY3Rpb24gdmlldyhsZW5zLCB4KSB7XG4gICAgLy8gVXNpbmcgYENvbnN0YCBlZmZlY3RpdmVseSBpZ25vcmVzIHRoZSBzZXR0ZXIgZnVuY3Rpb24gb2YgdGhlIGBsZW5zYCxcbiAgICAvLyBsZWF2aW5nIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgZ2V0dGVyIGZ1bmN0aW9uIHVubW9kaWZpZWQuXG4gICAgcmV0dXJuIGxlbnMoQ29uc3QpKHgpLnZhbHVlO1xuICB9KTtcbn0oKSk7XG4iLCJ2YXIgX2N1cnJ5MyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MycpO1xuXG5cbi8qKlxuICogVGVzdHMgdGhlIGZpbmFsIGFyZ3VtZW50IGJ5IHBhc3NpbmcgaXQgdG8gdGhlIGdpdmVuIHByZWRpY2F0ZSBmdW5jdGlvbi4gSWZcbiAqIHRoZSBwcmVkaWNhdGUgaXMgc2F0aXNmaWVkLCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nXG4gKiB0aGUgYHdoZW5UcnVlRm5gIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgYXJndW1lbnQuIElmIHRoZSBwcmVkaWNhdGUgaXMgbm90XG4gKiBzYXRpc2ZpZWQsIHRoZSBhcmd1bWVudCBpcyByZXR1cm5lZCBhcyBpcy5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOC4wXG4gKiBAY2F0ZWdvcnkgTG9naWNcbiAqIEBzaWcgKGEgLT4gQm9vbGVhbikgLT4gKGEgLT4gYSkgLT4gYSAtPiBhXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkICAgICAgIEEgcHJlZGljYXRlIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB3aGVuVHJ1ZUZuIEEgZnVuY3Rpb24gdG8gaW52b2tlIHdoZW4gdGhlIGBjb25kaXRpb25gXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlcyB0byBhIHRydXRoeSB2YWx1ZS5cbiAqIEBwYXJhbSB7Kn0gICAgICAgIHggICAgICAgICAgQW4gb2JqZWN0IHRvIHRlc3Qgd2l0aCB0aGUgYHByZWRgIGZ1bmN0aW9uIGFuZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzIHRvIGB3aGVuVHJ1ZUZuYCBpZiBuZWNlc3NhcnkuXG4gKiBAcmV0dXJuIHsqfSBFaXRoZXIgYHhgIG9yIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgYHhgIHRvIGB3aGVuVHJ1ZUZuYC5cbiAqIEBzZWUgUi5pZkVsc2UsIFIudW5sZXNzXG4gKiBAZXhhbXBsZVxuICpcbiAqICAgICAgLy8gdHJ1bmNhdGUgOjogU3RyaW5nIC0+IFN0cmluZ1xuICogICAgICB2YXIgdHJ1bmNhdGUgPSBSLndoZW4oXG4gKiAgICAgICAgUi5wcm9wU2F0aXNmaWVzKFIuZ3QoUi5fXywgMTApLCAnbGVuZ3RoJyksXG4gKiAgICAgICAgUi5waXBlKFIudGFrZSgxMCksIFIuYXBwZW5kKCfigKYnKSwgUi5qb2luKCcnKSlcbiAqICAgICAgKTtcbiAqICAgICAgdHJ1bmNhdGUoJzEyMzQ1Jyk7ICAgICAgICAgLy89PiAnMTIzNDUnXG4gKiAgICAgIHRydW5jYXRlKCcwMTIzNDU2Nzg5QUJDJyk7IC8vPT4gJzAxMjM0NTY3ODnigKYnXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MyhmdW5jdGlvbiB3aGVuKHByZWQsIHdoZW5UcnVlRm4sIHgpIHtcbiAgcmV0dXJuIHByZWQoeCkgPyB3aGVuVHJ1ZUZuKHgpIDogeDtcbn0pO1xuIiwidmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcbnZhciBfaGFzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9faGFzJyk7XG5cblxuLyoqXG4gKiBUYWtlcyBhIHNwZWMgb2JqZWN0IGFuZCBhIHRlc3Qgb2JqZWN0OyByZXR1cm5zIHRydWUgaWYgdGhlIHRlc3Qgc2F0aXNmaWVzXG4gKiB0aGUgc3BlYy4gRWFjaCBvZiB0aGUgc3BlYydzIG93biBwcm9wZXJ0aWVzIG11c3QgYmUgYSBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gKiBFYWNoIHByZWRpY2F0ZSBpcyBhcHBsaWVkIHRvIHRoZSB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBvZiB0aGVcbiAqIHRlc3Qgb2JqZWN0LiBgd2hlcmVgIHJldHVybnMgdHJ1ZSBpZiBhbGwgdGhlIHByZWRpY2F0ZXMgcmV0dXJuIHRydWUsIGZhbHNlXG4gKiBvdGhlcndpc2UuXG4gKlxuICogYHdoZXJlYCBpcyB3ZWxsIHN1aXRlZCB0byBkZWNsYXJhdGl2ZWx5IGV4cHJlc3NpbmcgY29uc3RyYWludHMgZm9yIG90aGVyXG4gKiBmdW5jdGlvbnMgc3VjaCBhcyBgZmlsdGVyYCBhbmQgYGZpbmRgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMVxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7U3RyaW5nOiAoKiAtPiBCb29sZWFuKX0gLT4ge1N0cmluZzogKn0gLT4gQm9vbGVhblxuICogQHBhcmFtIHtPYmplY3R9IHNwZWNcbiAqIEBwYXJhbSB7T2JqZWN0fSB0ZXN0T2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIC8vIHByZWQgOjogT2JqZWN0IC0+IEJvb2xlYW5cbiAqICAgICAgdmFyIHByZWQgPSBSLndoZXJlKHtcbiAqICAgICAgICBhOiBSLmVxdWFscygnZm9vJyksXG4gKiAgICAgICAgYjogUi5jb21wbGVtZW50KFIuZXF1YWxzKCdiYXInKSksXG4gKiAgICAgICAgeDogUi5ndChfXywgMTApLFxuICogICAgICAgIHk6IFIubHQoX18sIDIwKVxuICogICAgICB9KTtcbiAqXG4gKiAgICAgIHByZWQoe2E6ICdmb28nLCBiOiAneHh4JywgeDogMTEsIHk6IDE5fSk7IC8vPT4gdHJ1ZVxuICogICAgICBwcmVkKHthOiAneHh4JywgYjogJ3h4eCcsIHg6IDExLCB5OiAxOX0pOyAvLz0+IGZhbHNlXG4gKiAgICAgIHByZWQoe2E6ICdmb28nLCBiOiAnYmFyJywgeDogMTEsIHk6IDE5fSk7IC8vPT4gZmFsc2VcbiAqICAgICAgcHJlZCh7YTogJ2ZvbycsIGI6ICd4eHgnLCB4OiAxMCwgeTogMTl9KTsgLy89PiBmYWxzZVxuICogICAgICBwcmVkKHthOiAnZm9vJywgYjogJ3h4eCcsIHg6IDExLCB5OiAyMH0pOyAvLz0+IGZhbHNlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiB3aGVyZShzcGVjLCB0ZXN0T2JqKSB7XG4gIGZvciAodmFyIHByb3AgaW4gc3BlYykge1xuICAgIGlmIChfaGFzKHByb3AsIHNwZWMpICYmICFzcGVjW3Byb3BdKHRlc3RPYmpbcHJvcF0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xudmFyIGVxdWFscyA9IHJlcXVpcmUoJy4vZXF1YWxzJyk7XG52YXIgbWFwID0gcmVxdWlyZSgnLi9tYXAnKTtcbnZhciB3aGVyZSA9IHJlcXVpcmUoJy4vd2hlcmUnKTtcblxuXG4vKipcbiAqIFRha2VzIGEgc3BlYyBvYmplY3QgYW5kIGEgdGVzdCBvYmplY3Q7IHJldHVybnMgdHJ1ZSBpZiB0aGUgdGVzdCBzYXRpc2ZpZXNcbiAqIHRoZSBzcGVjLCBmYWxzZSBvdGhlcndpc2UuIEFuIG9iamVjdCBzYXRpc2ZpZXMgdGhlIHNwZWMgaWYsIGZvciBlYWNoIG9mIHRoZVxuICogc3BlYydzIG93biBwcm9wZXJ0aWVzLCBhY2Nlc3NpbmcgdGhhdCBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0IGdpdmVzIHRoZSBzYW1lXG4gKiB2YWx1ZSAoaW4gYFIuZXF1YWxzYCB0ZXJtcykgYXMgYWNjZXNzaW5nIHRoYXQgcHJvcGVydHkgb2YgdGhlIHNwZWMuXG4gKlxuICogYHdoZXJlRXFgIGlzIGEgc3BlY2lhbGl6YXRpb24gb2YgW2B3aGVyZWBdKCN3aGVyZSkuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMTQuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHNpZyB7U3RyaW5nOiAqfSAtPiB7U3RyaW5nOiAqfSAtPiBCb29sZWFuXG4gKiBAcGFyYW0ge09iamVjdH0gc3BlY1xuICogQHBhcmFtIHtPYmplY3R9IHRlc3RPYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAc2VlIFIud2hlcmVcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICAvLyBwcmVkIDo6IE9iamVjdCAtPiBCb29sZWFuXG4gKiAgICAgIHZhciBwcmVkID0gUi53aGVyZUVxKHthOiAxLCBiOiAyfSk7XG4gKlxuICogICAgICBwcmVkKHthOiAxfSk7ICAgICAgICAgICAgICAvLz0+IGZhbHNlXG4gKiAgICAgIHByZWQoe2E6IDEsIGI6IDJ9KTsgICAgICAgIC8vPT4gdHJ1ZVxuICogICAgICBwcmVkKHthOiAxLCBiOiAyLCBjOiAzfSk7ICAvLz0+IHRydWVcbiAqICAgICAgcHJlZCh7YTogMSwgYjogMX0pOyAgICAgICAgLy89PiBmYWxzZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IF9jdXJyeTIoZnVuY3Rpb24gd2hlcmVFcShzcGVjLCB0ZXN0T2JqKSB7XG4gIHJldHVybiB3aGVyZShtYXAoZXF1YWxzLCBzcGVjKSwgdGVzdE9iaik7XG59KTtcbiIsInZhciBfY29udGFpbnMgPSByZXF1aXJlKCcuL2ludGVybmFsL19jb250YWlucycpO1xudmFyIF9jdXJyeTIgPSByZXF1aXJlKCcuL2ludGVybmFsL19jdXJyeTInKTtcbnZhciBmbGlwID0gcmVxdWlyZSgnLi9mbGlwJyk7XG52YXIgcmVqZWN0ID0gcmVxdWlyZSgnLi9yZWplY3QnKTtcblxuXG4vKipcbiAqIFJldHVybnMgYSBuZXcgbGlzdCB3aXRob3V0IHZhbHVlcyBpbiB0aGUgZmlyc3QgYXJndW1lbnQuXG4gKiBgUi5lcXVhbHNgIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGVxdWFsaXR5LlxuICpcbiAqIEFjdHMgYXMgYSB0cmFuc2R1Y2VyIGlmIGEgdHJhbnNmb3JtZXIgaXMgZ2l2ZW4gaW4gbGlzdCBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4xOS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2FdIC0+IFthXVxuICogQHBhcmFtIHtBcnJheX0gbGlzdDEgVGhlIHZhbHVlcyB0byBiZSByZW1vdmVkIGZyb20gYGxpc3QyYC5cbiAqIEBwYXJhbSB7QXJyYXl9IGxpc3QyIFRoZSBhcnJheSB0byByZW1vdmUgdmFsdWVzIGZyb20uXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIG5ldyBhcnJheSB3aXRob3V0IHZhbHVlcyBpbiBgbGlzdDFgLlxuICogQHNlZSBSLnRyYW5zZHVjZVxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIud2l0aG91dChbMSwgMl0sIFsxLCAyLCAxLCAzLCA0XSk7IC8vPT4gWzMsIDRdXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbih4cywgbGlzdCkge1xuICByZXR1cm4gcmVqZWN0KGZsaXAoX2NvbnRhaW5zKSh4cyksIGxpc3QpO1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBsaXN0IG91dCBvZiB0aGUgdHdvIHN1cHBsaWVkIGJ5IGNyZWF0aW5nIGVhY2ggcG9zc2libGUgcGFpclxuICogZnJvbSB0aGUgbGlzdHMuXG4gKlxuICogQGZ1bmNcbiAqIEBtZW1iZXJPZiBSXG4gKiBAc2luY2UgdjAuMS4wXG4gKiBAY2F0ZWdvcnkgTGlzdFxuICogQHNpZyBbYV0gLT4gW2JdIC0+IFtbYSxiXV1cbiAqIEBwYXJhbSB7QXJyYXl9IGFzIFRoZSBmaXJzdCBsaXN0LlxuICogQHBhcmFtIHtBcnJheX0gYnMgVGhlIHNlY29uZCBsaXN0LlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG1hZGUgYnkgY29tYmluaW5nIGVhY2ggcG9zc2libGUgcGFpciBmcm9tXG4gKiAgICAgICAgIGBhc2AgYW5kIGBic2AgaW50byBwYWlycyAoYFthLCBiXWApLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIFIueHByb2QoWzEsIDJdLCBbJ2EnLCAnYiddKTsgLy89PiBbWzEsICdhJ10sIFsxLCAnYiddLCBbMiwgJ2EnXSwgWzIsICdiJ11dXG4gKiBAc3ltYiBSLnhwcm9kKFthLCBiXSwgW2MsIGRdKSA9IFtbYSwgY10sIFthLCBkXSwgW2IsIGNdLCBbYiwgZF1dXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiB4cHJvZChhLCBiKSB7IC8vID0geHByb2RXaXRoKHByZXBlbmQpOyAodGFrZXMgYWJvdXQgMyB0aW1lcyBhcyBsb25nLi4uKVxuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGlsZW4gPSBhLmxlbmd0aDtcbiAgdmFyIGo7XG4gIHZhciBqbGVuID0gYi5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgd2hpbGUgKGlkeCA8IGlsZW4pIHtcbiAgICBqID0gMDtcbiAgICB3aGlsZSAoaiA8IGpsZW4pIHtcbiAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IFthW2lkeF0sIGJbal1dO1xuICAgICAgaiArPSAxO1xuICAgIH1cbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG4iLCJ2YXIgX2N1cnJ5MiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvX2N1cnJ5MicpO1xuXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBsaXN0IG91dCBvZiB0aGUgdHdvIHN1cHBsaWVkIGJ5IHBhaXJpbmcgdXAgZXF1YWxseS1wb3NpdGlvbmVkXG4gKiBpdGVtcyBmcm9tIGJvdGggbGlzdHMuIFRoZSByZXR1cm5lZCBsaXN0IGlzIHRydW5jYXRlZCB0byB0aGUgbGVuZ3RoIG9mIHRoZVxuICogc2hvcnRlciBvZiB0aGUgdHdvIGlucHV0IGxpc3RzLlxuICogTm90ZTogYHppcGAgaXMgZXF1aXZhbGVudCB0byBgemlwV2l0aChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBbYSwgYl0gfSlgLlxuICpcbiAqIEBmdW5jXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgW2FdIC0+IFtiXSAtPiBbW2EsYl1dXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MSBUaGUgZmlyc3QgYXJyYXkgdG8gY29uc2lkZXIuXG4gKiBAcGFyYW0ge0FycmF5fSBsaXN0MiBUaGUgc2Vjb25kIGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG1hZGUgYnkgcGFpcmluZyB1cCBzYW1lLWluZGV4ZWQgZWxlbWVudHMgb2YgYGxpc3QxYCBhbmQgYGxpc3QyYC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnppcChbMSwgMiwgM10sIFsnYScsICdiJywgJ2MnXSk7IC8vPT4gW1sxLCAnYSddLCBbMiwgJ2InXSwgWzMsICdjJ11dXG4gKiBAc3ltYiBSLnppcChbYSwgYiwgY10sIFtkLCBlLCBmXSkgPSBbW2EsIGRdLCBbYiwgZV0sIFtjLCBmXV1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBfY3VycnkyKGZ1bmN0aW9uIHppcChhLCBiKSB7XG4gIHZhciBydiA9IFtdO1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aCk7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBydltpZHhdID0gW2FbaWR4XSwgYltpZHhdXTtcbiAgICBpZHggKz0gMTtcbiAgfVxuICByZXR1cm4gcnY7XG59KTtcbiIsInZhciBfY3VycnkyID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkyJyk7XG5cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG9iamVjdCBvdXQgb2YgYSBsaXN0IG9mIGtleXMgYW5kIGEgbGlzdCBvZiB2YWx1ZXMuXG4gKiBLZXkvdmFsdWUgcGFpcmluZyBpcyB0cnVuY2F0ZWQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc2hvcnRlciBvZiB0aGUgdHdvIGxpc3RzLlxuICogTm90ZTogYHppcE9iamAgaXMgZXF1aXZhbGVudCB0byBgcGlwZSh6aXBXaXRoKHBhaXIpLCBmcm9tUGFpcnMpYC5cbiAqXG4gKiBAZnVuY1xuICogQG1lbWJlck9mIFJcbiAqIEBzaW5jZSB2MC4zLjBcbiAqIEBjYXRlZ29yeSBMaXN0XG4gKiBAc2lnIFtTdHJpbmddIC0+IFsqXSAtPiB7U3RyaW5nOiAqfVxuICogQHBhcmFtIHtBcnJheX0ga2V5cyBUaGUgYXJyYXkgdGhhdCB3aWxsIGJlIHByb3BlcnRpZXMgb24gdGhlIG91dHB1dCBvYmplY3QuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIGxpc3Qgb2YgdmFsdWVzIG9uIHRoZSBvdXRwdXQgb2JqZWN0LlxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgb2JqZWN0IG1hZGUgYnkgcGFpcmluZyB1cCBzYW1lLWluZGV4ZWQgZWxlbWVudHMgb2YgYGtleXNgIGFuZCBgdmFsdWVzYC5cbiAqIEBleGFtcGxlXG4gKlxuICogICAgICBSLnppcE9iaihbJ2EnLCAnYicsICdjJ10sIFsxLCAyLCAzXSk7IC8vPT4ge2E6IDEsIGI6IDIsIGM6IDN9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MihmdW5jdGlvbiB6aXBPYmooa2V5cywgdmFsdWVzKSB7XG4gIHZhciBpZHggPSAwO1xuICB2YXIgbGVuID0gTWF0aC5taW4oa2V5cy5sZW5ndGgsIHZhbHVlcy5sZW5ndGgpO1xuICB2YXIgb3V0ID0ge307XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBvdXRba2V5c1tpZHhdXSA9IHZhbHVlc1tpZHhdO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiBvdXQ7XG59KTtcbiIsInZhciBfY3VycnkzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9fY3VycnkzJyk7XG5cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGxpc3Qgb3V0IG9mIHRoZSB0d28gc3VwcGxpZWQgYnkgYXBwbHlpbmcgdGhlIGZ1bmN0aW9uIHRvIGVhY2hcbiAqIGVxdWFsbHktcG9zaXRpb25lZCBwYWlyIGluIHRoZSBsaXN0cy4gVGhlIHJldHVybmVkIGxpc3QgaXMgdHJ1bmNhdGVkIHRvIHRoZVxuICogbGVuZ3RoIG9mIHRoZSBzaG9ydGVyIG9mIHRoZSB0d28gaW5wdXQgbGlzdHMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyT2YgUlxuICogQHNpbmNlIHYwLjEuMFxuICogQGNhdGVnb3J5IExpc3RcbiAqIEBzaWcgKGEsYiAtPiBjKSAtPiBbYV0gLT4gW2JdIC0+IFtjXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHVzZWQgdG8gY29tYmluZSB0aGUgdHdvIGVsZW1lbnRzIGludG8gb25lIHZhbHVlLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdDEgVGhlIGZpcnN0IGFycmF5IHRvIGNvbnNpZGVyLlxuICogQHBhcmFtIHtBcnJheX0gbGlzdDIgVGhlIHNlY29uZCBhcnJheSB0byBjb25zaWRlci5cbiAqIEByZXR1cm4ge0FycmF5fSBUaGUgbGlzdCBtYWRlIGJ5IGNvbWJpbmluZyBzYW1lLWluZGV4ZWQgZWxlbWVudHMgb2YgYGxpc3QxYCBhbmQgYGxpc3QyYFxuICogICAgICAgICB1c2luZyBgZm5gLlxuICogQGV4YW1wbGVcbiAqXG4gKiAgICAgIHZhciBmID0gKHgsIHkpID0+IHtcbiAqICAgICAgICAvLyAuLi5cbiAqICAgICAgfTtcbiAqICAgICAgUi56aXBXaXRoKGYsIFsxLCAyLCAzXSwgWydhJywgJ2InLCAnYyddKTtcbiAqICAgICAgLy89PiBbZigxLCAnYScpLCBmKDIsICdiJyksIGYoMywgJ2MnKV1cbiAqIEBzeW1iIFIuemlwV2l0aChmbiwgW2EsIGIsIGNdLCBbZCwgZSwgZl0pID0gW2ZuKGEsIGQpLCBmbihiLCBlKSwgZm4oYywgZildXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gX2N1cnJ5MyhmdW5jdGlvbiB6aXBXaXRoKGZuLCBhLCBiKSB7XG4gIHZhciBydiA9IFtdO1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIGxlbiA9IE1hdGgubWluKGEubGVuZ3RoLCBiLmxlbmd0aCk7XG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBydltpZHhdID0gZm4oYVtpZHhdLCBiW2lkeF0pO1xuICAgIGlkeCArPSAxO1xuICB9XG4gIHJldHVybiBydjtcbn0pO1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIEY6IHJlcXVpcmUoJy4vc3JjL0YnKSxcbiAgVDogcmVxdWlyZSgnLi9zcmMvVCcpLFxuICBfXzogcmVxdWlyZSgnLi9zcmMvX18nKSxcbiAgYWRkOiByZXF1aXJlKCcuL3NyYy9hZGQnKSxcbiAgYWRkSW5kZXg6IHJlcXVpcmUoJy4vc3JjL2FkZEluZGV4JyksXG4gIGFkanVzdDogcmVxdWlyZSgnLi9zcmMvYWRqdXN0JyksXG4gIGFsbDogcmVxdWlyZSgnLi9zcmMvYWxsJyksXG4gIGFsbFBhc3M6IHJlcXVpcmUoJy4vc3JjL2FsbFBhc3MnKSxcbiAgYWx3YXlzOiByZXF1aXJlKCcuL3NyYy9hbHdheXMnKSxcbiAgYW5kOiByZXF1aXJlKCcuL3NyYy9hbmQnKSxcbiAgYW55OiByZXF1aXJlKCcuL3NyYy9hbnknKSxcbiAgYW55UGFzczogcmVxdWlyZSgnLi9zcmMvYW55UGFzcycpLFxuICBhcDogcmVxdWlyZSgnLi9zcmMvYXAnKSxcbiAgYXBlcnR1cmU6IHJlcXVpcmUoJy4vc3JjL2FwZXJ0dXJlJyksXG4gIGFwcGVuZDogcmVxdWlyZSgnLi9zcmMvYXBwZW5kJyksXG4gIGFwcGx5OiByZXF1aXJlKCcuL3NyYy9hcHBseScpLFxuICBhcHBseVNwZWM6IHJlcXVpcmUoJy4vc3JjL2FwcGx5U3BlYycpLFxuICBhc2NlbmQ6IHJlcXVpcmUoJy4vc3JjL2FzY2VuZCcpLFxuICBhc3NvYzogcmVxdWlyZSgnLi9zcmMvYXNzb2MnKSxcbiAgYXNzb2NQYXRoOiByZXF1aXJlKCcuL3NyYy9hc3NvY1BhdGgnKSxcbiAgYmluYXJ5OiByZXF1aXJlKCcuL3NyYy9iaW5hcnknKSxcbiAgYmluZDogcmVxdWlyZSgnLi9zcmMvYmluZCcpLFxuICBib3RoOiByZXF1aXJlKCcuL3NyYy9ib3RoJyksXG4gIGNhbGw6IHJlcXVpcmUoJy4vc3JjL2NhbGwnKSxcbiAgY2hhaW46IHJlcXVpcmUoJy4vc3JjL2NoYWluJyksXG4gIGNsYW1wOiByZXF1aXJlKCcuL3NyYy9jbGFtcCcpLFxuICBjbG9uZTogcmVxdWlyZSgnLi9zcmMvY2xvbmUnKSxcbiAgY29tcGFyYXRvcjogcmVxdWlyZSgnLi9zcmMvY29tcGFyYXRvcicpLFxuICBjb21wbGVtZW50OiByZXF1aXJlKCcuL3NyYy9jb21wbGVtZW50JyksXG4gIGNvbXBvc2U6IHJlcXVpcmUoJy4vc3JjL2NvbXBvc2UnKSxcbiAgY29tcG9zZUs6IHJlcXVpcmUoJy4vc3JjL2NvbXBvc2VLJyksXG4gIGNvbXBvc2VQOiByZXF1aXJlKCcuL3NyYy9jb21wb3NlUCcpLFxuICBjb25jYXQ6IHJlcXVpcmUoJy4vc3JjL2NvbmNhdCcpLFxuICBjb25kOiByZXF1aXJlKCcuL3NyYy9jb25kJyksXG4gIGNvbnN0cnVjdDogcmVxdWlyZSgnLi9zcmMvY29uc3RydWN0JyksXG4gIGNvbnN0cnVjdE46IHJlcXVpcmUoJy4vc3JjL2NvbnN0cnVjdE4nKSxcbiAgY29udGFpbnM6IHJlcXVpcmUoJy4vc3JjL2NvbnRhaW5zJyksXG4gIGNvbnZlcmdlOiByZXF1aXJlKCcuL3NyYy9jb252ZXJnZScpLFxuICBjb3VudEJ5OiByZXF1aXJlKCcuL3NyYy9jb3VudEJ5JyksXG4gIGN1cnJ5OiByZXF1aXJlKCcuL3NyYy9jdXJyeScpLFxuICBjdXJyeU46IHJlcXVpcmUoJy4vc3JjL2N1cnJ5TicpLFxuICBkZWM6IHJlcXVpcmUoJy4vc3JjL2RlYycpLFxuICBkZXNjZW5kOiByZXF1aXJlKCcuL3NyYy9kZXNjZW5kJyksXG4gIGRlZmF1bHRUbzogcmVxdWlyZSgnLi9zcmMvZGVmYXVsdFRvJyksXG4gIGRpZmZlcmVuY2U6IHJlcXVpcmUoJy4vc3JjL2RpZmZlcmVuY2UnKSxcbiAgZGlmZmVyZW5jZVdpdGg6IHJlcXVpcmUoJy4vc3JjL2RpZmZlcmVuY2VXaXRoJyksXG4gIGRpc3NvYzogcmVxdWlyZSgnLi9zcmMvZGlzc29jJyksXG4gIGRpc3NvY1BhdGg6IHJlcXVpcmUoJy4vc3JjL2Rpc3NvY1BhdGgnKSxcbiAgZGl2aWRlOiByZXF1aXJlKCcuL3NyYy9kaXZpZGUnKSxcbiAgZHJvcDogcmVxdWlyZSgnLi9zcmMvZHJvcCcpLFxuICBkcm9wTGFzdDogcmVxdWlyZSgnLi9zcmMvZHJvcExhc3QnKSxcbiAgZHJvcExhc3RXaGlsZTogcmVxdWlyZSgnLi9zcmMvZHJvcExhc3RXaGlsZScpLFxuICBkcm9wUmVwZWF0czogcmVxdWlyZSgnLi9zcmMvZHJvcFJlcGVhdHMnKSxcbiAgZHJvcFJlcGVhdHNXaXRoOiByZXF1aXJlKCcuL3NyYy9kcm9wUmVwZWF0c1dpdGgnKSxcbiAgZHJvcFdoaWxlOiByZXF1aXJlKCcuL3NyYy9kcm9wV2hpbGUnKSxcbiAgZWl0aGVyOiByZXF1aXJlKCcuL3NyYy9laXRoZXInKSxcbiAgZW1wdHk6IHJlcXVpcmUoJy4vc3JjL2VtcHR5JyksXG4gIGVxQnk6IHJlcXVpcmUoJy4vc3JjL2VxQnknKSxcbiAgZXFQcm9wczogcmVxdWlyZSgnLi9zcmMvZXFQcm9wcycpLFxuICBlcXVhbHM6IHJlcXVpcmUoJy4vc3JjL2VxdWFscycpLFxuICBldm9sdmU6IHJlcXVpcmUoJy4vc3JjL2V2b2x2ZScpLFxuICBmaWx0ZXI6IHJlcXVpcmUoJy4vc3JjL2ZpbHRlcicpLFxuICBmaW5kOiByZXF1aXJlKCcuL3NyYy9maW5kJyksXG4gIGZpbmRJbmRleDogcmVxdWlyZSgnLi9zcmMvZmluZEluZGV4JyksXG4gIGZpbmRMYXN0OiByZXF1aXJlKCcuL3NyYy9maW5kTGFzdCcpLFxuICBmaW5kTGFzdEluZGV4OiByZXF1aXJlKCcuL3NyYy9maW5kTGFzdEluZGV4JyksXG4gIGZsYXR0ZW46IHJlcXVpcmUoJy4vc3JjL2ZsYXR0ZW4nKSxcbiAgZmxpcDogcmVxdWlyZSgnLi9zcmMvZmxpcCcpLFxuICBmb3JFYWNoOiByZXF1aXJlKCcuL3NyYy9mb3JFYWNoJyksXG4gIGZvckVhY2hPYmpJbmRleGVkOiByZXF1aXJlKCcuL3NyYy9mb3JFYWNoT2JqSW5kZXhlZCcpLFxuICBmcm9tUGFpcnM6IHJlcXVpcmUoJy4vc3JjL2Zyb21QYWlycycpLFxuICBncm91cEJ5OiByZXF1aXJlKCcuL3NyYy9ncm91cEJ5JyksXG4gIGdyb3VwV2l0aDogcmVxdWlyZSgnLi9zcmMvZ3JvdXBXaXRoJyksXG4gIGd0OiByZXF1aXJlKCcuL3NyYy9ndCcpLFxuICBndGU6IHJlcXVpcmUoJy4vc3JjL2d0ZScpLFxuICBoYXM6IHJlcXVpcmUoJy4vc3JjL2hhcycpLFxuICBoYXNJbjogcmVxdWlyZSgnLi9zcmMvaGFzSW4nKSxcbiAgaGVhZDogcmVxdWlyZSgnLi9zcmMvaGVhZCcpLFxuICBpZGVudGljYWw6IHJlcXVpcmUoJy4vc3JjL2lkZW50aWNhbCcpLFxuICBpZGVudGl0eTogcmVxdWlyZSgnLi9zcmMvaWRlbnRpdHknKSxcbiAgaWZFbHNlOiByZXF1aXJlKCcuL3NyYy9pZkVsc2UnKSxcbiAgaW5jOiByZXF1aXJlKCcuL3NyYy9pbmMnKSxcbiAgaW5kZXhCeTogcmVxdWlyZSgnLi9zcmMvaW5kZXhCeScpLFxuICBpbmRleE9mOiByZXF1aXJlKCcuL3NyYy9pbmRleE9mJyksXG4gIGluaXQ6IHJlcXVpcmUoJy4vc3JjL2luaXQnKSxcbiAgaW5zZXJ0OiByZXF1aXJlKCcuL3NyYy9pbnNlcnQnKSxcbiAgaW5zZXJ0QWxsOiByZXF1aXJlKCcuL3NyYy9pbnNlcnRBbGwnKSxcbiAgaW50ZXJzZWN0aW9uOiByZXF1aXJlKCcuL3NyYy9pbnRlcnNlY3Rpb24nKSxcbiAgaW50ZXJzZWN0aW9uV2l0aDogcmVxdWlyZSgnLi9zcmMvaW50ZXJzZWN0aW9uV2l0aCcpLFxuICBpbnRlcnNwZXJzZTogcmVxdWlyZSgnLi9zcmMvaW50ZXJzcGVyc2UnKSxcbiAgaW50bzogcmVxdWlyZSgnLi9zcmMvaW50bycpLFxuICBpbnZlcnQ6IHJlcXVpcmUoJy4vc3JjL2ludmVydCcpLFxuICBpbnZlcnRPYmo6IHJlcXVpcmUoJy4vc3JjL2ludmVydE9iaicpLFxuICBpbnZva2VyOiByZXF1aXJlKCcuL3NyYy9pbnZva2VyJyksXG4gIGlzOiByZXF1aXJlKCcuL3NyYy9pcycpLFxuICBpc0FycmF5TGlrZTogcmVxdWlyZSgnLi9zcmMvaXNBcnJheUxpa2UnKSxcbiAgaXNFbXB0eTogcmVxdWlyZSgnLi9zcmMvaXNFbXB0eScpLFxuICBpc05pbDogcmVxdWlyZSgnLi9zcmMvaXNOaWwnKSxcbiAgam9pbjogcmVxdWlyZSgnLi9zcmMvam9pbicpLFxuICBqdXh0OiByZXF1aXJlKCcuL3NyYy9qdXh0JyksXG4gIGtleXM6IHJlcXVpcmUoJy4vc3JjL2tleXMnKSxcbiAga2V5c0luOiByZXF1aXJlKCcuL3NyYy9rZXlzSW4nKSxcbiAgbGFzdDogcmVxdWlyZSgnLi9zcmMvbGFzdCcpLFxuICBsYXN0SW5kZXhPZjogcmVxdWlyZSgnLi9zcmMvbGFzdEluZGV4T2YnKSxcbiAgbGVuZ3RoOiByZXF1aXJlKCcuL3NyYy9sZW5ndGgnKSxcbiAgbGVuczogcmVxdWlyZSgnLi9zcmMvbGVucycpLFxuICBsZW5zSW5kZXg6IHJlcXVpcmUoJy4vc3JjL2xlbnNJbmRleCcpLFxuICBsZW5zUGF0aDogcmVxdWlyZSgnLi9zcmMvbGVuc1BhdGgnKSxcbiAgbGVuc1Byb3A6IHJlcXVpcmUoJy4vc3JjL2xlbnNQcm9wJyksXG4gIGxpZnQ6IHJlcXVpcmUoJy4vc3JjL2xpZnQnKSxcbiAgbGlmdE46IHJlcXVpcmUoJy4vc3JjL2xpZnROJyksXG4gIGx0OiByZXF1aXJlKCcuL3NyYy9sdCcpLFxuICBsdGU6IHJlcXVpcmUoJy4vc3JjL2x0ZScpLFxuICBtYXA6IHJlcXVpcmUoJy4vc3JjL21hcCcpLFxuICBtYXBBY2N1bTogcmVxdWlyZSgnLi9zcmMvbWFwQWNjdW0nKSxcbiAgbWFwQWNjdW1SaWdodDogcmVxdWlyZSgnLi9zcmMvbWFwQWNjdW1SaWdodCcpLFxuICBtYXBPYmpJbmRleGVkOiByZXF1aXJlKCcuL3NyYy9tYXBPYmpJbmRleGVkJyksXG4gIG1hdGNoOiByZXF1aXJlKCcuL3NyYy9tYXRjaCcpLFxuICBtYXRoTW9kOiByZXF1aXJlKCcuL3NyYy9tYXRoTW9kJyksXG4gIG1heDogcmVxdWlyZSgnLi9zcmMvbWF4JyksXG4gIG1heEJ5OiByZXF1aXJlKCcuL3NyYy9tYXhCeScpLFxuICBtZWFuOiByZXF1aXJlKCcuL3NyYy9tZWFuJyksXG4gIG1lZGlhbjogcmVxdWlyZSgnLi9zcmMvbWVkaWFuJyksXG4gIG1lbW9pemU6IHJlcXVpcmUoJy4vc3JjL21lbW9pemUnKSxcbiAgbWVyZ2U6IHJlcXVpcmUoJy4vc3JjL21lcmdlJyksXG4gIG1lcmdlQWxsOiByZXF1aXJlKCcuL3NyYy9tZXJnZUFsbCcpLFxuICBtZXJnZVdpdGg6IHJlcXVpcmUoJy4vc3JjL21lcmdlV2l0aCcpLFxuICBtZXJnZVdpdGhLZXk6IHJlcXVpcmUoJy4vc3JjL21lcmdlV2l0aEtleScpLFxuICBtaW46IHJlcXVpcmUoJy4vc3JjL21pbicpLFxuICBtaW5CeTogcmVxdWlyZSgnLi9zcmMvbWluQnknKSxcbiAgbW9kdWxvOiByZXF1aXJlKCcuL3NyYy9tb2R1bG8nKSxcbiAgbXVsdGlwbHk6IHJlcXVpcmUoJy4vc3JjL211bHRpcGx5JyksXG4gIG5Bcnk6IHJlcXVpcmUoJy4vc3JjL25BcnknKSxcbiAgbmVnYXRlOiByZXF1aXJlKCcuL3NyYy9uZWdhdGUnKSxcbiAgbm9uZTogcmVxdWlyZSgnLi9zcmMvbm9uZScpLFxuICBub3Q6IHJlcXVpcmUoJy4vc3JjL25vdCcpLFxuICBudGg6IHJlcXVpcmUoJy4vc3JjL250aCcpLFxuICBudGhBcmc6IHJlcXVpcmUoJy4vc3JjL250aEFyZycpLFxuICBvYmpPZjogcmVxdWlyZSgnLi9zcmMvb2JqT2YnKSxcbiAgb2Y6IHJlcXVpcmUoJy4vc3JjL29mJyksXG4gIG9taXQ6IHJlcXVpcmUoJy4vc3JjL29taXQnKSxcbiAgb25jZTogcmVxdWlyZSgnLi9zcmMvb25jZScpLFxuICBvcjogcmVxdWlyZSgnLi9zcmMvb3InKSxcbiAgb3ZlcjogcmVxdWlyZSgnLi9zcmMvb3ZlcicpLFxuICBwYWlyOiByZXF1aXJlKCcuL3NyYy9wYWlyJyksXG4gIHBhcnRpYWw6IHJlcXVpcmUoJy4vc3JjL3BhcnRpYWwnKSxcbiAgcGFydGlhbFJpZ2h0OiByZXF1aXJlKCcuL3NyYy9wYXJ0aWFsUmlnaHQnKSxcbiAgcGFydGl0aW9uOiByZXF1aXJlKCcuL3NyYy9wYXJ0aXRpb24nKSxcbiAgcGF0aDogcmVxdWlyZSgnLi9zcmMvcGF0aCcpLFxuICBwYXRoRXE6IHJlcXVpcmUoJy4vc3JjL3BhdGhFcScpLFxuICBwYXRoT3I6IHJlcXVpcmUoJy4vc3JjL3BhdGhPcicpLFxuICBwYXRoU2F0aXNmaWVzOiByZXF1aXJlKCcuL3NyYy9wYXRoU2F0aXNmaWVzJyksXG4gIHBpY2s6IHJlcXVpcmUoJy4vc3JjL3BpY2snKSxcbiAgcGlja0FsbDogcmVxdWlyZSgnLi9zcmMvcGlja0FsbCcpLFxuICBwaWNrQnk6IHJlcXVpcmUoJy4vc3JjL3BpY2tCeScpLFxuICBwaXBlOiByZXF1aXJlKCcuL3NyYy9waXBlJyksXG4gIHBpcGVLOiByZXF1aXJlKCcuL3NyYy9waXBlSycpLFxuICBwaXBlUDogcmVxdWlyZSgnLi9zcmMvcGlwZVAnKSxcbiAgcGx1Y2s6IHJlcXVpcmUoJy4vc3JjL3BsdWNrJyksXG4gIHByZXBlbmQ6IHJlcXVpcmUoJy4vc3JjL3ByZXBlbmQnKSxcbiAgcHJvZHVjdDogcmVxdWlyZSgnLi9zcmMvcHJvZHVjdCcpLFxuICBwcm9qZWN0OiByZXF1aXJlKCcuL3NyYy9wcm9qZWN0JyksXG4gIHByb3A6IHJlcXVpcmUoJy4vc3JjL3Byb3AnKSxcbiAgcHJvcEVxOiByZXF1aXJlKCcuL3NyYy9wcm9wRXEnKSxcbiAgcHJvcElzOiByZXF1aXJlKCcuL3NyYy9wcm9wSXMnKSxcbiAgcHJvcE9yOiByZXF1aXJlKCcuL3NyYy9wcm9wT3InKSxcbiAgcHJvcFNhdGlzZmllczogcmVxdWlyZSgnLi9zcmMvcHJvcFNhdGlzZmllcycpLFxuICBwcm9wczogcmVxdWlyZSgnLi9zcmMvcHJvcHMnKSxcbiAgcmFuZ2U6IHJlcXVpcmUoJy4vc3JjL3JhbmdlJyksXG4gIHJlZHVjZTogcmVxdWlyZSgnLi9zcmMvcmVkdWNlJyksXG4gIHJlZHVjZUJ5OiByZXF1aXJlKCcuL3NyYy9yZWR1Y2VCeScpLFxuICByZWR1Y2VSaWdodDogcmVxdWlyZSgnLi9zcmMvcmVkdWNlUmlnaHQnKSxcbiAgcmVkdWNlV2hpbGU6IHJlcXVpcmUoJy4vc3JjL3JlZHVjZVdoaWxlJyksXG4gIHJlZHVjZWQ6IHJlcXVpcmUoJy4vc3JjL3JlZHVjZWQnKSxcbiAgcmVqZWN0OiByZXF1aXJlKCcuL3NyYy9yZWplY3QnKSxcbiAgcmVtb3ZlOiByZXF1aXJlKCcuL3NyYy9yZW1vdmUnKSxcbiAgcmVwZWF0OiByZXF1aXJlKCcuL3NyYy9yZXBlYXQnKSxcbiAgcmVwbGFjZTogcmVxdWlyZSgnLi9zcmMvcmVwbGFjZScpLFxuICByZXZlcnNlOiByZXF1aXJlKCcuL3NyYy9yZXZlcnNlJyksXG4gIHNjYW46IHJlcXVpcmUoJy4vc3JjL3NjYW4nKSxcbiAgc2VxdWVuY2U6IHJlcXVpcmUoJy4vc3JjL3NlcXVlbmNlJyksXG4gIHNldDogcmVxdWlyZSgnLi9zcmMvc2V0JyksXG4gIHNsaWNlOiByZXF1aXJlKCcuL3NyYy9zbGljZScpLFxuICBzb3J0OiByZXF1aXJlKCcuL3NyYy9zb3J0JyksXG4gIHNvcnRCeTogcmVxdWlyZSgnLi9zcmMvc29ydEJ5JyksXG4gIHNvcnRXaXRoOiByZXF1aXJlKCcuL3NyYy9zb3J0V2l0aCcpLFxuICBzcGxpdDogcmVxdWlyZSgnLi9zcmMvc3BsaXQnKSxcbiAgc3BsaXRBdDogcmVxdWlyZSgnLi9zcmMvc3BsaXRBdCcpLFxuICBzcGxpdEV2ZXJ5OiByZXF1aXJlKCcuL3NyYy9zcGxpdEV2ZXJ5JyksXG4gIHNwbGl0V2hlbjogcmVxdWlyZSgnLi9zcmMvc3BsaXRXaGVuJyksXG4gIHN1YnRyYWN0OiByZXF1aXJlKCcuL3NyYy9zdWJ0cmFjdCcpLFxuICBzdW06IHJlcXVpcmUoJy4vc3JjL3N1bScpLFxuICBzeW1tZXRyaWNEaWZmZXJlbmNlOiByZXF1aXJlKCcuL3NyYy9zeW1tZXRyaWNEaWZmZXJlbmNlJyksXG4gIHN5bW1ldHJpY0RpZmZlcmVuY2VXaXRoOiByZXF1aXJlKCcuL3NyYy9zeW1tZXRyaWNEaWZmZXJlbmNlV2l0aCcpLFxuICB0YWlsOiByZXF1aXJlKCcuL3NyYy90YWlsJyksXG4gIHRha2U6IHJlcXVpcmUoJy4vc3JjL3Rha2UnKSxcbiAgdGFrZUxhc3Q6IHJlcXVpcmUoJy4vc3JjL3Rha2VMYXN0JyksXG4gIHRha2VMYXN0V2hpbGU6IHJlcXVpcmUoJy4vc3JjL3Rha2VMYXN0V2hpbGUnKSxcbiAgdGFrZVdoaWxlOiByZXF1aXJlKCcuL3NyYy90YWtlV2hpbGUnKSxcbiAgdGFwOiByZXF1aXJlKCcuL3NyYy90YXAnKSxcbiAgdGVzdDogcmVxdWlyZSgnLi9zcmMvdGVzdCcpLFxuICB0aW1lczogcmVxdWlyZSgnLi9zcmMvdGltZXMnKSxcbiAgdG9Mb3dlcjogcmVxdWlyZSgnLi9zcmMvdG9Mb3dlcicpLFxuICB0b1BhaXJzOiByZXF1aXJlKCcuL3NyYy90b1BhaXJzJyksXG4gIHRvUGFpcnNJbjogcmVxdWlyZSgnLi9zcmMvdG9QYWlyc0luJyksXG4gIHRvU3RyaW5nOiByZXF1aXJlKCcuL3NyYy90b1N0cmluZycpLFxuICB0b1VwcGVyOiByZXF1aXJlKCcuL3NyYy90b1VwcGVyJyksXG4gIHRyYW5zZHVjZTogcmVxdWlyZSgnLi9zcmMvdHJhbnNkdWNlJyksXG4gIHRyYW5zcG9zZTogcmVxdWlyZSgnLi9zcmMvdHJhbnNwb3NlJyksXG4gIHRyYXZlcnNlOiByZXF1aXJlKCcuL3NyYy90cmF2ZXJzZScpLFxuICB0cmltOiByZXF1aXJlKCcuL3NyYy90cmltJyksXG4gIHRyeUNhdGNoOiByZXF1aXJlKCcuL3NyYy90cnlDYXRjaCcpLFxuICB0eXBlOiByZXF1aXJlKCcuL3NyYy90eXBlJyksXG4gIHVuYXBwbHk6IHJlcXVpcmUoJy4vc3JjL3VuYXBwbHknKSxcbiAgdW5hcnk6IHJlcXVpcmUoJy4vc3JjL3VuYXJ5JyksXG4gIHVuY3VycnlOOiByZXF1aXJlKCcuL3NyYy91bmN1cnJ5TicpLFxuICB1bmZvbGQ6IHJlcXVpcmUoJy4vc3JjL3VuZm9sZCcpLFxuICB1bmlvbjogcmVxdWlyZSgnLi9zcmMvdW5pb24nKSxcbiAgdW5pb25XaXRoOiByZXF1aXJlKCcuL3NyYy91bmlvbldpdGgnKSxcbiAgdW5pcTogcmVxdWlyZSgnLi9zcmMvdW5pcScpLFxuICB1bmlxQnk6IHJlcXVpcmUoJy4vc3JjL3VuaXFCeScpLFxuICB1bmlxV2l0aDogcmVxdWlyZSgnLi9zcmMvdW5pcVdpdGgnKSxcbiAgdW5sZXNzOiByZXF1aXJlKCcuL3NyYy91bmxlc3MnKSxcbiAgdW5uZXN0OiByZXF1aXJlKCcuL3NyYy91bm5lc3QnKSxcbiAgdW50aWw6IHJlcXVpcmUoJy4vc3JjL3VudGlsJyksXG4gIHVwZGF0ZTogcmVxdWlyZSgnLi9zcmMvdXBkYXRlJyksXG4gIHVzZVdpdGg6IHJlcXVpcmUoJy4vc3JjL3VzZVdpdGgnKSxcbiAgdmFsdWVzOiByZXF1aXJlKCcuL3NyYy92YWx1ZXMnKSxcbiAgdmFsdWVzSW46IHJlcXVpcmUoJy4vc3JjL3ZhbHVlc0luJyksXG4gIHZpZXc6IHJlcXVpcmUoJy4vc3JjL3ZpZXcnKSxcbiAgd2hlbjogcmVxdWlyZSgnLi9zcmMvd2hlbicpLFxuICB3aGVyZTogcmVxdWlyZSgnLi9zcmMvd2hlcmUnKSxcbiAgd2hlcmVFcTogcmVxdWlyZSgnLi9zcmMvd2hlcmVFcScpLFxuICB3aXRob3V0OiByZXF1aXJlKCcuL3NyYy93aXRob3V0JyksXG4gIHhwcm9kOiByZXF1aXJlKCcuL3NyYy94cHJvZCcpLFxuICB6aXA6IHJlcXVpcmUoJy4vc3JjL3ppcCcpLFxuICB6aXBPYmo6IHJlcXVpcmUoJy4vc3JjL3ppcE9iaicpLFxuICB6aXBXaXRoOiByZXF1aXJlKCcuL3NyYy96aXBXaXRoJylcbn07XG4iLCJcbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG52YXIgaW5pdGVkID0gZmFsc2U7XG5mdW5jdGlvbiBpbml0ICgpIHtcbiAgaW5pdGVkID0gdHJ1ZTtcbiAgdmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gICAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG4gIH1cblxuICByZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbiAgcmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIGlmICghaW5pdGVkKSB7XG4gICAgaW5pdCgpO1xuICB9XG4gIHZhciBpLCBqLCBsLCB0bXAsIHBsYWNlSG9sZGVycywgYXJyXG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cbiAgaWYgKGxlbiAlIDQgPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0JylcbiAgfVxuXG4gIC8vIHRoZSBudW1iZXIgb2YgZXF1YWwgc2lnbnMgKHBsYWNlIGhvbGRlcnMpXG4gIC8vIGlmIHRoZXJlIGFyZSB0d28gcGxhY2Vob2xkZXJzLCB0aGFuIHRoZSB0d28gY2hhcmFjdGVycyBiZWZvcmUgaXRcbiAgLy8gcmVwcmVzZW50IG9uZSBieXRlXG4gIC8vIGlmIHRoZXJlIGlzIG9ubHkgb25lLCB0aGVuIHRoZSB0aHJlZSBjaGFyYWN0ZXJzIGJlZm9yZSBpdCByZXByZXNlbnQgMiBieXRlc1xuICAvLyB0aGlzIGlzIGp1c3QgYSBjaGVhcCBoYWNrIHRvIG5vdCBkbyBpbmRleE9mIHR3aWNlXG4gIHBsYWNlSG9sZGVycyA9IGI2NFtsZW4gLSAyXSA9PT0gJz0nID8gMiA6IGI2NFtsZW4gLSAxXSA9PT0gJz0nID8gMSA6IDBcblxuICAvLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbiAgYXJyID0gbmV3IEFycihsZW4gKiAzIC8gNCAtIHBsYWNlSG9sZGVycylcblxuICAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG4gIGwgPSBwbGFjZUhvbGRlcnMgPiAwID8gbGVuIC0gNCA6IGxlblxuXG4gIHZhciBMID0gMFxuXG4gIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgbDsgaSArPSA0LCBqICs9IDMpIHtcbiAgICB0bXAgPSAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgMTIpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHwgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltMKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbTCsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnMgPT09IDIpIHtcbiAgICB0bXAgPSAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAyKSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KVxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9IGVsc2UgaWYgKHBsYWNlSG9sZGVycyA9PT0gMSkge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCA0KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKVxuICAgIGFycltMKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbTCsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcbiAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiAweDNGXSArIGxvb2t1cFtudW0gPj4gMTIgJiAweDNGXSArIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICsgbG9va3VwW251bSAmIDB4M0ZdXG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rICh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wXG4gIHZhciBvdXRwdXQgPSBbXVxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgIHRtcCA9ICh1aW50OFtpXSA8PCAxNikgKyAodWludDhbaSArIDFdIDw8IDgpICsgKHVpbnQ4W2kgKyAyXSlcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICBpZiAoIWluaXRlZCkge1xuICAgIGluaXQoKTtcbiAgfVxuICB2YXIgdG1wXG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGhcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBvdXRwdXQgPSAnJ1xuICB2YXIgcGFydHMgPSBbXVxuICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDNcblxuICAvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG4gIGZvciAodmFyIGkgPSAwLCBsZW4yID0gbGVuIC0gZXh0cmFCeXRlczsgaSA8IGxlbjI7IGkgKz0gbWF4Q2h1bmtMZW5ndGgpIHtcbiAgICBwYXJ0cy5wdXNoKGVuY29kZUNodW5rKHVpbnQ4LCBpLCAoaSArIG1heENodW5rTGVuZ3RoKSA+IGxlbjIgPyBsZW4yIDogKGkgKyBtYXhDaHVua0xlbmd0aCkpKVxuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFt0bXAgPj4gMl1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgNCkgJiAweDNGXVxuICAgIG91dHB1dCArPSAnPT0nXG4gIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA9PT0gMikge1xuICAgIHRtcCA9ICh1aW50OFtsZW4gLSAyXSA8PCA4KSArICh1aW50OFtsZW4gLSAxXSlcbiAgICBvdXRwdXQgKz0gbG9va3VwW3RtcCA+PiAxMF1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXVxuICAgIG91dHB1dCArPSBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdXG4gICAgb3V0cHV0ICs9ICc9J1xuICB9XG5cbiAgcGFydHMucHVzaChvdXRwdXQpXG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG4iLCJcbmV4cG9ydCBmdW5jdGlvbiByZWFkIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IGUgKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKHZhbHVlICogYyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbmV4cG9ydCBkZWZhdWx0IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuXG5pbXBvcnQgKiBhcyBiYXNlNjQgZnJvbSAnLi9iYXNlNjQnXG5pbXBvcnQgKiBhcyBpZWVlNzU0IGZyb20gJy4vaWVlZTc1NCdcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheSdcblxuZXhwb3J0IHZhciBJTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIER1ZSB0byB2YXJpb3VzIGJyb3dzZXIgYnVncywgc29tZXRpbWVzIHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkIGV2ZW5cbiAqIHdoZW4gdGhlIGJyb3dzZXIgc3VwcG9ydHMgdHlwZWQgYXJyYXlzLlxuICpcbiAqIE5vdGU6XG4gKlxuICogICAtIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcyxcbiAqICAgICBTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOC5cbiAqXG4gKiAgIC0gQ2hyb21lIDktMTAgaXMgbWlzc2luZyB0aGUgYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbi5cbiAqXG4gKiAgIC0gSUUxMCBoYXMgYSBicm9rZW4gYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFycmF5cyBvZlxuICogICAgIGluY29ycmVjdCBsZW5ndGggaW4gc29tZSBzaXR1YXRpb25zLlxuXG4gKiBXZSBkZXRlY3QgdGhlc2UgYnVnZ3kgYnJvd3NlcnMgYW5kIHNldCBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgIHRvIGBmYWxzZWAgc28gdGhleVxuICogZ2V0IHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIHNsb3dlciBidXQgYmVoYXZlcyBjb3JyZWN0bHkuXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlQgIT09IHVuZGVmaW5lZFxuICA/IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gIDogdHJ1ZVxuXG4vKlxuICogRXhwb3J0IGtNYXhMZW5ndGggYWZ0ZXIgdHlwZWQgYXJyYXkgc3VwcG9ydCBpcyBkZXRlcm1pbmVkLlxuICovXG52YXIgX2tNYXhMZW5ndGggPSBrTWF4TGVuZ3RoKClcbmV4cG9ydCB7X2tNYXhMZW5ndGggYXMga01heExlbmd0aH07XG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIHJldHVybiB0cnVlO1xuICAvLyByb2xsdXAgaXNzdWVzXG4gIC8vIHRyeSB7XG4gIC8vICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gIC8vICAgYXJyLl9fcHJvdG9fXyA9IHtcbiAgLy8gICAgIF9fcHJvdG9fXzogVWludDhBcnJheS5wcm90b3R5cGUsXG4gIC8vICAgICBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH1cbiAgLy8gICB9XG4gIC8vICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDIgJiYgLy8gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWRcbiAgLy8gICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBjaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgLy8gICAgICAgYXJyLnN1YmFycmF5KDEsIDEpLmJ5dGVMZW5ndGggPT09IDAgLy8gaWUxMCBoYXMgYnJva2VuIGBzdWJhcnJheWBcbiAgLy8gfSBjYXRjaCAoZSkge1xuICAvLyAgIHJldHVybiBmYWxzZVxuICAvLyB9XG59XG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGggKCkge1xuICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgICA/IDB4N2ZmZmZmZmZcbiAgICA6IDB4M2ZmZmZmZmZcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKGtNYXhMZW5ndGgoKSA8IGxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpXG4gIH1cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgaWYgKHRoYXQgPT09IG51bGwpIHtcbiAgICAgIHRoYXQgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgICB9XG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIEJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiAhKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZSh0aGlzLCBhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20odGhpcywgYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG4vLyBUT0RPOiBMZWdhY3ksIG5vdCBuZWVkZWQgYW55bW9yZS4gUmVtb3ZlIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbkJ1ZmZlci5fYXVnbWVudCA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgYXJyLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiBmcm9tICh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuXG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0KVxuICB9XG5cbiAgcmV0dXJuIGZyb21PYmplY3QodGhhdCwgdmFsdWUpXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20obnVsbCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbiAgQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5zcGVjaWVzICYmXG4gICAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIHtcbiAgICAvLyBGaXggc3ViYXJyYXkoKSBpbiBFUzIwMTYuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC85N1xuICAgIC8vIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIsIFN5bWJvbC5zcGVjaWVzLCB7XG4gICAgLy8gICB2YWx1ZTogbnVsbCxcbiAgICAvLyAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIC8vIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFsbG9jICh0aGF0LCBzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG4gIH1cbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgIC8vIGJlIGludGVycHJldHRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJ1xuICAgICAgPyBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICAgIDogY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbClcbiAgfVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBhbGxvYyhudWxsLCBzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHRoYXQsIHNpemUpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUgPCAwID8gMCA6IGNoZWNrZWQoc2l6ZSkgfCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpIHtcbiAgICAgIHRoYXRbaV0gPSAwXG4gICAgfVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqICovXG5CdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn1cbi8qKlxuICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAodGhhdCwgc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImVuY29kaW5nXCIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpXG4gIH1cblxuICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG5cbiAgdmFyIGFjdHVhbCA9IHRoYXQud3JpdGUoc3RyaW5nLCBlbmNvZGluZylcblxuICBpZiAoYWN0dWFsICE9PSBsZW5ndGgpIHtcbiAgICAvLyBXcml0aW5nIGEgaGV4IHN0cmluZywgZm9yIGV4YW1wbGUsIHRoYXQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIHdpbGxcbiAgICAvLyBjYXVzZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXJhY3RlciB0byBiZSBpZ25vcmVkLiAoZS5nLlxuICAgIC8vICdhYnh4Y2QnIHdpbGwgYmUgdHJlYXRlZCBhcyAnYWInKVxuICAgIHRoYXQgPSB0aGF0LnNsaWNlKDAsIGFjdHVhbClcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGggPCAwID8gMCA6IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKHRoYXQsIGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgYXJyYXkuYnl0ZUxlbmd0aCAvLyB0aGlzIHRocm93cyBpZiBgYXJyYXlgIGlzIG5vdCBhIHZhbGlkIEFycmF5QnVmZmVyXG5cbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ29mZnNldFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnbGVuZ3RoXFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0KVxuICB9IGVsc2Uge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBhcnJheVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICB0aGF0ID0gZnJvbUFycmF5TGlrZSh0aGF0LCBhcnJheSlcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0ICh0aGF0LCBvYmopIHtcbiAgaWYgKGludGVybmFsSXNCdWZmZXIob2JqKSkge1xuICAgIHZhciBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMFxuICAgIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuKVxuXG4gICAgaWYgKHRoYXQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhhdFxuICAgIH1cblxuICAgIG9iai5jb3B5KHRoYXQsIDAsIDAsIGxlbilcbiAgICByZXR1cm4gdGhhdFxuICB9XG5cbiAgaWYgKG9iaikge1xuICAgIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBvYmouYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHx8ICdsZW5ndGgnIGluIG9iaikge1xuICAgICAgaWYgKHR5cGVvZiBvYmoubGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBpc25hbihvYmoubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIDApXG4gICAgICB9XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmopXG4gICAgfVxuXG4gICAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBpc0FycmF5KG9iai5kYXRhKSkge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqLmRhdGEpXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LicpXG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBrTWF4TGVuZ3RoKClgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIGtNYXhMZW5ndGgoKS50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5leHBvcnQgZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5CdWZmZXIuaXNCdWZmZXIgPSBpc0J1ZmZlcjtcbmZ1bmN0aW9uIGludGVybmFsSXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuICEhKGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlcilcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmICghaW50ZXJuYWxJc0J1ZmZlcihhKSB8fCAhaW50ZXJuYWxJc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aFxuICB2YXIgeSA9IGIubGVuZ3RoXG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV1cbiAgICAgIHkgPSBiW2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdsYXRpbjEnOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghaXNBcnJheShsaXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gIH1cblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICB2YXIgaVxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSAwXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgIGxlbmd0aCArPSBsaXN0W2ldLmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIHZhciBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKVxuICB2YXIgcG9zID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgIHZhciBidWYgPSBsaXN0W2ldXG4gICAgaWYgKCFpbnRlcm5hbElzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfVxuICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgIHBvcyArPSBidWYubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlclxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmIChpbnRlcm5hbElzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBzdHJpbmcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZ1xuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCBhbmQgYGlzLWJ1ZmZlcmAgKGluIFNhZmFyaSA1LTcpIHRvIGRldGVjdFxuLy8gQnVmZmVyIGluc3RhbmNlcy5cbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIWludGVybmFsSXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICB2YXIgc3RyID0gJydcbiAgdmFyIG1heCA9IElOU1BFQ1RfTUFYX0JZVEVTXG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLm1hdGNoKC8uezJ9L2cpLmpvaW4oJyAnKVxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICdcbiAgfVxuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoIWludGVybmFsSXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKGlzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChpbnRlcm5hbElzQnVmZmVyKHZhbCkpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZy9idWZmZXIgYWx3YXlzIGZhaWxzXG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMHhGRiAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmXG4gICAgICAgIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFsgdmFsIF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIHZhciBpbmRleFNpemUgPSAxXG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoXG4gIHZhciB2YWxMZW5ndGggPSB2YWwubGVuZ3RoXG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8XG4gICAgICAgIGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICAgIGluZGV4U2l6ZSA9IDJcbiAgICAgIGFyckxlbmd0aCAvPSAyXG4gICAgICB2YWxMZW5ndGggLz0gMlxuICAgICAgYnl0ZU9mZnNldCAvPSAyXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZCAoYnVmLCBpKSB7XG4gICAgaWYgKGluZGV4U2l6ZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIGJ1ZltpXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKVxuICAgIH1cbiAgfVxuXG4gIHZhciBpXG4gIGlmIChkaXIpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVhZChhcnIsIGkpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXgpKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsTGVuZ3RoKSByZXR1cm4gZm91bmRJbmRleCAqIGluZGV4U2l6ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aFxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZm91bmQgPSB0cnVlXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgdHJ1ZSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICAvLyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGRpZ2l0c1xuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAoc3RyTGVuICUgMiAhPT0gMCkgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJylcblxuICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikge1xuICAgIGxlbmd0aCA9IHN0ckxlbiAvIDJcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHBhcnNlZCA9IHBhcnNlSW50KHN0cmluZy5zdWJzdHIoaSAqIDIsIDIpLCAxNilcbiAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuIGlcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBwYXJzZWRcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiB1dGY4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBhc2NpaVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGxhdGluMVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgMFxuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICB9XG4gIC8vIGxlZ2FjeSB3cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aCkgLSByZW1vdmUgaW4gdjAuMTNcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBsYXRpbjFTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSArIDFdICogMjU2KVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWZcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKVxuICAgIG5ld0J1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgdmFyIHNsaWNlTGVuID0gZW5kIC0gc3RhcnRcbiAgICBuZXdCdWYgPSBuZXcgQnVmZmVyKHNsaWNlTGVuLCB1bmRlZmluZWQpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGljZUxlbjsgKytpKSB7XG4gICAgICBuZXdCdWZbaV0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3QnVmXG59XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aFxuICB2YXIgbXVsID0gMVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldXG4gIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghaW50ZXJuYWxJc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDE2IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDIpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgKDB4ZmYgPDwgKDggKiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSkpKSA+Pj5cbiAgICAgIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpICogOFxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCA0KTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSA+Pj4gKGxpdHRsZUVuZGlhbiA/IGkgOiAzIC0gaSkgKiA4KSAmIDB4ZmZcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDBcbiAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcbiAgdmFyIGlcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSBpZiAobGVuIDwgMTAwMCB8fCAhQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBhc2NlbmRpbmcgY29weSBmcm9tIHN0YXJ0XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgbGVuKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmIChjb2RlIDwgMjU2KSB7XG4gICAgICAgIHZhbCA9IGNvZGVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTVcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IGludGVybmFsSXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIGlzbmFuICh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gdmFsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG5cblxuLy8gdGhlIGZvbGxvd2luZyBpcyBmcm9tIGlzLWJ1ZmZlciwgYWxzbyBieSBGZXJvc3MgQWJvdWtoYWRpamVoIGFuZCB3aXRoIHNhbWUgbGlzZW5jZVxuLy8gVGhlIF9pc0J1ZmZlciBjaGVjayBpcyBmb3IgU2FmYXJpIDUtNyBzdXBwb3J0LCBiZWNhdXNlIGl0J3MgbWlzc2luZ1xuLy8gT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseVxuZXhwb3J0IGZ1bmN0aW9uIGlzQnVmZmVyKG9iaikge1xuICByZXR1cm4gb2JqICE9IG51bGwgJiYgKCEhb2JqLl9pc0J1ZmZlciB8fCBpc0Zhc3RCdWZmZXIob2JqKSB8fCBpc1Nsb3dCdWZmZXIob2JqKSlcbn1cblxuZnVuY3Rpb24gaXNGYXN0QnVmZmVyIChvYmopIHtcbiAgcmV0dXJuICEhb2JqLmNvbnN0cnVjdG9yICYmIHR5cGVvZiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iailcbn1cblxuLy8gRm9yIE5vZGUgdjAuMTAgc3VwcG9ydC4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseS5cbmZ1bmN0aW9uIGlzU2xvd0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqLnJlYWRGbG9hdExFID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouc2xpY2UgPT09ICdmdW5jdGlvbicgJiYgaXNGYXN0QnVmZmVyKG9iai5zbGljZSgwLCAwKSlcbn1cbiIsIlxudmFyIGluaGVyaXRzO1xuaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKXtcbiAgaW5oZXJpdHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xufSBlbHNlIHtcbiAgaW5oZXJpdHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgaW5oZXJpdHM7XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbmltcG9ydCBwcm9jZXNzIGZyb20gJ3Byb2Nlc3MnO1xudmFyIGZvcm1hdFJlZ0V4cCA9IC8lW3NkaiVdL2c7XG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0KGYpIHtcbiAgaWYgKCFpc1N0cmluZyhmKSkge1xuICAgIHZhciBvYmplY3RzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2YXIgaSA9IDE7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcbiAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuICAgIHN3aXRjaCAoeCkge1xuICAgICAgY2FzZSAnJXMnOiByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclZCc6IHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVqJzpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKSB7XG4gICAgaWYgKGlzTnVsbCh4KSB8fCAhaXNPYmplY3QoeCkpIHtcbiAgICAgIHN0ciArPSAnICcgKyB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJyAnICsgaW5zcGVjdCh4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn07XG5cblxuLy8gTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbi8vIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4vLyBJZiAtLW5vLWRlcHJlY2F0aW9uIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuZXhwb3J0IGZ1bmN0aW9uIGRlcHJlY2F0ZShmbiwgbXNnKSB7XG4gIC8vIEFsbG93IGZvciBkZXByZWNhdGluZyB0aGluZ3MgaW4gdGhlIHByb2Nlc3Mgb2Ygc3RhcnRpbmcgdXAuXG4gIGlmIChpc1VuZGVmaW5lZChnbG9iYWwucHJvY2VzcykpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZGVwcmVjYXRlKGZuLCBtc2cpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLm5vRGVwcmVjYXRpb24gPT09IHRydWUpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChwcm9jZXNzLnRocm93RGVwcmVjYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MudHJhY2VEZXByZWNhdGlvbikge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufTtcblxuXG52YXIgZGVidWdzID0ge307XG52YXIgZGVidWdFbnZpcm9uO1xuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnbG9nKHNldCkge1xuICBpZiAoaXNVbmRlZmluZWQoZGVidWdFbnZpcm9uKSlcbiAgICBkZWJ1Z0Vudmlyb24gPSBwcm9jZXNzLmVudi5OT0RFX0RFQlVHIHx8ICcnO1xuICBzZXQgPSBzZXQudG9VcHBlckNhc2UoKTtcbiAgaWYgKCFkZWJ1Z3Nbc2V0XSkge1xuICAgIGlmIChuZXcgUmVnRXhwKCdcXFxcYicgKyBzZXQgKyAnXFxcXGInLCAnaScpLnRlc3QoZGVidWdFbnZpcm9uKSkge1xuICAgICAgdmFyIHBpZCA9IDA7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbXNnID0gZm9ybWF0LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyVzICVkOiAlcycsIHNldCwgcGlkLCBtc2cpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHt9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVidWdzW3NldF07XG59O1xuXG5cbi8qKlxuICogRWNob3MgdGhlIHZhbHVlIG9mIGEgdmFsdWUuIFRyeXMgdG8gcHJpbnQgdGhlIHZhbHVlIG91dFxuICogaW4gdGhlIGJlc3Qgd2F5IHBvc3NpYmxlIGdpdmVuIHRoZSBkaWZmZXJlbnQgdHlwZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHByaW50IG91dC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSBvdXRwdXQuXG4gKi9cbi8qIGxlZ2FjeTogb2JqLCBzaG93SGlkZGVuLCBkZXB0aCwgY29sb3JzKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgX2V4dGVuZChjdHgsIG9wdHMpO1xuICB9XG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5zaG93SGlkZGVuKSkgY3R4LnNob3dIaWRkZW4gPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpIGN0eC5kZXB0aCA9IDI7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY29sb3JzKSkgY3R4LmNvbG9ycyA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmN1c3RvbUluc3BlY3QpKSBjdHguY3VzdG9tSW5zcGVjdCA9IHRydWU7XG4gIGlmIChjdHguY29sb3JzKSBjdHguc3R5bGl6ZSA9IHN0eWxpemVXaXRoQ29sb3I7XG4gIHJldHVybiBmb3JtYXRWYWx1ZShjdHgsIG9iaiwgY3R4LmRlcHRoKTtcbn1cblxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlI2dyYXBoaWNzXG5pbnNwZWN0LmNvbG9ycyA9IHtcbiAgJ2JvbGQnIDogWzEsIDIyXSxcbiAgJ2l0YWxpYycgOiBbMywgMjNdLFxuICAndW5kZXJsaW5lJyA6IFs0LCAyNF0sXG4gICdpbnZlcnNlJyA6IFs3LCAyN10sXG4gICd3aGl0ZScgOiBbMzcsIDM5XSxcbiAgJ2dyZXknIDogWzkwLCAzOV0sXG4gICdibGFjaycgOiBbMzAsIDM5XSxcbiAgJ2JsdWUnIDogWzM0LCAzOV0sXG4gICdjeWFuJyA6IFszNiwgMzldLFxuICAnZ3JlZW4nIDogWzMyLCAzOV0sXG4gICdtYWdlbnRhJyA6IFszNSwgMzldLFxuICAncmVkJyA6IFszMSwgMzldLFxuICAneWVsbG93JyA6IFszMywgMzldXG59O1xuXG4vLyBEb24ndCB1c2UgJ2JsdWUnIG5vdCB2aXNpYmxlIG9uIGNtZC5leGVcbmluc3BlY3Quc3R5bGVzID0ge1xuICAnc3BlY2lhbCc6ICdjeWFuJyxcbiAgJ251bWJlcic6ICd5ZWxsb3cnLFxuICAnYm9vbGVhbic6ICd5ZWxsb3cnLFxuICAndW5kZWZpbmVkJzogJ2dyZXknLFxuICAnbnVsbCc6ICdib2xkJyxcbiAgJ3N0cmluZyc6ICdncmVlbicsXG4gICdkYXRlJzogJ21hZ2VudGEnLFxuICAvLyBcIm5hbWVcIjogaW50ZW50aW9uYWxseSBub3Qgc3R5bGluZ1xuICAncmVnZXhwJzogJ3JlZCdcbn07XG5cblxuZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICB2YXIgc3R5bGUgPSBpbnNwZWN0LnN0eWxlc1tzdHlsZVR5cGVdO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIHJldHVybiAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdICsgJ20nICsgc3RyICtcbiAgICAgICAgICAgJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVsxXSArICdtJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc3R5bGl6ZU5vQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgcmV0dXJuIHN0cjtcbn1cblxuXG5mdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSkge1xuICB2YXIgaGFzaCA9IHt9O1xuXG4gIGFycmF5LmZvckVhY2goZnVuY3Rpb24odmFsLCBpZHgpIHtcbiAgICBoYXNoW3ZhbF0gPSB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gaGFzaDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMpIHtcbiAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHVzZXItc3BlY2lmaWVkIGluc3BlY3QgZnVuY3Rpb25zLlxuICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcbiAgaWYgKGN0eC5jdXN0b21JbnNwZWN0ICYmXG4gICAgICB2YWx1ZSAmJlxuICAgICAgaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSAmJlxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICB2YWx1ZS5pbnNwZWN0ICE9PSBpbnNwZWN0ICYmXG4gICAgICAvLyBBbHNvIGZpbHRlciBvdXQgYW55IHByb3RvdHlwZSBvYmplY3RzIHVzaW5nIHRoZSBjaXJjdWxhciBjaGVjay5cbiAgICAgICEodmFsdWUuY29uc3RydWN0b3IgJiYgdmFsdWUuY29uc3RydWN0b3IucHJvdG90eXBlID09PSB2YWx1ZSkpIHtcbiAgICB2YXIgcmV0ID0gdmFsdWUuaW5zcGVjdChyZWN1cnNlVGltZXMsIGN0eCk7XG4gICAgaWYgKCFpc1N0cmluZyhyZXQpKSB7XG4gICAgICByZXQgPSBmb3JtYXRWYWx1ZShjdHgsIHJldCwgcmVjdXJzZVRpbWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8vIFByaW1pdGl2ZSB0eXBlcyBjYW5ub3QgaGF2ZSBwcm9wZXJ0aWVzXG4gIHZhciBwcmltaXRpdmUgPSBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSk7XG4gIGlmIChwcmltaXRpdmUpIHtcbiAgICByZXR1cm4gcHJpbWl0aXZlO1xuICB9XG5cbiAgLy8gTG9vayB1cCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0LlxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgdmFyIHZpc2libGVLZXlzID0gYXJyYXlUb0hhc2goa2V5cyk7XG5cbiAgaWYgKGN0eC5zaG93SGlkZGVuKSB7XG4gICAga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKTtcbiAgfVxuXG4gIC8vIElFIGRvZXNuJ3QgbWFrZSBlcnJvciBmaWVsZHMgbm9uLWVudW1lcmFibGVcbiAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2R3dzUyc2J0KHY9dnMuOTQpLmFzcHhcbiAgaWYgKGlzRXJyb3IodmFsdWUpXG4gICAgICAmJiAoa2V5cy5pbmRleE9mKCdtZXNzYWdlJykgPj0gMCB8fCBrZXlzLmluZGV4T2YoJ2Rlc2NyaXB0aW9uJykgPj0gMCkpIHtcbiAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgLy8gU29tZSB0eXBlIG9mIG9iamVjdCB3aXRob3V0IHByb3BlcnRpZXMgY2FuIGJlIHNob3J0Y3V0dGVkLlxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHZhciBuYW1lID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tGdW5jdGlvbicgKyBuYW1lICsgJ10nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH1cbiAgICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAnZGF0ZScpO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGJhc2UgPSAnJywgYXJyYXkgPSBmYWxzZSwgYnJhY2VzID0gWyd7JywgJ30nXTtcblxuICAvLyBNYWtlIEFycmF5IHNheSB0aGF0IHRoZXkgYXJlIEFycmF5XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGFycmF5ID0gdHJ1ZTtcbiAgICBicmFjZXMgPSBbJ1snLCAnXSddO1xuICB9XG5cbiAgLy8gTWFrZSBmdW5jdGlvbnMgc2F5IHRoYXQgdGhleSBhcmUgZnVuY3Rpb25zXG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHZhciBuID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgYmFzZSA9ICcgW0Z1bmN0aW9uJyArIG4gKyAnXSc7XG4gIH1cblxuICAvLyBNYWtlIFJlZ0V4cHMgc2F5IHRoYXQgdGhleSBhcmUgUmVnRXhwc1xuICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGRhdGVzIHdpdGggcHJvcGVydGllcyBmaXJzdCBzYXkgdGhlIGRhdGVcbiAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGVycm9yIHdpdGggbWVzc2FnZSBmaXJzdCBzYXkgdGhlIGVycm9yXG4gIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDAgJiYgKCFhcnJheSB8fCB2YWx1ZS5sZW5ndGggPT0gMCkpIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArIGJyYWNlc1sxXTtcbiAgfVxuXG4gIGlmIChyZWN1cnNlVGltZXMgPCAwKSB7XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbT2JqZWN0XScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG5cbiAgY3R4LnNlZW4ucHVzaCh2YWx1ZSk7XG5cbiAgdmFyIG91dHB1dDtcbiAgaWYgKGFycmF5KSB7XG4gICAgb3V0cHV0ID0gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cyk7XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0ID0ga2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSk7XG4gICAgfSk7XG4gIH1cblxuICBjdHguc2Vlbi5wb3AoKTtcblxuICByZXR1cm4gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKSB7XG4gIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyk7XG4gIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICB2YXIgc2ltcGxlID0gJ1xcJycgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkucmVwbGFjZSgvXlwifFwiJC9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJykgKyAnXFwnJztcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoc2ltcGxlLCAnc3RyaW5nJyk7XG4gIH1cbiAgaWYgKGlzTnVtYmVyKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ251bWJlcicpO1xuICBpZiAoaXNCb29sZWFuKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ2Jvb2xlYW4nKTtcbiAgLy8gRm9yIHNvbWUgcmVhc29uIHR5cGVvZiBudWxsIGlzIFwib2JqZWN0XCIsIHNvIHNwZWNpYWwgY2FzZSBoZXJlLlxuICBpZiAoaXNOdWxsKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ251bGwnLCAnbnVsbCcpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEVycm9yKHZhbHVlKSB7XG4gIHJldHVybiAnWycgKyBFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgKyAnXSc7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIGZvciAodmFyIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5KHZhbHVlLCBTdHJpbmcoaSkpKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIFN0cmluZyhpKSwgdHJ1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgfVxuICB9XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoIWtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAga2V5LCB0cnVlKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KSB7XG4gIHZhciBuYW1lLCBzdHIsIGRlc2M7XG4gIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpIHx8IHsgdmFsdWU6IHZhbHVlW2tleV0gfTtcbiAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlci9TZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoIWhhc093blByb3BlcnR5KHZpc2libGVLZXlzLCBrZXkpKSB7XG4gICAgbmFtZSA9ICdbJyArIGtleSArICddJztcbiAgfVxuICBpZiAoIXN0cikge1xuICAgIGlmIChjdHguc2Vlbi5pbmRleE9mKGRlc2MudmFsdWUpIDwgMCkge1xuICAgICAgaWYgKGlzTnVsbChyZWN1cnNlVGltZXMpKSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIHJlY3Vyc2VUaW1lcyAtIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdcXG4nKSA+IC0xKSB7XG4gICAgICAgIGlmIChhcnJheSkge1xuICAgICAgICAgIHN0ciA9IHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKS5zdWJzdHIoMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyID0gJ1xcbicgKyBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbQ2lyY3VsYXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgaWYgKGFycmF5ICYmIGtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIG5hbWUgPSBKU09OLnN0cmluZ2lmeSgnJyArIGtleSk7XG4gICAgaWYgKG5hbWUubWF0Y2goL15cIihbYS16QS1aX11bYS16QS1aXzAtOV0qKVwiJC8pKSB7XG4gICAgICBuYW1lID0gbmFtZS5zdWJzdHIoMSwgbmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnbmFtZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKF5cInxcIiQpL2csIFwiJ1wiKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5hbWUgKyAnOiAnICsgc3RyO1xufVxuXG5cbmZ1bmN0aW9uIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKSB7XG4gIHZhciBudW1MaW5lc0VzdCA9IDA7XG4gIHZhciBsZW5ndGggPSBvdXRwdXQucmVkdWNlKGZ1bmN0aW9uKHByZXYsIGN1cikge1xuICAgIG51bUxpbmVzRXN0Kys7XG4gICAgaWYgKGN1ci5pbmRleE9mKCdcXG4nKSA+PSAwKSBudW1MaW5lc0VzdCsrO1xuICAgIHJldHVybiBwcmV2ICsgY3VyLnJlcGxhY2UoL1xcdTAwMWJcXFtcXGRcXGQ/bS9nLCAnJykubGVuZ3RoICsgMTtcbiAgfSwgMCk7XG5cbiAgaWYgKGxlbmd0aCA+IDYwKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArXG4gICAgICAgICAgIChiYXNlID09PSAnJyA/ICcnIDogYmFzZSArICdcXG4gJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBvdXRwdXQuam9pbignLFxcbiAgJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBicmFjZXNbMV07XG4gIH1cblxuICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArICcgJyArIG91dHB1dC5qb2luKCcsICcpICsgJyAnICsgYnJhY2VzWzFdO1xufVxuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGQpICYmIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGUpICYmXG4gICAgICAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0J1ZmZlcihtYXliZUJ1Zikge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG1heWJlQnVmKTtcbn1cblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuXG5cbmZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuLnRvU3RyaW5nKDEwKSA6IG4udG9TdHJpbmcoMTApO1xufVxuXG5cbnZhciBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJyxcbiAgICAgICAgICAgICAgJ09jdCcsICdOb3YnLCAnRGVjJ107XG5cbi8vIDI2IEZlYiAxNjoxOTozNFxuZnVuY3Rpb24gdGltZXN0YW1wKCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gIHZhciB0aW1lID0gW3BhZChkLmdldEhvdXJzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRNaW51dGVzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRTZWNvbmRzKCkpXS5qb2luKCc6Jyk7XG4gIHJldHVybiBbZC5nZXREYXRlKCksIG1vbnRoc1tkLmdldE1vbnRoKCldLCB0aW1lXS5qb2luKCcgJyk7XG59XG5cblxuLy8gbG9nIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgdG8gY29uc29sZS5sb2cgdGhhdCBwcmVwZW5kcyBhIHRpbWVzdGFtcFxuZXhwb3J0IGZ1bmN0aW9uIGxvZygpIHtcbiAgY29uc29sZS5sb2coJyVzIC0gJXMnLCB0aW1lc3RhbXAoKSwgZm9ybWF0LmFwcGx5KG51bGwsIGFyZ3VtZW50cykpO1xufVxuXG5cbi8qKlxuICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLlxuICpcbiAqIFRoZSBGdW5jdGlvbi5wcm90b3R5cGUuaW5oZXJpdHMgZnJvbSBsYW5nLmpzIHJld3JpdHRlbiBhcyBhIHN0YW5kYWxvbmVcbiAqIGZ1bmN0aW9uIChub3Qgb24gRnVuY3Rpb24ucHJvdG90eXBlKS4gTk9URTogSWYgdGhpcyBmaWxlIGlzIHRvIGJlIGxvYWRlZFxuICogZHVyaW5nIGJvb3RzdHJhcHBpbmcgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSByZXdyaXR0ZW4gdXNpbmcgc29tZSBuYXRpdmVcbiAqIGZ1bmN0aW9ucyBhcyBwcm90b3R5cGUgc2V0dXAgdXNpbmcgbm9ybWFsIEphdmFTY3JpcHQgZG9lcyBub3Qgd29yayBhc1xuICogZXhwZWN0ZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcgKHNlZSBtaXJyb3IuanMgaW4gcjExNDkwMykuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB3aGljaCBuZWVkcyB0byBpbmhlcml0IHRoZVxuICogICAgIHByb3RvdHlwZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBpbmhlcml0IHByb3RvdHlwZSBmcm9tLlxuICovXG5pbXBvcnQgaW5oZXJpdHMgZnJvbSAnLi9pbmhlcml0cyc7XG5leHBvcnQge2luaGVyaXRzfVxuXG5leHBvcnQgZnVuY3Rpb24gX2V4dGVuZChvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbmhlcml0czogaW5oZXJpdHMsXG4gIF9leHRlbmQ6IF9leHRlbmQsXG4gIGxvZzogbG9nLFxuICBpc0J1ZmZlcjogaXNCdWZmZXIsXG4gIGlzUHJpbWl0aXZlOiBpc1ByaW1pdGl2ZSxcbiAgaXNGdW5jdGlvbjogaXNGdW5jdGlvbixcbiAgaXNFcnJvcjogaXNFcnJvcixcbiAgaXNEYXRlOiBpc0RhdGUsXG4gIGlzT2JqZWN0OiBpc09iamVjdCxcbiAgaXNSZWdFeHA6IGlzUmVnRXhwLFxuICBpc1VuZGVmaW5lZDogaXNVbmRlZmluZWQsXG4gIGlzU3ltYm9sOiBpc1N5bWJvbCxcbiAgaXNTdHJpbmc6IGlzU3RyaW5nLFxuICBpc051bWJlcjogaXNOdW1iZXIsXG4gIGlzTnVsbE9yVW5kZWZpbmVkOiBpc051bGxPclVuZGVmaW5lZCxcbiAgaXNOdWxsOiBpc051bGwsXG4gIGlzQm9vbGVhbjogaXNCb29sZWFuLFxuICBpc0FycmF5OiBpc0FycmF5LFxuICBpbnNwZWN0OiBpbnNwZWN0LFxuICBkZXByZWNhdGU6IGRlcHJlY2F0ZSxcbiAgZm9ybWF0OiBmb3JtYXQsXG4gIGRlYnVnbG9nOiBkZWJ1Z2xvZ1xufVxuIiwiaW1wb3J0IHtCdWZmZXJ9IGZyb20gJ2J1ZmZlcic7XG5cbmV4cG9ydCBkZWZhdWx0IEJ1ZmZlckxpc3Q7XG5cbmZ1bmN0aW9uIEJ1ZmZlckxpc3QoKSB7XG4gIHRoaXMuaGVhZCA9IG51bGw7XG4gIHRoaXMudGFpbCA9IG51bGw7XG4gIHRoaXMubGVuZ3RoID0gMDtcbn1cblxuQnVmZmVyTGlzdC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uICh2KSB7XG4gIHZhciBlbnRyeSA9IHsgZGF0YTogdiwgbmV4dDogbnVsbCB9O1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB0aGlzLnRhaWwubmV4dCA9IGVudHJ5O2Vsc2UgdGhpcy5oZWFkID0gZW50cnk7XG4gIHRoaXMudGFpbCA9IGVudHJ5O1xuICArK3RoaXMubGVuZ3RoO1xufTtcblxuQnVmZmVyTGlzdC5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uICh2KSB7XG4gIHZhciBlbnRyeSA9IHsgZGF0YTogdiwgbmV4dDogdGhpcy5oZWFkIH07XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgdGhpcy50YWlsID0gZW50cnk7XG4gIHRoaXMuaGVhZCA9IGVudHJ5O1xuICArK3RoaXMubGVuZ3RoO1xufTtcblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuc2hpZnQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICB2YXIgcmV0ID0gdGhpcy5oZWFkLmRhdGE7XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtlbHNlIHRoaXMuaGVhZCA9IHRoaXMuaGVhZC5uZXh0O1xuICAtLXRoaXMubGVuZ3RoO1xuICByZXR1cm4gcmV0O1xufTtcblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7XG4gIHRoaXMubGVuZ3RoID0gMDtcbn07XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiAocykge1xuICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gIHZhciByZXQgPSAnJyArIHAuZGF0YTtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICByZXQgKz0gcyArIHAuZGF0YTtcbiAgfXJldHVybiByZXQ7XG59O1xuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5jb25jYXQgPSBmdW5jdGlvbiAobikge1xuICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiBCdWZmZXIuYWxsb2MoMCk7XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHRoaXMuaGVhZC5kYXRhO1xuICB2YXIgcmV0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKG4gPj4+IDApO1xuICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgdmFyIGkgPSAwO1xuICB3aGlsZSAocCkge1xuICAgIHAuZGF0YS5jb3B5KHJldCwgaSk7XG4gICAgaSArPSBwLmRhdGEubGVuZ3RoO1xuICAgIHAgPSBwLm5leHQ7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn07XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtCdWZmZXJ9IGZyb20gJ2J1ZmZlcic7XG52YXIgaXNCdWZmZXJFbmNvZGluZyA9IEJ1ZmZlci5pc0VuY29kaW5nXG4gIHx8IGZ1bmN0aW9uKGVuY29kaW5nKSB7XG4gICAgICAgc3dpdGNoIChlbmNvZGluZyAmJiBlbmNvZGluZy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICBjYXNlICdoZXgnOiBjYXNlICd1dGY4JzogY2FzZSAndXRmLTgnOiBjYXNlICdhc2NpaSc6IGNhc2UgJ2JpbmFyeSc6IGNhc2UgJ2Jhc2U2NCc6IGNhc2UgJ3VjczInOiBjYXNlICd1Y3MtMic6IGNhc2UgJ3V0ZjE2bGUnOiBjYXNlICd1dGYtMTZsZSc6IGNhc2UgJ3Jhdyc6IHJldHVybiB0cnVlO1xuICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xuICAgICAgIH1cbiAgICAgfVxuXG5cbmZ1bmN0aW9uIGFzc2VydEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIGlmIChlbmNvZGluZyAmJiAhaXNCdWZmZXJFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIH1cbn1cblxuLy8gU3RyaW5nRGVjb2RlciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGVmZmljaWVudGx5IHNwbGl0dGluZyBhIHNlcmllcyBvZlxuLy8gYnVmZmVycyBpbnRvIGEgc2VyaWVzIG9mIEpTIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBhcGFydCBtdWx0aS1ieXRlXG4vLyBjaGFyYWN0ZXJzLiBDRVNVLTggaXMgaGFuZGxlZCBhcyBwYXJ0IG9mIHRoZSBVVEYtOCBlbmNvZGluZy5cbi8vXG4vLyBAVE9ETyBIYW5kbGluZyBhbGwgZW5jb2RpbmdzIGluc2lkZSBhIHNpbmdsZSBvYmplY3QgbWFrZXMgaXQgdmVyeSBkaWZmaWN1bHRcbi8vIHRvIHJlYXNvbiBhYm91dCB0aGlzIGNvZGUsIHNvIGl0IHNob3VsZCBiZSBzcGxpdCB1cCBpbiB0aGUgZnV0dXJlLlxuLy8gQFRPRE8gVGhlcmUgc2hvdWxkIGJlIGEgdXRmOC1zdHJpY3QgZW5jb2RpbmcgdGhhdCByZWplY3RzIGludmFsaWQgVVRGLTggY29kZVxuLy8gcG9pbnRzIGFzIHVzZWQgYnkgQ0VTVS04LlxuZXhwb3J0IGZ1bmN0aW9uIFN0cmluZ0RlY29kZXIoZW5jb2RpbmcpIHtcbiAgdGhpcy5lbmNvZGluZyA9IChlbmNvZGluZyB8fCAndXRmOCcpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXS8sICcnKTtcbiAgYXNzZXJ0RW5jb2RpbmcoZW5jb2RpbmcpO1xuICBzd2l0Y2ggKHRoaXMuZW5jb2RpbmcpIHtcbiAgICBjYXNlICd1dGY4JzpcbiAgICAgIC8vIENFU1UtOCByZXByZXNlbnRzIGVhY2ggb2YgU3Vycm9nYXRlIFBhaXIgYnkgMy1ieXRlc1xuICAgICAgdGhpcy5zdXJyb2dhdGVTaXplID0gMztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgLy8gVVRGLTE2IHJlcHJlc2VudHMgZWFjaCBvZiBTdXJyb2dhdGUgUGFpciBieSAyLWJ5dGVzXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAyO1xuICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IHV0ZjE2RGV0ZWN0SW5jb21wbGV0ZUNoYXI7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgLy8gQmFzZS02NCBzdG9yZXMgMyBieXRlcyBpbiA0IGNoYXJzLCBhbmQgcGFkcyB0aGUgcmVtYWluZGVyLlxuICAgICAgdGhpcy5zdXJyb2dhdGVTaXplID0gMztcbiAgICAgIHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIgPSBiYXNlNjREZXRlY3RJbmNvbXBsZXRlQ2hhcjtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aGlzLndyaXRlID0gcGFzc1Rocm91Z2hXcml0ZTtcbiAgICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEVub3VnaCBzcGFjZSB0byBzdG9yZSBhbGwgYnl0ZXMgb2YgYSBzaW5nbGUgY2hhcmFjdGVyLiBVVEYtOCBuZWVkcyA0XG4gIC8vIGJ5dGVzLCBidXQgQ0VTVS04IG1heSByZXF1aXJlIHVwIHRvIDYgKDMgYnl0ZXMgcGVyIHN1cnJvZ2F0ZSkuXG4gIHRoaXMuY2hhckJ1ZmZlciA9IG5ldyBCdWZmZXIoNik7XG4gIC8vIE51bWJlciBvZiBieXRlcyByZWNlaXZlZCBmb3IgdGhlIGN1cnJlbnQgaW5jb21wbGV0ZSBtdWx0aS1ieXRlIGNoYXJhY3Rlci5cbiAgdGhpcy5jaGFyUmVjZWl2ZWQgPSAwO1xuICAvLyBOdW1iZXIgb2YgYnl0ZXMgZXhwZWN0ZWQgZm9yIHRoZSBjdXJyZW50IGluY29tcGxldGUgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuXG4gIHRoaXMuY2hhckxlbmd0aCA9IDA7XG59O1xuXG5cbi8vIHdyaXRlIGRlY29kZXMgdGhlIGdpdmVuIGJ1ZmZlciBhbmQgcmV0dXJucyBpdCBhcyBKUyBzdHJpbmcgdGhhdCBpc1xuLy8gZ3VhcmFudGVlZCB0byBub3QgY29udGFpbiBhbnkgcGFydGlhbCBtdWx0aS1ieXRlIGNoYXJhY3RlcnMuIEFueSBwYXJ0aWFsXG4vLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGlzIGJ1ZmZlcmVkIHVwLCBhbmQgd2lsbCBiZVxuLy8gcmV0dXJuZWQgd2hlbiBjYWxsaW5nIHdyaXRlIGFnYWluIHdpdGggdGhlIHJlbWFpbmluZyBieXRlcy5cbi8vXG4vLyBOb3RlOiBDb252ZXJ0aW5nIGEgQnVmZmVyIGNvbnRhaW5pbmcgYW4gb3JwaGFuIHN1cnJvZ2F0ZSB0byBhIFN0cmluZ1xuLy8gY3VycmVudGx5IHdvcmtzLCBidXQgY29udmVydGluZyBhIFN0cmluZyB0byBhIEJ1ZmZlciAodmlhIGBuZXcgQnVmZmVyYCwgb3Jcbi8vIEJ1ZmZlciN3cml0ZSkgd2lsbCByZXBsYWNlIGluY29tcGxldGUgc3Vycm9nYXRlcyB3aXRoIHRoZSB1bmljb2RlXG4vLyByZXBsYWNlbWVudCBjaGFyYWN0ZXIuIFNlZSBodHRwczovL2NvZGVyZXZpZXcuY2hyb21pdW0ub3JnLzEyMTE3MzAwOS8gLlxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgdmFyIGNoYXJTdHIgPSAnJztcbiAgLy8gaWYgb3VyIGxhc3Qgd3JpdGUgZW5kZWQgd2l0aCBhbiBpbmNvbXBsZXRlIG11bHRpYnl0ZSBjaGFyYWN0ZXJcbiAgd2hpbGUgKHRoaXMuY2hhckxlbmd0aCkge1xuICAgIC8vIGRldGVybWluZSBob3cgbWFueSByZW1haW5pbmcgYnl0ZXMgdGhpcyBidWZmZXIgaGFzIHRvIG9mZmVyIGZvciB0aGlzIGNoYXJcbiAgICB2YXIgYXZhaWxhYmxlID0gKGJ1ZmZlci5sZW5ndGggPj0gdGhpcy5jaGFyTGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQpID9cbiAgICAgICAgdGhpcy5jaGFyTGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQgOlxuICAgICAgICBidWZmZXIubGVuZ3RoO1xuXG4gICAgLy8gYWRkIHRoZSBuZXcgYnl0ZXMgdG8gdGhlIGNoYXIgYnVmZmVyXG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCB0aGlzLmNoYXJSZWNlaXZlZCwgMCwgYXZhaWxhYmxlKTtcbiAgICB0aGlzLmNoYXJSZWNlaXZlZCArPSBhdmFpbGFibGU7XG5cbiAgICBpZiAodGhpcy5jaGFyUmVjZWl2ZWQgPCB0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAgIC8vIHN0aWxsIG5vdCBlbm91Z2ggY2hhcnMgaW4gdGhpcyBidWZmZXI/IHdhaXQgZm9yIG1vcmUgLi4uXG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIGJ5dGVzIGJlbG9uZ2luZyB0byB0aGUgY3VycmVudCBjaGFyYWN0ZXIgZnJvbSB0aGUgYnVmZmVyXG4gICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKGF2YWlsYWJsZSwgYnVmZmVyLmxlbmd0aCk7XG5cbiAgICAvLyBnZXQgdGhlIGNoYXJhY3RlciB0aGF0IHdhcyBzcGxpdFxuICAgIGNoYXJTdHIgPSB0aGlzLmNoYXJCdWZmZXIuc2xpY2UoMCwgdGhpcy5jaGFyTGVuZ3RoKS50b1N0cmluZyh0aGlzLmVuY29kaW5nKTtcblxuICAgIC8vIENFU1UtODogbGVhZCBzdXJyb2dhdGUgKEQ4MDAtREJGRikgaXMgYWxzbyB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXJcbiAgICB2YXIgY2hhckNvZGUgPSBjaGFyU3RyLmNoYXJDb2RlQXQoY2hhclN0ci5sZW5ndGggLSAxKTtcbiAgICBpZiAoY2hhckNvZGUgPj0gMHhEODAwICYmIGNoYXJDb2RlIDw9IDB4REJGRikge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoICs9IHRoaXMuc3Vycm9nYXRlU2l6ZTtcbiAgICAgIGNoYXJTdHIgPSAnJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0aGlzLmNoYXJSZWNlaXZlZCA9IHRoaXMuY2hhckxlbmd0aCA9IDA7XG5cbiAgICAvLyBpZiB0aGVyZSBhcmUgbm8gbW9yZSBieXRlcyBpbiB0aGlzIGJ1ZmZlciwganVzdCBlbWl0IG91ciBjaGFyXG4gICAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBjaGFyU3RyO1xuICAgIH1cbiAgICBicmVhaztcbiAgfVxuXG4gIC8vIGRldGVybWluZSBhbmQgc2V0IGNoYXJMZW5ndGggLyBjaGFyUmVjZWl2ZWRcbiAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIpO1xuXG4gIHZhciBlbmQgPSBidWZmZXIubGVuZ3RoO1xuICBpZiAodGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgLy8gYnVmZmVyIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlciBieXRlcyB3ZSBnb3RcbiAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCwgZW5kKTtcbiAgICBlbmQgLT0gdGhpcy5jaGFyUmVjZWl2ZWQ7XG4gIH1cblxuICBjaGFyU3RyICs9IGJ1ZmZlci50b1N0cmluZyh0aGlzLmVuY29kaW5nLCAwLCBlbmQpO1xuXG4gIHZhciBlbmQgPSBjaGFyU3RyLmxlbmd0aCAtIDE7XG4gIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChlbmQpO1xuICAvLyBDRVNVLTg6IGxlYWQgc3Vycm9nYXRlIChEODAwLURCRkYpIGlzIGFsc28gdGhlIGluY29tcGxldGUgY2hhcmFjdGVyXG4gIGlmIChjaGFyQ29kZSA+PSAweEQ4MDAgJiYgY2hhckNvZGUgPD0gMHhEQkZGKSB7XG4gICAgdmFyIHNpemUgPSB0aGlzLnN1cnJvZ2F0ZVNpemU7XG4gICAgdGhpcy5jaGFyTGVuZ3RoICs9IHNpemU7XG4gICAgdGhpcy5jaGFyUmVjZWl2ZWQgKz0gc2l6ZTtcbiAgICB0aGlzLmNoYXJCdWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIHNpemUsIDAsIHNpemUpO1xuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgMCwgMCwgc2l6ZSk7XG4gICAgcmV0dXJuIGNoYXJTdHIuc3Vic3RyaW5nKDAsIGVuZCk7XG4gIH1cblxuICAvLyBvciBqdXN0IGVtaXQgdGhlIGNoYXJTdHJcbiAgcmV0dXJuIGNoYXJTdHI7XG59O1xuXG4vLyBkZXRlY3RJbmNvbXBsZXRlQ2hhciBkZXRlcm1pbmVzIGlmIHRoZXJlIGlzIGFuIGluY29tcGxldGUgVVRGLTggY2hhcmFjdGVyIGF0XG4vLyB0aGUgZW5kIG9mIHRoZSBnaXZlbiBidWZmZXIuIElmIHNvLCBpdCBzZXRzIHRoaXMuY2hhckxlbmd0aCB0byB0aGUgYnl0ZVxuLy8gbGVuZ3RoIHRoYXQgY2hhcmFjdGVyLCBhbmQgc2V0cyB0aGlzLmNoYXJSZWNlaXZlZCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzXG4vLyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgY2hhcmFjdGVyLlxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZGV0ZWN0SW5jb21wbGV0ZUNoYXIgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgLy8gZGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIHdlIGhhdmUgdG8gY2hlY2sgYXQgdGhlIGVuZCBvZiB0aGlzIGJ1ZmZlclxuICB2YXIgaSA9IChidWZmZXIubGVuZ3RoID49IDMpID8gMyA6IGJ1ZmZlci5sZW5ndGg7XG5cbiAgLy8gRmlndXJlIG91dCBpZiBvbmUgb2YgdGhlIGxhc3QgaSBieXRlcyBvZiBvdXIgYnVmZmVyIGFubm91bmNlcyBhblxuICAvLyBpbmNvbXBsZXRlIGNoYXIuXG4gIGZvciAoOyBpID4gMDsgaS0tKSB7XG4gICAgdmFyIGMgPSBidWZmZXJbYnVmZmVyLmxlbmd0aCAtIGldO1xuXG4gICAgLy8gU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTgjRGVzY3JpcHRpb25cblxuICAgIC8vIDExMFhYWFhYXG4gICAgaWYgKGkgPT0gMSAmJiBjID4+IDUgPT0gMHgwNikge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoID0gMjtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIDExMTBYWFhYXG4gICAgaWYgKGkgPD0gMiAmJiBjID4+IDQgPT0gMHgwRSkge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoID0gMztcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIDExMTEwWFhYXG4gICAgaWYgKGkgPD0gMyAmJiBjID4+IDMgPT0gMHgxRSkge1xuICAgICAgdGhpcy5jaGFyTGVuZ3RoID0gNDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGk7XG59O1xuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBpZiAoYnVmZmVyICYmIGJ1ZmZlci5sZW5ndGgpXG4gICAgcmVzID0gdGhpcy53cml0ZShidWZmZXIpO1xuXG4gIGlmICh0aGlzLmNoYXJSZWNlaXZlZCkge1xuICAgIHZhciBjciA9IHRoaXMuY2hhclJlY2VpdmVkO1xuICAgIHZhciBidWYgPSB0aGlzLmNoYXJCdWZmZXI7XG4gICAgdmFyIGVuYyA9IHRoaXMuZW5jb2Rpbmc7XG4gICAgcmVzICs9IGJ1Zi5zbGljZSgwLCBjcikudG9TdHJpbmcoZW5jKTtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuXG5mdW5jdGlvbiBwYXNzVGhyb3VnaFdyaXRlKGJ1ZmZlcikge1xuICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xufVxuXG5mdW5jdGlvbiB1dGYxNkRldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGJ1ZmZlci5sZW5ndGggJSAyO1xuICB0aGlzLmNoYXJMZW5ndGggPSB0aGlzLmNoYXJSZWNlaXZlZCA/IDIgOiAwO1xufVxuXG5mdW5jdGlvbiBiYXNlNjREZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIpIHtcbiAgdGhpcy5jaGFyUmVjZWl2ZWQgPSBidWZmZXIubGVuZ3RoICUgMztcbiAgdGhpcy5jaGFyTGVuZ3RoID0gdGhpcy5jaGFyUmVjZWl2ZWQgPyAzIDogMDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZTtcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRzJztcbmltcG9ydCB7aW5oZXJpdHMsIGRlYnVnbG9nfSBmcm9tICd1dGlsJztcbmltcG9ydCBCdWZmZXJMaXN0IGZyb20gJy4vYnVmZmVyLWxpc3QnO1xuaW1wb3J0IHtTdHJpbmdEZWNvZGVyfSBmcm9tICdzdHJpbmdfZGVjb2Rlcic7XG5pbXBvcnQge0R1cGxleH0gZnJvbSAnLi9kdXBsZXgnO1xuaW1wb3J0IHtuZXh0VGlja30gZnJvbSAncHJvY2Vzcyc7XG5cbnZhciBkZWJ1ZyA9IGRlYnVnbG9nKCdzdHJlYW0nKTtcbmluaGVyaXRzKFJlYWRhYmxlLCBFdmVudEVtaXR0ZXIpO1xuXG5mdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuKSB7XG4gIC8vIFNhZGx5IHRoaXMgaXMgbm90IGNhY2hlYWJsZSBhcyBzb21lIGxpYnJhcmllcyBidW5kbGUgdGhlaXIgb3duXG4gIC8vIGV2ZW50IGVtaXR0ZXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGVtLlxuICBpZiAodHlwZW9mIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyKGV2ZW50LCBmbik7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgb3VyIGVycm9yIGhhbmRsZXIgaXMgYXR0YWNoZWQgYmVmb3JlIGFueVxuICAgIC8vIHVzZXJsYW5kIG9uZXMuICBORVZFUiBETyBUSElTLiBUaGlzIGlzIGhlcmUgb25seSBiZWNhdXNlIHRoaXMgY29kZSBuZWVkc1xuICAgIC8vIHRvIGNvbnRpbnVlIHRvIHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBOb2RlLmpzIHRoYXQgZG8gbm90IGluY2x1ZGVcbiAgICAvLyB0aGUgcHJlcGVuZExpc3RlbmVyKCkgbWV0aG9kLiBUaGUgZ29hbCBpcyB0byBldmVudHVhbGx5IHJlbW92ZSB0aGlzIGhhY2suXG4gICAgaWYgKCFlbWl0dGVyLl9ldmVudHMgfHwgIWVtaXR0ZXIuX2V2ZW50c1tldmVudF0pXG4gICAgICBlbWl0dGVyLm9uKGV2ZW50LCBmbik7XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSlcbiAgICAgIGVtaXR0ZXIuX2V2ZW50c1tldmVudF0udW5zaGlmdChmbik7XG4gICAgZWxzZVxuICAgICAgZW1pdHRlci5fZXZlbnRzW2V2ZW50XSA9IFtmbiwgZW1pdHRlci5fZXZlbnRzW2V2ZW50XV07XG4gIH1cbn1cbmZ1bmN0aW9uIGxpc3RlbmVyQ291bnQgKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aDtcbn1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnLiBVc2VkIHRvIG1ha2UgcmVhZChuKSBpZ25vcmUgbiBhbmQgdG9cbiAgLy8gbWFrZSBhbGwgdGhlIGJ1ZmZlciBtZXJnaW5nIGFuZCBsZW5ndGggY2hlY2tzIGdvIGF3YXlcbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIER1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy5yZWFkYWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIGl0IHN0b3BzIGNhbGxpbmcgX3JlYWQoKSB0byBmaWxsIHRoZSBidWZmZXJcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyBcImRvbid0IGNhbGwgX3JlYWQgcHJlZW1wdGl2ZWx5IGV2ZXJcIlxuICB2YXIgaHdtID0gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrO1xuICB2YXIgZGVmYXVsdEh3bSA9IHRoaXMub2JqZWN0TW9kZSA/IDE2IDogMTYgKiAxMDI0O1xuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBod20gfHwgaHdtID09PSAwID8gaHdtIDogZGVmYXVsdEh3bTtcblxuICAvLyBjYXN0IHRvIGludHMuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IH4gfnRoaXMuaGlnaFdhdGVyTWFyaztcblxuICAvLyBBIGxpbmtlZCBsaXN0IGlzIHVzZWQgdG8gc3RvcmUgZGF0YSBjaHVua3MgaW5zdGVhZCBvZiBhbiBhcnJheSBiZWNhdXNlIHRoZVxuICAvLyBsaW5rZWQgbGlzdCBjYW4gcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGJlZ2lubmluZyBmYXN0ZXIgdGhhblxuICAvLyBhcnJheS5zaGlmdCgpXG4gIHRoaXMuYnVmZmVyID0gbmV3IEJ1ZmZlckxpc3QoKTtcbiAgdGhpcy5sZW5ndGggPSAwO1xuICB0aGlzLnBpcGVzID0gbnVsbDtcbiAgdGhpcy5waXBlc0NvdW50ID0gMDtcbiAgdGhpcy5mbG93aW5nID0gbnVsbDtcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICB0aGlzLmVuZEVtaXR0ZWQgPSBmYWxzZTtcbiAgdGhpcy5yZWFkaW5nID0gZmFsc2U7XG5cbiAgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgb253cml0ZSBjYiBpcyBjYWxsZWQgaW1tZWRpYXRlbHksXG4gIC8vIG9yIG9uIGEgbGF0ZXIgdGljay4gIFdlIHNldCB0aGlzIHRvIHRydWUgYXQgZmlyc3QsIGJlY2F1c2UgYW55XG4gIC8vIGFjdGlvbnMgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHVudGlsIFwibGF0ZXJcIiBzaG91bGQgZ2VuZXJhbGx5IGFsc29cbiAgLy8gbm90IGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gd2hlbmV2ZXIgd2UgcmV0dXJuIG51bGwsIHRoZW4gd2Ugc2V0IGEgZmxhZyB0byBzYXlcbiAgLy8gdGhhdCB3ZSdyZSBhd2FpdGluZyBhICdyZWFkYWJsZScgZXZlbnQgZW1pc3Npb24uXG4gIHRoaXMubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZTtcbiAgdGhpcy5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JztcblxuICAvLyB3aGVuIHBpcGluZywgd2Ugb25seSBjYXJlIGFib3V0ICdyZWFkYWJsZScgZXZlbnRzIHRoYXQgaGFwcGVuXG4gIC8vIGFmdGVyIHJlYWQoKWluZyBhbGwgdGhlIGJ5dGVzIGFuZCBub3QgZ2V0dGluZyBhbnkgcHVzaGJhY2suXG4gIHRoaXMucmFuT3V0ID0gZmFsc2U7XG5cbiAgLy8gdGhlIG51bWJlciBvZiB3cml0ZXJzIHRoYXQgYXJlIGF3YWl0aW5nIGEgZHJhaW4gZXZlbnQgaW4gLnBpcGUoKXNcbiAgdGhpcy5hd2FpdERyYWluID0gMDtcblxuICAvLyBpZiB0cnVlLCBhIG1heWJlUmVhZE1vcmUgaGFzIGJlZW4gc2NoZWR1bGVkXG4gIHRoaXMucmVhZGluZ01vcmUgPSBmYWxzZTtcblxuICB0aGlzLmRlY29kZXIgPSBudWxsO1xuICB0aGlzLmVuY29kaW5nID0gbnVsbDtcbiAgaWYgKG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICB0aGlzLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zLmVuY29kaW5nKTtcbiAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZztcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgUmVhZGFibGU7XG5leHBvcnQgZnVuY3Rpb24gUmVhZGFibGUob3B0aW9ucykge1xuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWFkYWJsZSkpIHJldHVybiBuZXcgUmVhZGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeVxuICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5yZWFkID09PSAnZnVuY3Rpb24nKSB0aGlzLl9yZWFkID0gb3B0aW9ucy5yZWFkO1xuXG4gIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpO1xufVxuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuICAgIGlmIChlbmNvZGluZyAhPT0gc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgIGVuY29kaW5nID0gJyc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgZmFsc2UpO1xufTtcblxuLy8gVW5zaGlmdCBzaG91bGQgKmFsd2F5cyogYmUgc29tZXRoaW5nIGRpcmVjdGx5IG91dCBvZiByZWFkKClcblJlYWRhYmxlLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgJycsIHRydWUpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLmlzUGF1c2VkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID09PSBmYWxzZTtcbn07XG5cbmZ1bmN0aW9uIHJlYWRhYmxlQWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBhZGRUb0Zyb250KSB7XG4gIHZhciBlciA9IGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspO1xuICBpZiAoZXIpIHtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIH0gZWxzZSBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gICAgb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKTtcbiAgfSBlbHNlIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rICYmIGNodW5rLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoc3RhdGUuZW5kZWQgJiYgIWFkZFRvRnJvbnQpIHtcbiAgICAgIHZhciBlID0gbmV3IEVycm9yKCdzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRicpO1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5lbmRFbWl0dGVkICYmIGFkZFRvRnJvbnQpIHtcbiAgICAgIHZhciBfZSA9IG5ldyBFcnJvcignc3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQnKTtcbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIF9lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNraXBBZGQ7XG4gICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhYWRkVG9Gcm9udCAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcbiAgICAgICAgc2tpcEFkZCA9ICFzdGF0ZS5vYmplY3RNb2RlICYmIGNodW5rLmxlbmd0aCA9PT0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhZGRUb0Zyb250KSBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG5cbiAgICAgIC8vIERvbid0IGFkZCB0byB0aGUgYnVmZmVyIGlmIHdlJ3ZlIGRlY29kZWQgdG8gYW4gZW1wdHkgc3RyaW5nIGNodW5rIGFuZFxuICAgICAgLy8gd2UncmUgbm90IGluIG9iamVjdCBtb2RlXG4gICAgICBpZiAoIXNraXBBZGQpIHtcbiAgICAgICAgLy8gaWYgd2Ugd2FudCB0aGUgZGF0YSBub3csIGp1c3QgZW1pdCBpdC5cbiAgICAgICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgICAgICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgICAgICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICAgICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcblxuICAgICAgICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCFhZGRUb0Zyb250KSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG5lZWRNb3JlRGF0YShzdGF0ZSk7XG59XG5cbi8vIGlmIGl0J3MgcGFzdCB0aGUgaGlnaCB3YXRlciBtYXJrLCB3ZSBjYW4gcHVzaCBpbiBzb21lIG1vcmUuXG4vLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZVxuLy8gbW9yZSBieXRlcy4gIFRoaXMgaXMgdG8gd29yayBhcm91bmQgY2FzZXMgd2hlcmUgaHdtPTAsXG4vLyBzdWNoIGFzIHRoZSByZXBsLiAgQWxzbywgaWYgdGhlIHB1c2goKSB0cmlnZ2VyZWQgYVxuLy8gcmVhZGFibGUgZXZlbnQsIGFuZCB0aGUgdXNlciBjYWxsZWQgcmVhZChsYXJnZU51bWJlcikgc3VjaCB0aGF0XG4vLyBuZWVkUmVhZGFibGUgd2FzIHNldCwgdGhlbiB3ZSBvdWdodCB0byBwdXNoIG1vcmUsIHNvIHRoYXQgYW5vdGhlclxuLy8gJ3JlYWRhYmxlJyBldmVudCB3aWxsIGJlIHRyaWdnZXJlZC5cbmZ1bmN0aW9uIG5lZWRNb3JlRGF0YShzdGF0ZSkge1xuICByZXR1cm4gIXN0YXRlLmVuZGVkICYmIChzdGF0ZS5uZWVkUmVhZGFibGUgfHwgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5sZW5ndGggPT09IDApO1xufVxuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gOE1CXG52YXIgTUFYX0hXTSA9IDB4ODAwMDAwO1xuZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMiB0byBwcmV2ZW50IGluY3JlYXNpbmcgaHdtIGV4Y2Vzc2l2ZWx5IGluXG4gICAgLy8gdGlueSBhbW91bnRzXG4gICAgbi0tO1xuICAgIG4gfD0gbiA+Pj4gMTtcbiAgICBuIHw9IG4gPj4+IDI7XG4gICAgbiB8PSBuID4+PiA0O1xuICAgIG4gfD0gbiA+Pj4gODtcbiAgICBuIHw9IG4gPj4+IDE2O1xuICAgIG4rKztcbiAgfVxuICByZXR1cm4gbjtcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKSB7XG4gIGlmIChuIDw9IDAgfHwgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSByZXR1cm4gMDtcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldHVybiAxO1xuICBpZiAobiAhPT0gbikge1xuICAgIC8vIE9ubHkgZmxvdyBvbmUgYnVmZmVyIGF0IGEgdGltZVxuICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmxlbmd0aCkgcmV0dXJuIHN0YXRlLmJ1ZmZlci5oZWFkLmRhdGEubGVuZ3RoO2Vsc2UgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgfVxuICAvLyBJZiB3ZSdyZSBhc2tpbmcgZm9yIG1vcmUgdGhhbiB0aGUgY3VycmVudCBod20sIHRoZW4gcmFpc2UgdGhlIGh3bS5cbiAgaWYgKG4gPiBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSBzdGF0ZS5oaWdoV2F0ZXJNYXJrID0gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobik7XG4gIGlmIChuIDw9IHN0YXRlLmxlbmd0aCkgcmV0dXJuIG47XG4gIC8vIERvbid0IGhhdmUgZW5vdWdoXG4gIGlmICghc3RhdGUuZW5kZWQpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiBzdGF0ZS5sZW5ndGg7XG59XG5cbi8vIHlvdSBjYW4gb3ZlcnJpZGUgZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYXN5bmMgX3JlYWQobikgYmVsb3cuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIGRlYnVnKCdyZWFkJywgbik7XG4gIG4gPSBwYXJzZUludChuLCAxMCk7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBuT3JpZyA9IG47XG5cbiAgaWYgKG4gIT09IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZCk7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7ZWxzZSBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIHZhciBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGU7XG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKTtcblxuICAvLyBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBsZXNzIHRoYW4gdGhlIGhpZ2hXYXRlck1hcmssIHRoZW4gYWxzbyByZWFkIHNvbWVcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWU7XG4gICAgZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJywgZG9SZWFkKTtcbiAgfVxuXG4gIC8vIGhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGFuZCBpZiB3ZSdyZSBhbHJlYWR5XG4gIC8vIHJlYWRpbmcsIHRoZW4gaXQncyB1bm5lY2Vzc2FyeS5cbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcpIHtcbiAgICBkb1JlYWQgPSBmYWxzZTtcbiAgICBkZWJ1ZygncmVhZGluZyBvciBlbmRlZCcsIGRvUmVhZCk7XG4gIH0gZWxzZSBpZiAoZG9SZWFkKSB7XG4gICAgZGVidWcoJ2RvIHJlYWQnKTtcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZTtcbiAgICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgICAvLyBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSB6ZXJvLCB0aGVuIHdlICpuZWVkKiBhIHJlYWRhYmxlIGV2ZW50LlxuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgLy8gY2FsbCBpbnRlcm5hbCByZWFkIG1ldGhvZFxuICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayk7XG4gICAgc3RhdGUuc3luYyA9IGZhbHNlO1xuICAgIC8vIElmIF9yZWFkIHB1c2hlZCBkYXRhIHN5bmNocm9ub3VzbHksIHRoZW4gYHJlYWRpbmdgIHdpbGwgYmUgZmFsc2UsXG4gICAgLy8gYW5kIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gcmV0dXJuIHRvIHRoZSB1c2VyLlxuICAgIGlmICghc3RhdGUucmVhZGluZykgbiA9IGhvd011Y2hUb1JlYWQobk9yaWcsIHN0YXRlKTtcbiAgfVxuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcblxuICBpZiAocmV0ID09PSBudWxsKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBuID0gMDtcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS5sZW5ndGggLT0gbjtcbiAgfVxuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwgdGhlbiB3ZSB3YW50IHRvIGtub3dcbiAgICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAgIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO1xuICB9XG5cbiAgaWYgKHJldCAhPT0gbnVsbCkgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXIgPSBudWxsO1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgcmV0dXJuIGVyO1xufVxuXG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmVuZGVkKSByZXR1cm47XG4gIGlmIChzdGF0ZS5kZWNvZGVyKSB7XG4gICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcblxuICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG59XG5cbi8vIERvbid0IGVtaXQgcmVhZGFibGUgcmlnaHQgYXdheSBpbiBzeW5jIG1vZGUsIGJlY2F1c2UgdGhpcyBjYW4gdHJpZ2dlclxuLy8gYW5vdGhlciByZWFkKCkgY2FsbCA9PiBzdGFjayBvdmVyZmxvdy4gIFRoaXMgd2F5LCBpdCBtaWdodCB0cmlnZ2VyXG4vLyBhIG5leHRUaWNrIHJlY3Vyc2lvbiB3YXJuaW5nLCBidXQgdGhhdCdzIG5vdCBzbyBiYWQuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ2VtaXRSZWFkYWJsZScsIHN0YXRlLmZsb3dpbmcpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgaWYgKHN0YXRlLnN5bmMpIG5leHRUaWNrKGVtaXRSZWFkYWJsZV8sIHN0cmVhbSk7ZWxzZSBlbWl0UmVhZGFibGVfKHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlXyhzdHJlYW0pIHtcbiAgZGVidWcoJ2VtaXQgcmVhZGFibGUnKTtcbiAgc3RyZWFtLmVtaXQoJ3JlYWRhYmxlJyk7XG4gIGZsb3coc3RyZWFtKTtcbn1cblxuLy8gYXQgdGhpcyBwb2ludCwgdGhlIHVzZXIgaGFzIHByZXN1bWFibHkgc2VlbiB0aGUgJ3JlYWRhYmxlJyBldmVudCxcbi8vIGFuZCBjYWxsZWQgcmVhZCgpIHRvIGNvbnN1bWUgc29tZSBkYXRhLiAgdGhhdCBtYXkgaGF2ZSB0cmlnZ2VyZWRcbi8vIGluIHR1cm4gYW5vdGhlciBfcmVhZChuKSBjYWxsLCBpbiB3aGljaCBjYXNlIHJlYWRpbmcgPSB0cnVlIGlmXG4vLyBpdCdzIGluIHByb2dyZXNzLlxuLy8gSG93ZXZlciwgaWYgd2UncmUgbm90IGVuZGVkLCBvciByZWFkaW5nLCBhbmQgdGhlIGxlbmd0aCA8IGh3bSxcbi8vIHRoZW4gZ28gYWhlYWQgYW5kIHRyeSB0byByZWFkIHNvbWUgbW9yZSBwcmVlbXB0aXZlbHkuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nTW9yZSkge1xuICAgIHN0YXRlLnJlYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICBuZXh0VGljayhtYXliZVJlYWRNb3JlXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB3aGlsZSAoIXN0YXRlLnJlYWRpbmcgJiYgIXN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLmVuZGVkICYmIHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICBkZWJ1ZygnbWF5YmVSZWFkTW9yZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICBpZiAobGVuID09PSBzdGF0ZS5sZW5ndGgpXG4gICAgICAvLyBkaWRuJ3QgZ2V0IGFueSBkYXRhLCBzdG9wIHNwaW5uaW5nLlxuICAgICAgYnJlYWs7ZWxzZSBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIH1cbiAgc3RhdGUucmVhZGluZ01vcmUgPSBmYWxzZTtcbn1cblxuLy8gYWJzdHJhY3QgbWV0aG9kLiAgdG8gYmUgb3ZlcnJpZGRlbiBpbiBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gY2FsbCBjYihlciwgZGF0YSkgd2hlcmUgZGF0YSBpcyA8PSBuIGluIGxlbmd0aC5cbi8vIGZvciB2aXJ0dWFsIChub24tc3RyaW5nLCBub24tYnVmZmVyKSBzdHJlYW1zLCBcImxlbmd0aFwiIGlzIHNvbWV3aGF0XG4vLyBhcmJpdHJhcnksIGFuZCBwZXJoYXBzIG5vdCB2ZXJ5IG1lYW5pbmdmdWwuXG5SZWFkYWJsZS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKSk7XG59O1xuXG5SZWFkYWJsZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uIChkZXN0LCBwaXBlT3B0cykge1xuICB2YXIgc3JjID0gdGhpcztcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICBzd2l0Y2ggKHN0YXRlLnBpcGVzQ291bnQpIHtcbiAgICBjYXNlIDA6XG4gICAgICBzdGF0ZS5waXBlcyA9IGRlc3Q7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE6XG4gICAgICBzdGF0ZS5waXBlcyA9IFtzdGF0ZS5waXBlcywgZGVzdF07XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgc3RhdGUucGlwZXMucHVzaChkZXN0KTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHN0YXRlLnBpcGVzQ291bnQgKz0gMTtcbiAgZGVidWcoJ3BpcGUgY291bnQ9JWQgb3B0cz0laicsIHN0YXRlLnBpcGVzQ291bnQsIHBpcGVPcHRzKTtcblxuICB2YXIgZG9FbmQgPSAoIXBpcGVPcHRzIHx8IHBpcGVPcHRzLmVuZCAhPT0gZmFsc2UpO1xuXG4gIHZhciBlbmRGbiA9IGRvRW5kID8gb25lbmQgOiBjbGVhbnVwO1xuICBpZiAoc3RhdGUuZW5kRW1pdHRlZCkgbmV4dFRpY2soZW5kRm4pO2Vsc2Ugc3JjLm9uY2UoJ2VuZCcsIGVuZEZuKTtcblxuICBkZXN0Lm9uKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gIGZ1bmN0aW9uIG9udW5waXBlKHJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ29udW5waXBlJyk7XG4gICAgaWYgKHJlYWRhYmxlID09PSBzcmMpIHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBkZWJ1Zygnb25lbmQnKTtcbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cbiAgLy8gd2hlbiB0aGUgZGVzdCBkcmFpbnMsIGl0IHJlZHVjZXMgdGhlIGF3YWl0RHJhaW4gY291bnRlclxuICAvLyBvbiB0aGUgc291cmNlLiAgVGhpcyB3b3VsZCBiZSBtb3JlIGVsZWdhbnQgd2l0aCBhIC5vbmNlKClcbiAgLy8gaGFuZGxlciBpbiBmbG93KCksIGJ1dCBhZGRpbmcgYW5kIHJlbW92aW5nIHJlcGVhdGVkbHkgaXNcbiAgLy8gdG9vIHNsb3cuXG4gIHZhciBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjKTtcbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICB2YXIgY2xlYW5lZFVwID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgZGVidWcoJ2NsZWFudXAnKTtcbiAgICAvLyBjbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ3VucGlwZScsIG9udW5waXBlKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG5cbiAgICBjbGVhbmVkVXAgPSB0cnVlO1xuXG4gICAgLy8gaWYgdGhlIHJlYWRlciBpcyB3YWl0aW5nIGZvciBhIGRyYWluIGV2ZW50IGZyb20gdGhpc1xuICAgIC8vIHNwZWNpZmljIHdyaXRlciwgdGhlbiBpdCB3b3VsZCBjYXVzZSBpdCB0byBuZXZlciBzdGFydFxuICAgIC8vIGZsb3dpbmcgYWdhaW4uXG4gICAgLy8gU28sIGlmIHRoaXMgaXMgYXdhaXRpbmcgYSBkcmFpbiwgdGhlbiB3ZSBqdXN0IGNhbGwgaXQgbm93LlxuICAgIC8vIElmIHdlIGRvbid0IGtub3csIHRoZW4gYXNzdW1lIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG9uZS5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiAmJiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKSBvbmRyYWluKCk7XG4gIH1cblxuICAvLyBJZiB0aGUgdXNlciBwdXNoZXMgbW9yZSBkYXRhIHdoaWxlIHdlJ3JlIHdyaXRpbmcgdG8gZGVzdCB0aGVuIHdlJ2xsIGVuZCB1cFxuICAvLyBpbiBvbmRhdGEgYWdhaW4uIEhvd2V2ZXIsIHdlIG9ubHkgd2FudCB0byBpbmNyZWFzZSBhd2FpdERyYWluIG9uY2UgYmVjYXVzZVxuICAvLyBkZXN0IHdpbGwgb25seSBlbWl0IG9uZSAnZHJhaW4nIGV2ZW50IGZvciB0aGUgbXVsdGlwbGUgd3JpdGVzLlxuICAvLyA9PiBJbnRyb2R1Y2UgYSBndWFyZCBvbiBpbmNyZWFzaW5nIGF3YWl0RHJhaW4uXG4gIHZhciBpbmNyZWFzZWRBd2FpdERyYWluID0gZmFsc2U7XG4gIHNyYy5vbignZGF0YScsIG9uZGF0YSk7XG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGRlYnVnKCdvbmRhdGEnKTtcbiAgICBpbmNyZWFzZWRBd2FpdERyYWluID0gZmFsc2U7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGlmIChmYWxzZSA9PT0gcmV0ICYmICFpbmNyZWFzZWRBd2FpdERyYWluKSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAgIC8vIHRvIGdldCBzdHVjayBpbiBhIHBlcm1hbmVudGx5IHBhdXNlZCBzdGF0ZSBpZiB0aGF0IHdyaXRlXG4gICAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgICAgLy8gPT4gQ2hlY2sgd2hldGhlciBgZGVzdGAgaXMgc3RpbGwgYSBwaXBpbmcgZGVzdGluYXRpb24uXG4gICAgICBpZiAoKHN0YXRlLnBpcGVzQ291bnQgPT09IDEgJiYgc3RhdGUucGlwZXMgPT09IGRlc3QgfHwgc3RhdGUucGlwZXNDb3VudCA+IDEgJiYgaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCkgIT09IC0xKSAmJiAhY2xlYW5lZFVwKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzcmMuX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbik7XG4gICAgICAgIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKys7XG4gICAgICAgIGluY3JlYXNlZEF3YWl0RHJhaW4gPSB0cnVlO1xuICAgICAgfVxuICAgICAgc3JjLnBhdXNlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIGRlc3QgaGFzIGFuIGVycm9yLCB0aGVuIHN0b3AgcGlwaW5nIGludG8gaXQuXG4gIC8vIGhvd2V2ZXIsIGRvbid0IHN1cHByZXNzIHRoZSB0aHJvd2luZyBiZWhhdmlvciBmb3IgdGhpcy5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGRlYnVnKCdvbmVycm9yJywgZXIpO1xuICAgIHVucGlwZSgpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgaWYgKGxpc3RlbmVyQ291bnQoZGVzdCwgJ2Vycm9yJykgPT09IDApIGRlc3QuZW1pdCgnZXJyb3InLCBlcik7XG4gIH1cblxuICAvLyBNYWtlIHN1cmUgb3VyIGVycm9yIGhhbmRsZXIgaXMgYXR0YWNoZWQgYmVmb3JlIHVzZXJsYW5kIG9uZXMuXG4gIHByZXBlbmRMaXN0ZW5lcihkZXN0LCAnZXJyb3InLCBvbmVycm9yKTtcblxuICAvLyBCb3RoIGNsb3NlIGFuZCBmaW5pc2ggc2hvdWxkIHRyaWdnZXIgdW5waXBlLCBidXQgb25seSBvbmNlLlxuICBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2Nsb3NlJywgb25jbG9zZSk7XG4gIGZ1bmN0aW9uIG9uZmluaXNoKCkge1xuICAgIGRlYnVnKCdvbmZpbmlzaCcpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cbiAgZnVuY3Rpb24gdW5waXBlKCkge1xuICAgIGRlYnVnKCd1bnBpcGUnKTtcbiAgICBzcmMudW5waXBlKGRlc3QpO1xuICB9XG5cbiAgLy8gdGVsbCB0aGUgZGVzdCB0aGF0IGl0J3MgYmVpbmcgcGlwZWQgdG9cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKTtcblxuICAvLyBzdGFydCB0aGUgZmxvdyBpZiBpdCBoYXNuJ3QgYmVlbiBzdGFydGVkIGFscmVhZHkuXG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwaXBlIHJlc3VtZScpO1xuICAgIHNyYy5yZXN1bWUoKTtcbiAgfVxuXG4gIHJldHVybiBkZXN0O1xufTtcblxuZnVuY3Rpb24gcGlwZU9uRHJhaW4oc3JjKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN0YXRlID0gc3JjLl9yZWFkYWJsZVN0YXRlO1xuICAgIGRlYnVnKCdwaXBlT25EcmFpbicsIHN0YXRlLmF3YWl0RHJhaW4pO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluKSBzdGF0ZS5hd2FpdERyYWluLS07XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPT09IDAgJiYgc3JjLmxpc3RlbmVycygnZGF0YScpLmxlbmd0aCkge1xuICAgICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgICBmbG93KHNyYyk7XG4gICAgfVxuICB9O1xufVxuXG5SZWFkYWJsZS5wcm90b3R5cGUudW5waXBlID0gZnVuY3Rpb24gKGRlc3QpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBpZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAwKSByZXR1cm4gdGhpcztcblxuICAvLyBqdXN0IG9uZSBkZXN0aW5hdGlvbi4gIG1vc3QgY29tbW9uIGNhc2UuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSB7XG4gICAgLy8gcGFzc2VkIGluIG9uZSwgYnV0IGl0J3Mgbm90IHRoZSByaWdodCBvbmUuXG4gICAgaWYgKGRlc3QgJiYgZGVzdCAhPT0gc3RhdGUucGlwZXMpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKCFkZXN0KSBkZXN0ID0gc3RhdGUucGlwZXM7XG5cbiAgICAvLyBnb3QgYSBtYXRjaC5cbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIGlmIChkZXN0KSBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gc2xvdyBjYXNlLiBtdWx0aXBsZSBwaXBlIGRlc3RpbmF0aW9ucy5cblxuICBpZiAoIWRlc3QpIHtcbiAgICAvLyByZW1vdmUgYWxsLlxuICAgIHZhciBkZXN0cyA9IHN0YXRlLnBpcGVzO1xuICAgIHZhciBsZW4gPSBzdGF0ZS5waXBlc0NvdW50O1xuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGVuOyBfaSsrKSB7XG4gICAgICBkZXN0c1tfaV0uZW1pdCgndW5waXBlJywgdGhpcyk7XG4gICAgfXJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gdHJ5IHRvIGZpbmQgdGhlIHJpZ2h0IG9uZS5cbiAgdmFyIGkgPSBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KTtcbiAgaWYgKGkgPT09IC0xKSByZXR1cm4gdGhpcztcblxuICBzdGF0ZS5waXBlcy5zcGxpY2UoaSwgMSk7XG4gIHN0YXRlLnBpcGVzQ291bnQgLT0gMTtcbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHN0YXRlLnBpcGVzID0gc3RhdGUucGlwZXNbMF07XG5cbiAgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIHNldCB1cCBkYXRhIGV2ZW50cyBpZiB0aGV5IGFyZSBhc2tlZCBmb3Jcbi8vIEVuc3VyZSByZWFkYWJsZSBsaXN0ZW5lcnMgZXZlbnR1YWxseSBnZXQgc29tZXRoaW5nXG5SZWFkYWJsZS5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAoZXYsIGZuKSB7XG4gIHZhciByZXMgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uLmNhbGwodGhpcywgZXYsIGZuKTtcblxuICBpZiAoZXYgPT09ICdkYXRhJykge1xuICAgIC8vIFN0YXJ0IGZsb3dpbmcgb24gbmV4dCB0aWNrIGlmIHN0cmVhbSBpc24ndCBleHBsaWNpdGx5IHBhdXNlZFxuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgIT09IGZhbHNlKSB0aGlzLnJlc3VtZSgpO1xuICB9IGVsc2UgaWYgKGV2ID09PSAncmVhZGFibGUnKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nKSB7XG4gICAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIGlmICghc3RhdGUucmVhZGluZykge1xuICAgICAgICBuZXh0VGljayhuUmVhZGluZ05leHRUaWNrLCB0aGlzKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGVuZ3RoKSB7XG4gICAgICAgIGVtaXRSZWFkYWJsZSh0aGlzLCBzdGF0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5SZWFkYWJsZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBSZWFkYWJsZS5wcm90b3R5cGUub247XG5cbmZ1bmN0aW9uIG5SZWFkaW5nTmV4dFRpY2soc2VsZikge1xuICBkZWJ1ZygncmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwJyk7XG4gIHNlbGYucmVhZCgwKTtcbn1cblxuLy8gcGF1c2UoKSBhbmQgcmVzdW1lKCkgYXJlIHJlbW5hbnRzIG9mIHRoZSBsZWdhY3kgcmVhZGFibGUgc3RyZWFtIEFQSVxuLy8gSWYgdGhlIHVzZXIgdXNlcyB0aGVtLCB0aGVuIHN3aXRjaCBpbnRvIG9sZCBtb2RlLlxuUmVhZGFibGUucHJvdG90eXBlLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZScpO1xuICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgIHJlc3VtZSh0aGlzLCBzdGF0ZSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiByZXN1bWUoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnJlc3VtZVNjaGVkdWxlZCkge1xuICAgIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IHRydWU7XG4gICAgbmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RhdGUuYXdhaXREcmFpbiA9IDA7XG4gIHN0cmVhbS5lbWl0KCdyZXN1bWUnKTtcbiAgZmxvdyhzdHJlYW0pO1xuICBpZiAoc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUucmVhZGluZykgc3RyZWFtLnJlYWQoMCk7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyk7XG4gIGlmIChmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BhdXNlJyk7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZmxvdyhzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZmxvdycsIHN0YXRlLmZsb3dpbmcpO1xuICB3aGlsZSAoc3RhdGUuZmxvd2luZyAmJiBzdHJlYW0ucmVhZCgpICE9PSBudWxsKSB7fVxufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHBhdXNlZCA9IGZhbHNlO1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgc2VsZi5wdXNoKGNodW5rKTtcbiAgICB9XG5cbiAgICBzZWxmLnB1c2gobnVsbCk7XG4gIH0pO1xuXG4gIHN0cmVhbS5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgIGRlYnVnKCd3cmFwcGVkIGRhdGEnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcblxuICAgIC8vIGRvbid0IHNraXAgb3ZlciBmYWxzeSB2YWx1ZXMgaW4gb2JqZWN0TW9kZVxuICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlICYmIChjaHVuayA9PT0gbnVsbCB8fCBjaHVuayA9PT0gdW5kZWZpbmVkKSkgcmV0dXJuO2Vsc2UgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmICghY2h1bmsgfHwgIWNodW5rLmxlbmd0aCkpIHJldHVybjtcblxuICAgIHZhciByZXQgPSBzZWxmLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIHZhciBldmVudHMgPSBbJ2Vycm9yJywgJ2Nsb3NlJywgJ2Rlc3Ryb3knLCAncGF1c2UnLCAncmVzdW1lJ107XG4gIGZvckVhY2goZXZlbnRzLCBmdW5jdGlvbiAoZXYpIHtcbiAgICBzdHJlYW0ub24oZXYsIHNlbGYuZW1pdC5iaW5kKHNlbGYsIGV2KSk7XG4gIH0pO1xuXG4gIC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG4gIHNlbGYuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzZWxmO1xufTtcblxuLy8gZXhwb3NlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuUmVhZGFibGUuX2Zyb21MaXN0ID0gZnJvbUxpc3Q7XG5cbi8vIFBsdWNrIG9mZiBuIGJ5dGVzIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVycy5cbi8vIExlbmd0aCBpcyB0aGUgY29tYmluZWQgbGVuZ3RocyBvZiBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGxpc3QuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGZyb21MaXN0KG4sIHN0YXRlKSB7XG4gIC8vIG5vdGhpbmcgYnVmZmVyZWRcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgdmFyIHJldDtcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldCA9IHN0YXRlLmJ1ZmZlci5zaGlmdCgpO2Vsc2UgaWYgKCFuIHx8IG4gPj0gc3RhdGUubGVuZ3RoKSB7XG4gICAgLy8gcmVhZCBpdCBhbGwsIHRydW5jYXRlIHRoZSBsaXN0XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpIHJldCA9IHN0YXRlLmJ1ZmZlci5qb2luKCcnKTtlbHNlIGlmIChzdGF0ZS5idWZmZXIubGVuZ3RoID09PSAxKSByZXQgPSBzdGF0ZS5idWZmZXIuaGVhZC5kYXRhO2Vsc2UgcmV0ID0gc3RhdGUuYnVmZmVyLmNvbmNhdChzdGF0ZS5sZW5ndGgpO1xuICAgIHN0YXRlLmJ1ZmZlci5jbGVhcigpO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlYWQgcGFydCBvZiBsaXN0XG4gICAgcmV0ID0gZnJvbUxpc3RQYXJ0aWFsKG4sIHN0YXRlLmJ1ZmZlciwgc3RhdGUuZGVjb2Rlcik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG4vLyBFeHRyYWN0cyBvbmx5IGVub3VnaCBidWZmZXJlZCBkYXRhIHRvIHNhdGlzZnkgdGhlIGFtb3VudCByZXF1ZXN0ZWQuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGZyb21MaXN0UGFydGlhbChuLCBsaXN0LCBoYXNTdHJpbmdzKSB7XG4gIHZhciByZXQ7XG4gIGlmIChuIDwgbGlzdC5oZWFkLmRhdGEubGVuZ3RoKSB7XG4gICAgLy8gc2xpY2UgaXMgdGhlIHNhbWUgZm9yIGJ1ZmZlcnMgYW5kIHN0cmluZ3NcbiAgICByZXQgPSBsaXN0LmhlYWQuZGF0YS5zbGljZSgwLCBuKTtcbiAgICBsaXN0LmhlYWQuZGF0YSA9IGxpc3QuaGVhZC5kYXRhLnNsaWNlKG4pO1xuICB9IGVsc2UgaWYgKG4gPT09IGxpc3QuaGVhZC5kYXRhLmxlbmd0aCkge1xuICAgIC8vIGZpcnN0IGNodW5rIGlzIGEgcGVyZmVjdCBtYXRjaFxuICAgIHJldCA9IGxpc3Quc2hpZnQoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZXN1bHQgc3BhbnMgbW9yZSB0aGFuIG9uZSBidWZmZXJcbiAgICByZXQgPSBoYXNTdHJpbmdzID8gY29weUZyb21CdWZmZXJTdHJpbmcobiwgbGlzdCkgOiBjb3B5RnJvbUJ1ZmZlcihuLCBsaXN0KTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vLyBDb3BpZXMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGlzdCBvZiBidWZmZXJlZCBkYXRhXG4vLyBjaHVua3MuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGNvcHlGcm9tQnVmZmVyU3RyaW5nKG4sIGxpc3QpIHtcbiAgdmFyIHAgPSBsaXN0LmhlYWQ7XG4gIHZhciBjID0gMTtcbiAgdmFyIHJldCA9IHAuZGF0YTtcbiAgbiAtPSByZXQubGVuZ3RoO1xuICB3aGlsZSAocCA9IHAubmV4dCkge1xuICAgIHZhciBzdHIgPSBwLmRhdGE7XG4gICAgdmFyIG5iID0gbiA+IHN0ci5sZW5ndGggPyBzdHIubGVuZ3RoIDogbjtcbiAgICBpZiAobmIgPT09IHN0ci5sZW5ndGgpIHJldCArPSBzdHI7ZWxzZSByZXQgKz0gc3RyLnNsaWNlKDAsIG4pO1xuICAgIG4gLT0gbmI7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGlmIChuYiA9PT0gc3RyLmxlbmd0aCkge1xuICAgICAgICArK2M7XG4gICAgICAgIGlmIChwLm5leHQpIGxpc3QuaGVhZCA9IHAubmV4dDtlbHNlIGxpc3QuaGVhZCA9IGxpc3QudGFpbCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0LmhlYWQgPSBwO1xuICAgICAgICBwLmRhdGEgPSBzdHIuc2xpY2UobmIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgICsrYztcbiAgfVxuICBsaXN0Lmxlbmd0aCAtPSBjO1xuICByZXR1cm4gcmV0O1xufVxuXG4vLyBDb3BpZXMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIGJ5dGVzIGZyb20gdGhlIGxpc3Qgb2YgYnVmZmVyZWQgZGF0YSBjaHVua3MuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGNvcHlGcm9tQnVmZmVyKG4sIGxpc3QpIHtcbiAgdmFyIHJldCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuKTtcbiAgdmFyIHAgPSBsaXN0LmhlYWQ7XG4gIHZhciBjID0gMTtcbiAgcC5kYXRhLmNvcHkocmV0KTtcbiAgbiAtPSBwLmRhdGEubGVuZ3RoO1xuICB3aGlsZSAocCA9IHAubmV4dCkge1xuICAgIHZhciBidWYgPSBwLmRhdGE7XG4gICAgdmFyIG5iID0gbiA+IGJ1Zi5sZW5ndGggPyBidWYubGVuZ3RoIDogbjtcbiAgICBidWYuY29weShyZXQsIHJldC5sZW5ndGggLSBuLCAwLCBuYik7XG4gICAgbiAtPSBuYjtcbiAgICBpZiAobiA9PT0gMCkge1xuICAgICAgaWYgKG5iID09PSBidWYubGVuZ3RoKSB7XG4gICAgICAgICsrYztcbiAgICAgICAgaWYgKHAubmV4dCkgbGlzdC5oZWFkID0gcC5uZXh0O2Vsc2UgbGlzdC5oZWFkID0gbGlzdC50YWlsID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpc3QuaGVhZCA9IHA7XG4gICAgICAgIHAuZGF0YSA9IGJ1Zi5zbGljZShuYik7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgKytjO1xuICB9XG4gIGxpc3QubGVuZ3RoIC09IGM7XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gSWYgd2UgZ2V0IGhlcmUgYmVmb3JlIGNvbnN1bWluZyBhbGwgdGhlIGJ5dGVzLCB0aGVuIHRoYXQgaXMgYVxuICAvLyBidWcgaW4gbm9kZS4gIFNob3VsZCBuZXZlciBoYXBwZW4uXG4gIGlmIChzdGF0ZS5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoJ1wiZW5kUmVhZGFibGUoKVwiIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7XG5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkKSB7XG4gICAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICAgIG5leHRUaWNrKGVuZFJlYWRhYmxlTlQsIHN0YXRlLCBzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlTlQoc3RhdGUsIHN0cmVhbSkge1xuICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIHN0YXRlLmVuZEVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdlbmQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoKHhzLCBmKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZih4c1tpXSwgaSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5kZXhPZih4cywgeCkge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmICh4c1tpXSA9PT0geCkgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuIiwiLy8gQSBiaXQgc2ltcGxlciB0aGFuIHJlYWRhYmxlIHN0cmVhbXMuXG4vLyBJbXBsZW1lbnQgYW4gYXN5bmMgLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIGNiKSwgYW5kIGl0J2xsIGhhbmRsZSBhbGxcbi8vIHRoZSBkcmFpbiBldmVudCBlbWlzc2lvbiBhbmQgYnVmZmVyaW5nLlxuXG5cbmltcG9ydCB7aW5oZXJpdHMsIGRlcHJlY2F0ZX0gZnJvbSAndXRpbCc7XG5pbXBvcnQge0J1ZmZlcn0gZnJvbSAnYnVmZmVyJztcbldyaXRhYmxlLldyaXRhYmxlU3RhdGUgPSBXcml0YWJsZVN0YXRlO1xuaW1wb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQge0R1cGxleH0gZnJvbSAnLi9kdXBsZXgnO1xuaW1wb3J0IHtuZXh0VGlja30gZnJvbSAncHJvY2Vzcyc7XG5pbmhlcml0cyhXcml0YWJsZSwgRXZlbnRFbWl0dGVyKTtcblxuZnVuY3Rpb24gbm9wKCkge31cblxuZnVuY3Rpb24gV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aGlzLmNodW5rID0gY2h1bms7XG4gIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgdGhpcy5jYWxsYmFjayA9IGNiO1xuICB0aGlzLm5leHQgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2J1ZmZlcicsIHtcbiAgICBnZXQ6IGRlcHJlY2F0ZShmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICB9LCAnX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgJyArICdpbnN0ZWFkLicpXG4gIH0pO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBzdHJlYW1cbiAgLy8gY29udGFpbnMgYnVmZmVycyBvciBvYmplY3RzLlxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggd3JpdGUoKSBzdGFydHMgcmV0dXJuaW5nIGZhbHNlXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgdGhhdCB3ZSBhbHdheXMgcmV0dXJuIGZhbHNlIGlmXG4gIC8vIHRoZSBlbnRpcmUgYnVmZmVyIGlzIG5vdCBmbHVzaGVkIGltbWVkaWF0ZWx5IG9uIHdyaXRlKClcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaHdtIHx8IGh3bSA9PT0gMCA/IGh3bSA6IGRlZmF1bHRId207XG5cbiAgLy8gY2FzdCB0byBpbnRzLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSB+IH50aGlzLmhpZ2hXYXRlck1hcms7XG5cbiAgdGhpcy5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgLy8gYXQgdGhlIHN0YXJ0IG9mIGNhbGxpbmcgZW5kKClcbiAgdGhpcy5lbmRpbmcgPSBmYWxzZTtcbiAgLy8gd2hlbiBlbmQoKSBoYXMgYmVlbiBjYWxsZWQsIGFuZCByZXR1cm5lZFxuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIC8vIHdoZW4gJ2ZpbmlzaCcgaXMgZW1pdHRlZFxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gc2hvdWxkIHdlIGRlY29kZSBzdHJpbmdzIGludG8gYnVmZmVycyBiZWZvcmUgcGFzc2luZyB0byBfd3JpdGU/XG4gIC8vIHRoaXMgaXMgaGVyZSBzbyB0aGF0IHNvbWUgbm9kZS1jb3JlIHN0cmVhbXMgY2FuIG9wdGltaXplIHN0cmluZ1xuICAvLyBoYW5kbGluZyBhdCBhIGxvd2VyIGxldmVsLlxuICB2YXIgbm9EZWNvZGUgPSBvcHRpb25zLmRlY29kZVN0cmluZ3MgPT09IGZhbHNlO1xuICB0aGlzLmRlY29kZVN0cmluZ3MgPSAhbm9EZWNvZGU7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gbm90IGFuIGFjdHVhbCBidWZmZXIgd2Uga2VlcCB0cmFjayBvZiwgYnV0IGEgbWVhc3VyZW1lbnRcbiAgLy8gb2YgaG93IG11Y2ggd2UncmUgd2FpdGluZyB0byBnZXQgcHVzaGVkIHRvIHNvbWUgdW5kZXJseWluZ1xuICAvLyBzb2NrZXQgb3IgZmlsZS5cbiAgdGhpcy5sZW5ndGggPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBzZWUgd2hlbiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuXG4gIHRoaXMud3JpdGluZyA9IGZhbHNlO1xuXG4gIC8vIHdoZW4gdHJ1ZSBhbGwgd3JpdGVzIHdpbGwgYmUgYnVmZmVyZWQgdW50aWwgLnVuY29yaygpIGNhbGxcbiAgdGhpcy5jb3JrZWQgPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIGEgZmxhZyB0byBrbm93IGlmIHdlJ3JlIHByb2Nlc3NpbmcgcHJldmlvdXNseSBidWZmZXJlZCBpdGVtcywgd2hpY2hcbiAgLy8gbWF5IGNhbGwgdGhlIF93cml0ZSgpIGNhbGxiYWNrIGluIHRoZSBzYW1lIHRpY2ssIHNvIHRoYXQgd2UgZG9uJ3RcbiAgLy8gZW5kIHVwIGluIGFuIG92ZXJsYXBwZWQgb253cml0ZSBzaXR1YXRpb24uXG4gIHRoaXMuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0J3MgcGFzc2VkIHRvIF93cml0ZShjaHVuayxjYilcbiAgdGhpcy5vbndyaXRlID0gZnVuY3Rpb24gKGVyKSB7XG4gICAgb253cml0ZShzdHJlYW0sIGVyKTtcbiAgfTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCB0aGUgdXNlciBzdXBwbGllcyB0byB3cml0ZShjaHVuayxlbmNvZGluZyxjYilcbiAgdGhpcy53cml0ZWNiID0gbnVsbDtcblxuICAvLyB0aGUgYW1vdW50IHRoYXQgaXMgYmVpbmcgd3JpdHRlbiB3aGVuIF93cml0ZSBpcyBjYWxsZWQuXG4gIHRoaXMud3JpdGVsZW4gPSAwO1xuXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcblxuICAvLyBudW1iZXIgb2YgcGVuZGluZyB1c2VyLXN1cHBsaWVkIHdyaXRlIGNhbGxiYWNrc1xuICAvLyB0aGlzIG11c3QgYmUgMCBiZWZvcmUgJ2ZpbmlzaCcgY2FuIGJlIGVtaXR0ZWRcbiAgdGhpcy5wZW5kaW5nY2IgPSAwO1xuXG4gIC8vIGVtaXQgcHJlZmluaXNoIGlmIHRoZSBvbmx5IHRoaW5nIHdlJ3JlIHdhaXRpbmcgZm9yIGlzIF93cml0ZSBjYnNcbiAgLy8gVGhpcyBpcyByZWxldmFudCBmb3Igc3luY2hyb25vdXMgVHJhbnNmb3JtIHN0cmVhbXNcbiAgdGhpcy5wcmVmaW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIFRydWUgaWYgdGhlIGVycm9yIHdhcyBhbHJlYWR5IGVtaXR0ZWQgYW5kIHNob3VsZCBub3QgYmUgdGhyb3duIGFnYWluXG4gIHRoaXMuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG5cbiAgLy8gY291bnQgYnVmZmVyZWQgcmVxdWVzdHNcbiAgdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7XG5cbiAgLy8gYWxsb2NhdGUgdGhlIGZpcnN0IENvcmtlZFJlcXVlc3QsIHRoZXJlIGlzIGFsd2F5c1xuICAvLyBvbmUgYWxsb2NhdGVkIGFuZCBmcmVlIHRvIHVzZSwgYW5kIHdlIG1haW50YWluIGF0IG1vc3QgdHdvXG4gIHRoaXMuY29ya2VkUmVxdWVzdHNGcmVlID0gbmV3IENvcmtlZFJlcXVlc3QodGhpcyk7XG59XG5cbldyaXRhYmxlU3RhdGUucHJvdG90eXBlLmdldEJ1ZmZlciA9IGZ1bmN0aW9uIHdyaXRhYmxlU3RhdGVHZXRCdWZmZXIoKSB7XG4gIHZhciBjdXJyZW50ID0gdGhpcy5idWZmZXJlZFJlcXVlc3Q7XG4gIHZhciBvdXQgPSBbXTtcbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBvdXQucHVzaChjdXJyZW50KTtcbiAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICB9XG4gIHJldHVybiBvdXQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBXcml0YWJsZTtcbmV4cG9ydCBmdW5jdGlvbiBXcml0YWJsZShvcHRpb25zKSB7XG5cbiAgLy8gV3JpdGFibGUgY3RvciBpcyBhcHBsaWVkIHRvIER1cGxleGVzLCB0aG91Z2ggdGhleSdyZSBub3RcbiAgLy8gaW5zdGFuY2VvZiBXcml0YWJsZSwgdGhleSdyZSBpbnN0YW5jZW9mIFJlYWRhYmxlLlxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgV3JpdGFibGUpICYmICEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgV3JpdGFibGUob3B0aW9ucyk7XG5cbiAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMpO1xuXG4gIC8vIGxlZ2FjeS5cbiAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGUgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRlID0gb3B0aW9ucy53cml0ZTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZXYgPT09ICdmdW5jdGlvbicpIHRoaXMuX3dyaXRldiA9IG9wdGlvbnMud3JpdGV2O1xuICB9XG5cbiAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7XG59XG5cbi8vIE90aGVyd2lzZSBwZW9wbGUgY2FuIHBpcGUgV3JpdGFibGUgc3RyZWFtcywgd2hpY2ggaXMganVzdCB3cm9uZy5cbldyaXRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlJykpO1xufTtcblxuZnVuY3Rpb24gd3JpdGVBZnRlckVuZChzdHJlYW0sIGNiKSB7XG4gIHZhciBlciA9IG5ldyBFcnJvcignd3JpdGUgYWZ0ZXIgZW5kJyk7XG4gIC8vIFRPRE86IGRlZmVyIGVycm9yIGV2ZW50cyBjb25zaXN0ZW50bHkgZXZlcnl3aGVyZSwgbm90IGp1c3QgdGhlIGNiXG4gIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgbmV4dFRpY2soY2IsIGVyKTtcbn1cblxuLy8gSWYgd2UgZ2V0IHNvbWV0aGluZyB0aGF0IGlzIG5vdCBhIGJ1ZmZlciwgc3RyaW5nLCBudWxsLCBvciB1bmRlZmluZWQsXG4vLyBhbmQgd2UncmUgbm90IGluIG9iamVjdE1vZGUsIHRoZW4gdGhhdCdzIGFuIGVycm9yLlxuLy8gT3RoZXJ3aXNlIHN0cmVhbSBjaHVua3MgYXJlIGFsbCBjb25zaWRlcmVkIHRvIGJlIG9mIGxlbmd0aD0xLCBhbmQgdGhlXG4vLyB3YXRlcm1hcmtzIGRldGVybWluZSBob3cgbWFueSBvYmplY3RzIHRvIGtlZXAgaW4gdGhlIGJ1ZmZlciwgcmF0aGVyIHRoYW5cbi8vIGhvdyBtYW55IGJ5dGVzIG9yIGNoYXJhY3RlcnMuXG5mdW5jdGlvbiB2YWxpZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBjYikge1xuICB2YXIgdmFsaWQgPSB0cnVlO1xuICB2YXIgZXIgPSBmYWxzZTtcbiAgLy8gQWx3YXlzIHRocm93IGVycm9yIGlmIGEgbnVsbCBpcyB3cml0dGVuXG4gIC8vIGlmIHdlIGFyZSBub3QgaW4gb2JqZWN0IG1vZGUgdGhlbiB0aHJvd1xuICAvLyBpZiBpdCBpcyBub3QgYSBidWZmZXIsIHN0cmluZywgb3IgdW5kZWZpbmVkLlxuICBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ01heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtJyk7XG4gIH0gZWxzZSBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgaWYgKGVyKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgIG5leHRUaWNrKGNiLCBlcik7XG4gICAgdmFsaWQgPSBmYWxzZTtcbiAgfVxuICByZXR1cm4gdmFsaWQ7XG59XG5cbldyaXRhYmxlLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG4gIHZhciByZXQgPSBmYWxzZTtcblxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkgZW5jb2RpbmcgPSAnYnVmZmVyJztlbHNlIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuXG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIGNiID0gbm9wO1xuXG4gIGlmIChzdGF0ZS5lbmRlZCkgd3JpdGVBZnRlckVuZCh0aGlzLCBjYik7ZWxzZSBpZiAodmFsaWRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGNiKSkge1xuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHJldCA9IHdyaXRlT3JCdWZmZXIodGhpcywgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIHN0YXRlLmNvcmtlZCsrO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnVuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkLS07XG5cbiAgICBpZiAoIXN0YXRlLndyaXRpbmcgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSBjbGVhckJ1ZmZlcih0aGlzLCBzdGF0ZSk7XG4gIH1cbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2RpbmcgPSBmdW5jdGlvbiBzZXREZWZhdWx0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgLy8gbm9kZTo6UGFyc2VFbmNvZGluZygpIHJlcXVpcmVzIGxvd2VyIGNhc2UuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSBlbmNvZGluZyA9IGVuY29kaW5nLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghKFsnaGV4JywgJ3V0ZjgnLCAndXRmLTgnLCAnYXNjaWknLCAnYmluYXJ5JywgJ2Jhc2U2NCcsICd1Y3MyJywgJ3Vjcy0yJywgJ3V0ZjE2bGUnLCAndXRmLTE2bGUnLCAncmF3J10uaW5kZXhPZigoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKSkgPiAtMSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZykge1xuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgc3RhdGUuZGVjb2RlU3RyaW5ncyAhPT0gZmFsc2UgJiYgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgfVxuICByZXR1cm4gY2h1bms7XG59XG5cbi8vIGlmIHdlJ3JlIGFscmVhZHkgd3JpdGluZyBzb21ldGhpbmcsIHRoZW4ganVzdCBwdXQgdGhpc1xuLy8gaW4gdGhlIHF1ZXVlLCBhbmQgd2FpdCBvdXIgdHVybi4gIE90aGVyd2lzZSwgY2FsbCBfd3JpdGVcbi8vIElmIHdlIHJldHVybiBmYWxzZSwgdGhlbiB3ZSBuZWVkIGEgZHJhaW4gZXZlbnQsIHNvIHNldCB0aGF0IGZsYWcuXG5mdW5jdGlvbiB3cml0ZU9yQnVmZmVyKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2h1bmsgPSBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKTtcblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkgZW5jb2RpbmcgPSAnYnVmZmVyJztcbiAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuXG4gIHN0YXRlLmxlbmd0aCArPSBsZW47XG5cbiAgdmFyIHJldCA9IHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIC8vIHdlIG11c3QgZW5zdXJlIHRoYXQgcHJldmlvdXMgbmVlZERyYWluIHdpbGwgbm90IGJlIHJlc2V0IHRvIGZhbHNlLlxuICBpZiAoIXJldCkgc3RhdGUubmVlZERyYWluID0gdHJ1ZTtcblxuICBpZiAoc3RhdGUud3JpdGluZyB8fCBzdGF0ZS5jb3JrZWQpIHtcbiAgICB2YXIgbGFzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG5ldyBXcml0ZVJlcShjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgICBpZiAobGFzdCkge1xuICAgICAgbGFzdC5uZXh0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9XG4gICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgKz0gMTtcbiAgfSBlbHNlIHtcbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB3cml0ZXYsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBzdGF0ZS53cml0ZWxlbiA9IGxlbjtcbiAgc3RhdGUud3JpdGVjYiA9IGNiO1xuICBzdGF0ZS53cml0aW5nID0gdHJ1ZTtcbiAgc3RhdGUuc3luYyA9IHRydWU7XG4gIGlmICh3cml0ZXYpIHN0cmVhbS5fd3JpdGV2KGNodW5rLCBzdGF0ZS5vbndyaXRlKTtlbHNlIHN0cmVhbS5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBzdGF0ZS5vbndyaXRlKTtcbiAgc3RhdGUuc3luYyA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKSB7XG4gIC0tc3RhdGUucGVuZGluZ2NiO1xuICBpZiAoc3luYykgbmV4dFRpY2soY2IsIGVyKTtlbHNlIGNiKGVyKTtcblxuICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpIHtcbiAgc3RhdGUud3JpdGluZyA9IGZhbHNlO1xuICBzdGF0ZS53cml0ZWNiID0gbnVsbDtcbiAgc3RhdGUubGVuZ3RoIC09IHN0YXRlLndyaXRlbGVuO1xuICBzdGF0ZS53cml0ZWxlbiA9IDA7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGUoc3RyZWFtLCBlcikge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG4gIHZhciBzeW5jID0gc3RhdGUuc3luYztcbiAgdmFyIGNiID0gc3RhdGUud3JpdGVjYjtcblxuICBvbndyaXRlU3RhdGVVcGRhdGUoc3RhdGUpO1xuXG4gIGlmIChlcikgb253cml0ZUVycm9yKHN0cmVhbSwgc3RhdGUsIHN5bmMsIGVyLCBjYik7ZWxzZSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgYWN0dWFsbHkgcmVhZHkgdG8gZmluaXNoLCBidXQgZG9uJ3QgZW1pdCB5ZXRcbiAgICB2YXIgZmluaXNoZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcblxuICAgIGlmICghZmluaXNoZWQgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIHtcbiAgICAgIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChzeW5jKSB7XG4gICAgICAvKjxyZXBsYWNlbWVudD4qL1xuICAgICAgICBuZXh0VGljayhhZnRlcldyaXRlLCBzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgICAgLyo8L3JlcGxhY2VtZW50PiovXG4gICAgfSBlbHNlIHtcbiAgICAgICAgYWZ0ZXJXcml0ZShzdHJlYW0sIHN0YXRlLCBmaW5pc2hlZCwgY2IpO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKSB7XG4gIGlmICghZmluaXNoZWQpIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlKTtcbiAgc3RhdGUucGVuZGluZ2NiLS07XG4gIGNiKCk7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xufVxuXG4vLyBNdXN0IGZvcmNlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBvbiBuZXh0VGljaywgc28gdGhhdCB3ZSBkb24ndFxuLy8gZW1pdCAnZHJhaW4nIGJlZm9yZSB0aGUgd3JpdGUoKSBjb25zdW1lciBnZXRzIHRoZSAnZmFsc2UnIHJldHVyblxuLy8gdmFsdWUsIGFuZCBoYXMgYSBjaGFuY2UgdG8gYXR0YWNoIGEgJ2RyYWluJyBsaXN0ZW5lci5cbmZ1bmN0aW9uIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUubmVlZERyYWluKSB7XG4gICAgc3RhdGUubmVlZERyYWluID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2RyYWluJyk7XG4gIH1cbn1cblxuLy8gaWYgdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciB3YWl0aW5nLCB0aGVuIHByb2Nlc3MgaXRcbmZ1bmN0aW9uIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IHRydWU7XG4gIHZhciBlbnRyeSA9IHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdDtcblxuICBpZiAoc3RyZWFtLl93cml0ZXYgJiYgZW50cnkgJiYgZW50cnkubmV4dCkge1xuICAgIC8vIEZhc3QgY2FzZSwgd3JpdGUgZXZlcnl0aGluZyB1c2luZyBfd3JpdGV2KClcbiAgICB2YXIgbCA9IHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50O1xuICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXkobCk7XG4gICAgdmFyIGhvbGRlciA9IHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZTtcbiAgICBob2xkZXIuZW50cnkgPSBlbnRyeTtcblxuICAgIHZhciBjb3VudCA9IDA7XG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICBidWZmZXJbY291bnRdID0gZW50cnk7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICBjb3VudCArPSAxO1xuICAgIH1cblxuICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgdHJ1ZSwgc3RhdGUubGVuZ3RoLCBidWZmZXIsICcnLCBob2xkZXIuZmluaXNoKTtcblxuICAgIC8vIGRvV3JpdGUgaXMgYWxtb3N0IGFsd2F5cyBhc3luYywgZGVmZXIgdGhlc2UgdG8gc2F2ZSBhIGJpdCBvZiB0aW1lXG4gICAgLy8gYXMgdGhlIGhvdCBwYXRoIGVuZHMgd2l0aCBkb1dyaXRlXG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gICAgaWYgKGhvbGRlci5uZXh0KSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBob2xkZXIubmV4dDtcbiAgICAgIGhvbGRlci5uZXh0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gbmV3IENvcmtlZFJlcXVlc3Qoc3RhdGUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBTbG93IGNhc2UsIHdyaXRlIGNodW5rcyBvbmUtYnktb25lXG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICB2YXIgY2h1bmsgPSBlbnRyeS5jaHVuaztcbiAgICAgIHZhciBlbmNvZGluZyA9IGVudHJ5LmVuY29kaW5nO1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICAvLyBpZiB3ZSBkaWRuJ3QgY2FsbCB0aGUgb253cml0ZSBpbW1lZGlhdGVseSwgdGhlblxuICAgICAgLy8gaXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXQgZG9lcy5cbiAgICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAgIC8vIGJlaW5nIHByb2Nlc3NlZCwgc28gbW92ZSB0aGUgYnVmZmVyIGNvdW50ZXIgcGFzdCB0aGVtLlxuICAgICAgaWYgKHN0YXRlLndyaXRpbmcpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5ID09PSBudWxsKSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gZW50cnk7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZXYgPSBudWxsO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVuaztcbiAgICBjaHVuayA9IG51bGw7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQpIHRoaXMud3JpdGUoY2h1bmssIGVuY29kaW5nKTtcblxuICAvLyAuZW5kKCkgZnVsbHkgdW5jb3Jrc1xuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkID0gMTtcbiAgICB0aGlzLnVuY29yaygpO1xuICB9XG5cbiAgLy8gaWdub3JlIHVubmVjZXNzYXJ5IGVuZCgpIGNhbGxzLlxuICBpZiAoIXN0YXRlLmVuZGluZyAmJiAhc3RhdGUuZmluaXNoZWQpIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5mdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5lbmRpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9PT0gbnVsbCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLndyaXRpbmc7XG59XG5cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQpIHtcbiAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIG5lZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcbiAgaWYgKG5lZWQpIHtcbiAgICBpZiAoc3RhdGUucGVuZGluZ2NiID09PSAwKSB7XG4gICAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgICBzdGF0ZS5maW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgnZmluaXNoJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lZWQ7XG59XG5cbmZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHN0YXRlLmVuZGluZyA9IHRydWU7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpIG5leHRUaWNrKGNiKTtlbHNlIHN0cmVhbS5vbmNlKCdmaW5pc2gnLCBjYik7XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICBzdHJlYW0ud3JpdGFibGUgPSBmYWxzZTtcbn1cblxuLy8gSXQgc2VlbXMgYSBsaW5rZWQgbGlzdCBidXQgaXQgaXMgbm90XG4vLyB0aGVyZSB3aWxsIGJlIG9ubHkgMiBvZiB0aGVzZSBmb3IgZWFjaCBzdHJlYW1cbmZ1bmN0aW9uIENvcmtlZFJlcXVlc3Qoc3RhdGUpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB0aGlzLm5leHQgPSBudWxsO1xuICB0aGlzLmVudHJ5ID0gbnVsbDtcblxuICB0aGlzLmZpbmlzaCA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICB2YXIgZW50cnkgPSBfdGhpcy5lbnRyeTtcbiAgICBfdGhpcy5lbnRyeSA9IG51bGw7XG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICAgIHN0YXRlLnBlbmRpbmdjYi0tO1xuICAgICAgY2IoZXJyKTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICB9XG4gICAgaWYgKHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSkge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQgPSBfdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gX3RoaXM7XG4gICAgfVxuICB9O1xufVxuIiwiXG5pbXBvcnQge2luaGVyaXRzfSBmcm9tICd1dGlsJztcbmltcG9ydCB7bmV4dFRpY2t9IGZyb20gJ3Byb2Nlc3MnO1xuaW1wb3J0IHtSZWFkYWJsZX0gZnJvbSAnLi9yZWFkYWJsZSc7XG5pbXBvcnQge1dyaXRhYmxlfSBmcm9tICcuL3dyaXRhYmxlJztcblxuXG5pbmhlcml0cyhEdXBsZXgsIFJlYWRhYmxlKTtcblxudmFyIGtleXMgPSBPYmplY3Qua2V5cyhXcml0YWJsZS5wcm90b3R5cGUpO1xuZm9yICh2YXIgdiA9IDA7IHYgPCBrZXlzLmxlbmd0aDsgdisrKSB7XG4gIHZhciBtZXRob2QgPSBrZXlzW3ZdO1xuICBpZiAoIUR1cGxleC5wcm90b3R5cGVbbWV0aG9kXSkgRHVwbGV4LnByb3RvdHlwZVttZXRob2RdID0gV3JpdGFibGUucHJvdG90eXBlW21ldGhvZF07XG59XG5leHBvcnQgZGVmYXVsdCBEdXBsZXg7XG5leHBvcnQgZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgRHVwbGV4KG9wdGlvbnMpO1xuXG4gIFJlYWRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIFdyaXRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZWFkYWJsZSA9PT0gZmFsc2UpIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLndyaXRhYmxlID09PSBmYWxzZSkgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuXG4gIHRoaXMuYWxsb3dIYWxmT3BlbiA9IHRydWU7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UpIHRoaXMuYWxsb3dIYWxmT3BlbiA9IGZhbHNlO1xuXG4gIHRoaXMub25jZSgnZW5kJywgb25lbmQpO1xufVxuXG4vLyB0aGUgbm8taGFsZi1vcGVuIGVuZm9yY2VyXG5mdW5jdGlvbiBvbmVuZCgpIHtcbiAgLy8gaWYgd2UgYWxsb3cgaGFsZi1vcGVuIHN0YXRlLCBvciBpZiB0aGUgd3JpdGFibGUgc2lkZSBlbmRlZCxcbiAgLy8gdGhlbiB3ZSdyZSBvay5cbiAgaWYgKHRoaXMuYWxsb3dIYWxmT3BlbiB8fCB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm47XG5cbiAgLy8gbm8gbW9yZSBkYXRhIGNhbiBiZSB3cml0dGVuLlxuICAvLyBCdXQgYWxsb3cgbW9yZSB3cml0ZXMgdG8gaGFwcGVuIGluIHRoaXMgdGljay5cbiAgbmV4dFRpY2sob25FbmROVCwgdGhpcyk7XG59XG5cbmZ1bmN0aW9uIG9uRW5kTlQoc2VsZikge1xuICBzZWxmLmVuZCgpO1xufVxuIiwiLy8gYSB0cmFuc2Zvcm0gc3RyZWFtIGlzIGEgcmVhZGFibGUvd3JpdGFibGUgc3RyZWFtIHdoZXJlIHlvdSBkb1xuLy8gc29tZXRoaW5nIHdpdGggdGhlIGRhdGEuICBTb21ldGltZXMgaXQncyBjYWxsZWQgYSBcImZpbHRlclwiLFxuLy8gYnV0IHRoYXQncyBub3QgYSBncmVhdCBuYW1lIGZvciBpdCwgc2luY2UgdGhhdCBpbXBsaWVzIGEgdGhpbmcgd2hlcmVcbi8vIHNvbWUgYml0cyBwYXNzIHRocm91Z2gsIGFuZCBvdGhlcnMgYXJlIHNpbXBseSBpZ25vcmVkLiAgKFRoYXQgd291bGRcbi8vIGJlIGEgdmFsaWQgZXhhbXBsZSBvZiBhIHRyYW5zZm9ybSwgb2YgY291cnNlLilcbi8vXG4vLyBXaGlsZSB0aGUgb3V0cHV0IGlzIGNhdXNhbGx5IHJlbGF0ZWQgdG8gdGhlIGlucHV0LCBpdCdzIG5vdCBhXG4vLyBuZWNlc3NhcmlseSBzeW1tZXRyaWMgb3Igc3luY2hyb25vdXMgdHJhbnNmb3JtYXRpb24uICBGb3IgZXhhbXBsZSxcbi8vIGEgemxpYiBzdHJlYW0gbWlnaHQgdGFrZSBtdWx0aXBsZSBwbGFpbi10ZXh0IHdyaXRlcygpLCBhbmQgdGhlblxuLy8gZW1pdCBhIHNpbmdsZSBjb21wcmVzc2VkIGNodW5rIHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlLlxuLy9cbi8vIEhlcmUncyBob3cgdGhpcyB3b3Jrczpcbi8vXG4vLyBUaGUgVHJhbnNmb3JtIHN0cmVhbSBoYXMgYWxsIHRoZSBhc3BlY3RzIG9mIHRoZSByZWFkYWJsZSBhbmQgd3JpdGFibGVcbi8vIHN0cmVhbSBjbGFzc2VzLiAgV2hlbiB5b3Ugd3JpdGUoY2h1bmspLCB0aGF0IGNhbGxzIF93cml0ZShjaHVuayxjYilcbi8vIGludGVybmFsbHksIGFuZCByZXR1cm5zIGZhbHNlIGlmIHRoZXJlJ3MgYSBsb3Qgb2YgcGVuZGluZyB3cml0ZXNcbi8vIGJ1ZmZlcmVkIHVwLiAgV2hlbiB5b3UgY2FsbCByZWFkKCksIHRoYXQgY2FsbHMgX3JlYWQobikgdW50aWxcbi8vIHRoZXJlJ3MgZW5vdWdoIHBlbmRpbmcgcmVhZGFibGUgZGF0YSBidWZmZXJlZCB1cC5cbi8vXG4vLyBJbiBhIHRyYW5zZm9ybSBzdHJlYW0sIHRoZSB3cml0dGVuIGRhdGEgaXMgcGxhY2VkIGluIGEgYnVmZmVyLiAgV2hlblxuLy8gX3JlYWQobikgaXMgY2FsbGVkLCBpdCB0cmFuc2Zvcm1zIHRoZSBxdWV1ZWQgdXAgZGF0YSwgY2FsbGluZyB0aGVcbi8vIGJ1ZmZlcmVkIF93cml0ZSBjYidzIGFzIGl0IGNvbnN1bWVzIGNodW5rcy4gIElmIGNvbnN1bWluZyBhIHNpbmdsZVxuLy8gd3JpdHRlbiBjaHVuayB3b3VsZCByZXN1bHQgaW4gbXVsdGlwbGUgb3V0cHV0IGNodW5rcywgdGhlbiB0aGUgZmlyc3Rcbi8vIG91dHB1dHRlZCBiaXQgY2FsbHMgdGhlIHJlYWRjYiwgYW5kIHN1YnNlcXVlbnQgY2h1bmtzIGp1c3QgZ28gaW50b1xuLy8gdGhlIHJlYWQgYnVmZmVyLCBhbmQgd2lsbCBjYXVzZSBpdCB0byBlbWl0ICdyZWFkYWJsZScgaWYgbmVjZXNzYXJ5LlxuLy9cbi8vIFRoaXMgd2F5LCBiYWNrLXByZXNzdXJlIGlzIGFjdHVhbGx5IGRldGVybWluZWQgYnkgdGhlIHJlYWRpbmcgc2lkZSxcbi8vIHNpbmNlIF9yZWFkIGhhcyB0byBiZSBjYWxsZWQgdG8gc3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBjaHVuay4gIEhvd2V2ZXIsXG4vLyBhIHBhdGhvbG9naWNhbCBpbmZsYXRlIHR5cGUgb2YgdHJhbnNmb3JtIGNhbiBjYXVzZSBleGNlc3NpdmUgYnVmZmVyaW5nXG4vLyBoZXJlLiAgRm9yIGV4YW1wbGUsIGltYWdpbmUgYSBzdHJlYW0gd2hlcmUgZXZlcnkgYnl0ZSBvZiBpbnB1dCBpc1xuLy8gaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlciBmcm9tIDAtMjU1LCBhbmQgdGhlbiByZXN1bHRzIGluIHRoYXQgbWFueVxuLy8gYnl0ZXMgb2Ygb3V0cHV0LiAgV3JpdGluZyB0aGUgNCBieXRlcyB7ZmYsZmYsZmYsZmZ9IHdvdWxkIHJlc3VsdCBpblxuLy8gMWtiIG9mIGRhdGEgYmVpbmcgb3V0cHV0LiAgSW4gdGhpcyBjYXNlLCB5b3UgY291bGQgd3JpdGUgYSB2ZXJ5IHNtYWxsXG4vLyBhbW91bnQgb2YgaW5wdXQsIGFuZCBlbmQgdXAgd2l0aCBhIHZlcnkgbGFyZ2UgYW1vdW50IG9mIG91dHB1dC4gIEluXG4vLyBzdWNoIGEgcGF0aG9sb2dpY2FsIGluZmxhdGluZyBtZWNoYW5pc20sIHRoZXJlJ2QgYmUgbm8gd2F5IHRvIHRlbGxcbi8vIHRoZSBzeXN0ZW0gdG8gc3RvcCBkb2luZyB0aGUgdHJhbnNmb3JtLiAgQSBzaW5nbGUgNE1CIHdyaXRlIGNvdWxkXG4vLyBjYXVzZSB0aGUgc3lzdGVtIHRvIHJ1biBvdXQgb2YgbWVtb3J5LlxuLy9cbi8vIEhvd2V2ZXIsIGV2ZW4gaW4gc3VjaCBhIHBhdGhvbG9naWNhbCBjYXNlLCBvbmx5IGEgc2luZ2xlIHdyaXR0ZW4gY2h1bmtcbi8vIHdvdWxkIGJlIGNvbnN1bWVkLCBhbmQgdGhlbiB0aGUgcmVzdCB3b3VsZCB3YWl0ICh1bi10cmFuc2Zvcm1lZCkgdW50aWxcbi8vIHRoZSByZXN1bHRzIG9mIHRoZSBwcmV2aW91cyB0cmFuc2Zvcm1lZCBjaHVuayB3ZXJlIGNvbnN1bWVkLlxuXG5cbmltcG9ydCB7RHVwbGV4fSBmcm9tICcuL2R1cGxleCc7XG5cblxuaW1wb3J0IHtpbmhlcml0c30gZnJvbSAndXRpbCc7XG5pbmhlcml0cyhUcmFuc2Zvcm0sIER1cGxleCk7XG5cbmZ1bmN0aW9uIFRyYW5zZm9ybVN0YXRlKHN0cmVhbSkge1xuICB0aGlzLmFmdGVyVHJhbnNmb3JtID0gZnVuY3Rpb24gKGVyLCBkYXRhKSB7XG4gICAgcmV0dXJuIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpO1xuICB9O1xuXG4gIHRoaXMubmVlZFRyYW5zZm9ybSA9IGZhbHNlO1xuICB0aGlzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuICB0aGlzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0aGlzLndyaXRlZW5jb2RpbmcgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybShzdHJlYW0sIGVyLCBkYXRhKSB7XG4gIHZhciB0cyA9IHN0cmVhbS5fdHJhbnNmb3JtU3RhdGU7XG4gIHRzLnRyYW5zZm9ybWluZyA9IGZhbHNlO1xuXG4gIHZhciBjYiA9IHRzLndyaXRlY2I7XG5cbiAgaWYgKCFjYikgcmV0dXJuIHN0cmVhbS5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm8gd3JpdGVjYiBpbiBUcmFuc2Zvcm0gY2xhc3MnKSk7XG5cbiAgdHMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRzLndyaXRlY2IgPSBudWxsO1xuXG4gIGlmIChkYXRhICE9PSBudWxsICYmIGRhdGEgIT09IHVuZGVmaW5lZCkgc3RyZWFtLnB1c2goZGF0YSk7XG5cbiAgY2IoZXIpO1xuXG4gIHZhciBycyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgcnMucmVhZGluZyA9IGZhbHNlO1xuICBpZiAocnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHtcbiAgICBzdHJlYW0uX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IFRyYW5zZm9ybTtcbmV4cG9ydCBmdW5jdGlvbiBUcmFuc2Zvcm0ob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVHJhbnNmb3JtKSkgcmV0dXJuIG5ldyBUcmFuc2Zvcm0ob3B0aW9ucyk7XG5cbiAgRHVwbGV4LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUgPSBuZXcgVHJhbnNmb3JtU3RhdGUodGhpcyk7XG5cbiAgLy8gd2hlbiB0aGUgd3JpdGFibGUgc2lkZSBmaW5pc2hlcywgdGhlbiBmbHVzaCBvdXQgYW55dGhpbmcgcmVtYWluaW5nLlxuICB2YXIgc3RyZWFtID0gdGhpcztcblxuICAvLyBzdGFydCBvdXQgYXNraW5nIGZvciBhIHJlYWRhYmxlIGV2ZW50IG9uY2UgZGF0YSBpcyB0cmFuc2Zvcm1lZC5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIHdlIGhhdmUgaW1wbGVtZW50ZWQgdGhlIF9yZWFkIG1ldGhvZCwgYW5kIGRvbmUgdGhlIG90aGVyIHRoaW5nc1xuICAvLyB0aGF0IFJlYWRhYmxlIHdhbnRzIGJlZm9yZSB0aGUgZmlyc3QgX3JlYWQgY2FsbCwgc28gdW5zZXQgdGhlXG4gIC8vIHN5bmMgZ3VhcmQgZmxhZy5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB0aGlzLl90cmFuc2Zvcm0gPSBvcHRpb25zLnRyYW5zZm9ybTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2ggPSBvcHRpb25zLmZsdXNoO1xuICB9XG5cbiAgdGhpcy5vbmNlKCdwcmVmaW5pc2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2goZnVuY3Rpb24gKGVyKSB7XG4gICAgICBkb25lKHN0cmVhbSwgZXIpO1xuICAgIH0pO2Vsc2UgZG9uZShzdHJlYW0pO1xuICB9KTtcbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHJldHVybiBEdXBsZXgucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBjaHVuaywgZW5jb2RpbmcpO1xufTtcblxuLy8gVGhpcyBpcyB0aGUgcGFydCB3aGVyZSB5b3UgZG8gc3R1ZmYhXG4vLyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGluIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyAnY2h1bmsnIGlzIGFuIGlucHV0IGNodW5rLlxuLy9cbi8vIENhbGwgYHB1c2gobmV3Q2h1bmspYCB0byBwYXNzIGFsb25nIHRyYW5zZm9ybWVkIG91dHB1dFxuLy8gdG8gdGhlIHJlYWRhYmxlIHNpZGUuICBZb3UgbWF5IGNhbGwgJ3B1c2gnIHplcm8gb3IgbW9yZSB0aW1lcy5cbi8vXG4vLyBDYWxsIGBjYihlcnIpYCB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoaXMgY2h1bmsuICBJZiB5b3UgcGFzc1xuLy8gYW4gZXJyb3IsIHRoZW4gdGhhdCdsbCBwdXQgdGhlIGh1cnQgb24gdGhlIHdob2xlIG9wZXJhdGlvbi4gIElmIHlvdVxuLy8gbmV2ZXIgY2FsbCBjYigpLCB0aGVuIHlvdSdsbCBuZXZlciBnZXQgYW5vdGhlciBjaHVuay5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuICB0cy53cml0ZWNiID0gY2I7XG4gIHRzLndyaXRlY2h1bmsgPSBjaHVuaztcbiAgdHMud3JpdGVlbmNvZGluZyA9IGVuY29kaW5nO1xuICBpZiAoIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHZhciBycyA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKHRzLm5lZWRUcmFuc2Zvcm0gfHwgcnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn07XG5cbi8vIERvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGFyZ3MgYXJlIGhlcmUuXG4vLyBfdHJhbnNmb3JtIGRvZXMgYWxsIHRoZSB3b3JrLlxuLy8gVGhhdCB3ZSBnb3QgaGVyZSBtZWFucyB0aGF0IHRoZSByZWFkYWJsZSBzaWRlIHdhbnRzIG1vcmUgZGF0YS5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcblxuICBpZiAodHMud3JpdGVjaHVuayAhPT0gbnVsbCAmJiB0cy53cml0ZWNiICYmICF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB0cy50cmFuc2Zvcm1pbmcgPSB0cnVlO1xuICAgIHRoaXMuX3RyYW5zZm9ybSh0cy53cml0ZWNodW5rLCB0cy53cml0ZWVuY29kaW5nLCB0cy5hZnRlclRyYW5zZm9ybSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gbWFyayB0aGF0IHdlIG5lZWQgYSB0cmFuc2Zvcm0sIHNvIHRoYXQgYW55IGRhdGEgdGhhdCBjb21lcyBpblxuICAgIC8vIHdpbGwgZ2V0IHByb2Nlc3NlZCwgbm93IHRoYXQgd2UndmUgYXNrZWQgZm9yIGl0LlxuICAgIHRzLm5lZWRUcmFuc2Zvcm0gPSB0cnVlO1xuICB9XG59O1xuXG5mdW5jdGlvbiBkb25lKHN0cmVhbSwgZXIpIHtcbiAgaWYgKGVyKSByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuXG4gIC8vIGlmIHRoZXJlJ3Mgbm90aGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyLCB0aGVuIHRoYXQgbWVhbnNcbiAgLy8gdGhhdCBub3RoaW5nIG1vcmUgd2lsbCBldmVyIGJlIHByb3ZpZGVkXG4gIHZhciB3cyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHRzID0gc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZTtcblxuICBpZiAod3MubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ0NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMCcpO1xuXG4gIGlmICh0cy50cmFuc2Zvcm1pbmcpIHRocm93IG5ldyBFcnJvcignQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHN0aWxsIHRyYW5zZm9ybWluZycpO1xuXG4gIHJldHVybiBzdHJlYW0ucHVzaChudWxsKTtcbn1cbiIsIlxuaW1wb3J0IHtUcmFuc2Zvcm19IGZyb20gJy4vdHJhbnNmb3JtJztcblxuaW1wb3J0IHtpbmhlcml0c30gZnJvbSAndXRpbCc7XG5pbmhlcml0cyhQYXNzVGhyb3VnaCwgVHJhbnNmb3JtKTtcbmV4cG9ydCBkZWZhdWx0IFBhc3NUaHJvdWdoO1xuZXhwb3J0IGZ1bmN0aW9uIFBhc3NUaHJvdWdoKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhc3NUaHJvdWdoKSkgcmV0dXJuIG5ldyBQYXNzVGhyb3VnaChvcHRpb25zKTtcblxuICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRpb25zKTtcbn1cblxuUGFzc1Rocm91Z2gucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihudWxsLCBjaHVuayk7XG59O1xuIiwiaW1wb3J0IEVFIGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQge2luaGVyaXRzfSBmcm9tICd1dGlsJztcblxuaW1wb3J0IHtEdXBsZXh9IGZyb20gJy4vcmVhZGFibGUtc3RyZWFtL2R1cGxleC5qcyc7XG5pbXBvcnQge1JlYWRhYmxlfSBmcm9tICcuL3JlYWRhYmxlLXN0cmVhbS9yZWFkYWJsZS5qcyc7XG5pbXBvcnQge1dyaXRhYmxlfSBmcm9tICcuL3JlYWRhYmxlLXN0cmVhbS93cml0YWJsZS5qcyc7XG5pbXBvcnQge1RyYW5zZm9ybX0gZnJvbSAnLi9yZWFkYWJsZS1zdHJlYW0vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB7UGFzc1Rocm91Z2h9IGZyb20gJy4vcmVhZGFibGUtc3RyZWFtL3Bhc3N0aHJvdWdoLmpzJztcbmluaGVyaXRzKFN0cmVhbSwgRUUpO1xuU3RyZWFtLlJlYWRhYmxlID0gUmVhZGFibGU7XG5TdHJlYW0uV3JpdGFibGUgPSBXcml0YWJsZTtcblN0cmVhbS5EdXBsZXggPSBEdXBsZXg7XG5TdHJlYW0uVHJhbnNmb3JtID0gVHJhbnNmb3JtO1xuU3RyZWFtLlBhc3NUaHJvdWdoID0gUGFzc1Rocm91Z2g7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuNC54XG5TdHJlYW0uU3RyZWFtID0gU3RyZWFtO1xuXG5leHBvcnQgZGVmYXVsdCBTdHJlYW07XG5leHBvcnQge1JlYWRhYmxlLFdyaXRhYmxlLER1cGxleCxUcmFuc2Zvcm0sUGFzc1Rocm91Z2gsU3RyZWFtfVxuXG4vLyBvbGQtc3R5bGUgc3RyZWFtcy4gIE5vdGUgdGhhdCB0aGUgcGlwZSBtZXRob2QgKHRoZSBvbmx5IHJlbGV2YW50XG4vLyBwYXJ0IG9mIHRoaXMgY2xhc3MpIGlzIG92ZXJyaWRkZW4gaW4gdGhlIFJlYWRhYmxlIGNsYXNzLlxuXG5mdW5jdGlvbiBTdHJlYW0oKSB7XG4gIEVFLmNhbGwodGhpcyk7XG59XG5cblN0cmVhbS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uKGRlc3QsIG9wdGlvbnMpIHtcbiAgdmFyIHNvdXJjZSA9IHRoaXM7XG5cbiAgZnVuY3Rpb24gb25kYXRhKGNodW5rKSB7XG4gICAgaWYgKGRlc3Qud3JpdGFibGUpIHtcbiAgICAgIGlmIChmYWxzZSA9PT0gZGVzdC53cml0ZShjaHVuaykgJiYgc291cmNlLnBhdXNlKSB7XG4gICAgICAgIHNvdXJjZS5wYXVzZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNvdXJjZS5vbignZGF0YScsIG9uZGF0YSk7XG5cbiAgZnVuY3Rpb24gb25kcmFpbigpIHtcbiAgICBpZiAoc291cmNlLnJlYWRhYmxlICYmIHNvdXJjZS5yZXN1bWUpIHtcbiAgICAgIHNvdXJjZS5yZXN1bWUoKTtcbiAgICB9XG4gIH1cblxuICBkZXN0Lm9uKCdkcmFpbicsIG9uZHJhaW4pO1xuXG4gIC8vIElmIHRoZSAnZW5kJyBvcHRpb24gaXMgbm90IHN1cHBsaWVkLCBkZXN0LmVuZCgpIHdpbGwgYmUgY2FsbGVkIHdoZW5cbiAgLy8gc291cmNlIGdldHMgdGhlICdlbmQnIG9yICdjbG9zZScgZXZlbnRzLiAgT25seSBkZXN0LmVuZCgpIG9uY2UuXG4gIGlmICghZGVzdC5faXNTdGRpbyAmJiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5lbmQgIT09IGZhbHNlKSkge1xuICAgIHNvdXJjZS5vbignZW5kJywgb25lbmQpO1xuICAgIHNvdXJjZS5vbignY2xvc2UnLCBvbmNsb3NlKTtcbiAgfVxuXG4gIHZhciBkaWRPbkVuZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICBpZiAoZGlkT25FbmQpIHJldHVybjtcbiAgICBkaWRPbkVuZCA9IHRydWU7XG5cbiAgICBkZXN0LmVuZCgpO1xuICB9XG5cblxuICBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIGlmIChkaWRPbkVuZCkgcmV0dXJuO1xuICAgIGRpZE9uRW5kID0gdHJ1ZTtcblxuICAgIGlmICh0eXBlb2YgZGVzdC5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSBkZXN0LmRlc3Ryb3koKTtcbiAgfVxuXG4gIC8vIGRvbid0IGxlYXZlIGRhbmdsaW5nIHBpcGVzIHdoZW4gdGhlcmUgYXJlIGVycm9ycy5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGNsZWFudXAoKTtcbiAgICBpZiAoRUUubGlzdGVuZXJDb3VudCh0aGlzLCAnZXJyb3InKSA9PT0gMCkge1xuICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCBzdHJlYW0gZXJyb3IgaW4gcGlwZS5cbiAgICB9XG4gIH1cblxuICBzb3VyY2Uub24oJ2Vycm9yJywgb25lcnJvcik7XG4gIGRlc3Qub24oJ2Vycm9yJywgb25lcnJvcik7XG5cbiAgLy8gcmVtb3ZlIGFsbCB0aGUgZXZlbnQgbGlzdGVuZXJzIHRoYXQgd2VyZSBhZGRlZC5cbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvbmRhdGEpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbik7XG5cbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG5cbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcblxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xlYW51cCk7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIGNsZWFudXApO1xuXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBjbGVhbnVwKTtcbiAgfVxuXG4gIHNvdXJjZS5vbignZW5kJywgY2xlYW51cCk7XG4gIHNvdXJjZS5vbignY2xvc2UnLCBjbGVhbnVwKTtcblxuICBkZXN0Lm9uKCdjbG9zZScsIGNsZWFudXApO1xuXG4gIGRlc3QuZW1pdCgncGlwZScsIHNvdXJjZSk7XG5cbiAgLy8gQWxsb3cgZm9yIHVuaXgtbGlrZSB1c2FnZTogQS5waXBlKEIpLnBpcGUoQylcbiAgcmV0dXJuIGRlc3Q7XG59O1xuIiwiOyhmdW5jdGlvbiAoc2F4KSB7IC8vIHdyYXBwZXIgZm9yIG5vbi1ub2RlIGVudnNcbiAgc2F4LnBhcnNlciA9IGZ1bmN0aW9uIChzdHJpY3QsIG9wdCkgeyByZXR1cm4gbmV3IFNBWFBhcnNlcihzdHJpY3QsIG9wdCkgfVxuICBzYXguU0FYUGFyc2VyID0gU0FYUGFyc2VyXG4gIHNheC5TQVhTdHJlYW0gPSBTQVhTdHJlYW1cbiAgc2F4LmNyZWF0ZVN0cmVhbSA9IGNyZWF0ZVN0cmVhbVxuXG4gIC8vIFdoZW4gd2UgcGFzcyB0aGUgTUFYX0JVRkZFUl9MRU5HVEggcG9zaXRpb24sIHN0YXJ0IGNoZWNraW5nIGZvciBidWZmZXIgb3ZlcnJ1bnMuXG4gIC8vIFdoZW4gd2UgY2hlY2ssIHNjaGVkdWxlIHRoZSBuZXh0IGNoZWNrIGZvciBNQVhfQlVGRkVSX0xFTkdUSCAtIChtYXgoYnVmZmVyIGxlbmd0aHMpKSxcbiAgLy8gc2luY2UgdGhhdCdzIHRoZSBlYXJsaWVzdCB0aGF0IGEgYnVmZmVyIG92ZXJydW4gY291bGQgb2NjdXIuICBUaGlzIHdheSwgY2hlY2tzIGFyZVxuICAvLyBhcyByYXJlIGFzIHJlcXVpcmVkLCBidXQgYXMgb2Z0ZW4gYXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSBuZXZlciBjcm9zc2luZyB0aGlzIGJvdW5kLlxuICAvLyBGdXJ0aGVybW9yZSwgYnVmZmVycyBhcmUgb25seSB0ZXN0ZWQgYXQgbW9zdCBvbmNlIHBlciB3cml0ZSgpLCBzbyBwYXNzaW5nIGEgdmVyeVxuICAvLyBsYXJnZSBzdHJpbmcgaW50byB3cml0ZSgpIG1pZ2h0IGhhdmUgdW5kZXNpcmFibGUgZWZmZWN0cywgYnV0IHRoaXMgaXMgbWFuYWdlYWJsZSBieVxuICAvLyB0aGUgY2FsbGVyLCBzbyBpdCBpcyBhc3N1bWVkIHRvIGJlIHNhZmUuICBUaHVzLCBhIGNhbGwgdG8gd3JpdGUoKSBtYXksIGluIHRoZSBleHRyZW1lXG4gIC8vIGVkZ2UgY2FzZSwgcmVzdWx0IGluIGNyZWF0aW5nIGF0IG1vc3Qgb25lIGNvbXBsZXRlIGNvcHkgb2YgdGhlIHN0cmluZyBwYXNzZWQgaW4uXG4gIC8vIFNldCB0byBJbmZpbml0eSB0byBoYXZlIHVubGltaXRlZCBidWZmZXJzLlxuICBzYXguTUFYX0JVRkZFUl9MRU5HVEggPSA2NCAqIDEwMjRcblxuICB2YXIgYnVmZmVycyA9IFtcbiAgICAnY29tbWVudCcsICdzZ21sRGVjbCcsICd0ZXh0Tm9kZScsICd0YWdOYW1lJywgJ2RvY3R5cGUnLFxuICAgICdwcm9jSW5zdE5hbWUnLCAncHJvY0luc3RCb2R5JywgJ2VudGl0eScsICdhdHRyaWJOYW1lJyxcbiAgICAnYXR0cmliVmFsdWUnLCAnY2RhdGEnLCAnc2NyaXB0J1xuICBdXG5cbiAgc2F4LkVWRU5UUyA9IFtcbiAgICAndGV4dCcsXG4gICAgJ3Byb2Nlc3NpbmdpbnN0cnVjdGlvbicsXG4gICAgJ3NnbWxkZWNsYXJhdGlvbicsXG4gICAgJ2RvY3R5cGUnLFxuICAgICdjb21tZW50JyxcbiAgICAnb3BlbnRhZ3N0YXJ0JyxcbiAgICAnYXR0cmlidXRlJyxcbiAgICAnb3BlbnRhZycsXG4gICAgJ2Nsb3NldGFnJyxcbiAgICAnb3BlbmNkYXRhJyxcbiAgICAnY2RhdGEnLFxuICAgICdjbG9zZWNkYXRhJyxcbiAgICAnZXJyb3InLFxuICAgICdlbmQnLFxuICAgICdyZWFkeScsXG4gICAgJ3NjcmlwdCcsXG4gICAgJ29wZW5uYW1lc3BhY2UnLFxuICAgICdjbG9zZW5hbWVzcGFjZSdcbiAgXVxuXG4gIGZ1bmN0aW9uIFNBWFBhcnNlciAoc3RyaWN0LCBvcHQpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU0FYUGFyc2VyKSkge1xuICAgICAgcmV0dXJuIG5ldyBTQVhQYXJzZXIoc3RyaWN0LCBvcHQpXG4gICAgfVxuXG4gICAgdmFyIHBhcnNlciA9IHRoaXNcbiAgICBjbGVhckJ1ZmZlcnMocGFyc2VyKVxuICAgIHBhcnNlci5xID0gcGFyc2VyLmMgPSAnJ1xuICAgIHBhcnNlci5idWZmZXJDaGVja1Bvc2l0aW9uID0gc2F4Lk1BWF9CVUZGRVJfTEVOR1RIXG4gICAgcGFyc2VyLm9wdCA9IG9wdCB8fCB7fVxuICAgIHBhcnNlci5vcHQubG93ZXJjYXNlID0gcGFyc2VyLm9wdC5sb3dlcmNhc2UgfHwgcGFyc2VyLm9wdC5sb3dlcmNhc2V0YWdzXG4gICAgcGFyc2VyLmxvb3NlQ2FzZSA9IHBhcnNlci5vcHQubG93ZXJjYXNlID8gJ3RvTG93ZXJDYXNlJyA6ICd0b1VwcGVyQ2FzZSdcbiAgICBwYXJzZXIudGFncyA9IFtdXG4gICAgcGFyc2VyLmNsb3NlZCA9IHBhcnNlci5jbG9zZWRSb290ID0gcGFyc2VyLnNhd1Jvb3QgPSBmYWxzZVxuICAgIHBhcnNlci50YWcgPSBwYXJzZXIuZXJyb3IgPSBudWxsXG4gICAgcGFyc2VyLnN0cmljdCA9ICEhc3RyaWN0XG4gICAgcGFyc2VyLm5vc2NyaXB0ID0gISEoc3RyaWN0IHx8IHBhcnNlci5vcHQubm9zY3JpcHQpXG4gICAgcGFyc2VyLnN0YXRlID0gUy5CRUdJTlxuICAgIHBhcnNlci5zdHJpY3RFbnRpdGllcyA9IHBhcnNlci5vcHQuc3RyaWN0RW50aXRpZXNcbiAgICBwYXJzZXIuRU5USVRJRVMgPSBwYXJzZXIuc3RyaWN0RW50aXRpZXMgPyBPYmplY3QuY3JlYXRlKHNheC5YTUxfRU5USVRJRVMpIDogT2JqZWN0LmNyZWF0ZShzYXguRU5USVRJRVMpXG4gICAgcGFyc2VyLmF0dHJpYkxpc3QgPSBbXVxuXG4gICAgLy8gbmFtZXNwYWNlcyBmb3JtIGEgcHJvdG90eXBlIGNoYWluLlxuICAgIC8vIGl0IGFsd2F5cyBwb2ludHMgYXQgdGhlIGN1cnJlbnQgdGFnLFxuICAgIC8vIHdoaWNoIHByb3RvcyB0byBpdHMgcGFyZW50IHRhZy5cbiAgICBpZiAocGFyc2VyLm9wdC54bWxucykge1xuICAgICAgcGFyc2VyLm5zID0gT2JqZWN0LmNyZWF0ZShyb290TlMpXG4gICAgfVxuXG4gICAgLy8gbW9zdGx5IGp1c3QgZm9yIGVycm9yIHJlcG9ydGluZ1xuICAgIHBhcnNlci50cmFja1Bvc2l0aW9uID0gcGFyc2VyLm9wdC5wb3NpdGlvbiAhPT0gZmFsc2VcbiAgICBpZiAocGFyc2VyLnRyYWNrUG9zaXRpb24pIHtcbiAgICAgIHBhcnNlci5wb3NpdGlvbiA9IHBhcnNlci5saW5lID0gcGFyc2VyLmNvbHVtbiA9IDBcbiAgICB9XG4gICAgZW1pdChwYXJzZXIsICdvbnJlYWR5JylcbiAgfVxuXG4gIGlmICghT2JqZWN0LmNyZWF0ZSkge1xuICAgIE9iamVjdC5jcmVhdGUgPSBmdW5jdGlvbiAobykge1xuICAgICAgZnVuY3Rpb24gRiAoKSB7fVxuICAgICAgRi5wcm90b3R5cGUgPSBvXG4gICAgICB2YXIgbmV3ZiA9IG5ldyBGKClcbiAgICAgIHJldHVybiBuZXdmXG4gICAgfVxuICB9XG5cbiAgaWYgKCFPYmplY3Qua2V5cykge1xuICAgIE9iamVjdC5rZXlzID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgIHZhciBhID0gW11cbiAgICAgIGZvciAodmFyIGkgaW4gbykgaWYgKG8uaGFzT3duUHJvcGVydHkoaSkpIGEucHVzaChpKVxuICAgICAgcmV0dXJuIGFcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjaGVja0J1ZmZlckxlbmd0aCAocGFyc2VyKSB7XG4gICAgdmFyIG1heEFsbG93ZWQgPSBNYXRoLm1heChzYXguTUFYX0JVRkZFUl9MRU5HVEgsIDEwKVxuICAgIHZhciBtYXhBY3R1YWwgPSAwXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBidWZmZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgdmFyIGxlbiA9IHBhcnNlcltidWZmZXJzW2ldXS5sZW5ndGhcbiAgICAgIGlmIChsZW4gPiBtYXhBbGxvd2VkKSB7XG4gICAgICAgIC8vIFRleHQvY2RhdGEgbm9kZXMgY2FuIGdldCBiaWcsIGFuZCBzaW5jZSB0aGV5J3JlIGJ1ZmZlcmVkLFxuICAgICAgICAvLyB3ZSBjYW4gZ2V0IGhlcmUgdW5kZXIgbm9ybWFsIGNvbmRpdGlvbnMuXG4gICAgICAgIC8vIEF2b2lkIGlzc3VlcyBieSBlbWl0dGluZyB0aGUgdGV4dCBub2RlIG5vdyxcbiAgICAgICAgLy8gc28gYXQgbGVhc3QgaXQgd29uJ3QgZ2V0IGFueSBiaWdnZXIuXG4gICAgICAgIHN3aXRjaCAoYnVmZmVyc1tpXSkge1xuICAgICAgICAgIGNhc2UgJ3RleHROb2RlJzpcbiAgICAgICAgICAgIGNsb3NlVGV4dChwYXJzZXIpXG4gICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgY2FzZSAnY2RhdGEnOlxuICAgICAgICAgICAgZW1pdE5vZGUocGFyc2VyLCAnb25jZGF0YScsIHBhcnNlci5jZGF0YSlcbiAgICAgICAgICAgIHBhcnNlci5jZGF0YSA9ICcnXG4gICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgY2FzZSAnc2NyaXB0JzpcbiAgICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uc2NyaXB0JywgcGFyc2VyLnNjcmlwdClcbiAgICAgICAgICAgIHBhcnNlci5zY3JpcHQgPSAnJ1xuICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBlcnJvcihwYXJzZXIsICdNYXggYnVmZmVyIGxlbmd0aCBleGNlZWRlZDogJyArIGJ1ZmZlcnNbaV0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG1heEFjdHVhbCA9IE1hdGgubWF4KG1heEFjdHVhbCwgbGVuKVxuICAgIH1cbiAgICAvLyBzY2hlZHVsZSB0aGUgbmV4dCBjaGVjayBmb3IgdGhlIGVhcmxpZXN0IHBvc3NpYmxlIGJ1ZmZlciBvdmVycnVuLlxuICAgIHZhciBtID0gc2F4Lk1BWF9CVUZGRVJfTEVOR1RIIC0gbWF4QWN0dWFsXG4gICAgcGFyc2VyLmJ1ZmZlckNoZWNrUG9zaXRpb24gPSBtICsgcGFyc2VyLnBvc2l0aW9uXG4gIH1cblxuICBmdW5jdGlvbiBjbGVhckJ1ZmZlcnMgKHBhcnNlcikge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gYnVmZmVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHBhcnNlcltidWZmZXJzW2ldXSA9ICcnXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2hCdWZmZXJzIChwYXJzZXIpIHtcbiAgICBjbG9zZVRleHQocGFyc2VyKVxuICAgIGlmIChwYXJzZXIuY2RhdGEgIT09ICcnKSB7XG4gICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbmNkYXRhJywgcGFyc2VyLmNkYXRhKVxuICAgICAgcGFyc2VyLmNkYXRhID0gJydcbiAgICB9XG4gICAgaWYgKHBhcnNlci5zY3JpcHQgIT09ICcnKSB7XG4gICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbnNjcmlwdCcsIHBhcnNlci5zY3JpcHQpXG4gICAgICBwYXJzZXIuc2NyaXB0ID0gJydcbiAgICB9XG4gIH1cblxuICBTQVhQYXJzZXIucHJvdG90eXBlID0ge1xuICAgIGVuZDogZnVuY3Rpb24gKCkgeyBlbmQodGhpcykgfSxcbiAgICB3cml0ZTogd3JpdGUsXG4gICAgcmVzdW1lOiBmdW5jdGlvbiAoKSB7IHRoaXMuZXJyb3IgPSBudWxsOyByZXR1cm4gdGhpcyB9LFxuICAgIGNsb3NlOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLndyaXRlKG51bGwpIH0sXG4gICAgZmx1c2g6IGZ1bmN0aW9uICgpIHsgZmx1c2hCdWZmZXJzKHRoaXMpIH1cbiAgfVxuXG4gIHZhciBTdHJlYW1cbiAgdHJ5IHtcbiAgICBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKS5TdHJlYW1cbiAgfSBjYXRjaCAoZXgpIHtcbiAgICBTdHJlYW0gPSBmdW5jdGlvbiAoKSB7fVxuICB9XG5cbiAgdmFyIHN0cmVhbVdyYXBzID0gc2F4LkVWRU5UUy5maWx0ZXIoZnVuY3Rpb24gKGV2KSB7XG4gICAgcmV0dXJuIGV2ICE9PSAnZXJyb3InICYmIGV2ICE9PSAnZW5kJ1xuICB9KVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVN0cmVhbSAoc3RyaWN0LCBvcHQpIHtcbiAgICByZXR1cm4gbmV3IFNBWFN0cmVhbShzdHJpY3QsIG9wdClcbiAgfVxuXG4gIGZ1bmN0aW9uIFNBWFN0cmVhbSAoc3RyaWN0LCBvcHQpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU0FYU3RyZWFtKSkge1xuICAgICAgcmV0dXJuIG5ldyBTQVhTdHJlYW0oc3RyaWN0LCBvcHQpXG4gICAgfVxuXG4gICAgU3RyZWFtLmFwcGx5KHRoaXMpXG5cbiAgICB0aGlzLl9wYXJzZXIgPSBuZXcgU0FYUGFyc2VyKHN0cmljdCwgb3B0KVxuICAgIHRoaXMud3JpdGFibGUgPSB0cnVlXG4gICAgdGhpcy5yZWFkYWJsZSA9IHRydWVcblxuICAgIHZhciBtZSA9IHRoaXNcblxuICAgIHRoaXMuX3BhcnNlci5vbmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG1lLmVtaXQoJ2VuZCcpXG4gICAgfVxuXG4gICAgdGhpcy5fcGFyc2VyLm9uZXJyb3IgPSBmdW5jdGlvbiAoZXIpIHtcbiAgICAgIG1lLmVtaXQoJ2Vycm9yJywgZXIpXG5cbiAgICAgIC8vIGlmIGRpZG4ndCB0aHJvdywgdGhlbiBtZWFucyBlcnJvciB3YXMgaGFuZGxlZC5cbiAgICAgIC8vIGdvIGFoZWFkIGFuZCBjbGVhciBlcnJvciwgc28gd2UgY2FuIHdyaXRlIGFnYWluLlxuICAgICAgbWUuX3BhcnNlci5lcnJvciA9IG51bGxcbiAgICB9XG5cbiAgICB0aGlzLl9kZWNvZGVyID0gbnVsbFxuXG4gICAgc3RyZWFtV3JhcHMuZm9yRWFjaChmdW5jdGlvbiAoZXYpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtZSwgJ29uJyArIGV2LCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBtZS5fcGFyc2VyWydvbicgKyBldl1cbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoaCkge1xuICAgICAgICAgIGlmICghaCkge1xuICAgICAgICAgICAgbWUucmVtb3ZlQWxsTGlzdGVuZXJzKGV2KVxuICAgICAgICAgICAgbWUuX3BhcnNlclsnb24nICsgZXZdID0gaFxuICAgICAgICAgICAgcmV0dXJuIGhcbiAgICAgICAgICB9XG4gICAgICAgICAgbWUub24oZXYsIGgpXG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2VcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIFNBWFN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN0cmVhbS5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IFNBWFN0cmVhbVxuICAgIH1cbiAgfSlcblxuICBTQVhTdHJlYW0ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBpZiAodHlwZW9mIEJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgdHlwZW9mIEJ1ZmZlci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgQnVmZmVyLmlzQnVmZmVyKGRhdGEpKSB7XG4gICAgICBpZiAoIXRoaXMuX2RlY29kZXIpIHtcbiAgICAgICAgdmFyIFNEID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXInKS5TdHJpbmdEZWNvZGVyXG4gICAgICAgIHRoaXMuX2RlY29kZXIgPSBuZXcgU0QoJ3V0ZjgnKVxuICAgICAgfVxuICAgICAgZGF0YSA9IHRoaXMuX2RlY29kZXIud3JpdGUoZGF0YSlcbiAgICB9XG5cbiAgICB0aGlzLl9wYXJzZXIud3JpdGUoZGF0YS50b1N0cmluZygpKVxuICAgIHRoaXMuZW1pdCgnZGF0YScsIGRhdGEpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIFNBWFN0cmVhbS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgdGhpcy53cml0ZShjaHVuaylcbiAgICB9XG4gICAgdGhpcy5fcGFyc2VyLmVuZCgpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIFNBWFN0cmVhbS5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAoZXYsIGhhbmRsZXIpIHtcbiAgICB2YXIgbWUgPSB0aGlzXG4gICAgaWYgKCFtZS5fcGFyc2VyWydvbicgKyBldl0gJiYgc3RyZWFtV3JhcHMuaW5kZXhPZihldikgIT09IC0xKSB7XG4gICAgICBtZS5fcGFyc2VyWydvbicgKyBldl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IFthcmd1bWVudHNbMF1dIDogQXJyYXkuYXBwbHkobnVsbCwgYXJndW1lbnRzKVxuICAgICAgICBhcmdzLnNwbGljZSgwLCAwLCBldilcbiAgICAgICAgbWUuZW1pdC5hcHBseShtZSwgYXJncylcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gU3RyZWFtLnByb3RvdHlwZS5vbi5jYWxsKG1lLCBldiwgaGFuZGxlcilcbiAgfVxuXG4gIC8vIHRoaXMgcmVhbGx5IG5lZWRzIHRvIGJlIHJlcGxhY2VkIHdpdGggY2hhcmFjdGVyIGNsYXNzZXMuXG4gIC8vIFhNTCBhbGxvd3MgYWxsIG1hbm5lciBvZiByaWRpY3Vsb3VzIG51bWJlcnMgYW5kIGRpZ2l0cy5cbiAgdmFyIENEQVRBID0gJ1tDREFUQVsnXG4gIHZhciBET0NUWVBFID0gJ0RPQ1RZUEUnXG4gIHZhciBYTUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSdcbiAgdmFyIFhNTE5TX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLydcbiAgdmFyIHJvb3ROUyA9IHsgeG1sOiBYTUxfTkFNRVNQQUNFLCB4bWxuczogWE1MTlNfTkFNRVNQQUNFIH1cblxuICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sLyNOVC1OYW1lU3RhcnRDaGFyXG4gIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gd29ya3Mgb24gc3RyaW5ncywgYSBzaW5nbGUgY2hhcmFjdGVyIGF0IGEgdGltZVxuICAvLyBhcyBzdWNoLCBpdCBjYW5ub3QgZXZlciBzdXBwb3J0IGFzdHJhbC1wbGFuZSBjaGFyYWN0ZXJzICgxMDAwMC1FRkZGRilcbiAgLy8gd2l0aG91dCBhIHNpZ25pZmljYW50IGJyZWFraW5nIGNoYW5nZSB0byBlaXRoZXIgdGhpcyAgcGFyc2VyLCBvciB0aGVcbiAgLy8gSmF2YVNjcmlwdCBsYW5ndWFnZS4gIEltcGxlbWVudGF0aW9uIG9mIGFuIGVtb2ppLWNhcGFibGUgeG1sIHBhcnNlclxuICAvLyBpcyBsZWZ0IGFzIGFuIGV4ZXJjaXNlIGZvciB0aGUgcmVhZGVyLlxuICB2YXIgbmFtZVN0YXJ0ID0gL1s6X0EtWmEtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRF0vXG5cbiAgdmFyIG5hbWVCb2R5ID0gL1s6X0EtWmEtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRFxcdTAwQjdcXHUwMzAwLVxcdTAzNkZcXHUyMDNGLVxcdTIwNDAuXFxkLV0vXG5cbiAgdmFyIGVudGl0eVN0YXJ0ID0gL1sjOl9BLVphLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRdL1xuICB2YXIgZW50aXR5Qm9keSA9IC9bIzpfQS1aYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXFx1MDBCN1xcdTAzMDAtXFx1MDM2RlxcdTIwM0YtXFx1MjA0MC5cXGQtXS9cblxuICBmdW5jdGlvbiBpc1doaXRlc3BhY2UgKGMpIHtcbiAgICByZXR1cm4gYyA9PT0gJyAnIHx8IGMgPT09ICdcXG4nIHx8IGMgPT09ICdcXHInIHx8IGMgPT09ICdcXHQnXG4gIH1cblxuICBmdW5jdGlvbiBpc1F1b3RlIChjKSB7XG4gICAgcmV0dXJuIGMgPT09ICdcIicgfHwgYyA9PT0gJ1xcJydcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzQXR0cmliRW5kIChjKSB7XG4gICAgcmV0dXJuIGMgPT09ICc+JyB8fCBpc1doaXRlc3BhY2UoYylcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTWF0Y2ggKHJlZ2V4LCBjKSB7XG4gICAgcmV0dXJuIHJlZ2V4LnRlc3QoYylcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vdE1hdGNoIChyZWdleCwgYykge1xuICAgIHJldHVybiAhaXNNYXRjaChyZWdleCwgYylcbiAgfVxuXG4gIHZhciBTID0gMFxuICBzYXguU1RBVEUgPSB7XG4gICAgQkVHSU46IFMrKywgLy8gbGVhZGluZyBieXRlIG9yZGVyIG1hcmsgb3Igd2hpdGVzcGFjZVxuICAgIEJFR0lOX1dISVRFU1BBQ0U6IFMrKywgLy8gbGVhZGluZyB3aGl0ZXNwYWNlXG4gICAgVEVYVDogUysrLCAvLyBnZW5lcmFsIHN0dWZmXG4gICAgVEVYVF9FTlRJVFk6IFMrKywgLy8gJmFtcCBhbmQgc3VjaC5cbiAgICBPUEVOX1dBS0E6IFMrKywgLy8gPFxuICAgIFNHTUxfREVDTDogUysrLCAvLyA8IUJMQVJHXG4gICAgU0dNTF9ERUNMX1FVT1RFRDogUysrLCAvLyA8IUJMQVJHIGZvbyBcImJhclxuICAgIERPQ1RZUEU6IFMrKywgLy8gPCFET0NUWVBFXG4gICAgRE9DVFlQRV9RVU9URUQ6IFMrKywgLy8gPCFET0NUWVBFIFwiLy9ibGFoXG4gICAgRE9DVFlQRV9EVEQ6IFMrKywgLy8gPCFET0NUWVBFIFwiLy9ibGFoXCIgWyAuLi5cbiAgICBET0NUWVBFX0RURF9RVU9URUQ6IFMrKywgLy8gPCFET0NUWVBFIFwiLy9ibGFoXCIgWyBcImZvb1xuICAgIENPTU1FTlRfU1RBUlRJTkc6IFMrKywgLy8gPCEtXG4gICAgQ09NTUVOVDogUysrLCAvLyA8IS0tXG4gICAgQ09NTUVOVF9FTkRJTkc6IFMrKywgLy8gPCEtLSBibGFoIC1cbiAgICBDT01NRU5UX0VOREVEOiBTKyssIC8vIDwhLS0gYmxhaCAtLVxuICAgIENEQVRBOiBTKyssIC8vIDwhW0NEQVRBWyBzb21ldGhpbmdcbiAgICBDREFUQV9FTkRJTkc6IFMrKywgLy8gXVxuICAgIENEQVRBX0VORElOR18yOiBTKyssIC8vIF1dXG4gICAgUFJPQ19JTlNUOiBTKyssIC8vIDw/aGlcbiAgICBQUk9DX0lOU1RfQk9EWTogUysrLCAvLyA8P2hpIHRoZXJlXG4gICAgUFJPQ19JTlNUX0VORElORzogUysrLCAvLyA8P2hpIFwidGhlcmVcIiA/XG4gICAgT1BFTl9UQUc6IFMrKywgLy8gPHN0cm9uZ1xuICAgIE9QRU5fVEFHX1NMQVNIOiBTKyssIC8vIDxzdHJvbmcgL1xuICAgIEFUVFJJQjogUysrLCAvLyA8YVxuICAgIEFUVFJJQl9OQU1FOiBTKyssIC8vIDxhIGZvb1xuICAgIEFUVFJJQl9OQU1FX1NBV19XSElURTogUysrLCAvLyA8YSBmb28gX1xuICAgIEFUVFJJQl9WQUxVRTogUysrLCAvLyA8YSBmb289XG4gICAgQVRUUklCX1ZBTFVFX1FVT1RFRDogUysrLCAvLyA8YSBmb289XCJiYXJcbiAgICBBVFRSSUJfVkFMVUVfQ0xPU0VEOiBTKyssIC8vIDxhIGZvbz1cImJhclwiXG4gICAgQVRUUklCX1ZBTFVFX1VOUVVPVEVEOiBTKyssIC8vIDxhIGZvbz1iYXJcbiAgICBBVFRSSUJfVkFMVUVfRU5USVRZX1E6IFMrKywgLy8gPGZvbyBiYXI9XCImcXVvdDtcIlxuICAgIEFUVFJJQl9WQUxVRV9FTlRJVFlfVTogUysrLCAvLyA8Zm9vIGJhcj0mcXVvdFxuICAgIENMT1NFX1RBRzogUysrLCAvLyA8L2FcbiAgICBDTE9TRV9UQUdfU0FXX1dISVRFOiBTKyssIC8vIDwvYSAgID5cbiAgICBTQ1JJUFQ6IFMrKywgLy8gPHNjcmlwdD4gLi4uXG4gICAgU0NSSVBUX0VORElORzogUysrIC8vIDxzY3JpcHQ+IC4uLiA8XG4gIH1cblxuICBzYXguWE1MX0VOVElUSUVTID0ge1xuICAgICdhbXAnOiAnJicsXG4gICAgJ2d0JzogJz4nLFxuICAgICdsdCc6ICc8JyxcbiAgICAncXVvdCc6ICdcIicsXG4gICAgJ2Fwb3MnOiBcIidcIlxuICB9XG5cbiAgc2F4LkVOVElUSUVTID0ge1xuICAgICdhbXAnOiAnJicsXG4gICAgJ2d0JzogJz4nLFxuICAgICdsdCc6ICc8JyxcbiAgICAncXVvdCc6ICdcIicsXG4gICAgJ2Fwb3MnOiBcIidcIixcbiAgICAnQUVsaWcnOiAxOTgsXG4gICAgJ0FhY3V0ZSc6IDE5MyxcbiAgICAnQWNpcmMnOiAxOTQsXG4gICAgJ0FncmF2ZSc6IDE5MixcbiAgICAnQXJpbmcnOiAxOTcsXG4gICAgJ0F0aWxkZSc6IDE5NSxcbiAgICAnQXVtbCc6IDE5NixcbiAgICAnQ2NlZGlsJzogMTk5LFxuICAgICdFVEgnOiAyMDgsXG4gICAgJ0VhY3V0ZSc6IDIwMSxcbiAgICAnRWNpcmMnOiAyMDIsXG4gICAgJ0VncmF2ZSc6IDIwMCxcbiAgICAnRXVtbCc6IDIwMyxcbiAgICAnSWFjdXRlJzogMjA1LFxuICAgICdJY2lyYyc6IDIwNixcbiAgICAnSWdyYXZlJzogMjA0LFxuICAgICdJdW1sJzogMjA3LFxuICAgICdOdGlsZGUnOiAyMDksXG4gICAgJ09hY3V0ZSc6IDIxMSxcbiAgICAnT2NpcmMnOiAyMTIsXG4gICAgJ09ncmF2ZSc6IDIxMCxcbiAgICAnT3NsYXNoJzogMjE2LFxuICAgICdPdGlsZGUnOiAyMTMsXG4gICAgJ091bWwnOiAyMTQsXG4gICAgJ1RIT1JOJzogMjIyLFxuICAgICdVYWN1dGUnOiAyMTgsXG4gICAgJ1VjaXJjJzogMjE5LFxuICAgICdVZ3JhdmUnOiAyMTcsXG4gICAgJ1V1bWwnOiAyMjAsXG4gICAgJ1lhY3V0ZSc6IDIyMSxcbiAgICAnYWFjdXRlJzogMjI1LFxuICAgICdhY2lyYyc6IDIyNixcbiAgICAnYWVsaWcnOiAyMzAsXG4gICAgJ2FncmF2ZSc6IDIyNCxcbiAgICAnYXJpbmcnOiAyMjksXG4gICAgJ2F0aWxkZSc6IDIyNyxcbiAgICAnYXVtbCc6IDIyOCxcbiAgICAnY2NlZGlsJzogMjMxLFxuICAgICdlYWN1dGUnOiAyMzMsXG4gICAgJ2VjaXJjJzogMjM0LFxuICAgICdlZ3JhdmUnOiAyMzIsXG4gICAgJ2V0aCc6IDI0MCxcbiAgICAnZXVtbCc6IDIzNSxcbiAgICAnaWFjdXRlJzogMjM3LFxuICAgICdpY2lyYyc6IDIzOCxcbiAgICAnaWdyYXZlJzogMjM2LFxuICAgICdpdW1sJzogMjM5LFxuICAgICdudGlsZGUnOiAyNDEsXG4gICAgJ29hY3V0ZSc6IDI0MyxcbiAgICAnb2NpcmMnOiAyNDQsXG4gICAgJ29ncmF2ZSc6IDI0MixcbiAgICAnb3NsYXNoJzogMjQ4LFxuICAgICdvdGlsZGUnOiAyNDUsXG4gICAgJ291bWwnOiAyNDYsXG4gICAgJ3N6bGlnJzogMjIzLFxuICAgICd0aG9ybic6IDI1NCxcbiAgICAndWFjdXRlJzogMjUwLFxuICAgICd1Y2lyYyc6IDI1MSxcbiAgICAndWdyYXZlJzogMjQ5LFxuICAgICd1dW1sJzogMjUyLFxuICAgICd5YWN1dGUnOiAyNTMsXG4gICAgJ3l1bWwnOiAyNTUsXG4gICAgJ2NvcHknOiAxNjksXG4gICAgJ3JlZyc6IDE3NCxcbiAgICAnbmJzcCc6IDE2MCxcbiAgICAnaWV4Y2wnOiAxNjEsXG4gICAgJ2NlbnQnOiAxNjIsXG4gICAgJ3BvdW5kJzogMTYzLFxuICAgICdjdXJyZW4nOiAxNjQsXG4gICAgJ3llbic6IDE2NSxcbiAgICAnYnJ2YmFyJzogMTY2LFxuICAgICdzZWN0JzogMTY3LFxuICAgICd1bWwnOiAxNjgsXG4gICAgJ29yZGYnOiAxNzAsXG4gICAgJ2xhcXVvJzogMTcxLFxuICAgICdub3QnOiAxNzIsXG4gICAgJ3NoeSc6IDE3MyxcbiAgICAnbWFjcic6IDE3NSxcbiAgICAnZGVnJzogMTc2LFxuICAgICdwbHVzbW4nOiAxNzcsXG4gICAgJ3N1cDEnOiAxODUsXG4gICAgJ3N1cDInOiAxNzgsXG4gICAgJ3N1cDMnOiAxNzksXG4gICAgJ2FjdXRlJzogMTgwLFxuICAgICdtaWNybyc6IDE4MSxcbiAgICAncGFyYSc6IDE4MixcbiAgICAnbWlkZG90JzogMTgzLFxuICAgICdjZWRpbCc6IDE4NCxcbiAgICAnb3JkbSc6IDE4NixcbiAgICAncmFxdW8nOiAxODcsXG4gICAgJ2ZyYWMxNCc6IDE4OCxcbiAgICAnZnJhYzEyJzogMTg5LFxuICAgICdmcmFjMzQnOiAxOTAsXG4gICAgJ2lxdWVzdCc6IDE5MSxcbiAgICAndGltZXMnOiAyMTUsXG4gICAgJ2RpdmlkZSc6IDI0NyxcbiAgICAnT0VsaWcnOiAzMzgsXG4gICAgJ29lbGlnJzogMzM5LFxuICAgICdTY2Fyb24nOiAzNTIsXG4gICAgJ3NjYXJvbic6IDM1MyxcbiAgICAnWXVtbCc6IDM3NixcbiAgICAnZm5vZic6IDQwMixcbiAgICAnY2lyYyc6IDcxMCxcbiAgICAndGlsZGUnOiA3MzIsXG4gICAgJ0FscGhhJzogOTEzLFxuICAgICdCZXRhJzogOTE0LFxuICAgICdHYW1tYSc6IDkxNSxcbiAgICAnRGVsdGEnOiA5MTYsXG4gICAgJ0Vwc2lsb24nOiA5MTcsXG4gICAgJ1pldGEnOiA5MTgsXG4gICAgJ0V0YSc6IDkxOSxcbiAgICAnVGhldGEnOiA5MjAsXG4gICAgJ0lvdGEnOiA5MjEsXG4gICAgJ0thcHBhJzogOTIyLFxuICAgICdMYW1iZGEnOiA5MjMsXG4gICAgJ011JzogOTI0LFxuICAgICdOdSc6IDkyNSxcbiAgICAnWGknOiA5MjYsXG4gICAgJ09taWNyb24nOiA5MjcsXG4gICAgJ1BpJzogOTI4LFxuICAgICdSaG8nOiA5MjksXG4gICAgJ1NpZ21hJzogOTMxLFxuICAgICdUYXUnOiA5MzIsXG4gICAgJ1Vwc2lsb24nOiA5MzMsXG4gICAgJ1BoaSc6IDkzNCxcbiAgICAnQ2hpJzogOTM1LFxuICAgICdQc2knOiA5MzYsXG4gICAgJ09tZWdhJzogOTM3LFxuICAgICdhbHBoYSc6IDk0NSxcbiAgICAnYmV0YSc6IDk0NixcbiAgICAnZ2FtbWEnOiA5NDcsXG4gICAgJ2RlbHRhJzogOTQ4LFxuICAgICdlcHNpbG9uJzogOTQ5LFxuICAgICd6ZXRhJzogOTUwLFxuICAgICdldGEnOiA5NTEsXG4gICAgJ3RoZXRhJzogOTUyLFxuICAgICdpb3RhJzogOTUzLFxuICAgICdrYXBwYSc6IDk1NCxcbiAgICAnbGFtYmRhJzogOTU1LFxuICAgICdtdSc6IDk1NixcbiAgICAnbnUnOiA5NTcsXG4gICAgJ3hpJzogOTU4LFxuICAgICdvbWljcm9uJzogOTU5LFxuICAgICdwaSc6IDk2MCxcbiAgICAncmhvJzogOTYxLFxuICAgICdzaWdtYWYnOiA5NjIsXG4gICAgJ3NpZ21hJzogOTYzLFxuICAgICd0YXUnOiA5NjQsXG4gICAgJ3Vwc2lsb24nOiA5NjUsXG4gICAgJ3BoaSc6IDk2NixcbiAgICAnY2hpJzogOTY3LFxuICAgICdwc2knOiA5NjgsXG4gICAgJ29tZWdhJzogOTY5LFxuICAgICd0aGV0YXN5bSc6IDk3NyxcbiAgICAndXBzaWgnOiA5NzgsXG4gICAgJ3Bpdic6IDk4MixcbiAgICAnZW5zcCc6IDgxOTQsXG4gICAgJ2Vtc3AnOiA4MTk1LFxuICAgICd0aGluc3AnOiA4MjAxLFxuICAgICd6d25qJzogODIwNCxcbiAgICAnendqJzogODIwNSxcbiAgICAnbHJtJzogODIwNixcbiAgICAncmxtJzogODIwNyxcbiAgICAnbmRhc2gnOiA4MjExLFxuICAgICdtZGFzaCc6IDgyMTIsXG4gICAgJ2xzcXVvJzogODIxNixcbiAgICAncnNxdW8nOiA4MjE3LFxuICAgICdzYnF1byc6IDgyMTgsXG4gICAgJ2xkcXVvJzogODIyMCxcbiAgICAncmRxdW8nOiA4MjIxLFxuICAgICdiZHF1byc6IDgyMjIsXG4gICAgJ2RhZ2dlcic6IDgyMjQsXG4gICAgJ0RhZ2dlcic6IDgyMjUsXG4gICAgJ2J1bGwnOiA4MjI2LFxuICAgICdoZWxsaXAnOiA4MjMwLFxuICAgICdwZXJtaWwnOiA4MjQwLFxuICAgICdwcmltZSc6IDgyNDIsXG4gICAgJ1ByaW1lJzogODI0MyxcbiAgICAnbHNhcXVvJzogODI0OSxcbiAgICAncnNhcXVvJzogODI1MCxcbiAgICAnb2xpbmUnOiA4MjU0LFxuICAgICdmcmFzbCc6IDgyNjAsXG4gICAgJ2V1cm8nOiA4MzY0LFxuICAgICdpbWFnZSc6IDg0NjUsXG4gICAgJ3dlaWVycCc6IDg0NzIsXG4gICAgJ3JlYWwnOiA4NDc2LFxuICAgICd0cmFkZSc6IDg0ODIsXG4gICAgJ2FsZWZzeW0nOiA4NTAxLFxuICAgICdsYXJyJzogODU5MixcbiAgICAndWFycic6IDg1OTMsXG4gICAgJ3JhcnInOiA4NTk0LFxuICAgICdkYXJyJzogODU5NSxcbiAgICAnaGFycic6IDg1OTYsXG4gICAgJ2NyYXJyJzogODYyOSxcbiAgICAnbEFycic6IDg2NTYsXG4gICAgJ3VBcnInOiA4NjU3LFxuICAgICdyQXJyJzogODY1OCxcbiAgICAnZEFycic6IDg2NTksXG4gICAgJ2hBcnInOiA4NjYwLFxuICAgICdmb3JhbGwnOiA4NzA0LFxuICAgICdwYXJ0JzogODcwNixcbiAgICAnZXhpc3QnOiA4NzA3LFxuICAgICdlbXB0eSc6IDg3MDksXG4gICAgJ25hYmxhJzogODcxMSxcbiAgICAnaXNpbic6IDg3MTIsXG4gICAgJ25vdGluJzogODcxMyxcbiAgICAnbmknOiA4NzE1LFxuICAgICdwcm9kJzogODcxOSxcbiAgICAnc3VtJzogODcyMSxcbiAgICAnbWludXMnOiA4NzIyLFxuICAgICdsb3dhc3QnOiA4NzI3LFxuICAgICdyYWRpYyc6IDg3MzAsXG4gICAgJ3Byb3AnOiA4NzMzLFxuICAgICdpbmZpbic6IDg3MzQsXG4gICAgJ2FuZyc6IDg3MzYsXG4gICAgJ2FuZCc6IDg3NDMsXG4gICAgJ29yJzogODc0NCxcbiAgICAnY2FwJzogODc0NSxcbiAgICAnY3VwJzogODc0NixcbiAgICAnaW50JzogODc0NyxcbiAgICAndGhlcmU0JzogODc1NixcbiAgICAnc2ltJzogODc2NCxcbiAgICAnY29uZyc6IDg3NzMsXG4gICAgJ2FzeW1wJzogODc3NixcbiAgICAnbmUnOiA4ODAwLFxuICAgICdlcXVpdic6IDg4MDEsXG4gICAgJ2xlJzogODgwNCxcbiAgICAnZ2UnOiA4ODA1LFxuICAgICdzdWInOiA4ODM0LFxuICAgICdzdXAnOiA4ODM1LFxuICAgICduc3ViJzogODgzNixcbiAgICAnc3ViZSc6IDg4MzgsXG4gICAgJ3N1cGUnOiA4ODM5LFxuICAgICdvcGx1cyc6IDg4NTMsXG4gICAgJ290aW1lcyc6IDg4NTUsXG4gICAgJ3BlcnAnOiA4ODY5LFxuICAgICdzZG90JzogODkwMSxcbiAgICAnbGNlaWwnOiA4OTY4LFxuICAgICdyY2VpbCc6IDg5NjksXG4gICAgJ2xmbG9vcic6IDg5NzAsXG4gICAgJ3JmbG9vcic6IDg5NzEsXG4gICAgJ2xhbmcnOiA5MDAxLFxuICAgICdyYW5nJzogOTAwMixcbiAgICAnbG96JzogOTY3NCxcbiAgICAnc3BhZGVzJzogOTgyNCxcbiAgICAnY2x1YnMnOiA5ODI3LFxuICAgICdoZWFydHMnOiA5ODI5LFxuICAgICdkaWFtcyc6IDk4MzBcbiAgfVxuXG4gIE9iamVjdC5rZXlzKHNheC5FTlRJVElFUykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGUgPSBzYXguRU5USVRJRVNba2V5XVxuICAgIHZhciBzID0gdHlwZW9mIGUgPT09ICdudW1iZXInID8gU3RyaW5nLmZyb21DaGFyQ29kZShlKSA6IGVcbiAgICBzYXguRU5USVRJRVNba2V5XSA9IHNcbiAgfSlcblxuICBmb3IgKHZhciBzIGluIHNheC5TVEFURSkge1xuICAgIHNheC5TVEFURVtzYXguU1RBVEVbc11dID0gc1xuICB9XG5cbiAgLy8gc2hvcnRoYW5kXG4gIFMgPSBzYXguU1RBVEVcblxuICBmdW5jdGlvbiBlbWl0IChwYXJzZXIsIGV2ZW50LCBkYXRhKSB7XG4gICAgcGFyc2VyW2V2ZW50XSAmJiBwYXJzZXJbZXZlbnRdKGRhdGEpXG4gIH1cblxuICBmdW5jdGlvbiBlbWl0Tm9kZSAocGFyc2VyLCBub2RlVHlwZSwgZGF0YSkge1xuICAgIGlmIChwYXJzZXIudGV4dE5vZGUpIGNsb3NlVGV4dChwYXJzZXIpXG4gICAgZW1pdChwYXJzZXIsIG5vZGVUeXBlLCBkYXRhKVxuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2VUZXh0IChwYXJzZXIpIHtcbiAgICBwYXJzZXIudGV4dE5vZGUgPSB0ZXh0b3B0cyhwYXJzZXIub3B0LCBwYXJzZXIudGV4dE5vZGUpXG4gICAgaWYgKHBhcnNlci50ZXh0Tm9kZSkgZW1pdChwYXJzZXIsICdvbnRleHQnLCBwYXJzZXIudGV4dE5vZGUpXG4gICAgcGFyc2VyLnRleHROb2RlID0gJydcbiAgfVxuXG4gIGZ1bmN0aW9uIHRleHRvcHRzIChvcHQsIHRleHQpIHtcbiAgICBpZiAob3B0LnRyaW0pIHRleHQgPSB0ZXh0LnRyaW0oKVxuICAgIGlmIChvcHQubm9ybWFsaXplKSB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXHMrL2csICcgJylcbiAgICByZXR1cm4gdGV4dFxuICB9XG5cbiAgZnVuY3Rpb24gZXJyb3IgKHBhcnNlciwgZXIpIHtcbiAgICBjbG9zZVRleHQocGFyc2VyKVxuICAgIGlmIChwYXJzZXIudHJhY2tQb3NpdGlvbikge1xuICAgICAgZXIgKz0gJ1xcbkxpbmU6ICcgKyBwYXJzZXIubGluZSArXG4gICAgICAgICdcXG5Db2x1bW46ICcgKyBwYXJzZXIuY29sdW1uICtcbiAgICAgICAgJ1xcbkNoYXI6ICcgKyBwYXJzZXIuY1xuICAgIH1cbiAgICBlciA9IG5ldyBFcnJvcihlcilcbiAgICBwYXJzZXIuZXJyb3IgPSBlclxuICAgIGVtaXQocGFyc2VyLCAnb25lcnJvcicsIGVyKVxuICAgIHJldHVybiBwYXJzZXJcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuZCAocGFyc2VyKSB7XG4gICAgaWYgKHBhcnNlci5zYXdSb290ICYmICFwYXJzZXIuY2xvc2VkUm9vdCkgc3RyaWN0RmFpbChwYXJzZXIsICdVbmNsb3NlZCByb290IHRhZycpXG4gICAgaWYgKChwYXJzZXIuc3RhdGUgIT09IFMuQkVHSU4pICYmXG4gICAgICAocGFyc2VyLnN0YXRlICE9PSBTLkJFR0lOX1dISVRFU1BBQ0UpICYmXG4gICAgICAocGFyc2VyLnN0YXRlICE9PSBTLlRFWFQpKSB7XG4gICAgICBlcnJvcihwYXJzZXIsICdVbmV4cGVjdGVkIGVuZCcpXG4gICAgfVxuICAgIGNsb3NlVGV4dChwYXJzZXIpXG4gICAgcGFyc2VyLmMgPSAnJ1xuICAgIHBhcnNlci5jbG9zZWQgPSB0cnVlXG4gICAgZW1pdChwYXJzZXIsICdvbmVuZCcpXG4gICAgU0FYUGFyc2VyLmNhbGwocGFyc2VyLCBwYXJzZXIuc3RyaWN0LCBwYXJzZXIub3B0KVxuICAgIHJldHVybiBwYXJzZXJcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0cmljdEZhaWwgKHBhcnNlciwgbWVzc2FnZSkge1xuICAgIGlmICh0eXBlb2YgcGFyc2VyICE9PSAnb2JqZWN0JyB8fCAhKHBhcnNlciBpbnN0YW5jZW9mIFNBWFBhcnNlcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYmFkIGNhbGwgdG8gc3RyaWN0RmFpbCcpXG4gICAgfVxuICAgIGlmIChwYXJzZXIuc3RyaWN0KSB7XG4gICAgICBlcnJvcihwYXJzZXIsIG1lc3NhZ2UpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbmV3VGFnIChwYXJzZXIpIHtcbiAgICBpZiAoIXBhcnNlci5zdHJpY3QpIHBhcnNlci50YWdOYW1lID0gcGFyc2VyLnRhZ05hbWVbcGFyc2VyLmxvb3NlQ2FzZV0oKVxuICAgIHZhciBwYXJlbnQgPSBwYXJzZXIudGFnc1twYXJzZXIudGFncy5sZW5ndGggLSAxXSB8fCBwYXJzZXJcbiAgICB2YXIgdGFnID0gcGFyc2VyLnRhZyA9IHsgbmFtZTogcGFyc2VyLnRhZ05hbWUsIGF0dHJpYnV0ZXM6IHt9IH1cblxuICAgIC8vIHdpbGwgYmUgb3ZlcnJpZGRlbiBpZiB0YWcgY29udGFpbHMgYW4geG1sbnM9XCJmb29cIiBvciB4bWxuczpmb289XCJiYXJcIlxuICAgIGlmIChwYXJzZXIub3B0LnhtbG5zKSB7XG4gICAgICB0YWcubnMgPSBwYXJlbnQubnNcbiAgICB9XG4gICAgcGFyc2VyLmF0dHJpYkxpc3QubGVuZ3RoID0gMFxuICAgIGVtaXROb2RlKHBhcnNlciwgJ29ub3BlbnRhZ3N0YXJ0JywgdGFnKVxuICB9XG5cbiAgZnVuY3Rpb24gcW5hbWUgKG5hbWUsIGF0dHJpYnV0ZSkge1xuICAgIHZhciBpID0gbmFtZS5pbmRleE9mKCc6JylcbiAgICB2YXIgcXVhbE5hbWUgPSBpIDwgMCA/IFsgJycsIG5hbWUgXSA6IG5hbWUuc3BsaXQoJzonKVxuICAgIHZhciBwcmVmaXggPSBxdWFsTmFtZVswXVxuICAgIHZhciBsb2NhbCA9IHF1YWxOYW1lWzFdXG5cbiAgICAvLyA8eCBcInhtbG5zXCI9XCJodHRwOi8vZm9vXCI+XG4gICAgaWYgKGF0dHJpYnV0ZSAmJiBuYW1lID09PSAneG1sbnMnKSB7XG4gICAgICBwcmVmaXggPSAneG1sbnMnXG4gICAgICBsb2NhbCA9ICcnXG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcHJlZml4OiBwcmVmaXgsIGxvY2FsOiBsb2NhbCB9XG4gIH1cblxuICBmdW5jdGlvbiBhdHRyaWIgKHBhcnNlcikge1xuICAgIGlmICghcGFyc2VyLnN0cmljdCkge1xuICAgICAgcGFyc2VyLmF0dHJpYk5hbWUgPSBwYXJzZXIuYXR0cmliTmFtZVtwYXJzZXIubG9vc2VDYXNlXSgpXG4gICAgfVxuXG4gICAgaWYgKHBhcnNlci5hdHRyaWJMaXN0LmluZGV4T2YocGFyc2VyLmF0dHJpYk5hbWUpICE9PSAtMSB8fFxuICAgICAgcGFyc2VyLnRhZy5hdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KHBhcnNlci5hdHRyaWJOYW1lKSkge1xuICAgICAgcGFyc2VyLmF0dHJpYk5hbWUgPSBwYXJzZXIuYXR0cmliVmFsdWUgPSAnJ1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHBhcnNlci5vcHQueG1sbnMpIHtcbiAgICAgIHZhciBxbiA9IHFuYW1lKHBhcnNlci5hdHRyaWJOYW1lLCB0cnVlKVxuICAgICAgdmFyIHByZWZpeCA9IHFuLnByZWZpeFxuICAgICAgdmFyIGxvY2FsID0gcW4ubG9jYWxcblxuICAgICAgaWYgKHByZWZpeCA9PT0gJ3htbG5zJykge1xuICAgICAgICAvLyBuYW1lc3BhY2UgYmluZGluZyBhdHRyaWJ1dGUuIHB1c2ggdGhlIGJpbmRpbmcgaW50byBzY29wZVxuICAgICAgICBpZiAobG9jYWwgPT09ICd4bWwnICYmIHBhcnNlci5hdHRyaWJWYWx1ZSAhPT0gWE1MX05BTUVTUEFDRSkge1xuICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLFxuICAgICAgICAgICAgJ3htbDogcHJlZml4IG11c3QgYmUgYm91bmQgdG8gJyArIFhNTF9OQU1FU1BBQ0UgKyAnXFxuJyArXG4gICAgICAgICAgICAnQWN0dWFsOiAnICsgcGFyc2VyLmF0dHJpYlZhbHVlKVxuICAgICAgICB9IGVsc2UgaWYgKGxvY2FsID09PSAneG1sbnMnICYmIHBhcnNlci5hdHRyaWJWYWx1ZSAhPT0gWE1MTlNfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsXG4gICAgICAgICAgICAneG1sbnM6IHByZWZpeCBtdXN0IGJlIGJvdW5kIHRvICcgKyBYTUxOU19OQU1FU1BBQ0UgKyAnXFxuJyArXG4gICAgICAgICAgICAnQWN0dWFsOiAnICsgcGFyc2VyLmF0dHJpYlZhbHVlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciB0YWcgPSBwYXJzZXIudGFnXG4gICAgICAgICAgdmFyIHBhcmVudCA9IHBhcnNlci50YWdzW3BhcnNlci50YWdzLmxlbmd0aCAtIDFdIHx8IHBhcnNlclxuICAgICAgICAgIGlmICh0YWcubnMgPT09IHBhcmVudC5ucykge1xuICAgICAgICAgICAgdGFnLm5zID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQubnMpXG4gICAgICAgICAgfVxuICAgICAgICAgIHRhZy5uc1tsb2NhbF0gPSBwYXJzZXIuYXR0cmliVmFsdWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBkZWZlciBvbmF0dHJpYnV0ZSBldmVudHMgdW50aWwgYWxsIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHNlZW5cbiAgICAgIC8vIHNvIGFueSBuZXcgYmluZGluZ3MgY2FuIHRha2UgZWZmZWN0LiBwcmVzZXJ2ZSBhdHRyaWJ1dGUgb3JkZXJcbiAgICAgIC8vIHNvIGRlZmVycmVkIGV2ZW50cyBjYW4gYmUgZW1pdHRlZCBpbiBkb2N1bWVudCBvcmRlclxuICAgICAgcGFyc2VyLmF0dHJpYkxpc3QucHVzaChbcGFyc2VyLmF0dHJpYk5hbWUsIHBhcnNlci5hdHRyaWJWYWx1ZV0pXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGluIG5vbi14bWxucyBtb2RlLCB3ZSBjYW4gZW1pdCB0aGUgZXZlbnQgcmlnaHQgYXdheVxuICAgICAgcGFyc2VyLnRhZy5hdHRyaWJ1dGVzW3BhcnNlci5hdHRyaWJOYW1lXSA9IHBhcnNlci5hdHRyaWJWYWx1ZVxuICAgICAgZW1pdE5vZGUocGFyc2VyLCAnb25hdHRyaWJ1dGUnLCB7XG4gICAgICAgIG5hbWU6IHBhcnNlci5hdHRyaWJOYW1lLFxuICAgICAgICB2YWx1ZTogcGFyc2VyLmF0dHJpYlZhbHVlXG4gICAgICB9KVxuICAgIH1cblxuICAgIHBhcnNlci5hdHRyaWJOYW1lID0gcGFyc2VyLmF0dHJpYlZhbHVlID0gJydcbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW5UYWcgKHBhcnNlciwgc2VsZkNsb3NpbmcpIHtcbiAgICBpZiAocGFyc2VyLm9wdC54bWxucykge1xuICAgICAgLy8gZW1pdCBuYW1lc3BhY2UgYmluZGluZyBldmVudHNcbiAgICAgIHZhciB0YWcgPSBwYXJzZXIudGFnXG5cbiAgICAgIC8vIGFkZCBuYW1lc3BhY2UgaW5mbyB0byB0YWdcbiAgICAgIHZhciBxbiA9IHFuYW1lKHBhcnNlci50YWdOYW1lKVxuICAgICAgdGFnLnByZWZpeCA9IHFuLnByZWZpeFxuICAgICAgdGFnLmxvY2FsID0gcW4ubG9jYWxcbiAgICAgIHRhZy51cmkgPSB0YWcubnNbcW4ucHJlZml4XSB8fCAnJ1xuXG4gICAgICBpZiAodGFnLnByZWZpeCAmJiAhdGFnLnVyaSkge1xuICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ1VuYm91bmQgbmFtZXNwYWNlIHByZWZpeDogJyArXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkocGFyc2VyLnRhZ05hbWUpKVxuICAgICAgICB0YWcudXJpID0gcW4ucHJlZml4XG4gICAgICB9XG5cbiAgICAgIHZhciBwYXJlbnQgPSBwYXJzZXIudGFnc1twYXJzZXIudGFncy5sZW5ndGggLSAxXSB8fCBwYXJzZXJcbiAgICAgIGlmICh0YWcubnMgJiYgcGFyZW50Lm5zICE9PSB0YWcubnMpIHtcbiAgICAgICAgT2JqZWN0LmtleXModGFnLm5zKS5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgICAgZW1pdE5vZGUocGFyc2VyLCAnb25vcGVubmFtZXNwYWNlJywge1xuICAgICAgICAgICAgcHJlZml4OiBwLFxuICAgICAgICAgICAgdXJpOiB0YWcubnNbcF1cbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyBoYW5kbGUgZGVmZXJyZWQgb25hdHRyaWJ1dGUgZXZlbnRzXG4gICAgICAvLyBOb3RlOiBkbyBub3QgYXBwbHkgZGVmYXVsdCBucyB0byBhdHRyaWJ1dGVzOlxuICAgICAgLy8gICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sLW5hbWVzLyNkZWZhdWx0aW5nXG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnNlci5hdHRyaWJMaXN0Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB2YXIgbnYgPSBwYXJzZXIuYXR0cmliTGlzdFtpXVxuICAgICAgICB2YXIgbmFtZSA9IG52WzBdXG4gICAgICAgIHZhciB2YWx1ZSA9IG52WzFdXG4gICAgICAgIHZhciBxdWFsTmFtZSA9IHFuYW1lKG5hbWUsIHRydWUpXG4gICAgICAgIHZhciBwcmVmaXggPSBxdWFsTmFtZS5wcmVmaXhcbiAgICAgICAgdmFyIGxvY2FsID0gcXVhbE5hbWUubG9jYWxcbiAgICAgICAgdmFyIHVyaSA9IHByZWZpeCA9PT0gJycgPyAnJyA6ICh0YWcubnNbcHJlZml4XSB8fCAnJylcbiAgICAgICAgdmFyIGEgPSB7XG4gICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgcHJlZml4OiBwcmVmaXgsXG4gICAgICAgICAgbG9jYWw6IGxvY2FsLFxuICAgICAgICAgIHVyaTogdXJpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGVyZSdzIGFueSBhdHRyaWJ1dGVzIHdpdGggYW4gdW5kZWZpbmVkIG5hbWVzcGFjZSxcbiAgICAgICAgLy8gdGhlbiBmYWlsIG9uIHRoZW0gbm93LlxuICAgICAgICBpZiAocHJlZml4ICYmIHByZWZpeCAhPT0gJ3htbG5zJyAmJiAhdXJpKSB7XG4gICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdVbmJvdW5kIG5hbWVzcGFjZSBwcmVmaXg6ICcgK1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkocHJlZml4KSlcbiAgICAgICAgICBhLnVyaSA9IHByZWZpeFxuICAgICAgICB9XG4gICAgICAgIHBhcnNlci50YWcuYXR0cmlidXRlc1tuYW1lXSA9IGFcbiAgICAgICAgZW1pdE5vZGUocGFyc2VyLCAnb25hdHRyaWJ1dGUnLCBhKVxuICAgICAgfVxuICAgICAgcGFyc2VyLmF0dHJpYkxpc3QubGVuZ3RoID0gMFxuICAgIH1cblxuICAgIHBhcnNlci50YWcuaXNTZWxmQ2xvc2luZyA9ICEhc2VsZkNsb3NpbmdcblxuICAgIC8vIHByb2Nlc3MgdGhlIHRhZ1xuICAgIHBhcnNlci5zYXdSb290ID0gdHJ1ZVxuICAgIHBhcnNlci50YWdzLnB1c2gocGFyc2VyLnRhZylcbiAgICBlbWl0Tm9kZShwYXJzZXIsICdvbm9wZW50YWcnLCBwYXJzZXIudGFnKVxuICAgIGlmICghc2VsZkNsb3NpbmcpIHtcbiAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgPHNjcmlwdD4gaW4gbm9uLXN0cmljdCBtb2RlLlxuICAgICAgaWYgKCFwYXJzZXIubm9zY3JpcHQgJiYgcGFyc2VyLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3NjcmlwdCcpIHtcbiAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5TQ1JJUFRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICAgICAgfVxuICAgICAgcGFyc2VyLnRhZyA9IG51bGxcbiAgICAgIHBhcnNlci50YWdOYW1lID0gJydcbiAgICB9XG4gICAgcGFyc2VyLmF0dHJpYk5hbWUgPSBwYXJzZXIuYXR0cmliVmFsdWUgPSAnJ1xuICAgIHBhcnNlci5hdHRyaWJMaXN0Lmxlbmd0aCA9IDBcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb3NlVGFnIChwYXJzZXIpIHtcbiAgICBpZiAoIXBhcnNlci50YWdOYW1lKSB7XG4gICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ1dlaXJkIGVtcHR5IGNsb3NlIHRhZy4nKVxuICAgICAgcGFyc2VyLnRleHROb2RlICs9ICc8Lz4nXG4gICAgICBwYXJzZXIuc3RhdGUgPSBTLlRFWFRcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChwYXJzZXIuc2NyaXB0KSB7XG4gICAgICBpZiAocGFyc2VyLnRhZ05hbWUgIT09ICdzY3JpcHQnKSB7XG4gICAgICAgIHBhcnNlci5zY3JpcHQgKz0gJzwvJyArIHBhcnNlci50YWdOYW1lICsgJz4nXG4gICAgICAgIHBhcnNlci50YWdOYW1lID0gJydcbiAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5TQ1JJUFRcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbnNjcmlwdCcsIHBhcnNlci5zY3JpcHQpXG4gICAgICBwYXJzZXIuc2NyaXB0ID0gJydcbiAgICB9XG5cbiAgICAvLyBmaXJzdCBtYWtlIHN1cmUgdGhhdCB0aGUgY2xvc2luZyB0YWcgYWN0dWFsbHkgZXhpc3RzLlxuICAgIC8vIDxhPjxiPjwvYz48L2I+PC9hPiB3aWxsIGNsb3NlIGV2ZXJ5dGhpbmcsIG90aGVyd2lzZS5cbiAgICB2YXIgdCA9IHBhcnNlci50YWdzLmxlbmd0aFxuICAgIHZhciB0YWdOYW1lID0gcGFyc2VyLnRhZ05hbWVcbiAgICBpZiAoIXBhcnNlci5zdHJpY3QpIHtcbiAgICAgIHRhZ05hbWUgPSB0YWdOYW1lW3BhcnNlci5sb29zZUNhc2VdKClcbiAgICB9XG4gICAgdmFyIGNsb3NlVG8gPSB0YWdOYW1lXG4gICAgd2hpbGUgKHQtLSkge1xuICAgICAgdmFyIGNsb3NlID0gcGFyc2VyLnRhZ3NbdF1cbiAgICAgIGlmIChjbG9zZS5uYW1lICE9PSBjbG9zZVRvKSB7XG4gICAgICAgIC8vIGZhaWwgdGhlIGZpcnN0IHRpbWUgaW4gc3RyaWN0IG1vZGVcbiAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdVbmV4cGVjdGVkIGNsb3NlIHRhZycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRpZG4ndCBmaW5kIGl0LiAgd2UgYWxyZWFkeSBmYWlsZWQgZm9yIHN0cmljdCwgc28ganVzdCBhYm9ydC5cbiAgICBpZiAodCA8IDApIHtcbiAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnVW5tYXRjaGVkIGNsb3NpbmcgdGFnOiAnICsgcGFyc2VyLnRhZ05hbWUpXG4gICAgICBwYXJzZXIudGV4dE5vZGUgKz0gJzwvJyArIHBhcnNlci50YWdOYW1lICsgJz4nXG4gICAgICBwYXJzZXIuc3RhdGUgPSBTLlRFWFRcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBwYXJzZXIudGFnTmFtZSA9IHRhZ05hbWVcbiAgICB2YXIgcyA9IHBhcnNlci50YWdzLmxlbmd0aFxuICAgIHdoaWxlIChzLS0gPiB0KSB7XG4gICAgICB2YXIgdGFnID0gcGFyc2VyLnRhZyA9IHBhcnNlci50YWdzLnBvcCgpXG4gICAgICBwYXJzZXIudGFnTmFtZSA9IHBhcnNlci50YWcubmFtZVxuICAgICAgZW1pdE5vZGUocGFyc2VyLCAnb25jbG9zZXRhZycsIHBhcnNlci50YWdOYW1lKVxuXG4gICAgICB2YXIgeCA9IHt9XG4gICAgICBmb3IgKHZhciBpIGluIHRhZy5ucykge1xuICAgICAgICB4W2ldID0gdGFnLm5zW2ldXG4gICAgICB9XG5cbiAgICAgIHZhciBwYXJlbnQgPSBwYXJzZXIudGFnc1twYXJzZXIudGFncy5sZW5ndGggLSAxXSB8fCBwYXJzZXJcbiAgICAgIGlmIChwYXJzZXIub3B0LnhtbG5zICYmIHRhZy5ucyAhPT0gcGFyZW50Lm5zKSB7XG4gICAgICAgIC8vIHJlbW92ZSBuYW1lc3BhY2UgYmluZGluZ3MgaW50cm9kdWNlZCBieSB0YWdcbiAgICAgICAgT2JqZWN0LmtleXModGFnLm5zKS5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgICAgdmFyIG4gPSB0YWcubnNbcF1cbiAgICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbmNsb3NlbmFtZXNwYWNlJywgeyBwcmVmaXg6IHAsIHVyaTogbiB9KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodCA9PT0gMCkgcGFyc2VyLmNsb3NlZFJvb3QgPSB0cnVlXG4gICAgcGFyc2VyLnRhZ05hbWUgPSBwYXJzZXIuYXR0cmliVmFsdWUgPSBwYXJzZXIuYXR0cmliTmFtZSA9ICcnXG4gICAgcGFyc2VyLmF0dHJpYkxpc3QubGVuZ3RoID0gMFxuICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVFxuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VFbnRpdHkgKHBhcnNlcikge1xuICAgIHZhciBlbnRpdHkgPSBwYXJzZXIuZW50aXR5XG4gICAgdmFyIGVudGl0eUxDID0gZW50aXR5LnRvTG93ZXJDYXNlKClcbiAgICB2YXIgbnVtXG4gICAgdmFyIG51bVN0ciA9ICcnXG5cbiAgICBpZiAocGFyc2VyLkVOVElUSUVTW2VudGl0eV0pIHtcbiAgICAgIHJldHVybiBwYXJzZXIuRU5USVRJRVNbZW50aXR5XVxuICAgIH1cbiAgICBpZiAocGFyc2VyLkVOVElUSUVTW2VudGl0eUxDXSkge1xuICAgICAgcmV0dXJuIHBhcnNlci5FTlRJVElFU1tlbnRpdHlMQ11cbiAgICB9XG4gICAgZW50aXR5ID0gZW50aXR5TENcbiAgICBpZiAoZW50aXR5LmNoYXJBdCgwKSA9PT0gJyMnKSB7XG4gICAgICBpZiAoZW50aXR5LmNoYXJBdCgxKSA9PT0gJ3gnKSB7XG4gICAgICAgIGVudGl0eSA9IGVudGl0eS5zbGljZSgyKVxuICAgICAgICBudW0gPSBwYXJzZUludChlbnRpdHksIDE2KVxuICAgICAgICBudW1TdHIgPSBudW0udG9TdHJpbmcoMTYpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnRpdHkgPSBlbnRpdHkuc2xpY2UoMSlcbiAgICAgICAgbnVtID0gcGFyc2VJbnQoZW50aXR5LCAxMClcbiAgICAgICAgbnVtU3RyID0gbnVtLnRvU3RyaW5nKDEwKVxuICAgICAgfVxuICAgIH1cbiAgICBlbnRpdHkgPSBlbnRpdHkucmVwbGFjZSgvXjArLywgJycpXG4gICAgaWYgKGlzTmFOKG51bSkgfHwgbnVtU3RyLnRvTG93ZXJDYXNlKCkgIT09IGVudGl0eSkge1xuICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdJbnZhbGlkIGNoYXJhY3RlciBlbnRpdHknKVxuICAgICAgcmV0dXJuICcmJyArIHBhcnNlci5lbnRpdHkgKyAnOydcbiAgICB9XG5cbiAgICByZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQobnVtKVxuICB9XG5cbiAgZnVuY3Rpb24gYmVnaW5XaGl0ZVNwYWNlIChwYXJzZXIsIGMpIHtcbiAgICBpZiAoYyA9PT0gJzwnKSB7XG4gICAgICBwYXJzZXIuc3RhdGUgPSBTLk9QRU5fV0FLQVxuICAgICAgcGFyc2VyLnN0YXJ0VGFnUG9zaXRpb24gPSBwYXJzZXIucG9zaXRpb25cbiAgICB9IGVsc2UgaWYgKCFpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgIC8vIGhhdmUgdG8gcHJvY2VzcyB0aGlzIGFzIGEgdGV4dCBub2RlLlxuICAgICAgLy8gd2VpcmQsIGJ1dCBoYXBwZW5zLlxuICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdOb24td2hpdGVzcGFjZSBiZWZvcmUgZmlyc3QgdGFnLicpXG4gICAgICBwYXJzZXIudGV4dE5vZGUgPSBjXG4gICAgICBwYXJzZXIuc3RhdGUgPSBTLlRFWFRcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjaGFyQXQgKGNodW5rLCBpKSB7XG4gICAgdmFyIHJlc3VsdCA9ICcnXG4gICAgaWYgKGkgPCBjaHVuay5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdCA9IGNodW5rLmNoYXJBdChpKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBmdW5jdGlvbiB3cml0ZSAoY2h1bmspIHtcbiAgICB2YXIgcGFyc2VyID0gdGhpc1xuICAgIGlmICh0aGlzLmVycm9yKSB7XG4gICAgICB0aHJvdyB0aGlzLmVycm9yXG4gICAgfVxuICAgIGlmIChwYXJzZXIuY2xvc2VkKSB7XG4gICAgICByZXR1cm4gZXJyb3IocGFyc2VyLFxuICAgICAgICAnQ2Fubm90IHdyaXRlIGFmdGVyIGNsb3NlLiBBc3NpZ24gYW4gb25yZWFkeSBoYW5kbGVyLicpXG4gICAgfVxuICAgIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVuZChwYXJzZXIpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdvYmplY3QnKSB7XG4gICAgICBjaHVuayA9IGNodW5rLnRvU3RyaW5nKClcbiAgICB9XG4gICAgdmFyIGkgPSAwXG4gICAgdmFyIGMgPSAnJ1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjID0gY2hhckF0KGNodW5rLCBpKyspXG4gICAgICBwYXJzZXIuYyA9IGNcblxuICAgICAgaWYgKCFjKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJzZXIudHJhY2tQb3NpdGlvbikge1xuICAgICAgICBwYXJzZXIucG9zaXRpb24rK1xuICAgICAgICBpZiAoYyA9PT0gJ1xcbicpIHtcbiAgICAgICAgICBwYXJzZXIubGluZSsrXG4gICAgICAgICAgcGFyc2VyLmNvbHVtbiA9IDBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJzZXIuY29sdW1uKytcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKHBhcnNlci5zdGF0ZSkge1xuICAgICAgICBjYXNlIFMuQkVHSU46XG4gICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5CRUdJTl9XSElURVNQQUNFXG4gICAgICAgICAgaWYgKGMgPT09ICdcXHVGRUZGJykge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG4gICAgICAgICAgYmVnaW5XaGl0ZVNwYWNlKHBhcnNlciwgYylcbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5CRUdJTl9XSElURVNQQUNFOlxuICAgICAgICAgIGJlZ2luV2hpdGVTcGFjZShwYXJzZXIsIGMpXG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuVEVYVDpcbiAgICAgICAgICBpZiAocGFyc2VyLnNhd1Jvb3QgJiYgIXBhcnNlci5jbG9zZWRSb290KSB7XG4gICAgICAgICAgICB2YXIgc3RhcnRpID0gaSAtIDFcbiAgICAgICAgICAgIHdoaWxlIChjICYmIGMgIT09ICc8JyAmJiBjICE9PSAnJicpIHtcbiAgICAgICAgICAgICAgYyA9IGNoYXJBdChjaHVuaywgaSsrKVxuICAgICAgICAgICAgICBpZiAoYyAmJiBwYXJzZXIudHJhY2tQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHBhcnNlci5wb3NpdGlvbisrXG4gICAgICAgICAgICAgICAgaWYgKGMgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICBwYXJzZXIubGluZSsrXG4gICAgICAgICAgICAgICAgICBwYXJzZXIuY29sdW1uID0gMFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwYXJzZXIuY29sdW1uKytcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcnNlci50ZXh0Tm9kZSArPSBjaHVuay5zdWJzdHJpbmcoc3RhcnRpLCBpIC0gMSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGMgPT09ICc8JyAmJiAhKHBhcnNlci5zYXdSb290ICYmIHBhcnNlci5jbG9zZWRSb290ICYmICFwYXJzZXIuc3RyaWN0KSkge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5PUEVOX1dBS0FcbiAgICAgICAgICAgIHBhcnNlci5zdGFydFRhZ1Bvc2l0aW9uID0gcGFyc2VyLnBvc2l0aW9uXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaXNXaGl0ZXNwYWNlKGMpICYmICghcGFyc2VyLnNhd1Jvb3QgfHwgcGFyc2VyLmNsb3NlZFJvb3QpKSB7XG4gICAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnVGV4dCBkYXRhIG91dHNpZGUgb2Ygcm9vdCBub2RlLicpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYyA9PT0gJyYnKSB7XG4gICAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuVEVYVF9FTlRJVFlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBhcnNlci50ZXh0Tm9kZSArPSBjXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLlNDUklQVDpcbiAgICAgICAgICAvLyBvbmx5IG5vbi1zdHJpY3RcbiAgICAgICAgICBpZiAoYyA9PT0gJzwnKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlNDUklQVF9FTkRJTkdcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VyLnNjcmlwdCArPSBjXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLlNDUklQVF9FTkRJTkc6XG4gICAgICAgICAgaWYgKGMgPT09ICcvJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DTE9TRV9UQUdcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VyLnNjcmlwdCArPSAnPCcgKyBjXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlNDUklQVFxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5PUEVOX1dBS0E6XG4gICAgICAgICAgLy8gZWl0aGVyIGEgLywgPywgISwgb3IgdGV4dCBpcyBjb21pbmcgbmV4dC5cbiAgICAgICAgICBpZiAoYyA9PT0gJyEnKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlNHTUxfREVDTFxuICAgICAgICAgICAgcGFyc2VyLnNnbWxEZWNsID0gJydcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgICAgICAgLy8gd2FpdCBmb3IgaXQuLi5cbiAgICAgICAgICB9IGVsc2UgaWYgKGlzTWF0Y2gobmFtZVN0YXJ0LCBjKSkge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5PUEVOX1RBR1xuICAgICAgICAgICAgcGFyc2VyLnRhZ05hbWUgPSBjXG4gICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnLycpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQ0xPU0VfVEFHXG4gICAgICAgICAgICBwYXJzZXIudGFnTmFtZSA9ICcnXG4gICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnPycpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuUFJPQ19JTlNUXG4gICAgICAgICAgICBwYXJzZXIucHJvY0luc3ROYW1lID0gcGFyc2VyLnByb2NJbnN0Qm9keSA9ICcnXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnVW5lbmNvZGVkIDwnKVxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2FzIHNvbWUgd2hpdGVzcGFjZSwgdGhlbiBhZGQgdGhhdCBpbi5cbiAgICAgICAgICAgIGlmIChwYXJzZXIuc3RhcnRUYWdQb3NpdGlvbiArIDEgPCBwYXJzZXIucG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgdmFyIHBhZCA9IHBhcnNlci5wb3NpdGlvbiAtIHBhcnNlci5zdGFydFRhZ1Bvc2l0aW9uXG4gICAgICAgICAgICAgIGMgPSBuZXcgQXJyYXkocGFkKS5qb2luKCcgJykgKyBjXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJzZXIudGV4dE5vZGUgKz0gJzwnICsgY1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5URVhUXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLlNHTUxfREVDTDpcbiAgICAgICAgICBpZiAoKHBhcnNlci5zZ21sRGVjbCArIGMpLnRvVXBwZXJDYXNlKCkgPT09IENEQVRBKSB7XG4gICAgICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbm9wZW5jZGF0YScpXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkNEQVRBXG4gICAgICAgICAgICBwYXJzZXIuc2dtbERlY2wgPSAnJ1xuICAgICAgICAgICAgcGFyc2VyLmNkYXRhID0gJydcbiAgICAgICAgICB9IGVsc2UgaWYgKHBhcnNlci5zZ21sRGVjbCArIGMgPT09ICctLScpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQ09NTUVOVFxuICAgICAgICAgICAgcGFyc2VyLmNvbW1lbnQgPSAnJ1xuICAgICAgICAgICAgcGFyc2VyLnNnbWxEZWNsID0gJydcbiAgICAgICAgICB9IGVsc2UgaWYgKChwYXJzZXIuc2dtbERlY2wgKyBjKS50b1VwcGVyQ2FzZSgpID09PSBET0NUWVBFKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkRPQ1RZUEVcbiAgICAgICAgICAgIGlmIChwYXJzZXIuZG9jdHlwZSB8fCBwYXJzZXIuc2F3Um9vdCkge1xuICAgICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlcixcbiAgICAgICAgICAgICAgICAnSW5hcHByb3ByaWF0ZWx5IGxvY2F0ZWQgZG9jdHlwZSBkZWNsYXJhdGlvbicpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJzZXIuZG9jdHlwZSA9ICcnXG4gICAgICAgICAgICBwYXJzZXIuc2dtbERlY2wgPSAnJ1xuICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbnNnbWxkZWNsYXJhdGlvbicsIHBhcnNlci5zZ21sRGVjbClcbiAgICAgICAgICAgIHBhcnNlci5zZ21sRGVjbCA9ICcnXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlRFWFRcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzUXVvdGUoYykpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuU0dNTF9ERUNMX1FVT1RFRFxuICAgICAgICAgICAgcGFyc2VyLnNnbWxEZWNsICs9IGNcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VyLnNnbWxEZWNsICs9IGNcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuU0dNTF9ERUNMX1FVT1RFRDpcbiAgICAgICAgICBpZiAoYyA9PT0gcGFyc2VyLnEpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuU0dNTF9ERUNMXG4gICAgICAgICAgICBwYXJzZXIucSA9ICcnXG4gICAgICAgICAgfVxuICAgICAgICAgIHBhcnNlci5zZ21sRGVjbCArPSBjXG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuRE9DVFlQRTpcbiAgICAgICAgICBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlRFWFRcbiAgICAgICAgICAgIGVtaXROb2RlKHBhcnNlciwgJ29uZG9jdHlwZScsIHBhcnNlci5kb2N0eXBlKVxuICAgICAgICAgICAgcGFyc2VyLmRvY3R5cGUgPSB0cnVlIC8vIGp1c3QgcmVtZW1iZXIgdGhhdCB3ZSBzYXcgaXQuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlci5kb2N0eXBlICs9IGNcbiAgICAgICAgICAgIGlmIChjID09PSAnWycpIHtcbiAgICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5ET0NUWVBFX0RURFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1F1b3RlKGMpKSB7XG4gICAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuRE9DVFlQRV9RVU9URURcbiAgICAgICAgICAgICAgcGFyc2VyLnEgPSBjXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkRPQ1RZUEVfUVVPVEVEOlxuICAgICAgICAgIHBhcnNlci5kb2N0eXBlICs9IGNcbiAgICAgICAgICBpZiAoYyA9PT0gcGFyc2VyLnEpIHtcbiAgICAgICAgICAgIHBhcnNlci5xID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuRE9DVFlQRVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5ET0NUWVBFX0RURDpcbiAgICAgICAgICBwYXJzZXIuZG9jdHlwZSArPSBjXG4gICAgICAgICAgaWYgKGMgPT09ICddJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5ET0NUWVBFXG4gICAgICAgICAgfSBlbHNlIGlmIChpc1F1b3RlKGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkRPQ1RZUEVfRFREX1FVT1RFRFxuICAgICAgICAgICAgcGFyc2VyLnEgPSBjXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkRPQ1RZUEVfRFREX1FVT1RFRDpcbiAgICAgICAgICBwYXJzZXIuZG9jdHlwZSArPSBjXG4gICAgICAgICAgaWYgKGMgPT09IHBhcnNlci5xKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkRPQ1RZUEVfRFREXG4gICAgICAgICAgICBwYXJzZXIucSA9ICcnXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkNPTU1FTlQ6XG4gICAgICAgICAgaWYgKGMgPT09ICctJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DT01NRU5UX0VORElOR1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuY29tbWVudCArPSBjXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkNPTU1FTlRfRU5ESU5HOlxuICAgICAgICAgIGlmIChjID09PSAnLScpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQ09NTUVOVF9FTkRFRFxuICAgICAgICAgICAgcGFyc2VyLmNvbW1lbnQgPSB0ZXh0b3B0cyhwYXJzZXIub3B0LCBwYXJzZXIuY29tbWVudClcbiAgICAgICAgICAgIGlmIChwYXJzZXIuY29tbWVudCkge1xuICAgICAgICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbmNvbW1lbnQnLCBwYXJzZXIuY29tbWVudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcnNlci5jb21tZW50ID0gJydcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VyLmNvbW1lbnQgKz0gJy0nICsgY1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DT01NRU5UXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkNPTU1FTlRfRU5ERUQ6XG4gICAgICAgICAgaWYgKGMgIT09ICc+Jykge1xuICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdNYWxmb3JtZWQgY29tbWVudCcpXG4gICAgICAgICAgICAvLyBhbGxvdyA8IS0tIGJsYWggLS0gYmxvbyAtLT4gaW4gbm9uLXN0cmljdCBtb2RlLFxuICAgICAgICAgICAgLy8gd2hpY2ggaXMgYSBjb21tZW50IG9mIFwiIGJsYWggLS0gYmxvbyBcIlxuICAgICAgICAgICAgcGFyc2VyLmNvbW1lbnQgKz0gJy0tJyArIGNcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQ09NTUVOVFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlRFWFRcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQ0RBVEE6XG4gICAgICAgICAgaWYgKGMgPT09ICddJykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5DREFUQV9FTkRJTkdcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VyLmNkYXRhICs9IGNcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQ0RBVEFfRU5ESU5HOlxuICAgICAgICAgIGlmIChjID09PSAnXScpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQ0RBVEFfRU5ESU5HXzJcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VyLmNkYXRhICs9ICddJyArIGNcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQ0RBVEFcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQ0RBVEFfRU5ESU5HXzI6XG4gICAgICAgICAgaWYgKGMgPT09ICc+Jykge1xuICAgICAgICAgICAgaWYgKHBhcnNlci5jZGF0YSkge1xuICAgICAgICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbmNkYXRhJywgcGFyc2VyLmNkYXRhKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW1pdE5vZGUocGFyc2VyLCAnb25jbG9zZWNkYXRhJylcbiAgICAgICAgICAgIHBhcnNlci5jZGF0YSA9ICcnXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlRFWFRcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICddJykge1xuICAgICAgICAgICAgcGFyc2VyLmNkYXRhICs9ICddJ1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZXIuY2RhdGEgKz0gJ11dJyArIGNcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQ0RBVEFcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuUFJPQ19JTlNUOlxuICAgICAgICAgIGlmIChjID09PSAnPycpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuUFJPQ19JTlNUX0VORElOR1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlBST0NfSU5TVF9CT0RZXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcnNlci5wcm9jSW5zdE5hbWUgKz0gY1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5QUk9DX0lOU1RfQk9EWTpcbiAgICAgICAgICBpZiAoIXBhcnNlci5wcm9jSW5zdEJvZHkgJiYgaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJz8nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlBST0NfSU5TVF9FTkRJTkdcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VyLnByb2NJbnN0Qm9keSArPSBjXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLlBST0NfSU5TVF9FTkRJTkc6XG4gICAgICAgICAgaWYgKGMgPT09ICc+Jykge1xuICAgICAgICAgICAgZW1pdE5vZGUocGFyc2VyLCAnb25wcm9jZXNzaW5naW5zdHJ1Y3Rpb24nLCB7XG4gICAgICAgICAgICAgIG5hbWU6IHBhcnNlci5wcm9jSW5zdE5hbWUsXG4gICAgICAgICAgICAgIGJvZHk6IHBhcnNlci5wcm9jSW5zdEJvZHlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBwYXJzZXIucHJvY0luc3ROYW1lID0gcGFyc2VyLnByb2NJbnN0Qm9keSA9ICcnXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlRFWFRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VyLnByb2NJbnN0Qm9keSArPSAnPycgKyBjXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlBST0NfSU5TVF9CT0RZXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLk9QRU5fVEFHOlxuICAgICAgICAgIGlmIChpc01hdGNoKG5hbWVCb2R5LCBjKSkge1xuICAgICAgICAgICAgcGFyc2VyLnRhZ05hbWUgKz0gY1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdUYWcocGFyc2VyKVxuICAgICAgICAgICAgaWYgKGMgPT09ICc+Jykge1xuICAgICAgICAgICAgICBvcGVuVGFnKHBhcnNlcilcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJy8nKSB7XG4gICAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuT1BFTl9UQUdfU0xBU0hcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICghaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdJbnZhbGlkIGNoYXJhY3RlciBpbiB0YWcgbmFtZScpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuT1BFTl9UQUdfU0xBU0g6XG4gICAgICAgICAgaWYgKGMgPT09ICc+Jykge1xuICAgICAgICAgICAgb3BlblRhZyhwYXJzZXIsIHRydWUpXG4gICAgICAgICAgICBjbG9zZVRhZyhwYXJzZXIpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnRm9yd2FyZC1zbGFzaCBpbiBvcGVuaW5nIHRhZyBub3QgZm9sbG93ZWQgYnkgPicpXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQlxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5BVFRSSUI6XG4gICAgICAgICAgLy8gaGF2ZW4ndCByZWFkIHRoZSBhdHRyaWJ1dGUgbmFtZSB5ZXQuXG4gICAgICAgICAgaWYgKGlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICc+Jykge1xuICAgICAgICAgICAgb3BlblRhZyhwYXJzZXIpXG4gICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnLycpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuT1BFTl9UQUdfU0xBU0hcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzTWF0Y2gobmFtZVN0YXJ0LCBjKSkge1xuICAgICAgICAgICAgcGFyc2VyLmF0dHJpYk5hbWUgPSBjXG4gICAgICAgICAgICBwYXJzZXIuYXR0cmliVmFsdWUgPSAnJ1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJfTkFNRVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0ludmFsaWQgYXR0cmlidXRlIG5hbWUnKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5BVFRSSUJfTkFNRTpcbiAgICAgICAgICBpZiAoYyA9PT0gJz0nKSB7XG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQl9WQUxVRVxuICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0F0dHJpYnV0ZSB3aXRob3V0IHZhbHVlJylcbiAgICAgICAgICAgIHBhcnNlci5hdHRyaWJWYWx1ZSA9IHBhcnNlci5hdHRyaWJOYW1lXG4gICAgICAgICAgICBhdHRyaWIocGFyc2VyKVxuICAgICAgICAgICAgb3BlblRhZyhwYXJzZXIpXG4gICAgICAgICAgfSBlbHNlIGlmIChpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCX05BTUVfU0FXX1dISVRFXG4gICAgICAgICAgfSBlbHNlIGlmIChpc01hdGNoKG5hbWVCb2R5LCBjKSkge1xuICAgICAgICAgICAgcGFyc2VyLmF0dHJpYk5hbWUgKz0gY1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ0ludmFsaWQgYXR0cmlidXRlIG5hbWUnKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5BVFRSSUJfTkFNRV9TQVdfV0hJVEU6XG4gICAgICAgICAgaWYgKGMgPT09ICc9Jykge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJfVkFMVUVcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdBdHRyaWJ1dGUgd2l0aG91dCB2YWx1ZScpXG4gICAgICAgICAgICBwYXJzZXIudGFnLmF0dHJpYnV0ZXNbcGFyc2VyLmF0dHJpYk5hbWVdID0gJydcbiAgICAgICAgICAgIHBhcnNlci5hdHRyaWJWYWx1ZSA9ICcnXG4gICAgICAgICAgICBlbWl0Tm9kZShwYXJzZXIsICdvbmF0dHJpYnV0ZScsIHtcbiAgICAgICAgICAgICAgbmFtZTogcGFyc2VyLmF0dHJpYk5hbWUsXG4gICAgICAgICAgICAgIHZhbHVlOiAnJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHBhcnNlci5hdHRyaWJOYW1lID0gJydcbiAgICAgICAgICAgIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgICAgb3BlblRhZyhwYXJzZXIpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzTWF0Y2gobmFtZVN0YXJ0LCBjKSkge1xuICAgICAgICAgICAgICBwYXJzZXIuYXR0cmliTmFtZSA9IGNcbiAgICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJfTkFNRVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdJbnZhbGlkIGF0dHJpYnV0ZSBuYW1lJylcbiAgICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQVRUUklCX1ZBTFVFOlxuICAgICAgICAgIGlmIChpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIGlmIChpc1F1b3RlKGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIucSA9IGNcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCX1ZBTFVFX1FVT1RFRFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJpY3RGYWlsKHBhcnNlciwgJ1VucXVvdGVkIGF0dHJpYnV0ZSB2YWx1ZScpXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQl9WQUxVRV9VTlFVT1RFRFxuICAgICAgICAgICAgcGFyc2VyLmF0dHJpYlZhbHVlID0gY1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5BVFRSSUJfVkFMVUVfUVVPVEVEOlxuICAgICAgICAgIGlmIChjICE9PSBwYXJzZXIucSkge1xuICAgICAgICAgICAgaWYgKGMgPT09ICcmJykge1xuICAgICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQl9WQUxVRV9FTlRJVFlfUVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGFyc2VyLmF0dHJpYlZhbHVlICs9IGNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGF0dHJpYihwYXJzZXIpXG4gICAgICAgICAgcGFyc2VyLnEgPSAnJ1xuICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCX1ZBTFVFX0NMT1NFRFxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkFUVFJJQl9WQUxVRV9DTE9TRUQ6XG4gICAgICAgICAgaWYgKGlzV2hpdGVzcGFjZShjKSkge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09ICc+Jykge1xuICAgICAgICAgICAgb3BlblRhZyhwYXJzZXIpXG4gICAgICAgICAgfSBlbHNlIGlmIChjID09PSAnLycpIHtcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuT1BFTl9UQUdfU0xBU0hcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzTWF0Y2gobmFtZVN0YXJ0LCBjKSkge1xuICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdObyB3aGl0ZXNwYWNlIGJldHdlZW4gYXR0cmlidXRlcycpXG4gICAgICAgICAgICBwYXJzZXIuYXR0cmliTmFtZSA9IGNcbiAgICAgICAgICAgIHBhcnNlci5hdHRyaWJWYWx1ZSA9ICcnXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLkFUVFJJQl9OQU1FXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnSW52YWxpZCBhdHRyaWJ1dGUgbmFtZScpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSBTLkFUVFJJQl9WQUxVRV9VTlFVT1RFRDpcbiAgICAgICAgICBpZiAoIWlzQXR0cmliRW5kKGMpKSB7XG4gICAgICAgICAgICBpZiAoYyA9PT0gJyYnKSB7XG4gICAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQVRUUklCX1ZBTFVFX0VOVElUWV9VXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwYXJzZXIuYXR0cmliVmFsdWUgKz0gY1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG4gICAgICAgICAgYXR0cmliKHBhcnNlcilcbiAgICAgICAgICBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICBvcGVuVGFnKHBhcnNlcilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gUy5BVFRSSUJcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlIFMuQ0xPU0VfVEFHOlxuICAgICAgICAgIGlmICghcGFyc2VyLnRhZ05hbWUpIHtcbiAgICAgICAgICAgIGlmIChpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm90TWF0Y2gobmFtZVN0YXJ0LCBjKSkge1xuICAgICAgICAgICAgICBpZiAocGFyc2VyLnNjcmlwdCkge1xuICAgICAgICAgICAgICAgIHBhcnNlci5zY3JpcHQgKz0gJzwvJyArIGNcbiAgICAgICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSBTLlNDUklQVFxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnSW52YWxpZCB0YWduYW1lIGluIGNsb3NpbmcgdGFnLicpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBhcnNlci50YWdOYW1lID0gY1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gJz4nKSB7XG4gICAgICAgICAgICBjbG9zZVRhZyhwYXJzZXIpXG4gICAgICAgICAgfSBlbHNlIGlmIChpc01hdGNoKG5hbWVCb2R5LCBjKSkge1xuICAgICAgICAgICAgcGFyc2VyLnRhZ05hbWUgKz0gY1xuICAgICAgICAgIH0gZWxzZSBpZiAocGFyc2VyLnNjcmlwdCkge1xuICAgICAgICAgICAgcGFyc2VyLnNjcmlwdCArPSAnPC8nICsgcGFyc2VyLnRhZ05hbWVcbiAgICAgICAgICAgIHBhcnNlci50YWdOYW1lID0gJydcbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuU0NSSVBUXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaXNXaGl0ZXNwYWNlKGMpKSB7XG4gICAgICAgICAgICAgIHN0cmljdEZhaWwocGFyc2VyLCAnSW52YWxpZCB0YWduYW1lIGluIGNsb3NpbmcgdGFnJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcnNlci5zdGF0ZSA9IFMuQ0xPU0VfVEFHX1NBV19XSElURVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5DTE9TRV9UQUdfU0FXX1dISVRFOlxuICAgICAgICAgIGlmIChpc1doaXRlc3BhY2UoYykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjID09PSAnPicpIHtcbiAgICAgICAgICAgIGNsb3NlVGFnKHBhcnNlcilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdJbnZhbGlkIGNoYXJhY3RlcnMgaW4gY2xvc2luZyB0YWcnKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGNhc2UgUy5URVhUX0VOVElUWTpcbiAgICAgICAgY2FzZSBTLkFUVFJJQl9WQUxVRV9FTlRJVFlfUTpcbiAgICAgICAgY2FzZSBTLkFUVFJJQl9WQUxVRV9FTlRJVFlfVTpcbiAgICAgICAgICB2YXIgcmV0dXJuU3RhdGVcbiAgICAgICAgICB2YXIgYnVmZmVyXG4gICAgICAgICAgc3dpdGNoIChwYXJzZXIuc3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgUy5URVhUX0VOVElUWTpcbiAgICAgICAgICAgICAgcmV0dXJuU3RhdGUgPSBTLlRFWFRcbiAgICAgICAgICAgICAgYnVmZmVyID0gJ3RleHROb2RlJ1xuICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICBjYXNlIFMuQVRUUklCX1ZBTFVFX0VOVElUWV9ROlxuICAgICAgICAgICAgICByZXR1cm5TdGF0ZSA9IFMuQVRUUklCX1ZBTFVFX1FVT1RFRFxuICAgICAgICAgICAgICBidWZmZXIgPSAnYXR0cmliVmFsdWUnXG4gICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgIGNhc2UgUy5BVFRSSUJfVkFMVUVfRU5USVRZX1U6XG4gICAgICAgICAgICAgIHJldHVyblN0YXRlID0gUy5BVFRSSUJfVkFMVUVfVU5RVU9URURcbiAgICAgICAgICAgICAgYnVmZmVyID0gJ2F0dHJpYlZhbHVlJ1xuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjID09PSAnOycpIHtcbiAgICAgICAgICAgIHBhcnNlcltidWZmZXJdICs9IHBhcnNlRW50aXR5KHBhcnNlcilcbiAgICAgICAgICAgIHBhcnNlci5lbnRpdHkgPSAnJ1xuICAgICAgICAgICAgcGFyc2VyLnN0YXRlID0gcmV0dXJuU3RhdGVcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzTWF0Y2gocGFyc2VyLmVudGl0eS5sZW5ndGggPyBlbnRpdHlCb2R5IDogZW50aXR5U3RhcnQsIGMpKSB7XG4gICAgICAgICAgICBwYXJzZXIuZW50aXR5ICs9IGNcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyaWN0RmFpbChwYXJzZXIsICdJbnZhbGlkIGNoYXJhY3RlciBpbiBlbnRpdHkgbmFtZScpXG4gICAgICAgICAgICBwYXJzZXJbYnVmZmVyXSArPSAnJicgKyBwYXJzZXIuZW50aXR5ICsgY1xuICAgICAgICAgICAgcGFyc2VyLmVudGl0eSA9ICcnXG4gICAgICAgICAgICBwYXJzZXIuc3RhdGUgPSByZXR1cm5TdGF0ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocGFyc2VyLCAnVW5rbm93biBzdGF0ZTogJyArIHBhcnNlci5zdGF0ZSlcbiAgICAgIH1cbiAgICB9IC8vIHdoaWxlXG5cbiAgICBpZiAocGFyc2VyLnBvc2l0aW9uID49IHBhcnNlci5idWZmZXJDaGVja1Bvc2l0aW9uKSB7XG4gICAgICBjaGVja0J1ZmZlckxlbmd0aChwYXJzZXIpXG4gICAgfVxuICAgIHJldHVybiBwYXJzZXJcbiAgfVxuXG4gIC8qISBodHRwOi8vbXRocy5iZS9mcm9tY29kZXBvaW50IHYwLjEuMCBieSBAbWF0aGlhcyAqL1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAoIVN0cmluZy5mcm9tQ29kZVBvaW50KSB7XG4gICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdHJpbmdGcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlXG4gICAgICB2YXIgZmxvb3IgPSBNYXRoLmZsb29yXG4gICAgICB2YXIgZnJvbUNvZGVQb2ludCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIE1BWF9TSVpFID0gMHg0MDAwXG4gICAgICAgIHZhciBjb2RlVW5pdHMgPSBbXVxuICAgICAgICB2YXIgaGlnaFN1cnJvZ2F0ZVxuICAgICAgICB2YXIgbG93U3Vycm9nYXRlXG4gICAgICAgIHZhciBpbmRleCA9IC0xXG4gICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuICcnXG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9ICcnXG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGNvZGVQb2ludCA9IE51bWJlcihhcmd1bWVudHNbaW5kZXhdKVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFpc0Zpbml0ZShjb2RlUG9pbnQpIHx8IC8vIGBOYU5gLCBgK0luZmluaXR5YCwgb3IgYC1JbmZpbml0eWBcbiAgICAgICAgICAgIGNvZGVQb2ludCA8IDAgfHwgLy8gbm90IGEgdmFsaWQgVW5pY29kZSBjb2RlIHBvaW50XG4gICAgICAgICAgICBjb2RlUG9pbnQgPiAweDEwRkZGRiB8fCAvLyBub3QgYSB2YWxpZCBVbmljb2RlIGNvZGUgcG9pbnRcbiAgICAgICAgICAgIGZsb29yKGNvZGVQb2ludCkgIT09IGNvZGVQb2ludCAvLyBub3QgYW4gaW50ZWdlclxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcignSW52YWxpZCBjb2RlIHBvaW50OiAnICsgY29kZVBvaW50KVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29kZVBvaW50IDw9IDB4RkZGRikgeyAvLyBCTVAgY29kZSBwb2ludFxuICAgICAgICAgICAgY29kZVVuaXRzLnB1c2goY29kZVBvaW50KVxuICAgICAgICAgIH0gZWxzZSB7IC8vIEFzdHJhbCBjb2RlIHBvaW50OyBzcGxpdCBpbiBzdXJyb2dhdGUgaGFsdmVzXG4gICAgICAgICAgICAvLyBodHRwOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nI3N1cnJvZ2F0ZS1mb3JtdWxhZVxuICAgICAgICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgICAgICAgIGhpZ2hTdXJyb2dhdGUgPSAoY29kZVBvaW50ID4+IDEwKSArIDB4RDgwMFxuICAgICAgICAgICAgbG93U3Vycm9nYXRlID0gKGNvZGVQb2ludCAlIDB4NDAwKSArIDB4REMwMFxuICAgICAgICAgICAgY29kZVVuaXRzLnB1c2goaGlnaFN1cnJvZ2F0ZSwgbG93U3Vycm9nYXRlKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaW5kZXggKyAxID09PSBsZW5ndGggfHwgY29kZVVuaXRzLmxlbmd0aCA+IE1BWF9TSVpFKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gc3RyaW5nRnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNvZGVVbml0cylcbiAgICAgICAgICAgIGNvZGVVbml0cy5sZW5ndGggPSAwXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgIH1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdHJpbmcsICdmcm9tQ29kZVBvaW50Jywge1xuICAgICAgICAgIHZhbHVlOiBmcm9tQ29kZVBvaW50LFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgU3RyaW5nLmZyb21Db2RlUG9pbnQgPSBmcm9tQ29kZVBvaW50XG4gICAgICB9XG4gICAgfSgpKVxuICB9XG59KSh0eXBlb2YgZXhwb3J0cyA9PT0gJ3VuZGVmaW5lZCcgPyB0aGlzLnNheCA9IHt9IDogZXhwb3J0cylcbiIsInZhciBSID0gcmVxdWlyZSgncmFtZGEnKTtcbnZhciBzYXggPSByZXF1aXJlKCdzYXgnKTtcblxuLy8gUmV0dXJucyBlbGVtZW50cyBncm91cGVkIGJ5IGNoYW5nZXNldCBJRC5cblxuZnVuY3Rpb24gQXVnbWVudGVkRGlmZlBhcnNlciAoeG1sRGF0YSwgY2hhbmdlc2V0c0ZpbHRlciwgY2FsbGJhY2spIHtcbiAgdmFyIHhtbFBhcnNlciA9IHNheC5wYXJzZXIodHJ1ZSwgeyBsb3dlcmNhc2U6IHRydWUgfSk7XG4gIHZhciBjdXJyZW50QWN0aW9uID0gJyc7XG4gIHZhciBjdXJyZW50RWxlbWVudCA9IHt9O1xuICB2YXIgb2xkRWxlbWVudCA9IHt9O1xuICB2YXIgY3VycmVudE1lbWJlciA9IHt9O1xuICB2YXIgY3VycmVudE1vZGUgPSAnJztcbiAgdmFyIGNoYW5nZXNldE1hcCA9IHt9O1xuXG4gIGZ1bmN0aW9uIGlzRWxlbWVudCAoc3ltYm9sKSB7XG4gICAgcmV0dXJuIChzeW1ib2wgPT09ICdub2RlJyB8fCBzeW1ib2wgPT09ICd3YXknIHx8IHN5bWJvbCA9PT0gJ3JlbGF0aW9uJyk7XG4gIH1cblxuICBmdW5jdGlvbiBlbmRUYWcgKHN5bWJvbCkge1xuICAgIGlmIChzeW1ib2wgPT09ICdhY3Rpb24nKSB7XG4gICAgICB2YXIgY2hhbmdlc2V0ID0gY3VycmVudEVsZW1lbnQuY2hhbmdlc2V0O1xuICAgICAgaWYgKGNoYW5nZXNldHNGaWx0ZXIgJiYgY2hhbmdlc2V0c0ZpbHRlci5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGNoYW5nZXNldHNGaWx0ZXIuaW5kZXhPZihjaGFuZ2VzZXQpICE9PSAtMSkge1xuICAgICAgICAgIGlmIChjaGFuZ2VzZXRNYXBbY2hhbmdlc2V0XSkge1xuICAgICAgICAgICAgY2hhbmdlc2V0TWFwW2NoYW5nZXNldF0ucHVzaChjdXJyZW50RWxlbWVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoYW5nZXNldE1hcFtjaGFuZ2VzZXRdID0gW2N1cnJlbnRFbGVtZW50XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNoYW5nZXNldE1hcFtjaGFuZ2VzZXRdKSB7XG4gICAgICAgICAgICBjaGFuZ2VzZXRNYXBbY2hhbmdlc2V0XS5wdXNoKGN1cnJlbnRFbGVtZW50KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hhbmdlc2V0TWFwW2NoYW5nZXNldF0gPSBbY3VycmVudEVsZW1lbnRdO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN5bWJvbCA9PT0gJ29zbScpIHtcbiAgICAgIGNhbGxiYWNrKG51bGwsIGNoYW5nZXNldE1hcCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RhcnRUYWcgKG5vZGUpIHtcbiAgICB2YXIgc3ltYm9sID0gbm9kZS5uYW1lO1xuICAgIHZhciBhdHRycyA9IG5vZGUuYXR0cmlidXRlcztcblxuICAgIGlmIChzeW1ib2wgPT09ICdhY3Rpb24nKSB7XG4gICAgICBjdXJyZW50QWN0aW9uID0gYXR0cnMudHlwZTtcbiAgICB9XG4gICAgaWYgKHN5bWJvbCA9PT0gJ25ldycgfHwgc3ltYm9sID09PSAnb2xkJykge1xuICAgICAgY3VycmVudE1vZGUgPSBzeW1ib2w7XG4gICAgfVxuICAgIGlmIChpc0VsZW1lbnQoc3ltYm9sKSkge1xuICAgICAgaWYgKGN1cnJlbnRNb2RlID09PSAnbmV3JyAmJiAoY3VycmVudEFjdGlvbiA9PT0gJ21vZGlmeScgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRBY3Rpb24gPT09ICdkZWxldGUnKSkge1xuICAgICAgICBvbGRFbGVtZW50ID0gUi5jbG9uZShjdXJyZW50RWxlbWVudCk7XG4gICAgICAgIGN1cnJlbnRFbGVtZW50ID0gYXR0cnM7XG4gICAgICAgIGN1cnJlbnRFbGVtZW50Lm9sZCA9IG9sZEVsZW1lbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50RWxlbWVudCA9IGF0dHJzO1xuICAgICAgfVxuICAgICAgY3VycmVudEVsZW1lbnQuYWN0aW9uID0gY3VycmVudEFjdGlvbjtcbiAgICAgIGN1cnJlbnRFbGVtZW50LnR5cGUgPSBzeW1ib2w7XG4gICAgICBjdXJyZW50RWxlbWVudC50YWdzID0ge307XG4gICAgICBpZiAoc3ltYm9sID09PSAnd2F5Jykge2N1cnJlbnRFbGVtZW50Lm5vZGVzID0gW107IH1cbiAgICAgIGlmIChzeW1ib2wgPT09ICdyZWxhdGlvbicpIHtjdXJyZW50RWxlbWVudC5tZW1iZXJzID0gW107IGN1cnJlbnRNZW1iZXIgPSB7fTt9XG4gICAgfVxuICAgIGlmIChzeW1ib2wgPT09ICd0YWcnICYmIGN1cnJlbnRFbGVtZW50KSB7XG4gICAgICBjdXJyZW50RWxlbWVudC50YWdzW2F0dHJzLmtdID0gYXR0cnMudjtcbiAgICB9XG5cbiAgICBpZiAoc3ltYm9sID09PSAnbmQnICYmIGN1cnJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50LnR5cGUgPT09ICd3YXknKSB7XG4gICAgICBjdXJyZW50RWxlbWVudC5ub2Rlcy5wdXNoKGF0dHJzKTtcbiAgICB9XG5cbiAgICBpZiAoc3ltYm9sID09PSAnbmQnICYmIGN1cnJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50LnR5cGUgPT09ICdyZWxhdGlvbicpIHtcbiAgICAgIGN1cnJlbnRNZW1iZXIubm9kZXMucHVzaChhdHRycyk7XG4gICAgfVxuXG4gICAgaWYgKHN5bWJvbCA9PT0gJ21lbWJlcicgJiYgY3VycmVudEVsZW1lbnQgJiYgY3VycmVudEVsZW1lbnQudHlwZSA9PT0gJ3JlbGF0aW9uJykge1xuICAgICAgY3VycmVudE1lbWJlciA9IFIuY2xvbmUoYXR0cnMpO1xuICAgICAgY3VycmVudE1lbWJlci5ub2RlcyA9IFtdO1xuICAgICAgY3VycmVudEVsZW1lbnQubWVtYmVycy5wdXNoKGN1cnJlbnRNZW1iZXIpO1xuICAgIH1cbiAgfVxuXG4gIHhtbFBhcnNlci5vbm9wZW50YWcgPSBzdGFydFRhZztcbiAgeG1sUGFyc2VyLm9uY2xvc2V0YWcgPSBlbmRUYWc7XG4gIHhtbFBhcnNlci5vbmVycm9yID0gZnVuY3Rpb24oZXJyKSB7IGNhbGxiYWNrKGVyciwgbnVsbCk7IH07XG4gIHhtbFBhcnNlci53cml0ZSh4bWxEYXRhKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBBdWdtZW50ZWREaWZmUGFyc2VyO1xuIiwiLyoqXG4gKiBXcmFwcyBhIEdlb0pTT04ge0BsaW5rIEdlb21ldHJ5fSBpbiBhIEdlb0pTT04ge0BsaW5rIEZlYXR1cmV9LlxuICpcbiAqIEBuYW1lIGZlYXR1cmVcbiAqIEBwYXJhbSB7R2VvbWV0cnl9IGdlb21ldHJ5IGlucHV0IGdlb21ldHJ5XG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJucyB7RmVhdHVyZUNvbGxlY3Rpb259IGEgRmVhdHVyZUNvbGxlY3Rpb24gb2YgaW5wdXQgZmVhdHVyZXNcbiAqIEBleGFtcGxlXG4gKiB2YXIgZ2VvbWV0cnkgPSB7XG4gKiAgICAgIFwidHlwZVwiOiBcIlBvaW50XCIsXG4gKiAgICAgIFwiY29vcmRpbmF0ZXNcIjogW1xuICogICAgICAgIDY3LjUsXG4gKiAgICAgICAgMzIuODQyNjczNjMxOTU0MzFcbiAqICAgICAgXVxuICogICAgfVxuICpcbiAqIHZhciBmZWF0dXJlID0gdHVyZi5mZWF0dXJlKGdlb21ldHJ5KTtcbiAqXG4gKiAvLz1mZWF0dXJlXG4gKi9cbmZ1bmN0aW9uIGZlYXR1cmUoZ2VvbWV0cnksIHByb3BlcnRpZXMpIHtcbiAgICBpZiAoIWdlb21ldHJ5KSB0aHJvdyBuZXcgRXJyb3IoJ05vIGdlb21ldHJ5IHBhc3NlZCcpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ0ZlYXR1cmUnLFxuICAgICAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzIHx8IHt9LFxuICAgICAgICBnZW9tZXRyeTogZ2VvbWV0cnlcbiAgICB9O1xufVxubW9kdWxlLmV4cG9ydHMuZmVhdHVyZSA9IGZlYXR1cmU7XG5cbi8qKlxuICogVGFrZXMgY29vcmRpbmF0ZXMgYW5kIHByb3BlcnRpZXMgKG9wdGlvbmFsKSBhbmQgcmV0dXJucyBhIG5ldyB7QGxpbmsgUG9pbnR9IGZlYXR1cmUuXG4gKlxuICogQG5hbWUgcG9pbnRcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gY29vcmRpbmF0ZXMgbG9uZ2l0dWRlLCBsYXRpdHVkZSBwb3NpdGlvbiAoZWFjaCBpbiBkZWNpbWFsIGRlZ3JlZXMpXG4gKiBAcGFyYW0ge09iamVjdD19IHByb3BlcnRpZXMgYW4gT2JqZWN0IHRoYXQgaXMgdXNlZCBhcyB0aGUge0BsaW5rIEZlYXR1cmV9J3NcbiAqIHByb3BlcnRpZXNcbiAqIEByZXR1cm5zIHtGZWF0dXJlPFBvaW50Pn0gYSBQb2ludCBmZWF0dXJlXG4gKiBAZXhhbXBsZVxuICogdmFyIHB0MSA9IHR1cmYucG9pbnQoWy03NS4zNDMsIDM5Ljk4NF0pO1xuICpcbiAqIC8vPXB0MVxuICovXG5tb2R1bGUuZXhwb3J0cy5wb2ludCA9IGZ1bmN0aW9uIChjb29yZGluYXRlcywgcHJvcGVydGllcykge1xuICAgIGlmICghY29vcmRpbmF0ZXMpIHRocm93IG5ldyBFcnJvcignTm8gY29vcmRpbmF0ZXMgcGFzc2VkJyk7XG4gICAgaWYgKGNvb3JkaW5hdGVzLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoJ0Nvb3JkaW5hdGVzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICBpZiAoY29vcmRpbmF0ZXMubGVuZ3RoIDwgMikgdGhyb3cgbmV3IEVycm9yKCdDb29yZGluYXRlcyBtdXN0IGJlIGF0IGxlYXN0IDIgbnVtYmVycyBsb25nJyk7XG4gICAgaWYgKHR5cGVvZiBjb29yZGluYXRlc1swXSAhPT0gJ251bWJlcicgfHwgdHlwZW9mIGNvb3JkaW5hdGVzWzFdICE9PSAnbnVtYmVyJykgdGhyb3cgbmV3IEVycm9yKCdDb29yZGluYXRlcyBtdXN0IG51bWJlcnMnKTtcblxuICAgIHJldHVybiBmZWF0dXJlKHtcbiAgICAgICAgdHlwZTogJ1BvaW50JyxcbiAgICAgICAgY29vcmRpbmF0ZXM6IGNvb3JkaW5hdGVzXG4gICAgfSwgcHJvcGVydGllcyk7XG59O1xuXG4vKipcbiAqIFRha2VzIGFuIGFycmF5IG9mIExpbmVhclJpbmdzIGFuZCBvcHRpb25hbGx5IGFuIHtAbGluayBPYmplY3R9IHdpdGggcHJvcGVydGllcyBhbmQgcmV0dXJucyBhIHtAbGluayBQb2x5Z29ufSBmZWF0dXJlLlxuICpcbiAqIEBuYW1lIHBvbHlnb25cbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8QXJyYXk8bnVtYmVyPj4+fSBjb29yZGluYXRlcyBhbiBhcnJheSBvZiBMaW5lYXJSaW5nc1xuICogQHBhcmFtIHtPYmplY3Q9fSBwcm9wZXJ0aWVzIGEgcHJvcGVydGllcyBvYmplY3RcbiAqIEByZXR1cm5zIHtGZWF0dXJlPFBvbHlnb24+fSBhIFBvbHlnb24gZmVhdHVyZVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIGEgTGluZWFyUmluZyBvZiB0aGUgcG9seWdvbiBoYXMgdG9vIGZldyBwb3NpdGlvbnNcbiAqIG9yIGlmIGEgTGluZWFyUmluZyBvZiB0aGUgUG9seWdvbiBkb2VzIG5vdCBoYXZlIG1hdGNoaW5nIFBvc2l0aW9ucyBhdCB0aGVcbiAqIGJlZ2lubmluZyAmIGVuZC5cbiAqIEBleGFtcGxlXG4gKiB2YXIgcG9seWdvbiA9IHR1cmYucG9seWdvbihbW1xuICogIFstMi4yNzU1NDMsIDUzLjQ2NDU0N10sXG4gKiAgWy0yLjI3NTU0MywgNTMuNDg5MjcxXSxcbiAqICBbLTIuMjE1MTE4LCA1My40ODkyNzFdLFxuICogIFstMi4yMTUxMTgsIDUzLjQ2NDU0N10sXG4gKiAgWy0yLjI3NTU0MywgNTMuNDY0NTQ3XVxuICogXV0sIHsgbmFtZTogJ3BvbHkxJywgcG9wdWxhdGlvbjogNDAwfSk7XG4gKlxuICogLy89cG9seWdvblxuICovXG5tb2R1bGUuZXhwb3J0cy5wb2x5Z29uID0gZnVuY3Rpb24gKGNvb3JkaW5hdGVzLCBwcm9wZXJ0aWVzKSB7XG4gICAgaWYgKCFjb29yZGluYXRlcykgdGhyb3cgbmV3IEVycm9yKCdObyBjb29yZGluYXRlcyBwYXNzZWQnKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHJpbmcgPSBjb29yZGluYXRlc1tpXTtcbiAgICAgICAgaWYgKHJpbmcubGVuZ3RoIDwgNCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFYWNoIExpbmVhclJpbmcgb2YgYSBQb2x5Z29uIG11c3QgaGF2ZSA0IG9yIG1vcmUgUG9zaXRpb25zLicpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmluZ1tyaW5nLmxlbmd0aCAtIDFdLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAocmluZ1tyaW5nLmxlbmd0aCAtIDFdW2pdICE9PSByaW5nWzBdW2pdKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaXJzdCBhbmQgbGFzdCBQb3NpdGlvbiBhcmUgbm90IGVxdWl2YWxlbnQuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmVhdHVyZSh7XG4gICAgICAgIHR5cGU6ICdQb2x5Z29uJyxcbiAgICAgICAgY29vcmRpbmF0ZXM6IGNvb3JkaW5hdGVzXG4gICAgfSwgcHJvcGVydGllcyk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgTGluZVN0cmluZ30gYmFzZWQgb24gYVxuICogY29vcmRpbmF0ZSBhcnJheS4gUHJvcGVydGllcyBjYW4gYmUgYWRkZWQgb3B0aW9uYWxseS5cbiAqXG4gKiBAbmFtZSBsaW5lU3RyaW5nXG4gKiBAcGFyYW0ge0FycmF5PEFycmF5PG51bWJlcj4+fSBjb29yZGluYXRlcyBhbiBhcnJheSBvZiBQb3NpdGlvbnNcbiAqIEBwYXJhbSB7T2JqZWN0PX0gcHJvcGVydGllcyBhbiBPYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzIHRvIGFkZCBhcyBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJucyB7RmVhdHVyZTxMaW5lU3RyaW5nPn0gYSBMaW5lU3RyaW5nIGZlYXR1cmVcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBubyBjb29yZGluYXRlcyBhcmUgcGFzc2VkXG4gKiBAZXhhbXBsZVxuICogdmFyIGxpbmVzdHJpbmcxID0gdHVyZi5saW5lU3RyaW5nKFtcbiAqICAgWy0yMS45NjQ0MTYsIDY0LjE0ODIwM10sXG4gKiAgIFstMjEuOTU2MTc2LCA2NC4xNDEzMTZdLFxuICogICBbLTIxLjkzOTAxLCA2NC4xMzU5MjRdLFxuICogICBbLTIxLjkyNzMzNywgNjQuMTM2NjczXVxuICogXSk7XG4gKiB2YXIgbGluZXN0cmluZzIgPSB0dXJmLmxpbmVTdHJpbmcoW1xuICogICBbLTIxLjkyOTA1NCwgNjQuMTI3OTg1XSxcbiAqICAgWy0yMS45MTI5MTgsIDY0LjEzNDcyNl0sXG4gKiAgIFstMjEuOTE2MDA3LCA2NC4xNDEwMTZdLFxuICogICBbLTIxLjkzMDA4NCwgNjQuMTQ0NDZdXG4gKiBdLCB7bmFtZTogJ2xpbmUgMScsIGRpc3RhbmNlOiAxNDV9KTtcbiAqXG4gKiAvLz1saW5lc3RyaW5nMVxuICpcbiAqIC8vPWxpbmVzdHJpbmcyXG4gKi9cbm1vZHVsZS5leHBvcnRzLmxpbmVTdHJpbmcgPSBmdW5jdGlvbiAoY29vcmRpbmF0ZXMsIHByb3BlcnRpZXMpIHtcbiAgICBpZiAoIWNvb3JkaW5hdGVzKSB0aHJvdyBuZXcgRXJyb3IoJ05vIGNvb3JkaW5hdGVzIHBhc3NlZCcpO1xuXG4gICAgcmV0dXJuIGZlYXR1cmUoe1xuICAgICAgICB0eXBlOiAnTGluZVN0cmluZycsXG4gICAgICAgIGNvb3JkaW5hdGVzOiBjb29yZGluYXRlc1xuICAgIH0sIHByb3BlcnRpZXMpO1xufTtcblxuLyoqXG4gKiBUYWtlcyBvbmUgb3IgbW9yZSB7QGxpbmsgRmVhdHVyZXxGZWF0dXJlc30gYW5kIGNyZWF0ZXMgYSB7QGxpbmsgRmVhdHVyZUNvbGxlY3Rpb259LlxuICpcbiAqIEBuYW1lIGZlYXR1cmVDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0ZlYXR1cmVbXX0gZmVhdHVyZXMgaW5wdXQgZmVhdHVyZXNcbiAqIEByZXR1cm5zIHtGZWF0dXJlQ29sbGVjdGlvbn0gYSBGZWF0dXJlQ29sbGVjdGlvbiBvZiBpbnB1dCBmZWF0dXJlc1xuICogQGV4YW1wbGVcbiAqIHZhciBmZWF0dXJlcyA9IFtcbiAqICB0dXJmLnBvaW50KFstNzUuMzQzLCAzOS45ODRdLCB7bmFtZTogJ0xvY2F0aW9uIEEnfSksXG4gKiAgdHVyZi5wb2ludChbLTc1LjgzMywgMzkuMjg0XSwge25hbWU6ICdMb2NhdGlvbiBCJ30pLFxuICogIHR1cmYucG9pbnQoWy03NS41MzQsIDM5LjEyM10sIHtuYW1lOiAnTG9jYXRpb24gQyd9KVxuICogXTtcbiAqXG4gKiB2YXIgZmMgPSB0dXJmLmZlYXR1cmVDb2xsZWN0aW9uKGZlYXR1cmVzKTtcbiAqXG4gKiAvLz1mY1xuICovXG5tb2R1bGUuZXhwb3J0cy5mZWF0dXJlQ29sbGVjdGlvbiA9IGZ1bmN0aW9uIChmZWF0dXJlcykge1xuICAgIGlmICghZmVhdHVyZXMpIHRocm93IG5ldyBFcnJvcignTm8gZmVhdHVyZXMgcGFzc2VkJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgICBmZWF0dXJlczogZmVhdHVyZXNcbiAgICB9O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEge0BsaW5rIEZlYXR1cmU8TXVsdGlMaW5lU3RyaW5nPn0gYmFzZWQgb24gYVxuICogY29vcmRpbmF0ZSBhcnJheS4gUHJvcGVydGllcyBjYW4gYmUgYWRkZWQgb3B0aW9uYWxseS5cbiAqXG4gKiBAbmFtZSBtdWx0aUxpbmVTdHJpbmdcbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8QXJyYXk8bnVtYmVyPj4+fSBjb29yZGluYXRlcyBhbiBhcnJheSBvZiBMaW5lU3RyaW5nc1xuICogQHBhcmFtIHtPYmplY3Q9fSBwcm9wZXJ0aWVzIGFuIE9iamVjdCBvZiBrZXktdmFsdWUgcGFpcnMgdG8gYWRkIGFzIHByb3BlcnRpZXNcbiAqIEByZXR1cm5zIHtGZWF0dXJlPE11bHRpTGluZVN0cmluZz59IGEgTXVsdGlMaW5lU3RyaW5nIGZlYXR1cmVcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBubyBjb29yZGluYXRlcyBhcmUgcGFzc2VkXG4gKiBAZXhhbXBsZVxuICogdmFyIG11bHRpTGluZSA9IHR1cmYubXVsdGlMaW5lU3RyaW5nKFtbWzAsMF0sWzEwLDEwXV1dKTtcbiAqXG4gKiAvLz1tdWx0aUxpbmVcbiAqXG4gKi9cbm1vZHVsZS5leHBvcnRzLm11bHRpTGluZVN0cmluZyA9IGZ1bmN0aW9uIChjb29yZGluYXRlcywgcHJvcGVydGllcykge1xuICAgIGlmICghY29vcmRpbmF0ZXMpIHRocm93IG5ldyBFcnJvcignTm8gY29vcmRpbmF0ZXMgcGFzc2VkJyk7XG5cbiAgICByZXR1cm4gZmVhdHVyZSh7XG4gICAgICAgIHR5cGU6ICdNdWx0aUxpbmVTdHJpbmcnLFxuICAgICAgICBjb29yZGluYXRlczogY29vcmRpbmF0ZXNcbiAgICB9LCBwcm9wZXJ0aWVzKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBGZWF0dXJlPE11bHRpUG9pbnQ+fSBiYXNlZCBvbiBhXG4gKiBjb29yZGluYXRlIGFycmF5LiBQcm9wZXJ0aWVzIGNhbiBiZSBhZGRlZCBvcHRpb25hbGx5LlxuICpcbiAqIEBuYW1lIG11bHRpUG9pbnRcbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8bnVtYmVyPj59IGNvb3JkaW5hdGVzIGFuIGFycmF5IG9mIFBvc2l0aW9uc1xuICogQHBhcmFtIHtPYmplY3Q9fSBwcm9wZXJ0aWVzIGFuIE9iamVjdCBvZiBrZXktdmFsdWUgcGFpcnMgdG8gYWRkIGFzIHByb3BlcnRpZXNcbiAqIEByZXR1cm5zIHtGZWF0dXJlPE11bHRpUG9pbnQ+fSBhIE11bHRpUG9pbnQgZmVhdHVyZVxuICogQHRocm93cyB7RXJyb3J9IGlmIG5vIGNvb3JkaW5hdGVzIGFyZSBwYXNzZWRcbiAqIEBleGFtcGxlXG4gKiB2YXIgbXVsdGlQdCA9IHR1cmYubXVsdGlQb2ludChbWzAsMF0sWzEwLDEwXV0pO1xuICpcbiAqIC8vPW11bHRpUHRcbiAqXG4gKi9cbm1vZHVsZS5leHBvcnRzLm11bHRpUG9pbnQgPSBmdW5jdGlvbiAoY29vcmRpbmF0ZXMsIHByb3BlcnRpZXMpIHtcbiAgICBpZiAoIWNvb3JkaW5hdGVzKSB0aHJvdyBuZXcgRXJyb3IoJ05vIGNvb3JkaW5hdGVzIHBhc3NlZCcpO1xuXG4gICAgcmV0dXJuIGZlYXR1cmUoe1xuICAgICAgICB0eXBlOiAnTXVsdGlQb2ludCcsXG4gICAgICAgIGNvb3JkaW5hdGVzOiBjb29yZGluYXRlc1xuICAgIH0sIHByb3BlcnRpZXMpO1xufTtcblxuXG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgRmVhdHVyZTxNdWx0aVBvbHlnb24+fSBiYXNlZCBvbiBhXG4gKiBjb29yZGluYXRlIGFycmF5LiBQcm9wZXJ0aWVzIGNhbiBiZSBhZGRlZCBvcHRpb25hbGx5LlxuICpcbiAqIEBuYW1lIG11bHRpUG9seWdvblxuICogQHBhcmFtIHtBcnJheTxBcnJheTxBcnJheTxBcnJheTxudW1iZXI+Pj4+fSBjb29yZGluYXRlcyBhbiBhcnJheSBvZiBQb2x5Z29uc1xuICogQHBhcmFtIHtPYmplY3Q9fSBwcm9wZXJ0aWVzIGFuIE9iamVjdCBvZiBrZXktdmFsdWUgcGFpcnMgdG8gYWRkIGFzIHByb3BlcnRpZXNcbiAqIEByZXR1cm5zIHtGZWF0dXJlPE11bHRpUG9seWdvbj59IGEgbXVsdGlwb2x5Z29uIGZlYXR1cmVcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBubyBjb29yZGluYXRlcyBhcmUgcGFzc2VkXG4gKiBAZXhhbXBsZVxuICogdmFyIG11bHRpUG9seSA9IHR1cmYubXVsdGlQb2x5Z29uKFtbW1swLDBdLFswLDEwXSxbMTAsMTBdLFsxMCwwXSxbMCwwXV1dXSk7XG4gKlxuICogLy89bXVsdGlQb2x5XG4gKlxuICovXG5tb2R1bGUuZXhwb3J0cy5tdWx0aVBvbHlnb24gPSBmdW5jdGlvbiAoY29vcmRpbmF0ZXMsIHByb3BlcnRpZXMpIHtcbiAgICBpZiAoIWNvb3JkaW5hdGVzKSB0aHJvdyBuZXcgRXJyb3IoJ05vIGNvb3JkaW5hdGVzIHBhc3NlZCcpO1xuXG4gICAgcmV0dXJuIGZlYXR1cmUoe1xuICAgICAgICB0eXBlOiAnTXVsdGlQb2x5Z29uJyxcbiAgICAgICAgY29vcmRpbmF0ZXM6IGNvb3JkaW5hdGVzXG4gICAgfSwgcHJvcGVydGllcyk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgRmVhdHVyZTxHZW9tZXRyeUNvbGxlY3Rpb24+fSBiYXNlZCBvbiBhXG4gKiBjb29yZGluYXRlIGFycmF5LiBQcm9wZXJ0aWVzIGNhbiBiZSBhZGRlZCBvcHRpb25hbGx5LlxuICpcbiAqIEBuYW1lIGdlb21ldHJ5Q29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheTx7R2VvbWV0cnl9Pn0gZ2VvbWV0cmllcyBhbiBhcnJheSBvZiBHZW9KU09OIEdlb21ldHJpZXNcbiAqIEBwYXJhbSB7T2JqZWN0PX0gcHJvcGVydGllcyBhbiBPYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzIHRvIGFkZCBhcyBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJucyB7RmVhdHVyZTxHZW9tZXRyeUNvbGxlY3Rpb24+fSBhIEdlb0pTT04gR2VvbWV0cnlDb2xsZWN0aW9uIEZlYXR1cmVcbiAqIEBleGFtcGxlXG4gKiB2YXIgcHQgPSB7XG4gKiAgICAgXCJ0eXBlXCI6IFwiUG9pbnRcIixcbiAqICAgICAgIFwiY29vcmRpbmF0ZXNcIjogWzEwMCwgMF1cbiAqICAgICB9O1xuICogdmFyIGxpbmUgPSB7XG4gKiAgICAgXCJ0eXBlXCI6IFwiTGluZVN0cmluZ1wiLFxuICogICAgIFwiY29vcmRpbmF0ZXNcIjogWyBbMTAxLCAwXSwgWzEwMiwgMV0gXVxuICogICB9O1xuICogdmFyIGNvbGxlY3Rpb24gPSB0dXJmLmdlb21ldHJ5Q29sbGVjdGlvbihbcHQsIGxpbmVdKTtcbiAqXG4gKiAvLz1jb2xsZWN0aW9uXG4gKi9cbm1vZHVsZS5leHBvcnRzLmdlb21ldHJ5Q29sbGVjdGlvbiA9IGZ1bmN0aW9uIChnZW9tZXRyaWVzLCBwcm9wZXJ0aWVzKSB7XG4gICAgaWYgKCFnZW9tZXRyaWVzKSB0aHJvdyBuZXcgRXJyb3IoJ05vIGdlb21ldHJpZXMgcGFzc2VkJyk7XG5cbiAgICByZXR1cm4gZmVhdHVyZSh7XG4gICAgICAgIHR5cGU6ICdHZW9tZXRyeUNvbGxlY3Rpb24nLFxuICAgICAgICBnZW9tZXRyaWVzOiBnZW9tZXRyaWVzXG4gICAgfSwgcHJvcGVydGllcyk7XG59O1xuXG52YXIgZmFjdG9ycyA9IHtcbiAgICBtaWxlczogMzk2MCxcbiAgICBuYXV0aWNhbG1pbGVzOiAzNDQxLjE0NSxcbiAgICBkZWdyZWVzOiA1Ny4yOTU3Nzk1LFxuICAgIHJhZGlhbnM6IDEsXG4gICAgaW5jaGVzOiAyNTA5MDU2MDAsXG4gICAgeWFyZHM6IDY5Njk2MDAsXG4gICAgbWV0ZXJzOiA2MzczMDAwLFxuICAgIG1ldHJlczogNjM3MzAwMCxcbiAgICBraWxvbWV0ZXJzOiA2MzczLFxuICAgIGtpbG9tZXRyZXM6IDYzNzMsXG4gICAgZmVldDogMjA5MDg3OTIuNjVcbn07XG5cbi8qXG4gKiBDb252ZXJ0IGEgZGlzdGFuY2UgbWVhc3VyZW1lbnQgZnJvbSByYWRpYW5zIHRvIGEgbW9yZSBmcmllbmRseSB1bml0LlxuICpcbiAqIEBuYW1lIHJhZGlhbnNUb0Rpc3RhbmNlXG4gKiBAcGFyYW0ge251bWJlcn0gZGlzdGFuY2UgaW4gcmFkaWFucyBhY3Jvc3MgdGhlIHNwaGVyZVxuICogQHBhcmFtIHtzdHJpbmd9IFt1bml0cz1raWxvbWV0ZXJzXSBjYW4gYmUgZGVncmVlcywgcmFkaWFucywgbWlsZXMsIG9yIGtpbG9tZXRlcnNcbiAqIGluY2hlcywgeWFyZHMsIG1ldHJlcywgbWV0ZXJzLCBraWxvbWV0cmVzLCBraWxvbWV0ZXJzLlxuICogQHJldHVybnMge251bWJlcn0gZGlzdGFuY2VcbiAqL1xubW9kdWxlLmV4cG9ydHMucmFkaWFuc1RvRGlzdGFuY2UgPSBmdW5jdGlvbiAocmFkaWFucywgdW5pdHMpIHtcbiAgICB2YXIgZmFjdG9yID0gZmFjdG9yc1t1bml0cyB8fCAna2lsb21ldGVycyddO1xuICAgIGlmIChmYWN0b3IgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVuaXQnKTtcblxuICAgIHJldHVybiByYWRpYW5zICogZmFjdG9yO1xufTtcblxuLypcbiAqIENvbnZlcnQgYSBkaXN0YW5jZSBtZWFzdXJlbWVudCBmcm9tIGEgcmVhbC13b3JsZCB1bml0IGludG8gcmFkaWFuc1xuICpcbiAqIEBuYW1lIGRpc3RhbmNlVG9SYWRpYW5zXG4gKiBAcGFyYW0ge251bWJlcn0gZGlzdGFuY2UgaW4gcmVhbCB1bml0c1xuICogQHBhcmFtIHtzdHJpbmd9IFt1bml0cz1raWxvbWV0ZXJzXSBjYW4gYmUgZGVncmVlcywgcmFkaWFucywgbWlsZXMsIG9yIGtpbG9tZXRlcnNcbiAqIGluY2hlcywgeWFyZHMsIG1ldHJlcywgbWV0ZXJzLCBraWxvbWV0cmVzLCBraWxvbWV0ZXJzLlxuICogQHJldHVybnMge251bWJlcn0gcmFkaWFuc1xuICovXG5tb2R1bGUuZXhwb3J0cy5kaXN0YW5jZVRvUmFkaWFucyA9IGZ1bmN0aW9uIChkaXN0YW5jZSwgdW5pdHMpIHtcbiAgICB2YXIgZmFjdG9yID0gZmFjdG9yc1t1bml0cyB8fCAna2lsb21ldGVycyddO1xuICAgIGlmIChmYWN0b3IgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVuaXQnKTtcblxuICAgIHJldHVybiBkaXN0YW5jZSAvIGZhY3Rvcjtcbn07XG5cbi8qXG4gKiBDb252ZXJ0IGEgZGlzdGFuY2UgbWVhc3VyZW1lbnQgZnJvbSBhIHJlYWwtd29ybGQgdW5pdCBpbnRvIGRlZ3JlZXNcbiAqXG4gKiBAbmFtZSBkaXN0YW5jZVRvUmFkaWFuc1xuICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlIGluIHJlYWwgdW5pdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdW5pdHM9a2lsb21ldGVyc10gY2FuIGJlIGRlZ3JlZXMsIHJhZGlhbnMsIG1pbGVzLCBvciBraWxvbWV0ZXJzXG4gKiBpbmNoZXMsIHlhcmRzLCBtZXRyZXMsIG1ldGVycywga2lsb21ldHJlcywga2lsb21ldGVycy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IGRlZ3JlZXNcbiAqL1xubW9kdWxlLmV4cG9ydHMuZGlzdGFuY2VUb0RlZ3JlZXMgPSBmdW5jdGlvbiAoZGlzdGFuY2UsIHVuaXRzKSB7XG4gICAgdmFyIGZhY3RvciA9IGZhY3RvcnNbdW5pdHMgfHwgJ2tpbG9tZXRlcnMnXTtcbiAgICBpZiAoZmFjdG9yID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1bml0Jyk7XG5cbiAgICByZXR1cm4gKGRpc3RhbmNlIC8gZmFjdG9yKSAqIDU3LjI5NTg7XG59O1xuIiwiLyoqXG4gKiBDYWxsYmFjayBmb3IgY29vcmRFYWNoXG4gKlxuICogQHByaXZhdGVcbiAqIEBjYWxsYmFjayBjb29yZEVhY2hDYWxsYmFja1xuICogQHBhcmFtIHtbbnVtYmVyLCBudW1iZXJdfSBjdXJyZW50Q29vcmRzIFRoZSBjdXJyZW50IGNvb3JkaW5hdGVzIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50SW5kZXggVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgYmVpbmcgcHJvY2Vzc2VkIGluIHRoZVxuICogYXJyYXkuU3RhcnRzIGF0IGluZGV4IDAsIGlmIGFuIGluaXRpYWxWYWx1ZSBpcyBwcm92aWRlZCwgYW5kIGF0IGluZGV4IDEgb3RoZXJ3aXNlLlxuICovXG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIGNvb3JkaW5hdGVzIGluIGFueSBHZW9KU09OIG9iamVjdCwgc2ltaWxhciB0byBBcnJheS5mb3JFYWNoKClcbiAqXG4gKiBAbmFtZSBjb29yZEVhY2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBsYXllciBhbnkgR2VvSlNPTiBvYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGEgbWV0aG9kIHRoYXQgdGFrZXMgKGN1cnJlbnRDb29yZHMsIGN1cnJlbnRJbmRleClcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2V4Y2x1ZGVXcmFwQ29vcmQ9ZmFsc2VdIHdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGVcbiAqIHRoZSBmaW5hbCBjb29yZGluYXRlIG9mIExpbmVhclJpbmdzIHRoYXQgd3JhcHMgdGhlIHJpbmcgaW4gaXRzIGl0ZXJhdGlvbi5cbiAqIEBleGFtcGxlXG4gKiB2YXIgZmVhdHVyZXMgPSB7XG4gKiAgIFwidHlwZVwiOiBcIkZlYXR1cmVDb2xsZWN0aW9uXCIsXG4gKiAgIFwiZmVhdHVyZXNcIjogW1xuICogICAgIHtcbiAqICAgICAgIFwidHlwZVwiOiBcIkZlYXR1cmVcIixcbiAqICAgICAgIFwicHJvcGVydGllc1wiOiB7fSxcbiAqICAgICAgIFwiZ2VvbWV0cnlcIjoge1xuICogICAgICAgICBcInR5cGVcIjogXCJQb2ludFwiLFxuICogICAgICAgICBcImNvb3JkaW5hdGVzXCI6IFsyNiwgMzddXG4gKiAgICAgICB9XG4gKiAgICAgfSxcbiAqICAgICB7XG4gKiAgICAgICBcInR5cGVcIjogXCJGZWF0dXJlXCIsXG4gKiAgICAgICBcInByb3BlcnRpZXNcIjoge30sXG4gKiAgICAgICBcImdlb21ldHJ5XCI6IHtcbiAqICAgICAgICAgXCJ0eXBlXCI6IFwiUG9pbnRcIixcbiAqICAgICAgICAgXCJjb29yZGluYXRlc1wiOiBbMzYsIDUzXVxuICogICAgICAgfVxuICogICAgIH1cbiAqICAgXVxuICogfTtcbiAqIHR1cmYuY29vcmRFYWNoKGZlYXR1cmVzLCBmdW5jdGlvbiAoY3VycmVudENvb3JkcywgY3VycmVudEluZGV4KSB7XG4gKiAgIC8vPWN1cnJlbnRDb29yZHNcbiAqICAgLy89Y3VycmVudEluZGV4XG4gKiB9KTtcbiAqL1xuZnVuY3Rpb24gY29vcmRFYWNoKGxheWVyLCBjYWxsYmFjaywgZXhjbHVkZVdyYXBDb29yZCkge1xuICAgIHZhciBpLCBqLCBrLCBnLCBsLCBnZW9tZXRyeSwgc3RvcEcsIGNvb3JkcyxcbiAgICAgICAgZ2VvbWV0cnlNYXliZUNvbGxlY3Rpb24sXG4gICAgICAgIHdyYXBTaHJpbmsgPSAwLFxuICAgICAgICBjdXJyZW50SW5kZXggPSAwLFxuICAgICAgICBpc0dlb21ldHJ5Q29sbGVjdGlvbixcbiAgICAgICAgaXNGZWF0dXJlQ29sbGVjdGlvbiA9IGxheWVyLnR5cGUgPT09ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgIGlzRmVhdHVyZSA9IGxheWVyLnR5cGUgPT09ICdGZWF0dXJlJyxcbiAgICAgICAgc3RvcCA9IGlzRmVhdHVyZUNvbGxlY3Rpb24gPyBsYXllci5mZWF0dXJlcy5sZW5ndGggOiAxO1xuXG4gIC8vIFRoaXMgbG9naWMgbWF5IGxvb2sgYSBsaXR0bGUgd2VpcmQuIFRoZSByZWFzb24gd2h5IGl0IGlzIHRoYXQgd2F5XG4gIC8vIGlzIGJlY2F1c2UgaXQncyB0cnlpbmcgdG8gYmUgZmFzdC4gR2VvSlNPTiBzdXBwb3J0cyBtdWx0aXBsZSBraW5kc1xuICAvLyBvZiBvYmplY3RzIGF0IGl0cyByb290OiBGZWF0dXJlQ29sbGVjdGlvbiwgRmVhdHVyZXMsIEdlb21ldHJpZXMuXG4gIC8vIFRoaXMgZnVuY3Rpb24gaGFzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBoYW5kbGluZyBhbGwgb2YgdGhlbSwgYW5kIHRoYXRcbiAgLy8gbWVhbnMgdGhhdCBzb21lIG9mIHRoZSBgZm9yYCBsb29wcyB5b3Ugc2VlIGJlbG93IGFjdHVhbGx5IGp1c3QgZG9uJ3QgYXBwbHlcbiAgLy8gdG8gY2VydGFpbiBpbnB1dHMuIEZvciBpbnN0YW5jZSwgaWYgeW91IGdpdmUgdGhpcyBqdXN0IGFcbiAgLy8gUG9pbnQgZ2VvbWV0cnksIHRoZW4gYm90aCBsb29wcyBhcmUgc2hvcnQtY2lyY3VpdGVkIGFuZCBhbGwgd2UgZG9cbiAgLy8gaXMgZ3JhZHVhbGx5IHJlbmFtZSB0aGUgaW5wdXQgdW50aWwgaXQncyBjYWxsZWQgJ2dlb21ldHJ5Jy5cbiAgLy9cbiAgLy8gVGhpcyBhbHNvIGFpbXMgdG8gYWxsb2NhdGUgYXMgZmV3IHJlc291cmNlcyBhcyBwb3NzaWJsZToganVzdCBhXG4gIC8vIGZldyBudW1iZXJzIGFuZCBib29sZWFucywgcmF0aGVyIHRoYW4gYW55IHRlbXBvcmFyeSBhcnJheXMgYXMgd291bGRcbiAgLy8gYmUgcmVxdWlyZWQgd2l0aCB0aGUgbm9ybWFsaXphdGlvbiBhcHByb2FjaC5cbiAgICBmb3IgKGkgPSAwOyBpIDwgc3RvcDsgaSsrKSB7XG5cbiAgICAgICAgZ2VvbWV0cnlNYXliZUNvbGxlY3Rpb24gPSAoaXNGZWF0dXJlQ29sbGVjdGlvbiA/IGxheWVyLmZlYXR1cmVzW2ldLmdlb21ldHJ5IDpcbiAgICAgICAgKGlzRmVhdHVyZSA/IGxheWVyLmdlb21ldHJ5IDogbGF5ZXIpKTtcbiAgICAgICAgaXNHZW9tZXRyeUNvbGxlY3Rpb24gPSBnZW9tZXRyeU1heWJlQ29sbGVjdGlvbi50eXBlID09PSAnR2VvbWV0cnlDb2xsZWN0aW9uJztcbiAgICAgICAgc3RvcEcgPSBpc0dlb21ldHJ5Q29sbGVjdGlvbiA/IGdlb21ldHJ5TWF5YmVDb2xsZWN0aW9uLmdlb21ldHJpZXMubGVuZ3RoIDogMTtcblxuICAgICAgICBmb3IgKGcgPSAwOyBnIDwgc3RvcEc7IGcrKykge1xuICAgICAgICAgICAgZ2VvbWV0cnkgPSBpc0dlb21ldHJ5Q29sbGVjdGlvbiA/XG4gICAgICAgICAgICBnZW9tZXRyeU1heWJlQ29sbGVjdGlvbi5nZW9tZXRyaWVzW2ddIDogZ2VvbWV0cnlNYXliZUNvbGxlY3Rpb247XG4gICAgICAgICAgICBjb29yZHMgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcblxuICAgICAgICAgICAgd3JhcFNocmluayA9IChleGNsdWRlV3JhcENvb3JkICYmXG4gICAgICAgICAgICAgICAgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJyB8fCBnZW9tZXRyeS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykpID9cbiAgICAgICAgICAgICAgICAxIDogMDtcblxuICAgICAgICAgICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhjb29yZHMsIGN1cnJlbnRJbmRleCk7XG4gICAgICAgICAgICAgICAgY3VycmVudEluZGV4Kys7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdMaW5lU3RyaW5nJyB8fCBnZW9tZXRyeS50eXBlID09PSAnTXVsdGlQb2ludCcpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29vcmRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGNvb3Jkc1tqXSwgY3VycmVudEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnUG9seWdvbicgfHwgZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29vcmRzLmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgY29vcmRzW2pdLmxlbmd0aCAtIHdyYXBTaHJpbms7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soY29vcmRzW2pdW2tdLCBjdXJyZW50SW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29vcmRzLmxlbmd0aDsgaisrKVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgY29vcmRzW2pdLmxlbmd0aDsgaysrKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsID0gMDsgbCA8IGNvb3Jkc1tqXVtrXS5sZW5ndGggLSB3cmFwU2hyaW5rOyBsKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhjb29yZHNbal1ba11bbF0sIGN1cnJlbnRJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdHZW9tZXRyeUNvbGxlY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGdlb21ldHJ5Lmdlb21ldHJpZXMubGVuZ3RoOyBqKyspXG4gICAgICAgICAgICAgICAgICAgIGNvb3JkRWFjaChnZW9tZXRyeS5nZW9tZXRyaWVzW2pdLCBjYWxsYmFjaywgZXhjbHVkZVdyYXBDb29yZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBHZW9tZXRyeSBUeXBlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5tb2R1bGUuZXhwb3J0cy5jb29yZEVhY2ggPSBjb29yZEVhY2g7XG5cbi8qKlxuICogQ2FsbGJhY2sgZm9yIGNvb3JkUmVkdWNlXG4gKlxuICogVGhlIGZpcnN0IHRpbWUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIHZhbHVlcyBwcm92aWRlZCBhcyBhcmd1bWVudHMgZGVwZW5kXG4gKiBvbiB3aGV0aGVyIHRoZSByZWR1Y2UgbWV0aG9kIGhhcyBhbiBpbml0aWFsVmFsdWUgYXJndW1lbnQuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIHByb3ZpZGVkIHRvIHRoZSByZWR1Y2UgbWV0aG9kOlxuICogIC0gVGhlIHByZXZpb3VzVmFsdWUgYXJndW1lbnQgaXMgaW5pdGlhbFZhbHVlLlxuICogIC0gVGhlIGN1cnJlbnRWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIG5vdCBwcm92aWRlZDpcbiAqICAtIFRoZSBwcmV2aW91c1ZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqICAtIFRoZSBjdXJyZW50VmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhbGxiYWNrIGNvb3JkUmVkdWNlQ2FsbGJhY2tcbiAqIEBwYXJhbSB7Kn0gcHJldmlvdXNWYWx1ZSBUaGUgYWNjdW11bGF0ZWQgdmFsdWUgcHJldmlvdXNseSByZXR1cm5lZCBpbiB0aGUgbGFzdCBpbnZvY2F0aW9uXG4gKiBvZiB0aGUgY2FsbGJhY2ssIG9yIGluaXRpYWxWYWx1ZSwgaWYgc3VwcGxpZWQuXG4gKiBAcGFyYW0ge1tudW1iZXIsIG51bWJlcl19IGN1cnJlbnRDb29yZHMgVGhlIGN1cnJlbnQgY29vcmRpbmF0ZSBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gY3VycmVudEluZGV4IFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBlbGVtZW50IGJlaW5nIHByb2Nlc3NlZCBpbiB0aGVcbiAqIGFycmF5LlN0YXJ0cyBhdCBpbmRleCAwLCBpZiBhbiBpbml0aWFsVmFsdWUgaXMgcHJvdmlkZWQsIGFuZCBhdCBpbmRleCAxIG90aGVyd2lzZS5cbiAqL1xuXG4vKipcbiAqIFJlZHVjZSBjb29yZGluYXRlcyBpbiBhbnkgR2VvSlNPTiBvYmplY3QsIHNpbWlsYXIgdG8gQXJyYXkucmVkdWNlKClcbiAqXG4gKiBAbmFtZSBjb29yZFJlZHVjZVxuICogQHBhcmFtIHtPYmplY3R9IGxheWVyIGFueSBHZW9KU09OIG9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAocHJldmlvdXNWYWx1ZSwgY3VycmVudENvb3JkcywgY3VycmVudEluZGV4KVxuICogQHBhcmFtIHsqfSBbaW5pdGlhbFZhbHVlXSBWYWx1ZSB0byB1c2UgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBmaXJzdCBjYWxsIG9mIHRoZSBjYWxsYmFjay5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2V4Y2x1ZGVXcmFwQ29vcmQ9ZmFsc2VdIHdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGVcbiAqIHRoZSBmaW5hbCBjb29yZGluYXRlIG9mIExpbmVhclJpbmdzIHRoYXQgd3JhcHMgdGhlIHJpbmcgaW4gaXRzIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHsqfSBUaGUgdmFsdWUgdGhhdCByZXN1bHRzIGZyb20gdGhlIHJlZHVjdGlvbi5cbiAqIEBleGFtcGxlXG4gKiB2YXIgZmVhdHVyZXMgPSB7XG4gKiAgIFwidHlwZVwiOiBcIkZlYXR1cmVDb2xsZWN0aW9uXCIsXG4gKiAgIFwiZmVhdHVyZXNcIjogW1xuICogICAgIHtcbiAqICAgICAgIFwidHlwZVwiOiBcIkZlYXR1cmVcIixcbiAqICAgICAgIFwicHJvcGVydGllc1wiOiB7fSxcbiAqICAgICAgIFwiZ2VvbWV0cnlcIjoge1xuICogICAgICAgICBcInR5cGVcIjogXCJQb2ludFwiLFxuICogICAgICAgICBcImNvb3JkaW5hdGVzXCI6IFsyNiwgMzddXG4gKiAgICAgICB9XG4gKiAgICAgfSxcbiAqICAgICB7XG4gKiAgICAgICBcInR5cGVcIjogXCJGZWF0dXJlXCIsXG4gKiAgICAgICBcInByb3BlcnRpZXNcIjoge30sXG4gKiAgICAgICBcImdlb21ldHJ5XCI6IHtcbiAqICAgICAgICAgXCJ0eXBlXCI6IFwiUG9pbnRcIixcbiAqICAgICAgICAgXCJjb29yZGluYXRlc1wiOiBbMzYsIDUzXVxuICogICAgICAgfVxuICogICAgIH1cbiAqICAgXVxuICogfTtcbiAqIHR1cmYuY29vcmRSZWR1Y2UoZmVhdHVyZXMsIGZ1bmN0aW9uIChwcmV2aW91c1ZhbHVlLCBjdXJyZW50Q29vcmRzLCBjdXJyZW50SW5kZXgpIHtcbiAqICAgLy89cHJldmlvdXNWYWx1ZVxuICogICAvLz1jdXJyZW50Q29vcmRzXG4gKiAgIC8vPWN1cnJlbnRJbmRleFxuICogICByZXR1cm4gY3VycmVudENvb3JkcztcbiAqIH0pO1xuICovXG5mdW5jdGlvbiBjb29yZFJlZHVjZShsYXllciwgY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSwgZXhjbHVkZVdyYXBDb29yZCkge1xuICAgIHZhciBwcmV2aW91c1ZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgIGNvb3JkRWFjaChsYXllciwgZnVuY3Rpb24gKGN1cnJlbnRDb29yZHMsIGN1cnJlbnRJbmRleCkge1xuICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSAwICYmIGluaXRpYWxWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwcmV2aW91c1ZhbHVlID0gY3VycmVudENvb3JkcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByZXZpb3VzVmFsdWUgPSBjYWxsYmFjayhwcmV2aW91c1ZhbHVlLCBjdXJyZW50Q29vcmRzLCBjdXJyZW50SW5kZXgpO1xuICAgICAgICB9XG4gICAgfSwgZXhjbHVkZVdyYXBDb29yZCk7XG4gICAgcmV0dXJuIHByZXZpb3VzVmFsdWU7XG59XG5tb2R1bGUuZXhwb3J0cy5jb29yZFJlZHVjZSA9IGNvb3JkUmVkdWNlO1xuXG4vKipcbiAqIENhbGxiYWNrIGZvciBwcm9wRWFjaFxuICpcbiAqIEBwcml2YXRlXG4gKiBAY2FsbGJhY2sgcHJvcEVhY2hDYWxsYmFja1xuICogQHBhcmFtIHsqfSBjdXJyZW50UHJvcGVydGllcyBUaGUgY3VycmVudCBwcm9wZXJ0aWVzIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50SW5kZXggVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgYmVpbmcgcHJvY2Vzc2VkIGluIHRoZVxuICogYXJyYXkuU3RhcnRzIGF0IGluZGV4IDAsIGlmIGFuIGluaXRpYWxWYWx1ZSBpcyBwcm92aWRlZCwgYW5kIGF0IGluZGV4IDEgb3RoZXJ3aXNlLlxuICovXG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIHByb3BlcnRpZXMgaW4gYW55IEdlb0pTT04gb2JqZWN0LCBzaW1pbGFyIHRvIEFycmF5LmZvckVhY2goKVxuICpcbiAqIEBuYW1lIHByb3BFYWNoXG4gKiBAcGFyYW0ge09iamVjdH0gbGF5ZXIgYW55IEdlb0pTT04gb2JqZWN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBhIG1ldGhvZCB0aGF0IHRha2VzIChjdXJyZW50UHJvcGVydGllcywgY3VycmVudEluZGV4KVxuICogQGV4YW1wbGVcbiAqIHZhciBmZWF0dXJlcyA9IHtcbiAqICAgXCJ0eXBlXCI6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIixcbiAqICAgXCJmZWF0dXJlc1wiOiBbXG4gKiAgICAge1xuICogICAgICAgXCJ0eXBlXCI6IFwiRmVhdHVyZVwiLFxuICogICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcImZvb1wiOiBcImJhclwifSxcbiAqICAgICAgIFwiZ2VvbWV0cnlcIjoge1xuICogICAgICAgICBcInR5cGVcIjogXCJQb2ludFwiLFxuICogICAgICAgICBcImNvb3JkaW5hdGVzXCI6IFsyNiwgMzddXG4gKiAgICAgICB9XG4gKiAgICAgfSxcbiAqICAgICB7XG4gKiAgICAgICBcInR5cGVcIjogXCJGZWF0dXJlXCIsXG4gKiAgICAgICBcInByb3BlcnRpZXNcIjoge1wiaGVsbG9cIjogXCJ3b3JsZFwifSxcbiAqICAgICAgIFwiZ2VvbWV0cnlcIjoge1xuICogICAgICAgICBcInR5cGVcIjogXCJQb2ludFwiLFxuICogICAgICAgICBcImNvb3JkaW5hdGVzXCI6IFszNiwgNTNdXG4gKiAgICAgICB9XG4gKiAgICAgfVxuICogICBdXG4gKiB9O1xuICogdHVyZi5wcm9wRWFjaChmZWF0dXJlcywgZnVuY3Rpb24gKGN1cnJlbnRQcm9wZXJ0aWVzLCBjdXJyZW50SW5kZXgpIHtcbiAqICAgLy89Y3VycmVudFByb3BlcnRpZXNcbiAqICAgLy89Y3VycmVudEluZGV4XG4gKiB9KTtcbiAqL1xuZnVuY3Rpb24gcHJvcEVhY2gobGF5ZXIsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGk7XG4gICAgc3dpdGNoIChsYXllci50eXBlKSB7XG4gICAgY2FzZSAnRmVhdHVyZUNvbGxlY3Rpb24nOlxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGF5ZXIuZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGxheWVyLmZlYXR1cmVzW2ldLnByb3BlcnRpZXMsIGkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0ZlYXR1cmUnOlxuICAgICAgICBjYWxsYmFjayhsYXllci5wcm9wZXJ0aWVzLCAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxufVxubW9kdWxlLmV4cG9ydHMucHJvcEVhY2ggPSBwcm9wRWFjaDtcblxuXG4vKipcbiAqIENhbGxiYWNrIGZvciBwcm9wUmVkdWNlXG4gKlxuICogVGhlIGZpcnN0IHRpbWUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIHZhbHVlcyBwcm92aWRlZCBhcyBhcmd1bWVudHMgZGVwZW5kXG4gKiBvbiB3aGV0aGVyIHRoZSByZWR1Y2UgbWV0aG9kIGhhcyBhbiBpbml0aWFsVmFsdWUgYXJndW1lbnQuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIHByb3ZpZGVkIHRvIHRoZSByZWR1Y2UgbWV0aG9kOlxuICogIC0gVGhlIHByZXZpb3VzVmFsdWUgYXJndW1lbnQgaXMgaW5pdGlhbFZhbHVlLlxuICogIC0gVGhlIGN1cnJlbnRWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIG5vdCBwcm92aWRlZDpcbiAqICAtIFRoZSBwcmV2aW91c1ZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqICAtIFRoZSBjdXJyZW50VmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhbGxiYWNrIHByb3BSZWR1Y2VDYWxsYmFja1xuICogQHBhcmFtIHsqfSBwcmV2aW91c1ZhbHVlIFRoZSBhY2N1bXVsYXRlZCB2YWx1ZSBwcmV2aW91c2x5IHJldHVybmVkIGluIHRoZSBsYXN0IGludm9jYXRpb25cbiAqIG9mIHRoZSBjYWxsYmFjaywgb3IgaW5pdGlhbFZhbHVlLCBpZiBzdXBwbGllZC5cbiAqIEBwYXJhbSB7Kn0gY3VycmVudFByb3BlcnRpZXMgVGhlIGN1cnJlbnQgcHJvcGVydGllcyBiZWluZyBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gY3VycmVudEluZGV4IFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBlbGVtZW50IGJlaW5nIHByb2Nlc3NlZCBpbiB0aGVcbiAqIGFycmF5LlN0YXJ0cyBhdCBpbmRleCAwLCBpZiBhbiBpbml0aWFsVmFsdWUgaXMgcHJvdmlkZWQsIGFuZCBhdCBpbmRleCAxIG90aGVyd2lzZS5cbiAqL1xuXG4vKipcbiAqIFJlZHVjZSBwcm9wZXJ0aWVzIGluIGFueSBHZW9KU09OIG9iamVjdCBpbnRvIGEgc2luZ2xlIHZhbHVlLFxuICogc2ltaWxhciB0byBob3cgQXJyYXkucmVkdWNlIHdvcmtzLiBIb3dldmVyLCBpbiB0aGlzIGNhc2Ugd2UgbGF6aWx5IHJ1blxuICogdGhlIHJlZHVjdGlvbiwgc28gYW4gYXJyYXkgb2YgYWxsIHByb3BlcnRpZXMgaXMgdW5uZWNlc3NhcnkuXG4gKlxuICogQG5hbWUgcHJvcFJlZHVjZVxuICogQHBhcmFtIHtPYmplY3R9IGxheWVyIGFueSBHZW9KU09OIG9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAocHJldmlvdXNWYWx1ZSwgY3VycmVudFByb3BlcnRpZXMsIGN1cnJlbnRJbmRleClcbiAqIEBwYXJhbSB7Kn0gW2luaXRpYWxWYWx1ZV0gVmFsdWUgdG8gdXNlIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgZmlyc3QgY2FsbCBvZiB0aGUgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHZhbHVlIHRoYXQgcmVzdWx0cyBmcm9tIHRoZSByZWR1Y3Rpb24uXG4gKiBAZXhhbXBsZVxuICogdmFyIGZlYXR1cmVzID0ge1xuICogICBcInR5cGVcIjogXCJGZWF0dXJlQ29sbGVjdGlvblwiLFxuICogICBcImZlYXR1cmVzXCI6IFtcbiAqICAgICB7XG4gKiAgICAgICBcInR5cGVcIjogXCJGZWF0dXJlXCIsXG4gKiAgICAgICBcInByb3BlcnRpZXNcIjoge1wiZm9vXCI6IFwiYmFyXCJ9LFxuICogICAgICAgXCJnZW9tZXRyeVwiOiB7XG4gKiAgICAgICAgIFwidHlwZVwiOiBcIlBvaW50XCIsXG4gKiAgICAgICAgIFwiY29vcmRpbmF0ZXNcIjogWzI2LCAzN11cbiAqICAgICAgIH1cbiAqICAgICB9LFxuICogICAgIHtcbiAqICAgICAgIFwidHlwZVwiOiBcIkZlYXR1cmVcIixcbiAqICAgICAgIFwicHJvcGVydGllc1wiOiB7XCJoZWxsb1wiOiBcIndvcmxkXCJ9LFxuICogICAgICAgXCJnZW9tZXRyeVwiOiB7XG4gKiAgICAgICAgIFwidHlwZVwiOiBcIlBvaW50XCIsXG4gKiAgICAgICAgIFwiY29vcmRpbmF0ZXNcIjogWzM2LCA1M11cbiAqICAgICAgIH1cbiAqICAgICB9XG4gKiAgIF1cbiAqIH07XG4gKiB0dXJmLnByb3BSZWR1Y2UoZmVhdHVyZXMsIGZ1bmN0aW9uIChwcmV2aW91c1ZhbHVlLCBjdXJyZW50UHJvcGVydGllcywgY3VycmVudEluZGV4KSB7XG4gKiAgIC8vPXByZXZpb3VzVmFsdWVcbiAqICAgLy89Y3VycmVudFByb3BlcnRpZXNcbiAqICAgLy89Y3VycmVudEluZGV4XG4gKiAgIHJldHVybiBjdXJyZW50UHJvcGVydGllc1xuICogfSk7XG4gKi9cbmZ1bmN0aW9uIHByb3BSZWR1Y2UobGF5ZXIsIGNhbGxiYWNrLCBpbml0aWFsVmFsdWUpIHtcbiAgICB2YXIgcHJldmlvdXNWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICBwcm9wRWFjaChsYXllciwgZnVuY3Rpb24gKGN1cnJlbnRQcm9wZXJ0aWVzLCBjdXJyZW50SW5kZXgpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gMCAmJiBpbml0aWFsVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcHJldmlvdXNWYWx1ZSA9IGN1cnJlbnRQcm9wZXJ0aWVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJldmlvdXNWYWx1ZSA9IGNhbGxiYWNrKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRQcm9wZXJ0aWVzLCBjdXJyZW50SW5kZXgpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHByZXZpb3VzVmFsdWU7XG59XG5tb2R1bGUuZXhwb3J0cy5wcm9wUmVkdWNlID0gcHJvcFJlZHVjZTtcblxuLyoqXG4gKiBDYWxsYmFjayBmb3IgZmVhdHVyZUVhY2hcbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhbGxiYWNrIGZlYXR1cmVFYWNoQ2FsbGJhY2tcbiAqIEBwYXJhbSB7RmVhdHVyZTxhbnk+fSBjdXJyZW50RmVhdHVyZSBUaGUgY3VycmVudCBmZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50SW5kZXggVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgYmVpbmcgcHJvY2Vzc2VkIGluIHRoZVxuICogYXJyYXkuU3RhcnRzIGF0IGluZGV4IDAsIGlmIGFuIGluaXRpYWxWYWx1ZSBpcyBwcm92aWRlZCwgYW5kIGF0IGluZGV4IDEgb3RoZXJ3aXNlLlxuICovXG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIGZlYXR1cmVzIGluIGFueSBHZW9KU09OIG9iamVjdCwgc2ltaWxhciB0b1xuICogQXJyYXkuZm9yRWFjaC5cbiAqXG4gKiBAbmFtZSBmZWF0dXJlRWFjaFxuICogQHBhcmFtIHtPYmplY3R9IGxheWVyIGFueSBHZW9KU09OIG9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgYSBtZXRob2QgdGhhdCB0YWtlcyAoY3VycmVudEZlYXR1cmUsIGN1cnJlbnRJbmRleClcbiAqIEBleGFtcGxlXG4gKiB2YXIgZmVhdHVyZXMgPSB7XG4gKiAgIFwidHlwZVwiOiBcIkZlYXR1cmVDb2xsZWN0aW9uXCIsXG4gKiAgIFwiZmVhdHVyZXNcIjogW1xuICogICAgIHtcbiAqICAgICAgIFwidHlwZVwiOiBcIkZlYXR1cmVcIixcbiAqICAgICAgIFwicHJvcGVydGllc1wiOiB7fSxcbiAqICAgICAgIFwiZ2VvbWV0cnlcIjoge1xuICogICAgICAgICBcInR5cGVcIjogXCJQb2ludFwiLFxuICogICAgICAgICBcImNvb3JkaW5hdGVzXCI6IFsyNiwgMzddXG4gKiAgICAgICB9XG4gKiAgICAgfSxcbiAqICAgICB7XG4gKiAgICAgICBcInR5cGVcIjogXCJGZWF0dXJlXCIsXG4gKiAgICAgICBcInByb3BlcnRpZXNcIjoge30sXG4gKiAgICAgICBcImdlb21ldHJ5XCI6IHtcbiAqICAgICAgICAgXCJ0eXBlXCI6IFwiUG9pbnRcIixcbiAqICAgICAgICAgXCJjb29yZGluYXRlc1wiOiBbMzYsIDUzXVxuICogICAgICAgfVxuICogICAgIH1cbiAqICAgXVxuICogfTtcbiAqIHR1cmYuZmVhdHVyZUVhY2goZmVhdHVyZXMsIGZ1bmN0aW9uIChjdXJyZW50RmVhdHVyZSwgY3VycmVudEluZGV4KSB7XG4gKiAgIC8vPWN1cnJlbnRGZWF0dXJlXG4gKiAgIC8vPWN1cnJlbnRJbmRleFxuICogfSk7XG4gKi9cbmZ1bmN0aW9uIGZlYXR1cmVFYWNoKGxheWVyLCBjYWxsYmFjaykge1xuICAgIGlmIChsYXllci50eXBlID09PSAnRmVhdHVyZScpIHtcbiAgICAgICAgY2FsbGJhY2sobGF5ZXIsIDApO1xuICAgIH0gZWxzZSBpZiAobGF5ZXIudHlwZSA9PT0gJ0ZlYXR1cmVDb2xsZWN0aW9uJykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxheWVyLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhsYXllci5mZWF0dXJlc1tpXSwgaSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5tb2R1bGUuZXhwb3J0cy5mZWF0dXJlRWFjaCA9IGZlYXR1cmVFYWNoO1xuXG4vKipcbiAqIENhbGxiYWNrIGZvciBmZWF0dXJlUmVkdWNlXG4gKlxuICogVGhlIGZpcnN0IHRpbWUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIHZhbHVlcyBwcm92aWRlZCBhcyBhcmd1bWVudHMgZGVwZW5kXG4gKiBvbiB3aGV0aGVyIHRoZSByZWR1Y2UgbWV0aG9kIGhhcyBhbiBpbml0aWFsVmFsdWUgYXJndW1lbnQuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIHByb3ZpZGVkIHRvIHRoZSByZWR1Y2UgbWV0aG9kOlxuICogIC0gVGhlIHByZXZpb3VzVmFsdWUgYXJndW1lbnQgaXMgaW5pdGlhbFZhbHVlLlxuICogIC0gVGhlIGN1cnJlbnRWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIG5vdCBwcm92aWRlZDpcbiAqICAtIFRoZSBwcmV2aW91c1ZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqICAtIFRoZSBjdXJyZW50VmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhbGxiYWNrIGZlYXR1cmVSZWR1Y2VDYWxsYmFja1xuICogQHBhcmFtIHsqfSBwcmV2aW91c1ZhbHVlIFRoZSBhY2N1bXVsYXRlZCB2YWx1ZSBwcmV2aW91c2x5IHJldHVybmVkIGluIHRoZSBsYXN0IGludm9jYXRpb25cbiAqIG9mIHRoZSBjYWxsYmFjaywgb3IgaW5pdGlhbFZhbHVlLCBpZiBzdXBwbGllZC5cbiAqIEBwYXJhbSB7RmVhdHVyZTxhbnk+fSBjdXJyZW50RmVhdHVyZSBUaGUgY3VycmVudCBGZWF0dXJlIGJlaW5nIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50SW5kZXggVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgYmVpbmcgcHJvY2Vzc2VkIGluIHRoZVxuICogYXJyYXkuU3RhcnRzIGF0IGluZGV4IDAsIGlmIGFuIGluaXRpYWxWYWx1ZSBpcyBwcm92aWRlZCwgYW5kIGF0IGluZGV4IDEgb3RoZXJ3aXNlLlxuICovXG5cbi8qKlxuICogUmVkdWNlIGZlYXR1cmVzIGluIGFueSBHZW9KU09OIG9iamVjdCwgc2ltaWxhciB0byBBcnJheS5yZWR1Y2UoKS5cbiAqXG4gKiBAbmFtZSBmZWF0dXJlUmVkdWNlXG4gKiBAcGFyYW0ge09iamVjdH0gbGF5ZXIgYW55IEdlb0pTT04gb2JqZWN0XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBhIG1ldGhvZCB0aGF0IHRha2VzIChwcmV2aW91c1ZhbHVlLCBjdXJyZW50RmVhdHVyZSwgY3VycmVudEluZGV4KVxuICogQHBhcmFtIHsqfSBbaW5pdGlhbFZhbHVlXSBWYWx1ZSB0byB1c2UgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBmaXJzdCBjYWxsIG9mIHRoZSBjYWxsYmFjay5cbiAqIEByZXR1cm5zIHsqfSBUaGUgdmFsdWUgdGhhdCByZXN1bHRzIGZyb20gdGhlIHJlZHVjdGlvbi5cbiAqIEBleGFtcGxlXG4gKiB2YXIgZmVhdHVyZXMgPSB7XG4gKiAgIFwidHlwZVwiOiBcIkZlYXR1cmVDb2xsZWN0aW9uXCIsXG4gKiAgIFwiZmVhdHVyZXNcIjogW1xuICogICAgIHtcbiAqICAgICAgIFwidHlwZVwiOiBcIkZlYXR1cmVcIixcbiAqICAgICAgIFwicHJvcGVydGllc1wiOiB7XCJmb29cIjogXCJiYXJcIn0sXG4gKiAgICAgICBcImdlb21ldHJ5XCI6IHtcbiAqICAgICAgICAgXCJ0eXBlXCI6IFwiUG9pbnRcIixcbiAqICAgICAgICAgXCJjb29yZGluYXRlc1wiOiBbMjYsIDM3XVxuICogICAgICAgfVxuICogICAgIH0sXG4gKiAgICAge1xuICogICAgICAgXCJ0eXBlXCI6IFwiRmVhdHVyZVwiLFxuICogICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcImhlbGxvXCI6IFwid29ybGRcIn0sXG4gKiAgICAgICBcImdlb21ldHJ5XCI6IHtcbiAqICAgICAgICAgXCJ0eXBlXCI6IFwiUG9pbnRcIixcbiAqICAgICAgICAgXCJjb29yZGluYXRlc1wiOiBbMzYsIDUzXVxuICogICAgICAgfVxuICogICAgIH1cbiAqICAgXVxuICogfTtcbiAqIHR1cmYuZmVhdHVyZVJlZHVjZShmZWF0dXJlcywgZnVuY3Rpb24gKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRGZWF0dXJlLCBjdXJyZW50SW5kZXgpIHtcbiAqICAgLy89cHJldmlvdXNWYWx1ZVxuICogICAvLz1jdXJyZW50RmVhdHVyZVxuICogICAvLz1jdXJyZW50SW5kZXhcbiAqICAgcmV0dXJuIGN1cnJlbnRGZWF0dXJlXG4gKiB9KTtcbiAqL1xuZnVuY3Rpb24gZmVhdHVyZVJlZHVjZShsYXllciwgY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSkge1xuICAgIHZhciBwcmV2aW91c1ZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgIGZlYXR1cmVFYWNoKGxheWVyLCBmdW5jdGlvbiAoY3VycmVudEZlYXR1cmUsIGN1cnJlbnRJbmRleCkge1xuICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSAwICYmIGluaXRpYWxWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwcmV2aW91c1ZhbHVlID0gY3VycmVudEZlYXR1cmU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcmV2aW91c1ZhbHVlID0gY2FsbGJhY2socHJldmlvdXNWYWx1ZSwgY3VycmVudEZlYXR1cmUsIGN1cnJlbnRJbmRleCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcHJldmlvdXNWYWx1ZTtcbn1cbm1vZHVsZS5leHBvcnRzLmZlYXR1cmVSZWR1Y2UgPSBmZWF0dXJlUmVkdWNlO1xuXG4vKipcbiAqIEdldCBhbGwgY29vcmRpbmF0ZXMgZnJvbSBhbnkgR2VvSlNPTiBvYmplY3QuXG4gKlxuICogQG5hbWUgY29vcmRBbGxcbiAqIEBwYXJhbSB7T2JqZWN0fSBsYXllciBhbnkgR2VvSlNPTiBvYmplY3RcbiAqIEByZXR1cm5zIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gY29vcmRpbmF0ZSBwb3NpdGlvbiBhcnJheVxuICogQGV4YW1wbGVcbiAqIHZhciBmZWF0dXJlcyA9IHtcbiAqICAgXCJ0eXBlXCI6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIixcbiAqICAgXCJmZWF0dXJlc1wiOiBbXG4gKiAgICAge1xuICogICAgICAgXCJ0eXBlXCI6IFwiRmVhdHVyZVwiLFxuICogICAgICAgXCJwcm9wZXJ0aWVzXCI6IHt9LFxuICogICAgICAgXCJnZW9tZXRyeVwiOiB7XG4gKiAgICAgICAgIFwidHlwZVwiOiBcIlBvaW50XCIsXG4gKiAgICAgICAgIFwiY29vcmRpbmF0ZXNcIjogWzI2LCAzN11cbiAqICAgICAgIH1cbiAqICAgICB9LFxuICogICAgIHtcbiAqICAgICAgIFwidHlwZVwiOiBcIkZlYXR1cmVcIixcbiAqICAgICAgIFwicHJvcGVydGllc1wiOiB7fSxcbiAqICAgICAgIFwiZ2VvbWV0cnlcIjoge1xuICogICAgICAgICBcInR5cGVcIjogXCJQb2ludFwiLFxuICogICAgICAgICBcImNvb3JkaW5hdGVzXCI6IFszNiwgNTNdXG4gKiAgICAgICB9XG4gKiAgICAgfVxuICogICBdXG4gKiB9O1xuICogdmFyIGNvb3JkcyA9IHR1cmYuY29vcmRBbGwoZmVhdHVyZXMpO1xuICogLy89Y29vcmRzXG4gKi9cbmZ1bmN0aW9uIGNvb3JkQWxsKGxheWVyKSB7XG4gICAgdmFyIGNvb3JkcyA9IFtdO1xuICAgIGNvb3JkRWFjaChsYXllciwgZnVuY3Rpb24gKGNvb3JkKSB7XG4gICAgICAgIGNvb3Jkcy5wdXNoKGNvb3JkKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY29vcmRzO1xufVxubW9kdWxlLmV4cG9ydHMuY29vcmRBbGwgPSBjb29yZEFsbDtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgZWFjaCBnZW9tZXRyeSBpbiBhbnkgR2VvSlNPTiBvYmplY3QsIHNpbWlsYXIgdG8gQXJyYXkuZm9yRWFjaCgpXG4gKlxuICogQG5hbWUgZ2VvbUVhY2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBsYXllciBhbnkgR2VvSlNPTiBvYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGEgbWV0aG9kIHRoYXQgdGFrZXMgKGN1cnJlbnRHZW9tZXRyeSwgY3VycmVudEluZGV4KVxuICogQGV4YW1wbGVcbiAqIHZhciBmZWF0dXJlcyA9IHtcbiAqICAgXCJ0eXBlXCI6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIixcbiAqICAgXCJmZWF0dXJlc1wiOiBbXG4gKiAgICAge1xuICogICAgICAgXCJ0eXBlXCI6IFwiRmVhdHVyZVwiLFxuICogICAgICAgXCJwcm9wZXJ0aWVzXCI6IHt9LFxuICogICAgICAgXCJnZW9tZXRyeVwiOiB7XG4gKiAgICAgICAgIFwidHlwZVwiOiBcIlBvaW50XCIsXG4gKiAgICAgICAgIFwiY29vcmRpbmF0ZXNcIjogWzI2LCAzN11cbiAqICAgICAgIH1cbiAqICAgICB9LFxuICogICAgIHtcbiAqICAgICAgIFwidHlwZVwiOiBcIkZlYXR1cmVcIixcbiAqICAgICAgIFwicHJvcGVydGllc1wiOiB7fSxcbiAqICAgICAgIFwiZ2VvbWV0cnlcIjoge1xuICogICAgICAgICBcInR5cGVcIjogXCJQb2ludFwiLFxuICogICAgICAgICBcImNvb3JkaW5hdGVzXCI6IFszNiwgNTNdXG4gKiAgICAgICB9XG4gKiAgICAgfVxuICogICBdXG4gKiB9O1xuICogdHVyZi5nZW9tRWFjaChmZWF0dXJlcywgZnVuY3Rpb24gKGN1cnJlbnRHZW9tZXRyeSwgY3VycmVudEluZGV4KSB7XG4gKiAgIC8vPWN1cnJlbnRHZW9tZXRyeVxuICogICAvLz1jdXJyZW50SW5kZXhcbiAqIH0pO1xuICovXG5mdW5jdGlvbiBnZW9tRWFjaChsYXllciwgY2FsbGJhY2spIHtcbiAgICB2YXIgaSwgaiwgZywgZ2VvbWV0cnksIHN0b3BHLFxuICAgICAgICBnZW9tZXRyeU1heWJlQ29sbGVjdGlvbixcbiAgICAgICAgaXNHZW9tZXRyeUNvbGxlY3Rpb24sXG4gICAgICAgIGN1cnJlbnRJbmRleCA9IDAsXG4gICAgICAgIGlzRmVhdHVyZUNvbGxlY3Rpb24gPSBsYXllci50eXBlID09PSAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgICBpc0ZlYXR1cmUgPSBsYXllci50eXBlID09PSAnRmVhdHVyZScsXG4gICAgICAgIHN0b3AgPSBpc0ZlYXR1cmVDb2xsZWN0aW9uID8gbGF5ZXIuZmVhdHVyZXMubGVuZ3RoIDogMTtcblxuICAvLyBUaGlzIGxvZ2ljIG1heSBsb29rIGEgbGl0dGxlIHdlaXJkLiBUaGUgcmVhc29uIHdoeSBpdCBpcyB0aGF0IHdheVxuICAvLyBpcyBiZWNhdXNlIGl0J3MgdHJ5aW5nIHRvIGJlIGZhc3QuIEdlb0pTT04gc3VwcG9ydHMgbXVsdGlwbGUga2luZHNcbiAgLy8gb2Ygb2JqZWN0cyBhdCBpdHMgcm9vdDogRmVhdHVyZUNvbGxlY3Rpb24sIEZlYXR1cmVzLCBHZW9tZXRyaWVzLlxuICAvLyBUaGlzIGZ1bmN0aW9uIGhhcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgaGFuZGxpbmcgYWxsIG9mIHRoZW0sIGFuZCB0aGF0XG4gIC8vIG1lYW5zIHRoYXQgc29tZSBvZiB0aGUgYGZvcmAgbG9vcHMgeW91IHNlZSBiZWxvdyBhY3R1YWxseSBqdXN0IGRvbid0IGFwcGx5XG4gIC8vIHRvIGNlcnRhaW4gaW5wdXRzLiBGb3IgaW5zdGFuY2UsIGlmIHlvdSBnaXZlIHRoaXMganVzdCBhXG4gIC8vIFBvaW50IGdlb21ldHJ5LCB0aGVuIGJvdGggbG9vcHMgYXJlIHNob3J0LWNpcmN1aXRlZCBhbmQgYWxsIHdlIGRvXG4gIC8vIGlzIGdyYWR1YWxseSByZW5hbWUgdGhlIGlucHV0IHVudGlsIGl0J3MgY2FsbGVkICdnZW9tZXRyeScuXG4gIC8vXG4gIC8vIFRoaXMgYWxzbyBhaW1zIHRvIGFsbG9jYXRlIGFzIGZldyByZXNvdXJjZXMgYXMgcG9zc2libGU6IGp1c3QgYVxuICAvLyBmZXcgbnVtYmVycyBhbmQgYm9vbGVhbnMsIHJhdGhlciB0aGFuIGFueSB0ZW1wb3JhcnkgYXJyYXlzIGFzIHdvdWxkXG4gIC8vIGJlIHJlcXVpcmVkIHdpdGggdGhlIG5vcm1hbGl6YXRpb24gYXBwcm9hY2guXG4gICAgZm9yIChpID0gMDsgaSA8IHN0b3A7IGkrKykge1xuXG4gICAgICAgIGdlb21ldHJ5TWF5YmVDb2xsZWN0aW9uID0gKGlzRmVhdHVyZUNvbGxlY3Rpb24gPyBsYXllci5mZWF0dXJlc1tpXS5nZW9tZXRyeSA6XG4gICAgICAgIChpc0ZlYXR1cmUgPyBsYXllci5nZW9tZXRyeSA6IGxheWVyKSk7XG4gICAgICAgIGlzR2VvbWV0cnlDb2xsZWN0aW9uID0gZ2VvbWV0cnlNYXliZUNvbGxlY3Rpb24udHlwZSA9PT0gJ0dlb21ldHJ5Q29sbGVjdGlvbic7XG4gICAgICAgIHN0b3BHID0gaXNHZW9tZXRyeUNvbGxlY3Rpb24gPyBnZW9tZXRyeU1heWJlQ29sbGVjdGlvbi5nZW9tZXRyaWVzLmxlbmd0aCA6IDE7XG5cbiAgICAgICAgZm9yIChnID0gMDsgZyA8IHN0b3BHOyBnKyspIHtcbiAgICAgICAgICAgIGdlb21ldHJ5ID0gaXNHZW9tZXRyeUNvbGxlY3Rpb24gP1xuICAgICAgICAgICAgZ2VvbWV0cnlNYXliZUNvbGxlY3Rpb24uZ2VvbWV0cmllc1tnXSA6IGdlb21ldHJ5TWF5YmVDb2xsZWN0aW9uO1xuXG4gICAgICAgICAgICBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ1BvaW50JyB8fFxuICAgICAgICAgICAgICAgIGdlb21ldHJ5LnR5cGUgPT09ICdMaW5lU3RyaW5nJyB8fFxuICAgICAgICAgICAgICAgIGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aVBvaW50JyB8fFxuICAgICAgICAgICAgICAgIGdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJyB8fFxuICAgICAgICAgICAgICAgIGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnIHx8XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhnZW9tZXRyeSwgY3VycmVudEluZGV4KTtcbiAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXgrKztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ0dlb21ldHJ5Q29sbGVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZ2VvbWV0cnkuZ2VvbWV0cmllcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhnZW9tZXRyeS5nZW9tZXRyaWVzW2pdLCBjdXJyZW50SW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBHZW9tZXRyeSBUeXBlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5tb2R1bGUuZXhwb3J0cy5nZW9tRWFjaCA9IGdlb21FYWNoO1xuXG4vKipcbiAqIENhbGxiYWNrIGZvciBnZW9tUmVkdWNlXG4gKlxuICogVGhlIGZpcnN0IHRpbWUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIHZhbHVlcyBwcm92aWRlZCBhcyBhcmd1bWVudHMgZGVwZW5kXG4gKiBvbiB3aGV0aGVyIHRoZSByZWR1Y2UgbWV0aG9kIGhhcyBhbiBpbml0aWFsVmFsdWUgYXJndW1lbnQuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIHByb3ZpZGVkIHRvIHRoZSByZWR1Y2UgbWV0aG9kOlxuICogIC0gVGhlIHByZXZpb3VzVmFsdWUgYXJndW1lbnQgaXMgaW5pdGlhbFZhbHVlLlxuICogIC0gVGhlIGN1cnJlbnRWYWx1ZSBhcmd1bWVudCBpcyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQgcHJlc2VudCBpbiB0aGUgYXJyYXkuXG4gKlxuICogSWYgYW4gaW5pdGlhbFZhbHVlIGlzIG5vdCBwcm92aWRlZDpcbiAqICAtIFRoZSBwcmV2aW91c1ZhbHVlIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqICAtIFRoZSBjdXJyZW50VmFsdWUgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBwcmVzZW50IGluIHRoZSBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNhbGxiYWNrIGdlb21SZWR1Y2VDYWxsYmFja1xuICogQHBhcmFtIHsqfSBwcmV2aW91c1ZhbHVlIFRoZSBhY2N1bXVsYXRlZCB2YWx1ZSBwcmV2aW91c2x5IHJldHVybmVkIGluIHRoZSBsYXN0IGludm9jYXRpb25cbiAqIG9mIHRoZSBjYWxsYmFjaywgb3IgaW5pdGlhbFZhbHVlLCBpZiBzdXBwbGllZC5cbiAqIEBwYXJhbSB7Kn0gY3VycmVudEdlb21ldHJ5IFRoZSBjdXJyZW50IEZlYXR1cmUgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IGN1cnJlbnRJbmRleCBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgZWxlbWVudCBiZWluZyBwcm9jZXNzZWQgaW4gdGhlXG4gKiBhcnJheS5TdGFydHMgYXQgaW5kZXggMCwgaWYgYW4gaW5pdGlhbFZhbHVlIGlzIHByb3ZpZGVkLCBhbmQgYXQgaW5kZXggMSBvdGhlcndpc2UuXG4gKi9cblxuLyoqXG4gKiBSZWR1Y2UgZ2VvbWV0cnkgaW4gYW55IEdlb0pTT04gb2JqZWN0LCBzaW1pbGFyIHRvIEFycmF5LnJlZHVjZSgpLlxuICpcbiAqIEBuYW1lIGdlb21SZWR1Y2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBsYXllciBhbnkgR2VvSlNPTiBvYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIGEgbWV0aG9kIHRoYXQgdGFrZXMgKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRHZW9tZXRyeSwgY3VycmVudEluZGV4KVxuICogQHBhcmFtIHsqfSBbaW5pdGlhbFZhbHVlXSBWYWx1ZSB0byB1c2UgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBmaXJzdCBjYWxsIG9mIHRoZSBjYWxsYmFjay5cbiAqIEByZXR1cm5zIHsqfSBUaGUgdmFsdWUgdGhhdCByZXN1bHRzIGZyb20gdGhlIHJlZHVjdGlvbi5cbiAqIEBleGFtcGxlXG4gKiB2YXIgZmVhdHVyZXMgPSB7XG4gKiAgIFwidHlwZVwiOiBcIkZlYXR1cmVDb2xsZWN0aW9uXCIsXG4gKiAgIFwiZmVhdHVyZXNcIjogW1xuICogICAgIHtcbiAqICAgICAgIFwidHlwZVwiOiBcIkZlYXR1cmVcIixcbiAqICAgICAgIFwicHJvcGVydGllc1wiOiB7XCJmb29cIjogXCJiYXJcIn0sXG4gKiAgICAgICBcImdlb21ldHJ5XCI6IHtcbiAqICAgICAgICAgXCJ0eXBlXCI6IFwiUG9pbnRcIixcbiAqICAgICAgICAgXCJjb29yZGluYXRlc1wiOiBbMjYsIDM3XVxuICogICAgICAgfVxuICogICAgIH0sXG4gKiAgICAge1xuICogICAgICAgXCJ0eXBlXCI6IFwiRmVhdHVyZVwiLFxuICogICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcImhlbGxvXCI6IFwid29ybGRcIn0sXG4gKiAgICAgICBcImdlb21ldHJ5XCI6IHtcbiAqICAgICAgICAgXCJ0eXBlXCI6IFwiUG9pbnRcIixcbiAqICAgICAgICAgXCJjb29yZGluYXRlc1wiOiBbMzYsIDUzXVxuICogICAgICAgfVxuICogICAgIH1cbiAqICAgXVxuICogfTtcbiAqIHR1cmYuZ2VvbVJlZHVjZShmZWF0dXJlcywgZnVuY3Rpb24gKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRHZW9tZXRyeSwgY3VycmVudEluZGV4KSB7XG4gKiAgIC8vPXByZXZpb3VzVmFsdWVcbiAqICAgLy89Y3VycmVudEdlb21ldHJ5XG4gKiAgIC8vPWN1cnJlbnRJbmRleFxuICogICByZXR1cm4gY3VycmVudEdlb21ldHJ5XG4gKiB9KTtcbiAqL1xuZnVuY3Rpb24gZ2VvbVJlZHVjZShsYXllciwgY2FsbGJhY2ssIGluaXRpYWxWYWx1ZSkge1xuICAgIHZhciBwcmV2aW91c1ZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgIGdlb21FYWNoKGxheWVyLCBmdW5jdGlvbiAoY3VycmVudEdlb21ldHJ5LCBjdXJyZW50SW5kZXgpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gMCAmJiBpbml0aWFsVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcHJldmlvdXNWYWx1ZSA9IGN1cnJlbnRHZW9tZXRyeTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByZXZpb3VzVmFsdWUgPSBjYWxsYmFjayhwcmV2aW91c1ZhbHVlLCBjdXJyZW50R2VvbWV0cnksIGN1cnJlbnRJbmRleCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcHJldmlvdXNWYWx1ZTtcbn1cbm1vZHVsZS5leHBvcnRzLmdlb21SZWR1Y2UgPSBnZW9tUmVkdWNlO1xuIiwidmFyIGVhY2ggPSByZXF1aXJlKCdAdHVyZi9tZXRhJykuY29vcmRFYWNoO1xuXG4vKipcbiAqIFRha2VzIGEgc2V0IG9mIGZlYXR1cmVzLCBjYWxjdWxhdGVzIHRoZSBiYm94IG9mIGFsbCBpbnB1dCBmZWF0dXJlcywgYW5kIHJldHVybnMgYSBib3VuZGluZyBib3guXG4gKlxuICogQG5hbWUgYmJveFxuICogQHBhcmFtIHsoRmVhdHVyZXxGZWF0dXJlQ29sbGVjdGlvbil9IGdlb2pzb24gaW5wdXQgZmVhdHVyZXNcbiAqIEByZXR1cm5zIHtBcnJheTxudW1iZXI+fSBiYm94IGV4dGVudCBpbiBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gb3JkZXJcbiAqIEBhZGRUb01hcCBmZWF0dXJlcywgYmJveFBvbHlnb25cbiAqIEBleGFtcGxlXG4gKiB2YXIgcHQxID0gdHVyZi5wb2ludChbMTE0LjE3NTMyOSwgMjIuMjUyNF0pXG4gKiB2YXIgcHQyID0gdHVyZi5wb2ludChbMTE0LjE3MDAwNywgMjIuMjY3OTY5XSlcbiAqIHZhciBwdDMgPSB0dXJmLnBvaW50KFsxMTQuMjAwNjQ5LCAyMi4yNzQ2NDFdKVxuICogdmFyIHB0NCA9IHR1cmYucG9pbnQoWzExNC4yMDA2NDksIDIyLjI3NDY0MV0pXG4gKiB2YXIgcHQ1ID0gdHVyZi5wb2ludChbMTE0LjE4Njc0NCwgMjIuMjY1NzQ1XSlcbiAqIHZhciBmZWF0dXJlcyA9IHR1cmYuZmVhdHVyZUNvbGxlY3Rpb24oW3B0MSwgcHQyLCBwdDMsIHB0NCwgcHQ1XSlcbiAqXG4gKiB2YXIgYmJveCA9IHR1cmYuYmJveChmZWF0dXJlcyk7XG4gKlxuICogdmFyIGJib3hQb2x5Z29uID0gdHVyZi5iYm94UG9seWdvbihiYm94KTtcbiAqXG4gKiAvLz1iYm94XG4gKlxuICogLy89YmJveFBvbHlnb25cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZ2VvanNvbikge1xuICAgIHZhciBiYm94ID0gW0luZmluaXR5LCBJbmZpbml0eSwgLUluZmluaXR5LCAtSW5maW5pdHldO1xuICAgIGVhY2goZ2VvanNvbiwgZnVuY3Rpb24gKGNvb3JkKSB7XG4gICAgICAgIGlmIChiYm94WzBdID4gY29vcmRbMF0pIGJib3hbMF0gPSBjb29yZFswXTtcbiAgICAgICAgaWYgKGJib3hbMV0gPiBjb29yZFsxXSkgYmJveFsxXSA9IGNvb3JkWzFdO1xuICAgICAgICBpZiAoYmJveFsyXSA8IGNvb3JkWzBdKSBiYm94WzJdID0gY29vcmRbMF07XG4gICAgICAgIGlmIChiYm94WzNdIDwgY29vcmRbMV0pIGJib3hbM10gPSBjb29yZFsxXTtcbiAgICB9KTtcbiAgICByZXR1cm4gYmJveDtcbn07XG4iLCJ2YXIgcG9seWdvbiA9IHJlcXVpcmUoJ0B0dXJmL2hlbHBlcnMnKS5wb2x5Z29uO1xuXG4vKipcbiAqIFRha2VzIGEgYmJveCBhbmQgcmV0dXJucyBhbiBlcXVpdmFsZW50IHtAbGluayBQb2x5Z29ufHBvbHlnb259LlxuICpcbiAqIEBuYW1lIGJib3hQb2x5Z29uXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGJib3ggZXh0ZW50IGluIFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSBvcmRlclxuICogQHJldHVybiB7RmVhdHVyZTxQb2x5Z29uPn0gYSBQb2x5Z29uIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBib3VuZGluZyBib3hcbiAqIEBhZGRUb01hcCBwb2x5XG4gKiBAZXhhbXBsZVxuICogdmFyIGJib3ggPSBbMCwgMCwgMTAsIDEwXTtcbiAqXG4gKiB2YXIgcG9seSA9IHR1cmYuYmJveFBvbHlnb24oYmJveCk7XG4gKlxuICogLy89cG9seVxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJib3gpIHtcbiAgICB2YXIgbG93TGVmdCA9IFtiYm94WzBdLCBiYm94WzFdXTtcbiAgICB2YXIgdG9wTGVmdCA9IFtiYm94WzBdLCBiYm94WzNdXTtcbiAgICB2YXIgdG9wUmlnaHQgPSBbYmJveFsyXSwgYmJveFszXV07XG4gICAgdmFyIGxvd1JpZ2h0ID0gW2Jib3hbMl0sIGJib3hbMV1dO1xuXG4gICAgcmV0dXJuIHBvbHlnb24oW1tcbiAgICAgICAgbG93TGVmdCxcbiAgICAgICAgbG93UmlnaHQsXG4gICAgICAgIHRvcFJpZ2h0LFxuICAgICAgICB0b3BMZWZ0LFxuICAgICAgICBsb3dMZWZ0XG4gICAgXV0pO1xufTtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOlxuXHR0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDpcblx0KGZhY3RvcnkoKGdsb2JhbC5hcmVhS2V5cyA9IGdsb2JhbC5hcmVhS2V5cyB8fCB7fSkpKTtcbn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JztcblxudmFyIGFyZWFLZXlzID0ge1wiYWVyb3dheVwiOntcInJ1bndheVwiOnRydWUsXCJ0YXhpd2F5XCI6dHJ1ZX0sXCJhbWVuaXR5XCI6e1wiYmVuY2hcIjp0cnVlfSxcImFyZWE6aGlnaHdheVwiOnt9LFwiYnVpbGRpbmdcIjp7fSxcImNhbXBfc2l0ZVwiOnt9LFwiY2x1YlwiOnt9LFwiY3JhZnRcIjp7fSxcImVtZXJnZW5jeVwiOntcImRlc2lnbmF0ZWRcIjp0cnVlLFwiZGVzdGluYXRpb25cIjp0cnVlLFwibm9cIjp0cnVlLFwib2ZmaWNpYWxcIjp0cnVlLFwicHJpdmF0ZVwiOnRydWUsXCJ5ZXNcIjp0cnVlfSxcImdvbGZcIjp7XCJob2xlXCI6dHJ1ZSxcImxhdGVyYWxfd2F0ZXJfaGF6YXJkXCI6dHJ1ZSxcIndhdGVyX2hhemFyZFwiOnRydWV9LFwiaGVhbHRoY2FyZVwiOnt9LFwiaGlzdG9yaWNcIjp7fSxcImp1bmN0aW9uXCI6e1wicm91bmRhYm91dFwiOnRydWV9LFwibGFuZHVzZVwiOnt9LFwibGVpc3VyZVwiOntcInNsaXB3YXlcIjp0cnVlLFwidHJhY2tcIjp0cnVlfSxcIm1hbl9tYWRlXCI6e1wiYnJlYWt3YXRlclwiOnRydWUsXCJjdXRsaW5lXCI6dHJ1ZSxcImVtYmFua21lbnRcIjp0cnVlLFwiZ3JveW5lXCI6dHJ1ZSxcInBpZXJcIjp0cnVlLFwicGlwZWxpbmVcIjp0cnVlfSxcIm1pbGl0YXJ5XCI6e30sXCJuYXR1cmFsXCI6e1wiY2xpZmZcIjp0cnVlLFwiY29hc3RsaW5lXCI6dHJ1ZSxcInJpZGdlXCI6dHJ1ZSxcInRyZWVfcm93XCI6dHJ1ZX0sXCJvZmZpY2VcIjp7fSxcInBpc3RlOnR5cGVcIjp7fSxcInBsYWNlXCI6e30sXCJwb3dlclwiOntcImxpbmVcIjp0cnVlLFwibWlub3JfbGluZVwiOnRydWV9LFwicHVibGljX3RyYW5zcG9ydFwiOntcInBsYXRmb3JtXCI6dHJ1ZX0sXCJzaG9wXCI6e30sXCJ0b3VyaXNtXCI6e30sXCJ3YXRlcndheVwiOntcImNhbmFsXCI6dHJ1ZSxcImRhbVwiOnRydWUsXCJkaXRjaFwiOnRydWUsXCJkcmFpblwiOnRydWUsXCJyaXZlclwiOnRydWUsXCJzdHJlYW1cIjp0cnVlLFwid2VpclwiOnRydWV9fTtcblxuLyoqXG4gKiBUZXN0IGlmIHRoZSBnaXZlbiBPcGVuU3RyZWV0TWFwIHRhZ3MgaW1wbHkgdGhhdCBhXG4gKiBjbG9zZWQgd2F5IHNob3VsZCBiZSB0cmVhdGVkIGFzIGFuIGFyZWEuXG4gKlxuICogQHBhcmFtICAge09iamVjdH0gICBPYmplY3Qgb2YgdGFncyB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gIHRydWUgaWYgdGFncyBpbXBseSBhcmVhLCBmYWxzZSBpZiB0aGV5IGRvIG5vdFxuICogQGV4YW1wbGVcbiAqICAgdmFyIGFrID0gcmVxdWlyZSgnaWQtYXJlYS1rZXlzJyk7XG4gKlxuICogICBhay5pc0FyZWEoeyAnbmF0dXJhbCc6ICd3b29kJyB9KTtcbiAqICAgLy8gdHJ1ZSAtIGEgY2xvc2VkIHdheSB0YWdnZWQgYG5hdHVyYWw9d29vZGAgaXMgYW4gYXJlYSBmaWxsZWQgd2l0aCB0cmVlc1xuICpcbiAqICAgYWsuaXNBcmVhKHsgJ25hdHVyYWwnOiAndHJlZV9yb3cnIH0pO1xuICogICAvLyBmYWxzZSAtIGEgY2xvc2VkIHdheSB0YWdnZWQgYG5hdHVyYWw9dHJlZV9yb3dgIGlzIGEgbGluZWFyIHJpbmcgb2YgdHJlZXNcbiAqL1xuZnVuY3Rpb24gaXNBcmVhKHRhZ3MpIHtcbiAgICBpZiAodHlwZW9mIHRhZ3MgIT09ICdvYmplY3QnKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodGFncy5hcmVhID09PSAneWVzJylcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRhZ3MuYXJlYSA9PT0gJ25vJylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGtleSBpbiB0YWdzKVxuICAgICAgICBpZiAoa2V5IGluIGFyZWFLZXlzICYmICEodGFnc1trZXldIGluIGFyZWFLZXlzW2tleV0pKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydHMuYXJlYUtleXMgPSBhcmVhS2V5cztcbmV4cG9ydHMuaXNBcmVhID0gaXNBcmVhO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG59KSkpO1xuIiwidmFyIFIgPSByZXF1aXJlKCdyYW1kYScpO1xudmFyIHR1cmYgPSByZXF1aXJlKCdAdHVyZi9oZWxwZXJzJyk7XG52YXIgY3JlYXRlQmJveCA9IHJlcXVpcmUoJ0B0dXJmL2Jib3gnKTtcbnZhciBjcmVhdGVCYm94UG9seWdvbiA9IHJlcXVpcmUoJ0B0dXJmL2Jib3gtcG9seWdvbicpO1xudmFyIGFrID0gcmVxdWlyZSgnaWQtYXJlYS1rZXlzJyk7XG5cbmZ1bmN0aW9uIEVsZW1lbnRQYXJzZXIoanNvbikge1xuICBmdW5jdGlvbiBjcmVhdGVGZWF0dXJlKGRhdGEpIHtcbiAgICBzd2l0Y2goZGF0YS50eXBlKSB7XG4gICAgICBjYXNlICdub2RlJzpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZU5vZGUoZGF0YSk7XG4gICAgICBjYXNlICd3YXknOlxuICAgICAgICByZXR1cm4gY3JlYXRlV2F5KGRhdGEpO1xuICAgICAgY2FzZSAncmVsYXRpb24nOlxuICAgICAgICByZXR1cm4gY3JlYXRlUmVsYXRpb24oZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlTm9kZShkYXRhKSB7XG4gICAgdmFyIGdlb21ldHJ5ID0gW2RhdGEubG9uLCBkYXRhLmxhdF0ubWFwKHBhcnNlRmxvYXQpO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gUi5vbWl0KFsnbG9uJywgJ2xhdCddLCBkYXRhKTtcbiAgICByZXR1cm4gdHVyZi5wb2ludChnZW9tZXRyeSwgcHJvcGVydGllcyk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVXYXkoZGF0YSkge1xuICAgIHZhciBnZW9tZXRyeSA9IGRhdGEubm9kZXMubWFwKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHJldHVybiBbbm9kZS5sb24sIG5vZGUubGF0XS5tYXAocGFyc2VGbG9hdCk7XG4gICAgfSk7XG4gICAgdmFyIHByb3BlcnRpZXMgPSBSLm9taXQoWydub2RlcyddLCBkYXRhKTtcblxuICAgIGlmIChkYXRhLnRhZ3MgJiYgYWsuaXNBcmVhKGRhdGEudGFncykgJiYgaXNDbG9zZWRXYXkoZGF0YS5ub2RlcykpIHtcbiAgICAgIHJldHVybiB0dXJmLnBvbHlnb24oW2dlb21ldHJ5XSwgcHJvcGVydGllcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0dXJmLmxpbmVTdHJpbmcoZ2VvbWV0cnksIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVJlbGF0aW9uKGRhdGEpIHtcbiAgICBpZiAoJ21lbWJlcnMnIGluIGRhdGEpIHtcbiAgICAgICAgZGF0YS5yZWxhdGlvbnMgPSBkYXRhLm1lbWJlcnMubWFwKGNyZWF0ZUZlYXR1cmUpLmZpbHRlcihSLmNvbXBsZW1lbnQoUi5pc05pbCkpOyAvLyBmaWx0ZXIgb3V0IG51bGxzXG4gICAgICAgIHZhciBmZWF0dXJlID0gY3JlYXRlQmJveFBvbHlnb24oY3JlYXRlQmJveCh0dXJmLmZlYXR1cmVDb2xsZWN0aW9uKGRhdGEucmVsYXRpb25zKSkpO1xuICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMgPSBSLm9taXQoWydtZW1iZXJzJ10sIGRhdGEpO1xuICAgICAgICByZXR1cm4gZmVhdHVyZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBJZiB0aGUgZmVhdHVyZSB3YXMgZGVsZXRlZCwgY29weSBpdHNcbiAgLy8gZ2VvbWV0cnkgZnJvbSB0aGUgb2xkIGZlYXR1cmVcbiAgaWYgKGpzb24uYWN0aW9uID09PSAnZGVsZXRlJykge1xuICAgIHN3aXRjaChqc29uLnR5cGUpIHtcbiAgICAgIGNhc2UgJ25vZGUnOlxuICAgICAgICBqc29uLmxvbiA9IGpzb24ub2xkLmxvbjtcbiAgICAgICAganNvbi5sYXQgPSBqc29uLm9sZC5sYXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2F5JzpcbiAgICAgICAganNvbi5ub2RlcyA9IGpzb24ub2xkLm5vZGVzO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JlbGF0aW9uJzpcbiAgICAgICAganNvbi5tZW1iZXJzID0ganNvbi5vbGQubWVtYmVycztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0IGNoYW5nZSB0eXBlXG4gIHN3aXRjaChqc29uLmFjdGlvbikge1xuICAgIGNhc2UgJ2NyZWF0ZSc6XG4gICAgICBqc29uLmNoYW5nZVR5cGUgPSAnYWRkZWQnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgIGpzb24uY2hhbmdlVHlwZSA9ICdkZWxldGVkTmV3JztcbiAgICAgIGpzb24ub2xkLmNoYW5nZVR5cGUgPSAnZGVsZXRlZE9sZCc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdtb2RpZnknOlxuICAgICAganNvbi5jaGFuZ2VUeXBlID0gJ21vZGlmaWVkTmV3JztcbiAgICAgIGpzb24ub2xkLmNoYW5nZVR5cGUgPSAnbW9kaWZpZWRPbGQnO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gKFxuICAgICdvbGQnIGluIGpzb25cbiAgICAgID8gW1Iub21pdChbJ29sZCddLCBqc29uKSwganNvbi5vbGRdXG4gICAgICA6IFtqc29uXVxuICAgICkubWFwKGNyZWF0ZUZlYXR1cmUpO1xufVxuXG5mdW5jdGlvbiBpc0Nsb3NlZFdheShub2Rlcykge1xuICAvLyBFYWNoIExpbmVhclJpbmcgb2YgYSBQb2x5Z29uIG11c3QgaGF2ZSA0IG9yIG1vcmUgUG9zaXRpb25zXG4gIGlmIChub2Rlcy5sZW5ndGggPiAzKSB7XG4gICAgdmFyIGZpcnN0Tm9kZSA9IG5vZGVzWzBdO1xuICAgIHZhciBsYXN0Tm9kZSA9IG5vZGVzW25vZGVzLmxlbmd0aCAtIDFdO1xuICAgIHJldHVybiAoZmlyc3ROb2RlLmxhdCA9PT0gbGFzdE5vZGUubGF0ICYmIGZpcnN0Tm9kZS5sb24gPT09IGxhc3ROb2RlLmxvbik7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEVsZW1lbnRQYXJzZXI7XG4iLCJ2YXIgUiA9IHJlcXVpcmUoJ3JhbWRhJyk7XG52YXIgZmVhdHVyZUNvbGxlY3Rpb24gPSByZXF1aXJlKCdAdHVyZi9oZWxwZXJzJykuZmVhdHVyZUNvbGxlY3Rpb247XG52YXIgZWxlbWVudFBhcnNlciA9IHJlcXVpcmUoJy4vcGFyc2Vycy9lbGVtZW50Jyk7XG5cbnZhciBjaGFuZ2VzZXRQYXJzZXIgPSBSLnBpcGUoXG4gIFIucHJvcChbJ2VsZW1lbnRzJ10pLFxuICBSLm1hcChlbGVtZW50UGFyc2VyKSxcbiAgUi5mbGF0dGVuLFxuICBmZWF0dXJlQ29sbGVjdGlvblxuKTtcblxuY2hhbmdlc2V0UGFyc2VyLmVsZW1lbnRQYXJzZXIgPSBlbGVtZW50UGFyc2VyO1xubW9kdWxlLmV4cG9ydHMgPSBjaGFuZ2VzZXRQYXJzZXI7XG5cbiIsIi8vISBtb21lbnQuanNcbi8vISB2ZXJzaW9uIDogMi4xOC4xXG4vLyEgYXV0aG9ycyA6IFRpbSBXb29kLCBJc2tyZW4gQ2hlcm5ldiwgTW9tZW50LmpzIGNvbnRyaWJ1dG9yc1xuLy8hIGxpY2Vuc2UgOiBNSVRcbi8vISBtb21lbnRqcy5jb21cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG4gICAgZ2xvYmFsLm1vbWVudCA9IGZhY3RvcnkoKVxufSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7XG5cbnZhciBob29rQ2FsbGJhY2s7XG5cbmZ1bmN0aW9uIGhvb2tzICgpIHtcbiAgICByZXR1cm4gaG9va0NhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5cbi8vIFRoaXMgaXMgZG9uZSB0byByZWdpc3RlciB0aGUgbWV0aG9kIGNhbGxlZCB3aXRoIG1vbWVudCgpXG4vLyB3aXRob3V0IGNyZWF0aW5nIGNpcmN1bGFyIGRlcGVuZGVuY2llcy5cbmZ1bmN0aW9uIHNldEhvb2tDYWxsYmFjayAoY2FsbGJhY2spIHtcbiAgICBob29rQ2FsbGJhY2sgPSBjYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gaXNBcnJheShpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dCBpbnN0YW5jZW9mIEFycmF5IHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGlucHV0KSB7XG4gICAgLy8gSUU4IHdpbGwgdHJlYXQgdW5kZWZpbmVkIGFuZCBudWxsIGFzIG9iamVjdCBpZiBpdCB3YXNuJ3QgZm9yXG4gICAgLy8gaW5wdXQgIT0gbnVsbFxuICAgIHJldHVybiBpbnB1dCAhPSBudWxsICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdEVtcHR5KG9iaikge1xuICAgIHZhciBrO1xuICAgIGZvciAoayBpbiBvYmopIHtcbiAgICAgICAgLy8gZXZlbiBpZiBpdHMgbm90IG93biBwcm9wZXJ0eSBJJ2Qgc3RpbGwgY2FsbCBpdCBub24tZW1wdHlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQgPT09IHZvaWQgMDtcbn1cblxuZnVuY3Rpb24gaXNOdW1iZXIoaW5wdXQpIHtcbiAgICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJyB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBOdW1iZXJdJztcbn1cblxuZnVuY3Rpb24gaXNEYXRlKGlucHV0KSB7XG4gICAgcmV0dXJuIGlucHV0IGluc3RhbmNlb2YgRGF0ZSB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5cbmZ1bmN0aW9uIG1hcChhcnIsIGZuKSB7XG4gICAgdmFyIHJlcyA9IFtdLCBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgcmVzLnB1c2goZm4oYXJyW2ldLCBpKSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIGhhc093blByb3AoYSwgYikge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSwgYik7XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChhLCBiKSB7XG4gICAgZm9yICh2YXIgaSBpbiBiKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wKGIsIGkpKSB7XG4gICAgICAgICAgICBhW2ldID0gYltpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChoYXNPd25Qcm9wKGIsICd0b1N0cmluZycpKSB7XG4gICAgICAgIGEudG9TdHJpbmcgPSBiLnRvU3RyaW5nO1xuICAgIH1cblxuICAgIGlmIChoYXNPd25Qcm9wKGIsICd2YWx1ZU9mJykpIHtcbiAgICAgICAgYS52YWx1ZU9mID0gYi52YWx1ZU9mO1xuICAgIH1cblxuICAgIHJldHVybiBhO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVVVEMgKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0KSB7XG4gICAgcmV0dXJuIGNyZWF0ZUxvY2FsT3JVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIHRydWUpLnV0YygpO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0UGFyc2luZ0ZsYWdzKCkge1xuICAgIC8vIFdlIG5lZWQgdG8gZGVlcCBjbG9uZSB0aGlzIG9iamVjdC5cbiAgICByZXR1cm4ge1xuICAgICAgICBlbXB0eSAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgdW51c2VkVG9rZW5zICAgIDogW10sXG4gICAgICAgIHVudXNlZElucHV0ICAgICA6IFtdLFxuICAgICAgICBvdmVyZmxvdyAgICAgICAgOiAtMixcbiAgICAgICAgY2hhcnNMZWZ0T3ZlciAgIDogMCxcbiAgICAgICAgbnVsbElucHV0ICAgICAgIDogZmFsc2UsXG4gICAgICAgIGludmFsaWRNb250aCAgICA6IG51bGwsXG4gICAgICAgIGludmFsaWRGb3JtYXQgICA6IGZhbHNlLFxuICAgICAgICB1c2VySW52YWxpZGF0ZWQgOiBmYWxzZSxcbiAgICAgICAgaXNvICAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgIHBhcnNlZERhdGVQYXJ0cyA6IFtdLFxuICAgICAgICBtZXJpZGllbSAgICAgICAgOiBudWxsLFxuICAgICAgICByZmMyODIyICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgd2Vla2RheU1pc21hdGNoIDogZmFsc2VcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZXRQYXJzaW5nRmxhZ3MobSkge1xuICAgIGlmIChtLl9wZiA9PSBudWxsKSB7XG4gICAgICAgIG0uX3BmID0gZGVmYXVsdFBhcnNpbmdGbGFncygpO1xuICAgIH1cbiAgICByZXR1cm4gbS5fcGY7XG59XG5cbnZhciBzb21lO1xuaWYgKEFycmF5LnByb3RvdHlwZS5zb21lKSB7XG4gICAgc29tZSA9IEFycmF5LnByb3RvdHlwZS5zb21lO1xufSBlbHNlIHtcbiAgICBzb21lID0gZnVuY3Rpb24gKGZ1bikge1xuICAgICAgICB2YXIgdCA9IE9iamVjdCh0aGlzKTtcbiAgICAgICAgdmFyIGxlbiA9IHQubGVuZ3RoID4+PiAwO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpIGluIHQgJiYgZnVuLmNhbGwodGhpcywgdFtpXSwgaSwgdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xufVxuXG52YXIgc29tZSQxID0gc29tZTtcblxuZnVuY3Rpb24gaXNWYWxpZChtKSB7XG4gICAgaWYgKG0uX2lzVmFsaWQgPT0gbnVsbCkge1xuICAgICAgICB2YXIgZmxhZ3MgPSBnZXRQYXJzaW5nRmxhZ3MobSk7XG4gICAgICAgIHZhciBwYXJzZWRQYXJ0cyA9IHNvbWUkMS5jYWxsKGZsYWdzLnBhcnNlZERhdGVQYXJ0cywgZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgIHJldHVybiBpICE9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgaXNOb3dWYWxpZCA9ICFpc05hTihtLl9kLmdldFRpbWUoKSkgJiZcbiAgICAgICAgICAgIGZsYWdzLm92ZXJmbG93IDwgMCAmJlxuICAgICAgICAgICAgIWZsYWdzLmVtcHR5ICYmXG4gICAgICAgICAgICAhZmxhZ3MuaW52YWxpZE1vbnRoICYmXG4gICAgICAgICAgICAhZmxhZ3MuaW52YWxpZFdlZWtkYXkgJiZcbiAgICAgICAgICAgICFmbGFncy5udWxsSW5wdXQgJiZcbiAgICAgICAgICAgICFmbGFncy5pbnZhbGlkRm9ybWF0ICYmXG4gICAgICAgICAgICAhZmxhZ3MudXNlckludmFsaWRhdGVkICYmXG4gICAgICAgICAgICAoIWZsYWdzLm1lcmlkaWVtIHx8IChmbGFncy5tZXJpZGllbSAmJiBwYXJzZWRQYXJ0cykpO1xuXG4gICAgICAgIGlmIChtLl9zdHJpY3QpIHtcbiAgICAgICAgICAgIGlzTm93VmFsaWQgPSBpc05vd1ZhbGlkICYmXG4gICAgICAgICAgICAgICAgZmxhZ3MuY2hhcnNMZWZ0T3ZlciA9PT0gMCAmJlxuICAgICAgICAgICAgICAgIGZsYWdzLnVudXNlZFRva2Vucy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgICAgICBmbGFncy5iaWdIb3VyID09PSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0LmlzRnJvemVuID09IG51bGwgfHwgIU9iamVjdC5pc0Zyb3plbihtKSkge1xuICAgICAgICAgICAgbS5faXNWYWxpZCA9IGlzTm93VmFsaWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaXNOb3dWYWxpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbS5faXNWYWxpZDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSW52YWxpZCAoZmxhZ3MpIHtcbiAgICB2YXIgbSA9IGNyZWF0ZVVUQyhOYU4pO1xuICAgIGlmIChmbGFncyAhPSBudWxsKSB7XG4gICAgICAgIGV4dGVuZChnZXRQYXJzaW5nRmxhZ3MobSksIGZsYWdzKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhtKS51c2VySW52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBtO1xufVxuXG4vLyBQbHVnaW5zIHRoYXQgYWRkIHByb3BlcnRpZXMgc2hvdWxkIGFsc28gYWRkIHRoZSBrZXkgaGVyZSAobnVsbCB2YWx1ZSksXG4vLyBzbyB3ZSBjYW4gcHJvcGVybHkgY2xvbmUgb3Vyc2VsdmVzLlxudmFyIG1vbWVudFByb3BlcnRpZXMgPSBob29rcy5tb21lbnRQcm9wZXJ0aWVzID0gW107XG5cbmZ1bmN0aW9uIGNvcHlDb25maWcodG8sIGZyb20pIHtcbiAgICB2YXIgaSwgcHJvcCwgdmFsO1xuXG4gICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pc0FNb21lbnRPYmplY3QpKSB7XG4gICAgICAgIHRvLl9pc0FNb21lbnRPYmplY3QgPSBmcm9tLl9pc0FNb21lbnRPYmplY3Q7XG4gICAgfVxuICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5faSkpIHtcbiAgICAgICAgdG8uX2kgPSBmcm9tLl9pO1xuICAgIH1cbiAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2YpKSB7XG4gICAgICAgIHRvLl9mID0gZnJvbS5fZjtcbiAgICB9XG4gICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9sKSkge1xuICAgICAgICB0by5fbCA9IGZyb20uX2w7XG4gICAgfVxuICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fc3RyaWN0KSkge1xuICAgICAgICB0by5fc3RyaWN0ID0gZnJvbS5fc3RyaWN0O1xuICAgIH1cbiAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX3R6bSkpIHtcbiAgICAgICAgdG8uX3R6bSA9IGZyb20uX3R6bTtcbiAgICB9XG4gICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pc1VUQykpIHtcbiAgICAgICAgdG8uX2lzVVRDID0gZnJvbS5faXNVVEM7XG4gICAgfVxuICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fb2Zmc2V0KSkge1xuICAgICAgICB0by5fb2Zmc2V0ID0gZnJvbS5fb2Zmc2V0O1xuICAgIH1cbiAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX3BmKSkge1xuICAgICAgICB0by5fcGYgPSBnZXRQYXJzaW5nRmxhZ3MoZnJvbSk7XG4gICAgfVxuICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fbG9jYWxlKSkge1xuICAgICAgICB0by5fbG9jYWxlID0gZnJvbS5fbG9jYWxlO1xuICAgIH1cblxuICAgIGlmIChtb21lbnRQcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IG1vbWVudFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHByb3AgPSBtb21lbnRQcm9wZXJ0aWVzW2ldO1xuICAgICAgICAgICAgdmFsID0gZnJvbVtwcm9wXTtcbiAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQodmFsKSkge1xuICAgICAgICAgICAgICAgIHRvW3Byb3BdID0gdmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvO1xufVxuXG52YXIgdXBkYXRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4vLyBNb21lbnQgcHJvdG90eXBlIG9iamVjdFxuZnVuY3Rpb24gTW9tZW50KGNvbmZpZykge1xuICAgIGNvcHlDb25maWcodGhpcywgY29uZmlnKTtcbiAgICB0aGlzLl9kID0gbmV3IERhdGUoY29uZmlnLl9kICE9IG51bGwgPyBjb25maWcuX2QuZ2V0VGltZSgpIDogTmFOKTtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgIHRoaXMuX2QgPSBuZXcgRGF0ZShOYU4pO1xuICAgIH1cbiAgICAvLyBQcmV2ZW50IGluZmluaXRlIGxvb3AgaW4gY2FzZSB1cGRhdGVPZmZzZXQgY3JlYXRlcyBuZXcgbW9tZW50XG4gICAgLy8gb2JqZWN0cy5cbiAgICBpZiAodXBkYXRlSW5Qcm9ncmVzcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzKTtcbiAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNNb21lbnQgKG9iaikge1xuICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBNb21lbnQgfHwgKG9iaiAhPSBudWxsICYmIG9iai5faXNBTW9tZW50T2JqZWN0ICE9IG51bGwpO1xufVxuXG5mdW5jdGlvbiBhYnNGbG9vciAobnVtYmVyKSB7XG4gICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgLy8gLTAgLT4gMFxuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKG51bWJlcikgfHwgMDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihudW1iZXIpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdG9JbnQoYXJndW1lbnRGb3JDb2VyY2lvbikge1xuICAgIHZhciBjb2VyY2VkTnVtYmVyID0gK2FyZ3VtZW50Rm9yQ29lcmNpb24sXG4gICAgICAgIHZhbHVlID0gMDtcblxuICAgIGlmIChjb2VyY2VkTnVtYmVyICE9PSAwICYmIGlzRmluaXRlKGNvZXJjZWROdW1iZXIpKSB7XG4gICAgICAgIHZhbHVlID0gYWJzRmxvb3IoY29lcmNlZE51bWJlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG4vLyBjb21wYXJlIHR3byBhcnJheXMsIHJldHVybiB0aGUgbnVtYmVyIG9mIGRpZmZlcmVuY2VzXG5mdW5jdGlvbiBjb21wYXJlQXJyYXlzKGFycmF5MSwgYXJyYXkyLCBkb250Q29udmVydCkge1xuICAgIHZhciBsZW4gPSBNYXRoLm1pbihhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKSxcbiAgICAgICAgbGVuZ3RoRGlmZiA9IE1hdGguYWJzKGFycmF5MS5sZW5ndGggLSBhcnJheTIubGVuZ3RoKSxcbiAgICAgICAgZGlmZnMgPSAwLFxuICAgICAgICBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoKGRvbnRDb252ZXJ0ICYmIGFycmF5MVtpXSAhPT0gYXJyYXkyW2ldKSB8fFxuICAgICAgICAgICAgKCFkb250Q29udmVydCAmJiB0b0ludChhcnJheTFbaV0pICE9PSB0b0ludChhcnJheTJbaV0pKSkge1xuICAgICAgICAgICAgZGlmZnMrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlmZnMgKyBsZW5ndGhEaWZmO1xufVxuXG5mdW5jdGlvbiB3YXJuKG1zZykge1xuICAgIGlmIChob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPT09IGZhbHNlICYmXG4gICAgICAgICAgICAodHlwZW9mIGNvbnNvbGUgIT09ICAndW5kZWZpbmVkJykgJiYgY29uc29sZS53YXJuKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRGVwcmVjYXRpb24gd2FybmluZzogJyArIG1zZyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkZXByZWNhdGUobXNnLCBmbikge1xuICAgIHZhciBmaXJzdFRpbWUgPSB0cnVlO1xuXG4gICAgcmV0dXJuIGV4dGVuZChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG51bGwsIG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpcnN0VGltZSkge1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgIHZhciBhcmc7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGFyZyA9ICcnO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJndW1lbnRzW2ldID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICBhcmcgKz0gJ1xcblsnICsgaSArICddICc7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhcmd1bWVudHNbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyArPSBrZXkgKyAnOiAnICsgYXJndW1lbnRzWzBdW2tleV0gKyAnLCAnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZy5zbGljZSgwLCAtMik7IC8vIFJlbW92ZSB0cmFpbGluZyBjb21tYSBhbmQgc3BhY2VcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFyZ3MucHVzaChhcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fybihtc2cgKyAnXFxuQXJndW1lbnRzOiAnICsgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncykuam9pbignJykgKyAnXFxuJyArIChuZXcgRXJyb3IoKSkuc3RhY2spO1xuICAgICAgICAgICAgZmlyc3RUaW1lID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSwgZm4pO1xufVxuXG52YXIgZGVwcmVjYXRpb25zID0ge307XG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZVNpbXBsZShuYW1lLCBtc2cpIHtcbiAgICBpZiAoaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyICE9IG51bGwpIHtcbiAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG5hbWUsIG1zZyk7XG4gICAgfVxuICAgIGlmICghZGVwcmVjYXRpb25zW25hbWVdKSB7XG4gICAgICAgIHdhcm4obXNnKTtcbiAgICAgICAgZGVwcmVjYXRpb25zW25hbWVdID0gdHJ1ZTtcbiAgICB9XG59XG5cbmhvb2tzLnN1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5ncyA9IGZhbHNlO1xuaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyID0gbnVsbDtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dCBpbnN0YW5jZW9mIEZ1bmN0aW9uIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59XG5cbmZ1bmN0aW9uIHNldCAoY29uZmlnKSB7XG4gICAgdmFyIHByb3AsIGk7XG4gICAgZm9yIChpIGluIGNvbmZpZykge1xuICAgICAgICBwcm9wID0gY29uZmlnW2ldO1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihwcm9wKSkge1xuICAgICAgICAgICAgdGhpc1tpXSA9IHByb3A7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzWydfJyArIGldID0gcHJvcDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgLy8gTGVuaWVudCBvcmRpbmFsIHBhcnNpbmcgYWNjZXB0cyBqdXN0IGEgbnVtYmVyIGluIGFkZGl0aW9uIHRvXG4gICAgLy8gbnVtYmVyICsgKHBvc3NpYmx5KSBzdHVmZiBjb21pbmcgZnJvbSBfZGF5T2ZNb250aE9yZGluYWxQYXJzZS5cbiAgICAvLyBUT0RPOiBSZW1vdmUgXCJvcmRpbmFsUGFyc2VcIiBmYWxsYmFjayBpbiBuZXh0IG1ham9yIHJlbGVhc2UuXG4gICAgdGhpcy5fZGF5T2ZNb250aE9yZGluYWxQYXJzZUxlbmllbnQgPSBuZXcgUmVnRXhwKFxuICAgICAgICAodGhpcy5fZGF5T2ZNb250aE9yZGluYWxQYXJzZS5zb3VyY2UgfHwgdGhpcy5fb3JkaW5hbFBhcnNlLnNvdXJjZSkgK1xuICAgICAgICAgICAgJ3wnICsgKC9cXGR7MSwyfS8pLnNvdXJjZSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNoaWxkQ29uZmlnKSB7XG4gICAgdmFyIHJlcyA9IGV4dGVuZCh7fSwgcGFyZW50Q29uZmlnKSwgcHJvcDtcbiAgICBmb3IgKHByb3AgaW4gY2hpbGRDb25maWcpIHtcbiAgICAgICAgaWYgKGhhc093blByb3AoY2hpbGRDb25maWcsIHByb3ApKSB7XG4gICAgICAgICAgICBpZiAoaXNPYmplY3QocGFyZW50Q29uZmlnW3Byb3BdKSAmJiBpc09iamVjdChjaGlsZENvbmZpZ1twcm9wXSkpIHtcbiAgICAgICAgICAgICAgICByZXNbcHJvcF0gPSB7fTtcbiAgICAgICAgICAgICAgICBleHRlbmQocmVzW3Byb3BdLCBwYXJlbnRDb25maWdbcHJvcF0pO1xuICAgICAgICAgICAgICAgIGV4dGVuZChyZXNbcHJvcF0sIGNoaWxkQ29uZmlnW3Byb3BdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGRDb25maWdbcHJvcF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJlc1twcm9wXSA9IGNoaWxkQ29uZmlnW3Byb3BdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgcmVzW3Byb3BdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAocHJvcCBpbiBwYXJlbnRDb25maWcpIHtcbiAgICAgICAgaWYgKGhhc093blByb3AocGFyZW50Q29uZmlnLCBwcm9wKSAmJlxuICAgICAgICAgICAgICAgICFoYXNPd25Qcm9wKGNoaWxkQ29uZmlnLCBwcm9wKSAmJlxuICAgICAgICAgICAgICAgIGlzT2JqZWN0KHBhcmVudENvbmZpZ1twcm9wXSkpIHtcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBjaGFuZ2VzIHRvIHByb3BlcnRpZXMgZG9uJ3QgbW9kaWZ5IHBhcmVudCBjb25maWdcbiAgICAgICAgICAgIHJlc1twcm9wXSA9IGV4dGVuZCh7fSwgcmVzW3Byb3BdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBMb2NhbGUoY29uZmlnKSB7XG4gICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2V0KGNvbmZpZyk7XG4gICAgfVxufVxuXG52YXIga2V5cztcblxuaWYgKE9iamVjdC5rZXlzKSB7XG4gICAga2V5cyA9IE9iamVjdC5rZXlzO1xufSBlbHNlIHtcbiAgICBrZXlzID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICB2YXIgaSwgcmVzID0gW107XG4gICAgICAgIGZvciAoaSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKG9iaiwgaSkpIHtcbiAgICAgICAgICAgICAgICByZXMucHVzaChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH07XG59XG5cbnZhciBrZXlzJDEgPSBrZXlzO1xuXG52YXIgZGVmYXVsdENhbGVuZGFyID0ge1xuICAgIHNhbWVEYXkgOiAnW1RvZGF5IGF0XSBMVCcsXG4gICAgbmV4dERheSA6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICBuZXh0V2VlayA6ICdkZGRkIFthdF0gTFQnLFxuICAgIGxhc3REYXkgOiAnW1llc3RlcmRheSBhdF0gTFQnLFxuICAgIGxhc3RXZWVrIDogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgIHNhbWVFbHNlIDogJ0wnXG59O1xuXG5mdW5jdGlvbiBjYWxlbmRhciAoa2V5LCBtb20sIG5vdykge1xuICAgIHZhciBvdXRwdXQgPSB0aGlzLl9jYWxlbmRhcltrZXldIHx8IHRoaXMuX2NhbGVuZGFyWydzYW1lRWxzZSddO1xuICAgIHJldHVybiBpc0Z1bmN0aW9uKG91dHB1dCkgPyBvdXRwdXQuY2FsbChtb20sIG5vdykgOiBvdXRwdXQ7XG59XG5cbnZhciBkZWZhdWx0TG9uZ0RhdGVGb3JtYXQgPSB7XG4gICAgTFRTICA6ICdoOm1tOnNzIEEnLFxuICAgIExUICAgOiAnaDptbSBBJyxcbiAgICBMICAgIDogJ01NL0REL1lZWVknLFxuICAgIExMICAgOiAnTU1NTSBELCBZWVlZJyxcbiAgICBMTEwgIDogJ01NTU0gRCwgWVlZWSBoOm1tIEEnLFxuICAgIExMTEwgOiAnZGRkZCwgTU1NTSBELCBZWVlZIGg6bW0gQSdcbn07XG5cbmZ1bmN0aW9uIGxvbmdEYXRlRm9ybWF0IChrZXkpIHtcbiAgICB2YXIgZm9ybWF0ID0gdGhpcy5fbG9uZ0RhdGVGb3JtYXRba2V5XSxcbiAgICAgICAgZm9ybWF0VXBwZXIgPSB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXkudG9VcHBlckNhc2UoKV07XG5cbiAgICBpZiAoZm9ybWF0IHx8ICFmb3JtYXRVcHBlcikge1xuICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgIH1cblxuICAgIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV0gPSBmb3JtYXRVcHBlci5yZXBsYWNlKC9NTU1NfE1NfEREfGRkZGQvZywgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICByZXR1cm4gdmFsLnNsaWNlKDEpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV07XG59XG5cbnZhciBkZWZhdWx0SW52YWxpZERhdGUgPSAnSW52YWxpZCBkYXRlJztcblxuZnVuY3Rpb24gaW52YWxpZERhdGUgKCkge1xuICAgIHJldHVybiB0aGlzLl9pbnZhbGlkRGF0ZTtcbn1cblxudmFyIGRlZmF1bHRPcmRpbmFsID0gJyVkJztcbnZhciBkZWZhdWx0RGF5T2ZNb250aE9yZGluYWxQYXJzZSA9IC9cXGR7MSwyfS87XG5cbmZ1bmN0aW9uIG9yZGluYWwgKG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLl9vcmRpbmFsLnJlcGxhY2UoJyVkJywgbnVtYmVyKTtcbn1cblxudmFyIGRlZmF1bHRSZWxhdGl2ZVRpbWUgPSB7XG4gICAgZnV0dXJlIDogJ2luICVzJyxcbiAgICBwYXN0ICAgOiAnJXMgYWdvJyxcbiAgICBzICA6ICdhIGZldyBzZWNvbmRzJyxcbiAgICBzcyA6ICclZCBzZWNvbmRzJyxcbiAgICBtICA6ICdhIG1pbnV0ZScsXG4gICAgbW0gOiAnJWQgbWludXRlcycsXG4gICAgaCAgOiAnYW4gaG91cicsXG4gICAgaGggOiAnJWQgaG91cnMnLFxuICAgIGQgIDogJ2EgZGF5JyxcbiAgICBkZCA6ICclZCBkYXlzJyxcbiAgICBNICA6ICdhIG1vbnRoJyxcbiAgICBNTSA6ICclZCBtb250aHMnLFxuICAgIHkgIDogJ2EgeWVhcicsXG4gICAgeXkgOiAnJWQgeWVhcnMnXG59O1xuXG5mdW5jdGlvbiByZWxhdGl2ZVRpbWUgKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgIHZhciBvdXRwdXQgPSB0aGlzLl9yZWxhdGl2ZVRpbWVbc3RyaW5nXTtcbiAgICByZXR1cm4gKGlzRnVuY3Rpb24ob3V0cHV0KSkgP1xuICAgICAgICBvdXRwdXQobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSA6XG4gICAgICAgIG91dHB1dC5yZXBsYWNlKC8lZC9pLCBudW1iZXIpO1xufVxuXG5mdW5jdGlvbiBwYXN0RnV0dXJlIChkaWZmLCBvdXRwdXQpIHtcbiAgICB2YXIgZm9ybWF0ID0gdGhpcy5fcmVsYXRpdmVUaW1lW2RpZmYgPiAwID8gJ2Z1dHVyZScgOiAncGFzdCddO1xuICAgIHJldHVybiBpc0Z1bmN0aW9uKGZvcm1hdCkgPyBmb3JtYXQob3V0cHV0KSA6IGZvcm1hdC5yZXBsYWNlKC8lcy9pLCBvdXRwdXQpO1xufVxuXG52YXIgYWxpYXNlcyA9IHt9O1xuXG5mdW5jdGlvbiBhZGRVbml0QWxpYXMgKHVuaXQsIHNob3J0aGFuZCkge1xuICAgIHZhciBsb3dlckNhc2UgPSB1bml0LnRvTG93ZXJDYXNlKCk7XG4gICAgYWxpYXNlc1tsb3dlckNhc2VdID0gYWxpYXNlc1tsb3dlckNhc2UgKyAncyddID0gYWxpYXNlc1tzaG9ydGhhbmRdID0gdW5pdDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVW5pdHModW5pdHMpIHtcbiAgICByZXR1cm4gdHlwZW9mIHVuaXRzID09PSAnc3RyaW5nJyA/IGFsaWFzZXNbdW5pdHNdIHx8IGFsaWFzZXNbdW5pdHMudG9Mb3dlckNhc2UoKV0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9iamVjdFVuaXRzKGlucHV0T2JqZWN0KSB7XG4gICAgdmFyIG5vcm1hbGl6ZWRJbnB1dCA9IHt9LFxuICAgICAgICBub3JtYWxpemVkUHJvcCxcbiAgICAgICAgcHJvcDtcblxuICAgIGZvciAocHJvcCBpbiBpbnB1dE9iamVjdCkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcChpbnB1dE9iamVjdCwgcHJvcCkpIHtcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRQcm9wID0gbm9ybWFsaXplVW5pdHMocHJvcCk7XG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZFByb3ApIHtcbiAgICAgICAgICAgICAgICBub3JtYWxpemVkSW5wdXRbbm9ybWFsaXplZFByb3BdID0gaW5wdXRPYmplY3RbcHJvcF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZElucHV0O1xufVxuXG52YXIgcHJpb3JpdGllcyA9IHt9O1xuXG5mdW5jdGlvbiBhZGRVbml0UHJpb3JpdHkodW5pdCwgcHJpb3JpdHkpIHtcbiAgICBwcmlvcml0aWVzW3VuaXRdID0gcHJpb3JpdHk7XG59XG5cbmZ1bmN0aW9uIGdldFByaW9yaXRpemVkVW5pdHModW5pdHNPYmopIHtcbiAgICB2YXIgdW5pdHMgPSBbXTtcbiAgICBmb3IgKHZhciB1IGluIHVuaXRzT2JqKSB7XG4gICAgICAgIHVuaXRzLnB1c2goe3VuaXQ6IHUsIHByaW9yaXR5OiBwcmlvcml0aWVzW3VdfSk7XG4gICAgfVxuICAgIHVuaXRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEucHJpb3JpdHkgLSBiLnByaW9yaXR5O1xuICAgIH0pO1xuICAgIHJldHVybiB1bml0cztcbn1cblxuZnVuY3Rpb24gbWFrZUdldFNldCAodW5pdCwga2VlcFRpbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBzZXQkMSh0aGlzLCB1bml0LCB2YWx1ZSk7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywga2VlcFRpbWUpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0KHRoaXMsIHVuaXQpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0IChtb20sIHVuaXQpIHtcbiAgICByZXR1cm4gbW9tLmlzVmFsaWQoKSA/XG4gICAgICAgIG1vbS5fZFsnZ2V0JyArIChtb20uX2lzVVRDID8gJ1VUQycgOiAnJykgKyB1bml0XSgpIDogTmFOO1xufVxuXG5mdW5jdGlvbiBzZXQkMSAobW9tLCB1bml0LCB2YWx1ZSkge1xuICAgIGlmIChtb20uaXNWYWxpZCgpKSB7XG4gICAgICAgIG1vbS5fZFsnc2V0JyArIChtb20uX2lzVVRDID8gJ1VUQycgOiAnJykgKyB1bml0XSh2YWx1ZSk7XG4gICAgfVxufVxuXG4vLyBNT01FTlRTXG5cbmZ1bmN0aW9uIHN0cmluZ0dldCAodW5pdHMpIHtcbiAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICBpZiAoaXNGdW5jdGlvbih0aGlzW3VuaXRzXSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbdW5pdHNdKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbmZ1bmN0aW9uIHN0cmluZ1NldCAodW5pdHMsIHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB1bml0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVPYmplY3RVbml0cyh1bml0cyk7XG4gICAgICAgIHZhciBwcmlvcml0aXplZCA9IGdldFByaW9yaXRpemVkVW5pdHModW5pdHMpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByaW9yaXRpemVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzW3ByaW9yaXRpemVkW2ldLnVuaXRdKHVuaXRzW3ByaW9yaXRpemVkW2ldLnVuaXRdKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih0aGlzW3VuaXRzXSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzW3VuaXRzXSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cbmZ1bmN0aW9uIHplcm9GaWxsKG51bWJlciwgdGFyZ2V0TGVuZ3RoLCBmb3JjZVNpZ24pIHtcbiAgICB2YXIgYWJzTnVtYmVyID0gJycgKyBNYXRoLmFicyhudW1iZXIpLFxuICAgICAgICB6ZXJvc1RvRmlsbCA9IHRhcmdldExlbmd0aCAtIGFic051bWJlci5sZW5ndGgsXG4gICAgICAgIHNpZ24gPSBudW1iZXIgPj0gMDtcbiAgICByZXR1cm4gKHNpZ24gPyAoZm9yY2VTaWduID8gJysnIDogJycpIDogJy0nKSArXG4gICAgICAgIE1hdGgucG93KDEwLCBNYXRoLm1heCgwLCB6ZXJvc1RvRmlsbCkpLnRvU3RyaW5nKCkuc3Vic3RyKDEpICsgYWJzTnVtYmVyO1xufVxuXG52YXIgZm9ybWF0dGluZ1Rva2VucyA9IC8oXFxbW15cXFtdKlxcXSl8KFxcXFwpPyhbSGhdbW0oc3MpP3xNb3xNTT9NP00/fERvfERERG98REQ/RD9EP3xkZGQ/ZD98ZG8/fHdbb3x3XT98V1tvfFddP3xRbz98WVlZWVlZfFlZWVlZfFlZWVl8WVl8Z2coZ2dnPyk/fEdHKEdHRz8pP3xlfEV8YXxBfGhoP3xISD98a2s/fG1tP3xzcz98U3sxLDl9fHh8WHx6ej98Wlo/fC4pL2c7XG5cbnZhciBsb2NhbEZvcm1hdHRpbmdUb2tlbnMgPSAvKFxcW1teXFxbXSpcXF0pfChcXFxcKT8oTFRTfExUfExMP0w/TD98bHsxLDR9KS9nO1xuXG52YXIgZm9ybWF0RnVuY3Rpb25zID0ge307XG5cbnZhciBmb3JtYXRUb2tlbkZ1bmN0aW9ucyA9IHt9O1xuXG4vLyB0b2tlbjogICAgJ00nXG4vLyBwYWRkZWQ6ICAgWydNTScsIDJdXG4vLyBvcmRpbmFsOiAgJ01vJ1xuLy8gY2FsbGJhY2s6IGZ1bmN0aW9uICgpIHsgdGhpcy5tb250aCgpICsgMSB9XG5mdW5jdGlvbiBhZGRGb3JtYXRUb2tlbiAodG9rZW4sIHBhZGRlZCwgb3JkaW5hbCwgY2FsbGJhY2spIHtcbiAgICB2YXIgZnVuYyA9IGNhbGxiYWNrO1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1tjYWxsYmFja10oKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHRva2VuKSB7XG4gICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW3Rva2VuXSA9IGZ1bmM7XG4gICAgfVxuICAgIGlmIChwYWRkZWQpIHtcbiAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbcGFkZGVkWzBdXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB6ZXJvRmlsbChmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHBhZGRlZFsxXSwgcGFkZGVkWzJdKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG9yZGluYWwpIHtcbiAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbb3JkaW5hbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkub3JkaW5hbChmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRva2VuKTtcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUZvcm1hdHRpbmdUb2tlbnMoaW5wdXQpIHtcbiAgICBpZiAoaW5wdXQubWF0Y2goL1xcW1tcXHNcXFNdLykpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoL15cXFt8XFxdJC9nLCAnJyk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKC9cXFxcL2csICcnKTtcbn1cblxuZnVuY3Rpb24gbWFrZUZvcm1hdEZ1bmN0aW9uKGZvcm1hdCkge1xuICAgIHZhciBhcnJheSA9IGZvcm1hdC5tYXRjaChmb3JtYXR0aW5nVG9rZW5zKSwgaSwgbGVuZ3RoO1xuXG4gICAgZm9yIChpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGZvcm1hdFRva2VuRnVuY3Rpb25zW2FycmF5W2ldXSkge1xuICAgICAgICAgICAgYXJyYXlbaV0gPSBmb3JtYXRUb2tlbkZ1bmN0aW9uc1thcnJheVtpXV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcnJheVtpXSA9IHJlbW92ZUZvcm1hdHRpbmdUb2tlbnMoYXJyYXlbaV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChtb20pIHtcbiAgICAgICAgdmFyIG91dHB1dCA9ICcnLCBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG91dHB1dCArPSBpc0Z1bmN0aW9uKGFycmF5W2ldKSA/IGFycmF5W2ldLmNhbGwobW9tLCBmb3JtYXQpIDogYXJyYXlbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9O1xufVxuXG4vLyBmb3JtYXQgZGF0ZSB1c2luZyBuYXRpdmUgZGF0ZSBvYmplY3RcbmZ1bmN0aW9uIGZvcm1hdE1vbWVudChtLCBmb3JtYXQpIHtcbiAgICBpZiAoIW0uaXNWYWxpZCgpKSB7XG4gICAgICAgIHJldHVybiBtLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgIH1cblxuICAgIGZvcm1hdCA9IGV4cGFuZEZvcm1hdChmb3JtYXQsIG0ubG9jYWxlRGF0YSgpKTtcbiAgICBmb3JtYXRGdW5jdGlvbnNbZm9ybWF0XSA9IGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdIHx8IG1ha2VGb3JtYXRGdW5jdGlvbihmb3JtYXQpO1xuXG4gICAgcmV0dXJuIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdKG0pO1xufVxuXG5mdW5jdGlvbiBleHBhbmRGb3JtYXQoZm9ybWF0LCBsb2NhbGUpIHtcbiAgICB2YXIgaSA9IDU7XG5cbiAgICBmdW5jdGlvbiByZXBsYWNlTG9uZ0RhdGVGb3JtYXRUb2tlbnMoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5sb25nRGF0ZUZvcm1hdChpbnB1dCkgfHwgaW5wdXQ7XG4gICAgfVxuXG4gICAgbG9jYWxGb3JtYXR0aW5nVG9rZW5zLmxhc3RJbmRleCA9IDA7XG4gICAgd2hpbGUgKGkgPj0gMCAmJiBsb2NhbEZvcm1hdHRpbmdUb2tlbnMudGVzdChmb3JtYXQpKSB7XG4gICAgICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKGxvY2FsRm9ybWF0dGluZ1Rva2VucywgcmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zKTtcbiAgICAgICAgbG9jYWxGb3JtYXR0aW5nVG9rZW5zLmxhc3RJbmRleCA9IDA7XG4gICAgICAgIGkgLT0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybWF0O1xufVxuXG52YXIgbWF0Y2gxICAgICAgICAgPSAvXFxkLzsgICAgICAgICAgICAvLyAgICAgICAwIC0gOVxudmFyIG1hdGNoMiAgICAgICAgID0gL1xcZFxcZC87ICAgICAgICAgIC8vICAgICAgMDAgLSA5OVxudmFyIG1hdGNoMyAgICAgICAgID0gL1xcZHszfS87ICAgICAgICAgLy8gICAgIDAwMCAtIDk5OVxudmFyIG1hdGNoNCAgICAgICAgID0gL1xcZHs0fS87ICAgICAgICAgLy8gICAgMDAwMCAtIDk5OTlcbnZhciBtYXRjaDYgICAgICAgICA9IC9bKy1dP1xcZHs2fS87ICAgIC8vIC05OTk5OTkgLSA5OTk5OTlcbnZhciBtYXRjaDF0bzIgICAgICA9IC9cXGRcXGQ/LzsgICAgICAgICAvLyAgICAgICAwIC0gOTlcbnZhciBtYXRjaDN0bzQgICAgICA9IC9cXGRcXGRcXGRcXGQ/LzsgICAgIC8vICAgICA5OTkgLSA5OTk5XG52YXIgbWF0Y2g1dG82ICAgICAgPSAvXFxkXFxkXFxkXFxkXFxkXFxkPy87IC8vICAgOTk5OTkgLSA5OTk5OTlcbnZhciBtYXRjaDF0bzMgICAgICA9IC9cXGR7MSwzfS87ICAgICAgIC8vICAgICAgIDAgLSA5OTlcbnZhciBtYXRjaDF0bzQgICAgICA9IC9cXGR7MSw0fS87ICAgICAgIC8vICAgICAgIDAgLSA5OTk5XG52YXIgbWF0Y2gxdG82ICAgICAgPSAvWystXT9cXGR7MSw2fS87ICAvLyAtOTk5OTk5IC0gOTk5OTk5XG5cbnZhciBtYXRjaFVuc2lnbmVkICA9IC9cXGQrLzsgICAgICAgICAgIC8vICAgICAgIDAgLSBpbmZcbnZhciBtYXRjaFNpZ25lZCAgICA9IC9bKy1dP1xcZCsvOyAgICAgIC8vICAgIC1pbmYgLSBpbmZcblxudmFyIG1hdGNoT2Zmc2V0ICAgID0gL1p8WystXVxcZFxcZDo/XFxkXFxkL2dpOyAvLyArMDA6MDAgLTAwOjAwICswMDAwIC0wMDAwIG9yIFpcbnZhciBtYXRjaFNob3J0T2Zmc2V0ID0gL1p8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8vZ2k7IC8vICswMCAtMDAgKzAwOjAwIC0wMDowMCArMDAwMCAtMDAwMCBvciBaXG5cbnZhciBtYXRjaFRpbWVzdGFtcCA9IC9bKy1dP1xcZCsoXFwuXFxkezEsM30pPy87IC8vIDEyMzQ1Njc4OSAxMjM0NTY3ODkuMTIzXG5cbi8vIGFueSB3b3JkIChvciB0d28pIGNoYXJhY3RlcnMgb3IgbnVtYmVycyBpbmNsdWRpbmcgdHdvL3RocmVlIHdvcmQgbW9udGggaW4gYXJhYmljLlxuLy8gaW5jbHVkZXMgc2NvdHRpc2ggZ2FlbGljIHR3byB3b3JkIGFuZCBoeXBoZW5hdGVkIG1vbnRoc1xudmFyIG1hdGNoV29yZCA9IC9bMC05XSpbJ2EtelxcdTAwQTAtXFx1MDVGRlxcdTA3MDAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0rfFtcXHUwNjAwLVxcdTA2RkZcXC9dKyhcXHMqP1tcXHUwNjAwLVxcdTA2RkZdKyl7MSwyfS9pO1xuXG5cbnZhciByZWdleGVzID0ge307XG5cbmZ1bmN0aW9uIGFkZFJlZ2V4VG9rZW4gKHRva2VuLCByZWdleCwgc3RyaWN0UmVnZXgpIHtcbiAgICByZWdleGVzW3Rva2VuXSA9IGlzRnVuY3Rpb24ocmVnZXgpID8gcmVnZXggOiBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZURhdGEpIHtcbiAgICAgICAgcmV0dXJuIChpc1N0cmljdCAmJiBzdHJpY3RSZWdleCkgPyBzdHJpY3RSZWdleCA6IHJlZ2V4O1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdldFBhcnNlUmVnZXhGb3JUb2tlbiAodG9rZW4sIGNvbmZpZykge1xuICAgIGlmICghaGFzT3duUHJvcChyZWdleGVzLCB0b2tlbikpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAodW5lc2NhcGVGb3JtYXQodG9rZW4pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVnZXhlc1t0b2tlbl0oY29uZmlnLl9zdHJpY3QsIGNvbmZpZy5fbG9jYWxlKTtcbn1cblxuLy8gQ29kZSBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzU2MTQ5My9pcy10aGVyZS1hLXJlZ2V4cC1lc2NhcGUtZnVuY3Rpb24taW4tamF2YXNjcmlwdFxuZnVuY3Rpb24gdW5lc2NhcGVGb3JtYXQocykge1xuICAgIHJldHVybiByZWdleEVzY2FwZShzLnJlcGxhY2UoJ1xcXFwnLCAnJykucmVwbGFjZSgvXFxcXChcXFspfFxcXFwoXFxdKXxcXFsoW15cXF1cXFtdKilcXF18XFxcXCguKS9nLCBmdW5jdGlvbiAobWF0Y2hlZCwgcDEsIHAyLCBwMywgcDQpIHtcbiAgICAgICAgcmV0dXJuIHAxIHx8IHAyIHx8IHAzIHx8IHA0O1xuICAgIH0pKTtcbn1cblxuZnVuY3Rpb24gcmVnZXhFc2NhcGUocykge1xuICAgIHJldHVybiBzLnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpO1xufVxuXG52YXIgdG9rZW5zID0ge307XG5cbmZ1bmN0aW9uIGFkZFBhcnNlVG9rZW4gKHRva2VuLCBjYWxsYmFjaykge1xuICAgIHZhciBpLCBmdW5jID0gY2FsbGJhY2s7XG4gICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdG9rZW4gPSBbdG9rZW5dO1xuICAgIH1cbiAgICBpZiAoaXNOdW1iZXIoY2FsbGJhY2spKSB7XG4gICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgICAgICBhcnJheVtjYWxsYmFja10gPSB0b0ludChpbnB1dCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICB0b2tlbnNbdG9rZW5baV1dID0gZnVuYztcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGFkZFdlZWtQYXJzZVRva2VuICh0b2tlbiwgY2FsbGJhY2spIHtcbiAgICBhZGRQYXJzZVRva2VuKHRva2VuLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIGNvbmZpZy5fdyA9IGNvbmZpZy5fdyB8fCB7fTtcbiAgICAgICAgY2FsbGJhY2soaW5wdXQsIGNvbmZpZy5fdywgY29uZmlnLCB0b2tlbik7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZFRpbWVUb0FycmF5RnJvbVRva2VuKHRva2VuLCBpbnB1dCwgY29uZmlnKSB7XG4gICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaGFzT3duUHJvcCh0b2tlbnMsIHRva2VuKSkge1xuICAgICAgICB0b2tlbnNbdG9rZW5dKGlucHV0LCBjb25maWcuX2EsIGNvbmZpZywgdG9rZW4pO1xuICAgIH1cbn1cblxudmFyIFlFQVIgPSAwO1xudmFyIE1PTlRIID0gMTtcbnZhciBEQVRFID0gMjtcbnZhciBIT1VSID0gMztcbnZhciBNSU5VVEUgPSA0O1xudmFyIFNFQ09ORCA9IDU7XG52YXIgTUlMTElTRUNPTkQgPSA2O1xudmFyIFdFRUsgPSA3O1xudmFyIFdFRUtEQVkgPSA4O1xuXG52YXIgaW5kZXhPZjtcblxuaWYgKEFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7XG4gICAgaW5kZXhPZiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mO1xufSBlbHNlIHtcbiAgICBpbmRleE9mID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgLy8gSSBrbm93XG4gICAgICAgIHZhciBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKHRoaXNbaV0gPT09IG8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfTtcbn1cblxudmFyIGluZGV4T2YkMSA9IGluZGV4T2Y7XG5cbmZ1bmN0aW9uIGRheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoICsgMSwgMCkpLmdldFVUQ0RhdGUoKTtcbn1cblxuLy8gRk9STUFUVElOR1xuXG5hZGRGb3JtYXRUb2tlbignTScsIFsnTU0nLCAyXSwgJ01vJywgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLm1vbnRoKCkgKyAxO1xufSk7XG5cbmFkZEZvcm1hdFRva2VuKCdNTU0nLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1vbnRoc1Nob3J0KHRoaXMsIGZvcm1hdCk7XG59KTtcblxuYWRkRm9ybWF0VG9rZW4oJ01NTU0nLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1vbnRocyh0aGlzLCBmb3JtYXQpO1xufSk7XG5cbi8vIEFMSUFTRVNcblxuYWRkVW5pdEFsaWFzKCdtb250aCcsICdNJyk7XG5cbi8vIFBSSU9SSVRZXG5cbmFkZFVuaXRQcmlvcml0eSgnbW9udGgnLCA4KTtcblxuLy8gUEFSU0lOR1xuXG5hZGRSZWdleFRva2VuKCdNJywgICAgbWF0Y2gxdG8yKTtcbmFkZFJlZ2V4VG9rZW4oJ01NJywgICBtYXRjaDF0bzIsIG1hdGNoMik7XG5hZGRSZWdleFRva2VuKCdNTU0nLCAgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICByZXR1cm4gbG9jYWxlLm1vbnRoc1Nob3J0UmVnZXgoaXNTdHJpY3QpO1xufSk7XG5hZGRSZWdleFRva2VuKCdNTU1NJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICByZXR1cm4gbG9jYWxlLm1vbnRoc1JlZ2V4KGlzU3RyaWN0KTtcbn0pO1xuXG5hZGRQYXJzZVRva2VuKFsnTScsICdNTSddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgYXJyYXlbTU9OVEhdID0gdG9JbnQoaW5wdXQpIC0gMTtcbn0pO1xuXG5hZGRQYXJzZVRva2VuKFsnTU1NJywgJ01NTU0nXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnLCB0b2tlbikge1xuICAgIHZhciBtb250aCA9IGNvbmZpZy5fbG9jYWxlLm1vbnRoc1BhcnNlKGlucHV0LCB0b2tlbiwgY29uZmlnLl9zdHJpY3QpO1xuICAgIC8vIGlmIHdlIGRpZG4ndCBmaW5kIGEgbW9udGggbmFtZSwgbWFyayB0aGUgZGF0ZSBhcyBpbnZhbGlkLlxuICAgIGlmIChtb250aCAhPSBudWxsKSB7XG4gICAgICAgIGFycmF5W01PTlRIXSA9IG1vbnRoO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRNb250aCA9IGlucHV0O1xuICAgIH1cbn0pO1xuXG4vLyBMT0NBTEVTXG5cbnZhciBNT05USFNfSU5fRk9STUFUID0gL0Rbb0RdPyhcXFtbXlxcW1xcXV0qXFxdfFxccykrTU1NTT8vO1xudmFyIGRlZmF1bHRMb2NhbGVNb250aHMgPSAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoJ18nKTtcbmZ1bmN0aW9uIGxvY2FsZU1vbnRocyAobSwgZm9ybWF0KSB7XG4gICAgaWYgKCFtKSB7XG4gICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRocykgPyB0aGlzLl9tb250aHMgOlxuICAgICAgICAgICAgdGhpcy5fbW9udGhzWydzdGFuZGFsb25lJ107XG4gICAgfVxuICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRocykgPyB0aGlzLl9tb250aHNbbS5tb250aCgpXSA6XG4gICAgICAgIHRoaXMuX21vbnRoc1sodGhpcy5fbW9udGhzLmlzRm9ybWF0IHx8IE1PTlRIU19JTl9GT1JNQVQpLnRlc3QoZm9ybWF0KSA/ICdmb3JtYXQnIDogJ3N0YW5kYWxvbmUnXVttLm1vbnRoKCldO1xufVxuXG52YXIgZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0ID0gJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpO1xuZnVuY3Rpb24gbG9jYWxlTW9udGhzU2hvcnQgKG0sIGZvcm1hdCkge1xuICAgIGlmICghbSkge1xuICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHNTaG9ydCkgPyB0aGlzLl9tb250aHNTaG9ydCA6XG4gICAgICAgICAgICB0aGlzLl9tb250aHNTaG9ydFsnc3RhbmRhbG9uZSddO1xuICAgIH1cbiAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHNTaG9ydCkgPyB0aGlzLl9tb250aHNTaG9ydFttLm1vbnRoKCldIDpcbiAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRbTU9OVEhTX0lOX0ZPUk1BVC50ZXN0KGZvcm1hdCkgPyAnZm9ybWF0JyA6ICdzdGFuZGFsb25lJ11bbS5tb250aCgpXTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlU3RyaWN0UGFyc2UobW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgIHZhciBpLCBpaSwgbW9tLCBsbGMgPSBtb250aE5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICBpZiAoIXRoaXMuX21vbnRoc1BhcnNlKSB7XG4gICAgICAgIC8vIHRoaXMgaXMgbm90IHVzZWRcbiAgICAgICAgdGhpcy5fbW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlID0gW107XG4gICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyArK2kpIHtcbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgaV0pO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZVtpXSA9IHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSA9IHRoaXMubW9udGhzKG1vbSwgJycpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdNTU0nKSB7XG4gICAgICAgICAgICBpaSA9IGluZGV4T2YkMS5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWkgPSBpbmRleE9mJDEuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgIGlpID0gaW5kZXhPZiQxLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpaSA9IGluZGV4T2YkMS5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpaSA9IGluZGV4T2YkMS5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpaSA9IGluZGV4T2YkMS5jYWxsKHRoaXMuX3Nob3J0TW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBsb2NhbGVNb250aHNQYXJzZSAobW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgIHZhciBpLCBtb20sIHJlZ2V4O1xuXG4gICAgaWYgKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVN0cmljdFBhcnNlLmNhbGwodGhpcywgbW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9tb250aHNQYXJzZSkge1xuICAgICAgICB0aGlzLl9tb250aHNQYXJzZSA9IFtdO1xuICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZSA9IFtdO1xuICAgIH1cblxuICAgIC8vIFRPRE86IGFkZCBzb3J0aW5nXG4gICAgLy8gU29ydGluZyBtYWtlcyBzdXJlIGlmIG9uZSBtb250aCAob3IgYWJicikgaXMgYSBwcmVmaXggb2YgYW5vdGhlclxuICAgIC8vIHNlZSBzb3J0aW5nIGluIGNvbXB1dGVNb250aHNQYXJzZVxuICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgaWYgKHN0cmljdCAmJiAhdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldKSB7XG4gICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMubW9udGhzKG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnJykgKyAnJCcsICdpJyk7XG4gICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnJykgKyAnJCcsICdpJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdHJpY3QgJiYgIXRoaXMuX21vbnRoc1BhcnNlW2ldKSB7XG4gICAgICAgICAgICByZWdleCA9ICdeJyArIHRoaXMubW9udGhzKG1vbSwgJycpICsgJ3xeJyArIHRoaXMubW9udGhzU2hvcnQobW9tLCAnJyk7XG4gICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAocmVnZXgucmVwbGFjZSgnLicsICcnKSwgJ2knKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0ZXN0IHRoZSByZWdleFxuICAgICAgICBpZiAoc3RyaWN0ICYmIGZvcm1hdCA9PT0gJ01NTU0nICYmIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXS50ZXN0KG1vbnRoTmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdNTU0nICYmIHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfSBlbHNlIGlmICghc3RyaWN0ICYmIHRoaXMuX21vbnRoc1BhcnNlW2ldLnRlc3QobW9udGhOYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIE1PTUVOVFNcblxuZnVuY3Rpb24gc2V0TW9udGggKG1vbSwgdmFsdWUpIHtcbiAgICB2YXIgZGF5T2ZNb250aDtcblxuICAgIGlmICghbW9tLmlzVmFsaWQoKSkge1xuICAgICAgICAvLyBObyBvcFxuICAgICAgICByZXR1cm4gbW9tO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICgvXlxcZCskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgdmFsdWUgPSB0b0ludCh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG1vbS5sb2NhbGVEYXRhKCkubW9udGhzUGFyc2UodmFsdWUpO1xuICAgICAgICAgICAgLy8gVE9ETzogQW5vdGhlciBzaWxlbnQgZmFpbHVyZT9cbiAgICAgICAgICAgIGlmICghaXNOdW1iZXIodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRheU9mTW9udGggPSBNYXRoLm1pbihtb20uZGF0ZSgpLCBkYXlzSW5Nb250aChtb20ueWVhcigpLCB2YWx1ZSkpO1xuICAgIG1vbS5fZFsnc2V0JyArIChtb20uX2lzVVRDID8gJ1VUQycgOiAnJykgKyAnTW9udGgnXSh2YWx1ZSwgZGF5T2ZNb250aCk7XG4gICAgcmV0dXJuIG1vbTtcbn1cblxuZnVuY3Rpb24gZ2V0U2V0TW9udGggKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgc2V0TW9udGgodGhpcywgdmFsdWUpO1xuICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBnZXQodGhpcywgJ01vbnRoJyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXREYXlzSW5Nb250aCAoKSB7XG4gICAgcmV0dXJuIGRheXNJbk1vbnRoKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCkpO1xufVxuXG52YXIgZGVmYXVsdE1vbnRoc1Nob3J0UmVnZXggPSBtYXRjaFdvcmQ7XG5mdW5jdGlvbiBtb250aHNTaG9ydFJlZ2V4IChpc1N0cmljdCkge1xuICAgIGlmICh0aGlzLl9tb250aHNQYXJzZUV4YWN0KSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1JlZ2V4JykpIHtcbiAgICAgICAgICAgIGNvbXB1dGVNb250aHNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU2hvcnRSZWdleDtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1Nob3J0UmVnZXgnKSkge1xuICAgICAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRSZWdleCA9IGRlZmF1bHRNb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXggOiB0aGlzLl9tb250aHNTaG9ydFJlZ2V4O1xuICAgIH1cbn1cblxudmFyIGRlZmF1bHRNb250aHNSZWdleCA9IG1hdGNoV29yZDtcbmZ1bmN0aW9uIG1vbnRoc1JlZ2V4IChpc1N0cmljdCkge1xuICAgIGlmICh0aGlzLl9tb250aHNQYXJzZUV4YWN0KSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1JlZ2V4JykpIHtcbiAgICAgICAgICAgIGNvbXB1dGVNb250aHNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgdGhpcy5fbW9udGhzUmVnZXggPSBkZWZhdWx0TW9udGhzUmVnZXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4IDogdGhpcy5fbW9udGhzUmVnZXg7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb21wdXRlTW9udGhzUGFyc2UgKCkge1xuICAgIGZ1bmN0aW9uIGNtcExlblJldihhLCBiKSB7XG4gICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgIH1cblxuICAgIHZhciBzaG9ydFBpZWNlcyA9IFtdLCBsb25nUGllY2VzID0gW10sIG1peGVkUGllY2VzID0gW10sXG4gICAgICAgIGksIG1vbTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcbiAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgIHNob3J0UGllY2VzLnB1c2godGhpcy5tb250aHNTaG9ydChtb20sICcnKSk7XG4gICAgICAgIGxvbmdQaWVjZXMucHVzaCh0aGlzLm1vbnRocyhtb20sICcnKSk7XG4gICAgICAgIG1peGVkUGllY2VzLnB1c2godGhpcy5tb250aHMobW9tLCAnJykpO1xuICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykpO1xuICAgIH1cbiAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIG1vbnRoIChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyIGl0XG4gICAgLy8gd2lsbCBtYXRjaCB0aGUgbG9uZ2VyIHBpZWNlLlxuICAgIHNob3J0UGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICBsb25nUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICBtaXhlZFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgc2hvcnRQaWVjZXNbaV0gPSByZWdleEVzY2FwZShzaG9ydFBpZWNlc1tpXSk7XG4gICAgICAgIGxvbmdQaWVjZXNbaV0gPSByZWdleEVzY2FwZShsb25nUGllY2VzW2ldKTtcbiAgICB9XG4gICAgZm9yIChpID0gMDsgaSA8IDI0OyBpKyspIHtcbiAgICAgICAgbWl4ZWRQaWVjZXNbaV0gPSByZWdleEVzY2FwZShtaXhlZFBpZWNlc1tpXSk7XG4gICAgfVxuXG4gICAgdGhpcy5fbW9udGhzUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaXhlZFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgdGhpcy5fbW9udGhzU2hvcnRSZWdleCA9IHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbG9uZ1BpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIHNob3J0UGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbn1cblxuLy8gRk9STUFUVElOR1xuXG5hZGRGb3JtYXRUb2tlbignWScsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgeSA9IHRoaXMueWVhcigpO1xuICAgIHJldHVybiB5IDw9IDk5OTkgPyAnJyArIHkgOiAnKycgKyB5O1xufSk7XG5cbmFkZEZvcm1hdFRva2VuKDAsIFsnWVknLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnllYXIoKSAlIDEwMDtcbn0pO1xuXG5hZGRGb3JtYXRUb2tlbigwLCBbJ1lZWVknLCAgIDRdLCAgICAgICAwLCAneWVhcicpO1xuYWRkRm9ybWF0VG9rZW4oMCwgWydZWVlZWScsICA1XSwgICAgICAgMCwgJ3llYXInKTtcbmFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWVlZJywgNiwgdHJ1ZV0sIDAsICd5ZWFyJyk7XG5cbi8vIEFMSUFTRVNcblxuYWRkVW5pdEFsaWFzKCd5ZWFyJywgJ3knKTtcblxuLy8gUFJJT1JJVElFU1xuXG5hZGRVbml0UHJpb3JpdHkoJ3llYXInLCAxKTtcblxuLy8gUEFSU0lOR1xuXG5hZGRSZWdleFRva2VuKCdZJywgICAgICBtYXRjaFNpZ25lZCk7XG5hZGRSZWdleFRva2VuKCdZWScsICAgICBtYXRjaDF0bzIsIG1hdGNoMik7XG5hZGRSZWdleFRva2VuKCdZWVlZJywgICBtYXRjaDF0bzQsIG1hdGNoNCk7XG5hZGRSZWdleFRva2VuKCdZWVlZWScsICBtYXRjaDF0bzYsIG1hdGNoNik7XG5hZGRSZWdleFRva2VuKCdZWVlZWVknLCBtYXRjaDF0bzYsIG1hdGNoNik7XG5cbmFkZFBhcnNlVG9rZW4oWydZWVlZWScsICdZWVlZWVknXSwgWUVBUik7XG5hZGRQYXJzZVRva2VuKCdZWVlZJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgIGFycmF5W1lFQVJdID0gaW5wdXQubGVuZ3RoID09PSAyID8gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpIDogdG9JbnQoaW5wdXQpO1xufSk7XG5hZGRQYXJzZVRva2VuKCdZWScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICBhcnJheVtZRUFSXSA9IGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyKGlucHV0KTtcbn0pO1xuYWRkUGFyc2VUb2tlbignWScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICBhcnJheVtZRUFSXSA9IHBhcnNlSW50KGlucHV0LCAxMCk7XG59KTtcblxuLy8gSEVMUEVSU1xuXG5mdW5jdGlvbiBkYXlzSW5ZZWFyKHllYXIpIHtcbiAgICByZXR1cm4gaXNMZWFwWWVhcih5ZWFyKSA/IDM2NiA6IDM2NTtcbn1cblxuZnVuY3Rpb24gaXNMZWFwWWVhcih5ZWFyKSB7XG4gICAgcmV0dXJuICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSB8fCB5ZWFyICUgNDAwID09PSAwO1xufVxuXG4vLyBIT09LU1xuXG5ob29rcy5wYXJzZVR3b0RpZ2l0WWVhciA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgIHJldHVybiB0b0ludChpbnB1dCkgKyAodG9JbnQoaW5wdXQpID4gNjggPyAxOTAwIDogMjAwMCk7XG59O1xuXG4vLyBNT01FTlRTXG5cbnZhciBnZXRTZXRZZWFyID0gbWFrZUdldFNldCgnRnVsbFllYXInLCB0cnVlKTtcblxuZnVuY3Rpb24gZ2V0SXNMZWFwWWVhciAoKSB7XG4gICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKCkpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEYXRlICh5LCBtLCBkLCBoLCBNLCBzLCBtcykge1xuICAgIC8vIGNhbid0IGp1c3QgYXBwbHkoKSB0byBjcmVhdGUgYSBkYXRlOlxuICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8xODEzNDhcbiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHksIG0sIGQsIGgsIE0sIHMsIG1zKTtcblxuICAgIC8vIHRoZSBkYXRlIGNvbnN0cnVjdG9yIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgIGlmICh5IDwgMTAwICYmIHkgPj0gMCAmJiBpc0Zpbml0ZShkYXRlLmdldEZ1bGxZZWFyKCkpKSB7XG4gICAgICAgIGRhdGUuc2V0RnVsbFllYXIoeSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVVVENEYXRlICh5KSB7XG4gICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQy5hcHBseShudWxsLCBhcmd1bWVudHMpKTtcblxuICAgIC8vIHRoZSBEYXRlLlVUQyBmdW5jdGlvbiByZW1hcHMgeWVhcnMgMC05OSB0byAxOTAwLTE5OTlcbiAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDAgJiYgaXNGaW5pdGUoZGF0ZS5nZXRVVENGdWxsWWVhcigpKSkge1xuICAgICAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKHkpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0ZTtcbn1cblxuLy8gc3RhcnQtb2YtZmlyc3Qtd2VlayAtIHN0YXJ0LW9mLXllYXJcbmZ1bmN0aW9uIGZpcnN0V2Vla09mZnNldCh5ZWFyLCBkb3csIGRveSkge1xuICAgIHZhciAvLyBmaXJzdC13ZWVrIGRheSAtLSB3aGljaCBqYW51YXJ5IGlzIGFsd2F5cyBpbiB0aGUgZmlyc3Qgd2VlayAoNCBmb3IgaXNvLCAxIGZvciBvdGhlcilcbiAgICAgICAgZndkID0gNyArIGRvdyAtIGRveSxcbiAgICAgICAgLy8gZmlyc3Qtd2VlayBkYXkgbG9jYWwgd2Vla2RheSAtLSB3aGljaCBsb2NhbCB3ZWVrZGF5IGlzIGZ3ZFxuICAgICAgICBmd2RsdyA9ICg3ICsgY3JlYXRlVVRDRGF0ZSh5ZWFyLCAwLCBmd2QpLmdldFVUQ0RheSgpIC0gZG93KSAlIDc7XG5cbiAgICByZXR1cm4gLWZ3ZGx3ICsgZndkIC0gMTtcbn1cblxuLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZSNDYWxjdWxhdGluZ19hX2RhdGVfZ2l2ZW5fdGhlX3llYXIuMkNfd2Vla19udW1iZXJfYW5kX3dlZWtkYXlcbmZ1bmN0aW9uIGRheU9mWWVhckZyb21XZWVrcyh5ZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSkge1xuICAgIHZhciBsb2NhbFdlZWtkYXkgPSAoNyArIHdlZWtkYXkgLSBkb3cpICUgNyxcbiAgICAgICAgd2Vla09mZnNldCA9IGZpcnN0V2Vla09mZnNldCh5ZWFyLCBkb3csIGRveSksXG4gICAgICAgIGRheU9mWWVhciA9IDEgKyA3ICogKHdlZWsgLSAxKSArIGxvY2FsV2Vla2RheSArIHdlZWtPZmZzZXQsXG4gICAgICAgIHJlc1llYXIsIHJlc0RheU9mWWVhcjtcblxuICAgIGlmIChkYXlPZlllYXIgPD0gMCkge1xuICAgICAgICByZXNZZWFyID0geWVhciAtIDE7XG4gICAgICAgIHJlc0RheU9mWWVhciA9IGRheXNJblllYXIocmVzWWVhcikgKyBkYXlPZlllYXI7XG4gICAgfSBlbHNlIGlmIChkYXlPZlllYXIgPiBkYXlzSW5ZZWFyKHllYXIpKSB7XG4gICAgICAgIHJlc1llYXIgPSB5ZWFyICsgMTtcbiAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyIC0gZGF5c0luWWVhcih5ZWFyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXNZZWFyID0geWVhcjtcbiAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHllYXI6IHJlc1llYXIsXG4gICAgICAgIGRheU9mWWVhcjogcmVzRGF5T2ZZZWFyXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gd2Vla09mWWVhcihtb20sIGRvdywgZG95KSB7XG4gICAgdmFyIHdlZWtPZmZzZXQgPSBmaXJzdFdlZWtPZmZzZXQobW9tLnllYXIoKSwgZG93LCBkb3kpLFxuICAgICAgICB3ZWVrID0gTWF0aC5mbG9vcigobW9tLmRheU9mWWVhcigpIC0gd2Vla09mZnNldCAtIDEpIC8gNykgKyAxLFxuICAgICAgICByZXNXZWVrLCByZXNZZWFyO1xuXG4gICAgaWYgKHdlZWsgPCAxKSB7XG4gICAgICAgIHJlc1llYXIgPSBtb20ueWVhcigpIC0gMTtcbiAgICAgICAgcmVzV2VlayA9IHdlZWsgKyB3ZWVrc0luWWVhcihyZXNZZWFyLCBkb3csIGRveSk7XG4gICAgfSBlbHNlIGlmICh3ZWVrID4gd2Vla3NJblllYXIobW9tLnllYXIoKSwgZG93LCBkb3kpKSB7XG4gICAgICAgIHJlc1dlZWsgPSB3ZWVrIC0gd2Vla3NJblllYXIobW9tLnllYXIoKSwgZG93LCBkb3kpO1xuICAgICAgICByZXNZZWFyID0gbW9tLnllYXIoKSArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCk7XG4gICAgICAgIHJlc1dlZWsgPSB3ZWVrO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHdlZWs6IHJlc1dlZWssXG4gICAgICAgIHllYXI6IHJlc1llYXJcbiAgICB9O1xufVxuXG5mdW5jdGlvbiB3ZWVrc0luWWVhcih5ZWFyLCBkb3csIGRveSkge1xuICAgIHZhciB3ZWVrT2Zmc2V0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSxcbiAgICAgICAgd2Vla09mZnNldE5leHQgPSBmaXJzdFdlZWtPZmZzZXQoeWVhciArIDEsIGRvdywgZG95KTtcbiAgICByZXR1cm4gKGRheXNJblllYXIoeWVhcikgLSB3ZWVrT2Zmc2V0ICsgd2Vla09mZnNldE5leHQpIC8gNztcbn1cblxuLy8gRk9STUFUVElOR1xuXG5hZGRGb3JtYXRUb2tlbigndycsIFsnd3cnLCAyXSwgJ3dvJywgJ3dlZWsnKTtcbmFkZEZvcm1hdFRva2VuKCdXJywgWydXVycsIDJdLCAnV28nLCAnaXNvV2VlaycpO1xuXG4vLyBBTElBU0VTXG5cbmFkZFVuaXRBbGlhcygnd2VlaycsICd3Jyk7XG5hZGRVbml0QWxpYXMoJ2lzb1dlZWsnLCAnVycpO1xuXG4vLyBQUklPUklUSUVTXG5cbmFkZFVuaXRQcmlvcml0eSgnd2VlaycsIDUpO1xuYWRkVW5pdFByaW9yaXR5KCdpc29XZWVrJywgNSk7XG5cbi8vIFBBUlNJTkdcblxuYWRkUmVnZXhUb2tlbigndycsICBtYXRjaDF0bzIpO1xuYWRkUmVnZXhUb2tlbignd3cnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG5hZGRSZWdleFRva2VuKCdXJywgIG1hdGNoMXRvMik7XG5hZGRSZWdleFRva2VuKCdXVycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcblxuYWRkV2Vla1BhcnNlVG9rZW4oWyd3JywgJ3d3JywgJ1cnLCAnV1cnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgd2Vla1t0b2tlbi5zdWJzdHIoMCwgMSldID0gdG9JbnQoaW5wdXQpO1xufSk7XG5cbi8vIEhFTFBFUlNcblxuLy8gTE9DQUxFU1xuXG5mdW5jdGlvbiBsb2NhbGVXZWVrIChtb20pIHtcbiAgICByZXR1cm4gd2Vla09mWWVhcihtb20sIHRoaXMuX3dlZWsuZG93LCB0aGlzLl93ZWVrLmRveSkud2Vlaztcbn1cblxudmFyIGRlZmF1bHRMb2NhbGVXZWVrID0ge1xuICAgIGRvdyA6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgIGRveSA6IDYgIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDFzdCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbn07XG5cbmZ1bmN0aW9uIGxvY2FsZUZpcnN0RGF5T2ZXZWVrICgpIHtcbiAgICByZXR1cm4gdGhpcy5fd2Vlay5kb3c7XG59XG5cbmZ1bmN0aW9uIGxvY2FsZUZpcnN0RGF5T2ZZZWFyICgpIHtcbiAgICByZXR1cm4gdGhpcy5fd2Vlay5kb3k7XG59XG5cbi8vIE1PTUVOVFNcblxuZnVuY3Rpb24gZ2V0U2V0V2VlayAoaW5wdXQpIHtcbiAgICB2YXIgd2VlayA9IHRoaXMubG9jYWxlRGF0YSgpLndlZWsodGhpcyk7XG4gICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrIDogdGhpcy5hZGQoKGlucHV0IC0gd2VlaykgKiA3LCAnZCcpO1xufVxuXG5mdW5jdGlvbiBnZXRTZXRJU09XZWVrIChpbnB1dCkge1xuICAgIHZhciB3ZWVrID0gd2Vla09mWWVhcih0aGlzLCAxLCA0KS53ZWVrO1xuICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gd2VlayA6IHRoaXMuYWRkKChpbnB1dCAtIHdlZWspICogNywgJ2QnKTtcbn1cblxuLy8gRk9STUFUVElOR1xuXG5hZGRGb3JtYXRUb2tlbignZCcsIDAsICdkbycsICdkYXknKTtcblxuYWRkRm9ybWF0VG9rZW4oJ2RkJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c01pbih0aGlzLCBmb3JtYXQpO1xufSk7XG5cbmFkZEZvcm1hdFRva2VuKCdkZGQnLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzU2hvcnQodGhpcywgZm9ybWF0KTtcbn0pO1xuXG5hZGRGb3JtYXRUb2tlbignZGRkZCcsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXModGhpcywgZm9ybWF0KTtcbn0pO1xuXG5hZGRGb3JtYXRUb2tlbignZScsIDAsIDAsICd3ZWVrZGF5Jyk7XG5hZGRGb3JtYXRUb2tlbignRScsIDAsIDAsICdpc29XZWVrZGF5Jyk7XG5cbi8vIEFMSUFTRVNcblxuYWRkVW5pdEFsaWFzKCdkYXknLCAnZCcpO1xuYWRkVW5pdEFsaWFzKCd3ZWVrZGF5JywgJ2UnKTtcbmFkZFVuaXRBbGlhcygnaXNvV2Vla2RheScsICdFJyk7XG5cbi8vIFBSSU9SSVRZXG5hZGRVbml0UHJpb3JpdHkoJ2RheScsIDExKTtcbmFkZFVuaXRQcmlvcml0eSgnd2Vla2RheScsIDExKTtcbmFkZFVuaXRQcmlvcml0eSgnaXNvV2Vla2RheScsIDExKTtcblxuLy8gUEFSU0lOR1xuXG5hZGRSZWdleFRva2VuKCdkJywgICAgbWF0Y2gxdG8yKTtcbmFkZFJlZ2V4VG9rZW4oJ2UnLCAgICBtYXRjaDF0bzIpO1xuYWRkUmVnZXhUb2tlbignRScsICAgIG1hdGNoMXRvMik7XG5hZGRSZWdleFRva2VuKCdkZCcsICAgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzTWluUmVnZXgoaXNTdHJpY3QpO1xufSk7XG5hZGRSZWdleFRva2VuKCdkZGQnLCAgIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1Nob3J0UmVnZXgoaXNTdHJpY3QpO1xufSk7XG5hZGRSZWdleFRva2VuKCdkZGRkJywgICBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNSZWdleChpc1N0cmljdCk7XG59KTtcblxuYWRkV2Vla1BhcnNlVG9rZW4oWydkZCcsICdkZGQnLCAnZGRkZCddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICB2YXIgd2Vla2RheSA9IGNvbmZpZy5fbG9jYWxlLndlZWtkYXlzUGFyc2UoaW5wdXQsIHRva2VuLCBjb25maWcuX3N0cmljdCk7XG4gICAgLy8gaWYgd2UgZGlkbid0IGdldCBhIHdlZWtkYXkgbmFtZSwgbWFyayB0aGUgZGF0ZSBhcyBpbnZhbGlkXG4gICAgaWYgKHdlZWtkYXkgIT0gbnVsbCkge1xuICAgICAgICB3ZWVrLmQgPSB3ZWVrZGF5O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmludmFsaWRXZWVrZGF5ID0gaW5wdXQ7XG4gICAgfVxufSk7XG5cbmFkZFdlZWtQYXJzZVRva2VuKFsnZCcsICdlJywgJ0UnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgd2Vla1t0b2tlbl0gPSB0b0ludChpbnB1dCk7XG59KTtcblxuLy8gSEVMUEVSU1xuXG5mdW5jdGlvbiBwYXJzZVdlZWtkYXkoaW5wdXQsIGxvY2FsZSkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG5cbiAgICBpZiAoIWlzTmFOKGlucHV0KSkge1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQoaW5wdXQsIDEwKTtcbiAgICB9XG5cbiAgICBpbnB1dCA9IGxvY2FsZS53ZWVrZGF5c1BhcnNlKGlucHV0KTtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHBhcnNlSXNvV2Vla2RheShpbnB1dCwgbG9jYWxlKSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1BhcnNlKGlucHV0KSAlIDcgfHwgNztcbiAgICB9XG4gICAgcmV0dXJuIGlzTmFOKGlucHV0KSA/IG51bGwgOiBpbnB1dDtcbn1cblxuLy8gTE9DQUxFU1xuXG52YXIgZGVmYXVsdExvY2FsZVdlZWtkYXlzID0gJ1N1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Jy5zcGxpdCgnXycpO1xuZnVuY3Rpb24gbG9jYWxlV2Vla2RheXMgKG0sIGZvcm1hdCkge1xuICAgIGlmICghbSkge1xuICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl93ZWVrZGF5cykgPyB0aGlzLl93ZWVrZGF5cyA6XG4gICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1snc3RhbmRhbG9uZSddO1xuICAgIH1cbiAgICByZXR1cm4gaXNBcnJheSh0aGlzLl93ZWVrZGF5cykgPyB0aGlzLl93ZWVrZGF5c1ttLmRheSgpXSA6XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzW3RoaXMuX3dlZWtkYXlzLmlzRm9ybWF0LnRlc3QoZm9ybWF0KSA/ICdmb3JtYXQnIDogJ3N0YW5kYWxvbmUnXVttLmRheSgpXTtcbn1cblxudmFyIGRlZmF1bHRMb2NhbGVXZWVrZGF5c1Nob3J0ID0gJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKTtcbmZ1bmN0aW9uIGxvY2FsZVdlZWtkYXlzU2hvcnQgKG0pIHtcbiAgICByZXR1cm4gKG0pID8gdGhpcy5fd2Vla2RheXNTaG9ydFttLmRheSgpXSA6IHRoaXMuX3dlZWtkYXlzU2hvcnQ7XG59XG5cbnZhciBkZWZhdWx0TG9jYWxlV2Vla2RheXNNaW4gPSAnU3VfTW9fVHVfV2VfVGhfRnJfU2EnLnNwbGl0KCdfJyk7XG5mdW5jdGlvbiBsb2NhbGVXZWVrZGF5c01pbiAobSkge1xuICAgIHJldHVybiAobSkgPyB0aGlzLl93ZWVrZGF5c01pblttLmRheSgpXSA6IHRoaXMuX3dlZWtkYXlzTWluO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVTdHJpY3RQYXJzZSQxKHdlZWtkYXlOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgIHZhciBpLCBpaSwgbW9tLCBsbGMgPSB3ZWVrZGF5TmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZSkge1xuICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlID0gW107XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7ICsraSkge1xuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXSA9IHRoaXMud2Vla2RheXNNaW4obW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtpXSA9IHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZVtpXSA9IHRoaXMud2Vla2RheXMobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdHJpY3QpIHtcbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RkZGQnKSB7XG4gICAgICAgICAgICBpaSA9IGluZGV4T2YkMS5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ2RkZCcpIHtcbiAgICAgICAgICAgIGlpID0gaW5kZXhPZiQxLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlpID0gaW5kZXhPZiQxLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm9ybWF0ID09PSAnZGRkZCcpIHtcbiAgICAgICAgICAgIGlpID0gaW5kZXhPZiQxLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpaSA9IGluZGV4T2YkMS5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpaSA9IGluZGV4T2YkMS5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ2RkZCcpIHtcbiAgICAgICAgICAgIGlpID0gaW5kZXhPZiQxLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlpID0gaW5kZXhPZiQxLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpaSA9IGluZGV4T2YkMS5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWkgPSBpbmRleE9mJDEuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlpID0gaW5kZXhPZiQxLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpaSA9IGluZGV4T2YkMS5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGxvY2FsZVdlZWtkYXlzUGFyc2UgKHdlZWtkYXlOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgIHZhciBpLCBtb20sIHJlZ2V4O1xuXG4gICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICByZXR1cm4gaGFuZGxlU3RyaWN0UGFyc2UkMS5jYWxsKHRoaXMsIHdlZWtkYXlOYW1lLCBmb3JtYXQsIHN0cmljdCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl93ZWVrZGF5c1BhcnNlKSB7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuXG4gICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgMV0pLmRheShpKTtcbiAgICAgICAgaWYgKHN0cmljdCAmJiAhdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgIHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLndlZWtkYXlzKG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnXFwuPycpICsgJyQnLCAnaScpO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykucmVwbGFjZSgnLicsICdcXC4/JykgKyAnJCcsICdpJyk7XG4gICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnXFwuPycpICsgJyQnLCAnaScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZVtpXSkge1xuICAgICAgICAgICAgcmVnZXggPSAnXicgKyB0aGlzLndlZWtkYXlzKG1vbSwgJycpICsgJ3xeJyArIHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKSArICd8XicgKyB0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpO1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAocmVnZXgucmVwbGFjZSgnLicsICcnKSwgJ2knKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0ZXN0IHRoZSByZWdleFxuICAgICAgICBpZiAoc3RyaWN0ICYmIGZvcm1hdCA9PT0gJ2RkZGQnICYmIHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfSBlbHNlIGlmIChzdHJpY3QgJiYgZm9ybWF0ID09PSAnZGRkJyAmJiB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdkZCcgJiYgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXN0cmljdCAmJiB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gTU9NRU5UU1xuXG5mdW5jdGlvbiBnZXRTZXREYXlPZldlZWsgKGlucHV0KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgfVxuICAgIHZhciBkYXkgPSB0aGlzLl9pc1VUQyA/IHRoaXMuX2QuZ2V0VVRDRGF5KCkgOiB0aGlzLl9kLmdldERheSgpO1xuICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgIGlucHV0ID0gcGFyc2VXZWVrZGF5KGlucHV0LCB0aGlzLmxvY2FsZURhdGEoKSk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZChpbnB1dCAtIGRheSwgJ2QnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZGF5O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0U2V0TG9jYWxlRGF5T2ZXZWVrIChpbnB1dCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgIH1cbiAgICB2YXIgd2Vla2RheSA9ICh0aGlzLmRheSgpICsgNyAtIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdykgJSA3O1xuICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gd2Vla2RheSA6IHRoaXMuYWRkKGlucHV0IC0gd2Vla2RheSwgJ2QnKTtcbn1cblxuZnVuY3Rpb24gZ2V0U2V0SVNPRGF5T2ZXZWVrIChpbnB1dCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgIH1cblxuICAgIC8vIGJlaGF2ZXMgdGhlIHNhbWUgYXMgbW9tZW50I2RheSBleGNlcHRcbiAgICAvLyBhcyBhIGdldHRlciwgcmV0dXJucyA3IGluc3RlYWQgb2YgMCAoMS03IHJhbmdlIGluc3RlYWQgb2YgMC02KVxuICAgIC8vIGFzIGEgc2V0dGVyLCBzdW5kYXkgc2hvdWxkIGJlbG9uZyB0byB0aGUgcHJldmlvdXMgd2Vlay5cblxuICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgIHZhciB3ZWVrZGF5ID0gcGFyc2VJc29XZWVrZGF5KGlucHV0LCB0aGlzLmxvY2FsZURhdGEoKSk7XG4gICAgICAgIHJldHVybiB0aGlzLmRheSh0aGlzLmRheSgpICUgNyA/IHdlZWtkYXkgOiB3ZWVrZGF5IC0gNyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF5KCkgfHwgNztcbiAgICB9XG59XG5cbnZhciBkZWZhdWx0V2Vla2RheXNSZWdleCA9IG1hdGNoV29yZDtcbmZ1bmN0aW9uIHdlZWtkYXlzUmVnZXggKGlzU3RyaWN0KSB7XG4gICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1JlZ2V4O1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1JlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzUmVnZXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXggJiYgaXNTdHJpY3QgP1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCA6IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgfVxufVxuXG52YXIgZGVmYXVsdFdlZWtkYXlzU2hvcnRSZWdleCA9IG1hdGNoV29yZDtcbmZ1bmN0aW9uIHdlZWtkYXlzU2hvcnRSZWdleCAoaXNTdHJpY3QpIHtcbiAgICBpZiAodGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0KSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgY29tcHV0ZVdlZWtkYXlzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNTaG9ydFJlZ2V4JykpIHtcbiAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleCA9IGRlZmF1bHRXZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXggOiB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXg7XG4gICAgfVxufVxuXG52YXIgZGVmYXVsdFdlZWtkYXlzTWluUmVnZXggPSBtYXRjaFdvcmQ7XG5mdW5jdGlvbiB3ZWVrZGF5c01pblJlZ2V4IChpc1N0cmljdCkge1xuICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNSZWdleCcpKSB7XG4gICAgICAgICAgICBjb21wdXRlV2Vla2RheXNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5SZWdleDtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzTWluUmVnZXgnKSkge1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5SZWdleCA9IGRlZmF1bHRXZWVrZGF5c01pblJlZ2V4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXggOiB0aGlzLl93ZWVrZGF5c01pblJlZ2V4O1xuICAgIH1cbn1cblxuXG5mdW5jdGlvbiBjb21wdXRlV2Vla2RheXNQYXJzZSAoKSB7XG4gICAgZnVuY3Rpb24gY21wTGVuUmV2KGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7XG4gICAgfVxuXG4gICAgdmFyIG1pblBpZWNlcyA9IFtdLCBzaG9ydFBpZWNlcyA9IFtdLCBsb25nUGllY2VzID0gW10sIG1peGVkUGllY2VzID0gW10sXG4gICAgICAgIGksIG1vbSwgbWlucCwgc2hvcnRwLCBsb25ncDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIDFdKS5kYXkoaSk7XG4gICAgICAgIG1pbnAgPSB0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpO1xuICAgICAgICBzaG9ydHAgPSB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJyk7XG4gICAgICAgIGxvbmdwID0gdGhpcy53ZWVrZGF5cyhtb20sICcnKTtcbiAgICAgICAgbWluUGllY2VzLnB1c2gobWlucCk7XG4gICAgICAgIHNob3J0UGllY2VzLnB1c2goc2hvcnRwKTtcbiAgICAgICAgbG9uZ1BpZWNlcy5wdXNoKGxvbmdwKTtcbiAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChtaW5wKTtcbiAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChzaG9ydHApO1xuICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKGxvbmdwKTtcbiAgICB9XG4gICAgLy8gU29ydGluZyBtYWtlcyBzdXJlIGlmIG9uZSB3ZWVrZGF5IChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyIGl0XG4gICAgLy8gd2lsbCBtYXRjaCB0aGUgbG9uZ2VyIHBpZWNlLlxuICAgIG1pblBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgc2hvcnRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgIGxvbmdQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgIG1peGVkUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgIHNob3J0UGllY2VzW2ldID0gcmVnZXhFc2NhcGUoc2hvcnRQaWVjZXNbaV0pO1xuICAgICAgICBsb25nUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobG9uZ1BpZWNlc1tpXSk7XG4gICAgICAgIG1peGVkUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobWl4ZWRQaWVjZXNbaV0pO1xuICAgIH1cblxuICAgIHRoaXMuX3dlZWtkYXlzUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaXhlZFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4ID0gdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICB0aGlzLl93ZWVrZGF5c01pblJlZ2V4ID0gdGhpcy5fd2Vla2RheXNSZWdleDtcblxuICAgIHRoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBsb25nUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBzaG9ydFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG1pblBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG59XG5cbi8vIEZPUk1BVFRJTkdcblxuZnVuY3Rpb24gaEZvcm1hdCgpIHtcbiAgICByZXR1cm4gdGhpcy5ob3VycygpICUgMTIgfHwgMTI7XG59XG5cbmZ1bmN0aW9uIGtGb3JtYXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaG91cnMoKSB8fCAyNDtcbn1cblxuYWRkRm9ybWF0VG9rZW4oJ0gnLCBbJ0hIJywgMl0sIDAsICdob3VyJyk7XG5hZGRGb3JtYXRUb2tlbignaCcsIFsnaGgnLCAyXSwgMCwgaEZvcm1hdCk7XG5hZGRGb3JtYXRUb2tlbignaycsIFsna2snLCAyXSwgMCwga0Zvcm1hdCk7XG5cbmFkZEZvcm1hdFRva2VuKCdobW0nLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICcnICsgaEZvcm1hdC5hcHBseSh0aGlzKSArIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKTtcbn0pO1xuXG5hZGRGb3JtYXRUb2tlbignaG1tc3MnLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICcnICsgaEZvcm1hdC5hcHBseSh0aGlzKSArIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKSArXG4gICAgICAgIHplcm9GaWxsKHRoaXMuc2Vjb25kcygpLCAyKTtcbn0pO1xuXG5hZGRGb3JtYXRUb2tlbignSG1tJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAnJyArIHRoaXMuaG91cnMoKSArIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKTtcbn0pO1xuXG5hZGRGb3JtYXRUb2tlbignSG1tc3MnLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICcnICsgdGhpcy5ob3VycygpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpICtcbiAgICAgICAgemVyb0ZpbGwodGhpcy5zZWNvbmRzKCksIDIpO1xufSk7XG5cbmZ1bmN0aW9uIG1lcmlkaWVtICh0b2tlbiwgbG93ZXJjYXNlKSB7XG4gICAgYWRkRm9ybWF0VG9rZW4odG9rZW4sIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1lcmlkaWVtKHRoaXMuaG91cnMoKSwgdGhpcy5taW51dGVzKCksIGxvd2VyY2FzZSk7XG4gICAgfSk7XG59XG5cbm1lcmlkaWVtKCdhJywgdHJ1ZSk7XG5tZXJpZGllbSgnQScsIGZhbHNlKTtcblxuLy8gQUxJQVNFU1xuXG5hZGRVbml0QWxpYXMoJ2hvdXInLCAnaCcpO1xuXG4vLyBQUklPUklUWVxuYWRkVW5pdFByaW9yaXR5KCdob3VyJywgMTMpO1xuXG4vLyBQQVJTSU5HXG5cbmZ1bmN0aW9uIG1hdGNoTWVyaWRpZW0gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICByZXR1cm4gbG9jYWxlLl9tZXJpZGllbVBhcnNlO1xufVxuXG5hZGRSZWdleFRva2VuKCdhJywgIG1hdGNoTWVyaWRpZW0pO1xuYWRkUmVnZXhUb2tlbignQScsICBtYXRjaE1lcmlkaWVtKTtcbmFkZFJlZ2V4VG9rZW4oJ0gnLCAgbWF0Y2gxdG8yKTtcbmFkZFJlZ2V4VG9rZW4oJ2gnLCAgbWF0Y2gxdG8yKTtcbmFkZFJlZ2V4VG9rZW4oJ2snLCAgbWF0Y2gxdG8yKTtcbmFkZFJlZ2V4VG9rZW4oJ0hIJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuYWRkUmVnZXhUb2tlbignaGgnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG5hZGRSZWdleFRva2VuKCdraycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcblxuYWRkUmVnZXhUb2tlbignaG1tJywgbWF0Y2gzdG80KTtcbmFkZFJlZ2V4VG9rZW4oJ2htbXNzJywgbWF0Y2g1dG82KTtcbmFkZFJlZ2V4VG9rZW4oJ0htbScsIG1hdGNoM3RvNCk7XG5hZGRSZWdleFRva2VuKCdIbW1zcycsIG1hdGNoNXRvNik7XG5cbmFkZFBhcnNlVG9rZW4oWydIJywgJ0hIJ10sIEhPVVIpO1xuYWRkUGFyc2VUb2tlbihbJ2snLCAna2snXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgdmFyIGtJbnB1dCA9IHRvSW50KGlucHV0KTtcbiAgICBhcnJheVtIT1VSXSA9IGtJbnB1dCA9PT0gMjQgPyAwIDoga0lucHV0O1xufSk7XG5hZGRQYXJzZVRva2VuKFsnYScsICdBJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgIGNvbmZpZy5faXNQbSA9IGNvbmZpZy5fbG9jYWxlLmlzUE0oaW5wdXQpO1xuICAgIGNvbmZpZy5fbWVyaWRpZW0gPSBpbnB1dDtcbn0pO1xuYWRkUGFyc2VUb2tlbihbJ2gnLCAnaGgnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dCk7XG4gICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHRydWU7XG59KTtcbmFkZFBhcnNlVG9rZW4oJ2htbScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgIHZhciBwb3MgPSBpbnB1dC5sZW5ndGggLSAyO1xuICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvcykpO1xuICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zKSk7XG4gICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHRydWU7XG59KTtcbmFkZFBhcnNlVG9rZW4oJ2htbXNzJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgdmFyIHBvczEgPSBpbnB1dC5sZW5ndGggLSA0O1xuICAgIHZhciBwb3MyID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0LnN1YnN0cigwLCBwb3MxKSk7XG4gICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MxLCAyKSk7XG4gICAgYXJyYXlbU0VDT05EXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MyKSk7XG4gICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHRydWU7XG59KTtcbmFkZFBhcnNlVG9rZW4oJ0htbScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgIHZhciBwb3MgPSBpbnB1dC5sZW5ndGggLSAyO1xuICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvcykpO1xuICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zKSk7XG59KTtcbmFkZFBhcnNlVG9rZW4oJ0htbXNzJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgdmFyIHBvczEgPSBpbnB1dC5sZW5ndGggLSA0O1xuICAgIHZhciBwb3MyID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICBhcnJheVtIT1VSXSA9IHRvSW50KGlucHV0LnN1YnN0cigwLCBwb3MxKSk7XG4gICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MxLCAyKSk7XG4gICAgYXJyYXlbU0VDT05EXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MyKSk7XG59KTtcblxuLy8gTE9DQUxFU1xuXG5mdW5jdGlvbiBsb2NhbGVJc1BNIChpbnB1dCkge1xuICAgIC8vIElFOCBRdWlya3MgTW9kZSAmIElFNyBTdGFuZGFyZHMgTW9kZSBkbyBub3QgYWxsb3cgYWNjZXNzaW5nIHN0cmluZ3MgbGlrZSBhcnJheXNcbiAgICAvLyBVc2luZyBjaGFyQXQgc2hvdWxkIGJlIG1vcmUgY29tcGF0aWJsZS5cbiAgICByZXR1cm4gKChpbnB1dCArICcnKS50b0xvd2VyQ2FzZSgpLmNoYXJBdCgwKSA9PT0gJ3AnKTtcbn1cblxudmFyIGRlZmF1bHRMb2NhbGVNZXJpZGllbVBhcnNlID0gL1thcF1cXC4/bT9cXC4/L2k7XG5mdW5jdGlvbiBsb2NhbGVNZXJpZGllbSAoaG91cnMsIG1pbnV0ZXMsIGlzTG93ZXIpIHtcbiAgICBpZiAoaG91cnMgPiAxMSkge1xuICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdwbScgOiAnUE0nO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpc0xvd2VyID8gJ2FtJyA6ICdBTSc7XG4gICAgfVxufVxuXG5cbi8vIE1PTUVOVFNcblxuLy8gU2V0dGluZyB0aGUgaG91ciBzaG91bGQga2VlcCB0aGUgdGltZSwgYmVjYXVzZSB0aGUgdXNlciBleHBsaWNpdGx5XG4vLyBzcGVjaWZpZWQgd2hpY2ggaG91ciBoZSB3YW50cy4gU28gdHJ5aW5nIHRvIG1haW50YWluIHRoZSBzYW1lIGhvdXIgKGluXG4vLyBhIG5ldyB0aW1lem9uZSkgbWFrZXMgc2Vuc2UuIEFkZGluZy9zdWJ0cmFjdGluZyBob3VycyBkb2VzIG5vdCBmb2xsb3dcbi8vIHRoaXMgcnVsZS5cbnZhciBnZXRTZXRIb3VyID0gbWFrZUdldFNldCgnSG91cnMnLCB0cnVlKTtcblxuLy8gbW9udGhzXG4vLyB3ZWVrXG4vLyB3ZWVrZGF5c1xuLy8gbWVyaWRpZW1cbnZhciBiYXNlQ29uZmlnID0ge1xuICAgIGNhbGVuZGFyOiBkZWZhdWx0Q2FsZW5kYXIsXG4gICAgbG9uZ0RhdGVGb3JtYXQ6IGRlZmF1bHRMb25nRGF0ZUZvcm1hdCxcbiAgICBpbnZhbGlkRGF0ZTogZGVmYXVsdEludmFsaWREYXRlLFxuICAgIG9yZGluYWw6IGRlZmF1bHRPcmRpbmFsLFxuICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IGRlZmF1bHREYXlPZk1vbnRoT3JkaW5hbFBhcnNlLFxuICAgIHJlbGF0aXZlVGltZTogZGVmYXVsdFJlbGF0aXZlVGltZSxcblxuICAgIG1vbnRoczogZGVmYXVsdExvY2FsZU1vbnRocyxcbiAgICBtb250aHNTaG9ydDogZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0LFxuXG4gICAgd2VlazogZGVmYXVsdExvY2FsZVdlZWssXG5cbiAgICB3ZWVrZGF5czogZGVmYXVsdExvY2FsZVdlZWtkYXlzLFxuICAgIHdlZWtkYXlzTWluOiBkZWZhdWx0TG9jYWxlV2Vla2RheXNNaW4sXG4gICAgd2Vla2RheXNTaG9ydDogZGVmYXVsdExvY2FsZVdlZWtkYXlzU2hvcnQsXG5cbiAgICBtZXJpZGllbVBhcnNlOiBkZWZhdWx0TG9jYWxlTWVyaWRpZW1QYXJzZVxufTtcblxuLy8gaW50ZXJuYWwgc3RvcmFnZSBmb3IgbG9jYWxlIGNvbmZpZyBmaWxlc1xudmFyIGxvY2FsZXMgPSB7fTtcbnZhciBsb2NhbGVGYW1pbGllcyA9IHt9O1xudmFyIGdsb2JhbExvY2FsZTtcblxuZnVuY3Rpb24gbm9ybWFsaXplTG9jYWxlKGtleSkge1xuICAgIHJldHVybiBrZXkgPyBrZXkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCdfJywgJy0nKSA6IGtleTtcbn1cblxuLy8gcGljayB0aGUgbG9jYWxlIGZyb20gdGhlIGFycmF5XG4vLyB0cnkgWydlbi1hdScsICdlbi1nYiddIGFzICdlbi1hdScsICdlbi1nYicsICdlbicsIGFzIGluIG1vdmUgdGhyb3VnaCB0aGUgbGlzdCB0cnlpbmcgZWFjaFxuLy8gc3Vic3RyaW5nIGZyb20gbW9zdCBzcGVjaWZpYyB0byBsZWFzdCwgYnV0IG1vdmUgdG8gdGhlIG5leHQgYXJyYXkgaXRlbSBpZiBpdCdzIGEgbW9yZSBzcGVjaWZpYyB2YXJpYW50IHRoYW4gdGhlIGN1cnJlbnQgcm9vdFxuZnVuY3Rpb24gY2hvb3NlTG9jYWxlKG5hbWVzKSB7XG4gICAgdmFyIGkgPSAwLCBqLCBuZXh0LCBsb2NhbGUsIHNwbGl0O1xuXG4gICAgd2hpbGUgKGkgPCBuYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgc3BsaXQgPSBub3JtYWxpemVMb2NhbGUobmFtZXNbaV0pLnNwbGl0KCctJyk7XG4gICAgICAgIGogPSBzcGxpdC5sZW5ndGg7XG4gICAgICAgIG5leHQgPSBub3JtYWxpemVMb2NhbGUobmFtZXNbaSArIDFdKTtcbiAgICAgICAgbmV4dCA9IG5leHQgPyBuZXh0LnNwbGl0KCctJykgOiBudWxsO1xuICAgICAgICB3aGlsZSAoaiA+IDApIHtcbiAgICAgICAgICAgIGxvY2FsZSA9IGxvYWRMb2NhbGUoc3BsaXQuc2xpY2UoMCwgaikuam9pbignLScpKTtcbiAgICAgICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5leHQgJiYgbmV4dC5sZW5ndGggPj0gaiAmJiBjb21wYXJlQXJyYXlzKHNwbGl0LCBuZXh0LCB0cnVlKSA+PSBqIC0gMSkge1xuICAgICAgICAgICAgICAgIC8vdGhlIG5leHQgYXJyYXkgaXRlbSBpcyBiZXR0ZXIgdGhhbiBhIHNoYWxsb3dlciBzdWJzdHJpbmcgb2YgdGhpcyBvbmVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGotLTtcbiAgICAgICAgfVxuICAgICAgICBpKys7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBsb2FkTG9jYWxlKG5hbWUpIHtcbiAgICB2YXIgb2xkTG9jYWxlID0gbnVsbDtcbiAgICAvLyBUT0RPOiBGaW5kIGEgYmV0dGVyIHdheSB0byByZWdpc3RlciBhbmQgbG9hZCBhbGwgdGhlIGxvY2FsZXMgaW4gTm9kZVxuICAgIGlmICghbG9jYWxlc1tuYW1lXSAmJiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICBtb2R1bGUgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG9sZExvY2FsZSA9IGdsb2JhbExvY2FsZS5fYWJicjtcbiAgICAgICAgICAgIHJlcXVpcmUoJy4vbG9jYWxlLycgKyBuYW1lKTtcbiAgICAgICAgICAgIC8vIGJlY2F1c2UgZGVmaW5lTG9jYWxlIGN1cnJlbnRseSBhbHNvIHNldHMgdGhlIGdsb2JhbCBsb2NhbGUsIHdlXG4gICAgICAgICAgICAvLyB3YW50IHRvIHVuZG8gdGhhdCBmb3IgbGF6eSBsb2FkZWQgbG9jYWxlc1xuICAgICAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlKG9sZExvY2FsZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgIH1cbiAgICByZXR1cm4gbG9jYWxlc1tuYW1lXTtcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGxvYWQgbG9jYWxlIGFuZCB0aGVuIHNldCB0aGUgZ2xvYmFsIGxvY2FsZS4gIElmXG4vLyBubyBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbiwgaXQgd2lsbCBzaW1wbHkgcmV0dXJuIHRoZSBjdXJyZW50IGdsb2JhbFxuLy8gbG9jYWxlIGtleS5cbmZ1bmN0aW9uIGdldFNldEdsb2JhbExvY2FsZSAoa2V5LCB2YWx1ZXMpIHtcbiAgICB2YXIgZGF0YTtcbiAgICBpZiAoa2V5KSB7XG4gICAgICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZXMpKSB7XG4gICAgICAgICAgICBkYXRhID0gZ2V0TG9jYWxlKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkYXRhID0gZGVmaW5lTG9jYWxlKGtleSwgdmFsdWVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAvLyBtb21lbnQuZHVyYXRpb24uX2xvY2FsZSA9IG1vbWVudC5fbG9jYWxlID0gZGF0YTtcbiAgICAgICAgICAgIGdsb2JhbExvY2FsZSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZ2xvYmFsTG9jYWxlLl9hYmJyO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVMb2NhbGUgKG5hbWUsIGNvbmZpZykge1xuICAgIGlmIChjb25maWcgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHBhcmVudENvbmZpZyA9IGJhc2VDb25maWc7XG4gICAgICAgIGNvbmZpZy5hYmJyID0gbmFtZTtcbiAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgZGVwcmVjYXRlU2ltcGxlKCdkZWZpbmVMb2NhbGVPdmVycmlkZScsXG4gICAgICAgICAgICAgICAgICAgICd1c2UgbW9tZW50LnVwZGF0ZUxvY2FsZShsb2NhbGVOYW1lLCBjb25maWcpIHRvIGNoYW5nZSAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2FuIGV4aXN0aW5nIGxvY2FsZS4gbW9tZW50LmRlZmluZUxvY2FsZShsb2NhbGVOYW1lLCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZykgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgY3JlYXRpbmcgYSBuZXcgbG9jYWxlICcgK1xuICAgICAgICAgICAgICAgICAgICAnU2VlIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvZGVmaW5lLWxvY2FsZS8gZm9yIG1vcmUgaW5mby4nKTtcbiAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGxvY2FsZXNbbmFtZV0uX2NvbmZpZztcbiAgICAgICAgfSBlbHNlIGlmIChjb25maWcucGFyZW50TG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbGVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdLl9jb25maWc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0gPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZzogY29uZmlnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbG9jYWxlc1tuYW1lXSA9IG5ldyBMb2NhbGUobWVyZ2VDb25maWdzKHBhcmVudENvbmZpZywgY29uZmlnKSk7XG5cbiAgICAgICAgaWYgKGxvY2FsZUZhbWlsaWVzW25hbWVdKSB7XG4gICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgZGVmaW5lTG9jYWxlKHgubmFtZSwgeC5jb25maWcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBiYWNrd2FyZHMgY29tcGF0IGZvciBub3c6IGFsc28gc2V0IHRoZSBsb2NhbGVcbiAgICAgICAgLy8gbWFrZSBzdXJlIHdlIHNldCB0aGUgbG9jYWxlIEFGVEVSIGFsbCBjaGlsZCBsb2NhbGVzIGhhdmUgYmVlblxuICAgICAgICAvLyBjcmVhdGVkLCBzbyB3ZSB3b24ndCBlbmQgdXAgd2l0aCB0aGUgY2hpbGQgbG9jYWxlIHNldC5cbiAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlKG5hbWUpO1xuXG5cbiAgICAgICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdXNlZnVsIGZvciB0ZXN0aW5nXG4gICAgICAgIGRlbGV0ZSBsb2NhbGVzW25hbWVdO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUxvY2FsZShuYW1lLCBjb25maWcpIHtcbiAgICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgdmFyIGxvY2FsZSwgcGFyZW50Q29uZmlnID0gYmFzZUNvbmZpZztcbiAgICAgICAgLy8gTUVSR0VcbiAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gbG9jYWxlc1tuYW1lXS5fY29uZmlnO1xuICAgICAgICB9XG4gICAgICAgIGNvbmZpZyA9IG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNvbmZpZyk7XG4gICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoY29uZmlnKTtcbiAgICAgICAgbG9jYWxlLnBhcmVudExvY2FsZSA9IGxvY2FsZXNbbmFtZV07XG4gICAgICAgIGxvY2FsZXNbbmFtZV0gPSBsb2NhbGU7XG5cbiAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3Igbm93OiBhbHNvIHNldCB0aGUgbG9jYWxlXG4gICAgICAgIGdldFNldEdsb2JhbExvY2FsZShuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBwYXNzIG51bGwgZm9yIGNvbmZpZyB0byB1bnVwZGF0ZSwgdXNlZnVsIGZvciB0ZXN0c1xuICAgICAgICBpZiAobG9jYWxlc1tuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxlc1tuYW1lXS5wYXJlbnRMb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWxlc1tuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGxvY2FsZXNbbmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG59XG5cbi8vIHJldHVybnMgbG9jYWxlIGRhdGFcbmZ1bmN0aW9uIGdldExvY2FsZSAoa2V5KSB7XG4gICAgdmFyIGxvY2FsZTtcblxuICAgIGlmIChrZXkgJiYga2V5Ll9sb2NhbGUgJiYga2V5Ll9sb2NhbGUuX2FiYnIpIHtcbiAgICAgICAga2V5ID0ga2V5Ll9sb2NhbGUuX2FiYnI7XG4gICAgfVxuXG4gICAgaWYgKCFrZXkpIHtcbiAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzQXJyYXkoa2V5KSkge1xuICAgICAgICAvL3Nob3J0LWNpcmN1aXQgZXZlcnl0aGluZyBlbHNlXG4gICAgICAgIGxvY2FsZSA9IGxvYWRMb2NhbGUoa2V5KTtcbiAgICAgICAgaWYgKGxvY2FsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcbiAgICAgICAgfVxuICAgICAgICBrZXkgPSBba2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hvb3NlTG9jYWxlKGtleSk7XG59XG5cbmZ1bmN0aW9uIGxpc3RMb2NhbGVzKCkge1xuICAgIHJldHVybiBrZXlzJDEobG9jYWxlcyk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrT3ZlcmZsb3cgKG0pIHtcbiAgICB2YXIgb3ZlcmZsb3c7XG4gICAgdmFyIGEgPSBtLl9hO1xuXG4gICAgaWYgKGEgJiYgZ2V0UGFyc2luZ0ZsYWdzKG0pLm92ZXJmbG93ID09PSAtMikge1xuICAgICAgICBvdmVyZmxvdyA9XG4gICAgICAgICAgICBhW01PTlRIXSAgICAgICA8IDAgfHwgYVtNT05USF0gICAgICAgPiAxMSAgPyBNT05USCA6XG4gICAgICAgICAgICBhW0RBVEVdICAgICAgICA8IDEgfHwgYVtEQVRFXSAgICAgICAgPiBkYXlzSW5Nb250aChhW1lFQVJdLCBhW01PTlRIXSkgPyBEQVRFIDpcbiAgICAgICAgICAgIGFbSE9VUl0gICAgICAgIDwgMCB8fCBhW0hPVVJdICAgICAgICA+IDI0IHx8IChhW0hPVVJdID09PSAyNCAmJiAoYVtNSU5VVEVdICE9PSAwIHx8IGFbU0VDT05EXSAhPT0gMCB8fCBhW01JTExJU0VDT05EXSAhPT0gMCkpID8gSE9VUiA6XG4gICAgICAgICAgICBhW01JTlVURV0gICAgICA8IDAgfHwgYVtNSU5VVEVdICAgICAgPiA1OSAgPyBNSU5VVEUgOlxuICAgICAgICAgICAgYVtTRUNPTkRdICAgICAgPCAwIHx8IGFbU0VDT05EXSAgICAgID4gNTkgID8gU0VDT05EIDpcbiAgICAgICAgICAgIGFbTUlMTElTRUNPTkRdIDwgMCB8fCBhW01JTExJU0VDT05EXSA+IDk5OSA/IE1JTExJU0VDT05EIDpcbiAgICAgICAgICAgIC0xO1xuXG4gICAgICAgIGlmIChnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93RGF5T2ZZZWFyICYmIChvdmVyZmxvdyA8IFlFQVIgfHwgb3ZlcmZsb3cgPiBEQVRFKSkge1xuICAgICAgICAgICAgb3ZlcmZsb3cgPSBEQVRFO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93V2Vla3MgJiYgb3ZlcmZsb3cgPT09IC0xKSB7XG4gICAgICAgICAgICBvdmVyZmxvdyA9IFdFRUs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdldFBhcnNpbmdGbGFncyhtKS5fb3ZlcmZsb3dXZWVrZGF5ICYmIG92ZXJmbG93ID09PSAtMSkge1xuICAgICAgICAgICAgb3ZlcmZsb3cgPSBXRUVLREFZO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKG0pLm92ZXJmbG93ID0gb3ZlcmZsb3c7XG4gICAgfVxuXG4gICAgcmV0dXJuIG07XG59XG5cbi8vIGlzbyA4NjAxIHJlZ2V4XG4vLyAwMDAwLTAwLTAwIDAwMDAtVzAwIG9yIDAwMDAtVzAwLTAgKyBUICsgMDAgb3IgMDA6MDAgb3IgMDA6MDA6MDAgb3IgMDA6MDA6MDAuMDAwICsgKzAwOjAwIG9yICswMDAwIG9yICswMClcbnZhciBleHRlbmRlZElzb1JlZ2V4ID0gL15cXHMqKCg/OlsrLV1cXGR7Nn18XFxkezR9KS0oPzpcXGRcXGQtXFxkXFxkfFdcXGRcXGQtXFxkfFdcXGRcXGR8XFxkXFxkXFxkfFxcZFxcZCkpKD86KFR8ICkoXFxkXFxkKD86OlxcZFxcZCg/OjpcXGRcXGQoPzpbLixdXFxkKyk/KT8pPykoW1xcK1xcLV1cXGRcXGQoPzo6P1xcZFxcZCk/fFxccypaKT8pPyQvO1xudmFyIGJhc2ljSXNvUmVnZXggPSAvXlxccyooKD86WystXVxcZHs2fXxcXGR7NH0pKD86XFxkXFxkXFxkXFxkfFdcXGRcXGRcXGR8V1xcZFxcZHxcXGRcXGRcXGR8XFxkXFxkKSkoPzooVHwgKShcXGRcXGQoPzpcXGRcXGQoPzpcXGRcXGQoPzpbLixdXFxkKyk/KT8pPykoW1xcK1xcLV1cXGRcXGQoPzo6P1xcZFxcZCk/fFxccypaKT8pPyQvO1xuXG52YXIgdHpSZWdleCA9IC9afFsrLV1cXGRcXGQoPzo6P1xcZFxcZCk/LztcblxudmFyIGlzb0RhdGVzID0gW1xuICAgIFsnWVlZWVlZLU1NLUREJywgL1srLV1cXGR7Nn0tXFxkXFxkLVxcZFxcZC9dLFxuICAgIFsnWVlZWS1NTS1ERCcsIC9cXGR7NH0tXFxkXFxkLVxcZFxcZC9dLFxuICAgIFsnR0dHRy1bV11XVy1FJywgL1xcZHs0fS1XXFxkXFxkLVxcZC9dLFxuICAgIFsnR0dHRy1bV11XVycsIC9cXGR7NH0tV1xcZFxcZC8sIGZhbHNlXSxcbiAgICBbJ1lZWVktREREJywgL1xcZHs0fS1cXGR7M30vXSxcbiAgICBbJ1lZWVktTU0nLCAvXFxkezR9LVxcZFxcZC8sIGZhbHNlXSxcbiAgICBbJ1lZWVlZWU1NREQnLCAvWystXVxcZHsxMH0vXSxcbiAgICBbJ1lZWVlNTUREJywgL1xcZHs4fS9dLFxuICAgIC8vIFlZWVlNTSBpcyBOT1QgYWxsb3dlZCBieSB0aGUgc3RhbmRhcmRcbiAgICBbJ0dHR0dbV11XV0UnLCAvXFxkezR9V1xcZHszfS9dLFxuICAgIFsnR0dHR1tXXVdXJywgL1xcZHs0fVdcXGR7Mn0vLCBmYWxzZV0sXG4gICAgWydZWVlZREREJywgL1xcZHs3fS9dXG5dO1xuXG4vLyBpc28gdGltZSBmb3JtYXRzIGFuZCByZWdleGVzXG52YXIgaXNvVGltZXMgPSBbXG4gICAgWydISDptbTpzcy5TU1NTJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkXFwuXFxkKy9dLFxuICAgIFsnSEg6bW06c3MsU1NTUycsIC9cXGRcXGQ6XFxkXFxkOlxcZFxcZCxcXGQrL10sXG4gICAgWydISDptbTpzcycsIC9cXGRcXGQ6XFxkXFxkOlxcZFxcZC9dLFxuICAgIFsnSEg6bW0nLCAvXFxkXFxkOlxcZFxcZC9dLFxuICAgIFsnSEhtbXNzLlNTU1MnLCAvXFxkXFxkXFxkXFxkXFxkXFxkXFwuXFxkKy9dLFxuICAgIFsnSEhtbXNzLFNTU1MnLCAvXFxkXFxkXFxkXFxkXFxkXFxkLFxcZCsvXSxcbiAgICBbJ0hIbW1zcycsIC9cXGRcXGRcXGRcXGRcXGRcXGQvXSxcbiAgICBbJ0hIbW0nLCAvXFxkXFxkXFxkXFxkL10sXG4gICAgWydISCcsIC9cXGRcXGQvXVxuXTtcblxudmFyIGFzcE5ldEpzb25SZWdleCA9IC9eXFwvP0RhdGVcXCgoXFwtP1xcZCspL2k7XG5cbi8vIGRhdGUgZnJvbSBpc28gZm9ybWF0XG5mdW5jdGlvbiBjb25maWdGcm9tSVNPKGNvbmZpZykge1xuICAgIHZhciBpLCBsLFxuICAgICAgICBzdHJpbmcgPSBjb25maWcuX2ksXG4gICAgICAgIG1hdGNoID0gZXh0ZW5kZWRJc29SZWdleC5leGVjKHN0cmluZykgfHwgYmFzaWNJc29SZWdleC5leGVjKHN0cmluZyksXG4gICAgICAgIGFsbG93VGltZSwgZGF0ZUZvcm1hdCwgdGltZUZvcm1hdCwgdHpGb3JtYXQ7XG5cbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaXNvID0gdHJ1ZTtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsID0gaXNvRGF0ZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaXNvRGF0ZXNbaV1bMV0uZXhlYyhtYXRjaFsxXSkpIHtcbiAgICAgICAgICAgICAgICBkYXRlRm9ybWF0ID0gaXNvRGF0ZXNbaV1bMF07XG4gICAgICAgICAgICAgICAgYWxsb3dUaW1lID0gaXNvRGF0ZXNbaV1bMl0gIT09IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRlRm9ybWF0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaFszXSkge1xuICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGlzb1RpbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpc29UaW1lc1tpXVsxXS5leGVjKG1hdGNoWzNdKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaFsyXSBzaG91bGQgYmUgJ1QnIG9yIHNwYWNlXG4gICAgICAgICAgICAgICAgICAgIHRpbWVGb3JtYXQgPSAobWF0Y2hbMl0gfHwgJyAnKSArIGlzb1RpbWVzW2ldWzBdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGltZUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghYWxsb3dUaW1lICYmIHRpbWVGb3JtYXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hdGNoWzRdKSB7XG4gICAgICAgICAgICBpZiAodHpSZWdleC5leGVjKG1hdGNoWzRdKSkge1xuICAgICAgICAgICAgICAgIHR6Rm9ybWF0ID0gJ1onO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uZmlnLl9mID0gZGF0ZUZvcm1hdCArICh0aW1lRm9ybWF0IHx8ICcnKSArICh0ekZvcm1hdCB8fCAnJyk7XG4gICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICB9XG59XG5cbi8vIFJGQyAyODIyIHJlZ2V4OiBGb3IgZGV0YWlscyBzZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzI4MjIjc2VjdGlvbi0zLjNcbnZhciBiYXNpY1JmY1JlZ2V4ID0gL14oKD86TW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSw/XFxzKT8oXFxkP1xcZFxccyg/OkphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxccyg/OlxcZFxcZCk/XFxkXFxkXFxzKShcXGRcXGQ6XFxkXFxkKShcXDpcXGRcXGQpPyhcXHMoPzpVVHxHTVR8W0VDTVBdW1NEXVR8W0EtSUstWmEtaWstel18WystXVxcZHs0fSkpJC87XG5cbi8vIGRhdGUgYW5kIHRpbWUgZnJvbSByZWYgMjgyMiBmb3JtYXRcbmZ1bmN0aW9uIGNvbmZpZ0Zyb21SRkMyODIyKGNvbmZpZykge1xuICAgIHZhciBzdHJpbmcsIG1hdGNoLCBkYXlGb3JtYXQsXG4gICAgICAgIGRhdGVGb3JtYXQsIHRpbWVGb3JtYXQsIHR6Rm9ybWF0O1xuICAgIHZhciB0aW1lem9uZXMgPSB7XG4gICAgICAgICcgR01UJzogJyArMDAwMCcsXG4gICAgICAgICcgRURUJzogJyAtMDQwMCcsXG4gICAgICAgICcgRVNUJzogJyAtMDUwMCcsXG4gICAgICAgICcgQ0RUJzogJyAtMDUwMCcsXG4gICAgICAgICcgQ1NUJzogJyAtMDYwMCcsXG4gICAgICAgICcgTURUJzogJyAtMDYwMCcsXG4gICAgICAgICcgTVNUJzogJyAtMDcwMCcsXG4gICAgICAgICcgUERUJzogJyAtMDcwMCcsXG4gICAgICAgICcgUFNUJzogJyAtMDgwMCdcbiAgICB9O1xuICAgIHZhciBtaWxpdGFyeSA9ICdZWFdWVVRTUlFQT05aQUJDREVGR0hJS0xNJztcbiAgICB2YXIgdGltZXpvbmUsIHRpbWV6b25lSW5kZXg7XG5cbiAgICBzdHJpbmcgPSBjb25maWcuX2lcbiAgICAgICAgLnJlcGxhY2UoL1xcKFteXFwpXSpcXCl8W1xcblxcdF0vZywgJyAnKSAvLyBSZW1vdmUgY29tbWVudHMgYW5kIGZvbGRpbmcgd2hpdGVzcGFjZVxuICAgICAgICAucmVwbGFjZSgvKFxcc1xccyspL2csICcgJykgLy8gUmVwbGFjZSBtdWx0aXBsZS1zcGFjZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuICAgICAgICAucmVwbGFjZSgvXlxcc3xcXHMkL2csICcnKTsgLy8gUmVtb3ZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlc1xuICAgIG1hdGNoID0gYmFzaWNSZmNSZWdleC5leGVjKHN0cmluZyk7XG5cbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgZGF5Rm9ybWF0ID0gbWF0Y2hbMV0gPyAnZGRkJyArICgobWF0Y2hbMV0ubGVuZ3RoID09PSA1KSA/ICcsICcgOiAnICcpIDogJyc7XG4gICAgICAgIGRhdGVGb3JtYXQgPSAnRCBNTU0gJyArICgobWF0Y2hbMl0ubGVuZ3RoID4gMTApID8gJ1lZWVkgJyA6ICdZWSAnKTtcbiAgICAgICAgdGltZUZvcm1hdCA9ICdISDptbScgKyAobWF0Y2hbNF0gPyAnOnNzJyA6ICcnKTtcblxuICAgICAgICAvLyBUT0RPOiBSZXBsYWNlIHRoZSB2YW5pbGxhIEpTIERhdGUgb2JqZWN0IHdpdGggYW4gaW5kZXBlbnRlbnQgZGF5LW9mLXdlZWsgY2hlY2suXG4gICAgICAgIGlmIChtYXRjaFsxXSkgeyAvLyBkYXkgb2Ygd2VlayBnaXZlblxuICAgICAgICAgICAgdmFyIG1vbWVudERhdGUgPSBuZXcgRGF0ZShtYXRjaFsyXSk7XG4gICAgICAgICAgICB2YXIgbW9tZW50RGF5ID0gWydTdW4nLCdNb24nLCdUdWUnLCdXZWQnLCdUaHUnLCdGcmknLCdTYXQnXVttb21lbnREYXRlLmdldERheSgpXTtcblxuICAgICAgICAgICAgaWYgKG1hdGNoWzFdLnN1YnN0cigwLDMpICE9PSBtb21lbnREYXkpIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS53ZWVrZGF5TWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAobWF0Y2hbNV0ubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDI6IC8vIG1pbGl0YXJ5XG4gICAgICAgICAgICAgICAgaWYgKHRpbWV6b25lSW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGltZXpvbmUgPSAnICswMDAwJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aW1lem9uZUluZGV4ID0gbWlsaXRhcnkuaW5kZXhPZihtYXRjaFs1XVsxXS50b1VwcGVyQ2FzZSgpKSAtIDEyO1xuICAgICAgICAgICAgICAgICAgICB0aW1lem9uZSA9ICgodGltZXpvbmVJbmRleCA8IDApID8gJyAtJyA6ICcgKycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICgoJycgKyB0aW1lem9uZUluZGV4KS5yZXBsYWNlKC9eLT8vLCAnMCcpKS5tYXRjaCgvLi4kLylbMF0gKyAnMDAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNDogLy8gWm9uZVxuICAgICAgICAgICAgICAgIHRpbWV6b25lID0gdGltZXpvbmVzW21hdGNoWzVdXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6IC8vIFVUIG9yICsvLTk5OTlcbiAgICAgICAgICAgICAgICB0aW1lem9uZSA9IHRpbWV6b25lc1snIEdNVCddO1xuICAgICAgICB9XG4gICAgICAgIG1hdGNoWzVdID0gdGltZXpvbmU7XG4gICAgICAgIGNvbmZpZy5faSA9IG1hdGNoLnNwbGljZSgxKS5qb2luKCcnKTtcbiAgICAgICAgdHpGb3JtYXQgPSAnIFpaJztcbiAgICAgICAgY29uZmlnLl9mID0gZGF5Rm9ybWF0ICsgZGF0ZUZvcm1hdCArIHRpbWVGb3JtYXQgKyB0ekZvcm1hdDtcbiAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5yZmMyODIyID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICB9XG59XG5cbi8vIGRhdGUgZnJvbSBpc28gZm9ybWF0IG9yIGZhbGxiYWNrXG5mdW5jdGlvbiBjb25maWdGcm9tU3RyaW5nKGNvbmZpZykge1xuICAgIHZhciBtYXRjaGVkID0gYXNwTmV0SnNvblJlZ2V4LmV4ZWMoY29uZmlnLl9pKTtcblxuICAgIGlmIChtYXRjaGVkICE9PSBudWxsKSB7XG4gICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKCttYXRjaGVkWzFdKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbmZpZ0Zyb21JU08oY29uZmlnKTtcbiAgICBpZiAoY29uZmlnLl9pc1ZhbGlkID09PSBmYWxzZSkge1xuICAgICAgICBkZWxldGUgY29uZmlnLl9pc1ZhbGlkO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25maWdGcm9tUkZDMjgyMihjb25maWcpO1xuICAgIGlmIChjb25maWcuX2lzVmFsaWQgPT09IGZhbHNlKSB7XG4gICAgICAgIGRlbGV0ZSBjb25maWcuX2lzVmFsaWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZpbmFsIGF0dGVtcHQsIHVzZSBJbnB1dCBGYWxsYmFja1xuICAgIGhvb2tzLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrKGNvbmZpZyk7XG59XG5cbmhvb2tzLmNyZWF0ZUZyb21JbnB1dEZhbGxiYWNrID0gZGVwcmVjYXRlKFxuICAgICd2YWx1ZSBwcm92aWRlZCBpcyBub3QgaW4gYSByZWNvZ25pemVkIFJGQzI4MjIgb3IgSVNPIGZvcm1hdC4gbW9tZW50IGNvbnN0cnVjdGlvbiBmYWxscyBiYWNrIHRvIGpzIERhdGUoKSwgJyArXG4gICAgJ3doaWNoIGlzIG5vdCByZWxpYWJsZSBhY3Jvc3MgYWxsIGJyb3dzZXJzIGFuZCB2ZXJzaW9ucy4gTm9uIFJGQzI4MjIvSVNPIGRhdGUgZm9ybWF0cyBhcmUgJyArXG4gICAgJ2Rpc2NvdXJhZ2VkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYW4gdXBjb21pbmcgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHJlZmVyIHRvICcgK1xuICAgICdodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2pzLWRhdGUvIGZvciBtb3JlIGluZm8uJyxcbiAgICBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGNvbmZpZy5faSArIChjb25maWcuX3VzZVVUQyA/ICcgVVRDJyA6ICcnKSk7XG4gICAgfVxuKTtcblxuLy8gUGljayB0aGUgZmlyc3QgZGVmaW5lZCBvZiB0d28gb3IgdGhyZWUgYXJndW1lbnRzLlxuZnVuY3Rpb24gZGVmYXVsdHMoYSwgYiwgYykge1xuICAgIGlmIChhICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfVxuICAgIGlmIChiICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGI7XG4gICAgfVxuICAgIHJldHVybiBjO1xufVxuXG5mdW5jdGlvbiBjdXJyZW50RGF0ZUFycmF5KGNvbmZpZykge1xuICAgIC8vIGhvb2tzIGlzIGFjdHVhbGx5IHRoZSBleHBvcnRlZCBtb21lbnQgb2JqZWN0XG4gICAgdmFyIG5vd1ZhbHVlID0gbmV3IERhdGUoaG9va3Mubm93KCkpO1xuICAgIGlmIChjb25maWcuX3VzZVVUQykge1xuICAgICAgICByZXR1cm4gW25vd1ZhbHVlLmdldFVUQ0Z1bGxZZWFyKCksIG5vd1ZhbHVlLmdldFVUQ01vbnRoKCksIG5vd1ZhbHVlLmdldFVUQ0RhdGUoKV07XG4gICAgfVxuICAgIHJldHVybiBbbm93VmFsdWUuZ2V0RnVsbFllYXIoKSwgbm93VmFsdWUuZ2V0TW9udGgoKSwgbm93VmFsdWUuZ2V0RGF0ZSgpXTtcbn1cblxuLy8gY29udmVydCBhbiBhcnJheSB0byBhIGRhdGUuXG4vLyB0aGUgYXJyYXkgc2hvdWxkIG1pcnJvciB0aGUgcGFyYW1ldGVycyBiZWxvd1xuLy8gbm90ZTogYWxsIHZhbHVlcyBwYXN0IHRoZSB5ZWFyIGFyZSBvcHRpb25hbCBhbmQgd2lsbCBkZWZhdWx0IHRvIHRoZSBsb3dlc3QgcG9zc2libGUgdmFsdWUuXG4vLyBbeWVhciwgbW9udGgsIGRheSAsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZF1cbmZ1bmN0aW9uIGNvbmZpZ0Zyb21BcnJheSAoY29uZmlnKSB7XG4gICAgdmFyIGksIGRhdGUsIGlucHV0ID0gW10sIGN1cnJlbnREYXRlLCB5ZWFyVG9Vc2U7XG5cbiAgICBpZiAoY29uZmlnLl9kKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlQXJyYXkoY29uZmlnKTtcblxuICAgIC8vY29tcHV0ZSBkYXkgb2YgdGhlIHllYXIgZnJvbSB3ZWVrcyBhbmQgd2Vla2RheXNcbiAgICBpZiAoY29uZmlnLl93ICYmIGNvbmZpZy5fYVtEQVRFXSA9PSBudWxsICYmIGNvbmZpZy5fYVtNT05USF0gPT0gbnVsbCkge1xuICAgICAgICBkYXlPZlllYXJGcm9tV2Vla0luZm8oY29uZmlnKTtcbiAgICB9XG5cbiAgICAvL2lmIHRoZSBkYXkgb2YgdGhlIHllYXIgaXMgc2V0LCBmaWd1cmUgb3V0IHdoYXQgaXQgaXNcbiAgICBpZiAoY29uZmlnLl9kYXlPZlllYXIgIT0gbnVsbCkge1xuICAgICAgICB5ZWFyVG9Vc2UgPSBkZWZhdWx0cyhjb25maWcuX2FbWUVBUl0sIGN1cnJlbnREYXRlW1lFQVJdKTtcblxuICAgICAgICBpZiAoY29uZmlnLl9kYXlPZlllYXIgPiBkYXlzSW5ZZWFyKHllYXJUb1VzZSkgfHwgY29uZmlnLl9kYXlPZlllYXIgPT09IDApIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLl9vdmVyZmxvd0RheU9mWWVhciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRlID0gY3JlYXRlVVRDRGF0ZSh5ZWFyVG9Vc2UsIDAsIGNvbmZpZy5fZGF5T2ZZZWFyKTtcbiAgICAgICAgY29uZmlnLl9hW01PTlRIXSA9IGRhdGUuZ2V0VVRDTW9udGgoKTtcbiAgICAgICAgY29uZmlnLl9hW0RBVEVdID0gZGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCB0byBjdXJyZW50IGRhdGUuXG4gICAgLy8gKiBpZiBubyB5ZWFyLCBtb250aCwgZGF5IG9mIG1vbnRoIGFyZSBnaXZlbiwgZGVmYXVsdCB0byB0b2RheVxuICAgIC8vICogaWYgZGF5IG9mIG1vbnRoIGlzIGdpdmVuLCBkZWZhdWx0IG1vbnRoIGFuZCB5ZWFyXG4gICAgLy8gKiBpZiBtb250aCBpcyBnaXZlbiwgZGVmYXVsdCBvbmx5IHllYXJcbiAgICAvLyAqIGlmIHllYXIgaXMgZ2l2ZW4sIGRvbid0IGRlZmF1bHQgYW55dGhpbmdcbiAgICBmb3IgKGkgPSAwOyBpIDwgMyAmJiBjb25maWcuX2FbaV0gPT0gbnVsbDsgKytpKSB7XG4gICAgICAgIGNvbmZpZy5fYVtpXSA9IGlucHV0W2ldID0gY3VycmVudERhdGVbaV07XG4gICAgfVxuXG4gICAgLy8gWmVybyBvdXQgd2hhdGV2ZXIgd2FzIG5vdCBkZWZhdWx0ZWQsIGluY2x1ZGluZyB0aW1lXG4gICAgZm9yICg7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgY29uZmlnLl9hW2ldID0gaW5wdXRbaV0gPSAoY29uZmlnLl9hW2ldID09IG51bGwpID8gKGkgPT09IDIgPyAxIDogMCkgOiBjb25maWcuX2FbaV07XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIDI0OjAwOjAwLjAwMFxuICAgIGlmIChjb25maWcuX2FbSE9VUl0gPT09IDI0ICYmXG4gICAgICAgICAgICBjb25maWcuX2FbTUlOVVRFXSA9PT0gMCAmJlxuICAgICAgICAgICAgY29uZmlnLl9hW1NFQ09ORF0gPT09IDAgJiZcbiAgICAgICAgICAgIGNvbmZpZy5fYVtNSUxMSVNFQ09ORF0gPT09IDApIHtcbiAgICAgICAgY29uZmlnLl9uZXh0RGF5ID0gdHJ1ZTtcbiAgICAgICAgY29uZmlnLl9hW0hPVVJdID0gMDtcbiAgICB9XG5cbiAgICBjb25maWcuX2QgPSAoY29uZmlnLl91c2VVVEMgPyBjcmVhdGVVVENEYXRlIDogY3JlYXRlRGF0ZSkuYXBwbHkobnVsbCwgaW5wdXQpO1xuICAgIC8vIEFwcGx5IHRpbWV6b25lIG9mZnNldCBmcm9tIGlucHV0LiBUaGUgYWN0dWFsIHV0Y09mZnNldCBjYW4gYmUgY2hhbmdlZFxuICAgIC8vIHdpdGggcGFyc2Vab25lLlxuICAgIGlmIChjb25maWcuX3R6bSAhPSBudWxsKSB7XG4gICAgICAgIGNvbmZpZy5fZC5zZXRVVENNaW51dGVzKGNvbmZpZy5fZC5nZXRVVENNaW51dGVzKCkgLSBjb25maWcuX3R6bSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5fbmV4dERheSkge1xuICAgICAgICBjb25maWcuX2FbSE9VUl0gPSAyNDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRheU9mWWVhckZyb21XZWVrSW5mbyhjb25maWcpIHtcbiAgICB2YXIgdywgd2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95LCB0ZW1wLCB3ZWVrZGF5T3ZlcmZsb3c7XG5cbiAgICB3ID0gY29uZmlnLl93O1xuICAgIGlmICh3LkdHICE9IG51bGwgfHwgdy5XICE9IG51bGwgfHwgdy5FICE9IG51bGwpIHtcbiAgICAgICAgZG93ID0gMTtcbiAgICAgICAgZG95ID0gNDtcblxuICAgICAgICAvLyBUT0RPOiBXZSBuZWVkIHRvIHRha2UgdGhlIGN1cnJlbnQgaXNvV2Vla1llYXIsIGJ1dCB0aGF0IGRlcGVuZHMgb25cbiAgICAgICAgLy8gaG93IHdlIGludGVycHJldCBub3cgKGxvY2FsLCB1dGMsIGZpeGVkIG9mZnNldCkuIFNvIGNyZWF0ZVxuICAgICAgICAvLyBhIG5vdyB2ZXJzaW9uIG9mIGN1cnJlbnQgY29uZmlnICh0YWtlIGxvY2FsL3V0Yy9vZmZzZXQgZmxhZ3MsIGFuZFxuICAgICAgICAvLyBjcmVhdGUgbm93KS5cbiAgICAgICAgd2Vla1llYXIgPSBkZWZhdWx0cyh3LkdHLCBjb25maWcuX2FbWUVBUl0sIHdlZWtPZlllYXIoY3JlYXRlTG9jYWwoKSwgMSwgNCkueWVhcik7XG4gICAgICAgIHdlZWsgPSBkZWZhdWx0cyh3LlcsIDEpO1xuICAgICAgICB3ZWVrZGF5ID0gZGVmYXVsdHMody5FLCAxKTtcbiAgICAgICAgaWYgKHdlZWtkYXkgPCAxIHx8IHdlZWtkYXkgPiA3KSB7XG4gICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZG93ID0gY29uZmlnLl9sb2NhbGUuX3dlZWsuZG93O1xuICAgICAgICBkb3kgPSBjb25maWcuX2xvY2FsZS5fd2Vlay5kb3k7XG5cbiAgICAgICAgdmFyIGN1cldlZWsgPSB3ZWVrT2ZZZWFyKGNyZWF0ZUxvY2FsKCksIGRvdywgZG95KTtcblxuICAgICAgICB3ZWVrWWVhciA9IGRlZmF1bHRzKHcuZ2csIGNvbmZpZy5fYVtZRUFSXSwgY3VyV2Vlay55ZWFyKTtcblxuICAgICAgICAvLyBEZWZhdWx0IHRvIGN1cnJlbnQgd2Vlay5cbiAgICAgICAgd2VlayA9IGRlZmF1bHRzKHcudywgY3VyV2Vlay53ZWVrKTtcblxuICAgICAgICBpZiAody5kICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIHdlZWtkYXkgLS0gbG93IGRheSBudW1iZXJzIGFyZSBjb25zaWRlcmVkIG5leHQgd2Vla1xuICAgICAgICAgICAgd2Vla2RheSA9IHcuZDtcbiAgICAgICAgICAgIGlmICh3ZWVrZGF5IDwgMCB8fCB3ZWVrZGF5ID4gNikge1xuICAgICAgICAgICAgICAgIHdlZWtkYXlPdmVyZmxvdyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAody5lICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIGxvY2FsIHdlZWtkYXkgLS0gY291bnRpbmcgc3RhcnRzIGZyb20gYmVnaW5pbmcgb2Ygd2Vla1xuICAgICAgICAgICAgd2Vla2RheSA9IHcuZSArIGRvdztcbiAgICAgICAgICAgIGlmICh3LmUgPCAwIHx8IHcuZSA+IDYpIHtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBiZWdpbmluZyBvZiB3ZWVrXG4gICAgICAgICAgICB3ZWVrZGF5ID0gZG93O1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh3ZWVrIDwgMSB8fCB3ZWVrID4gd2Vla3NJblllYXIod2Vla1llYXIsIGRvdywgZG95KSkge1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5fb3ZlcmZsb3dXZWVrcyA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh3ZWVrZGF5T3ZlcmZsb3cgIT0gbnVsbCkge1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5fb3ZlcmZsb3dXZWVrZGF5ID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0ZW1wID0gZGF5T2ZZZWFyRnJvbVdlZWtzKHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSk7XG4gICAgICAgIGNvbmZpZy5fYVtZRUFSXSA9IHRlbXAueWVhcjtcbiAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPSB0ZW1wLmRheU9mWWVhcjtcbiAgICB9XG59XG5cbi8vIGNvbnN0YW50IHRoYXQgcmVmZXJzIHRvIHRoZSBJU08gc3RhbmRhcmRcbmhvb2tzLklTT184NjAxID0gZnVuY3Rpb24gKCkge307XG5cbi8vIGNvbnN0YW50IHRoYXQgcmVmZXJzIHRvIHRoZSBSRkMgMjgyMiBmb3JtXG5ob29rcy5SRkNfMjgyMiA9IGZ1bmN0aW9uICgpIHt9O1xuXG4vLyBkYXRlIGZyb20gc3RyaW5nIGFuZCBmb3JtYXQgc3RyaW5nXG5mdW5jdGlvbiBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZykge1xuICAgIC8vIFRPRE86IE1vdmUgdGhpcyB0byBhbm90aGVyIHBhcnQgb2YgdGhlIGNyZWF0aW9uIGZsb3cgdG8gcHJldmVudCBjaXJjdWxhciBkZXBzXG4gICAgaWYgKGNvbmZpZy5fZiA9PT0gaG9va3MuSVNPXzg2MDEpIHtcbiAgICAgICAgY29uZmlnRnJvbUlTTyhjb25maWcpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb25maWcuX2YgPT09IGhvb2tzLlJGQ18yODIyKSB7XG4gICAgICAgIGNvbmZpZ0Zyb21SRkMyODIyKGNvbmZpZyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uZmlnLl9hID0gW107XG4gICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuZW1wdHkgPSB0cnVlO1xuXG4gICAgLy8gVGhpcyBhcnJheSBpcyB1c2VkIHRvIG1ha2UgYSBEYXRlLCBlaXRoZXIgd2l0aCBgbmV3IERhdGVgIG9yIGBEYXRlLlVUQ2BcbiAgICB2YXIgc3RyaW5nID0gJycgKyBjb25maWcuX2ksXG4gICAgICAgIGksIHBhcnNlZElucHV0LCB0b2tlbnMsIHRva2VuLCBza2lwcGVkLFxuICAgICAgICBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoLFxuICAgICAgICB0b3RhbFBhcnNlZElucHV0TGVuZ3RoID0gMDtcblxuICAgIHRva2VucyA9IGV4cGFuZEZvcm1hdChjb25maWcuX2YsIGNvbmZpZy5fbG9jYWxlKS5tYXRjaChmb3JtYXR0aW5nVG9rZW5zKSB8fCBbXTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdG9rZW4gPSB0b2tlbnNbaV07XG4gICAgICAgIHBhcnNlZElucHV0ID0gKHN0cmluZy5tYXRjaChnZXRQYXJzZVJlZ2V4Rm9yVG9rZW4odG9rZW4sIGNvbmZpZykpIHx8IFtdKVswXTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3Rva2VuJywgdG9rZW4sICdwYXJzZWRJbnB1dCcsIHBhcnNlZElucHV0LFxuICAgICAgICAvLyAgICAgICAgICdyZWdleCcsIGdldFBhcnNlUmVnZXhGb3JUb2tlbih0b2tlbiwgY29uZmlnKSk7XG4gICAgICAgIGlmIChwYXJzZWRJbnB1dCkge1xuICAgICAgICAgICAgc2tpcHBlZCA9IHN0cmluZy5zdWJzdHIoMCwgc3RyaW5nLmluZGV4T2YocGFyc2VkSW5wdXQpKTtcbiAgICAgICAgICAgIGlmIChza2lwcGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRJbnB1dC5wdXNoKHNraXBwZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnNsaWNlKHN0cmluZy5pbmRleE9mKHBhcnNlZElucHV0KSArIHBhcnNlZElucHV0Lmxlbmd0aCk7XG4gICAgICAgICAgICB0b3RhbFBhcnNlZElucHV0TGVuZ3RoICs9IHBhcnNlZElucHV0Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICAvLyBkb24ndCBwYXJzZSBpZiBpdCdzIG5vdCBhIGtub3duIHRva2VuXG4gICAgICAgIGlmIChmb3JtYXRUb2tlbkZ1bmN0aW9uc1t0b2tlbl0pIHtcbiAgICAgICAgICAgIGlmIChwYXJzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmVtcHR5ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRUb2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRUaW1lVG9BcnJheUZyb21Ub2tlbih0b2tlbiwgcGFyc2VkSW5wdXQsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29uZmlnLl9zdHJpY3QgJiYgIXBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRUb2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhZGQgcmVtYWluaW5nIHVucGFyc2VkIGlucHV0IGxlbmd0aCB0byB0aGUgc3RyaW5nXG4gICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuY2hhcnNMZWZ0T3ZlciA9IHN0cmluZ0xlbmd0aCAtIHRvdGFsUGFyc2VkSW5wdXRMZW5ndGg7XG4gICAgaWYgKHN0cmluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZElucHV0LnB1c2goc3RyaW5nKTtcbiAgICB9XG5cbiAgICAvLyBjbGVhciBfMTJoIGZsYWcgaWYgaG91ciBpcyA8PSAxMlxuICAgIGlmIChjb25maWcuX2FbSE9VUl0gPD0gMTIgJiZcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9PT0gdHJ1ZSAmJlxuICAgICAgICBjb25maWcuX2FbSE9VUl0gPiAwKSB7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykucGFyc2VkRGF0ZVBhcnRzID0gY29uZmlnLl9hLnNsaWNlKDApO1xuICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLm1lcmlkaWVtID0gY29uZmlnLl9tZXJpZGllbTtcbiAgICAvLyBoYW5kbGUgbWVyaWRpZW1cbiAgICBjb25maWcuX2FbSE9VUl0gPSBtZXJpZGllbUZpeFdyYXAoY29uZmlnLl9sb2NhbGUsIGNvbmZpZy5fYVtIT1VSXSwgY29uZmlnLl9tZXJpZGllbSk7XG5cbiAgICBjb25maWdGcm9tQXJyYXkoY29uZmlnKTtcbiAgICBjaGVja092ZXJmbG93KGNvbmZpZyk7XG59XG5cblxuZnVuY3Rpb24gbWVyaWRpZW1GaXhXcmFwIChsb2NhbGUsIGhvdXIsIG1lcmlkaWVtKSB7XG4gICAgdmFyIGlzUG07XG5cbiAgICBpZiAobWVyaWRpZW0gPT0gbnVsbCkge1xuICAgICAgICAvLyBub3RoaW5nIHRvIGRvXG4gICAgICAgIHJldHVybiBob3VyO1xuICAgIH1cbiAgICBpZiAobG9jYWxlLm1lcmlkaWVtSG91ciAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUubWVyaWRpZW1Ib3VyKGhvdXIsIG1lcmlkaWVtKTtcbiAgICB9IGVsc2UgaWYgKGxvY2FsZS5pc1BNICE9IG51bGwpIHtcbiAgICAgICAgLy8gRmFsbGJhY2tcbiAgICAgICAgaXNQbSA9IGxvY2FsZS5pc1BNKG1lcmlkaWVtKTtcbiAgICAgICAgaWYgKGlzUG0gJiYgaG91ciA8IDEyKSB7XG4gICAgICAgICAgICBob3VyICs9IDEyO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNQbSAmJiBob3VyID09PSAxMikge1xuICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhvdXI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdGhpcyBpcyBub3Qgc3VwcG9zZWQgdG8gaGFwcGVuXG4gICAgICAgIHJldHVybiBob3VyO1xuICAgIH1cbn1cblxuLy8gZGF0ZSBmcm9tIHN0cmluZyBhbmQgYXJyYXkgb2YgZm9ybWF0IHN0cmluZ3NcbmZ1bmN0aW9uIGNvbmZpZ0Zyb21TdHJpbmdBbmRBcnJheShjb25maWcpIHtcbiAgICB2YXIgdGVtcENvbmZpZyxcbiAgICAgICAgYmVzdE1vbWVudCxcblxuICAgICAgICBzY29yZVRvQmVhdCxcbiAgICAgICAgaSxcbiAgICAgICAgY3VycmVudFNjb3JlO1xuXG4gICAgaWYgKGNvbmZpZy5fZi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaW52YWxpZEZvcm1hdCA9IHRydWU7XG4gICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKE5hTik7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgY29uZmlnLl9mLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGN1cnJlbnRTY29yZSA9IDA7XG4gICAgICAgIHRlbXBDb25maWcgPSBjb3B5Q29uZmlnKHt9LCBjb25maWcpO1xuICAgICAgICBpZiAoY29uZmlnLl91c2VVVEMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGVtcENvbmZpZy5fdXNlVVRDID0gY29uZmlnLl91c2VVVEM7XG4gICAgICAgIH1cbiAgICAgICAgdGVtcENvbmZpZy5fZiA9IGNvbmZpZy5fZltpXTtcbiAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdCh0ZW1wQ29uZmlnKTtcblxuICAgICAgICBpZiAoIWlzVmFsaWQodGVtcENvbmZpZykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgYW55IGlucHV0IHRoYXQgd2FzIG5vdCBwYXJzZWQgYWRkIGEgcGVuYWx0eSBmb3IgdGhhdCBmb3JtYXRcbiAgICAgICAgY3VycmVudFNjb3JlICs9IGdldFBhcnNpbmdGbGFncyh0ZW1wQ29uZmlnKS5jaGFyc0xlZnRPdmVyO1xuXG4gICAgICAgIC8vb3IgdG9rZW5zXG4gICAgICAgIGN1cnJlbnRTY29yZSArPSBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykudW51c2VkVG9rZW5zLmxlbmd0aCAqIDEwO1xuXG4gICAgICAgIGdldFBhcnNpbmdGbGFncyh0ZW1wQ29uZmlnKS5zY29yZSA9IGN1cnJlbnRTY29yZTtcblxuICAgICAgICBpZiAoc2NvcmVUb0JlYXQgPT0gbnVsbCB8fCBjdXJyZW50U2NvcmUgPCBzY29yZVRvQmVhdCkge1xuICAgICAgICAgICAgc2NvcmVUb0JlYXQgPSBjdXJyZW50U2NvcmU7XG4gICAgICAgICAgICBiZXN0TW9tZW50ID0gdGVtcENvbmZpZztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV4dGVuZChjb25maWcsIGJlc3RNb21lbnQgfHwgdGVtcENvbmZpZyk7XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ0Zyb21PYmplY3QoY29uZmlnKSB7XG4gICAgaWYgKGNvbmZpZy5fZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGkgPSBub3JtYWxpemVPYmplY3RVbml0cyhjb25maWcuX2kpO1xuICAgIGNvbmZpZy5fYSA9IG1hcChbaS55ZWFyLCBpLm1vbnRoLCBpLmRheSB8fCBpLmRhdGUsIGkuaG91ciwgaS5taW51dGUsIGkuc2Vjb25kLCBpLm1pbGxpc2Vjb25kXSwgZnVuY3Rpb24gKG9iaikge1xuICAgICAgICByZXR1cm4gb2JqICYmIHBhcnNlSW50KG9iaiwgMTApO1xuICAgIH0pO1xuXG4gICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyb21Db25maWcgKGNvbmZpZykge1xuICAgIHZhciByZXMgPSBuZXcgTW9tZW50KGNoZWNrT3ZlcmZsb3cocHJlcGFyZUNvbmZpZyhjb25maWcpKSk7XG4gICAgaWYgKHJlcy5fbmV4dERheSkge1xuICAgICAgICAvLyBBZGRpbmcgaXMgc21hcnQgZW5vdWdoIGFyb3VuZCBEU1RcbiAgICAgICAgcmVzLmFkZCgxLCAnZCcpO1xuICAgICAgICByZXMuX25leHREYXkgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUNvbmZpZyAoY29uZmlnKSB7XG4gICAgdmFyIGlucHV0ID0gY29uZmlnLl9pLFxuICAgICAgICBmb3JtYXQgPSBjb25maWcuX2Y7XG5cbiAgICBjb25maWcuX2xvY2FsZSA9IGNvbmZpZy5fbG9jYWxlIHx8IGdldExvY2FsZShjb25maWcuX2wpO1xuXG4gICAgaWYgKGlucHV0ID09PSBudWxsIHx8IChmb3JtYXQgPT09IHVuZGVmaW5lZCAmJiBpbnB1dCA9PT0gJycpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVJbnZhbGlkKHtudWxsSW5wdXQ6IHRydWV9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25maWcuX2kgPSBpbnB1dCA9IGNvbmZpZy5fbG9jYWxlLnByZXBhcnNlKGlucHV0KTtcbiAgICB9XG5cbiAgICBpZiAoaXNNb21lbnQoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiBuZXcgTW9tZW50KGNoZWNrT3ZlcmZsb3coaW5wdXQpKTtcbiAgICB9IGVsc2UgaWYgKGlzRGF0ZShpbnB1dCkpIHtcbiAgICAgICAgY29uZmlnLl9kID0gaW5wdXQ7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KGZvcm1hdCkpIHtcbiAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEFycmF5KGNvbmZpZyk7XG4gICAgfSBlbHNlIGlmIChmb3JtYXQpIHtcbiAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpO1xuICAgIH0gIGVsc2Uge1xuICAgICAgICBjb25maWdGcm9tSW5wdXQoY29uZmlnKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzVmFsaWQoY29uZmlnKSkge1xuICAgICAgICBjb25maWcuX2QgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjb25maWc7XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ0Zyb21JbnB1dChjb25maWcpIHtcbiAgICB2YXIgaW5wdXQgPSBjb25maWcuX2k7XG4gICAgaWYgKGlzVW5kZWZpbmVkKGlucHV0KSkge1xuICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShob29rcy5ub3coKSk7XG4gICAgfSBlbHNlIGlmIChpc0RhdGUoaW5wdXQpKSB7XG4gICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGlucHV0LnZhbHVlT2YoKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbmZpZ0Zyb21TdHJpbmcoY29uZmlnKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgIGNvbmZpZy5fYSA9IG1hcChpbnB1dC5zbGljZSgwKSwgZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KG9iaiwgMTApO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG4gICAgfSBlbHNlIGlmIChpc09iamVjdChpbnB1dCkpIHtcbiAgICAgICAgY29uZmlnRnJvbU9iamVjdChjb25maWcpO1xuICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIoaW5wdXQpKSB7XG4gICAgICAgIC8vIGZyb20gbWlsbGlzZWNvbmRzXG4gICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGlucHV0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBob29rcy5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayhjb25maWcpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlTG9jYWxPclVUQyAoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIGlzVVRDKSB7XG4gICAgdmFyIGMgPSB7fTtcblxuICAgIGlmIChsb2NhbGUgPT09IHRydWUgfHwgbG9jYWxlID09PSBmYWxzZSkge1xuICAgICAgICBzdHJpY3QgPSBsb2NhbGU7XG4gICAgICAgIGxvY2FsZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoKGlzT2JqZWN0KGlucHV0KSAmJiBpc09iamVjdEVtcHR5KGlucHV0KSkgfHxcbiAgICAgICAgICAgIChpc0FycmF5KGlucHV0KSAmJiBpbnB1dC5sZW5ndGggPT09IDApKSB7XG4gICAgICAgIGlucHV0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBvYmplY3QgY29uc3RydWN0aW9uIG11c3QgYmUgZG9uZSB0aGlzIHdheS5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMTQyM1xuICAgIGMuX2lzQU1vbWVudE9iamVjdCA9IHRydWU7XG4gICAgYy5fdXNlVVRDID0gYy5faXNVVEMgPSBpc1VUQztcbiAgICBjLl9sID0gbG9jYWxlO1xuICAgIGMuX2kgPSBpbnB1dDtcbiAgICBjLl9mID0gZm9ybWF0O1xuICAgIGMuX3N0cmljdCA9IHN0cmljdDtcblxuICAgIHJldHVybiBjcmVhdGVGcm9tQ29uZmlnKGMpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMb2NhbCAoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QpIHtcbiAgICByZXR1cm4gY3JlYXRlTG9jYWxPclVUQyhpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCwgZmFsc2UpO1xufVxuXG52YXIgcHJvdG90eXBlTWluID0gZGVwcmVjYXRlKFxuICAgICdtb21lbnQoKS5taW4gaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudC5tYXggaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9taW4tbWF4LycsXG4gICAgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb3RoZXIgPSBjcmVhdGVMb2NhbC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKCkgJiYgb3RoZXIuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gb3RoZXIgPCB0aGlzID8gdGhpcyA6IG90aGVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludmFsaWQoKTtcbiAgICAgICAgfVxuICAgIH1cbik7XG5cbnZhciBwcm90b3R5cGVNYXggPSBkZXByZWNhdGUoXG4gICAgJ21vbWVudCgpLm1heCBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1pbiBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL21pbi1tYXgvJyxcbiAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvdGhlciA9IGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJiBvdGhlci5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBvdGhlciA+IHRoaXMgPyB0aGlzIDogb3RoZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlSW52YWxpZCgpO1xuICAgICAgICB9XG4gICAgfVxuKTtcblxuLy8gUGljayBhIG1vbWVudCBtIGZyb20gbW9tZW50cyBzbyB0aGF0IG1bZm5dKG90aGVyKSBpcyB0cnVlIGZvciBhbGxcbi8vIG90aGVyLiBUaGlzIHJlbGllcyBvbiB0aGUgZnVuY3Rpb24gZm4gdG8gYmUgdHJhbnNpdGl2ZS5cbi8vXG4vLyBtb21lbnRzIHNob3VsZCBlaXRoZXIgYmUgYW4gYXJyYXkgb2YgbW9tZW50IG9iamVjdHMgb3IgYW4gYXJyYXksIHdob3NlXG4vLyBmaXJzdCBlbGVtZW50IGlzIGFuIGFycmF5IG9mIG1vbWVudCBvYmplY3RzLlxuZnVuY3Rpb24gcGlja0J5KGZuLCBtb21lbnRzKSB7XG4gICAgdmFyIHJlcywgaTtcbiAgICBpZiAobW9tZW50cy5sZW5ndGggPT09IDEgJiYgaXNBcnJheShtb21lbnRzWzBdKSkge1xuICAgICAgICBtb21lbnRzID0gbW9tZW50c1swXTtcbiAgICB9XG4gICAgaWYgKCFtb21lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwoKTtcbiAgICB9XG4gICAgcmVzID0gbW9tZW50c1swXTtcbiAgICBmb3IgKGkgPSAxOyBpIDwgbW9tZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoIW1vbWVudHNbaV0uaXNWYWxpZCgpIHx8IG1vbWVudHNbaV1bZm5dKHJlcykpIHtcbiAgICAgICAgICAgIHJlcyA9IG1vbWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cblxuLy8gVE9ETzogVXNlIFtdLnNvcnQgaW5zdGVhZD9cbmZ1bmN0aW9uIG1pbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG5cbiAgICByZXR1cm4gcGlja0J5KCdpc0JlZm9yZScsIGFyZ3MpO1xufVxuXG5mdW5jdGlvbiBtYXggKCkge1xuICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuXG4gICAgcmV0dXJuIHBpY2tCeSgnaXNBZnRlcicsIGFyZ3MpO1xufVxuXG52YXIgbm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBEYXRlLm5vdyA/IERhdGUubm93KCkgOiArKG5ldyBEYXRlKCkpO1xufTtcblxudmFyIG9yZGVyaW5nID0gWyd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgJ21pbGxpc2Vjb25kJ107XG5cbmZ1bmN0aW9uIGlzRHVyYXRpb25WYWxpZChtKSB7XG4gICAgZm9yICh2YXIga2V5IGluIG0pIHtcbiAgICAgICAgaWYgKCEob3JkZXJpbmcuaW5kZXhPZihrZXkpICE9PSAtMSAmJiAobVtrZXldID09IG51bGwgfHwgIWlzTmFOKG1ba2V5XSkpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHVuaXRIYXNEZWNpbWFsID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcmRlcmluZy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAobVtvcmRlcmluZ1tpXV0pIHtcbiAgICAgICAgICAgIGlmICh1bml0SGFzRGVjaW1hbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gb25seSBhbGxvdyBub24taW50ZWdlcnMgZm9yIHNtYWxsZXN0IHVuaXRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KG1bb3JkZXJpbmdbaV1dKSAhPT0gdG9JbnQobVtvcmRlcmluZ1tpXV0pKSB7XG4gICAgICAgICAgICAgICAgdW5pdEhhc0RlY2ltYWwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWQkMSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNWYWxpZDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSW52YWxpZCQxKCkge1xuICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbihOYU4pO1xufVxuXG5mdW5jdGlvbiBEdXJhdGlvbiAoZHVyYXRpb24pIHtcbiAgICB2YXIgbm9ybWFsaXplZElucHV0ID0gbm9ybWFsaXplT2JqZWN0VW5pdHMoZHVyYXRpb24pLFxuICAgICAgICB5ZWFycyA9IG5vcm1hbGl6ZWRJbnB1dC55ZWFyIHx8IDAsXG4gICAgICAgIHF1YXJ0ZXJzID0gbm9ybWFsaXplZElucHV0LnF1YXJ0ZXIgfHwgMCxcbiAgICAgICAgbW9udGhzID0gbm9ybWFsaXplZElucHV0Lm1vbnRoIHx8IDAsXG4gICAgICAgIHdlZWtzID0gbm9ybWFsaXplZElucHV0LndlZWsgfHwgMCxcbiAgICAgICAgZGF5cyA9IG5vcm1hbGl6ZWRJbnB1dC5kYXkgfHwgMCxcbiAgICAgICAgaG91cnMgPSBub3JtYWxpemVkSW5wdXQuaG91ciB8fCAwLFxuICAgICAgICBtaW51dGVzID0gbm9ybWFsaXplZElucHV0Lm1pbnV0ZSB8fCAwLFxuICAgICAgICBzZWNvbmRzID0gbm9ybWFsaXplZElucHV0LnNlY29uZCB8fCAwLFxuICAgICAgICBtaWxsaXNlY29uZHMgPSBub3JtYWxpemVkSW5wdXQubWlsbGlzZWNvbmQgfHwgMDtcblxuICAgIHRoaXMuX2lzVmFsaWQgPSBpc0R1cmF0aW9uVmFsaWQobm9ybWFsaXplZElucHV0KTtcblxuICAgIC8vIHJlcHJlc2VudGF0aW9uIGZvciBkYXRlQWRkUmVtb3ZlXG4gICAgdGhpcy5fbWlsbGlzZWNvbmRzID0gK21pbGxpc2Vjb25kcyArXG4gICAgICAgIHNlY29uZHMgKiAxZTMgKyAvLyAxMDAwXG4gICAgICAgIG1pbnV0ZXMgKiA2ZTQgKyAvLyAxMDAwICogNjBcbiAgICAgICAgaG91cnMgKiAxMDAwICogNjAgKiA2MDsgLy91c2luZyAxMDAwICogNjAgKiA2MCBpbnN0ZWFkIG9mIDM2ZTUgdG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgZXJyb3JzIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8yOTc4XG4gICAgLy8gQmVjYXVzZSBvZiBkYXRlQWRkUmVtb3ZlIHRyZWF0cyAyNCBob3VycyBhcyBkaWZmZXJlbnQgZnJvbSBhXG4gICAgLy8gZGF5IHdoZW4gd29ya2luZyBhcm91bmQgRFNULCB3ZSBuZWVkIHRvIHN0b3JlIHRoZW0gc2VwYXJhdGVseVxuICAgIHRoaXMuX2RheXMgPSArZGF5cyArXG4gICAgICAgIHdlZWtzICogNztcbiAgICAvLyBJdCBpcyBpbXBvc3NpYmxlIHRyYW5zbGF0ZSBtb250aHMgaW50byBkYXlzIHdpdGhvdXQga25vd2luZ1xuICAgIC8vIHdoaWNoIG1vbnRocyB5b3UgYXJlIGFyZSB0YWxraW5nIGFib3V0LCBzbyB3ZSBoYXZlIHRvIHN0b3JlXG4gICAgLy8gaXQgc2VwYXJhdGVseS5cbiAgICB0aGlzLl9tb250aHMgPSArbW9udGhzICtcbiAgICAgICAgcXVhcnRlcnMgKiAzICtcbiAgICAgICAgeWVhcnMgKiAxMjtcblxuICAgIHRoaXMuX2RhdGEgPSB7fTtcblxuICAgIHRoaXMuX2xvY2FsZSA9IGdldExvY2FsZSgpO1xuXG4gICAgdGhpcy5fYnViYmxlKCk7XG59XG5cbmZ1bmN0aW9uIGlzRHVyYXRpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBEdXJhdGlvbjtcbn1cblxuZnVuY3Rpb24gYWJzUm91bmQgKG51bWJlcikge1xuICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKC0xICogbnVtYmVyKSAqIC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG51bWJlcik7XG4gICAgfVxufVxuXG4vLyBGT1JNQVRUSU5HXG5cbmZ1bmN0aW9uIG9mZnNldCAodG9rZW4sIHNlcGFyYXRvcikge1xuICAgIGFkZEZvcm1hdFRva2VuKHRva2VuLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnV0Y09mZnNldCgpO1xuICAgICAgICB2YXIgc2lnbiA9ICcrJztcbiAgICAgICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICAgIG9mZnNldCA9IC1vZmZzZXQ7XG4gICAgICAgICAgICBzaWduID0gJy0nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaWduICsgemVyb0ZpbGwofn4ob2Zmc2V0IC8gNjApLCAyKSArIHNlcGFyYXRvciArIHplcm9GaWxsKH5+KG9mZnNldCkgJSA2MCwgMik7XG4gICAgfSk7XG59XG5cbm9mZnNldCgnWicsICc6Jyk7XG5vZmZzZXQoJ1paJywgJycpO1xuXG4vLyBQQVJTSU5HXG5cbmFkZFJlZ2V4VG9rZW4oJ1onLCAgbWF0Y2hTaG9ydE9mZnNldCk7XG5hZGRSZWdleFRva2VuKCdaWicsIG1hdGNoU2hvcnRPZmZzZXQpO1xuYWRkUGFyc2VUb2tlbihbJ1onLCAnWlonXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgY29uZmlnLl91c2VVVEMgPSB0cnVlO1xuICAgIGNvbmZpZy5fdHptID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaFNob3J0T2Zmc2V0LCBpbnB1dCk7XG59KTtcblxuLy8gSEVMUEVSU1xuXG4vLyB0aW1lem9uZSBjaHVua2VyXG4vLyAnKzEwOjAwJyA+IFsnMTAnLCAgJzAwJ11cbi8vICctMTUzMCcgID4gWyctMTUnLCAnMzAnXVxudmFyIGNodW5rT2Zmc2V0ID0gLyhbXFwrXFwtXXxcXGRcXGQpL2dpO1xuXG5mdW5jdGlvbiBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoZXIsIHN0cmluZykge1xuICAgIHZhciBtYXRjaGVzID0gKHN0cmluZyB8fCAnJykubWF0Y2gobWF0Y2hlcik7XG5cbiAgICBpZiAobWF0Y2hlcyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgY2h1bmsgICA9IG1hdGNoZXNbbWF0Y2hlcy5sZW5ndGggLSAxXSB8fCBbXTtcbiAgICB2YXIgcGFydHMgICA9IChjaHVuayArICcnKS5tYXRjaChjaHVua09mZnNldCkgfHwgWyctJywgMCwgMF07XG4gICAgdmFyIG1pbnV0ZXMgPSArKHBhcnRzWzFdICogNjApICsgdG9JbnQocGFydHNbMl0pO1xuXG4gICAgcmV0dXJuIG1pbnV0ZXMgPT09IDAgP1xuICAgICAgMCA6XG4gICAgICBwYXJ0c1swXSA9PT0gJysnID8gbWludXRlcyA6IC1taW51dGVzO1xufVxuXG4vLyBSZXR1cm4gYSBtb21lbnQgZnJvbSBpbnB1dCwgdGhhdCBpcyBsb2NhbC91dGMvem9uZSBlcXVpdmFsZW50IHRvIG1vZGVsLlxuZnVuY3Rpb24gY2xvbmVXaXRoT2Zmc2V0KGlucHV0LCBtb2RlbCkge1xuICAgIHZhciByZXMsIGRpZmY7XG4gICAgaWYgKG1vZGVsLl9pc1VUQykge1xuICAgICAgICByZXMgPSBtb2RlbC5jbG9uZSgpO1xuICAgICAgICBkaWZmID0gKGlzTW9tZW50KGlucHV0KSB8fCBpc0RhdGUoaW5wdXQpID8gaW5wdXQudmFsdWVPZigpIDogY3JlYXRlTG9jYWwoaW5wdXQpLnZhbHVlT2YoKSkgLSByZXMudmFsdWVPZigpO1xuICAgICAgICAvLyBVc2UgbG93LWxldmVsIGFwaSwgYmVjYXVzZSB0aGlzIGZuIGlzIGxvdy1sZXZlbCBhcGkuXG4gICAgICAgIHJlcy5fZC5zZXRUaW1lKHJlcy5fZC52YWx1ZU9mKCkgKyBkaWZmKTtcbiAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHJlcywgZmFsc2UpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbChpbnB1dCkubG9jYWwoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldERhdGVPZmZzZXQgKG0pIHtcbiAgICAvLyBPbiBGaXJlZm94LjI0IERhdGUjZ2V0VGltZXpvbmVPZmZzZXQgcmV0dXJucyBhIGZsb2F0aW5nIHBvaW50LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L3B1bGwvMTg3MVxuICAgIHJldHVybiAtTWF0aC5yb3VuZChtLl9kLmdldFRpbWV6b25lT2Zmc2V0KCkgLyAxNSkgKiAxNTtcbn1cblxuLy8gSE9PS1NcblxuLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBhIG1vbWVudCBpcyBtdXRhdGVkLlxuLy8gSXQgaXMgaW50ZW5kZWQgdG8ga2VlcCB0aGUgb2Zmc2V0IGluIHN5bmMgd2l0aCB0aGUgdGltZXpvbmUuXG5ob29rcy51cGRhdGVPZmZzZXQgPSBmdW5jdGlvbiAoKSB7fTtcblxuLy8gTU9NRU5UU1xuXG4vLyBrZWVwTG9jYWxUaW1lID0gdHJ1ZSBtZWFucyBvbmx5IGNoYW5nZSB0aGUgdGltZXpvbmUsIHdpdGhvdXRcbi8vIGFmZmVjdGluZyB0aGUgbG9jYWwgaG91ci4gU28gNTozMToyNiArMDMwMCAtLVt1dGNPZmZzZXQoMiwgdHJ1ZSldLS0+XG4vLyA1OjMxOjI2ICswMjAwIEl0IGlzIHBvc3NpYmxlIHRoYXQgNTozMToyNiBkb2Vzbid0IGV4aXN0IHdpdGggb2Zmc2V0XG4vLyArMDIwMCwgc28gd2UgYWRqdXN0IHRoZSB0aW1lIGFzIG5lZWRlZCwgdG8gYmUgdmFsaWQuXG4vL1xuLy8gS2VlcGluZyB0aGUgdGltZSBhY3R1YWxseSBhZGRzL3N1YnRyYWN0cyAob25lIGhvdXIpXG4vLyBmcm9tIHRoZSBhY3R1YWwgcmVwcmVzZW50ZWQgdGltZS4gVGhhdCBpcyB3aHkgd2UgY2FsbCB1cGRhdGVPZmZzZXRcbi8vIGEgc2Vjb25kIHRpbWUuIEluIGNhc2UgaXQgd2FudHMgdXMgdG8gY2hhbmdlIHRoZSBvZmZzZXQgYWdhaW5cbi8vIF9jaGFuZ2VJblByb2dyZXNzID09IHRydWUgY2FzZSwgdGhlbiB3ZSBoYXZlIHRvIGFkanVzdCwgYmVjYXVzZVxuLy8gdGhlcmUgaXMgbm8gc3VjaCB0aW1lIGluIHRoZSBnaXZlbiB0aW1lem9uZS5cbmZ1bmN0aW9uIGdldFNldE9mZnNldCAoaW5wdXQsIGtlZXBMb2NhbFRpbWUsIGtlZXBNaW51dGVzKSB7XG4gICAgdmFyIG9mZnNldCA9IHRoaXMuX29mZnNldCB8fCAwLFxuICAgICAgICBsb2NhbEFkanVzdDtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICB9XG4gICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlucHV0ID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaFNob3J0T2Zmc2V0LCBpbnB1dCk7XG4gICAgICAgICAgICBpZiAoaW5wdXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChNYXRoLmFicyhpbnB1dCkgPCAxNiAmJiAha2VlcE1pbnV0ZXMpIHtcbiAgICAgICAgICAgIGlucHV0ID0gaW5wdXQgKiA2MDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2lzVVRDICYmIGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgICAgIGxvY2FsQWRqdXN0ID0gZ2V0RGF0ZU9mZnNldCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vZmZzZXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5faXNVVEMgPSB0cnVlO1xuICAgICAgICBpZiAobG9jYWxBZGp1c3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5hZGQobG9jYWxBZGp1c3QsICdtJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9mZnNldCAhPT0gaW5wdXQpIHtcbiAgICAgICAgICAgIGlmICgha2VlcExvY2FsVGltZSB8fCB0aGlzLl9jaGFuZ2VJblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgYWRkU3VidHJhY3QodGhpcywgY3JlYXRlRHVyYXRpb24oaW5wdXQgLSBvZmZzZXQsICdtJyksIDEsIGZhbHNlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzVVRDID8gb2Zmc2V0IDogZ2V0RGF0ZU9mZnNldCh0aGlzKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldFNldFpvbmUgKGlucHV0LCBrZWVwTG9jYWxUaW1lKSB7XG4gICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlucHV0ID0gLWlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51dGNPZmZzZXQoaW5wdXQsIGtlZXBMb2NhbFRpbWUpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAtdGhpcy51dGNPZmZzZXQoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNldE9mZnNldFRvVVRDIChrZWVwTG9jYWxUaW1lKSB7XG4gICAgcmV0dXJuIHRoaXMudXRjT2Zmc2V0KDAsIGtlZXBMb2NhbFRpbWUpO1xufVxuXG5mdW5jdGlvbiBzZXRPZmZzZXRUb0xvY2FsIChrZWVwTG9jYWxUaW1lKSB7XG4gICAgaWYgKHRoaXMuX2lzVVRDKSB7XG4gICAgICAgIHRoaXMudXRjT2Zmc2V0KDAsIGtlZXBMb2NhbFRpbWUpO1xuICAgICAgICB0aGlzLl9pc1VUQyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgICAgICB0aGlzLnN1YnRyYWN0KGdldERhdGVPZmZzZXQodGhpcyksICdtJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cbmZ1bmN0aW9uIHNldE9mZnNldFRvUGFyc2VkT2Zmc2V0ICgpIHtcbiAgICBpZiAodGhpcy5fdHptICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy51dGNPZmZzZXQodGhpcy5fdHptLCBmYWxzZSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5faSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIHRab25lID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaE9mZnNldCwgdGhpcy5faSk7XG4gICAgICAgIGlmICh0Wm9uZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCh0Wm9uZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgwLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbn1cblxuZnVuY3Rpb24gaGFzQWxpZ25lZEhvdXJPZmZzZXQgKGlucHV0KSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlucHV0ID0gaW5wdXQgPyBjcmVhdGVMb2NhbChpbnB1dCkudXRjT2Zmc2V0KCkgOiAwO1xuXG4gICAgcmV0dXJuICh0aGlzLnV0Y09mZnNldCgpIC0gaW5wdXQpICUgNjAgPT09IDA7XG59XG5cbmZ1bmN0aW9uIGlzRGF5bGlnaHRTYXZpbmdUaW1lICgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLnV0Y09mZnNldCgpID4gdGhpcy5jbG9uZSgpLm1vbnRoKDApLnV0Y09mZnNldCgpIHx8XG4gICAgICAgIHRoaXMudXRjT2Zmc2V0KCkgPiB0aGlzLmNsb25lKCkubW9udGgoNSkudXRjT2Zmc2V0KClcbiAgICApO1xufVxuXG5mdW5jdGlvbiBpc0RheWxpZ2h0U2F2aW5nVGltZVNoaWZ0ZWQgKCkge1xuICAgIGlmICghaXNVbmRlZmluZWQodGhpcy5faXNEU1RTaGlmdGVkKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNEU1RTaGlmdGVkO1xuICAgIH1cblxuICAgIHZhciBjID0ge307XG5cbiAgICBjb3B5Q29uZmlnKGMsIHRoaXMpO1xuICAgIGMgPSBwcmVwYXJlQ29uZmlnKGMpO1xuXG4gICAgaWYgKGMuX2EpIHtcbiAgICAgICAgdmFyIG90aGVyID0gYy5faXNVVEMgPyBjcmVhdGVVVEMoYy5fYSkgOiBjcmVhdGVMb2NhbChjLl9hKTtcbiAgICAgICAgdGhpcy5faXNEU1RTaGlmdGVkID0gdGhpcy5pc1ZhbGlkKCkgJiZcbiAgICAgICAgICAgIGNvbXBhcmVBcnJheXMoYy5fYSwgb3RoZXIudG9BcnJheSgpKSA+IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faXNEU1RTaGlmdGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2lzRFNUU2hpZnRlZDtcbn1cblxuZnVuY3Rpb24gaXNMb2NhbCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gIXRoaXMuX2lzVVRDIDogZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzVXRjT2Zmc2V0ICgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLl9pc1VUQyA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1V0YyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5faXNVVEMgJiYgdGhpcy5fb2Zmc2V0ID09PSAwIDogZmFsc2U7XG59XG5cbi8vIEFTUC5ORVQganNvbiBkYXRlIGZvcm1hdCByZWdleFxudmFyIGFzcE5ldFJlZ2V4ID0gL14oXFwtKT8oPzooXFxkKilbLiBdKT8oXFxkKylcXDooXFxkKykoPzpcXDooXFxkKykoXFwuXFxkKik/KT8kLztcblxuLy8gZnJvbSBodHRwOi8vZG9jcy5jbG9zdXJlLWxpYnJhcnkuZ29vZ2xlY29kZS5jb20vZ2l0L2Nsb3N1cmVfZ29vZ19kYXRlX2RhdGUuanMuc291cmNlLmh0bWxcbi8vIHNvbWV3aGF0IG1vcmUgaW4gbGluZSB3aXRoIDQuNC4zLjIgMjAwNCBzcGVjLCBidXQgYWxsb3dzIGRlY2ltYWwgYW55d2hlcmVcbi8vIGFuZCBmdXJ0aGVyIG1vZGlmaWVkIHRvIGFsbG93IGZvciBzdHJpbmdzIGNvbnRhaW5pbmcgYm90aCB3ZWVrIGFuZCBkYXlcbnZhciBpc29SZWdleCA9IC9eKC0pP1AoPzooLT9bMC05LC5dKilZKT8oPzooLT9bMC05LC5dKilNKT8oPzooLT9bMC05LC5dKilXKT8oPzooLT9bMC05LC5dKilEKT8oPzpUKD86KC0/WzAtOSwuXSopSCk/KD86KC0/WzAtOSwuXSopTSk/KD86KC0/WzAtOSwuXSopUyk/KT8kLztcblxuZnVuY3Rpb24gY3JlYXRlRHVyYXRpb24gKGlucHV0LCBrZXkpIHtcbiAgICB2YXIgZHVyYXRpb24gPSBpbnB1dCxcbiAgICAgICAgLy8gbWF0Y2hpbmcgYWdhaW5zdCByZWdleHAgaXMgZXhwZW5zaXZlLCBkbyBpdCBvbiBkZW1hbmRcbiAgICAgICAgbWF0Y2ggPSBudWxsLFxuICAgICAgICBzaWduLFxuICAgICAgICByZXQsXG4gICAgICAgIGRpZmZSZXM7XG5cbiAgICBpZiAoaXNEdXJhdGlvbihpbnB1dCkpIHtcbiAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICBtcyA6IGlucHV0Ll9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICBkICA6IGlucHV0Ll9kYXlzLFxuICAgICAgICAgICAgTSAgOiBpbnB1dC5fbW9udGhzXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChpc051bWJlcihpbnB1dCkpIHtcbiAgICAgICAgZHVyYXRpb24gPSB7fTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgZHVyYXRpb25ba2V5XSA9IGlucHV0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZHVyYXRpb24ubWlsbGlzZWNvbmRzID0gaW5wdXQ7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCEhKG1hdGNoID0gYXNwTmV0UmVnZXguZXhlYyhpbnB1dCkpKSB7XG4gICAgICAgIHNpZ24gPSAobWF0Y2hbMV0gPT09ICctJykgPyAtMSA6IDE7XG4gICAgICAgIGR1cmF0aW9uID0ge1xuICAgICAgICAgICAgeSAgOiAwLFxuICAgICAgICAgICAgZCAgOiB0b0ludChtYXRjaFtEQVRFXSkgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaWduLFxuICAgICAgICAgICAgaCAgOiB0b0ludChtYXRjaFtIT1VSXSkgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaWduLFxuICAgICAgICAgICAgbSAgOiB0b0ludChtYXRjaFtNSU5VVEVdKSAgICAgICAgICAgICAgICAgICAgICAgKiBzaWduLFxuICAgICAgICAgICAgcyAgOiB0b0ludChtYXRjaFtTRUNPTkRdKSAgICAgICAgICAgICAgICAgICAgICAgKiBzaWduLFxuICAgICAgICAgICAgbXMgOiB0b0ludChhYnNSb3VuZChtYXRjaFtNSUxMSVNFQ09ORF0gKiAxMDAwKSkgKiBzaWduIC8vIHRoZSBtaWxsaXNlY29uZCBkZWNpbWFsIHBvaW50IGlzIGluY2x1ZGVkIGluIHRoZSBtYXRjaFxuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAoISEobWF0Y2ggPSBpc29SZWdleC5leGVjKGlucHV0KSkpIHtcbiAgICAgICAgc2lnbiA9IChtYXRjaFsxXSA9PT0gJy0nKSA/IC0xIDogMTtcbiAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICB5IDogcGFyc2VJc28obWF0Y2hbMl0sIHNpZ24pLFxuICAgICAgICAgICAgTSA6IHBhcnNlSXNvKG1hdGNoWzNdLCBzaWduKSxcbiAgICAgICAgICAgIHcgOiBwYXJzZUlzbyhtYXRjaFs0XSwgc2lnbiksXG4gICAgICAgICAgICBkIDogcGFyc2VJc28obWF0Y2hbNV0sIHNpZ24pLFxuICAgICAgICAgICAgaCA6IHBhcnNlSXNvKG1hdGNoWzZdLCBzaWduKSxcbiAgICAgICAgICAgIG0gOiBwYXJzZUlzbyhtYXRjaFs3XSwgc2lnbiksXG4gICAgICAgICAgICBzIDogcGFyc2VJc28obWF0Y2hbOF0sIHNpZ24pXG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChkdXJhdGlvbiA9PSBudWxsKSB7Ly8gY2hlY2tzIGZvciBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGR1cmF0aW9uID09PSAnb2JqZWN0JyAmJiAoJ2Zyb20nIGluIGR1cmF0aW9uIHx8ICd0bycgaW4gZHVyYXRpb24pKSB7XG4gICAgICAgIGRpZmZSZXMgPSBtb21lbnRzRGlmZmVyZW5jZShjcmVhdGVMb2NhbChkdXJhdGlvbi5mcm9tKSwgY3JlYXRlTG9jYWwoZHVyYXRpb24udG8pKTtcblxuICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICBkdXJhdGlvbi5tcyA9IGRpZmZSZXMubWlsbGlzZWNvbmRzO1xuICAgICAgICBkdXJhdGlvbi5NID0gZGlmZlJlcy5tb250aHM7XG4gICAgfVxuXG4gICAgcmV0ID0gbmV3IER1cmF0aW9uKGR1cmF0aW9uKTtcblxuICAgIGlmIChpc0R1cmF0aW9uKGlucHV0KSAmJiBoYXNPd25Qcm9wKGlucHV0LCAnX2xvY2FsZScpKSB7XG4gICAgICAgIHJldC5fbG9jYWxlID0gaW5wdXQuX2xvY2FsZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xufVxuXG5jcmVhdGVEdXJhdGlvbi5mbiA9IER1cmF0aW9uLnByb3RvdHlwZTtcbmNyZWF0ZUR1cmF0aW9uLmludmFsaWQgPSBjcmVhdGVJbnZhbGlkJDE7XG5cbmZ1bmN0aW9uIHBhcnNlSXNvIChpbnAsIHNpZ24pIHtcbiAgICAvLyBXZSdkIG5vcm1hbGx5IHVzZSB+fmlucCBmb3IgdGhpcywgYnV0IHVuZm9ydHVuYXRlbHkgaXQgYWxzb1xuICAgIC8vIGNvbnZlcnRzIGZsb2F0cyB0byBpbnRzLlxuICAgIC8vIGlucCBtYXkgYmUgdW5kZWZpbmVkLCBzbyBjYXJlZnVsIGNhbGxpbmcgcmVwbGFjZSBvbiBpdC5cbiAgICB2YXIgcmVzID0gaW5wICYmIHBhcnNlRmxvYXQoaW5wLnJlcGxhY2UoJywnLCAnLicpKTtcbiAgICAvLyBhcHBseSBzaWduIHdoaWxlIHdlJ3JlIGF0IGl0XG4gICAgcmV0dXJuIChpc05hTihyZXMpID8gMCA6IHJlcykgKiBzaWduO1xufVxuXG5mdW5jdGlvbiBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKSB7XG4gICAgdmFyIHJlcyA9IHttaWxsaXNlY29uZHM6IDAsIG1vbnRoczogMH07XG5cbiAgICByZXMubW9udGhzID0gb3RoZXIubW9udGgoKSAtIGJhc2UubW9udGgoKSArXG4gICAgICAgIChvdGhlci55ZWFyKCkgLSBiYXNlLnllYXIoKSkgKiAxMjtcbiAgICBpZiAoYmFzZS5jbG9uZSgpLmFkZChyZXMubW9udGhzLCAnTScpLmlzQWZ0ZXIob3RoZXIpKSB7XG4gICAgICAgIC0tcmVzLm1vbnRocztcbiAgICB9XG5cbiAgICByZXMubWlsbGlzZWNvbmRzID0gK290aGVyIC0gKyhiYXNlLmNsb25lKCkuYWRkKHJlcy5tb250aHMsICdNJykpO1xuXG4gICAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gbW9tZW50c0RpZmZlcmVuY2UoYmFzZSwgb3RoZXIpIHtcbiAgICB2YXIgcmVzO1xuICAgIGlmICghKGJhc2UuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgcmV0dXJuIHttaWxsaXNlY29uZHM6IDAsIG1vbnRoczogMH07XG4gICAgfVxuXG4gICAgb3RoZXIgPSBjbG9uZVdpdGhPZmZzZXQob3RoZXIsIGJhc2UpO1xuICAgIGlmIChiYXNlLmlzQmVmb3JlKG90aGVyKSkge1xuICAgICAgICByZXMgPSBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXMgPSBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKG90aGVyLCBiYXNlKTtcbiAgICAgICAgcmVzLm1pbGxpc2Vjb25kcyA9IC1yZXMubWlsbGlzZWNvbmRzO1xuICAgICAgICByZXMubW9udGhzID0gLXJlcy5tb250aHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbn1cblxuLy8gVE9ETzogcmVtb3ZlICduYW1lJyBhcmcgYWZ0ZXIgZGVwcmVjYXRpb24gaXMgcmVtb3ZlZFxuZnVuY3Rpb24gY3JlYXRlQWRkZXIoZGlyZWN0aW9uLCBuYW1lKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh2YWwsIHBlcmlvZCkge1xuICAgICAgICB2YXIgZHVyLCB0bXA7XG4gICAgICAgIC8vaW52ZXJ0IHRoZSBhcmd1bWVudHMsIGJ1dCBjb21wbGFpbiBhYm91dCBpdFxuICAgICAgICBpZiAocGVyaW9kICE9PSBudWxsICYmICFpc05hTigrcGVyaW9kKSkge1xuICAgICAgICAgICAgZGVwcmVjYXRlU2ltcGxlKG5hbWUsICdtb21lbnQoKS4nICsgbmFtZSAgKyAnKHBlcmlvZCwgbnVtYmVyKSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIG1vbWVudCgpLicgKyBuYW1lICsgJyhudW1iZXIsIHBlcmlvZCkuICcgK1xuICAgICAgICAgICAgJ1NlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2FkZC1pbnZlcnRlZC1wYXJhbS8gZm9yIG1vcmUgaW5mby4nKTtcbiAgICAgICAgICAgIHRtcCA9IHZhbDsgdmFsID0gcGVyaW9kOyBwZXJpb2QgPSB0bXA7XG4gICAgICAgIH1cblxuICAgICAgICB2YWwgPSB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/ICt2YWwgOiB2YWw7XG4gICAgICAgIGR1ciA9IGNyZWF0ZUR1cmF0aW9uKHZhbCwgcGVyaW9kKTtcbiAgICAgICAgYWRkU3VidHJhY3QodGhpcywgZHVyLCBkaXJlY3Rpb24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBhZGRTdWJ0cmFjdCAobW9tLCBkdXJhdGlvbiwgaXNBZGRpbmcsIHVwZGF0ZU9mZnNldCkge1xuICAgIHZhciBtaWxsaXNlY29uZHMgPSBkdXJhdGlvbi5fbWlsbGlzZWNvbmRzLFxuICAgICAgICBkYXlzID0gYWJzUm91bmQoZHVyYXRpb24uX2RheXMpLFxuICAgICAgICBtb250aHMgPSBhYnNSb3VuZChkdXJhdGlvbi5fbW9udGhzKTtcblxuICAgIGlmICghbW9tLmlzVmFsaWQoKSkge1xuICAgICAgICAvLyBObyBvcFxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdXBkYXRlT2Zmc2V0ID0gdXBkYXRlT2Zmc2V0ID09IG51bGwgPyB0cnVlIDogdXBkYXRlT2Zmc2V0O1xuXG4gICAgaWYgKG1pbGxpc2Vjb25kcykge1xuICAgICAgICBtb20uX2Quc2V0VGltZShtb20uX2QudmFsdWVPZigpICsgbWlsbGlzZWNvbmRzICogaXNBZGRpbmcpO1xuICAgIH1cbiAgICBpZiAoZGF5cykge1xuICAgICAgICBzZXQkMShtb20sICdEYXRlJywgZ2V0KG1vbSwgJ0RhdGUnKSArIGRheXMgKiBpc0FkZGluZyk7XG4gICAgfVxuICAgIGlmIChtb250aHMpIHtcbiAgICAgICAgc2V0TW9udGgobW9tLCBnZXQobW9tLCAnTW9udGgnKSArIG1vbnRocyAqIGlzQWRkaW5nKTtcbiAgICB9XG4gICAgaWYgKHVwZGF0ZU9mZnNldCkge1xuICAgICAgICBob29rcy51cGRhdGVPZmZzZXQobW9tLCBkYXlzIHx8IG1vbnRocyk7XG4gICAgfVxufVxuXG52YXIgYWRkICAgICAgPSBjcmVhdGVBZGRlcigxLCAnYWRkJyk7XG52YXIgc3VidHJhY3QgPSBjcmVhdGVBZGRlcigtMSwgJ3N1YnRyYWN0Jyk7XG5cbmZ1bmN0aW9uIGdldENhbGVuZGFyRm9ybWF0KG15TW9tZW50LCBub3cpIHtcbiAgICB2YXIgZGlmZiA9IG15TW9tZW50LmRpZmYobm93LCAnZGF5cycsIHRydWUpO1xuICAgIHJldHVybiBkaWZmIDwgLTYgPyAnc2FtZUVsc2UnIDpcbiAgICAgICAgICAgIGRpZmYgPCAtMSA/ICdsYXN0V2VlaycgOlxuICAgICAgICAgICAgZGlmZiA8IDAgPyAnbGFzdERheScgOlxuICAgICAgICAgICAgZGlmZiA8IDEgPyAnc2FtZURheScgOlxuICAgICAgICAgICAgZGlmZiA8IDIgPyAnbmV4dERheScgOlxuICAgICAgICAgICAgZGlmZiA8IDcgPyAnbmV4dFdlZWsnIDogJ3NhbWVFbHNlJztcbn1cblxuZnVuY3Rpb24gY2FsZW5kYXIkMSAodGltZSwgZm9ybWF0cykge1xuICAgIC8vIFdlIHdhbnQgdG8gY29tcGFyZSB0aGUgc3RhcnQgb2YgdG9kYXksIHZzIHRoaXMuXG4gICAgLy8gR2V0dGluZyBzdGFydC1vZi10b2RheSBkZXBlbmRzIG9uIHdoZXRoZXIgd2UncmUgbG9jYWwvdXRjL29mZnNldCBvciBub3QuXG4gICAgdmFyIG5vdyA9IHRpbWUgfHwgY3JlYXRlTG9jYWwoKSxcbiAgICAgICAgc29kID0gY2xvbmVXaXRoT2Zmc2V0KG5vdywgdGhpcykuc3RhcnRPZignZGF5JyksXG4gICAgICAgIGZvcm1hdCA9IGhvb2tzLmNhbGVuZGFyRm9ybWF0KHRoaXMsIHNvZCkgfHwgJ3NhbWVFbHNlJztcblxuICAgIHZhciBvdXRwdXQgPSBmb3JtYXRzICYmIChpc0Z1bmN0aW9uKGZvcm1hdHNbZm9ybWF0XSkgPyBmb3JtYXRzW2Zvcm1hdF0uY2FsbCh0aGlzLCBub3cpIDogZm9ybWF0c1tmb3JtYXRdKTtcblxuICAgIHJldHVybiB0aGlzLmZvcm1hdChvdXRwdXQgfHwgdGhpcy5sb2NhbGVEYXRhKCkuY2FsZW5kYXIoZm9ybWF0LCB0aGlzLCBjcmVhdGVMb2NhbChub3cpKSk7XG59XG5cbmZ1bmN0aW9uIGNsb25lICgpIHtcbiAgICByZXR1cm4gbmV3IE1vbWVudCh0aGlzKTtcbn1cblxuZnVuY3Rpb24gaXNBZnRlciAoaW5wdXQsIHVuaXRzKSB7XG4gICAgdmFyIGxvY2FsSW5wdXQgPSBpc01vbWVudChpbnB1dCkgPyBpbnB1dCA6IGNyZWF0ZUxvY2FsKGlucHV0KTtcbiAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbElucHV0LmlzVmFsaWQoKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKCFpc1VuZGVmaW5lZCh1bml0cykgPyB1bml0cyA6ICdtaWxsaXNlY29uZCcpO1xuICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPiBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbG9jYWxJbnB1dC52YWx1ZU9mKCkgPCB0aGlzLmNsb25lKCkuc3RhcnRPZih1bml0cykudmFsdWVPZigpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNCZWZvcmUgKGlucHV0LCB1bml0cykge1xuICAgIHZhciBsb2NhbElucHV0ID0gaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBjcmVhdGVMb2NhbChpbnB1dCk7XG4gICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxJbnB1dC5pc1ZhbGlkKCkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyghaXNVbmRlZmluZWQodW5pdHMpID8gdW5pdHMgOiAnbWlsbGlzZWNvbmQnKTtcbiAgICBpZiAodW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpIDwgbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5lbmRPZih1bml0cykudmFsdWVPZigpIDwgbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc0JldHdlZW4gKGZyb20sIHRvLCB1bml0cywgaW5jbHVzaXZpdHkpIHtcbiAgICBpbmNsdXNpdml0eSA9IGluY2x1c2l2aXR5IHx8ICcoKSc7XG4gICAgcmV0dXJuIChpbmNsdXNpdml0eVswXSA9PT0gJygnID8gdGhpcy5pc0FmdGVyKGZyb20sIHVuaXRzKSA6ICF0aGlzLmlzQmVmb3JlKGZyb20sIHVuaXRzKSkgJiZcbiAgICAgICAgKGluY2x1c2l2aXR5WzFdID09PSAnKScgPyB0aGlzLmlzQmVmb3JlKHRvLCB1bml0cykgOiAhdGhpcy5pc0FmdGVyKHRvLCB1bml0cykpO1xufVxuXG5mdW5jdGlvbiBpc1NhbWUgKGlucHV0LCB1bml0cykge1xuICAgIHZhciBsb2NhbElucHV0ID0gaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBjcmVhdGVMb2NhbChpbnB1dCksXG4gICAgICAgIGlucHV0TXM7XG4gICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxJbnB1dC5pc1ZhbGlkKCkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyB8fCAnbWlsbGlzZWNvbmQnKTtcbiAgICBpZiAodW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpID09PSBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpbnB1dE1zID0gbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuc3RhcnRPZih1bml0cykudmFsdWVPZigpIDw9IGlucHV0TXMgJiYgaW5wdXRNcyA8PSB0aGlzLmNsb25lKCkuZW5kT2YodW5pdHMpLnZhbHVlT2YoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzU2FtZU9yQWZ0ZXIgKGlucHV0LCB1bml0cykge1xuICAgIHJldHVybiB0aGlzLmlzU2FtZShpbnB1dCwgdW5pdHMpIHx8IHRoaXMuaXNBZnRlcihpbnB1dCx1bml0cyk7XG59XG5cbmZ1bmN0aW9uIGlzU2FtZU9yQmVmb3JlIChpbnB1dCwgdW5pdHMpIHtcbiAgICByZXR1cm4gdGhpcy5pc1NhbWUoaW5wdXQsIHVuaXRzKSB8fCB0aGlzLmlzQmVmb3JlKGlucHV0LHVuaXRzKTtcbn1cblxuZnVuY3Rpb24gZGlmZiAoaW5wdXQsIHVuaXRzLCBhc0Zsb2F0KSB7XG4gICAgdmFyIHRoYXQsXG4gICAgICAgIHpvbmVEZWx0YSxcbiAgICAgICAgZGVsdGEsIG91dHB1dDtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICB9XG5cbiAgICB0aGF0ID0gY2xvbmVXaXRoT2Zmc2V0KGlucHV0LCB0aGlzKTtcblxuICAgIGlmICghdGhhdC5pc1ZhbGlkKCkpIHtcbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICB9XG5cbiAgICB6b25lRGVsdGEgPSAodGhhdC51dGNPZmZzZXQoKSAtIHRoaXMudXRjT2Zmc2V0KCkpICogNmU0O1xuXG4gICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG5cbiAgICBpZiAodW5pdHMgPT09ICd5ZWFyJyB8fCB1bml0cyA9PT0gJ21vbnRoJyB8fCB1bml0cyA9PT0gJ3F1YXJ0ZXInKSB7XG4gICAgICAgIG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KTtcbiAgICAgICAgaWYgKHVuaXRzID09PSAncXVhcnRlcicpIHtcbiAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dCAvIDM7XG4gICAgICAgIH0gZWxzZSBpZiAodW5pdHMgPT09ICd5ZWFyJykge1xuICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0IC8gMTI7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBkZWx0YSA9IHRoaXMgLSB0aGF0O1xuICAgICAgICBvdXRwdXQgPSB1bml0cyA9PT0gJ3NlY29uZCcgPyBkZWx0YSAvIDFlMyA6IC8vIDEwMDBcbiAgICAgICAgICAgIHVuaXRzID09PSAnbWludXRlJyA/IGRlbHRhIC8gNmU0IDogLy8gMTAwMCAqIDYwXG4gICAgICAgICAgICB1bml0cyA9PT0gJ2hvdXInID8gZGVsdGEgLyAzNmU1IDogLy8gMTAwMCAqIDYwICogNjBcbiAgICAgICAgICAgIHVuaXRzID09PSAnZGF5JyA/IChkZWx0YSAtIHpvbmVEZWx0YSkgLyA4NjRlNSA6IC8vIDEwMDAgKiA2MCAqIDYwICogMjQsIG5lZ2F0ZSBkc3RcbiAgICAgICAgICAgIHVuaXRzID09PSAnd2VlaycgPyAoZGVsdGEgLSB6b25lRGVsdGEpIC8gNjA0OGU1IDogLy8gMTAwMCAqIDYwICogNjAgKiAyNCAqIDcsIG5lZ2F0ZSBkc3RcbiAgICAgICAgICAgIGRlbHRhO1xuICAgIH1cbiAgICByZXR1cm4gYXNGbG9hdCA/IG91dHB1dCA6IGFic0Zsb29yKG91dHB1dCk7XG59XG5cbmZ1bmN0aW9uIG1vbnRoRGlmZiAoYSwgYikge1xuICAgIC8vIGRpZmZlcmVuY2UgaW4gbW9udGhzXG4gICAgdmFyIHdob2xlTW9udGhEaWZmID0gKChiLnllYXIoKSAtIGEueWVhcigpKSAqIDEyKSArIChiLm1vbnRoKCkgLSBhLm1vbnRoKCkpLFxuICAgICAgICAvLyBiIGlzIGluIChhbmNob3IgLSAxIG1vbnRoLCBhbmNob3IgKyAxIG1vbnRoKVxuICAgICAgICBhbmNob3IgPSBhLmNsb25lKCkuYWRkKHdob2xlTW9udGhEaWZmLCAnbW9udGhzJyksXG4gICAgICAgIGFuY2hvcjIsIGFkanVzdDtcblxuICAgIGlmIChiIC0gYW5jaG9yIDwgMCkge1xuICAgICAgICBhbmNob3IyID0gYS5jbG9uZSgpLmFkZCh3aG9sZU1vbnRoRGlmZiAtIDEsICdtb250aHMnKTtcbiAgICAgICAgLy8gbGluZWFyIGFjcm9zcyB0aGUgbW9udGhcbiAgICAgICAgYWRqdXN0ID0gKGIgLSBhbmNob3IpIC8gKGFuY2hvciAtIGFuY2hvcjIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGFuY2hvcjIgPSBhLmNsb25lKCkuYWRkKHdob2xlTW9udGhEaWZmICsgMSwgJ21vbnRocycpO1xuICAgICAgICAvLyBsaW5lYXIgYWNyb3NzIHRoZSBtb250aFxuICAgICAgICBhZGp1c3QgPSAoYiAtIGFuY2hvcikgLyAoYW5jaG9yMiAtIGFuY2hvcik7XG4gICAgfVxuXG4gICAgLy9jaGVjayBmb3IgbmVnYXRpdmUgemVybywgcmV0dXJuIHplcm8gaWYgbmVnYXRpdmUgemVyb1xuICAgIHJldHVybiAtKHdob2xlTW9udGhEaWZmICsgYWRqdXN0KSB8fCAwO1xufVxuXG5ob29rcy5kZWZhdWx0Rm9ybWF0ID0gJ1lZWVktTU0tRERUSEg6bW06c3NaJztcbmhvb2tzLmRlZmF1bHRGb3JtYXRVdGMgPSAnWVlZWS1NTS1ERFRISDptbTpzc1taXSc7XG5cbmZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmxvY2FsZSgnZW4nKS5mb3JtYXQoJ2RkZCBNTU0gREQgWVlZWSBISDptbTpzcyBbR01UXVpaJyk7XG59XG5cbmZ1bmN0aW9uIHRvSVNPU3RyaW5nKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBtID0gdGhpcy5jbG9uZSgpLnV0YygpO1xuICAgIGlmIChtLnllYXIoKSA8IDAgfHwgbS55ZWFyKCkgPiA5OTk5KSB7XG4gICAgICAgIHJldHVybiBmb3JtYXRNb21lbnQobSwgJ1lZWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXScpO1xuICAgIH1cbiAgICBpZiAoaXNGdW5jdGlvbihEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZykpIHtcbiAgICAgICAgLy8gbmF0aXZlIGltcGxlbWVudGF0aW9uIGlzIH41MHggZmFzdGVyLCB1c2UgaXQgd2hlbiB3ZSBjYW5cbiAgICAgICAgcmV0dXJuIHRoaXMudG9EYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvcm1hdE1vbWVudChtLCAnWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXScpO1xufVxuXG4vKipcbiAqIFJldHVybiBhIGh1bWFuIHJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9tZW50IHRoYXQgY2FuXG4gKiBhbHNvIGJlIGV2YWx1YXRlZCB0byBnZXQgYSBuZXcgbW9tZW50IHdoaWNoIGlzIHRoZSBzYW1lXG4gKlxuICogQGxpbmsgaHR0cHM6Ly9ub2RlanMub3JnL2Rpc3QvbGF0ZXN0L2RvY3MvYXBpL3V0aWwuaHRtbCN1dGlsX2N1c3RvbV9pbnNwZWN0X2Z1bmN0aW9uX29uX29iamVjdHNcbiAqL1xuZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICByZXR1cm4gJ21vbWVudC5pbnZhbGlkKC8qICcgKyB0aGlzLl9pICsgJyAqLyknO1xuICAgIH1cbiAgICB2YXIgZnVuYyA9ICdtb21lbnQnO1xuICAgIHZhciB6b25lID0gJyc7XG4gICAgaWYgKCF0aGlzLmlzTG9jYWwoKSkge1xuICAgICAgICBmdW5jID0gdGhpcy51dGNPZmZzZXQoKSA9PT0gMCA/ICdtb21lbnQudXRjJyA6ICdtb21lbnQucGFyc2Vab25lJztcbiAgICAgICAgem9uZSA9ICdaJztcbiAgICB9XG4gICAgdmFyIHByZWZpeCA9ICdbJyArIGZ1bmMgKyAnKFwiXSc7XG4gICAgdmFyIHllYXIgPSAoMCA8PSB0aGlzLnllYXIoKSAmJiB0aGlzLnllYXIoKSA8PSA5OTk5KSA/ICdZWVlZJyA6ICdZWVlZWVknO1xuICAgIHZhciBkYXRldGltZSA9ICctTU0tRERbVF1ISDptbTpzcy5TU1MnO1xuICAgIHZhciBzdWZmaXggPSB6b25lICsgJ1tcIildJztcblxuICAgIHJldHVybiB0aGlzLmZvcm1hdChwcmVmaXggKyB5ZWFyICsgZGF0ZXRpbWUgKyBzdWZmaXgpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXQgKGlucHV0U3RyaW5nKSB7XG4gICAgaWYgKCFpbnB1dFN0cmluZykge1xuICAgICAgICBpbnB1dFN0cmluZyA9IHRoaXMuaXNVdGMoKSA/IGhvb2tzLmRlZmF1bHRGb3JtYXRVdGMgOiBob29rcy5kZWZhdWx0Rm9ybWF0O1xuICAgIH1cbiAgICB2YXIgb3V0cHV0ID0gZm9ybWF0TW9tZW50KHRoaXMsIGlucHV0U3RyaW5nKTtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkucG9zdGZvcm1hdChvdXRwdXQpO1xufVxuXG5mdW5jdGlvbiBmcm9tICh0aW1lLCB3aXRob3V0U3VmZml4KSB7XG4gICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmXG4gICAgICAgICAgICAoKGlzTW9tZW50KHRpbWUpICYmIHRpbWUuaXNWYWxpZCgpKSB8fFxuICAgICAgICAgICAgIGNyZWF0ZUxvY2FsKHRpbWUpLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKHt0bzogdGhpcywgZnJvbTogdGltZX0pLmxvY2FsZSh0aGlzLmxvY2FsZSgpKS5odW1hbml6ZSghd2l0aG91dFN1ZmZpeCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBmcm9tTm93ICh3aXRob3V0U3VmZml4KSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbShjcmVhdGVMb2NhbCgpLCB3aXRob3V0U3VmZml4KTtcbn1cblxuZnVuY3Rpb24gdG8gKHRpbWUsIHdpdGhvdXRTdWZmaXgpIHtcbiAgICBpZiAodGhpcy5pc1ZhbGlkKCkgJiZcbiAgICAgICAgICAgICgoaXNNb21lbnQodGltZSkgJiYgdGltZS5pc1ZhbGlkKCkpIHx8XG4gICAgICAgICAgICAgY3JlYXRlTG9jYWwodGltZSkuaXNWYWxpZCgpKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oe2Zyb206IHRoaXMsIHRvOiB0aW1lfSkubG9jYWxlKHRoaXMubG9jYWxlKCkpLmh1bWFuaXplKCF3aXRob3V0U3VmZml4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHRvTm93ICh3aXRob3V0U3VmZml4KSB7XG4gICAgcmV0dXJuIHRoaXMudG8oY3JlYXRlTG9jYWwoKSwgd2l0aG91dFN1ZmZpeCk7XG59XG5cbi8vIElmIHBhc3NlZCBhIGxvY2FsZSBrZXksIGl0IHdpbGwgc2V0IHRoZSBsb2NhbGUgZm9yIHRoaXNcbi8vIGluc3RhbmNlLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIHJldHVybiB0aGUgbG9jYWxlIGNvbmZpZ3VyYXRpb25cbi8vIHZhcmlhYmxlcyBmb3IgdGhpcyBpbnN0YW5jZS5cbmZ1bmN0aW9uIGxvY2FsZSAoa2V5KSB7XG4gICAgdmFyIG5ld0xvY2FsZURhdGE7XG5cbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZS5fYWJicjtcbiAgICB9IGVsc2Uge1xuICAgICAgICBuZXdMb2NhbGVEYXRhID0gZ2V0TG9jYWxlKGtleSk7XG4gICAgICAgIGlmIChuZXdMb2NhbGVEYXRhICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvY2FsZSA9IG5ld0xvY2FsZURhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG52YXIgbGFuZyA9IGRlcHJlY2F0ZShcbiAgICAnbW9tZW50KCkubGFuZygpIGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBtb21lbnQoKS5sb2NhbGVEYXRhKCkgdG8gZ2V0IHRoZSBsYW5ndWFnZSBjb25maWd1cmF0aW9uLiBVc2UgbW9tZW50KCkubG9jYWxlKCkgdG8gY2hhbmdlIGxhbmd1YWdlcy4nLFxuICAgIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGUoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cbik7XG5cbmZ1bmN0aW9uIGxvY2FsZURhdGEgKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2NhbGU7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0T2YgKHVuaXRzKSB7XG4gICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgLy8gdGhlIGZvbGxvd2luZyBzd2l0Y2ggaW50ZW50aW9uYWxseSBvbWl0cyBicmVhayBrZXl3b3Jkc1xuICAgIC8vIHRvIHV0aWxpemUgZmFsbGluZyB0aHJvdWdoIHRoZSBjYXNlcy5cbiAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgdGhpcy5tb250aCgwKTtcbiAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgY2FzZSAncXVhcnRlcic6XG4gICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgIHRoaXMuZGF0ZSgxKTtcbiAgICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgIGNhc2UgJ2lzb1dlZWsnOlxuICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICAgIHRoaXMuaG91cnMoMCk7XG4gICAgICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgdGhpcy5taW51dGVzKDApO1xuICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICAgICAgdGhpcy5zZWNvbmRzKDApO1xuICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgdGhpcy5taWxsaXNlY29uZHMoMCk7XG4gICAgfVxuXG4gICAgLy8gd2Vla3MgYXJlIGEgc3BlY2lhbCBjYXNlXG4gICAgaWYgKHVuaXRzID09PSAnd2VlaycpIHtcbiAgICAgICAgdGhpcy53ZWVrZGF5KDApO1xuICAgIH1cbiAgICBpZiAodW5pdHMgPT09ICdpc29XZWVrJykge1xuICAgICAgICB0aGlzLmlzb1dlZWtkYXkoMSk7XG4gICAgfVxuXG4gICAgLy8gcXVhcnRlcnMgYXJlIGFsc28gc3BlY2lhbFxuICAgIGlmICh1bml0cyA9PT0gJ3F1YXJ0ZXInKSB7XG4gICAgICAgIHRoaXMubW9udGgoTWF0aC5mbG9vcih0aGlzLm1vbnRoKCkgLyAzKSAqIDMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5mdW5jdGlvbiBlbmRPZiAodW5pdHMpIHtcbiAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICBpZiAodW5pdHMgPT09IHVuZGVmaW5lZCB8fCB1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyAnZGF0ZScgaXMgYW4gYWxpYXMgZm9yICdkYXknLCBzbyBpdCBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyBzdWNoLlxuICAgIGlmICh1bml0cyA9PT0gJ2RhdGUnKSB7XG4gICAgICAgIHVuaXRzID0gJ2RheSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RhcnRPZih1bml0cykuYWRkKDEsICh1bml0cyA9PT0gJ2lzb1dlZWsnID8gJ3dlZWsnIDogdW5pdHMpKS5zdWJ0cmFjdCgxLCAnbXMnKTtcbn1cblxuZnVuY3Rpb24gdmFsdWVPZiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2QudmFsdWVPZigpIC0gKCh0aGlzLl9vZmZzZXQgfHwgMCkgKiA2MDAwMCk7XG59XG5cbmZ1bmN0aW9uIHVuaXggKCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMudmFsdWVPZigpIC8gMTAwMCk7XG59XG5cbmZ1bmN0aW9uIHRvRGF0ZSAoKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMudmFsdWVPZigpKTtcbn1cblxuZnVuY3Rpb24gdG9BcnJheSAoKSB7XG4gICAgdmFyIG0gPSB0aGlzO1xuICAgIHJldHVybiBbbS55ZWFyKCksIG0ubW9udGgoKSwgbS5kYXRlKCksIG0uaG91cigpLCBtLm1pbnV0ZSgpLCBtLnNlY29uZCgpLCBtLm1pbGxpc2Vjb25kKCldO1xufVxuXG5mdW5jdGlvbiB0b09iamVjdCAoKSB7XG4gICAgdmFyIG0gPSB0aGlzO1xuICAgIHJldHVybiB7XG4gICAgICAgIHllYXJzOiBtLnllYXIoKSxcbiAgICAgICAgbW9udGhzOiBtLm1vbnRoKCksXG4gICAgICAgIGRhdGU6IG0uZGF0ZSgpLFxuICAgICAgICBob3VyczogbS5ob3VycygpLFxuICAgICAgICBtaW51dGVzOiBtLm1pbnV0ZXMoKSxcbiAgICAgICAgc2Vjb25kczogbS5zZWNvbmRzKCksXG4gICAgICAgIG1pbGxpc2Vjb25kczogbS5taWxsaXNlY29uZHMoKVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gICAgLy8gbmV3IERhdGUoTmFOKS50b0pTT04oKSA9PT0gbnVsbFxuICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMudG9JU09TdHJpbmcoKSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWQkMiAoKSB7XG4gICAgcmV0dXJuIGlzVmFsaWQodGhpcyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNpbmdGbGFncyAoKSB7XG4gICAgcmV0dXJuIGV4dGVuZCh7fSwgZ2V0UGFyc2luZ0ZsYWdzKHRoaXMpKTtcbn1cblxuZnVuY3Rpb24gaW52YWxpZEF0ICgpIHtcbiAgICByZXR1cm4gZ2V0UGFyc2luZ0ZsYWdzKHRoaXMpLm92ZXJmbG93O1xufVxuXG5mdW5jdGlvbiBjcmVhdGlvbkRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5wdXQ6IHRoaXMuX2ksXG4gICAgICAgIGZvcm1hdDogdGhpcy5fZixcbiAgICAgICAgbG9jYWxlOiB0aGlzLl9sb2NhbGUsXG4gICAgICAgIGlzVVRDOiB0aGlzLl9pc1VUQyxcbiAgICAgICAgc3RyaWN0OiB0aGlzLl9zdHJpY3RcbiAgICB9O1xufVxuXG4vLyBGT1JNQVRUSU5HXG5cbmFkZEZvcm1hdFRva2VuKDAsIFsnZ2cnLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLndlZWtZZWFyKCkgJSAxMDA7XG59KTtcblxuYWRkRm9ybWF0VG9rZW4oMCwgWydHRycsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNvV2Vla1llYXIoKSAlIDEwMDtcbn0pO1xuXG5mdW5jdGlvbiBhZGRXZWVrWWVhckZvcm1hdFRva2VuICh0b2tlbiwgZ2V0dGVyKSB7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgW3Rva2VuLCB0b2tlbi5sZW5ndGhdLCAwLCBnZXR0ZXIpO1xufVxuXG5hZGRXZWVrWWVhckZvcm1hdFRva2VuKCdnZ2dnJywgICAgICd3ZWVrWWVhcicpO1xuYWRkV2Vla1llYXJGb3JtYXRUb2tlbignZ2dnZ2cnLCAgICAnd2Vla1llYXInKTtcbmFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ0dHR0cnLCAgJ2lzb1dlZWtZZWFyJyk7XG5hZGRXZWVrWWVhckZvcm1hdFRva2VuKCdHR0dHRycsICdpc29XZWVrWWVhcicpO1xuXG4vLyBBTElBU0VTXG5cbmFkZFVuaXRBbGlhcygnd2Vla1llYXInLCAnZ2cnKTtcbmFkZFVuaXRBbGlhcygnaXNvV2Vla1llYXInLCAnR0cnKTtcblxuLy8gUFJJT1JJVFlcblxuYWRkVW5pdFByaW9yaXR5KCd3ZWVrWWVhcicsIDEpO1xuYWRkVW5pdFByaW9yaXR5KCdpc29XZWVrWWVhcicsIDEpO1xuXG5cbi8vIFBBUlNJTkdcblxuYWRkUmVnZXhUb2tlbignRycsICAgICAgbWF0Y2hTaWduZWQpO1xuYWRkUmVnZXhUb2tlbignZycsICAgICAgbWF0Y2hTaWduZWQpO1xuYWRkUmVnZXhUb2tlbignR0cnLCAgICAgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuYWRkUmVnZXhUb2tlbignZ2cnLCAgICAgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuYWRkUmVnZXhUb2tlbignR0dHRycsICAgbWF0Y2gxdG80LCBtYXRjaDQpO1xuYWRkUmVnZXhUb2tlbignZ2dnZycsICAgbWF0Y2gxdG80LCBtYXRjaDQpO1xuYWRkUmVnZXhUb2tlbignR0dHR0cnLCAgbWF0Y2gxdG82LCBtYXRjaDYpO1xuYWRkUmVnZXhUb2tlbignZ2dnZ2cnLCAgbWF0Y2gxdG82LCBtYXRjaDYpO1xuXG5hZGRXZWVrUGFyc2VUb2tlbihbJ2dnZ2cnLCAnZ2dnZ2cnLCAnR0dHRycsICdHR0dHRyddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICB3ZWVrW3Rva2VuLnN1YnN0cigwLCAyKV0gPSB0b0ludChpbnB1dCk7XG59KTtcblxuYWRkV2Vla1BhcnNlVG9rZW4oWydnZycsICdHRyddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICB3ZWVrW3Rva2VuXSA9IGhvb2tzLnBhcnNlVHdvRGlnaXRZZWFyKGlucHV0KTtcbn0pO1xuXG4vLyBNT01FTlRTXG5cbmZ1bmN0aW9uIGdldFNldFdlZWtZZWFyIChpbnB1dCkge1xuICAgIHJldHVybiBnZXRTZXRXZWVrWWVhckhlbHBlci5jYWxsKHRoaXMsXG4gICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgIHRoaXMud2VlaygpLFxuICAgICAgICAgICAgdGhpcy53ZWVrZGF5KCksXG4gICAgICAgICAgICB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3csXG4gICAgICAgICAgICB0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3kpO1xufVxuXG5mdW5jdGlvbiBnZXRTZXRJU09XZWVrWWVhciAoaW5wdXQpIHtcbiAgICByZXR1cm4gZ2V0U2V0V2Vla1llYXJIZWxwZXIuY2FsbCh0aGlzLFxuICAgICAgICAgICAgaW5wdXQsIHRoaXMuaXNvV2VlaygpLCB0aGlzLmlzb1dlZWtkYXkoKSwgMSwgNCk7XG59XG5cbmZ1bmN0aW9uIGdldElTT1dlZWtzSW5ZZWFyICgpIHtcbiAgICByZXR1cm4gd2Vla3NJblllYXIodGhpcy55ZWFyKCksIDEsIDQpO1xufVxuXG5mdW5jdGlvbiBnZXRXZWVrc0luWWVhciAoKSB7XG4gICAgdmFyIHdlZWtJbmZvID0gdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWs7XG4gICAgcmV0dXJuIHdlZWtzSW5ZZWFyKHRoaXMueWVhcigpLCB3ZWVrSW5mby5kb3csIHdlZWtJbmZvLmRveSk7XG59XG5cbmZ1bmN0aW9uIGdldFNldFdlZWtZZWFySGVscGVyKGlucHV0LCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSkge1xuICAgIHZhciB3ZWVrc1RhcmdldDtcbiAgICBpZiAoaW5wdXQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gd2Vla09mWWVhcih0aGlzLCBkb3csIGRveSkueWVhcjtcbiAgICB9IGVsc2Uge1xuICAgICAgICB3ZWVrc1RhcmdldCA9IHdlZWtzSW5ZZWFyKGlucHV0LCBkb3csIGRveSk7XG4gICAgICAgIGlmICh3ZWVrID4gd2Vla3NUYXJnZXQpIHtcbiAgICAgICAgICAgIHdlZWsgPSB3ZWVrc1RhcmdldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2V0V2Vla0FsbC5jYWxsKHRoaXMsIGlucHV0LCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzZXRXZWVrQWxsKHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSkge1xuICAgIHZhciBkYXlPZlllYXJEYXRhID0gZGF5T2ZZZWFyRnJvbVdlZWtzKHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSksXG4gICAgICAgIGRhdGUgPSBjcmVhdGVVVENEYXRlKGRheU9mWWVhckRhdGEueWVhciwgMCwgZGF5T2ZZZWFyRGF0YS5kYXlPZlllYXIpO1xuXG4gICAgdGhpcy55ZWFyKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSk7XG4gICAgdGhpcy5tb250aChkYXRlLmdldFVUQ01vbnRoKCkpO1xuICAgIHRoaXMuZGF0ZShkYXRlLmdldFVUQ0RhdGUoKSk7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cbi8vIEZPUk1BVFRJTkdcblxuYWRkRm9ybWF0VG9rZW4oJ1EnLCAwLCAnUW8nLCAncXVhcnRlcicpO1xuXG4vLyBBTElBU0VTXG5cbmFkZFVuaXRBbGlhcygncXVhcnRlcicsICdRJyk7XG5cbi8vIFBSSU9SSVRZXG5cbmFkZFVuaXRQcmlvcml0eSgncXVhcnRlcicsIDcpO1xuXG4vLyBQQVJTSU5HXG5cbmFkZFJlZ2V4VG9rZW4oJ1EnLCBtYXRjaDEpO1xuYWRkUGFyc2VUb2tlbignUScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICBhcnJheVtNT05USF0gPSAodG9JbnQoaW5wdXQpIC0gMSkgKiAzO1xufSk7XG5cbi8vIE1PTUVOVFNcblxuZnVuY3Rpb24gZ2V0U2V0UXVhcnRlciAoaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IE1hdGguY2VpbCgodGhpcy5tb250aCgpICsgMSkgLyAzKSA6IHRoaXMubW9udGgoKGlucHV0IC0gMSkgKiAzICsgdGhpcy5tb250aCgpICUgMyk7XG59XG5cbi8vIEZPUk1BVFRJTkdcblxuYWRkRm9ybWF0VG9rZW4oJ0QnLCBbJ0REJywgMl0sICdEbycsICdkYXRlJyk7XG5cbi8vIEFMSUFTRVNcblxuYWRkVW5pdEFsaWFzKCdkYXRlJywgJ0QnKTtcblxuLy8gUFJJT1JPSVRZXG5hZGRVbml0UHJpb3JpdHkoJ2RhdGUnLCA5KTtcblxuLy8gUEFSU0lOR1xuXG5hZGRSZWdleFRva2VuKCdEJywgIG1hdGNoMXRvMik7XG5hZGRSZWdleFRva2VuKCdERCcsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbmFkZFJlZ2V4VG9rZW4oJ0RvJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAvLyBUT0RPOiBSZW1vdmUgXCJvcmRpbmFsUGFyc2VcIiBmYWxsYmFjayBpbiBuZXh0IG1ham9yIHJlbGVhc2UuXG4gICAgcmV0dXJuIGlzU3RyaWN0ID9cbiAgICAgIChsb2NhbGUuX2RheU9mTW9udGhPcmRpbmFsUGFyc2UgfHwgbG9jYWxlLl9vcmRpbmFsUGFyc2UpIDpcbiAgICAgIGxvY2FsZS5fZGF5T2ZNb250aE9yZGluYWxQYXJzZUxlbmllbnQ7XG59KTtcblxuYWRkUGFyc2VUb2tlbihbJ0QnLCAnREQnXSwgREFURSk7XG5hZGRQYXJzZVRva2VuKCdEbycsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICBhcnJheVtEQVRFXSA9IHRvSW50KGlucHV0Lm1hdGNoKG1hdGNoMXRvMilbMF0sIDEwKTtcbn0pO1xuXG4vLyBNT01FTlRTXG5cbnZhciBnZXRTZXREYXlPZk1vbnRoID0gbWFrZUdldFNldCgnRGF0ZScsIHRydWUpO1xuXG4vLyBGT1JNQVRUSU5HXG5cbmFkZEZvcm1hdFRva2VuKCdEREQnLCBbJ0REREQnLCAzXSwgJ0RERG8nLCAnZGF5T2ZZZWFyJyk7XG5cbi8vIEFMSUFTRVNcblxuYWRkVW5pdEFsaWFzKCdkYXlPZlllYXInLCAnREREJyk7XG5cbi8vIFBSSU9SSVRZXG5hZGRVbml0UHJpb3JpdHkoJ2RheU9mWWVhcicsIDQpO1xuXG4vLyBQQVJTSU5HXG5cbmFkZFJlZ2V4VG9rZW4oJ0RERCcsICBtYXRjaDF0bzMpO1xuYWRkUmVnZXhUb2tlbignRERERCcsIG1hdGNoMyk7XG5hZGRQYXJzZVRva2VuKFsnREREJywgJ0REREQnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgY29uZmlnLl9kYXlPZlllYXIgPSB0b0ludChpbnB1dCk7XG59KTtcblxuLy8gSEVMUEVSU1xuXG4vLyBNT01FTlRTXG5cbmZ1bmN0aW9uIGdldFNldERheU9mWWVhciAoaW5wdXQpIHtcbiAgICB2YXIgZGF5T2ZZZWFyID0gTWF0aC5yb3VuZCgodGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpIC0gdGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ3llYXInKSkgLyA4NjRlNSkgKyAxO1xuICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gZGF5T2ZZZWFyIDogdGhpcy5hZGQoKGlucHV0IC0gZGF5T2ZZZWFyKSwgJ2QnKTtcbn1cblxuLy8gRk9STUFUVElOR1xuXG5hZGRGb3JtYXRUb2tlbignbScsIFsnbW0nLCAyXSwgMCwgJ21pbnV0ZScpO1xuXG4vLyBBTElBU0VTXG5cbmFkZFVuaXRBbGlhcygnbWludXRlJywgJ20nKTtcblxuLy8gUFJJT1JJVFlcblxuYWRkVW5pdFByaW9yaXR5KCdtaW51dGUnLCAxNCk7XG5cbi8vIFBBUlNJTkdcblxuYWRkUmVnZXhUb2tlbignbScsICBtYXRjaDF0bzIpO1xuYWRkUmVnZXhUb2tlbignbW0nLCBtYXRjaDF0bzIsIG1hdGNoMik7XG5hZGRQYXJzZVRva2VuKFsnbScsICdtbSddLCBNSU5VVEUpO1xuXG4vLyBNT01FTlRTXG5cbnZhciBnZXRTZXRNaW51dGUgPSBtYWtlR2V0U2V0KCdNaW51dGVzJywgZmFsc2UpO1xuXG4vLyBGT1JNQVRUSU5HXG5cbmFkZEZvcm1hdFRva2VuKCdzJywgWydzcycsIDJdLCAwLCAnc2Vjb25kJyk7XG5cbi8vIEFMSUFTRVNcblxuYWRkVW5pdEFsaWFzKCdzZWNvbmQnLCAncycpO1xuXG4vLyBQUklPUklUWVxuXG5hZGRVbml0UHJpb3JpdHkoJ3NlY29uZCcsIDE1KTtcblxuLy8gUEFSU0lOR1xuXG5hZGRSZWdleFRva2VuKCdzJywgIG1hdGNoMXRvMik7XG5hZGRSZWdleFRva2VuKCdzcycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbmFkZFBhcnNlVG9rZW4oWydzJywgJ3NzJ10sIFNFQ09ORCk7XG5cbi8vIE1PTUVOVFNcblxudmFyIGdldFNldFNlY29uZCA9IG1ha2VHZXRTZXQoJ1NlY29uZHMnLCBmYWxzZSk7XG5cbi8vIEZPUk1BVFRJTkdcblxuYWRkRm9ybWF0VG9rZW4oJ1MnLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIH5+KHRoaXMubWlsbGlzZWNvbmQoKSAvIDEwMCk7XG59KTtcblxuYWRkRm9ybWF0VG9rZW4oMCwgWydTUycsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIH5+KHRoaXMubWlsbGlzZWNvbmQoKSAvIDEwKTtcbn0pO1xuXG5hZGRGb3JtYXRUb2tlbigwLCBbJ1NTUycsIDNdLCAwLCAnbWlsbGlzZWNvbmQnKTtcbmFkZEZvcm1hdFRva2VuKDAsIFsnU1NTUycsIDRdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwO1xufSk7XG5hZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTJywgNV0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwO1xufSk7XG5hZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTUycsIDZdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDA7XG59KTtcbmFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTUycsIDddLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDAwO1xufSk7XG5hZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1NTJywgOF0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDAwO1xufSk7XG5hZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1NTUycsIDldLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDAwMDA7XG59KTtcblxuXG4vLyBBTElBU0VTXG5cbmFkZFVuaXRBbGlhcygnbWlsbGlzZWNvbmQnLCAnbXMnKTtcblxuLy8gUFJJT1JJVFlcblxuYWRkVW5pdFByaW9yaXR5KCdtaWxsaXNlY29uZCcsIDE2KTtcblxuLy8gUEFSU0lOR1xuXG5hZGRSZWdleFRva2VuKCdTJywgICAgbWF0Y2gxdG8zLCBtYXRjaDEpO1xuYWRkUmVnZXhUb2tlbignU1MnLCAgIG1hdGNoMXRvMywgbWF0Y2gyKTtcbmFkZFJlZ2V4VG9rZW4oJ1NTUycsICBtYXRjaDF0bzMsIG1hdGNoMyk7XG5cbnZhciB0b2tlbjtcbmZvciAodG9rZW4gPSAnU1NTUyc7IHRva2VuLmxlbmd0aCA8PSA5OyB0b2tlbiArPSAnUycpIHtcbiAgICBhZGRSZWdleFRva2VuKHRva2VuLCBtYXRjaFVuc2lnbmVkKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VNcyhpbnB1dCwgYXJyYXkpIHtcbiAgICBhcnJheVtNSUxMSVNFQ09ORF0gPSB0b0ludCgoJzAuJyArIGlucHV0KSAqIDEwMDApO1xufVxuXG5mb3IgKHRva2VuID0gJ1MnOyB0b2tlbi5sZW5ndGggPD0gOTsgdG9rZW4gKz0gJ1MnKSB7XG4gICAgYWRkUGFyc2VUb2tlbih0b2tlbiwgcGFyc2VNcyk7XG59XG4vLyBNT01FTlRTXG5cbnZhciBnZXRTZXRNaWxsaXNlY29uZCA9IG1ha2VHZXRTZXQoJ01pbGxpc2Vjb25kcycsIGZhbHNlKTtcblxuLy8gRk9STUFUVElOR1xuXG5hZGRGb3JtYXRUb2tlbigneicsICAwLCAwLCAnem9uZUFiYnInKTtcbmFkZEZvcm1hdFRva2VuKCd6eicsIDAsIDAsICd6b25lTmFtZScpO1xuXG4vLyBNT01FTlRTXG5cbmZ1bmN0aW9uIGdldFpvbmVBYmJyICgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNVVEMgPyAnVVRDJyA6ICcnO1xufVxuXG5mdW5jdGlvbiBnZXRab25lTmFtZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzVVRDID8gJ0Nvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lJyA6ICcnO1xufVxuXG52YXIgcHJvdG8gPSBNb21lbnQucHJvdG90eXBlO1xuXG5wcm90by5hZGQgICAgICAgICAgICAgICA9IGFkZDtcbnByb3RvLmNhbGVuZGFyICAgICAgICAgID0gY2FsZW5kYXIkMTtcbnByb3RvLmNsb25lICAgICAgICAgICAgID0gY2xvbmU7XG5wcm90by5kaWZmICAgICAgICAgICAgICA9IGRpZmY7XG5wcm90by5lbmRPZiAgICAgICAgICAgICA9IGVuZE9mO1xucHJvdG8uZm9ybWF0ICAgICAgICAgICAgPSBmb3JtYXQ7XG5wcm90by5mcm9tICAgICAgICAgICAgICA9IGZyb207XG5wcm90by5mcm9tTm93ICAgICAgICAgICA9IGZyb21Ob3c7XG5wcm90by50byAgICAgICAgICAgICAgICA9IHRvO1xucHJvdG8udG9Ob3cgICAgICAgICAgICAgPSB0b05vdztcbnByb3RvLmdldCAgICAgICAgICAgICAgID0gc3RyaW5nR2V0O1xucHJvdG8uaW52YWxpZEF0ICAgICAgICAgPSBpbnZhbGlkQXQ7XG5wcm90by5pc0FmdGVyICAgICAgICAgICA9IGlzQWZ0ZXI7XG5wcm90by5pc0JlZm9yZSAgICAgICAgICA9IGlzQmVmb3JlO1xucHJvdG8uaXNCZXR3ZWVuICAgICAgICAgPSBpc0JldHdlZW47XG5wcm90by5pc1NhbWUgICAgICAgICAgICA9IGlzU2FtZTtcbnByb3RvLmlzU2FtZU9yQWZ0ZXIgICAgID0gaXNTYW1lT3JBZnRlcjtcbnByb3RvLmlzU2FtZU9yQmVmb3JlICAgID0gaXNTYW1lT3JCZWZvcmU7XG5wcm90by5pc1ZhbGlkICAgICAgICAgICA9IGlzVmFsaWQkMjtcbnByb3RvLmxhbmcgICAgICAgICAgICAgID0gbGFuZztcbnByb3RvLmxvY2FsZSAgICAgICAgICAgID0gbG9jYWxlO1xucHJvdG8ubG9jYWxlRGF0YSAgICAgICAgPSBsb2NhbGVEYXRhO1xucHJvdG8ubWF4ICAgICAgICAgICAgICAgPSBwcm90b3R5cGVNYXg7XG5wcm90by5taW4gICAgICAgICAgICAgICA9IHByb3RvdHlwZU1pbjtcbnByb3RvLnBhcnNpbmdGbGFncyAgICAgID0gcGFyc2luZ0ZsYWdzO1xucHJvdG8uc2V0ICAgICAgICAgICAgICAgPSBzdHJpbmdTZXQ7XG5wcm90by5zdGFydE9mICAgICAgICAgICA9IHN0YXJ0T2Y7XG5wcm90by5zdWJ0cmFjdCAgICAgICAgICA9IHN1YnRyYWN0O1xucHJvdG8udG9BcnJheSAgICAgICAgICAgPSB0b0FycmF5O1xucHJvdG8udG9PYmplY3QgICAgICAgICAgPSB0b09iamVjdDtcbnByb3RvLnRvRGF0ZSAgICAgICAgICAgID0gdG9EYXRlO1xucHJvdG8udG9JU09TdHJpbmcgICAgICAgPSB0b0lTT1N0cmluZztcbnByb3RvLmluc3BlY3QgICAgICAgICAgID0gaW5zcGVjdDtcbnByb3RvLnRvSlNPTiAgICAgICAgICAgID0gdG9KU09OO1xucHJvdG8udG9TdHJpbmcgICAgICAgICAgPSB0b1N0cmluZztcbnByb3RvLnVuaXggICAgICAgICAgICAgID0gdW5peDtcbnByb3RvLnZhbHVlT2YgICAgICAgICAgID0gdmFsdWVPZjtcbnByb3RvLmNyZWF0aW9uRGF0YSAgICAgID0gY3JlYXRpb25EYXRhO1xuXG4vLyBZZWFyXG5wcm90by55ZWFyICAgICAgID0gZ2V0U2V0WWVhcjtcbnByb3RvLmlzTGVhcFllYXIgPSBnZXRJc0xlYXBZZWFyO1xuXG4vLyBXZWVrIFllYXJcbnByb3RvLndlZWtZZWFyICAgID0gZ2V0U2V0V2Vla1llYXI7XG5wcm90by5pc29XZWVrWWVhciA9IGdldFNldElTT1dlZWtZZWFyO1xuXG4vLyBRdWFydGVyXG5wcm90by5xdWFydGVyID0gcHJvdG8ucXVhcnRlcnMgPSBnZXRTZXRRdWFydGVyO1xuXG4vLyBNb250aFxucHJvdG8ubW9udGggICAgICAgPSBnZXRTZXRNb250aDtcbnByb3RvLmRheXNJbk1vbnRoID0gZ2V0RGF5c0luTW9udGg7XG5cbi8vIFdlZWtcbnByb3RvLndlZWsgICAgICAgICAgID0gcHJvdG8ud2Vla3MgICAgICAgID0gZ2V0U2V0V2VlaztcbnByb3RvLmlzb1dlZWsgICAgICAgID0gcHJvdG8uaXNvV2Vla3MgICAgID0gZ2V0U2V0SVNPV2VlaztcbnByb3RvLndlZWtzSW5ZZWFyICAgID0gZ2V0V2Vla3NJblllYXI7XG5wcm90by5pc29XZWVrc0luWWVhciA9IGdldElTT1dlZWtzSW5ZZWFyO1xuXG4vLyBEYXlcbnByb3RvLmRhdGUgICAgICAgPSBnZXRTZXREYXlPZk1vbnRoO1xucHJvdG8uZGF5ICAgICAgICA9IHByb3RvLmRheXMgICAgICAgICAgICAgPSBnZXRTZXREYXlPZldlZWs7XG5wcm90by53ZWVrZGF5ICAgID0gZ2V0U2V0TG9jYWxlRGF5T2ZXZWVrO1xucHJvdG8uaXNvV2Vla2RheSA9IGdldFNldElTT0RheU9mV2VlaztcbnByb3RvLmRheU9mWWVhciAgPSBnZXRTZXREYXlPZlllYXI7XG5cbi8vIEhvdXJcbnByb3RvLmhvdXIgPSBwcm90by5ob3VycyA9IGdldFNldEhvdXI7XG5cbi8vIE1pbnV0ZVxucHJvdG8ubWludXRlID0gcHJvdG8ubWludXRlcyA9IGdldFNldE1pbnV0ZTtcblxuLy8gU2Vjb25kXG5wcm90by5zZWNvbmQgPSBwcm90by5zZWNvbmRzID0gZ2V0U2V0U2Vjb25kO1xuXG4vLyBNaWxsaXNlY29uZFxucHJvdG8ubWlsbGlzZWNvbmQgPSBwcm90by5taWxsaXNlY29uZHMgPSBnZXRTZXRNaWxsaXNlY29uZDtcblxuLy8gT2Zmc2V0XG5wcm90by51dGNPZmZzZXQgICAgICAgICAgICA9IGdldFNldE9mZnNldDtcbnByb3RvLnV0YyAgICAgICAgICAgICAgICAgID0gc2V0T2Zmc2V0VG9VVEM7XG5wcm90by5sb2NhbCAgICAgICAgICAgICAgICA9IHNldE9mZnNldFRvTG9jYWw7XG5wcm90by5wYXJzZVpvbmUgICAgICAgICAgICA9IHNldE9mZnNldFRvUGFyc2VkT2Zmc2V0O1xucHJvdG8uaGFzQWxpZ25lZEhvdXJPZmZzZXQgPSBoYXNBbGlnbmVkSG91ck9mZnNldDtcbnByb3RvLmlzRFNUICAgICAgICAgICAgICAgID0gaXNEYXlsaWdodFNhdmluZ1RpbWU7XG5wcm90by5pc0xvY2FsICAgICAgICAgICAgICA9IGlzTG9jYWw7XG5wcm90by5pc1V0Y09mZnNldCAgICAgICAgICA9IGlzVXRjT2Zmc2V0O1xucHJvdG8uaXNVdGMgICAgICAgICAgICAgICAgPSBpc1V0YztcbnByb3RvLmlzVVRDICAgICAgICAgICAgICAgID0gaXNVdGM7XG5cbi8vIFRpbWV6b25lXG5wcm90by56b25lQWJiciA9IGdldFpvbmVBYmJyO1xucHJvdG8uem9uZU5hbWUgPSBnZXRab25lTmFtZTtcblxuLy8gRGVwcmVjYXRpb25zXG5wcm90by5kYXRlcyAgPSBkZXByZWNhdGUoJ2RhdGVzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSBkYXRlIGluc3RlYWQuJywgZ2V0U2V0RGF5T2ZNb250aCk7XG5wcm90by5tb250aHMgPSBkZXByZWNhdGUoJ21vbnRocyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgbW9udGggaW5zdGVhZCcsIGdldFNldE1vbnRoKTtcbnByb3RvLnllYXJzICA9IGRlcHJlY2F0ZSgneWVhcnMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIHllYXIgaW5zdGVhZCcsIGdldFNldFllYXIpO1xucHJvdG8uem9uZSAgID0gZGVwcmVjYXRlKCdtb21lbnQoKS56b25lIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQoKS51dGNPZmZzZXQgaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy96b25lLycsIGdldFNldFpvbmUpO1xucHJvdG8uaXNEU1RTaGlmdGVkID0gZGVwcmVjYXRlKCdpc0RTVFNoaWZ0ZWQgaXMgZGVwcmVjYXRlZC4gU2VlIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvZHN0LXNoaWZ0ZWQvIGZvciBtb3JlIGluZm9ybWF0aW9uJywgaXNEYXlsaWdodFNhdmluZ1RpbWVTaGlmdGVkKTtcblxuZnVuY3Rpb24gY3JlYXRlVW5peCAoaW5wdXQpIHtcbiAgICByZXR1cm4gY3JlYXRlTG9jYWwoaW5wdXQgKiAxMDAwKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSW5ab25lICgpIHtcbiAgICByZXR1cm4gY3JlYXRlTG9jYWwuYXBwbHkobnVsbCwgYXJndW1lbnRzKS5wYXJzZVpvbmUoKTtcbn1cblxuZnVuY3Rpb24gcHJlUGFyc2VQb3N0Rm9ybWF0IChzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nO1xufVxuXG52YXIgcHJvdG8kMSA9IExvY2FsZS5wcm90b3R5cGU7XG5cbnByb3RvJDEuY2FsZW5kYXIgICAgICAgID0gY2FsZW5kYXI7XG5wcm90byQxLmxvbmdEYXRlRm9ybWF0ICA9IGxvbmdEYXRlRm9ybWF0O1xucHJvdG8kMS5pbnZhbGlkRGF0ZSAgICAgPSBpbnZhbGlkRGF0ZTtcbnByb3RvJDEub3JkaW5hbCAgICAgICAgID0gb3JkaW5hbDtcbnByb3RvJDEucHJlcGFyc2UgICAgICAgID0gcHJlUGFyc2VQb3N0Rm9ybWF0O1xucHJvdG8kMS5wb3N0Zm9ybWF0ICAgICAgPSBwcmVQYXJzZVBvc3RGb3JtYXQ7XG5wcm90byQxLnJlbGF0aXZlVGltZSAgICA9IHJlbGF0aXZlVGltZTtcbnByb3RvJDEucGFzdEZ1dHVyZSAgICAgID0gcGFzdEZ1dHVyZTtcbnByb3RvJDEuc2V0ICAgICAgICAgICAgID0gc2V0O1xuXG4vLyBNb250aFxucHJvdG8kMS5tb250aHMgICAgICAgICAgICA9ICAgICAgICBsb2NhbGVNb250aHM7XG5wcm90byQxLm1vbnRoc1Nob3J0ICAgICAgID0gICAgICAgIGxvY2FsZU1vbnRoc1Nob3J0O1xucHJvdG8kMS5tb250aHNQYXJzZSAgICAgICA9ICAgICAgICBsb2NhbGVNb250aHNQYXJzZTtcbnByb3RvJDEubW9udGhzUmVnZXggICAgICAgPSBtb250aHNSZWdleDtcbnByb3RvJDEubW9udGhzU2hvcnRSZWdleCAgPSBtb250aHNTaG9ydFJlZ2V4O1xuXG4vLyBXZWVrXG5wcm90byQxLndlZWsgPSBsb2NhbGVXZWVrO1xucHJvdG8kMS5maXJzdERheU9mWWVhciA9IGxvY2FsZUZpcnN0RGF5T2ZZZWFyO1xucHJvdG8kMS5maXJzdERheU9mV2VlayA9IGxvY2FsZUZpcnN0RGF5T2ZXZWVrO1xuXG4vLyBEYXkgb2YgV2Vla1xucHJvdG8kMS53ZWVrZGF5cyAgICAgICA9ICAgICAgICBsb2NhbGVXZWVrZGF5cztcbnByb3RvJDEud2Vla2RheXNNaW4gICAgPSAgICAgICAgbG9jYWxlV2Vla2RheXNNaW47XG5wcm90byQxLndlZWtkYXlzU2hvcnQgID0gICAgICAgIGxvY2FsZVdlZWtkYXlzU2hvcnQ7XG5wcm90byQxLndlZWtkYXlzUGFyc2UgID0gICAgICAgIGxvY2FsZVdlZWtkYXlzUGFyc2U7XG5cbnByb3RvJDEud2Vla2RheXNSZWdleCAgICAgICA9ICAgICAgICB3ZWVrZGF5c1JlZ2V4O1xucHJvdG8kMS53ZWVrZGF5c1Nob3J0UmVnZXggID0gICAgICAgIHdlZWtkYXlzU2hvcnRSZWdleDtcbnByb3RvJDEud2Vla2RheXNNaW5SZWdleCAgICA9ICAgICAgICB3ZWVrZGF5c01pblJlZ2V4O1xuXG4vLyBIb3Vyc1xucHJvdG8kMS5pc1BNID0gbG9jYWxlSXNQTTtcbnByb3RvJDEubWVyaWRpZW0gPSBsb2NhbGVNZXJpZGllbTtcblxuZnVuY3Rpb24gZ2V0JDEgKGZvcm1hdCwgaW5kZXgsIGZpZWxkLCBzZXR0ZXIpIHtcbiAgICB2YXIgbG9jYWxlID0gZ2V0TG9jYWxlKCk7XG4gICAgdmFyIHV0YyA9IGNyZWF0ZVVUQygpLnNldChzZXR0ZXIsIGluZGV4KTtcbiAgICByZXR1cm4gbG9jYWxlW2ZpZWxkXSh1dGMsIGZvcm1hdCk7XG59XG5cbmZ1bmN0aW9uIGxpc3RNb250aHNJbXBsIChmb3JtYXQsIGluZGV4LCBmaWVsZCkge1xuICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZm9ybWF0ID0gZm9ybWF0IHx8ICcnO1xuXG4gICAgaWYgKGluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGdldCQxKGZvcm1hdCwgaW5kZXgsIGZpZWxkLCAnbW9udGgnKTtcbiAgICB9XG5cbiAgICB2YXIgaTtcbiAgICB2YXIgb3V0ID0gW107XG4gICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgb3V0W2ldID0gZ2V0JDEoZm9ybWF0LCBpLCBmaWVsZCwgJ21vbnRoJyk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59XG5cbi8vICgpXG4vLyAoNSlcbi8vIChmbXQsIDUpXG4vLyAoZm10KVxuLy8gKHRydWUpXG4vLyAodHJ1ZSwgNSlcbi8vICh0cnVlLCBmbXQsIDUpXG4vLyAodHJ1ZSwgZm10KVxuZnVuY3Rpb24gbGlzdFdlZWtkYXlzSW1wbCAobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCBmaWVsZCkge1xuICAgIGlmICh0eXBlb2YgbG9jYWxlU29ydGVkID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgaWYgKGlzTnVtYmVyKGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybWF0ID0gZm9ybWF0IHx8ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1hdCA9IGxvY2FsZVNvcnRlZDtcbiAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgIGxvY2FsZVNvcnRlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcbiAgICB9XG5cbiAgICB2YXIgbG9jYWxlID0gZ2V0TG9jYWxlKCksXG4gICAgICAgIHNoaWZ0ID0gbG9jYWxlU29ydGVkID8gbG9jYWxlLl93ZWVrLmRvdyA6IDA7XG5cbiAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZ2V0JDEoZm9ybWF0LCAoaW5kZXggKyBzaGlmdCkgJSA3LCBmaWVsZCwgJ2RheScpO1xuICAgIH1cblxuICAgIHZhciBpO1xuICAgIHZhciBvdXQgPSBbXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgIG91dFtpXSA9IGdldCQxKGZvcm1hdCwgKGkgKyBzaGlmdCkgJSA3LCBmaWVsZCwgJ2RheScpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiBsaXN0TW9udGhzIChmb3JtYXQsIGluZGV4KSB7XG4gICAgcmV0dXJuIGxpc3RNb250aHNJbXBsKGZvcm1hdCwgaW5kZXgsICdtb250aHMnKTtcbn1cblxuZnVuY3Rpb24gbGlzdE1vbnRoc1Nob3J0IChmb3JtYXQsIGluZGV4KSB7XG4gICAgcmV0dXJuIGxpc3RNb250aHNJbXBsKGZvcm1hdCwgaW5kZXgsICdtb250aHNTaG9ydCcpO1xufVxuXG5mdW5jdGlvbiBsaXN0V2Vla2RheXMgKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgIHJldHVybiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgJ3dlZWtkYXlzJyk7XG59XG5cbmZ1bmN0aW9uIGxpc3RXZWVrZGF5c1Nob3J0IChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgpIHtcbiAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5c1Nob3J0Jyk7XG59XG5cbmZ1bmN0aW9uIGxpc3RXZWVrZGF5c01pbiAobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4KSB7XG4gICAgcmV0dXJuIGxpc3RXZWVrZGF5c0ltcGwobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCAnd2Vla2RheXNNaW4nKTtcbn1cblxuZ2V0U2V0R2xvYmFsTG9jYWxlKCdlbicsIHtcbiAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0odGh8c3R8bmR8cmQpLyxcbiAgICBvcmRpbmFsIDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICB2YXIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgb3V0cHV0ID0gKHRvSW50KG51bWJlciAlIDEwMCAvIDEwKSA9PT0gMSkgPyAndGgnIDpcbiAgICAgICAgICAgIChiID09PSAxKSA/ICdzdCcgOlxuICAgICAgICAgICAgKGIgPT09IDIpID8gJ25kJyA6XG4gICAgICAgICAgICAoYiA9PT0gMykgPyAncmQnIDogJ3RoJztcbiAgICAgICAgcmV0dXJuIG51bWJlciArIG91dHB1dDtcbiAgICB9XG59KTtcblxuLy8gU2lkZSBlZmZlY3QgaW1wb3J0c1xuaG9va3MubGFuZyA9IGRlcHJlY2F0ZSgnbW9tZW50LmxhbmcgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbWVudC5sb2NhbGUgaW5zdGVhZC4nLCBnZXRTZXRHbG9iYWxMb2NhbGUpO1xuaG9va3MubGFuZ0RhdGEgPSBkZXByZWNhdGUoJ21vbWVudC5sYW5nRGF0YSBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZURhdGEgaW5zdGVhZC4nLCBnZXRMb2NhbGUpO1xuXG52YXIgbWF0aEFicyA9IE1hdGguYWJzO1xuXG5mdW5jdGlvbiBhYnMgKCkge1xuICAgIHZhciBkYXRhICAgICAgICAgICA9IHRoaXMuX2RhdGE7XG5cbiAgICB0aGlzLl9taWxsaXNlY29uZHMgPSBtYXRoQWJzKHRoaXMuX21pbGxpc2Vjb25kcyk7XG4gICAgdGhpcy5fZGF5cyAgICAgICAgID0gbWF0aEFicyh0aGlzLl9kYXlzKTtcbiAgICB0aGlzLl9tb250aHMgICAgICAgPSBtYXRoQWJzKHRoaXMuX21vbnRocyk7XG5cbiAgICBkYXRhLm1pbGxpc2Vjb25kcyAgPSBtYXRoQWJzKGRhdGEubWlsbGlzZWNvbmRzKTtcbiAgICBkYXRhLnNlY29uZHMgICAgICAgPSBtYXRoQWJzKGRhdGEuc2Vjb25kcyk7XG4gICAgZGF0YS5taW51dGVzICAgICAgID0gbWF0aEFicyhkYXRhLm1pbnV0ZXMpO1xuICAgIGRhdGEuaG91cnMgICAgICAgICA9IG1hdGhBYnMoZGF0YS5ob3Vycyk7XG4gICAgZGF0YS5tb250aHMgICAgICAgID0gbWF0aEFicyhkYXRhLm1vbnRocyk7XG4gICAgZGF0YS55ZWFycyAgICAgICAgID0gbWF0aEFicyhkYXRhLnllYXJzKTtcblxuICAgIHJldHVybiB0aGlzO1xufVxuXG5mdW5jdGlvbiBhZGRTdWJ0cmFjdCQxIChkdXJhdGlvbiwgaW5wdXQsIHZhbHVlLCBkaXJlY3Rpb24pIHtcbiAgICB2YXIgb3RoZXIgPSBjcmVhdGVEdXJhdGlvbihpbnB1dCwgdmFsdWUpO1xuXG4gICAgZHVyYXRpb24uX21pbGxpc2Vjb25kcyArPSBkaXJlY3Rpb24gKiBvdGhlci5fbWlsbGlzZWNvbmRzO1xuICAgIGR1cmF0aW9uLl9kYXlzICAgICAgICAgKz0gZGlyZWN0aW9uICogb3RoZXIuX2RheXM7XG4gICAgZHVyYXRpb24uX21vbnRocyAgICAgICArPSBkaXJlY3Rpb24gKiBvdGhlci5fbW9udGhzO1xuXG4gICAgcmV0dXJuIGR1cmF0aW9uLl9idWJibGUoKTtcbn1cblxuLy8gc3VwcG9ydHMgb25seSAyLjAtc3R5bGUgYWRkKDEsICdzJykgb3IgYWRkKGR1cmF0aW9uKVxuZnVuY3Rpb24gYWRkJDEgKGlucHV0LCB2YWx1ZSkge1xuICAgIHJldHVybiBhZGRTdWJ0cmFjdCQxKHRoaXMsIGlucHV0LCB2YWx1ZSwgMSk7XG59XG5cbi8vIHN1cHBvcnRzIG9ubHkgMi4wLXN0eWxlIHN1YnRyYWN0KDEsICdzJykgb3Igc3VidHJhY3QoZHVyYXRpb24pXG5mdW5jdGlvbiBzdWJ0cmFjdCQxIChpbnB1dCwgdmFsdWUpIHtcbiAgICByZXR1cm4gYWRkU3VidHJhY3QkMSh0aGlzLCBpbnB1dCwgdmFsdWUsIC0xKTtcbn1cblxuZnVuY3Rpb24gYWJzQ2VpbCAobnVtYmVyKSB7XG4gICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobnVtYmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKG51bWJlcik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBidWJibGUgKCkge1xuICAgIHZhciBtaWxsaXNlY29uZHMgPSB0aGlzLl9taWxsaXNlY29uZHM7XG4gICAgdmFyIGRheXMgICAgICAgICA9IHRoaXMuX2RheXM7XG4gICAgdmFyIG1vbnRocyAgICAgICA9IHRoaXMuX21vbnRocztcbiAgICB2YXIgZGF0YSAgICAgICAgID0gdGhpcy5fZGF0YTtcbiAgICB2YXIgc2Vjb25kcywgbWludXRlcywgaG91cnMsIHllYXJzLCBtb250aHNGcm9tRGF5cztcblxuICAgIC8vIGlmIHdlIGhhdmUgYSBtaXggb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHZhbHVlcywgYnViYmxlIGRvd24gZmlyc3RcbiAgICAvLyBjaGVjazogaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzIxNjZcbiAgICBpZiAoISgobWlsbGlzZWNvbmRzID49IDAgJiYgZGF5cyA+PSAwICYmIG1vbnRocyA+PSAwKSB8fFxuICAgICAgICAgICAgKG1pbGxpc2Vjb25kcyA8PSAwICYmIGRheXMgPD0gMCAmJiBtb250aHMgPD0gMCkpKSB7XG4gICAgICAgIG1pbGxpc2Vjb25kcyArPSBhYnNDZWlsKG1vbnRoc1RvRGF5cyhtb250aHMpICsgZGF5cykgKiA4NjRlNTtcbiAgICAgICAgZGF5cyA9IDA7XG4gICAgICAgIG1vbnRocyA9IDA7XG4gICAgfVxuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGJ1YmJsZXMgdXAgdmFsdWVzLCBzZWUgdGhlIHRlc3RzIGZvclxuICAgIC8vIGV4YW1wbGVzIG9mIHdoYXQgdGhhdCBtZWFucy5cbiAgICBkYXRhLm1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kcyAlIDEwMDA7XG5cbiAgICBzZWNvbmRzICAgICAgICAgICA9IGFic0Zsb29yKG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICAgIGRhdGEuc2Vjb25kcyAgICAgID0gc2Vjb25kcyAlIDYwO1xuXG4gICAgbWludXRlcyAgICAgICAgICAgPSBhYnNGbG9vcihzZWNvbmRzIC8gNjApO1xuICAgIGRhdGEubWludXRlcyAgICAgID0gbWludXRlcyAlIDYwO1xuXG4gICAgaG91cnMgICAgICAgICAgICAgPSBhYnNGbG9vcihtaW51dGVzIC8gNjApO1xuICAgIGRhdGEuaG91cnMgICAgICAgID0gaG91cnMgJSAyNDtcblxuICAgIGRheXMgKz0gYWJzRmxvb3IoaG91cnMgLyAyNCk7XG5cbiAgICAvLyBjb252ZXJ0IGRheXMgdG8gbW9udGhzXG4gICAgbW9udGhzRnJvbURheXMgPSBhYnNGbG9vcihkYXlzVG9Nb250aHMoZGF5cykpO1xuICAgIG1vbnRocyArPSBtb250aHNGcm9tRGF5cztcbiAgICBkYXlzIC09IGFic0NlaWwobW9udGhzVG9EYXlzKG1vbnRoc0Zyb21EYXlzKSk7XG5cbiAgICAvLyAxMiBtb250aHMgLT4gMSB5ZWFyXG4gICAgeWVhcnMgPSBhYnNGbG9vcihtb250aHMgLyAxMik7XG4gICAgbW9udGhzICU9IDEyO1xuXG4gICAgZGF0YS5kYXlzICAgPSBkYXlzO1xuICAgIGRhdGEubW9udGhzID0gbW9udGhzO1xuICAgIGRhdGEueWVhcnMgID0geWVhcnM7XG5cbiAgICByZXR1cm4gdGhpcztcbn1cblxuZnVuY3Rpb24gZGF5c1RvTW9udGhzIChkYXlzKSB7XG4gICAgLy8gNDAwIHllYXJzIGhhdmUgMTQ2MDk3IGRheXMgKHRha2luZyBpbnRvIGFjY291bnQgbGVhcCB5ZWFyIHJ1bGVzKVxuICAgIC8vIDQwMCB5ZWFycyBoYXZlIDEyIG1vbnRocyA9PT0gNDgwMFxuICAgIHJldHVybiBkYXlzICogNDgwMCAvIDE0NjA5Nztcbn1cblxuZnVuY3Rpb24gbW9udGhzVG9EYXlzIChtb250aHMpIHtcbiAgICAvLyB0aGUgcmV2ZXJzZSBvZiBkYXlzVG9Nb250aHNcbiAgICByZXR1cm4gbW9udGhzICogMTQ2MDk3IC8gNDgwMDtcbn1cblxuZnVuY3Rpb24gYXMgKHVuaXRzKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgIH1cbiAgICB2YXIgZGF5cztcbiAgICB2YXIgbW9udGhzO1xuICAgIHZhciBtaWxsaXNlY29uZHMgPSB0aGlzLl9taWxsaXNlY29uZHM7XG5cbiAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcblxuICAgIGlmICh1bml0cyA9PT0gJ21vbnRoJyB8fCB1bml0cyA9PT0gJ3llYXInKSB7XG4gICAgICAgIGRheXMgICA9IHRoaXMuX2RheXMgICArIG1pbGxpc2Vjb25kcyAvIDg2NGU1O1xuICAgICAgICBtb250aHMgPSB0aGlzLl9tb250aHMgKyBkYXlzVG9Nb250aHMoZGF5cyk7XG4gICAgICAgIHJldHVybiB1bml0cyA9PT0gJ21vbnRoJyA/IG1vbnRocyA6IG1vbnRocyAvIDEyO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGhhbmRsZSBtaWxsaXNlY29uZHMgc2VwYXJhdGVseSBiZWNhdXNlIG9mIGZsb2F0aW5nIHBvaW50IG1hdGggZXJyb3JzIChpc3N1ZSAjMTg2NylcbiAgICAgICAgZGF5cyA9IHRoaXMuX2RheXMgKyBNYXRoLnJvdW5kKG1vbnRoc1RvRGF5cyh0aGlzLl9tb250aHMpKTtcbiAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgY2FzZSAnd2VlaycgICA6IHJldHVybiBkYXlzIC8gNyAgICAgKyBtaWxsaXNlY29uZHMgLyA2MDQ4ZTU7XG4gICAgICAgICAgICBjYXNlICdkYXknICAgIDogcmV0dXJuIGRheXMgICAgICAgICArIG1pbGxpc2Vjb25kcyAvIDg2NGU1O1xuICAgICAgICAgICAgY2FzZSAnaG91cicgICA6IHJldHVybiBkYXlzICogMjQgICAgKyBtaWxsaXNlY29uZHMgLyAzNmU1O1xuICAgICAgICAgICAgY2FzZSAnbWludXRlJyA6IHJldHVybiBkYXlzICogMTQ0MCAgKyBtaWxsaXNlY29uZHMgLyA2ZTQ7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnIDogcmV0dXJuIGRheXMgKiA4NjQwMCArIG1pbGxpc2Vjb25kcyAvIDEwMDA7XG4gICAgICAgICAgICAvLyBNYXRoLmZsb29yIHByZXZlbnRzIGZsb2F0aW5nIHBvaW50IG1hdGggZXJyb3JzIGhlcmVcbiAgICAgICAgICAgIGNhc2UgJ21pbGxpc2Vjb25kJzogcmV0dXJuIE1hdGguZmxvb3IoZGF5cyAqIDg2NGU1KSArIG1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcignVW5rbm93biB1bml0ICcgKyB1bml0cyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIFRPRE86IFVzZSB0aGlzLmFzKCdtcycpP1xuZnVuY3Rpb24gdmFsdWVPZiQxICgpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyArXG4gICAgICAgIHRoaXMuX2RheXMgKiA4NjRlNSArXG4gICAgICAgICh0aGlzLl9tb250aHMgJSAxMikgKiAyNTkyZTYgK1xuICAgICAgICB0b0ludCh0aGlzLl9tb250aHMgLyAxMikgKiAzMTUzNmU2XG4gICAgKTtcbn1cblxuZnVuY3Rpb24gbWFrZUFzIChhbGlhcykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFzKGFsaWFzKTtcbiAgICB9O1xufVxuXG52YXIgYXNNaWxsaXNlY29uZHMgPSBtYWtlQXMoJ21zJyk7XG52YXIgYXNTZWNvbmRzICAgICAgPSBtYWtlQXMoJ3MnKTtcbnZhciBhc01pbnV0ZXMgICAgICA9IG1ha2VBcygnbScpO1xudmFyIGFzSG91cnMgICAgICAgID0gbWFrZUFzKCdoJyk7XG52YXIgYXNEYXlzICAgICAgICAgPSBtYWtlQXMoJ2QnKTtcbnZhciBhc1dlZWtzICAgICAgICA9IG1ha2VBcygndycpO1xudmFyIGFzTW9udGhzICAgICAgID0gbWFrZUFzKCdNJyk7XG52YXIgYXNZZWFycyAgICAgICAgPSBtYWtlQXMoJ3knKTtcblxuZnVuY3Rpb24gZ2V0JDIgKHVuaXRzKSB7XG4gICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpc1t1bml0cyArICdzJ10oKSA6IE5hTjtcbn1cblxuZnVuY3Rpb24gbWFrZUdldHRlcihuYW1lKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5fZGF0YVtuYW1lXSA6IE5hTjtcbiAgICB9O1xufVxuXG52YXIgbWlsbGlzZWNvbmRzID0gbWFrZUdldHRlcignbWlsbGlzZWNvbmRzJyk7XG52YXIgc2Vjb25kcyAgICAgID0gbWFrZUdldHRlcignc2Vjb25kcycpO1xudmFyIG1pbnV0ZXMgICAgICA9IG1ha2VHZXR0ZXIoJ21pbnV0ZXMnKTtcbnZhciBob3VycyAgICAgICAgPSBtYWtlR2V0dGVyKCdob3VycycpO1xudmFyIGRheXMgICAgICAgICA9IG1ha2VHZXR0ZXIoJ2RheXMnKTtcbnZhciBtb250aHMgICAgICAgPSBtYWtlR2V0dGVyKCdtb250aHMnKTtcbnZhciB5ZWFycyAgICAgICAgPSBtYWtlR2V0dGVyKCd5ZWFycycpO1xuXG5mdW5jdGlvbiB3ZWVrcyAoKSB7XG4gICAgcmV0dXJuIGFic0Zsb29yKHRoaXMuZGF5cygpIC8gNyk7XG59XG5cbnZhciByb3VuZCA9IE1hdGgucm91bmQ7XG52YXIgdGhyZXNob2xkcyA9IHtcbiAgICBzczogNDQsICAgICAgICAgLy8gYSBmZXcgc2Vjb25kcyB0byBzZWNvbmRzXG4gICAgcyA6IDQ1LCAgICAgICAgIC8vIHNlY29uZHMgdG8gbWludXRlXG4gICAgbSA6IDQ1LCAgICAgICAgIC8vIG1pbnV0ZXMgdG8gaG91clxuICAgIGggOiAyMiwgICAgICAgICAvLyBob3VycyB0byBkYXlcbiAgICBkIDogMjYsICAgICAgICAgLy8gZGF5cyB0byBtb250aFxuICAgIE0gOiAxMSAgICAgICAgICAvLyBtb250aHMgdG8geWVhclxufTtcblxuLy8gaGVscGVyIGZ1bmN0aW9uIGZvciBtb21lbnQuZm4uZnJvbSwgbW9tZW50LmZuLmZyb21Ob3csIGFuZCBtb21lbnQuZHVyYXRpb24uZm4uaHVtYW5pemVcbmZ1bmN0aW9uIHN1YnN0aXR1dGVUaW1lQWdvKHN0cmluZywgbnVtYmVyLCB3aXRob3V0U3VmZml4LCBpc0Z1dHVyZSwgbG9jYWxlKSB7XG4gICAgcmV0dXJuIGxvY2FsZS5yZWxhdGl2ZVRpbWUobnVtYmVyIHx8IDEsICEhd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSk7XG59XG5cbmZ1bmN0aW9uIHJlbGF0aXZlVGltZSQxIChwb3NOZWdEdXJhdGlvbiwgd2l0aG91dFN1ZmZpeCwgbG9jYWxlKSB7XG4gICAgdmFyIGR1cmF0aW9uID0gY3JlYXRlRHVyYXRpb24ocG9zTmVnRHVyYXRpb24pLmFicygpO1xuICAgIHZhciBzZWNvbmRzICA9IHJvdW5kKGR1cmF0aW9uLmFzKCdzJykpO1xuICAgIHZhciBtaW51dGVzICA9IHJvdW5kKGR1cmF0aW9uLmFzKCdtJykpO1xuICAgIHZhciBob3VycyAgICA9IHJvdW5kKGR1cmF0aW9uLmFzKCdoJykpO1xuICAgIHZhciBkYXlzICAgICA9IHJvdW5kKGR1cmF0aW9uLmFzKCdkJykpO1xuICAgIHZhciBtb250aHMgICA9IHJvdW5kKGR1cmF0aW9uLmFzKCdNJykpO1xuICAgIHZhciB5ZWFycyAgICA9IHJvdW5kKGR1cmF0aW9uLmFzKCd5JykpO1xuXG4gICAgdmFyIGEgPSBzZWNvbmRzIDw9IHRocmVzaG9sZHMuc3MgJiYgWydzJywgc2Vjb25kc10gIHx8XG4gICAgICAgICAgICBzZWNvbmRzIDwgdGhyZXNob2xkcy5zICAgJiYgWydzcycsIHNlY29uZHNdIHx8XG4gICAgICAgICAgICBtaW51dGVzIDw9IDEgICAgICAgICAgICAgJiYgWydtJ10gICAgICAgICAgIHx8XG4gICAgICAgICAgICBtaW51dGVzIDwgdGhyZXNob2xkcy5tICAgJiYgWydtbScsIG1pbnV0ZXNdIHx8XG4gICAgICAgICAgICBob3VycyAgIDw9IDEgICAgICAgICAgICAgJiYgWydoJ10gICAgICAgICAgIHx8XG4gICAgICAgICAgICBob3VycyAgIDwgdGhyZXNob2xkcy5oICAgJiYgWydoaCcsIGhvdXJzXSAgIHx8XG4gICAgICAgICAgICBkYXlzICAgIDw9IDEgICAgICAgICAgICAgJiYgWydkJ10gICAgICAgICAgIHx8XG4gICAgICAgICAgICBkYXlzICAgIDwgdGhyZXNob2xkcy5kICAgJiYgWydkZCcsIGRheXNdICAgIHx8XG4gICAgICAgICAgICBtb250aHMgIDw9IDEgICAgICAgICAgICAgJiYgWydNJ10gICAgICAgICAgIHx8XG4gICAgICAgICAgICBtb250aHMgIDwgdGhyZXNob2xkcy5NICAgJiYgWydNTScsIG1vbnRoc10gIHx8XG4gICAgICAgICAgICB5ZWFycyAgIDw9IDEgICAgICAgICAgICAgJiYgWyd5J10gICAgICAgICAgIHx8IFsneXknLCB5ZWFyc107XG5cbiAgICBhWzJdID0gd2l0aG91dFN1ZmZpeDtcbiAgICBhWzNdID0gK3Bvc05lZ0R1cmF0aW9uID4gMDtcbiAgICBhWzRdID0gbG9jYWxlO1xuICAgIHJldHVybiBzdWJzdGl0dXRlVGltZUFnby5hcHBseShudWxsLCBhKTtcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHNldCB0aGUgcm91bmRpbmcgZnVuY3Rpb24gZm9yIHJlbGF0aXZlIHRpbWUgc3RyaW5nc1xuZnVuY3Rpb24gZ2V0U2V0UmVsYXRpdmVUaW1lUm91bmRpbmcgKHJvdW5kaW5nRnVuY3Rpb24pIHtcbiAgICBpZiAocm91bmRpbmdGdW5jdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByb3VuZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZihyb3VuZGluZ0Z1bmN0aW9uKSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByb3VuZCA9IHJvdW5kaW5nRnVuY3Rpb247XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBzZXQgYSB0aHJlc2hvbGQgZm9yIHJlbGF0aXZlIHRpbWUgc3RyaW5nc1xuZnVuY3Rpb24gZ2V0U2V0UmVsYXRpdmVUaW1lVGhyZXNob2xkICh0aHJlc2hvbGQsIGxpbWl0KSB7XG4gICAgaWYgKHRocmVzaG9sZHNbdGhyZXNob2xkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGxpbWl0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRocmVzaG9sZHNbdGhyZXNob2xkXTtcbiAgICB9XG4gICAgdGhyZXNob2xkc1t0aHJlc2hvbGRdID0gbGltaXQ7XG4gICAgaWYgKHRocmVzaG9sZCA9PT0gJ3MnKSB7XG4gICAgICAgIHRocmVzaG9sZHMuc3MgPSBsaW1pdCAtIDE7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBodW1hbml6ZSAod2l0aFN1ZmZpeCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgfVxuXG4gICAgdmFyIGxvY2FsZSA9IHRoaXMubG9jYWxlRGF0YSgpO1xuICAgIHZhciBvdXRwdXQgPSByZWxhdGl2ZVRpbWUkMSh0aGlzLCAhd2l0aFN1ZmZpeCwgbG9jYWxlKTtcblxuICAgIGlmICh3aXRoU3VmZml4KSB7XG4gICAgICAgIG91dHB1dCA9IGxvY2FsZS5wYXN0RnV0dXJlKCt0aGlzLCBvdXRwdXQpO1xuICAgIH1cblxuICAgIHJldHVybiBsb2NhbGUucG9zdGZvcm1hdChvdXRwdXQpO1xufVxuXG52YXIgYWJzJDEgPSBNYXRoLmFicztcblxuZnVuY3Rpb24gdG9JU09TdHJpbmckMSgpIHtcbiAgICAvLyBmb3IgSVNPIHN0cmluZ3Mgd2UgZG8gbm90IHVzZSB0aGUgbm9ybWFsIGJ1YmJsaW5nIHJ1bGVzOlxuICAgIC8vICAqIG1pbGxpc2Vjb25kcyBidWJibGUgdXAgdW50aWwgdGhleSBiZWNvbWUgaG91cnNcbiAgICAvLyAgKiBkYXlzIGRvIG5vdCBidWJibGUgYXQgYWxsXG4gICAgLy8gICogbW9udGhzIGJ1YmJsZSB1cCB1bnRpbCB0aGV5IGJlY29tZSB5ZWFyc1xuICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB0aGVyZSBpcyBubyBjb250ZXh0LWZyZWUgY29udmVyc2lvbiBiZXR3ZWVuIGhvdXJzIGFuZCBkYXlzXG4gICAgLy8gKHRoaW5rIG9mIGNsb2NrIGNoYW5nZXMpXG4gICAgLy8gYW5kIGFsc28gbm90IGJldHdlZW4gZGF5cyBhbmQgbW9udGhzICgyOC0zMSBkYXlzIHBlciBtb250aClcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgIH1cblxuICAgIHZhciBzZWNvbmRzID0gYWJzJDEodGhpcy5fbWlsbGlzZWNvbmRzKSAvIDEwMDA7XG4gICAgdmFyIGRheXMgICAgICAgICA9IGFicyQxKHRoaXMuX2RheXMpO1xuICAgIHZhciBtb250aHMgICAgICAgPSBhYnMkMSh0aGlzLl9tb250aHMpO1xuICAgIHZhciBtaW51dGVzLCBob3VycywgeWVhcnM7XG5cbiAgICAvLyAzNjAwIHNlY29uZHMgLT4gNjAgbWludXRlcyAtPiAxIGhvdXJcbiAgICBtaW51dGVzICAgICAgICAgICA9IGFic0Zsb29yKHNlY29uZHMgLyA2MCk7XG4gICAgaG91cnMgICAgICAgICAgICAgPSBhYnNGbG9vcihtaW51dGVzIC8gNjApO1xuICAgIHNlY29uZHMgJT0gNjA7XG4gICAgbWludXRlcyAlPSA2MDtcblxuICAgIC8vIDEyIG1vbnRocyAtPiAxIHllYXJcbiAgICB5ZWFycyAgPSBhYnNGbG9vcihtb250aHMgLyAxMik7XG4gICAgbW9udGhzICU9IDEyO1xuXG5cbiAgICAvLyBpbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vZG9yZGlsbGUvbW9tZW50LWlzb2R1cmF0aW9uL2Jsb2IvbWFzdGVyL21vbWVudC5pc29kdXJhdGlvbi5qc1xuICAgIHZhciBZID0geWVhcnM7XG4gICAgdmFyIE0gPSBtb250aHM7XG4gICAgdmFyIEQgPSBkYXlzO1xuICAgIHZhciBoID0gaG91cnM7XG4gICAgdmFyIG0gPSBtaW51dGVzO1xuICAgIHZhciBzID0gc2Vjb25kcztcbiAgICB2YXIgdG90YWwgPSB0aGlzLmFzU2Vjb25kcygpO1xuXG4gICAgaWYgKCF0b3RhbCkge1xuICAgICAgICAvLyB0aGlzIGlzIHRoZSBzYW1lIGFzIEMjJ3MgKE5vZGEpIGFuZCBweXRob24gKGlzb2RhdGUpLi4uXG4gICAgICAgIC8vIGJ1dCBub3Qgb3RoZXIgSlMgKGdvb2cuZGF0ZSlcbiAgICAgICAgcmV0dXJuICdQMEQnO1xuICAgIH1cblxuICAgIHJldHVybiAodG90YWwgPCAwID8gJy0nIDogJycpICtcbiAgICAgICAgJ1AnICtcbiAgICAgICAgKFkgPyBZICsgJ1knIDogJycpICtcbiAgICAgICAgKE0gPyBNICsgJ00nIDogJycpICtcbiAgICAgICAgKEQgPyBEICsgJ0QnIDogJycpICtcbiAgICAgICAgKChoIHx8IG0gfHwgcykgPyAnVCcgOiAnJykgK1xuICAgICAgICAoaCA/IGggKyAnSCcgOiAnJykgK1xuICAgICAgICAobSA/IG0gKyAnTScgOiAnJykgK1xuICAgICAgICAocyA/IHMgKyAnUycgOiAnJyk7XG59XG5cbnZhciBwcm90byQyID0gRHVyYXRpb24ucHJvdG90eXBlO1xuXG5wcm90byQyLmlzVmFsaWQgICAgICAgID0gaXNWYWxpZCQxO1xucHJvdG8kMi5hYnMgICAgICAgICAgICA9IGFicztcbnByb3RvJDIuYWRkICAgICAgICAgICAgPSBhZGQkMTtcbnByb3RvJDIuc3VidHJhY3QgICAgICAgPSBzdWJ0cmFjdCQxO1xucHJvdG8kMi5hcyAgICAgICAgICAgICA9IGFzO1xucHJvdG8kMi5hc01pbGxpc2Vjb25kcyA9IGFzTWlsbGlzZWNvbmRzO1xucHJvdG8kMi5hc1NlY29uZHMgICAgICA9IGFzU2Vjb25kcztcbnByb3RvJDIuYXNNaW51dGVzICAgICAgPSBhc01pbnV0ZXM7XG5wcm90byQyLmFzSG91cnMgICAgICAgID0gYXNIb3VycztcbnByb3RvJDIuYXNEYXlzICAgICAgICAgPSBhc0RheXM7XG5wcm90byQyLmFzV2Vla3MgICAgICAgID0gYXNXZWVrcztcbnByb3RvJDIuYXNNb250aHMgICAgICAgPSBhc01vbnRocztcbnByb3RvJDIuYXNZZWFycyAgICAgICAgPSBhc1llYXJzO1xucHJvdG8kMi52YWx1ZU9mICAgICAgICA9IHZhbHVlT2YkMTtcbnByb3RvJDIuX2J1YmJsZSAgICAgICAgPSBidWJibGU7XG5wcm90byQyLmdldCAgICAgICAgICAgID0gZ2V0JDI7XG5wcm90byQyLm1pbGxpc2Vjb25kcyAgID0gbWlsbGlzZWNvbmRzO1xucHJvdG8kMi5zZWNvbmRzICAgICAgICA9IHNlY29uZHM7XG5wcm90byQyLm1pbnV0ZXMgICAgICAgID0gbWludXRlcztcbnByb3RvJDIuaG91cnMgICAgICAgICAgPSBob3VycztcbnByb3RvJDIuZGF5cyAgICAgICAgICAgPSBkYXlzO1xucHJvdG8kMi53ZWVrcyAgICAgICAgICA9IHdlZWtzO1xucHJvdG8kMi5tb250aHMgICAgICAgICA9IG1vbnRocztcbnByb3RvJDIueWVhcnMgICAgICAgICAgPSB5ZWFycztcbnByb3RvJDIuaHVtYW5pemUgICAgICAgPSBodW1hbml6ZTtcbnByb3RvJDIudG9JU09TdHJpbmcgICAgPSB0b0lTT1N0cmluZyQxO1xucHJvdG8kMi50b1N0cmluZyAgICAgICA9IHRvSVNPU3RyaW5nJDE7XG5wcm90byQyLnRvSlNPTiAgICAgICAgID0gdG9JU09TdHJpbmckMTtcbnByb3RvJDIubG9jYWxlICAgICAgICAgPSBsb2NhbGU7XG5wcm90byQyLmxvY2FsZURhdGEgICAgID0gbG9jYWxlRGF0YTtcblxuLy8gRGVwcmVjYXRpb25zXG5wcm90byQyLnRvSXNvU3RyaW5nID0gZGVwcmVjYXRlKCd0b0lzb1N0cmluZygpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdG9JU09TdHJpbmcoKSBpbnN0ZWFkIChub3RpY2UgdGhlIGNhcGl0YWxzKScsIHRvSVNPU3RyaW5nJDEpO1xucHJvdG8kMi5sYW5nID0gbGFuZztcblxuLy8gU2lkZSBlZmZlY3QgaW1wb3J0c1xuXG4vLyBGT1JNQVRUSU5HXG5cbmFkZEZvcm1hdFRva2VuKCdYJywgMCwgMCwgJ3VuaXgnKTtcbmFkZEZvcm1hdFRva2VuKCd4JywgMCwgMCwgJ3ZhbHVlT2YnKTtcblxuLy8gUEFSU0lOR1xuXG5hZGRSZWdleFRva2VuKCd4JywgbWF0Y2hTaWduZWQpO1xuYWRkUmVnZXhUb2tlbignWCcsIG1hdGNoVGltZXN0YW1wKTtcbmFkZFBhcnNlVG9rZW4oJ1gnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShwYXJzZUZsb2F0KGlucHV0LCAxMCkgKiAxMDAwKTtcbn0pO1xuYWRkUGFyc2VUb2tlbigneCcsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKHRvSW50KGlucHV0KSk7XG59KTtcblxuLy8gU2lkZSBlZmZlY3QgaW1wb3J0c1xuXG5cbmhvb2tzLnZlcnNpb24gPSAnMi4xOC4xJztcblxuc2V0SG9va0NhbGxiYWNrKGNyZWF0ZUxvY2FsKTtcblxuaG9va3MuZm4gICAgICAgICAgICAgICAgICAgID0gcHJvdG87XG5ob29rcy5taW4gICAgICAgICAgICAgICAgICAgPSBtaW47XG5ob29rcy5tYXggICAgICAgICAgICAgICAgICAgPSBtYXg7XG5ob29rcy5ub3cgICAgICAgICAgICAgICAgICAgPSBub3c7XG5ob29rcy51dGMgICAgICAgICAgICAgICAgICAgPSBjcmVhdGVVVEM7XG5ob29rcy51bml4ICAgICAgICAgICAgICAgICAgPSBjcmVhdGVVbml4O1xuaG9va3MubW9udGhzICAgICAgICAgICAgICAgID0gbGlzdE1vbnRocztcbmhvb2tzLmlzRGF0ZSAgICAgICAgICAgICAgICA9IGlzRGF0ZTtcbmhvb2tzLmxvY2FsZSAgICAgICAgICAgICAgICA9IGdldFNldEdsb2JhbExvY2FsZTtcbmhvb2tzLmludmFsaWQgICAgICAgICAgICAgICA9IGNyZWF0ZUludmFsaWQ7XG5ob29rcy5kdXJhdGlvbiAgICAgICAgICAgICAgPSBjcmVhdGVEdXJhdGlvbjtcbmhvb2tzLmlzTW9tZW50ICAgICAgICAgICAgICA9IGlzTW9tZW50O1xuaG9va3Mud2Vla2RheXMgICAgICAgICAgICAgID0gbGlzdFdlZWtkYXlzO1xuaG9va3MucGFyc2Vab25lICAgICAgICAgICAgID0gY3JlYXRlSW5ab25lO1xuaG9va3MubG9jYWxlRGF0YSAgICAgICAgICAgID0gZ2V0TG9jYWxlO1xuaG9va3MuaXNEdXJhdGlvbiAgICAgICAgICAgID0gaXNEdXJhdGlvbjtcbmhvb2tzLm1vbnRoc1Nob3J0ICAgICAgICAgICA9IGxpc3RNb250aHNTaG9ydDtcbmhvb2tzLndlZWtkYXlzTWluICAgICAgICAgICA9IGxpc3RXZWVrZGF5c01pbjtcbmhvb2tzLmRlZmluZUxvY2FsZSAgICAgICAgICA9IGRlZmluZUxvY2FsZTtcbmhvb2tzLnVwZGF0ZUxvY2FsZSAgICAgICAgICA9IHVwZGF0ZUxvY2FsZTtcbmhvb2tzLmxvY2FsZXMgICAgICAgICAgICAgICA9IGxpc3RMb2NhbGVzO1xuaG9va3Mud2Vla2RheXNTaG9ydCAgICAgICAgID0gbGlzdFdlZWtkYXlzU2hvcnQ7XG5ob29rcy5ub3JtYWxpemVVbml0cyAgICAgICAgPSBub3JtYWxpemVVbml0cztcbmhvb2tzLnJlbGF0aXZlVGltZVJvdW5kaW5nID0gZ2V0U2V0UmVsYXRpdmVUaW1lUm91bmRpbmc7XG5ob29rcy5yZWxhdGl2ZVRpbWVUaHJlc2hvbGQgPSBnZXRTZXRSZWxhdGl2ZVRpbWVUaHJlc2hvbGQ7XG5ob29rcy5jYWxlbmRhckZvcm1hdCAgICAgICAgPSBnZXRDYWxlbmRhckZvcm1hdDtcbmhvb2tzLnByb3RvdHlwZSAgICAgICAgICAgICA9IHByb3RvO1xuXG5yZXR1cm4gaG9va3M7XG5cbn0pKSk7XG4iLCJleHBvcnQgY29uc3QgY29uZmlnID0ge1xuICBvdmVycGFzc0Jhc2U6ICdodHRwczovL292ZXJwYXNzLm1hcHRpbWUuaW4vYXBpL2ludGVycHJldGVyJyxcbiAgb3NtQmFzZTogJ2h0dHBzOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2FwaS8wLjYvJyxcbiAgbWFwYm94QWNjZXNzVG9rZW46XG4gICAgJ3BrLmV5SjFJam9pY21GellXZDVJaXdpWVNJNkltTnBlalZyTWpjNGVUQXdOR2N6TTJ0aE5Xb3pZbkoxT0hraWZRLnlGUnIzU2QzOVRKaXdFZ3VRcElrV1EnLFxuICBTM19VUkw6ICdodHRwczovL3MzLmFtYXpvbmF3cy5jb20vbWFwYm94L3JlYWwtY2hhbmdlc2V0cy9wcm9kdWN0aW9uLydcbn07XG4iLCJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5KGNoYW5nZXNldElEKSB7XG4gIHZhciB1cmwgPSBjb25maWcub3NtQmFzZSArICdjaGFuZ2VzZXQvJyArIGNoYW5nZXNldElEO1xuICB2YXIgb3B0aW9ucyA9IHtcbiAgICAnUmVzcG9uc2UtVHlwZSc6ICdkb2N1bWVudCdcbiAgfTtcbiAgcmV0dXJuIGZldGNoKHVybCwgb3B0aW9ucylcbiAgICAudGhlbihyID0+IHIudGV4dCgpKVxuICAgIC50aGVuKHIgPT4ge1xuICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgbGV0IHhtbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHhtbCA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcociwgJ3RleHQveG1sJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICB2YXIgY3NGZWF0dXJlID0geG1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdjaGFuZ2VzZXQnKVswXTtcbiAgICAgIHZhciBjcyA9IGNzRmVhdHVyZS5hdHRyaWJ1dGVzO1xuICAgICAgdmFyIHVpZCA9IGNzLnVpZC50ZXh0Q29udGVudDtcbiAgICAgIHZhciB1c2VyID0gY3MudXNlci50ZXh0Q29udGVudDtcbiAgICAgIHZhciBmcm9tID0gbW9tZW50KGNzLmNyZWF0ZWRfYXQudGV4dENvbnRlbnQsICdZWVlZLU1NLUREVEhIOm1tOnNzXFxcXFonKVxuICAgICAgICAuc3VidHJhY3QoMSwgJ3NlY29uZHMnKVxuICAgICAgICAuZm9ybWF0KCdZWVlZLU1NLUREVEhIOm1tOnNzXFxcXFonKTtcbiAgICAgIHZhciB0byA9IGNzLmNsb3NlZF9hdCA/IGNzLmNsb3NlZF9hdC50ZXh0Q29udGVudCA6IG51bGw7XG4gICAgICB2YXIgbGVmdCA9IGNzLm1pbl9sb24gPyBjcy5taW5fbG9uLnRleHRDb250ZW50IDogLTE4MDtcbiAgICAgIHZhciBib3R0b20gPSBjcy5taW5fbGF0ID8gY3MubWluX2xhdC50ZXh0Q29udGVudCA6IC05MDtcbiAgICAgIHZhciByaWdodCA9IGNzLm1heF9sb24gPyBjcy5tYXhfbG9uLnRleHRDb250ZW50IDogMTgwO1xuICAgICAgdmFyIHRvcCA9IGNzLm1heF9sYXQgPyBjcy5tYXhfbGF0LnRleHRDb250ZW50IDogOTA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogY2hhbmdlc2V0SUQsXG4gICAgICAgIHVpZDogdWlkLFxuICAgICAgICB1c2VyOiB1c2VyLFxuICAgICAgICBmcm9tOiBmcm9tLFxuICAgICAgICB0bzogdG8sXG4gICAgICAgIGJib3g6IHtcbiAgICAgICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgICAgIGJvdHRvbTogYm90dG9tLFxuICAgICAgICAgIHJpZ2h0OiByaWdodCxcbiAgICAgICAgICB0b3A6IHRvcFxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xufVxuXG52YXIgeCA9IChcbiAgPHNlY3Rpb24gY2xhc3NOYW1lPVwiY21hcC1maWx0ZXItdHlwZS1zZWN0aW9uXCI+XG4gICAgPGg2IGNsYXNzTmFtZT1cImNtYXAtaGVhZGluZ1wiPkZpbHRlciBieSB0eXBlPC9oNj5cbiAgICA8dWwgY2xhc3NOYW1lPVwiY21hcC1obGlzdFwiPlxuICAgICAgPGxpPlxuICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiY21hcC1obGlzdC1pdGVtIGNtYXAtbm9zZWxlY3QgY21hcC1wb2ludGVyXCI+XG4gICAgICAgICAgPGNsYXNzTmFtZVxuICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgIHZhbHVlPVwibm9kZXNcIlxuICAgICAgICAgICAgY2hlY2tlZD1cInRydWVcIlxuICAgICAgICAgICAgaWQ9XCJjbWFwLXR5cGUtc2VsZWN0b3Itbm9kZXNcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiY21hcC1sYWJlbC10ZXh0XCI+Tm9kZXM8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2xpPlxuICAgICAgPGxpPlxuICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiY21hcC1obGlzdC1pdGVtIGNtYXAtbm9zZWxlY3QgY21hcC1wb2ludGVyXCI+XG4gICAgICAgICAgPGNsYXNzTmFtZVxuICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgIHZhbHVlPVwid2F5c1wiXG4gICAgICAgICAgICBjaGVja2VkPVwidHJ1ZVwiXG4gICAgICAgICAgICBpZD1cImNtYXAtdHlwZS1zZWxlY3Rvci13YXlzXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNtYXAtbGFiZWwtdGV4dFwiPldheXM8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2xpPlxuICAgICAgPGxpPlxuICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiY21hcC1obGlzdC1pdGVtIGNtYXAtbm9zZWxlY3QgY21hcC1wb2ludGVyXCI+XG4gICAgICAgICAgPGNsYXNzTmFtZVxuICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgIHZhbHVlPVwicmVsYXRpb25zXCJcbiAgICAgICAgICAgIGNoZWNrZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgIGlkPVwiY21hcC10eXBlLXNlbGVjdG9yLXJlbGF0aW9uc1wiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJjbWFwLWxhYmVsLXRleHRcIj5SZWxhdGlvbnM8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+XG4gIDwvc2VjdGlvbj5cbik7XG4iLCJpbXBvcnQgYWRpZmZQYXJzZXIgZnJvbSAnb3NtLWFkaWZmLXBhcnNlci1zYXhqcyc7XG5pbXBvcnQganNvblBhcnNlciBmcm9tICdyZWFsLWNoYW5nZXNldHMtcGFyc2VyJztcbmltcG9ydCB7IHF1ZXJ5IH0gZnJvbSAnLi9xdWVyeSc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGFuZ2VzZXQoY2hhbmdlc2V0SUQsIG92ZXJwYXNzQmFzZSA9IGNvbmZpZy5vdmVycGFzc0Jhc2UpIHtcbiAgcmV0dXJuIHF1ZXJ5KGNoYW5nZXNldElEKS50aGVuKGNoYW5nZXNldCA9PiB7XG4gICAgdmFyIHVybCA9IGNvbmZpZy5TM19VUkwgKyBjaGFuZ2VzZXRJRCArICcuanNvbic7XG4gICAgcmV0dXJuIGZldGNoKHVybClcbiAgICAgIC50aGVuKHIgPT4ge1xuICAgICAgICBpZiAoci5vaykgcmV0dXJuIHIuanNvbigpO1xuICAgICAgICAvLyBGYWxsYmFjayB0byBvdmVycGFzc1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoKTtcbiAgICAgIH0pXG4gICAgICAudGhlbihyID0+IHtcbiAgICAgICAgdmFyIGdlb2pzb24gPSBqc29uUGFyc2VyKHIpO1xuICAgICAgICB2YXIgZmVhdHVyZU1hcCA9IGdldEZlYXR1cmVNYXAoZ2VvanNvbik7XG4gICAgICAgIHZhciByZXQgPSB7XG4gICAgICAgICAgZ2VvanNvbjogZ2VvanNvbixcbiAgICAgICAgICBmZWF0dXJlTWFwOiBmZWF0dXJlTWFwLFxuICAgICAgICAgIGNoYW5nZXNldDogY2hhbmdlc2V0XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IGZldGNoRnJvbU92ZXJQYXNzKGNoYW5nZXNldElELCBjaGFuZ2VzZXQsIG92ZXJwYXNzQmFzZSkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZmV0Y2hGcm9tT3ZlclBhc3MoY2hhbmdlc2V0SUQsIGNoYW5nZXNldCwgb3ZlcnBhc3NCYXNlKSB7XG4gIHZhciBkYXRhID0gZ2V0RGF0YVBhcmFtKGNoYW5nZXNldCk7XG4gIHZhciBiYm94ID0gZ2V0QmJveFBhcmFtKGNoYW5nZXNldC5iYm94KTtcbiAgdmFyIHVybCA9IG92ZXJwYXNzQmFzZSArICc/ZGF0YT0nICsgZGF0YSArICcmYmJveD0nICsgYmJveDtcblxuICByZXR1cm4gZmV0Y2godXJsLCB7XG4gICAgJ1Jlc3BvbnNlLVR5cGUnOiAnYXBwbGljYXRpb24vb3NtM3MreG1sJ1xuICB9KVxuICAgIC50aGVuKHIgPT4gci50ZXh0KCkpXG4gICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgICAgICBhZGlmZlBhcnNlcihyZXNwb25zZSwgbnVsbCwgKGVyciwganNvbikgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiByZWooe1xuICAgICAgICAgICAgICBtc2c6ICdGYWlsZWQgdG8gcGFyc2VyIGFkaWZmIHhtbC4nLFxuICAgICAgICAgICAgICBlcnJvcjogZXJyXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGdlb2pzb24gPSBqc29uUGFyc2VyKHtcbiAgICAgICAgICAgIGVsZW1lbnRzOiBqc29uW2NoYW5nZXNldElEXVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciBmZWF0dXJlTWFwID0gZ2V0RmVhdHVyZU1hcChnZW9qc29uKTtcblxuICAgICAgICAgIHZhciByZXQgPSB7XG4gICAgICAgICAgICBnZW9qc29uOiBnZW9qc29uLFxuICAgICAgICAgICAgZmVhdHVyZU1hcDogZmVhdHVyZU1hcCxcbiAgICAgICAgICAgIGNoYW5nZXNldDogY2hhbmdlc2V0XG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gcmVzKHJldCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSlcbiAgICAuY2F0Y2goZXJyID0+XG4gICAgICBQcm9taXNlLnJlamVjdCh7XG4gICAgICAgIG1zZzogJ092ZXJwYXNzIHF1ZXJ5IGZhaWxlZC4nLFxuICAgICAgICBlcnJvcjogZXJyXG4gICAgICB9KVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIGdldERhdGFQYXJhbShjKSB7XG4gIHJldHVybiAoXG4gICAgJ1tvdXQ6eG1sXVthZGlmZjolMjInICtcbiAgICBjLmZyb20udG9TdHJpbmcoKSArXG4gICAgJywlMjIsJTIyJyArXG4gICAgYy50by50b1N0cmluZygpICtcbiAgICAnJTIyXTsobm9kZShiYm94KShjaGFuZ2VkKTt3YXkoYmJveCkoY2hhbmdlZCk7cmVsYXRpb24oYmJveCkoY2hhbmdlZCkpO291dCUyMG1ldGElMjBnZW9tKGJib3gpOydcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0QmJveFBhcmFtKGJib3gpIHtcbiAgcmV0dXJuIFtiYm94LmxlZnQsIGJib3guYm90dG9tLCBiYm94LnJpZ2h0LCBiYm94LnRvcF0uam9pbignLCcpO1xufVxuXG5mdW5jdGlvbiBnZXRGZWF0dXJlTWFwKGdlb2pzb24pIHtcbiAgdmFyIGZlYXR1cmVzID0gZ2VvanNvbi5mZWF0dXJlcztcbiAgdmFyIGZlYXR1cmVNYXAgPSB7fTtcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gZmVhdHVyZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgaWQgPSBmZWF0dXJlc1tpXS5wcm9wZXJ0aWVzLmlkO1xuICAgIGZlYXR1cmVNYXBbaWRdID0gZmVhdHVyZU1hcFtpZF0gfHwgW107XG4gICAgZmVhdHVyZU1hcFtpZF0ucHVzaChmZWF0dXJlc1tpXSk7XG4gIH1cblxuICByZXR1cm4gZmVhdHVyZU1hcDtcbn1cbiIsIi8qKlxuICogV3JhcHMgYSBHZW9KU09OIHtAbGluayBHZW9tZXRyeX0gaW4gYSBHZW9KU09OIHtAbGluayBGZWF0dXJlfS5cbiAqXG4gKiBAbmFtZSBmZWF0dXJlXG4gKiBAcGFyYW0ge0dlb21ldHJ5fSBnZW9tZXRyeSBpbnB1dCBnZW9tZXRyeVxuICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzPXt9XSBhbiBPYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzIHRvIGFkZCBhcyBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFtiYm94XSBCQm94IFt3ZXN0LCBzb3V0aCwgZWFzdCwgbm9ydGhdXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtpZF0gSWRlbnRpZmllclxuICogQHJldHVybnMge0ZlYXR1cmV9IGEgR2VvSlNPTiBGZWF0dXJlXG4gKiBAZXhhbXBsZVxuICogdmFyIGdlb21ldHJ5ID0ge1xuICogICBcInR5cGVcIjogXCJQb2ludFwiLFxuICogICBcImNvb3JkaW5hdGVzXCI6IFsxMTAsIDUwXVxuICogfTtcbiAqXG4gKiB2YXIgZmVhdHVyZSA9IHR1cmYuZmVhdHVyZShnZW9tZXRyeSk7XG4gKlxuICogLy89ZmVhdHVyZVxuICovXG5mdW5jdGlvbiBmZWF0dXJlKGdlb21ldHJ5LCBwcm9wZXJ0aWVzLCBiYm94LCBpZCkge1xuICAgIGlmIChnZW9tZXRyeSA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoJ2dlb21ldHJ5IGlzIHJlcXVpcmVkJyk7XG4gICAgaWYgKHByb3BlcnRpZXMgJiYgcHJvcGVydGllcy5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSB0aHJvdyBuZXcgRXJyb3IoJ3Byb3BlcnRpZXMgbXVzdCBiZSBhbiBPYmplY3QnKTtcbiAgICBpZiAoYmJveCAmJiBiYm94Lmxlbmd0aCAhPT0gNCkgdGhyb3cgbmV3IEVycm9yKCdiYm94IG11c3QgYmUgYW4gQXJyYXkgb2YgNCBudW1iZXJzJyk7XG4gICAgaWYgKGlkICYmIFsnc3RyaW5nJywgJ251bWJlciddLmluZGV4T2YodHlwZW9mIGlkKSA9PT0gLTEpIHRocm93IG5ldyBFcnJvcignaWQgbXVzdCBiZSBhIG51bWJlciBvciBhIHN0cmluZycpO1xuXG4gICAgdmFyIGZlYXQgPSB7dHlwZTogJ0ZlYXR1cmUnfTtcbiAgICBpZiAoaWQpIGZlYXQuaWQgPSBpZDtcbiAgICBpZiAoYmJveCkgZmVhdC5iYm94ID0gYmJveDtcbiAgICBmZWF0LnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzIHx8IHt9O1xuICAgIGZlYXQuZ2VvbWV0cnkgPSBnZW9tZXRyeTtcbiAgICByZXR1cm4gZmVhdDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgR2VvSlNPTiB7QGxpbmsgR2VvbWV0cnl9IGZyb20gYSBHZW9tZXRyeSBzdHJpbmcgdHlwZSAmIGNvb3JkaW5hdGVzLlxuICogRm9yIEdlb21ldHJ5Q29sbGVjdGlvbiB0eXBlIHVzZSBgaGVscGVycy5nZW9tZXRyeUNvbGxlY3Rpb25gXG4gKlxuICogQG5hbWUgZ2VvbWV0cnlcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIEdlb21ldHJ5IFR5cGVcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gY29vcmRpbmF0ZXMgQ29vcmRpbmF0ZXNcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW2Jib3hdIEJCb3ggW3dlc3QsIHNvdXRoLCBlYXN0LCBub3J0aF1cbiAqIEByZXR1cm5zIHtHZW9tZXRyeX0gYSBHZW9KU09OIEdlb21ldHJ5XG4gKiBAZXhhbXBsZVxuICogdmFyIHR5cGUgPSAnUG9pbnQnO1xuICogdmFyIGNvb3JkaW5hdGVzID0gWzExMCwgNTBdO1xuICpcbiAqIHZhciBnZW9tZXRyeSA9IHR1cmYuZ2VvbWV0cnkodHlwZSwgY29vcmRpbmF0ZXMpO1xuICpcbiAqIC8vPWdlb21ldHJ5XG4gKi9cbmZ1bmN0aW9uIGdlb21ldHJ5KHR5cGUsIGNvb3JkaW5hdGVzLCBiYm94KSB7XG4gICAgLy8gVmFsaWRhdGlvblxuICAgIGlmICghdHlwZSkgdGhyb3cgbmV3IEVycm9yKCd0eXBlIGlzIHJlcXVpcmVkJyk7XG4gICAgaWYgKCFjb29yZGluYXRlcykgdGhyb3cgbmV3IEVycm9yKCdjb29yZGluYXRlcyBpcyByZXF1aXJlZCcpO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShjb29yZGluYXRlcykpIHRocm93IG5ldyBFcnJvcignY29vcmRpbmF0ZXMgbXVzdCBiZSBhbiBBcnJheScpO1xuICAgIGlmIChiYm94ICYmIGJib3gubGVuZ3RoICE9PSA0KSB0aHJvdyBuZXcgRXJyb3IoJ2Jib3ggbXVzdCBiZSBhbiBBcnJheSBvZiA0IG51bWJlcnMnKTtcblxuICAgIHZhciBnZW9tO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ1BvaW50JzogZ2VvbSA9IHBvaW50KGNvb3JkaW5hdGVzKS5nZW9tZXRyeTsgYnJlYWs7XG4gICAgY2FzZSAnTGluZVN0cmluZyc6IGdlb20gPSBsaW5lU3RyaW5nKGNvb3JkaW5hdGVzKS5nZW9tZXRyeTsgYnJlYWs7XG4gICAgY2FzZSAnUG9seWdvbic6IGdlb20gPSBwb2x5Z29uKGNvb3JkaW5hdGVzKS5nZW9tZXRyeTsgYnJlYWs7XG4gICAgY2FzZSAnTXVsdGlQb2ludCc6IGdlb20gPSBtdWx0aVBvaW50KGNvb3JkaW5hdGVzKS5nZW9tZXRyeTsgYnJlYWs7XG4gICAgY2FzZSAnTXVsdGlMaW5lU3RyaW5nJzogZ2VvbSA9IG11bHRpTGluZVN0cmluZyhjb29yZGluYXRlcykuZ2VvbWV0cnk7IGJyZWFrO1xuICAgIGNhc2UgJ011bHRpUG9seWdvbic6IGdlb20gPSBtdWx0aVBvbHlnb24oY29vcmRpbmF0ZXMpLmdlb21ldHJ5OyBicmVhaztcbiAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IodHlwZSArICcgaXMgaW52YWxpZCcpO1xuICAgIH1cbiAgICBpZiAoYmJveCkgZ2VvbS5iYm94ID0gYmJveDtcbiAgICByZXR1cm4gZ2VvbTtcbn1cblxuLyoqXG4gKiBUYWtlcyBjb29yZGluYXRlcyBhbmQgcHJvcGVydGllcyAob3B0aW9uYWwpIGFuZCByZXR1cm5zIGEgbmV3IHtAbGluayBQb2ludH0gZmVhdHVyZS5cbiAqXG4gKiBAbmFtZSBwb2ludFxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBjb29yZGluYXRlcyBsb25naXR1ZGUsIGxhdGl0dWRlIHBvc2l0aW9uIChlYWNoIGluIGRlY2ltYWwgZGVncmVlcylcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllcz17fV0gYW4gT2JqZWN0IG9mIGtleS12YWx1ZSBwYWlycyB0byBhZGQgYXMgcHJvcGVydGllc1xuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbYmJveF0gQkJveCBbd2VzdCwgc291dGgsIGVhc3QsIG5vcnRoXVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbaWRdIElkZW50aWZpZXJcbiAqIEByZXR1cm5zIHtGZWF0dXJlPFBvaW50Pn0gYSBQb2ludCBmZWF0dXJlXG4gKiBAZXhhbXBsZVxuICogdmFyIHBvaW50ID0gdHVyZi5wb2ludChbLTc1LjM0MywgMzkuOTg0XSk7XG4gKlxuICogLy89cG9pbnRcbiAqL1xuZnVuY3Rpb24gcG9pbnQoY29vcmRpbmF0ZXMsIHByb3BlcnRpZXMsIGJib3gsIGlkKSB7XG4gICAgaWYgKCFjb29yZGluYXRlcykgdGhyb3cgbmV3IEVycm9yKCdObyBjb29yZGluYXRlcyBwYXNzZWQnKTtcbiAgICBpZiAoY29vcmRpbmF0ZXMubGVuZ3RoID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcignQ29vcmRpbmF0ZXMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIGlmIChjb29yZGluYXRlcy5sZW5ndGggPCAyKSB0aHJvdyBuZXcgRXJyb3IoJ0Nvb3JkaW5hdGVzIG11c3QgYmUgYXQgbGVhc3QgMiBudW1iZXJzIGxvbmcnKTtcbiAgICBpZiAoIWlzTnVtYmVyKGNvb3JkaW5hdGVzWzBdKSB8fCAhaXNOdW1iZXIoY29vcmRpbmF0ZXNbMV0pKSB0aHJvdyBuZXcgRXJyb3IoJ0Nvb3JkaW5hdGVzIG11c3QgY29udGFpbiBudW1iZXJzJyk7XG5cbiAgICByZXR1cm4gZmVhdHVyZSh7XG4gICAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICAgIGNvb3JkaW5hdGVzOiBjb29yZGluYXRlc1xuICAgIH0sIHByb3BlcnRpZXMsIGJib3gsIGlkKTtcbn1cblxuLyoqXG4gKiBUYWtlcyBhbiBhcnJheSBvZiBMaW5lYXJSaW5ncyBhbmQgb3B0aW9uYWxseSBhbiB7QGxpbmsgT2JqZWN0fSB3aXRoIHByb3BlcnRpZXMgYW5kIHJldHVybnMgYSB7QGxpbmsgUG9seWdvbn0gZmVhdHVyZS5cbiAqXG4gKiBAbmFtZSBwb2x5Z29uXG4gKiBAcGFyYW0ge0FycmF5PEFycmF5PEFycmF5PG51bWJlcj4+Pn0gY29vcmRpbmF0ZXMgYW4gYXJyYXkgb2YgTGluZWFyUmluZ3NcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllcz17fV0gYW4gT2JqZWN0IG9mIGtleS12YWx1ZSBwYWlycyB0byBhZGQgYXMgcHJvcGVydGllc1xuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbYmJveF0gQkJveCBbd2VzdCwgc291dGgsIGVhc3QsIG5vcnRoXVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbaWRdIElkZW50aWZpZXJcbiAqIEByZXR1cm5zIHtGZWF0dXJlPFBvbHlnb24+fSBhIFBvbHlnb24gZmVhdHVyZVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIGEgTGluZWFyUmluZyBvZiB0aGUgcG9seWdvbiBoYXMgdG9vIGZldyBwb3NpdGlvbnNcbiAqIG9yIGlmIGEgTGluZWFyUmluZyBvZiB0aGUgUG9seWdvbiBkb2VzIG5vdCBoYXZlIG1hdGNoaW5nIFBvc2l0aW9ucyBhdCB0aGUgYmVnaW5uaW5nICYgZW5kLlxuICogQGV4YW1wbGVcbiAqIHZhciBwb2x5Z29uID0gdHVyZi5wb2x5Z29uKFtbXG4gKiAgIFstMi4yNzU1NDMsIDUzLjQ2NDU0N10sXG4gKiAgIFstMi4yNzU1NDMsIDUzLjQ4OTI3MV0sXG4gKiAgIFstMi4yMTUxMTgsIDUzLjQ4OTI3MV0sXG4gKiAgIFstMi4yMTUxMTgsIDUzLjQ2NDU0N10sXG4gKiAgIFstMi4yNzU1NDMsIDUzLjQ2NDU0N11cbiAqIF1dLCB7IG5hbWU6ICdwb2x5MScsIHBvcHVsYXRpb246IDQwMH0pO1xuICpcbiAqIC8vPXBvbHlnb25cbiAqL1xuZnVuY3Rpb24gcG9seWdvbihjb29yZGluYXRlcywgcHJvcGVydGllcywgYmJveCwgaWQpIHtcbiAgICBpZiAoIWNvb3JkaW5hdGVzKSB0aHJvdyBuZXcgRXJyb3IoJ05vIGNvb3JkaW5hdGVzIHBhc3NlZCcpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb29yZGluYXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcmluZyA9IGNvb3JkaW5hdGVzW2ldO1xuICAgICAgICBpZiAocmluZy5sZW5ndGggPCA0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VhY2ggTGluZWFyUmluZyBvZiBhIFBvbHlnb24gbXVzdCBoYXZlIDQgb3IgbW9yZSBQb3NpdGlvbnMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByaW5nW3JpbmcubGVuZ3RoIC0gMV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGZpcnN0IHBvaW50IG9mIFBvbHlnb24gY29udGFpbnMgdHdvIG51bWJlcnNcbiAgICAgICAgICAgIGlmIChpID09PSAwICYmIGogPT09IDAgJiYgIWlzTnVtYmVyKHJpbmdbMF1bMF0pIHx8ICFpc051bWJlcihyaW5nWzBdWzFdKSkgdGhyb3cgbmV3IEVycm9yKCdDb29yZGluYXRlcyBtdXN0IGNvbnRhaW4gbnVtYmVycycpO1xuICAgICAgICAgICAgaWYgKHJpbmdbcmluZy5sZW5ndGggLSAxXVtqXSAhPT0gcmluZ1swXVtqXSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmlyc3QgYW5kIGxhc3QgUG9zaXRpb24gYXJlIG5vdCBlcXVpdmFsZW50LicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZlYXR1cmUoe1xuICAgICAgICB0eXBlOiAnUG9seWdvbicsXG4gICAgICAgIGNvb3JkaW5hdGVzOiBjb29yZGluYXRlc1xuICAgIH0sIHByb3BlcnRpZXMsIGJib3gsIGlkKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEge0BsaW5rIExpbmVTdHJpbmd9IGJhc2VkIG9uIGFcbiAqIGNvb3JkaW5hdGUgYXJyYXkuIFByb3BlcnRpZXMgY2FuIGJlIGFkZGVkIG9wdGlvbmFsbHkuXG4gKlxuICogQG5hbWUgbGluZVN0cmluZ1xuICogQHBhcmFtIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gY29vcmRpbmF0ZXMgYW4gYXJyYXkgb2YgUG9zaXRpb25zXG4gKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXM9e31dIGFuIE9iamVjdCBvZiBrZXktdmFsdWUgcGFpcnMgdG8gYWRkIGFzIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW2Jib3hdIEJCb3ggW3dlc3QsIHNvdXRoLCBlYXN0LCBub3J0aF1cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2lkXSBJZGVudGlmaWVyXG4gKiBAcmV0dXJucyB7RmVhdHVyZTxMaW5lU3RyaW5nPn0gYSBMaW5lU3RyaW5nIGZlYXR1cmVcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBubyBjb29yZGluYXRlcyBhcmUgcGFzc2VkXG4gKiBAZXhhbXBsZVxuICogdmFyIGxpbmVzdHJpbmcxID0gdHVyZi5saW5lU3RyaW5nKFtcbiAqICAgWy0yMS45NjQ0MTYsIDY0LjE0ODIwM10sXG4gKiAgIFstMjEuOTU2MTc2LCA2NC4xNDEzMTZdLFxuICogICBbLTIxLjkzOTAxLCA2NC4xMzU5MjRdLFxuICogICBbLTIxLjkyNzMzNywgNjQuMTM2NjczXVxuICogXSk7XG4gKiB2YXIgbGluZXN0cmluZzIgPSB0dXJmLmxpbmVTdHJpbmcoW1xuICogICBbLTIxLjkyOTA1NCwgNjQuMTI3OTg1XSxcbiAqICAgWy0yMS45MTI5MTgsIDY0LjEzNDcyNl0sXG4gKiAgIFstMjEuOTE2MDA3LCA2NC4xNDEwMTZdLFxuICogICBbLTIxLjkzMDA4NCwgNjQuMTQ0NDZdXG4gKiBdLCB7bmFtZTogJ2xpbmUgMScsIGRpc3RhbmNlOiAxNDV9KTtcbiAqXG4gKiAvLz1saW5lc3RyaW5nMVxuICpcbiAqIC8vPWxpbmVzdHJpbmcyXG4gKi9cbmZ1bmN0aW9uIGxpbmVTdHJpbmcoY29vcmRpbmF0ZXMsIHByb3BlcnRpZXMsIGJib3gsIGlkKSB7XG4gICAgaWYgKCFjb29yZGluYXRlcykgdGhyb3cgbmV3IEVycm9yKCdObyBjb29yZGluYXRlcyBwYXNzZWQnKTtcbiAgICBpZiAoY29vcmRpbmF0ZXMubGVuZ3RoIDwgMikgdGhyb3cgbmV3IEVycm9yKCdDb29yZGluYXRlcyBtdXN0IGJlIGFuIGFycmF5IG9mIHR3byBvciBtb3JlIHBvc2l0aW9ucycpO1xuICAgIC8vIENoZWNrIGlmIGZpcnN0IHBvaW50IG9mIExpbmVTdHJpbmcgY29udGFpbnMgdHdvIG51bWJlcnNcbiAgICBpZiAoIWlzTnVtYmVyKGNvb3JkaW5hdGVzWzBdWzFdKSB8fCAhaXNOdW1iZXIoY29vcmRpbmF0ZXNbMF1bMV0pKSB0aHJvdyBuZXcgRXJyb3IoJ0Nvb3JkaW5hdGVzIG11c3QgY29udGFpbiBudW1iZXJzJyk7XG5cbiAgICByZXR1cm4gZmVhdHVyZSh7XG4gICAgICAgIHR5cGU6ICdMaW5lU3RyaW5nJyxcbiAgICAgICAgY29vcmRpbmF0ZXM6IGNvb3JkaW5hdGVzXG4gICAgfSwgcHJvcGVydGllcywgYmJveCwgaWQpO1xufVxuXG4vKipcbiAqIFRha2VzIG9uZSBvciBtb3JlIHtAbGluayBGZWF0dXJlfEZlYXR1cmVzfSBhbmQgY3JlYXRlcyBhIHtAbGluayBGZWF0dXJlQ29sbGVjdGlvbn0uXG4gKlxuICogQG5hbWUgZmVhdHVyZUNvbGxlY3Rpb25cbiAqIEBwYXJhbSB7RmVhdHVyZVtdfSBmZWF0dXJlcyBpbnB1dCBmZWF0dXJlc1xuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbYmJveF0gQkJveCBbd2VzdCwgc291dGgsIGVhc3QsIG5vcnRoXVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbaWRdIElkZW50aWZpZXJcbiAqIEByZXR1cm5zIHtGZWF0dXJlQ29sbGVjdGlvbn0gYSBGZWF0dXJlQ29sbGVjdGlvbiBvZiBpbnB1dCBmZWF0dXJlc1xuICogQGV4YW1wbGVcbiAqIHZhciBmZWF0dXJlcyA9IFtcbiAqICB0dXJmLnBvaW50KFstNzUuMzQzLCAzOS45ODRdLCB7bmFtZTogJ0xvY2F0aW9uIEEnfSksXG4gKiAgdHVyZi5wb2ludChbLTc1LjgzMywgMzkuMjg0XSwge25hbWU6ICdMb2NhdGlvbiBCJ30pLFxuICogIHR1cmYucG9pbnQoWy03NS41MzQsIDM5LjEyM10sIHtuYW1lOiAnTG9jYXRpb24gQyd9KVxuICogXTtcbiAqXG4gKiB2YXIgY29sbGVjdGlvbiA9IHR1cmYuZmVhdHVyZUNvbGxlY3Rpb24oZmVhdHVyZXMpO1xuICpcbiAqIC8vPWNvbGxlY3Rpb25cbiAqL1xuZnVuY3Rpb24gZmVhdHVyZUNvbGxlY3Rpb24oZmVhdHVyZXMsIGJib3gsIGlkKSB7XG4gICAgaWYgKCFmZWF0dXJlcykgdGhyb3cgbmV3IEVycm9yKCdObyBmZWF0dXJlcyBwYXNzZWQnKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmVhdHVyZXMpKSB0aHJvdyBuZXcgRXJyb3IoJ2ZlYXR1cmVzIG11c3QgYmUgYW4gQXJyYXknKTtcbiAgICBpZiAoYmJveCAmJiBiYm94Lmxlbmd0aCAhPT0gNCkgdGhyb3cgbmV3IEVycm9yKCdiYm94IG11c3QgYmUgYW4gQXJyYXkgb2YgNCBudW1iZXJzJyk7XG4gICAgaWYgKGlkICYmIFsnc3RyaW5nJywgJ251bWJlciddLmluZGV4T2YodHlwZW9mIGlkKSA9PT0gLTEpIHRocm93IG5ldyBFcnJvcignaWQgbXVzdCBiZSBhIG51bWJlciBvciBhIHN0cmluZycpO1xuXG4gICAgdmFyIGZjID0ge3R5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbid9O1xuICAgIGlmIChpZCkgZmMuaWQgPSBpZDtcbiAgICBpZiAoYmJveCkgZmMuYmJveCA9IGJib3g7XG4gICAgZmMuZmVhdHVyZXMgPSBmZWF0dXJlcztcbiAgICByZXR1cm4gZmM7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBGZWF0dXJlPE11bHRpTGluZVN0cmluZz59IGJhc2VkIG9uIGFcbiAqIGNvb3JkaW5hdGUgYXJyYXkuIFByb3BlcnRpZXMgY2FuIGJlIGFkZGVkIG9wdGlvbmFsbHkuXG4gKlxuICogQG5hbWUgbXVsdGlMaW5lU3RyaW5nXG4gKiBAcGFyYW0ge0FycmF5PEFycmF5PEFycmF5PG51bWJlcj4+Pn0gY29vcmRpbmF0ZXMgYW4gYXJyYXkgb2YgTGluZVN0cmluZ3NcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcHJvcGVydGllcz17fV0gYW4gT2JqZWN0IG9mIGtleS12YWx1ZSBwYWlycyB0byBhZGQgYXMgcHJvcGVydGllc1xuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBbYmJveF0gQkJveCBbd2VzdCwgc291dGgsIGVhc3QsIG5vcnRoXVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbaWRdIElkZW50aWZpZXJcbiAqIEByZXR1cm5zIHtGZWF0dXJlPE11bHRpTGluZVN0cmluZz59IGEgTXVsdGlMaW5lU3RyaW5nIGZlYXR1cmVcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiBubyBjb29yZGluYXRlcyBhcmUgcGFzc2VkXG4gKiBAZXhhbXBsZVxuICogdmFyIG11bHRpTGluZSA9IHR1cmYubXVsdGlMaW5lU3RyaW5nKFtbWzAsMF0sWzEwLDEwXV1dKTtcbiAqXG4gKiAvLz1tdWx0aUxpbmVcbiAqL1xuZnVuY3Rpb24gbXVsdGlMaW5lU3RyaW5nKGNvb3JkaW5hdGVzLCBwcm9wZXJ0aWVzLCBiYm94LCBpZCkge1xuICAgIGlmICghY29vcmRpbmF0ZXMpIHRocm93IG5ldyBFcnJvcignTm8gY29vcmRpbmF0ZXMgcGFzc2VkJyk7XG5cbiAgICByZXR1cm4gZmVhdHVyZSh7XG4gICAgICAgIHR5cGU6ICdNdWx0aUxpbmVTdHJpbmcnLFxuICAgICAgICBjb29yZGluYXRlczogY29vcmRpbmF0ZXNcbiAgICB9LCBwcm9wZXJ0aWVzLCBiYm94LCBpZCk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHtAbGluayBGZWF0dXJlPE11bHRpUG9pbnQ+fSBiYXNlZCBvbiBhXG4gKiBjb29yZGluYXRlIGFycmF5LiBQcm9wZXJ0aWVzIGNhbiBiZSBhZGRlZCBvcHRpb25hbGx5LlxuICpcbiAqIEBuYW1lIG11bHRpUG9pbnRcbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8bnVtYmVyPj59IGNvb3JkaW5hdGVzIGFuIGFycmF5IG9mIFBvc2l0aW9uc1xuICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzPXt9XSBhbiBPYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzIHRvIGFkZCBhcyBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFtiYm94XSBCQm94IFt3ZXN0LCBzb3V0aCwgZWFzdCwgbm9ydGhdXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtpZF0gSWRlbnRpZmllclxuICogQHJldHVybnMge0ZlYXR1cmU8TXVsdGlQb2ludD59IGEgTXVsdGlQb2ludCBmZWF0dXJlXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgbm8gY29vcmRpbmF0ZXMgYXJlIHBhc3NlZFxuICogQGV4YW1wbGVcbiAqIHZhciBtdWx0aVB0ID0gdHVyZi5tdWx0aVBvaW50KFtbMCwwXSxbMTAsMTBdXSk7XG4gKlxuICogLy89bXVsdGlQdFxuICovXG5mdW5jdGlvbiBtdWx0aVBvaW50KGNvb3JkaW5hdGVzLCBwcm9wZXJ0aWVzLCBiYm94LCBpZCkge1xuICAgIGlmICghY29vcmRpbmF0ZXMpIHRocm93IG5ldyBFcnJvcignTm8gY29vcmRpbmF0ZXMgcGFzc2VkJyk7XG5cbiAgICByZXR1cm4gZmVhdHVyZSh7XG4gICAgICAgIHR5cGU6ICdNdWx0aVBvaW50JyxcbiAgICAgICAgY29vcmRpbmF0ZXM6IGNvb3JkaW5hdGVzXG4gICAgfSwgcHJvcGVydGllcywgYmJveCwgaWQpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgRmVhdHVyZTxNdWx0aVBvbHlnb24+fSBiYXNlZCBvbiBhXG4gKiBjb29yZGluYXRlIGFycmF5LiBQcm9wZXJ0aWVzIGNhbiBiZSBhZGRlZCBvcHRpb25hbGx5LlxuICpcbiAqIEBuYW1lIG11bHRpUG9seWdvblxuICogQHBhcmFtIHtBcnJheTxBcnJheTxBcnJheTxBcnJheTxudW1iZXI+Pj4+fSBjb29yZGluYXRlcyBhbiBhcnJheSBvZiBQb2x5Z29uc1xuICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzPXt9XSBhbiBPYmplY3Qgb2Yga2V5LXZhbHVlIHBhaXJzIHRvIGFkZCBhcyBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IFtiYm94XSBCQm94IFt3ZXN0LCBzb3V0aCwgZWFzdCwgbm9ydGhdXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtpZF0gSWRlbnRpZmllclxuICogQHJldHVybnMge0ZlYXR1cmU8TXVsdGlQb2x5Z29uPn0gYSBtdWx0aXBvbHlnb24gZmVhdHVyZVxuICogQHRocm93cyB7RXJyb3J9IGlmIG5vIGNvb3JkaW5hdGVzIGFyZSBwYXNzZWRcbiAqIEBleGFtcGxlXG4gKiB2YXIgbXVsdGlQb2x5ID0gdHVyZi5tdWx0aVBvbHlnb24oW1tbWzAsMF0sWzAsMTBdLFsxMCwxMF0sWzEwLDBdLFswLDBdXV1dKTtcbiAqXG4gKiAvLz1tdWx0aVBvbHlcbiAqXG4gKi9cbmZ1bmN0aW9uIG11bHRpUG9seWdvbihjb29yZGluYXRlcywgcHJvcGVydGllcywgYmJveCwgaWQpIHtcbiAgICBpZiAoIWNvb3JkaW5hdGVzKSB0aHJvdyBuZXcgRXJyb3IoJ05vIGNvb3JkaW5hdGVzIHBhc3NlZCcpO1xuXG4gICAgcmV0dXJuIGZlYXR1cmUoe1xuICAgICAgICB0eXBlOiAnTXVsdGlQb2x5Z29uJyxcbiAgICAgICAgY29vcmRpbmF0ZXM6IGNvb3JkaW5hdGVzXG4gICAgfSwgcHJvcGVydGllcywgYmJveCwgaWQpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgRmVhdHVyZTxHZW9tZXRyeUNvbGxlY3Rpb24+fSBiYXNlZCBvbiBhXG4gKiBjb29yZGluYXRlIGFycmF5LiBQcm9wZXJ0aWVzIGNhbiBiZSBhZGRlZCBvcHRpb25hbGx5LlxuICpcbiAqIEBuYW1lIGdlb21ldHJ5Q29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheTxHZW9tZXRyeT59IGdlb21ldHJpZXMgYW4gYXJyYXkgb2YgR2VvSlNPTiBHZW9tZXRyaWVzXG4gKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXM9e31dIGFuIE9iamVjdCBvZiBrZXktdmFsdWUgcGFpcnMgdG8gYWRkIGFzIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gW2Jib3hdIEJCb3ggW3dlc3QsIHNvdXRoLCBlYXN0LCBub3J0aF1cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2lkXSBJZGVudGlmaWVyXG4gKiBAcmV0dXJucyB7RmVhdHVyZTxHZW9tZXRyeUNvbGxlY3Rpb24+fSBhIEdlb0pTT04gR2VvbWV0cnlDb2xsZWN0aW9uIEZlYXR1cmVcbiAqIEBleGFtcGxlXG4gKiB2YXIgcHQgPSB7XG4gKiAgICAgXCJ0eXBlXCI6IFwiUG9pbnRcIixcbiAqICAgICAgIFwiY29vcmRpbmF0ZXNcIjogWzEwMCwgMF1cbiAqICAgICB9O1xuICogdmFyIGxpbmUgPSB7XG4gKiAgICAgXCJ0eXBlXCI6IFwiTGluZVN0cmluZ1wiLFxuICogICAgIFwiY29vcmRpbmF0ZXNcIjogWyBbMTAxLCAwXSwgWzEwMiwgMV0gXVxuICogICB9O1xuICogdmFyIGNvbGxlY3Rpb24gPSB0dXJmLmdlb21ldHJ5Q29sbGVjdGlvbihbcHQsIGxpbmVdKTtcbiAqXG4gKiAvLz1jb2xsZWN0aW9uXG4gKi9cbmZ1bmN0aW9uIGdlb21ldHJ5Q29sbGVjdGlvbihnZW9tZXRyaWVzLCBwcm9wZXJ0aWVzLCBiYm94LCBpZCkge1xuICAgIGlmICghZ2VvbWV0cmllcykgdGhyb3cgbmV3IEVycm9yKCdnZW9tZXRyaWVzIGlzIHJlcXVpcmVkJyk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGdlb21ldHJpZXMpKSB0aHJvdyBuZXcgRXJyb3IoJ2dlb21ldHJpZXMgbXVzdCBiZSBhbiBBcnJheScpO1xuXG4gICAgcmV0dXJuIGZlYXR1cmUoe1xuICAgICAgICB0eXBlOiAnR2VvbWV0cnlDb2xsZWN0aW9uJyxcbiAgICAgICAgZ2VvbWV0cmllczogZ2VvbWV0cmllc1xuICAgIH0sIHByb3BlcnRpZXMsIGJib3gsIGlkKTtcbn1cblxuLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR3JlYXQtY2lyY2xlX2Rpc3RhbmNlI1JhZGl1c19mb3Jfc3BoZXJpY2FsX0VhcnRoXG52YXIgZmFjdG9ycyA9IHtcbiAgICBtaWxlczogMzk2MCxcbiAgICBuYXV0aWNhbG1pbGVzOiAzNDQxLjE0NSxcbiAgICBkZWdyZWVzOiA1Ny4yOTU3Nzk1LFxuICAgIHJhZGlhbnM6IDEsXG4gICAgaW5jaGVzOiAyNTA5MDU2MDAsXG4gICAgeWFyZHM6IDY5Njk2MDAsXG4gICAgbWV0ZXJzOiA2MzczMDAwLFxuICAgIG1ldHJlczogNjM3MzAwMCxcbiAgICBjZW50aW1ldGVyczogNi4zNzNlKzgsXG4gICAgY2VudGltZXRyZXM6IDYuMzczZSs4LFxuICAgIGtpbG9tZXRlcnM6IDYzNzMsXG4gICAga2lsb21ldHJlczogNjM3MyxcbiAgICBmZWV0OiAyMDkwODc5Mi42NVxufTtcblxudmFyIGFyZWFGYWN0b3JzID0ge1xuICAgIGtpbG9tZXRlcnM6IDAuMDAwMDAxLFxuICAgIGtpbG9tZXRyZXM6IDAuMDAwMDAxLFxuICAgIG1ldGVyczogMSxcbiAgICBtZXRyZXM6IDEsXG4gICAgY2VudGltZXRyZXM6IDEwMDAwLFxuICAgIG1pbGxpbWV0ZXI6IDEwMDAwMDAsXG4gICAgYWNyZXM6IDAuMDAwMjQ3MTA1LFxuICAgIG1pbGVzOiAzLjg2ZS03LFxuICAgIHlhcmRzOiAxLjE5NTk5MDA0NixcbiAgICBmZWV0OiAxMC43NjM5MTA0MTcsXG4gICAgaW5jaGVzOiAxNTUwLjAwMzEwMDAwNlxufTtcbi8qKlxuICogUm91bmQgbnVtYmVyIHRvIHByZWNpc2lvblxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW0gTnVtYmVyXG4gKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBQcmVjaXNpb25cbiAqIEByZXR1cm5zIHtudW1iZXJ9IHJvdW5kZWQgbnVtYmVyXG4gKiBAZXhhbXBsZVxuICogdHVyZi5yb3VuZCgxMjAuNDMyMSlcbiAqIC8vPTEyMFxuICpcbiAqIHR1cmYucm91bmQoMTIwLjQzMjEsIDIpXG4gKiAvLz0xMjAuNDNcbiAqL1xuZnVuY3Rpb24gcm91bmQobnVtLCBwcmVjaXNpb24pIHtcbiAgICBpZiAobnVtID09PSB1bmRlZmluZWQgfHwgbnVtID09PSBudWxsIHx8IGlzTmFOKG51bSkpIHRocm93IG5ldyBFcnJvcignbnVtIGlzIHJlcXVpcmVkJyk7XG4gICAgaWYgKHByZWNpc2lvbiAmJiAhKHByZWNpc2lvbiA+PSAwKSkgdGhyb3cgbmV3IEVycm9yKCdwcmVjaXNpb24gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO1xuICAgIHZhciBtdWx0aXBsaWVyID0gTWF0aC5wb3coMTAsIHByZWNpc2lvbiB8fCAwKTtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChudW0gKiBtdWx0aXBsaWVyKSAvIG11bHRpcGxpZXI7XG59XG5cbi8qKlxuICogQ29udmVydCBhIGRpc3RhbmNlIG1lYXN1cmVtZW50IChhc3N1bWluZyBhIHNwaGVyaWNhbCBFYXJ0aCkgZnJvbSByYWRpYW5zIHRvIGEgbW9yZSBmcmllbmRseSB1bml0LlxuICogVmFsaWQgdW5pdHM6IG1pbGVzLCBuYXV0aWNhbG1pbGVzLCBpbmNoZXMsIHlhcmRzLCBtZXRlcnMsIG1ldHJlcywga2lsb21ldGVycywgY2VudGltZXRlcnMsIGZlZXRcbiAqXG4gKiBAbmFtZSByYWRpYW5zVG9EaXN0YW5jZVxuICogQHBhcmFtIHtudW1iZXJ9IHJhZGlhbnMgaW4gcmFkaWFucyBhY3Jvc3MgdGhlIHNwaGVyZVxuICogQHBhcmFtIHtzdHJpbmd9IFt1bml0cz1raWxvbWV0ZXJzXSBjYW4gYmUgZGVncmVlcywgcmFkaWFucywgbWlsZXMsIG9yIGtpbG9tZXRlcnMgaW5jaGVzLCB5YXJkcywgbWV0cmVzLCBtZXRlcnMsIGtpbG9tZXRyZXMsIGtpbG9tZXRlcnMuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBkaXN0YW5jZVxuICovXG5mdW5jdGlvbiByYWRpYW5zVG9EaXN0YW5jZShyYWRpYW5zLCB1bml0cykge1xuICAgIGlmIChyYWRpYW5zID09PSB1bmRlZmluZWQgfHwgcmFkaWFucyA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdyYWRpYW5zIGlzIHJlcXVpcmVkJyk7XG5cbiAgICB2YXIgZmFjdG9yID0gZmFjdG9yc1t1bml0cyB8fCAna2lsb21ldGVycyddO1xuICAgIGlmICghZmFjdG9yKSB0aHJvdyBuZXcgRXJyb3IoJ3VuaXRzIGlzIGludmFsaWQnKTtcbiAgICByZXR1cm4gcmFkaWFucyAqIGZhY3Rvcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgZGlzdGFuY2UgbWVhc3VyZW1lbnQgKGFzc3VtaW5nIGEgc3BoZXJpY2FsIEVhcnRoKSBmcm9tIGEgcmVhbC13b3JsZCB1bml0IGludG8gcmFkaWFuc1xuICogVmFsaWQgdW5pdHM6IG1pbGVzLCBuYXV0aWNhbG1pbGVzLCBpbmNoZXMsIHlhcmRzLCBtZXRlcnMsIG1ldHJlcywga2lsb21ldGVycywgY2VudGltZXRlcnMsIGZlZXRcbiAqXG4gKiBAbmFtZSBkaXN0YW5jZVRvUmFkaWFuc1xuICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlIGluIHJlYWwgdW5pdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdW5pdHM9a2lsb21ldGVyc10gY2FuIGJlIGRlZ3JlZXMsIHJhZGlhbnMsIG1pbGVzLCBvciBraWxvbWV0ZXJzIGluY2hlcywgeWFyZHMsIG1ldHJlcywgbWV0ZXJzLCBraWxvbWV0cmVzLCBraWxvbWV0ZXJzLlxuICogQHJldHVybnMge251bWJlcn0gcmFkaWFuc1xuICovXG5mdW5jdGlvbiBkaXN0YW5jZVRvUmFkaWFucyhkaXN0YW5jZSwgdW5pdHMpIHtcbiAgICBpZiAoZGlzdGFuY2UgPT09IHVuZGVmaW5lZCB8fCBkaXN0YW5jZSA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCdkaXN0YW5jZSBpcyByZXF1aXJlZCcpO1xuXG4gICAgdmFyIGZhY3RvciA9IGZhY3RvcnNbdW5pdHMgfHwgJ2tpbG9tZXRlcnMnXTtcbiAgICBpZiAoIWZhY3RvcikgdGhyb3cgbmV3IEVycm9yKCd1bml0cyBpcyBpbnZhbGlkJyk7XG4gICAgcmV0dXJuIGRpc3RhbmNlIC8gZmFjdG9yO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSBkaXN0YW5jZSBtZWFzdXJlbWVudCAoYXNzdW1pbmcgYSBzcGhlcmljYWwgRWFydGgpIGZyb20gYSByZWFsLXdvcmxkIHVuaXQgaW50byBkZWdyZWVzXG4gKiBWYWxpZCB1bml0czogbWlsZXMsIG5hdXRpY2FsbWlsZXMsIGluY2hlcywgeWFyZHMsIG1ldGVycywgbWV0cmVzLCBjZW50aW1ldGVycywga2lsb21ldHJlcywgZmVldFxuICpcbiAqIEBuYW1lIGRpc3RhbmNlVG9EZWdyZWVzXG4gKiBAcGFyYW0ge251bWJlcn0gZGlzdGFuY2UgaW4gcmVhbCB1bml0c1xuICogQHBhcmFtIHtzdHJpbmd9IFt1bml0cz1raWxvbWV0ZXJzXSBjYW4gYmUgZGVncmVlcywgcmFkaWFucywgbWlsZXMsIG9yIGtpbG9tZXRlcnMgaW5jaGVzLCB5YXJkcywgbWV0cmVzLCBtZXRlcnMsIGtpbG9tZXRyZXMsIGtpbG9tZXRlcnMuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBkZWdyZWVzXG4gKi9cbmZ1bmN0aW9uIGRpc3RhbmNlVG9EZWdyZWVzKGRpc3RhbmNlLCB1bml0cykge1xuICAgIHJldHVybiByYWRpYW5zMmRlZ3JlZXMoZGlzdGFuY2VUb1JhZGlhbnMoZGlzdGFuY2UsIHVuaXRzKSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW55IGJlYXJpbmcgYW5nbGUgZnJvbSB0aGUgbm9ydGggbGluZSBkaXJlY3Rpb24gKHBvc2l0aXZlIGNsb2Nrd2lzZSlcbiAqIGFuZCByZXR1cm5zIGFuIGFuZ2xlIGJldHdlZW4gMC0zNjAgZGVncmVlcyAocG9zaXRpdmUgY2xvY2t3aXNlKSwgMCBiZWluZyB0aGUgbm9ydGggbGluZVxuICpcbiAqIEBuYW1lIGJlYXJpbmdUb0FuZ2xlXG4gKiBAcGFyYW0ge251bWJlcn0gYmVhcmluZyBhbmdsZSwgYmV0d2VlbiAtMTgwIGFuZCArMTgwIGRlZ3JlZXNcbiAqIEByZXR1cm5zIHtudW1iZXJ9IGFuZ2xlIGJldHdlZW4gMCBhbmQgMzYwIGRlZ3JlZXNcbiAqL1xuZnVuY3Rpb24gYmVhcmluZ1RvQW5nbGUoYmVhcmluZykge1xuICAgIGlmIChiZWFyaW5nID09PSBudWxsIHx8IGJlYXJpbmcgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKCdiZWFyaW5nIGlzIHJlcXVpcmVkJyk7XG5cbiAgICB2YXIgYW5nbGUgPSBiZWFyaW5nICUgMzYwO1xuICAgIGlmIChhbmdsZSA8IDApIGFuZ2xlICs9IDM2MDtcbiAgICByZXR1cm4gYW5nbGU7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYW5nbGUgaW4gcmFkaWFucyB0byBkZWdyZWVzXG4gKlxuICogQG5hbWUgcmFkaWFuczJkZWdyZWVzXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkaWFucyBhbmdsZSBpbiByYWRpYW5zXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBkZWdyZWVzIGJldHdlZW4gMCBhbmQgMzYwIGRlZ3JlZXNcbiAqL1xuZnVuY3Rpb24gcmFkaWFuczJkZWdyZWVzKHJhZGlhbnMpIHtcbiAgICBpZiAocmFkaWFucyA9PT0gbnVsbCB8fCByYWRpYW5zID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcigncmFkaWFucyBpcyByZXF1aXJlZCcpO1xuXG4gICAgdmFyIGRlZ3JlZXMgPSByYWRpYW5zICUgKDIgKiBNYXRoLlBJKTtcbiAgICByZXR1cm4gZGVncmVlcyAqIDE4MCAvIE1hdGguUEk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYW5nbGUgaW4gZGVncmVlcyB0byByYWRpYW5zXG4gKlxuICogQG5hbWUgZGVncmVlczJyYWRpYW5zXG4gKiBAcGFyYW0ge251bWJlcn0gZGVncmVlcyBhbmdsZSBiZXR3ZWVuIDAgYW5kIDM2MCBkZWdyZWVzXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBhbmdsZSBpbiByYWRpYW5zXG4gKi9cbmZ1bmN0aW9uIGRlZ3JlZXMycmFkaWFucyhkZWdyZWVzKSB7XG4gICAgaWYgKGRlZ3JlZXMgPT09IG51bGwgfHwgZGVncmVlcyA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoJ2RlZ3JlZXMgaXMgcmVxdWlyZWQnKTtcblxuICAgIHZhciByYWRpYW5zID0gZGVncmVlcyAlIDM2MDtcbiAgICByZXR1cm4gcmFkaWFucyAqIE1hdGguUEkgLyAxODA7XG59XG5cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGRpc3RhbmNlIHRvIHRoZSByZXF1ZXN0ZWQgdW5pdC5cbiAqIFZhbGlkIHVuaXRzOiBtaWxlcywgbmF1dGljYWxtaWxlcywgaW5jaGVzLCB5YXJkcywgbWV0ZXJzLCBtZXRyZXMsIGtpbG9tZXRlcnMsIGNlbnRpbWV0ZXJzLCBmZWV0XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlIHRvIGJlIGNvbnZlcnRlZFxuICogQHBhcmFtIHtzdHJpbmd9IG9yaWdpbmFsVW5pdCBvZiB0aGUgZGlzdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmluYWxVbml0PWtpbG9tZXRlcnNdIHJldHVybmVkIHVuaXRcbiAqIEByZXR1cm5zIHtudW1iZXJ9IHRoZSBjb252ZXJ0ZWQgZGlzdGFuY2VcbiAqL1xuZnVuY3Rpb24gY29udmVydERpc3RhbmNlKGRpc3RhbmNlLCBvcmlnaW5hbFVuaXQsIGZpbmFsVW5pdCkge1xuICAgIGlmIChkaXN0YW5jZSA9PT0gbnVsbCB8fCBkaXN0YW5jZSA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoJ2Rpc3RhbmNlIGlzIHJlcXVpcmVkJyk7XG4gICAgaWYgKCEoZGlzdGFuY2UgPj0gMCkpIHRocm93IG5ldyBFcnJvcignZGlzdGFuY2UgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO1xuXG4gICAgdmFyIGNvbnZlcnRlZERpc3RhbmNlID0gcmFkaWFuc1RvRGlzdGFuY2UoZGlzdGFuY2VUb1JhZGlhbnMoZGlzdGFuY2UsIG9yaWdpbmFsVW5pdCksIGZpbmFsVW5pdCB8fCAna2lsb21ldGVycycpO1xuICAgIHJldHVybiBjb252ZXJ0ZWREaXN0YW5jZTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGFyZWEgdG8gdGhlIHJlcXVlc3RlZCB1bml0LlxuICogVmFsaWQgdW5pdHM6IGtpbG9tZXRlcnMsIGtpbG9tZXRyZXMsIG1ldGVycywgbWV0cmVzLCBjZW50aW1ldHJlcywgbWlsbGltZXRlciwgYWNyZSwgbWlsZSwgeWFyZCwgZm9vdCwgaW5jaFxuICogQHBhcmFtIHtudW1iZXJ9IGFyZWEgdG8gYmUgY29udmVydGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gW29yaWdpbmFsVW5pdD1tZXRlcnNdIG9mIHRoZSBkaXN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IFtmaW5hbFVuaXQ9a2lsb21ldGVyc10gcmV0dXJuZWQgdW5pdFxuICogQHJldHVybnMge251bWJlcn0gdGhlIGNvbnZlcnRlZCBkaXN0YW5jZVxuICovXG5mdW5jdGlvbiBjb252ZXJ0QXJlYShhcmVhLCBvcmlnaW5hbFVuaXQsIGZpbmFsVW5pdCkge1xuICAgIGlmIChhcmVhID09PSBudWxsIHx8IGFyZWEgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKCdhcmVhIGlzIHJlcXVpcmVkJyk7XG4gICAgaWYgKCEoYXJlYSA+PSAwKSkgdGhyb3cgbmV3IEVycm9yKCdhcmVhIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKTtcblxuICAgIHZhciBzdGFydEZhY3RvciA9IGFyZWFGYWN0b3JzW29yaWdpbmFsVW5pdCB8fCAnbWV0ZXJzJ107XG4gICAgaWYgKCFzdGFydEZhY3RvcikgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG9yaWdpbmFsIHVuaXRzJyk7XG5cbiAgICB2YXIgZmluYWxGYWN0b3IgPSBhcmVhRmFjdG9yc1tmaW5hbFVuaXQgfHwgJ2tpbG9tZXRlcnMnXTtcbiAgICBpZiAoIWZpbmFsRmFjdG9yKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZmluYWwgdW5pdHMnKTtcblxuICAgIHJldHVybiAoYXJlYSAvIHN0YXJ0RmFjdG9yKSAqIGZpbmFsRmFjdG9yO1xufVxuXG4vKipcbiAqIGlzTnVtYmVyXG4gKlxuICogQHBhcmFtIHsqfSBudW0gTnVtYmVyIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZS9mYWxzZVxuICogQGV4YW1wbGVcbiAqIHR1cmYuaXNOdW1iZXIoMTIzKVxuICogLy89dHJ1ZVxuICogdHVyZi5pc051bWJlcignZm9vJylcbiAqIC8vPWZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTnVtYmVyKG51bSkge1xuICAgIHJldHVybiAhaXNOYU4obnVtKSAmJiBudW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkobnVtKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZmVhdHVyZTogZmVhdHVyZSxcbiAgICBnZW9tZXRyeTogZ2VvbWV0cnksXG4gICAgZmVhdHVyZUNvbGxlY3Rpb246IGZlYXR1cmVDb2xsZWN0aW9uLFxuICAgIGdlb21ldHJ5Q29sbGVjdGlvbjogZ2VvbWV0cnlDb2xsZWN0aW9uLFxuICAgIHBvaW50OiBwb2ludCxcbiAgICBtdWx0aVBvaW50OiBtdWx0aVBvaW50LFxuICAgIGxpbmVTdHJpbmc6IGxpbmVTdHJpbmcsXG4gICAgbXVsdGlMaW5lU3RyaW5nOiBtdWx0aUxpbmVTdHJpbmcsXG4gICAgcG9seWdvbjogcG9seWdvbixcbiAgICBtdWx0aVBvbHlnb246IG11bHRpUG9seWdvbixcbiAgICByYWRpYW5zVG9EaXN0YW5jZTogcmFkaWFuc1RvRGlzdGFuY2UsXG4gICAgZGlzdGFuY2VUb1JhZGlhbnM6IGRpc3RhbmNlVG9SYWRpYW5zLFxuICAgIGRpc3RhbmNlVG9EZWdyZWVzOiBkaXN0YW5jZVRvRGVncmVlcyxcbiAgICByYWRpYW5zMmRlZ3JlZXM6IHJhZGlhbnMyZGVncmVlcyxcbiAgICBkZWdyZWVzMnJhZGlhbnM6IGRlZ3JlZXMycmFkaWFucyxcbiAgICBiZWFyaW5nVG9BbmdsZTogYmVhcmluZ1RvQW5nbGUsXG4gICAgY29udmVydERpc3RhbmNlOiBjb252ZXJ0RGlzdGFuY2UsXG4gICAgY29udmVydEFyZWE6IGNvbnZlcnRBcmVhLFxuICAgIHJvdW5kOiByb3VuZCxcbiAgICBpc051bWJlcjogaXNOdW1iZXJcbn07XG4iLCJ2YXIgcG9seWdvbiA9IHJlcXVpcmUoJ0B0dXJmL2hlbHBlcnMnKS5wb2x5Z29uO1xuXG4vKipcbiAqIFRha2VzIGEgYmJveCBhbmQgcmV0dXJucyBhbiBlcXVpdmFsZW50IHtAbGluayBQb2x5Z29ufHBvbHlnb259LlxuICpcbiAqIEBuYW1lIGJib3hQb2x5Z29uXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGJib3ggZXh0ZW50IGluIFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSBvcmRlclxuICogQHJldHVybnMge0ZlYXR1cmU8UG9seWdvbj59IGEgUG9seWdvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYm91bmRpbmcgYm94XG4gKiBAZXhhbXBsZVxuICogdmFyIGJib3ggPSBbMCwgMCwgMTAsIDEwXTtcbiAqXG4gKiB2YXIgcG9seSA9IHR1cmYuYmJveFBvbHlnb24oYmJveCk7XG4gKlxuICogLy9hZGRUb01hcFxuICogdmFyIGFkZFRvTWFwID0gW3BvbHldXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJib3gpIHtcbiAgICB2YXIgbG93TGVmdCA9IFtiYm94WzBdLCBiYm94WzFdXTtcbiAgICB2YXIgdG9wTGVmdCA9IFtiYm94WzBdLCBiYm94WzNdXTtcbiAgICB2YXIgdG9wUmlnaHQgPSBbYmJveFsyXSwgYmJveFszXV07XG4gICAgdmFyIGxvd1JpZ2h0ID0gW2Jib3hbMl0sIGJib3hbMV1dO1xuXG4gICAgcmV0dXJuIHBvbHlnb24oW1tcbiAgICAgICAgbG93TGVmdCxcbiAgICAgICAgbG93UmlnaHQsXG4gICAgICAgIHRvcFJpZ2h0LFxuICAgICAgICB0b3BMZWZ0LFxuICAgICAgICBsb3dMZWZ0XG4gICAgXV0pO1xufTtcbiIsImltcG9ydCBtYXBib3hnbCBmcm9tICdtYXBib3gtZ2wnO1xuaW1wb3J0IHR1cmZIZWxwZXJzIGZyb20gJ0B0dXJmL2hlbHBlcnMnO1xuaW1wb3J0IHR1cmZCYm94UG9seWdvbiBmcm9tICdAdHVyZi9iYm94LXBvbHlnb24nO1xuXG5jb25zdCBmZWF0dXJlQ29sbGVjdGlvbiA9IHR1cmZIZWxwZXJzLmZlYXR1cmVDb2xsZWN0aW9uO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Qm91bmRzKGJib3gpIHtcbiAgdmFyIGxlZnQgPSArYmJveC5sZWZ0LFxuICAgIHJpZ2h0ID0gK2Jib3gucmlnaHQsXG4gICAgdG9wID0gK2Jib3gudG9wLFxuICAgIGJvdHRvbSA9ICtiYm94LmJvdHRvbTtcblxuICByZXR1cm4gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhcbiAgICBuZXcgbWFwYm94Z2wuTG5nTGF0KGxlZnQsIGJvdHRvbSksXG4gICAgbmV3IG1hcGJveGdsLkxuZ0xhdChyaWdodCwgdG9wKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Qm91bmRpbmdCb3goYm91bmRzKSB7XG4gIHZhciBsZWZ0ID0gYm91bmRzLmdldFdlc3QoKSxcbiAgICByaWdodCA9IGJvdW5kcy5nZXRFYXN0KCksXG4gICAgdG9wID0gYm91bmRzLmdldE5vcnRoKCksXG4gICAgYm90dG9tID0gYm91bmRzLmdldFNvdXRoKCk7XG5cbiAgdmFyIHBhZFggPSAwO1xuICB2YXIgcGFkWSA9IDA7XG4gIGlmICghKGxlZnQgPT09IC0xODAgJiYgcmlnaHQgPT09IDE4MCAmJiB0b3AgPT09IDkwICYmIGJvdHRvbSA9PT0gLTkwKSkge1xuICAgIHBhZFggPSBNYXRoLm1heCgocmlnaHQgLSBsZWZ0KSAvIDUsIDAuMDAwMSk7XG4gICAgcGFkWSA9IE1hdGgubWF4KCh0b3AgLSBib3R0b20pIC8gNSwgMC4wMDAxKTtcbiAgfVxuXG4gIHZhciBiYm94UG9seWdvbiA9IHR1cmZCYm94UG9seWdvbihbXG4gICAgbGVmdCAtIHBhZFgsXG4gICAgYm90dG9tIC0gcGFkWSxcbiAgICByaWdodCArIHBhZFgsXG4gICAgdG9wICsgcGFkWVxuICBdKTtcblxuICByZXR1cm4gZmVhdHVyZUNvbGxlY3Rpb24oW2Jib3hQb2x5Z29uXSk7XG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgZ2V0Qm91bmRzIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IGNtYXAgfSBmcm9tICcuL3JlbmRlcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGZWF0dXJlcyhmZWF0dXJlcykge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZlYXR1cmVzKTtcbiAgcmV0dXJuIGtleXMubWFwKGl0ZW0gPT4gZmVhdHVyZXNbaXRlbV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0ZlYXR1cmVzKGZlYXR1cmVzKSB7XG4gIGNvbnN0IGZpbmFsUmVwb3J0ID0gbmV3IE1hcCgpO1xuICBjb25zdCBhbmFseXplZEZlYXR1cmVzID0gZmVhdHVyZXMubWFwKGZlYXR1cmUgPT5cbiAgICBhbmFseXplRmVhdHVyZShmZWF0dXJlWzBdLCBmZWF0dXJlWzFdKVxuICApO1xuICBjb25zdCBrZXlzID0gWydhZGRlZFRhZ3MnLCAnY2hhbmdlZFZhbHVlcycsICdkZWxldGVkVGFncyddO1xuICBhbmFseXplZEZlYXR1cmVzLm1hcChpdGVtID0+XG4gICAga2V5cy5tYXAoa2V5ID0+XG4gICAgICBpdGVtLmdldChrZXkpLmZvckVhY2godGFnID0+IHtcbiAgICAgICAgaWYgKGZpbmFsUmVwb3J0LmdldCh0YWcpKSB7XG4gICAgICAgICAgZmluYWxSZXBvcnQuc2V0KHRhZywgZmluYWxSZXBvcnQuZ2V0KHRhZykuY29uY2F0KFtpdGVtLmdldCgnaWQnKV0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFJlcG9ydC5zZXQodGFnLCBbaXRlbS5nZXQoJ2lkJyldKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApXG4gICk7XG4gIHJldHVybiBmaW5hbFJlcG9ydDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFuYWx5emVGZWF0dXJlKG5ld1ZlcnNpb24sIG9sZFZlcnNpb24pIHtcbiAgdmFyIG9sZFZlcnNpb25LZXlzID0gT2JqZWN0LmtleXMob2xkVmVyc2lvbi5wcm9wZXJ0aWVzLnRhZ3MpO1xuICB2YXIgbmV3VmVyc2lvbktleXMgPSBPYmplY3Qua2V5cyhuZXdWZXJzaW9uLnByb3BlcnRpZXMudGFncyk7XG4gIHZhciBhZGRlZFRhZ3MgPSBuZXdWZXJzaW9uS2V5cy5maWx0ZXIoXG4gICAgdGFnID0+IG9sZFZlcnNpb25LZXlzLmluZGV4T2YodGFnKSA9PT0gLTFcbiAgKTtcbiAgdmFyIGRlbGV0ZWRUYWdzID0gb2xkVmVyc2lvbktleXMuZmlsdGVyKFxuICAgIHRhZyA9PiBuZXdWZXJzaW9uS2V5cy5pbmRleE9mKHRhZykgPT09IC0xXG4gICk7XG4gIHZhciBjaGFuZ2VkVmFsdWVzID0gbmV3VmVyc2lvbktleXNcbiAgICAuZmlsdGVyKFxuICAgICAgdGFnID0+IGFkZGVkVGFncy5pbmRleE9mKHRhZykgPT09IC0xICYmIGRlbGV0ZWRUYWdzLmluZGV4T2YodGFnKSA9PT0gLTFcbiAgICApXG4gICAgLmZpbHRlcihcbiAgICAgIHRhZyA9PiBuZXdWZXJzaW9uLnByb3BlcnRpZXMudGFnc1t0YWddICE9PSBvbGRWZXJzaW9uLnByb3BlcnRpZXMudGFnc1t0YWddXG4gICAgKTtcbiAgdmFyIHJlc3VsdCA9IG5ldyBNYXAoKTtcbiAgcmVzdWx0XG4gICAgLnNldCgnaWQnLCBuZXdWZXJzaW9uLnByb3BlcnRpZXMuaWQpXG4gICAgLnNldCgnYWRkZWRUYWdzJywgYWRkZWRUYWdzLm1hcCh0YWcgPT4gYEFkZGVkIHRhZyAke3RhZ31gKSlcbiAgICAuc2V0KCdkZWxldGVkVGFncycsIGRlbGV0ZWRUYWdzLm1hcCh0YWcgPT4gYERlbGV0ZWQgdGFnICR7dGFnfWApKVxuICAgIC5zZXQoXG4gICAgICAnY2hhbmdlZFZhbHVlcycsXG4gICAgICBjaGFuZ2VkVmFsdWVzLm1hcCh0YWcgPT4gYENoYW5nZWQgdmFsdWUgb2YgdGFnICR7dGFnfWApXG4gICAgKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEZlYXR1cmUoaWQ6IG51bWJlcikge1xuICBpZiAoIWlkIHx8ICFjbWFwKSByZXR1cm47XG4gIGNtYXAuZW1pdCgnc2VsZWN0RmVhdHVyZScsICdub2RlfHdheScsIGlkKTtcbn1cblxuZnVuY3Rpb24gRmVhdHVyZUxpc3RJdGVtKHByb3BzKSB7XG4gIHJldHVybiAoXG4gICAgPGxpPlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiY21hcC1wb2ludGVyIFwiIG9uQ2xpY2s9eygpID0+IHNlbGVjdEZlYXR1cmUocHJvcHMuaWQpfT5cbiAgICAgICAge3Byb3BzLmlkfVxuICAgICAgPC9zcGFuPlxuICAgIDwvbGk+XG4gICk7XG59XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VJdGVtIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBvcGVuZWQ6IGZhbHNlXG4gICAgfTtcbiAgICB0aGlzLnRhZyA9IHByb3BzLmNoYW5nZVswXTtcbiAgICB0aGlzLnZhbHVlID0gcHJvcHMuY2hhbmdlWzFdO1xuICAgIHRoaXMuaGFuZGxlQ2hhbmdlID0gdGhpcy5oYW5kbGVDaGFuZ2UuYmluZCh0aGlzKTtcbiAgfVxuICBoYW5kbGVDaGFuZ2UoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW5lZDogIXRoaXMuc3RhdGUub3BlbmVkIH0pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdj5cbiAgICAgICAgPGg3XG4gICAgICAgICAgY2xhc3NOYW1lPVwiY21hcC1zdWItaGVhZGluZyBjbWFwLXBvaW50ZXJcIlxuICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlQ2hhbmdlfVxuICAgICAgICA+XG4gICAgICAgICAge3RoaXMuc3RhdGUub3BlbmVkID8gJ+KWvCcgOiAn4pa2J31cbiAgICAgICAgICB7dGhpcy50YWd9XG4gICAgICAgIDwvaDc+XG4gICAgICAgIDx1bFxuICAgICAgICAgIGNsYXNzTmFtZT1cImNtYXAtdmxpc3RcIlxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBkaXNwbGF5OiB0aGlzLnN0YXRlLm9wZW5lZCA/ICdibG9jaycgOiAnbm9uZSdcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAge3RoaXMudmFsdWUubWFwKChpZCwgaykgPT4gPEZlYXR1cmVMaXN0SXRlbSBpZD17aWR9IGtleT17a30gLz4pfVxuICAgICAgICA8L3VsPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2lkZWJhciBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgYWN0aW9uczogdHJ1ZSxcbiAgICAgIHR5cGU6IGZhbHNlLFxuICAgICAgY2hhbmdlczogZmFsc2UsXG4gICAgICBtYXBTdHlsZTogZmFsc2UsXG4gICAgICB1c2VyOiBmYWxzZVxuICAgIH07XG4gICAgdGhpcy5jaGFuZ2VSZXBvcnQgPSBbXTtcbiAgICB0aGlzLmNoYW5nZWRGZWF0dXJlcyA9IHByb2Nlc3NGZWF0dXJlcyhcbiAgICAgIGdldEZlYXR1cmVzKHRoaXMucHJvcHMucmVzdWx0LmZlYXR1cmVNYXApLmZpbHRlcihcbiAgICAgICAgaXRlbSA9PiBpdGVtLmxlbmd0aCA9PT0gMiAmJiBpdGVtWzBdLnByb3BlcnRpZXMuYWN0aW9uID09PSAnbW9kaWZ5J1xuICAgICAgKVxuICAgICkuZm9yRWFjaCgoZmVhdHVyZUlEcywgdGFnKSA9PiB0aGlzLmNoYW5nZVJlcG9ydC5wdXNoKFt0YWcsIGZlYXR1cmVJRHNdKSk7XG5cbiAgICB0aGlzLnRvZ2dsZVVzZXIgPSB0aGlzLnRvZ2dsZVVzZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLnRvZ2dsZUFjdGlvbnMgPSB0aGlzLnRvZ2dsZUFjdGlvbnMuYmluZCh0aGlzKTtcbiAgICB0aGlzLnRvZ2dsZVR5cGUgPSB0aGlzLnRvZ2dsZVR5cGUuYmluZCh0aGlzKTtcbiAgICB0aGlzLnRvZ2dsZUNoYW5nZXMgPSB0aGlzLnRvZ2dsZUNoYW5nZXMuYmluZCh0aGlzKTtcbiAgICB0aGlzLnRvZ2dsZU1hcFN0eWxlID0gdGhpcy50b2dnbGVNYXBTdHlsZS5iaW5kKHRoaXMpO1xuICB9XG4gIHRvZ2dsZVVzZXIoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICB1c2VyOiAhdGhpcy5zdGF0ZS51c2VyXG4gICAgfSk7XG4gIH1cbiAgdG9nZ2xlQWN0aW9ucygpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGFjdGlvbnM6ICF0aGlzLnN0YXRlLmFjdGlvbnNcbiAgICB9KTtcbiAgfVxuICB0b2dnbGVUeXBlKCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgdHlwZTogIXRoaXMuc3RhdGUudHlwZVxuICAgIH0pO1xuICB9XG4gIHRvZ2dsZUNoYW5nZXMoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBjaGFuZ2VzOiAhdGhpcy5zdGF0ZS5jaGFuZ2VzXG4gICAgfSk7XG4gIH1cbiAgdG9nZ2xlTWFwU3R5bGUoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBtYXBTdHlsZTogIXRoaXMuc3RhdGUubWFwU3R5bGVcbiAgICB9KTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wcm9wcy5yZXN1bHQ7XG4gICAgY29uc3QgY2hhbmdlc2V0SWQgPSB0aGlzLnByb3BzLmNoYW5nZXNldElkO1xuICAgIGNvbnN0IGZpbHRlckxheWVycyA9IHRoaXMucHJvcHMuZmlsdGVyTGF5ZXJzO1xuICAgIHZhciBkYXRlID0gbmV3IERhdGUoXG4gICAgICByZXN1bHQuY2hhbmdlc2V0LnRvID8gcmVzdWx0LmNoYW5nZXNldC50byA6IHJlc3VsdC5jaGFuZ2VzZXQuZnJvbVxuICAgICk7XG5cbiAgICB2YXIgYmJveCA9IHJlc3VsdC5jaGFuZ2VzZXQuYmJveDtcbiAgICB2YXIgYm91bmRzID0gZ2V0Qm91bmRzKGJib3gpO1xuICAgIHZhciBjZW50ZXIgPSBib3VuZHMuZ2V0Q2VudGVyKCk7XG4gICAgdmFyIHVzZXJOYW1lID0gcmVzdWx0LmNoYW5nZXNldC51c2VyO1xuICAgIHZhciB1c2VySWQgPSByZXN1bHQuY2hhbmdlc2V0LnVpZDtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjbWFwLXNpZGViYXJcIj5cbiAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwiY21hcC1jaGFuZ2VzZXQtc2VjdGlvbiBjbWFwLWZpbGwtbGlnaHQgY21hcC1wdDNcIj5cbiAgICAgICAgICA8aDYgY2xhc3NOYW1lPVwiY21hcC1oZWFkaW5nXCI+XG4gICAgICAgICAgICBDaGFuZ2VzZXQ6XG4gICAgICAgICAgICA8ZW0gY2xhc3NOYW1lPVwiY21hcC1jaGFuZ2VzZXQtaWRcIj57Y2hhbmdlc2V0SWR9PC9lbT5cbiAgICAgICAgICAgIDxzbWFsbCBjbGFzc05hbWU9XCJjbWFwLXRpbWVcIiB0aXRsZT17ZGF0ZX0+XG4gICAgICAgICAgICAgICh7bW9tZW50KGRhdGUpLmZyb21Ob3coKX0pXG4gICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgIDwvaDY+XG4gICAgICAgICAgPHVsIGNsYXNzTmFtZT1cImNtYXAtaGxpc3RcIj5cbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImNtYXAtaGxpc3QtaXRlbSBjbWFwLW5vc2VsZWN0IGNtYXAtcG9pbnRlciBjbWFwLWMtbGluay1vc21cIlxuICAgICAgICAgICAgICAgIGhyZWY9eydodHRwczovL29wZW5zdHJlZXRtYXAub3JnL2NoYW5nZXNldC8nICsgY2hhbmdlc2V0SWR9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBPU01cbiAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImNtYXAtaGxpc3QtaXRlbSBjbWFwLW5vc2VsZWN0IGNtYXAtcG9pbnRlciBjbWFwLWMtbGluay1vc21jaGFcIlxuICAgICAgICAgICAgICAgIGhyZWY9eydodHRwczovL29zbWNoYS5tYXBib3guY29tLycgKyBjaGFuZ2VzZXRJZCArICcvJ31cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIE9TTUNoYVxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiY21hcC1obGlzdC1pdGVtIGNtYXAtbm9zZWxlY3QgY21hcC1wb2ludGVyIGNtYXAtYy1saW5rLWFjaGF2aVwiXG4gICAgICAgICAgICAgICAgaHJlZj17XG4gICAgICAgICAgICAgICAgICAnaHR0cHM6Ly9vdmVycGFzcy1hcGkuZGUvYWNoYXZpLz9jaGFuZ2VzZXQ9JyArIGNoYW5nZXNldElkXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQWNoYXZpXG4gICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJjbWFwLWhsaXN0LWl0ZW0gY21hcC1ub3NlbGVjdCBjbWFwLXBvaW50ZXIgY21hcC1jLWxpbmstb3NtaHZcIlxuICAgICAgICAgICAgICAgIGhyZWY9e1xuICAgICAgICAgICAgICAgICAgJ2h0dHA6Ly9vc21odi5vcGVuc3RyZWV0bWFwLmRlL2NoYW5nZXNldC5qc3A/aWQ9JyArXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZXNldElkXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgT1NNIEhWXG4gICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJjbWFwLWhsaXN0LWl0ZW0gY21hcC1ub3NlbGVjdCBjbWFwLXBvaW50ZXIgY21hcC1jLWxpbmstam9zbVwiXG4gICAgICAgICAgICAgICAgaHJlZj17XG4gICAgICAgICAgICAgICAgICAnaHR0cDovLzEyNy4wLjAuMTo4MTExL2ltcG9ydD91cmw9aHR0cDovL3d3dy5vcGVuc3RyZWV0bWFwLm9yZy9hcGkvMC42L2NoYW5nZXNldC8nICtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlc2V0SWQgK1xuICAgICAgICAgICAgICAgICAgICAnL2Rvd25sb2FkJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEpPU01cbiAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImNtYXAtaGxpc3QtaXRlbSBjbWFwLW5vc2VsZWN0IGNtYXAtcG9pbnRlciBjbWFwLWMtbGluay1pZFwiXG4gICAgICAgICAgICAgICAgaHJlZj17XG4gICAgICAgICAgICAgICAgICAnaHR0cDovL3ByZXZpZXcuaWRlZGl0b3IuY29tL3JlbGVhc2UjbWFwPTE1LycgK1xuICAgICAgICAgICAgICAgICAgICBjZW50ZXIubGF0ICtcbiAgICAgICAgICAgICAgICAgICAgJy8nICtcbiAgICAgICAgICAgICAgICAgICAgY2VudGVyLmxuZ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIGlEXG4gICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJjbWFwLXVzZXItc2VjdGlvbiBjbWFwLWZpbGwtbGlnaHQgY21hcC1wYjNcIj5cbiAgICAgICAgICA8aDYgY2xhc3NOYW1lPVwiY21hcC1oZWFkaW5nXCIgb25DbGljaz17dGhpcy50b2dnbGVVc2VyfT5cbiAgICAgICAgICAgIHt0aGlzLnN0YXRlLnVzZXIgPyAn4pa8JyA6ICfilrYnfVxuICAgICAgICAgICAgVXNlcjogPGVtIGNsYXNzTmFtZT1cImNtYXAtdXNlci1pZFwiPnt1c2VyTmFtZX08L2VtPlxuICAgICAgICAgIDwvaDY+XG5cbiAgICAgICAgICA8dWxcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImNtYXAtaGxpc3RcIlxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgZGlzcGxheTogdGhpcy5zdGF0ZS51c2VyID8gJ2Jsb2NrJyA6ICdub25lJ1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJjbWFwLWhsaXN0LWl0ZW0gY21hcC1ub3NlbGVjdCBjbWFwLXBvaW50ZXIgY21hcC11LWxpbmstb3NtXCJcbiAgICAgICAgICAgICAgICBocmVmPXsnaHR0cHM6Ly9vcGVuc3RyZWV0bWFwLm9yZy91c2VyLycgKyB1c2VyTmFtZX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIE9TTVxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiY21hcC1obGlzdC1pdGVtIGNtYXAtbm9zZWxlY3QgY21hcC1wb2ludGVyIGNtYXAtdS1saW5rLWhkeWNcIlxuICAgICAgICAgICAgICAgIGhyZWY9eydodHRwOi8vaGR5Yy5uZWlzLW9uZS5vcmcvPycgKyB1c2VyTmFtZX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEhEWUNcbiAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImNtYXAtaGxpc3QtaXRlbSBjbWFwLW5vc2VsZWN0IGNtYXAtcG9pbnRlciBjbWFwLXUtbGluay1kaXNjXCJcbiAgICAgICAgICAgICAgICBocmVmPXtcbiAgICAgICAgICAgICAgICAgICdodHRwOi8vcmVzdWx0bWFwcy5uZWlzLW9uZS5vcmcvb3NtLWRpc2N1c3Npb24tY29tbWVudHM/dWlkPScgK1xuICAgICAgICAgICAgICAgICAgICB1c2VySWRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBEaXNjdXNzaW9uc1xuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiY21hcC1obGlzdC1pdGVtIGNtYXAtbm9zZWxlY3QgY21hcC1wb2ludGVyIGNtYXAtdS1saW5rLWNvbW1cIlxuICAgICAgICAgICAgICAgIGhyZWY9e1xuICAgICAgICAgICAgICAgICAgJ2h0dHA6Ly9yZXN1bHRtYXBzLm5laXMtb25lLm9yZy9vc20tZGlzY3Vzc2lvbi1jb21tZW50cz91aWQ9MTE1ODk0JyArXG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZCArXG4gICAgICAgICAgICAgICAgICAgICcmY29tbWVudGVkJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIENvbW1lbnRzXG4gICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJjbWFwLWZpbHRlci1hY3Rpb24tc2VjdGlvbiBjbWFwLXB0M1wiPlxuICAgICAgICAgIDxoNiBjbGFzc05hbWU9XCJjbWFwLWhlYWRpbmcgcG9pbnRlclwiIG9uQ2xpY2s9e3RoaXMudG9nZ2xlQWN0aW9uc30+XG4gICAgICAgICAgICB7dGhpcy5zdGF0ZS5hY3Rpb25zID8gJ+KWvCcgOiAn4pa2J31GaWx0ZXIgYnkgYWN0aW9uc1xuICAgICAgICAgIDwvaDY+XG5cbiAgICAgICAgICA8dWxcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIGRpc3BsYXk6IHRoaXMuc3RhdGUuYWN0aW9ucyA/ICdibG9jaycgOiAnbm9uZSdcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJjbWFwLWhsaXN0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJjbWFwLWhsaXN0LWl0ZW0gY21hcC1ub3NlbGVjdCBjbWFwLXBvaW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICB2YWx1ZT1cImFkZGVkXCJcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRDaGVja2VkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBpZD1cImNtYXAtbGF5ZXItc2VsZWN0b3ItYWRkZWRcIlxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2ZpbHRlckxheWVyc31cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNtYXAtbGFiZWwtdGV4dFwiPkFkZGVkPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNtYXAtY29sb3ItYm94IGNtYXAtY29sb3ItYWRkZWRcIiAvPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImNtYXAtaGxpc3QtaXRlbSBjbWFwLW5vc2VsZWN0IGNtYXAtcG9pbnRlclwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgIHZhbHVlPVwibW9kaWZpZWRcIlxuICAgICAgICAgICAgICAgICAgZGVmYXVsdENoZWNrZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIGlkPVwiY21hcC1sYXllci1zZWxlY3Rvci1tb2RpZmllZFwiXG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17ZmlsdGVyTGF5ZXJzfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiY21hcC1sYWJlbC10ZXh0XCI+TW9kaWZpZWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiY21hcC1jb2xvci1ib3ggY21hcC1jb2xvci1tb2RpZmllZC1vbGRcIiAvPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNtYXAtdW5pY29kZVwiPuKGkjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJjbWFwLWNvbG9yLWJveCBjbWFwLWNvbG9yLW1vZGlmaWVkLW5ld1wiIC8+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiY21hcC1obGlzdC1pdGVtIGNtYXAtbm9zZWxlY3QgY21hcC1wb2ludGVyXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgdmFsdWU9XCJkZWxldGVkXCJcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRDaGVja2VkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBpZD1cImNtYXAtbGF5ZXItc2VsZWN0b3ItZGVsZXRlZFwiXG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17ZmlsdGVyTGF5ZXJzfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiY21hcC1sYWJlbC10ZXh0XCI+RGVsZXRlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJjbWFwLWNvbG9yLWJveCBjbWFwLWNvbG9yLWRlbGV0ZWRcIiAvPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cImNtYXAtZmlsdGVyLXR5cGUtc2VjdGlvblwiPlxuICAgICAgICAgIDxoNiBjbGFzc05hbWU9XCJjbWFwLWhlYWRpbmcgcG9pbnRlclwiIG9uQ2xpY2s9e3RoaXMudG9nZ2xlVHlwZX0+XG4gICAgICAgICAgICB7dGhpcy5zdGF0ZS50eXBlID8gJ+KWvCcgOiAn4pa2J31GaWx0ZXIgYnkgdHlwZVxuICAgICAgICAgIDwvaDY+XG4gICAgICAgICAgPHVsXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJjbWFwLWhsaXN0XCJcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIGRpc3BsYXk6IHRoaXMuc3RhdGUudHlwZSA/ICdibG9jaycgOiAnbm9uZSdcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiY21hcC1obGlzdC1pdGVtIGNtYXAtbm9zZWxlY3QgY21hcC1wb2ludGVyXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgdmFsdWU9XCJub2Rlc1wiXG4gICAgICAgICAgICAgICAgICBkZWZhdWx0Q2hlY2tlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgaWQ9XCJjbWFwLXR5cGUtc2VsZWN0b3Itbm9kZXNcIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17ZmlsdGVyTGF5ZXJzfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiY21hcC1sYWJlbC10ZXh0XCI+Tm9kZXM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiY21hcC1obGlzdC1pdGVtIGNtYXAtbm9zZWxlY3QgY21hcC1wb2ludGVyXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgdmFsdWU9XCJ3YXlzXCJcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRDaGVja2VkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBpZD1cImNtYXAtdHlwZS1zZWxlY3Rvci13YXlzXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtmaWx0ZXJMYXllcnN9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJjbWFwLWxhYmVsLXRleHRcIj5XYXlzPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImNtYXAtaGxpc3QtaXRlbSBjbWFwLW5vc2VsZWN0IGNtYXAtcG9pbnRlclwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgIHZhbHVlPVwicmVsYXRpb25zXCJcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRDaGVja2VkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBpZD1cImNtYXAtdHlwZS1zZWxlY3Rvci1yZWxhdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2ZpbHRlckxheWVyc31cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNtYXAtbGFiZWwtdGV4dFwiPlJlbGF0aW9uczwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJjbWFwLWZpbHRlci1jaGFuZ2VzLXNlY3Rpb24gY21hcC1wYjNcIj5cbiAgICAgICAgICA8aDYgY2xhc3NOYW1lPVwiY21hcC1oZWFkaW5nIHBvaW50ZXJcIiBvbkNsaWNrPXt0aGlzLnRvZ2dsZUNoYW5nZXN9PlxuICAgICAgICAgICAge3RoaXMuc3RhdGUuY2hhbmdlcyA/ICfilrwnIDogJ+KWtid9VGFncyBhZGRlZCAvIHVwZGF0ZWQgLyBkZWxldGVkXG4gICAgICAgICAgPC9oNj5cbiAgICAgICAgICA8dWxcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImNtYXAtc3ViLWhsaXN0XCJcbiAgICAgICAgICAgIHN0eWxlPXt7IGRpc3BsYXk6IHRoaXMuc3RhdGUuY2hhbmdlcyA/ICdibG9jaycgOiAnbm9uZScgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7dGhpcy5jaGFuZ2VSZXBvcnRcbiAgICAgICAgICAgICAgLnNvcnQoKVxuICAgICAgICAgICAgICAubWFwKChjaGFuZ2UsIGspID0+IDxDaGFuZ2VJdGVtIGtleT17a30gY2hhbmdlPXtjaGFuZ2V9IC8+KX1cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cImNtYXAtbWFwLXN0eWxlLXNlY3Rpb24gY21hcC1wYjNcIj5cbiAgICAgICAgICA8aDYgY2xhc3NOYW1lPVwiY21hcC1oZWFkaW5nIHBvaW50ZXJcIiBvbkNsaWNrPXt0aGlzLnRvZ2dsZU1hcFN0eWxlfT5cbiAgICAgICAgICAgIHt0aGlzLnN0YXRlLm1hcFN0eWxlID8gJ+KWvCcgOiAn4pa2J31NYXAgc3R5bGVcbiAgICAgICAgICA8L2g2PlxuXG4gICAgICAgICAgPHVsXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJjbWFwLWhsaXN0XCJcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIGRpc3BsYXk6IHRoaXMuc3RhdGUubWFwU3R5bGUgPyAnYmxvY2snIDogJ25vbmUnXG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImNtYXAtaGxpc3QtaXRlbSBjbWFwLW5vc2VsZWN0IGNtYXAtcG9pbnRlclwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgIHZhbHVlPVwic2F0ZWxsaXRlXCJcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRDaGVja2VkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBuYW1lPVwiYmFzZWxheWVyXCJcbiAgICAgICAgICAgICAgICAgIGlkPVwiY21hcC1iYXNlbGF5ZXItc2F0ZWxsaXRlXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLnByb3BzLnRvZ2dsZUxheWVyfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiY21hcC1sYWJlbC10ZXh0XCI+U2F0ZWxsaXRlPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImNtYXAtaGxpc3QtaXRlbSBjbWFwLW5vc2VsZWN0IGNtYXAtcG9pbnRlclwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgIHZhbHVlPVwic3RyZWV0c1wiXG4gICAgICAgICAgICAgICAgICBuYW1lPVwiYmFzZWxheWVyXCJcbiAgICAgICAgICAgICAgICAgIGlkPVwiY21hcC1iYXNlbGF5ZXItc3RyZWV0c1wiXG4gICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5wcm9wcy50b2dnbGVMYXllcn1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNtYXAtbGFiZWwtdGV4dFwiPlN0cmVldHM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiY21hcC1obGlzdC1pdGVtIGNtYXAtbm9zZWxlY3QgY21hcC1wb2ludGVyXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgICAgdmFsdWU9XCJkYXJrXCJcbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJiYXNlbGF5ZXJcIlxuICAgICAgICAgICAgICAgICAgaWQ9XCJjbWFwLWJhc2VsYXllci1kYXJrXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLnByb3BzLnRvZ2dsZUxheWVyfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiY21hcC1sYWJlbC10ZXh0XCI+RGFyazwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHByb3BzRGlmZihwcm9wc0FycmF5KSB7XG4gIC8vIEVkZ2UgY2FzZTogZmVhdHVyZXMgbWF5IGJlIGR1cGxpY2F0ZWQuIFNlZSBpc3N1ZSAjMTIyLlxuICAvLyBJZiB0aGUgY2hhbmdlVHlwZSBpcyBgYWRkZWRgIGlnbm9yZSB0aGUgc2Vjb25kIGZlYXR1cmUuXG4gIGlmIChwcm9wc0FycmF5Lmxlbmd0aCA9PT0gMSB8fCBwcm9wc0FycmF5WzBdLmNoYW5nZVR5cGUgPT09ICdhZGRlZCcpIHtcbiAgICB2YXIgY2hhbmdlVHlwZSA9IHByb3BzQXJyYXlbMF0uY2hhbmdlVHlwZTtcbiAgICBpZiAoY2hhbmdlVHlwZSA9PT0gJ2FkZGVkJykge1xuICAgICAgcmV0dXJuIGdldEFkZGVkKHByb3BzQXJyYXlbMF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ29ubHkgMSBlbGVtZW50IGJ1dCBuZWl0aGVyIGFkZGVkIG5vciBkZWxldGVkJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBvbGRQcm9wcyA9IGdldE9sZChwcm9wc0FycmF5KTtcbiAgICB2YXIgbmV3UHJvcHMgPSBnZXROZXcocHJvcHNBcnJheSk7XG4gICAgcmV0dXJuIGdldERpZmYob2xkUHJvcHMsIG5ld1Byb3BzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREaWZmKG9sZFByb3BzLCBuZXdQcm9wcykge1xuICB2YXIgcmV0ID0ge307XG4gIGZvciAodmFyIHByb3AgaW4gbmV3UHJvcHMpIHtcbiAgICByZXRbcHJvcF0gPSB7fTtcbiAgICBpZiAoIW9sZFByb3BzLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICByZXRbcHJvcF1bJ2FkZGVkJ10gPSBuZXdQcm9wc1twcm9wXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG9sZFZhbHVlID0gb2xkUHJvcHNbcHJvcF07XG4gICAgICB2YXIgbmV3VmFsdWUgPSBuZXdQcm9wc1twcm9wXTtcbiAgICAgIGlmIChvbGRWYWx1ZSA9PT0gbmV3VmFsdWUpIHtcbiAgICAgICAgcmV0W3Byb3BdWyd1bmNoYW5nZWQnXSA9IG5ld1ZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0W3Byb3BdWydtb2RpZmllZE9sZCddID0gb2xkVmFsdWU7XG4gICAgICAgIHJldFtwcm9wXVsnbW9kaWZpZWROZXcnXSA9IG5ld1ZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmb3IgKHZhciBvbGRQcm9wIGluIG9sZFByb3BzKSB7XG4gICAgaWYgKCFyZXQuaGFzT3duUHJvcGVydHkob2xkUHJvcCkpIHtcbiAgICAgIHJldFtvbGRQcm9wXSA9IHtcbiAgICAgICAgZGVsZXRlZDogb2xkUHJvcHNbb2xkUHJvcF1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGdldEFkZGVkKHByb3BzKSB7XG4gIHZhciByZXQgPSB7fTtcbiAgZm9yICh2YXIgcHJvcCBpbiBwcm9wcykge1xuICAgIHJldFtwcm9wXSA9IHtcbiAgICAgIGFkZGVkOiBwcm9wc1twcm9wXVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZ2V0T2xkKHByb3BzQXJyYXkpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wc0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNoYW5nZVR5cGUgPSBwcm9wc0FycmF5W2ldLmNoYW5nZVR5cGU7XG4gICAgaWYgKGNoYW5nZVR5cGUgPT09ICdtb2RpZmllZE9sZCcgfHwgY2hhbmdlVHlwZSA9PT0gJ2RlbGV0ZWRPbGQnKSB7XG4gICAgICByZXR1cm4gcHJvcHNBcnJheVtpXTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TmV3KHByb3BzQXJyYXkpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wc0FycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNoYW5nZVR5cGUgPSBwcm9wc0FycmF5W2ldLmNoYW5nZVR5cGU7XG4gICAgaWYgKGNoYW5nZVR5cGUgPT09ICdtb2RpZmllZE5ldycgfHwgY2hhbmdlVHlwZSA9PT0gJ2RlbGV0ZWROZXcnKSB7XG4gICAgICByZXR1cm4gcHJvcHNBcnJheVtpXTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBtYXBib3hnbCBmcm9tICdtYXBib3gtZ2wnO1xuXG5pbXBvcnQgeyBnZXRCb3VuZGluZ0JveCwgZ2V0Qm91bmRzIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IGNtYXAgfSBmcm9tICcuL3JlbmRlcic7XG5pbXBvcnQgeyBwcm9wc0RpZmYgfSBmcm9tICcuL3Byb3BzRGlmZic7XG5cbmV4cG9ydCBjbGFzcyBNYXAge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLm1hcCA9IG51bGw7XG4gICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgIHRoaXMuZmlsdGVyTGF5ZXJzID0gdGhpcy5maWx0ZXJMYXllcnMuYmluZCh0aGlzKTtcbiAgfVxuICBmaWx0ZXJMYXllcnMoKSB7XG4gICAgdmFyIGxheWVyc0tleSA9IHtcbiAgICAgICdhZGRlZC1saW5lJzogeyBhZGRlZDogdHJ1ZSwgd2F5czogdHJ1ZSB9LFxuICAgICAgJ2FkZGVkLXBvaW50LXRhZ2dlZCc6IHsgYWRkZWQ6IHRydWUsIG5vZGVzOiB0cnVlIH0sXG4gICAgICAnYWRkZWQtcG9pbnQtdW50YWdnZWQnOiB7IGFkZGVkOiB0cnVlLCBub2RlczogdHJ1ZSB9LFxuICAgICAgJ2FkZGVkLXJlbGF0aW9uJzogeyBhZGRlZDogdHJ1ZSwgcmVsYXRpb25zOiB0cnVlIH0sXG4gICAgICAnbW9kaWZpZWQtb2xkLWxpbmUnOiB7IG1vZGlmaWVkOiB0cnVlLCB3YXlzOiB0cnVlIH0sXG4gICAgICAnbW9kaWZpZWQtb2xkLXBvaW50LXRhZ2dlZCc6IHsgbW9kaWZpZWQ6IHRydWUsIG5vZGVzOiB0cnVlIH0sXG4gICAgICAnbW9kaWZpZWQtb2xkLXBvaW50LXVudGFnZ2VkJzogeyBtb2RpZmllZDogdHJ1ZSwgbm9kZXM6IHRydWUgfSxcbiAgICAgICdtb2RpZmllZC1vbGQtcG9pbnQtb24td2F5JzogeyBtb2RpZmllZDogdHJ1ZSwgbm9kZXM6IHRydWUgfSxcbiAgICAgICdtb2RpZmllZC1uZXctbGluZSc6IHsgbW9kaWZpZWQ6IHRydWUsIHdheXM6IHRydWUgfSxcbiAgICAgICdtb2RpZmllZC1vbGQtcmVsYXRpb24nOiB7IG1vZGlmaWVkOiB0cnVlLCByZWxhdGlvbnM6IHRydWUgfSxcbiAgICAgICdtb2RpZmllZC1uZXctcG9pbnQtdGFnZ2VkJzogeyBtb2RpZmllZDogdHJ1ZSwgbm9kZXM6IHRydWUgfSxcbiAgICAgICdtb2RpZmllZC1uZXctcG9pbnQtdW50YWdnZWQnOiB7IG1vZGlmaWVkOiB0cnVlLCBub2RlczogdHJ1ZSB9LFxuICAgICAgJ21vZGlmaWVkLW5ldy1wb2ludC1vbi13YXknOiB7IG1vZGlmaWVkOiB0cnVlLCBub2RlczogdHJ1ZSB9LFxuICAgICAgJ21vZGlmaWVkLW5ldy1yZWxhdGlvbic6IHsgbW9kaWZpZWQ6IHRydWUsIHJlbGF0aW9uczogdHJ1ZSB9LFxuICAgICAgJ2RlbGV0ZWQtbGluZSc6IHsgZGVsZXRlZDogdHJ1ZSwgd2F5czogdHJ1ZSB9LFxuICAgICAgJ2RlbGV0ZWQtcG9pbnQtdGFnZ2VkJzogeyBkZWxldGVkOiB0cnVlLCBub2RlczogdHJ1ZSB9LFxuICAgICAgJ2RlbGV0ZWQtcG9pbnQtdW50YWdnZWQnOiB7IGRlbGV0ZWQ6IHRydWUsIG5vZGVzOiB0cnVlIH0sXG4gICAgICAnZGVsZXRlZC1yZWxhdGlvbic6IHsgZGVsZXRlZDogdHJ1ZSwgcmVsYXRpb25zOiB0cnVlIH1cbiAgICB9O1xuXG4gICAgdmFyIHNlbGVjdGVkQWN0aW9ucyA9IFtdO1xuICAgIHZhciBzZWxlY3RlZFR5cGVzID0gW107XG4gICAgZG9jdW1lbnRcbiAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKCcuY21hcC1maWx0ZXItYWN0aW9uLXNlY3Rpb24gaW5wdXQ6Y2hlY2tlZCcpXG4gICAgICAuZm9yRWFjaChmdW5jdGlvbihjaGVja2VkRWxlbWVudCkge1xuICAgICAgICBzZWxlY3RlZEFjdGlvbnMucHVzaChjaGVja2VkRWxlbWVudC52YWx1ZSk7XG4gICAgICB9KTtcblxuICAgIGRvY3VtZW50XG4gICAgICAucXVlcnlTZWxlY3RvckFsbCgnLmNtYXAtZmlsdGVyLXR5cGUtc2VjdGlvbiBpbnB1dDpjaGVja2VkJylcbiAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uKGNoZWNrZWRFbGVtZW50KSB7XG4gICAgICAgIHNlbGVjdGVkVHlwZXMucHVzaChjaGVja2VkRWxlbWVudC52YWx1ZSk7XG4gICAgICB9KTtcblxuICAgIHZhciBsYXllcnMgPSBPYmplY3Qua2V5cyhsYXllcnNLZXkpO1xuXG4gICAgbGF5ZXJzLmZvckVhY2gobGF5ZXIgPT4ge1xuICAgICAgdmFyIGlzU2VsZWN0ZWRBY3Rpb24gPSBzZWxlY3RlZEFjdGlvbnMucmVkdWNlKGZ1bmN0aW9uKGFjY3VtLCBhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGxheWVyc0tleVtsYXllcl1bYWN0aW9uXSB8fCBhY2N1bTtcbiAgICAgIH0sIGZhbHNlKTtcbiAgICAgIHZhciBpc1NlbGVjdGVkVHlwZSA9IHNlbGVjdGVkVHlwZXMucmVkdWNlKGZ1bmN0aW9uKGFjY3VtLCB0eXBlKSB7XG4gICAgICAgIHJldHVybiBsYXllcnNLZXlbbGF5ZXJdW3R5cGVdIHx8IGFjY3VtO1xuICAgICAgfSwgZmFsc2UpO1xuXG4gICAgICBpZiAoaXNTZWxlY3RlZEFjdGlvbiAmJiBpc1NlbGVjdGVkVHlwZSkge1xuICAgICAgICB0aGlzLm1hcC5zZXRMYXlvdXRQcm9wZXJ0eShsYXllciwgJ3Zpc2liaWxpdHknLCAndmlzaWJsZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tYXAuc2V0TGF5b3V0UHJvcGVydHkobGF5ZXIsICd2aXNpYmlsaXR5JywgJ25vbmUnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGVjdGVkQWN0aW9ucy5sZW5ndGggPT09IDAgfHwgc2VsZWN0ZWRUeXBlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5tYXAuc2V0TGF5b3V0UHJvcGVydHkoJ2JnLXBvaW50JywgJ3Zpc2liaWxpdHknLCAnbm9uZScpO1xuICAgICAgICB0aGlzLm1hcC5zZXRMYXlvdXRQcm9wZXJ0eSgnYmctbGluZScsICd2aXNpYmlsaXR5JywgJ25vbmUnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubWFwLnNldExheW91dFByb3BlcnR5KCdiZy1wb2ludCcsICd2aXNpYmlsaXR5JywgJ3Zpc2libGUnKTtcbiAgICAgICAgdGhpcy5tYXAuc2V0TGF5b3V0UHJvcGVydHkoJ2JnLWxpbmUnLCAndmlzaWJpbGl0eScsICd2aXNpYmxlJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgZ2V0TWFwSW5zdGFuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwO1xuICB9XG4gIGdldFJlc3VsdCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXN1bHQ7XG4gIH1cbiAgcmVtb3ZlKCkge1xuICAgIGlmICh0aGlzLm1hcCkge1xuICAgICAgdGhpcy5tYXAucmVtb3ZlKCk7XG4gICAgICB0aGlzLm1hcExvYWRlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5tYXAgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIGFkZE1hcFNvdXJjZShyZXN1bHQsIGJvdW5kcykge1xuICAgIGlmICh0aGlzLm1hcC5nZXRTb3VyY2UoJ2NoYW5nZXNldCcpKSB7XG4gICAgICB0aGlzLm1hcC5nZXRTb3VyY2UoJ2NoYW5nZXNldCcpLnNldERhdGEocmVzdWx0Lmdlb2pzb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1hcC5hZGRTb3VyY2UoJ2NoYW5nZXNldCcsIHtcbiAgICAgICAgdHlwZTogJ2dlb2pzb24nLFxuICAgICAgICBkYXRhOiByZXN1bHQuZ2VvanNvblxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWFwLmdldFNvdXJjZSgnYmJveCcpKSB7XG4gICAgICB0aGlzLm1hcC5nZXRTb3VyY2UoJ2Jib3gnKS5zZXREYXRhKGdldEJvdW5kaW5nQm94KGJvdW5kcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1hcC5hZGRTb3VyY2UoJ2Jib3gnLCB7XG4gICAgICAgIHR5cGU6ICdnZW9qc29uJyxcbiAgICAgICAgZGF0YTogZ2V0Qm91bmRpbmdCb3goYm91bmRzKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGFkZE1hcExheWVycygpIHtcbiAgICB0aGlzLm1hcC5hZGRMYXllcih7XG4gICAgICBpZDogJ2Jib3gtbGluZScsXG4gICAgICB0eXBlOiAnbGluZScsXG4gICAgICBzb3VyY2U6ICdiYm94JyxcbiAgICAgIHBhaW50OiB7XG4gICAgICAgICdsaW5lLWNvbG9yJzogJyNBNThDRjInLFxuICAgICAgICAnbGluZS1vcGFjaXR5JzogMC43NSxcbiAgICAgICAgJ2xpbmUtd2lkdGgnOiAyXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm1hcC5hZGRMYXllcih7XG4gICAgICBpZDogJ2JnLWxpbmUnLFxuICAgICAgc291cmNlOiAnY2hhbmdlc2V0JyxcbiAgICAgIHR5cGU6ICdsaW5lJyxcbiAgICAgIGxheW91dDoge1xuICAgICAgICAnbGluZS1jYXAnOiAncm91bmQnLFxuICAgICAgICAnbGluZS1qb2luJzogJ3JvdW5kJ1xuICAgICAgfSxcbiAgICAgIHBhaW50OiB7XG4gICAgICAgICdsaW5lLWNvbG9yJzogJ2hzbCgwLCAwJSwgMTUlKScsXG4gICAgICAgICdsaW5lLXdpZHRoJzogMTIsXG4gICAgICAgICdsaW5lLWJsdXInOiAwLjIsXG4gICAgICAgICdsaW5lLW9wYWNpdHknOiB7XG4gICAgICAgICAgYmFzZTogMS41LFxuICAgICAgICAgIHN0b3BzOiBbWzEyLCAwLjVdLCBbMTgsIDAuMl1dXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBmaWx0ZXI6IFsnYWxsJywgWyc9PScsICd0eXBlJywgJ3dheSddXVxuICAgIH0pO1xuXG4gICAgdGhpcy5tYXAuYWRkTGF5ZXIoe1xuICAgICAgaWQ6ICdiZy1wb2ludCcsXG4gICAgICBzb3VyY2U6ICdjaGFuZ2VzZXQnLFxuICAgICAgdHlwZTogJ2NpcmNsZScsXG4gICAgICBwYWludDoge1xuICAgICAgICAnY2lyY2xlLWNvbG9yJzogJ2hzbCgwLCAwJSwgMTUlKScsXG4gICAgICAgICdjaXJjbGUtYmx1cic6IDAuMixcbiAgICAgICAgJ2NpcmNsZS1vcGFjaXR5Jzoge1xuICAgICAgICAgIGJhc2U6IDEuNSxcbiAgICAgICAgICBzdG9wczogW1sxMiwgMC41XSwgWzE4LCAwLjJdXVxuICAgICAgICB9LFxuICAgICAgICAnY2lyY2xlLXJhZGl1cyc6IHtcbiAgICAgICAgICBiYXNlOiAxLjUsXG4gICAgICAgICAgc3RvcHM6IFtbMTAsIDEyXSwgWzE2LCAxMF1dXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBmaWx0ZXI6IFsnYWxsJywgWyc9PScsICckdHlwZScsICdQb2ludCddXVxuICAgIH0pO1xuXG4gICAgdGhpcy5tYXAuYWRkTGF5ZXIoe1xuICAgICAgaWQ6ICdoaWdobGlnaHQtbGluZScsXG4gICAgICBzb3VyY2U6ICdjaGFuZ2VzZXQnLFxuICAgICAgdHlwZTogJ2xpbmUnLFxuICAgICAgbGF5b3V0OiB7XG4gICAgICAgICdsaW5lLWpvaW4nOiAncm91bmQnLFxuICAgICAgICAnbGluZS1jYXAnOiAncm91bmQnXG4gICAgICB9LFxuICAgICAgcGFpbnQ6IHtcbiAgICAgICAgJ2xpbmUtY29sb3InOiAnaHNsKDAsIDAlLCA3NSUpJyxcbiAgICAgICAgJ2xpbmUtd2lkdGgnOiB7XG4gICAgICAgICAgYmFzZTogMSxcbiAgICAgICAgICBzdG9wczogW1sxMCwgMTVdLCBbMTYsIDEwXV1cbiAgICAgICAgfSxcbiAgICAgICAgJ2xpbmUtb3BhY2l0eSc6IHtcbiAgICAgICAgICBiYXNlOiAxLjUsXG4gICAgICAgICAgc3RvcHM6IFtbMTIsIDAuNzVdLCBbMTgsIDAuNzVdXVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZmlsdGVyOiBbJ2FsbCcsIFsnPT0nLCAnaWQnLCAnJ10sIFsnPT0nLCAnJHR5cGUnLCAnTGluZVN0cmluZyddXVxuICAgIH0pO1xuXG4gICAgdGhpcy5tYXAuYWRkTGF5ZXIoe1xuICAgICAgaWQ6ICdoaWdobGlnaHQtcG9pbnQnLFxuICAgICAgc291cmNlOiAnY2hhbmdlc2V0JyxcbiAgICAgIHR5cGU6ICdjaXJjbGUnLFxuICAgICAgcGFpbnQ6IHtcbiAgICAgICAgJ2NpcmNsZS1jb2xvcic6ICdoc2woMCwgMCUsIDc1JSknLFxuICAgICAgICAnY2lyY2xlLXJhZGl1cyc6IHtcbiAgICAgICAgICBiYXNlOiAxLFxuICAgICAgICAgIHN0b3BzOiBbWzEwLCAxMF0sIFsxNiwgMTFdXVxuICAgICAgICB9LFxuICAgICAgICAnY2lyY2xlLW9wYWNpdHknOiAwLjhcbiAgICAgIH0sXG4gICAgICBmaWx0ZXI6IFsnYWxsJywgWyc9PScsICdpZCcsICcnXSwgWyc9PScsICckdHlwZScsICdQb2ludCddXVxuICAgIH0pO1xuXG4gICAgLy8gUmVsYXRpb25zXG5cbiAgICB0aGlzLm1hcC5hZGRMYXllcih7XG4gICAgICBpZDogJ2RlbGV0ZWQtcmVsYXRpb24nLFxuICAgICAgc291cmNlOiAnY2hhbmdlc2V0JyxcbiAgICAgIHR5cGU6ICdsaW5lJyxcbiAgICAgIHBhaW50OiB7XG4gICAgICAgICdsaW5lLWNvbG9yJzogJyNDQzJDNDcnLFxuICAgICAgICAnbGluZS13aWR0aCc6IHtcbiAgICAgICAgICBiYXNlOiAxLFxuICAgICAgICAgIHN0b3BzOiBbWzgsIDEuNV0sIFsxMiwgMS41XV1cbiAgICAgICAgfSxcbiAgICAgICAgJ2xpbmUtZGFzaGFycmF5JzogWzAuMSwgMC4xXSxcbiAgICAgICAgJ2xpbmUtb3BhY2l0eSc6IDAuOFxuICAgICAgfSxcbiAgICAgIGZpbHRlcjogW1xuICAgICAgICAnYWxsJyxcbiAgICAgICAgWyc9PScsICd0eXBlJywgJ3JlbGF0aW9uJ10sXG4gICAgICAgIFsnPT0nLCAnY2hhbmdlVHlwZScsICdkZWxldGVkTmV3J11cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIHRoaXMubWFwLmFkZExheWVyKHtcbiAgICAgIGlkOiAnbW9kaWZpZWQtb2xkLXJlbGF0aW9uJyxcbiAgICAgIHNvdXJjZTogJ2NoYW5nZXNldCcsXG4gICAgICB0eXBlOiAnbGluZScsXG4gICAgICBsYXlvdXQ6IHtcbiAgICAgICAgJ2xpbmUtam9pbic6ICdyb3VuZCcsXG4gICAgICAgICdsaW5lLWNhcCc6ICdyb3VuZCdcbiAgICAgIH0sXG4gICAgICBwYWludDoge1xuICAgICAgICAnbGluZS1jb2xvcic6ICcjREI5NTBBJyxcbiAgICAgICAgJ2xpbmUtd2lkdGgnOiB7XG4gICAgICAgICAgYmFzZTogMSxcbiAgICAgICAgICBzdG9wczogW1s4LCAxLjc1XSwgWzEyLCAxLjc1XV1cbiAgICAgICAgfSxcbiAgICAgICAgJ2xpbmUtYmx1cic6IDAuMjUsXG4gICAgICAgICdsaW5lLW9wYWNpdHknOiAwLjhcbiAgICAgIH0sXG4gICAgICBmaWx0ZXI6IFtcbiAgICAgICAgJ2FsbCcsXG4gICAgICAgIFsnPT0nLCAndHlwZScsICdyZWxhdGlvbiddLFxuICAgICAgICBbJz09JywgJ2NoYW5nZVR5cGUnLCAnbW9kaWZpZWRPbGQnXVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgdGhpcy5tYXAuYWRkTGF5ZXIoe1xuICAgICAgaWQ6ICdtb2RpZmllZC1uZXctcmVsYXRpb24nLFxuICAgICAgc291cmNlOiAnY2hhbmdlc2V0JyxcbiAgICAgIHR5cGU6ICdsaW5lJyxcbiAgICAgIGxheW91dDoge1xuICAgICAgICAnbGluZS1qb2luJzogJ3JvdW5kJyxcbiAgICAgICAgJ2xpbmUtY2FwJzogJ3JvdW5kJ1xuICAgICAgfSxcbiAgICAgIHBhaW50OiB7XG4gICAgICAgICdsaW5lLWNvbG9yJzogJyNFOEU4NDUnLFxuICAgICAgICAnbGluZS13aWR0aCc6IHtcbiAgICAgICAgICBiYXNlOiAxLFxuICAgICAgICAgIHN0b3BzOiBbWzgsIDEuMjVdLCBbMTIsIDEuMjVdXVxuICAgICAgICB9LFxuICAgICAgICAnbGluZS1vcGFjaXR5JzogMC44XG4gICAgICB9LFxuICAgICAgZmlsdGVyOiBbXG4gICAgICAgICdhbGwnLFxuICAgICAgICBbJz09JywgJ3R5cGUnLCAncmVsYXRpb24nXSxcbiAgICAgICAgWyc9PScsICdjaGFuZ2VUeXBlJywgJ21vZGlmaWVkTmV3J11cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIHRoaXMubWFwLmFkZExheWVyKHtcbiAgICAgIGlkOiAnYWRkZWQtcmVsYXRpb24nLFxuICAgICAgc291cmNlOiAnY2hhbmdlc2V0JyxcbiAgICAgIHR5cGU6ICdsaW5lJyxcbiAgICAgIGludGVyYWN0aXZlOiB0cnVlLFxuICAgICAgbGF5b3V0OiB7XG4gICAgICAgICdsaW5lLWpvaW4nOiAncm91bmQnLFxuICAgICAgICAnbGluZS1jYXAnOiAncm91bmQnXG4gICAgICB9LFxuICAgICAgcGFpbnQ6IHtcbiAgICAgICAgJ2xpbmUtY29sb3InOiAnIzM5REJDMCcsXG4gICAgICAgICdsaW5lLXdpZHRoJzoge1xuICAgICAgICAgIGJhc2U6IDEsXG4gICAgICAgICAgc3RvcHM6IFtbOCwgMV0sIFsxMiwgMV1dXG4gICAgICAgIH0sXG4gICAgICAgICdsaW5lLW9wYWNpdHknOiAwLjhcbiAgICAgIH0sXG4gICAgICBmaWx0ZXI6IFsnYWxsJywgWyc9PScsICd0eXBlJywgJ3JlbGF0aW9uJ10sIFsnPT0nLCAnY2hhbmdlVHlwZScsICdhZGRlZCddXVxuICAgIH0pO1xuXG4gICAgdGhpcy5tYXAuYWRkTGF5ZXIoe1xuICAgICAgaWQ6ICdkZWxldGVkLWxpbmUnLFxuICAgICAgc291cmNlOiAnY2hhbmdlc2V0JyxcbiAgICAgIHR5cGU6ICdsaW5lJyxcbiAgICAgIHBhaW50OiB7XG4gICAgICAgICdsaW5lLWNvbG9yJzogJyNDQzJDNDcnLFxuICAgICAgICAnbGluZS13aWR0aCc6IHtcbiAgICAgICAgICBiYXNlOiAxLFxuICAgICAgICAgIHN0b3BzOiBbWzgsIDNdLCBbMTIsIDVdXVxuICAgICAgICB9LFxuICAgICAgICAnbGluZS1kYXNoYXJyYXknOiBbMC4xLCAwLjI1XSxcbiAgICAgICAgJ2xpbmUtb3BhY2l0eSc6IDAuOFxuICAgICAgfSxcbiAgICAgIGZpbHRlcjogWydhbGwnLCBbJz09JywgJ3R5cGUnLCAnd2F5J10sIFsnPT0nLCAnY2hhbmdlVHlwZScsICdkZWxldGVkTmV3J11dXG4gICAgfSk7XG5cbiAgICB0aGlzLm1hcC5hZGRMYXllcih7XG4gICAgICBpZDogJ21vZGlmaWVkLW9sZC1wb2ludC1vbi13YXknLFxuICAgICAgc291cmNlOiAnY2hhbmdlc2V0JyxcbiAgICAgIHR5cGU6ICdjaXJjbGUnLFxuICAgICAgcGFpbnQ6IHtcbiAgICAgICAgJ2NpcmNsZS1jb2xvcic6ICcjREI5NTBBJyxcbiAgICAgICAgJ2NpcmNsZS1vcGFjaXR5Jzoge1xuICAgICAgICAgIGJhc2U6IDEuNSxcbiAgICAgICAgICBzdG9wczogW1sxMCwgMC4yNV0sIFsxNCwgMC41XV1cbiAgICAgICAgfSxcbiAgICAgICAgJ2NpcmNsZS1ibHVyJzogMC4yNSxcbiAgICAgICAgJ2NpcmNsZS1yYWRpdXMnOiB7XG4gICAgICAgICAgYmFzZTogMS41LFxuICAgICAgICAgIHN0b3BzOiBbWzEwLCAyLjVdLCBbMTYsIDMuNV1dXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBmaWx0ZXI6IFtcbiAgICAgICAgJ2FsbCcsXG4gICAgICAgIFsnPT0nLCAnJHR5cGUnLCAnTGluZVN0cmluZyddLFxuICAgICAgICBbJz09JywgJ2NoYW5nZVR5cGUnLCAnbW9kaWZpZWRPbGQnXVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgdGhpcy5tYXAuYWRkTGF5ZXIoe1xuICAgICAgaWQ6ICdtb2RpZmllZC1vbGQtbGluZScsXG4gICAgICBzb3VyY2U6ICdjaGFuZ2VzZXQnLFxuICAgICAgdHlwZTogJ2xpbmUnLFxuICAgICAgbGF5b3V0OiB7XG4gICAgICAgICdsaW5lLWpvaW4nOiAncm91bmQnLFxuICAgICAgICAnbGluZS1jYXAnOiAncm91bmQnXG4gICAgICB9LFxuICAgICAgcGFpbnQ6IHtcbiAgICAgICAgJ2xpbmUtY29sb3InOiAnI0RCOTUwQScsXG4gICAgICAgICdsaW5lLXdpZHRoJzoge1xuICAgICAgICAgIGJhc2U6IDEsXG4gICAgICAgICAgc3RvcHM6IFtbOCwgM10sIFsxMiwgNl1dXG4gICAgICAgIH0sXG4gICAgICAgICdsaW5lLWJsdXInOiB7XG4gICAgICAgICAgYmFzZTogMSxcbiAgICAgICAgICBzdG9wczogW1s4LCAwLjI1XSwgWzEyLCAwLjVdXVxuICAgICAgICB9LFxuICAgICAgICAnbGluZS1vcGFjaXR5JzogMC42XG4gICAgICB9LFxuICAgICAgZmlsdGVyOiBbXG4gICAgICAgICdhbGwnLFxuICAgICAgICBbJz09JywgJ3R5cGUnLCAnd2F5J10sXG4gICAgICAgIFsnPT0nLCAnY2hhbmdlVHlwZScsICdtb2RpZmllZE9sZCddXG4gICAgICBdXG4gICAgfSk7XG5cbiAgICB0aGlzLm1hcC5hZGRMYXllcih7XG4gICAgICBpZDogJ21vZGlmaWVkLW5ldy1wb2ludC1vbi13YXknLFxuICAgICAgc291cmNlOiAnY2hhbmdlc2V0JyxcbiAgICAgIHR5cGU6ICdjaXJjbGUnLFxuICAgICAgcGFpbnQ6IHtcbiAgICAgICAgJ2NpcmNsZS1jb2xvcic6ICcjRThFODQ1JyxcbiAgICAgICAgJ2NpcmNsZS1vcGFjaXR5Jzoge1xuICAgICAgICAgIGJhc2U6IDEuNSxcbiAgICAgICAgICBzdG9wczogW1sxMCwgMC4yNV0sIFsxNCwgMC4yNV1dXG4gICAgICAgIH0sXG4gICAgICAgICdjaXJjbGUtcmFkaXVzJzoge1xuICAgICAgICAgIGJhc2U6IDEuNSxcbiAgICAgICAgICBzdG9wczogW1sxMCwgMS4yNV0sIFsxNiwgMi4yNV1dXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBmaWx0ZXI6IFtcbiAgICAgICAgJ2FsbCcsXG4gICAgICAgIFsnPT0nLCAnJHR5cGUnLCAnTGluZVN0cmluZyddLFxuICAgICAgICBbJz09JywgJ2NoYW5nZVR5cGUnLCAnbW9kaWZpZWROZXcnXVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgdGhpcy5tYXAuYWRkTGF5ZXIoe1xuICAgICAgaWQ6ICdtb2RpZmllZC1uZXctbGluZScsXG4gICAgICBzb3VyY2U6ICdjaGFuZ2VzZXQnLFxuICAgICAgdHlwZTogJ2xpbmUnLFxuICAgICAgbGF5b3V0OiB7XG4gICAgICAgICdsaW5lLWpvaW4nOiAncm91bmQnLFxuICAgICAgICAnbGluZS1jYXAnOiAncm91bmQnXG4gICAgICB9LFxuICAgICAgcGFpbnQ6IHtcbiAgICAgICAgJ2xpbmUtY29sb3InOiAnI0U4RTg0NScsXG4gICAgICAgICdsaW5lLXdpZHRoJzoge1xuICAgICAgICAgIGJhc2U6IDEsXG4gICAgICAgICAgc3RvcHM6IFtbOCwgMV0sIFsxMiwgMl1dXG4gICAgICAgIH0sXG4gICAgICAgICdsaW5lLW9wYWNpdHknOiAwLjZcbiAgICAgIH0sXG4gICAgICBmaWx0ZXI6IFtcbiAgICAgICAgJ2FsbCcsXG4gICAgICAgIFsnPT0nLCAndHlwZScsICd3YXknXSxcbiAgICAgICAgWyc9PScsICdjaGFuZ2VUeXBlJywgJ21vZGlmaWVkTmV3J11cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIHRoaXMubWFwLmFkZExheWVyKHtcbiAgICAgIGlkOiAnYWRkZWQtbGluZScsXG4gICAgICBzb3VyY2U6ICdjaGFuZ2VzZXQnLFxuICAgICAgdHlwZTogJ2xpbmUnLFxuICAgICAgaW50ZXJhY3RpdmU6IHRydWUsXG4gICAgICBsYXlvdXQ6IHtcbiAgICAgICAgJ2xpbmUtam9pbic6ICdyb3VuZCcsXG4gICAgICAgICdsaW5lLWNhcCc6ICdyb3VuZCdcbiAgICAgIH0sXG4gICAgICBwYWludDoge1xuICAgICAgICAnbGluZS1jb2xvcic6ICcjMzlEQkMwJyxcbiAgICAgICAgJ2xpbmUtd2lkdGgnOiB7XG4gICAgICAgICAgYmFzZTogMSxcbiAgICAgICAgICBzdG9wczogW1s4LCAxXSwgWzEyLCAxLjVdXVxuICAgICAgICB9LFxuICAgICAgICAnbGluZS1vcGFjaXR5JzogMC44XG4gICAgICB9LFxuICAgICAgZmlsdGVyOiBbJ2FsbCcsIFsnPT0nLCAndHlwZScsICd3YXknXSwgWyc9PScsICdjaGFuZ2VUeXBlJywgJ2FkZGVkJ11dXG4gICAgfSk7XG5cbiAgICB0aGlzLm1hcC5hZGRMYXllcih7XG4gICAgICBpZDogJ2RlbGV0ZWQtcG9pbnQtdW50YWdnZWQnLFxuICAgICAgc291cmNlOiAnY2hhbmdlc2V0JyxcbiAgICAgIHR5cGU6ICdjaXJjbGUnLFxuICAgICAgcGFpbnQ6IHtcbiAgICAgICAgJ2NpcmNsZS1jb2xvcic6ICcjQ0MyQzQ3JyxcbiAgICAgICAgJ2NpcmNsZS1yYWRpdXMnOiB7XG4gICAgICAgICAgYmFzZTogMS41LFxuICAgICAgICAgIHN0b3BzOiBbWzEwLCAyXSwgWzE2LCAzXV1cbiAgICAgICAgfSxcbiAgICAgICAgJ2NpcmNsZS1vcGFjaXR5Jzoge1xuICAgICAgICAgIGJhc2U6IDEuNSxcbiAgICAgICAgICBzdG9wczogW1sxMCwgMC4yNV0sIFsxNCwgMC41XV1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGZpbHRlcjogW1xuICAgICAgICAnYWxsJyxcbiAgICAgICAgWyc9PScsICdjaGFuZ2VUeXBlJywgJ2RlbGV0ZWRPbGQnXSxcbiAgICAgICAgWydhbnknLCBbJz09JywgJ3RhZ3NDb3VudCcsIDBdLCBbJz09JywgJyR0eXBlJywgJ0xpbmVTdHJpbmcnXV1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIHRoaXMubWFwLmFkZExheWVyKHtcbiAgICAgIGlkOiAnbW9kaWZpZWQtb2xkLXBvaW50LXVudGFnZ2VkJyxcbiAgICAgIHNvdXJjZTogJ2NoYW5nZXNldCcsXG4gICAgICB0eXBlOiAnY2lyY2xlJyxcbiAgICAgIHBhaW50OiB7XG4gICAgICAgICdjaXJjbGUtY29sb3InOiAnI0RCOTUwQScsXG4gICAgICAgICdjaXJjbGUtb3BhY2l0eSc6IHtcbiAgICAgICAgICBiYXNlOiAxLjUsXG4gICAgICAgICAgc3RvcHM6IFtbMTAsIDAuMjVdLCBbMTQsIDAuNV1dXG4gICAgICAgIH0sXG4gICAgICAgICdjaXJjbGUtcmFkaXVzJzoge1xuICAgICAgICAgIGJhc2U6IDEuNSxcbiAgICAgICAgICBzdG9wczogW1sxMCwgMS43NV0sIFsxNiwgM11dXG4gICAgICAgIH0sXG4gICAgICAgICdjaXJjbGUtc3Ryb2tlLXdpZHRoJzogMSxcbiAgICAgICAgJ2NpcmNsZS1zdHJva2Utb3BhY2l0eSc6IDAuOSxcbiAgICAgICAgJ2NpcmNsZS1zdHJva2UtY29sb3InOiAnI0RCOTUwQSdcbiAgICAgIH0sXG4gICAgICBmaWx0ZXI6IFtcbiAgICAgICAgJ2FsbCcsXG4gICAgICAgIFsnPT0nLCAndHlwZScsICdub2RlJ10sXG4gICAgICAgIFsnPT0nLCAnY2hhbmdlVHlwZScsICdtb2RpZmllZE9sZCddLFxuICAgICAgICBbJz09JywgJ3RhZ3NDb3VudCcsIDBdXG4gICAgICBdXG4gICAgfSk7XG5cbiAgICB0aGlzLm1hcC5hZGRMYXllcih7XG4gICAgICBpZDogJ21vZGlmaWVkLW5ldy1wb2ludC11bnRhZ2dlZCcsXG4gICAgICBzb3VyY2U6ICdjaGFuZ2VzZXQnLFxuICAgICAgdHlwZTogJ2NpcmNsZScsXG4gICAgICBwYWludDoge1xuICAgICAgICAnY2lyY2xlLWNvbG9yJzogJyNFOEU4NDUnLFxuICAgICAgICAnY2lyY2xlLW9wYWNpdHknOiB7XG4gICAgICAgICAgYmFzZTogMS41LFxuICAgICAgICAgIHN0b3BzOiBbWzEwLCAwLjI1XSwgWzE0LCAwLjVdXVxuICAgICAgICB9LFxuICAgICAgICAnY2lyY2xlLXJhZGl1cyc6IHtcbiAgICAgICAgICBiYXNlOiAxLjUsXG4gICAgICAgICAgc3RvcHM6IFtbMTAsIDAuNzVdLCBbMTYsIDJdXVxuICAgICAgICB9LFxuICAgICAgICAnY2lyY2xlLXN0cm9rZS13aWR0aCc6IDEsXG4gICAgICAgICdjaXJjbGUtc3Ryb2tlLW9wYWNpdHknOiAwLjksXG4gICAgICAgICdjaXJjbGUtc3Ryb2tlLWNvbG9yJzogJyNFOEU4NDUnXG4gICAgICB9LFxuICAgICAgZmlsdGVyOiBbXG4gICAgICAgICdhbGwnLFxuICAgICAgICBbJz09JywgJ3R5cGUnLCAnbm9kZSddLFxuICAgICAgICBbJz09JywgJ2NoYW5nZVR5cGUnLCAnbW9kaWZpZWROZXcnXSxcbiAgICAgICAgWyc9PScsICd0YWdzQ291bnQnLCAwXVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgdGhpcy5tYXAuYWRkTGF5ZXIoe1xuICAgICAgaWQ6ICdhZGRlZC1wb2ludC11bnRhZ2dlZCcsXG4gICAgICBzb3VyY2U6ICdjaGFuZ2VzZXQnLFxuICAgICAgdHlwZTogJ2NpcmNsZScsXG4gICAgICBwYWludDoge1xuICAgICAgICAnY2lyY2xlLWNvbG9yJzogJyMzOURCQzAnLFxuICAgICAgICAnY2lyY2xlLW9wYWNpdHknOiB7XG4gICAgICAgICAgYmFzZTogMS41LFxuICAgICAgICAgIHN0b3BzOiBbWzEwLCAwLjNdLCBbMTQsIDAuNzVdXVxuICAgICAgICB9LFxuICAgICAgICAnY2lyY2xlLXJhZGl1cyc6IHtcbiAgICAgICAgICBiYXNlOiAxLjUsXG4gICAgICAgICAgc3RvcHM6IFtbMTAsIDEuMjVdLCBbMTYsIDEuOV1dXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBmaWx0ZXI6IFtcbiAgICAgICAgJ2FsbCcsXG4gICAgICAgIFsnPT0nLCAndHlwZScsICdub2RlJ10sXG4gICAgICAgIFsnPT0nLCAnY2hhbmdlVHlwZScsICdhZGRlZCddLFxuICAgICAgICBbJz09JywgJ3RhZ3NDb3VudCcsIDBdXG4gICAgICBdXG4gICAgfSk7XG5cbiAgICB0aGlzLm1hcC5hZGRMYXllcih7XG4gICAgICBpZDogJ2RlbGV0ZWQtcG9pbnQtdGFnZ2VkJyxcbiAgICAgIHNvdXJjZTogJ2NoYW5nZXNldCcsXG4gICAgICB0eXBlOiAnY2lyY2xlJyxcbiAgICAgIHBhaW50OiB7XG4gICAgICAgICdjaXJjbGUtY29sb3InOiAnI0NDMkM0NycsXG4gICAgICAgICdjaXJjbGUtcmFkaXVzJzoge1xuICAgICAgICAgIGJhc2U6IDEuNSxcbiAgICAgICAgICBzdG9wczogW1sxMCwgNF0sIFsxNiwgN11dXG4gICAgICAgIH0sXG4gICAgICAgICdjaXJjbGUtb3BhY2l0eSc6IHtcbiAgICAgICAgICBiYXNlOiAxLjUsXG4gICAgICAgICAgc3RvcHM6IFtbMTAsIDAuMjVdLCBbMTQsIDAuNV1dXG4gICAgICAgIH0sXG4gICAgICAgICdjaXJjbGUtc3Ryb2tlLXdpZHRoJzogMSxcbiAgICAgICAgJ2NpcmNsZS1zdHJva2Utb3BhY2l0eSc6IDAuNzUsXG4gICAgICAgICdjaXJjbGUtc3Ryb2tlLWNvbG9yJzogJyNDQzJDNDcnXG4gICAgICB9LFxuICAgICAgZmlsdGVyOiBbXG4gICAgICAgICdhbGwnLFxuICAgICAgICBbJz09JywgJ3R5cGUnLCAnbm9kZSddLFxuICAgICAgICBbJz09JywgJ2NoYW5nZVR5cGUnLCAnZGVsZXRlZE9sZCddLFxuICAgICAgICBbJyE9JywgJ3RhZ3NDb3VudCcsIDBdXG4gICAgICBdXG4gICAgfSk7XG5cbiAgICB0aGlzLm1hcC5hZGRMYXllcih7XG4gICAgICBpZDogJ21vZGlmaWVkLW9sZC1wb2ludC10YWdnZWQnLFxuICAgICAgc291cmNlOiAnY2hhbmdlc2V0JyxcbiAgICAgIHR5cGU6ICdjaXJjbGUnLFxuICAgICAgcGFpbnQ6IHtcbiAgICAgICAgJ2NpcmNsZS1jb2xvcic6ICcjREI5NTBBJyxcbiAgICAgICAgJ2NpcmNsZS1vcGFjaXR5Jzoge1xuICAgICAgICAgIGJhc2U6IDEuNSxcbiAgICAgICAgICBzdG9wczogW1sxMCwgMC4yNV0sIFsxNCwgMC43NV1dXG4gICAgICAgIH0sXG4gICAgICAgICdjaXJjbGUtcmFkaXVzJzoge1xuICAgICAgICAgIGJhc2U6IDEuNSxcbiAgICAgICAgICBzdG9wczogW1sxMCwgMi41XSwgWzE2LCA5XV1cbiAgICAgICAgfSxcbiAgICAgICAgJ2NpcmNsZS1zdHJva2Utd2lkdGgnOiAxLFxuICAgICAgICAnY2lyY2xlLXN0cm9rZS1vcGFjaXR5JzogMC45LFxuICAgICAgICAnY2lyY2xlLXN0cm9rZS1jb2xvcic6ICcjREI5NTBBJ1xuICAgICAgfSxcbiAgICAgIGZpbHRlcjogW1xuICAgICAgICAnYWxsJyxcbiAgICAgICAgWyc9PScsICd0eXBlJywgJ25vZGUnXSxcbiAgICAgICAgWyc9PScsICdjaGFuZ2VUeXBlJywgJ21vZGlmaWVkT2xkJ10sXG4gICAgICAgIFsnIT0nLCAndGFnc0NvdW50JywgMF1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIHRoaXMubWFwLmFkZExheWVyKHtcbiAgICAgIGlkOiAnbW9kaWZpZWQtbmV3LXBvaW50LXRhZ2dlZCcsXG4gICAgICBzb3VyY2U6ICdjaGFuZ2VzZXQnLFxuICAgICAgdHlwZTogJ2NpcmNsZScsXG4gICAgICBwYWludDoge1xuICAgICAgICAnY2lyY2xlLWNvbG9yJzogJyNFOEU4NDUnLFxuICAgICAgICAnY2lyY2xlLW9wYWNpdHknOiB7XG4gICAgICAgICAgYmFzZTogMS41LFxuICAgICAgICAgIHN0b3BzOiBbWzEwLCAwLjI1XSwgWzE0LCAwLjc1XV1cbiAgICAgICAgfSxcbiAgICAgICAgJ2NpcmNsZS1yYWRpdXMnOiB7XG4gICAgICAgICAgYmFzZTogMS41LFxuICAgICAgICAgIHN0b3BzOiBbWzEwLCAyXSwgWzE2LCA3XV1cbiAgICAgICAgfSxcbiAgICAgICAgJ2NpcmNsZS1zdHJva2Utd2lkdGgnOiAxLFxuICAgICAgICAnY2lyY2xlLXN0cm9rZS1vcGFjaXR5JzogMC45LFxuICAgICAgICAnY2lyY2xlLXN0cm9rZS1jb2xvcic6ICcjRThFODQ1J1xuICAgICAgfSxcbiAgICAgIGZpbHRlcjogW1xuICAgICAgICAnYWxsJyxcbiAgICAgICAgWyc9PScsICd0eXBlJywgJ25vZGUnXSxcbiAgICAgICAgWyc9PScsICdjaGFuZ2VUeXBlJywgJ21vZGlmaWVkTmV3J10sXG4gICAgICAgIFsnIT0nLCAndGFnc0NvdW50JywgMF1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIHRoaXMubWFwLmFkZExheWVyKHtcbiAgICAgIGlkOiAnYWRkZWQtcG9pbnQtdGFnZ2VkJyxcbiAgICAgIHNvdXJjZTogJ2NoYW5nZXNldCcsXG4gICAgICB0eXBlOiAnY2lyY2xlJyxcbiAgICAgIHBhaW50OiB7XG4gICAgICAgICdjaXJjbGUtY29sb3InOiAnIzM5REJDMCcsXG4gICAgICAgICdjaXJjbGUtb3BhY2l0eSc6IHtcbiAgICAgICAgICBiYXNlOiAxLjUsXG4gICAgICAgICAgc3RvcHM6IFtbMTAsIDAuM10sIFsxNCwgMC43NV1dXG4gICAgICAgIH0sXG4gICAgICAgICdjaXJjbGUtcmFkaXVzJzoge1xuICAgICAgICAgIGJhc2U6IDEuNSxcbiAgICAgICAgICBzdG9wczogW1sxMCwgMV0sIFsxNiwgNV1dXG4gICAgICAgIH0sXG4gICAgICAgICdjaXJjbGUtc3Ryb2tlLXdpZHRoJzogMSxcbiAgICAgICAgJ2NpcmNsZS1zdHJva2Utb3BhY2l0eSc6IDAuOSxcbiAgICAgICAgJ2NpcmNsZS1zdHJva2UtY29sb3InOiAnIzM5REJDMCdcbiAgICAgIH0sXG4gICAgICBmaWx0ZXI6IFtcbiAgICAgICAgJ2FsbCcsXG4gICAgICAgIFsnPT0nLCAndHlwZScsICdub2RlJ10sXG4gICAgICAgIFsnPT0nLCAnY2hhbmdlVHlwZScsICdhZGRlZCddLFxuICAgICAgICBbJyE9JywgJ3RhZ3NDb3VudCcsIDBdXG4gICAgICBdXG4gICAgfSk7XG4gIH1cblxuICByZW5kZXJNYXAoYmFzZUxheWVyLCByZXN1bHQpIHtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgaWYgKCF0aGlzLnJlc3VsdCkgcmV0dXJuO1xuICAgICAgcmVzdWx0ID0gdGhpcy5yZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xuICAgIH1cbiAgICB2YXIgYm91bmRzID0gZ2V0Qm91bmRzKHJlc3VsdC5jaGFuZ2VzZXQuYmJveCk7XG4gICAgaWYgKHRoaXMubWFwKSB7XG4gICAgICBpZiAoIXRoaXMubWFwTG9hZGVkKSB7XG4gICAgICAgIHRoaXMucXVldWUucHVzaChbcmVzdWx0LCBib3VuZHNdKTsgLy8gVE9GSVggdXNlIHZhcmlhYmxlIGluc3RlYWQgb2YgYXJyYXlcbiAgICAgICAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGJhc2VMYXllciAmJiB0aGlzLm9sZEJhc2VMYXllciAhPT0gYmFzZUxheWVyKSB7XG4gICAgICAgIHRoaXMubWFwLnNldFN0eWxlKGJhc2VMYXllcik7XG4gICAgICAgIHRoaXMuYmFzZUxheWVyRGF0YSA9IFtyZXN1bHQsIGJvdW5kc107XG4gICAgICAgIHRoaXMub2xkQmFzZUxheWVyID0gYmFzZUxheWVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbGRCYXNlTGF5ZXIgPSBiYXNlTGF5ZXI7XG4gICAgICAgIHRoaXMuYWRkTWFwU291cmNlKHJlc3VsdCwgYm91bmRzKTtcbiAgICAgICAgdGhpcy5tYXAuZml0Qm91bmRzKGJvdW5kcywgeyBsaW5lYXI6IHRydWUsIHBhZGRpbmc6IDIwMCB9KTtcbiAgICAgICAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgIGNsZWFyRGlmZigpO1xuICAgICAgfVxuXG4gICAgICAvLyB3aHkgbm90IHJlIGF0dGFjaCBvbignY2xpY2snKVxuICAgICAgLy8gaWYgdGhlIG1hcCBpcyBzdGlsbCBtb3VudGVkXG4gICAgICAvLyBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgdGFrZSB0aGUgbGF0ZXN0XG4gICAgICAvLyByZXN1bHQgdGhhbmtzIHRvIHRoaXMucmVzdWx0XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHtcbiAgICAgIGNvbnRhaW5lcjogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNtYXAtbWFwJyksXG4gICAgICBzdHlsZTogYmFzZUxheWVyIHx8ICdtYXBib3g6Ly9zdHlsZXMvcmFzYWd5L2NpenA2bHNhaDAwY3Qyc251NmdpM3AxNnEnLFxuICAgICAgY2VudGVyOiBib3VuZHMuZ2V0Q2VudGVyKCksXG4gICAgICB6b29tOiAxNCxcbiAgICAgIGRyYWdSb3RhdGU6IGZhbHNlLFxuICAgICAgdG91Y2hab29tUm90YXRlOiBmYWxzZVxuICAgIH0pO1xuICAgIHRoaXMubWFwLm9uKCdzdHlsZWRhdGEnLCAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYmFzZUxheWVyRGF0YSkgcmV0dXJuO1xuICAgICAgY29uc29sZS5sb2coJ3N0eWxlIGV2ZW50IGZpcmVkIDInKTtcbiAgICAgIHZhciBib3VuZHMgPSB0aGlzLmJhc2VMYXllckRhdGFbMV07XG4gICAgICB2YXIgcmVzdWx0ID0gdGhpcy5iYXNlTGF5ZXJEYXRhWzBdO1xuICAgICAgdGhpcy5iYXNlTGF5ZXJEYXRhID0gbnVsbDtcbiAgICAgIHRoaXMubWFwLmZpdEJvdW5kcyhib3VuZHMsIHsgbGluZWFyOiB0cnVlLCBwYWRkaW5nOiAyMDAgfSk7XG4gICAgICB0aGlzLmFkZE1hcFNvdXJjZShyZXN1bHQsIGJvdW5kcyk7XG4gICAgICB0aGlzLmFkZE1hcExheWVycygpO1xuICAgICAgY21hcC5lbWl0KCdsb2FkJyk7XG4gICAgfSk7XG4gICAgdGhpcy5tYXAub24oJ2xvYWQnLCAoKSA9PiB7XG4gICAgICB0aGlzLm1hcExvYWRlZCA9IHRydWU7XG4gICAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5xdWV1ZS5sZW5ndGggLSAxO1xuICAgICAgICByZXN1bHQgPSB0aGlzLnF1ZXVlW2luZGV4XVswXTtcbiAgICAgICAgYm91bmRzID0gdGhpcy5xdWV1ZVtpbmRleF1bMV07XG4gICAgICAgIHRoaXMucXVldWUgPSBbXTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWFwLmZpdEJvdW5kcyhib3VuZHMsIHsgbGluZWFyOiB0cnVlLCBwYWRkaW5nOiAyMDAgfSk7XG4gICAgICB0aGlzLmFkZE1hcFNvdXJjZShyZXN1bHQsIGJvdW5kcyk7XG4gICAgICB0aGlzLmFkZE1hcExheWVycygpO1xuICAgICAgY21hcC5lbWl0KCdsb2FkJyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm1hcC5vbignY2xpY2snLCBlID0+IHtcbiAgICAgIHZhciB4MXkxID0gW2UucG9pbnQueCAtIDUsIGUucG9pbnQueSAtIDVdO1xuICAgICAgdmFyIHgyeTIgPSBbZS5wb2ludC54ICsgNSwgZS5wb2ludC55ICsgNV07XG4gICAgICB2YXIgZmVhdHVyZXMgPSB0aGlzLm1hcC5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoW3gxeTEsIHgyeTJdLCB7XG4gICAgICAgIGxheWVyczogW1xuICAgICAgICAgICdhZGRlZC1saW5lJyxcbiAgICAgICAgICAnYWRkZWQtcG9pbnQtdGFnZ2VkJyxcbiAgICAgICAgICAnbW9kaWZpZWQtb2xkLWxpbmUnLFxuICAgICAgICAgICdtb2RpZmllZC1vbGQtcG9pbnQtdGFnZ2VkJyxcbiAgICAgICAgICAnbW9kaWZpZWQtb2xkLXBvaW50LXVudGFnZ2VkJyxcbiAgICAgICAgICAnbW9kaWZpZWQtbmV3LWxpbmUnLFxuICAgICAgICAgICdtb2RpZmllZC1uZXctcG9pbnQtdGFnZ2VkJyxcbiAgICAgICAgICAnbW9kaWZpZWQtbmV3LXBvaW50LXVudGFnZ2VkJyxcbiAgICAgICAgICAnZGVsZXRlZC1saW5lJyxcbiAgICAgICAgICAnZGVsZXRlZC1wb2ludC10YWdnZWQnLFxuICAgICAgICAgICdhZGRlZC1yZWxhdGlvbicsXG4gICAgICAgICAgJ21vZGlmaWVkLW9sZC1yZWxhdGlvbicsXG4gICAgICAgICAgJ21vZGlmaWVkLW5ldy1yZWxhdGlvbicsXG4gICAgICAgICAgJ2RlbGV0ZWQtcmVsYXRpb24nXG4gICAgICAgIF1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZmVhdHVyZXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0RmVhdHVyZShmZWF0dXJlc1swXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNsZWFyRmVhdHVyZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHNlbGVjdEZlYXR1cmUoZmVhdHVyZSkge1xuICAgIHZhciBmZWF0dXJlTWFwID0gdGhpcy5yZXN1bHQuZmVhdHVyZU1hcDtcbiAgICB2YXIgZmVhdHVyZUlkID0gZmVhdHVyZS5wcm9wZXJ0aWVzLmlkO1xuICAgIHZhciBvc21UeXBlID0gZmVhdHVyZS5wcm9wZXJ0aWVzLnR5cGU7XG5cbiAgICB0aGlzLmhpZ2hsaWdodEZlYXR1cmUoZmVhdHVyZUlkKTtcbiAgICBkaXNwbGF5RGlmZihmZWF0dXJlSWQsIGZlYXR1cmVNYXApO1xuICAgIGNtYXAuZW1pdCgnZmVhdHVyZUNoYW5nZScsIG9zbVR5cGUsIGZlYXR1cmVJZCk7XG4gIH1cbiAgaGlnaGxpZ2h0RmVhdHVyZShmZWF0dXJlSWQpIHtcbiAgICB0aGlzLm1hcC5zZXRGaWx0ZXIoJ2hpZ2hsaWdodC1saW5lJywgWyc9PScsICdpZCcsIGZlYXR1cmVJZF0pO1xuICAgIHRoaXMubWFwLnNldEZpbHRlcignaGlnaGxpZ2h0LXBvaW50JywgWyc9PScsICdpZCcsIGZlYXR1cmVJZF0pO1xuICB9XG4gIGNsZWFySGlnaGxpZ2h0KCkge1xuICAgIHRoaXMubWFwLnNldEZpbHRlcignaGlnaGxpZ2h0LWxpbmUnLCBbJz09JywgJ2lkJywgJyddKTtcbiAgICB0aGlzLm1hcC5zZXRGaWx0ZXIoJ2hpZ2hsaWdodC1wb2ludCcsIFsnPT0nLCAnaWQnLCAnJ10pO1xuICB9XG4gIGNsZWFyRmVhdHVyZSgpIHtcbiAgICB0aGlzLmNsZWFySGlnaGxpZ2h0KCk7XG4gICAgY2xlYXJEaWZmKCk7XG4gICAgY21hcC5lbWl0KCdmZWF0dXJlQ2hhbmdlJywgbnVsbCwgbnVsbCk7XG4gIH1cbn1cblxuLy9DYWxjdWxhdGVzIHRoZSBkaWZmZXJlbmNlIGluIHRoZSBzZWxlY3RlZCBmZWF0dXJlc1xuXG5mdW5jdGlvbiBkaXNwbGF5RGlmZihpZCwgZmVhdHVyZU1hcCkge1xuICB2YXIgZmVhdHVyZXNXaXRoSWQgPSBmZWF0dXJlTWFwW2lkXTtcbiAgdmFyIG1ldGFkYXRhUHJvcHMgPSBmZWF0dXJlc1dpdGhJZC5tYXAoZnVuY3Rpb24oZikge1xuICAgIHZhciBwcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIGYucHJvcGVydGllcyk7XG4gICAgZGVsZXRlIHByb3BzLnRhZ3M7XG4gICAgZGVsZXRlIHByb3BzLnRhZ3NDb3VudDtcbiAgICBkZWxldGUgcHJvcHMucmVsYXRpb25zO1xuICAgIGRlbGV0ZSBwcm9wcy5hY3Rpb247XG4gICAgcmV0dXJuIHByb3BzO1xuICB9KTtcbiAgdmFyIHRhZ1Byb3BzID0gZmVhdHVyZXNXaXRoSWQubWFwKGZ1bmN0aW9uKGYpIHtcbiAgICB2YXIgcHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBmLnByb3BlcnRpZXMudGFncyk7XG4gICAgcHJvcHMuY2hhbmdlVHlwZSA9IGYucHJvcGVydGllcy5jaGFuZ2VUeXBlO1xuICAgIHJldHVybiBwcm9wcztcbiAgfSk7XG5cbiAgLy8gU2V0cyBoZWFkZXJzIGZvciB0d28gdGFibGVzXG5cbiAgdmFyIHR5cGUgPSBmZWF0dXJlc1dpdGhJZFswXS5wcm9wZXJ0aWVzLnR5cGU7XG4gIHZhciBtZXRhZGF0YUhlYWRlciA9IGVsdChcbiAgICAnZGl2JyxcbiAgICB7fSxcbiAgICBlbHQoJ3NwYW4nLCB7IGNsYXNzOiAnY21hcC1pbmxpbmUtYmxvY2snIH0sIHR5cGUudG9VcHBlckNhc2UoKSArICc6ICcgKyBpZCksXG4gICAgZWx0KFxuICAgICAgJ3VsJyxcbiAgICAgIHsgY2xhc3M6ICdjbWFwLWhsaXN0IGNtYXAtaW5saW5lLWJsb2NrIGNtYXAtZnInIH0sXG4gICAgICBlbHQoXG4gICAgICAgICdsaScsXG4gICAgICAgIHt9LFxuICAgICAgICBlbHQoXG4gICAgICAgICAgJ2EnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldDogJ19ibGFuaycsXG4gICAgICAgICAgICBjbGFzczogJ2NtYXAtaGxpc3QtaXRlbSBjbWFwLXBvaW50ZXIgY21hcC1ub3NlbGVjdCcsXG4gICAgICAgICAgICBocmVmOiAnLy93d3cub3BlbnN0cmVldG1hcC5vcmcvJyArIHR5cGUgKyAnLycgKyBpZCArICcvaGlzdG9yeSdcbiAgICAgICAgICB9LFxuICAgICAgICAgICdPU00nXG4gICAgICAgIClcbiAgICAgICksXG4gICAgICBlbHQoXG4gICAgICAgICdsaScsXG4gICAgICAgIHt9LFxuICAgICAgICBlbHQoXG4gICAgICAgICAgJ2EnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldDogJ19ibGFuaycsXG4gICAgICAgICAgICBjbGFzczogJ2NtYXAtaGxpc3QtaXRlbSBjbWFwLXBvaW50ZXIgY21hcC1ub3NlbGVjdCcsXG4gICAgICAgICAgICBocmVmOiAnLy9vc21sYWIuZ2l0aHViLmlvL29zbS1kZWVwLWhpc3RvcnkvIy8nICsgdHlwZSArICcvJyArIGlkXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnRGVlcCBIaXN0b3J5J1xuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICApO1xuICB2YXIgbWV0YWRhdGFIVE1MID0gZ2V0RGlmZkhUTUwoXG4gICAgcHJvcHNEaWZmKG1ldGFkYXRhUHJvcHMpLFxuICAgIFsnaWQnLCAndHlwZScsICdjaGFuZ2VUeXBlJ10sXG4gICAgbWV0YWRhdGFIZWFkZXJcbiAgKTtcbiAgdmFyIHRhZ0hlYWRlciA9IGVsdChcbiAgICAnc3BhbicsXG4gICAgeyBjbGFzczogJ2NtYXAtaW5saW5lLWJsb2NrJyB9LFxuICAgICdUYWcgZGV0YWlscycudG9VcHBlckNhc2UoKVxuICApO1xuICB2YXIgdGFnSFRNTCA9IGdldERpZmZIVE1MKFxuICAgIHByb3BzRGlmZih0YWdQcm9wcyksXG4gICAgWydpZCcsICdjaGFuZ2VUeXBlJ10sXG4gICAgdGFnSGVhZGVyXG4gICk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNtYXAtZGlmZicpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jbWFwLWRpZmYtbWV0YWRhdGEnKS5pbm5lckhUTUwgPSAnJztcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNtYXAtZGlmZi1tZXRhZGF0YScpLmFwcGVuZENoaWxkKG1ldGFkYXRhSFRNTCk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jbWFwLWRpZmYtbWV0YWRhdGEnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY21hcC1kaWZmLXRhZ3MnKS5pbm5lckhUTUwgPSAnJztcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNtYXAtZGlmZi10YWdzJykuYXBwZW5kQ2hpbGQodGFnSFRNTCk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jbWFwLWRpZmYtdGFncycpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xufVxuXG5mdW5jdGlvbiBjbGVhckRpZmYoKSB7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jbWFwLWRpZmYnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jbWFwLWRpZmYtbWV0YWRhdGEnKS5pbm5lckhUTUwgPSAnJztcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNtYXAtZGlmZi1tZXRhZGF0YScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNtYXAtZGlmZi10YWdzJykuaW5uZXJIVE1MID0gJyc7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jbWFwLWRpZmYtdGFncycpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG59XG5cbi8vUmVuZGVycyB0aGUgbWFya3VwIGZvciBhIHRhYmxlXG5mdW5jdGlvbiBnZXREaWZmSFRNTChkaWZmLCBpZ25vcmVMaXN0LCBoZWFkZXIpIHtcbiAgdmFyIGlzQWRkZWRGZWF0dXJlID0gZGlmZlsnY2hhbmdlVHlwZSddLmFkZGVkID09PSAnYWRkZWQnO1xuXG4gIHZhciByb290ID0gZWx0KCd0YWJsZScsIHsgY2xhc3M6ICdjbWFwLWRpZmYtdGFibGUnIH0pO1xuICBpZiAoaXNBZGRlZEZlYXR1cmUpIHtcbiAgICByb290LnN0eWxlLndpZHRoID0gJzMwMHB4JztcbiAgfVxuXG4gIGlmIChoZWFkZXIpIHtcbiAgICByb290LmFwcGVuZENoaWxkKFxuICAgICAgZWx0KFxuICAgICAgICAndGhlYWQnLFxuICAgICAgICB7fSxcbiAgICAgICAgZWx0KFxuICAgICAgICAgICd0cicsXG4gICAgICAgICAge30sXG4gICAgICAgICAgZWx0KFxuICAgICAgICAgICAgJ3RkJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29sc3BhbjogaXNBZGRlZEZlYXR1cmUgPyAnMicgOiAnMycsXG4gICAgICAgICAgICAgIGNsYXNzOiAnY21hcC10YWJsZS1oZWFkJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhlYWRlclxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICB2YXIgdGJvZHkgPSBlbHQoJ3Rib2R5Jyk7XG5cbiAgdmFyIHR5cGVzID0gWydhZGRlZCcsICdkZWxldGVkJywgJ21vZGlmaWVkT2xkJywgJ21vZGlmaWVkTmV3JywgJ3VuY2hhbmdlZCddO1xuICB2YXIgc29ydGVkUHJvcHMgPSBPYmplY3Qua2V5cyhkaWZmKS5zb3J0KGZ1bmN0aW9uKGtleUEsIGtleUIpIHtcbiAgICB2YXIgaW5kZXhBID0gdHlwZXMuaW5kZXhPZihPYmplY3Qua2V5cyhkaWZmW2tleUFdKVswXSk7XG4gICAgdmFyIGluZGV4QiA9IHR5cGVzLmluZGV4T2YoT2JqZWN0LmtleXMoZGlmZltrZXlCXSlbMF0pO1xuICAgIHJldHVybiBpbmRleEEgLSBpbmRleEI7XG4gIH0pO1xuXG4gIHNvcnRlZFByb3BzLmZvckVhY2goZnVuY3Rpb24ocHJvcCkge1xuICAgIGlmIChpZ25vcmVMaXN0LmluZGV4T2YocHJvcCkgPT09IC0xKSB7XG4gICAgICB2YXIgdHIgPSBlbHQoJ3RyJyk7XG5cbiAgICAgIHZhciB0aCA9IGVsdCgndGgnLCB7IHRpdGxlOiBwcm9wLCBjbGFzczogJ2NtYXAtc3Ryb25nJyB9LCBwcm9wKTtcbiAgICAgIHRyLmFwcGVuZENoaWxkKHRoKTtcblxuICAgICAgdHlwZXMuZm9yRWFjaChmdW5jdGlvbih0eXBlKSB7XG4gICAgICAgIGlmIChkaWZmW3Byb3BdLmhhc093blByb3BlcnR5KHR5cGUpKSB7XG4gICAgICAgICAgdmFyIHByb3BDbGFzcyA9ICdkaWZmLXByb3BlcnR5IGNtYXAtc2Nyb2xsLXN0eWxlZCBwcm9wcy1kaWZmLScgKyB0eXBlO1xuICAgICAgICAgIGlmICh0eXBlID09ICdhZGRlZCcgJiYgIWlzQWRkZWRGZWF0dXJlKSB7XG4gICAgICAgICAgICB2YXIgZW1wdHkgPSBlbHQoJ3RkJywgeyBjbGFzczogcHJvcENsYXNzIH0pO1xuICAgICAgICAgICAgdHIuYXBwZW5kQ2hpbGQoZW1wdHkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwcm9wID09PSAnY2hhbmdlc2V0JyAmJiB0eXBlID09PSAnbW9kaWZpZWRPbGQnKSB7XG4gICAgICAgICAgICB2YXIgb3NtY2hhX2xpbmsgPSBlbHQoXG4gICAgICAgICAgICAgICdhJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRhcmdldDogJ19ibGFuaycsXG4gICAgICAgICAgICAgICAgY2xhc3M6ICdjbWFwLWNoYW5nZXNldC1saW5rJyxcbiAgICAgICAgICAgICAgICBocmVmOiAnLy9vc21jaGEubWFwYm94LmNvbS9jaGFuZ2VzZXRzLycgKyBkaWZmW3Byb3BdW3R5cGVdXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGRpZmZbcHJvcF1bdHlwZV1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB2YXIgdGQgPSBlbHQoJ3RkJywgeyBjbGFzczogcHJvcENsYXNzIH0sIG9zbWNoYV9saW5rKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHRkID0gZWx0KCd0ZCcsIHsgY2xhc3M6IHByb3BDbGFzcyB9LCBkaWZmW3Byb3BdW3R5cGVdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHIuYXBwZW5kQ2hpbGQodGQpO1xuXG4gICAgICAgICAgaWYgKHR5cGUgPT0gJ2RlbGV0ZWQnKSB7XG4gICAgICAgICAgICB2YXIgZW1wdHkgPSBlbHQoJ3RkJywgeyBjbGFzczogcHJvcENsYXNzIH0pO1xuICAgICAgICAgICAgdHIuYXBwZW5kQ2hpbGQoZW1wdHkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlID09ICd1bmNoYW5nZWQnKSB7XG4gICAgICAgICAgICB0ci5hcHBlbmRDaGlsZCh0ZC5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRib2R5LmFwcGVuZENoaWxkKHRyKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJvb3QuYXBwZW5kQ2hpbGQodGJvZHkpO1xuXG4gIHJldHVybiByb290O1xufVxuXG4vLyBSZWN1cnNpdmVseSBhZGRzIGh0bWwgZWxlbWVudHNcbmZ1bmN0aW9uIGVsdChuYW1lLCBhdHRyaWJ1dGVzKSB7XG4gIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTtcbiAgaWYgKGF0dHJpYnV0ZXMpIHtcbiAgICBmb3IgKHZhciBhdHRyIGluIGF0dHJpYnV0ZXMpXG4gICAgICBpZiAoYXR0cmlidXRlcy5oYXNPd25Qcm9wZXJ0eShhdHRyKSlcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0ciwgYXR0cmlidXRlc1thdHRyXSk7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY2hpbGQgPSBhcmd1bWVudHNbaV07XG4gICAgaWYgKHR5cGVvZiBjaGlsZCA9PSAnc3RyaW5nJykgY2hpbGQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjaGlsZCk7XG4gICAgbm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gIH1cbiAgcmV0dXJuIG5vZGU7XG59XG4iLCJpbXBvcnQgbWFwYm94Z2wgZnJvbSAnbWFwYm94LWdsJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciBhcyBldmVudHMgfSBmcm9tICdldmVudHMnO1xuaW1wb3J0IHsgcmVuZGVyIGFzIHJlYWN0RE9NIH0gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IGdldENoYW5nZXNldCB9IGZyb20gJy4vZ2V0Q2hhbmdlc2V0JztcbmltcG9ydCB7IFNpZGViYXIgfSBmcm9tICcuL3NpZGViYXInO1xuaW1wb3J0IHsgTWFwIGFzIEdsTWFwIH0gZnJvbSAnLi9tYXAnO1xuLy9maWx0ZXJMYXllcnMsIHJlbmRlck1hcCwgc2VsZWN0RmVhdHVyZSwgY2xlYXJGZWF0dXJlXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5cbmV4cG9ydCBjb25zdCBjbWFwID0gbmV3IGV2ZW50cygpO1xuXG5sZXQgbWFwO1xuXG53aW5kb3cuY21hcCA9IGNtYXA7XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXIoY29udGFpbmVyLCBjaGFuZ2VzZXRJZCwgb3B0aW9ucykge1xuICBjb250YWluZXIuc3R5bGUud2lkdGggPSBvcHRpb25zLndpZHRoIHx8ICcxMDAwcHgnO1xuICBjb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQgfHwgJzUwMHB4JztcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5vdmVycGFzc0Jhc2UgPSBvcHRpb25zLm92ZXJwYXNzQmFzZSB8fCBjb25maWcub3ZlcnBhc3NCYXNlO1xuICBtYXBib3hnbC5hY2Nlc3NUb2tlbiA9IGNvbmZpZy5tYXBib3hBY2Nlc3NUb2tlbjtcbiAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2NtYXAtbG9hZGluZycpO1xuICBpZiAoIW1hcCkge1xuICAgIG1hcCA9IG5ldyBHbE1hcCgpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuZGF0YSkge1xuICAgIF9yZW5kZXIoY29udGFpbmVyLCBjaGFuZ2VzZXRJZCwgb3B0aW9ucy5kYXRhLCBvcHRpb25zLmRpc2FibGVTaWRlYmFyKTtcbiAgfSBlbHNlIHtcbiAgICBnZXRDaGFuZ2VzZXQoY2hhbmdlc2V0SWQsIG9wdGlvbnMub3ZlcnBhc3NCYXNlKVxuICAgICAgLnRoZW4ocmVzdWx0ID0+IF9yZW5kZXIoY29udGFpbmVyLCBjaGFuZ2VzZXRJZCwgcmVzdWx0KSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBlcnJvck1lc3NhZ2UoZXJyLm1zZyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjbWFwO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldE1hcEluc3RhbmNlKCkge1xuICByZXR1cm4gbWFwO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEdMKCkge1xuICByZXR1cm4gbWFwYm94Z2w7XG59XG5cbmZ1bmN0aW9uIF9yZW5kZXIoY29udGFpbmVyLCBjaGFuZ2VzZXRJZCwgcmVzdWx0LCBkaXNhYmxlU2lkZWJhcikge1xuICByZW5kZXJIVE1MKGNvbnRhaW5lciwgY2hhbmdlc2V0SWQsIHJlc3VsdCwgZGlzYWJsZVNpZGViYXIpO1xuXG4gIGNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdjbWFwLWxvYWRpbmcnKTtcblxuICBtYXAucmVuZGVyTWFwKGZhbHNlLCByZXN1bHQpO1xuXG4gIHZhciBmZWF0dXJlTWFwID0gcmVzdWx0LmZlYXR1cmVNYXA7XG5cbiAgY21hcC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgY21hcC5vbigncmVtb3ZlJywgKCkgPT4ge1xuICAgIG1hcC5yZW1vdmUoKTtcbiAgfSk7XG5cbiAgY21hcC5vbignc2VsZWN0RmVhdHVyZScsIChnZW9tZXRyeVR5cGUsIGZlYXR1cmVJZCkgPT4ge1xuICAgIGlmIChnZW9tZXRyeVR5cGUgJiYgZmVhdHVyZUlkKSB7XG4gICAgICBtYXAuc2VsZWN0RmVhdHVyZShmZWF0dXJlTWFwW2ZlYXR1cmVJZF1bMF0sIGZlYXR1cmVNYXApO1xuICAgIH1cbiAgfSk7XG5cbiAgY21hcC5vbignY2xlYXJGZWF0dXJlJywgKCkgPT4ge1xuICAgIG1hcC5jbGVhckZlYXR1cmUoKTtcbiAgfSk7XG59XG5cbi8vIFNldHMgaW5pdGlhbCBtYXJrdXAgZm9yIGluZm8gYm94IGFuZCBtYXAgY29udGFpbmVyXG5mdW5jdGlvbiByZW5kZXJIVE1MKGNvbnRhaW5lciwgY2hhbmdlc2V0SWQsIHJlc3VsdCwgZGlzYWJsZVNpZGViYXIpIHtcbiAgdmFyIGluZm87XG4gIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VhdCcpKSB7XG4gICAgaW5mbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWF0Jyk7XG4gIH0gZWxzZSB7XG4gICAgaW5mbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGluZm8uaWQgPSAnc2VhdCc7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGluZm8pO1xuICB9XG4gIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdjbWFwLWNvbnRhaW5lcicpO1xuXG4gIC8vIEFkZCBgdGFnc0NvdW50YCB0byBmZWF0dXJlIHByb3BlcnRpZXNcbiAgcmVzdWx0Lmdlb2pzb24uZmVhdHVyZXMuZm9yRWFjaChmZWF0dXJlID0+IHtcbiAgICB2YXIgdGFncyA9IGZlYXR1cmUucHJvcGVydGllcy50YWdzIHx8IHt9O1xuICAgIGZlYXR1cmUucHJvcGVydGllcy50YWdzQ291bnQgPSBPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGg7XG4gIH0pO1xuXG4gIHJlYWN0RE9NKFxuICAgIDxkaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImNtYXAtbWFwXCIgLz5cblxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjbWFwLWRpZmZcIiBzdHlsZT17eyBkaXNwbGF5OiAnbm9uZScgfX0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9XCJjbWFwLWRpZmYtbWV0YWRhdGEgY21hcC1zY3JvbGwtc3R5bGVkXCJcbiAgICAgICAgICBzdHlsZT17eyBkaXNwbGF5OiAnbm9uZScgfX1cbiAgICAgICAgLz5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT1cImNtYXAtZGlmZi10YWdzIGNtYXAtc2Nyb2xsLXN0eWxlZFwiXG4gICAgICAgICAgc3R5bGU9e3sgZGlzcGxheTogJ25vbmUnIH19XG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIHshZGlzYWJsZVNpZGViYXIgJiYgKFxuICAgICAgICA8U2lkZWJhclxuICAgICAgICAgIHJlc3VsdD17cmVzdWx0fVxuICAgICAgICAgIGNoYW5nZXNldElkPXtjaGFuZ2VzZXRJZH1cbiAgICAgICAgICBmaWx0ZXJMYXllcnM9e21hcC5maWx0ZXJMYXllcnN9XG4gICAgICAgICAgdG9nZ2xlTGF5ZXI9e2Z1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIHZhciBsYXllciA9IGUudGFyZ2V0LnZhbHVlO1xuICAgICAgICAgICAgaWYgKGxheWVyID09PSAnc2F0ZWxsaXRlJykge1xuICAgICAgICAgICAgICBtYXAucmVuZGVyTWFwKFxuICAgICAgICAgICAgICAgICdtYXBib3g6Ly9zdHlsZXMvcmFzYWd5L2NpenA2bHNhaDAwY3Qyc251NmdpM3AxNnEnLFxuICAgICAgICAgICAgICAgIHJlc3VsdFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGF5ZXIgPT09ICdkYXJrJykge1xuICAgICAgICAgICAgICBtYXAucmVuZGVyTWFwKCdtYXBib3g6Ly9zdHlsZXMvbWFwYm94L2RhcmstdjknLCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGF5ZXIgPT09ICdzdHJlZXRzJykge1xuICAgICAgICAgICAgICBtYXAucmVuZGVyTWFwKCdtYXBib3g6Ly9zdHlsZXMvbWFwYm94L3N0cmVldHMtdjknLCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgIDwvZGl2PixcbiAgICBpbmZvXG4gICk7XG59XG5cbmZ1bmN0aW9uIGVycm9yTWVzc2FnZShtZXNzYWdlKSB7XG4gIG1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VyZWQnO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY21hcC1pbmZvJykuaW5uZXJIVE1MID0gbWVzc2FnZTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNtYXAtc2lkZWJhcicpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY21hcC1sYXllci1zZWxlY3RvcicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jbWFwLXR5cGUtc2VsZWN0b3InKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xufVxuIiwiLy8gaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0Jztcbi8vIGltcG9ydCB7IHJlbmRlciB9IGZyb20gJ3JlYWN0LWRvbSc7XG5cbmltcG9ydCB7IHJlbmRlciBhcyBjaGFuZ2VzZXRNYXAgfSBmcm9tICcuLi9saWIvcmVuZGVyJztcblxuLy8gcmVuZGVyKFxuLy8gICA8ZGl2PlxuLy8gICAgIDxoMSAvPlxuLy8gICA8L2Rpdj4sXG4vLyAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyb290Jylcbi8vICk7XG5cbnZhciBjTWFwO1xuXG52YXIgY29udGFpbmVyV2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCArICdweCc7XG52YXIgY29udGFpbmVySGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0ICsgJ3B4JztcblxuaWYgKGxvY2F0aW9uLmhhc2ggIT09ICcnKSB7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb3JtQ29udGFpbmVyJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgdmFyIGlkID0gbG9jYXRpb24uaGFzaC5zcGxpdCgnLycpWzBdLnJlcGxhY2UoJyMnLCAnJyk7XG4gIHZhciBbLCBnZW9tZXRyeVR5cGUsIGZlYXR1cmVJZF0gPSBsb2NhdGlvbi5oYXNoLnNwbGl0KCcvJyk7XG4gIGNNYXAgPSBjaGFuZ2VzZXRNYXAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRhaW5lcicpLCBpZCwge1xuICAgIHdpZHRoOiBjb250YWluZXJXaWR0aCxcbiAgICBoZWlnaHQ6IGNvbnRhaW5lckhlaWdodFxuICB9KTtcbiAgY01hcC5vbignbG9hZCcsIGZ1bmN0aW9uKCkge1xuICAgIGNNYXAuZW1pdCgnc2VsZWN0RmVhdHVyZScsIGdlb21ldHJ5VHlwZSwgZmVhdHVyZUlkKTtcbiAgfSk7XG59XG5cbmRvY3VtZW50XG4gIC5nZXRFbGVtZW50QnlJZCgnY2hhbmdlc2V0Rm9ybScpXG4gIC5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBmdW5jdGlvbihlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb3JtQ29udGFpbmVyJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB2YXIgY2hhbmdlc2V0SUQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhbmdlc2V0SW5wdXQnKS52YWx1ZTtcbiAgICBsb2NhdGlvbi5oYXNoID0gY2hhbmdlc2V0SUQ7XG4gICAgY01hcCA9IGNoYW5nZXNldE1hcChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyJyksIGNoYW5nZXNldElELCB7XG4gICAgICBoYXNoOiBsb2NhdGlvbi5oYXNoLFxuICAgICAgd2lkdGg6IGNvbnRhaW5lcldpZHRoLFxuICAgICAgaGVpZ2h0OiBjb250YWluZXJIZWlnaHRcbiAgICB9KTtcbiAgfSk7XG5cbmNNYXAub24oJ2ZlYXR1cmVDaGFuZ2UnLCBmdW5jdGlvbihnZW9tZXRyeVR5cGUsIGZlYXR1cmVJZCkge1xuICBjbGVhckhhc2goKTtcbiAgaWYgKGdlb21ldHJ5VHlwZSAmJiBmZWF0dXJlSWQpIHtcbiAgICB1cGRhdGVIYXNoKGdlb21ldHJ5VHlwZSwgZmVhdHVyZUlkKTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIHVwZGF0ZUhhc2gob3NtVHlwZSwgZmVhdHVyZUlkKSB7XG4gIGNsZWFySGFzaCgpO1xuXG4gIGxvY2F0aW9uLmhhc2ggKz0gJy8nICsgb3NtVHlwZTtcbiAgbG9jYXRpb24uaGFzaCArPSAnLycgKyBmZWF0dXJlSWQ7XG59XG5cbmZ1bmN0aW9uIGNsZWFySGFzaCgpIHtcbiAgdmFyIGNoYW5nZXNldElkID0gbG9jYXRpb24uaGFzaC5zcGxpdCgnLycpWzBdLnJlcGxhY2UoJyMnLCAnJyk7XG5cbiAgbG9jYXRpb24uaGFzaCA9IGNoYW5nZXNldElkO1xufVxuIl0sIm5hbWVzIjpbInJlcXVpcmUiLCJnbG9iYWwiLCJfcHJvZEludmFyaWFudCIsIkRPTVByb3BlcnR5IiwiUmVhY3RET01Db21wb25lbnRGbGFncyIsImVtcHR5RnVuY3Rpb24iLCJSZWFjdEVycm9yVXRpbHMiLCJFdmVudFBsdWdpblV0aWxzIiwiRXZlbnRQbHVnaW5SZWdpc3RyeSIsImFjY3VtdWxhdGVJbnRvIiwiZm9yRWFjaEFjY3VtdWxhdGVkIiwiRXZlbnRQbHVnaW5IdWIiLCJFeGVjdXRpb25FbnZpcm9ubWVudCIsIl9hc3NpZ24iLCJnZXRUZXh0Q29udGVudEFjY2Vzc29yIiwiUG9vbGVkQ2xhc3MiLCJTeW50aGV0aWNFdmVudCIsIkZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZSIsIlN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQiLCJFdmVudFByb3BhZ2F0b3JzIiwiU3ludGhldGljSW5wdXRFdmVudCIsIlJlYWN0T3duZXIiLCJSZWFjdFJlZiIsIkNhbGxiYWNrUXVldWUiLCJSZWFjdEZlYXR1cmVGbGFncyIsIlJlYWN0UmVjb25jaWxlciIsIlJlYWN0RE9NQ29tcG9uZW50VHJlZSIsImV2ZW50VHlwZXMiLCJpc0V2ZW50U3VwcG9ydGVkIiwiZ2V0RXZlbnRUYXJnZXQiLCJSZWFjdFVwZGF0ZXMiLCJpbnB1dFZhbHVlVHJhY2tpbmciLCJpc1RleHRJbnB1dEVsZW1lbnQiLCJnZXRFdmVudE1vZGlmaWVyU3RhdGUiLCJWaWV3cG9ydE1ldHJpY3MiLCJTeW50aGV0aWNVSUV2ZW50IiwiU3ludGhldGljTW91c2VFdmVudCIsImNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24iLCJET01OYW1lc3BhY2VzIiwic2V0SW5uZXJIVE1MIiwiZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyIiwic2V0VGV4dENvbnRlbnQiLCJpbnZhcmlhbnQiLCJkdW1teU5vZGUiLCJnZXRNYXJrdXBXcmFwIiwiY3JlYXRlQXJyYXlGcm9tTWl4ZWQiLCJjcmVhdGVOb2Rlc0Zyb21NYXJrdXAiLCJET01MYXp5VHJlZSIsIkRhbmdlciIsIkRPTUNoaWxkcmVuT3BlcmF0aW9ucyIsIlJlYWN0RE9NSURPcGVyYXRpb25zIiwiZm9jdXNOb2RlIiwiaXNVbml0bGVzc051bWJlciIsIkNTU1Byb3BlcnR5IiwibXNQYXR0ZXJuIiwiaHlwaGVuYXRlIiwibWVtb2l6ZVN0cmluZ09ubHkiLCJoeXBoZW5hdGVTdHlsZU5hbWUiLCJkYW5nZXJvdXNTdHlsZVZhbHVlIiwicXVvdGVBdHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXIiLCJnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSIsIlJlYWN0RXZlbnRFbWl0dGVyTWl4aW4iLCJSZWFjdFByb3BUeXBlc1NlY3JldCIsIndhcm5pbmciLCJjaGVja1Byb3BUeXBlcyIsImZhY3RvcnkiLCJyZWFjdFByb2RJbnZhcmlhbnQiLCJlbXB0eU9iamVjdCIsIlJlYWN0Tm9vcFVwZGF0ZVF1ZXVlIiwib25lQXJndW1lbnRQb29sZXIiLCJ0d29Bcmd1bWVudFBvb2xlciIsInRocmVlQXJndW1lbnRQb29sZXIiLCJmb3VyQXJndW1lbnRQb29sZXIiLCJzdGFuZGFyZFJlbGVhc2VyIiwiREVGQVVMVF9QT09MX1NJWkUiLCJERUZBVUxUX1BPT0xFUiIsImFkZFBvb2xpbmdUbyIsImhhc093blByb3BlcnR5IiwiUkVTRVJWRURfUFJPUFMiLCJSRUFDVF9FTEVNRU5UX1RZUEUiLCJSZWFjdEN1cnJlbnRPd25lciIsIktleUVzY2FwZVV0aWxzIiwiZ2V0SXRlcmF0b3JGbiIsInRyYXZlcnNlQWxsQ2hpbGRyZW4iLCJSZWFjdEVsZW1lbnQiLCJ0b0FycmF5IiwiX3JlcXVpcmUiLCJfaW52YXJpYW50IiwiaXNWYWxpZEVsZW1lbnQiLCJfcmVxdWlyZTIiLCJSZWFjdENoaWxkcmVuIiwib25seUNoaWxkIiwiY3JlYXRlUmVhY3RDbGFzcyIsIlJlYWN0RE9NRmFjdG9yaWVzIiwicHJvcFR5cGVzRmFjdG9yeSIsIlJlYWN0IiwiZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtIiwiTGlua2VkVmFsdWVVdGlscyIsIkRPTVByb3BlcnR5T3BlcmF0aW9ucyIsImRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSIsIl9oYW5kbGVDaGFuZ2UiLCJSZWFjdERPTVNlbGVjdCIsImZvcmNlVXBkYXRlSWZNb3VudGVkIiwiUmVhY3RJbnN0YW5jZU1hcCIsIlJlYWN0Tm9kZVR5cGVzIiwic2hhbGxvd0VxdWFsIiwic2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQiLCJSZWFjdENvbXBvbmVudEVudmlyb25tZW50IiwiUmVhY3RFbXB0eUNvbXBvbmVudCIsIlJlYWN0SG9zdENvbXBvbmVudCIsIlJlYWN0Q29tcG9zaXRlQ29tcG9uZW50IiwiZXNjYXBlIiwidW5lc2NhcGUiLCJJVEVSQVRPUl9TWU1CT0wiLCJGQVVYX0lURVJBVE9SX1NZTUJPTCIsIlNFUEFSQVRPUiIsIlNVQlNFUEFSQVRPUiIsImdldENvbXBvbmVudEtleSIsInRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsIiwiaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudCIsImZsYXR0ZW5DaGlsZHJlbiIsIlJlYWN0Q2hpbGRSZWNvbmNpbGVyIiwiZW5xdWV1ZVVwZGF0ZSIsIl9jbGFzc0NhbGxDaGVjayIsIndhcm5Ob29wIiwiUmVhY3RVcGRhdGVRdWV1ZSIsIlRSQU5TQUNUSU9OX1dSQVBQRVJTIiwiUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZSIsIkZsYWdzIiwiUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyIiwiUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbiIsIlJlYWN0RE9NSW5wdXQiLCJSZWFjdERPTVRleHRhcmVhIiwiUmVhY3RET01PcHRpb24iLCJBdXRvRm9jdXNVdGlscyIsIkNTU1Byb3BlcnR5T3BlcmF0aW9ucyIsIlJlYWN0TXVsdGlDaGlsZCIsImdldFVuYm91bmRlZFNjcm9sbFBvc2l0aW9uIiwiRXZlbnRMaXN0ZW5lciIsImdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQiLCJpc05vZGUiLCJpc1RleHROb2RlIiwiY29udGFpbnNOb2RlIiwiZ2V0QWN0aXZlRWxlbWVudCIsIlJlYWN0RE9NU2VsZWN0aW9uIiwiUmVhY3RJbnB1dFNlbGVjdGlvbiIsIk1peGluIiwiYWN0aXZlRWxlbWVudCIsImFjdGl2ZUVsZW1lbnRJbnN0IiwiZ2V0RXZlbnRDaGFyQ29kZSIsImdldEV2ZW50S2V5IiwiZ2V0RGljdGlvbmFyeUtleSIsImlzSW50ZXJhY3RpdmUiLCJTeW50aGV0aWNLZXlib2FyZEV2ZW50IiwiU3ludGhldGljRm9jdXNFdmVudCIsIlN5bnRoZXRpY0RyYWdFdmVudCIsIlN5bnRoZXRpY1RvdWNoRXZlbnQiLCJTeW50aGV0aWNBbmltYXRpb25FdmVudCIsIlN5bnRoZXRpY1RyYW5zaXRpb25FdmVudCIsIlN5bnRoZXRpY1doZWVsRXZlbnQiLCJTeW50aGV0aWNDbGlwYm9hcmRFdmVudCIsIlJlYWN0SW5qZWN0aW9uIiwiUmVhY3RFdmVudExpc3RlbmVyIiwiRGVmYXVsdEV2ZW50UGx1Z2luT3JkZXIiLCJTaW1wbGVFdmVudFBsdWdpbiIsIkVudGVyTGVhdmVFdmVudFBsdWdpbiIsIkNoYW5nZUV2ZW50UGx1Z2luIiwiU2VsZWN0RXZlbnRQbHVnaW4iLCJCZWZvcmVJbnB1dEV2ZW50UGx1Z2luIiwiUmVhY3RET01Db21wb25lbnQiLCJSZWFjdERPTVRleHRDb21wb25lbnQiLCJBUklBRE9NUHJvcGVydHlDb25maWciLCJIVE1MRE9NUHJvcGVydHlDb25maWciLCJTVkdET01Qcm9wZXJ0eUNvbmZpZyIsIlJlYWN0RE9NRW1wdHlDb21wb25lbnQiLCJSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uIiwiUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneSIsIlJlYWN0Q29tcG9uZW50QnJvd3NlckVudmlyb25tZW50IiwiRE9DX05PREVfVFlQRSIsImFkbGVyMzIiLCJBVFRSX05BTUUiLCJFTEVNRU5UX05PREVfVFlQRSIsIkRPQ1VNRU5UX0ZSQUdNRU5UX05PREVfVFlQRSIsIlJlYWN0RE9NQ29udGFpbmVySW5mbyIsIlJlYWN0RE9NRmVhdHVyZUZsYWdzIiwiUmVhY3RNYXJrdXBDaGVja3N1bSIsImdldEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlIiwiUmVhY3RNb3VudCIsImZpbmRET01Ob2RlIiwiUmVhY3RWZXJzaW9uIiwicmVxdWlyZSQkMCIsIm1hcCIsImtleXMiLCJ0b1N0cmluZyIsImlkZW50aXR5IiwiaXMiLCJyZXF1aXJlJCQxIiwicmVxdWlyZSQkMiIsInJlcXVpcmUkJDMiLCJyZXF1aXJlJCQ0IiwicmVxdWlyZSQkNSIsInJlcXVpcmUkJDYiLCJyZXF1aXJlJCQ3IiwicmVxdWlyZSQkOCIsInJlcXVpcmUkJDkiLCJyZXF1aXJlJCQxMCIsInJlcXVpcmUkJDExIiwicmVxdWlyZSQkMTIiLCJyZXF1aXJlJCQxMyIsInJlcXVpcmUkJDE0IiwicmVxdWlyZSQkMTUiLCJyZXF1aXJlJCQxNiIsInJlcXVpcmUkJDE3IiwicmVxdWlyZSQkMTgiLCJyZXF1aXJlJCQxOSIsInJlcXVpcmUkJDIwIiwicmVxdWlyZSQkMjEiLCJyZXF1aXJlJCQyMiIsInJlcXVpcmUkJDIzIiwicmVxdWlyZSQkMjQiLCJyZXF1aXJlJCQyNSIsInJlcXVpcmUkJDI2IiwicmVxdWlyZSQkMjciLCJyZXF1aXJlJCQyOCIsInJlcXVpcmUkJDI5IiwicmVxdWlyZSQkMzAiLCJyZXF1aXJlJCQzMSIsInJlcXVpcmUkJDMyIiwicmVxdWlyZSQkMzMiLCJyZXF1aXJlJCQzNCIsInJlcXVpcmUkJDM1IiwicmVxdWlyZSQkMzYiLCJyZXF1aXJlJCQzNyIsInJlcXVpcmUkJDM4IiwicmVxdWlyZSQkMzkiLCJyZXF1aXJlJCQ0MCIsInJlcXVpcmUkJDQxIiwicmVxdWlyZSQkNDIiLCJyZXF1aXJlJCQ0MyIsInJlcXVpcmUkJDQ0IiwicmVxdWlyZSQkNDUiLCJyZXF1aXJlJCQ0NiIsInJlcXVpcmUkJDQ3IiwicmVxdWlyZSQkNDgiLCJyZXF1aXJlJCQ0OSIsInJlcXVpcmUkJDUwIiwicmVxdWlyZSQkNTEiLCJyZXF1aXJlJCQ1MiIsInJlcXVpcmUkJDUzIiwicmVxdWlyZSQkNTQiLCJyZXF1aXJlJCQ1NSIsInJlcXVpcmUkJDU2IiwicmVxdWlyZSQkNTciLCJyZXF1aXJlJCQ1OCIsInJlcXVpcmUkJDU5IiwicmVxdWlyZSQkNjAiLCJyZXF1aXJlJCQ2MSIsInJlcXVpcmUkJDYyIiwicmVxdWlyZSQkNjMiLCJyZXF1aXJlJCQ2NCIsInJlcXVpcmUkJDY1IiwicmVxdWlyZSQkNjYiLCJyZXF1aXJlJCQ2NyIsInJlcXVpcmUkJDY4IiwicmVxdWlyZSQkNjkiLCJyZXF1aXJlJCQ3MCIsInJlcXVpcmUkJDcxIiwicmVxdWlyZSQkNzIiLCJyZXF1aXJlJCQ3MyIsInJlcXVpcmUkJDc0IiwicmVxdWlyZSQkNzUiLCJyZXF1aXJlJCQ3NiIsInJlcXVpcmUkJDc3IiwicmVxdWlyZSQkNzgiLCJyZXF1aXJlJCQ3OSIsInJlcXVpcmUkJDgwIiwicmVxdWlyZSQkODEiLCJyZXF1aXJlJCQ4MiIsInJlcXVpcmUkJDgzIiwicmVxdWlyZSQkODQiLCJyZXF1aXJlJCQ4NSIsInJlcXVpcmUkJDg2IiwicmVxdWlyZSQkODciLCJyZXF1aXJlJCQ4OCIsInJlcXVpcmUkJDg5IiwicmVxdWlyZSQkOTAiLCJyZXF1aXJlJCQ5MSIsInJlcXVpcmUkJDkyIiwicmVxdWlyZSQkOTMiLCJyZXF1aXJlJCQ5NCIsInJlcXVpcmUkJDk1IiwicmVxdWlyZSQkOTYiLCJyZXF1aXJlJCQ5NyIsInJlcXVpcmUkJDk4IiwicmVxdWlyZSQkOTkiLCJyZXF1aXJlJCQxMDAiLCJyZXF1aXJlJCQxMDEiLCJyZXF1aXJlJCQxMDIiLCJyZXF1aXJlJCQxMDMiLCJyZXF1aXJlJCQxMDQiLCJyZXF1aXJlJCQxMDUiLCJyZXF1aXJlJCQxMDYiLCJyZXF1aXJlJCQxMDciLCJyZXF1aXJlJCQxMDgiLCJyZXF1aXJlJCQxMDkiLCJyZXF1aXJlJCQxMTAiLCJyZXF1aXJlJCQxMTEiLCJyZXF1aXJlJCQxMTIiLCJyZXF1aXJlJCQxMTMiLCJyZXF1aXJlJCQxMTQiLCJyZXF1aXJlJCQxMTUiLCJyZXF1aXJlJCQxMTYiLCJyZXF1aXJlJCQxMTciLCJyZXF1aXJlJCQxMTgiLCJyZXF1aXJlJCQxMTkiLCJyZXF1aXJlJCQxMjAiLCJyZXF1aXJlJCQxMjEiLCJyZXF1aXJlJCQxMjIiLCJyZXF1aXJlJCQxMjMiLCJyZXF1aXJlJCQxMjQiLCJyZXF1aXJlJCQxMjUiLCJyZXF1aXJlJCQxMjYiLCJyZXF1aXJlJCQxMjciLCJyZXF1aXJlJCQxMjgiLCJyZXF1aXJlJCQxMjkiLCJyZXF1aXJlJCQxMzAiLCJyZXF1aXJlJCQxMzEiLCJyZXF1aXJlJCQxMzIiLCJyZXF1aXJlJCQxMzMiLCJyZXF1aXJlJCQxMzQiLCJyZXF1aXJlJCQxMzUiLCJyZXF1aXJlJCQxMzYiLCJyZXF1aXJlJCQxMzciLCJyZXF1aXJlJCQxMzgiLCJyZXF1aXJlJCQxMzkiLCJyZXF1aXJlJCQxNDAiLCJyZXF1aXJlJCQxNDEiLCJyZXF1aXJlJCQxNDIiLCJyZXF1aXJlJCQxNDMiLCJyZXF1aXJlJCQxNDQiLCJyZXF1aXJlJCQxNDUiLCJyZXF1aXJlJCQxNDYiLCJyZXF1aXJlJCQxNDciLCJyZXF1aXJlJCQxNDgiLCJyZXF1aXJlJCQxNDkiLCJyZXF1aXJlJCQxNTAiLCJyZXF1aXJlJCQxNTEiLCJyZXF1aXJlJCQxNTIiLCJyZXF1aXJlJCQxNTMiLCJyZXF1aXJlJCQxNTQiLCJyZXF1aXJlJCQxNTUiLCJyZXF1aXJlJCQxNTYiLCJyZXF1aXJlJCQxNTciLCJyZXF1aXJlJCQxNTgiLCJyZXF1aXJlJCQxNTkiLCJyZXF1aXJlJCQxNjAiLCJyZXF1aXJlJCQxNjEiLCJyZXF1aXJlJCQxNjIiLCJyZXF1aXJlJCQxNjMiLCJyZXF1aXJlJCQxNjQiLCJyZXF1aXJlJCQxNjUiLCJyZXF1aXJlJCQxNjYiLCJyZXF1aXJlJCQxNjciLCJyZXF1aXJlJCQxNjgiLCJyZXF1aXJlJCQxNjkiLCJyZXF1aXJlJCQxNzAiLCJyZXF1aXJlJCQxNzEiLCJyZXF1aXJlJCQxNzIiLCJyZXF1aXJlJCQxNzMiLCJyZXF1aXJlJCQxNzQiLCJyZXF1aXJlJCQxNzUiLCJyZXF1aXJlJCQxNzYiLCJyZXF1aXJlJCQxNzciLCJyZXF1aXJlJCQxNzgiLCJyZXF1aXJlJCQxNzkiLCJyZXF1aXJlJCQxODAiLCJyZXF1aXJlJCQxODEiLCJyZXF1aXJlJCQxODIiLCJyZXF1aXJlJCQxODMiLCJyZXF1aXJlJCQxODQiLCJyZXF1aXJlJCQxODUiLCJyZXF1aXJlJCQxODYiLCJyZXF1aXJlJCQxODciLCJyZXF1aXJlJCQxODgiLCJyZXF1aXJlJCQxODkiLCJyZXF1aXJlJCQxOTAiLCJyZXF1aXJlJCQxOTEiLCJyZXF1aXJlJCQxOTIiLCJyZXF1aXJlJCQxOTMiLCJyZXF1aXJlJCQxOTQiLCJyZXF1aXJlJCQxOTUiLCJyZXF1aXJlJCQxOTYiLCJyZXF1aXJlJCQxOTciLCJyZXF1aXJlJCQxOTgiLCJyZXF1aXJlJCQxOTkiLCJyZXF1aXJlJCQyMDAiLCJyZXF1aXJlJCQyMDEiLCJyZXF1aXJlJCQyMDIiLCJyZXF1aXJlJCQyMDMiLCJyZXF1aXJlJCQyMDQiLCJyZXF1aXJlJCQyMDUiLCJyZXF1aXJlJCQyMDYiLCJyZXF1aXJlJCQyMDciLCJyZXF1aXJlJCQyMDgiLCJyZXF1aXJlJCQyMDkiLCJyZXF1aXJlJCQyMTAiLCJyZXF1aXJlJCQyMTEiLCJyZXF1aXJlJCQyMTIiLCJyZXF1aXJlJCQyMTMiLCJyZXF1aXJlJCQyMTQiLCJyZXF1aXJlJCQyMTUiLCJyZXF1aXJlJCQyMTYiLCJyZXF1aXJlJCQyMTciLCJyZXF1aXJlJCQyMTgiLCJyZXF1aXJlJCQyMTkiLCJyZXF1aXJlJCQyMjAiLCJyZXF1aXJlJCQyMjEiLCJyZXF1aXJlJCQyMjIiLCJyZXF1aXJlJCQyMjMiLCJyZXF1aXJlJCQyMjQiLCJyZXF1aXJlJCQyMjUiLCJyZXF1aXJlJCQyMjYiLCJyZXF1aXJlJCQyMjciLCJyZXF1aXJlJCQyMjgiLCJyZXF1aXJlJCQyMjkiLCJyZXF1aXJlJCQyMzAiLCJyZXF1aXJlJCQyMzEiLCJyZXF1aXJlJCQyMzIiLCJyZXF1aXJlJCQyMzMiLCJyZXF1aXJlJCQyMzQiLCJyZXF1aXJlJCQyMzUiLCJyZXF1aXJlJCQyMzYiLCJyZXF1aXJlJCQyMzciLCJpbml0IiwicmVhZCIsIndyaXRlIiwiYmFzZTY0LmZyb21CeXRlQXJyYXkiLCJpZWVlNzU0LnJlYWQiLCJpZWVlNzU0LndyaXRlIiwiYmFzZTY0LnRvQnl0ZUFycmF5IiwiaXNBcnJheSIsIkJ1ZmZlckxpc3QiLCJSZWFkYWJsZSIsImluaGVyaXRzIiwibGlzdGVuZXJDb3VudCIsIkR1cGxleCIsIkJ1ZmZlci5pc0J1ZmZlciIsImluZGV4T2YiLCJmb3JFYWNoIiwiV3JpdGFibGUiLCJUcmFuc2Zvcm0iLCJQYXNzVGhyb3VnaCIsIlN0cmVhbSIsIkVFIiwiUiIsInBvbHlnb24iLCJ0aGlzIiwidHVyZiIsImFrIiwiY3JlYXRlQmJveFBvbHlnb24iLCJjcmVhdGVCYm94IiwiZWxlbWVudFBhcnNlciIsImNvbmZpZyIsInF1ZXJ5IiwiY2hhbmdlc2V0SUQiLCJ1cmwiLCJvc21CYXNlIiwib3B0aW9ucyIsImZldGNoIiwidGhlbiIsInIiLCJ0ZXh0IiwicGFyc2VyIiwiRE9NUGFyc2VyIiwieG1sIiwicGFyc2VGcm9tU3RyaW5nIiwiZSIsImNzRmVhdHVyZSIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiY3MiLCJhdHRyaWJ1dGVzIiwidWlkIiwidGV4dENvbnRlbnQiLCJ1c2VyIiwiZnJvbSIsIm1vbWVudCIsImNyZWF0ZWRfYXQiLCJzdWJ0cmFjdCIsImZvcm1hdCIsInRvIiwiY2xvc2VkX2F0IiwibGVmdCIsIm1pbl9sb24iLCJib3R0b20iLCJtaW5fbGF0IiwicmlnaHQiLCJtYXhfbG9uIiwidG9wIiwibWF4X2xhdCIsIngiLCJnZXRDaGFuZ2VzZXQiLCJvdmVycGFzc0Jhc2UiLCJTM19VUkwiLCJvayIsImpzb24iLCJQcm9taXNlIiwicmVqZWN0IiwiZ2VvanNvbiIsImpzb25QYXJzZXIiLCJmZWF0dXJlTWFwIiwiZ2V0RmVhdHVyZU1hcCIsInJldCIsImNoYW5nZXNldCIsImNhdGNoIiwiZmV0Y2hGcm9tT3ZlclBhc3MiLCJkYXRhIiwiZ2V0RGF0YVBhcmFtIiwiYmJveCIsImdldEJib3hQYXJhbSIsInJlcyIsInJlaiIsInJlc3BvbnNlIiwiZXJyIiwiYyIsImpvaW4iLCJmZWF0dXJlcyIsImkiLCJsZW4iLCJsZW5ndGgiLCJpZCIsInByb3BlcnRpZXMiLCJwdXNoIiwiZmVhdHVyZSIsInBvaW50IiwibGluZVN0cmluZyIsIm11bHRpUG9pbnQiLCJtdWx0aUxpbmVTdHJpbmciLCJtdWx0aVBvbHlnb24iLCJpc051bWJlciIsImZlYXR1cmVDb2xsZWN0aW9uIiwiZ2VvbWV0cnlDb2xsZWN0aW9uIiwiZmFjdG9ycyIsInJhZGlhbnNUb0Rpc3RhbmNlIiwiZGlzdGFuY2VUb1JhZGlhbnMiLCJkaXN0YW5jZVRvRGVncmVlcyIsInR1cmZIZWxwZXJzIiwiZ2V0Qm91bmRzIiwibWFwYm94Z2wiLCJMbmdMYXRCb3VuZHMiLCJMbmdMYXQiLCJnZXRCb3VuZGluZ0JveCIsImJvdW5kcyIsImdldFdlc3QiLCJnZXRFYXN0IiwiZ2V0Tm9ydGgiLCJnZXRTb3V0aCIsInBhZFgiLCJwYWRZIiwiTWF0aCIsIm1heCIsImJib3hQb2x5Z29uIiwidHVyZkJib3hQb2x5Z29uIiwiZ2V0RmVhdHVyZXMiLCJPYmplY3QiLCJpdGVtIiwicHJvY2Vzc0ZlYXR1cmVzIiwiZmluYWxSZXBvcnQiLCJNYXAiLCJhbmFseXplZEZlYXR1cmVzIiwiYW5hbHl6ZUZlYXR1cmUiLCJnZXQiLCJrZXkiLCJ0YWciLCJzZXQiLCJjb25jYXQiLCJuZXdWZXJzaW9uIiwib2xkVmVyc2lvbiIsIm9sZFZlcnNpb25LZXlzIiwidGFncyIsIm5ld1ZlcnNpb25LZXlzIiwiYWRkZWRUYWdzIiwiZmlsdGVyIiwiZGVsZXRlZFRhZ3MiLCJjaGFuZ2VkVmFsdWVzIiwicmVzdWx0Iiwic2VsZWN0RmVhdHVyZSIsImNtYXAiLCJlbWl0IiwiRmVhdHVyZUxpc3RJdGVtIiwicHJvcHMiLCJDaGFuZ2VJdGVtIiwic3RhdGUiLCJjaGFuZ2UiLCJ2YWx1ZSIsImhhbmRsZUNoYW5nZSIsImJpbmQiLCJzZXRTdGF0ZSIsIm9wZW5lZCIsImsiLCJQdXJlQ29tcG9uZW50IiwiU2lkZWJhciIsImNoYW5nZVJlcG9ydCIsImNoYW5nZWRGZWF0dXJlcyIsImFjdGlvbiIsImZlYXR1cmVJRHMiLCJ0b2dnbGVVc2VyIiwidG9nZ2xlQWN0aW9ucyIsInRvZ2dsZVR5cGUiLCJ0b2dnbGVDaGFuZ2VzIiwidG9nZ2xlTWFwU3R5bGUiLCJhY3Rpb25zIiwidHlwZSIsImNoYW5nZXMiLCJtYXBTdHlsZSIsImNoYW5nZXNldElkIiwiZmlsdGVyTGF5ZXJzIiwiZGF0ZSIsIkRhdGUiLCJjZW50ZXIiLCJnZXRDZW50ZXIiLCJ1c2VyTmFtZSIsInVzZXJJZCIsImZyb21Ob3ciLCJsYXQiLCJsbmciLCJkaXNwbGF5Iiwic29ydCIsInRvZ2dsZUxheWVyIiwicHJvcHNEaWZmIiwicHJvcHNBcnJheSIsImNoYW5nZVR5cGUiLCJnZXRBZGRlZCIsIkVycm9yIiwib2xkUHJvcHMiLCJnZXRPbGQiLCJuZXdQcm9wcyIsImdldE5ldyIsImdldERpZmYiLCJwcm9wIiwib2xkVmFsdWUiLCJuZXdWYWx1ZSIsIm9sZFByb3AiLCJxdWV1ZSIsImxheWVyc0tleSIsImFkZGVkIiwid2F5cyIsIm5vZGVzIiwicmVsYXRpb25zIiwibW9kaWZpZWQiLCJkZWxldGVkIiwic2VsZWN0ZWRBY3Rpb25zIiwic2VsZWN0ZWRUeXBlcyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJjaGVja2VkRWxlbWVudCIsImxheWVycyIsImlzU2VsZWN0ZWRBY3Rpb24iLCJyZWR1Y2UiLCJhY2N1bSIsImxheWVyIiwiaXNTZWxlY3RlZFR5cGUiLCJzZXRMYXlvdXRQcm9wZXJ0eSIsInJlbW92ZSIsIm1hcExvYWRlZCIsInVuZGVmaW5lZCIsImdldFNvdXJjZSIsInNldERhdGEiLCJhZGRTb3VyY2UiLCJhZGRMYXllciIsImJhc2VMYXllciIsIm9sZEJhc2VMYXllciIsInNldFN0eWxlIiwiYmFzZUxheWVyRGF0YSIsImFkZE1hcFNvdXJjZSIsImZpdEJvdW5kcyIsImxpbmVhciIsInBhZGRpbmciLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJvbiIsImxvZyIsImFkZE1hcExheWVycyIsImluZGV4IiwieDF5MSIsInkiLCJ4MnkyIiwicXVlcnlSZW5kZXJlZEZlYXR1cmVzIiwiY2xlYXJGZWF0dXJlIiwiZmVhdHVyZUlkIiwib3NtVHlwZSIsImhpZ2hsaWdodEZlYXR1cmUiLCJzZXRGaWx0ZXIiLCJjbGVhckhpZ2hsaWdodCIsImRpc3BsYXlEaWZmIiwiZmVhdHVyZXNXaXRoSWQiLCJtZXRhZGF0YVByb3BzIiwiZiIsImFzc2lnbiIsInRhZ3NDb3VudCIsInRhZ1Byb3BzIiwibWV0YWRhdGFIZWFkZXIiLCJlbHQiLCJjbGFzcyIsInRvVXBwZXJDYXNlIiwibWV0YWRhdGFIVE1MIiwiZ2V0RGlmZkhUTUwiLCJ0YWdIZWFkZXIiLCJ0YWdIVE1MIiwic3R5bGUiLCJpbm5lckhUTUwiLCJhcHBlbmRDaGlsZCIsImNsZWFyRGlmZiIsImRpZmYiLCJpZ25vcmVMaXN0IiwiaGVhZGVyIiwiaXNBZGRlZEZlYXR1cmUiLCJyb290Iiwid2lkdGgiLCJ0Ym9keSIsInR5cGVzIiwic29ydGVkUHJvcHMiLCJrZXlBIiwia2V5QiIsImluZGV4QSIsImluZGV4QiIsInRyIiwidGgiLCJ0aXRsZSIsInByb3BDbGFzcyIsImVtcHR5Iiwib3NtY2hhX2xpbmsiLCJ0ZCIsImNsb25lTm9kZSIsIm5hbWUiLCJub2RlIiwiY3JlYXRlRWxlbWVudCIsImF0dHIiLCJzZXRBdHRyaWJ1dGUiLCJhcmd1bWVudHMiLCJjaGlsZCIsImNyZWF0ZVRleHROb2RlIiwiZXZlbnRzIiwid2luZG93IiwicmVuZGVyIiwiY29udGFpbmVyIiwiaGVpZ2h0IiwiYWNjZXNzVG9rZW4iLCJtYXBib3hBY2Nlc3NUb2tlbiIsImNsYXNzTGlzdCIsImFkZCIsIkdsTWFwIiwiZGlzYWJsZVNpZGViYXIiLCJfcmVuZGVyIiwibXNnIiwicmVuZGVyTWFwIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwiZ2VvbWV0cnlUeXBlIiwicmVuZGVySFRNTCIsImluZm8iLCJnZXRFbGVtZW50QnlJZCIsInRhcmdldCIsImVycm9yTWVzc2FnZSIsIm1lc3NhZ2UiLCJjTWFwIiwiY29udGFpbmVyV2lkdGgiLCJpbm5lcldpZHRoIiwiY29udGFpbmVySGVpZ2h0IiwiaW5uZXJIZWlnaHQiLCJsb2NhdGlvbiIsImhhc2giLCJzcGxpdCIsInJlcGxhY2UiLCJjaGFuZ2VzZXRNYXAiLCJhZGRFdmVudExpc3RlbmVyIiwicHJldmVudERlZmF1bHQiLCJ1cGRhdGVIYXNoIiwiY2xlYXJIYXNoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQUFBRyxBQUFzRCxBQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFBLENBQUMsQUFBc08sQ0FBQyxFQUFFLFVBQVUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU9BLGVBQU8sRUFBRSxVQUFVLEVBQUVBLGVBQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPQSxlQUFPLEVBQUUsVUFBVSxFQUFFQSxlQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQy8wQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUN6c0osQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3pDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxPQUFPLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDMTZGLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN6QyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUMvN0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3pDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDO0NBQzd6QixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDekMsWUFBWSxDQUFDLFNBQVMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFBLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztDQUMvaE4sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3pDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsY0FBYyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FB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Q0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztDQUNodkMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDdkQsWUFBWSxDQUFDLFNBQVMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxtQkFBbUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsaUJBQWlCLEdBQUcsQ0FBQyxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEtBQUssR0FBRyxjQUFjLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLENBQUMsR0FBRyxvQkFBb0IsR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0NBQzlrRCxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3hFLFlBQVksQ0FBQyxTQUFTLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7Q0FDL2UsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLFlBQVksQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQywyREFBMkQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFBLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUNuckgsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzRyxZQUFZLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUEsQ0FBQyxDQUFDLFNBQVMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO0NBQzljLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7Q0FDL2pDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxZQUFZLENBQUMsU0FBUyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO0NBQ3pnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsWUFBWSxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0NBQ2hzQixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ25FLFlBQVksQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxZQUFZLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsS0FBSyw2REFBNkQsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7Q0FDMTZFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQztDQUNoM0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLFlBQVksQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDbnVCLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNoRixZQUFZLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0NBQ2xjLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxZQUFZLENBQUMsU0FBUyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLFNBQVMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztDQUN4d0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLFlBQVksQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztDQUNwZixDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsbUJBQW1CLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLGVBQWUsRUFBRSxFQUFFLGlCQUFpQixFQUFFLEVBQUUsNEJBQTRCLEVBQUUsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxTQUFTLFNBQVMsRUFBRSxDQUFDLE1BQU0sV0FBVyxFQUFFLE9BQU8sTUFBTSxFQUFFLFdBQVcsRUFBRSxPQUFPLFFBQVEsQ0FBQyxTQUFTLGdCQUFnQixFQUFFLENBQUMsT0FBTyxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxtQkFBbUIsRUFBRSxDQUFDLE9BQU8sUUFBUSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLGlCQUFpQixFQUFFLENBQUMsT0FBTyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLHdCQUF3QixFQUFFLE1BQU0sQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsaUJBQWlCLENBQUMsU0FBUyxlQUFlLEVBQUUsQ0FBQyxNQUFNLE1BQU0sR0FBRyxNQUFNLEVBQUUsT0FBTyxHQUFHLElBQUksRUFBRSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsaUJBQWlCLEVBQUUsQ0FBQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyw0QkFBNEIsRUFBRSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLFNBQVMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxPQUFPLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUkscUJBQXFCLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQzdnRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsQ0FBQyxVQUFVLE9BQU8sQ0FBQztBQUNuQixTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsK0RBQStELENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsd0NBQXdDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQzdtRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7O0NBRWhDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3ZELFlBQVksQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFBLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0NBQzl3RSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN0RCxDQUFDLFVBQVUsTUFBTSxDQUFDO0FBQ2xCLFlBQVksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFBLENBQUMsU0FBUyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUEsQ0FBQyxDQUFDLFNBQVMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxTQUFTLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxTQUFTLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLFNBQVMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxTQUFTLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLFNBQVMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFBLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUEsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUEsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFBLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQSxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFBLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUM7Q0FDeG5RLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPQyxjQUFNLEtBQUssV0FBVyxHQUFHQSxjQUFNLEdBQUcsT0FBTyxJQUFJLEtBQUssV0FBVyxHQUFHLElBQUksR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLEdBQUcsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFBOztDQUV0SSxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN2RCxZQUFZLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUMxdkQsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLFNBQVMsZ0JBQWdCLEVBQUUsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUMsU0FBUyxtQkFBbUIsRUFBRSxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixFQUFFLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLE9BQU8sZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLGtCQUFrQixHQUFHLFlBQVksQ0FBQyxPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQyxrQkFBa0IsR0FBRyxZQUFZLENBQUMsT0FBTyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxlQUFlLEVBQUUsQ0FBQyxRQUFRLEVBQUUsWUFBWSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUEsQ0FBQyxTQUFTLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQSxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUUsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxPQUFPLFVBQVUsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFBLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxPQUFPLFlBQVksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLG1CQUFtQixDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0NBQy85RSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLFNBQVMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO0NBQzNuQixDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsWUFBWSxDQUFDLFNBQVMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQzduRyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNyRCxZQUFZLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLFlBQVksU0FBUyxDQUFDLENBQUMsT0FBTyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLFNBQVMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDOTVCLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxVQUFVLEVBQUUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUM7Q0FDbFQsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztDQUM5SSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsQ0FBQyxVQUFVLE9BQU8sQ0FBQyxNQUFNLENBQUM7QUFDMUIsU0FBUyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsOEJBQThCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLFFBQVEsRUFBRSxPQUFPLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLFNBQVMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxLQUFLLENBQUMsQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLFlBQVksQ0FBQyxRQUFRLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLFVBQVUsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUEsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztDQUNyck8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPQSxjQUFNLEtBQUssV0FBVyxHQUFHQSxjQUFNLEdBQUcsT0FBTyxJQUFJLEtBQUssV0FBVyxHQUFHLElBQUksR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLEdBQUcsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFBOztDQUUxSixDQUFDLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM3RixNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0NBQ2xNLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsNEJBQTRCLENBQUMsRUFBRSxDQUFDLDBCQUEwQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNoSSxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO0NBQ3RRLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDaEUsWUFBWSxDQUFDLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ3AxRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzdELFlBQVksQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUEsQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Q0FDOWpDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDckUsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUM7Q0FDOWxELENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDbkcsWUFBWSxDQUFDLFNBQVMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQSxDQUFDLFNBQVMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFBLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztDQUNyaUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzlFLFlBQVksQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUEsQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLFNBQVMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUEsQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQSxDQUFDLFNBQVMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUEsQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7Q0FDM2tGLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLHNDQUFzQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQzdpQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO0NBQ2hILENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0NBQ2xDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxZQUFZLENBQUMsU0FBUywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsNkJBQTZCLEVBQUUsQ0FBQyxDQUFBLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLHVCQUF1QixJQUFJLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxD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SUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsMEJBQTBCLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDcHZDLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ25HLFlBQVksQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO0NBQzVpRCxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDeEgsWUFBWSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUEsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFBLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztDQUM3b0QsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNwSixZQUFZLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLFNBQVMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUEsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFD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UUFBUSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLG1CQUFtQixFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEtBQUssR0FBRyxPQUFPLEdBQUcsQ0FBQyxFQUFFLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO0NBQ3g4SixDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN6SSxZQUFZLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUEsQ0FBQyxTQUFTLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENB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YUFBYSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUEsQ0FBQyxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFBLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsNEJBQTRCLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsNEJBQTRCLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsMEJBQTBCLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksT0FBTyxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsSUFBSSxRQUFRLENBQUMsSUFBSSxjQUFjLENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGVBQWUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMseUJBQXlCLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMseUJBQXlCLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsS0FBSyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEtBQUssR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxLQUFLLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFBLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtR0FBbUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsa0dBQWtHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztDQUN6MGYsQ0FBQyxDQUFDLGdDQUFnQyxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLGdDQUFnQyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyx5Q0FBeUMsQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDdm1CLFlBQVksQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7Q0FDM3RDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLCtCQUErQixDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFBLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO0NBQ2xuRCxDQUFDLENBQUMsK0JBQStCLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ25LLFlBQVksQ0FBQyxTQUFTLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8scUJBQXFCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUkscUJBQXFCLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztDQUN6TyxDQUFDLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3BFLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztDQUNoQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsWUFBWSxDQUFDLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLDhCQUE4QixDQUFDLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsK0JBQStCLENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLDRCQUE0QixDQUFDLENBQUMsd0NBQXdDLENBQUMsWUFBWSxDQUFDLHdDQUF3QyxDQUFDLGtDQUFrQyxDQUFDLFlBQVksQ0FBQyxrQ0FBa0MsQ0FBQyx1Q0FBdUMsQ0FBQyxZQUFZLENBQUMsdUNBQXVDLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksaUJBQWlCLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUEsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHVDQUF1QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtDQUFrQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLHdDQUF3QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO0NBQ2hpTSxDQUFDLENBQUMsOEJBQThCLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMvVCxZQUFZLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzRUFBc0UsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztDQUN4aUIsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxRSxZQUFZLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7Q0FDbkwsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNwRSxZQUFZLENBQUMsU0FBUyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQSxDQUFDLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsa0RBQWtELENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsNkJBQTZCLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUM7Q0FDNTJJLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNyRixZQUFZLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztDQUN0UCxDQUFDLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3BFLFlBQVksQ0FBQyxTQUFTLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8scUJBQXFCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUkscUJBQXFCLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztDQUNuTSxDQUFDLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3BFLFlBQVksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO0NBQzVqQixDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUMsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpSUFBaUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7Q0FDcjVCLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzVELFlBQVksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsWUFBWSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLFlBQVksQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7Q0FDejRELENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3hELFlBQVksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdDQUFnQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUEsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFBLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQSxDQUFDLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsNEJBQTRCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUEsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO0NBQzM1USxDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLHNCQUFzQixD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LFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7Q0FDM3BDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDL0QsWUFBWSxDQUFDLFNBQVMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUM7Q0FDN3NCLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxZQUFZLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBLENBQUMsU0FBUyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDeDFRLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMvSyxZQUFZLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxTQUFTLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLFNBQVMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztDQUN4bEUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDeEQsWUFBWSxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBLENBQUMsQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBLENBQUMsU0FBUyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENB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QUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUEsQ0FBQyxDQUFDO0NBQ3BzSSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDcEosWUFBWSxDQUFDLFNBQVMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUM1N0UsQ0FBQyxDQUFDLGdDQUFnQyxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDbkcsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQSxDQUFDLENBQUMsU0FBUyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLHVCQUF1QixFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztDQUMxM0UsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDNUQsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQSxDQUFDLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLFNBQVMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztDQUNyeEksQ0FBQyxDQUFDLGdDQUFnQyxDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQy9LLFlBQVksQ0FBQyxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztDQUNsM0MsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7Q0FDMXdELENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzVELFlBQVksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFt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U0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxnQ0FBZ0MsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsb0NBQW9DLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLHVDQUF1QyxDQUFDLENBQUMsSUFBSSxDQUFDLDJCQUEyQixHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFBLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1EQUFtRCxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxDQUFDLEVBQUUsK0JBQStCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFD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Q0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENB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QyxDQUFDLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQSxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUM7Q0FDaDVDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMxQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDeEssQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDNUQsWUFBWSxDQUFDLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFBLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7Q0FDdi9DLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ2xGLFlBQVksQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO0NBQzV5RixDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzSCxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFBLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDO0NBQ3R6RCxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsNkJBQTZCLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNyTCxZQUFZLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQztDQUN6dUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNsRyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsK0JBQStCLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxpQkFBaUIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUMsWUFBWSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsWUFBWSxNQUFNLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENB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QyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ3hJLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDN0QsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0NBQzc1QixDQUFDLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzRCxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMs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Q0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxVQUFVLEdBQUcsQ0FBQyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxTQUFTLEdBQUcsQ0FBQyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxTQUFTLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLDBCQUEwQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FB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LENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztDQUNsdkgsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsOEJBQThCLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3pRLFlBQVksQ0FBQyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQSxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO0NBQzMvQixDQUFDLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDdkYsWUFBWSxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFBLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO0NBQzl1RixDQUFDLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN0RixZQUFZLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7Q0FDMWlGLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDL0ksWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQSxDQUFDLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQSxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztDQUNsa0UsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM3SCxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQSxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO0NBQzNuQyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDakYsWUFBWSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLDRCQUE0QixDQUFDLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsbUJBQW1CLENBQUMsa0JBQWtCLEVBQUUsbUJBQW1CLENBQUMsd0JBQXdCLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxrQkFBa0IsRUFBRSxtQkFBbUIsQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENB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QUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxrRkFBa0YsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7Q0FDenhHLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNwTCxZQUFZLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLGFBQWEsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO0NBQ3BaLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDdEUsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxTQUFTLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLFNBQVMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUMsRUFBRSxRQUFRLEdBQUcsQ0FBQyxFQUFFLFVBQVUsR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHLENBQUMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLFFBQVEsR0FBRyxDQUFDLEVBQUUsVUFBVSxHQUFHLENBQUMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLFNBQVMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDO0NBQzEwSSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQy9ELFlBQVksQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUM7Q0FDNVAsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDcEQsWUFBWSxDQUFDLFNBQVMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLDRDQUE0QyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyx3SkFBd0osQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7Q0FDanJELENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxZQUFZLENBQUMsU0FBUyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0NBQ3Z2QyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0MsWUFBWSxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLGNBQWMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsS0FBSyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLEtBQUssR0FBRyxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFBLENBQUMsS0FBSyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyx5QkFBeUIsQ0FBQztDQUNwM0gsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDL0osWUFBWSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztDQUNqWCxDQUFDLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNsRyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLGNBQWMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxlQUFlLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxPQUFPLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLE9BQU8sSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUU7Q0FDdHNLLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDLEVBQUUsSUFBSSxRQUFRLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxRQUFRLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7Q0FDNW1DLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsS0FBSyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxhQUFhLEdBQUcsQ0FBQyxFQUFFLGFBQWEsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO0NBQy9nRixDQUFDLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNHLFNBQVMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7Q0FDMWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLFNBQVMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyw2QkFBNkIsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLHdEQUF3RCxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO0NBQ3J6QixDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0MsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLDRCQUE0QixDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztDQUNsNkIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLFNBQVMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLFFBQVEsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FB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YyxDQUFDLFNBQVMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO0NBQzlzRCxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0MsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Q0FDNThDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNoSCxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7Q0FDaEQsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLDBCQUEwQixDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGlDQUFpQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUE7Q0FDejJvQixDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0MsWUFBWSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0NBQ3JJLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztDQUMxTCxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0MsWUFBWSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMs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QyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMseUNBQXlDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLFFBQVEsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDMW9DLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDOWEsWUFBWSxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLEVBQUUsUUFBUSxDQUFDLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvREFBb0QsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENB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Q0FBeUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztDQUNqZSxDQUFDLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNqRyxZQUFZLENBQUMsSUFBSSxlQUFlLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdDQUFnQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQzNlLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzFHLFlBQVksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxxREFBcUQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscURBQXFELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Q0FDanJELENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDdkosWUFBWSxDQUFDLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDJDQUEyQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaURBQWlELENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLDZEQUE2RCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxHQUFHLENBQUMsRUFBRSxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLG1GQUFtRixDQUFDLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxFQUFFLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxHQUFHLENBQUMsRUFBRSxvQkFBb0IsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUss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QWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9DQUFvQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxxREFBcUQsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsS0FBSyxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLHFDQUFxQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLHFDQUFxQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxjQUFjLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxjQUFjLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQzN5RSxDQUFDLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ2hQLFlBQVksQ0FBQyxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0NBQ2hJLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDcEUsWUFBWSxDQUFDLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0NBQy9wQixDQUFDLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ2xILFlBQVksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHlDQUF5QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztDQUMxZCxDQUFDLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNqRyxZQUFZLENBQUMsSUFBSSxlQUFlLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztDQUNyMEIsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNsSCxZQUFZLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztDQUMvSCxDQUFDLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3BFLFlBQVksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtSUFBbUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsWUFBWSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx3REFBd0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDamdDLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDbEgsWUFBWSxDQUFDLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxRQUFRLENBQUMsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdFQUFnRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsT0FBTyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLE9BQU8sWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ3pzQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3hKLFlBQVksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Q0FDdlAsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDakcsWUFBWSxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sVUFBVSxDQUFDLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLGdDQUFnQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLG9DQUFvQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztDQUNod0MsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLHFDQUFxQyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsb0NBQW9DLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzWCxZQUFZLENBQUMsSUFBSSxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFBLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztDQUM1YyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0MsWUFBWSxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFD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SUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFD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LENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLFVBQVUsR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFBLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1RkFBdUYsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFBLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQywwREFBMEQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsNERBQTRELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyw2REFBNkQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLDJEQUEyRCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQywyREFBMkQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEtBQUssSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLHlFQUF5RSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFB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LENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDO0NBQ2h2QyxDQUFDLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDMUYsWUFBWSxDQUFDLFNBQVMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGtDQUFrQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxD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TSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBLENBQUMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxD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QyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNB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LENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUM7Q0FDL3JDLENBQUMsQ0FBQyw4QkFBOEIsQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN4SixZQUFZLENBQUMsU0FBUyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGdDQUFnQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsYUFBYSxDQUFBLENBQUMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUM7Q0FDcnJELENBQUMsQ0FBQyxnQ0FBZ0MsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNsRyxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUM3TixDQUFDLENBQUMsa0NBQWtDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ2pGLFlBQVksQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztDQUNsVyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzlELFlBQVksQ0FBQyxTQUFTLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO0NBQ3hlLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxZQUFZLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztDQUM1MUIsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM5RCxZQUFZLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztDQUMzeUIsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDekYsWUFBWSxDQUFDLElBQUksZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEtBQUssSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFBLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7Q0FDaC9CLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxZQUFZLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLDRCQUE0QixDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFBLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztDQUMxekgsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDbkksWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO0NBQ2gzQixDQUFDLENBQUMsZ0NBQWdDLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDOUgsWUFBWSxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQSxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztDQUN2MkUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3BGLFlBQVksQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQSxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEtBQUssS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztDQUM1MkQsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDbEwsWUFBWSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDendCLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBLENBQUMsU0FBUyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxlQUFlLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsZUFBZSxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUEsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsTUFBTSxDQUFDLElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsU0FBUyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsSUFBSSxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxFQUFFLENBQUM7Q0FDOXRILENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDOUQsWUFBWSxDQUFDLFNBQVMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUEsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsU0FBUyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQSxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUEsQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFDLFNBQVMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNwMUcsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzlJLFlBQVksQ0FBQyxTQUFTLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLFdBQVcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsa0dBQWtHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7Q0FDaHlJLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNySixZQUFZLENBQUMsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUMsV0FBVyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ3ZULENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDekUsWUFBWSxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFBLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQztDQUMvbkUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNuUixZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFBLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsb0dBQW9HLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLDZFQUE2RSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO0NBQ3gvUCxDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUNqTixZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLE1BQU0sY0FBYyxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQSxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsR0FBRyxDQUFDLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFBLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUM7Q0FDdGlFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMs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QUMsQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFVB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LENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQSxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQSxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENB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QUFJLENBQUMsQ0FBQSxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxTQUFTLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxD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QUFDLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQSxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFBLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFD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LENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQztDQUMvZ0gsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzdHLFlBQVksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQSxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLFdBQVcsRUFBRSxPQUFPLGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztDQUNsbkgsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzdHLFlBQVksQ0FBQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsTUFBTSxRQUFRLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUM7Q0FDM3hDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxRQUFRLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLGVBQWUsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLGNBQWMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsWUFBWSxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFBLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUM7Q0FDbG9FLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDdEksWUFBWSxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLFFBQVEsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUEsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDO0NBQzc1RyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDN0csWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxNQUFNLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0NBQzloQyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDbEYsWUFBWSxDQUFDLFNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLCtCQUErQixDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFBLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxPQUFPLE1BQU0sR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLDBGQUEwRixDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsMEZBQTBGLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsMEZBQTBGLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLDBGQUEwRixDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQywwRkFBMEYsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUEsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxjQUFjLENBQUMscUNBQXFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLFlBQVksR0FBRyxDQUFDLEVBQUUsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLEdBQUcsQ0FBQyxFQUFFLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFlBQVksS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdDQUFnQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxTQUFTLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxPQUFPLE1BQU0sR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFD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QVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7Q0FDNzhELENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzdILFlBQVksQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sZUFBZSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7Q0FDbnpJLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzTCxZQUFZLENBQUMsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssR0FBRyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7Q0FDM29DLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxvSEFBb0gsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztDQUN0K0QsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDekQsWUFBWSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxNQUFNLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsd0JBQXdCLEVBQUUsTUFBTSxDQUFDLDJCQUEyQixFQUFFLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLHVCQUF1QixFQUFFLE1BQU0sQ0FBQywwQkFBMEIsRUFBRSxNQUFNLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENB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QyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLFlBQVksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUM7Q0FDdlgsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO0NBQ3J3QixDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ3JFLFlBQVksQ0FBQyxTQUFTLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUEsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUM7Q0FDdjlDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM3RSxZQUFZLENBQUMsU0FBUyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxTQUFTLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQSxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0NBQ2hvRCxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN2RCxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFBLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNqZ0QsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUN4RyxZQUFZLENBQUMsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0NBQzVLLENBQUMsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzlELFlBQVksQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxTQUFTLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsU0FBUyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLFNBQVMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFBLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7Q0FDcGxCLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxZQUFZLENBQUMsU0FBUyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLHdDQUF3QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLGtDQUFrQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8seUJBQXlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyx1Q0FBdUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLGdDQUFnQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLGdDQUFnQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMs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QUFLLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsMkJBQTJCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsOEJBQThCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLGlDQUFpQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsb0NBQW9DLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyw4QkFBOEIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsK0JBQStCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztDQUM1bUYsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLFlBQVksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7Q0FDOXFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUMzQyxZQUFZLENBQUMsU0FBUyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMscUZBQXFGLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBLENBQUMsU0FBUyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsNkRBQTZELENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FB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LENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGlDQUFpQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLGtDQUFrQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsK0JBQStCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsaUNBQWlDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDbG9JLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0UsWUFBWSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0NBQ3BjLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDOUQsWUFBWSxDQUFDLFNBQVMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsdURBQXVELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFdBQVcsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQSxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztDQUNuN0gsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLFlBQVksQ0FBQyxTQUFTLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7Q0FDMUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQzNDLFlBQVksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksZUFBZSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsRUFBRSxPQUFPLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLDBKQUEwSixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Q0FDdGlILENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztBQUM1RyxZQUFZLENBQUMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFLG9CQUFvQixHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0NBQzd0QixDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7QUFDM0MsWUFBWSxDQUFDLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQ3JtQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQ25FLFlBQVksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQSxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLENBQUEsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7Q0FDM2YsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFD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T0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEUsS0FBSyxDQUFDLEVBQUUsT0FBTyxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN0RSxLQUFLLENBQUMsRUFBRSxPQUFPLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMxRSxLQUFLLENBQUMsRUFBRSxPQUFPLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNsRixLQUFLLENBQUMsRUFBRSxPQUFPLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN0RixLQUFLLENBQUMsRUFBRSxPQUFPLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFF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SUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xELEtBQUssQ0FBQyxFQUFFLE9BQU8sU0FBUyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RCxLQUFLLENBQUMsRUFBRSxPQUFPLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRSxLQUFLLENBQUMsRUFBRSxPQUFPLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLEtBQUssQ0FBQyxFQUFFLE9BQU8sU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRixLQUFLLENBQUMsRUFBRSxPQUFPLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RixLQUFLLENBQUMsRUFBRSxPQUFPLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hHLEtBQUssQ0FBQyxFQUFFLE9BQU8sU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RyxLQUFLLENBQUMsRUFBRSxPQUFPLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoSCxLQUFLLENBQUMsRUFBRSxPQUFPLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hILEtBQUssRUFBRSxFQUFFLE9BQU8sU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUs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QUN0Qkg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NBLFVBQWMsR0FBRyxPQUFPLENBQUMsU0FBUyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRTtFQUNqRCxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUM3RCxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZixJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZixPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ3ZDLENBQUMsQ0FBQztDQUNKLENBQUMsQ0FBQzs7QUN0Q0g7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NBLFlBQWMsR0FBRyxPQUFPLENBQUMsU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRTtFQUNwRCxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUM3RCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDZixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixPQUFPLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUU7TUFDckMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7TUFDdEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNSO0lBQ0QsT0FBTyxNQUFNLENBQUM7R0FDZixDQUFDLENBQUM7Q0FDSixDQUFDLENBQUM7O0FDMUNI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Q0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtJQUN4QyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNsSyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFBO0lBQzdCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUE7SUFDNUIsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQTtHQUN0Qjs7RUFFRCxJQUFJLFlBQVksS0FBSyxDQUFDLEVBQUU7SUFDdEIsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDbkYsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQTtHQUN0QixNQUFNLElBQUksWUFBWSxLQUFLLENBQUMsRUFBRTtJQUM3QixHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUs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QUFDLElBQUksQ0FBQyxDQUFDLENBQUE7RUFDN0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7RUFDZCxLQUFLLElBQUksSUFBSSxDQUFBO0VBQ2IsT0FBTyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLEVBQUU7O0VBRTFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtFQUM3QixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtFQUNkLEtBQUssSUFBSSxJQUFJLENBQUE7RUFDYixPQUFPLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsRUFBRTs7RUFFMUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO0lBQ1gsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUE7R0FDZCxNQUFNLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtJQUNyQixPQUFPLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFFBQVEsQ0FBQztHQUMzQyxNQUFNO0lBQ0wsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUN6QixDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQTtHQUNkO0VBQ0QsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7Q0FDaEQ7O0FBRUQsQUFBTyxTQUFTLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtFQUNoRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0VBQ1gsSUFBSSxJQUFJLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFBO0VBQ2hDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUE7RUFDMUIsSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQTtFQUNyQixJQUFJLEVBQUUsSUFBSSxJQUFJLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtFQUNoRSxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtFQUMvQixJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0VBQ3JCLElBQUksQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7O0VBRTNELEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBOztFQUV2QixJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssUUFBUSxFQUFFO0lBQ3RDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN4QixDQUFDLEdBQUcsSUFBSSxDQUFBO0dBQ1QsTUFBTTtJQUNMLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQzFDLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO01BQ3JDLENBQUMsRUFBRSxDQUFBO01BQ0gsQ0FBQyxJQUFJLENBQUMsQ0FBQTtLQUNQO0lBQ0QsSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsRUFBRTtNQUNsQixLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQTtLQUNoQixNQUFNO01BQ0wsS0FBSyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUE7S0FDckM7SUFDRCxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO01BQ2xCLENBQUMsRUFBRSxDQUFBO01BQ0gsQ0FBQyxJQUFJLENBQUMsQ0FBQTtLQUNQOztJQUVELElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxJQUFJLEVBQUU7TUFDckIsQ0FBQyxHQUFHLENBQUMsQ0FBQTtNQUNMLENBQUMsR0FBRyxJQUFJLENBQUE7S0FDVCxNQUFNLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLEVBQUU7TUFDekIsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7TUFDdkMsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUE7S0FDZCxNQUFNO01BQ0wsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVB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bEQsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFO0tBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0tBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDckIsQ0FBQTs7QUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxTQUFTLFdBQVcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO0VBQ3JFLElBQUksQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0VBQ2xELE9BQU9DLElBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0NBQy9DLENBQUE7O0FBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsU0FBUyxXQUFXLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtFQUNyRSxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtFQUNsRCxPQUFPQSxJQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztDQUNoRCxDQUFBOztBQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLFNBQVMsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7RUFDdkUsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7RUFDbEQsT0FBT0EsSUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7Q0FDL0MsQ0FB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QUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUE7R0FDckQ7O0VBRUQsT0FBTyxNQUFNLEdBQUcsVUFBVTtDQUMzQixDQUFBOztBQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLFNBQVMsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO0VBQ3hFLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQTtFQUNkLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFBO0VBQ25CLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtFQUM1RCxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO0VBQzFELElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUE7RUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQTtFQUM3QixPQUFPLE1BQU0sR0FBRyxDQUFDO0NBQ2xCLENBQUE7O0FBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsU0FBUyxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7RUFDOUUsS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFBO0VBQ2QsTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUE7RUFDbkIsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0VBQ2hFLElBQUksTUFBTSxDQUFD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QUNaLFFBQVEsRUFBRSxHQUFHO0lBQ2IsTUFBTSxFQUFFLEdBQUc7SUFDWCxRQUFRLEVBQUUsR0FBRztJQUNiLFFBQVEsRUFBRSxHQUFHO0lBQ2IsT0FBTyxFQUFFLEdBQUc7SUFDWixRQUFRLEVBQUUsR0FBRztJQUNiLFFBQVEsRUFBRSxHQUFHO0lBQ2IsUUFBUSxFQUFFLEdBQUc7SUFDYixNQUFNLEVBQUUsR0FBRztJQUNYLE9BQU8sRUFBRSxHQUFHO0lBQ1osUUFBUSxFQUFFLEdBQUc7SUFDYixPQUFPLEVBQUUsR0FBRztJQUNaLFFBQVEsRUFBRSxHQUFHO0lBQ2IsTUFBTSxFQUFFLEdBQUc7SUFDWCxRQUFRLEVBQUUsR0FBRztJQUNiLFFBQVEsRUFBRSxHQUFHO0lBQ2IsT0FBTyxFQUFFLEdBQUc7SUFDWixPQUFPLEVBQUUsR0FBRztJQUNaLFFBQVEsRUFBRSxHQUFHO0lBQ2IsT0FBTyxFQUFFLEdBQUc7SUFDWixRQUFRLEVBQUUsR0FBRztJQUNiLE1BQU0sRUFBRSxHQUFHO0lBQ1gsUUFBUSxFQUFFLEdBQUc7SUFDYixRQUFRLEVBQUUsR0FBRztJQUNiLE9BQU8sRUFBRSxHQUFHO0lBQ1osUUFBUSxFQUFFLEdBQUc7SUFDYixLQUFLLEVBQUUsR0FBRztJQUNWLE1BQU0sRUFBRSxHQUFHO0lBQ1gsUUFBUSxFQUFFLEdBQUc7SUFDYixPQUFPLEVBQUUsR0FBRztJQUNaLFFBQVEsRUFBRSxHQUFHO0lBQ2IsTUFBTSxFQUFFLEdBQUc7SUFDWCxRQUFRLEVBQUUsR0FBRztJQUNiLFFBQVEsRUFBRSxHQUFHO0lBQ2IsT0FBTyxFQUFFLEdBQUc7SUFDWixRQUFRLEVBQUUsR0FBRztJQUNiLFFBQVEsRUFBRSxHQUFHO0lBQ2IsUUFBUSxFQUFFLEdBQUc7SUFDYixNQUFNLEVBQUUsR0FBRztJQUNYLE9BQU8sRUFBRSxHQUFHO0lBQ1osT0FBTyxFQUFFLEdBQUc7SUFDWixRQUFRLEVBQUUsR0FBRztJQUNiLE9BQU8sRUFBRSxHQUFHO0lBQ1osUUFBUSxFQUFFLEdBQUc7SUFDYixNQUFNLEVBQUUsR0FBRztJQUNYLFFBQVEsRUFBRSxHQUFHO0lBQ2IsTUFBTSxFQUFFLEdBQUc7SUFDWCxNQUFNLEVBQUUsR0FBRztJQUNYLEtBQUssRUFBRSxHQUFHO0lBQ1YsTUFBTSxFQUFFLEdBQUc7SUFDWCxPQUFPLEVBQUUsR0FBRztJQUNaLE1BQU0sRUFBRSxHQUFHO0lBQ1gsT0FBTyxFQUFFLEdBQUc7SUFDWixRQUFRLEVBQUUsR0FBRztJQUNiLEtBQUssRUFBRSxHQUFHO0lBQ1YsUUFBUSxFQUFFLEdBQUc7SUFDYixNQUFNLEVBQUUsR0FBRztJQUNYLEtBQUssRUFBRSxHQUFHO0lBQ1YsTUFBTSxFQUFFLEdBQUc7SUFDWCxPQUFPLEVBQUUsR0FBRztJQUNaLEtBQUssRUFBRSxHQUFHO0lBQ1YsS0FBSyxFQUFFLEdBQUc7SUFDVixNQUFNLEVBQUUsR0FBRztJQUNYLEtBQUssRUFBRSxHQUFHO0lBQ1YsUUFBUSxFQUFFLEdBQUc7SUFDYixNQUFNLEVBQUUsR0FBRztJQUNYLE1BQU0sRUFBRSxHQUFHO0lBQ1gsTUFBTSxFQUFFLEdBQUc7SUFDWCxPQUFPLEVBQUUsR0FBRztJQUNaLE9BQU8sRUFBRSxHQUFHO0lBQ1osTUFBTSxFQUFFLEdBQUc7SUFDWCxRQUFRLEVBQUUsR0FBRztJQUNiLE9BQU8sRUFBRSxHQUFHO0lBQ1osTUFBTSxFQUFFLEdBQUc7SUFDWCxPQUFPLEVBQUUsR0FBRztJQUNaLFFBQVEsRUFBRSxHQUFHO0lBQ2IsUUFBUSxFQUFFLEdBQUc7SUFDYixRQUFRLEVBQUUsR0FBRztJQUNiLFFBQVEsRUFBRSxHQUFHO0lBQ2IsT0FBTyxFQUFFLEdBQUc7SUFDWixRQUFRLEVBQUUsR0FBRztJQUNiLE9BQU8sRUFBRSxHQUFHO0lBQ1osT0FBTyxFQUFFLEdBQUc7SUFDWixRQUFRLEVBQUUsR0FBRztJQUNiLFFBQVEsRUFBRSxHQUFHO0lBQ2IsTUFBTSxFQUFFLEdBQUc7SUFDWCxNQUFNLEVBQUUsR0FBRztJQUNYLE1BQU0sRUFBRSxHQUFHO0lBQ1gsT0FBTyxFQUFFLEdBQUc7SUFDWixPQUFPLEVBQUUsR0FBRztJ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QUNaLE1BQU0sRUFBRSxJQUFJO0lBQ1osTUFBTSxFQUFFLElBQUk7SUFDWixNQUFNLEVBQUUsSUFBSTtJQUNaLE1BQU0sRUFBRSxJQUFJO0lBQ1osUUFBUSxFQUFFLElBQUk7SUFDZCxNQUFNLEVBQUUsSUFBSTtJQUNaLE9BQU8sRUFBRSxJQUFJO0lBQ2IsT0FBTyxFQUFFLElBQUk7SUFDYixPQUFPLEVBQUUsSUFBSTtJQUNiLE1BQU0sRUFBRSxJQUFJO0lBQ1osT0FBTyxFQUFFLElBQUk7SUFDYixJQUFJLEVBQUUsSUFBSTtJQUNWLE1BQU0sRUFBRSxJQUFJO0lBQ1osS0FBSyxFQUFFLElBQUk7SUFDWCxPQUFPLEVBQUUsSUFBSTtJQUNiLFFBQVEsRUFBRSxJQUFJO0lBQ2QsT0FBTyxFQUFFLElBQUk7SUFDYixNQUFNLEVBQUUsSUFBSTtJQUNaLE9BQU8sRUFBRSxJQUFJO0lBQ2IsS0FBSyxFQUFFLElBQUk7SUFDWCxLQUFLLEVBQUUsSUFBSTtJQUNYLElBQUksRUFBRSxJQUFJO0lBQ1YsS0FBSyxFQUFFLElBQUk7SUFDWCxLQUFLLEVBQUUsSUFBSTtJQUNYLEtBQUssRUFBRSxJQUFJO0lBQ1gsUUFBUSxFQUFFLElBQUk7SUFDZCxLQUFLLEVBQUUsSUFBSTtJQUNYLE1BQU0sRUFBRSxJQUFJO0lBQ1osT0FBTyxFQUFFLElBQUk7SUFDYixJQUFJLEVBQUUsSUFBSTtJQUNWLE9BQU8sRUFBRSxJQUFJO0lBQ2IsSUFBSSxFQUFFLElBQUk7SUFDVixJQUFJLEVBQUUsSUFBSTtJQUNWLEtBQUssRUFBRSxJQUFJO0lBQ1gsS0FBSyxFQUFFLElBQUk7SUFDWCxNQUFNLEVBQUUsSUFBSTtJQUNaLE1BQU0sRUFBRSxJQUFJO0lBQ1osTUFBTSxFQUFFLElBQUk7SUFDWixPQUFPLEVBQUUsSUFBSTtJQUNiLFFBQVEsRUFBRSxJQUFJO0lBQ2QsTUFBTSxFQUFFLElBQUk7SUFDWixNQUFNLEVBQUUsSUFBSTtJQUNaLE9BQU8sRUFBRSxJQUFJO0lBQ2IsT0FBTyxFQUFFLElBQUk7SUFDYixRQUFRLEVBQUUsSUFBSTtJ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RyxFQUFFLENBQUMsS0FBSyxDQUFBO01BQ3BCLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFBOztNQUVqQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1FBQzFCLFVBQVUsQ0FBQyxNQUFNLEVBQUUsNEJBQTRCO1VBQzdDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7UUFDakMsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFBO09BQ3BCOztNQUVELElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFBO01BQzFELElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEVBQUU7UUFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1VBQ3ZDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLEVBQUU7WUFDbEMsTUFBTSxFQUFFLENBQUM7WUFDVCxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7V0FDZixDQUFDLENBQUE7U0FDSCxDQUFDLENBQUE7T0FDSDs7Ozs7TUFLRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN4RCxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzdCLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtR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LE9BQU8sQ0FBQyxBQUUzQixDQUFDO0NBQ3JELENBQUNDLGNBQUksR0FBRyxVQUFVLE9BQU8sRUFBRSxFQUFFLFlBQVksQ0FBQzs7QUFFM0MsSUFBSSxRQUFRLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9B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QUNuRCxDQUFDLEVBQUUsR0FBRyxDQUFDO0lBQ1gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7O1FBRXJCLEdBQUcsR0FBRyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2QyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDL0M7OztJQUdELFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUIsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzQixXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVCLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3JCLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM5QztJQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3JCLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFX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QUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxRQUFRLEdBQUc7WUFDUCxDQUFDLElBQUksQ0FBQztZQUNOLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLDJCQUEyQixJQUFJO1lBQ3RELENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLDJCQUEyQixJQUFJO1lBQ3RELENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLHlCQUF5QixJQUFJO1lBQ3RELENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLHlCQUF5QixJQUFJO1lBQ3RELEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUk7U0FDekQsQ0FBQztLQUNMLE1BQU0sSUFBSSxDQUFDLEVBQUUsS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtRQUN6QyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxRQUFRLEdBQUc7WUFDUCxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7WUFDNUIsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO1lBQzVCLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztZQUM1QixDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7WUFDNUIsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDO1lBQzVCLENBQUMs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
|