Skip to content

Instantly share code, notes, and snippets.

@danwild
Last active March 29, 2021 06:48
Show Gist options
  • Save danwild/7a843b6ed8b686725ae476162da502f2 to your computer and use it in GitHub Desktop.
Save danwild/7a843b6ed8b686725ae476162da502f2 to your computer and use it in GitHub Desktop.
Leaflet.glify conflict example - fixed using peer/external leaflet definition (https://github.com/danwild/Leaflet.glify/commit/a2a6acd2392e1619e1bbc2bd7aa95deb69954db6)
<!DOCTYPE html>
<!-- saved from url=(0062)https://leaflet.github.io/Leaflet.draw/docs/examples/full.html -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Leaflet.glify conflict example</title>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
<script src="https://unpkg.com/leaflet-draw@1.0.4/dist/leaflet.draw.js"></script>
<link rel="stylesheet" href="https://unpkg.com/leaflet-draw@1.0.4/dist/leaflet.draw.css" />
<!-- note: avoid v3.1.0, has color issue -->
<script src="glify-browser.js"></script>
<script>
var geoJSON = {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
147.66448974609375,
-43.31518656029048
],
[
147.70843505859375,
-43.43696596521823
],
[
147.4420166015625,
-43.5326204268101
],
[
147.8814697265625,
-43.61022814178641
],
[
147.974853515625,
-43.31918320532584
],
[
147.66448974609375,
-43.31518656029048
]
]
]
}
},
{
"type": "Feature",
"properties": {},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
148.3648681640625,
-42.627896481020834
],
[
148.25775146484375,
-42.67839711889055
],
[
148.16986083984372,
-42.88602714832882
],
[
148.44451904296875,
-43.03075300142832
],
[
148.61480712890625,
-42.696567309696974
],
[
148.3648681640625,
-42.627896481020834
]
]
]
}
}
]
}
</script>
</head>
<body class="">
<div id="map" style="width: 800px; height: 600px; border: 1px solid rgb(204, 204, 204); position: relative;"></div>
<script>
var osmUrl = 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
osmAttrib = '&copy; <a href="http://openstreetmap.org/copyright">OpenStreetMap</a> contributors',
osm = L.tileLayer(osmUrl, { maxZoom: 18, attribution: osmAttrib }),
map = new L.Map('map', { center: new L.LatLng(51.505, -0.04), zoom: 13 }),
drawnItems = L.featureGroup().addTo(map);
L.control.layers({
'osm': osm.addTo(map),
"google": L.tileLayer('http://www.google.cn/maps/vt?lyrs=s@189&gl=cn&x={x}&y={y}&z={z}', {
attribution: 'google'
})
}, { 'drawlayer': drawnItems }, { position: 'topleft', collapsed: false }).addTo(map);
map.addControl(new L.Control.Draw({
edit: {
featureGroup: drawnItems,
poly: {
allowIntersection: false
}
},
draw: {
polygon: {
allowIntersection: false,
showArea: true
}
}
}));
map.on(L.Draw.Event.CREATED, function (event) {
var layer = event.layer;
drawnItems.addLayer(layer);
});
L.glify.shapes({
map,
data: geoJSON,
click(e, feature) {
console.log('click', { e, feature});
},
hover(e, feature) {
console.log('hover', { e, feature});
},
});
</script>
</body></html>
!function(t,n){if("object"==typeof exports&&"object"==typeof module)module.exports=n(require("leaflet"));else if("function"==typeof define&&define.amd)define(["leaflet"],n);else{var r="object"==typeof exports?n(require("leaflet")):n(t.L);for(var e in r)("object"==typeof exports?exports:t)[e]=r[e]}}(window,(function(t){return function(t){var n={};function r(e){if(n[e])return n[e].exports;var i=n[e]={i:e,l:!1,exports:{}};return t[e].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=t,r.c=n,r.d=function(t,n,e){r.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:e})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,n){if(1&n&&(t=r(t)),8&n)return t;if(4&n&&"object"==typeof t&&t&&t.__esModule)return t;var e=Object.create(null);if(r.r(e),Object.defineProperty(e,"default",{enumerable:!0,value:t}),2&n&&"string"!=typeof t)for(var i in t)r.d(e,i,function(n){return t[n]}.bind(null,i));return e},r.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(n,"a",n),n},r.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},r.p="",r(r.s=10)}([function(n,r){n.exports=t},function(t,n,r){"use strict";function e(t,n,r){r=r||2;var e,a,s,c,f,v,d,g=n&&n.length,y=g?n[0]*r:t.length,_=i(t,0,y,r,!0),m=[];if(!_||_.next===_.prev)return m;if(g&&(_=function(t,n,r,e){var u,a,s,c,f,v=[];for(u=0,a=n.length;u<a;u++)s=n[u]*e,c=u<a-1?n[u+1]*e:t.length,(f=i(t,s,c,e,!1))===f.next&&(f.steiner=!0),v.push(p(f));for(v.sort(l),u=0;u<v.length;u++)h(v[u],r),r=o(r,r.next);return r}(t,n,_,r)),t.length>80*r){e=s=t[0],a=c=t[1];for(var x=r;x<y;x+=r)(f=t[x])<e&&(e=f),(v=t[x+1])<a&&(a=v),f>s&&(s=f),v>c&&(c=v);d=0!==(d=Math.max(s-e,c-a))?1/d:0}return u(_,m,r,e,a,d),m}function i(t,n,r,e,i){var o,u;if(i===A(t,n,r,e)>0)for(o=n;o<r;o+=e)u=w(o,t[o],t[o+1],u);else for(o=r-e;o>=n;o-=e)u=w(o,t[o],t[o+1],u);return u&&_(u,u.next)&&(S(u),u=u.next),u}function o(t,n){if(!t)return t;n||(n=t);var r,e=t;do{if(r=!1,e.steiner||!_(e,e.next)&&0!==y(e.prev,e,e.next))e=e.next;else{if(S(e),(e=n=e.prev)===e.next)break;r=!0}}while(r||e!==n);return n}function u(t,n,r,e,i,l,h){if(t){!h&&l&&function(t,n,r,e){var i=t;do{null===i.z&&(i.z=v(i.x,i.y,n,r,e)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,function(t){var n,r,e,i,o,u,a,s,c=1;do{for(r=t,t=null,o=null,u=0;r;){for(u++,e=r,a=0,n=0;n<c&&(a++,e=e.nextZ);n++);for(s=c;a>0||s>0&&e;)0!==a&&(0===s||!e||r.z<=e.z)?(i=r,r=r.nextZ,a--):(i=e,e=e.nextZ,s--),o?o.nextZ=i:t=i,i.prevZ=o,o=i;r=e}o.nextZ=null,c*=2}while(u>1)}(i)}(t,e,i,l);for(var p,d,g=t;t.prev!==t.next;)if(p=t.prev,d=t.next,l?s(t,e,i,l):a(t))n.push(p.i/r),n.push(t.i/r),n.push(d.i/r),S(t),t=d.next,g=d.next;else if((t=d)===g){h?1===h?u(t=c(t,n,r),n,r,e,i,l,2):2===h&&f(t,n,r,e,i,l):u(o(t),n,r,e,i,l,1);break}}}function a(t){var n=t.prev,r=t,e=t.next;if(y(n,r,e)>=0)return!1;for(var i=t.next.next;i!==t.prev;){if(d(n.x,n.y,r.x,r.y,e.x,e.y,i.x,i.y)&&y(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function s(t,n,r,e){var i=t.prev,o=t,u=t.next;if(y(i,o,u)>=0)return!1;for(var a=i.x<o.x?i.x<u.x?i.x:u.x:o.x<u.x?o.x:u.x,s=i.y<o.y?i.y<u.y?i.y:u.y:o.y<u.y?o.y:u.y,c=i.x>o.x?i.x>u.x?i.x:u.x:o.x>u.x?o.x:u.x,f=i.y>o.y?i.y>u.y?i.y:u.y:o.y>u.y?o.y:u.y,l=v(a,s,n,r,e),h=v(c,f,n,r,e),p=t.prevZ,g=t.nextZ;p&&p.z>=l&&g&&g.z<=h;){if(p!==t.prev&&p!==t.next&&d(i.x,i.y,o.x,o.y,u.x,u.y,p.x,p.y)&&y(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,g!==t.prev&&g!==t.next&&d(i.x,i.y,o.x,o.y,u.x,u.y,g.x,g.y)&&y(g.prev,g,g.next)>=0)return!1;g=g.nextZ}for(;p&&p.z>=l;){if(p!==t.prev&&p!==t.next&&d(i.x,i.y,o.x,o.y,u.x,u.y,p.x,p.y)&&y(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;g&&g.z<=h;){if(g!==t.prev&&g!==t.next&&d(i.x,i.y,o.x,o.y,u.x,u.y,g.x,g.y)&&y(g.prev,g,g.next)>=0)return!1;g=g.nextZ}return!0}function c(t,n,r){var e=t;do{var i=e.prev,o=e.next.next;!_(i,o)&&m(i,e,e.next,o)&&x(i,o)&&x(o,i)&&(n.push(i.i/r),n.push(e.i/r),n.push(o.i/r),S(e),S(e.next),e=t=o),e=e.next}while(e!==t);return e}function f(t,n,r,e,i,a){var s=t;do{for(var c=s.next.next;c!==s.prev;){if(s.i!==c.i&&g(s,c)){var f=b(s,c);return s=o(s,s.next),f=o(f,f.next),u(s,n,r,e,i,a),void u(f,n,r,e,i,a)}c=c.next}s=s.next}while(s!==t)}function l(t,n){return t.x-n.x}function h(t,n){if(n=function(t,n){var r,e=n,i=t.x,o=t.y,u=-1/0;do{if(o<=e.y&&o>=e.next.y&&e.next.y!==e.y){var a=e.x+(o-e.y)*(e.next.x-e.x)/(e.next.y-e.y);if(a<=i&&a>u){if(u=a,a===i){if(o===e.y)return e;if(o===e.next.y)return e.next}r=e.x<e.next.x?e:e.next}}e=e.next}while(e!==n);if(!r)return null;if(i===u)return r.prev;var s,c=r,f=r.x,l=r.y,h=1/0;e=r.next;for(;e!==c;)i>=e.x&&e.x>=f&&i!==e.x&&d(o<l?i:u,o,f,l,o<l?u:i,o,e.x,e.y)&&((s=Math.abs(o-e.y)/(i-e.x))<h||s===h&&e.x>r.x)&&x(e,t)&&(r=e,h=s),e=e.next;return r}(t,n)){var r=b(n,t);o(r,r.next)}}function v(t,n,r,e,i){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-r)*i)|t<<8))|t<<4))|t<<2))|t<<1))|(n=1431655765&((n=858993459&((n=252645135&((n=16711935&((n=32767*(n-e)*i)|n<<8))|n<<4))|n<<2))|n<<1))<<1}function p(t){var n=t,r=t;do{(n.x<r.x||n.x===r.x&&n.y<r.y)&&(r=n),n=n.next}while(n!==t);return r}function d(t,n,r,e,i,o,u,a){return(i-u)*(n-a)-(t-u)*(o-a)>=0&&(t-u)*(e-a)-(r-u)*(n-a)>=0&&(r-u)*(o-a)-(i-u)*(e-a)>=0}function g(t,n){return t.next.i!==n.i&&t.prev.i!==n.i&&!function(t,n){var r=t;do{if(r.i!==t.i&&r.next.i!==t.i&&r.i!==n.i&&r.next.i!==n.i&&m(r,r.next,t,n))return!0;r=r.next}while(r!==t);return!1}(t,n)&&x(t,n)&&x(n,t)&&function(t,n){var r=t,e=!1,i=(t.x+n.x)/2,o=(t.y+n.y)/2;do{r.y>o!=r.next.y>o&&r.next.y!==r.y&&i<(r.next.x-r.x)*(o-r.y)/(r.next.y-r.y)+r.x&&(e=!e),r=r.next}while(r!==t);return e}(t,n)}function y(t,n,r){return(n.y-t.y)*(r.x-n.x)-(n.x-t.x)*(r.y-n.y)}function _(t,n){return t.x===n.x&&t.y===n.y}function m(t,n,r,e){return!!(_(t,n)&&_(r,e)||_(t,e)&&_(r,n))||y(t,n,r)>0!=y(t,n,e)>0&&y(r,e,t)>0!=y(r,e,n)>0}function x(t,n){return y(t.prev,t,t.next)<0?y(t,n,t.next)>=0&&y(t,t.prev,n)>=0:y(t,n,t.prev)<0||y(t,t.next,n)<0}function b(t,n){var r=new L(t.i,t.x,t.y),e=new L(n.i,n.x,n.y),i=t.next,o=n.prev;return t.next=n,n.prev=t,r.next=i,i.prev=r,e.next=r,r.prev=e,o.next=e,e.prev=o,e}function w(t,n,r,e){var i=new L(t,n,r);return e?(i.next=e.next,i.prev=e,e.next.prev=i,e.next=i):(i.prev=i,i.next=i),i}function S(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function L(t,n,r){this.i=t,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 A(t,n,r,e){for(var i=0,o=n,u=r-e;o<r;o+=e)i+=(t[u]-t[o])*(t[o+1]+t[u+1]),u=o;return i}t.exports=e,t.exports.default=e,e.deviation=function(t,n,r,e){var i=n&&n.length,o=i?n[0]*r:t.length,u=Math.abs(A(t,0,o,r));if(i)for(var a=0,s=n.length;a<s;a++){var c=n[a]*r,f=a<s-1?n[a+1]*r:t.length;u-=Math.abs(A(t,c,f,r))}var l=0;for(a=0;a<e.length;a+=3){var h=e[a]*r,v=e[a+1]*r,p=e[a+2]*r;l+=Math.abs((t[h]-t[p])*(t[v+1]-t[h+1])-(t[h]-t[v])*(t[p+1]-t[h+1]))}return 0===u&&0===l?0:Math.abs((l-u)/u)},e.flatten=function(t){for(var n=t[0][0].length,r={vertices:[],holes:[],dimensions:n},e=0,i=0;i<t.length;i++){for(var o=0;o<t[i].length;o++)for(var u=0;u<n;u++)r.vertices.push(t[i][o][u]);i>0&&(e+=t[i-1].length,r.holes.push(e))}return r}},function(t,n,r){"use strict";var e=r(3),i=r(5),o=r(6),u=r(7);function a(t){void 0!==t&&this.loadFeatureCollection(t)}function s(t,n){var r=n.geometry.coordinates[0];if(i(t,r)){for(var e=1;e<n.geometry.coordinates.length;e++)if(i(t,n.geometry.coordinates[e]))return!1;return!0}return!1}a.prototype.searchForOnePolygon=function(t,n){var r=this.rtree.search({minX:t,minY:n,maxX:t,maxY:n}),e=[t,n],i=r.map((function(t,n){return this.polygons[r[n].polyId]}),this);return u.find(i,(function(t){return s(e,t)}))},a.prototype.searchForMultiplePolygons=function(t,n,r){-1===r&&(r=Number.MAX_SAFE_INTEGER);var e=[t,n],i=this.rtree.search({minX:t,minY:n,maxX:t,maxY:n}),o=i.map((function(t,n){return this.polygons[i[n].polyId]}),this),u=0;return{type:"FeatureCollection",features:o=o.filter((function(t){return!(u>=r)&&(!!s(e,t)&&(u++,!0))}))}},a.prototype.search=function(t,n,r){return void 0===r?this.searchForOnePolygon(t,n):this.searchForMultiplePolygons(t,n,r)},a.prototype.loadFeatureCollection=function(t){var n=[],r=[],i=0;function u(t){r.push(t);var e=o.getBoundingBox(t.geometry.coordinates[0]);e.polyId=i++,n.push(e)}t.features.forEach((function(t){if(t.geometry&&void 0!==t.geometry.coordinates[0]&&t.geometry.coordinates[0].length>0)switch(t.geometry.type){case"Polygon":u(t);break;case"MultiPolygon":for(var n=t.geometry.coordinates,r=0;r<n.length;r++){u({type:"Feature",properties:t.properties,geometry:{type:"Polygon",coordinates:n[r]}})}}})),this.rtree=(new e).load(n),this.polygons=r},t.exports=a},function(t,n,r){"use strict";t.exports=i,t.exports.default=i;var e=r(4);function i(t,n){if(!(this instanceof i))return new i(t,n);this._maxEntries=Math.max(4,t||9),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),n&&this._initFormat(n),this.clear()}function o(t,n,r){if(!r)return n.indexOf(t);for(var e=0;e<n.length;e++)if(r(t,n[e]))return e;return-1}function u(t,n){a(t,0,t.children.length,n,t)}function a(t,n,r,e,i){i||(i=d(null)),i.minX=1/0,i.minY=1/0,i.maxX=-1/0,i.maxY=-1/0;for(var o,u=n;u<r;u++)o=t.children[u],s(i,t.leaf?e(o):o);return i}function s(t,n){return t.minX=Math.min(t.minX,n.minX),t.minY=Math.min(t.minY,n.minY),t.maxX=Math.max(t.maxX,n.maxX),t.maxY=Math.max(t.maxY,n.maxY),t}function c(t,n){return t.minX-n.minX}function f(t,n){return t.minY-n.minY}function l(t){return(t.maxX-t.minX)*(t.maxY-t.minY)}function h(t){return t.maxX-t.minX+(t.maxY-t.minY)}function v(t,n){return t.minX<=n.minX&&t.minY<=n.minY&&n.maxX<=t.maxX&&n.maxY<=t.maxY}function p(t,n){return n.minX<=t.maxX&&n.minY<=t.maxY&&n.maxX>=t.minX&&n.maxY>=t.minY}function d(t){return{children:t,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function g(t,n,r,i,o){for(var u,a=[n,r];a.length;)(r=a.pop())-(n=a.pop())<=i||(u=n+Math.ceil((r-n)/i/2)*i,e(t,u,n,r,o),a.push(n,u,u,r))}i.prototype={all:function(){return this._all(this.data,[])},search:function(t){var n=this.data,r=[],e=this.toBBox;if(!p(t,n))return r;for(var i,o,u,a,s=[];n;){for(i=0,o=n.children.length;i<o;i++)u=n.children[i],p(t,a=n.leaf?e(u):u)&&(n.leaf?r.push(u):v(t,a)?this._all(u,r):s.push(u));n=s.pop()}return r},collides:function(t){var n=this.data,r=this.toBBox;if(!p(t,n))return!1;for(var e,i,o,u,a=[];n;){for(e=0,i=n.children.length;e<i;e++)if(o=n.children[e],p(t,u=n.leaf?r(o):o)){if(n.leaf||v(t,u))return!0;a.push(o)}n=a.pop()}return!1},load:function(t){if(!t||!t.length)return this;if(t.length<this._minEntries){for(var n=0,r=t.length;n<r;n++)this.insert(t[n]);return this}var e=this._build(t.slice(),0,t.length-1,0);if(this.data.children.length)if(this.data.height===e.height)this._splitRoot(this.data,e);else{if(this.data.height<e.height){var i=this.data;this.data=e,e=i}this._insert(e,this.data.height-e.height-1,!0)}else this.data=e;return this},insert:function(t){return t&&this._insert(t,this.data.height-1),this},clear:function(){return this.data=d([]),this},remove:function(t,n){if(!t)return this;for(var r,e,i,u,a=this.data,s=this.toBBox(t),c=[],f=[];a||c.length;){if(a||(a=c.pop(),e=c[c.length-1],r=f.pop(),u=!0),a.leaf&&-1!==(i=o(t,a.children,n)))return a.children.splice(i,1),c.push(a),this._condense(c),this;u||a.leaf||!v(a,s)?e?(r++,a=e.children[r],u=!1):a=null:(c.push(a),f.push(r),r=0,e=a,a=a.children[0])}return this},toBBox:function(t){return t},compareMinX:c,compareMinY:f,toJSON:function(){return this.data},fromJSON:function(t){return this.data=t,this},_all:function(t,n){for(var r=[];t;)t.leaf?n.push.apply(n,t.children):r.push.apply(r,t.children),t=r.pop();return n},_build:function(t,n,r,e){var i,o=r-n+1,a=this._maxEntries;if(o<=a)return u(i=d(t.slice(n,r+1)),this.toBBox),i;e||(e=Math.ceil(Math.log(o)/Math.log(a)),a=Math.ceil(o/Math.pow(a,e-1))),(i=d([])).leaf=!1,i.height=e;var s,c,f,l,h=Math.ceil(o/a),v=h*Math.ceil(Math.sqrt(a));for(g(t,n,r,v,this.compareMinX),s=n;s<=r;s+=v)for(g(t,s,f=Math.min(s+v-1,r),h,this.compareMinY),c=s;c<=f;c+=h)l=Math.min(c+h-1,f),i.children.push(this._build(t,c,l,e-1));return u(i,this.toBBox),i},_chooseSubtree:function(t,n,r,e){for(var i,o,u,a,s,c,f,h,v,p;e.push(n),!n.leaf&&e.length-1!==r;){for(f=h=1/0,i=0,o=n.children.length;i<o;i++)s=l(u=n.children[i]),v=t,p=u,(c=(Math.max(p.maxX,v.maxX)-Math.min(p.minX,v.minX))*(Math.max(p.maxY,v.maxY)-Math.min(p.minY,v.minY))-s)<h?(h=c,f=s<f?s:f,a=u):c===h&&s<f&&(f=s,a=u);n=a||n.children[0]}return n},_insert:function(t,n,r){var e=this.toBBox,i=r?t:e(t),o=[],u=this._chooseSubtree(i,this.data,n,o);for(u.children.push(t),s(u,i);n>=0&&o[n].children.length>this._maxEntries;)this._split(o,n),n--;this._adjustParentBBoxes(i,o,n)},_split:function(t,n){var r=t[n],e=r.children.length,i=this._minEntries;this._chooseSplitAxis(r,i,e);var o=this._chooseSplitIndex(r,i,e),a=d(r.children.splice(o,r.children.length-o));a.height=r.height,a.leaf=r.leaf,u(r,this.toBBox),u(a,this.toBBox),n?t[n-1].children.push(a):this._splitRoot(r,a)},_splitRoot:function(t,n){this.data=d([t,n]),this.data.height=t.height+1,this.data.leaf=!1,u(this.data,this.toBBox)},_chooseSplitIndex:function(t,n,r){var e,i,o,u,s,c,f,h,v,p,d,g,y,_;for(c=f=1/0,e=n;e<=r-n;e++)i=a(t,0,e,this.toBBox),o=a(t,e,r,this.toBBox),v=i,p=o,d=void 0,g=void 0,y=void 0,_=void 0,d=Math.max(v.minX,p.minX),g=Math.max(v.minY,p.minY),y=Math.min(v.maxX,p.maxX),_=Math.min(v.maxY,p.maxY),u=Math.max(0,y-d)*Math.max(0,_-g),s=l(i)+l(o),u<c?(c=u,h=e,f=s<f?s:f):u===c&&s<f&&(f=s,h=e);return h},_chooseSplitAxis:function(t,n,r){var e=t.leaf?this.compareMinX:c,i=t.leaf?this.compareMinY:f;this._allDistMargin(t,n,r,e)<this._allDistMargin(t,n,r,i)&&t.children.sort(e)},_allDistMargin:function(t,n,r,e){t.children.sort(e);var i,o,u=this.toBBox,c=a(t,0,n,u),f=a(t,r-n,r,u),l=h(c)+h(f);for(i=n;i<r-n;i++)o=t.children[i],s(c,t.leaf?u(o):o),l+=h(c);for(i=r-n-1;i>=n;i--)o=t.children[i],s(f,t.leaf?u(o):o),l+=h(f);return l},_adjustParentBBoxes:function(t,n,r){for(var e=r;e>=0;e--)s(n[e],t)},_condense:function(t){for(var n,r=t.length-1;r>=0;r--)0===t[r].children.length?r>0?(n=t[r-1].children).splice(n.indexOf(t[r]),1):this.clear():u(t[r],this.toBBox)},_initFormat:function(t){var n=["return a"," - b",";"];this.compareMinX=new Function("a","b",n.join(t[0])),this.compareMinY=new Function("a","b",n.join(t[1])),this.toBBox=new Function("a","return {minX: a"+t[0]+", minY: a"+t[1]+", maxX: a"+t[2]+", maxY: a"+t[3]+"};")}}},function(t,n,r){t.exports=function(){"use strict";function t(t,n,r){var e=t[n];t[n]=t[r],t[r]=e}function n(t,n){return t<n?-1:t>n?1:0}return function(r,e,i,o,u){!function n(r,e,i,o,u){for(;o>i;){if(o-i>600){var a=o-i+1,s=e-i+1,c=Math.log(a),f=.5*Math.exp(2*c/3),l=.5*Math.sqrt(c*f*(a-f)/a)*(s-a/2<0?-1:1),h=Math.max(i,Math.floor(e-s*f/a+l)),v=Math.min(o,Math.floor(e+(a-s)*f/a+l));n(r,e,h,v,u)}var p=r[e],d=i,g=o;for(t(r,i,e),u(r[o],p)>0&&t(r,i,o);d<g;){for(t(r,d,g),d++,g--;u(r[d],p)<0;)d++;for(;u(r[g],p)>0;)g--}0===u(r[i],p)?t(r,i,g):(g++,t(r,g,o)),g<=e&&(i=g+1),e<=g&&(o=g-1)}}(r,e,i||0,o||r.length-1,u||n)}}()},function(t,n){t.exports=function(t,n){for(var r=t[0],e=t[1],i=!1,o=0,u=n.length-1;o<n.length;u=o++){var a=n[o][0],s=n[o][1],c=n[u][0],f=n[u][1];s>e!=f>e&&r<(c-a)*(e-s)/(f-s)+a&&(i=!i)}return i}},function(t,n,r){"use strict";t.exports={getBoundingBox:function(t){for(var n=t[0],r={minX:n[0],minY:n[1],maxX:n[0],maxY:n[1]},e=1;e<t.length;e++){var i=t[e],o=i[0];o<r.minX?r.minX=o:o>r.maxX&&(r.maxX=o);var u=i[1];u<r.minY?r.minY=u:u>r.maxY&&(r.maxY=u)}return r}}},function(t,n,r){(function(t,e){var i;
/**
* @license
* Lodash <https://lodash.com/>
* Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
* Released under MIT license <https://lodash.com/license>
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
*/(function(){var o="Expected a function",u="__lodash_placeholder__",a=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],s="[object Arguments]",c="[object Array]",f="[object Boolean]",l="[object Date]",h="[object Error]",v="[object Function]",p="[object GeneratorFunction]",d="[object Map]",g="[object Number]",y="[object Object]",_="[object RegExp]",m="[object Set]",x="[object String]",b="[object Symbol]",w="[object WeakMap]",S="[object ArrayBuffer]",L="[object DataView]",A="[object Float32Array]",j="[object Float64Array]",E="[object Int8Array]",M="[object Int16Array]",k="[object Int32Array]",F="[object Uint8Array]",B="[object Uint16Array]",C="[object Uint32Array]",O=/\b__p \+= '';/g,R=/\b(__p \+=) '' \+/g,z=/(__e\(.*?\)|\b__t\)) \+\n'';/g,P=/&(?:amp|lt|gt|quot|#39);/g,T=/[&<>"']/g,I=RegExp(P.source),Y=RegExp(T.source),N=/<%-([\s\S]+?)%>/g,U=/<%([\s\S]+?)%>/g,D=/<%=([\s\S]+?)%>/g,W=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Z=/^\w*$/,X=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,K=/[\\^$.*+?()[\]{}|]/g,V=RegExp(K.source),H=/^\s+|\s+$/g,$=/^\s+/,q=/\s+$/,G=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,J=/\{\n\/\* \[wrapped with (.+)\] \*/,Q=/,? & /,tt=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,nt=/\\(\\)?/g,rt=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,et=/\w*$/,it=/^[-+]0x[0-9a-f]+$/i,ot=/^0b[01]+$/i,ut=/^\[object .+?Constructor\]$/,at=/^0o[0-7]+$/i,st=/^(?:0|[1-9]\d*)$/,ct=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,ft=/($^)/,lt=/['\n\r\u2028\u2029\\]/g,ht="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",vt="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",pt="[\\ud800-\\udfff]",dt="["+vt+"]",gt="["+ht+"]",yt="\\d+",_t="[\\u2700-\\u27bf]",mt="[a-z\\xdf-\\xf6\\xf8-\\xff]",xt="[^\\ud800-\\udfff"+vt+yt+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",bt="\\ud83c[\\udffb-\\udfff]",wt="[^\\ud800-\\udfff]",St="(?:\\ud83c[\\udde6-\\uddff]){2}",Lt="[\\ud800-\\udbff][\\udc00-\\udfff]",At="[A-Z\\xc0-\\xd6\\xd8-\\xde]",jt="(?:"+mt+"|"+xt+")",Et="(?:"+At+"|"+xt+")",Mt="(?:"+gt+"|"+bt+")"+"?",kt="[\\ufe0e\\ufe0f]?"+Mt+("(?:\\u200d(?:"+[wt,St,Lt].join("|")+")[\\ufe0e\\ufe0f]?"+Mt+")*"),Ft="(?:"+[_t,St,Lt].join("|")+")"+kt,Bt="(?:"+[wt+gt+"?",gt,St,Lt,pt].join("|")+")",Ct=RegExp("['’]","g"),Ot=RegExp(gt,"g"),Rt=RegExp(bt+"(?="+bt+")|"+Bt+kt,"g"),zt=RegExp([At+"?"+mt+"+(?:['’](?:d|ll|m|re|s|t|ve))?(?="+[dt,At,"$"].join("|")+")",Et+"+(?:['’](?:D|LL|M|RE|S|T|VE))?(?="+[dt,At+jt,"$"].join("|")+")",At+"?"+jt+"+(?:['’](?:d|ll|m|re|s|t|ve))?",At+"+(?:['’](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",yt,Ft].join("|"),"g"),Pt=RegExp("[\\u200d\\ud800-\\udfff"+ht+"\\ufe0e\\ufe0f]"),Tt=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,It=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Yt=-1,Nt={};Nt[A]=Nt[j]=Nt[E]=Nt[M]=Nt[k]=Nt[F]=Nt["[object Uint8ClampedArray]"]=Nt[B]=Nt[C]=!0,Nt[s]=Nt[c]=Nt[S]=Nt[f]=Nt[L]=Nt[l]=Nt[h]=Nt[v]=Nt[d]=Nt[g]=Nt[y]=Nt[_]=Nt[m]=Nt[x]=Nt[w]=!1;var Ut={};Ut[s]=Ut[c]=Ut[S]=Ut[L]=Ut[f]=Ut[l]=Ut[A]=Ut[j]=Ut[E]=Ut[M]=Ut[k]=Ut[d]=Ut[g]=Ut[y]=Ut[_]=Ut[m]=Ut[x]=Ut[b]=Ut[F]=Ut["[object Uint8ClampedArray]"]=Ut[B]=Ut[C]=!0,Ut[h]=Ut[v]=Ut[w]=!1;var Dt={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Wt=parseFloat,Zt=parseInt,Xt="object"==typeof t&&t&&t.Object===Object&&t,Kt="object"==typeof self&&self&&self.Object===Object&&self,Vt=Xt||Kt||Function("return this")(),Ht=n&&!n.nodeType&&n,$t=Ht&&"object"==typeof e&&e&&!e.nodeType&&e,qt=$t&&$t.exports===Ht,Gt=qt&&Xt.process,Jt=function(){try{var t=$t&&$t.require&&$t.require("util").types;return t||Gt&&Gt.binding&&Gt.binding("util")}catch(t){}}(),Qt=Jt&&Jt.isArrayBuffer,tn=Jt&&Jt.isDate,nn=Jt&&Jt.isMap,rn=Jt&&Jt.isRegExp,en=Jt&&Jt.isSet,on=Jt&&Jt.isTypedArray;function un(t,n,r){switch(r.length){case 0:return t.call(n);case 1:return t.call(n,r[0]);case 2:return t.call(n,r[0],r[1]);case 3:return t.call(n,r[0],r[1],r[2])}return t.apply(n,r)}function an(t,n,r,e){for(var i=-1,o=null==t?0:t.length;++i<o;){var u=t[i];n(e,u,r(u),t)}return e}function sn(t,n){for(var r=-1,e=null==t?0:t.length;++r<e&&!1!==n(t[r],r,t););return t}function cn(t,n){for(var r=null==t?0:t.length;r--&&!1!==n(t[r],r,t););return t}function fn(t,n){for(var r=-1,e=null==t?0:t.length;++r<e;)if(!n(t[r],r,t))return!1;return!0}function ln(t,n){for(var r=-1,e=null==t?0:t.length,i=0,o=[];++r<e;){var u=t[r];n(u,r,t)&&(o[i++]=u)}return o}function hn(t,n){return!!(null==t?0:t.length)&&wn(t,n,0)>-1}function vn(t,n,r){for(var e=-1,i=null==t?0:t.length;++e<i;)if(r(n,t[e]))return!0;return!1}function pn(t,n){for(var r=-1,e=null==t?0:t.length,i=Array(e);++r<e;)i[r]=n(t[r],r,t);return i}function dn(t,n){for(var r=-1,e=n.length,i=t.length;++r<e;)t[i+r]=n[r];return t}function gn(t,n,r,e){var i=-1,o=null==t?0:t.length;for(e&&o&&(r=t[++i]);++i<o;)r=n(r,t[i],i,t);return r}function yn(t,n,r,e){var i=null==t?0:t.length;for(e&&i&&(r=t[--i]);i--;)r=n(r,t[i],i,t);return r}function _n(t,n){for(var r=-1,e=null==t?0:t.length;++r<e;)if(n(t[r],r,t))return!0;return!1}var mn=jn("length");function xn(t,n,r){var e;return r(t,(function(t,r,i){if(n(t,r,i))return e=r,!1})),e}function bn(t,n,r,e){for(var i=t.length,o=r+(e?1:-1);e?o--:++o<i;)if(n(t[o],o,t))return o;return-1}function wn(t,n,r){return n==n?function(t,n,r){var e=r-1,i=t.length;for(;++e<i;)if(t[e]===n)return e;return-1}(t,n,r):bn(t,Ln,r)}function Sn(t,n,r,e){for(var i=r-1,o=t.length;++i<o;)if(e(t[i],n))return i;return-1}function Ln(t){return t!=t}function An(t,n){var r=null==t?0:t.length;return r?kn(t,n)/r:NaN}function jn(t){return function(n){return null==n?void 0:n[t]}}function En(t){return function(n){return null==t?void 0:t[n]}}function Mn(t,n,r,e,i){return i(t,(function(t,i,o){r=e?(e=!1,t):n(r,t,i,o)})),r}function kn(t,n){for(var r,e=-1,i=t.length;++e<i;){var o=n(t[e]);void 0!==o&&(r=void 0===r?o:r+o)}return r}function Fn(t,n){for(var r=-1,e=Array(t);++r<t;)e[r]=n(r);return e}function Bn(t){return function(n){return t(n)}}function Cn(t,n){return pn(n,(function(n){return t[n]}))}function On(t,n){return t.has(n)}function Rn(t,n){for(var r=-1,e=t.length;++r<e&&wn(n,t[r],0)>-1;);return r}function zn(t,n){for(var r=t.length;r--&&wn(n,t[r],0)>-1;);return r}function Pn(t,n){for(var r=t.length,e=0;r--;)t[r]===n&&++e;return e}var Tn=En({"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"}),In=En({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"});function Yn(t){return"\\"+Dt[t]}function Nn(t){return Pt.test(t)}function Un(t){var n=-1,r=Array(t.size);return t.forEach((function(t,e){r[++n]=[e,t]})),r}function Dn(t,n){return function(r){return t(n(r))}}function Wn(t,n){for(var r=-1,e=t.length,i=0,o=[];++r<e;){var a=t[r];a!==n&&a!==u||(t[r]=u,o[i++]=r)}return o}function Zn(t){var n=-1,r=Array(t.size);return t.forEach((function(t){r[++n]=t})),r}function Xn(t){var n=-1,r=Array(t.size);return t.forEach((function(t){r[++n]=[t,t]})),r}function Kn(t){return Nn(t)?function(t){var n=Rt.lastIndex=0;for(;Rt.test(t);)++n;return n}(t):mn(t)}function Vn(t){return Nn(t)?function(t){return t.match(Rt)||[]}(t):function(t){return t.split("")}(t)}var Hn=En({"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'"});var $n=function t(n){var r,e=(n=null==n?Vt:$n.defaults(Vt.Object(),n,$n.pick(Vt,It))).Array,i=n.Date,ht=n.Error,vt=n.Function,pt=n.Math,dt=n.Object,gt=n.RegExp,yt=n.String,_t=n.TypeError,mt=e.prototype,xt=vt.prototype,bt=dt.prototype,wt=n["__core-js_shared__"],St=xt.toString,Lt=bt.hasOwnProperty,At=0,jt=(r=/[^.]+$/.exec(wt&&wt.keys&&wt.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"",Et=bt.toString,Mt=St.call(dt),kt=Vt._,Ft=gt("^"+St.call(Lt).replace(K,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Bt=qt?n.Buffer:void 0,Rt=n.Symbol,Pt=n.Uint8Array,Dt=Bt?Bt.allocUnsafe:void 0,Xt=Dn(dt.getPrototypeOf,dt),Kt=dt.create,Ht=bt.propertyIsEnumerable,$t=mt.splice,Gt=Rt?Rt.isConcatSpreadable:void 0,Jt=Rt?Rt.iterator:void 0,mn=Rt?Rt.toStringTag:void 0,En=function(){try{var t=Qi(dt,"defineProperty");return t({},"",{}),t}catch(t){}}(),qn=n.clearTimeout!==Vt.clearTimeout&&n.clearTimeout,Gn=i&&i.now!==Vt.Date.now&&i.now,Jn=n.setTimeout!==Vt.setTimeout&&n.setTimeout,Qn=pt.ceil,tr=pt.floor,nr=dt.getOwnPropertySymbols,rr=Bt?Bt.isBuffer:void 0,er=n.isFinite,ir=mt.join,or=Dn(dt.keys,dt),ur=pt.max,ar=pt.min,sr=i.now,cr=n.parseInt,fr=pt.random,lr=mt.reverse,hr=Qi(n,"DataView"),vr=Qi(n,"Map"),pr=Qi(n,"Promise"),dr=Qi(n,"Set"),gr=Qi(n,"WeakMap"),yr=Qi(dt,"create"),_r=gr&&new gr,mr={},xr=Eo(hr),br=Eo(vr),wr=Eo(pr),Sr=Eo(dr),Lr=Eo(gr),Ar=Rt?Rt.prototype:void 0,jr=Ar?Ar.valueOf:void 0,Er=Ar?Ar.toString:void 0;function Mr(t){if(Zu(t)&&!Ou(t)&&!(t instanceof Cr)){if(t instanceof Br)return t;if(Lt.call(t,"__wrapped__"))return Mo(t)}return new Br(t)}var kr=function(){function t(){}return function(n){if(!Wu(n))return{};if(Kt)return Kt(n);t.prototype=n;var r=new t;return t.prototype=void 0,r}}();function Fr(){}function Br(t,n){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!n,this.__index__=0,this.__values__=void 0}function Cr(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Or(t){var n=-1,r=null==t?0:t.length;for(this.clear();++n<r;){var e=t[n];this.set(e[0],e[1])}}function Rr(t){var n=-1,r=null==t?0:t.length;for(this.clear();++n<r;){var e=t[n];this.set(e[0],e[1])}}function zr(t){var n=-1,r=null==t?0:t.length;for(this.clear();++n<r;){var e=t[n];this.set(e[0],e[1])}}function Pr(t){var n=-1,r=null==t?0:t.length;for(this.__data__=new zr;++n<r;)this.add(t[n])}function Tr(t){var n=this.__data__=new Rr(t);this.size=n.size}function Ir(t,n){var r=Ou(t),e=!r&&Cu(t),i=!r&&!e&&Tu(t),o=!r&&!e&&!i&&Ju(t),u=r||e||i||o,a=u?Fn(t.length,yt):[],s=a.length;for(var c in t)!n&&!Lt.call(t,c)||u&&("length"==c||i&&("offset"==c||"parent"==c)||o&&("buffer"==c||"byteLength"==c||"byteOffset"==c)||uo(c,s))||a.push(c);return a}function Yr(t){var n=t.length;return n?t[Pe(0,n-1)]:void 0}function Nr(t,n){return Lo(yi(t),$r(n,0,t.length))}function Ur(t){return Lo(yi(t))}function Dr(t,n,r){(void 0!==r&&!ku(t[n],r)||void 0===r&&!(n in t))&&Vr(t,n,r)}function Wr(t,n,r){var e=t[n];Lt.call(t,n)&&ku(e,r)&&(void 0!==r||n in t)||Vr(t,n,r)}function Zr(t,n){for(var r=t.length;r--;)if(ku(t[r][0],n))return r;return-1}function Xr(t,n,r,e){return te(t,(function(t,i,o){n(e,t,r(t),o)})),e}function Kr(t,n){return t&&_i(n,xa(n),t)}function Vr(t,n,r){"__proto__"==n&&En?En(t,n,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[n]=r}function Hr(t,n){for(var r=-1,i=n.length,o=e(i),u=null==t;++r<i;)o[r]=u?void 0:da(t,n[r]);return o}function $r(t,n,r){return t==t&&(void 0!==r&&(t=t<=r?t:r),void 0!==n&&(t=t>=n?t:n)),t}function qr(t,n,r,e,i,o){var u,a=1&n,c=2&n,h=4&n;if(r&&(u=i?r(t,e,i,o):r(t)),void 0!==u)return u;if(!Wu(t))return t;var w=Ou(t);if(w){if(u=function(t){var n=t.length,r=new t.constructor(n);n&&"string"==typeof t[0]&&Lt.call(t,"index")&&(r.index=t.index,r.input=t.input);return r}(t),!a)return yi(t,u)}else{var O=ro(t),R=O==v||O==p;if(Tu(t))return li(t,a);if(O==y||O==s||R&&!i){if(u=c||R?{}:io(t),!a)return c?function(t,n){return _i(t,no(t),n)}(t,function(t,n){return t&&_i(n,ba(n),t)}(u,t)):function(t,n){return _i(t,to(t),n)}(t,Kr(u,t))}else{if(!Ut[O])return i?t:{};u=function(t,n,r){var e=t.constructor;switch(n){case S:return hi(t);case f:case l:return new e(+t);case L:return function(t,n){var r=n?hi(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}(t,r);case A:case j:case E:case M:case k:case F:case"[object Uint8ClampedArray]":case B:case C:return vi(t,r);case d:return new e;case g:case x:return new e(t);case _:return function(t){var n=new t.constructor(t.source,et.exec(t));return n.lastIndex=t.lastIndex,n}(t);case m:return new e;case b:return i=t,jr?dt(jr.call(i)):{}}var i}(t,O,a)}}o||(o=new Tr);var z=o.get(t);if(z)return z;o.set(t,u),$u(t)?t.forEach((function(e){u.add(qr(e,n,r,e,t,o))})):Xu(t)&&t.forEach((function(e,i){u.set(i,qr(e,n,r,i,t,o))}));var P=w?void 0:(h?c?Ki:Xi:c?ba:xa)(t);return sn(P||t,(function(e,i){P&&(e=t[i=e]),Wr(u,i,qr(e,n,r,i,t,o))})),u}function Gr(t,n,r){var e=r.length;if(null==t)return!e;for(t=dt(t);e--;){var i=r[e],o=n[i],u=t[i];if(void 0===u&&!(i in t)||!o(u))return!1}return!0}function Jr(t,n,r){if("function"!=typeof t)throw new _t(o);return xo((function(){t.apply(void 0,r)}),n)}function Qr(t,n,r,e){var i=-1,o=hn,u=!0,a=t.length,s=[],c=n.length;if(!a)return s;r&&(n=pn(n,Bn(r))),e?(o=vn,u=!1):n.length>=200&&(o=On,u=!1,n=new Pr(n));t:for(;++i<a;){var f=t[i],l=null==r?f:r(f);if(f=e||0!==f?f:0,u&&l==l){for(var h=c;h--;)if(n[h]===l)continue t;s.push(f)}else o(n,l,e)||s.push(f)}return s}Mr.templateSettings={escape:N,evaluate:U,interpolate:D,variable:"",imports:{_:Mr}},Mr.prototype=Fr.prototype,Mr.prototype.constructor=Mr,Br.prototype=kr(Fr.prototype),Br.prototype.constructor=Br,Cr.prototype=kr(Fr.prototype),Cr.prototype.constructor=Cr,Or.prototype.clear=function(){this.__data__=yr?yr(null):{},this.size=0},Or.prototype.delete=function(t){var n=this.has(t)&&delete this.__data__[t];return this.size-=n?1:0,n},Or.prototype.get=function(t){var n=this.__data__;if(yr){var r=n[t];return"__lodash_hash_undefined__"===r?void 0:r}return Lt.call(n,t)?n[t]:void 0},Or.prototype.has=function(t){var n=this.__data__;return yr?void 0!==n[t]:Lt.call(n,t)},Or.prototype.set=function(t,n){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=yr&&void 0===n?"__lodash_hash_undefined__":n,this},Rr.prototype.clear=function(){this.__data__=[],this.size=0},Rr.prototype.delete=function(t){var n=this.__data__,r=Zr(n,t);return!(r<0)&&(r==n.length-1?n.pop():$t.call(n,r,1),--this.size,!0)},Rr.prototype.get=function(t){var n=this.__data__,r=Zr(n,t);return r<0?void 0:n[r][1]},Rr.prototype.has=function(t){return Zr(this.__data__,t)>-1},Rr.prototype.set=function(t,n){var r=this.__data__,e=Zr(r,t);return e<0?(++this.size,r.push([t,n])):r[e][1]=n,this},zr.prototype.clear=function(){this.size=0,this.__data__={hash:new Or,map:new(vr||Rr),string:new Or}},zr.prototype.delete=function(t){var n=Gi(this,t).delete(t);return this.size-=n?1:0,n},zr.prototype.get=function(t){return Gi(this,t).get(t)},zr.prototype.has=function(t){return Gi(this,t).has(t)},zr.prototype.set=function(t,n){var r=Gi(this,t),e=r.size;return r.set(t,n),this.size+=r.size==e?0:1,this},Pr.prototype.add=Pr.prototype.push=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this},Pr.prototype.has=function(t){return this.__data__.has(t)},Tr.prototype.clear=function(){this.__data__=new Rr,this.size=0},Tr.prototype.delete=function(t){var n=this.__data__,r=n.delete(t);return this.size=n.size,r},Tr.prototype.get=function(t){return this.__data__.get(t)},Tr.prototype.has=function(t){return this.__data__.has(t)},Tr.prototype.set=function(t,n){var r=this.__data__;if(r instanceof Rr){var e=r.__data__;if(!vr||e.length<199)return e.push([t,n]),this.size=++r.size,this;r=this.__data__=new zr(e)}return r.set(t,n),this.size=r.size,this};var te=bi(se),ne=bi(ce,!0);function re(t,n){var r=!0;return te(t,(function(t,e,i){return r=!!n(t,e,i)})),r}function ee(t,n,r){for(var e=-1,i=t.length;++e<i;){var o=t[e],u=n(o);if(null!=u&&(void 0===a?u==u&&!Gu(u):r(u,a)))var a=u,s=o}return s}function ie(t,n){var r=[];return te(t,(function(t,e,i){n(t,e,i)&&r.push(t)})),r}function oe(t,n,r,e,i){var o=-1,u=t.length;for(r||(r=oo),i||(i=[]);++o<u;){var a=t[o];n>0&&r(a)?n>1?oe(a,n-1,r,e,i):dn(i,a):e||(i[i.length]=a)}return i}var ue=wi(),ae=wi(!0);function se(t,n){return t&&ue(t,n,xa)}function ce(t,n){return t&&ae(t,n,xa)}function fe(t,n){return ln(n,(function(n){return Nu(t[n])}))}function le(t,n){for(var r=0,e=(n=ai(n,t)).length;null!=t&&r<e;)t=t[jo(n[r++])];return r&&r==e?t:void 0}function he(t,n,r){var e=n(t);return Ou(t)?e:dn(e,r(t))}function ve(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":mn&&mn in dt(t)?function(t){var n=Lt.call(t,mn),r=t[mn];try{t[mn]=void 0;var e=!0}catch(t){}var i=Et.call(t);e&&(n?t[mn]=r:delete t[mn]);return i}(t):function(t){return Et.call(t)}(t)}function pe(t,n){return t>n}function de(t,n){return null!=t&&Lt.call(t,n)}function ge(t,n){return null!=t&&n in dt(t)}function ye(t,n,r){for(var i=r?vn:hn,o=t[0].length,u=t.length,a=u,s=e(u),c=1/0,f=[];a--;){var l=t[a];a&&n&&(l=pn(l,Bn(n))),c=ar(l.length,c),s[a]=!r&&(n||o>=120&&l.length>=120)?new Pr(a&&l):void 0}l=t[0];var h=-1,v=s[0];t:for(;++h<o&&f.length<c;){var p=l[h],d=n?n(p):p;if(p=r||0!==p?p:0,!(v?On(v,d):i(f,d,r))){for(a=u;--a;){var g=s[a];if(!(g?On(g,d):i(t[a],d,r)))continue t}v&&v.push(d),f.push(p)}}return f}function _e(t,n,r){var e=null==(t=go(t,n=ai(n,t)))?t:t[jo(Yo(n))];return null==e?void 0:un(e,t,r)}function me(t){return Zu(t)&&ve(t)==s}function xe(t,n,r,e,i){return t===n||(null==t||null==n||!Zu(t)&&!Zu(n)?t!=t&&n!=n:function(t,n,r,e,i,o){var u=Ou(t),a=Ou(n),v=u?c:ro(t),p=a?c:ro(n),w=(v=v==s?y:v)==y,A=(p=p==s?y:p)==y,j=v==p;if(j&&Tu(t)){if(!Tu(n))return!1;u=!0,w=!1}if(j&&!w)return o||(o=new Tr),u||Ju(t)?Wi(t,n,r,e,i,o):function(t,n,r,e,i,o,u){switch(r){case L:if(t.byteLength!=n.byteLength||t.byteOffset!=n.byteOffset)return!1;t=t.buffer,n=n.buffer;case S:return!(t.byteLength!=n.byteLength||!o(new Pt(t),new Pt(n)));case f:case l:case g:return ku(+t,+n);case h:return t.name==n.name&&t.message==n.message;case _:case x:return t==n+"";case d:var a=Un;case m:var s=1&e;if(a||(a=Zn),t.size!=n.size&&!s)return!1;var c=u.get(t);if(c)return c==n;e|=2,u.set(t,n);var v=Wi(a(t),a(n),e,i,o,u);return u.delete(t),v;case b:if(jr)return jr.call(t)==jr.call(n)}return!1}(t,n,v,r,e,i,o);if(!(1&r)){var E=w&&Lt.call(t,"__wrapped__"),M=A&&Lt.call(n,"__wrapped__");if(E||M){var k=E?t.value():t,F=M?n.value():n;return o||(o=new Tr),i(k,F,r,e,o)}}if(!j)return!1;return o||(o=new Tr),function(t,n,r,e,i,o){var u=1&r,a=Xi(t),s=a.length,c=Xi(n).length;if(s!=c&&!u)return!1;var f=s;for(;f--;){var l=a[f];if(!(u?l in n:Lt.call(n,l)))return!1}var h=o.get(t),v=o.get(n);if(h&&v)return h==n&&v==t;var p=!0;o.set(t,n),o.set(n,t);var d=u;for(;++f<s;){l=a[f];var g=t[l],y=n[l];if(e)var _=u?e(y,g,l,n,t,o):e(g,y,l,t,n,o);if(!(void 0===_?g===y||i(g,y,r,e,o):_)){p=!1;break}d||(d="constructor"==l)}if(p&&!d){var m=t.constructor,x=n.constructor;m==x||!("constructor"in t)||!("constructor"in n)||"function"==typeof m&&m instanceof m&&"function"==typeof x&&x instanceof x||(p=!1)}return o.delete(t),o.delete(n),p}(t,n,r,e,i,o)}(t,n,r,e,xe,i))}function be(t,n,r,e){var i=r.length,o=i,u=!e;if(null==t)return!o;for(t=dt(t);i--;){var a=r[i];if(u&&a[2]?a[1]!==t[a[0]]:!(a[0]in t))return!1}for(;++i<o;){var s=(a=r[i])[0],c=t[s],f=a[1];if(u&&a[2]){if(void 0===c&&!(s in t))return!1}else{var l=new Tr;if(e)var h=e(c,f,s,t,n,l);if(!(void 0===h?xe(f,c,3,e,l):h))return!1}}return!0}function we(t){return!(!Wu(t)||(n=t,jt&&jt in n))&&(Nu(t)?Ft:ut).test(Eo(t));var n}function Se(t){return"function"==typeof t?t:null==t?Ka:"object"==typeof t?Ou(t)?ke(t[0],t[1]):Me(t):ns(t)}function Le(t){if(!lo(t))return or(t);var n=[];for(var r in dt(t))Lt.call(t,r)&&"constructor"!=r&&n.push(r);return n}function Ae(t){if(!Wu(t))return function(t){var n=[];if(null!=t)for(var r in dt(t))n.push(r);return n}(t);var n=lo(t),r=[];for(var e in t)("constructor"!=e||!n&&Lt.call(t,e))&&r.push(e);return r}function je(t,n){return t<n}function Ee(t,n){var r=-1,i=zu(t)?e(t.length):[];return te(t,(function(t,e,o){i[++r]=n(t,e,o)})),i}function Me(t){var n=Ji(t);return 1==n.length&&n[0][2]?vo(n[0][0],n[0][1]):function(r){return r===t||be(r,t,n)}}function ke(t,n){return so(t)&&ho(n)?vo(jo(t),n):function(r){var e=da(r,t);return void 0===e&&e===n?ga(r,t):xe(n,e,3)}}function Fe(t,n,r,e,i){t!==n&&ue(n,(function(o,u){if(i||(i=new Tr),Wu(o))!function(t,n,r,e,i,o,u){var a=_o(t,r),s=_o(n,r),c=u.get(s);if(c)return void Dr(t,r,c);var f=o?o(a,s,r+"",t,n,u):void 0,l=void 0===f;if(l){var h=Ou(s),v=!h&&Tu(s),p=!h&&!v&&Ju(s);f=s,h||v||p?Ou(a)?f=a:Pu(a)?f=yi(a):v?(l=!1,f=li(s,!0)):p?(l=!1,f=vi(s,!0)):f=[]:Vu(s)||Cu(s)?(f=a,Cu(a)?f=ua(a):Wu(a)&&!Nu(a)||(f=io(s))):l=!1}l&&(u.set(s,f),i(f,s,e,o,u),u.delete(s));Dr(t,r,f)}(t,n,u,r,Fe,e,i);else{var a=e?e(_o(t,u),o,u+"",t,n,i):void 0;void 0===a&&(a=o),Dr(t,u,a)}}),ba)}function Be(t,n){var r=t.length;if(r)return uo(n+=n<0?r:0,r)?t[n]:void 0}function Ce(t,n,r){n=n.length?pn(n,(function(t){return Ou(t)?function(n){return le(n,1===t.length?t[0]:t)}:t})):[Ka];var e=-1;return n=pn(n,Bn(qi())),function(t,n){var r=t.length;for(t.sort(n);r--;)t[r]=t[r].value;return t}(Ee(t,(function(t,r,i){return{criteria:pn(n,(function(n){return n(t)})),index:++e,value:t}})),(function(t,n){return function(t,n,r){var e=-1,i=t.criteria,o=n.criteria,u=i.length,a=r.length;for(;++e<u;){var s=pi(i[e],o[e]);if(s){if(e>=a)return s;var c=r[e];return s*("desc"==c?-1:1)}}return t.index-n.index}(t,n,r)}))}function Oe(t,n,r){for(var e=-1,i=n.length,o={};++e<i;){var u=n[e],a=le(t,u);r(a,u)&&Ue(o,ai(u,t),a)}return o}function Re(t,n,r,e){var i=e?Sn:wn,o=-1,u=n.length,a=t;for(t===n&&(n=yi(n)),r&&(a=pn(t,Bn(r)));++o<u;)for(var s=0,c=n[o],f=r?r(c):c;(s=i(a,f,s,e))>-1;)a!==t&&$t.call(a,s,1),$t.call(t,s,1);return t}function ze(t,n){for(var r=t?n.length:0,e=r-1;r--;){var i=n[r];if(r==e||i!==o){var o=i;uo(i)?$t.call(t,i,1):Qe(t,i)}}return t}function Pe(t,n){return t+tr(fr()*(n-t+1))}function Te(t,n){var r="";if(!t||n<1||n>9007199254740991)return r;do{n%2&&(r+=t),(n=tr(n/2))&&(t+=t)}while(n);return r}function Ie(t,n){return bo(po(t,n,Ka),t+"")}function Ye(t){return Yr(ka(t))}function Ne(t,n){var r=ka(t);return Lo(r,$r(n,0,r.length))}function Ue(t,n,r,e){if(!Wu(t))return t;for(var i=-1,o=(n=ai(n,t)).length,u=o-1,a=t;null!=a&&++i<o;){var s=jo(n[i]),c=r;if("__proto__"===s||"constructor"===s||"prototype"===s)return t;if(i!=u){var f=a[s];void 0===(c=e?e(f,s,a):void 0)&&(c=Wu(f)?f:uo(n[i+1])?[]:{})}Wr(a,s,c),a=a[s]}return t}var De=_r?function(t,n){return _r.set(t,n),t}:Ka,We=En?function(t,n){return En(t,"toString",{configurable:!0,enumerable:!1,value:Wa(n),writable:!0})}:Ka;function Ze(t){return Lo(ka(t))}function Xe(t,n,r){var i=-1,o=t.length;n<0&&(n=-n>o?0:o+n),(r=r>o?o:r)<0&&(r+=o),o=n>r?0:r-n>>>0,n>>>=0;for(var u=e(o);++i<o;)u[i]=t[i+n];return u}function Ke(t,n){var r;return te(t,(function(t,e,i){return!(r=n(t,e,i))})),!!r}function Ve(t,n,r){var e=0,i=null==t?e:t.length;if("number"==typeof n&&n==n&&i<=2147483647){for(;e<i;){var o=e+i>>>1,u=t[o];null!==u&&!Gu(u)&&(r?u<=n:u<n)?e=o+1:i=o}return i}return He(t,n,Ka,r)}function He(t,n,r,e){var i=0,o=null==t?0:t.length;if(0===o)return 0;for(var u=(n=r(n))!=n,a=null===n,s=Gu(n),c=void 0===n;i<o;){var f=tr((i+o)/2),l=r(t[f]),h=void 0!==l,v=null===l,p=l==l,d=Gu(l);if(u)var g=e||p;else g=c?p&&(e||h):a?p&&h&&(e||!v):s?p&&h&&!v&&(e||!d):!v&&!d&&(e?l<=n:l<n);g?i=f+1:o=f}return ar(o,4294967294)}function $e(t,n){for(var r=-1,e=t.length,i=0,o=[];++r<e;){var u=t[r],a=n?n(u):u;if(!r||!ku(a,s)){var s=a;o[i++]=0===u?0:u}}return o}function qe(t){return"number"==typeof t?t:Gu(t)?NaN:+t}function Ge(t){if("string"==typeof t)return t;if(Ou(t))return pn(t,Ge)+"";if(Gu(t))return Er?Er.call(t):"";var n=t+"";return"0"==n&&1/t==-1/0?"-0":n}function Je(t,n,r){var e=-1,i=hn,o=t.length,u=!0,a=[],s=a;if(r)u=!1,i=vn;else if(o>=200){var c=n?null:Ti(t);if(c)return Zn(c);u=!1,i=On,s=new Pr}else s=n?[]:a;t:for(;++e<o;){var f=t[e],l=n?n(f):f;if(f=r||0!==f?f:0,u&&l==l){for(var h=s.length;h--;)if(s[h]===l)continue t;n&&s.push(l),a.push(f)}else i(s,l,r)||(s!==a&&s.push(l),a.push(f))}return a}function Qe(t,n){return null==(t=go(t,n=ai(n,t)))||delete t[jo(Yo(n))]}function ti(t,n,r,e){return Ue(t,n,r(le(t,n)),e)}function ni(t,n,r,e){for(var i=t.length,o=e?i:-1;(e?o--:++o<i)&&n(t[o],o,t););return r?Xe(t,e?0:o,e?o+1:i):Xe(t,e?o+1:0,e?i:o)}function ri(t,n){var r=t;return r instanceof Cr&&(r=r.value()),gn(n,(function(t,n){return n.func.apply(n.thisArg,dn([t],n.args))}),r)}function ei(t,n,r){var i=t.length;if(i<2)return i?Je(t[0]):[];for(var o=-1,u=e(i);++o<i;)for(var a=t[o],s=-1;++s<i;)s!=o&&(u[o]=Qr(u[o]||a,t[s],n,r));return Je(oe(u,1),n,r)}function ii(t,n,r){for(var e=-1,i=t.length,o=n.length,u={};++e<i;){var a=e<o?n[e]:void 0;r(u,t[e],a)}return u}function oi(t){return Pu(t)?t:[]}function ui(t){return"function"==typeof t?t:Ka}function ai(t,n){return Ou(t)?t:so(t,n)?[t]:Ao(aa(t))}var si=Ie;function ci(t,n,r){var e=t.length;return r=void 0===r?e:r,!n&&r>=e?t:Xe(t,n,r)}var fi=qn||function(t){return Vt.clearTimeout(t)};function li(t,n){if(n)return t.slice();var r=t.length,e=Dt?Dt(r):new t.constructor(r);return t.copy(e),e}function hi(t){var n=new t.constructor(t.byteLength);return new Pt(n).set(new Pt(t)),n}function vi(t,n){var r=n?hi(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}function pi(t,n){if(t!==n){var r=void 0!==t,e=null===t,i=t==t,o=Gu(t),u=void 0!==n,a=null===n,s=n==n,c=Gu(n);if(!a&&!c&&!o&&t>n||o&&u&&s&&!a&&!c||e&&u&&s||!r&&s||!i)return 1;if(!e&&!o&&!c&&t<n||c&&r&&i&&!e&&!o||a&&r&&i||!u&&i||!s)return-1}return 0}function di(t,n,r,i){for(var o=-1,u=t.length,a=r.length,s=-1,c=n.length,f=ur(u-a,0),l=e(c+f),h=!i;++s<c;)l[s]=n[s];for(;++o<a;)(h||o<u)&&(l[r[o]]=t[o]);for(;f--;)l[s++]=t[o++];return l}function gi(t,n,r,i){for(var o=-1,u=t.length,a=-1,s=r.length,c=-1,f=n.length,l=ur(u-s,0),h=e(l+f),v=!i;++o<l;)h[o]=t[o];for(var p=o;++c<f;)h[p+c]=n[c];for(;++a<s;)(v||o<u)&&(h[p+r[a]]=t[o++]);return h}function yi(t,n){var r=-1,i=t.length;for(n||(n=e(i));++r<i;)n[r]=t[r];return n}function _i(t,n,r,e){var i=!r;r||(r={});for(var o=-1,u=n.length;++o<u;){var a=n[o],s=e?e(r[a],t[a],a,r,t):void 0;void 0===s&&(s=t[a]),i?Vr(r,a,s):Wr(r,a,s)}return r}function mi(t,n){return function(r,e){var i=Ou(r)?an:Xr,o=n?n():{};return i(r,t,qi(e,2),o)}}function xi(t){return Ie((function(n,r){var e=-1,i=r.length,o=i>1?r[i-1]:void 0,u=i>2?r[2]:void 0;for(o=t.length>3&&"function"==typeof o?(i--,o):void 0,u&&ao(r[0],r[1],u)&&(o=i<3?void 0:o,i=1),n=dt(n);++e<i;){var a=r[e];a&&t(n,a,e,o)}return n}))}function bi(t,n){return function(r,e){if(null==r)return r;if(!zu(r))return t(r,e);for(var i=r.length,o=n?i:-1,u=dt(r);(n?o--:++o<i)&&!1!==e(u[o],o,u););return r}}function wi(t){return function(n,r,e){for(var i=-1,o=dt(n),u=e(n),a=u.length;a--;){var s=u[t?a:++i];if(!1===r(o[s],s,o))break}return n}}function Si(t){return function(n){var r=Nn(n=aa(n))?Vn(n):void 0,e=r?r[0]:n.charAt(0),i=r?ci(r,1).join(""):n.slice(1);return e[t]()+i}}function Li(t){return function(n){return gn(Na(Ca(n).replace(Ct,"")),t,"")}}function Ai(t){return function(){var n=arguments;switch(n.length){case 0:return new t;case 1:return new t(n[0]);case 2:return new t(n[0],n[1]);case 3:return new t(n[0],n[1],n[2]);case 4:return new t(n[0],n[1],n[2],n[3]);case 5:return new t(n[0],n[1],n[2],n[3],n[4]);case 6:return new t(n[0],n[1],n[2],n[3],n[4],n[5]);case 7:return new t(n[0],n[1],n[2],n[3],n[4],n[5],n[6])}var r=kr(t.prototype),e=t.apply(r,n);return Wu(e)?e:r}}function ji(t){return function(n,r,e){var i=dt(n);if(!zu(n)){var o=qi(r,3);n=xa(n),r=function(t){return o(i[t],t,i)}}var u=t(n,r,e);return u>-1?i[o?n[u]:u]:void 0}}function Ei(t){return Zi((function(n){var r=n.length,e=r,i=Br.prototype.thru;for(t&&n.reverse();e--;){var u=n[e];if("function"!=typeof u)throw new _t(o);if(i&&!a&&"wrapper"==Hi(u))var a=new Br([],!0)}for(e=a?e:r;++e<r;){var s=Hi(u=n[e]),c="wrapper"==s?Vi(u):void 0;a=c&&co(c[0])&&424==c[1]&&!c[4].length&&1==c[9]?a[Hi(c[0])].apply(a,c[3]):1==u.length&&co(u)?a[s]():a.thru(u)}return function(){var t=arguments,e=t[0];if(a&&1==t.length&&Ou(e))return a.plant(e).value();for(var i=0,o=r?n[i].apply(this,t):e;++i<r;)o=n[i].call(this,o);return o}}))}function Mi(t,n,r,i,o,u,a,s,c,f){var l=128&n,h=1&n,v=2&n,p=24&n,d=512&n,g=v?void 0:Ai(t);return function y(){for(var _=arguments.length,m=e(_),x=_;x--;)m[x]=arguments[x];if(p)var b=$i(y),w=Pn(m,b);if(i&&(m=di(m,i,o,p)),u&&(m=gi(m,u,a,p)),_-=w,p&&_<f){var S=Wn(m,b);return zi(t,n,Mi,y.placeholder,r,m,S,s,c,f-_)}var L=h?r:this,A=v?L[t]:t;return _=m.length,s?m=yo(m,s):d&&_>1&&m.reverse(),l&&c<_&&(m.length=c),this&&this!==Vt&&this instanceof y&&(A=g||Ai(A)),A.apply(L,m)}}function ki(t,n){return function(r,e){return function(t,n,r,e){return se(t,(function(t,i,o){n(e,r(t),i,o)})),e}(r,t,n(e),{})}}function Fi(t,n){return function(r,e){var i;if(void 0===r&&void 0===e)return n;if(void 0!==r&&(i=r),void 0!==e){if(void 0===i)return e;"string"==typeof r||"string"==typeof e?(r=Ge(r),e=Ge(e)):(r=qe(r),e=qe(e)),i=t(r,e)}return i}}function Bi(t){return Zi((function(n){return n=pn(n,Bn(qi())),Ie((function(r){var e=this;return t(n,(function(t){return un(t,e,r)}))}))}))}function Ci(t,n){var r=(n=void 0===n?" ":Ge(n)).length;if(r<2)return r?Te(n,t):n;var e=Te(n,Qn(t/Kn(n)));return Nn(n)?ci(Vn(e),0,t).join(""):e.slice(0,t)}function Oi(t){return function(n,r,i){return i&&"number"!=typeof i&&ao(n,r,i)&&(r=i=void 0),n=ra(n),void 0===r?(r=n,n=0):r=ra(r),function(t,n,r,i){for(var o=-1,u=ur(Qn((n-t)/(r||1)),0),a=e(u);u--;)a[i?u:++o]=t,t+=r;return a}(n,r,i=void 0===i?n<r?1:-1:ra(i),t)}}function Ri(t){return function(n,r){return"string"==typeof n&&"string"==typeof r||(n=oa(n),r=oa(r)),t(n,r)}}function zi(t,n,r,e,i,o,u,a,s,c){var f=8&n;n|=f?32:64,4&(n&=~(f?64:32))||(n&=-4);var l=[t,n,i,f?o:void 0,f?u:void 0,f?void 0:o,f?void 0:u,a,s,c],h=r.apply(void 0,l);return co(t)&&mo(h,l),h.placeholder=e,wo(h,t,n)}function Pi(t){var n=pt[t];return function(t,r){if(t=oa(t),(r=null==r?0:ar(ea(r),292))&&er(t)){var e=(aa(t)+"e").split("e");return+((e=(aa(n(e[0]+"e"+(+e[1]+r)))+"e").split("e"))[0]+"e"+(+e[1]-r))}return n(t)}}var Ti=dr&&1/Zn(new dr([,-0]))[1]==1/0?function(t){return new dr(t)}:Ga;function Ii(t){return function(n){var r=ro(n);return r==d?Un(n):r==m?Xn(n):function(t,n){return pn(n,(function(n){return[n,t[n]]}))}(n,t(n))}}function Yi(t,n,r,i,a,s,c,f){var l=2&n;if(!l&&"function"!=typeof t)throw new _t(o);var h=i?i.length:0;if(h||(n&=-97,i=a=void 0),c=void 0===c?c:ur(ea(c),0),f=void 0===f?f:ea(f),h-=a?a.length:0,64&n){var v=i,p=a;i=a=void 0}var d=l?void 0:Vi(t),g=[t,n,r,i,a,v,p,s,c,f];if(d&&function(t,n){var r=t[1],e=n[1],i=r|e,o=i<131,a=128==e&&8==r||128==e&&256==r&&t[7].length<=n[8]||384==e&&n[7].length<=n[8]&&8==r;if(!o&&!a)return t;1&e&&(t[2]=n[2],i|=1&r?0:4);var s=n[3];if(s){var c=t[3];t[3]=c?di(c,s,n[4]):s,t[4]=c?Wn(t[3],u):n[4]}(s=n[5])&&(c=t[5],t[5]=c?gi(c,s,n[6]):s,t[6]=c?Wn(t[5],u):n[6]);(s=n[7])&&(t[7]=s);128&e&&(t[8]=null==t[8]?n[8]:ar(t[8],n[8]));null==t[9]&&(t[9]=n[9]);t[0]=n[0],t[1]=i}(g,d),t=g[0],n=g[1],r=g[2],i=g[3],a=g[4],!(f=g[9]=void 0===g[9]?l?0:t.length:ur(g[9]-h,0))&&24&n&&(n&=-25),n&&1!=n)y=8==n||16==n?function(t,n,r){var i=Ai(t);return function o(){for(var u=arguments.length,a=e(u),s=u,c=$i(o);s--;)a[s]=arguments[s];var f=u<3&&a[0]!==c&&a[u-1]!==c?[]:Wn(a,c);if((u-=f.length)<r)return zi(t,n,Mi,o.placeholder,void 0,a,f,void 0,void 0,r-u);var l=this&&this!==Vt&&this instanceof o?i:t;return un(l,this,a)}}(t,n,f):32!=n&&33!=n||a.length?Mi.apply(void 0,g):function(t,n,r,i){var o=1&n,u=Ai(t);return function n(){for(var a=-1,s=arguments.length,c=-1,f=i.length,l=e(f+s),h=this&&this!==Vt&&this instanceof n?u:t;++c<f;)l[c]=i[c];for(;s--;)l[c++]=arguments[++a];return un(h,o?r:this,l)}}(t,n,r,i);else var y=function(t,n,r){var e=1&n,i=Ai(t);return function n(){var o=this&&this!==Vt&&this instanceof n?i:t;return o.apply(e?r:this,arguments)}}(t,n,r);return wo((d?De:mo)(y,g),t,n)}function Ni(t,n,r,e){return void 0===t||ku(t,bt[r])&&!Lt.call(e,r)?n:t}function Ui(t,n,r,e,i,o){return Wu(t)&&Wu(n)&&(o.set(n,t),Fe(t,n,void 0,Ui,o),o.delete(n)),t}function Di(t){return Vu(t)?void 0:t}function Wi(t,n,r,e,i,o){var u=1&r,a=t.length,s=n.length;if(a!=s&&!(u&&s>a))return!1;var c=o.get(t),f=o.get(n);if(c&&f)return c==n&&f==t;var l=-1,h=!0,v=2&r?new Pr:void 0;for(o.set(t,n),o.set(n,t);++l<a;){var p=t[l],d=n[l];if(e)var g=u?e(d,p,l,n,t,o):e(p,d,l,t,n,o);if(void 0!==g){if(g)continue;h=!1;break}if(v){if(!_n(n,(function(t,n){if(!On(v,n)&&(p===t||i(p,t,r,e,o)))return v.push(n)}))){h=!1;break}}else if(p!==d&&!i(p,d,r,e,o)){h=!1;break}}return o.delete(t),o.delete(n),h}function Zi(t){return bo(po(t,void 0,Ro),t+"")}function Xi(t){return he(t,xa,to)}function Ki(t){return he(t,ba,no)}var Vi=_r?function(t){return _r.get(t)}:Ga;function Hi(t){for(var n=t.name+"",r=mr[n],e=Lt.call(mr,n)?r.length:0;e--;){var i=r[e],o=i.func;if(null==o||o==t)return i.name}return n}function $i(t){return(Lt.call(Mr,"placeholder")?Mr:t).placeholder}function qi(){var t=Mr.iteratee||Va;return t=t===Va?Se:t,arguments.length?t(arguments[0],arguments[1]):t}function Gi(t,n){var r,e,i=t.__data__;return("string"==(e=typeof(r=n))||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==r:null===r)?i["string"==typeof n?"string":"hash"]:i.map}function Ji(t){for(var n=xa(t),r=n.length;r--;){var e=n[r],i=t[e];n[r]=[e,i,ho(i)]}return n}function Qi(t,n){var r=function(t,n){return null==t?void 0:t[n]}(t,n);return we(r)?r:void 0}var to=nr?function(t){return null==t?[]:(t=dt(t),ln(nr(t),(function(n){return Ht.call(t,n)})))}:is,no=nr?function(t){for(var n=[];t;)dn(n,to(t)),t=Xt(t);return n}:is,ro=ve;function eo(t,n,r){for(var e=-1,i=(n=ai(n,t)).length,o=!1;++e<i;){var u=jo(n[e]);if(!(o=null!=t&&r(t,u)))break;t=t[u]}return o||++e!=i?o:!!(i=null==t?0:t.length)&&Du(i)&&uo(u,i)&&(Ou(t)||Cu(t))}function io(t){return"function"!=typeof t.constructor||lo(t)?{}:kr(Xt(t))}function oo(t){return Ou(t)||Cu(t)||!!(Gt&&t&&t[Gt])}function uo(t,n){var r=typeof t;return!!(n=null==n?9007199254740991:n)&&("number"==r||"symbol"!=r&&st.test(t))&&t>-1&&t%1==0&&t<n}function ao(t,n,r){if(!Wu(r))return!1;var e=typeof n;return!!("number"==e?zu(r)&&uo(n,r.length):"string"==e&&n in r)&&ku(r[n],t)}function so(t,n){if(Ou(t))return!1;var r=typeof t;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=t&&!Gu(t))||(Z.test(t)||!W.test(t)||null!=n&&t in dt(n))}function co(t){var n=Hi(t),r=Mr[n];if("function"!=typeof r||!(n in Cr.prototype))return!1;if(t===r)return!0;var e=Vi(r);return!!e&&t===e[0]}(hr&&ro(new hr(new ArrayBuffer(1)))!=L||vr&&ro(new vr)!=d||pr&&"[object Promise]"!=ro(pr.resolve())||dr&&ro(new dr)!=m||gr&&ro(new gr)!=w)&&(ro=function(t){var n=ve(t),r=n==y?t.constructor:void 0,e=r?Eo(r):"";if(e)switch(e){case xr:return L;case br:return d;case wr:return"[object Promise]";case Sr:return m;case Lr:return w}return n});var fo=wt?Nu:os;function lo(t){var n=t&&t.constructor;return t===("function"==typeof n&&n.prototype||bt)}function ho(t){return t==t&&!Wu(t)}function vo(t,n){return function(r){return null!=r&&(r[t]===n&&(void 0!==n||t in dt(r)))}}function po(t,n,r){return n=ur(void 0===n?t.length-1:n,0),function(){for(var i=arguments,o=-1,u=ur(i.length-n,0),a=e(u);++o<u;)a[o]=i[n+o];o=-1;for(var s=e(n+1);++o<n;)s[o]=i[o];return s[n]=r(a),un(t,this,s)}}function go(t,n){return n.length<2?t:le(t,Xe(n,0,-1))}function yo(t,n){for(var r=t.length,e=ar(n.length,r),i=yi(t);e--;){var o=n[e];t[e]=uo(o,r)?i[o]:void 0}return t}function _o(t,n){if(("constructor"!==n||"function"!=typeof t[n])&&"__proto__"!=n)return t[n]}var mo=So(De),xo=Jn||function(t,n){return Vt.setTimeout(t,n)},bo=So(We);function wo(t,n,r){var e=n+"";return bo(t,function(t,n){var r=n.length;if(!r)return t;var e=r-1;return n[e]=(r>1?"& ":"")+n[e],n=n.join(r>2?", ":" "),t.replace(G,"{\n/* [wrapped with "+n+"] */\n")}(e,function(t,n){return sn(a,(function(r){var e="_."+r[0];n&r[1]&&!hn(t,e)&&t.push(e)})),t.sort()}(function(t){var n=t.match(J);return n?n[1].split(Q):[]}(e),r)))}function So(t){var n=0,r=0;return function(){var e=sr(),i=16-(e-r);if(r=e,i>0){if(++n>=800)return arguments[0]}else n=0;return t.apply(void 0,arguments)}}function Lo(t,n){var r=-1,e=t.length,i=e-1;for(n=void 0===n?e:n;++r<n;){var o=Pe(r,i),u=t[o];t[o]=t[r],t[r]=u}return t.length=n,t}var Ao=function(t){var n=Su(t,(function(t){return 500===r.size&&r.clear(),t})),r=n.cache;return n}((function(t){var n=[];return 46===t.charCodeAt(0)&&n.push(""),t.replace(X,(function(t,r,e,i){n.push(e?i.replace(nt,"$1"):r||t)})),n}));function jo(t){if("string"==typeof t||Gu(t))return t;var n=t+"";return"0"==n&&1/t==-1/0?"-0":n}function Eo(t){if(null!=t){try{return St.call(t)}catch(t){}try{return t+""}catch(t){}}return""}function Mo(t){if(t instanceof Cr)return t.clone();var n=new Br(t.__wrapped__,t.__chain__);return n.__actions__=yi(t.__actions__),n.__index__=t.__index__,n.__values__=t.__values__,n}var ko=Ie((function(t,n){return Pu(t)?Qr(t,oe(n,1,Pu,!0)):[]})),Fo=Ie((function(t,n){var r=Yo(n);return Pu(r)&&(r=void 0),Pu(t)?Qr(t,oe(n,1,Pu,!0),qi(r,2)):[]})),Bo=Ie((function(t,n){var r=Yo(n);return Pu(r)&&(r=void 0),Pu(t)?Qr(t,oe(n,1,Pu,!0),void 0,r):[]}));function Co(t,n,r){var e=null==t?0:t.length;if(!e)return-1;var i=null==r?0:ea(r);return i<0&&(i=ur(e+i,0)),bn(t,qi(n,3),i)}function Oo(t,n,r){var e=null==t?0:t.length;if(!e)return-1;var i=e-1;return void 0!==r&&(i=ea(r),i=r<0?ur(e+i,0):ar(i,e-1)),bn(t,qi(n,3),i,!0)}function Ro(t){return(null==t?0:t.length)?oe(t,1):[]}function zo(t){return t&&t.length?t[0]:void 0}var Po=Ie((function(t){var n=pn(t,oi);return n.length&&n[0]===t[0]?ye(n):[]})),To=Ie((function(t){var n=Yo(t),r=pn(t,oi);return n===Yo(r)?n=void 0:r.pop(),r.length&&r[0]===t[0]?ye(r,qi(n,2)):[]})),Io=Ie((function(t){var n=Yo(t),r=pn(t,oi);return(n="function"==typeof n?n:void 0)&&r.pop(),r.length&&r[0]===t[0]?ye(r,void 0,n):[]}));function Yo(t){var n=null==t?0:t.length;return n?t[n-1]:void 0}var No=Ie(Uo);function Uo(t,n){return t&&t.length&&n&&n.length?Re(t,n):t}var Do=Zi((function(t,n){var r=null==t?0:t.length,e=Hr(t,n);return ze(t,pn(n,(function(t){return uo(t,r)?+t:t})).sort(pi)),e}));function Wo(t){return null==t?t:lr.call(t)}var Zo=Ie((function(t){return Je(oe(t,1,Pu,!0))})),Xo=Ie((function(t){var n=Yo(t);return Pu(n)&&(n=void 0),Je(oe(t,1,Pu,!0),qi(n,2))})),Ko=Ie((function(t){var n=Yo(t);return n="function"==typeof n?n:void 0,Je(oe(t,1,Pu,!0),void 0,n)}));function Vo(t){if(!t||!t.length)return[];var n=0;return t=ln(t,(function(t){if(Pu(t))return n=ur(t.length,n),!0})),Fn(n,(function(n){return pn(t,jn(n))}))}function Ho(t,n){if(!t||!t.length)return[];var r=Vo(t);return null==n?r:pn(r,(function(t){return un(n,void 0,t)}))}var $o=Ie((function(t,n){return Pu(t)?Qr(t,n):[]})),qo=Ie((function(t){return ei(ln(t,Pu))})),Go=Ie((function(t){var n=Yo(t);return Pu(n)&&(n=void 0),ei(ln(t,Pu),qi(n,2))})),Jo=Ie((function(t){var n=Yo(t);return n="function"==typeof n?n:void 0,ei(ln(t,Pu),void 0,n)})),Qo=Ie(Vo);var tu=Ie((function(t){var n=t.length,r=n>1?t[n-1]:void 0;return r="function"==typeof r?(t.pop(),r):void 0,Ho(t,r)}));function nu(t){var n=Mr(t);return n.__chain__=!0,n}function ru(t,n){return n(t)}var eu=Zi((function(t){var n=t.length,r=n?t[0]:0,e=this.__wrapped__,i=function(n){return Hr(n,t)};return!(n>1||this.__actions__.length)&&e instanceof Cr&&uo(r)?((e=e.slice(r,+r+(n?1:0))).__actions__.push({func:ru,args:[i],thisArg:void 0}),new Br(e,this.__chain__).thru((function(t){return n&&!t.length&&t.push(void 0),t}))):this.thru(i)}));var iu=mi((function(t,n,r){Lt.call(t,r)?++t[r]:Vr(t,r,1)}));var ou=ji(Co),uu=ji(Oo);function au(t,n){return(Ou(t)?sn:te)(t,qi(n,3))}function su(t,n){return(Ou(t)?cn:ne)(t,qi(n,3))}var cu=mi((function(t,n,r){Lt.call(t,r)?t[r].push(n):Vr(t,r,[n])}));var fu=Ie((function(t,n,r){var i=-1,o="function"==typeof n,u=zu(t)?e(t.length):[];return te(t,(function(t){u[++i]=o?un(n,t,r):_e(t,n,r)})),u})),lu=mi((function(t,n,r){Vr(t,r,n)}));function hu(t,n){return(Ou(t)?pn:Ee)(t,qi(n,3))}var vu=mi((function(t,n,r){t[r?0:1].push(n)}),(function(){return[[],[]]}));var pu=Ie((function(t,n){if(null==t)return[];var r=n.length;return r>1&&ao(t,n[0],n[1])?n=[]:r>2&&ao(n[0],n[1],n[2])&&(n=[n[0]]),Ce(t,oe(n,1),[])})),du=Gn||function(){return Vt.Date.now()};function gu(t,n,r){return n=r?void 0:n,Yi(t,128,void 0,void 0,void 0,void 0,n=t&&null==n?t.length:n)}function yu(t,n){var r;if("function"!=typeof n)throw new _t(o);return t=ea(t),function(){return--t>0&&(r=n.apply(this,arguments)),t<=1&&(n=void 0),r}}var _u=Ie((function(t,n,r){var e=1;if(r.length){var i=Wn(r,$i(_u));e|=32}return Yi(t,e,n,r,i)})),mu=Ie((function(t,n,r){var e=3;if(r.length){var i=Wn(r,$i(mu));e|=32}return Yi(n,e,t,r,i)}));function xu(t,n,r){var e,i,u,a,s,c,f=0,l=!1,h=!1,v=!0;if("function"!=typeof t)throw new _t(o);function p(n){var r=e,o=i;return e=i=void 0,f=n,a=t.apply(o,r)}function d(t){return f=t,s=xo(y,n),l?p(t):a}function g(t){var r=t-c;return void 0===c||r>=n||r<0||h&&t-f>=u}function y(){var t=du();if(g(t))return _(t);s=xo(y,function(t){var r=n-(t-c);return h?ar(r,u-(t-f)):r}(t))}function _(t){return s=void 0,v&&e?p(t):(e=i=void 0,a)}function m(){var t=du(),r=g(t);if(e=arguments,i=this,c=t,r){if(void 0===s)return d(c);if(h)return fi(s),s=xo(y,n),p(c)}return void 0===s&&(s=xo(y,n)),a}return n=oa(n)||0,Wu(r)&&(l=!!r.leading,u=(h="maxWait"in r)?ur(oa(r.maxWait)||0,n):u,v="trailing"in r?!!r.trailing:v),m.cancel=function(){void 0!==s&&fi(s),f=0,e=c=i=s=void 0},m.flush=function(){return void 0===s?a:_(du())},m}var bu=Ie((function(t,n){return Jr(t,1,n)})),wu=Ie((function(t,n,r){return Jr(t,oa(n)||0,r)}));function Su(t,n){if("function"!=typeof t||null!=n&&"function"!=typeof n)throw new _t(o);var r=function(){var e=arguments,i=n?n.apply(this,e):e[0],o=r.cache;if(o.has(i))return o.get(i);var u=t.apply(this,e);return r.cache=o.set(i,u)||o,u};return r.cache=new(Su.Cache||zr),r}function Lu(t){if("function"!=typeof t)throw new _t(o);return function(){var n=arguments;switch(n.length){case 0:return!t.call(this);case 1:return!t.call(this,n[0]);case 2:return!t.call(this,n[0],n[1]);case 3:return!t.call(this,n[0],n[1],n[2])}return!t.apply(this,n)}}Su.Cache=zr;var Au=si((function(t,n){var r=(n=1==n.length&&Ou(n[0])?pn(n[0],Bn(qi())):pn(oe(n,1),Bn(qi()))).length;return Ie((function(e){for(var i=-1,o=ar(e.length,r);++i<o;)e[i]=n[i].call(this,e[i]);return un(t,this,e)}))})),ju=Ie((function(t,n){return Yi(t,32,void 0,n,Wn(n,$i(ju)))})),Eu=Ie((function(t,n){return Yi(t,64,void 0,n,Wn(n,$i(Eu)))})),Mu=Zi((function(t,n){return Yi(t,256,void 0,void 0,void 0,n)}));function ku(t,n){return t===n||t!=t&&n!=n}var Fu=Ri(pe),Bu=Ri((function(t,n){return t>=n})),Cu=me(function(){return arguments}())?me:function(t){return Zu(t)&&Lt.call(t,"callee")&&!Ht.call(t,"callee")},Ou=e.isArray,Ru=Qt?Bn(Qt):function(t){return Zu(t)&&ve(t)==S};function zu(t){return null!=t&&Du(t.length)&&!Nu(t)}function Pu(t){return Zu(t)&&zu(t)}var Tu=rr||os,Iu=tn?Bn(tn):function(t){return Zu(t)&&ve(t)==l};function Yu(t){if(!Zu(t))return!1;var n=ve(t);return n==h||"[object DOMException]"==n||"string"==typeof t.message&&"string"==typeof t.name&&!Vu(t)}function Nu(t){if(!Wu(t))return!1;var n=ve(t);return n==v||n==p||"[object AsyncFunction]"==n||"[object Proxy]"==n}function Uu(t){return"number"==typeof t&&t==ea(t)}function Du(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}function Wu(t){var n=typeof t;return null!=t&&("object"==n||"function"==n)}function Zu(t){return null!=t&&"object"==typeof t}var Xu=nn?Bn(nn):function(t){return Zu(t)&&ro(t)==d};function Ku(t){return"number"==typeof t||Zu(t)&&ve(t)==g}function Vu(t){if(!Zu(t)||ve(t)!=y)return!1;var n=Xt(t);if(null===n)return!0;var r=Lt.call(n,"constructor")&&n.constructor;return"function"==typeof r&&r instanceof r&&St.call(r)==Mt}var Hu=rn?Bn(rn):function(t){return Zu(t)&&ve(t)==_};var $u=en?Bn(en):function(t){return Zu(t)&&ro(t)==m};function qu(t){return"string"==typeof t||!Ou(t)&&Zu(t)&&ve(t)==x}function Gu(t){return"symbol"==typeof t||Zu(t)&&ve(t)==b}var Ju=on?Bn(on):function(t){return Zu(t)&&Du(t.length)&&!!Nt[ve(t)]};var Qu=Ri(je),ta=Ri((function(t,n){return t<=n}));function na(t){if(!t)return[];if(zu(t))return qu(t)?Vn(t):yi(t);if(Jt&&t[Jt])return function(t){for(var n,r=[];!(n=t.next()).done;)r.push(n.value);return r}(t[Jt]());var n=ro(t);return(n==d?Un:n==m?Zn:ka)(t)}function ra(t){return t?(t=oa(t))===1/0||t===-1/0?17976931348623157e292*(t<0?-1:1):t==t?t:0:0===t?t:0}function ea(t){var n=ra(t),r=n%1;return n==n?r?n-r:n:0}function ia(t){return t?$r(ea(t),0,4294967295):0}function oa(t){if("number"==typeof t)return t;if(Gu(t))return NaN;if(Wu(t)){var n="function"==typeof t.valueOf?t.valueOf():t;t=Wu(n)?n+"":n}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(H,"");var r=ot.test(t);return r||at.test(t)?Zt(t.slice(2),r?2:8):it.test(t)?NaN:+t}function ua(t){return _i(t,ba(t))}function aa(t){return null==t?"":Ge(t)}var sa=xi((function(t,n){if(lo(n)||zu(n))_i(n,xa(n),t);else for(var r in n)Lt.call(n,r)&&Wr(t,r,n[r])})),ca=xi((function(t,n){_i(n,ba(n),t)})),fa=xi((function(t,n,r,e){_i(n,ba(n),t,e)})),la=xi((function(t,n,r,e){_i(n,xa(n),t,e)})),ha=Zi(Hr);var va=Ie((function(t,n){t=dt(t);var r=-1,e=n.length,i=e>2?n[2]:void 0;for(i&&ao(n[0],n[1],i)&&(e=1);++r<e;)for(var o=n[r],u=ba(o),a=-1,s=u.length;++a<s;){var c=u[a],f=t[c];(void 0===f||ku(f,bt[c])&&!Lt.call(t,c))&&(t[c]=o[c])}return t})),pa=Ie((function(t){return t.push(void 0,Ui),un(Sa,void 0,t)}));function da(t,n,r){var e=null==t?void 0:le(t,n);return void 0===e?r:e}function ga(t,n){return null!=t&&eo(t,n,ge)}var ya=ki((function(t,n,r){null!=n&&"function"!=typeof n.toString&&(n=Et.call(n)),t[n]=r}),Wa(Ka)),_a=ki((function(t,n,r){null!=n&&"function"!=typeof n.toString&&(n=Et.call(n)),Lt.call(t,n)?t[n].push(r):t[n]=[r]}),qi),ma=Ie(_e);function xa(t){return zu(t)?Ir(t):Le(t)}function ba(t){return zu(t)?Ir(t,!0):Ae(t)}var wa=xi((function(t,n,r){Fe(t,n,r)})),Sa=xi((function(t,n,r,e){Fe(t,n,r,e)})),La=Zi((function(t,n){var r={};if(null==t)return r;var e=!1;n=pn(n,(function(n){return n=ai(n,t),e||(e=n.length>1),n})),_i(t,Ki(t),r),e&&(r=qr(r,7,Di));for(var i=n.length;i--;)Qe(r,n[i]);return r}));var Aa=Zi((function(t,n){return null==t?{}:function(t,n){return Oe(t,n,(function(n,r){return ga(t,r)}))}(t,n)}));function ja(t,n){if(null==t)return{};var r=pn(Ki(t),(function(t){return[t]}));return n=qi(n),Oe(t,r,(function(t,r){return n(t,r[0])}))}var Ea=Ii(xa),Ma=Ii(ba);function ka(t){return null==t?[]:Cn(t,xa(t))}var Fa=Li((function(t,n,r){return n=n.toLowerCase(),t+(r?Ba(n):n)}));function Ba(t){return Ya(aa(t).toLowerCase())}function Ca(t){return(t=aa(t))&&t.replace(ct,Tn).replace(Ot,"")}var Oa=Li((function(t,n,r){return t+(r?"-":"")+n.toLowerCase()})),Ra=Li((function(t,n,r){return t+(r?" ":"")+n.toLowerCase()})),za=Si("toLowerCase");var Pa=Li((function(t,n,r){return t+(r?"_":"")+n.toLowerCase()}));var Ta=Li((function(t,n,r){return t+(r?" ":"")+Ya(n)}));var Ia=Li((function(t,n,r){return t+(r?" ":"")+n.toUpperCase()})),Ya=Si("toUpperCase");function Na(t,n,r){return t=aa(t),void 0===(n=r?void 0:n)?function(t){return Tt.test(t)}(t)?function(t){return t.match(zt)||[]}(t):function(t){return t.match(tt)||[]}(t):t.match(n)||[]}var Ua=Ie((function(t,n){try{return un(t,void 0,n)}catch(t){return Yu(t)?t:new ht(t)}})),Da=Zi((function(t,n){return sn(n,(function(n){n=jo(n),Vr(t,n,_u(t[n],t))})),t}));function Wa(t){return function(){return t}}var Za=Ei(),Xa=Ei(!0);function Ka(t){return t}function Va(t){return Se("function"==typeof t?t:qr(t,1))}var Ha=Ie((function(t,n){return function(r){return _e(r,t,n)}})),$a=Ie((function(t,n){return function(r){return _e(t,r,n)}}));function qa(t,n,r){var e=xa(n),i=fe(n,e);null!=r||Wu(n)&&(i.length||!e.length)||(r=n,n=t,t=this,i=fe(n,xa(n)));var o=!(Wu(r)&&"chain"in r&&!r.chain),u=Nu(t);return sn(i,(function(r){var e=n[r];t[r]=e,u&&(t.prototype[r]=function(){var n=this.__chain__;if(o||n){var r=t(this.__wrapped__),i=r.__actions__=yi(this.__actions__);return i.push({func:e,args:arguments,thisArg:t}),r.__chain__=n,r}return e.apply(t,dn([this.value()],arguments))})})),t}function Ga(){}var Ja=Bi(pn),Qa=Bi(fn),ts=Bi(_n);function ns(t){return so(t)?jn(jo(t)):function(t){return function(n){return le(n,t)}}(t)}var rs=Oi(),es=Oi(!0);function is(){return[]}function os(){return!1}var us=Fi((function(t,n){return t+n}),0),as=Pi("ceil"),ss=Fi((function(t,n){return t/n}),1),cs=Pi("floor");var fs,ls=Fi((function(t,n){return t*n}),1),hs=Pi("round"),vs=Fi((function(t,n){return t-n}),0);return Mr.after=function(t,n){if("function"!=typeof n)throw new _t(o);return t=ea(t),function(){if(--t<1)return n.apply(this,arguments)}},Mr.ary=gu,Mr.assign=sa,Mr.assignIn=ca,Mr.assignInWith=fa,Mr.assignWith=la,Mr.at=ha,Mr.before=yu,Mr.bind=_u,Mr.bindAll=Da,Mr.bindKey=mu,Mr.castArray=function(){if(!arguments.length)return[];var t=arguments[0];return Ou(t)?t:[t]},Mr.chain=nu,Mr.chunk=function(t,n,r){n=(r?ao(t,n,r):void 0===n)?1:ur(ea(n),0);var i=null==t?0:t.length;if(!i||n<1)return[];for(var o=0,u=0,a=e(Qn(i/n));o<i;)a[u++]=Xe(t,o,o+=n);return a},Mr.compact=function(t){for(var n=-1,r=null==t?0:t.length,e=0,i=[];++n<r;){var o=t[n];o&&(i[e++]=o)}return i},Mr.concat=function(){var t=arguments.length;if(!t)return[];for(var n=e(t-1),r=arguments[0],i=t;i--;)n[i-1]=arguments[i];return dn(Ou(r)?yi(r):[r],oe(n,1))},Mr.cond=function(t){var n=null==t?0:t.length,r=qi();return t=n?pn(t,(function(t){if("function"!=typeof t[1])throw new _t(o);return[r(t[0]),t[1]]})):[],Ie((function(r){for(var e=-1;++e<n;){var i=t[e];if(un(i[0],this,r))return un(i[1],this,r)}}))},Mr.conforms=function(t){return function(t){var n=xa(t);return function(r){return Gr(r,t,n)}}(qr(t,1))},Mr.constant=Wa,Mr.countBy=iu,Mr.create=function(t,n){var r=kr(t);return null==n?r:Kr(r,n)},Mr.curry=function t(n,r,e){var i=Yi(n,8,void 0,void 0,void 0,void 0,void 0,r=e?void 0:r);return i.placeholder=t.placeholder,i},Mr.curryRight=function t(n,r,e){var i=Yi(n,16,void 0,void 0,void 0,void 0,void 0,r=e?void 0:r);return i.placeholder=t.placeholder,i},Mr.debounce=xu,Mr.defaults=va,Mr.defaultsDeep=pa,Mr.defer=bu,Mr.delay=wu,Mr.difference=ko,Mr.differenceBy=Fo,Mr.differenceWith=Bo,Mr.drop=function(t,n,r){var e=null==t?0:t.length;return e?Xe(t,(n=r||void 0===n?1:ea(n))<0?0:n,e):[]},Mr.dropRight=function(t,n,r){var e=null==t?0:t.length;return e?Xe(t,0,(n=e-(n=r||void 0===n?1:ea(n)))<0?0:n):[]},Mr.dropRightWhile=function(t,n){return t&&t.length?ni(t,qi(n,3),!0,!0):[]},Mr.dropWhile=function(t,n){return t&&t.length?ni(t,qi(n,3),!0):[]},Mr.fill=function(t,n,r,e){var i=null==t?0:t.length;return i?(r&&"number"!=typeof r&&ao(t,n,r)&&(r=0,e=i),function(t,n,r,e){var i=t.length;for((r=ea(r))<0&&(r=-r>i?0:i+r),(e=void 0===e||e>i?i:ea(e))<0&&(e+=i),e=r>e?0:ia(e);r<e;)t[r++]=n;return t}(t,n,r,e)):[]},Mr.filter=function(t,n){return(Ou(t)?ln:ie)(t,qi(n,3))},Mr.flatMap=function(t,n){return oe(hu(t,n),1)},Mr.flatMapDeep=function(t,n){return oe(hu(t,n),1/0)},Mr.flatMapDepth=function(t,n,r){return r=void 0===r?1:ea(r),oe(hu(t,n),r)},Mr.flatten=Ro,Mr.flattenDeep=function(t){return(null==t?0:t.length)?oe(t,1/0):[]},Mr.flattenDepth=function(t,n){return(null==t?0:t.length)?oe(t,n=void 0===n?1:ea(n)):[]},Mr.flip=function(t){return Yi(t,512)},Mr.flow=Za,Mr.flowRight=Xa,Mr.fromPairs=function(t){for(var n=-1,r=null==t?0:t.length,e={};++n<r;){var i=t[n];e[i[0]]=i[1]}return e},Mr.functions=function(t){return null==t?[]:fe(t,xa(t))},Mr.functionsIn=function(t){return null==t?[]:fe(t,ba(t))},Mr.groupBy=cu,Mr.initial=function(t){return(null==t?0:t.length)?Xe(t,0,-1):[]},Mr.intersection=Po,Mr.intersectionBy=To,Mr.intersectionWith=Io,Mr.invert=ya,Mr.invertBy=_a,Mr.invokeMap=fu,Mr.iteratee=Va,Mr.keyBy=lu,Mr.keys=xa,Mr.keysIn=ba,Mr.map=hu,Mr.mapKeys=function(t,n){var r={};return n=qi(n,3),se(t,(function(t,e,i){Vr(r,n(t,e,i),t)})),r},Mr.mapValues=function(t,n){var r={};return n=qi(n,3),se(t,(function(t,e,i){Vr(r,e,n(t,e,i))})),r},Mr.matches=function(t){return Me(qr(t,1))},Mr.matchesProperty=function(t,n){return ke(t,qr(n,1))},Mr.memoize=Su,Mr.merge=wa,Mr.mergeWith=Sa,Mr.method=Ha,Mr.methodOf=$a,Mr.mixin=qa,Mr.negate=Lu,Mr.nthArg=function(t){return t=ea(t),Ie((function(n){return Be(n,t)}))},Mr.omit=La,Mr.omitBy=function(t,n){return ja(t,Lu(qi(n)))},Mr.once=function(t){return yu(2,t)},Mr.orderBy=function(t,n,r,e){return null==t?[]:(Ou(n)||(n=null==n?[]:[n]),Ou(r=e?void 0:r)||(r=null==r?[]:[r]),Ce(t,n,r))},Mr.over=Ja,Mr.overArgs=Au,Mr.overEvery=Qa,Mr.overSome=ts,Mr.partial=ju,Mr.partialRight=Eu,Mr.partition=vu,Mr.pick=Aa,Mr.pickBy=ja,Mr.property=ns,Mr.propertyOf=function(t){return function(n){return null==t?void 0:le(t,n)}},Mr.pull=No,Mr.pullAll=Uo,Mr.pullAllBy=function(t,n,r){return t&&t.length&&n&&n.length?Re(t,n,qi(r,2)):t},Mr.pullAllWith=function(t,n,r){return t&&t.length&&n&&n.length?Re(t,n,void 0,r):t},Mr.pullAt=Do,Mr.range=rs,Mr.rangeRight=es,Mr.rearg=Mu,Mr.reject=function(t,n){return(Ou(t)?ln:ie)(t,Lu(qi(n,3)))},Mr.remove=function(t,n){var r=[];if(!t||!t.length)return r;var e=-1,i=[],o=t.length;for(n=qi(n,3);++e<o;){var u=t[e];n(u,e,t)&&(r.push(u),i.push(e))}return ze(t,i),r},Mr.rest=function(t,n){if("function"!=typeof t)throw new _t(o);return Ie(t,n=void 0===n?n:ea(n))},Mr.reverse=Wo,Mr.sampleSize=function(t,n,r){return n=(r?ao(t,n,r):void 0===n)?1:ea(n),(Ou(t)?Nr:Ne)(t,n)},Mr.set=function(t,n,r){return null==t?t:Ue(t,n,r)},Mr.setWith=function(t,n,r,e){return e="function"==typeof e?e:void 0,null==t?t:Ue(t,n,r,e)},Mr.shuffle=function(t){return(Ou(t)?Ur:Ze)(t)},Mr.slice=function(t,n,r){var e=null==t?0:t.length;return e?(r&&"number"!=typeof r&&ao(t,n,r)?(n=0,r=e):(n=null==n?0:ea(n),r=void 0===r?e:ea(r)),Xe(t,n,r)):[]},Mr.sortBy=pu,Mr.sortedUniq=function(t){return t&&t.length?$e(t):[]},Mr.sortedUniqBy=function(t,n){return t&&t.length?$e(t,qi(n,2)):[]},Mr.split=function(t,n,r){return r&&"number"!=typeof r&&ao(t,n,r)&&(n=r=void 0),(r=void 0===r?4294967295:r>>>0)?(t=aa(t))&&("string"==typeof n||null!=n&&!Hu(n))&&!(n=Ge(n))&&Nn(t)?ci(Vn(t),0,r):t.split(n,r):[]},Mr.spread=function(t,n){if("function"!=typeof t)throw new _t(o);return n=null==n?0:ur(ea(n),0),Ie((function(r){var e=r[n],i=ci(r,0,n);return e&&dn(i,e),un(t,this,i)}))},Mr.tail=function(t){var n=null==t?0:t.length;return n?Xe(t,1,n):[]},Mr.take=function(t,n,r){return t&&t.length?Xe(t,0,(n=r||void 0===n?1:ea(n))<0?0:n):[]},Mr.takeRight=function(t,n,r){var e=null==t?0:t.length;return e?Xe(t,(n=e-(n=r||void 0===n?1:ea(n)))<0?0:n,e):[]},Mr.takeRightWhile=function(t,n){return t&&t.length?ni(t,qi(n,3),!1,!0):[]},Mr.takeWhile=function(t,n){return t&&t.length?ni(t,qi(n,3)):[]},Mr.tap=function(t,n){return n(t),t},Mr.throttle=function(t,n,r){var e=!0,i=!0;if("function"!=typeof t)throw new _t(o);return Wu(r)&&(e="leading"in r?!!r.leading:e,i="trailing"in r?!!r.trailing:i),xu(t,n,{leading:e,maxWait:n,trailing:i})},Mr.thru=ru,Mr.toArray=na,Mr.toPairs=Ea,Mr.toPairsIn=Ma,Mr.toPath=function(t){return Ou(t)?pn(t,jo):Gu(t)?[t]:yi(Ao(aa(t)))},Mr.toPlainObject=ua,Mr.transform=function(t,n,r){var e=Ou(t),i=e||Tu(t)||Ju(t);if(n=qi(n,4),null==r){var o=t&&t.constructor;r=i?e?new o:[]:Wu(t)&&Nu(o)?kr(Xt(t)):{}}return(i?sn:se)(t,(function(t,e,i){return n(r,t,e,i)})),r},Mr.unary=function(t){return gu(t,1)},Mr.union=Zo,Mr.unionBy=Xo,Mr.unionWith=Ko,Mr.uniq=function(t){return t&&t.length?Je(t):[]},Mr.uniqBy=function(t,n){return t&&t.length?Je(t,qi(n,2)):[]},Mr.uniqWith=function(t,n){return n="function"==typeof n?n:void 0,t&&t.length?Je(t,void 0,n):[]},Mr.unset=function(t,n){return null==t||Qe(t,n)},Mr.unzip=Vo,Mr.unzipWith=Ho,Mr.update=function(t,n,r){return null==t?t:ti(t,n,ui(r))},Mr.updateWith=function(t,n,r,e){return e="function"==typeof e?e:void 0,null==t?t:ti(t,n,ui(r),e)},Mr.values=ka,Mr.valuesIn=function(t){return null==t?[]:Cn(t,ba(t))},Mr.without=$o,Mr.words=Na,Mr.wrap=function(t,n){return ju(ui(n),t)},Mr.xor=qo,Mr.xorBy=Go,Mr.xorWith=Jo,Mr.zip=Qo,Mr.zipObject=function(t,n){return ii(t||[],n||[],Wr)},Mr.zipObjectDeep=function(t,n){return ii(t||[],n||[],Ue)},Mr.zipWith=tu,Mr.entries=Ea,Mr.entriesIn=Ma,Mr.extend=ca,Mr.extendWith=fa,qa(Mr,Mr),Mr.add=us,Mr.attempt=Ua,Mr.camelCase=Fa,Mr.capitalize=Ba,Mr.ceil=as,Mr.clamp=function(t,n,r){return void 0===r&&(r=n,n=void 0),void 0!==r&&(r=(r=oa(r))==r?r:0),void 0!==n&&(n=(n=oa(n))==n?n:0),$r(oa(t),n,r)},Mr.clone=function(t){return qr(t,4)},Mr.cloneDeep=function(t){return qr(t,5)},Mr.cloneDeepWith=function(t,n){return qr(t,5,n="function"==typeof n?n:void 0)},Mr.cloneWith=function(t,n){return qr(t,4,n="function"==typeof n?n:void 0)},Mr.conformsTo=function(t,n){return null==n||Gr(t,n,xa(n))},Mr.deburr=Ca,Mr.defaultTo=function(t,n){return null==t||t!=t?n:t},Mr.divide=ss,Mr.endsWith=function(t,n,r){t=aa(t),n=Ge(n);var e=t.length,i=r=void 0===r?e:$r(ea(r),0,e);return(r-=n.length)>=0&&t.slice(r,i)==n},Mr.eq=ku,Mr.escape=function(t){return(t=aa(t))&&Y.test(t)?t.replace(T,In):t},Mr.escapeRegExp=function(t){return(t=aa(t))&&V.test(t)?t.replace(K,"\\$&"):t},Mr.every=function(t,n,r){var e=Ou(t)?fn:re;return r&&ao(t,n,r)&&(n=void 0),e(t,qi(n,3))},Mr.find=ou,Mr.findIndex=Co,Mr.findKey=function(t,n){return xn(t,qi(n,3),se)},Mr.findLast=uu,Mr.findLastIndex=Oo,Mr.findLastKey=function(t,n){return xn(t,qi(n,3),ce)},Mr.floor=cs,Mr.forEach=au,Mr.forEachRight=su,Mr.forIn=function(t,n){return null==t?t:ue(t,qi(n,3),ba)},Mr.forInRight=function(t,n){return null==t?t:ae(t,qi(n,3),ba)},Mr.forOwn=function(t,n){return t&&se(t,qi(n,3))},Mr.forOwnRight=function(t,n){return t&&ce(t,qi(n,3))},Mr.get=da,Mr.gt=Fu,Mr.gte=Bu,Mr.has=function(t,n){return null!=t&&eo(t,n,de)},Mr.hasIn=ga,Mr.head=zo,Mr.identity=Ka,Mr.includes=function(t,n,r,e){t=zu(t)?t:ka(t),r=r&&!e?ea(r):0;var i=t.length;return r<0&&(r=ur(i+r,0)),qu(t)?r<=i&&t.indexOf(n,r)>-1:!!i&&wn(t,n,r)>-1},Mr.indexOf=function(t,n,r){var e=null==t?0:t.length;if(!e)return-1;var i=null==r?0:ea(r);return i<0&&(i=ur(e+i,0)),wn(t,n,i)},Mr.inRange=function(t,n,r){return n=ra(n),void 0===r?(r=n,n=0):r=ra(r),function(t,n,r){return t>=ar(n,r)&&t<ur(n,r)}(t=oa(t),n,r)},Mr.invoke=ma,Mr.isArguments=Cu,Mr.isArray=Ou,Mr.isArrayBuffer=Ru,Mr.isArrayLike=zu,Mr.isArrayLikeObject=Pu,Mr.isBoolean=function(t){return!0===t||!1===t||Zu(t)&&ve(t)==f},Mr.isBuffer=Tu,Mr.isDate=Iu,Mr.isElement=function(t){return Zu(t)&&1===t.nodeType&&!Vu(t)},Mr.isEmpty=function(t){if(null==t)return!0;if(zu(t)&&(Ou(t)||"string"==typeof t||"function"==typeof t.splice||Tu(t)||Ju(t)||Cu(t)))return!t.length;var n=ro(t);if(n==d||n==m)return!t.size;if(lo(t))return!Le(t).length;for(var r in t)if(Lt.call(t,r))return!1;return!0},Mr.isEqual=function(t,n){return xe(t,n)},Mr.isEqualWith=function(t,n,r){var e=(r="function"==typeof r?r:void 0)?r(t,n):void 0;return void 0===e?xe(t,n,void 0,r):!!e},Mr.isError=Yu,Mr.isFinite=function(t){return"number"==typeof t&&er(t)},Mr.isFunction=Nu,Mr.isInteger=Uu,Mr.isLength=Du,Mr.isMap=Xu,Mr.isMatch=function(t,n){return t===n||be(t,n,Ji(n))},Mr.isMatchWith=function(t,n,r){return r="function"==typeof r?r:void 0,be(t,n,Ji(n),r)},Mr.isNaN=function(t){return Ku(t)&&t!=+t},Mr.isNative=function(t){if(fo(t))throw new ht("Unsupported core-js use. Try https://npms.io/search?q=ponyfill.");return we(t)},Mr.isNil=function(t){return null==t},Mr.isNull=function(t){return null===t},Mr.isNumber=Ku,Mr.isObject=Wu,Mr.isObjectLike=Zu,Mr.isPlainObject=Vu,Mr.isRegExp=Hu,Mr.isSafeInteger=function(t){return Uu(t)&&t>=-9007199254740991&&t<=9007199254740991},Mr.isSet=$u,Mr.isString=qu,Mr.isSymbol=Gu,Mr.isTypedArray=Ju,Mr.isUndefined=function(t){return void 0===t},Mr.isWeakMap=function(t){return Zu(t)&&ro(t)==w},Mr.isWeakSet=function(t){return Zu(t)&&"[object WeakSet]"==ve(t)},Mr.join=function(t,n){return null==t?"":ir.call(t,n)},Mr.kebabCase=Oa,Mr.last=Yo,Mr.lastIndexOf=function(t,n,r){var e=null==t?0:t.length;if(!e)return-1;var i=e;return void 0!==r&&(i=(i=ea(r))<0?ur(e+i,0):ar(i,e-1)),n==n?function(t,n,r){for(var e=r+1;e--;)if(t[e]===n)return e;return e}(t,n,i):bn(t,Ln,i,!0)},Mr.lowerCase=Ra,Mr.lowerFirst=za,Mr.lt=Qu,Mr.lte=ta,Mr.max=function(t){return t&&t.length?ee(t,Ka,pe):void 0},Mr.maxBy=function(t,n){return t&&t.length?ee(t,qi(n,2),pe):void 0},Mr.mean=function(t){return An(t,Ka)},Mr.meanBy=function(t,n){return An(t,qi(n,2))},Mr.min=function(t){return t&&t.length?ee(t,Ka,je):void 0},Mr.minBy=function(t,n){return t&&t.length?ee(t,qi(n,2),je):void 0},Mr.stubArray=is,Mr.stubFalse=os,Mr.stubObject=function(){return{}},Mr.stubString=function(){return""},Mr.stubTrue=function(){return!0},Mr.multiply=ls,Mr.nth=function(t,n){return t&&t.length?Be(t,ea(n)):void 0},Mr.noConflict=function(){return Vt._===this&&(Vt._=kt),this},Mr.noop=Ga,Mr.now=du,Mr.pad=function(t,n,r){t=aa(t);var e=(n=ea(n))?Kn(t):0;if(!n||e>=n)return t;var i=(n-e)/2;return Ci(tr(i),r)+t+Ci(Qn(i),r)},Mr.padEnd=function(t,n,r){t=aa(t);var e=(n=ea(n))?Kn(t):0;return n&&e<n?t+Ci(n-e,r):t},Mr.padStart=function(t,n,r){t=aa(t);var e=(n=ea(n))?Kn(t):0;return n&&e<n?Ci(n-e,r)+t:t},Mr.parseInt=function(t,n,r){return r||null==n?n=0:n&&(n=+n),cr(aa(t).replace($,""),n||0)},Mr.random=function(t,n,r){if(r&&"boolean"!=typeof r&&ao(t,n,r)&&(n=r=void 0),void 0===r&&("boolean"==typeof n?(r=n,n=void 0):"boolean"==typeof t&&(r=t,t=void 0)),void 0===t&&void 0===n?(t=0,n=1):(t=ra(t),void 0===n?(n=t,t=0):n=ra(n)),t>n){var e=t;t=n,n=e}if(r||t%1||n%1){var i=fr();return ar(t+i*(n-t+Wt("1e-"+((i+"").length-1))),n)}return Pe(t,n)},Mr.reduce=function(t,n,r){var e=Ou(t)?gn:Mn,i=arguments.length<3;return e(t,qi(n,4),r,i,te)},Mr.reduceRight=function(t,n,r){var e=Ou(t)?yn:Mn,i=arguments.length<3;return e(t,qi(n,4),r,i,ne)},Mr.repeat=function(t,n,r){return n=(r?ao(t,n,r):void 0===n)?1:ea(n),Te(aa(t),n)},Mr.replace=function(){var t=arguments,n=aa(t[0]);return t.length<3?n:n.replace(t[1],t[2])},Mr.result=function(t,n,r){var e=-1,i=(n=ai(n,t)).length;for(i||(i=1,t=void 0);++e<i;){var o=null==t?void 0:t[jo(n[e])];void 0===o&&(e=i,o=r),t=Nu(o)?o.call(t):o}return t},Mr.round=hs,Mr.runInContext=t,Mr.sample=function(t){return(Ou(t)?Yr:Ye)(t)},Mr.size=function(t){if(null==t)return 0;if(zu(t))return qu(t)?Kn(t):t.length;var n=ro(t);return n==d||n==m?t.size:Le(t).length},Mr.snakeCase=Pa,Mr.some=function(t,n,r){var e=Ou(t)?_n:Ke;return r&&ao(t,n,r)&&(n=void 0),e(t,qi(n,3))},Mr.sortedIndex=function(t,n){return Ve(t,n)},Mr.sortedIndexBy=function(t,n,r){return He(t,n,qi(r,2))},Mr.sortedIndexOf=function(t,n){var r=null==t?0:t.length;if(r){var e=Ve(t,n);if(e<r&&ku(t[e],n))return e}return-1},Mr.sortedLastIndex=function(t,n){return Ve(t,n,!0)},Mr.sortedLastIndexBy=function(t,n,r){return He(t,n,qi(r,2),!0)},Mr.sortedLastIndexOf=function(t,n){if(null==t?0:t.length){var r=Ve(t,n,!0)-1;if(ku(t[r],n))return r}return-1},Mr.startCase=Ta,Mr.startsWith=function(t,n,r){return t=aa(t),r=null==r?0:$r(ea(r),0,t.length),n=Ge(n),t.slice(r,r+n.length)==n},Mr.subtract=vs,Mr.sum=function(t){return t&&t.length?kn(t,Ka):0},Mr.sumBy=function(t,n){return t&&t.length?kn(t,qi(n,2)):0},Mr.template=function(t,n,r){var e=Mr.templateSettings;r&&ao(t,n,r)&&(n=void 0),t=aa(t),n=fa({},n,e,Ni);var i,o,u=fa({},n.imports,e.imports,Ni),a=xa(u),s=Cn(u,a),c=0,f=n.interpolate||ft,l="__p += '",h=gt((n.escape||ft).source+"|"+f.source+"|"+(f===D?rt:ft).source+"|"+(n.evaluate||ft).source+"|$","g"),v="//# sourceURL="+(Lt.call(n,"sourceURL")?(n.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++Yt+"]")+"\n";t.replace(h,(function(n,r,e,u,a,s){return e||(e=u),l+=t.slice(c,s).replace(lt,Yn),r&&(i=!0,l+="' +\n__e("+r+") +\n'"),a&&(o=!0,l+="';\n"+a+";\n__p += '"),e&&(l+="' +\n((__t = ("+e+")) == null ? '' : __t) +\n'"),c=s+n.length,n})),l+="';\n";var p=Lt.call(n,"variable")&&n.variable;p||(l="with (obj) {\n"+l+"\n}\n"),l=(o?l.replace(O,""):l).replace(R,"$1").replace(z,"$1;"),l="function("+(p||"obj")+") {\n"+(p?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(i?", __e = _.escape":"")+(o?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+l+"return __p\n}";var d=Ua((function(){return vt(a,v+"return "+l).apply(void 0,s)}));if(d.source=l,Yu(d))throw d;return d},Mr.times=function(t,n){if((t=ea(t))<1||t>9007199254740991)return[];var r=4294967295,e=ar(t,4294967295);t-=4294967295;for(var i=Fn(e,n=qi(n));++r<t;)n(r);return i},Mr.toFinite=ra,Mr.toInteger=ea,Mr.toLength=ia,Mr.toLower=function(t){return aa(t).toLowerCase()},Mr.toNumber=oa,Mr.toSafeInteger=function(t){return t?$r(ea(t),-9007199254740991,9007199254740991):0===t?t:0},Mr.toString=aa,Mr.toUpper=function(t){return aa(t).toUpperCase()},Mr.trim=function(t,n,r){if((t=aa(t))&&(r||void 0===n))return t.replace(H,"");if(!t||!(n=Ge(n)))return t;var e=Vn(t),i=Vn(n);return ci(e,Rn(e,i),zn(e,i)+1).join("")},Mr.trimEnd=function(t,n,r){if((t=aa(t))&&(r||void 0===n))return t.replace(q,"");if(!t||!(n=Ge(n)))return t;var e=Vn(t);return ci(e,0,zn(e,Vn(n))+1).join("")},Mr.trimStart=function(t,n,r){if((t=aa(t))&&(r||void 0===n))return t.replace($,"");if(!t||!(n=Ge(n)))return t;var e=Vn(t);return ci(e,Rn(e,Vn(n))).join("")},Mr.truncate=function(t,n){var r=30,e="...";if(Wu(n)){var i="separator"in n?n.separator:i;r="length"in n?ea(n.length):r,e="omission"in n?Ge(n.omission):e}var o=(t=aa(t)).length;if(Nn(t)){var u=Vn(t);o=u.length}if(r>=o)return t;var a=r-Kn(e);if(a<1)return e;var s=u?ci(u,0,a).join(""):t.slice(0,a);if(void 0===i)return s+e;if(u&&(a+=s.length-a),Hu(i)){if(t.slice(a).search(i)){var c,f=s;for(i.global||(i=gt(i.source,aa(et.exec(i))+"g")),i.lastIndex=0;c=i.exec(f);)var l=c.index;s=s.slice(0,void 0===l?a:l)}}else if(t.indexOf(Ge(i),a)!=a){var h=s.lastIndexOf(i);h>-1&&(s=s.slice(0,h))}return s+e},Mr.unescape=function(t){return(t=aa(t))&&I.test(t)?t.replace(P,Hn):t},Mr.uniqueId=function(t){var n=++At;return aa(t)+n},Mr.upperCase=Ia,Mr.upperFirst=Ya,Mr.each=au,Mr.eachRight=su,Mr.first=zo,qa(Mr,(fs={},se(Mr,(function(t,n){Lt.call(Mr.prototype,n)||(fs[n]=t)})),fs),{chain:!1}),Mr.VERSION="4.17.19",sn(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(t){Mr[t].placeholder=Mr})),sn(["drop","take"],(function(t,n){Cr.prototype[t]=function(r){r=void 0===r?1:ur(ea(r),0);var e=this.__filtered__&&!n?new Cr(this):this.clone();return e.__filtered__?e.__takeCount__=ar(r,e.__takeCount__):e.__views__.push({size:ar(r,4294967295),type:t+(e.__dir__<0?"Right":"")}),e},Cr.prototype[t+"Right"]=function(n){return this.reverse()[t](n).reverse()}})),sn(["filter","map","takeWhile"],(function(t,n){var r=n+1,e=1==r||3==r;Cr.prototype[t]=function(t){var n=this.clone();return n.__iteratees__.push({iteratee:qi(t,3),type:r}),n.__filtered__=n.__filtered__||e,n}})),sn(["head","last"],(function(t,n){var r="take"+(n?"Right":"");Cr.prototype[t]=function(){return this[r](1).value()[0]}})),sn(["initial","tail"],(function(t,n){var r="drop"+(n?"":"Right");Cr.prototype[t]=function(){return this.__filtered__?new Cr(this):this[r](1)}})),Cr.prototype.compact=function(){return this.filter(Ka)},Cr.prototype.find=function(t){return this.filter(t).head()},Cr.prototype.findLast=function(t){return this.reverse().find(t)},Cr.prototype.invokeMap=Ie((function(t,n){return"function"==typeof t?new Cr(this):this.map((function(r){return _e(r,t,n)}))})),Cr.prototype.reject=function(t){return this.filter(Lu(qi(t)))},Cr.prototype.slice=function(t,n){t=ea(t);var r=this;return r.__filtered__&&(t>0||n<0)?new Cr(r):(t<0?r=r.takeRight(-t):t&&(r=r.drop(t)),void 0!==n&&(r=(n=ea(n))<0?r.dropRight(-n):r.take(n-t)),r)},Cr.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},Cr.prototype.toArray=function(){return this.take(4294967295)},se(Cr.prototype,(function(t,n){var r=/^(?:filter|find|map|reject)|While$/.test(n),e=/^(?:head|last)$/.test(n),i=Mr[e?"take"+("last"==n?"Right":""):n],o=e||/^find/.test(n);i&&(Mr.prototype[n]=function(){var n=this.__wrapped__,u=e?[1]:arguments,a=n instanceof Cr,s=u[0],c=a||Ou(n),f=function(t){var n=i.apply(Mr,dn([t],u));return e&&l?n[0]:n};c&&r&&"function"==typeof s&&1!=s.length&&(a=c=!1);var l=this.__chain__,h=!!this.__actions__.length,v=o&&!l,p=a&&!h;if(!o&&c){n=p?n:new Cr(this);var d=t.apply(n,u);return d.__actions__.push({func:ru,args:[f],thisArg:void 0}),new Br(d,l)}return v&&p?t.apply(this,u):(d=this.thru(f),v?e?d.value()[0]:d.value():d)})})),sn(["pop","push","shift","sort","splice","unshift"],(function(t){var n=mt[t],r=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",e=/^(?:pop|shift)$/.test(t);Mr.prototype[t]=function(){var t=arguments;if(e&&!this.__chain__){var i=this.value();return n.apply(Ou(i)?i:[],t)}return this[r]((function(r){return n.apply(Ou(r)?r:[],t)}))}})),se(Cr.prototype,(function(t,n){var r=Mr[n];if(r){var e=r.name+"";Lt.call(mr,e)||(mr[e]=[]),mr[e].push({name:n,func:r})}})),mr[Mi(void 0,2).name]=[{name:"wrapper",func:void 0}],Cr.prototype.clone=function(){var t=new Cr(this.__wrapped__);return t.__actions__=yi(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=yi(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=yi(this.__views__),t},Cr.prototype.reverse=function(){if(this.__filtered__){var t=new Cr(this);t.__dir__=-1,t.__filtered__=!0}else(t=this.clone()).__dir__*=-1;return t},Cr.prototype.value=function(){var t=this.__wrapped__.value(),n=this.__dir__,r=Ou(t),e=n<0,i=r?t.length:0,o=function(t,n,r){var e=-1,i=r.length;for(;++e<i;){var o=r[e],u=o.size;switch(o.type){case"drop":t+=u;break;case"dropRight":n-=u;break;case"take":n=ar(n,t+u);break;case"takeRight":t=ur(t,n-u)}}return{start:t,end:n}}(0,i,this.__views__),u=o.start,a=o.end,s=a-u,c=e?a:u-1,f=this.__iteratees__,l=f.length,h=0,v=ar(s,this.__takeCount__);if(!r||!e&&i==s&&v==s)return ri(t,this.__actions__);var p=[];t:for(;s--&&h<v;){for(var d=-1,g=t[c+=n];++d<l;){var y=f[d],_=y.iteratee,m=y.type,x=_(g);if(2==m)g=x;else if(!x){if(1==m)continue t;break t}}p[h++]=g}return p},Mr.prototype.at=eu,Mr.prototype.chain=function(){return nu(this)},Mr.prototype.commit=function(){return new Br(this.value(),this.__chain__)},Mr.prototype.next=function(){void 0===this.__values__&&(this.__values__=na(this.value()));var t=this.__index__>=this.__values__.length;return{done:t,value:t?void 0:this.__values__[this.__index__++]}},Mr.prototype.plant=function(t){for(var n,r=this;r instanceof Fr;){var e=Mo(r);e.__index__=0,e.__values__=void 0,n?i.__wrapped__=e:n=e;var i=e;r=r.__wrapped__}return i.__wrapped__=t,n},Mr.prototype.reverse=function(){var t=this.__wrapped__;if(t instanceof Cr){var n=t;return this.__actions__.length&&(n=new Cr(this)),(n=n.reverse()).__actions__.push({func:ru,args:[Wo],thisArg:void 0}),new Br(n,this.__chain__)}return this.thru(Wo)},Mr.prototype.toJSON=Mr.prototype.valueOf=Mr.prototype.value=function(){return ri(this.__wrapped__,this.__actions__)},Mr.prototype.first=Mr.prototype.head,Jt&&(Mr.prototype[Jt]=function(){return this}),Mr}();Vt._=$n,void 0===(i=function(){return $n}.call(n,r,n,e))||(e.exports=i)}).call(this)}).call(this,r(8),r(9)(t))},function(t,n){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(t){"object"==typeof window&&(r=window)}t.exports=r},function(t,n){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,n,r){"use strict";r.r(n),r.d(n,"glify",(function(){return C}));class e{constructor(){this.array=new Float32Array(16)}setSize(t,n,r){return this.array.set([2/t,0,0,0,0,-2/n,0,0,0,0,0,0,-1,1,0,1]),this}translateMatrix(t,n){const{array:r}=this;return r[12]+=r[0]*t+r[4]*n,r[13]+=r[1]*t+r[5]*n,r[14]+=r[2]*t+r[6]*n,r[15]+=r[3]*t+r[7]*n,this}scaleMatrix(t){const{array:n}=this;return n[0]*=t,n[1]*=t,n[2]*=t,n[3]*=t,n[4]*=t,n[5]*=t,n[6]*=t,n[7]*=t,this}}var i=r(0);class o extends i.Layer{constructor(t,n){super(),this._userDrawFunc=t,this._frame=null,this._redrawCallbacks=[],this._pane=n}drawing(t){return this._userDrawFunc=t,this}params(t){return i.Util.setOptions(this,t),this}redraw(t){return"function"==typeof t&&this._redrawCallbacks.push(t),null===this._frame&&(this._frame=i.Util.requestAnimFrame(this._redraw,this)),this}onAdd(t){this._map=t,this.canvas=this.canvas||document.createElement("canvas");const n=t.getSize(),r=t.options.zoomAnimation&&i.Browser.any3d;return this.canvas.width=n.x,this.canvas.height=n.y,this.canvas.className="leaflet-zoom-"+(r?"animated":"hide"),t._panes[this._pane].appendChild(this.canvas),t.on("moveend",this._reset,this),t.on("resize",this._resize,this),r&&t.on("zoomanim",i.Layer?this._animateZoom:this._animateZoomNoLayer,this),this._reset(),this}onRemove(t){return t.getPanes()[this._pane].removeChild(this.canvas),t.off("moveend",this._reset,this),t.off("resize",this._resize,this),t.options.zoomAnimation&&i.Browser.any3d&&t.off("zoomanim",i.Layer?this._animateZoom:this._animateZoomNoLayer,this),this}addTo(t){return t.addLayer(this),this}_resize(t){this.canvas.width=t.newSize.x,this.canvas.height=t.newSize.y}_reset(){const t=this._map.containerPointToLayerPoint([0,0]);i.DomUtil.setPosition(this.canvas,t),this._redraw()}_redraw(){const{_map:t,canvas:n}=this,r=t.getSize(),e=t.getBounds(),o=180*r.x/(20037508.34*(e.getEast()-e.getWest())),u=t.getZoom(),a=new i.LatLng(e.getNorth(),e.getWest()),s=this._unclampedProject(a,0);for(this._userDrawFunc&&this._userDrawFunc({bounds:e,canvas:n,offset:s,scale:Math.pow(2,u),size:r,zoomScale:o,zoom:u});this._redrawCallbacks.length>0;)this._redrawCallbacks.shift()(this);this._frame=null}_animateZoom(t){const{_map:n}=this,r=n.getZoomScale(t.zoom,n.getZoom()),e=this._unclampedLatLngBoundsToNewLayerBounds(n.getBounds(),t.zoom,t.center).min;i.DomUtil.setTransform(this.canvas,e,r)}_animateZoomNoLayer(t){const{_map:n}=this,r=n.getZoomScale(t.zoom,n.getZoom()),e=n._getCenterOffset(t.center)._multiplyBy(-r).subtract(n._getMapPanePos());i.DomUtil.setTransform(this.canvas,e,r)}_unclampedProject(t,n){const{crs:r}=this._map.options,{R:e}=r.projection,o=Math.PI/180,u=t.lat,a=Math.sin(u*o),s=new i.Point(e*t.lng*o,e*Math.log((1+a)/(1-a))/2),c=r.scale(n);return r.transformation._transform(s,c)}_unclampedLatLngBoundsToNewLayerBounds(t,n,r){const e=this._map._getNewPixelOrigin(r,n);return new i.Bounds([this._unclampedProject(t.getSouthWest(),n).subtract(e),this._unclampedProject(t.getNorthWest(),n).subtract(e),this._unclampedProject(t.getSouthEast(),n).subtract(e),this._unclampedProject(t.getNorthEast(),n).subtract(e)])}}class u{constructor(t){this.buffers={},this.attributeLocations={},this.uniformLocations={},t.pane||(t.pane="overlayPane"),this.mapMatrix=new e,this.active=!0,this.vertexShader=null,this.fragmentShader=null,this.program=null,this.matrix=null,this.vertices=null,this.vertexLines=null;const n=Boolean(t.preserveDrawingBuffer),r=this.layer=new o(t=>this.drawOnCanvas(t),t.pane).addTo(t.map),i=this.canvas=r.canvas;i.width=i.clientWidth,i.height=i.clientHeight,i.style.position="absolute",t.className&&(i.className+=" "+t.className),this.gl=i.getContext("webgl2",{preserveDrawingBuffer:n})||i.getContext("webgl",{preserveDrawingBuffer:n})||i.getContext("experimental-webgl",{preserveDrawingBuffer:n})}attachShaderVariables(t){if(0===this.getShaderVariableCount())return this;const{gl:n,settings:r}=this,{shaderVariables:e}=r;let i=0;for(const r in e){if(!e.hasOwnProperty(r))continue;const o=e[r],u=this.getAttributeLocation(r);if(u<0)throw new Error("shader variable "+r+" not found");n.vertexAttribPointer(u,o.size,n[o.type],!!o.normalize,this.bytes*t,i*t),i+=o.size,n.enableVertexAttribArray(u)}return this}getShaderVariableCount(){return Object.keys(this.settings.shaderVariables).length}setData(t){return this.settings.data=t,this}setup(){const t=this.settings;return t.click&&t.setupClick(t.map),t.hover&&t.setupHover(t.map,t.hoverWait),this.setupVertexShader().setupFragmentShader().setupProgram()}setupVertexShader(){const t=this.gl,n=this.settings,r="function"==typeof n.vertexShaderSource?n.vertexShaderSource():n.vertexShaderSource,e=t.createShader(t.VERTEX_SHADER);return t.shaderSource(e,r),t.compileShader(e),this.vertexShader=e,this}setupFragmentShader(){const t=this.gl,n=this.settings,r="function"==typeof n.fragmentShaderSource?n.fragmentShaderSource():n.fragmentShaderSource,e=t.createShader(t.FRAGMENT_SHADER);return t.shaderSource(e,r),t.compileShader(e),this.fragmentShader=e,this}setupProgram(){const t=this.gl,n=t.createProgram();return t.attachShader(n,this.vertexShader),t.attachShader(n,this.fragmentShader),t.linkProgram(n),t.useProgram(n),t.blendFunc(t.SRC_ALPHA,t.ONE_MINUS_SRC_ALPHA),t.enable(t.BLEND),this.program=n,this}addTo(t){return this.layer.addTo(t||this.settings.map),this.active=!0,this.render()}remove(t){if(void 0===t)this.settings.map.removeLayer(this.layer),this.active=!1;else{const n=this.settings.data.features||this.settings.data;"number"==typeof(t=t instanceof Array?t:[t])&&(t=[t]),t.sort().reverse(),t.forEach(t=>{n.splice(t,1)}),this.render()}return this}update(t,n){return(this.settings.data.features||this.settings.data)[n]=t,this.render(),this}getBuffer(t){return this.buffers[t]||(this.buffers[t]=this.gl.createBuffer()),this.buffers[t]}getAttributeLocation(t){return void 0!==this.attributeLocations[t]?this.attributeLocations[t]:this.attributeLocations[t]=this.gl.getAttribLocation(this.program,t)}getUniformLocation(t){return void 0!==this.uniformLocations[t]?this.uniformLocations[t]:this.uniformLocations[t]=this.gl.getUniformLocation(this.program,t)}}const a={r:0,g:1,b:0,a:1},s={r:1,g:0,b:0,a:1},c={r:0,g:0,b:1,a:1},f={r:0,g:1,b:1,a:1},l={r:1,g:1,b:0,a:1},h={r:.5,g:.5,b:.5,a:1};class v{static get grey(){return h}static fromHex(t){if(t.length<6)return null;"#"===(t=t.toLowerCase())[0]&&(t=t.substring(1,t.length));return{r:parseInt(t[0]+t[1],16)/255,g:parseInt(t[2]+t[3],16)/255,b:parseInt(t[4]+t[5],16)/255,a:1}}static random(){return{r:Math.random(),g:Math.random(),b:Math.random(),a:Math.random()}}static pallet(){switch(Math.round(4*Math.random())){case 0:return a;case 1:return s;case 2:return c;case 3:return f;case 4:return l}}}class p{constructor(t){this.settings=t,this.vertexCount=0,this.array=[],this.length=0}fillFromCoordinates(t){const{color:n,opacity:r,project:e,latitudeKey:o,longitudeKey:u}=this.settings;for(let a=0;a<t.length;a++){if(Array.isArray(t[a][0])){this.fillFromCoordinates(t[a]);continue}const s=e(new i.LatLng(t[a][o],t[a][u]),0);this.push(s.x,s.y,n.r,n.g,n.b,n.a||r),0!==a&&a!==t.length-1&&(this.vertexCount+=1),this.vertexCount+=1}}push(...t){this.array.push(...t),this.length=this.array.length}}function d(t,n){const r=Math.PI/180,e=4*Math.PI,i=Math.sin(t*r);return{x:(n+180)/360*256,y:256*(.5-Math.log((1+i)/(1-i))/e)}}function g(t,n,r){return(t.x-n.x)*(t.x-n.x)+(t.y-n.y)*(t.y-n.y)<=r*r}function y(t,n,r,e,i,o){const u=i-r,a=o-e,s=u*u+a*a;let c,f,l=-1;0!==s&&(l=((t-r)*u+(n-e)*a)/s),l<0?(c=r,f=e):l>1?(c=i,f=o):(c=r+l*u,f=e+l*a);let h=t-c,v=n-f;return Math.sqrt(h*h+v*v)}function _(t,n,r){const e=r.latLngToLayerPoint(t),i=r.latLngToLayerPoint(n);return function(t,n){return Math.sqrt(t*t+n*n)}(e.x-i.x,e.y-i.y)}const m={map:null,data:[],longitudeKey:null,latitudeKey:null,setupClick:null,setupHover:null,vertexShaderSource:null,fragmentShaderSource:null,click:null,hover:null,color:v.random,className:"",opacity:.5,weight:2,sensitivity:.1,sensitivityHover:.03,shaderVariables:{vertex:{type:"FLOAT",start:0,size:2},color:{type:"FLOAT",start:2,size:4}}};class x extends u{constructor(t){if(super(t),this.bytes=6,x.instances.push(this),this.settings=Object.assign(Object.assign({},x.defaults),t),!t.data)throw new Error('no "data" array setting defined');if(!t.map)throw new Error('no leaflet "map" object setting defined');this.active=!0,this.allVertices=[],this.setup().render()}render(){this.resetVertices();const{canvas:t,gl:n,layer:r,vertices:e,settings:i,mapMatrix:o}=this,u=this.getBuffer("vertex"),a=this.getAttributeLocation("vertex"),s=this.getUniformLocation("opacity");n.uniform1f(s,i.opacity),n.bindBuffer(n.ARRAY_BUFFER,u);let c=e.length;const f=[];for(let t=0;t<c;t++){const n=e[t].array,r=n.length/this.bytes;for(let t=0;t<r;t++){const e=t*this.bytes;0!==t&&t!==r-1&&f.push(n[e],n[e+1],n[e+2],n[e+3],n[e+4],n[e+5]),f.push(n[e],n[e+1],n[e+2],n[e+3],n[e+4],n[e+5])}}this.allVertices=f;const l=new Float32Array(f);return c=l.BYTES_PER_ELEMENT,n.bufferData(n.ARRAY_BUFFER,l,n.STATIC_DRAW),n.vertexAttribPointer(a,2,n.FLOAT,!1,c*this.bytes,0),n.enableVertexAttribArray(a),this.matrix=this.getUniformLocation("matrix"),this.aPointSize=this.getAttributeLocation("pointSize"),o.setSize(t.width,t.height),n.viewport(0,0,t.width,t.height),n.uniformMatrix4fv(this.matrix,!1,o.array),this.attachShaderVariables(c),r.redraw(),this}resetVertices(){this.allVertices=[],this.vertices=[];const t=this.vertices,n=this.settings,r=n.data.features,e=n.map,i=n.latitudeKey,o=n.longitudeKey,u=r.length;let a,s,c,{color:f,opacity:l}=n,h=0;if(!f)throw new Error("color is not properly defined");for("function"==typeof f&&(s=f);h<u;h++){a=r[h],c=s?s(h,a):f;const n=new p({project:e.project.bind(e),latitudeKey:i,longitudeKey:o,color:c,opacity:l});n.fillFromCoordinates(a.geometry.coordinates),t.push(n)}return this}drawOnCanvas(t){if(!this.gl)return this;const{gl:n,settings:r,canvas:e,mapMatrix:i,matrix:o,allVertices:u,vertices:a}=this,{weight:s}=r,{scale:c,offset:f,zoom:l}=t,h=Math.max(l-4,4);if(n.clear(n.COLOR_BUFFER_BIT),n.viewport(0,0,e.width,e.height),n.viewport(0,0,e.width,e.height),n.vertexAttrib1f(this.aPointSize,h),i.setSize(e.width,e.height).scaleMatrix(c),l>18)i.translateMatrix(-f.x,-f.y),n.uniformMatrix4fv(o,!1,i.array),n.drawArrays(n.LINES,0,u.length/this.bytes);else if("number"==typeof s)for(let t=-s;t<s;t+=.5)for(let r=-s;r<s;r+=.5)i.translateMatrix(-f.x+r/c,-f.y+t/c),n.uniformMatrix4fv(o,!1,i.array),n.drawArrays(n.LINES,0,u.length/this.bytes);else if("function"==typeof s){let t=0;const e=r.data.features;for(let r=0;r<a.length;r++){const o=a[r].vertexCount,u=s(r,e[r]);for(let r=-u;r<u;r+=.5)for(let e=-u;e<u;e+=.5)i.translateMatrix(-f.x+e/c,-f.y+r/c),n.uniformMatrix4fv(this.matrix,!1,i.array),n.drawArrays(n.LINES,t,o);t+=o}}return this}static tryClick(t,n){let r,e,i=!1,o=null;x.instances.forEach((function(u){e=u.settings,r=e.sensitivity;const{latitudeKey:a,longitudeKey:s}=e;u.active&&e.map===n&&e.click&&e.data.features.map(n=>{for(let e=1;e<n.geometry.coordinates.length;e++){let c=y(t.latlng.lng,t.latlng.lat,n.geometry.coordinates[e-1][s],n.geometry.coordinates[e-1][a],n.geometry.coordinates[e][s],n.geometry.coordinates[e][a]);c<r&&(r=c,i=n,o=u)}})})),o&&o.settings.click(t,i)}static tryHover(t,n){let r,e,o=!1,u=null;x.instances.forEach((function(a){r=a.settings,e=r.sensitivityHover;const{latitudeKey:s,longitudeKey:c}=r;if(!a.active)return;if(r.map!==n)return;if(!r.hover)return;let f=Object(i.geoJSON)(r.data.features).getBounds();(function(t,n){return n._northEast.lat>t.lat&&t.lat>n._southWest.lat&&n._northEast.lng>t.lng&&t.lng>n._southWest.lng})(t.latlng,f)&&r.data.features.map(n=>{for(let r=1;r<n.geometry.coordinates.length;r++){let i=y(t.latlng.lng,t.latlng.lat,n.geometry.coordinates[r-1][c],n.geometry.coordinates[r-1][s],n.geometry.coordinates[r][c],n.geometry.coordinates[r][s]);i<e&&(e=i,o=n,u=a)}})})),u&&u.settings.hover(t,o)}}x.defaults=m,x.instances=[];const b={map:null,data:[],longitudeKey:null,latitudeKey:null,setupClick:null,setupHover:null,vertexShaderSource:null,fragmentShaderSource:null,eachVertex:null,click:null,hover:null,color:v.random,opacity:.8,size:null,className:"",sensitivity:2,sensitivityHover:.03,shaderVariables:{vertex:{type:"FLOAT",start:0,size:2},color:{type:"FLOAT",start:2,size:4},pointSize:{type:"FLOAT",start:6,size:1}}};class w extends u{constructor(t){if(super(t),this.bytes=7,w.instances.push(this),this.settings=Object.assign(Object.assign({},w.defaults),t),!t.data)throw new Error('no "data" array setting defined');if(!t.map)throw new Error('no leaflet "map" object setting defined');this.active=!0;const{data:n}=this.settings;if(Array.isArray(n))this.dataFormat="Array";else{if("FeatureCollection"!==n.type)throw new Error("unhandled data type. Supported types are Array and GeoJson.FeatureCollection");this.dataFormat="GeoJson.FeatureCollection"}this.settings.map.options.crs.projection.project!==i.Projection.SphericalMercator.project&&console.warn("layer designed for SphericalMercator, alternate detected"),this.setup().render()}render(){this.resetVertices();const{gl:t,canvas:n,layer:r,vertices:e,mapMatrix:i}=this,o=this.matrix=this.getUniformLocation("matrix"),u=this.getBuffer("vertices"),a=this.typedVertices=new Float32Array(e),s=a.BYTES_PER_ELEMENT;return i.setSize(n.width,n.height),t.viewport(0,0,n.width,n.height),t.uniformMatrix4fv(o,!1,i.array),t.bindBuffer(t.ARRAY_BUFFER,u),t.bufferData(t.ARRAY_BUFFER,a,t.STATIC_DRAW),this.attachShaderVariables(s),r.redraw(),this}getPointLookup(t){return this.latLngLookup[t]||(this.latLngLookup[t]=[])}addLookup(t){return this.getPointLookup(t.key).push(t),this.allLatLngLookup.push(t),this}resetVertices(){this.latLngLookup={},this.allLatLngLookup=[],this.vertices=[];const{vertices:t,settings:n}=this,{latitudeKey:r,longitudeKey:e,data:o,map:u,eachVertex:a,color:s,size:c,opacity:f}=n;let l,h,v,p,d,g,y;if(!s)throw new Error("color is not properly defined");if("function"==typeof s&&(l=s),!c)throw new Error("size is not properly defined");if("function"==typeof c&&(p=c),"Array"===this.dataFormat){const n=o.length;for(let _=0;_<n;_++)d=o[_],y=d[r].toFixed(2)+"x"+d[e].toFixed(2),g=u.project(new i.LatLng(d[r],d[e]),0),h=l?l(_,d):s,h=Object.assign(Object.assign({},h),{a:h.a||f}),v=p?p(_,d):c,t.push(g.x,g.y,h.r,h.g,h.b,h.a,v),this.addLookup({latLng:d,key:y,pixel:g,chosenColor:h,chosenSize:v}),a&&a.call(this,d,g,v)}else if("GeoJson.FeatureCollection"===this.dataFormat){const n=o.features.length;for(let _=0;_<n;_++){const n=o.features[_];d=n.geometry.coordinates,y=d[r].toFixed(2)+"x"+d[e].toFixed(2),g=u.project(new i.LatLng(d[r],d[e]),0),h=l?l(_,n):s,h=Object.assign(Object.assign({},h),{a:h.a||f}),v=p?p(_,d):c,t.push(g.x,g.y,h.r,h.g,h.b,h.a,v),this.addLookup({latLng:d,key:y,pixel:g,chosenColor:h,chosenSize:v,feature:n}),a&&a.call(this,d,g,v)}}return this}pointSize(t){const{map:n,size:r}=this.settings,e="function"==typeof r?r(t,null):r,i=n.getZoom();return null===e?Math.max(i-4,1):e}drawOnCanvas(t){if(!this.gl)return this;const{gl:n,canvas:r,settings:e,mapMatrix:i,matrix:o}=this,{map:u}=e,{offset:a}=t,s=u.getZoom(),c=Math.pow(2,s);return i.setSize(r.width,r.height).scaleMatrix(c).translateMatrix(-a.x,-a.y),n.clear(n.COLOR_BUFFER_BIT),n.viewport(0,0,r.width,r.height),n.uniformMatrix4fv(o,!1,i.array),n.drawArrays(n.POINTS,0,this.allLatLngLookup.length),this}lookup(t){const n=t.lat+.03,r=t.lng+.03,e=[];let i,o,u,a,s,c=t.lat-.03;for(;c<=n;c+=.01)for(i=t.lng-.03;i<=r;i+=.01)if(s=c.toFixed(2)+"x"+i.toFixed(2),a=this.latLngLookup[s],a)for(o=0,u=a.length;o<u;o++)e.push(a[o]);const{map:f}=this.settings;return w.closest(t,e.length>0?e:this.allLatLngLookup,f)}static closest(t,n,r){return n.length<1?null:n.reduce((n,e)=>_(t,n.latLng,r)<_(t,e.latLng,r)?n:e)}static tryClick(t,n){const r=[],e={};let o,u,a,s,c,f,l;if(w.instances.forEach(i=>{u=i.settings,i.active&&u.map===n&&u.click&&(s=i.lookup(t.latlng),e[s.key]=i,r.push(s))}),r.length<1)return;if(!u)return;if(f=this.closest(t.latlng,r,n),null===f)return;if(a=e[f.key],!a)return;const{latitudeKey:h,longitudeKey:v,sensitivity:p,click:d}=a.settings;return l=new i.LatLng(f.latLng[h],f.latLng[v]),c=n.latLngToLayerPoint(l),g(c,t.layerPoint,f.chosenSize*p)?(o=d(t,f.feature||f.latLng,c),void 0===o||o):void 0}static tryHover(t,n){const r=[],e={};let o,u,a,s,c,f,l;if(w.instances.forEach(i=>{u=i.settings,i.active&&u.map===n&&u.hover&&(s=i.lookup(t.latlng),e[s.key]=i,r.push(s))}),r.length<1)return;if(!u)return;if(f=this.closest(t.latlng,r,n),null===f)return;if(a=e[f.key],!a)return;const{latitudeKey:h,longitudeKey:v,sensitivityHover:p,hover:d}=a.settings;return l=new i.LatLng(f.latLng[h],f.latLng[v]),c=n.latLngToLayerPoint(l),g(c,t.layerPoint,f.chosenSize*p)?(o=d(t,f.feature||f.latLng,c),void 0===o||o):void 0}}w.instances=[],w.defaults=b,w.maps=[];var S=r(1),L=r.n(S);function A(t){switch(t&&t.type||null){case"FeatureCollection":return t.features=t.features.reduce((function(t,n){return t.concat(A(n))}),[]),t;case"Feature":return t.geometry?A(t.geometry).map((function(n){var r={type:"Feature",properties:JSON.parse(JSON.stringify(t.properties)),geometry:n};return void 0!==t.id&&(r.id=t.id),r})):[t];case"MultiPoint":return t.coordinates.map((function(t){return{type:"Point",coordinates:t}}));case"MultiPolygon":return t.coordinates.map((function(t){return{type:"Polygon",coordinates:t}}));case"MultiLineString":return t.coordinates.map((function(t){return{type:"LineString",coordinates:t}}));case"GeometryCollection":return t.geometries.map(A).reduce((function(t,n){return t.concat(n)}),[]);case"Point":case"Polygon":case"LineString":return[t]}}var j=r(2),E=r.n(j);const M={map:null,data:[],longitudeKey:null,latitudeKey:null,setupClick:null,setupHover:null,vertexShaderSource:null,fragmentShaderSource:null,click:null,hover:null,color:v.random,className:"",opacity:.5,shaderVariables:{vertex:{type:"FLOAT",start:0,size:2},color:{type:"FLOAT",start:2,size:4}},border:!1};class k extends u{constructor(t){if(super(t),this.bytes=6,k.instances.push(this),this.settings=Object.assign(Object.assign({},k.defaults),t),!t.data)throw new Error('no "data" array setting defined');if(!t.map)throw new Error('no leaflet "map" object setting defined');this.polygonLookup=null,this.setup().render()}render(){this.resetVertices();const{canvas:t,gl:n,layer:r,vertices:e,mapMatrix:i}=this,o=this.getBuffer("vertex"),u=new Float32Array(e),a=u.BYTES_PER_ELEMENT,s=this.getAttributeLocation("vertex");return n.bindBuffer(n.ARRAY_BUFFER,o),n.bufferData(n.ARRAY_BUFFER,u,n.STATIC_DRAW),n.vertexAttribPointer(s,2,n.FLOAT,!1,a*this.bytes,0),n.enableVertexAttribArray(s),this.matrix=this.getUniformLocation("matrix"),n.viewport(0,0,t.width,t.height),i.setSize(t.width,t.height),n.uniformMatrix4fv(this.matrix,!1,i.array),this.attachShaderVariables(a),r.redraw(),this}resetVertices(){this.vertices=[],this.vertexLines=[],this.polygonLookup=new E.a;const{vertices:t,vertexLines:n,polygonLookup:r,settings:e}=this,o=e.data;let u,a,s,c,f,l,h,v,p,g,y,_,{color:m,opacity:x}=e,b=0;switch(o.type){case"Feature":r.loadFeatureCollection({type:"FeatureCollection",features:[o]}),s=A(o);break;case"MultiPolygon":r.loadFeatureCollection({type:"FeatureCollection",features:[{type:"Feature",properties:{id:"bar"},geometry:{coordinates:o.coordinates}}]}),s=A(o);break;default:r.loadFeatureCollection(o),s=o.features}if(v=s.length,!m)throw new Error("color is not properly defined");for("function"==typeof m&&(f=m);b<v;b++){c=s[b],p=[],l=f?f(b,c):m,h=(c.geometry||c).coordinates,y=L.a.flatten(h),g=L()(y.vertices,y.holes,y.dimensions),_=h[0][0].length;for(let t=0,n=g.length;t<n;t++){if(a=g[t],"number"!=typeof y.vertices[0])throw new Error("unhandled polygon");p.push(y.vertices[a*_+e.longitudeKey],y.vertices[a*_+e.latitudeKey])}for(let n=0,r=p.length;n<r;n)u=e.map.project(new i.LatLng(p[n++],p[n++]),0),t.push(u.x,u.y,l.r,l.g,l.b,l.a||x);if(e.border){let t=[];for(let n=1,r=y.vertices.length;n<r;n+=2)t.push(y.vertices[n],y.vertices[n-1]),t.push(y.vertices[n+2],y.vertices[n+1]);for(let r=0,e=t.length;r<e;r)u=d(t[r++],t[r++]),n.push(u.x,u.y,l.r,l.g,l.b,l.a||x)}}return this}drawOnCanvas(t){if(!this.gl)return this;const{scale:n,offset:r,canvas:e}=t,{mapMatrix:i,gl:o,vertices:u,settings:a,vertexLines:s}=this;if(i.setSize(e.width,e.height).scaleMatrix(n).translateMatrix(-r.x,-r.y),o.clear(o.COLOR_BUFFER_BIT),o.viewport(0,0,e.width,e.height),o.uniformMatrix4fv(this.matrix,!1,i.array),a.border){const t=this.getBuffer("vertexLines"),n=new Float32Array(s),r=n.BYTES_PER_ELEMENT,i=this.getAttributeLocation("vertex");o.bindBuffer(o.ARRAY_BUFFER,null),o.bindBuffer(o.ARRAY_BUFFER,t),o.bufferData(o.ARRAY_BUFFER,n,o.STATIC_DRAW),null!==this.settings.shaderVariables&&this.attachShaderVariables(r),o.vertexAttribPointer(i,3,o.FLOAT,!1,r*this.bytes,0),o.enableVertexAttribArray(i),o.enable(o.DEPTH_TEST),o.viewport(0,0,e.width,e.height),o.drawArrays(o.LINES,0,s.length/this.bytes);const c=this.getBuffer("vertex"),f=new Float32Array(u);o.bindBuffer(o.ARRAY_BUFFER,null),o.bindBuffer(o.ARRAY_BUFFER,c),o.bufferData(o.ARRAY_BUFFER,f,o.STATIC_DRAW),null!==a.shaderVariables&&this.attachShaderVariables(r),o.vertexAttribPointer(i,2,o.FLOAT,!1,r*this.bytes,0),o.enableVertexAttribArray(i),o.enable(o.DEPTH_TEST),o.viewport(0,0,e.width,e.height)}return o.drawArrays(o.TRIANGLES,0,u.length/this.bytes),this}static tryClick(t,n){let r,e,i;return k.instances.forEach((function(o){e=o.settings,o.active&&e.map===n&&e.click&&(i=o.polygonLookup.search(t.latlng.lng,t.latlng.lat),i&&(r=e.click(t,i)))})),void 0===r||r}static tryHover(t,n){let r,e,i;return k.instances.forEach((function(o){e=o.settings,o.active&&e.map===n&&e.hover&&(i=o.polygonLookup.search(t.latlng.lng,t.latlng.lat),i&&(r=e.hover(t,i)))})),void 0===r||r}}k.instances=[],k.defaults=M;const F={vertex:"#define GLSLIFY 1\nuniform mat4 matrix;\nattribute vec4 vertex;\nattribute vec4 color;\nattribute float pointSize;\nvarying vec4 _color;\n\nvoid main() {\n //set the size of the point\n gl_PointSize = pointSize;\n\n //multiply each vertex by a matrix.\n gl_Position = matrix * vertex;\n\n //pass the color to the fragment shader\n _color = color;\n}\n",fragment:{dot:"precision mediump float;\n#define GLSLIFY 1\nuniform vec4 color;\n\nvoid main() {\n float border = 0.05;\n float radius = 0.5;\n vec2 center = vec2(0.5);\n\n vec4 color0 = vec4(0.0);\n vec4 color1 = vec4(color[0], color[1], color[2], color[3]);\n\n vec2 m = gl_PointCoord.xy - center;\n float dist = radius - sqrt(m.x * m.x + m.y * m.y);\n\n float t = 0.0;\n if (dist > border) {\n t = 1.0;\n } else if (dist > 0.0) {\n t = dist / border;\n }\n\n //works for overlapping circles if blending is enabled\n gl_FragColor = mix(color0, color1, t);\n}\n",point:"precision mediump float;\n#define GLSLIFY 1\nvarying vec4 _color;\n\nvoid main() {\n float border = 0.1;\n float radius = 0.5;\n vec2 center = vec2(0.5, 0.5);\n\n vec4 pointColor = vec4(\n _color[0],\n _color[1],\n _color[2],\n _color[3]\n );\n\n vec2 m = gl_PointCoord.xy - center;\n float dist1 = radius - sqrt(m.x * m.x + m.y * m.y);\n\n float t1 = 0.0;\n if (dist1 > border) {\n t1 = 1.0;\n } else if (dist1 > 0.0) {\n t1 = dist1 / border;\n }\n\n //works for overlapping circles if blending is enabled\n //gl_FragColor = mix(color0, color1, t);\n\n //border\n float outerBorder = 0.05;\n float innerBorder = 0.8;\n vec4 borderColor = vec4(0, 0, 0, 0.4);\n vec2 uv = gl_PointCoord.xy;\n vec4 clearColor = vec4(0, 0, 0, 0);\n\n // Offset uv with the center of the circle.\n uv -= center;\n\n float dist2 = sqrt(dot(uv, uv));\n\n float t2 = 1.0 + smoothstep(radius, radius + outerBorder, dist2)\n - smoothstep(radius - innerBorder, radius, dist2);\n\n gl_FragColor = mix(mix(borderColor, clearColor, t2), pointColor, t1);\n}\n",puck:"precision mediump float;\n#define GLSLIFY 1\nvarying vec4 _color;\n\nvoid main() {\n vec2 center = vec2(0.5);\n vec2 uv = gl_PointCoord.xy - center;\n float smoothing = 0.005;\n vec4 _color1 = vec4(_color[0], _color[1], _color[2], _color[3]);\n float radius1 = 0.3;\n vec4 _color2 = vec4(_color[0], _color[1], _color[2], _color[3]);\n float radius2 = 0.5;\n float dist = length(uv);\n\n //SMOOTH\n float gamma = 2.2;\n color1.rgb = pow(_color1.rgb, vec3(gamma));\n color2.rgb = pow(_color2.rgb, vec3(gamma));\n\n vec4 puck = mix(\n mix(\n _color1,\n _color2,\n smoothstep(\n radius1 - smoothing,\n radius1 + smoothing,\n dist\n )\n ),\n vec4(0,0,0,0),\n smoothstep(\n radius2 - smoothing,\n radius2 + smoothing,\n dist\n )\n );\n\n //Gamma correction (prevents color fringes)\n puck.rgb = pow(puck.rgb, vec3(1.0 / gamma));\n gl_FragColor = puck;\n}\n",simpleCircle:"precision mediump float;\n#define GLSLIFY 1\nvarying vec4 _color;\n\nvoid main() {\n vec4 color1 = vec4(_color[0], _color[1], _color[2], _color[3]);\n\n //simple circles\n float d = distance (gl_PointCoord, vec2(0.5, 0.5));\n if (d < 0.5 ){\n gl_FragColor = color1;\n } else {\n discard;\n }\n}\n",square:"precision mediump float;\n#define GLSLIFY 1\nvarying vec4 _color;\n\nvoid main() {\n //squares\n gl_FragColor = vec4(_color[0], _color[1], _color[2], _color[3]);\n}\n",polygon:"precision mediump float;\n#define GLSLIFY 1\nvarying vec4 _color;\n\nvoid main() {\n gl_FragColor = vec4(\n _color[0],\n _color[1],\n _color[2],\n _color[3]\n );\n}\n"}};class B{constructor(){this.longitudeKey=1,this.latitudeKey=0,this.maps=[],this.shader=F,this.Points=w,this.Shapes=k,this.Lines=x}longitudeFirst(){return this.longitudeKey=0,this.latitudeKey=1,this}latitudeFirst(){return this.latitudeKey=0,this.longitudeKey=1,this}get instances(){return[...w.instances,...x.instances,...k.instances]}points(t){return new this.Points(Object.assign({setupClick:C.setupClick.bind(this),setupHover:this.setupHover.bind(this),latitudeKey:C.latitudeKey,longitudeKey:C.longitudeKey,vertexShaderSource:()=>this.shader.vertex,fragmentShaderSource:()=>this.shader.fragment.point},t))}shapes(t){return new this.Shapes(Object.assign({setupClick:this.setupClick.bind(this),setupHover:this.setupHover.bind(this),latitudeKey:this.latitudeKey,longitudeKey:this.longitudeKey,vertexShaderSource:()=>this.shader.vertex,fragmentShaderSource:()=>this.shader.fragment.polygon},t))}lines(t){return new this.Lines(Object.assign({setupClick:this.setupClick.bind(this),setupHover:this.setupHover.bind(this),latitudeKey:this.latitudeKey,longitudeKey:this.longitudeKey,vertexShaderSource:()=>this.shader.vertex,fragmentShaderSource:()=>this.shader.fragment.polygon},t))}setupClick(t){this.maps.indexOf(t)<0&&(this.maps.push(t),t.on("click",n=>{let r;return r=w.tryClick(n,t),void 0!==r?r:(r=x.tryClick(n,t),void 0!==r?r:(r=k.tryClick(n,t),void 0!==r?r:void 0))}))}setupHover(t,n,r){this.maps.push(t),t.on("mousemove",function(t,n,r){let e;return function(){let i=this,o=arguments,u=function(){e=null,r||t.apply(i,o)},a=r&&!e;clearTimeout(e),e=setTimeout(u,n),a&&t.apply(i,o)}}(n=>{let r;return r=w.tryHover(n,t),void 0!==r?r:(r=x.tryHover(n,t),void 0!==r?r:(r=k.tryHover(n,t),void 0!==r?r:void 0))},n,r))}}const C=new B;n.default=C;"undefined"!=typeof window&&window.L&&(window.L.glify=C,window.L.Glify=B)}])}));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcImxlYWZsZXRcIixcImNvbW1vbmpzMlwiOlwibGVhZmxldFwiLFwiYW1kXCI6XCJsZWFmbGV0XCIsXCJyb290XCI6XCJMXCJ9Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9lYXJjdXQvc3JjL2VhcmN1dC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcG9seWdvbi1sb29rdXAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JidXNoL2luZGV4LmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9xdWlja3NlbGVjdC9xdWlja3NlbGVjdC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcG9pbnQtaW4tcG9seWdvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcG9seWdvbi1sb29rdXAvbGliL3BvbHlnb25fdXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC9sb2Rhc2guanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vbW9kdWxlLmpzIiwid2VicGFjazovLy8uL3NyYy9tYXAtbWF0cml4LnRzIiwid2VicGFjazovLy8uL3NyYy9jYW52YXMtb3ZlcmxheS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvYmFzZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29sb3IudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xpbmUtZmVhdHVyZS12ZXJ0aWNlcy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xpbmVzLnRzIiwid2VicGFjazovLy8uL3NyYy9wb2ludHMudHMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2dlb2pzb24tZmxhdHRlbi9kaXN0L2luZGV4LmVzLmpzIiwid2VicGFjazovLy8uL3NyYy9zaGFwZXMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2luZGV4LnRzIiwid2VicGFjazovLy8uL3NyYy9zaGFkZXIvdmVydGV4L2RlZmF1bHQuZ2xzbCIsIndlYnBhY2s6Ly8vLi9zcmMvc2hhZGVyL2ZyYWdtZW50L2RvdC5nbHNsIiwid2VicGFjazovLy8uL3NyYy9zaGFkZXIvZnJhZ21lbnQvcG9pbnQuZ2xzbCIsIndlYnBhY2s6Ly8vLi9zcmMvc2hhZGVyL2ZyYWdtZW50L3B1Y2suZ2xzbCIsIndlYnBhY2s6Ly8vLi9zcmMvc2hhZGVyL2ZyYWdtZW50L3NpbXBsZS1jaXJjbGUuZ2xzbCIsIndlYnBhY2s6Ly8vLi9zcmMvc2hhZGVyL2ZyYWdtZW50L3NxdWFyZS5nbHNsIiwid2VicGFjazovLy8uL3NyYy9zaGFkZXIvZnJhZ21lbnQvcG9seWdvbi5nbHNsIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsInJlcXVpcmUiLCJkZWZpbmUiLCJhbWQiLCJhIiwiaSIsIndpbmRvdyIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzBfXyIsImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJsIiwibW9kdWxlcyIsImNhbGwiLCJtIiwiYyIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwidCIsIm1vZGUiLCJfX2VzTW9kdWxlIiwibnMiLCJjcmVhdGUiLCJrZXkiLCJiaW5kIiwibiIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsImVhcmN1dCIsImRhdGEiLCJob2xlSW5kaWNlcyIsImRpbSIsIm1pblgiLCJtaW5ZIiwibWF4WCIsIm1heFkiLCJ4IiwieSIsImludlNpemUiLCJoYXNIb2xlcyIsImxlbmd0aCIsIm91dGVyTGVuIiwib3V0ZXJOb2RlIiwibGlua2VkTGlzdCIsInRyaWFuZ2xlcyIsIm5leHQiLCJwcmV2IiwibGVuIiwic3RhcnQiLCJlbmQiLCJsaXN0IiwicXVldWUiLCJzdGVpbmVyIiwicHVzaCIsImdldExlZnRtb3N0Iiwic29ydCIsImNvbXBhcmVYIiwiZWxpbWluYXRlSG9sZSIsImZpbHRlclBvaW50cyIsImVsaW1pbmF0ZUhvbGVzIiwiTWF0aCIsIm1heCIsImVhcmN1dExpbmtlZCIsImNsb2Nrd2lzZSIsImxhc3QiLCJzaWduZWRBcmVhIiwiaW5zZXJ0Tm9kZSIsImVxdWFscyIsInJlbW92ZU5vZGUiLCJhZ2FpbiIsImFyZWEiLCJlYXIiLCJwYXNzIiwieiIsInpPcmRlciIsInByZXZaIiwibmV4dFoiLCJxIiwiZSIsInRhaWwiLCJudW1NZXJnZXMiLCJwU2l6ZSIsInFTaXplIiwiaW5TaXplIiwic29ydExpbmtlZCIsImluZGV4Q3VydmUiLCJzdG9wIiwiaXNFYXJIYXNoZWQiLCJpc0VhciIsImN1cmVMb2NhbEludGVyc2VjdGlvbnMiLCJzcGxpdEVhcmN1dCIsImIiLCJwb2ludEluVHJpYW5nbGUiLCJtaW5UWCIsIm1pblRZIiwibWF4VFgiLCJtYXhUWSIsIm1pbloiLCJtYXhaIiwiaW50ZXJzZWN0cyIsImxvY2FsbHlJbnNpZGUiLCJpc1ZhbGlkRGlhZ29uYWwiLCJzcGxpdFBvbHlnb24iLCJob2xlIiwiaHgiLCJoeSIsInF4IiwiSW5maW5pdHkiLCJ0YW4iLCJteCIsIm15IiwidGFuTWluIiwiYWJzIiwiZmluZEhvbGVCcmlkZ2UiLCJsZWZ0bW9zdCIsImF4IiwiYXkiLCJieCIsImJ5IiwiY3giLCJjeSIsInB4IiwicHkiLCJpbnRlcnNlY3RzUG9seWdvbiIsImluc2lkZSIsIm1pZGRsZUluc2lkZSIsInAxIiwicDIiLCJxMSIsInEyIiwiYTIiLCJOb2RlIiwiYjIiLCJhbiIsImJwIiwidGhpcyIsInN1bSIsImoiLCJkZWZhdWx0IiwiZGV2aWF0aW9uIiwicG9seWdvbkFyZWEiLCJ0cmlhbmdsZXNBcmVhIiwiZmxhdHRlbiIsInJlc3VsdCIsInZlcnRpY2VzIiwiaG9sZXMiLCJkaW1lbnNpb25zIiwiaG9sZUluZGV4IiwiUmJ1c2giLCJwb2ludEluUG9seWdvbiIsInBvbHlnb25VdGlscyIsIl8iLCJQb2x5Z29uTG9va3VwIiwiZmVhdHVyZUNvbGxlY3Rpb24iLCJ1bmRlZmluZWQiLCJsb2FkRmVhdHVyZUNvbGxlY3Rpb24iLCJwb2ludEluUG9seWdvbldpdGhIb2xlcyIsInBvaW50IiwicG9seWdvbnMiLCJtYWluUG9seWdvbiIsImdlb21ldHJ5IiwiY29vcmRpbmF0ZXMiLCJzdWJQb2x5SW5kIiwic2VhcmNoRm9yT25lUG9seWdvbiIsImJib3hlcyIsInJ0cmVlIiwic2VhcmNoIiwibWFwIiwiYmJveCIsImluZGV4IiwicG9seUlkIiwiZmluZCIsInBvbHlPYmoiLCJzZWFyY2hGb3JNdWx0aXBsZVBvbHlnb25zIiwibGltaXQiLCJOdW1iZXIiLCJNQVhfU0FGRV9JTlRFR0VSIiwibWF0Y2hlc0ZvdW5kIiwidHlwZSIsImZlYXR1cmVzIiwiZmlsdGVyIiwicG9seWdvbiIsImNvbGxlY3Rpb24iLCJpbmRleFBvbHlnb24iLCJwb2x5IiwiZ2V0Qm91bmRpbmdCb3giLCJmb3JFYWNoIiwiY2hpbGRQb2x5cyIsImluZCIsInByb3BlcnRpZXMiLCJsb2FkIiwicmJ1c2giLCJxdWlja3NlbGVjdCIsIm1heEVudHJpZXMiLCJmb3JtYXQiLCJfbWF4RW50cmllcyIsIl9taW5FbnRyaWVzIiwiY2VpbCIsIl9pbml0Rm9ybWF0IiwiY2xlYXIiLCJmaW5kSXRlbSIsIml0ZW0iLCJpdGVtcyIsImVxdWFsc0ZuIiwiaW5kZXhPZiIsImNhbGNCQm94Iiwibm9kZSIsInRvQkJveCIsImRpc3RCQm94IiwiY2hpbGRyZW4iLCJrIiwiZGVzdE5vZGUiLCJjcmVhdGVOb2RlIiwiY2hpbGQiLCJleHRlbmQiLCJsZWFmIiwibWluIiwiY29tcGFyZU5vZGVNaW5YIiwiY29tcGFyZU5vZGVNaW5ZIiwiYmJveEFyZWEiLCJiYm94TWFyZ2luIiwiY29udGFpbnMiLCJoZWlnaHQiLCJtdWx0aVNlbGVjdCIsImFyciIsImxlZnQiLCJyaWdodCIsImNvbXBhcmUiLCJtaWQiLCJzdGFjayIsInBvcCIsImFsbCIsIl9hbGwiLCJjaGlsZEJCb3giLCJub2Rlc1RvU2VhcmNoIiwiY29sbGlkZXMiLCJpbnNlcnQiLCJfYnVpbGQiLCJzbGljZSIsIl9zcGxpdFJvb3QiLCJ0bXBOb2RlIiwiX2luc2VydCIsInJlbW92ZSIsInBhcmVudCIsImdvaW5nVXAiLCJwYXRoIiwiaW5kZXhlcyIsInNwbGljZSIsIl9jb25kZW5zZSIsImNvbXBhcmVNaW5YIiwiY29tcGFyZU1pblkiLCJ0b0pTT04iLCJmcm9tSlNPTiIsImFwcGx5IiwiTiIsIk0iLCJsb2ciLCJwb3ciLCJyaWdodDIiLCJyaWdodDMiLCJOMiIsIk4xIiwic3FydCIsIl9jaG9vc2VTdWJ0cmVlIiwibGV2ZWwiLCJ0YXJnZXROb2RlIiwiZW5sYXJnZW1lbnQiLCJtaW5BcmVhIiwibWluRW5sYXJnZW1lbnQiLCJpc05vZGUiLCJpbnNlcnRQYXRoIiwiX3NwbGl0IiwiX2FkanVzdFBhcmVudEJCb3hlcyIsIl9jaG9vc2VTcGxpdEF4aXMiLCJzcGxpdEluZGV4IiwiX2Nob29zZVNwbGl0SW5kZXgiLCJuZXdOb2RlIiwiYmJveDEiLCJiYm94MiIsIm92ZXJsYXAiLCJtaW5PdmVybGFwIiwiX2FsbERpc3RNYXJnaW4iLCJsZWZ0QkJveCIsInJpZ2h0QkJveCIsIm1hcmdpbiIsInNpYmxpbmdzIiwiY29tcGFyZUFyciIsIkZ1bmN0aW9uIiwiam9pbiIsInN3YXAiLCJ0bXAiLCJkZWZhdWx0Q29tcGFyZSIsInF1aWNrc2VsZWN0U3RlcCIsImV4cCIsInNkIiwibmV3TGVmdCIsImZsb29yIiwibmV3UmlnaHQiLCJ2cyIsInhpIiwieWkiLCJ4aiIsInlqIiwiZmlyc3RQdCIsInB0IiwiRlVOQ19FUlJPUl9URVhUIiwiUExBQ0VIT0xERVIiLCJ3cmFwRmxhZ3MiLCJhcmdzVGFnIiwiYXJyYXlUYWciLCJib29sVGFnIiwiZGF0ZVRhZyIsImVycm9yVGFnIiwiZnVuY1RhZyIsImdlblRhZyIsIm1hcFRhZyIsIm51bWJlclRhZyIsIm9iamVjdFRhZyIsInJlZ2V4cFRhZyIsInNldFRhZyIsInN0cmluZ1RhZyIsInN5bWJvbFRhZyIsIndlYWtNYXBUYWciLCJhcnJheUJ1ZmZlclRhZyIsImRhdGFWaWV3VGFnIiwiZmxvYXQzMlRhZyIsImZsb2F0NjRUYWciLCJpbnQ4VGFnIiwiaW50MTZUYWciLCJpbnQzMlRhZyIsInVpbnQ4VGFnIiwidWludDE2VGFnIiwidWludDMyVGFnIiwicmVFbXB0eVN0cmluZ0xlYWRpbmciLCJyZUVtcHR5U3RyaW5nTWlkZGxlIiwicmVFbXB0eVN0cmluZ1RyYWlsaW5nIiwicmVFc2NhcGVkSHRtbCIsInJlVW5lc2NhcGVkSHRtbCIsInJlSGFzRXNjYXBlZEh0bWwiLCJSZWdFeHAiLCJzb3VyY2UiLCJyZUhhc1VuZXNjYXBlZEh0bWwiLCJyZUVzY2FwZSIsInJlRXZhbHVhdGUiLCJyZUludGVycG9sYXRlIiwicmVJc0RlZXBQcm9wIiwicmVJc1BsYWluUHJvcCIsInJlUHJvcE5hbWUiLCJyZVJlZ0V4cENoYXIiLCJyZUhhc1JlZ0V4cENoYXIiLCJyZVRyaW0iLCJyZVRyaW1TdGFydCIsInJlVHJpbUVuZCIsInJlV3JhcENvbW1lbnQiLCJyZVdyYXBEZXRhaWxzIiwicmVTcGxpdERldGFpbHMiLCJyZUFzY2lpV29yZCIsInJlRXNjYXBlQ2hhciIsInJlRXNUZW1wbGF0ZSIsInJlRmxhZ3MiLCJyZUlzQmFkSGV4IiwicmVJc0JpbmFyeSIsInJlSXNIb3N0Q3RvciIsInJlSXNPY3RhbCIsInJlSXNVaW50IiwicmVMYXRpbiIsInJlTm9NYXRjaCIsInJlVW5lc2NhcGVkU3RyaW5nIiwicnNDb21ib1JhbmdlIiwicnNDb21ib01hcmtzUmFuZ2UiLCJyc0JyZWFrUmFuZ2UiLCJyc01hdGhPcFJhbmdlIiwicnNBc3RyYWwiLCJyc0JyZWFrIiwicnNDb21ibyIsInJzRGlnaXRzIiwicnNEaW5nYmF0IiwicnNMb3dlciIsInJzTWlzYyIsInJzRml0eiIsInJzTm9uQXN0cmFsIiwicnNSZWdpb25hbCIsInJzU3VyclBhaXIiLCJyc1VwcGVyIiwicnNNaXNjTG93ZXIiLCJyc01pc2NVcHBlciIsInJlT3B0TW9kIiwicnNTZXEiLCJyc0Vtb2ppIiwicnNTeW1ib2wiLCJyZUFwb3MiLCJyZUNvbWJvTWFyayIsInJlVW5pY29kZSIsInJlVW5pY29kZVdvcmQiLCJyZUhhc1VuaWNvZGUiLCJyZUhhc1VuaWNvZGVXb3JkIiwiY29udGV4dFByb3BzIiwidGVtcGxhdGVDb3VudGVyIiwidHlwZWRBcnJheVRhZ3MiLCJjbG9uZWFibGVUYWdzIiwic3RyaW5nRXNjYXBlcyIsImZyZWVQYXJzZUZsb2F0IiwicGFyc2VGbG9hdCIsImZyZWVQYXJzZUludCIsInBhcnNlSW50IiwiZnJlZUdsb2JhbCIsImdsb2JhbCIsImZyZWVTZWxmIiwic2VsZiIsImZyZWVFeHBvcnRzIiwibm9kZVR5cGUiLCJmcmVlTW9kdWxlIiwibW9kdWxlRXhwb3J0cyIsImZyZWVQcm9jZXNzIiwicHJvY2VzcyIsIm5vZGVVdGlsIiwidHlwZXMiLCJiaW5kaW5nIiwibm9kZUlzQXJyYXlCdWZmZXIiLCJpc0FycmF5QnVmZmVyIiwibm9kZUlzRGF0ZSIsImlzRGF0ZSIsIm5vZGVJc01hcCIsImlzTWFwIiwibm9kZUlzUmVnRXhwIiwiaXNSZWdFeHAiLCJub2RlSXNTZXQiLCJpc1NldCIsIm5vZGVJc1R5cGVkQXJyYXkiLCJpc1R5cGVkQXJyYXkiLCJmdW5jIiwidGhpc0FyZyIsImFyZ3MiLCJhcnJheUFnZ3JlZ2F0b3IiLCJhcnJheSIsInNldHRlciIsIml0ZXJhdGVlIiwiYWNjdW11bGF0b3IiLCJhcnJheUVhY2giLCJhcnJheUVhY2hSaWdodCIsImFycmF5RXZlcnkiLCJwcmVkaWNhdGUiLCJhcnJheUZpbHRlciIsInJlc0luZGV4IiwiYXJyYXlJbmNsdWRlcyIsImJhc2VJbmRleE9mIiwiYXJyYXlJbmNsdWRlc1dpdGgiLCJjb21wYXJhdG9yIiwiYXJyYXlNYXAiLCJBcnJheSIsImFycmF5UHVzaCIsInZhbHVlcyIsIm9mZnNldCIsImFycmF5UmVkdWNlIiwiaW5pdEFjY3VtIiwiYXJyYXlSZWR1Y2VSaWdodCIsImFycmF5U29tZSIsImFzY2lpU2l6ZSIsImJhc2VQcm9wZXJ0eSIsImJhc2VGaW5kS2V5IiwiZWFjaEZ1bmMiLCJiYXNlRmluZEluZGV4IiwiZnJvbUluZGV4IiwiZnJvbVJpZ2h0Iiwic3RyaWN0SW5kZXhPZiIsImJhc2VJc05hTiIsImJhc2VJbmRleE9mV2l0aCIsImJhc2VNZWFuIiwiYmFzZVN1bSIsImJhc2VQcm9wZXJ0eU9mIiwiYmFzZVJlZHVjZSIsImN1cnJlbnQiLCJiYXNlVGltZXMiLCJiYXNlVW5hcnkiLCJiYXNlVmFsdWVzIiwicHJvcHMiLCJjYWNoZUhhcyIsImNhY2hlIiwiaGFzIiwiY2hhcnNTdGFydEluZGV4Iiwic3RyU3ltYm9scyIsImNoclN5bWJvbHMiLCJjaGFyc0VuZEluZGV4IiwiY291bnRIb2xkZXJzIiwicGxhY2Vob2xkZXIiLCJkZWJ1cnJMZXR0ZXIiLCJlc2NhcGVIdG1sQ2hhciIsImVzY2FwZVN0cmluZ0NoYXIiLCJjaHIiLCJoYXNVbmljb2RlIiwic3RyaW5nIiwidGVzdCIsIm1hcFRvQXJyYXkiLCJzaXplIiwib3ZlckFyZyIsInRyYW5zZm9ybSIsImFyZyIsInJlcGxhY2VIb2xkZXJzIiwic2V0VG9BcnJheSIsInNldCIsInNldFRvUGFpcnMiLCJzdHJpbmdTaXplIiwibGFzdEluZGV4IiwidW5pY29kZVNpemUiLCJzdHJpbmdUb0FycmF5IiwibWF0Y2giLCJ1bmljb2RlVG9BcnJheSIsInNwbGl0IiwiYXNjaWlUb0FycmF5IiwidW5lc2NhcGVIdG1sQ2hhciIsInJ1bkluQ29udGV4dCIsImNvbnRleHQiLCJ1aWQiLCJkZWZhdWx0cyIsInBpY2siLCJEYXRlIiwiRXJyb3IiLCJTdHJpbmciLCJUeXBlRXJyb3IiLCJhcnJheVByb3RvIiwiZnVuY1Byb3RvIiwib2JqZWN0UHJvdG8iLCJjb3JlSnNEYXRhIiwiZnVuY1RvU3RyaW5nIiwidG9TdHJpbmciLCJpZENvdW50ZXIiLCJtYXNrU3JjS2V5IiwiZXhlYyIsImtleXMiLCJJRV9QUk9UTyIsIm5hdGl2ZU9iamVjdFRvU3RyaW5nIiwib2JqZWN0Q3RvclN0cmluZyIsIm9sZERhc2giLCJyZUlzTmF0aXZlIiwicmVwbGFjZSIsIkJ1ZmZlciIsIlVpbnQ4QXJyYXkiLCJhbGxvY1Vuc2FmZSIsImdldFByb3RvdHlwZSIsImdldFByb3RvdHlwZU9mIiwib2JqZWN0Q3JlYXRlIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJzcHJlYWRhYmxlU3ltYm9sIiwiaXNDb25jYXRTcHJlYWRhYmxlIiwic3ltSXRlcmF0b3IiLCJpdGVyYXRvciIsInN5bVRvU3RyaW5nVGFnIiwiZ2V0TmF0aXZlIiwiY3R4Q2xlYXJUaW1lb3V0IiwiY2xlYXJUaW1lb3V0IiwiY3R4Tm93Iiwibm93IiwiY3R4U2V0VGltZW91dCIsInNldFRpbWVvdXQiLCJuYXRpdmVDZWlsIiwibmF0aXZlRmxvb3IiLCJuYXRpdmVHZXRTeW1ib2xzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibmF0aXZlSXNCdWZmZXIiLCJpc0J1ZmZlciIsIm5hdGl2ZUlzRmluaXRlIiwiaXNGaW5pdGUiLCJuYXRpdmVKb2luIiwibmF0aXZlS2V5cyIsIm5hdGl2ZU1heCIsIm5hdGl2ZU1pbiIsIm5hdGl2ZU5vdyIsIm5hdGl2ZVBhcnNlSW50IiwibmF0aXZlUmFuZG9tIiwicmFuZG9tIiwibmF0aXZlUmV2ZXJzZSIsInJldmVyc2UiLCJEYXRhVmlldyIsIk1hcCIsIlByb21pc2UiLCJTZXQiLCJXZWFrTWFwIiwibmF0aXZlQ3JlYXRlIiwibWV0YU1hcCIsInJlYWxOYW1lcyIsImRhdGFWaWV3Q3RvclN0cmluZyIsInRvU291cmNlIiwibWFwQ3RvclN0cmluZyIsInByb21pc2VDdG9yU3RyaW5nIiwic2V0Q3RvclN0cmluZyIsIndlYWtNYXBDdG9yU3RyaW5nIiwic3ltYm9sUHJvdG8iLCJzeW1ib2xWYWx1ZU9mIiwidmFsdWVPZiIsInN5bWJvbFRvU3RyaW5nIiwibG9kYXNoIiwiaXNPYmplY3RMaWtlIiwiaXNBcnJheSIsIkxhenlXcmFwcGVyIiwiTG9kYXNoV3JhcHBlciIsIndyYXBwZXJDbG9uZSIsImJhc2VDcmVhdGUiLCJwcm90byIsImlzT2JqZWN0IiwiYmFzZUxvZGFzaCIsImNoYWluQWxsIiwiX193cmFwcGVkX18iLCJfX2FjdGlvbnNfXyIsIl9fY2hhaW5fXyIsIl9faW5kZXhfXyIsIl9fdmFsdWVzX18iLCJfX2Rpcl9fIiwiX19maWx0ZXJlZF9fIiwiX19pdGVyYXRlZXNfXyIsIl9fdGFrZUNvdW50X18iLCJfX3ZpZXdzX18iLCJIYXNoIiwiZW50cmllcyIsImVudHJ5IiwiTGlzdENhY2hlIiwiTWFwQ2FjaGUiLCJTZXRDYWNoZSIsIl9fZGF0YV9fIiwiYWRkIiwiU3RhY2siLCJhcnJheUxpa2VLZXlzIiwiaW5oZXJpdGVkIiwiaXNBcnIiLCJpc0FyZyIsImlzQXJndW1lbnRzIiwiaXNCdWZmIiwiaXNUeXBlIiwic2tpcEluZGV4ZXMiLCJpc0luZGV4IiwiYXJyYXlTYW1wbGUiLCJiYXNlUmFuZG9tIiwiYXJyYXlTYW1wbGVTaXplIiwic2h1ZmZsZVNlbGYiLCJjb3B5QXJyYXkiLCJiYXNlQ2xhbXAiLCJhcnJheVNodWZmbGUiLCJhc3NpZ25NZXJnZVZhbHVlIiwiZXEiLCJiYXNlQXNzaWduVmFsdWUiLCJhc3NpZ25WYWx1ZSIsIm9ialZhbHVlIiwiYXNzb2NJbmRleE9mIiwiYmFzZUFnZ3JlZ2F0b3IiLCJiYXNlRWFjaCIsImJhc2VBc3NpZ24iLCJjb3B5T2JqZWN0IiwiYmFzZUF0IiwicGF0aHMiLCJza2lwIiwibnVtYmVyIiwibG93ZXIiLCJ1cHBlciIsImJhc2VDbG9uZSIsImJpdG1hc2siLCJjdXN0b21pemVyIiwiaXNEZWVwIiwiaXNGbGF0IiwiaXNGdWxsIiwiY29uc3RydWN0b3IiLCJpbnB1dCIsImluaXRDbG9uZUFycmF5IiwidGFnIiwiZ2V0VGFnIiwiaXNGdW5jIiwiY2xvbmVCdWZmZXIiLCJpbml0Q2xvbmVPYmplY3QiLCJnZXRTeW1ib2xzSW4iLCJjb3B5U3ltYm9sc0luIiwia2V5c0luIiwiYmFzZUFzc2lnbkluIiwiZ2V0U3ltYm9scyIsImNvcHlTeW1ib2xzIiwiQ3RvciIsImNsb25lQXJyYXlCdWZmZXIiLCJkYXRhVmlldyIsImJ1ZmZlciIsImJ5dGVPZmZzZXQiLCJieXRlTGVuZ3RoIiwiY2xvbmVEYXRhVmlldyIsImNsb25lVHlwZWRBcnJheSIsInJlZ2V4cCIsImNsb25lUmVnRXhwIiwic3ltYm9sIiwiaW5pdENsb25lQnlUYWciLCJzdGFja2VkIiwic3ViVmFsdWUiLCJnZXRBbGxLZXlzSW4iLCJnZXRBbGxLZXlzIiwiYmFzZUNvbmZvcm1zVG8iLCJiYXNlRGVsYXkiLCJ3YWl0IiwiYmFzZURpZmZlcmVuY2UiLCJpbmNsdWRlcyIsImlzQ29tbW9uIiwidmFsdWVzTGVuZ3RoIiwib3V0ZXIiLCJjb21wdXRlZCIsInZhbHVlc0luZGV4IiwidGVtcGxhdGVTZXR0aW5ncyIsImdldE1hcERhdGEiLCJwYWlycyIsIkxBUkdFX0FSUkFZX1NJWkUiLCJjcmVhdGVCYXNlRWFjaCIsImJhc2VGb3JPd24iLCJiYXNlRWFjaFJpZ2h0IiwiYmFzZUZvck93blJpZ2h0IiwiYmFzZUV2ZXJ5IiwiYmFzZUV4dHJlbXVtIiwiaXNTeW1ib2wiLCJiYXNlRmlsdGVyIiwiYmFzZUZsYXR0ZW4iLCJkZXB0aCIsImlzU3RyaWN0IiwiaXNGbGF0dGVuYWJsZSIsImJhc2VGb3IiLCJjcmVhdGVCYXNlRm9yIiwiYmFzZUZvclJpZ2h0IiwiYmFzZUZ1bmN0aW9ucyIsImlzRnVuY3Rpb24iLCJiYXNlR2V0IiwiY2FzdFBhdGgiLCJ0b0tleSIsImJhc2VHZXRBbGxLZXlzIiwia2V5c0Z1bmMiLCJzeW1ib2xzRnVuYyIsImJhc2VHZXRUYWciLCJpc093biIsInVubWFza2VkIiwiZ2V0UmF3VGFnIiwib2JqZWN0VG9TdHJpbmciLCJiYXNlR3QiLCJvdGhlciIsImJhc2VIYXMiLCJiYXNlSGFzSW4iLCJiYXNlSW50ZXJzZWN0aW9uIiwiYXJyYXlzIiwib3RoTGVuZ3RoIiwib3RoSW5kZXgiLCJjYWNoZXMiLCJtYXhMZW5ndGgiLCJzZWVuIiwiYmFzZUludm9rZSIsImJhc2VJc0FyZ3VtZW50cyIsImJhc2VJc0VxdWFsIiwiZXF1YWxGdW5jIiwib2JqSXNBcnIiLCJvdGhJc0FyciIsIm9ialRhZyIsIm90aFRhZyIsIm9iaklzT2JqIiwib3RoSXNPYmoiLCJpc1NhbWVUYWciLCJlcXVhbEFycmF5cyIsIm1lc3NhZ2UiLCJjb252ZXJ0IiwiaXNQYXJ0aWFsIiwiZXF1YWxCeVRhZyIsIm9iaklzV3JhcHBlZCIsIm90aElzV3JhcHBlZCIsIm9ialVud3JhcHBlZCIsIm90aFVud3JhcHBlZCIsIm9ialByb3BzIiwib2JqTGVuZ3RoIiwib2JqU3RhY2tlZCIsIm90aFN0YWNrZWQiLCJza2lwQ3RvciIsIm90aFZhbHVlIiwiY29tcGFyZWQiLCJvYmpDdG9yIiwib3RoQ3RvciIsImVxdWFsT2JqZWN0cyIsImJhc2VJc0VxdWFsRGVlcCIsImJhc2VJc01hdGNoIiwibWF0Y2hEYXRhIiwibm9DdXN0b21pemVyIiwic3JjVmFsdWUiLCJDT01QQVJFX1BBUlRJQUxfRkxBRyIsImJhc2VJc05hdGl2ZSIsImJhc2VJdGVyYXRlZSIsImlkZW50aXR5IiwiYmFzZU1hdGNoZXNQcm9wZXJ0eSIsImJhc2VNYXRjaGVzIiwiYmFzZUtleXMiLCJpc1Byb3RvdHlwZSIsImJhc2VLZXlzSW4iLCJuYXRpdmVLZXlzSW4iLCJpc1Byb3RvIiwiYmFzZUx0IiwiYmFzZU1hcCIsImlzQXJyYXlMaWtlIiwiZ2V0TWF0Y2hEYXRhIiwibWF0Y2hlc1N0cmljdENvbXBhcmFibGUiLCJpc0tleSIsImlzU3RyaWN0Q29tcGFyYWJsZSIsImhhc0luIiwiYmFzZU1lcmdlIiwic3JjSW5kZXgiLCJtZXJnZUZ1bmMiLCJzYWZlR2V0IiwibmV3VmFsdWUiLCJpc1R5cGVkIiwiaXNBcnJheUxpa2VPYmplY3QiLCJpc1BsYWluT2JqZWN0IiwidG9QbGFpbk9iamVjdCIsImJhc2VNZXJnZURlZXAiLCJiYXNlTnRoIiwiYmFzZU9yZGVyQnkiLCJpdGVyYXRlZXMiLCJvcmRlcnMiLCJnZXRJdGVyYXRlZSIsImNvbXBhcmVyIiwiYmFzZVNvcnRCeSIsIm9iakNyaXRlcmlhIiwiY3JpdGVyaWEiLCJvdGhDcml0ZXJpYSIsIm9yZGVyc0xlbmd0aCIsImNvbXBhcmVBc2NlbmRpbmciLCJvcmRlciIsImNvbXBhcmVNdWx0aXBsZSIsImJhc2VQaWNrQnkiLCJiYXNlU2V0IiwiYmFzZVB1bGxBbGwiLCJiYXNlUHVsbEF0IiwicHJldmlvdXMiLCJiYXNlVW5zZXQiLCJiYXNlUmVwZWF0IiwiYmFzZVJlc3QiLCJzZXRUb1N0cmluZyIsIm92ZXJSZXN0IiwiYmFzZVNhbXBsZSIsImJhc2VTYW1wbGVTaXplIiwibmVzdGVkIiwiYmFzZVNldERhdGEiLCJiYXNlU2V0VG9TdHJpbmciLCJjb25zdGFudCIsImJhc2VTaHVmZmxlIiwiYmFzZVNsaWNlIiwiYmFzZVNvbWUiLCJiYXNlU29ydGVkSW5kZXgiLCJyZXRIaWdoZXN0IiwibG93IiwiaGlnaCIsIk1BWF9BUlJBWV9MRU5HVEgiLCJiYXNlU29ydGVkSW5kZXhCeSIsInZhbElzTmFOIiwidmFsSXNOdWxsIiwidmFsSXNTeW1ib2wiLCJ2YWxJc1VuZGVmaW5lZCIsIm90aElzRGVmaW5lZCIsIm90aElzTnVsbCIsIm90aElzUmVmbGV4aXZlIiwib3RoSXNTeW1ib2wiLCJzZXRMb3ciLCJiYXNlU29ydGVkVW5pcSIsImJhc2VUb051bWJlciIsImJhc2VUb1N0cmluZyIsImJhc2VVbmlxIiwiY3JlYXRlU2V0Iiwic2VlbkluZGV4IiwiYmFzZVVwZGF0ZSIsInVwZGF0ZXIiLCJiYXNlV2hpbGUiLCJpc0Ryb3AiLCJiYXNlV3JhcHBlclZhbHVlIiwiYWN0aW9ucyIsImFjdGlvbiIsImJhc2VYb3IiLCJiYXNlWmlwT2JqZWN0IiwiYXNzaWduRnVuYyIsInZhbHNMZW5ndGgiLCJjYXN0QXJyYXlMaWtlT2JqZWN0IiwiY2FzdEZ1bmN0aW9uIiwic3RyaW5nVG9QYXRoIiwiY2FzdFJlc3QiLCJjYXN0U2xpY2UiLCJpZCIsImNvcHkiLCJhcnJheUJ1ZmZlciIsInR5cGVkQXJyYXkiLCJ2YWxJc0RlZmluZWQiLCJ2YWxJc1JlZmxleGl2ZSIsImNvbXBvc2VBcmdzIiwicGFydGlhbHMiLCJob2xkZXJzIiwiaXNDdXJyaWVkIiwiYXJnc0luZGV4IiwiYXJnc0xlbmd0aCIsImhvbGRlcnNMZW5ndGgiLCJsZWZ0SW5kZXgiLCJsZWZ0TGVuZ3RoIiwicmFuZ2VMZW5ndGgiLCJpc1VuY3VycmllZCIsImNvbXBvc2VBcmdzUmlnaHQiLCJob2xkZXJzSW5kZXgiLCJyaWdodEluZGV4IiwicmlnaHRMZW5ndGgiLCJpc05ldyIsImNyZWF0ZUFnZ3JlZ2F0b3IiLCJpbml0aWFsaXplciIsImNyZWF0ZUFzc2lnbmVyIiwiYXNzaWduZXIiLCJzb3VyY2VzIiwiZ3VhcmQiLCJpc0l0ZXJhdGVlQ2FsbCIsIml0ZXJhYmxlIiwiY3JlYXRlQ2FzZUZpcnN0IiwibWV0aG9kTmFtZSIsImNoYXJBdCIsInRyYWlsaW5nIiwiY3JlYXRlQ29tcG91bmRlciIsImNhbGxiYWNrIiwid29yZHMiLCJkZWJ1cnIiLCJjcmVhdGVDdG9yIiwiYXJndW1lbnRzIiwidGhpc0JpbmRpbmciLCJjcmVhdGVGaW5kIiwiZmluZEluZGV4RnVuYyIsImNyZWF0ZUZsb3ciLCJmbGF0UmVzdCIsImZ1bmNzIiwicHJlcmVxIiwidGhydSIsIndyYXBwZXIiLCJnZXRGdW5jTmFtZSIsImZ1bmNOYW1lIiwiZ2V0RGF0YSIsImlzTGF6aWFibGUiLCJwbGFudCIsImNyZWF0ZUh5YnJpZCIsInBhcnRpYWxzUmlnaHQiLCJob2xkZXJzUmlnaHQiLCJhcmdQb3MiLCJhcnkiLCJhcml0eSIsImlzQXJ5IiwiaXNCaW5kIiwiaXNCaW5kS2V5IiwiaXNGbGlwIiwiZ2V0SG9sZGVyIiwiaG9sZGVyc0NvdW50IiwibmV3SG9sZGVycyIsImNyZWF0ZVJlY3VycnkiLCJmbiIsInJlb3JkZXIiLCJjcmVhdGVJbnZlcnRlciIsInRvSXRlcmF0ZWUiLCJiYXNlSW52ZXJ0ZXIiLCJjcmVhdGVNYXRoT3BlcmF0aW9uIiwib3BlcmF0b3IiLCJkZWZhdWx0VmFsdWUiLCJjcmVhdGVPdmVyIiwiYXJyYXlGdW5jIiwiY3JlYXRlUGFkZGluZyIsImNoYXJzIiwiY2hhcnNMZW5ndGgiLCJjcmVhdGVSYW5nZSIsInN0ZXAiLCJ0b0Zpbml0ZSIsImJhc2VSYW5nZSIsImNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24iLCJ0b051bWJlciIsIndyYXBGdW5jIiwiaXNDdXJyeSIsIm5ld0RhdGEiLCJzZXREYXRhIiwic2V0V3JhcFRvU3RyaW5nIiwiY3JlYXRlUm91bmQiLCJwcmVjaXNpb24iLCJ0b0ludGVnZXIiLCJwYWlyIiwibm9vcCIsImNyZWF0ZVRvUGFpcnMiLCJiYXNlVG9QYWlycyIsImNyZWF0ZVdyYXAiLCJzcmNCaXRtYXNrIiwibmV3Qml0bWFzayIsImlzQ29tYm8iLCJtZXJnZURhdGEiLCJjcmVhdGVDdXJyeSIsImNyZWF0ZVBhcnRpYWwiLCJjcmVhdGVCaW5kIiwiY3VzdG9tRGVmYXVsdHNBc3NpZ25JbiIsImN1c3RvbURlZmF1bHRzTWVyZ2UiLCJjdXN0b21PbWl0Q2xvbmUiLCJhcnJMZW5ndGgiLCJhcnJTdGFja2VkIiwiYXJyVmFsdWUiLCJvdGhlckZ1bmMiLCJnZXRWYWx1ZSIsInN0dWJBcnJheSIsImhhc1BhdGgiLCJoYXNGdW5jIiwiaXNMZW5ndGgiLCJBcnJheUJ1ZmZlciIsInJlc29sdmUiLCJjdG9yU3RyaW5nIiwiaXNNYXNrYWJsZSIsInN0dWJGYWxzZSIsIm90aGVyQXJncyIsIm9sZEFycmF5Iiwic2hvcnRPdXQiLCJyZWZlcmVuY2UiLCJkZXRhaWxzIiwiaW5zZXJ0V3JhcERldGFpbHMiLCJ1cGRhdGVXcmFwRGV0YWlscyIsImdldFdyYXBEZXRhaWxzIiwiY291bnQiLCJsYXN0Q2FsbGVkIiwic3RhbXAiLCJyZW1haW5pbmciLCJyYW5kIiwibWVtb2l6ZSIsIm1lbW9pemVDYXBwZWQiLCJjaGFyQ29kZUF0IiwicXVvdGUiLCJzdWJTdHJpbmciLCJjbG9uZSIsImRpZmZlcmVuY2UiLCJkaWZmZXJlbmNlQnkiLCJkaWZmZXJlbmNlV2l0aCIsImZpbmRJbmRleCIsImZpbmRMYXN0SW5kZXgiLCJoZWFkIiwiaW50ZXJzZWN0aW9uIiwibWFwcGVkIiwiaW50ZXJzZWN0aW9uQnkiLCJpbnRlcnNlY3Rpb25XaXRoIiwicHVsbCIsInB1bGxBbGwiLCJwdWxsQXQiLCJ1bmlvbiIsInVuaW9uQnkiLCJ1bmlvbldpdGgiLCJ1bnppcCIsImdyb3VwIiwidW56aXBXaXRoIiwid2l0aG91dCIsInhvciIsInhvckJ5IiwieG9yV2l0aCIsInppcCIsInppcFdpdGgiLCJjaGFpbiIsImludGVyY2VwdG9yIiwid3JhcHBlckF0IiwiY291bnRCeSIsImZpbmRMYXN0IiwiZm9yRWFjaFJpZ2h0IiwiZ3JvdXBCeSIsImludm9rZU1hcCIsImtleUJ5IiwicGFydGl0aW9uIiwic29ydEJ5IiwiYmVmb3JlIiwiYmluZEtleSIsIldSQVBfQklORF9GTEFHIiwiZGVib3VuY2UiLCJvcHRpb25zIiwibGFzdEFyZ3MiLCJsYXN0VGhpcyIsIm1heFdhaXQiLCJ0aW1lcklkIiwibGFzdENhbGxUaW1lIiwibGFzdEludm9rZVRpbWUiLCJsZWFkaW5nIiwibWF4aW5nIiwiaW52b2tlRnVuYyIsInRpbWUiLCJsZWFkaW5nRWRnZSIsInRpbWVyRXhwaXJlZCIsInNob3VsZEludm9rZSIsInRpbWVTaW5jZUxhc3RDYWxsIiwidHJhaWxpbmdFZGdlIiwidGltZVdhaXRpbmciLCJyZW1haW5pbmdXYWl0IiwiZGVib3VuY2VkIiwiaXNJbnZva2luZyIsImNhbmNlbCIsImZsdXNoIiwiZGVmZXIiLCJkZWxheSIsInJlc29sdmVyIiwibWVtb2l6ZWQiLCJDYWNoZSIsIm5lZ2F0ZSIsIm92ZXJBcmdzIiwidHJhbnNmb3JtcyIsImZ1bmNzTGVuZ3RoIiwicGFydGlhbCIsInBhcnRpYWxSaWdodCIsInJlYXJnIiwiZ3QiLCJndGUiLCJpc0Vycm9yIiwiaXNJbnRlZ2VyIiwiaXNOdW1iZXIiLCJpc1N0cmluZyIsImx0IiwibHRlIiwidG9BcnJheSIsImRvbmUiLCJpdGVyYXRvclRvQXJyYXkiLCJyZW1haW5kZXIiLCJ0b0xlbmd0aCIsImlzQmluYXJ5IiwiYXNzaWduIiwiYXNzaWduSW4iLCJhc3NpZ25JbldpdGgiLCJhc3NpZ25XaXRoIiwiYXQiLCJwcm9wc0luZGV4IiwicHJvcHNMZW5ndGgiLCJkZWZhdWx0c0RlZXAiLCJtZXJnZVdpdGgiLCJpbnZlcnQiLCJpbnZlcnRCeSIsImludm9rZSIsIm1lcmdlIiwib21pdCIsIkNMT05FX0RFRVBfRkxBRyIsImJhc2VQaWNrIiwicGlja0J5IiwicHJvcCIsInRvUGFpcnMiLCJ0b1BhaXJzSW4iLCJjYW1lbENhc2UiLCJ3b3JkIiwidG9Mb3dlckNhc2UiLCJjYXBpdGFsaXplIiwidXBwZXJGaXJzdCIsImtlYmFiQ2FzZSIsImxvd2VyQ2FzZSIsImxvd2VyRmlyc3QiLCJzbmFrZUNhc2UiLCJzdGFydENhc2UiLCJ1cHBlckNhc2UiLCJ0b1VwcGVyQ2FzZSIsInBhdHRlcm4iLCJoYXNVbmljb2RlV29yZCIsInVuaWNvZGVXb3JkcyIsImFzY2lpV29yZHMiLCJhdHRlbXB0IiwiYmluZEFsbCIsIm1ldGhvZE5hbWVzIiwiZmxvdyIsImZsb3dSaWdodCIsIm1ldGhvZCIsIm1ldGhvZE9mIiwibWl4aW4iLCJvdmVyIiwib3ZlckV2ZXJ5Iiwib3ZlclNvbWUiLCJiYXNlUHJvcGVydHlEZWVwIiwicmFuZ2UiLCJyYW5nZVJpZ2h0IiwiYXVnZW5kIiwiYWRkZW5kIiwiZGl2aWRlIiwiZGl2aWRlbmQiLCJkaXZpc29yIiwibXVsdGlwbHkiLCJtdWx0aXBsaWVyIiwibXVsdGlwbGljYW5kIiwicm91bmQiLCJzdWJ0cmFjdCIsIm1pbnVlbmQiLCJzdWJ0cmFoZW5kIiwiYWZ0ZXIiLCJjYXN0QXJyYXkiLCJjaHVuayIsImNvbXBhY3QiLCJjb25jYXQiLCJjb25kIiwiY29uZm9ybXMiLCJiYXNlQ29uZm9ybXMiLCJjdXJyeSIsImN1cnJ5UmlnaHQiLCJkcm9wIiwiZHJvcFJpZ2h0IiwiZHJvcFJpZ2h0V2hpbGUiLCJkcm9wV2hpbGUiLCJmaWxsIiwiYmFzZUZpbGwiLCJmbGF0TWFwIiwiZmxhdE1hcERlZXAiLCJmbGF0TWFwRGVwdGgiLCJmbGF0dGVuRGVlcCIsImZsYXR0ZW5EZXB0aCIsImZsaXAiLCJmcm9tUGFpcnMiLCJmdW5jdGlvbnMiLCJmdW5jdGlvbnNJbiIsImluaXRpYWwiLCJtYXBLZXlzIiwibWFwVmFsdWVzIiwibWF0Y2hlcyIsIm1hdGNoZXNQcm9wZXJ0eSIsIm50aEFyZyIsIm9taXRCeSIsIm9uY2UiLCJvcmRlckJ5IiwicHJvcGVydHlPZiIsInB1bGxBbGxCeSIsInB1bGxBbGxXaXRoIiwicmVqZWN0IiwicmVzdCIsInNhbXBsZVNpemUiLCJzZXRXaXRoIiwic2h1ZmZsZSIsInNvcnRlZFVuaXEiLCJzb3J0ZWRVbmlxQnkiLCJzZXBhcmF0b3IiLCJzcHJlYWQiLCJ0YWtlIiwidGFrZVJpZ2h0IiwidGFrZVJpZ2h0V2hpbGUiLCJ0YWtlV2hpbGUiLCJ0YXAiLCJ0aHJvdHRsZSIsInRvUGF0aCIsImlzQXJyTGlrZSIsInVuYXJ5IiwidW5pcSIsInVuaXFCeSIsInVuaXFXaXRoIiwidW5zZXQiLCJ1cGRhdGUiLCJ1cGRhdGVXaXRoIiwidmFsdWVzSW4iLCJ3cmFwIiwiemlwT2JqZWN0IiwiemlwT2JqZWN0RGVlcCIsImVudHJpZXNJbiIsImV4dGVuZFdpdGgiLCJjbGFtcCIsImNsb25lRGVlcCIsImNsb25lRGVlcFdpdGgiLCJjbG9uZVdpdGgiLCJjb25mb3Jtc1RvIiwiZGVmYXVsdFRvIiwiZW5kc1dpdGgiLCJ0YXJnZXQiLCJwb3NpdGlvbiIsImVzY2FwZSIsImVzY2FwZVJlZ0V4cCIsImV2ZXJ5IiwiZmluZEtleSIsImZpbmRMYXN0S2V5IiwiZm9ySW4iLCJmb3JJblJpZ2h0IiwiZm9yT3duIiwiZm9yT3duUmlnaHQiLCJpblJhbmdlIiwiYmFzZUluUmFuZ2UiLCJpc0Jvb2xlYW4iLCJpc0VsZW1lbnQiLCJpc0VtcHR5IiwiaXNFcXVhbCIsImlzRXF1YWxXaXRoIiwiaXNNYXRjaCIsImlzTWF0Y2hXaXRoIiwiaXNOYU4iLCJpc05hdGl2ZSIsImlzTmlsIiwiaXNOdWxsIiwiaXNTYWZlSW50ZWdlciIsImlzVW5kZWZpbmVkIiwiaXNXZWFrTWFwIiwiaXNXZWFrU2V0IiwibGFzdEluZGV4T2YiLCJzdHJpY3RMYXN0SW5kZXhPZiIsIm1heEJ5IiwibWVhbiIsIm1lYW5CeSIsIm1pbkJ5Iiwic3R1Yk9iamVjdCIsInN0dWJTdHJpbmciLCJzdHViVHJ1ZSIsIm50aCIsIm5vQ29uZmxpY3QiLCJwYWQiLCJzdHJMZW5ndGgiLCJwYWRFbmQiLCJwYWRTdGFydCIsInJhZGl4IiwiZmxvYXRpbmciLCJ0ZW1wIiwicmVkdWNlIiwicmVkdWNlUmlnaHQiLCJyZXBlYXQiLCJzYW1wbGUiLCJzb21lIiwic29ydGVkSW5kZXgiLCJzb3J0ZWRJbmRleEJ5Iiwic29ydGVkSW5kZXhPZiIsInNvcnRlZExhc3RJbmRleCIsInNvcnRlZExhc3RJbmRleEJ5Iiwic29ydGVkTGFzdEluZGV4T2YiLCJzdGFydHNXaXRoIiwic3VtQnkiLCJ0ZW1wbGF0ZSIsInNldHRpbmdzIiwiaXNFc2NhcGluZyIsImlzRXZhbHVhdGluZyIsImltcG9ydHMiLCJpbXBvcnRzS2V5cyIsImltcG9ydHNWYWx1ZXMiLCJpbnRlcnBvbGF0ZSIsInJlRGVsaW1pdGVycyIsImV2YWx1YXRlIiwic291cmNlVVJMIiwiZXNjYXBlVmFsdWUiLCJpbnRlcnBvbGF0ZVZhbHVlIiwiZXNUZW1wbGF0ZVZhbHVlIiwiZXZhbHVhdGVWYWx1ZSIsInZhcmlhYmxlIiwidGltZXMiLCJ0b0xvd2VyIiwidG9TYWZlSW50ZWdlciIsInRvVXBwZXIiLCJ0cmltIiwidHJpbUVuZCIsInRyaW1TdGFydCIsInRydW5jYXRlIiwib21pc3Npb24iLCJzdWJzdHJpbmciLCJuZXdFbmQiLCJ1bmVzY2FwZSIsInVuaXF1ZUlkIiwicHJlZml4IiwiZWFjaCIsImVhY2hSaWdodCIsImZpcnN0IiwiVkVSU0lPTiIsImlzRmlsdGVyIiwidGFrZU5hbWUiLCJkcm9wTmFtZSIsImNoZWNrSXRlcmF0ZWUiLCJpc1Rha2VyIiwibG9kYXNoRnVuYyIsInJldFVud3JhcHBlZCIsImlzTGF6eSIsInVzZUxhenkiLCJpc0h5YnJpZCIsImlzVW53cmFwcGVkIiwib25seUxhenkiLCJjaGFpbk5hbWUiLCJkaXIiLCJpc1JpZ2h0IiwidmlldyIsImdldFZpZXciLCJpdGVyTGVuZ3RoIiwidGFrZUNvdW50IiwiaXRlckluZGV4IiwiY29tbWl0Iiwid3JhcHBlZCIsImciLCJ3ZWJwYWNrUG9seWZpbGwiLCJkZXByZWNhdGUiLCJNYXBNYXRyaXgiLCJGbG9hdDMyQXJyYXkiLCJ3aWR0aCIsInR4IiwidHkiLCJzY2FsZSIsInVzZXJEcmF3RnVuYyIsInBhbmUiLCJzdXBlciIsIl91c2VyRHJhd0Z1bmMiLCJfZnJhbWUiLCJfcmVkcmF3Q2FsbGJhY2tzIiwiX3BhbmUiLCJzZXRPcHRpb25zIiwicmVxdWVzdEFuaW1GcmFtZSIsIl9yZWRyYXciLCJfbWFwIiwiY2FudmFzIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiZ2V0U2l6ZSIsImFuaW1hdGVkIiwiem9vbUFuaW1hdGlvbiIsImFueTNkIiwiY2xhc3NOYW1lIiwiX3BhbmVzIiwiYXBwZW5kQ2hpbGQiLCJvbiIsIl9yZXNldCIsIl9yZXNpemUiLCJfYW5pbWF0ZVpvb20iLCJfYW5pbWF0ZVpvb21Ob0xheWVyIiwiZ2V0UGFuZXMiLCJyZW1vdmVDaGlsZCIsIm9mZiIsImFkZExheWVyIiwicmVzaXplRXZlbnQiLCJuZXdTaXplIiwidG9wTGVmdCIsImNvbnRhaW5lclBvaW50VG9MYXllclBvaW50Iiwic2V0UG9zaXRpb24iLCJib3VuZHMiLCJnZXRCb3VuZHMiLCJ6b29tU2NhbGUiLCJnZXRFYXN0IiwiZ2V0V2VzdCIsInpvb20iLCJnZXRab29tIiwiZ2V0Tm9ydGgiLCJfdW5jbGFtcGVkUHJvamVjdCIsInNoaWZ0IiwiZ2V0Wm9vbVNjYWxlIiwiX3VuY2xhbXBlZExhdExuZ0JvdW5kc1RvTmV3TGF5ZXJCb3VuZHMiLCJjZW50ZXIiLCJzZXRUcmFuc2Zvcm0iLCJfZ2V0Q2VudGVyT2Zmc2V0IiwiX211bHRpcGx5QnkiLCJfZ2V0TWFwUGFuZVBvcyIsImxhdGxuZyIsImNycyIsIlIiLCJwcm9qZWN0aW9uIiwiUEkiLCJsYXQiLCJzaW4iLCJwcm9qZWN0ZWRQb2ludCIsImxuZyIsInRyYW5zZm9ybWF0aW9uIiwiX3RyYW5zZm9ybSIsImxhdExuZ0JvdW5kcyIsIl9nZXROZXdQaXhlbE9yaWdpbiIsImdldFNvdXRoV2VzdCIsImdldE5vcnRoV2VzdCIsImdldFNvdXRoRWFzdCIsImdldE5vcnRoRWFzdCIsImJ1ZmZlcnMiLCJhdHRyaWJ1dGVMb2NhdGlvbnMiLCJ1bmlmb3JtTG9jYXRpb25zIiwibWFwTWF0cml4IiwiYWN0aXZlIiwidmVydGV4U2hhZGVyIiwiZnJhZ21lbnRTaGFkZXIiLCJwcm9ncmFtIiwibWF0cml4IiwidmVydGV4TGluZXMiLCJwcmVzZXJ2ZURyYXdpbmdCdWZmZXIiLCJCb29sZWFuIiwibGF5ZXIiLCJkcmF3T25DYW52YXMiLCJhZGRUbyIsImNsaWVudFdpZHRoIiwiY2xpZW50SGVpZ2h0Iiwic3R5bGUiLCJnbCIsImdldENvbnRleHQiLCJieXRlQ291bnQiLCJnZXRTaGFkZXJWYXJpYWJsZUNvdW50Iiwic2hhZGVyVmFyaWFibGVzIiwic2hhZGVyVmFyaWFibGUiLCJsb2MiLCJnZXRBdHRyaWJ1dGVMb2NhdGlvbiIsInZlcnRleEF0dHJpYlBvaW50ZXIiLCJub3JtYWxpemUiLCJieXRlcyIsImVuYWJsZVZlcnRleEF0dHJpYkFycmF5IiwiY2xpY2siLCJzZXR1cENsaWNrIiwiaG92ZXIiLCJzZXR1cEhvdmVyIiwiaG92ZXJXYWl0Iiwic2V0dXBWZXJ0ZXhTaGFkZXIiLCJzZXR1cEZyYWdtZW50U2hhZGVyIiwic2V0dXBQcm9ncmFtIiwidmVydGV4U2hhZGVyU291cmNlIiwiY3JlYXRlU2hhZGVyIiwiVkVSVEVYX1NIQURFUiIsInNoYWRlclNvdXJjZSIsImNvbXBpbGVTaGFkZXIiLCJmcmFnbWVudFNoYWRlclNvdXJjZSIsIkZSQUdNRU5UX1NIQURFUiIsImNyZWF0ZVByb2dyYW0iLCJhdHRhY2hTaGFkZXIiLCJsaW5rUHJvZ3JhbSIsInVzZVByb2dyYW0iLCJibGVuZEZ1bmMiLCJTUkNfQUxQSEEiLCJPTkVfTUlOVVNfU1JDX0FMUEhBIiwiZW5hYmxlIiwiQkxFTkQiLCJyZW5kZXIiLCJpbmRpY2VzIiwicmVtb3ZlTGF5ZXIiLCJmZWF0IiwiY3JlYXRlQnVmZmVyIiwiZ2V0QXR0cmliTG9jYXRpb24iLCJnZXRVbmlmb3JtTG9jYXRpb24iLCJncmVlbiIsInJlZCIsImJsdWUiLCJ0ZWFsIiwieWVsbG93IiwiZ3JheSIsIkNvbG9yIiwiaGV4IiwidmVydGV4Q291bnQiLCJjb2xvciIsIm9wYWNpdHkiLCJwcm9qZWN0IiwibGF0aXR1ZGVLZXkiLCJsb25naXR1ZGVLZXkiLCJmaWxsRnJvbUNvb3JkaW5hdGVzIiwicGl4ZWwiLCJsYXRMb25Ub1BpeGVsIiwibGF0aXR1ZGUiLCJsb25naXR1ZGUiLCJwaTE4MCIsInBpNCIsInNpbkxhdGl0dWRlIiwicG9pbnRJbkNpcmNsZSIsImNlbnRlclBvaW50IiwiY2hlY2tQb2ludCIsInJhZGl1cyIsInBEaXN0YW5jZSIsIngxIiwieTEiLCJ4MiIsInkyIiwiQyIsIkQiLCJsZW5fc3EiLCJ4eCIsInl5IiwicGFyYW0iLCJkeCIsImR5IiwibG9jYXRpb25EaXN0YW5jZSIsImxvY2F0aW9uMSIsImxvY2F0aW9uMiIsInBvaW50MSIsImxhdExuZ1RvTGF5ZXJQb2ludCIsInBvaW50MiIsInZlY3RvckRpc3RhbmNlIiwid2VpZ2h0Iiwic2Vuc2l0aXZpdHkiLCJzZW5zaXRpdml0eUhvdmVyIiwidmVydGV4IiwiaW5zdGFuY2VzIiwiYWxsVmVydGljZXMiLCJzZXR1cCIsInJlc2V0VmVydGljZXMiLCJ2ZXJ0ZXhCdWZmZXIiLCJnZXRCdWZmZXIiLCJ1bmlmb3JtMWYiLCJiaW5kQnVmZmVyIiwiQVJSQVlfQlVGRkVSIiwidmVydGV4QXJyYXkiLCJ2ZXJ0ZXhJbmRleCIsInZlcnRBcnJheSIsIkJZVEVTX1BFUl9FTEVNRU5UIiwiYnVmZmVyRGF0YSIsIlNUQVRJQ19EUkFXIiwiRkxPQVQiLCJhUG9pbnRTaXplIiwic2V0U2l6ZSIsInZpZXdwb3J0IiwidW5pZm9ybU1hdHJpeDRmdiIsImF0dGFjaFNoYWRlclZhcmlhYmxlcyIsInJlZHJhdyIsImZlYXR1cmVNYXgiLCJmZWF0dXJlIiwiY29sb3JGbiIsImNob3NlbkNvbG9yIiwiZmVhdHVyZUluZGV4IiwiZmVhdHVyZVZlcnRpY2VzIiwicG9pbnRTaXplIiwiQ09MT1JfQlVGRkVSX0JJVCIsInZlcnRleEF0dHJpYjFmIiwic2NhbGVNYXRyaXgiLCJ0cmFuc2xhdGVNYXRyaXgiLCJkcmF3QXJyYXlzIiwiTElORVMiLCJ5T2Zmc2V0IiwieE9mZnNldCIsImFsbFZlcnRleENvdW50Iiwid2VpZ2h0VmFsdWUiLCJmb3VuZEZlYXR1cmUiLCJpbnN0YW5jZSIsIl9pbnN0YW5jZSIsImRpc3RhbmNlIiwiX25vcnRoRWFzdCIsIl9zb3V0aFdlc3QiLCJpbkJvdW5kcyIsImVhY2hWZXJ0ZXgiLCJkYXRhRm9ybWF0IiwiU3BoZXJpY2FsTWVyY2F0b3IiLCJjb25zb2xlIiwid2FybiIsInZlcnRpY2VzQnVmZmVyIiwidmVydGljZXNUeXBlZEFycmF5IiwidHlwZWRWZXJ0aWNlcyIsImxhdExuZ0xvb2t1cCIsImxvb2t1cCIsImdldFBvaW50TG9va3VwIiwiYWxsTGF0TG5nTG9va3VwIiwiY2hvc2VuU2l6ZSIsInNpemVGbiIsImxhdExuZyIsInRvRml4ZWQiLCJhZGRMb29rdXAiLCJwb2ludEluZGV4IiwiUE9JTlRTIiwiY29vcmRzIiwieE1heCIsInlNYXgiLCJmb3VuZEkiLCJmb3VuZE1heCIsImZvdW5kIiwiY2xvc2VzdCIsInRhcmdldExvY2F0aW9uIiwicG9pbnRzIiwiY3VyciIsImNsb3Nlc3RGcm9tRWFjaCIsImluc3RhbmNlc0xvb2t1cCIsInBvaW50TG9va3VwIiwieHkiLCJmb3VuZExhdExuZyIsImxheWVyUG9pbnQiLCJtYXBzIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwiZ2VvbWV0cmllcyIsImJvcmRlciIsInBvbHlnb25Mb29rdXAiLCJmbGF0IiwiaU1heCIsImxpbmVzIiwidmVydGV4TGluZXNCdWZmZXIiLCJ2ZXJ0ZXhMaW5lc1R5cGVkQXJyYXkiLCJERVBUSF9URVNUIiwiVFJJQU5HTEVTIiwic2hhZGVyIiwiZnJhZ21lbnQiLCJkb3QiLCJwdWNrIiwic2ltcGxlQ2lyY2xlIiwic3F1YXJlIiwiUG9pbnRzIiwiU2hhcGVzIiwiTGluZXMiLCJnbGlmeSIsImhpdCIsInRyeUNsaWNrIiwiaW1tZWRpYXRlIiwidGltZW91dCIsImxhdGVyIiwiY2FsbE5vdyIsInRyeUhvdmVyIiwiTCIsIkdsaWZ5Il0sIm1hcHBpbmdzIjoiQ0FBQSxTQUEyQ0EsRUFBTUMsR0FDaEQsR0FBc0IsaUJBQVpDLFNBQTBDLGlCQUFYQyxPQUN4Q0EsT0FBT0QsUUFBVUQsRUFBUUcsUUFBUSxpQkFDN0IsR0FBcUIsbUJBQVhDLFFBQXlCQSxPQUFPQyxJQUM5Q0QsT0FBTyxDQUFDLFdBQVlKLE9BQ2hCLENBQ0osSUFBSU0sRUFBdUIsaUJBQVpMLFFBQXVCRCxFQUFRRyxRQUFRLFlBQWNILEVBQVFELEVBQVEsR0FDcEYsSUFBSSxJQUFJUSxLQUFLRCxHQUF1QixpQkFBWkwsUUFBdUJBLFFBQVVGLEdBQU1RLEdBQUtELEVBQUVDLElBUHhFLENBU0dDLFFBQVEsU0FBU0MsR0FDcEIsTyxZQ1RFLElBQUlDLEVBQW1CLEdBR3ZCLFNBQVNDLEVBQW9CQyxHQUc1QixHQUFHRixFQUFpQkUsR0FDbkIsT0FBT0YsRUFBaUJFLEdBQVVYLFFBR25DLElBQUlDLEVBQVNRLEVBQWlCRSxHQUFZLENBQ3pDTCxFQUFHSyxFQUNIQyxHQUFHLEVBQ0haLFFBQVMs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LElBQUssSUFBVSxJQUN6QyxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQ3hELElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFDeEQsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN4RCxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN2RSxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN2RSxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQ3hELElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFDeEQsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN4RCxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN2RSxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN2RSxJQUFVLElBQU0sSUFBVSxJQUMxQixJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFDekMsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFDdkUsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUFLLElBQVUsSUFDdkUsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQUssSUFBVSxJQUN4RCxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQ3hELElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUN6QyxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFDekMsSUFBVSxJQUFNLElBQVUsSUFBSyxJQUFVLElBQ3pDLElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUN6QyxJQUFVLElBQU0sSUFBVSxJQUFLLElBQVUsSUFBSyxJQUFVLElBQ3hELElBQVUsSUFBTSxJQUFVLElBQUssSUFBVSxJQUFLLElB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MEJBLEdBRTlCQSxFQUFNLEVBQU1NLFNBQVMzaUQsRUFBR3lGLFFBQ1piLElBQVJ5OUMsRUFBMEJBLEdBRTlCQSxFQUFNLEVBQU9NLFNBQVMzaUQsRUFBR3lGLFFBQ2JiLElBQVJ5OUMsRUFBMEJBLE9BQTlCLEtBQ0N0TCxFQUFXd0wsS0FJWCxNQUFNSCxFQUFRLElBQUksRUFDVixZQUNPLG9CQUFYMW5ELFFBQTBCQSxPQUFPa29ELElBRTFDbG9ELE9BQVUsRUFBRTBuRCxNQUFRQSxFQUVwQjFuRCxPQUFVLEVBQUVtb0QsTUFBUSIsImZpbGUiOiJnbGlmeS1icm93c2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwibGVhZmxldFwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXCJsZWFmbGV0XCJdLCBmYWN0b3J5KTtcblx0ZWxzZSB7XG5cdFx0dmFyIGEgPSB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgPyBmYWN0b3J5KHJlcXVpcmUoXCJsZWFmbGV0XCIpKSA6IGZhY3Rvcnkocm9vdFtcIkxcIl0pO1xuXHRcdGZvcih2YXIgaSBpbiBhKSAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnID8gZXhwb3J0cyA6IHJvb3QpW2ldID0gYVtpXTtcblx0fVxufSkod2luZG93LCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18wX18pIHtcbnJldHVybiAiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMTApO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18wX187IiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVhcmN1dDtcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBlYXJjdXQ7XG5cbmZ1bmN0aW9uIGVhcmN1dChkYXRhLCBob2xlSW5kaWNlcywgZGltKSB7XG5cbiAgICBkaW0gPSBkaW0gfHwgMjtcblxuICAgIHZhciBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aCxcbiAgICAgICAgb3V0ZXJMZW4gPSBoYXNIb2xlcyA/IGhvbGVJbmRpY2VzWzBdICogZGltIDogZGF0YS5sZW5ndGgsXG4gICAgICAgIG91dGVyTm9kZSA9IGxpbmtlZExpc3QoZGF0YSwgMCwgb3V0ZXJMZW4sIGRpbSwgdHJ1ZSksXG4gICAgICAgIHRyaWFuZ2xlcyA9IFtdO1xuXG4gICAgaWYgKCFvdXRlck5vZGUgfHwgb3V0ZXJOb2RlLm5leHQgPT09IG91dGVyTm9kZS5wcmV2KSByZXR1cm4gdHJpYW5nbGVzO1xuXG4gICAgdmFyIG1pblgsIG1pblksIG1heFgsIG1heFksIHgsIHksIGludlNpemU7XG5cbiAgICBpZiAoaGFzSG9sZXMpIG91dGVyTm9kZSA9IGVsaW1pbmF0ZUhvbGVzKGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSk7XG5cbiAgICAvLyBpZiB0aGUgc2hhcGUgaXMgbm90IHRvbyBzaW1wbGUsIHdlJ2xsIHVzZSB6LW9yZGVyIGN1cnZlIGhhc2ggbGF0ZXI7IGNhbGN1bGF0ZSBwb2x5Z29uIGJib3hcbiAgICBpZiAoZGF0YS5sZW5ndGggPiA4MCAqIGRpbSkge1xuICAgICAgICBtaW5YID0gbWF4WCA9IGRhdGFbMF07XG4gICAgICAgIG1pblkgPSBtYXhZID0gZGF0YVsxXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gZGltOyBpIDwgb3V0ZXJMZW47IGkgKz0gZGltKSB7XG4gICAgICAgICAgICB4ID0gZGF0YVtpXTtcbiAgICAgICAgICAgIHkgPSBkYXRhW2kgKyAxXTtcbiAgICAgICAgICAgIGlmICh4IDwgbWluWCkgbWluWCA9IHg7XG4gICAgICAgICAgICBpZiAoeSA8IG1pblkpIG1pblkgPSB5O1xuICAgICAgICAgICAgaWYgKHggPiBtYXhYKSBtYXhYID0geDtcbiAgICAgICAgICAgIGlmICh5ID4gbWF4WSkgbWF4WSA9IHk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtaW5YLCBtaW5ZIGFuZCBpbnZTaXplIGFyZSBsYXRlciB1c2VkIHRvIHRyYW5zZm9ybSBjb29yZHMgaW50byBpbnRlZ2VycyBmb3Igei1vcmRlciBjYWxjdWxhdGlvblxuICAgICAgICBpbnZTaXplID0gTWF0aC5tYXgobWF4WCAtIG1pblgsIG1heFkgLSBtaW5ZKTtcbiAgICAgICAgaW52U2l6ZSA9IGludlNpemUgIT09IDAgPyAxIC8gaW52U2l6ZSA6IDA7XG4gICAgfVxuXG4gICAgZWFyY3V0TGlua2VkKG91dGVyTm9kZSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUpO1xuXG4gICAgcmV0dXJuIHRyaWFuZ2xlcztcbn1cblxuLy8gY3JlYXRlIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IGZyb20gcG9seWdvbiBwb2ludHMgaW4gdGhlIHNwZWNpZmllZCB3aW5kaW5nIG9yZGVyXG5mdW5jdGlvbiBsaW5rZWRMaXN0KGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgY2xvY2t3aXNlKSB7XG4gICAgdmFyIGksIGxhc3Q7XG5cbiAgICBpZiAoY2xvY2t3aXNlID09PSAoc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pID4gMCkpIHtcbiAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gZGltKSBsYXN0ID0gaW5zZXJ0Tm9kZShpLCBkYXRhW2ldLCBkYXRhW2kgKyAxXSwgbGFzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChpID0gZW5kIC0gZGltOyBpID49IHN0YXJ0OyBpIC09IGRpbSkgbGFzdCA9IGluc2VydE5vZGUoaSwgZGF0YVtpXSwgZGF0YVtpICsgMV0sIGxhc3QpO1xuICAgIH1cblxuICAgIGlmIChsYXN0ICYmIGVxdWFscyhsYXN0LCBsYXN0Lm5leHQpKSB7XG4gICAgICAgIHJlbW92ZU5vZGUobGFzdCk7XG4gICAgICAgIGxhc3QgPSBsYXN0Lm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhc3Q7XG59XG5cbi8vIGVsaW1pbmF0ZSBjb2xpbmVhciBvciBkdXBsaWNhdGUgcG9pbnRzXG5mdW5jdGlvbiBmaWx0ZXJQb2ludHMoc3RhcnQsIGVuZCkge1xuICAgIGlmICghc3RhcnQpIHJldHVybiBzdGFydDtcbiAgICBpZiAoIWVuZCkgZW5kID0gc3RhcnQ7XG5cbiAgICB2YXIgcCA9IHN0YXJ0LFxuICAgICAgICBhZ2FpbjtcbiAgICBkbyB7XG4gICAgICAgIGFnYWluID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCFwLnN0ZWluZXIgJiYgKGVxdWFscyhwLCBwLm5leHQpIHx8IGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID09PSAwKSkge1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShwKTtcbiAgICAgICAgICAgIHAgPSBlbmQgPSBwLnByZXY7XG4gICAgICAgICAgICBpZiAocCA9PT0gcC5uZXh0KSBicmVhaztcbiAgICAgICAgICAgIGFnYWluID0gdHJ1ZTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcCA9IHAubmV4dDtcbiAgICAgICAgfVxuICAgIH0gd2hpbGUgKGFnYWluIHx8IHAgIT09IGVuZCk7XG5cbiAgICByZXR1cm4gZW5kO1xufVxuXG4vLyBtYWluIGVhciBzbGljaW5nIGxvb3Agd2hpY2ggdHJpYW5ndWxhdGVzIGEgcG9seWdvbiAoZ2l2ZW4gYXMgYSBsaW5rZWQgbGlzdClcbmZ1bmN0aW9uIGVhcmN1dExpbmtlZChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCBwYXNzKSB7XG4gICAgaWYgKCFlYXIpIHJldHVybjtcblxuICAgIC8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcbiAgICBpZiAoIXBhc3MgJiYgaW52U2l6ZSkgaW5kZXhDdXJ2ZShlYXIsIG1pblgsIG1pblksIGludlNpemUpO1xuXG4gICAgdmFyIHN0b3AgPSBlYXIsXG4gICAgICAgIHByZXYsIG5leHQ7XG5cbiAgICAvLyBpdGVyYXRlIHRocm91Z2ggZWFycywgc2xpY2luZyB0aGVtIG9uZSBieSBvbmVcbiAgICB3aGlsZSAoZWFyLnByZXYgIT09IGVhci5uZXh0KSB7XG4gICAgICAgIHByZXYgPSBlYXIucHJldjtcbiAgICAgICAgbmV4dCA9IGVhci5uZXh0O1xuXG4gICAgICAgIGlmIChpbnZTaXplID8gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKSA6IGlzRWFyKGVhcikpIHtcbiAgICAgICAgICAgIC8vIGN1dCBvZmYgdGhlIHRyaWFuZ2xlXG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChwcmV2LmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goZWFyLmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gobmV4dC5pIC8gZGltKTtcblxuICAgICAgICAgICAgcmVtb3ZlTm9kZShlYXIpO1xuXG4gICAgICAgICAgICAvLyBza2lwcGluZyB0aGUgbmV4dCB2ZXJ0ZXggbGVhZHMgdG8gbGVzcyBzbGl2ZXIgdHJpYW5nbGVzXG4gICAgICAgICAgICBlYXIgPSBuZXh0Lm5leHQ7XG4gICAgICAgICAgICBzdG9wID0gbmV4dC5uZXh0O1xuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVhciA9IG5leHQ7XG5cbiAgICAgICAgLy8gaWYgd2UgbG9vcGVkIHRocm91Z2ggdGhlIHdob2xlIHJlbWFpbmluZyBwb2x5Z29uIGFuZCBjYW4ndCBmaW5kIGFueSBtb3JlIGVhcnNcbiAgICAgICAgaWYgKGVhciA9PT0gc3RvcCkge1xuICAgICAgICAgICAgLy8gdHJ5IGZpbHRlcmluZyBwb2ludHMgYW5kIHNsaWNpbmcgYWdhaW5cbiAgICAgICAgICAgIGlmICghcGFzcykge1xuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChmaWx0ZXJQb2ludHMoZWFyKSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUsIDEpO1xuXG4gICAgICAgICAgICAvLyBpZiB0aGlzIGRpZG4ndCB3b3JrLCB0cnkgY3VyaW5nIGFsbCBzbWFsbCBzZWxmLWludGVyc2VjdGlvbnMgbG9jYWxseVxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXNzID09PSAxKSB7XG4gICAgICAgICAgICAgICAgZWFyID0gY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyhlYXIsIHRyaWFuZ2xlcywgZGltKTtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMik7XG5cbiAgICAgICAgICAgIC8vIGFzIGEgbGFzdCByZXNvcnQsIHRyeSBzcGxpdHRpbmcgdGhlIHJlbWFpbmluZyBwb2x5Z29uIGludG8gdHdvXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhc3MgPT09IDIpIHtcbiAgICAgICAgICAgICAgICBzcGxpdEVhcmN1dChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIGNoZWNrIHdoZXRoZXIgYSBwb2x5Z29uIG5vZGUgZm9ybXMgYSB2YWxpZCBlYXIgd2l0aCBhZGphY2VudCBub2Rlc1xuZnVuY3Rpb24gaXNFYXIoZWFyKSB7XG4gICAgdmFyIGEgPSBlYXIucHJldixcbiAgICAgICAgYiA9IGVhcixcbiAgICAgICAgYyA9IGVhci5uZXh0O1xuXG4gICAgaWYgKGFyZWEoYSwgYiwgYykgPj0gMCkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG4gICAgLy8gbm93IG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIG90aGVyIHBvaW50cyBpbnNpZGUgdGhlIHBvdGVudGlhbCBlYXJcbiAgICB2YXIgcCA9IGVhci5uZXh0Lm5leHQ7XG5cbiAgICB3aGlsZSAocCAhPT0gZWFyLnByZXYpIHtcbiAgICAgICAgaWYgKHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSkgJiZcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7XG4gICAgdmFyIGEgPSBlYXIucHJldixcbiAgICAgICAgYiA9IGVhcixcbiAgICAgICAgYyA9IGVhci5uZXh0O1xuXG4gICAgaWYgKGFyZWEoYSwgYiwgYykgPj0gMCkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG4gICAgLy8gdHJpYW5nbGUgYmJveDsgbWluICYgbWF4IGFyZSBjYWxjdWxhdGVkIGxpa2UgdGhpcyBmb3Igc3BlZWRcbiAgICB2YXIgbWluVFggPSBhLnggPCBiLnggPyAoYS54IDwgYy54ID8gYS54IDogYy54KSA6IChiLnggPCBjLnggPyBiLnggOiBjLngpLFxuICAgICAgICBtaW5UWSA9IGEueSA8IGIueSA/IChhLnkgPCBjLnkgPyBhLnkgOiBjLnkpIDogKGIueSA8IGMueSA/IGIueSA6IGMueSksXG4gICAgICAgIG1heFRYID0gYS54ID4gYi54ID8gKGEueCA+IGMueCA/IGEueCA6IGMueCkgOiAoYi54ID4gYy54ID8gYi54IDogYy54KSxcbiAgICAgICAgbWF4VFkgPSBhLnkgPiBiLnkgPyAoYS55ID4gYy55ID8gYS55IDogYy55KSA6IChiLnkgPiBjLnkgPyBiLnkgOiBjLnkpO1xuXG4gICAgLy8gei1vcmRlciByYW5nZSBmb3IgdGhlIGN1cnJlbnQgdHJpYW5nbGUgYmJveDtcbiAgICB2YXIgbWluWiA9IHpPcmRlcihtaW5UWCwgbWluVFksIG1pblgsIG1pblksIGludlNpemUpLFxuICAgICAgICBtYXhaID0gek9yZGVyKG1heFRYLCBtYXhUWSwgbWluWCwgbWluWSwgaW52U2l6ZSk7XG5cbiAgICB2YXIgcCA9IGVhci5wcmV2WixcbiAgICAgICAgbiA9IGVhci5uZXh0WjtcblxuICAgIC8vIGxvb2sgZm9yIHBvaW50cyBpbnNpZGUgdGhlIHRyaWFuZ2xlIGluIGJvdGggZGlyZWN0aW9uc1xuICAgIHdoaWxlIChwICYmIHAueiA+PSBtaW5aICYmIG4gJiYgbi56IDw9IG1heFopIHtcbiAgICAgICAgaWYgKHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXG4gICAgICAgICAgICBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHAgPSBwLnByZXZaO1xuXG4gICAgICAgIGlmIChuICE9PSBlYXIucHJldiAmJiBuICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIG4ueCwgbi55KSAmJlxuICAgICAgICAgICAgYXJlYShuLnByZXYsIG4sIG4ubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBuID0gbi5uZXh0WjtcbiAgICB9XG5cbiAgICAvLyBsb29rIGZvciByZW1haW5pbmcgcG9pbnRzIGluIGRlY3JlYXNpbmcgei1vcmRlclxuICAgIHdoaWxlIChwICYmIHAueiA+PSBtaW5aKSB7XG4gICAgICAgIGlmIChwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55KSAmJlxuICAgICAgICAgICAgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwID0gcC5wcmV2WjtcbiAgICB9XG5cbiAgICAvLyBsb29rIGZvciByZW1haW5pbmcgcG9pbnRzIGluIGluY3JlYXNpbmcgei1vcmRlclxuICAgIHdoaWxlIChuICYmIG4ueiA8PSBtYXhaKSB7XG4gICAgICAgIGlmIChuICE9PSBlYXIucHJldiAmJiBuICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIG4ueCwgbi55KSAmJlxuICAgICAgICAgICAgYXJlYShuLnByZXYsIG4sIG4ubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBuID0gbi5uZXh0WjtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gZ28gdGhyb3VnaCBhbGwgcG9seWdvbiBub2RlcyBhbmQgY3VyZSBzbWFsbCBsb2NhbCBzZWxmLWludGVyc2VjdGlvbnNcbmZ1bmN0aW9uIGN1cmVMb2NhbEludGVyc2VjdGlvbnMoc3RhcnQsIHRyaWFuZ2xlcywgZGltKSB7XG4gICAgdmFyIHAgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBhID0gcC5wcmV2LFxuICAgICAgICAgICAgYiA9IHAubmV4dC5uZXh0O1xuXG4gICAgICAgIGlmICghZXF1YWxzKGEsIGIpICYmIGludGVyc2VjdHMoYSwgcCwgcC5uZXh0LCBiKSAmJiBsb2NhbGx5SW5zaWRlKGEsIGIpICYmIGxvY2FsbHlJbnNpZGUoYiwgYSkpIHtcblxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goYS5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKHAuaSAvIGRpbSk7XG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChiLmkgLyBkaW0pO1xuXG4gICAgICAgICAgICAvLyByZW1vdmUgdHdvIG5vZGVzIGludm9sdmVkXG4gICAgICAgICAgICByZW1vdmVOb2RlKHApO1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShwLm5leHQpO1xuXG4gICAgICAgICAgICBwID0gc3RhcnQgPSBiO1xuICAgICAgICB9XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcmV0dXJuIHA7XG59XG5cbi8vIHRyeSBzcGxpdHRpbmcgcG9seWdvbiBpbnRvIHR3byBhbmQgdHJpYW5ndWxhdGUgdGhlbSBpbmRlcGVuZGVudGx5XG5mdW5jdGlvbiBzcGxpdEVhcmN1dChzdGFydCwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUpIHtcbiAgICAvLyBsb29rIGZvciBhIHZhbGlkIGRpYWdvbmFsIHRoYXQgZGl2aWRlcyB0aGUgcG9seWdvbiBpbnRvIHR3b1xuICAgIHZhciBhID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICB2YXIgYiA9IGEubmV4dC5uZXh0O1xuICAgICAgICB3aGlsZSAoYiAhPT0gYS5wcmV2KSB7XG4gICAgICAgICAgICBpZiAoYS5pICE9PSBiLmkgJiYgaXNWYWxpZERpYWdvbmFsKGEsIGIpKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BsaXQgdGhlIHBvbHlnb24gaW4gdHdvIGJ5IHRoZSBkaWFnb25hbFxuICAgICAgICAgICAgICAgIHZhciBjID0gc3BsaXRQb2x5Z29uKGEsIGIpO1xuXG4gICAgICAgICAgICAgICAgLy8gZmlsdGVyIGNvbGluZWFyIHBvaW50cyBhcm91bmQgdGhlIGN1dHNcbiAgICAgICAgICAgICAgICBhID0gZmlsdGVyUG9pbnRzKGEsIGEubmV4dCk7XG4gICAgICAgICAgICAgICAgYyA9IGZpbHRlclBvaW50cyhjLCBjLm5leHQpO1xuXG4gICAgICAgICAgICAgICAgLy8gcnVuIGVhcmN1dCBvbiBlYWNoIGhhbGZcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoYSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUpO1xuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChjLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYiA9IGIubmV4dDtcbiAgICAgICAgfVxuICAgICAgICBhID0gYS5uZXh0O1xuICAgIH0gd2hpbGUgKGEgIT09IHN0YXJ0KTtcbn1cblxuLy8gbGluayBldmVyeSBob2xlIGludG8gdGhlIG91dGVyIGxvb3AsIHByb2R1Y2luZyBhIHNpbmdsZS1yaW5nIHBvbHlnb24gd2l0aG91dCBob2xlc1xuZnVuY3Rpb24gZWxpbWluYXRlSG9sZXMoZGF0YSwgaG9sZUluZGljZXMsIG91dGVyTm9kZSwgZGltKSB7XG4gICAgdmFyIHF1ZXVlID0gW10sXG4gICAgICAgIGksIGxlbiwgc3RhcnQsIGVuZCwgbGlzdDtcblxuICAgIGZvciAoaSA9IDAsIGxlbiA9IGhvbGVJbmRpY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHN0YXJ0ID0gaG9sZUluZGljZXNbaV0gKiBkaW07XG4gICAgICAgIGVuZCA9IGkgPCBsZW4gLSAxID8gaG9sZUluZGljZXNbaSArIDFdICogZGltIDogZGF0YS5sZW5ndGg7XG4gICAgICAgIGxpc3QgPSBsaW5rZWRMaXN0KGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgZmFsc2UpO1xuICAgICAgICBpZiAobGlzdCA9PT0gbGlzdC5uZXh0KSBsaXN0LnN0ZWluZXIgPSB0cnVlO1xuICAgICAgICBxdWV1ZS5wdXNoKGdldExlZnRtb3N0KGxpc3QpKTtcbiAgICB9XG5cbiAgICBxdWV1ZS5zb3J0KGNvbXBhcmVYKTtcblxuICAgIC8vIHByb2Nlc3MgaG9sZXMgZnJvbSBsZWZ0IHRvIHJpZ2h0XG4gICAgZm9yIChpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVsaW1pbmF0ZUhvbGUocXVldWVbaV0sIG91dGVyTm9kZSk7XG4gICAgICAgIG91dGVyTm9kZSA9IGZpbHRlclBvaW50cyhvdXRlck5vZGUsIG91dGVyTm9kZS5uZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0ZXJOb2RlO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlWChhLCBiKSB7XG4gICAgcmV0dXJuIGEueCAtIGIueDtcbn1cblxuLy8gZmluZCBhIGJyaWRnZSBiZXR3ZWVuIHZlcnRpY2VzIHRoYXQgY29ubmVjdHMgaG9sZSB3aXRoIGFuIG91dGVyIHJpbmcgYW5kIGFuZCBsaW5rIGl0XG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlKGhvbGUsIG91dGVyTm9kZSkge1xuICAgIG91dGVyTm9kZSA9IGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSk7XG4gICAgaWYgKG91dGVyTm9kZSkge1xuICAgICAgICB2YXIgYiA9IHNwbGl0UG9seWdvbihvdXRlck5vZGUsIGhvbGUpO1xuICAgICAgICBmaWx0ZXJQb2ludHMoYiwgYi5uZXh0KTtcbiAgICB9XG59XG5cbi8vIERhdmlkIEViZXJseSdzIGFsZ29yaXRobSBmb3IgZmluZGluZyBhIGJyaWRnZSBiZXR3ZWVuIGhvbGUgYW5kIG91dGVyIHBvbHlnb25cbmZ1bmN0aW9uIGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSkge1xuICAgIHZhciBwID0gb3V0ZXJOb2RlLFxuICAgICAgICBoeCA9IGhvbGUueCxcbiAgICAgICAgaHkgPSBob2xlLnksXG4gICAgICAgIHF4ID0gLUluZmluaXR5LFxuICAgICAgICBtO1xuXG4gICAgLy8gZmluZCBhIHNlZ21lbnQgaW50ZXJzZWN0ZWQgYnkgYSByYXkgZnJvbSB0aGUgaG9sZSdzIGxlZnRtb3N0IHBvaW50IHRvIHRoZSBsZWZ0O1xuICAgIC8vIHNlZ21lbnQncyBlbmRwb2ludCB3aXRoIGxlc3NlciB4IHdpbGwgYmUgcG90ZW50aWFsIGNvbm5lY3Rpb24gcG9pbnRcbiAgICBkbyB7XG4gICAgICAgIGlmIChoeSA8PSBwLnkgJiYgaHkgPj0gcC5uZXh0LnkgJiYgcC5uZXh0LnkgIT09IHAueSkge1xuICAgICAgICAgICAgdmFyIHggPSBwLnggKyAoaHkgLSBwLnkpICogKHAubmV4dC54IC0gcC54KSAvIChwLm5leHQueSAtIHAueSk7XG4gICAgICAgICAgICBpZiAoeCA8PSBoeCAmJiB4ID4gcXgpIHtcbiAgICAgICAgICAgICAgICBxeCA9IHg7XG4gICAgICAgICAgICAgICAgaWYgKHggPT09IGh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoeSA9PT0gcC55KSByZXR1cm4gcDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh5ID09PSBwLm5leHQueSkgcmV0dXJuIHAubmV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbSA9IHAueCA8IHAubmV4dC54ID8gcCA6IHAubmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IG91dGVyTm9kZSk7XG5cbiAgICBpZiAoIW0pIHJldHVybiBudWxsO1xuXG4gICAgaWYgKGh4ID09PSBxeCkgcmV0dXJuIG0ucHJldjsgLy8gaG9sZSB0b3VjaGVzIG91dGVyIHNlZ21lbnQ7IHBpY2sgbG93ZXIgZW5kcG9pbnRcblxuICAgIC8vIGxvb2sgZm9yIHBvaW50cyBpbnNpZGUgdGhlIHRyaWFuZ2xlIG9mIGhvbGUgcG9pbnQsIHNlZ21lbnQgaW50ZXJzZWN0aW9uIGFuZCBlbmRwb2ludDtcbiAgICAvLyBpZiB0aGVyZSBhcmUgbm8gcG9pbnRzIGZvdW5kLCB3ZSBoYXZlIGEgdmFsaWQgY29ubmVjdGlvbjtcbiAgICAvLyBvdGhlcndpc2UgY2hvb3NlIHRoZSBwb2ludCBvZiB0aGUgbWluaW11bSBhbmdsZSB3aXRoIHRoZSByYXkgYXMgY29ubmVjdGlvbiBwb2ludFxuXG4gICAgdmFyIHN0b3AgPSBtLFxuICAgICAgICBteCA9IG0ueCxcbiAgICAgICAgbXkgPSBtLnksXG4gICAgICAgIHRhbk1pbiA9IEluZmluaXR5LFxuICAgICAgICB0YW47XG5cbiAgICBwID0gbS5uZXh0O1xuXG4gICAgd2hpbGUgKHAgIT09IHN0b3ApIHtcbiAgICAgICAgaWYgKGh4ID49IHAueCAmJiBwLnggPj0gbXggJiYgaHggIT09IHAueCAmJlxuICAgICAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZShoeSA8IG15ID8gaHggOiBxeCwgaHksIG14LCBteSwgaHkgPCBteSA/IHF4IDogaHgsIGh5LCBwLngsIHAueSkpIHtcblxuICAgICAgICAgICAgdGFuID0gTWF0aC5hYnMoaHkgLSBwLnkpIC8gKGh4IC0gcC54KTsgLy8gdGFuZ2VudGlhbFxuXG4gICAgICAgICAgICBpZiAoKHRhbiA8IHRhbk1pbiB8fCAodGFuID09PSB0YW5NaW4gJiYgcC54ID4gbS54KSkgJiYgbG9jYWxseUluc2lkZShwLCBob2xlKSkge1xuICAgICAgICAgICAgICAgIG0gPSBwO1xuICAgICAgICAgICAgICAgIHRhbk1pbiA9IHRhbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG07XG59XG5cbi8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcbmZ1bmN0aW9uIGluZGV4Q3VydmUoc3RhcnQsIG1pblgsIG1pblksIGludlNpemUpIHtcbiAgICB2YXIgcCA9IHN0YXJ0O1xuICAgIGRvIHtcbiAgICAgICAgaWYgKHAueiA9PT0gbnVsbCkgcC56ID0gek9yZGVyKHAueCwgcC55LCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcbiAgICAgICAgcC5wcmV2WiA9IHAucHJldjtcbiAgICAgICAgcC5uZXh0WiA9IHAubmV4dDtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XG5cbiAgICBwLnByZXZaLm5leHRaID0gbnVsbDtcbiAgICBwLnByZXZaID0gbnVsbDtcblxuICAgIHNvcnRMaW5rZWQocCk7XG59XG5cbi8vIFNpbW9uIFRhdGhhbSdzIGxpbmtlZCBsaXN0IG1lcmdlIHNvcnQgYWxnb3JpdGhtXG4vLyBodHRwOi8vd3d3LmNoaWFyay5ncmVlbmVuZC5vcmcudWsvfnNndGF0aGFtL2FsZ29yaXRobXMvbGlzdHNvcnQuaHRtbFxuZnVuY3Rpb24gc29ydExpbmtlZChsaXN0KSB7XG4gICAgdmFyIGksIHAsIHEsIGUsIHRhaWwsIG51bU1lcmdlcywgcFNpemUsIHFTaXplLFxuICAgICAgICBpblNpemUgPSAxO1xuXG4gICAgZG8ge1xuICAgICAgICBwID0gbGlzdDtcbiAgICAgICAgbGlzdCA9IG51bGw7XG4gICAgICAgIHRhaWwgPSBudWxsO1xuICAgICAgICBudW1NZXJnZXMgPSAwO1xuXG4gICAgICAgIHdoaWxlIChwKSB7XG4gICAgICAgICAgICBudW1NZXJnZXMrKztcbiAgICAgICAgICAgIHEgPSBwO1xuICAgICAgICAgICAgcFNpemUgPSAwO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGluU2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcFNpemUrKztcbiAgICAgICAgICAgICAgICBxID0gcS5uZXh0WjtcbiAgICAgICAgICAgICAgICBpZiAoIXEpIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcVNpemUgPSBpblNpemU7XG5cbiAgICAgICAgICAgIHdoaWxlIChwU2l6ZSA+IDAgfHwgKHFTaXplID4gMCAmJiBxKSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKHBTaXplICE9PSAwICYmIChxU2l6ZSA9PT0gMCB8fCAhcSB8fCBwLnogPD0gcS56KSkge1xuICAgICAgICAgICAgICAgICAgICBlID0gcDtcbiAgICAgICAgICAgICAgICAgICAgcCA9IHAubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHBTaXplLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZSA9IHE7XG4gICAgICAgICAgICAgICAgICAgIHEgPSBxLm5leHRaO1xuICAgICAgICAgICAgICAgICAgICBxU2l6ZS0tO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0YWlsKSB0YWlsLm5leHRaID0gZTtcbiAgICAgICAgICAgICAgICBlbHNlIGxpc3QgPSBlO1xuXG4gICAgICAgICAgICAgICAgZS5wcmV2WiA9IHRhaWw7XG4gICAgICAgICAgICAgICAgdGFpbCA9IGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHAgPSBxO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFpbC5uZXh0WiA9IG51bGw7XG4gICAgICAgIGluU2l6ZSAqPSAyO1xuXG4gICAgfSB3aGlsZSAobnVtTWVyZ2VzID4gMSk7XG5cbiAgICByZXR1cm4gbGlzdDtcbn1cblxuLy8gei1vcmRlciBvZiBhIHBvaW50IGdpdmVuIGNvb3JkcyBhbmQgaW52ZXJzZSBvZiB0aGUgbG9uZ2VyIHNpZGUgb2YgZGF0YSBiYm94XG5mdW5jdGlvbiB6T3JkZXIoeCwgeSwgbWluWCwgbWluWSwgaW52U2l6ZSkge1xuICAgIC8vIGNvb3JkcyBhcmUgdHJhbnNmb3JtZWQgaW50byBub24tbmVnYXRpdmUgMTUtYml0IGludGVnZXIgcmFuZ2VcbiAgICB4ID0gMzI3NjcgKiAoeCAtIG1pblgpICogaW52U2l6ZTtcbiAgICB5ID0gMzI3NjcgKiAoeSAtIG1pblkpICogaW52U2l6ZTtcblxuICAgIHggPSAoeCB8ICh4IDw8IDgpKSAmIDB4MDBGRjAwRkY7XG4gICAgeCA9ICh4IHwgKHggPDwgNCkpICYgMHgwRjBGMEYwRjtcbiAgICB4ID0gKHggfCAoeCA8PCAyKSkgJiAweDMzMzMzMzMzO1xuICAgIHggPSAoeCB8ICh4IDw8IDEpKSAmIDB4NTU1NTU1NTU7XG5cbiAgICB5ID0gKHkgfCAoeSA8PCA4KSkgJiAweDAwRkYwMEZGO1xuICAgIHkgPSAoeSB8ICh5IDw8IDQpKSAmIDB4MEYwRjBGMEY7XG4gICAgeSA9ICh5IHwgKHkgPDwgMikpICYgMHgzMzMzMzMzMztcbiAgICB5ID0gKHkgfCAoeSA8PCAxKSkgJiAweDU1NTU1NTU1O1xuXG4gICAgcmV0dXJuIHggfCAoeSA8PCAxKTtcbn1cblxuLy8gZmluZCB0aGUgbGVmdG1vc3Qgbm9kZSBvZiBhIHBvbHlnb24gcmluZ1xuZnVuY3Rpb24gZ2V0TGVmdG1vc3Qoc3RhcnQpIHtcbiAgICB2YXIgcCA9IHN0YXJ0LFxuICAgICAgICBsZWZ0bW9zdCA9IHN0YXJ0O1xuICAgIGRvIHtcbiAgICAgICAgaWYgKHAueCA8IGxlZnRtb3N0LnggfHwgKHAueCA9PT0gbGVmdG1vc3QueCAmJiBwLnkgPCBsZWZ0bW9zdC55KSkgbGVmdG1vc3QgPSBwO1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IHN0YXJ0KTtcblxuICAgIHJldHVybiBsZWZ0bW9zdDtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2ludCBsaWVzIHdpdGhpbiBhIGNvbnZleCB0cmlhbmdsZVxuZnVuY3Rpb24gcG9pbnRJblRyaWFuZ2xlKGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIHB4LCBweSkge1xuICAgIHJldHVybiAoY3ggLSBweCkgKiAoYXkgLSBweSkgLSAoYXggLSBweCkgKiAoY3kgLSBweSkgPj0gMCAmJlxuICAgICAgICAgICAoYXggLSBweCkgKiAoYnkgLSBweSkgLSAoYnggLSBweCkgKiAoYXkgLSBweSkgPj0gMCAmJlxuICAgICAgICAgICAoYnggLSBweCkgKiAoY3kgLSBweSkgLSAoY3ggLSBweCkgKiAoYnkgLSBweSkgPj0gMDtcbn1cblxuLy8gY2hlY2sgaWYgYSBkaWFnb25hbCBiZXR3ZWVuIHR3byBwb2x5Z29uIG5vZGVzIGlzIHZhbGlkIChsaWVzIGluIHBvbHlnb24gaW50ZXJpb3IpXG5mdW5jdGlvbiBpc1ZhbGlkRGlhZ29uYWwoYSwgYikge1xuICAgIHJldHVybiBhLm5leHQuaSAhPT0gYi5pICYmIGEucHJldi5pICE9PSBiLmkgJiYgIWludGVyc2VjdHNQb2x5Z29uKGEsIGIpICYmXG4gICAgICAgICAgIGxvY2FsbHlJbnNpZGUoYSwgYikgJiYgbG9jYWxseUluc2lkZShiLCBhKSAmJiBtaWRkbGVJbnNpZGUoYSwgYik7XG59XG5cbi8vIHNpZ25lZCBhcmVhIG9mIGEgdHJpYW5nbGVcbmZ1bmN0aW9uIGFyZWEocCwgcSwgcikge1xuICAgIHJldHVybiAocS55IC0gcC55KSAqIChyLnggLSBxLngpIC0gKHEueCAtIHAueCkgKiAoci55IC0gcS55KTtcbn1cblxuLy8gY2hlY2sgaWYgdHdvIHBvaW50cyBhcmUgZXF1YWxcbmZ1bmN0aW9uIGVxdWFscyhwMSwgcDIpIHtcbiAgICByZXR1cm4gcDEueCA9PT0gcDIueCAmJiBwMS55ID09PSBwMi55O1xufVxuXG4vLyBjaGVjayBpZiB0d28gc2VnbWVudHMgaW50ZXJzZWN0XG5mdW5jdGlvbiBpbnRlcnNlY3RzKHAxLCBxMSwgcDIsIHEyKSB7XG4gICAgaWYgKChlcXVhbHMocDEsIHExKSAmJiBlcXVhbHMocDIsIHEyKSkgfHxcbiAgICAgICAgKGVxdWFscyhwMSwgcTIpICYmIGVxdWFscyhwMiwgcTEpKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGFyZWEocDEsIHExLCBwMikgPiAwICE9PSBhcmVhKHAxLCBxMSwgcTIpID4gMCAmJlxuICAgICAgICAgICBhcmVhKHAyLCBxMiwgcDEpID4gMCAhPT0gYXJlYShwMiwgcTIsIHExKSA+IDA7XG59XG5cbi8vIGNoZWNrIGlmIGEgcG9seWdvbiBkaWFnb25hbCBpbnRlcnNlY3RzIGFueSBwb2x5Z29uIHNlZ21lbnRzXG5mdW5jdGlvbiBpbnRlcnNlY3RzUG9seWdvbihhLCBiKSB7XG4gICAgdmFyIHAgPSBhO1xuICAgIGRvIHtcbiAgICAgICAgaWYgKHAuaSAhPT0gYS5pICYmIHAubmV4dC5pICE9PSBhLmkgJiYgcC5pICE9PSBiLmkgJiYgcC5uZXh0LmkgIT09IGIuaSAmJlxuICAgICAgICAgICAgICAgIGludGVyc2VjdHMocCwgcC5uZXh0LCBhLCBiKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gYSk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIGNoZWNrIGlmIGEgcG9seWdvbiBkaWFnb25hbCBpcyBsb2NhbGx5IGluc2lkZSB0aGUgcG9seWdvblxuZnVuY3Rpb24gbG9jYWxseUluc2lkZShhLCBiKSB7XG4gICAgcmV0dXJuIGFyZWEoYS5wcmV2LCBhLCBhLm5leHQpIDwgMCA/XG4gICAgICAgIGFyZWEoYSwgYiwgYS5uZXh0KSA+PSAwICYmIGFyZWEoYSwgYS5wcmV2LCBiKSA+PSAwIDpcbiAgICAgICAgYXJlYShhLCBiLCBhLnByZXYpIDwgMCB8fCBhcmVhKGEsIGEubmV4dCwgYikgPCAwO1xufVxuXG4vLyBjaGVjayBpZiB0aGUgbWlkZGxlIHBvaW50IG9mIGEgcG9seWdvbiBkaWFnb25hbCBpcyBpbnNpZGUgdGhlIHBvbHlnb25cbmZ1bmN0aW9uIG1pZGRsZUluc2lkZShhLCBiKSB7XG4gICAgdmFyIHAgPSBhLFxuICAgICAgICBpbnNpZGUgPSBmYWxzZSxcbiAgICAgICAgcHggPSAoYS54ICsgYi54KSAvIDIsXG4gICAgICAgIHB5ID0gKGEueSArIGIueSkgLyAyO1xuICAgIGRvIHtcbiAgICAgICAgaWYgKCgocC55ID4gcHkpICE9PSAocC5uZXh0LnkgPiBweSkpICYmIHAubmV4dC55ICE9PSBwLnkgJiZcbiAgICAgICAgICAgICAgICAocHggPCAocC5uZXh0LnggLSBwLngpICogKHB5IC0gcC55KSAvIChwLm5leHQueSAtIHAueSkgKyBwLngpKVxuICAgICAgICAgICAgaW5zaWRlID0gIWluc2lkZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBhKTtcblxuICAgIHJldHVybiBpbnNpZGU7XG59XG5cbi8vIGxpbmsgdHdvIHBvbHlnb24gdmVydGljZXMgd2l0aCBhIGJyaWRnZTsgaWYgdGhlIHZlcnRpY2VzIGJlbG9uZyB0byB0aGUgc2FtZSByaW5nLCBpdCBzcGxpdHMgcG9seWdvbiBpbnRvIHR3bztcbi8vIGlmIG9uZSBiZWxvbmdzIHRvIHRoZSBvdXRlciByaW5nIGFuZCBhbm90aGVyIHRvIGEgaG9sZSwgaXQgbWVyZ2VzIGl0IGludG8gYSBzaW5nbGUgcmluZ1xuZnVuY3Rpb24gc3BsaXRQb2x5Z29uKGEsIGIpIHtcbiAgICB2YXIgYTIgPSBuZXcgTm9kZShhLmksIGEueCwgYS55KSxcbiAgICAgICAgYjIgPSBuZXcgTm9kZShiLmksIGIueCwgYi55KSxcbiAgICAgICAgYW4gPSBhLm5leHQsXG4gICAgICAgIGJwID0gYi5wcmV2O1xuXG4gICAgYS5uZXh0ID0gYjtcbiAgICBiLnByZXYgPSBhO1xuXG4gICAgYTIubmV4dCA9IGFuO1xuICAgIGFuLnByZXYgPSBhMjtcblxuICAgIGIyLm5leHQgPSBhMjtcbiAgICBhMi5wcmV2ID0gYjI7XG5cbiAgICBicC5uZXh0ID0gYjI7XG4gICAgYjIucHJldiA9IGJwO1xuXG4gICAgcmV0dXJuIGIyO1xufVxuXG4vLyBjcmVhdGUgYSBub2RlIGFuZCBvcHRpb25hbGx5IGxpbmsgaXQgd2l0aCBwcmV2aW91cyBvbmUgKGluIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0KVxuZnVuY3Rpb24gaW5zZXJ0Tm9kZShpLCB4LCB5LCBsYXN0KSB7XG4gICAgdmFyIHAgPSBuZXcgTm9kZShpLCB4LCB5KTtcblxuICAgIGlmICghbGFzdCkge1xuICAgICAgICBwLnByZXYgPSBwO1xuICAgICAgICBwLm5leHQgPSBwO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgcC5uZXh0ID0gbGFzdC5uZXh0O1xuICAgICAgICBwLnByZXYgPSBsYXN0O1xuICAgICAgICBsYXN0Lm5leHQucHJldiA9IHA7XG4gICAgICAgIGxhc3QubmV4dCA9IHA7XG4gICAgfVxuICAgIHJldHVybiBwO1xufVxuXG5mdW5jdGlvbiByZW1vdmVOb2RlKHApIHtcbiAgICBwLm5leHQucHJldiA9IHAucHJldjtcbiAgICBwLnByZXYubmV4dCA9IHAubmV4dDtcblxuICAgIGlmIChwLnByZXZaKSBwLnByZXZaLm5leHRaID0gcC5uZXh0WjtcbiAgICBpZiAocC5uZXh0WikgcC5uZXh0Wi5wcmV2WiA9IHAucHJldlo7XG59XG5cbmZ1bmN0aW9uIE5vZGUoaSwgeCwgeSkge1xuICAgIC8vIHZlcnRleCBpbmRleCBpbiBjb29yZGluYXRlcyBhcnJheVxuICAgIHRoaXMuaSA9IGk7XG5cbiAgICAvLyB2ZXJ0ZXggY29vcmRpbmF0ZXNcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG5cbiAgICAvLyBwcmV2aW91cyBhbmQgbmV4dCB2ZXJ0ZXggbm9kZXMgaW4gYSBwb2x5Z29uIHJpbmdcbiAgICB0aGlzLnByZXYgPSBudWxsO1xuICAgIHRoaXMubmV4dCA9IG51bGw7XG5cbiAgICAvLyB6LW9yZGVyIGN1cnZlIHZhbHVlXG4gICAgdGhpcy56ID0gbnVsbDtcblxuICAgIC8vIHByZXZpb3VzIGFuZCBuZXh0IG5vZGVzIGluIHotb3JkZXJcbiAgICB0aGlzLnByZXZaID0gbnVsbDtcbiAgICB0aGlzLm5leHRaID0gbnVsbDtcblxuICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYSBzdGVpbmVyIHBvaW50XG4gICAgdGhpcy5zdGVpbmVyID0gZmFsc2U7XG59XG5cbi8vIHJldHVybiBhIHBlcmNlbnRhZ2UgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwb2x5Z29uIGFyZWEgYW5kIGl0cyB0cmlhbmd1bGF0aW9uIGFyZWE7XG4vLyB1c2VkIHRvIHZlcmlmeSBjb3JyZWN0bmVzcyBvZiB0cmlhbmd1bGF0aW9uXG5lYXJjdXQuZGV2aWF0aW9uID0gZnVuY3Rpb24gKGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0sIHRyaWFuZ2xlcykge1xuICAgIHZhciBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aDtcbiAgICB2YXIgb3V0ZXJMZW4gPSBoYXNIb2xlcyA/IGhvbGVJbmRpY2VzWzBdICogZGltIDogZGF0YS5sZW5ndGg7XG5cbiAgICB2YXIgcG9seWdvbkFyZWEgPSBNYXRoLmFicyhzaWduZWRBcmVhKGRhdGEsIDAsIG91dGVyTGVuLCBkaW0pKTtcbiAgICBpZiAoaGFzSG9sZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGhvbGVJbmRpY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBob2xlSW5kaWNlc1tpXSAqIGRpbTtcbiAgICAgICAgICAgIHZhciBlbmQgPSBpIDwgbGVuIC0gMSA/IGhvbGVJbmRpY2VzW2kgKyAxXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgcG9seWdvbkFyZWEgLT0gTWF0aC5hYnMoc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciB0cmlhbmdsZXNBcmVhID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgdHJpYW5nbGVzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIHZhciBhID0gdHJpYW5nbGVzW2ldICogZGltO1xuICAgICAgICB2YXIgYiA9IHRyaWFuZ2xlc1tpICsgMV0gKiBkaW07XG4gICAgICAgIHZhciBjID0gdHJpYW5nbGVzW2kgKyAyXSAqIGRpbTtcbiAgICAgICAgdHJpYW5nbGVzQXJlYSArPSBNYXRoLmFicyhcbiAgICAgICAgICAgIChkYXRhW2FdIC0gZGF0YVtjXSkgKiAoZGF0YVtiICsgMV0gLSBkYXRhW2EgKyAxXSkgLVxuICAgICAgICAgICAgKGRhdGFbYV0gLSBkYXRhW2JdKSAqIChkYXRhW2MgKyAxXSAtIGRhdGFbYSArIDFdKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvbHlnb25BcmVhID09PSAwICYmIHRyaWFuZ2xlc0FyZWEgPT09IDAgPyAwIDpcbiAgICAgICAgTWF0aC5hYnMoKHRyaWFuZ2xlc0FyZWEgLSBwb2x5Z29uQXJlYSkgLyBwb2x5Z29uQXJlYSk7XG59O1xuXG5mdW5jdGlvbiBzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkge1xuICAgIHZhciBzdW0gPSAwO1xuICAgIGZvciAodmFyIGkgPSBzdGFydCwgaiA9IGVuZCAtIGRpbTsgaSA8IGVuZDsgaSArPSBkaW0pIHtcbiAgICAgICAgc3VtICs9IChkYXRhW2pdIC0gZGF0YVtpXSkgKiAoZGF0YVtpICsgMV0gKyBkYXRhW2ogKyAxXSk7XG4gICAgICAgIGogPSBpO1xuICAgIH1cbiAgICByZXR1cm4gc3VtO1xufVxuXG4vLyB0dXJuIGEgcG9seWdvbiBpbiBhIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5IGZvcm0gKGUuZy4gYXMgaW4gR2VvSlNPTikgaW50byBhIGZvcm0gRWFyY3V0IGFjY2VwdHNcbmVhcmN1dC5mbGF0dGVuID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIgZGltID0gZGF0YVswXVswXS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdCA9IHt2ZXJ0aWNlczogW10sIGhvbGVzOiBbXSwgZGltZW5zaW9uczogZGltfSxcbiAgICAgICAgaG9sZUluZGV4ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGRhdGFbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGQgPSAwOyBkIDwgZGltOyBkKyspIHJlc3VsdC52ZXJ0aWNlcy5wdXNoKGRhdGFbaV1bal1bZF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgaG9sZUluZGV4ICs9IGRhdGFbaSAtIDFdLmxlbmd0aDtcbiAgICAgICAgICAgIHJlc3VsdC5ob2xlcy5wdXNoKGhvbGVJbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIvKipcbiAqIEV4cG9ydHMgYSBgUG9seWdvbkxvb2t1cGAgY29uc3RydWN0b3IsIHdoaWNoIGNvbnN0cnVjdHMgYSBkYXRhLXN0cnVjdHVyZSBmb3JcbiAqIHF1aWNrbHkgZmluZGluZyB0aGUgcG9seWdvbiB0aGF0IGEgcG9pbnQgaW50ZXJzZWN0cyBpbiBhIChwb3RlbnRpYWxseSB2ZXJ5XG4gKiBsYXJnZSkgc2V0LlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJidXNoID0gcmVxdWlyZSggJ3JidXNoJyApO1xudmFyIHBvaW50SW5Qb2x5Z29uID0gcmVxdWlyZSggJ3BvaW50LWluLXBvbHlnb24nICk7XG52YXIgcG9seWdvblV0aWxzID0gcmVxdWlyZSggJy4vbGliL3BvbHlnb25fdXRpbHMnICk7XG52YXIgXyA9IHJlcXVpcmUoJ2xvZGFzaCcpO1xuXG4vKipcbiAqIEBwcm9wZXJ0eSB7cmJ1c2h9IHJ0cmVlIEEgc3BhdGlhbCBpbmRleCBmb3IgYHRoaXMucG9seWdvbnNgLlxuICogQHByb3BlcnR5IHtvYmplY3R9IHBvbGdvbnMgQSBHZW9KU09OIGZlYXR1cmUgY29sbGVjdGlvbi5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gW2ZlYXR1cmVDb2xsZWN0aW9uXSBBbiBvcHRpb25hbCBHZW9KU09OIGZlYXR1cmUgY29sbGVjdGlvblxuICogICAgdG8gcGFzcyB0byBgbG9hZEZlYXR1cmVDb2xsZWN0aW9uKClgLlxuICovXG5mdW5jdGlvbiBQb2x5Z29uTG9va3VwKCBmZWF0dXJlQ29sbGVjdGlvbiApe1xuICBpZiggZmVhdHVyZUNvbGxlY3Rpb24gIT09IHVuZGVmaW5lZCApe1xuICAgIHRoaXMubG9hZEZlYXR1cmVDb2xsZWN0aW9uKCBmZWF0dXJlQ29sbGVjdGlvbiApO1xuICB9XG59XG5cbi8vIENhbGN1bGF0ZSBwb2ludCBpbiBwb2x5Z29uIGludGVyc2VjdGlvbiwgYWNjb3VudGluZyBmb3IgYW55IGhvbGVzXG5mdW5jdGlvbiBwb2ludEluUG9seWdvbldpdGhIb2xlcyhwb2ludCwgcG9seWdvbnMpIHtcbiAgdmFyIG1haW5Qb2x5Z29uID0gcG9seWdvbnMuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF07XG4gIGlmKCBwb2ludEluUG9seWdvbiggcG9pbnQsIG1haW5Qb2x5Z29uICkgKXtcbiAgICBmb3IoIHZhciBzdWJQb2x5SW5kID0gMTsgc3ViUG9seUluZCA8IHBvbHlnb25zLmdlb21ldHJ5LmNvb3JkaW5hdGVzLmxlbmd0aDsgc3ViUG9seUluZCsrICl7XG4gICAgICBpZiggcG9pbnRJblBvbHlnb24oIHBvaW50LCBwb2x5Z29ucy5nZW9tZXRyeS5jb29yZGluYXRlc1sgc3ViUG9seUluZCBdICkgKXtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cblxuLypcbiAqIEludGVybmFsIGhlbHBlciBtZXRob2QgdG8gcmV0dXJuIGEgc2luZ2xlIG1hdGNoaW5nIHBvbHlnb25cbiAqL1xuUG9seWdvbkxvb2t1cC5wcm90b3R5cGUuc2VhcmNoRm9yT25lUG9seWdvbiA9IGZ1bmN0aW9uIHNlYXJjaEZvck9uZVBvbHlnb24oIHgsIHkgKSB7XG4gIC8vIGZpbmQgd2hpY2ggYmJveGVzIGNvbnRhaW4gdGhlIHNlYXJjaCBwb2ludC4gdGhlaXIgcG9seWdvbnMgX21heV8gaW50ZXJzZWN0IHRoYXQgcG9pbnRcbiAgdmFyIGJib3hlcyA9IHRoaXMucnRyZWUuc2VhcmNoKCB7IG1pblg6IHgsIG1pblk6IHksIG1heFg6IHgsIG1heFk6IHkgfSApO1xuXG4gIHZhciBwb2ludCA9IFsgeCwgeSBdO1xuXG4gIC8vIGdldCB0aGUgcG9seWdvbiBmb3IgZWFjaCBwb3NzaWJseSBtYXRjaGluZyBwb2x5Z29uIGJhc2VkIG9uIHRoZSBzZWFyY2hlZCBiYm94ZXNcbiAgdmFyIHBvbHlnb25zID0gYmJveGVzLm1hcChmdW5jdGlvbihiYm94LCBpbmRleCkge1xuICAgIHJldHVybiB0aGlzLnBvbHlnb25zWyBiYm94ZXNbaW5kZXhdLnBvbHlJZCBdO1xuICAvLyBmaW5kIHRoZSBmaXJzdCBwb2x5Z29uIHRoYXQgYWN0dWFsbHkgaW50ZXJzZWN0cyBhbmQgcmV0dXJuIGl0XG4gIH0sIHRoaXMpO1xuXG4gIHJldHVybiBfLmZpbmQocG9seWdvbnMsIGZ1bmN0aW9uKHBvbHlPYmopIHtcbiAgICByZXR1cm4gcG9pbnRJblBvbHlnb25XaXRoSG9sZXMocG9pbnQsIHBvbHlPYmopO1xuICB9KTtcbn07XG5cbi8qXG4gKiBJbnRlcm5hbCBoZWxwZXIgbWV0aG9kIHRvIHJldHVybiBtdWx0aXBsZSBtYXRjaGluZyBwb2x5Z29ucywgdXAgdG8gYSBnaXZlbiBsaW1pdC5cbiAqIEEgbGltaXQgb2YgLTEgbWVhbnMgdW5saW1pdGVkXG4gKi9cblBvbHlnb25Mb29rdXAucHJvdG90eXBlLnNlYXJjaEZvck11bHRpcGxlUG9seWdvbnMgPSBmdW5jdGlvbiBzZWFyY2hGb3JNdWx0aXBsZVBvbHlnb25zKCB4LCB5LCBsaW1pdCApIHtcbiAgaWYgKGxpbWl0ID09PSAtMSkge1xuICAgIGxpbWl0ID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gIH1cblxuICB2YXIgcG9pbnQgPSBbIHgsIHkgXTtcbiAgdmFyIGJib3hlcyA9IHRoaXMucnRyZWUuc2VhcmNoKCB7IG1pblg6IHgsIG1pblk6IHksIG1heFg6IHgsIG1heFk6IHkgfSApO1xuXG4gIC8vIGdldCB0aGUgcG9seWdvbiBmb3IgZWFjaCBwb3NzaWJseSBtYXRjaGluZyBwb2x5Z29uIGJhc2VkIG9uIHRoZSBzZWFyY2hlZCBiYm94ZXNcbiAgdmFyIHBvbHlnb25zID0gYmJveGVzLm1hcChmdW5jdGlvbihiYm94LCBpbmRleCkge1xuICAgIHJldHVybiB0aGlzLnBvbHlnb25zWyBiYm94ZXNbaW5kZXhdLnBvbHlJZCBdO1xuICB9LCB0aGlzKTtcblxuICAvLyBrZWVwIHRyYWNrIG9mIG1hdGNoZXMgdG8gYXZvaWQgZXh0cmEgZXhwZW5zaXZlIGNhbGN1bGF0aW9ucyBpZiBsaW1pdCByZWFjaGVkXG4gIHZhciBtYXRjaGVzRm91bmQgPSAwO1xuXG4gIC8vIGZpbHRlciBtYXRjaGluZyBwb2x5Z29ucywgdXAgdG8gdGhlIGxpbWl0XG4gIHBvbHlnb25zID0gcG9seWdvbnMuZmlsdGVyKGZ1bmN0aW9uKHBvbHlnb24pIHtcbiAgICAvLyBzaG9ydCBjaXJjdWl0IGlmIGxpbWl0IHJlYWNoZWRcbiAgICBpZiAobWF0Y2hlc0ZvdW5kID49IGxpbWl0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIGludGVyc2VjdHMgPSBwb2ludEluUG9seWdvbldpdGhIb2xlcyhwb2ludCwgcG9seWdvbik7XG4gICAgaWYgKGludGVyc2VjdHMpIHtcbiAgICAgIG1hdGNoZXNGb3VuZCsrO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG5cbiAgLy8gcmV0dXJuIGFsbCBtYXRjaGluZyBwb2x5Z29ucyBhcyBhIEdlb0pTT04gRmVhdHVyZUNvbGxlY3Rpb25cbiAgcmV0dXJuIHtcbiAgICB0eXBlIDogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICBmZWF0dXJlcyA6IHBvbHlnb25zLFxuICB9O1xufTtcblxuLyoqXG4gKiBGaW5kIHBvbHlnb24ocykgdGhhdCBhIHBvaW50IGludGVyc2VjdHMuIEV4ZWN1dGUgYSBib3VuZGluZy1ib3ggc2VhcmNoIHRvXG4gKiBuYXJyb3cgZG93biB0aGUgY2FuZGlkYXRlIHBvbHlnb25zIHRvIGEgc21hbGwgc3Vic2V0LCBhbmQgdGhlbiBwZXJmb3JtXG4gKiBhZGRpdGlvbmFsIHBvaW50LWluLXBvbHlnb24gaW50ZXJzZWN0aW9ucyB0byByZXNvbHZlIGFueSBhbWJpZ3VpdGllcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0geCBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBwb2ludC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB5IFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LlxuICogQHBhcmFtIHtudW1iZXJ9IFtsaW1pdF0gTnVtYmVyIG9mIHJlc3VsdHMgdG8gcmV0dXJuICgtMSB0byByZXR1cm4gYWxsIHRoZSByZXN1bHRzKS5cbiAqIEByZXR1cm4ge3VuZGVmaW5lZHxvYmplY3R9IElmIG9uZSBvciBtb3JlIGJvdW5kaW5nIGJveCBpbnRlcnNlY3Rpb25zIGFyZVxuICogICAgZm91bmQgYW5kIGxpbWl0IGlzIHVuZGVmaW5lZCwgcmV0dXJuIHRoZSBmaXJzdCBwb2x5Z29uIHRoYXQgaW50ZXJzZWN0cyAoYHhgLCBgeWApOyBvdGhlcndpc2UsXG4gKiAgICBgdW5kZWZpbmVkYC4gSWYgYSBsaW1pdCBpcyBwYXNzZWQgaW4sIHJldHVybiBpbnRlcmNlY3RpbmcgcG9seWdvbnMgYXMgYSBHZW9KU09OIEZlYXR1cmVDb2xsZWN0aW9uLlxuICovXG5Qb2x5Z29uTG9va3VwLnByb3RvdHlwZS5zZWFyY2ggPSBmdW5jdGlvbiBzZWFyY2goIHgsIHksIGxpbWl0ICl7XG4gIGlmIChsaW1pdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoRm9yT25lUG9seWdvbiggeCwgeSApO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaEZvck11bHRpcGxlUG9seWdvbnMoIHgsIHksIGxpbWl0ICk7XG4gIH1cbn07XG5cbi8qKlxuICogQnVpbGQgYSBzcGF0aWFsIGluZGV4IGZvciBhIHNldCBvZiBwb2x5Z29ucywgYW5kIHN0b3JlIGJvdGggdGhlIHBvbHlnb25zIGFuZFxuICogdGhlIGluZGV4IGluIHRoaXMgYFBvbHlnb25Mb29rdXBgLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb2xsZWN0aW9uIEEgR2VvSlNPTi1mb3JtYXR0ZWQgRmVhdHVyZUNvbGxlY3Rpb24uXG4gKi9cblBvbHlnb25Mb29rdXAucHJvdG90eXBlLmxvYWRGZWF0dXJlQ29sbGVjdGlvbiA9IGZ1bmN0aW9uIGxvYWRGZWF0dXJlQ29sbGVjdGlvbiggY29sbGVjdGlvbiApe1xuICB2YXIgYmJveGVzID0gW107XG4gIHZhciBwb2x5Z29ucyA9IFtdO1xuICB2YXIgcG9seUlkID0gMDtcblxuICBmdW5jdGlvbiBpbmRleFBvbHlnb24oIHBvbHkgKXtcbiAgICBwb2x5Z29ucy5wdXNoKHBvbHkpO1xuICAgIHZhciBiYm94ID0gcG9seWdvblV0aWxzLmdldEJvdW5kaW5nQm94KCBwb2x5Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWyAwIF0gKTtcbiAgICBiYm94LnBvbHlJZCA9IHBvbHlJZCsrO1xuICAgIGJib3hlcy5wdXNoKGJib3gpO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5kZXhGZWF0dXJlKCBwb2x5ICl7XG4gICAgaWYoIHBvbHkuZ2VvbWV0cnkgJiZcbiAgICAgICAgcG9seS5nZW9tZXRyeS5jb29yZGluYXRlc1sgMCBdICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgcG9seS5nZW9tZXRyeS5jb29yZGluYXRlc1sgMCBdLmxlbmd0aCA+IDApe1xuICAgICAgc3dpdGNoKCBwb2x5Lmdlb21ldHJ5LnR5cGUgKXtcbiAgICAgICAgY2FzZSAnUG9seWdvbic6XG4gICAgICAgICAgaW5kZXhQb2x5Z29uKCBwb2x5ICk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnTXVsdGlQb2x5Z29uJzpcbiAgICAgICAgICB2YXIgY2hpbGRQb2x5cyA9IHBvbHkuZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgZm9yKCB2YXIgaW5kID0gMDsgaW5kIDwgY2hpbGRQb2x5cy5sZW5ndGg7IGluZCsrICl7XG4gICAgICAgICAgICB2YXIgY2hpbGRQb2x5ID0ge1xuICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZScsXG4gICAgICAgICAgICAgIHByb3BlcnRpZXM6IHBvbHkucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnUG9seWdvbicsXG4gICAgICAgICAgICAgICAgY29vcmRpbmF0ZXM6IGNoaWxkUG9seXNbIGluZCBdXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbmRleFBvbHlnb24oIGNoaWxkUG9seSApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb2xsZWN0aW9uLmZlYXR1cmVzLmZvckVhY2goIGluZGV4RmVhdHVyZSApO1xuICB0aGlzLnJ0cmVlID0gbmV3IFJidXNoKCkubG9hZCggYmJveGVzICk7XG4gIHRoaXMucG9seWdvbnMgPSBwb2x5Z29ucztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUG9seWdvbkxvb2t1cDtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByYnVzaDtcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSByYnVzaDtcblxudmFyIHF1aWNrc2VsZWN0ID0gcmVxdWlyZSgncXVpY2tzZWxlY3QnKTtcblxuZnVuY3Rpb24gcmJ1c2gobWF4RW50cmllcywgZm9ybWF0KSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIHJidXNoKSkgcmV0dXJuIG5ldyByYnVzaChtYXhFbnRyaWVzLCBmb3JtYXQpO1xuXG4gICAgLy8gbWF4IGVudHJpZXMgaW4gYSBub2RlIGlzIDkgYnkgZGVmYXVsdDsgbWluIG5vZGUgZmlsbCBpcyA0MCUgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGlzLl9tYXhFbnRyaWVzID0gTWF0aC5tYXgoNCwgbWF4RW50cmllcyB8fCA5KTtcbiAgICB0aGlzLl9taW5FbnRyaWVzID0gTWF0aC5tYXgoMiwgTWF0aC5jZWlsKHRoaXMuX21heEVudHJpZXMgKiAwLjQpKTtcblxuICAgIGlmIChmb3JtYXQpIHtcbiAgICAgICAgdGhpcy5faW5pdEZvcm1hdChmb3JtYXQpO1xuICAgIH1cblxuICAgIHRoaXMuY2xlYXIoKTtcbn1cblxucmJ1c2gucHJvdG90eXBlID0ge1xuXG4gICAgYWxsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbGwodGhpcy5kYXRhLCBbXSk7XG4gICAgfSxcblxuICAgIHNlYXJjaDogZnVuY3Rpb24gKGJib3gpIHtcblxuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuZGF0YSxcbiAgICAgICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICAgICAgdG9CQm94ID0gdGhpcy50b0JCb3g7XG5cbiAgICAgICAgaWYgKCFpbnRlcnNlY3RzKGJib3gsIG5vZGUpKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgICAgIHZhciBub2Rlc1RvU2VhcmNoID0gW10sXG4gICAgICAgICAgICBpLCBsZW4sIGNoaWxkLCBjaGlsZEJCb3g7XG5cbiAgICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblxuICAgICAgICAgICAgICAgIGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBjaGlsZEJCb3ggPSBub2RlLmxlYWYgPyB0b0JCb3goY2hpbGQpIDogY2hpbGQ7XG5cbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0cyhiYm94LCBjaGlsZEJCb3gpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmxlYWYpIHJlc3VsdC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29udGFpbnMoYmJveCwgY2hpbGRCQm94KSkgdGhpcy5fYWxsKGNoaWxkLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIG5vZGVzVG9TZWFyY2gucHVzaChjaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZSA9IG5vZGVzVG9TZWFyY2gucG9wKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBjb2xsaWRlczogZnVuY3Rpb24gKGJib3gpIHtcblxuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuZGF0YSxcbiAgICAgICAgICAgIHRvQkJveCA9IHRoaXMudG9CQm94O1xuXG4gICAgICAgIGlmICghaW50ZXJzZWN0cyhiYm94LCBub2RlKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHZhciBub2Rlc1RvU2VhcmNoID0gW10sXG4gICAgICAgICAgICBpLCBsZW4sIGNoaWxkLCBjaGlsZEJCb3g7XG5cbiAgICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblxuICAgICAgICAgICAgICAgIGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBjaGlsZEJCb3ggPSBub2RlLmxlYWYgPyB0b0JCb3goY2hpbGQpIDogY2hpbGQ7XG5cbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0cyhiYm94LCBjaGlsZEJCb3gpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmxlYWYgfHwgY29udGFpbnMoYmJveCwgY2hpbGRCQm94KSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzVG9TZWFyY2gucHVzaChjaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZSA9IG5vZGVzVG9TZWFyY2gucG9wKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIGxvYWQ6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmICghKGRhdGEgJiYgZGF0YS5sZW5ndGgpKSByZXR1cm4gdGhpcztcblxuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPCB0aGlzLl9taW5FbnRyaWVzKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZGF0YS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0KGRhdGFbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZWN1cnNpdmVseSBidWlsZCB0aGUgdHJlZSB3aXRoIHRoZSBnaXZlbiBkYXRhIGZyb20gc2NyYXRjaCB1c2luZyBPTVQgYWxnb3JpdGhtXG4gICAgICAgIHZhciBub2RlID0gdGhpcy5fYnVpbGQoZGF0YS5zbGljZSgpLCAwLCBkYXRhLmxlbmd0aCAtIDEsIDApO1xuXG4gICAgICAgIGlmICghdGhpcy5kYXRhLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gc2F2ZSBhcyBpcyBpZiB0cmVlIGlzIGVtcHR5XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBub2RlO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLmhlaWdodCA9PT0gbm9kZS5oZWlnaHQpIHtcbiAgICAgICAgICAgIC8vIHNwbGl0IHJvb3QgaWYgdHJlZXMgaGF2ZSB0aGUgc2FtZSBoZWlnaHRcbiAgICAgICAgICAgIHRoaXMuX3NwbGl0Um9vdCh0aGlzLmRhdGEsIG5vZGUpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhLmhlaWdodCA8IG5vZGUuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgLy8gc3dhcCB0cmVlcyBpZiBpbnNlcnRlZCBvbmUgaXMgYmlnZ2VyXG4gICAgICAgICAgICAgICAgdmFyIHRtcE5vZGUgPSB0aGlzLmRhdGE7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gbm9kZTtcbiAgICAgICAgICAgICAgICBub2RlID0gdG1wTm9kZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW5zZXJ0IHRoZSBzbWFsbCB0cmVlIGludG8gdGhlIGxhcmdlIHRyZWUgYXQgYXBwcm9wcmlhdGUgbGV2ZWxcbiAgICAgICAgICAgIHRoaXMuX2luc2VydChub2RlLCB0aGlzLmRhdGEuaGVpZ2h0IC0gbm9kZS5oZWlnaHQgLSAxLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBpbnNlcnQ6IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIGlmIChpdGVtKSB0aGlzLl9pbnNlcnQoaXRlbSwgdGhpcy5kYXRhLmhlaWdodCAtIDEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgY2xlYXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5kYXRhID0gY3JlYXRlTm9kZShbXSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICByZW1vdmU6IGZ1bmN0aW9uIChpdGVtLCBlcXVhbHNGbikge1xuICAgICAgICBpZiAoIWl0ZW0pIHJldHVybiB0aGlzO1xuXG4gICAgICAgIHZhciBub2RlID0gdGhpcy5kYXRhLFxuICAgICAgICAgICAgYmJveCA9IHRoaXMudG9CQm94KGl0ZW0pLFxuICAgICAgICAgICAgcGF0aCA9IFtdLFxuICAgICAgICAgICAgaW5kZXhlcyA9IFtdLFxuICAgICAgICAgICAgaSwgcGFyZW50LCBpbmRleCwgZ29pbmdVcDtcblxuICAgICAgICAvLyBkZXB0aC1maXJzdCBpdGVyYXRpdmUgdHJlZSB0cmF2ZXJzYWxcbiAgICAgICAgd2hpbGUgKG5vZGUgfHwgcGF0aC5sZW5ndGgpIHtcblxuICAgICAgICAgICAgaWYgKCFub2RlKSB7IC8vIGdvIHVwXG4gICAgICAgICAgICAgICAgbm9kZSA9IHBhdGgucG9wKCk7XG4gICAgICAgICAgICAgICAgcGFyZW50ID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGkgPSBpbmRleGVzLnBvcCgpO1xuICAgICAgICAgICAgICAgIGdvaW5nVXAgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobm9kZS5sZWFmKSB7IC8vIGNoZWNrIGN1cnJlbnQgbm9kZVxuICAgICAgICAgICAgICAgIGluZGV4ID0gZmluZEl0ZW0oaXRlbSwgbm9kZS5jaGlsZHJlbiwgZXF1YWxzRm4pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpdGVtIGZvdW5kLCByZW1vdmUgdGhlIGl0ZW0gYW5kIGNvbmRlbnNlIHRyZWUgdXB3YXJkc1xuICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHBhdGgucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29uZGVuc2UocGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFnb2luZ1VwICYmICFub2RlLmxlYWYgJiYgY29udGFpbnMobm9kZSwgYmJveCkpIHsgLy8gZ28gZG93blxuICAgICAgICAgICAgICAgIHBhdGgucHVzaChub2RlKTtcbiAgICAgICAgICAgICAgICBpbmRleGVzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgICAgICAgcGFyZW50ID0gbm9kZTtcbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZHJlblswXTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQpIHsgLy8gZ28gcmlnaHRcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgbm9kZSA9IHBhcmVudC5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICBnb2luZ1VwID0gZmFsc2U7XG5cbiAgICAgICAgICAgIH0gZWxzZSBub2RlID0gbnVsbDsgLy8gbm90aGluZyBmb3VuZFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIHRvQkJveDogZnVuY3Rpb24gKGl0ZW0pIHsgcmV0dXJuIGl0ZW07IH0sXG5cbiAgICBjb21wYXJlTWluWDogY29tcGFyZU5vZGVNaW5YLFxuICAgIGNvbXBhcmVNaW5ZOiBjb21wYXJlTm9kZU1pblksXG5cbiAgICB0b0pTT046IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZGF0YTsgfSxcblxuICAgIGZyb21KU09OOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX2FsbDogZnVuY3Rpb24gKG5vZGUsIHJlc3VsdCkge1xuICAgICAgICB2YXIgbm9kZXNUb1NlYXJjaCA9IFtdO1xuICAgICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAgICAgaWYgKG5vZGUubGVhZikgcmVzdWx0LnB1c2guYXBwbHkocmVzdWx0LCBub2RlLmNoaWxkcmVuKTtcbiAgICAgICAgICAgIGVsc2Ugbm9kZXNUb1NlYXJjaC5wdXNoLmFwcGx5KG5vZGVzVG9TZWFyY2gsIG5vZGUuY2hpbGRyZW4pO1xuXG4gICAgICAgICAgICBub2RlID0gbm9kZXNUb1NlYXJjaC5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBfYnVpbGQ6IGZ1bmN0aW9uIChpdGVtcywgbGVmdCwgcmlnaHQsIGhlaWdodCkge1xuXG4gICAgICAgIHZhciBOID0gcmlnaHQgLSBsZWZ0ICsgMSxcbiAgICAgICAgICAgIE0gPSB0aGlzLl9tYXhFbnRyaWVzLFxuICAgICAgICAgICAgbm9kZTtcblxuICAgICAgICBpZiAoTiA8PSBNKSB7XG4gICAgICAgICAgICAvLyByZWFjaGVkIGxlYWYgbGV2ZWw7IHJldHVybiBsZWFmXG4gICAgICAgICAgICBub2RlID0gY3JlYXRlTm9kZShpdGVtcy5zbGljZShsZWZ0LCByaWdodCArIDEpKTtcbiAgICAgICAgICAgIGNhbGNCQm94KG5vZGUsIHRoaXMudG9CQm94KTtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoZWlnaHQpIHtcbiAgICAgICAgICAgIC8vIHRhcmdldCBoZWlnaHQgb2YgdGhlIGJ1bGstbG9hZGVkIHRyZWVcbiAgICAgICAgICAgIGhlaWdodCA9IE1hdGguY2VpbChNYXRoLmxvZyhOKSAvIE1hdGgubG9nKE0pKTtcblxuICAgICAgICAgICAgLy8gdGFyZ2V0IG51bWJlciBvZiByb290IGVudHJpZXMgdG8gbWF4aW1pemUgc3RvcmFnZSB1dGlsaXphdGlvblxuICAgICAgICAgICAgTSA9IE1hdGguY2VpbChOIC8gTWF0aC5wb3coTSwgaGVpZ2h0IC0gMSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IGNyZWF0ZU5vZGUoW10pO1xuICAgICAgICBub2RlLmxlYWYgPSBmYWxzZTtcbiAgICAgICAgbm9kZS5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICAgICAgLy8gc3BsaXQgdGhlIGl0ZW1zIGludG8gTSBtb3N0bHkgc3F1YXJlIHRpbGVzXG5cbiAgICAgICAgdmFyIE4yID0gTWF0aC5jZWlsKE4gLyBNKSxcbiAgICAgICAgICAgIE4xID0gTjIgKiBNYXRoLmNlaWwoTWF0aC5zcXJ0KE0pKSxcbiAgICAgICAgICAgIGksIGosIHJpZ2h0MiwgcmlnaHQzO1xuXG4gICAgICAgIG11bHRpU2VsZWN0KGl0ZW1zLCBsZWZ0LCByaWdodCwgTjEsIHRoaXMuY29tcGFyZU1pblgpO1xuXG4gICAgICAgIGZvciAoaSA9IGxlZnQ7IGkgPD0gcmlnaHQ7IGkgKz0gTjEpIHtcblxuICAgICAgICAgICAgcmlnaHQyID0gTWF0aC5taW4oaSArIE4xIC0gMSwgcmlnaHQpO1xuXG4gICAgICAgICAgICBtdWx0aVNlbGVjdChpdGVtcywgaSwgcmlnaHQyLCBOMiwgdGhpcy5jb21wYXJlTWluWSk7XG5cbiAgICAgICAgICAgIGZvciAoaiA9IGk7IGogPD0gcmlnaHQyOyBqICs9IE4yKSB7XG5cbiAgICAgICAgICAgICAgICByaWdodDMgPSBNYXRoLm1pbihqICsgTjIgLSAxLCByaWdodDIpO1xuXG4gICAgICAgICAgICAgICAgLy8gcGFjayBlYWNoIGVudHJ5IHJlY3Vyc2l2ZWx5XG4gICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5wdXNoKHRoaXMuX2J1aWxkKGl0ZW1zLCBqLCByaWdodDMsIGhlaWdodCAtIDEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGNCQm94KG5vZGUsIHRoaXMudG9CQm94KTtcblxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9LFxuXG4gICAgX2Nob29zZVN1YnRyZWU6IGZ1bmN0aW9uIChiYm94LCBub2RlLCBsZXZlbCwgcGF0aCkge1xuXG4gICAgICAgIHZhciBpLCBsZW4sIGNoaWxkLCB0YXJnZXROb2RlLCBhcmVhLCBlbmxhcmdlbWVudCwgbWluQXJlYSwgbWluRW5sYXJnZW1lbnQ7XG5cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIHBhdGgucHVzaChub2RlKTtcblxuICAgICAgICAgICAgaWYgKG5vZGUubGVhZiB8fCBwYXRoLmxlbmd0aCAtIDEgPT09IGxldmVsKSBicmVhaztcblxuICAgICAgICAgICAgbWluQXJlYSA9IG1pbkVubGFyZ2VtZW50ID0gSW5maW5pdHk7XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV07XG4gICAgICAgICAgICAgICAgYXJlYSA9IGJib3hBcmVhKGNoaWxkKTtcbiAgICAgICAgICAgICAgICBlbmxhcmdlbWVudCA9IGVubGFyZ2VkQXJlYShiYm94LCBjaGlsZCkgLSBhcmVhO1xuXG4gICAgICAgICAgICAgICAgLy8gY2hvb3NlIGVudHJ5IHdpdGggdGhlIGxlYXN0IGFyZWEgZW5sYXJnZW1lbnRcbiAgICAgICAgICAgICAgICBpZiAoZW5sYXJnZW1lbnQgPCBtaW5FbmxhcmdlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBtaW5FbmxhcmdlbWVudCA9IGVubGFyZ2VtZW50O1xuICAgICAgICAgICAgICAgICAgICBtaW5BcmVhID0gYXJlYSA8IG1pbkFyZWEgPyBhcmVhIDogbWluQXJlYTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IGNoaWxkO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbmxhcmdlbWVudCA9PT0gbWluRW5sYXJnZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGNob29zZSBvbmUgd2l0aCB0aGUgc21hbGxlc3QgYXJlYVxuICAgICAgICAgICAgICAgICAgICBpZiAoYXJlYSA8IG1pbkFyZWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbkFyZWEgPSBhcmVhO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IGNoaWxkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBub2RlID0gdGFyZ2V0Tm9kZSB8fCBub2RlLmNoaWxkcmVuWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSxcblxuICAgIF9pbnNlcnQ6IGZ1bmN0aW9uIChpdGVtLCBsZXZlbCwgaXNOb2RlKSB7XG5cbiAgICAgICAgdmFyIHRvQkJveCA9IHRoaXMudG9CQm94LFxuICAgICAgICAgICAgYmJveCA9IGlzTm9kZSA/IGl0ZW0gOiB0b0JCb3goaXRlbSksXG4gICAgICAgICAgICBpbnNlcnRQYXRoID0gW107XG5cbiAgICAgICAgLy8gZmluZCB0aGUgYmVzdCBub2RlIGZvciBhY2NvbW1vZGF0aW5nIHRoZSBpdGVtLCBzYXZpbmcgYWxsIG5vZGVzIGFsb25nIHRoZSBwYXRoIHRvb1xuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuX2Nob29zZVN1YnRyZWUoYmJveCwgdGhpcy5kYXRhLCBsZXZlbCwgaW5zZXJ0UGF0aCk7XG5cbiAgICAgICAgLy8gcHV0IHRoZSBpdGVtIGludG8gdGhlIG5vZGVcbiAgICAgICAgbm9kZS5jaGlsZHJlbi5wdXNoKGl0ZW0pO1xuICAgICAgICBleHRlbmQobm9kZSwgYmJveCk7XG5cbiAgICAgICAgLy8gc3BsaXQgb24gbm9kZSBvdmVyZmxvdzsgcHJvcGFnYXRlIHVwd2FyZHMgaWYgbmVjZXNzYXJ5XG4gICAgICAgIHdoaWxlIChsZXZlbCA+PSAwKSB7XG4gICAgICAgICAgICBpZiAoaW5zZXJ0UGF0aFtsZXZlbF0uY2hpbGRyZW4ubGVuZ3RoID4gdGhpcy5fbWF4RW50cmllcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NwbGl0KGluc2VydFBhdGgsIGxldmVsKTtcbiAgICAgICAgICAgICAgICBsZXZlbC0tO1xuICAgICAgICAgICAgfSBlbHNlIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRqdXN0IGJib3hlcyBhbG9uZyB0aGUgaW5zZXJ0aW9uIHBhdGhcbiAgICAgICAgdGhpcy5fYWRqdXN0UGFyZW50QkJveGVzKGJib3gsIGluc2VydFBhdGgsIGxldmVsKTtcbiAgICB9LFxuXG4gICAgLy8gc3BsaXQgb3ZlcmZsb3dlZCBub2RlIGludG8gdHdvXG4gICAgX3NwbGl0OiBmdW5jdGlvbiAoaW5zZXJ0UGF0aCwgbGV2ZWwpIHtcblxuICAgICAgICB2YXIgbm9kZSA9IGluc2VydFBhdGhbbGV2ZWxdLFxuICAgICAgICAgICAgTSA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoLFxuICAgICAgICAgICAgbSA9IHRoaXMuX21pbkVudHJpZXM7XG5cbiAgICAgICAgdGhpcy5fY2hvb3NlU3BsaXRBeGlzKG5vZGUsIG0sIE0pO1xuXG4gICAgICAgIHZhciBzcGxpdEluZGV4ID0gdGhpcy5fY2hvb3NlU3BsaXRJbmRleChub2RlLCBtLCBNKTtcblxuICAgICAgICB2YXIgbmV3Tm9kZSA9IGNyZWF0ZU5vZGUobm9kZS5jaGlsZHJlbi5zcGxpY2Uoc3BsaXRJbmRleCwgbm9kZS5jaGlsZHJlbi5sZW5ndGggLSBzcGxpdEluZGV4KSk7XG4gICAgICAgIG5ld05vZGUuaGVpZ2h0ID0gbm9kZS5oZWlnaHQ7XG4gICAgICAgIG5ld05vZGUubGVhZiA9IG5vZGUubGVhZjtcblxuICAgICAgICBjYWxjQkJveChub2RlLCB0aGlzLnRvQkJveCk7XG4gICAgICAgIGNhbGNCQm94KG5ld05vZGUsIHRoaXMudG9CQm94KTtcblxuICAgICAgICBpZiAobGV2ZWwpIGluc2VydFBhdGhbbGV2ZWwgLSAxXS5jaGlsZHJlbi5wdXNoKG5ld05vZGUpO1xuICAgICAgICBlbHNlIHRoaXMuX3NwbGl0Um9vdChub2RlLCBuZXdOb2RlKTtcbiAgICB9LFxuXG4gICAgX3NwbGl0Um9vdDogZnVuY3Rpb24gKG5vZGUsIG5ld05vZGUpIHtcbiAgICAgICAgLy8gc3BsaXQgcm9vdCBub2RlXG4gICAgICAgIHRoaXMuZGF0YSA9IGNyZWF0ZU5vZGUoW25vZGUsIG5ld05vZGVdKTtcbiAgICAgICAgdGhpcy5kYXRhLmhlaWdodCA9IG5vZGUuaGVpZ2h0ICsgMTtcbiAgICAgICAgdGhpcy5kYXRhLmxlYWYgPSBmYWxzZTtcbiAgICAgICAgY2FsY0JCb3godGhpcy5kYXRhLCB0aGlzLnRvQkJveCk7XG4gICAgfSxcblxuICAgIF9jaG9vc2VTcGxpdEluZGV4OiBmdW5jdGlvbiAobm9kZSwgbSwgTSkge1xuXG4gICAgICAgIHZhciBpLCBiYm94MSwgYmJveDIsIG92ZXJsYXAsIGFyZWEsIG1pbk92ZXJsYXAsIG1pbkFyZWEsIGluZGV4O1xuXG4gICAgICAgIG1pbk92ZXJsYXAgPSBtaW5BcmVhID0gSW5maW5pdHk7XG5cbiAgICAgICAgZm9yIChpID0gbTsgaSA8PSBNIC0gbTsgaSsrKSB7XG4gICAgICAgICAgICBiYm94MSA9IGRpc3RCQm94KG5vZGUsIDAsIGksIHRoaXMudG9CQm94KTtcbiAgICAgICAgICAgIGJib3gyID0gZGlzdEJCb3gobm9kZSwgaSwgTSwgdGhpcy50b0JCb3gpO1xuXG4gICAgICAgICAgICBvdmVybGFwID0gaW50ZXJzZWN0aW9uQXJlYShiYm94MSwgYmJveDIpO1xuICAgICAgICAgICAgYXJlYSA9IGJib3hBcmVhKGJib3gxKSArIGJib3hBcmVhKGJib3gyKTtcblxuICAgICAgICAgICAgLy8gY2hvb3NlIGRpc3RyaWJ1dGlvbiB3aXRoIG1pbmltdW0gb3ZlcmxhcFxuICAgICAgICAgICAgaWYgKG92ZXJsYXAgPCBtaW5PdmVybGFwKSB7XG4gICAgICAgICAgICAgICAgbWluT3ZlcmxhcCA9IG92ZXJsYXA7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBpO1xuXG4gICAgICAgICAgICAgICAgbWluQXJlYSA9IGFyZWEgPCBtaW5BcmVhID8gYXJlYSA6IG1pbkFyZWE7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3ZlcmxhcCA9PT0gbWluT3ZlcmxhcCkge1xuICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBjaG9vc2UgZGlzdHJpYnV0aW9uIHdpdGggbWluaW11bSBhcmVhXG4gICAgICAgICAgICAgICAgaWYgKGFyZWEgPCBtaW5BcmVhKSB7XG4gICAgICAgICAgICAgICAgICAgIG1pbkFyZWEgPSBhcmVhO1xuICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH0sXG5cbiAgICAvLyBzb3J0cyBub2RlIGNoaWxkcmVuIGJ5IHRoZSBiZXN0IGF4aXMgZm9yIHNwbGl0XG4gICAgX2Nob29zZVNwbGl0QXhpczogZnVuY3Rpb24gKG5vZGUsIG0sIE0pIHtcblxuICAgICAgICB2YXIgY29tcGFyZU1pblggPSBub2RlLmxlYWYgPyB0aGlzLmNvbXBhcmVNaW5YIDogY29tcGFyZU5vZGVNaW5YLFxuICAgICAgICAgICAgY29tcGFyZU1pblkgPSBub2RlLmxlYWYgPyB0aGlzLmNvbXBhcmVNaW5ZIDogY29tcGFyZU5vZGVNaW5ZLFxuICAgICAgICAgICAgeE1hcmdpbiA9IHRoaXMuX2FsbERpc3RNYXJnaW4obm9kZSwgbSwgTSwgY29tcGFyZU1pblgpLFxuICAgICAgICAgICAgeU1hcmdpbiA9IHRoaXMuX2FsbERpc3RNYXJnaW4obm9kZSwgbSwgTSwgY29tcGFyZU1pblkpO1xuXG4gICAgICAgIC8vIGlmIHRvdGFsIGRpc3RyaWJ1dGlvbnMgbWFyZ2luIHZhbHVlIGlzIG1pbmltYWwgZm9yIHgsIHNvcnQgYnkgbWluWCxcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGl0J3MgYWxyZWFkeSBzb3J0ZWQgYnkgbWluWVxuICAgICAgICBpZiAoeE1hcmdpbiA8IHlNYXJnaW4pIG5vZGUuY2hpbGRyZW4uc29ydChjb21wYXJlTWluWCk7XG4gICAgfSxcblxuICAgIC8vIHRvdGFsIG1hcmdpbiBvZiBhbGwgcG9zc2libGUgc3BsaXQgZGlzdHJpYnV0aW9ucyB3aGVyZSBlYWNoIG5vZGUgaXMgYXQgbGVhc3QgbSBmdWxsXG4gICAgX2FsbERpc3RNYXJnaW46IGZ1bmN0aW9uIChub2RlLCBtLCBNLCBjb21wYXJlKSB7XG5cbiAgICAgICAgbm9kZS5jaGlsZHJlbi5zb3J0KGNvbXBhcmUpO1xuXG4gICAgICAgIHZhciB0b0JCb3ggPSB0aGlzLnRvQkJveCxcbiAgICAgICAgICAgIGxlZnRCQm94ID0gZGlzdEJCb3gobm9kZSwgMCwgbSwgdG9CQm94KSxcbiAgICAgICAgICAgIHJpZ2h0QkJveCA9IGRpc3RCQm94KG5vZGUsIE0gLSBtLCBNLCB0b0JCb3gpLFxuICAgICAgICAgICAgbWFyZ2luID0gYmJveE1hcmdpbihsZWZ0QkJveCkgKyBiYm94TWFyZ2luKHJpZ2h0QkJveCksXG4gICAgICAgICAgICBpLCBjaGlsZDtcblxuICAgICAgICBmb3IgKGkgPSBtOyBpIDwgTSAtIG07IGkrKykge1xuICAgICAgICAgICAgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgZXh0ZW5kKGxlZnRCQm94LCBub2RlLmxlYWYgPyB0b0JCb3goY2hpbGQpIDogY2hpbGQpO1xuICAgICAgICAgICAgbWFyZ2luICs9IGJib3hNYXJnaW4obGVmdEJCb3gpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gTSAtIG0gLSAxOyBpID49IG07IGktLSkge1xuICAgICAgICAgICAgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgZXh0ZW5kKHJpZ2h0QkJveCwgbm9kZS5sZWFmID8gdG9CQm94KGNoaWxkKSA6IGNoaWxkKTtcbiAgICAgICAgICAgIG1hcmdpbiArPSBiYm94TWFyZ2luKHJpZ2h0QkJveCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWFyZ2luO1xuICAgIH0sXG5cbiAgICBfYWRqdXN0UGFyZW50QkJveGVzOiBmdW5jdGlvbiAoYmJveCwgcGF0aCwgbGV2ZWwpIHtcbiAgICAgICAgLy8gYWRqdXN0IGJib3hlcyBhbG9uZyB0aGUgZ2l2ZW4gdHJlZSBwYXRoXG4gICAgICAgIGZvciAodmFyIGkgPSBsZXZlbDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGV4dGVuZChwYXRoW2ldLCBiYm94KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfY29uZGVuc2U6IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgICAgIC8vIGdvIHRocm91Z2ggdGhlIHBhdGgsIHJlbW92aW5nIGVtcHR5IG5vZGVzIGFuZCB1cGRhdGluZyBiYm94ZXNcbiAgICAgICAgZm9yICh2YXIgaSA9IHBhdGgubGVuZ3RoIC0gMSwgc2libGluZ3M7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAocGF0aFtpXS5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc2libGluZ3MgPSBwYXRoW2kgLSAxXS5jaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgc2libGluZ3Muc3BsaWNlKHNpYmxpbmdzLmluZGV4T2YocGF0aFtpXSksIDEpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHRoaXMuY2xlYXIoKTtcblxuICAgICAgICAgICAgfSBlbHNlIGNhbGNCQm94KHBhdGhbaV0sIHRoaXMudG9CQm94KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfaW5pdEZvcm1hdDogZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICAvLyBkYXRhIGZvcm1hdCAobWluWCwgbWluWSwgbWF4WCwgbWF4WSBhY2Nlc3NvcnMpXG5cbiAgICAgICAgLy8gdXNlcyBldmFsLXR5cGUgZnVuY3Rpb24gY29tcGlsYXRpb24gaW5zdGVhZCBvZiBqdXN0IGFjY2VwdGluZyBhIHRvQkJveCBmdW5jdGlvblxuICAgICAgICAvLyBiZWNhdXNlIHRoZSBhbGdvcml0aG1zIGFyZSB2ZXJ5IHNlbnNpdGl2ZSB0byBzb3J0aW5nIGZ1bmN0aW9ucyBwZXJmb3JtYW5jZSxcbiAgICAgICAgLy8gc28gdGhleSBzaG91bGQgYmUgZGVhZCBzaW1wbGUgYW5kIHdpdGhvdXQgaW5uZXIgY2FsbHNcblxuICAgICAgICB2YXIgY29tcGFyZUFyciA9IFsncmV0dXJuIGEnLCAnIC0gYicsICc7J107XG5cbiAgICAgICAgdGhpcy5jb21wYXJlTWluWCA9IG5ldyBGdW5jdGlvbignYScsICdiJywgY29tcGFyZUFyci5qb2luKGZvcm1hdFswXSkpO1xuICAgICAgICB0aGlzLmNvbXBhcmVNaW5ZID0gbmV3IEZ1bmN0aW9uKCdhJywgJ2InLCBjb21wYXJlQXJyLmpvaW4oZm9ybWF0WzFdKSk7XG5cbiAgICAgICAgdGhpcy50b0JCb3ggPSBuZXcgRnVuY3Rpb24oJ2EnLFxuICAgICAgICAgICAgJ3JldHVybiB7bWluWDogYScgKyBmb3JtYXRbMF0gK1xuICAgICAgICAgICAgJywgbWluWTogYScgKyBmb3JtYXRbMV0gK1xuICAgICAgICAgICAgJywgbWF4WDogYScgKyBmb3JtYXRbMl0gK1xuICAgICAgICAgICAgJywgbWF4WTogYScgKyBmb3JtYXRbM10gKyAnfTsnKTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBmaW5kSXRlbShpdGVtLCBpdGVtcywgZXF1YWxzRm4pIHtcbiAgICBpZiAoIWVxdWFsc0ZuKSByZXR1cm4gaXRlbXMuaW5kZXhPZihpdGVtKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGVxdWFsc0ZuKGl0ZW0sIGl0ZW1zW2ldKSkgcmV0dXJuIGk7XG4gICAgfVxuICAgIHJldHVybiAtMTtcbn1cblxuLy8gY2FsY3VsYXRlIG5vZGUncyBiYm94IGZyb20gYmJveGVzIG9mIGl0cyBjaGlsZHJlblxuZnVuY3Rpb24gY2FsY0JCb3gobm9kZSwgdG9CQm94KSB7XG4gICAgZGlzdEJCb3gobm9kZSwgMCwgbm9kZS5jaGlsZHJlbi5sZW5ndGgsIHRvQkJveCwgbm9kZSk7XG59XG5cbi8vIG1pbiBib3VuZGluZyByZWN0YW5nbGUgb2Ygbm9kZSBjaGlsZHJlbiBmcm9tIGsgdG8gcC0xXG5mdW5jdGlvbiBkaXN0QkJveChub2RlLCBrLCBwLCB0b0JCb3gsIGRlc3ROb2RlKSB7XG4gICAgaWYgKCFkZXN0Tm9kZSkgZGVzdE5vZGUgPSBjcmVhdGVOb2RlKG51bGwpO1xuICAgIGRlc3ROb2RlLm1pblggPSBJbmZpbml0eTtcbiAgICBkZXN0Tm9kZS5taW5ZID0gSW5maW5pdHk7XG4gICAgZGVzdE5vZGUubWF4WCA9IC1JbmZpbml0eTtcbiAgICBkZXN0Tm9kZS5tYXhZID0gLUluZmluaXR5O1xuXG4gICAgZm9yICh2YXIgaSA9IGssIGNoaWxkOyBpIDwgcDsgaSsrKSB7XG4gICAgICAgIGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXTtcbiAgICAgICAgZXh0ZW5kKGRlc3ROb2RlLCBub2RlLmxlYWYgPyB0b0JCb3goY2hpbGQpIDogY2hpbGQpO1xuICAgIH1cblxuICAgIHJldHVybiBkZXN0Tm9kZTtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kKGEsIGIpIHtcbiAgICBhLm1pblggPSBNYXRoLm1pbihhLm1pblgsIGIubWluWCk7XG4gICAgYS5taW5ZID0gTWF0aC5taW4oYS5taW5ZLCBiLm1pblkpO1xuICAgIGEubWF4WCA9IE1hdGgubWF4KGEubWF4WCwgYi5tYXhYKTtcbiAgICBhLm1heFkgPSBNYXRoLm1heChhLm1heFksIGIubWF4WSk7XG4gICAgcmV0dXJuIGE7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVOb2RlTWluWChhLCBiKSB7IHJldHVybiBhLm1pblggLSBiLm1pblg7IH1cbmZ1bmN0aW9uIGNvbXBhcmVOb2RlTWluWShhLCBiKSB7IHJldHVybiBhLm1pblkgLSBiLm1pblk7IH1cblxuZnVuY3Rpb24gYmJveEFyZWEoYSkgICB7IHJldHVybiAoYS5tYXhYIC0gYS5taW5YKSAqIChhLm1heFkgLSBhLm1pblkpOyB9XG5mdW5jdGlvbiBiYm94TWFyZ2luKGEpIHsgcmV0dXJuIChhLm1heFggLSBhLm1pblgpICsgKGEubWF4WSAtIGEubWluWSk7IH1cblxuZnVuY3Rpb24gZW5sYXJnZWRBcmVhKGEsIGIpIHtcbiAgICByZXR1cm4gKE1hdGgubWF4KGIubWF4WCwgYS5tYXhYKSAtIE1hdGgubWluKGIubWluWCwgYS5taW5YKSkgKlxuICAgICAgICAgICAoTWF0aC5tYXgoYi5tYXhZLCBhLm1heFkpIC0gTWF0aC5taW4oYi5taW5ZLCBhLm1pblkpKTtcbn1cblxuZnVuY3Rpb24gaW50ZXJzZWN0aW9uQXJlYShhLCBiKSB7XG4gICAgdmFyIG1pblggPSBNYXRoLm1heChhLm1pblgsIGIubWluWCksXG4gICAgICAgIG1pblkgPSBNYXRoLm1heChhLm1pblksIGIubWluWSksXG4gICAgICAgIG1heFggPSBNYXRoLm1pbihhLm1heFgsIGIubWF4WCksXG4gICAgICAgIG1heFkgPSBNYXRoLm1pbihhLm1heFksIGIubWF4WSk7XG5cbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgbWF4WCAtIG1pblgpICpcbiAgICAgICAgICAgTWF0aC5tYXgoMCwgbWF4WSAtIG1pblkpO1xufVxuXG5mdW5jdGlvbiBjb250YWlucyhhLCBiKSB7XG4gICAgcmV0dXJuIGEubWluWCA8PSBiLm1pblggJiZcbiAgICAgICAgICAgYS5taW5ZIDw9IGIubWluWSAmJlxuICAgICAgICAgICBiLm1heFggPD0gYS5tYXhYICYmXG4gICAgICAgICAgIGIubWF4WSA8PSBhLm1heFk7XG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdHMoYSwgYikge1xuICAgIHJldHVybiBiLm1pblggPD0gYS5tYXhYICYmXG4gICAgICAgICAgIGIubWluWSA8PSBhLm1heFkgJiZcbiAgICAgICAgICAgYi5tYXhYID49IGEubWluWCAmJlxuICAgICAgICAgICBiLm1heFkgPj0gYS5taW5ZO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVOb2RlKGNoaWxkcmVuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuLFxuICAgICAgICBoZWlnaHQ6IDEsXG4gICAgICAgIGxlYWY6IHRydWUsXG4gICAgICAgIG1pblg6IEluZmluaXR5LFxuICAgICAgICBtaW5ZOiBJbmZpbml0eSxcbiAgICAgICAgbWF4WDogLUluZmluaXR5LFxuICAgICAgICBtYXhZOiAtSW5maW5pdHlcbiAgICB9O1xufVxuXG4vLyBzb3J0IGFuIGFycmF5IHNvIHRoYXQgaXRlbXMgY29tZSBpbiBncm91cHMgb2YgbiB1bnNvcnRlZCBpdGVtcywgd2l0aCBncm91cHMgc29ydGVkIGJldHdlZW4gZWFjaCBvdGhlcjtcbi8vIGNvbWJpbmVzIHNlbGVjdGlvbiBhbGdvcml0aG0gd2l0aCBiaW5hcnkgZGl2aWRlICYgY29ucXVlciBhcHByb2FjaFxuXG5mdW5jdGlvbiBtdWx0aVNlbGVjdChhcnIsIGxlZnQsIHJpZ2h0LCBuLCBjb21wYXJlKSB7XG4gICAgdmFyIHN0YWNrID0gW2xlZnQsIHJpZ2h0XSxcbiAgICAgICAgbWlkO1xuXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICByaWdodCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICBsZWZ0ID0gc3RhY2sucG9wKCk7XG5cbiAgICAgICAgaWYgKHJpZ2h0IC0gbGVmdCA8PSBuKSBjb250aW51ZTtcblxuICAgICAgICBtaWQgPSBsZWZ0ICsgTWF0aC5jZWlsKChyaWdodCAtIGxlZnQpIC8gbiAvIDIpICogbjtcbiAgICAgICAgcXVpY2tzZWxlY3QoYXJyLCBtaWQsIGxlZnQsIHJpZ2h0LCBjb21wYXJlKTtcblxuICAgICAgICBzdGFjay5wdXNoKGxlZnQsIG1pZCwgbWlkLCByaWdodCk7XG4gICAgfVxufVxuIiwiKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcblx0dHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuXHR0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuXHQoZ2xvYmFsLnF1aWNrc2VsZWN0ID0gZmFjdG9yeSgpKTtcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBxdWlja3NlbGVjdChhcnIsIGssIGxlZnQsIHJpZ2h0LCBjb21wYXJlKSB7XG4gICAgcXVpY2tzZWxlY3RTdGVwKGFyciwgaywgbGVmdCB8fCAwLCByaWdodCB8fCAoYXJyLmxlbmd0aCAtIDEpLCBjb21wYXJlIHx8IGRlZmF1bHRDb21wYXJlKTtcbn1cblxuZnVuY3Rpb24gcXVpY2tzZWxlY3RTdGVwKGFyciwgaywgbGVmdCwgcmlnaHQsIGNvbXBhcmUpIHtcblxuICAgIHdoaWxlIChyaWdodCA+IGxlZnQpIHtcbiAgICAgICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgICAgICAgdmFyIG4gPSByaWdodCAtIGxlZnQgKyAxO1xuICAgICAgICAgICAgdmFyIG0gPSBrIC0gbGVmdCArIDE7XG4gICAgICAgICAgICB2YXIgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgICAgICAgdmFyIHMgPSAwLjUgKiBNYXRoLmV4cCgyICogeiAvIDMpO1xuICAgICAgICAgICAgdmFyIHNkID0gMC41ICogTWF0aC5zcXJ0KHogKiBzICogKG4gLSBzKSAvIG4pICogKG0gLSBuIC8gMiA8IDAgPyAtMSA6IDEpO1xuICAgICAgICAgICAgdmFyIG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpO1xuICAgICAgICAgICAgdmFyIG5ld1JpZ2h0ID0gTWF0aC5taW4ocmlnaHQsIE1hdGguZmxvb3IoayArIChuIC0gbSkgKiBzIC8gbiArIHNkKSk7XG4gICAgICAgICAgICBxdWlja3NlbGVjdFN0ZXAoYXJyLCBrLCBuZXdMZWZ0LCBuZXdSaWdodCwgY29tcGFyZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdCA9IGFycltrXTtcbiAgICAgICAgdmFyIGkgPSBsZWZ0O1xuICAgICAgICB2YXIgaiA9IHJpZ2h0O1xuXG4gICAgICAgIHN3YXAoYXJyLCBsZWZ0LCBrKTtcbiAgICAgICAgaWYgKGNvbXBhcmUoYXJyW3JpZ2h0XSwgdCkgPiAwKSBzd2FwKGFyciwgbGVmdCwgcmlnaHQpO1xuXG4gICAgICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgICAgICAgc3dhcChhcnIsIGksIGopO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyW2ldLCB0KSA8IDApIGkrKztcbiAgICAgICAgICAgIHdoaWxlIChjb21wYXJlKGFycltqXSwgdCkgPiAwKSBqLS07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tcGFyZShhcnJbbGVmdF0sIHQpID09PSAwKSBzd2FwKGFyciwgbGVmdCwgaik7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaisrO1xuICAgICAgICAgICAgc3dhcChhcnIsIGosIHJpZ2h0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChqIDw9IGspIGxlZnQgPSBqICsgMTtcbiAgICAgICAgaWYgKGsgPD0gaikgcmlnaHQgPSBqIC0gMTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHN3YXAoYXJyLCBpLCBqKSB7XG4gICAgdmFyIHRtcCA9IGFycltpXTtcbiAgICBhcnJbaV0gPSBhcnJbal07XG4gICAgYXJyW2pdID0gdG1wO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q29tcGFyZShhLCBiKSB7XG4gICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwO1xufVxuXG5yZXR1cm4gcXVpY2tzZWxlY3Q7XG5cbn0pKSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChwb2ludCwgdnMpIHtcbiAgICAvLyByYXktY2FzdGluZyBhbGdvcml0aG0gYmFzZWQgb25cbiAgICAvLyBodHRwOi8vd3d3LmVjc2UucnBpLmVkdS9Ib21lcGFnZXMvd3JmL1Jlc2VhcmNoL1Nob3J0X05vdGVzL3BucG9seS5odG1sXG4gICAgXG4gICAgdmFyIHggPSBwb2ludFswXSwgeSA9IHBvaW50WzFdO1xuICAgIFxuICAgIHZhciBpbnNpZGUgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMCwgaiA9IHZzLmxlbmd0aCAtIDE7IGkgPCB2cy5sZW5ndGg7IGogPSBpKyspIHtcbiAgICAgICAgdmFyIHhpID0gdnNbaV1bMF0sIHlpID0gdnNbaV1bMV07XG4gICAgICAgIHZhciB4aiA9IHZzW2pdWzBdLCB5aiA9IHZzW2pdWzFdO1xuICAgICAgICBcbiAgICAgICAgdmFyIGludGVyc2VjdCA9ICgoeWkgPiB5KSAhPSAoeWogPiB5KSlcbiAgICAgICAgICAgICYmICh4IDwgKHhqIC0geGkpICogKHkgLSB5aSkgLyAoeWogLSB5aSkgKyB4aSk7XG4gICAgICAgIGlmIChpbnRlcnNlY3QpIGluc2lkZSA9ICFpbnNpZGU7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBpbnNpZGU7XG59O1xuIiwiLyoqXG4gKiBNaXNjZWxsYW5lb3VzIHBvbHlnb24gdXRpbGl0aWVzLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAcGFyYW0gezJkIGFycmF5IG9mIG51bWJlcn0gcG9seSBBbiBhcnJheSBvZiAyRCBwb2ludCBhcnJheXMuXG4gKiBAcmV0dXJuIHthcnJheSBvZiBudW1iZX0gVGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgcG9seWdvbiwgaW5cbiAqICAgIGBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZYCBmb3JtYXQuXG4gKi9cbmZ1bmN0aW9uIGdldEJvdW5kaW5nQm94KCBwb2x5ICl7XG4gIHZhciBmaXJzdFB0ID0gcG9seVswXTtcbiAgdmFyIGJib3ggPSB7XG4gICAgbWluWDogZmlyc3RQdFswXSxcbiAgICBtaW5ZOiBmaXJzdFB0WzFdLFxuICAgIG1heFg6IGZpcnN0UHRbMF0sXG4gICAgbWF4WTogZmlyc3RQdFsxXVxuICB9O1xuXG4gIGZvciggdmFyIGluZCA9IDE7IGluZCA8IHBvbHkubGVuZ3RoOyBpbmQrKyApe1xuICAgIHZhciBwdCA9IHBvbHlbaW5kXTtcblxuICAgIHZhciB4ID0gcHRbMF07XG4gICAgaWYoIHggPCBiYm94Lm1pblggKXtcbiAgICAgIGJib3gubWluWCA9IHg7XG4gICAgfSBlbHNlIGlmKCB4ID4gYmJveC5tYXhYICl7XG4gICAgICBiYm94Lm1heFggPSB4O1xuICAgIH1cblxuICAgIHZhciB5ID0gcHRbMV07XG4gICAgaWYoIHkgPCBiYm94Lm1pblkgKXtcbiAgICAgIGJib3gubWluWSA9IHk7XG4gICAgfSBlbHNlIGlmKCB5ID4gYmJveC5tYXhZICl7XG4gICAgICBiYm94Lm1heFkgPSB5O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYm94O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Qm91bmRpbmdCb3g6IGdldEJvdW5kaW5nQm94XG59O1xuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogTG9kYXNoIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQ29weXJpZ2h0IE9wZW5KUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vb3BlbmpzZi5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG47KGZ1bmN0aW9uKCkge1xuXG4gIC8qKiBVc2VkIGFzIGEgc2FmZSByZWZlcmVuY2UgZm9yIGB1bmRlZmluZWRgIGluIHByZS1FUzUgZW52aXJvbm1lbnRzLiAqL1xuICB2YXIgdW5kZWZpbmVkO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBzZW1hbnRpYyB2ZXJzaW9uIG51bWJlci4gKi9cbiAgdmFyIFZFUlNJT04gPSAnNC4xNy4xOSc7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIHNpemUgdG8gZW5hYmxlIGxhcmdlIGFycmF5IG9wdGltaXphdGlvbnMuICovXG4gIHZhciBMQVJHRV9BUlJBWV9TSVpFID0gMjAwO1xuXG4gIC8qKiBFcnJvciBtZXNzYWdlIGNvbnN0YW50cy4gKi9cbiAgdmFyIENPUkVfRVJST1JfVEVYVCA9ICdVbnN1cHBvcnRlZCBjb3JlLWpzIHVzZS4gVHJ5IGh0dHBzOi8vbnBtcy5pby9zZWFyY2g/cT1wb255ZmlsbC4nLFxuICAgICAgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4gIC8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbiAgdmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBtYXhpbXVtIG1lbW9pemUgY2FjaGUgc2l6ZS4gKi9cbiAgdmFyIE1BWF9NRU1PSVpFX1NJWkUgPSA1MDA7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIGludGVybmFsIGFyZ3VtZW50IHBsYWNlaG9sZGVyLiAqL1xuICB2YXIgUExBQ0VIT0xERVIgPSAnX19sb2Rhc2hfcGxhY2Vob2xkZXJfXyc7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY2xvbmluZy4gKi9cbiAgdmFyIENMT05FX0RFRVBfRkxBRyA9IDEsXG4gICAgICBDTE9ORV9GTEFUX0ZMQUcgPSAyLFxuICAgICAgQ0xPTkVfU1lNQk9MU19GTEFHID0gNDtcblxuICAvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbiAgdmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xuICB2YXIgV1JBUF9CSU5EX0ZMQUcgPSAxLFxuICAgICAgV1JBUF9CSU5EX0tFWV9GTEFHID0gMixcbiAgICAgIFdSQVBfQ1VSUllfQk9VTkRfRkxBRyA9IDQsXG4gICAgICBXUkFQX0NVUlJZX0ZMQUcgPSA4LFxuICAgICAgV1JBUF9DVVJSWV9SSUdIVF9GTEFHID0gMTYsXG4gICAgICBXUkFQX1BBUlRJQUxfRkxBRyA9IDMyLFxuICAgICAgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcgPSA2NCxcbiAgICAgIFdSQVBfQVJZX0ZMQUcgPSAxMjgsXG4gICAgICBXUkFQX1JFQVJHX0ZMQUcgPSAyNTYsXG4gICAgICBXUkFQX0ZMSVBfRkxBRyA9IDUxMjtcblxuICAvKiogVXNlZCBhcyBkZWZhdWx0IG9wdGlvbnMgZm9yIGBfLnRydW5jYXRlYC4gKi9cbiAgdmFyIERFRkFVTFRfVFJVTkNfTEVOR1RIID0gMzAsXG4gICAgICBERUZBVUxUX1RSVU5DX09NSVNTSU9OID0gJy4uLic7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGhvdCBmdW5jdGlvbnMgYnkgbnVtYmVyIG9mIGNhbGxzIHdpdGhpbiBhIHNwYW4gb2YgbWlsbGlzZWNvbmRzLiAqL1xuICB2YXIgSE9UX0NPVU5UID0gODAwLFxuICAgICAgSE9UX1NQQU4gPSAxNjtcblxuICAvKiogVXNlZCB0byBpbmRpY2F0ZSB0aGUgdHlwZSBvZiBsYXp5IGl0ZXJhdGVlcy4gKi9cbiAgdmFyIExBWllfRklMVEVSX0ZMQUcgPSAxLFxuICAgICAgTEFaWV9NQVBfRkxBRyA9IDIsXG4gICAgICBMQVpZX1dISUxFX0ZMQUcgPSAzO1xuXG4gIC8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xuICB2YXIgSU5GSU5JVFkgPSAxIC8gMCxcbiAgICAgIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxLFxuICAgICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCxcbiAgICAgIE5BTiA9IDAgLyAwO1xuXG4gIC8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHRoZSBtYXhpbXVtIGxlbmd0aCBhbmQgaW5kZXggb2YgYW4gYXJyYXkuICovXG4gIHZhciBNQVhfQVJSQVlfTEVOR1RIID0gNDI5NDk2NzI5NSxcbiAgICAgIE1BWF9BUlJBWV9JTkRFWCA9IE1BWF9BUlJBWV9MRU5HVEggLSAxLFxuICAgICAgSEFMRl9NQVhfQVJSQVlfTEVOR1RIID0gTUFYX0FSUkFZX0xFTkdUSCA+Pj4gMTtcblxuICAvKiogVXNlZCB0byBhc3NvY2lhdGUgd3JhcCBtZXRob2RzIHdpdGggdGhlaXIgYml0IGZsYWdzLiAqL1xuICB2YXIgd3JhcEZsYWdzID0gW1xuICAgIFsnYXJ5JywgV1JBUF9BUllfRkxBR10sXG4gICAgWydiaW5kJywgV1JBUF9CSU5EX0ZMQUddLFxuICAgIFsnYmluZEtleScsIFdSQVBfQklORF9LRVlfRkxBR10sXG4gICAgWydjdXJyeScsIFdSQVBfQ1VSUllfRkxBR10sXG4gICAgWydjdXJyeVJpZ2h0JywgV1JBUF9DVVJSWV9SSUdIVF9GTEFHXSxcbiAgICBbJ2ZsaXAnLCBXUkFQX0ZMSVBfRkxBR10sXG4gICAgWydwYXJ0aWFsJywgV1JBUF9QQVJUSUFMX0ZMQUddLFxuICAgIFsncGFydGlhbFJpZ2h0JywgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUddLFxuICAgIFsncmVhcmcnLCBXUkFQX1JFQVJHX0ZMQUddXG4gIF07XG5cbiAgLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xuICB2YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgICAgYXN5bmNUYWcgPSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScsXG4gICAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICAgIGRvbUV4Y1RhZyA9ICdbb2JqZWN0IERPTUV4Y2VwdGlvbl0nLFxuICAgICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICAgIG51bGxUYWcgPSAnW29iamVjdCBOdWxsXScsXG4gICAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICAgIHByb21pc2VUYWcgPSAnW29iamVjdCBQcm9taXNlXScsXG4gICAgICBwcm94eVRhZyA9ICdbb2JqZWN0IFByb3h5XScsXG4gICAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJyxcbiAgICAgIHVuZGVmaW5lZFRhZyA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nLFxuICAgICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJyxcbiAgICAgIHdlYWtTZXRUYWcgPSAnW29iamVjdCBXZWFrU2V0XSc7XG5cbiAgdmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuICAvKiogVXNlZCB0byBtYXRjaCBlbXB0eSBzdHJpbmcgbGl0ZXJhbHMgaW4gY29tcGlsZWQgdGVtcGxhdGUgc291cmNlLiAqL1xuICB2YXIgcmVFbXB0eVN0cmluZ0xlYWRpbmcgPSAvXFxiX19wIFxcKz0gJyc7L2csXG4gICAgICByZUVtcHR5U3RyaW5nTWlkZGxlID0gL1xcYihfX3AgXFwrPSkgJycgXFwrL2csXG4gICAgICByZUVtcHR5U3RyaW5nVHJhaWxpbmcgPSAvKF9fZVxcKC4qP1xcKXxcXGJfX3RcXCkpIFxcK1xcbicnOy9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIEhUTUwgZW50aXRpZXMgYW5kIEhUTUwgY2hhcmFjdGVycy4gKi9cbiAgdmFyIHJlRXNjYXBlZEh0bWwgPSAvJig/OmFtcHxsdHxndHxxdW90fCMzOSk7L2csXG4gICAgICByZVVuZXNjYXBlZEh0bWwgPSAvWyY8PlwiJ10vZyxcbiAgICAgIHJlSGFzRXNjYXBlZEh0bWwgPSBSZWdFeHAocmVFc2NhcGVkSHRtbC5zb3VyY2UpLFxuICAgICAgcmVIYXNVbmVzY2FwZWRIdG1sID0gUmVnRXhwKHJlVW5lc2NhcGVkSHRtbC5zb3VyY2UpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHRlbXBsYXRlIGRlbGltaXRlcnMuICovXG4gIHZhciByZUVzY2FwZSA9IC88JS0oW1xcc1xcU10rPyklPi9nLFxuICAgICAgcmVFdmFsdWF0ZSA9IC88JShbXFxzXFxTXSs/KSU+L2csXG4gICAgICByZUludGVycG9sYXRlID0gLzwlPShbXFxzXFxTXSs/KSU+L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xuICB2YXIgcmVJc0RlZXBQcm9wID0gL1xcLnxcXFsoPzpbXltcXF1dKnwoW1wiJ10pKD86KD8hXFwxKVteXFxcXF18XFxcXC4pKj9cXDEpXFxdLyxcbiAgICAgIHJlSXNQbGFpblByb3AgPSAvXlxcdyokLyxcbiAgICAgIHJlUHJvcE5hbWUgPSAvW14uW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JCkpL2c7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGBcbiAgICogW3N5bnRheCBjaGFyYWN0ZXJzXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wYXR0ZXJucykuXG4gICAqL1xuICB2YXIgcmVSZWdFeHBDaGFyID0gL1tcXFxcXiQuKis/KClbXFxde318XS9nLFxuICAgICAgcmVIYXNSZWdFeHBDaGFyID0gUmVnRXhwKHJlUmVnRXhwQ2hhci5zb3VyY2UpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovXG4gIHZhciByZVRyaW0gPSAvXlxccyt8XFxzKyQvZyxcbiAgICAgIHJlVHJpbVN0YXJ0ID0gL15cXHMrLyxcbiAgICAgIHJlVHJpbUVuZCA9IC9cXHMrJC87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggd3JhcCBkZXRhaWwgY29tbWVudHMuICovXG4gIHZhciByZVdyYXBDb21tZW50ID0gL1xceyg/OlxcblxcL1xcKiBcXFt3cmFwcGVkIHdpdGggLitcXF0gXFwqXFwvKT9cXG4/LyxcbiAgICAgIHJlV3JhcERldGFpbHMgPSAvXFx7XFxuXFwvXFwqIFxcW3dyYXBwZWQgd2l0aCAoLispXFxdIFxcKi8sXG4gICAgICByZVNwbGl0RGV0YWlscyA9IC8sPyAmIC87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggd29yZHMgY29tcG9zZWQgb2YgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuICovXG4gIHZhciByZUFzY2lpV29yZCA9IC9bXlxceDAwLVxceDJmXFx4M2EtXFx4NDBcXHg1Yi1cXHg2MFxceDdiLVxceDdmXSsvZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBiYWNrc2xhc2hlcyBpbiBwcm9wZXJ0eSBwYXRocy4gKi9cbiAgdmFyIHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIG1hdGNoXG4gICAqIFtFUyB0ZW1wbGF0ZSBkZWxpbWl0ZXJzXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10ZW1wbGF0ZS1saXRlcmFsLWxleGljYWwtY29tcG9uZW50cykuXG4gICAqL1xuICB2YXIgcmVFc1RlbXBsYXRlID0gL1xcJFxceyhbXlxcXFx9XSooPzpcXFxcLlteXFxcXH1dKikqKVxcfS9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgIGZsYWdzIGZyb20gdGhlaXIgY29lcmNlZCBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVGbGFncyA9IC9cXHcqJC87XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuICAvKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG4gIHZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBob3N0IGNvbnN0cnVjdG9ycyAoU2FmYXJpKS4gKi9cbiAgdmFyIHJlSXNIb3N0Q3RvciA9IC9eXFxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXFxdJC87XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG4gIHZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4gKi9cbiAgdmFyIHJlSXNVaW50ID0gL14oPzowfFsxLTldXFxkKikkLztcblxuICAvKiogVXNlZCB0byBtYXRjaCBMYXRpbiBVbmljb2RlIGxldHRlcnMgKGV4Y2x1ZGluZyBtYXRoZW1hdGljYWwgb3BlcmF0b3JzKS4gKi9cbiAgdmFyIHJlTGF0aW4gPSAvW1xceGMwLVxceGQ2XFx4ZDgtXFx4ZjZcXHhmOC1cXHhmZlxcdTAxMDAtXFx1MDE3Zl0vZztcblxuICAvKiogVXNlZCB0byBlbnN1cmUgY2FwdHVyaW5nIG9yZGVyIG9mIHRlbXBsYXRlIGRlbGltaXRlcnMuICovXG4gIHZhciByZU5vTWF0Y2ggPSAvKCReKS87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggdW5lc2NhcGVkIGNoYXJhY3RlcnMgaW4gY29tcGlsZWQgc3RyaW5nIGxpdGVyYWxzLiAqL1xuICB2YXIgcmVVbmVzY2FwZWRTdHJpbmcgPSAvWydcXG5cXHJcXHUyMDI4XFx1MjAyOVxcXFxdL2c7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNoYXJhY3RlciBjbGFzc2VzLiAqL1xuICB2YXIgcnNBc3RyYWxSYW5nZSA9ICdcXFxcdWQ4MDAtXFxcXHVkZmZmJyxcbiAgICAgIHJzQ29tYm9NYXJrc1JhbmdlID0gJ1xcXFx1MDMwMC1cXFxcdTAzNmYnLFxuICAgICAgcmVDb21ib0hhbGZNYXJrc1JhbmdlID0gJ1xcXFx1ZmUyMC1cXFxcdWZlMmYnLFxuICAgICAgcnNDb21ib1N5bWJvbHNSYW5nZSA9ICdcXFxcdTIwZDAtXFxcXHUyMGZmJyxcbiAgICAgIHJzQ29tYm9SYW5nZSA9IHJzQ29tYm9NYXJrc1JhbmdlICsgcmVDb21ib0hhbGZNYXJrc1JhbmdlICsgcnNDb21ib1N5bWJvbHNSYW5nZSxcbiAgICAgIHJzRGluZ2JhdFJhbmdlID0gJ1xcXFx1MjcwMC1cXFxcdTI3YmYnLFxuICAgICAgcnNMb3dlclJhbmdlID0gJ2EtelxcXFx4ZGYtXFxcXHhmNlxcXFx4ZjgtXFxcXHhmZicsXG4gICAgICByc01hdGhPcFJhbmdlID0gJ1xcXFx4YWNcXFxceGIxXFxcXHhkN1xcXFx4ZjcnLFxuICAgICAgcnNOb25DaGFyUmFuZ2UgPSAnXFxcXHgwMC1cXFxceDJmXFxcXHgzYS1cXFxceDQwXFxcXHg1Yi1cXFxceDYwXFxcXHg3Yi1cXFxceGJmJyxcbiAgICAgIHJzUHVuY3R1YXRpb25SYW5nZSA9ICdcXFxcdTIwMDAtXFxcXHUyMDZmJyxcbiAgICAgIHJzU3BhY2VSYW5nZSA9ICcgXFxcXHRcXFxceDBiXFxcXGZcXFxceGEwXFxcXHVmZWZmXFxcXG5cXFxcclxcXFx1MjAyOFxcXFx1MjAyOVxcXFx1MTY4MFxcXFx1MTgwZVxcXFx1MjAwMFxcXFx1MjAwMVxcXFx1MjAwMlxcXFx1MjAwM1xcXFx1MjAwNFxcXFx1MjAwNVxcXFx1MjAwNlxcXFx1MjAwN1xcXFx1MjAwOFxcXFx1MjAwOVxcXFx1MjAwYVxcXFx1MjAyZlxcXFx1MjA1ZlxcXFx1MzAwMCcsXG4gICAgICByc1VwcGVyUmFuZ2UgPSAnQS1aXFxcXHhjMC1cXFxceGQ2XFxcXHhkOC1cXFxceGRlJyxcbiAgICAgIHJzVmFyUmFuZ2UgPSAnXFxcXHVmZTBlXFxcXHVmZTBmJyxcbiAgICAgIHJzQnJlYWtSYW5nZSA9IHJzTWF0aE9wUmFuZ2UgKyByc05vbkNoYXJSYW5nZSArIHJzUHVuY3R1YXRpb25SYW5nZSArIHJzU3BhY2VSYW5nZTtcblxuICAvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2FwdHVyZSBncm91cHMuICovXG4gIHZhciByc0Fwb3MgPSBcIlsnXFx1MjAxOV1cIixcbiAgICAgIHJzQXN0cmFsID0gJ1snICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICAgIHJzQnJlYWsgPSAnWycgKyByc0JyZWFrUmFuZ2UgKyAnXScsXG4gICAgICByc0NvbWJvID0gJ1snICsgcnNDb21ib1JhbmdlICsgJ10nLFxuICAgICAgcnNEaWdpdHMgPSAnXFxcXGQrJyxcbiAgICAgIHJzRGluZ2JhdCA9ICdbJyArIHJzRGluZ2JhdFJhbmdlICsgJ10nLFxuICAgICAgcnNMb3dlciA9ICdbJyArIHJzTG93ZXJSYW5nZSArICddJyxcbiAgICAgIHJzTWlzYyA9ICdbXicgKyByc0FzdHJhbFJhbmdlICsgcnNCcmVha1JhbmdlICsgcnNEaWdpdHMgKyByc0RpbmdiYXRSYW5nZSArIHJzTG93ZXJSYW5nZSArIHJzVXBwZXJSYW5nZSArICddJyxcbiAgICAgIHJzRml0eiA9ICdcXFxcdWQ4M2NbXFxcXHVkZmZiLVxcXFx1ZGZmZl0nLFxuICAgICAgcnNNb2RpZmllciA9ICcoPzonICsgcnNDb21ibyArICd8JyArIHJzRml0eiArICcpJyxcbiAgICAgIHJzTm9uQXN0cmFsID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgICByc1JlZ2lvbmFsID0gJyg/OlxcXFx1ZDgzY1tcXFxcdWRkZTYtXFxcXHVkZGZmXSl7Mn0nLFxuICAgICAgcnNTdXJyUGFpciA9ICdbXFxcXHVkODAwLVxcXFx1ZGJmZl1bXFxcXHVkYzAwLVxcXFx1ZGZmZl0nLFxuICAgICAgcnNVcHBlciA9ICdbJyArIHJzVXBwZXJSYW5nZSArICddJyxcbiAgICAgIHJzWldKID0gJ1xcXFx1MjAwZCc7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIHJlZ2V4ZXMuICovXG4gIHZhciByc01pc2NMb3dlciA9ICcoPzonICsgcnNMb3dlciArICd8JyArIHJzTWlzYyArICcpJyxcbiAgICAgIHJzTWlzY1VwcGVyID0gJyg/OicgKyByc1VwcGVyICsgJ3wnICsgcnNNaXNjICsgJyknLFxuICAgICAgcnNPcHRDb250ckxvd2VyID0gJyg/OicgKyByc0Fwb3MgKyAnKD86ZHxsbHxtfHJlfHN8dHx2ZSkpPycsXG4gICAgICByc09wdENvbnRyVXBwZXIgPSAnKD86JyArIHJzQXBvcyArICcoPzpEfExMfE18UkV8U3xUfFZFKSk/JyxcbiAgICAgIHJlT3B0TW9kID0gcnNNb2RpZmllciArICc/JyxcbiAgICAgIHJzT3B0VmFyID0gJ1snICsgcnNWYXJSYW5nZSArICddPycsXG4gICAgICByc09wdEpvaW4gPSAnKD86JyArIHJzWldKICsgJyg/OicgKyBbcnNOb25Bc3RyYWwsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzT3B0VmFyICsgcmVPcHRNb2QgKyAnKSonLFxuICAgICAgcnNPcmRMb3dlciA9ICdcXFxcZCooPzoxc3R8Mm5kfDNyZHwoPyFbMTIzXSlcXFxcZHRoKSg/PVxcXFxifFtBLVpfXSknLFxuICAgICAgcnNPcmRVcHBlciA9ICdcXFxcZCooPzoxU1R8Mk5EfDNSRHwoPyFbMTIzXSlcXFxcZFRIKSg/PVxcXFxifFthLXpfXSknLFxuICAgICAgcnNTZXEgPSByc09wdFZhciArIHJlT3B0TW9kICsgcnNPcHRKb2luLFxuICAgICAgcnNFbW9qaSA9ICcoPzonICsgW3JzRGluZ2JhdCwgcnNSZWdpb25hbCwgcnNTdXJyUGFpcl0uam9pbignfCcpICsgJyknICsgcnNTZXEsXG4gICAgICByc1N5bWJvbCA9ICcoPzonICsgW3JzTm9uQXN0cmFsICsgcnNDb21ibyArICc/JywgcnNDb21ibywgcnNSZWdpb25hbCwgcnNTdXJyUGFpciwgcnNBc3RyYWxdLmpvaW4oJ3wnKSArICcpJztcblxuICAvKiogVXNlZCB0byBtYXRjaCBhcG9zdHJvcGhlcy4gKi9cbiAgdmFyIHJlQXBvcyA9IFJlZ0V4cChyc0Fwb3MsICdnJyk7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbWF0Y2ggW2NvbWJpbmluZyBkaWFjcml0aWNhbCBtYXJrc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29tYmluaW5nX0RpYWNyaXRpY2FsX01hcmtzKSBhbmRcbiAgICogW2NvbWJpbmluZyBkaWFjcml0aWNhbCBtYXJrcyBmb3Igc3ltYm9sc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29tYmluaW5nX0RpYWNyaXRpY2FsX01hcmtzX2Zvcl9TeW1ib2xzKS5cbiAgICovXG4gIHZhciByZUNvbWJvTWFyayA9IFJlZ0V4cChyc0NvbWJvLCAnZycpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIFtzdHJpbmcgc3ltYm9sc10oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtdW5pY29kZSkuICovXG4gIHZhciByZVVuaWNvZGUgPSBSZWdFeHAocnNGaXR6ICsgJyg/PScgKyByc0ZpdHogKyAnKXwnICsgcnNTeW1ib2wgKyByc1NlcSwgJ2cnKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCBjb21wbGV4IG9yIGNvbXBvdW5kIHdvcmRzLiAqL1xuICB2YXIgcmVVbmljb2RlV29yZCA9IFJlZ0V4cChbXG4gICAgcnNVcHBlciArICc/JyArIHJzTG93ZXIgKyAnKycgKyByc09wdENvbnRyTG93ZXIgKyAnKD89JyArIFtyc0JyZWFrLCByc1VwcGVyLCAnJCddLmpvaW4oJ3wnKSArICcpJyxcbiAgICByc01pc2NVcHBlciArICcrJyArIHJzT3B0Q29udHJVcHBlciArICcoPz0nICsgW3JzQnJlYWssIHJzVXBwZXIgKyByc01pc2NMb3dlciwgJyQnXS5qb2luKCd8JykgKyAnKScsXG4gICAgcnNVcHBlciArICc/JyArIHJzTWlzY0xvd2VyICsgJysnICsgcnNPcHRDb250ckxvd2VyLFxuICAgIHJzVXBwZXIgKyAnKycgKyByc09wdENvbnRyVXBwZXIsXG4gICAgcnNPcmRVcHBlcixcbiAgICByc09yZExvd2VyLFxuICAgIHJzRGlnaXRzLFxuICAgIHJzRW1vamlcbiAgXS5qb2luKCd8JyksICdnJyk7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3Mgd2l0aCBbemVyby13aWR0aCBqb2luZXJzIG9yIGNvZGUgcG9pbnRzIGZyb20gdGhlIGFzdHJhbCBwbGFuZXNdKGh0dHA6Ly9lZXYuZWUvYmxvZy8yMDE1LzA5LzEyL2RhcmstY29ybmVycy1vZi11bmljb2RlLykuICovXG4gIHZhciByZUhhc1VuaWNvZGUgPSBSZWdFeHAoJ1snICsgcnNaV0ogKyByc0FzdHJhbFJhbmdlICArIHJzQ29tYm9SYW5nZSArIHJzVmFyUmFuZ2UgKyAnXScpO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBzdHJpbmdzIHRoYXQgbmVlZCBhIG1vcmUgcm9idXN0IHJlZ2V4cCB0byBtYXRjaCB3b3Jkcy4gKi9cbiAgdmFyIHJlSGFzVW5pY29kZVdvcmQgPSAvW2Etel1bQS1aXXxbQS1aXXsyfVthLXpdfFswLTldW2EtekEtWl18W2EtekEtWl1bMC05XXxbXmEtekEtWjAtOSBdLztcblxuICAvKiogVXNlZCB0byBhc3NpZ24gZGVmYXVsdCBgY29udGV4dGAgb2JqZWN0IHByb3BlcnRpZXMuICovXG4gIHZhciBjb250ZXh0UHJvcHMgPSBbXG4gICAgJ0FycmF5JywgJ0J1ZmZlcicsICdEYXRhVmlldycsICdEYXRlJywgJ0Vycm9yJywgJ0Zsb2F0MzJBcnJheScsICdGbG9hdDY0QXJyYXknLFxuICAgICdGdW5jdGlvbicsICdJbnQ4QXJyYXknLCAnSW50MTZBcnJheScsICdJbnQzMkFycmF5JywgJ01hcCcsICdNYXRoJywgJ09iamVjdCcsXG4gICAgJ1Byb21pc2UnLCAnUmVnRXhwJywgJ1NldCcsICdTdHJpbmcnLCAnU3ltYm9sJywgJ1R5cGVFcnJvcicsICdVaW50OEFycmF5JyxcbiAgICAnVWludDhDbGFtcGVkQXJyYXknLCAnVWludDE2QXJyYXknLCAnVWludDMyQXJyYXknLCAnV2Vha01hcCcsXG4gICAgJ18nLCAnY2xlYXJUaW1lb3V0JywgJ2lzRmluaXRlJywgJ3BhcnNlSW50JywgJ3NldFRpbWVvdXQnXG4gIF07XG5cbiAgLyoqIFVzZWQgdG8gbWFrZSB0ZW1wbGF0ZSBzb3VyY2VVUkxzIGVhc2llciB0byBpZGVudGlmeS4gKi9cbiAgdmFyIHRlbXBsYXRlQ291bnRlciA9IC0xO1xuXG4gIC8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIG9mIHR5cGVkIGFycmF5cy4gKi9cbiAgdmFyIHR5cGVkQXJyYXlUYWdzID0ge307XG4gIHR5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tpbnQ4VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQ4VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50MTZUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXSA9IHRydWU7XG4gIHR5cGVkQXJyYXlUYWdzW2FyZ3NUYWddID0gdHlwZWRBcnJheVRhZ3NbYXJyYXlUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gdHlwZWRBcnJheVRhZ3NbYm9vbFRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tkYXRhVmlld1RhZ10gPSB0eXBlZEFycmF5VGFnc1tkYXRlVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Z1bmNUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbbWFwVGFnXSA9IHR5cGVkQXJyYXlUYWdzW251bWJlclRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tvYmplY3RUYWddID0gdHlwZWRBcnJheVRhZ3NbcmVnZXhwVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW3NldFRhZ10gPSB0eXBlZEFycmF5VGFnc1tzdHJpbmdUYWddID1cbiAgdHlwZWRBcnJheVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuICAvKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBzdXBwb3J0ZWQgYnkgYF8uY2xvbmVgLiAqL1xuICB2YXIgY2xvbmVhYmxlVGFncyA9IHt9O1xuICBjbG9uZWFibGVUYWdzW2FyZ3NUYWddID0gY2xvbmVhYmxlVGFnc1thcnJheVRhZ10gPVxuICBjbG9uZWFibGVUYWdzW2FycmF5QnVmZmVyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0YVZpZXdUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tib29sVGFnXSA9IGNsb25lYWJsZVRhZ3NbZGF0ZVRhZ10gPVxuICBjbG9uZWFibGVUYWdzW2Zsb2F0MzJUYWddID0gY2xvbmVhYmxlVGFnc1tmbG9hdDY0VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbaW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW2ludDE2VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbaW50MzJUYWddID0gY2xvbmVhYmxlVGFnc1ttYXBUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tudW1iZXJUYWddID0gY2xvbmVhYmxlVGFnc1tvYmplY3RUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tyZWdleHBUYWddID0gY2xvbmVhYmxlVGFnc1tzZXRUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tzdHJpbmdUYWddID0gY2xvbmVhYmxlVGFnc1tzeW1ib2xUYWddID1cbiAgY2xvbmVhYmxlVGFnc1t1aW50OFRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW3VpbnQxNlRhZ10gPSBjbG9uZWFibGVUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xuICBjbG9uZWFibGVUYWdzW2Vycm9yVGFnXSA9IGNsb25lYWJsZVRhZ3NbZnVuY1RhZ10gPVxuICBjbG9uZWFibGVUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbiAgLyoqIFVzZWQgdG8gbWFwIExhdGluIFVuaWNvZGUgbGV0dGVycyB0byBiYXNpYyBMYXRpbiBsZXR0ZXJzLiAqL1xuICB2YXIgZGVidXJyZWRMZXR0ZXJzID0ge1xuICAgIC8vIExhdGluLTEgU3VwcGxlbWVudCBibG9jay5cbiAgICAnXFx4YzAnOiAnQScsICAnXFx4YzEnOiAnQScsICdcXHhjMic6ICdBJywgJ1xceGMzJzogJ0EnLCAnXFx4YzQnOiAnQScsICdcXHhjNSc6ICdBJyxcbiAgICAnXFx4ZTAnOiAnYScsICAnXFx4ZTEnOiAnYScsICdcXHhlMic6ICdhJywgJ1xceGUzJzogJ2EnLCAnXFx4ZTQnOiAnYScsICdcXHhlNSc6ICdhJyxcbiAgICAnXFx4YzcnOiAnQycsICAnXFx4ZTcnOiAnYycsXG4gICAgJ1xceGQwJzogJ0QnLCAgJ1xceGYwJzogJ2QnLFxuICAgICdcXHhjOCc6ICdFJywgICdcXHhjOSc6ICdFJywgJ1xceGNhJzogJ0UnLCAnXFx4Y2InOiAnRScsXG4gICAgJ1xceGU4JzogJ2UnLCAgJ1xceGU5JzogJ2UnLCAnXFx4ZWEnOiAnZScsICdcXHhlYic6ICdlJyxcbiAgICAnXFx4Y2MnOiAnSScsICAnXFx4Y2QnOiAnSScsICdcXHhjZSc6ICdJJywgJ1xceGNmJzogJ0knLFxuICAgICdcXHhlYyc6ICdpJywgICdcXHhlZCc6ICdpJywgJ1xceGVlJzogJ2knLCAnXFx4ZWYnOiAnaScsXG4gICAgJ1xceGQxJzogJ04nLCAgJ1xceGYxJzogJ24nLFxuICAgICdcXHhkMic6ICdPJywgICdcXHhkMyc6ICdPJywgJ1xceGQ0JzogJ08nLCAnXFx4ZDUnOiAnTycsICdcXHhkNic6ICdPJywgJ1xceGQ4JzogJ08nLFxuICAgICdcXHhmMic6ICdvJywgICdcXHhmMyc6ICdvJywgJ1xceGY0JzogJ28nLCAnXFx4ZjUnOiAnbycsICdcXHhmNic6ICdvJywgJ1xceGY4JzogJ28nLFxuICAgICdcXHhkOSc6ICdVJywgICdcXHhkYSc6ICdVJywgJ1xceGRiJzogJ1UnLCAnXFx4ZGMnOiAnVScsXG4gICAgJ1xceGY5JzogJ3UnLCAgJ1xceGZhJzogJ3UnLCAnXFx4ZmInOiAndScsICdcXHhmYyc6ICd1JyxcbiAgICAnXFx4ZGQnOiAnWScsICAnXFx4ZmQnOiAneScsICdcXHhmZic6ICd5JyxcbiAgICAnXFx4YzYnOiAnQWUnLCAnXFx4ZTYnOiAnYWUnLFxuICAgICdcXHhkZSc6ICdUaCcsICdcXHhmZSc6ICd0aCcsXG4gICAgJ1xceGRmJzogJ3NzJyxcbiAgICAvLyBMYXRpbiBFeHRlbmRlZC1BIGJsb2NrLlxuICAgICdcXHUwMTAwJzogJ0EnLCAgJ1xcdTAxMDInOiAnQScsICdcXHUwMTA0JzogJ0EnLFxuICAgICdcXHUwMTAxJzogJ2EnLCAgJ1xcdTAxMDMnOiAnYScsICdcXHUwMTA1JzogJ2EnLFxuICAgICdcXHUwMTA2JzogJ0MnLCAgJ1xcdTAxMDgnOiAnQycsICdcXHUwMTBhJzogJ0MnLCAnXFx1MDEwYyc6ICdDJyxcbiAgICAnXFx1MDEwNyc6ICdjJywgICdcXHUwMTA5JzogJ2MnLCAnXFx1MDEwYic6ICdjJywgJ1xcdTAxMGQnOiAnYycsXG4gICAgJ1xcdTAxMGUnOiAnRCcsICAnXFx1MDExMCc6ICdEJywgJ1xcdTAxMGYnOiAnZCcsICdcXHUwMTExJzogJ2QnLFxuICAgICdcXHUwMTEyJzogJ0UnLCAgJ1xcdTAxMTQnOiAnRScsICdcXHUwMTE2JzogJ0UnLCAnXFx1MDExOCc6ICdFJywgJ1xcdTAxMWEnOiAnRScsXG4gICAgJ1xcdTAxMTMnOiAnZScsICAnXFx1MDExNSc6ICdlJywgJ1xcdTAxMTcnOiAnZScsICdcXHUwMTE5JzogJ2UnLCAnXFx1MDExYic6ICdlJyxcbiAgICAnXFx1MDExYyc6ICdHJywgICdcXHUwMTFlJzogJ0cnLCAnXFx1MDEyMCc6ICdHJywgJ1xcdTAxMjInOiAnRycsXG4gICAgJ1xcdTAxMWQnOiAnZycsICAnXFx1MDExZic6ICdnJywgJ1xcdTAxMjEnOiAnZycsICdcXHUwMTIzJzogJ2cnLFxuICAgICdcXHUwMTI0JzogJ0gnLCAgJ1xcdTAxMjYnOiAnSCcsICdcXHUwMTI1JzogJ2gnLCAnXFx1MDEyNyc6ICdoJyxcbiAgICAnXFx1MDEyOCc6ICdJJywgICdcXHUwMTJhJzogJ0knLCAnXFx1MDEyYyc6ICdJJywgJ1xcdTAxMmUnOiAnSScsICdcXHUwMTMwJzogJ0knLFxuICAgICdcXHUwMTI5JzogJ2knLCAgJ1xcdTAxMmInOiAnaScsICdcXHUwMTJkJzogJ2knLCAnXFx1MDEyZic6ICdpJywgJ1xcdTAxMzEnOiAnaScsXG4gICAgJ1xcdTAxMzQnOiAnSicsICAnXFx1MDEzNSc6ICdqJyxcbiAgICAnXFx1MDEzNic6ICdLJywgICdcXHUwMTM3JzogJ2snLCAnXFx1MDEzOCc6ICdrJyxcbiAgICAnXFx1MDEzOSc6ICdMJywgICdcXHUwMTNiJzogJ0wnLCAnXFx1MDEzZCc6ICdMJywgJ1xcdTAxM2YnOiAnTCcsICdcXHUwMTQxJzogJ0wnLFxuICAgICdcXHUwMTNhJzogJ2wnLCAgJ1xcdTAxM2MnOiAnbCcsICdcXHUwMTNlJzogJ2wnLCAnXFx1MDE0MCc6ICdsJywgJ1xcdTAxNDInOiAnbCcsXG4gICAgJ1xcdTAxNDMnOiAnTicsICAnXFx1MDE0NSc6ICdOJywgJ1xcdTAxNDcnOiAnTicsICdcXHUwMTRhJzogJ04nLFxuICAgICdcXHUwMTQ0JzogJ24nLCAgJ1xcdTAxNDYnOiAnbicsICdcXHUwMTQ4JzogJ24nLCAnXFx1MDE0Yic6ICduJyxcbiAgICAnXFx1MDE0Yyc6ICdPJywgICdcXHUwMTRlJzogJ08nLCAnXFx1MDE1MCc6ICdPJyxcbiAgICAnXFx1MDE0ZCc6ICdvJywgICdcXHUwMTRmJzogJ28nLCAnXFx1MDE1MSc6ICdvJyxcbiAgICAnXFx1MDE1NCc6ICdSJywgICdcXHUwMTU2JzogJ1InLCAnXFx1MDE1OCc6ICdSJyxcbiAgICAnXFx1MDE1NSc6ICdyJywgICdcXHUwMTU3JzogJ3InLCAnXFx1MDE1OSc6ICdyJyxcbiAgICAnXFx1MDE1YSc6ICdTJywgICdcXHUwMTVjJzogJ1MnLCAnXFx1MDE1ZSc6ICdTJywgJ1xcdTAxNjAnOiAnUycsXG4gICAgJ1xcdTAxNWInOiAncycsICAnXFx1MDE1ZCc6ICdzJywgJ1xcdTAxNWYnOiAncycsICdcXHUwMTYxJzogJ3MnLFxuICAgICdcXHUwMTYyJzogJ1QnLCAgJ1xcdTAxNjQnOiAnVCcsICdcXHUwMTY2JzogJ1QnLFxuICAgICdcXHUwMTYzJzogJ3QnLCAgJ1xcdTAxNjUnOiAndCcsICdcXHUwMTY3JzogJ3QnLFxuICAgICdcXHUwMTY4JzogJ1UnLCAgJ1xcdTAxNmEnOiAnVScsICdcXHUwMTZjJzogJ1UnLCAnXFx1MDE2ZSc6ICdVJywgJ1xcdTAxNzAnOiAnVScsICdcXHUwMTcyJzogJ1UnLFxuICAgICdcXHUwMTY5JzogJ3UnLCAgJ1xcdTAxNmInOiAndScsICdcXHUwMTZkJzogJ3UnLCAnXFx1MDE2Zic6ICd1JywgJ1xcdTAxNzEnOiAndScsICdcXHUwMTczJzogJ3UnLFxuICAgICdcXHUwMTc0JzogJ1cnLCAgJ1xcdTAxNzUnOiAndycsXG4gICAgJ1xcdTAxNzYnOiAnWScsICAnXFx1MDE3Nyc6ICd5JywgJ1xcdTAxNzgnOiAnWScsXG4gICAgJ1xcdTAxNzknOiAnWicsICAnXFx1MDE3Yic6ICdaJywgJ1xcdTAxN2QnOiAnWicsXG4gICAgJ1xcdTAxN2EnOiAneicsICAnXFx1MDE3Yyc6ICd6JywgJ1xcdTAxN2UnOiAneicsXG4gICAgJ1xcdTAxMzInOiAnSUonLCAnXFx1MDEzMyc6ICdpaicsXG4gICAgJ1xcdTAxNTInOiAnT2UnLCAnXFx1MDE1Myc6ICdvZScsXG4gICAgJ1xcdTAxNDknOiBcIiduXCIsICdcXHUwMTdmJzogJ3MnXG4gIH07XG5cbiAgLyoqIFVzZWQgdG8gbWFwIGNoYXJhY3RlcnMgdG8gSFRNTCBlbnRpdGllcy4gKi9cbiAgdmFyIGh0bWxFc2NhcGVzID0ge1xuICAgICcmJzogJyZhbXA7JyxcbiAgICAnPCc6ICcmbHQ7JyxcbiAgICAnPic6ICcmZ3Q7JyxcbiAgICAnXCInOiAnJnF1b3Q7JyxcbiAgICBcIidcIjogJyYjMzk7J1xuICB9O1xuXG4gIC8qKiBVc2VkIHRvIG1hcCBIVE1MIGVudGl0aWVzIHRvIGNoYXJhY3RlcnMuICovXG4gIHZhciBodG1sVW5lc2NhcGVzID0ge1xuICAgICcmYW1wOyc6ICcmJyxcbiAgICAnJmx0Oyc6ICc8JyxcbiAgICAnJmd0Oyc6ICc+JyxcbiAgICAnJnF1b3Q7JzogJ1wiJyxcbiAgICAnJiMzOTsnOiBcIidcIlxuICB9O1xuXG4gIC8qKiBVc2VkIHRvIGVzY2FwZSBjaGFyYWN0ZXJzIGZvciBpbmNsdXNpb24gaW4gY29tcGlsZWQgc3RyaW5nIGxpdGVyYWxzLiAqL1xuICB2YXIgc3RyaW5nRXNjYXBlcyA9IHtcbiAgICAnXFxcXCc6ICdcXFxcJyxcbiAgICBcIidcIjogXCInXCIsXG4gICAgJ1xcbic6ICduJyxcbiAgICAnXFxyJzogJ3InLFxuICAgICdcXHUyMDI4JzogJ3UyMDI4JyxcbiAgICAnXFx1MjAyOSc6ICd1MjAyOSdcbiAgfTtcblxuICAvKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xuICB2YXIgZnJlZVBhcnNlRmxvYXQgPSBwYXJzZUZsb2F0LFxuICAgICAgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbiAgdmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG4gIHZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4gIC8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xuICB2YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xuICB2YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xuICB2YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4gIC8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG4gIHZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgcHJvY2Vzc2AgZnJvbSBOb2RlLmpzLiAqL1xuICB2YXIgZnJlZVByb2Nlc3MgPSBtb2R1bGVFeHBvcnRzICYmIGZyZWVHbG9iYWwucHJvY2VzcztcblxuICAvKiogVXNlZCB0byBhY2Nlc3MgZmFzdGVyIE5vZGUuanMgaGVscGVycy4gKi9cbiAgdmFyIG5vZGVVdGlsID0gKGZ1bmN0aW9uKCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgYHV0aWwudHlwZXNgIGZvciBOb2RlLmpzIDEwKy5cbiAgICAgIHZhciB0eXBlcyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlICYmIGZyZWVNb2R1bGUucmVxdWlyZSgndXRpbCcpLnR5cGVzO1xuXG4gICAgICBpZiAodHlwZXMpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVzO1xuICAgICAgfVxuXG4gICAgICAvLyBMZWdhY3kgYHByb2Nlc3MuYmluZGluZygndXRpbCcpYCBmb3IgTm9kZS5qcyA8IDEwLlxuICAgICAgcmV0dXJuIGZyZWVQcm9jZXNzICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcgJiYgZnJlZVByb2Nlc3MuYmluZGluZygndXRpbCcpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH0oKSk7XG5cbiAgLyogTm9kZS5qcyBoZWxwZXIgcmVmZXJlbmNlcy4gKi9cbiAgdmFyIG5vZGVJc0FycmF5QnVmZmVyID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNBcnJheUJ1ZmZlcixcbiAgICAgIG5vZGVJc0RhdGUgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc0RhdGUsXG4gICAgICBub2RlSXNNYXAgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc01hcCxcbiAgICAgIG5vZGVJc1JlZ0V4cCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzUmVnRXhwLFxuICAgICAgbm9kZUlzU2V0ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNTZXQsXG4gICAgICBub2RlSXNUeXBlZEFycmF5ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNUeXBlZEFycmF5O1xuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8qKlxuICAgKiBBIGZhc3RlciBhbHRlcm5hdGl2ZSB0byBgRnVuY3Rpb24jYXBwbHlgLCB0aGlzIGZ1bmN0aW9uIGludm9rZXMgYGZ1bmNgXG4gICAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXBwbHkoZnVuYywgdGhpc0FyZywgYXJncykge1xuICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnKTtcbiAgICAgIGNhc2UgMTogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdKTtcbiAgICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlQWdncmVnYXRvcmAgZm9yIGFycmF5cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBgYWNjdW11bGF0b3JgIHZhbHVlcy5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgYWdncmVnYXRlZCBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgYWNjdW11bGF0b3JgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlBZ2dyZWdhdG9yKGFycmF5LCBzZXR0ZXIsIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICBzZXR0ZXIoYWNjdW11bGF0b3IsIHZhbHVlLCBpdGVyYXRlZSh2YWx1ZSksIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5RWFjaChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZm9yRWFjaFJpZ2h0YCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5RWFjaFJpZ2h0KGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgaWYgKGl0ZXJhdGVlKGFycmF5W2xlbmd0aF0sIGxlbmd0aCwgYXJyYXkpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5ldmVyeWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgcGFzcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlFdmVyeShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmICghcHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5maWx0ZXJgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5RmlsdGVyKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5jbHVkZXNgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBzcGVjaWZ5aW5nIGFuIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUluY2x1ZGVzKGFycmF5LCB2YWx1ZSkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICByZXR1cm4gISFsZW5ndGggJiYgYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCAwKSA+IC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXJyYXlJbmNsdWRlc2AgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhIGNvbXBhcmF0b3IuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlJbmNsdWRlc1dpdGgoYXJyYXksIHZhbHVlLCBjb21wYXJhdG9yKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKHZhbHVlLCBhcnJheVtpbmRleF0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gICAqIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlNYXAoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyB0aGUgZWxlbWVudHMgb2YgYHZhbHVlc2AgdG8gYGFycmF5YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYXBwZW5kLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5UHVzaChhcnJheSwgdmFsdWVzKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICAgIG9mZnNldCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBhcnJheVtvZmZzZXQgKyBpbmRleF0gPSB2YWx1ZXNbaW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnJlZHVjZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YCBhc1xuICAgKiAgdGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5UmVkdWNlKGFycmF5LCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIGlmIChpbml0QWNjdW0gJiYgbGVuZ3RoKSB7XG4gICAgICBhY2N1bXVsYXRvciA9IGFycmF5WysraW5kZXhdO1xuICAgIH1cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgYWNjdW11bGF0b3IgPSBpdGVyYXRlZShhY2N1bXVsYXRvciwgYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnJlZHVjZVJpZ2h0YCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luaXRBY2N1bV0gU3BlY2lmeSB1c2luZyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAgYXNcbiAgICogIHRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVJlZHVjZVJpZ2h0KGFycmF5LCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSkge1xuICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICBpZiAoaW5pdEFjY3VtICYmIGxlbmd0aCkge1xuICAgICAgYWNjdW11bGF0b3IgPSBhcnJheVstLWxlbmd0aF07XG4gICAgfVxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgYWNjdW11bGF0b3IgPSBpdGVyYXRlZShhY2N1bXVsYXRvciwgYXJyYXlbbGVuZ3RoXSwgbGVuZ3RoLCBhcnJheSk7XG4gICAgfVxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc29tZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlXG4gICAqIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICogIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5U29tZShhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc2l6ZSBvZiBhbiBBU0NJSSBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICAgKi9cbiAgdmFyIGFzY2lpU2l6ZSA9IGJhc2VQcm9wZXJ0eSgnbGVuZ3RoJyk7XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGFuIEFTQ0lJIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBhc2NpaVRvQXJyYXkoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5zcGxpdCgnJyk7XG4gIH1cblxuICAvKipcbiAgICogU3BsaXRzIGFuIEFTQ0lJIGBzdHJpbmdgIGludG8gYW4gYXJyYXkgb2YgaXRzIHdvcmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHdvcmRzIG9mIGBzdHJpbmdgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXNjaWlXb3JkcyhzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nLm1hdGNoKHJlQXNjaWlXb3JkKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uZmluZEtleWAgYW5kIGBfLmZpbmRMYXN0S2V5YCxcbiAgICogd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB3aGljaCBpdGVyYXRlcyBvdmVyIGBjb2xsZWN0aW9uYFxuICAgKiB1c2luZyBgZWFjaEZ1bmNgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBgY29sbGVjdGlvbmAuXG4gICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmb3VuZCBlbGVtZW50IG9yIGl0cyBrZXksIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlRmluZEtleShjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGVhY2hGdW5jKSB7XG4gICAgdmFyIHJlc3VsdDtcbiAgICBlYWNoRnVuYyhjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7XG4gICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pKSB7XG4gICAgICAgIHJlc3VsdCA9IGtleTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmluZEluZGV4YCBhbmQgYF8uZmluZExhc3RJbmRleGAgd2l0aG91dFxuICAgKiBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VGaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4LCBmcm9tUmlnaHQpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IGZyb21JbmRleCArIChmcm9tUmlnaHQgPyAxIDogLTEpO1xuXG4gICAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmluZGV4T2ZgIHdpdGhvdXQgYGZyb21JbmRleGAgYm91bmRzIGNoZWNrcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlXG4gICAgICA/IHN0cmljdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpXG4gICAgICA6IGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJc05hTiwgZnJvbUluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGJhc2VJbmRleE9mYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEgY29tcGFyYXRvci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlSW5kZXhPZldpdGgoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgsIGNvbXBhcmF0b3IpIHtcbiAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggLSAxLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgaWYgKGNvbXBhcmF0b3IoYXJyYXlbaW5kZXhdLCB2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYU5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbnVtYmVyIG9iamVjdHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUlzTmFOKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tZWFuYCBhbmQgYF8ubWVhbkJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG1lYW4uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlTWVhbihhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgcmV0dXJuIGxlbmd0aCA/IChiYXNlU3VtKGFycmF5LCBpdGVyYXRlZSkgLyBsZW5ndGgpIDogTkFOO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnByb3BlcnR5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VQcm9wZXJ0eShrZXkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnByb3BlcnR5T2ZgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VQcm9wZXJ0eU9mKG9iamVjdCkge1xuICAgIHJldHVybiBmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVkdWNlYCBhbmQgYF8ucmVkdWNlUmlnaHRgLCB3aXRob3V0IHN1cHBvcnRcbiAgICogZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYGNvbGxlY3Rpb25gIHVzaW5nIGBlYWNoRnVuY2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHsqfSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBpbml0QWNjdW0gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3Qgb3IgbGFzdCBlbGVtZW50IG9mXG4gICAqICBgY29sbGVjdGlvbmAgYXMgdGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYGNvbGxlY3Rpb25gLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlUmVkdWNlKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtLCBlYWNoRnVuYykge1xuICAgIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgYWNjdW11bGF0b3IgPSBpbml0QWNjdW1cbiAgICAgICAgPyAoaW5pdEFjY3VtID0gZmFsc2UsIHZhbHVlKVxuICAgICAgICA6IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgIH0pO1xuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0QnlgIHdoaWNoIHVzZXMgYGNvbXBhcmVyYCB0byBkZWZpbmUgdGhlXG4gICAqIHNvcnQgb3JkZXIgb2YgYGFycmF5YCBhbmQgcmVwbGFjZXMgY3JpdGVyaWEgb2JqZWN0cyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmdcbiAgICogdmFsdWVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc29ydC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyZXIgVGhlIGZ1bmN0aW9uIHRvIGRlZmluZSBzb3J0IG9yZGVyLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VTb3J0QnkoYXJyYXksIGNvbXBhcmVyKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIGFycmF5LnNvcnQoY29tcGFyZXIpO1xuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgYXJyYXlbbGVuZ3RoXSA9IGFycmF5W2xlbmd0aF0udmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zdW1gIGFuZCBgXy5zdW1CeWAgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlU3VtKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciByZXN1bHQsXG4gICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGl0ZXJhdGVlKGFycmF5W2luZGV4XSk7XG4gICAgICBpZiAoY3VycmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gY3VycmVudCA6IChyZXN1bHQgKyBjdXJyZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50aW1lc2Agd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzXG4gICAqIG9yIG1heCBhcnJheSBsZW5ndGggY2hlY2tzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBgaXRlcmF0ZWVgLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgcmVzdWx0ID0gQXJyYXkobik7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShpbmRleCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9QYWlyc2AgYW5kIGBfLnRvUGFpcnNJbmAgd2hpY2ggY3JlYXRlcyBhbiBhcnJheVxuICAgKiBvZiBrZXktdmFsdWUgcGFpcnMgZm9yIGBvYmplY3RgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3BlcnR5IG5hbWVzIG9mIGBwcm9wc2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVG9QYWlycyhvYmplY3QsIHByb3BzKSB7XG4gICAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBba2V5LCBvYmplY3Rba2V5XV07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5hcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3Igc3RvcmluZyBtZXRhZGF0YS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy52YWx1ZXNgIGFuZCBgXy52YWx1ZXNJbmAgd2hpY2ggY3JlYXRlcyBhblxuICAgKiBhcnJheSBvZiBgb2JqZWN0YCBwcm9wZXJ0eSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvcGVydHkgbmFtZXNcbiAgICogb2YgYHByb3BzYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VWYWx1ZXMob2JqZWN0LCBwcm9wcykge1xuICAgIHJldHVybiBhcnJheU1hcChwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgYGNhY2hlYCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgVGhlIGNhY2hlIHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gY2FjaGVIYXMoY2FjaGUsIGtleSkge1xuICAgIHJldHVybiBjYWNoZS5oYXMoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltU3RhcnRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHN0cmluZyBzeW1ib2xcbiAgICogdGhhdCBpcyBub3QgZm91bmQgaW4gdGhlIGNoYXJhY3RlciBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBzdHJTeW1ib2xzIFRoZSBzdHJpbmcgc3ltYm9scyB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0FycmF5fSBjaHJTeW1ib2xzIFRoZSBjaGFyYWN0ZXIgc3ltYm9scyB0byBmaW5kLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdW5tYXRjaGVkIHN0cmluZyBzeW1ib2wuXG4gICAqL1xuICBmdW5jdGlvbiBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBzdHJTeW1ib2xzLmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoICYmIGJhc2VJbmRleE9mKGNoclN5bWJvbHMsIHN0clN5bWJvbHNbaW5kZXhdLCAwKSA+IC0xKSB7fVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHN0cmluZyBzeW1ib2xcbiAgICogdGhhdCBpcyBub3QgZm91bmQgaW4gdGhlIGNoYXJhY3RlciBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBzdHJTeW1ib2xzIFRoZSBzdHJpbmcgc3ltYm9scyB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0FycmF5fSBjaHJTeW1ib2xzIFRoZSBjaGFyYWN0ZXIgc3ltYm9scyB0byBmaW5kLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCB1bm1hdGNoZWQgc3RyaW5nIHN5bWJvbC5cbiAgICovXG4gIGZ1bmN0aW9uIGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykge1xuICAgIHZhciBpbmRleCA9IHN0clN5bWJvbHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGluZGV4LS0gJiYgYmFzZUluZGV4T2YoY2hyU3ltYm9scywgc3RyU3ltYm9sc1tpbmRleF0sIDApID4gLTEpIHt9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWJlciBvZiBgcGxhY2Vob2xkZXJgIG9jY3VycmVuY2VzIGluIGBhcnJheWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB0byBzZWFyY2ggZm9yLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBwbGFjZWhvbGRlciBjb3VudC5cbiAgICovXG4gIGZ1bmN0aW9uIGNvdW50SG9sZGVycyhhcnJheSwgcGxhY2Vob2xkZXIpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICByZXN1bHQgPSAwO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBpZiAoYXJyYXlbbGVuZ3RoXSA9PT0gcGxhY2Vob2xkZXIpIHtcbiAgICAgICAgKytyZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy5kZWJ1cnJgIHRvIGNvbnZlcnQgTGF0aW4tMSBTdXBwbGVtZW50IGFuZCBMYXRpbiBFeHRlbmRlZC1BXG4gICAqIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxldHRlciBUaGUgbWF0Y2hlZCBsZXR0ZXIgdG8gZGVidXJyLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBkZWJ1cnJlZCBsZXR0ZXIuXG4gICAqL1xuICB2YXIgZGVidXJyTGV0dGVyID0gYmFzZVByb3BlcnR5T2YoZGVidXJyZWRMZXR0ZXJzKTtcblxuICAvKipcbiAgICogVXNlZCBieSBgXy5lc2NhcGVgIHRvIGNvbnZlcnQgY2hhcmFjdGVycyB0byBIVE1MIGVudGl0aWVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hyIFRoZSBtYXRjaGVkIGNoYXJhY3RlciB0byBlc2NhcGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgY2hhcmFjdGVyLlxuICAgKi9cbiAgdmFyIGVzY2FwZUh0bWxDaGFyID0gYmFzZVByb3BlcnR5T2YoaHRtbEVzY2FwZXMpO1xuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRlbXBsYXRlYCB0byBlc2NhcGUgY2hhcmFjdGVycyBmb3IgaW5jbHVzaW9uIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIGZ1bmN0aW9uIGVzY2FwZVN0cmluZ0NoYXIoY2hyKSB7XG4gICAgcmV0dXJuICdcXFxcJyArIHN0cmluZ0VzY2FwZXNbY2hyXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBVbmljb2RlIHN5bWJvbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYSBzeW1ib2wgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGhhc1VuaWNvZGUoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHJlSGFzVW5pY29kZS50ZXN0KHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIGNvbnRhaW5zIGEgd29yZCBjb21wb3NlZCBvZiBVbmljb2RlIHN5bWJvbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYSB3b3JkIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBoYXNVbmljb2RlV29yZChzdHJpbmcpIHtcbiAgICByZXR1cm4gcmVIYXNVbmljb2RlV29yZC50ZXN0KHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYGl0ZXJhdG9yYCB0byBhbiBhcnJheS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGl0ZXJhdG9yIFRoZSBpdGVyYXRvciB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGl0ZXJhdG9yVG9BcnJheShpdGVyYXRvcikge1xuICAgIHZhciBkYXRhLFxuICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICghKGRhdGEgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGRhdGEudmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBtYXBgIHRvIGl0cyBrZXktdmFsdWUgcGFpcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICovXG4gIGZ1bmN0aW9uIG1hcFRvQXJyYXkobWFwKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KG1hcC5zaXplKTtcblxuICAgIG1hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlc3VsdFsrK2luZGV4XSA9IFtrZXksIHZhbHVlXTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICAgIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGFsbCBgcGxhY2Vob2xkZXJgIGVsZW1lbnRzIGluIGBhcnJheWAgd2l0aCBhbiBpbnRlcm5hbCBwbGFjZWhvbGRlclxuICAgKiBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB0aGVpciBpbmRleGVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB0byByZXBsYWNlLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZUhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICBpZiAodmFsdWUgPT09IHBsYWNlaG9sZGVyIHx8IHZhbHVlID09PSBQTEFDRUhPTERFUikge1xuICAgICAgICBhcnJheVtpbmRleF0gPSBQTEFDRUhPTERFUjtcbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYHNldGAgdG8gYW4gYXJyYXkgb2YgaXRzIHZhbHVlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWVzLlxuICAgKi9cbiAgZnVuY3Rpb24gc2V0VG9BcnJheShzZXQpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgcmVzdWx0ID0gQXJyYXkoc2V0LnNpemUpO1xuXG4gICAgc2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJlc3VsdFsrK2luZGV4XSA9IHZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYHNldGAgdG8gaXRzIHZhbHVlLXZhbHVlIHBhaXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB2YWx1ZS12YWx1ZSBwYWlycy5cbiAgICovXG4gIGZ1bmN0aW9uIHNldFRvUGFpcnMoc2V0KSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSBbdmFsdWUsIHZhbHVlXTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmRleE9mYCB3aGljaCBwZXJmb3JtcyBzdHJpY3QgZXF1YWxpdHlcbiAgICogY29tcGFyaXNvbnMgb2YgdmFsdWVzLCBpLmUuIGA9PT1gLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5sYXN0SW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5XG4gICAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaWN0TGFzdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggKyAxO1xuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nU2l6ZShzdHJpbmcpIHtcbiAgICByZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICA/IHVuaWNvZGVTaXplKHN0cmluZylcbiAgICAgIDogYXNjaWlTaXplKHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ1RvQXJyYXkoc3RyaW5nKSB7XG4gICAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgICAgPyB1bmljb2RlVG9BcnJheShzdHJpbmcpXG4gICAgICA6IGFzY2lpVG9BcnJheShzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8udW5lc2NhcGVgIHRvIGNvbnZlcnQgSFRNTCBlbnRpdGllcyB0byBjaGFyYWN0ZXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hyIFRoZSBtYXRjaGVkIGNoYXJhY3RlciB0byB1bmVzY2FwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5lc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIHZhciB1bmVzY2FwZUh0bWxDaGFyID0gYmFzZVByb3BlcnR5T2YoaHRtbFVuZXNjYXBlcyk7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpemUgb2YgYSBVbmljb2RlIGBzdHJpbmdgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgaW5zcGVjdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gICAqL1xuICBmdW5jdGlvbiB1bmljb2RlU2l6ZShzdHJpbmcpIHtcbiAgICB2YXIgcmVzdWx0ID0gcmVVbmljb2RlLmxhc3RJbmRleCA9IDA7XG4gICAgd2hpbGUgKHJlVW5pY29kZS50ZXN0KHN0cmluZykpIHtcbiAgICAgICsrcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgVW5pY29kZSBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVRvQXJyYXkoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGUpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0cyBhIFVuaWNvZGUgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gICAqL1xuICBmdW5jdGlvbiB1bmljb2RlV29yZHMoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGVXb3JkKSB8fCBbXTtcbiAgfVxuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcHJpc3RpbmUgYGxvZGFzaGAgZnVuY3Rpb24gdXNpbmcgdGhlIGBjb250ZXh0YCBvYmplY3QuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQG1lbWJlck9mIF9cbiAgICogQHNpbmNlIDEuMS4wXG4gICAqIEBjYXRlZ29yeSBVdGlsXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbY29udGV4dD1yb290XSBUaGUgY29udGV4dCBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBhIG5ldyBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogXy5taXhpbih7ICdmb28nOiBfLmNvbnN0YW50KCdmb28nKSB9KTtcbiAgICpcbiAgICogdmFyIGxvZGFzaCA9IF8ucnVuSW5Db250ZXh0KCk7XG4gICAqIGxvZGFzaC5taXhpbih7ICdiYXInOiBsb2Rhc2guY29uc3RhbnQoJ2JhcicpIH0pO1xuICAgKlxuICAgKiBfLmlzRnVuY3Rpb24oXy5mb28pO1xuICAgKiAvLyA9PiB0cnVlXG4gICAqIF8uaXNGdW5jdGlvbihfLmJhcik7XG4gICAqIC8vID0+IGZhbHNlXG4gICAqXG4gICAqIGxvZGFzaC5pc0Z1bmN0aW9uKGxvZGFzaC5mb28pO1xuICAgKiAvLyA9PiBmYWxzZVxuICAgKiBsb2Rhc2guaXNGdW5jdGlvbihsb2Rhc2guYmFyKTtcbiAgICogLy8gPT4gdHJ1ZVxuICAgKlxuICAgKiAvLyBDcmVhdGUgYSBzdXBlZC11cCBgZGVmZXJgIGluIE5vZGUuanMuXG4gICAqIHZhciBkZWZlciA9IF8ucnVuSW5Db250ZXh0KHsgJ3NldFRpbWVvdXQnOiBzZXRJbW1lZGlhdGUgfSkuZGVmZXI7XG4gICAqL1xuICB2YXIgcnVuSW5Db250ZXh0ID0gKGZ1bmN0aW9uIHJ1bkluQ29udGV4dChjb250ZXh0KSB7XG4gICAgY29udGV4dCA9IGNvbnRleHQgPT0gbnVsbCA/IHJvb3QgOiBfLmRlZmF1bHRzKHJvb3QuT2JqZWN0KCksIGNvbnRleHQsIF8ucGljayhyb290LCBjb250ZXh0UHJvcHMpKTtcblxuICAgIC8qKiBCdWlsdC1pbiBjb25zdHJ1Y3RvciByZWZlcmVuY2VzLiAqL1xuICAgIHZhciBBcnJheSA9IGNvbnRleHQuQXJyYXksXG4gICAgICAgIERhdGUgPSBjb250ZXh0LkRhdGUsXG4gICAgICAgIEVycm9yID0gY29udGV4dC5FcnJvcixcbiAgICAgICAgRnVuY3Rpb24gPSBjb250ZXh0LkZ1bmN0aW9uLFxuICAgICAgICBNYXRoID0gY29udGV4dC5NYXRoLFxuICAgICAgICBPYmplY3QgPSBjb250ZXh0Lk9iamVjdCxcbiAgICAgICAgUmVnRXhwID0gY29udGV4dC5SZWdFeHAsXG4gICAgICAgIFN0cmluZyA9IGNvbnRleHQuU3RyaW5nLFxuICAgICAgICBUeXBlRXJyb3IgPSBjb250ZXh0LlR5cGVFcnJvcjtcblxuICAgIC8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbiAgICB2YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZSxcbiAgICAgICAgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgICAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3Qgb3ZlcnJlYWNoaW5nIGNvcmUtanMgc2hpbXMuICovXG4gICAgdmFyIGNvcmVKc0RhdGEgPSBjb250ZXh0WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxuICAgIC8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbiAgICB2YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4gICAgLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG4gICAgdmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbiAgICAvKiogVXNlZCB0byBnZW5lcmF0ZSB1bmlxdWUgSURzLiAqL1xuICAgIHZhciBpZENvdW50ZXIgPSAwO1xuXG4gICAgLyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cbiAgICB2YXIgbWFza1NyY0tleSA9IChmdW5jdGlvbigpIHtcbiAgICAgIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gICAgICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAgICAgKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAgICAgKiBvZiB2YWx1ZXMuXG4gICAgICovXG4gICAgdmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbiAgICAvKiogVXNlZCB0byBpbmZlciB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuICovXG4gICAgdmFyIG9iamVjdEN0b3JTdHJpbmcgPSBmdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO1xuXG4gICAgLyoqIFVzZWQgdG8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgYF9gIHJlZmVyZW5jZSBpbiBgXy5ub0NvbmZsaWN0YC4gKi9cbiAgICB2YXIgb2xkRGFzaCA9IHJvb3QuXztcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBpZiBhIG1ldGhvZCBpcyBuYXRpdmUuICovXG4gICAgdmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgICAgIGZ1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcXFwkJicpXG4gICAgICAucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXFxcXCgpfCBmb3IgLis/KD89XFxcXFxcXSkvZywgJyQxLio/JykgKyAnJCdcbiAgICApO1xuXG4gICAgLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG4gICAgdmFyIEJ1ZmZlciA9IG1vZHVsZUV4cG9ydHMgPyBjb250ZXh0LkJ1ZmZlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgU3ltYm9sID0gY29udGV4dC5TeW1ib2wsXG4gICAgICAgIFVpbnQ4QXJyYXkgPSBjb250ZXh0LlVpbnQ4QXJyYXksXG4gICAgICAgIGFsbG9jVW5zYWZlID0gQnVmZmVyID8gQnVmZmVyLmFsbG9jVW5zYWZlIDogdW5kZWZpbmVkLFxuICAgICAgICBnZXRQcm90b3R5cGUgPSBvdmVyQXJnKE9iamVjdC5nZXRQcm90b3R5cGVPZiwgT2JqZWN0KSxcbiAgICAgICAgb2JqZWN0Q3JlYXRlID0gT2JqZWN0LmNyZWF0ZSxcbiAgICAgICAgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZSxcbiAgICAgICAgc3BsaWNlID0gYXJyYXlQcm90by5zcGxpY2UsXG4gICAgICAgIHNwcmVhZGFibGVTeW1ib2wgPSBTeW1ib2wgPyBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlIDogdW5kZWZpbmVkLFxuICAgICAgICBzeW1JdGVyYXRvciA9IFN5bWJvbCA/IFN5bWJvbC5pdGVyYXRvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbiAgICB2YXIgZGVmaW5lUHJvcGVydHkgPSAoZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgZnVuYyA9IGdldE5hdGl2ZShPYmplY3QsICdkZWZpbmVQcm9wZXJ0eScpO1xuICAgICAgICBmdW5jKHt9LCAnJywge30pO1xuICAgICAgICByZXR1cm4gZnVuYztcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfSgpKTtcblxuICAgIC8qKiBNb2NrZWQgYnVpbHQtaW5zLiAqL1xuICAgIHZhciBjdHhDbGVhclRpbWVvdXQgPSBjb250ZXh0LmNsZWFyVGltZW91dCAhPT0gcm9vdC5jbGVhclRpbWVvdXQgJiYgY29udGV4dC5jbGVhclRpbWVvdXQsXG4gICAgICAgIGN0eE5vdyA9IERhdGUgJiYgRGF0ZS5ub3cgIT09IHJvb3QuRGF0ZS5ub3cgJiYgRGF0ZS5ub3csXG4gICAgICAgIGN0eFNldFRpbWVvdXQgPSBjb250ZXh0LnNldFRpbWVvdXQgIT09IHJvb3Quc2V0VGltZW91dCAmJiBjb250ZXh0LnNldFRpbWVvdXQ7XG5cbiAgICAvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG4gICAgdmFyIG5hdGl2ZUNlaWwgPSBNYXRoLmNlaWwsXG4gICAgICAgIG5hdGl2ZUZsb29yID0gTWF0aC5mbG9vcixcbiAgICAgICAgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsXG4gICAgICAgIG5hdGl2ZUlzQnVmZmVyID0gQnVmZmVyID8gQnVmZmVyLmlzQnVmZmVyIDogdW5kZWZpbmVkLFxuICAgICAgICBuYXRpdmVJc0Zpbml0ZSA9IGNvbnRleHQuaXNGaW5pdGUsXG4gICAgICAgIG5hdGl2ZUpvaW4gPSBhcnJheVByb3RvLmpvaW4sXG4gICAgICAgIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpLFxuICAgICAgICBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICAgICAgbmF0aXZlTWluID0gTWF0aC5taW4sXG4gICAgICAgIG5hdGl2ZU5vdyA9IERhdGUubm93LFxuICAgICAgICBuYXRpdmVQYXJzZUludCA9IGNvbnRleHQucGFyc2VJbnQsXG4gICAgICAgIG5hdGl2ZVJhbmRvbSA9IE1hdGgucmFuZG9tLFxuICAgICAgICBuYXRpdmVSZXZlcnNlID0gYXJyYXlQcm90by5yZXZlcnNlO1xuXG4gICAgLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xuICAgIHZhciBEYXRhVmlldyA9IGdldE5hdGl2ZShjb250ZXh0LCAnRGF0YVZpZXcnKSxcbiAgICAgICAgTWFwID0gZ2V0TmF0aXZlKGNvbnRleHQsICdNYXAnKSxcbiAgICAgICAgUHJvbWlzZSA9IGdldE5hdGl2ZShjb250ZXh0LCAnUHJvbWlzZScpLFxuICAgICAgICBTZXQgPSBnZXROYXRpdmUoY29udGV4dCwgJ1NldCcpLFxuICAgICAgICBXZWFrTWFwID0gZ2V0TmF0aXZlKGNvbnRleHQsICdXZWFrTWFwJyksXG4gICAgICAgIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTtcblxuICAgIC8qKiBVc2VkIHRvIHN0b3JlIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xuICAgIHZhciBtZXRhTWFwID0gV2Vha01hcCAmJiBuZXcgV2Vha01hcDtcblxuICAgIC8qKiBVc2VkIHRvIGxvb2t1cCB1bm1pbmlmaWVkIGZ1bmN0aW9uIG5hbWVzLiAqL1xuICAgIHZhciByZWFsTmFtZXMgPSB7fTtcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBtYXBzLCBzZXRzLCBhbmQgd2Vha21hcHMuICovXG4gICAgdmFyIGRhdGFWaWV3Q3RvclN0cmluZyA9IHRvU291cmNlKERhdGFWaWV3KSxcbiAgICAgICAgbWFwQ3RvclN0cmluZyA9IHRvU291cmNlKE1hcCksXG4gICAgICAgIHByb21pc2VDdG9yU3RyaW5nID0gdG9Tb3VyY2UoUHJvbWlzZSksXG4gICAgICAgIHNldEN0b3JTdHJpbmcgPSB0b1NvdXJjZShTZXQpLFxuICAgICAgICB3ZWFrTWFwQ3RvclN0cmluZyA9IHRvU291cmNlKFdlYWtNYXApO1xuXG4gICAgLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG4gICAgdmFyIHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltYm9sVmFsdWVPZiA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udmFsdWVPZiA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltYm9sVG9TdHJpbmcgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnRvU3RyaW5nIDogdW5kZWZpbmVkO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBsb2Rhc2hgIG9iamVjdCB3aGljaCB3cmFwcyBgdmFsdWVgIHRvIGVuYWJsZSBpbXBsaWNpdCBtZXRob2RcbiAgICAgKiBjaGFpbiBzZXF1ZW5jZXMuIE1ldGhvZHMgdGhhdCBvcGVyYXRlIG9uIGFuZCByZXR1cm4gYXJyYXlzLCBjb2xsZWN0aW9ucyxcbiAgICAgKiBhbmQgZnVuY3Rpb25zIGNhbiBiZSBjaGFpbmVkIHRvZ2V0aGVyLiBNZXRob2RzIHRoYXQgcmV0cmlldmUgYSBzaW5nbGUgdmFsdWVcbiAgICAgKiBvciBtYXkgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlIHdpbGwgYXV0b21hdGljYWxseSBlbmQgdGhlIGNoYWluIHNlcXVlbmNlXG4gICAgICogYW5kIHJldHVybiB0aGUgdW53cmFwcGVkIHZhbHVlLiBPdGhlcndpc2UsIHRoZSB2YWx1ZSBtdXN0IGJlIHVud3JhcHBlZFxuICAgICAqIHdpdGggYF8jdmFsdWVgLlxuICAgICAqXG4gICAgICogRXhwbGljaXQgY2hhaW4gc2VxdWVuY2VzLCB3aGljaCBtdXN0IGJlIHVud3JhcHBlZCB3aXRoIGBfI3ZhbHVlYCwgbWF5IGJlXG4gICAgICogZW5hYmxlZCB1c2luZyBgXy5jaGFpbmAuXG4gICAgICpcbiAgICAgKiBUaGUgZXhlY3V0aW9uIG9mIGNoYWluZWQgbWV0aG9kcyBpcyBsYXp5LCB0aGF0IGlzLCBpdCdzIGRlZmVycmVkIHVudGlsXG4gICAgICogYF8jdmFsdWVgIGlzIGltcGxpY2l0bHkgb3IgZXhwbGljaXRseSBjYWxsZWQuXG4gICAgICpcbiAgICAgKiBMYXp5IGV2YWx1YXRpb24gYWxsb3dzIHNldmVyYWwgbWV0aG9kcyB0byBzdXBwb3J0IHNob3J0Y3V0IGZ1c2lvbi5cbiAgICAgKiBTaG9ydGN1dCBmdXNpb24gaXMgYW4gb3B0aW1pemF0aW9uIHRvIG1lcmdlIGl0ZXJhdGVlIGNhbGxzOyB0aGlzIGF2b2lkc1xuICAgICAqIHRoZSBjcmVhdGlvbiBvZiBpbnRlcm1lZGlhdGUgYXJyYXlzIGFuZCBjYW4gZ3JlYXRseSByZWR1Y2UgdGhlIG51bWJlciBvZlxuICAgICAqIGl0ZXJhdGVlIGV4ZWN1dGlvbnMuIFNlY3Rpb25zIG9mIGEgY2hhaW4gc2VxdWVuY2UgcXVhbGlmeSBmb3Igc2hvcnRjdXRcbiAgICAgKiBmdXNpb24gaWYgdGhlIHNlY3Rpb24gaXMgYXBwbGllZCB0byBhbiBhcnJheSBhbmQgaXRlcmF0ZWVzIGFjY2VwdCBvbmx5XG4gICAgICogb25lIGFyZ3VtZW50LiBUaGUgaGV1cmlzdGljIGZvciB3aGV0aGVyIGEgc2VjdGlvbiBxdWFsaWZpZXMgZm9yIHNob3J0Y3V0XG4gICAgICogZnVzaW9uIGlzIHN1YmplY3QgdG8gY2hhbmdlLlxuICAgICAqXG4gICAgICogQ2hhaW5pbmcgaXMgc3VwcG9ydGVkIGluIGN1c3RvbSBidWlsZHMgYXMgbG9uZyBhcyB0aGUgYF8jdmFsdWVgIG1ldGhvZCBpc1xuICAgICAqIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkLlxuICAgICAqXG4gICAgICogSW4gYWRkaXRpb24gdG8gbG9kYXNoIG1ldGhvZHMsIHdyYXBwZXJzIGhhdmUgYEFycmF5YCBhbmQgYFN0cmluZ2AgbWV0aG9kcy5cbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIGBBcnJheWAgbWV0aG9kcyBhcmU6XG4gICAgICogYGNvbmNhdGAsIGBqb2luYCwgYHBvcGAsIGBwdXNoYCwgYHNoaWZ0YCwgYHNvcnRgLCBgc3BsaWNlYCwgYW5kIGB1bnNoaWZ0YFxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgYFN0cmluZ2AgbWV0aG9kcyBhcmU6XG4gICAgICogYHJlcGxhY2VgIGFuZCBgc3BsaXRgXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBtZXRob2RzIHRoYXQgc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24gYXJlOlxuICAgICAqIGBhdGAsIGBjb21wYWN0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGRyb3BXaGlsZWAsIGBmaWx0ZXJgLCBgZmluZGAsXG4gICAgICogYGZpbmRMYXN0YCwgYGhlYWRgLCBgaW5pdGlhbGAsIGBsYXN0YCwgYG1hcGAsIGByZWplY3RgLCBgcmV2ZXJzZWAsIGBzbGljZWAsXG4gICAgICogYHRhaWxgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLCBgdGFrZVJpZ2h0V2hpbGVgLCBgdGFrZVdoaWxlYCwgYW5kIGB0b0FycmF5YFxuICAgICAqXG4gICAgICogVGhlIGNoYWluYWJsZSB3cmFwcGVyIG1ldGhvZHMgYXJlOlxuICAgICAqIGBhZnRlcmAsIGBhcnlgLCBgYXNzaWduYCwgYGFzc2lnbkluYCwgYGFzc2lnbkluV2l0aGAsIGBhc3NpZ25XaXRoYCwgYGF0YCxcbiAgICAgKiBgYmVmb3JlYCwgYGJpbmRgLCBgYmluZEFsbGAsIGBiaW5kS2V5YCwgYGNhc3RBcnJheWAsIGBjaGFpbmAsIGBjaHVua2AsXG4gICAgICogYGNvbW1pdGAsIGBjb21wYWN0YCwgYGNvbmNhdGAsIGBjb25mb3Jtc2AsIGBjb25zdGFudGAsIGBjb3VudEJ5YCwgYGNyZWF0ZWAsXG4gICAgICogYGN1cnJ5YCwgYGRlYm91bmNlYCwgYGRlZmF1bHRzYCwgYGRlZmF1bHRzRGVlcGAsIGBkZWZlcmAsIGBkZWxheWAsXG4gICAgICogYGRpZmZlcmVuY2VgLCBgZGlmZmVyZW5jZUJ5YCwgYGRpZmZlcmVuY2VXaXRoYCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCxcbiAgICAgKiBgZHJvcFJpZ2h0V2hpbGVgLCBgZHJvcFdoaWxlYCwgYGV4dGVuZGAsIGBleHRlbmRXaXRoYCwgYGZpbGxgLCBgZmlsdGVyYCxcbiAgICAgKiBgZmxhdE1hcGAsIGBmbGF0TWFwRGVlcGAsIGBmbGF0TWFwRGVwdGhgLCBgZmxhdHRlbmAsIGBmbGF0dGVuRGVlcGAsXG4gICAgICogYGZsYXR0ZW5EZXB0aGAsIGBmbGlwYCwgYGZsb3dgLCBgZmxvd1JpZ2h0YCwgYGZyb21QYWlyc2AsIGBmdW5jdGlvbnNgLFxuICAgICAqIGBmdW5jdGlvbnNJbmAsIGBncm91cEJ5YCwgYGluaXRpYWxgLCBgaW50ZXJzZWN0aW9uYCwgYGludGVyc2VjdGlvbkJ5YCxcbiAgICAgKiBgaW50ZXJzZWN0aW9uV2l0aGAsIGBpbnZlcnRgLCBgaW52ZXJ0QnlgLCBgaW52b2tlTWFwYCwgYGl0ZXJhdGVlYCwgYGtleUJ5YCxcbiAgICAgKiBga2V5c2AsIGBrZXlzSW5gLCBgbWFwYCwgYG1hcEtleXNgLCBgbWFwVmFsdWVzYCwgYG1hdGNoZXNgLCBgbWF0Y2hlc1Byb3BlcnR5YCxcbiAgICAgKiBgbWVtb2l6ZWAsIGBtZXJnZWAsIGBtZXJnZVdpdGhgLCBgbWV0aG9kYCwgYG1ldGhvZE9mYCwgYG1peGluYCwgYG5lZ2F0ZWAsXG4gICAgICogYG50aEFyZ2AsIGBvbWl0YCwgYG9taXRCeWAsIGBvbmNlYCwgYG9yZGVyQnlgLCBgb3ZlcmAsIGBvdmVyQXJnc2AsXG4gICAgICogYG92ZXJFdmVyeWAsIGBvdmVyU29tZWAsIGBwYXJ0aWFsYCwgYHBhcnRpYWxSaWdodGAsIGBwYXJ0aXRpb25gLCBgcGlja2AsXG4gICAgICogYHBpY2tCeWAsIGBwbGFudGAsIGBwcm9wZXJ0eWAsIGBwcm9wZXJ0eU9mYCwgYHB1bGxgLCBgcHVsbEFsbGAsIGBwdWxsQWxsQnlgLFxuICAgICAqIGBwdWxsQWxsV2l0aGAsIGBwdWxsQXRgLCBgcHVzaGAsIGByYW5nZWAsIGByYW5nZVJpZ2h0YCwgYHJlYXJnYCwgYHJlamVjdGAsXG4gICAgICogYHJlbW92ZWAsIGByZXN0YCwgYHJldmVyc2VgLCBgc2FtcGxlU2l6ZWAsIGBzZXRgLCBgc2V0V2l0aGAsIGBzaHVmZmxlYCxcbiAgICAgKiBgc2xpY2VgLCBgc29ydGAsIGBzb3J0QnlgLCBgc3BsaWNlYCwgYHNwcmVhZGAsIGB0YWlsYCwgYHRha2VgLCBgdGFrZVJpZ2h0YCxcbiAgICAgKiBgdGFrZVJpZ2h0V2hpbGVgLCBgdGFrZVdoaWxlYCwgYHRhcGAsIGB0aHJvdHRsZWAsIGB0aHJ1YCwgYHRvQXJyYXlgLFxuICAgICAqIGB0b1BhaXJzYCwgYHRvUGFpcnNJbmAsIGB0b1BhdGhgLCBgdG9QbGFpbk9iamVjdGAsIGB0cmFuc2Zvcm1gLCBgdW5hcnlgLFxuICAgICAqIGB1bmlvbmAsIGB1bmlvbkJ5YCwgYHVuaW9uV2l0aGAsIGB1bmlxYCwgYHVuaXFCeWAsIGB1bmlxV2l0aGAsIGB1bnNldGAsXG4gICAgICogYHVuc2hpZnRgLCBgdW56aXBgLCBgdW56aXBXaXRoYCwgYHVwZGF0ZWAsIGB1cGRhdGVXaXRoYCwgYHZhbHVlc2AsXG4gICAgICogYHZhbHVlc0luYCwgYHdpdGhvdXRgLCBgd3JhcGAsIGB4b3JgLCBgeG9yQnlgLCBgeG9yV2l0aGAsIGB6aXBgLFxuICAgICAqIGB6aXBPYmplY3RgLCBgemlwT2JqZWN0RGVlcGAsIGFuZCBgemlwV2l0aGBcbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIG1ldGhvZHMgdGhhdCBhcmUgKipub3QqKiBjaGFpbmFibGUgYnkgZGVmYXVsdCBhcmU6XG4gICAgICogYGFkZGAsIGBhdHRlbXB0YCwgYGNhbWVsQ2FzZWAsIGBjYXBpdGFsaXplYCwgYGNlaWxgLCBgY2xhbXBgLCBgY2xvbmVgLFxuICAgICAqIGBjbG9uZURlZXBgLCBgY2xvbmVEZWVwV2l0aGAsIGBjbG9uZVdpdGhgLCBgY29uZm9ybXNUb2AsIGBkZWJ1cnJgLFxuICAgICAqIGBkZWZhdWx0VG9gLCBgZGl2aWRlYCwgYGVhY2hgLCBgZWFjaFJpZ2h0YCwgYGVuZHNXaXRoYCwgYGVxYCwgYGVzY2FwZWAsXG4gICAgICogYGVzY2FwZVJlZ0V4cGAsIGBldmVyeWAsIGBmaW5kYCwgYGZpbmRJbmRleGAsIGBmaW5kS2V5YCwgYGZpbmRMYXN0YCxcbiAgICAgKiBgZmluZExhc3RJbmRleGAsIGBmaW5kTGFzdEtleWAsIGBmaXJzdGAsIGBmbG9vcmAsIGBmb3JFYWNoYCwgYGZvckVhY2hSaWdodGAsXG4gICAgICogYGZvckluYCwgYGZvckluUmlnaHRgLCBgZm9yT3duYCwgYGZvck93blJpZ2h0YCwgYGdldGAsIGBndGAsIGBndGVgLCBgaGFzYCxcbiAgICAgKiBgaGFzSW5gLCBgaGVhZGAsIGBpZGVudGl0eWAsIGBpbmNsdWRlc2AsIGBpbmRleE9mYCwgYGluUmFuZ2VgLCBgaW52b2tlYCxcbiAgICAgKiBgaXNBcmd1bWVudHNgLCBgaXNBcnJheWAsIGBpc0FycmF5QnVmZmVyYCwgYGlzQXJyYXlMaWtlYCwgYGlzQXJyYXlMaWtlT2JqZWN0YCxcbiAgICAgKiBgaXNCb29sZWFuYCwgYGlzQnVmZmVyYCwgYGlzRGF0ZWAsIGBpc0VsZW1lbnRgLCBgaXNFbXB0eWAsIGBpc0VxdWFsYCxcbiAgICAgKiBgaXNFcXVhbFdpdGhgLCBgaXNFcnJvcmAsIGBpc0Zpbml0ZWAsIGBpc0Z1bmN0aW9uYCwgYGlzSW50ZWdlcmAsIGBpc0xlbmd0aGAsXG4gICAgICogYGlzTWFwYCwgYGlzTWF0Y2hgLCBgaXNNYXRjaFdpdGhgLCBgaXNOYU5gLCBgaXNOYXRpdmVgLCBgaXNOaWxgLCBgaXNOdWxsYCxcbiAgICAgKiBgaXNOdW1iZXJgLCBgaXNPYmplY3RgLCBgaXNPYmplY3RMaWtlYCwgYGlzUGxhaW5PYmplY3RgLCBgaXNSZWdFeHBgLFxuICAgICAqIGBpc1NhZmVJbnRlZ2VyYCwgYGlzU2V0YCwgYGlzU3RyaW5nYCwgYGlzVW5kZWZpbmVkYCwgYGlzVHlwZWRBcnJheWAsXG4gICAgICogYGlzV2Vha01hcGAsIGBpc1dlYWtTZXRgLCBgam9pbmAsIGBrZWJhYkNhc2VgLCBgbGFzdGAsIGBsYXN0SW5kZXhPZmAsXG4gICAgICogYGxvd2VyQ2FzZWAsIGBsb3dlckZpcnN0YCwgYGx0YCwgYGx0ZWAsIGBtYXhgLCBgbWF4QnlgLCBgbWVhbmAsIGBtZWFuQnlgLFxuICAgICAqIGBtaW5gLCBgbWluQnlgLCBgbXVsdGlwbHlgLCBgbm9Db25mbGljdGAsIGBub29wYCwgYG5vd2AsIGBudGhgLCBgcGFkYCxcbiAgICAgKiBgcGFkRW5kYCwgYHBhZFN0YXJ0YCwgYHBhcnNlSW50YCwgYHBvcGAsIGByYW5kb21gLCBgcmVkdWNlYCwgYHJlZHVjZVJpZ2h0YCxcbiAgICAgKiBgcmVwZWF0YCwgYHJlc3VsdGAsIGByb3VuZGAsIGBydW5JbkNvbnRleHRgLCBgc2FtcGxlYCwgYHNoaWZ0YCwgYHNpemVgLFxuICAgICAqIGBzbmFrZUNhc2VgLCBgc29tZWAsIGBzb3J0ZWRJbmRleGAsIGBzb3J0ZWRJbmRleEJ5YCwgYHNvcnRlZExhc3RJbmRleGAsXG4gICAgICogYHNvcnRlZExhc3RJbmRleEJ5YCwgYHN0YXJ0Q2FzZWAsIGBzdGFydHNXaXRoYCwgYHN0dWJBcnJheWAsIGBzdHViRmFsc2VgLFxuICAgICAqIGBzdHViT2JqZWN0YCwgYHN0dWJTdHJpbmdgLCBgc3R1YlRydWVgLCBgc3VidHJhY3RgLCBgc3VtYCwgYHN1bUJ5YCxcbiAgICAgKiBgdGVtcGxhdGVgLCBgdGltZXNgLCBgdG9GaW5pdGVgLCBgdG9JbnRlZ2VyYCwgYHRvSlNPTmAsIGB0b0xlbmd0aGAsXG4gICAgICogYHRvTG93ZXJgLCBgdG9OdW1iZXJgLCBgdG9TYWZlSW50ZWdlcmAsIGB0b1N0cmluZ2AsIGB0b1VwcGVyYCwgYHRyaW1gLFxuICAgICAqIGB0cmltRW5kYCwgYHRyaW1TdGFydGAsIGB0cnVuY2F0ZWAsIGB1bmVzY2FwZWAsIGB1bmlxdWVJZGAsIGB1cHBlckNhc2VgLFxuICAgICAqIGB1cHBlckZpcnN0YCwgYHZhbHVlYCwgYW5kIGB3b3Jkc2BcbiAgICAgKlxuICAgICAqIEBuYW1lIF9cbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcCBpbiBhIGBsb2Rhc2hgIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMiwgM10pO1xuICAgICAqXG4gICAgICogLy8gUmV0dXJucyBhbiB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogd3JhcHBlZC5yZWR1Y2UoXy5hZGQpO1xuICAgICAqIC8vID0+IDZcbiAgICAgKlxuICAgICAqIC8vIFJldHVybnMgYSB3cmFwcGVkIHZhbHVlLlxuICAgICAqIHZhciBzcXVhcmVzID0gd3JhcHBlZC5tYXAoc3F1YXJlKTtcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShzcXVhcmVzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KHNxdWFyZXMudmFsdWUoKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxvZGFzaCh2YWx1ZSkge1xuICAgICAgaWYgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgIWlzQXJyYXkodmFsdWUpICYmICEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTG9kYXNoV3JhcHBlcikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ19fd3JhcHBlZF9fJykpIHtcbiAgICAgICAgICByZXR1cm4gd3JhcHBlckNsb25lKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXNzaWduaW5nXG4gICAgICogcHJvcGVydGllcyB0byB0aGUgY3JlYXRlZCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90byBUaGUgb2JqZWN0IHRvIGluaGVyaXQgZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIHZhciBiYXNlQ3JlYXRlID0gKGZ1bmN0aW9uKCkge1xuICAgICAgZnVuY3Rpb24gb2JqZWN0KCkge31cbiAgICAgIHJldHVybiBmdW5jdGlvbihwcm90bykge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KHByb3RvKSkge1xuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2JqZWN0Q3JlYXRlKSB7XG4gICAgICAgICAgcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0LnByb3RvdHlwZSA9IHByb3RvO1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IG9iamVjdDtcbiAgICAgICAgb2JqZWN0LnByb3RvdHlwZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdW5jdGlvbiB3aG9zZSBwcm90b3R5cGUgY2hhaW4gc2VxdWVuY2Ugd3JhcHBlcnMgaW5oZXJpdCBmcm9tLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTG9kYXNoKCkge1xuICAgICAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBjb25zdHJ1Y3RvciBmb3IgY3JlYXRpbmcgYGxvZGFzaGAgd3JhcHBlciBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NoYWluQWxsXSBFbmFibGUgZXhwbGljaXQgbWV0aG9kIGNoYWluIHNlcXVlbmNlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMb2Rhc2hXcmFwcGVyKHZhbHVlLCBjaGFpbkFsbCkge1xuICAgICAgdGhpcy5fX3dyYXBwZWRfXyA9IHZhbHVlO1xuICAgICAgdGhpcy5fX2FjdGlvbnNfXyA9IFtdO1xuICAgICAgdGhpcy5fX2NoYWluX18gPSAhIWNoYWluQWxsO1xuICAgICAgdGhpcy5fX2luZGV4X18gPSAwO1xuICAgICAgdGhpcy5fX3ZhbHVlc19fID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoZSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzIHVzZWQgYnkgbG9kYXNoIGFyZSBsaWtlIHRob3NlIGluXG4gICAgICogZW1iZWRkZWQgUnVieSAoRVJCKSBhcyB3ZWxsIGFzIEVTMjAxNSB0ZW1wbGF0ZSBzdHJpbmdzLiBDaGFuZ2UgdGhlXG4gICAgICogZm9sbG93aW5nIHRlbXBsYXRlIHNldHRpbmdzIHRvIHVzZSBhbHRlcm5hdGl2ZSBkZWxpbWl0ZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cbiAgICBsb2Rhc2gudGVtcGxhdGVTZXR0aW5ncyA9IHtcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGRldGVjdCBgZGF0YWAgcHJvcGVydHkgdmFsdWVzIHRvIGJlIEhUTUwtZXNjYXBlZC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7UmVnRXhwfVxuICAgICAgICovXG4gICAgICAnZXNjYXBlJzogcmVFc2NhcGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgY29kZSB0byBiZSBldmFsdWF0ZWQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2V2YWx1YXRlJzogcmVFdmFsdWF0ZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGRldGVjdCBgZGF0YWAgcHJvcGVydHkgdmFsdWVzIHRvIGluamVjdC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7UmVnRXhwfVxuICAgICAgICovXG4gICAgICAnaW50ZXJwb2xhdGUnOiByZUludGVycG9sYXRlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gcmVmZXJlbmNlIHRoZSBkYXRhIG9iamVjdCBpbiB0aGUgdGVtcGxhdGUgdGV4dC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICovXG4gICAgICAndmFyaWFibGUnOiAnJyxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGltcG9ydCB2YXJpYWJsZXMgaW50byB0aGUgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge09iamVjdH1cbiAgICAgICAqL1xuICAgICAgJ2ltcG9ydHMnOiB7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5ncy5pbXBvcnRzXG4gICAgICAgICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICAgICAgICovXG4gICAgICAgICdfJzogbG9kYXNoXG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEVuc3VyZSB3cmFwcGVycyBhcmUgaW5zdGFuY2VzIG9mIGBiYXNlTG9kYXNoYC5cbiAgICBsb2Rhc2gucHJvdG90eXBlID0gYmFzZUxvZGFzaC5wcm90b3R5cGU7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGxvZGFzaDtcblxuICAgIExvZGFzaFdyYXBwZXIucHJvdG90eXBlID0gYmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7XG4gICAgTG9kYXNoV3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMb2Rhc2hXcmFwcGVyO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGxhenkgd3JhcHBlciBvYmplY3Qgd2hpY2ggd3JhcHMgYHZhbHVlYCB0byBlbmFibGUgbGF6eSBldmFsdWF0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIExhenlXcmFwcGVyKHZhbHVlKSB7XG4gICAgICB0aGlzLl9fd3JhcHBlZF9fID0gdmFsdWU7XG4gICAgICB0aGlzLl9fYWN0aW9uc19fID0gW107XG4gICAgICB0aGlzLl9fZGlyX18gPSAxO1xuICAgICAgdGhpcy5fX2ZpbHRlcmVkX18gPSBmYWxzZTtcbiAgICAgIHRoaXMuX19pdGVyYXRlZXNfXyA9IFtdO1xuICAgICAgdGhpcy5fX3Rha2VDb3VudF9fID0gTUFYX0FSUkFZX0xFTkdUSDtcbiAgICAgIHRoaXMuX192aWV3c19fID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBsYXp5IHdyYXBwZXIgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbG9uZVxuICAgICAqIEBtZW1iZXJPZiBMYXp5V3JhcHBlclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBgTGF6eVdyYXBwZXJgIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXp5Q2xvbmUoKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IExhenlXcmFwcGVyKHRoaXMuX193cmFwcGVkX18pO1xuICAgICAgcmVzdWx0Ll9fYWN0aW9uc19fID0gY29weUFycmF5KHRoaXMuX19hY3Rpb25zX18pO1xuICAgICAgcmVzdWx0Ll9fZGlyX18gPSB0aGlzLl9fZGlyX187XG4gICAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gdGhpcy5fX2ZpbHRlcmVkX187XG4gICAgICByZXN1bHQuX19pdGVyYXRlZXNfXyA9IGNvcHlBcnJheSh0aGlzLl9faXRlcmF0ZWVzX18pO1xuICAgICAgcmVzdWx0Ll9fdGFrZUNvdW50X18gPSB0aGlzLl9fdGFrZUNvdW50X187XG4gICAgICByZXN1bHQuX192aWV3c19fID0gY29weUFycmF5KHRoaXMuX192aWV3c19fKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2ZXJzZXMgdGhlIGRpcmVjdGlvbiBvZiBsYXp5IGl0ZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgcmV2ZXJzZVxuICAgICAqIEBtZW1iZXJPZiBMYXp5V3JhcHBlclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyByZXZlcnNlZCBgTGF6eVdyYXBwZXJgIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXp5UmV2ZXJzZSgpIHtcbiAgICAgIGlmICh0aGlzLl9fZmlsdGVyZWRfXykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgICByZXN1bHQuX19kaXJfXyA9IC0xO1xuICAgICAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgcmVzdWx0Ll9fZGlyX18gKj0gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIHRoZSB1bndyYXBwZWQgdmFsdWUgZnJvbSBpdHMgbGF6eSB3cmFwcGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSB2YWx1ZVxuICAgICAqIEBtZW1iZXJPZiBMYXp5V3JhcHBlclxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eVZhbHVlKCkge1xuICAgICAgdmFyIGFycmF5ID0gdGhpcy5fX3dyYXBwZWRfXy52YWx1ZSgpLFxuICAgICAgICAgIGRpciA9IHRoaXMuX19kaXJfXyxcbiAgICAgICAgICBpc0FyciA9IGlzQXJyYXkoYXJyYXkpLFxuICAgICAgICAgIGlzUmlnaHQgPSBkaXIgPCAwLFxuICAgICAgICAgIGFyckxlbmd0aCA9IGlzQXJyID8gYXJyYXkubGVuZ3RoIDogMCxcbiAgICAgICAgICB2aWV3ID0gZ2V0VmlldygwLCBhcnJMZW5ndGgsIHRoaXMuX192aWV3c19fKSxcbiAgICAgICAgICBzdGFydCA9IHZpZXcuc3RhcnQsXG4gICAgICAgICAgZW5kID0gdmlldy5lbmQsXG4gICAgICAgICAgbGVuZ3RoID0gZW5kIC0gc3RhcnQsXG4gICAgICAgICAgaW5kZXggPSBpc1JpZ2h0ID8gZW5kIDogKHN0YXJ0IC0gMSksXG4gICAgICAgICAgaXRlcmF0ZWVzID0gdGhpcy5fX2l0ZXJhdGVlc19fLFxuICAgICAgICAgIGl0ZXJMZW5ndGggPSBpdGVyYXRlZXMubGVuZ3RoLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICB0YWtlQ291bnQgPSBuYXRpdmVNaW4obGVuZ3RoLCB0aGlzLl9fdGFrZUNvdW50X18pO1xuXG4gICAgICBpZiAoIWlzQXJyIHx8ICghaXNSaWdodCAmJiBhcnJMZW5ndGggPT0gbGVuZ3RoICYmIHRha2VDb3VudCA9PSBsZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBiYXNlV3JhcHBlclZhbHVlKGFycmF5LCB0aGlzLl9fYWN0aW9uc19fKTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBbXTtcblxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAobGVuZ3RoLS0gJiYgcmVzSW5kZXggPCB0YWtlQ291bnQpIHtcbiAgICAgICAgaW5kZXggKz0gZGlyO1xuXG4gICAgICAgIHZhciBpdGVySW5kZXggPSAtMSxcbiAgICAgICAgICAgIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgICAgIHdoaWxlICgrK2l0ZXJJbmRleCA8IGl0ZXJMZW5ndGgpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9IGl0ZXJhdGVlc1tpdGVySW5kZXhdLFxuICAgICAgICAgICAgICBpdGVyYXRlZSA9IGRhdGEuaXRlcmF0ZWUsXG4gICAgICAgICAgICAgIHR5cGUgPSBkYXRhLnR5cGUsXG4gICAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgICAgICAgaWYgKHR5cGUgPT0gTEFaWV9NQVBfRkxBRykge1xuICAgICAgICAgICAgdmFsdWUgPSBjb21wdXRlZDtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFjb21wdXRlZCkge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT0gTEFaWV9GSUxURVJfRkxBRykge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGBMYXp5V3JhcHBlcmAgaXMgYW4gaW5zdGFuY2Ugb2YgYGJhc2VMb2Rhc2hgLlxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZSA9IGJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpO1xuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExhenlXcmFwcGVyO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgaGFzaC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xlYXJcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGhhc2guXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGhhc2ggVGhlIGhhc2ggdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoRGVsZXRlKGtleSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuaGFzKGtleSkgJiYgZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTtcbiAgICAgIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaGFzaCB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hHZXQoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gICAgICBpZiAobmF0aXZlQ3JlYXRlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBkYXRhW2tleV07XG4gICAgICAgIHJldHVybiByZXN1bHQgPT09IEhBU0hfVU5ERUZJTkVEID8gdW5kZWZpbmVkIDogcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSA/IGRhdGFba2V5XSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBoYXNoIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gICAgICByZXR1cm4gbmF0aXZlQ3JlYXRlID8gKGRhdGFba2V5XSAhPT0gdW5kZWZpbmVkKSA6IGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBoYXNoIGBrZXlgIHRvIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNldFxuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGhhc2ggaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaFNldChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gICAgICB0aGlzLnNpemUgKz0gdGhpcy5oYXMoa2V5KSA/IDAgOiAxO1xuICAgICAgZGF0YVtrZXldID0gKG5hdGl2ZUNyZWF0ZSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSA/IEhBU0hfVU5ERUZJTkVEIDogdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgSGFzaGAuXG4gICAgSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG4gICAgSGFzaC5wcm90b3R5cGVbJ2RlbGV0ZSddID0gaGFzaERlbGV0ZTtcbiAgICBIYXNoLnByb3RvdHlwZS5nZXQgPSBoYXNoR2V0O1xuICAgIEhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG4gICAgSGFzaC5wcm90b3R5cGUuc2V0ID0gaGFzaFNldDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gbGlzdCBjYWNoZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxpc3RDYWNoZUNsZWFyKCkge1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IFtdO1xuICAgICAgdGhpcy5zaXplID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZGVsZXRlXG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgbGFzdEluZGV4ID0gZGF0YS5sZW5ndGggLSAxO1xuICAgICAgaWYgKGluZGV4ID09IGxhc3RJbmRleCkge1xuICAgICAgICBkYXRhLnBvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3BsaWNlLmNhbGwoZGF0YSwgaW5kZXgsIDEpO1xuICAgICAgfVxuICAgICAgLS10aGlzLnNpemU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZ2V0XG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVHZXQoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICAgICAgcmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IGRhdGFbaW5kZXhdWzFdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KSB7XG4gICAgICByZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sIGtleSkgPiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNldFxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbGlzdCBjYWNoZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgKyt0aGlzLnNpemU7XG4gICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YVtpbmRleF1bMV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBMaXN0Q2FjaGVgLlxuICAgIExpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBsaXN0Q2FjaGVDbGVhcjtcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IGxpc3RDYWNoZURlbGV0ZTtcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmdldCA9IGxpc3RDYWNoZUdldDtcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmhhcyA9IGxpc3RDYWNoZUhhcztcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IGxpc3RDYWNoZVNldDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBtYXAgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIE1hcENhY2hlXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpIHtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgICB0aGlzLl9fZGF0YV9fID0ge1xuICAgICAgICAnaGFzaCc6IG5ldyBIYXNoLFxuICAgICAgICAnbWFwJzogbmV3IChNYXAgfHwgTGlzdENhY2hlKSxcbiAgICAgICAgJ3N0cmluZyc6IG5ldyBIYXNoXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZURlbGV0ZShrZXkpIHtcbiAgICAgIHZhciByZXN1bHQgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XG4gICAgICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1hcCB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpIHtcbiAgICAgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgbWFwIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkpIHtcbiAgICAgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuaGFzKGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWFwIGBrZXlgIHRvIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNldFxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSksXG4gICAgICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuICAgICAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBNYXBDYWNoZWAuXG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gbWFwQ2FjaGVDbGVhcjtcbiAgICBNYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbWFwQ2FjaGVEZWxldGU7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLmdldCA9IG1hcENhY2hlR2V0O1xuICAgIE1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBtYXBDYWNoZUhhcztcbiAgICBNYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwQ2FjaGVTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIHVuaXF1ZSB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gU2V0Q2FjaGUodmFsdWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSB2YWx1ZXMgPT0gbnVsbCA/IDAgOiB2YWx1ZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdGhpcy5hZGQodmFsdWVzW2luZGV4XSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBgdmFsdWVgIHRvIHRoZSBhcnJheSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgYWRkXG4gICAgICogQG1lbWJlck9mIFNldENhY2hlXG4gICAgICogQGFsaWFzIHB1c2hcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjYWNoZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRDYWNoZUFkZCh2YWx1ZSkge1xuICAgICAgdGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsIEhBU0hfVU5ERUZJTkVEKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIHRoZSBhcnJheSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIFNldENhY2hlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0Q2FjaGVIYXModmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYFNldENhY2hlYC5cbiAgICBTZXRDYWNoZS5wcm90b3R5cGUuYWRkID0gU2V0Q2FjaGUucHJvdG90eXBlLnB1c2ggPSBzZXRDYWNoZUFkZDtcbiAgICBTZXRDYWNoZS5wcm90b3R5cGUuaGFzID0gc2V0Q2FjaGVIYXM7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc3RhY2sgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gU3RhY2soZW50cmllcykge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZShlbnRyaWVzKTtcbiAgICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xlYXJcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja0NsZWFyKCkge1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGU7XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZGVsZXRlXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIHJlc3VsdCA9IGRhdGFbJ2RlbGV0ZSddKGtleSk7XG5cbiAgICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3RhY2sgdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tHZXQoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQoa2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBzdGFjayB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tIYXMoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzdGFjayBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgc3RhY2sgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBMaXN0Q2FjaGUpIHtcbiAgICAgICAgdmFyIHBhaXJzID0gZGF0YS5fX2RhdGFfXztcbiAgICAgICAgaWYgKCFNYXAgfHwgKHBhaXJzLmxlbmd0aCA8IExBUkdFX0FSUkFZX1NJWkUgLSAxKSkge1xuICAgICAgICAgIHBhaXJzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgICAgICB0aGlzLnNpemUgPSArK2RhdGEuc2l6ZTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZShwYWlycyk7XG4gICAgICB9XG4gICAgICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBTdGFja2AuXG4gICAgU3RhY2sucHJvdG90eXBlLmNsZWFyID0gc3RhY2tDbGVhcjtcbiAgICBTdGFjay5wcm90b3R5cGVbJ2RlbGV0ZSddID0gc3RhY2tEZWxldGU7XG4gICAgU3RhY2sucHJvdG90eXBlLmdldCA9IHN0YWNrR2V0O1xuICAgIFN0YWNrLnByb3RvdHlwZS5oYXMgPSBzdGFja0hhcztcbiAgICBTdGFjay5wcm90b3R5cGUuc2V0ID0gc3RhY2tTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5oZXJpdGVkIFNwZWNpZnkgcmV0dXJuaW5nIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5TGlrZUtleXModmFsdWUsIGluaGVyaXRlZCkge1xuICAgICAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSksXG4gICAgICAgICAgaXNBcmcgPSAhaXNBcnIgJiYgaXNBcmd1bWVudHModmFsdWUpLFxuICAgICAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiAhaXNBcmcgJiYgaXNCdWZmZXIodmFsdWUpLFxuICAgICAgICAgIGlzVHlwZSA9ICFpc0FyciAmJiAhaXNBcmcgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkodmFsdWUpLFxuICAgICAgICAgIHNraXBJbmRleGVzID0gaXNBcnIgfHwgaXNBcmcgfHwgaXNCdWZmIHx8IGlzVHlwZSxcbiAgICAgICAgICByZXN1bHQgPSBza2lwSW5kZXhlcyA/IGJhc2VUaW1lcyh2YWx1ZS5sZW5ndGgsIFN0cmluZykgOiBbXSxcbiAgICAgICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgaWYgKChpbmhlcml0ZWQgfHwgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkgJiZcbiAgICAgICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKFxuICAgICAgICAgICAgICAgLy8gU2FmYXJpIDkgaGFzIGVudW1lcmFibGUgYGFyZ3VtZW50cy5sZW5ndGhgIGluIHN0cmljdCBtb2RlLlxuICAgICAgICAgICAgICAga2V5ID09ICdsZW5ndGgnIHx8XG4gICAgICAgICAgICAgICAvLyBOb2RlLmpzIDAuMTAgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gYnVmZmVycy5cbiAgICAgICAgICAgICAgIChpc0J1ZmYgJiYgKGtleSA9PSAnb2Zmc2V0JyB8fCBrZXkgPT0gJ3BhcmVudCcpKSB8fFxuICAgICAgICAgICAgICAgLy8gUGhhbnRvbUpTIDIgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gdHlwZWQgYXJyYXlzLlxuICAgICAgICAgICAgICAgKGlzVHlwZSAmJiAoa2V5ID09ICdidWZmZXInIHx8IGtleSA9PSAnYnl0ZUxlbmd0aCcgfHwga2V5ID09ICdieXRlT2Zmc2V0JykpIHx8XG4gICAgICAgICAgICAgICAvLyBTa2lwIGluZGV4IHByb3BlcnRpZXMuXG4gICAgICAgICAgICAgICBpc0luZGV4KGtleSwgbGVuZ3RoKVxuICAgICAgICAgICAgKSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zYW1wbGVgIGZvciBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5U2FtcGxlKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGFycmF5W2Jhc2VSYW5kb20oMCwgbGVuZ3RoIC0gMSldIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zYW1wbGVTaXplYCBmb3IgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5U2FtcGxlU2l6ZShhcnJheSwgbikge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGNvcHlBcnJheShhcnJheSksIGJhc2VDbGFtcChuLCAwLCBhcnJheS5sZW5ndGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2h1ZmZsZWAgZm9yIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNodWZmbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJyYXlTaHVmZmxlKGFycmF5KSB7XG4gICAgICByZXR1cm4gc2h1ZmZsZVNlbGYoY29weUFycmF5KGFycmF5KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhc3NpZ25WYWx1ZWAgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCBhc3NpZ25cbiAgICAgKiBgdW5kZWZpbmVkYCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gICAgICBpZiAoKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWVxKG9iamVjdFtrZXldLCB2YWx1ZSkpIHx8XG4gICAgICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXNzaWducyBgdmFsdWVgIHRvIGBrZXlgIG9mIGBvYmplY3RgIGlmIHRoZSBleGlzdGluZyB2YWx1ZSBpcyBub3QgZXF1aXZhbGVudFxuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldO1xuICAgICAgaWYgKCEoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgZXEob2JqVmFsdWUsIHZhbHVlKSkgfHxcbiAgICAgICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSkge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYGtleWAgaXMgZm91bmQgaW4gYGFycmF5YCBvZiBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0ga2V5IFRoZSBrZXkgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGlmIChlcShhcnJheVtsZW5ndGhdWzBdLCBrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFnZ3JlZ2F0ZXMgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gIG9uIGBhY2N1bXVsYXRvcmAgd2l0aCBrZXlzIHRyYW5zZm9ybWVkXG4gICAgICogYnkgYGl0ZXJhdGVlYCBhbmQgdmFsdWVzIHNldCBieSBgc2V0dGVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgYWdncmVnYXRlZCBvYmplY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFnZ3JlZ2F0b3IoY29sbGVjdGlvbiwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaXRlcmF0ZWUodmFsdWUpLCBjb2xsZWN0aW9uKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gICAgICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQXNzaWduKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXNzaWduSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICAgICAqIG9yIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFzc2lnbkluKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYXNzaWduVmFsdWVgIGFuZCBgYXNzaWduTWVyZ2VWYWx1ZWAgd2l0aG91dFxuICAgICAqIHZhbHVlIGNoZWNrcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKGtleSA9PSAnX19wcm90b19fJyAmJiBkZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgICBkZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwge1xuICAgICAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgICAgICdlbnVtZXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgICAndmFsdWUnOiB2YWx1ZSxcbiAgICAgICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hdGAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcGlja2VkIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBdChvYmplY3QsIHBhdGhzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKSxcbiAgICAgICAgICBza2lwID0gb2JqZWN0ID09IG51bGw7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBza2lwID8gdW5kZWZpbmVkIDogZ2V0KG9iamVjdCwgcGF0aHNbaW5kZXhdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xhbXBgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNsYW1wLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbG93ZXJdIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNsYW1wZWQgbnVtYmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDbGFtcChudW1iZXIsIGxvd2VyLCB1cHBlcikge1xuICAgICAgaWYgKG51bWJlciA9PT0gbnVtYmVyKSB7XG4gICAgICAgIGlmICh1cHBlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbnVtYmVyID0gbnVtYmVyIDw9IHVwcGVyID8gbnVtYmVyIDogdXBwZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvd2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBudW1iZXIgPSBudW1iZXIgPj0gbG93ZXIgPyBudW1iZXIgOiBsb3dlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jbG9uZWAgYW5kIGBfLmNsb25lRGVlcGAgd2hpY2ggdHJhY2tzXG4gICAgICogdHJhdmVyc2VkIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAgICAgKiAgMSAtIERlZXAgY2xvbmVcbiAgICAgKiAgMiAtIEZsYXR0ZW4gaW5oZXJpdGVkIHByb3BlcnRpZXNcbiAgICAgKiAgNCAtIENsb25lIHN5bWJvbHNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSBUaGUga2V5IG9mIGB2YWx1ZWAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBwYXJlbnQgb2JqZWN0IG9mIGB2YWx1ZWAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGFuZCB0aGVpciBjbG9uZSBjb3VudGVycGFydHMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ2xvbmUodmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgb2JqZWN0LCBzdGFjaykge1xuICAgICAgdmFyIHJlc3VsdCxcbiAgICAgICAgICBpc0RlZXAgPSBiaXRtYXNrICYgQ0xPTkVfREVFUF9GTEFHLFxuICAgICAgICAgIGlzRmxhdCA9IGJpdG1hc2sgJiBDTE9ORV9GTEFUX0ZMQUcsXG4gICAgICAgICAgaXNGdWxsID0gYml0bWFzayAmIENMT05FX1NZTUJPTFNfRkxBRztcblxuICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgcmVzdWx0ID0gb2JqZWN0ID8gY3VzdG9taXplcih2YWx1ZSwga2V5LCBvYmplY3QsIHN0YWNrKSA6IGN1c3RvbWl6ZXIodmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKTtcbiAgICAgIGlmIChpc0Fycikge1xuICAgICAgICByZXN1bHQgPSBpbml0Q2xvbmVBcnJheSh2YWx1ZSk7XG4gICAgICAgIGlmICghaXNEZWVwKSB7XG4gICAgICAgICAgcmV0dXJuIGNvcHlBcnJheSh2YWx1ZSwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSksXG4gICAgICAgICAgICBpc0Z1bmMgPSB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnO1xuXG4gICAgICAgIGlmIChpc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gY2xvbmVCdWZmZXIodmFsdWUsIGlzRGVlcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhZyA9PSBvYmplY3RUYWcgfHwgdGFnID09IGFyZ3NUYWcgfHwgKGlzRnVuYyAmJiAhb2JqZWN0KSkge1xuICAgICAgICAgIHJlc3VsdCA9IChpc0ZsYXQgfHwgaXNGdW5jKSA/IHt9IDogaW5pdENsb25lT2JqZWN0KHZhbHVlKTtcbiAgICAgICAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgICAgICAgcmV0dXJuIGlzRmxhdFxuICAgICAgICAgICAgICA/IGNvcHlTeW1ib2xzSW4odmFsdWUsIGJhc2VBc3NpZ25JbihyZXN1bHQsIHZhbHVlKSlcbiAgICAgICAgICAgICAgOiBjb3B5U3ltYm9scyh2YWx1ZSwgYmFzZUFzc2lnbihyZXN1bHQsIHZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghY2xvbmVhYmxlVGFnc1t0YWddKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0ID8gdmFsdWUgOiB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0ID0gaW5pdENsb25lQnlUYWcodmFsdWUsIHRhZywgaXNEZWVwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybiBpdHMgY29ycmVzcG9uZGluZyBjbG9uZS5cbiAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldCh2YWx1ZSk7XG4gICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gc3RhY2tlZDtcbiAgICAgIH1cbiAgICAgIHN0YWNrLnNldCh2YWx1ZSwgcmVzdWx0KTtcblxuICAgICAgaWYgKGlzU2V0KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlKSB7XG4gICAgICAgICAgcmVzdWx0LmFkZChiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN1YlZhbHVlLCB2YWx1ZSwgc3RhY2spKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGlzTWFwKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICAgICAgICByZXN1bHQuc2V0KGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFjaykpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGtleXNGdW5jID0gaXNGdWxsXG4gICAgICAgID8gKGlzRmxhdCA/IGdldEFsbEtleXNJbiA6IGdldEFsbEtleXMpXG4gICAgICAgIDogKGlzRmxhdCA/IGtleXNJbiA6IGtleXMpO1xuXG4gICAgICB2YXIgcHJvcHMgPSBpc0FyciA/IHVuZGVmaW5lZCA6IGtleXNGdW5jKHZhbHVlKTtcbiAgICAgIGFycmF5RWFjaChwcm9wcyB8fCB2YWx1ZSwgZnVuY3Rpb24oc3ViVmFsdWUsIGtleSkge1xuICAgICAgICBpZiAocHJvcHMpIHtcbiAgICAgICAgICBrZXkgPSBzdWJWYWx1ZTtcbiAgICAgICAgICBzdWJWYWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgcG9wdWxhdGUgY2xvbmUgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgYXNzaWduVmFsdWUocmVzdWx0LCBrZXksIGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jb25mb3Jtc2Agd2hpY2ggZG9lc24ndCBjbG9uZSBgc291cmNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDb25mb3Jtcyhzb3VyY2UpIHtcbiAgICAgIHZhciBwcm9wcyA9IGtleXMoc291cmNlKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VDb25mb3Jtc1RvKG9iamVjdCwgc291cmNlLCBwcm9wcyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNvbmZvcm1zVG9gIHdoaWNoIGFjY2VwdHMgYHByb3BzYCB0byBjaGVjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgY29uZm9ybXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSwgcHJvcHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICFsZW5ndGg7XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbbGVuZ3RoXSxcbiAgICAgICAgICAgIHByZWRpY2F0ZSA9IHNvdXJjZVtrZXldLFxuICAgICAgICAgICAgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgICBpZiAoKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkgfHwgIXByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmRlbGF5YCBhbmQgYF8uZGVmZXJgIHdoaWNoIGFjY2VwdHMgYGFyZ3NgXG4gICAgICogdG8gcHJvdmlkZSB0byBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIHByb3ZpZGUgdG8gYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ8T2JqZWN0fSBSZXR1cm5zIHRoZSB0aW1lciBpZCBvciB0aW1lb3V0IG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRGVsYXkoZnVuYywgd2FpdCwgYXJncykge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTsgfSwgd2FpdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRpZmZlcmVuY2VgIHdpdGhvdXQgc3VwcG9ydFxuICAgICAqIGZvciBleGNsdWRpbmcgbXVsdGlwbGUgYXJyYXlzIG9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZURpZmZlcmVuY2UoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBpc0NvbW1vbiA9IHRydWUsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICAgIHZhbHVlc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGg7XG5cbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoaXRlcmF0ZWUpIHtcbiAgICAgICAgdmFsdWVzID0gYXJyYXlNYXAodmFsdWVzLCBiYXNlVW5hcnkoaXRlcmF0ZWUpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb21wYXJhdG9yKSB7XG4gICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBlbHNlIGlmICh2YWx1ZXMubGVuZ3RoID49IExBUkdFX0FSUkFZX1NJWkUpIHtcbiAgICAgICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzID0gbmV3IFNldENhY2hlKHZhbHVlcyk7XG4gICAgICB9XG4gICAgICBvdXRlcjpcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPT0gbnVsbCA/IHZhbHVlIDogaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgdmFyIHZhbHVlc0luZGV4ID0gdmFsdWVzTGVuZ3RoO1xuICAgICAgICAgIHdoaWxlICh2YWx1ZXNJbmRleC0tKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVzW3ZhbHVlc0luZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaW5jbHVkZXModmFsdWVzLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yRWFjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUVhY2ggPSBjcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hSaWdodGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUVhY2hSaWdodCA9IGNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd25SaWdodCwgdHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5ldmVyeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VFdmVyeShjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0cnVlO1xuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJlc3VsdCA9ICEhcHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLm1heGAgYW5kIGBfLm1pbmAgd2hpY2ggYWNjZXB0cyBhXG4gICAgICogYGNvbXBhcmF0b3JgIHRvIGRldGVybWluZSB0aGUgZXh0cmVtdW0gdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIHVzZWQgdG8gY29tcGFyZSB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VFeHRyZW11bShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY3VycmVudCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICBpZiAoY3VycmVudCAhPSBudWxsICYmIChjb21wdXRlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gKGN1cnJlbnQgPT09IGN1cnJlbnQgJiYgIWlzU3ltYm9sKGN1cnJlbnQpKVxuICAgICAgICAgICAgICA6IGNvbXBhcmF0b3IoY3VycmVudCwgY29tcHV0ZWQpXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgdmFyIGNvbXB1dGVkID0gY3VycmVudCxcbiAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmlsbGAgd2l0aG91dCBhbiBpdGVyYXRlZSBjYWxsIGd1YXJkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmlsbC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBmaWxsIGBhcnJheWAgd2l0aC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBzdGFydCA9IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLXN0YXJ0ID4gbGVuZ3RoID8gMCA6IChsZW5ndGggKyBzdGFydCk7XG4gICAgICB9XG4gICAgICBlbmQgPSAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gbGVuZ3RoKSA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpO1xuICAgICAgaWYgKGVuZCA8IDApIHtcbiAgICAgICAgZW5kICs9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGVuZCA9IHN0YXJ0ID4gZW5kID8gMCA6IHRvTGVuZ3RoKGVuZCk7XG4gICAgICB3aGlsZSAoc3RhcnQgPCBlbmQpIHtcbiAgICAgICAgYXJyYXlbc3RhcnQrK10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maWx0ZXJgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGaWx0ZXIoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmxhdHRlbmAgd2l0aCBzdXBwb3J0IGZvciByZXN0cmljdGluZyBmbGF0dGVuaW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVwdGggVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ByZWRpY2F0ZT1pc0ZsYXR0ZW5hYmxlXSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3RyaWN0XSBSZXN0cmljdCB0byB2YWx1ZXMgdGhhdCBwYXNzIGBwcmVkaWNhdGVgIGNoZWNrcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0PVtdXSBUaGUgaW5pdGlhbCByZXN1bHQgdmFsdWUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHByZWRpY2F0ZSB8fCAocHJlZGljYXRlID0gaXNGbGF0dGVuYWJsZSk7XG4gICAgICByZXN1bHQgfHwgKHJlc3VsdCA9IFtdKTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAoZGVwdGggPiAwICYmIHByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICBpZiAoZGVwdGggPiAxKSB7XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBmbGF0dGVuIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICAgICAgYmFzZUZsYXR0ZW4odmFsdWUsIGRlcHRoIC0gMSwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJyYXlQdXNoKHJlc3VsdCwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghaXNTdHJpY3QpIHtcbiAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYmFzZUZvck93bmAgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgb2JqZWN0YFxuICAgICAqIHByb3BlcnRpZXMgcmV0dXJuZWQgYnkgYGtleXNGdW5jYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LlxuICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUZvciA9IGNyZWF0ZUJhc2VGb3IoKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYmFzZUZvcmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzXG4gICAgICogaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIHZhciBiYXNlRm9yUmlnaHQgPSBjcmVhdGVCYXNlRm9yKHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yT3duYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yKG9iamVjdCwgaXRlcmF0ZWUsIGtleXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93blJpZ2h0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGb3JPd25SaWdodChvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3JSaWdodChvYmplY3QsIGl0ZXJhdGVlLCBrZXlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mdW5jdGlvbnNgIHdoaWNoIGNyZWF0ZXMgYW4gYXJyYXkgb2ZcbiAgICAgKiBgb2JqZWN0YCBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmaWx0ZXJlZCBmcm9tIGBwcm9wc2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBmaWx0ZXIuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRnVuY3Rpb25zKG9iamVjdCwgcHJvcHMpIHtcbiAgICAgIHJldHVybiBhcnJheUZpbHRlcihwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKG9iamVjdFtrZXldKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHZXQob2JqZWN0LCBwYXRoKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gMCxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKG9iamVjdCAhPSBudWxsICYmIGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIG9iamVjdCA9IG9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gKGluZGV4ICYmIGluZGV4ID09IGxlbmd0aCkgPyBvYmplY3QgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldEFsbEtleXNgIGFuZCBgZ2V0QWxsS2V5c0luYCB3aGljaCB1c2VzXG4gICAgICogYGtleXNGdW5jYCBhbmQgYHN5bWJvbHNGdW5jYCB0byBnZXQgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gICAgICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3ltYm9sc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0Z1bmMsIHN5bWJvbHNGdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ga2V5c0Z1bmMob2JqZWN0KTtcbiAgICAgIHJldHVybiBpc0FycmF5KG9iamVjdCkgPyByZXN1bHQgOiBhcnJheVB1c2gocmVzdWx0LCBzeW1ib2xzRnVuYyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgICAgIH1cbiAgICAgIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICAgICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmd0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHdCh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA+IG90aGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc2Agd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VIYXMob2JqZWN0LCBrZXkpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5oYXNJbmAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3QsIGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGtleSBpbiBPYmplY3Qob2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pblJhbmdlYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgbnVtYmVyYCBpcyBpbiB0aGUgcmFuZ2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSW5SYW5nZShudW1iZXIsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHJldHVybiBudW1iZXIgPj0gbmF0aXZlTWluKHN0YXJ0LCBlbmQpICYmIG51bWJlciA8IG5hdGl2ZU1heChzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCwgd2l0aG91dCBzdXBwb3J0XG4gICAgICogZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHRoYXQgYWNjZXB0cyBhbiBhcnJheSBvZiBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlzIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHNoYXJlZCB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUludGVyc2VjdGlvbihhcnJheXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5jbHVkZXMgPSBjb21wYXJhdG9yID8gYXJyYXlJbmNsdWRlc1dpdGggOiBhcnJheUluY2x1ZGVzLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5c1swXS5sZW5ndGgsXG4gICAgICAgICAgb3RoTGVuZ3RoID0gYXJyYXlzLmxlbmd0aCxcbiAgICAgICAgICBvdGhJbmRleCA9IG90aExlbmd0aCxcbiAgICAgICAgICBjYWNoZXMgPSBBcnJheShvdGhMZW5ndGgpLFxuICAgICAgICAgIG1heExlbmd0aCA9IEluZmluaXR5LFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICB3aGlsZSAob3RoSW5kZXgtLSkge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcnJheXNbb3RoSW5kZXhdO1xuICAgICAgICBpZiAob3RoSW5kZXggJiYgaXRlcmF0ZWUpIHtcbiAgICAgICAgICBhcnJheSA9IGFycmF5TWFwKGFycmF5LCBiYXNlVW5hcnkoaXRlcmF0ZWUpKTtcbiAgICAgICAgfVxuICAgICAgICBtYXhMZW5ndGggPSBuYXRpdmVNaW4oYXJyYXkubGVuZ3RoLCBtYXhMZW5ndGgpO1xuICAgICAgICBjYWNoZXNbb3RoSW5kZXhdID0gIWNvbXBhcmF0b3IgJiYgKGl0ZXJhdGVlIHx8IChsZW5ndGggPj0gMTIwICYmIGFycmF5Lmxlbmd0aCA+PSAxMjApKVxuICAgICAgICAgID8gbmV3IFNldENhY2hlKG90aEluZGV4ICYmIGFycmF5KVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgYXJyYXkgPSBhcnJheXNbMF07XG5cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHNlZW4gPSBjYWNoZXNbMF07XG5cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGggJiYgcmVzdWx0Lmxlbmd0aCA8IG1heExlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgICAgIGlmICghKHNlZW5cbiAgICAgICAgICAgICAgPyBjYWNoZUhhcyhzZWVuLCBjb21wdXRlZClcbiAgICAgICAgICAgICAgOiBpbmNsdWRlcyhyZXN1bHQsIGNvbXB1dGVkLCBjb21wYXJhdG9yKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIG90aEluZGV4ID0gb3RoTGVuZ3RoO1xuICAgICAgICAgIHdoaWxlICgtLW90aEluZGV4KSB7XG4gICAgICAgICAgICB2YXIgY2FjaGUgPSBjYWNoZXNbb3RoSW5kZXhdO1xuICAgICAgICAgICAgaWYgKCEoY2FjaGVcbiAgICAgICAgICAgICAgICAgID8gY2FjaGVIYXMoY2FjaGUsIGNvbXB1dGVkKVxuICAgICAgICAgICAgICAgICAgOiBpbmNsdWRlcyhhcnJheXNbb3RoSW5kZXhdLCBjb21wdXRlZCwgY29tcGFyYXRvcikpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vlbikge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmludmVydGAgYW5kIGBfLmludmVydEJ5YCB3aGljaCBpbnZlcnRzXG4gICAgICogYG9iamVjdGAgd2l0aCB2YWx1ZXMgdHJhbnNmb3JtZWQgYnkgYGl0ZXJhdGVlYCBhbmQgc2V0IGJ5IGBzZXR0ZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0gdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCBpbnZlcnRlZCBvYmplY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUludmVydGVyKG9iamVjdCwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCBpdGVyYXRlZSh2YWx1ZSksIGtleSwgb2JqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmludm9rZWAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogbWV0aG9kIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJbnZva2Uob2JqZWN0LCBwYXRoLCBhcmdzKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcbiAgICAgIG9iamVjdCA9IHBhcmVudChvYmplY3QsIHBhdGgpO1xuICAgICAgdmFyIGZ1bmMgPSBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IG9iamVjdFt0b0tleShsYXN0KHBhdGgpKV07XG4gICAgICByZXR1cm4gZnVuYyA9PSBudWxsID8gdW5kZWZpbmVkIDogYXBwbHkoZnVuYywgb2JqZWN0LCBhcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FyZ3VtZW50c2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNBcmd1bWVudHModmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGFyZ3NUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcnJheUJ1ZmZlcmAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5IGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0FycmF5QnVmZmVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcnJheUJ1ZmZlclRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0RhdGVgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGRhdGUgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzRGF0ZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gZGF0ZVRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0VxdWFsYCB3aGljaCBzdXBwb3J0cyBwYXJ0aWFsIGNvbXBhcmlzb25zXG4gICAgICogYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAgICAgKiAgMSAtIFVub3JkZXJlZCBjb21wYXJpc29uXG4gICAgICogIDIgLSBQYXJ0aWFsIGNvbXBhcmlzb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGB2YWx1ZWAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCBvdGhlciA9PSBudWxsIHx8ICghaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNPYmplY3RMaWtlKG90aGVyKSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgYmFzZUlzRXF1YWwsIHN0YWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzIHdoaWNoIHBlcmZvcm1zXG4gICAgICogZGVlcCBjb21wYXJpc29ucyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICAgICAqIHJlZmVyZW5jZXMgdG8gYmUgY29tcGFyZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBvYmpJc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgICAgICBvdGhJc0FyciA9IGlzQXJyYXkob3RoZXIpLFxuICAgICAgICAgIG9ialRhZyA9IG9iaklzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob2JqZWN0KSxcbiAgICAgICAgICBvdGhUYWcgPSBvdGhJc0FyciA/IGFycmF5VGFnIDogZ2V0VGFnKG90aGVyKTtcblxuICAgICAgb2JqVGFnID0gb2JqVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvYmpUYWc7XG4gICAgICBvdGhUYWcgPSBvdGhUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG90aFRhZztcblxuICAgICAgdmFyIG9iaklzT2JqID0gb2JqVGFnID09IG9iamVjdFRhZyxcbiAgICAgICAgICBvdGhJc09iaiA9IG90aFRhZyA9PSBvYmplY3RUYWcsXG4gICAgICAgICAgaXNTYW1lVGFnID0gb2JqVGFnID09IG90aFRhZztcblxuICAgICAgaWYgKGlzU2FtZVRhZyAmJiBpc0J1ZmZlcihvYmplY3QpKSB7XG4gICAgICAgIGlmICghaXNCdWZmZXIob3RoZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIG9iaklzQXJyID0gdHJ1ZTtcbiAgICAgICAgb2JqSXNPYmogPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1NhbWVUYWcgJiYgIW9iaklzT2JqKSB7XG4gICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgIHJldHVybiAob2JqSXNBcnIgfHwgaXNUeXBlZEFycmF5KG9iamVjdCkpXG4gICAgICAgICAgPyBlcXVhbEFycmF5cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKVxuICAgICAgICAgIDogZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCBvYmpUYWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgICAgfVxuICAgICAgaWYgKCEoYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHKSkge1xuICAgICAgICB2YXIgb2JqSXNXcmFwcGVkID0gb2JqSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsICdfX3dyYXBwZWRfXycpLFxuICAgICAgICAgICAgb3RoSXNXcmFwcGVkID0gb3RoSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwgJ19fd3JhcHBlZF9fJyk7XG5cbiAgICAgICAgaWYgKG9iaklzV3JhcHBlZCB8fCBvdGhJc1dyYXBwZWQpIHtcbiAgICAgICAgICB2YXIgb2JqVW53cmFwcGVkID0gb2JqSXNXcmFwcGVkID8gb2JqZWN0LnZhbHVlKCkgOiBvYmplY3QsXG4gICAgICAgICAgICAgIG90aFVud3JhcHBlZCA9IG90aElzV3JhcHBlZCA/IG90aGVyLnZhbHVlKCkgOiBvdGhlcjtcblxuICAgICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsIG90aFVud3JhcHBlZCwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWlzU2FtZVRhZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgcmV0dXJuIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hcGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzTWFwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IG1hcFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hdGNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHBhcmFtIHtBcnJheX0gbWF0Y2hEYXRhIFRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyB0byBtYXRjaC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgaXMgYSBtYXRjaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBpbmRleCA9IG1hdGNoRGF0YS5sZW5ndGgsXG4gICAgICAgICAgbGVuZ3RoID0gaW5kZXgsXG4gICAgICAgICAgbm9DdXN0b21pemVyID0gIWN1c3RvbWl6ZXI7XG5cbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gIWxlbmd0aDtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgdmFyIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgICAgICBpZiAoKG5vQ3VzdG9taXplciAmJiBkYXRhWzJdKVxuICAgICAgICAgICAgICA/IGRhdGFbMV0gIT09IG9iamVjdFtkYXRhWzBdXVxuICAgICAgICAgICAgICA6ICEoZGF0YVswXSBpbiBvYmplY3QpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgICAgICB2YXIga2V5ID0gZGF0YVswXSxcbiAgICAgICAgICAgIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgICAgICBzcmNWYWx1ZSA9IGRhdGFbMV07XG5cbiAgICAgICAgaWYgKG5vQ3VzdG9taXplciAmJiBkYXRhWzJdKSB7XG4gICAgICAgICAgaWYgKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc3RhY2sgPSBuZXcgU3RhY2s7XG4gICAgICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIShyZXN1bHQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICAgICAgICAgIDogcmVzdWx0XG4gICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3QodmFsdWUpIHx8IGlzTWFza2VkKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgcGF0dGVybiA9IGlzRnVuY3Rpb24odmFsdWUpID8gcmVJc05hdGl2ZSA6IHJlSXNIb3N0Q3RvcjtcbiAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1JlZ0V4cGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcmVnZXhwLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzUmVnRXhwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSByZWdleHBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNTZXRgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc1NldCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBzZXRUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNUeXBlZEFycmF5YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmXG4gICAgICAgIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgISF0eXBlZEFycmF5VGFnc1tiYXNlR2V0VGFnKHZhbHVlKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXRlcmF0ZWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IFt2YWx1ZT1fLmlkZW50aXR5XSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhbiBpdGVyYXRlZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGl0ZXJhdGVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJdGVyYXRlZSh2YWx1ZSkge1xuICAgICAgLy8gRG9uJ3Qgc3RvcmUgdGhlIGB0eXBlb2ZgIHJlc3VsdCBpbiBhIHZhcmlhYmxlIHRvIGF2b2lkIGEgSklUIGJ1ZyBpbiBTYWZhcmkgOS5cbiAgICAgIC8vIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU2MDM0IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICA/IGJhc2VNYXRjaGVzUHJvcGVydHkodmFsdWVbMF0sIHZhbHVlWzFdKVxuICAgICAgICAgIDogYmFzZU1hdGNoZXModmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3BlcnR5KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkge1xuICAgICAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGtleSAhPSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzSW5gIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUtleXNJbihvYmplY3QpIHtcbiAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gbmF0aXZlS2V5c0luKG9iamVjdCk7XG4gICAgICB9XG4gICAgICB2YXIgaXNQcm90byA9IGlzUHJvdG90eXBlKG9iamVjdCksXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgaWYgKCEoa2V5ID09ICdjb25zdHJ1Y3RvcicgJiYgKGlzUHJvdG8gfHwgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmx0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VMdCh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA8IG90aGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hcGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcblxuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHRbKytpbmRleF0gPSBpdGVyYXRlZSh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzYCB3aGljaCBkb2Vzbid0IGNsb25lIGBzb3VyY2VgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKSB7XG4gICAgICB2YXIgbWF0Y2hEYXRhID0gZ2V0TWF0Y2hEYXRhKHNvdXJjZSk7XG4gICAgICBpZiAobWF0Y2hEYXRhLmxlbmd0aCA9PSAxICYmIG1hdGNoRGF0YVswXVsyXSkge1xuICAgICAgICByZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUobWF0Y2hEYXRhWzBdWzBdLCBtYXRjaERhdGFbMF1bMV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID09PSBzb3VyY2UgfHwgYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNQcm9wZXJ0eWAgd2hpY2ggZG9lc24ndCBjbG9uZSBgc3JjVmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBzcmNWYWx1ZSkge1xuICAgICAgaWYgKGlzS2V5KHBhdGgpICYmIGlzU3RyaWN0Q29tcGFyYWJsZShzcmNWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKHRvS2V5KHBhdGgpLCBzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHZhciBvYmpWYWx1ZSA9IGdldChvYmplY3QsIHBhdGgpO1xuICAgICAgICByZXR1cm4gKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgb2JqVmFsdWUgPT09IHNyY1ZhbHVlKVxuICAgICAgICAgID8gaGFzSW4ob2JqZWN0LCBwYXRoKVxuICAgICAgICAgIDogYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tZXJnZWAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIG1lcmdlZCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAgICAgKiAgY291bnRlcnBhcnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gICAgICBpZiAob2JqZWN0ID09PSBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYmFzZUZvcihzb3VyY2UsIGZ1bmN0aW9uKHNyY1ZhbHVlLCBrZXkpIHtcbiAgICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KHNyY1ZhbHVlKSkge1xuICAgICAgICAgIGJhc2VNZXJnZURlZXAob2JqZWN0LCBzb3VyY2UsIGtleSwgc3JjSW5kZXgsIGJhc2VNZXJnZSwgY3VzdG9taXplciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgICAgID8gY3VzdG9taXplcihzYWZlR2V0KG9iamVjdCwga2V5KSwgc3JjVmFsdWUsIChrZXkgKyAnJyksIG9iamVjdCwgc291cmNlLCBzdGFjaylcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gc3JjVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSwga2V5c0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VNZXJnZWAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICAgICAqIGRlZXAgbWVyZ2VzIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMgZW5hYmxpbmcgb2JqZWN0cyB3aXRoIGNpcmN1bGFyXG4gICAgICogcmVmZXJlbmNlcyB0byBiZSBtZXJnZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gbWVyZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNyY0luZGV4IFRoZSBpbmRleCBvZiBgc291cmNlYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXJnZUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1lcmdlIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAgICAgKiAgY291bnRlcnBhcnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNZXJnZURlZXAob2JqZWN0LCBzb3VyY2UsIGtleSwgc3JjSW5kZXgsIG1lcmdlRnVuYywgY3VzdG9taXplciwgc3RhY2spIHtcbiAgICAgIHZhciBvYmpWYWx1ZSA9IHNhZmVHZXQob2JqZWN0LCBrZXkpLFxuICAgICAgICAgIHNyY1ZhbHVlID0gc2FmZUdldChzb3VyY2UsIGtleSksXG4gICAgICAgICAgc3RhY2tlZCA9IHN0YWNrLmdldChzcmNWYWx1ZSk7XG5cbiAgICAgIGlmIChzdGFja2VkKSB7XG4gICAgICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIHN0YWNrZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgICAgID8gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIChrZXkgKyAnJyksIG9iamVjdCwgc291cmNlLCBzdGFjaylcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHZhciBpc0NvbW1vbiA9IG5ld1ZhbHVlID09PSB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChpc0NvbW1vbikge1xuICAgICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHNyY1ZhbHVlKSxcbiAgICAgICAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiBpc0J1ZmZlcihzcmNWYWx1ZSksXG4gICAgICAgICAgICBpc1R5cGVkID0gIWlzQXJyICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHNyY1ZhbHVlKTtcblxuICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgICBpZiAoaXNBcnIgfHwgaXNCdWZmIHx8IGlzVHlwZWQpIHtcbiAgICAgICAgICBpZiAoaXNBcnJheShvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KG9ialZhbHVlKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBjb3B5QXJyYXkob2JqVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChpc0J1ZmYpIHtcbiAgICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGNsb25lQnVmZmVyKHNyY1ZhbHVlLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNUeXBlZCkge1xuICAgICAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gY2xvbmVUeXBlZEFycmF5KHNyY1ZhbHVlLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHNyY1ZhbHVlKSB8fCBpc0FyZ3VtZW50cyhzcmNWYWx1ZSkpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgICAgIGlmIChpc0FyZ3VtZW50cyhvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gdG9QbGFpbk9iamVjdChvYmpWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKCFpc09iamVjdChvYmpWYWx1ZSkgfHwgaXNGdW5jdGlvbihvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gaW5pdENsb25lT2JqZWN0KHNyY1ZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzQ29tbW9uKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IG1lcmdlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBzdGFjay5zZXQoc3JjVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICAgICAgbWVyZ2VGdW5jKG5ld1ZhbHVlLCBzcmNWYWx1ZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICAgICAgc3RhY2tbJ2RlbGV0ZSddKHNyY1ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5udGhgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZXR1cm4uXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG50aCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU50aChhcnJheSwgbikge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG4gKz0gbiA8IDAgPyBsZW5ndGggOiAwO1xuICAgICAgcmV0dXJuIGlzSW5kZXgobiwgbGVuZ3RoKSA/IGFycmF5W25dIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm9yZGVyQnlgIHdpdGhvdXQgcGFyYW0gZ3VhcmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbltdfE9iamVjdFtdfHN0cmluZ1tdfSBpdGVyYXRlZXMgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IG9yZGVycyBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKSB7XG4gICAgICBpZiAoaXRlcmF0ZWVzLmxlbmd0aCkge1xuICAgICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICAgICAgaWYgKGlzQXJyYXkoaXRlcmF0ZWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2VHZXQodmFsdWUsIGl0ZXJhdGVlLmxlbmd0aCA9PT0gMSA/IGl0ZXJhdGVlWzBdIDogaXRlcmF0ZWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaXRlcmF0ZWU7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gW2lkZW50aXR5XTtcbiAgICAgIH1cblxuICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMsIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG5cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlTWFwKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgdmFyIGNyaXRlcmlhID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgIHJldHVybiBpdGVyYXRlZSh2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyAnY3JpdGVyaWEnOiBjcml0ZXJpYSwgJ2luZGV4JzogKytpbmRleCwgJ3ZhbHVlJzogdmFsdWUgfTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYmFzZVNvcnRCeShyZXN1bHQsIGZ1bmN0aW9uKG9iamVjdCwgb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVNdWx0aXBsZShvYmplY3QsIG90aGVyLCBvcmRlcnMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucGlja2Agd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUGljayhvYmplY3QsIHBhdGhzKSB7XG4gICAgICByZXR1cm4gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkge1xuICAgICAgICByZXR1cm4gaGFzSW4ob2JqZWN0LCBwYXRoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mICBgXy5waWNrQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSB7fTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHBhdGggPSBwYXRoc1tpbmRleF0sXG4gICAgICAgICAgICB2YWx1ZSA9IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcblxuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBwYXRoKSkge1xuICAgICAgICAgIGJhc2VTZXQocmVzdWx0LCBjYXN0UGF0aChwYXRoLCBvYmplY3QpLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUHJvcGVydHlgIHdoaWNoIHN1cHBvcnRzIGRlZXAgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVByb3BlcnR5RGVlcChwYXRoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnB1bGxBbGxCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgICAqIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleE9mID0gY29tcGFyYXRvciA/IGJhc2VJbmRleE9mV2l0aCA6IGJhc2VJbmRleE9mLFxuICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgICAgICBzZWVuID0gYXJyYXk7XG5cbiAgICAgIGlmIChhcnJheSA9PT0gdmFsdWVzKSB7XG4gICAgICAgIHZhbHVlcyA9IGNvcHlBcnJheSh2YWx1ZXMpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHNlZW4gPSBhcnJheU1hcChhcnJheSwgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZnJvbUluZGV4ID0gMCxcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzW2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICB3aGlsZSAoKGZyb21JbmRleCA9IGluZGV4T2Yoc2VlbiwgY29tcHV0ZWQsIGZyb21JbmRleCwgY29tcGFyYXRvcikpID4gLTEpIHtcbiAgICAgICAgICBpZiAoc2VlbiAhPT0gYXJyYXkpIHtcbiAgICAgICAgICAgIHNwbGljZS5jYWxsKHNlZW4sIGZyb21JbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNwbGljZS5jYWxsKGFycmF5LCBmcm9tSW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHVsbEF0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWxcbiAgICAgKiBpbmRleGVzIG9yIGNhcHR1cmluZyB0aGUgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcltdfSBpbmRleGVzIFRoZSBpbmRleGVzIG9mIGVsZW1lbnRzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUHVsbEF0KGFycmF5LCBpbmRleGVzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBpbmRleGVzLmxlbmd0aCA6IDAsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGluZGV4ZXNbbGVuZ3RoXTtcbiAgICAgICAgaWYgKGxlbmd0aCA9PSBsYXN0SW5kZXggfHwgaW5kZXggIT09IHByZXZpb3VzKSB7XG4gICAgICAgICAgdmFyIHByZXZpb3VzID0gaW5kZXg7XG4gICAgICAgICAgaWYgKGlzSW5kZXgoaW5kZXgpKSB7XG4gICAgICAgICAgICBzcGxpY2UuY2FsbChhcnJheSwgaW5kZXgsIDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBiYXNlVW5zZXQoYXJyYXksIGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yYW5kb21gIHdpdGhvdXQgc3VwcG9ydCBmb3IgcmV0dXJuaW5nXG4gICAgICogZmxvYXRpbmctcG9pbnQgbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxvd2VyIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJhbmRvbSBudW1iZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJhbmRvbShsb3dlciwgdXBwZXIpIHtcbiAgICAgIHJldHVybiBsb3dlciArIG5hdGl2ZUZsb29yKG5hdGl2ZVJhbmRvbSgpICogKHVwcGVyIC0gbG93ZXIgKyAxKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZ2VgIGFuZCBgXy5yYW5nZVJpZ2h0YCB3aGljaCBkb2Vzbid0XG4gICAgICogY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RlcCBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KG5hdGl2ZUNlaWwoKGVuZCAtIHN0YXJ0KSAvIChzdGVwIHx8IDEpKSwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHJlc3VsdFtmcm9tUmlnaHQgPyBsZW5ndGggOiArK2luZGV4XSA9IHN0YXJ0O1xuICAgICAgICBzdGFydCArPSBzdGVwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXBlYXRgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHJlcGVhdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgc3RyaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJlcGVhdGVkIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUmVwZWF0KHN0cmluZywgbikge1xuICAgICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgICAgaWYgKCFzdHJpbmcgfHwgbiA8IDEgfHwgbiA+IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIC8vIExldmVyYWdlIHRoZSBleHBvbmVudGlhdGlvbiBieSBzcXVhcmluZyBhbGdvcml0aG0gZm9yIGEgZmFzdGVyIHJlcGVhdC5cbiAgICAgIC8vIFNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FeHBvbmVudGlhdGlvbl9ieV9zcXVhcmluZyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgZG8ge1xuICAgICAgICBpZiAobiAlIDIpIHtcbiAgICAgICAgICByZXN1bHQgKz0gc3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIG4gPSBuYXRpdmVGbG9vcihuIC8gMik7XG4gICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgc3RyaW5nICs9IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAobik7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVzdGAgd2hpY2ggZG9lc24ndCB2YWxpZGF0ZSBvciBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUmVzdChmdW5jLCBzdGFydCkge1xuICAgICAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCBpZGVudGl0eSksIGZ1bmMgKyAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2FtcGxlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU2FtcGxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBhcnJheVNhbXBsZSh2YWx1ZXMoY29sbGVjdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNhbXBsZVNpemVgIHdpdGhvdXQgcGFyYW0gZ3VhcmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNhbXBsZVNpemUoY29sbGVjdGlvbiwgbikge1xuICAgICAgdmFyIGFycmF5ID0gdmFsdWVzKGNvbGxlY3Rpb24pO1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGFycmF5LCBiYXNlQ2xhbXAobiwgMCwgYXJyYXkubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2V0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBwYXRoIGNyZWF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgIH1cbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgICAgICBsYXN0SW5kZXggPSBsZW5ndGggLSAxLFxuICAgICAgICAgIG5lc3RlZCA9IG9iamVjdDtcblxuICAgICAgd2hpbGUgKG5lc3RlZCAhPSBudWxsICYmICsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKSxcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ19fcHJvdG9fXycgfHwga2V5ID09PSAnY29uc3RydWN0b3InIHx8IGtleSA9PT0gJ3Byb3RvdHlwZScpIHtcbiAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZGV4ICE9IGxhc3RJbmRleCkge1xuICAgICAgICAgIHZhciBvYmpWYWx1ZSA9IG5lc3RlZFtrZXldO1xuICAgICAgICAgIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIGtleSwgbmVzdGVkKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBpc09iamVjdChvYmpWYWx1ZSlcbiAgICAgICAgICAgICAgPyBvYmpWYWx1ZVxuICAgICAgICAgICAgICA6IChpc0luZGV4KHBhdGhbaW5kZXggKyAxXSkgPyBbXSA6IHt9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXNzaWduVmFsdWUobmVzdGVkLCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgbmVzdGVkID0gbmVzdGVkW2tleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXREYXRhYCB3aXRob3V0IHN1cHBvcnQgZm9yIGhvdCBsb29wIHNob3J0aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NvY2lhdGUgbWV0YWRhdGEgd2l0aC5cbiAgICAgKiBAcGFyYW0geyp9IGRhdGEgVGhlIG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGJhc2VTZXREYXRhID0gIW1ldGFNYXAgPyBpZGVudGl0eSA6IGZ1bmN0aW9uKGZ1bmMsIGRhdGEpIHtcbiAgICAgIG1ldGFNYXAuc2V0KGZ1bmMsIGRhdGEpO1xuICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXRUb1N0cmluZ2Agd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZVNldFRvU3RyaW5nID0gIWRlZmluZVByb3BlcnR5ID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jLCAndG9TdHJpbmcnLCB7XG4gICAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgICAnZW51bWVyYWJsZSc6IGZhbHNlLFxuICAgICAgICAndmFsdWUnOiBjb25zdGFudChzdHJpbmcpLFxuICAgICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2h1ZmZsZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNodWZmbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNodWZmbGUoY29sbGVjdGlvbikge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKHZhbHVlcyhjb2xsZWN0aW9uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2xpY2VgIHdpdGhvdXQgYW4gaXRlcmF0ZWUgY2FsbCBndWFyZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNsaWNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgc3RhcnQgPSAtc3RhcnQgPiBsZW5ndGggPyAwIDogKGxlbmd0aCArIHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGVuZCA9IGVuZCA+IGxlbmd0aCA/IGxlbmd0aCA6IGVuZDtcbiAgICAgIGlmIChlbmQgPCAwKSB7XG4gICAgICAgIGVuZCArPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICBsZW5ndGggPSBzdGFydCA+IGVuZCA/IDAgOiAoKGVuZCAtIHN0YXJ0KSA+Pj4gMCk7XG4gICAgICBzdGFydCA+Pj49IDA7XG5cbiAgICAgIHZhciByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IGFycmF5W2luZGV4ICsgc3RhcnRdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb21lYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29tZShjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQ7XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHQgPSBwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuICFyZXN1bHQ7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAhIXJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRJbmRleGAgYW5kIGBfLnNvcnRlZExhc3RJbmRleGAgd2hpY2hcbiAgICAgKiBwZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggb2YgYGFycmF5YCB0byBkZXRlcm1pbmUgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWBcbiAgICAgKiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmV0SGlnaGVzdF0gU3BlY2lmeSByZXR1cm5pbmcgdGhlIGhpZ2hlc3QgcXVhbGlmaWVkIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlLCByZXRIaWdoZXN0KSB7XG4gICAgICB2YXIgbG93ID0gMCxcbiAgICAgICAgICBoaWdoID0gYXJyYXkgPT0gbnVsbCA/IGxvdyA6IGFycmF5Lmxlbmd0aDtcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJiB2YWx1ZSA9PT0gdmFsdWUgJiYgaGlnaCA8PSBIQUxGX01BWF9BUlJBWV9MRU5HVEgpIHtcbiAgICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgICB2YXIgbWlkID0gKGxvdyArIGhpZ2gpID4+PiAxLFxuICAgICAgICAgICAgICBjb21wdXRlZCA9IGFycmF5W21pZF07XG5cbiAgICAgICAgICBpZiAoY29tcHV0ZWQgIT09IG51bGwgJiYgIWlzU3ltYm9sKGNvbXB1dGVkKSAmJlxuICAgICAgICAgICAgICAocmV0SGlnaGVzdCA/IChjb21wdXRlZCA8PSB2YWx1ZSkgOiAoY29tcHV0ZWQgPCB2YWx1ZSkpKSB7XG4gICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGlnaDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGlkZW50aXR5LCByZXRIaWdoZXN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRJbmRleEJ5YCBhbmQgYF8uc29ydGVkTGFzdEluZGV4QnlgXG4gICAgICogd2hpY2ggaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlXG4gICAgICogdGhlaXIgc29ydCByYW5raW5nLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDsgKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldEhpZ2hlc3RdIFNwZWNpZnkgcmV0dXJuaW5nIHRoZSBoaWdoZXN0IHF1YWxpZmllZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSwgcmV0SGlnaGVzdCkge1xuICAgICAgdmFyIGxvdyA9IDAsXG4gICAgICAgICAgaGlnaCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKGhpZ2ggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIHZhbHVlID0gaXRlcmF0ZWUodmFsdWUpO1xuICAgICAgdmFyIHZhbElzTmFOID0gdmFsdWUgIT09IHZhbHVlLFxuICAgICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICAgIHZhbElzU3ltYm9sID0gaXNTeW1ib2wodmFsdWUpLFxuICAgICAgICAgIHZhbElzVW5kZWZpbmVkID0gdmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgdmFyIG1pZCA9IG5hdGl2ZUZsb29yKChsb3cgKyBoaWdoKSAvIDIpLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZShhcnJheVttaWRdKSxcbiAgICAgICAgICAgIG90aElzRGVmaW5lZCA9IGNvbXB1dGVkICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICBvdGhJc051bGwgPSBjb21wdXRlZCA9PT0gbnVsbCxcbiAgICAgICAgICAgIG90aElzUmVmbGV4aXZlID0gY29tcHV0ZWQgPT09IGNvbXB1dGVkLFxuICAgICAgICAgICAgb3RoSXNTeW1ib2wgPSBpc1N5bWJvbChjb21wdXRlZCk7XG5cbiAgICAgICAgaWYgKHZhbElzTmFOKSB7XG4gICAgICAgICAgdmFyIHNldExvdyA9IHJldEhpZ2hlc3QgfHwgb3RoSXNSZWZsZXhpdmU7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsSXNVbmRlZmluZWQpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiAocmV0SGlnaGVzdCB8fCBvdGhJc0RlZmluZWQpO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbElzTnVsbCkge1xuICAgICAgICAgIHNldExvdyA9IG90aElzUmVmbGV4aXZlICYmIG90aElzRGVmaW5lZCAmJiAocmV0SGlnaGVzdCB8fCAhb3RoSXNOdWxsKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWxJc1N5bWJvbCkge1xuICAgICAgICAgIHNldExvdyA9IG90aElzUmVmbGV4aXZlICYmIG90aElzRGVmaW5lZCAmJiAhb3RoSXNOdWxsICYmIChyZXRIaWdoZXN0IHx8ICFvdGhJc1N5bWJvbCk7XG4gICAgICAgIH0gZWxzZSBpZiAob3RoSXNOdWxsIHx8IG90aElzU3ltYm9sKSB7XG4gICAgICAgICAgc2V0TG93ID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0TG93ID0gcmV0SGlnaGVzdCA/IChjb21wdXRlZCA8PSB2YWx1ZSkgOiAoY29tcHV0ZWQgPCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldExvdykge1xuICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5hdGl2ZU1pbihoaWdoLCBNQVhfQVJSQVlfSU5ERVgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRlZFVuaXFgIGFuZCBgXy5zb3J0ZWRVbmlxQnlgIHdpdGhvdXRcbiAgICAgKiBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTb3J0ZWRVbmlxKGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIGlmICghaW5kZXggfHwgIWVxKGNvbXB1dGVkLCBzZWVuKSkge1xuICAgICAgICAgIHZhciBzZWVuID0gY29tcHV0ZWQ7XG4gICAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWUgPT09IDAgPyAwIDogdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9OdW1iZXJgIHdoaWNoIGRvZXNuJ3QgZW5zdXJlIGNvcnJlY3RcbiAgICAgKiBjb252ZXJzaW9ucyBvZiBiaW5hcnksIGhleGFkZWNpbWFsLCBvciBvY3RhbCBzdHJpbmcgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVG9OdW1iZXIodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gTkFOO1xuICAgICAgfVxuICAgICAgcmV0dXJuICt2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1N0cmluZ2Agd2hpY2ggZG9lc24ndCBjb252ZXJ0IG51bGxpc2hcbiAgICAgKiB2YWx1ZXMgdG8gZW1wdHkgc3RyaW5ncy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XG4gICAgICAvLyBFeGl0IGVhcmx5IGZvciBzdHJpbmdzIHRvIGF2b2lkIGEgcGVyZm9ybWFuY2UgaGl0IGluIHNvbWUgZW52aXJvbm1lbnRzLlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29udmVydCB2YWx1ZXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgcmV0dXJuIGFycmF5TWFwKHZhbHVlLCBiYXNlVG9TdHJpbmcpICsgJyc7XG4gICAgICB9XG4gICAgICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBzeW1ib2xUb1N0cmluZyA/IHN5bWJvbFRvU3RyaW5nLmNhbGwodmFsdWUpIDogJyc7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICAgICAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuaXFCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVbmlxKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBpc0NvbW1vbiA9IHRydWUsXG4gICAgICAgICAgcmVzdWx0ID0gW10sXG4gICAgICAgICAgc2VlbiA9IHJlc3VsdDtcblxuICAgICAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgICAgIHZhciBzZXQgPSBpdGVyYXRlZSA/IG51bGwgOiBjcmVhdGVTZXQoYXJyYXkpO1xuICAgICAgICBpZiAoc2V0KSB7XG4gICAgICAgICAgcmV0dXJuIHNldFRvQXJyYXkoc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgICAgICBzZWVuID0gbmV3IFNldENhY2hlO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHNlZW4gPSBpdGVyYXRlZSA/IFtdIDogcmVzdWx0O1xuICAgICAgfVxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgICAgIGlmIChpc0NvbW1vbiAmJiBjb21wdXRlZCA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICB2YXIgc2VlbkluZGV4ID0gc2Vlbi5sZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKHNlZW5JbmRleC0tKSB7XG4gICAgICAgICAgICBpZiAoc2VlbltzZWVuSW5kZXhdID09PSBjb21wdXRlZCkge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWluY2x1ZGVzKHNlZW4sIGNvbXB1dGVkLCBjb21wYXJhdG9yKSkge1xuICAgICAgICAgIGlmIChzZWVuICE9PSByZXN1bHQpIHtcbiAgICAgICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bnNldGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHByb3BlcnR5IHBhdGggdG8gdW5zZXQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWxldGVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVVuc2V0KG9iamVjdCwgcGF0aCkge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG4gICAgICBvYmplY3QgPSBwYXJlbnQob2JqZWN0LCBwYXRoKTtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCB8fCBkZWxldGUgb2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51cGRhdGVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlciBUaGUgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdXBkYXRlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBwYXRoIGNyZWF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVVwZGF0ZShvYmplY3QsIHBhdGgsIHVwZGF0ZXIsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHJldHVybiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdXBkYXRlcihiYXNlR2V0KG9iamVjdCwgcGF0aCkpLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uZHJvcFdoaWxlYCBhbmQgYF8udGFrZVdoaWxlYFxuICAgICAqIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRHJvcF0gU3BlY2lmeSBkcm9wcGluZyBlbGVtZW50cyBpbnN0ZWFkIG9mIHRha2luZyB0aGVtLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlV2hpbGUoYXJyYXksIHByZWRpY2F0ZSwgaXNEcm9wLCBmcm9tUmlnaHQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMTtcblxuICAgICAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkgJiZcbiAgICAgICAgcHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge31cblxuICAgICAgcmV0dXJuIGlzRHJvcFxuICAgICAgICA/IGJhc2VTbGljZShhcnJheSwgKGZyb21SaWdodCA/IDAgOiBpbmRleCksIChmcm9tUmlnaHQgPyBpbmRleCArIDEgOiBsZW5ndGgpKVxuICAgICAgICA6IGJhc2VTbGljZShhcnJheSwgKGZyb21SaWdodCA/IGluZGV4ICsgMSA6IDApLCAoZnJvbVJpZ2h0ID8gbGVuZ3RoIDogaW5kZXgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgd3JhcHBlclZhbHVlYCB3aGljaCByZXR1cm5zIHRoZSByZXN1bHQgb2ZcbiAgICAgKiBwZXJmb3JtaW5nIGEgc2VxdWVuY2Ugb2YgYWN0aW9ucyBvbiB0aGUgdW53cmFwcGVkIGB2YWx1ZWAsIHdoZXJlIGVhY2hcbiAgICAgKiBzdWNjZXNzaXZlIGFjdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFjdGlvbnMgQWN0aW9ucyB0byBwZXJmb3JtIHRvIHJlc29sdmUgdGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVdyYXBwZXJWYWx1ZSh2YWx1ZSwgYWN0aW9ucykge1xuICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC52YWx1ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5UmVkdWNlKGFjdGlvbnMsIGZ1bmN0aW9uKHJlc3VsdCwgYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBhY3Rpb24uZnVuYy5hcHBseShhY3Rpb24udGhpc0FyZywgYXJyYXlQdXNoKFtyZXN1bHRdLCBhY3Rpb24uYXJncykpO1xuICAgICAgfSwgcmVzdWx0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8ueG9yYCwgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHRoYXQgYWNjZXB0cyBhbiBhcnJheSBvZiBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlzIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHZhbHVlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlWG9yKGFycmF5cywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheXMubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VVbmlxKGFycmF5c1swXSkgOiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBhcnJheSA9IGFycmF5c1tpbmRleF0sXG4gICAgICAgICAgICBvdGhJbmRleCA9IC0xO1xuXG4gICAgICAgIHdoaWxlICgrK290aEluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKG90aEluZGV4ICE9IGluZGV4KSB7XG4gICAgICAgICAgICByZXN1bHRbaW5kZXhdID0gYmFzZURpZmZlcmVuY2UocmVzdWx0W2luZGV4XSB8fCBhcnJheSwgYXJyYXlzW290aEluZGV4XSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKHJlc3VsdCwgMSksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uemlwT2JqZWN0YCB3aGljaCBhc3NpZ25zIHZhbHVlcyB1c2luZyBgYXNzaWduRnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25GdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NpZ24gdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVppcE9iamVjdChwcm9wcywgdmFsdWVzLCBhc3NpZ25GdW5jKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGgsXG4gICAgICAgICAgdmFsc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGluZGV4IDwgdmFsc0xlbmd0aCA/IHZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICAgIGFzc2lnbkZ1bmMocmVzdWx0LCBwcm9wc1tpbmRleF0sIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYHZhbHVlYCB0byBhbiBlbXB0eSBhcnJheSBpZiBpdCdzIG5vdCBhbiBhcnJheSBsaWtlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIHRoZSBjYXN0IGFycmF5LWxpa2Ugb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgdG8gYGlkZW50aXR5YCBpZiBpdCdzIG5vdCBhIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBjYXN0IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RGdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nID8gdmFsdWUgOiBpZGVudGl0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGEgcGF0aCBhcnJheSBpZiBpdCdzIG5vdCBvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0UGF0aCh2YWx1ZSwgb2JqZWN0KSB7XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzS2V5KHZhbHVlLCBvYmplY3QpID8gW3ZhbHVlXSA6IHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgYGJhc2VSZXN0YCBhbGlhcyB3aGljaCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBgaWRlbnRpdHlgIGJ5IG1vZHVsZVxuICAgICAqIHJlcGxhY2VtZW50IHBsdWdpbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHZhciBjYXN0UmVzdCA9IGJhc2VSZXN0O1xuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYGFycmF5YCB0byBhIHNsaWNlIGlmIGl0J3MgbmVlZGVkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3Qgc2xpY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdFNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiBlbmQ7XG4gICAgICByZXR1cm4gKCFzdGFydCAmJiBlbmQgPj0gbGVuZ3RoKSA/IGFycmF5IDogYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCB0aGUgZ2xvYmFsIFtgY2xlYXJUaW1lb3V0YF0oaHR0cHM6Ly9tZG4uaW8vY2xlYXJUaW1lb3V0KS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ8T2JqZWN0fSBpZCBUaGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3Qgb2YgdGhlIHRpbWVyIHRvIGNsZWFyLlxuICAgICAqL1xuICAgIHZhciBjbGVhclRpbWVvdXQgPSBjdHhDbGVhclRpbWVvdXQgfHwgZnVuY3Rpb24oaWQpIHtcbiAgICAgIHJldHVybiByb290LmNsZWFyVGltZW91dChpZCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiAgYGJ1ZmZlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgVGhlIGJ1ZmZlciB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBidWZmZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVCdWZmZXIoYnVmZmVyLCBpc0RlZXApIHtcbiAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgpO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gYWxsb2NVbnNhZmUgPyBhbGxvY1Vuc2FmZShsZW5ndGgpIDogbmV3IGJ1ZmZlci5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gICAgICBidWZmZXIuY29weShyZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGFycmF5QnVmZmVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyYXlCdWZmZXIgVGhlIGFycmF5IGJ1ZmZlciB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXlCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBhcnJheSBidWZmZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcikge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBhcnJheUJ1ZmZlci5jb25zdHJ1Y3RvcihhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgIG5ldyBVaW50OEFycmF5KHJlc3VsdCkuc2V0KG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgZGF0YVZpZXdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVZpZXcgVGhlIGRhdGEgdmlldyB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBkYXRhIHZpZXcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldywgaXNEZWVwKSB7XG4gICAgICB2YXIgYnVmZmVyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcihkYXRhVmlldy5idWZmZXIpIDogZGF0YVZpZXcuYnVmZmVyO1xuICAgICAgcmV0dXJuIG5ldyBkYXRhVmlldy5jb25zdHJ1Y3RvcihidWZmZXIsIGRhdGFWaWV3LmJ5dGVPZmZzZXQsIGRhdGFWaWV3LmJ5dGVMZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgcmVnZXhwYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJlZ2V4cCBUaGUgcmVnZXhwIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCByZWdleHAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVSZWdFeHAocmVnZXhwKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IHJlZ2V4cC5jb25zdHJ1Y3RvcihyZWdleHAuc291cmNlLCByZUZsYWdzLmV4ZWMocmVnZXhwKSk7XG4gICAgICByZXN1bHQubGFzdEluZGV4ID0gcmVnZXhwLmxhc3RJbmRleDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBgc3ltYm9sYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzeW1ib2wgVGhlIHN5bWJvbCBvYmplY3QgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHN5bWJvbCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKSB7XG4gICAgICByZXR1cm4gc3ltYm9sVmFsdWVPZiA/IE9iamVjdChzeW1ib2xWYWx1ZU9mLmNhbGwoc3ltYm9sKSkgOiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHR5cGVkQXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdHlwZWRBcnJheSBUaGUgdHlwZWQgYXJyYXkgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgdHlwZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVUeXBlZEFycmF5KHR5cGVkQXJyYXksIGlzRGVlcCkge1xuICAgICAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIodHlwZWRBcnJheS5idWZmZXIpIDogdHlwZWRBcnJheS5idWZmZXI7XG4gICAgICByZXR1cm4gbmV3IHR5cGVkQXJyYXkuY29uc3RydWN0b3IoYnVmZmVyLCB0eXBlZEFycmF5LmJ5dGVPZmZzZXQsIHR5cGVkQXJyYXkubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB2YWx1ZXMgdG8gc29ydCB0aGVtIGluIGFzY2VuZGluZyBvcmRlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgdmFsdWVgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcodmFsdWUsIG90aGVyKSB7XG4gICAgICBpZiAodmFsdWUgIT09IG90aGVyKSB7XG4gICAgICAgIHZhciB2YWxJc0RlZmluZWQgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgdmFsSXNOdWxsID0gdmFsdWUgPT09IG51bGwsXG4gICAgICAgICAgICB2YWxJc1JlZmxleGl2ZSA9IHZhbHVlID09PSB2YWx1ZSxcbiAgICAgICAgICAgIHZhbElzU3ltYm9sID0gaXNTeW1ib2wodmFsdWUpO1xuXG4gICAgICAgIHZhciBvdGhJc0RlZmluZWQgPSBvdGhlciAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3RoSXNOdWxsID0gb3RoZXIgPT09IG51bGwsXG4gICAgICAgICAgICBvdGhJc1JlZmxleGl2ZSA9IG90aGVyID09PSBvdGhlcixcbiAgICAgICAgICAgIG90aElzU3ltYm9sID0gaXNTeW1ib2wob3RoZXIpO1xuXG4gICAgICAgIGlmICgoIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wgJiYgIXZhbElzU3ltYm9sICYmIHZhbHVlID4gb3RoZXIpIHx8XG4gICAgICAgICAgICAodmFsSXNTeW1ib2wgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlICYmICFvdGhJc051bGwgJiYgIW90aElzU3ltYm9sKSB8fFxuICAgICAgICAgICAgKHZhbElzTnVsbCAmJiBvdGhJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAoIXZhbElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgICAgICF2YWxJc1JlZmxleGl2ZSkge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoIXZhbElzTnVsbCAmJiAhdmFsSXNTeW1ib2wgJiYgIW90aElzU3ltYm9sICYmIHZhbHVlIDwgb3RoZXIpIHx8XG4gICAgICAgICAgICAob3RoSXNTeW1ib2wgJiYgdmFsSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlICYmICF2YWxJc051bGwgJiYgIXZhbElzU3ltYm9sKSB8fFxuICAgICAgICAgICAgKG90aElzTnVsbCAmJiB2YWxJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAoIW90aElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgICAgICFvdGhJc1JlZmxleGl2ZSkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5vcmRlckJ5YCB0byBjb21wYXJlIG11bHRpcGxlIHByb3BlcnRpZXMgb2YgYSB2YWx1ZSB0byBhbm90aGVyXG4gICAgICogYW5kIHN0YWJsZSBzb3J0IHRoZW0uXG4gICAgICpcbiAgICAgKiBJZiBgb3JkZXJzYCBpcyB1bnNwZWNpZmllZCwgYWxsIHZhbHVlcyBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4gT3RoZXJ3aXNlLFxuICAgICAqIHNwZWNpZnkgYW4gb3JkZXIgb2YgXCJkZXNjXCIgZm9yIGRlc2NlbmRpbmcgb3IgXCJhc2NcIiBmb3IgYXNjZW5kaW5nIHNvcnQgb3JkZXJcbiAgICAgKiBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW5bXXxzdHJpbmdbXX0gb3JkZXJzIFRoZSBvcmRlciB0byBzb3J0IGJ5IGZvciBlYWNoIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBvYmpDcml0ZXJpYSA9IG9iamVjdC5jcml0ZXJpYSxcbiAgICAgICAgICBvdGhDcml0ZXJpYSA9IG90aGVyLmNyaXRlcmlhLFxuICAgICAgICAgIGxlbmd0aCA9IG9iakNyaXRlcmlhLmxlbmd0aCxcbiAgICAgICAgICBvcmRlcnNMZW5ndGggPSBvcmRlcnMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gY29tcGFyZUFzY2VuZGluZyhvYmpDcml0ZXJpYVtpbmRleF0sIG90aENyaXRlcmlhW2luZGV4XSk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gb3JkZXJzTGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgb3JkZXIgPSBvcmRlcnNbaW5kZXhdO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgKiAob3JkZXIgPT0gJ2Rlc2MnID8gLTEgOiAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRml4ZXMgYW4gYEFycmF5I3NvcnRgIGJ1ZyBpbiB0aGUgSlMgZW5naW5lIGVtYmVkZGVkIGluIEFkb2JlIGFwcGxpY2F0aW9uc1xuICAgICAgLy8gdGhhdCBjYXVzZXMgaXQsIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywgdG8gcHJvdmlkZSB0aGUgc2FtZSB2YWx1ZSBmb3JcbiAgICAgIC8vIGBvYmplY3RgIGFuZCBgb3RoZXJgLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL3B1bGwvMTI0N1xuICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIGFsc28gZW5zdXJlcyBhIHN0YWJsZSBzb3J0IGluIFY4IGFuZCBvdGhlciBlbmdpbmVzLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTkwIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICByZXR1cm4gb2JqZWN0LmluZGV4IC0gb3RoZXIuaW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSB0aGF0IGlzIHRoZSBjb21wb3NpdGlvbiBvZiBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMsXG4gICAgICogcGxhY2Vob2xkZXJzLCBhbmQgcHJvdmlkZWQgYXJndW1lbnRzIGludG8gYSBzaW5nbGUgYXJyYXkgb2YgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW1zIHtib29sZWFufSBbaXNDdXJyaWVkXSBTcGVjaWZ5IGNvbXBvc2luZyBmb3IgYSBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbXBvc2VkIGFyZ3VtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wb3NlQXJncyhhcmdzLCBwYXJ0aWFscywgaG9sZGVycywgaXNDdXJyaWVkKSB7XG4gICAgICB2YXIgYXJnc0luZGV4ID0gLTEsXG4gICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3MubGVuZ3RoLFxuICAgICAgICAgIGhvbGRlcnNMZW5ndGggPSBob2xkZXJzLmxlbmd0aCxcbiAgICAgICAgICBsZWZ0SW5kZXggPSAtMSxcbiAgICAgICAgICBsZWZ0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgICAgIHJhbmdlTGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3NMZW5ndGggLSBob2xkZXJzTGVuZ3RoLCAwKSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZWZ0TGVuZ3RoICsgcmFuZ2VMZW5ndGgpLFxuICAgICAgICAgIGlzVW5jdXJyaWVkID0gIWlzQ3VycmllZDtcblxuICAgICAgd2hpbGUgKCsrbGVmdEluZGV4IDwgbGVmdExlbmd0aCkge1xuICAgICAgICByZXN1bHRbbGVmdEluZGV4XSA9IHBhcnRpYWxzW2xlZnRJbmRleF07XG4gICAgICB9XG4gICAgICB3aGlsZSAoKythcmdzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7XG4gICAgICAgIGlmIChpc1VuY3VycmllZCB8fCBhcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7XG4gICAgICAgICAgcmVzdWx0W2hvbGRlcnNbYXJnc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlIChyYW5nZUxlbmd0aC0tKSB7XG4gICAgICAgIHJlc3VsdFtsZWZ0SW5kZXgrK10gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBjb21wb3NlQXJnc2AgZXhjZXB0IHRoYXQgdGhlIGFyZ3VtZW50cyBjb21wb3NpdGlvblxuICAgICAqIGlzIHRhaWxvcmVkIGZvciBgXy5wYXJ0aWFsUmlnaHRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8gdGhvc2UgcHJvdmlkZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gaG9sZGVycyBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbXMge2Jvb2xlYW59IFtpc0N1cnJpZWRdIFNwZWNpZnkgY29tcG9zaW5nIGZvciBhIGN1cnJpZWQgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tcG9zZWQgYXJndW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBvc2VBcmdzUmlnaHQoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCkge1xuICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgICAgICBob2xkZXJzSW5kZXggPSAtMSxcbiAgICAgICAgICBob2xkZXJzTGVuZ3RoID0gaG9sZGVycy5sZW5ndGgsXG4gICAgICAgICAgcmlnaHRJbmRleCA9IC0xLFxuICAgICAgICAgIHJpZ2h0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgICAgIHJhbmdlTGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3NMZW5ndGggLSBob2xkZXJzTGVuZ3RoLCAwKSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShyYW5nZUxlbmd0aCArIHJpZ2h0TGVuZ3RoKSxcbiAgICAgICAgICBpc1VuY3VycmllZCA9ICFpc0N1cnJpZWQ7XG5cbiAgICAgIHdoaWxlICgrK2FyZ3NJbmRleCA8IHJhbmdlTGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFthcmdzSW5kZXhdID0gYXJnc1thcmdzSW5kZXhdO1xuICAgICAgfVxuICAgICAgdmFyIG9mZnNldCA9IGFyZ3NJbmRleDtcbiAgICAgIHdoaWxlICgrK3JpZ2h0SW5kZXggPCByaWdodExlbmd0aCkge1xuICAgICAgICByZXN1bHRbb2Zmc2V0ICsgcmlnaHRJbmRleF0gPSBwYXJ0aWFsc1tyaWdodEluZGV4XTtcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2hvbGRlcnNJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHtcbiAgICAgICAgaWYgKGlzVW5jdXJyaWVkIHx8IGFyZ3NJbmRleCA8IGFyZ3NMZW5ndGgpIHtcbiAgICAgICAgICByZXN1bHRbb2Zmc2V0ICsgaG9sZGVyc1tob2xkZXJzSW5kZXhdXSA9IGFyZ3NbYXJnc0luZGV4KytdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyB0aGUgdmFsdWVzIG9mIGBzb3VyY2VgIHRvIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgZnJvbS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXk9W11dIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyB0by5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gc291cmNlLmxlbmd0aDtcblxuICAgICAgYXJyYXkgfHwgKGFycmF5ID0gQXJyYXkobGVuZ3RoKSk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBhcnJheVtpbmRleF0gPSBzb3VyY2VbaW5kZXhdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBwcm9wZXJ0aWVzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20uXG4gICAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzIHRvIGNvcHkuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvcGllZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb3B5T2JqZWN0KHNvdXJjZSwgcHJvcHMsIG9iamVjdCwgY3VzdG9taXplcikge1xuICAgICAgdmFyIGlzTmV3ID0gIW9iamVjdDtcbiAgICAgIG9iamVjdCB8fCAob2JqZWN0ID0ge30pO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBwcm9wc1tpbmRleF07XG5cbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICAgID8gY3VzdG9taXplcihvYmplY3Rba2V5XSwgc291cmNlW2tleV0sIGtleSwgb2JqZWN0LCBzb3VyY2UpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc05ldykge1xuICAgICAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29waWVzIG93biBzeW1ib2xzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIGZyb20uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weVN5bWJvbHMoc291cmNlLCBvYmplY3QpIHtcbiAgICAgIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9scyhzb3VyY2UpLCBvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBvd24gYW5kIGluaGVyaXRlZCBzeW1ib2xzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIGZyb20uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weVN5bWJvbHNJbihzb3VyY2UsIG9iamVjdCkge1xuICAgICAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzSW4oc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5ncm91cEJ5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYWNjdW11bGF0b3IgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpbml0aWFsaXplcl0gVGhlIGFjY3VtdWxhdG9yIG9iamVjdCBpbml0aWFsaXplci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhZ2dyZWdhdG9yIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUFnZ3JlZ2F0b3Ioc2V0dGVyLCBpbml0aWFsaXplcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5QWdncmVnYXRvciA6IGJhc2VBZ2dyZWdhdG9yLFxuICAgICAgICAgICAgYWNjdW11bGF0b3IgPSBpbml0aWFsaXplciA/IGluaXRpYWxpemVyKCkgOiB7fTtcblxuICAgICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBzZXR0ZXIsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYWNjdW11bGF0b3IpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5hc3NpZ25gLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25lciBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhc3NpZ25lciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVBc3NpZ25lcihhc3NpZ25lcikge1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoLFxuICAgICAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA+IDEgPyBzb3VyY2VzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZ3VhcmQgPSBsZW5ndGggPiAyID8gc291cmNlc1syXSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBjdXN0b21pemVyID0gKGFzc2lnbmVyLmxlbmd0aCA+IDMgJiYgdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICA/IChsZW5ndGgtLSwgY3VzdG9taXplcilcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7XG4gICAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiBjdXN0b21pemVyO1xuICAgICAgICAgIGxlbmd0aCA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIGFzc2lnbmVyKG9iamVjdCwgc291cmNlLCBpbmRleCwgY3VzdG9taXplcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGJhc2VFYWNoYCBvciBgYmFzZUVhY2hSaWdodGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYSBjb2xsZWN0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQmFzZUVhY2goZWFjaEZ1bmMsIGZyb21SaWdodCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgcmV0dXJuIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGgsXG4gICAgICAgICAgICBpbmRleCA9IGZyb21SaWdodCA/IGxlbmd0aCA6IC0xLFxuICAgICAgICAgICAgaXRlcmFibGUgPSBPYmplY3QoY29sbGVjdGlvbik7XG5cbiAgICAgICAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICAgICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVbaW5kZXhdLCBpbmRleCwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYmFzZSBmdW5jdGlvbiBmb3IgbWV0aG9kcyBsaWtlIGBfLmZvckluYCBhbmQgYF8uZm9yT3duYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYmFzZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVCYXNlRm9yKGZyb21SaWdodCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwgaXRlcmF0ZWUsIGtleXNGdW5jKSB7XG4gICAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgICAgaXRlcmFibGUgPSBPYmplY3Qob2JqZWN0KSxcbiAgICAgICAgICAgIHByb3BzID0ga2V5c0Z1bmMob2JqZWN0KSxcbiAgICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgICB2YXIga2V5ID0gcHJvcHNbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF07XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBpbnZva2UgaXQgd2l0aCB0aGUgb3B0aW9uYWwgYHRoaXNgXG4gICAgICogYmluZGluZyBvZiBgdGhpc0FyZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQmluZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgaXNCaW5kID0gYml0bWFzayAmIFdSQVBfQklORF9GTEFHLFxuICAgICAgICAgIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkoaXNCaW5kID8gdGhpc0FyZyA6IHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5sb3dlckZpcnN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGBTdHJpbmdgIGNhc2UgbWV0aG9kIHRvIHVzZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXNlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUNhc2VGaXJzdChtZXRob2ROYW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG5cbiAgICAgICAgdmFyIHN0clN5bWJvbHMgPSBoYXNVbmljb2RlKHN0cmluZylcbiAgICAgICAgICA/IHN0cmluZ1RvQXJyYXkoc3RyaW5nKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIHZhciBjaHIgPSBzdHJTeW1ib2xzXG4gICAgICAgICAgPyBzdHJTeW1ib2xzWzBdXG4gICAgICAgICAgOiBzdHJpbmcuY2hhckF0KDApO1xuXG4gICAgICAgIHZhciB0cmFpbGluZyA9IHN0clN5bWJvbHNcbiAgICAgICAgICA/IGNhc3RTbGljZShzdHJTeW1ib2xzLCAxKS5qb2luKCcnKVxuICAgICAgICAgIDogc3RyaW5nLnNsaWNlKDEpO1xuXG4gICAgICAgIHJldHVybiBjaHJbbWV0aG9kTmFtZV0oKSArIHRyYWlsaW5nO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5jYW1lbENhc2VgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdG8gY29tYmluZSBlYWNoIHdvcmQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG91bmRlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDb21wb3VuZGVyKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBhcnJheVJlZHVjZSh3b3JkcyhkZWJ1cnIoc3RyaW5nKS5yZXBsYWNlKHJlQXBvcywgJycpKSwgY2FsbGJhY2ssICcnKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgYW4gaW5zdGFuY2Ugb2YgYEN0b3JgIHJlZ2FyZGxlc3Mgb2ZcbiAgICAgKiB3aGV0aGVyIGl0IHdhcyBpbnZva2VkIGFzIHBhcnQgb2YgYSBgbmV3YCBleHByZXNzaW9uIG9yIGJ5IGBjYWxsYCBvciBgYXBwbHlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBDdG9yIFRoZSBjb25zdHJ1Y3RvciB0byB3cmFwLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ3RvcihDdG9yKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFVzZSBhIGBzd2l0Y2hgIHN0YXRlbWVudCB0byB3b3JrIHdpdGggY2xhc3MgY29uc3RydWN0b3JzLiBTZWVcbiAgICAgICAgLy8gaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1mdW5jdGlvbi1vYmplY3RzLWNhbGwtdGhpc2FyZ3VtZW50LWFyZ3VtZW50c2xpc3RcbiAgICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgQ3RvcjtcbiAgICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdKTtcbiAgICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgICBjYXNlIDQ6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdKTtcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdKTtcbiAgICAgICAgICBjYXNlIDc6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdLCBhcmdzWzZdKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBiYXNlQ3JlYXRlKEN0b3IucHJvdG90eXBlKSxcbiAgICAgICAgICAgIHJlc3VsdCA9IEN0b3IuYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MpO1xuXG4gICAgICAgIC8vIE1pbWljIHRoZSBjb25zdHJ1Y3RvcidzIGByZXR1cm5gIGJlaGF2aW9yLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTMuMi4yIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogdGhpc0JpbmRpbmc7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBlbmFibGUgY3VycnlpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYXJpdHkgVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUN1cnJ5KGZ1bmMsIGJpdG1hc2ssIGFyaXR5KSB7XG4gICAgICB2YXIgQ3RvciA9IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgICAgIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICAgICAgYXJncyA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgICBpbmRleCA9IGxlbmd0aCxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyID0gZ2V0SG9sZGVyKHdyYXBwZXIpO1xuXG4gICAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgICAgYXJnc1tpbmRleF0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBob2xkZXJzID0gKGxlbmd0aCA8IDMgJiYgYXJnc1swXSAhPT0gcGxhY2Vob2xkZXIgJiYgYXJnc1tsZW5ndGggLSAxXSAhPT0gcGxhY2Vob2xkZXIpXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogcmVwbGFjZUhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuXG4gICAgICAgIGxlbmd0aCAtPSBob2xkZXJzLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbmd0aCA8IGFyaXR5KSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlY3VycnkoXG4gICAgICAgICAgICBmdW5jLCBiaXRtYXNrLCBjcmVhdGVIeWJyaWQsIHdyYXBwZXIucGxhY2Vob2xkZXIsIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGFyZ3MsIGhvbGRlcnMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSAtIGxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcbiAgICAgICAgcmV0dXJuIGFwcGx5KGZuLCB0aGlzLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5maW5kYCBvciBgXy5maW5kTGFzdGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbmRJbmRleEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGNvbGxlY3Rpb24gaW5kZXguXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZmluZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVGaW5kKGZpbmRJbmRleEZ1bmMpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgICAgICB2YXIgaXRlcmFibGUgPSBPYmplY3QoY29sbGVjdGlvbik7XG4gICAgICAgIGlmICghaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICAgICAgICB2YXIgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpO1xuICAgICAgICAgIGNvbGxlY3Rpb24gPSBrZXlzKGNvbGxlY3Rpb24pO1xuICAgICAgICAgIHByZWRpY2F0ZSA9IGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gaXRlcmF0ZWUoaXRlcmFibGVba2V5XSwga2V5LCBpdGVyYWJsZSk7IH07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGluZGV4ID0gZmluZEluZGV4RnVuYyhjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCk7XG4gICAgICAgIHJldHVybiBpbmRleCA+IC0xID8gaXRlcmFibGVbaXRlcmF0ZWUgPyBjb2xsZWN0aW9uW2luZGV4XSA6IGluZGV4XSA6IHVuZGVmaW5lZDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBfLmZsb3dgIG9yIGBfLmZsb3dSaWdodGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZsb3cgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlRmxvdyhmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmbGF0UmVzdChmdW5jdGlvbihmdW5jcykge1xuICAgICAgICB2YXIgbGVuZ3RoID0gZnVuY3MubGVuZ3RoLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGgsXG4gICAgICAgICAgICBwcmVyZXEgPSBMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZS50aHJ1O1xuXG4gICAgICAgIGlmIChmcm9tUmlnaHQpIHtcbiAgICAgICAgICBmdW5jcy5yZXZlcnNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmNzW2luZGV4XTtcbiAgICAgICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJlcmVxICYmICF3cmFwcGVyICYmIGdldEZ1bmNOYW1lKGZ1bmMpID09ICd3cmFwcGVyJykge1xuICAgICAgICAgICAgdmFyIHdyYXBwZXIgPSBuZXcgTG9kYXNoV3JhcHBlcihbXSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gd3JhcHBlciA/IGluZGV4IDogbGVuZ3RoO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGZ1bmMgPSBmdW5jc1tpbmRleF07XG5cbiAgICAgICAgICB2YXIgZnVuY05hbWUgPSBnZXRGdW5jTmFtZShmdW5jKSxcbiAgICAgICAgICAgICAgZGF0YSA9IGZ1bmNOYW1lID09ICd3cmFwcGVyJyA/IGdldERhdGEoZnVuYykgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBpZiAoZGF0YSAmJiBpc0xhemlhYmxlKGRhdGFbMF0pICYmXG4gICAgICAgICAgICAgICAgZGF0YVsxXSA9PSAoV1JBUF9BUllfRkxBRyB8IFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfUEFSVElBTF9GTEFHIHwgV1JBUF9SRUFSR19GTEFHKSAmJlxuICAgICAgICAgICAgICAgICFkYXRhWzRdLmxlbmd0aCAmJiBkYXRhWzldID09IDFcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICB3cmFwcGVyID0gd3JhcHBlcltnZXRGdW5jTmFtZShkYXRhWzBdKV0uYXBwbHkod3JhcHBlciwgZGF0YVszXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdyYXBwZXIgPSAoZnVuYy5sZW5ndGggPT0gMSAmJiBpc0xhemlhYmxlKGZ1bmMpKVxuICAgICAgICAgICAgICA/IHdyYXBwZXJbZnVuY05hbWVdKClcbiAgICAgICAgICAgICAgOiB3cmFwcGVyLnRocnUoZnVuYyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgdmFsdWUgPSBhcmdzWzBdO1xuXG4gICAgICAgICAgaWYgKHdyYXBwZXIgJiYgYXJncy5sZW5ndGggPT0gMSAmJiBpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZXIucGxhbnQodmFsdWUpLnZhbHVlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBpbmRleCA9IDAsXG4gICAgICAgICAgICAgIHJlc3VsdCA9IGxlbmd0aCA/IGZ1bmNzW2luZGV4XS5hcHBseSh0aGlzLCBhcmdzKSA6IHZhbHVlO1xuXG4gICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmNzW2luZGV4XS5jYWxsKHRoaXMsIHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggb3B0aW9uYWwgYHRoaXNgXG4gICAgICogYmluZGluZyBvZiBgdGhpc0FyZ2AsIHBhcnRpYWwgYXBwbGljYXRpb24sIGFuZCBjdXJyeWluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGZ1bmMgVGhlIGZ1bmN0aW9uIG9yIG1ldGhvZCBuYW1lIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gICAgICogIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzUmlnaHRdIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkXG4gICAgICogIHRvIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNSaWdodF0gVGhlIGBwYXJ0aWFsc1JpZ2h0YCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUh5YnJpZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgcGFydGlhbHNSaWdodCwgaG9sZGVyc1JpZ2h0LCBhcmdQb3MsIGFyeSwgYXJpdHkpIHtcbiAgICAgIHZhciBpc0FyeSA9IGJpdG1hc2sgJiBXUkFQX0FSWV9GTEFHLFxuICAgICAgICAgIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBpc0JpbmRLZXkgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0tFWV9GTEFHLFxuICAgICAgICAgIGlzQ3VycmllZCA9IGJpdG1hc2sgJiAoV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9DVVJSWV9SSUdIVF9GTEFHKSxcbiAgICAgICAgICBpc0ZsaXAgPSBiaXRtYXNrICYgV1JBUF9GTElQX0ZMQUcsXG4gICAgICAgICAgQ3RvciA9IGlzQmluZEtleSA/IHVuZGVmaW5lZCA6IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgICAgIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICAgICAgYXJncyA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgICBpbmRleCA9IGxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNDdXJyaWVkKSB7XG4gICAgICAgICAgdmFyIHBsYWNlaG9sZGVyID0gZ2V0SG9sZGVyKHdyYXBwZXIpLFxuICAgICAgICAgICAgICBob2xkZXJzQ291bnQgPSBjb3VudEhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0aWFscykge1xuICAgICAgICAgIGFyZ3MgPSBjb21wb3NlQXJncyhhcmdzLCBwYXJ0aWFscywgaG9sZGVycywgaXNDdXJyaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydGlhbHNSaWdodCkge1xuICAgICAgICAgIGFyZ3MgPSBjb21wb3NlQXJnc1JpZ2h0KGFyZ3MsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCwgaXNDdXJyaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBsZW5ndGggLT0gaG9sZGVyc0NvdW50O1xuICAgICAgICBpZiAoaXNDdXJyaWVkICYmIGxlbmd0aCA8IGFyaXR5KSB7XG4gICAgICAgICAgdmFyIG5ld0hvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlY3VycnkoXG4gICAgICAgICAgICBmdW5jLCBiaXRtYXNrLCBjcmVhdGVIeWJyaWQsIHdyYXBwZXIucGxhY2Vob2xkZXIsIHRoaXNBcmcsXG4gICAgICAgICAgICBhcmdzLCBuZXdIb2xkZXJzLCBhcmdQb3MsIGFyeSwgYXJpdHkgLSBsZW5ndGhcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0aGlzQmluZGluZyA9IGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLFxuICAgICAgICAgICAgZm4gPSBpc0JpbmRLZXkgPyB0aGlzQmluZGluZ1tmdW5jXSA6IGZ1bmM7XG5cbiAgICAgICAgbGVuZ3RoID0gYXJncy5sZW5ndGg7XG4gICAgICAgIGlmIChhcmdQb3MpIHtcbiAgICAgICAgICBhcmdzID0gcmVvcmRlcihhcmdzLCBhcmdQb3MpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRmxpcCAmJiBsZW5ndGggPiAxKSB7XG4gICAgICAgICAgYXJncy5yZXZlcnNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQXJ5ICYmIGFyeSA8IGxlbmd0aCkge1xuICAgICAgICAgIGFyZ3MubGVuZ3RoID0gYXJ5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpIHtcbiAgICAgICAgICBmbiA9IEN0b3IgfHwgY3JlYXRlQ3Rvcihmbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNCaW5kaW5nLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLmludmVydEJ5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYWNjdW11bGF0b3IgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHRvSXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIHRvIHJlc29sdmUgaXRlcmF0ZWVzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGludmVydGVyIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUludmVydGVyKHNldHRlciwgdG9JdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZlcnRlcihvYmplY3QsIHNldHRlciwgdG9JdGVyYXRlZShpdGVyYXRlZSksIHt9KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBtYXRoZW1hdGljYWwgb3BlcmF0aW9uIG9uIHR3byB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wZXJhdG9yIFRoZSBmdW5jdGlvbiB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSB1c2VkIGZvciBgdW5kZWZpbmVkYCBhcmd1bWVudHMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbiBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVNYXRoT3BlcmF0aW9uKG9wZXJhdG9yLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgb3RoZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3RoZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG90aGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IHR5cGVvZiBvdGhlciA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFsdWUgPSBiYXNlVG9TdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgb3RoZXIgPSBiYXNlVG9TdHJpbmcob3RoZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGJhc2VUb051bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICBvdGhlciA9IGJhc2VUb051bWJlcihvdGhlcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IG9wZXJhdG9yKHZhbHVlLCBvdGhlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ub3ZlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGFycmF5RnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGl0ZXJhdGVlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBvdmVyIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZU92ZXIoYXJyYXlGdW5jKSB7XG4gICAgICByZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oaXRlcmF0ZWVzKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTtcbiAgICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgICB2YXIgdGhpc0FyZyA9IHRoaXM7XG4gICAgICAgICAgcmV0dXJuIGFycmF5RnVuYyhpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICAgICAgICByZXR1cm4gYXBwbHkoaXRlcmF0ZWUsIHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIHBhZGRpbmcgZm9yIGBzdHJpbmdgIGJhc2VkIG9uIGBsZW5ndGhgLiBUaGUgYGNoYXJzYCBzdHJpbmdcbiAgICAgKiBpcyB0cnVuY2F0ZWQgaWYgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGV4Y2VlZHMgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkaW5nIGZvciBgc3RyaW5nYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVQYWRkaW5nKGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgIGNoYXJzID0gY2hhcnMgPT09IHVuZGVmaW5lZCA/ICcgJyA6IGJhc2VUb1N0cmluZyhjaGFycyk7XG5cbiAgICAgIHZhciBjaGFyc0xlbmd0aCA9IGNoYXJzLmxlbmd0aDtcbiAgICAgIGlmIChjaGFyc0xlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIGNoYXJzTGVuZ3RoID8gYmFzZVJlcGVhdChjaGFycywgbGVuZ3RoKSA6IGNoYXJzO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IGJhc2VSZXBlYXQoY2hhcnMsIG5hdGl2ZUNlaWwobGVuZ3RoIC8gc3RyaW5nU2l6ZShjaGFycykpKTtcbiAgICAgIHJldHVybiBoYXNVbmljb2RlKGNoYXJzKVxuICAgICAgICA/IGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHJlc3VsdCksIDAsIGxlbmd0aCkuam9pbignJylcbiAgICAgICAgOiByZXN1bHQuc2xpY2UoMCwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nXG4gICAgICogb2YgYHRoaXNBcmdgIGFuZCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gICAgICogIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVQYXJ0aWFsKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgaXNCaW5kID0gYml0bWFzayAmIFdSQVBfQklORF9GTEFHLFxuICAgICAgICAgIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgYXJnc0luZGV4ID0gLTEsXG4gICAgICAgICAgICBhcmdzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGxlZnRJbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVmdExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZWZ0TGVuZ3RoICsgYXJnc0xlbmd0aCksXG4gICAgICAgICAgICBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG5cbiAgICAgICAgd2hpbGUgKCsrbGVmdEluZGV4IDwgbGVmdExlbmd0aCkge1xuICAgICAgICAgIGFyZ3NbbGVmdEluZGV4XSA9IHBhcnRpYWxzW2xlZnRJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGFyZ3NMZW5ndGgtLSkge1xuICAgICAgICAgIGFyZ3NbbGVmdEluZGV4KytdID0gYXJndW1lbnRzWysrYXJnc0luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwbHkoZm4sIGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5yYW5nZWAgb3IgYF8ucmFuZ2VSaWdodGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJhbmdlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJhbmdlKGZyb21SaWdodCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIHN0ZXApIHtcbiAgICAgICAgaWYgKHN0ZXAgJiYgdHlwZW9mIHN0ZXAgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoc3RhcnQsIGVuZCwgc3RlcCkpIHtcbiAgICAgICAgICBlbmQgPSBzdGVwID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVuc3VyZSB0aGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAgICAgICAgc3RhcnQgPSB0b0Zpbml0ZShzdGFydCk7XG4gICAgICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGVuZCA9IHN0YXJ0O1xuICAgICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbmQgPSB0b0Zpbml0ZShlbmQpO1xuICAgICAgICB9XG4gICAgICAgIHN0ZXAgPSBzdGVwID09PSB1bmRlZmluZWQgPyAoc3RhcnQgPCBlbmQgPyAxIDogLTEpIDogdG9GaW5pdGUoc3RlcCk7XG4gICAgICAgIHJldHVybiBiYXNlUmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCwgZnJvbVJpZ2h0KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSByZWxhdGlvbmFsIG9wZXJhdGlvbiBvbiB0d28gdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcGVyYXRvciBUaGUgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlbGF0aW9uYWwgb3BlcmF0aW9uIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24ob3BlcmF0b3IpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgICAgaWYgKCEodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnICYmIHR5cGVvZiBvdGhlciA9PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICBvdGhlciA9IHRvTnVtYmVyKG90aGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3BlcmF0b3IodmFsdWUsIG90aGVyKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGNvbnRpbnVlIGN1cnJ5aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gd3JhcEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgYGZ1bmNgIHdyYXBwZXIuXG4gICAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdmFsdWUuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlY3VycnkoZnVuYywgYml0bWFzaywgd3JhcEZ1bmMsIHBsYWNlaG9sZGVyLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNDdXJyeSA9IGJpdG1hc2sgJiBXUkFQX0NVUlJZX0ZMQUcsXG4gICAgICAgICAgbmV3SG9sZGVycyA9IGlzQ3VycnkgPyBob2xkZXJzIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG5ld0hvbGRlcnNSaWdodCA9IGlzQ3VycnkgPyB1bmRlZmluZWQgOiBob2xkZXJzLFxuICAgICAgICAgIG5ld1BhcnRpYWxzID0gaXNDdXJyeSA/IHBhcnRpYWxzIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG5ld1BhcnRpYWxzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogcGFydGlhbHM7XG5cbiAgICAgIGJpdG1hc2sgfD0gKGlzQ3VycnkgPyBXUkFQX1BBUlRJQUxfRkxBRyA6IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKTtcbiAgICAgIGJpdG1hc2sgJj0gfihpc0N1cnJ5ID8gV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcgOiBXUkFQX1BBUlRJQUxfRkxBRyk7XG5cbiAgICAgIGlmICghKGJpdG1hc2sgJiBXUkFQX0NVUlJZX0JPVU5EX0ZMQUcpKSB7XG4gICAgICAgIGJpdG1hc2sgJj0gfihXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRyk7XG4gICAgICB9XG4gICAgICB2YXIgbmV3RGF0YSA9IFtcbiAgICAgICAgZnVuYywgYml0bWFzaywgdGhpc0FyZywgbmV3UGFydGlhbHMsIG5ld0hvbGRlcnMsIG5ld1BhcnRpYWxzUmlnaHQsXG4gICAgICAgIG5ld0hvbGRlcnNSaWdodCwgYXJnUG9zLCBhcnksIGFyaXR5XG4gICAgICBdO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gd3JhcEZ1bmMuYXBwbHkodW5kZWZpbmVkLCBuZXdEYXRhKTtcbiAgICAgIGlmIChpc0xhemlhYmxlKGZ1bmMpKSB7XG4gICAgICAgIHNldERhdGEocmVzdWx0LCBuZXdEYXRhKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyO1xuICAgICAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsIGZ1bmMsIGJpdG1hc2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLnJvdW5kYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGBNYXRoYCBtZXRob2QgdG8gdXNlIHdoZW4gcm91bmRpbmcuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcm91bmQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUm91bmQobWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGZ1bmMgPSBNYXRoW21ldGhvZE5hbWVdO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG51bWJlciwgcHJlY2lzaW9uKSB7XG4gICAgICAgIG51bWJlciA9IHRvTnVtYmVyKG51bWJlcik7XG4gICAgICAgIHByZWNpc2lvbiA9IHByZWNpc2lvbiA9PSBudWxsID8gMCA6IG5hdGl2ZU1pbih0b0ludGVnZXIocHJlY2lzaW9uKSwgMjkyKTtcbiAgICAgICAgaWYgKHByZWNpc2lvbiAmJiBuYXRpdmVJc0Zpbml0ZShudW1iZXIpKSB7XG4gICAgICAgICAgLy8gU2hpZnQgd2l0aCBleHBvbmVudGlhbCBub3RhdGlvbiB0byBhdm9pZCBmbG9hdGluZy1wb2ludCBpc3N1ZXMuXG4gICAgICAgICAgLy8gU2VlIFtNRE5dKGh0dHBzOi8vbWRuLmlvL3JvdW5kI0V4YW1wbGVzKSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgIHZhciBwYWlyID0gKHRvU3RyaW5nKG51bWJlcikgKyAnZScpLnNwbGl0KCdlJyksXG4gICAgICAgICAgICAgIHZhbHVlID0gZnVuYyhwYWlyWzBdICsgJ2UnICsgKCtwYWlyWzFdICsgcHJlY2lzaW9uKSk7XG5cbiAgICAgICAgICBwYWlyID0gKHRvU3RyaW5nKHZhbHVlKSArICdlJykuc3BsaXQoJ2UnKTtcbiAgICAgICAgICByZXR1cm4gKyhwYWlyWzBdICsgJ2UnICsgKCtwYWlyWzFdIC0gcHJlY2lzaW9uKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmMobnVtYmVyKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNldCBvYmplY3Qgb2YgYHZhbHVlc2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFkZCB0byB0aGUgc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBzZXQuXG4gICAgICovXG4gICAgdmFyIGNyZWF0ZVNldCA9ICEoU2V0ICYmICgxIC8gc2V0VG9BcnJheShuZXcgU2V0KFssLTBdKSlbMV0pID09IElORklOSVRZKSA/IG5vb3AgOiBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBuZXcgU2V0KHZhbHVlcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy50b1BhaXJzYCBvciBgXy50b1BhaXJzSW5gIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhaXJzIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVRvUGFpcnMoa2V5c0Z1bmMpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgdmFyIHRhZyA9IGdldFRhZyhvYmplY3QpO1xuICAgICAgICBpZiAodGFnID09IG1hcFRhZykge1xuICAgICAgICAgIHJldHVybiBtYXBUb0FycmF5KG9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhZyA9PSBzZXRUYWcpIHtcbiAgICAgICAgICByZXR1cm4gc2V0VG9QYWlycyhvYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiYXNlVG9QYWlycyhvYmplY3QsIGtleXNGdW5jKG9iamVjdCkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBlaXRoZXIgY3VycmllcyBvciBpbnZva2VzIGBmdW5jYCB3aXRoIG9wdGlvbmFsXG4gICAgICogYHRoaXNgIGJpbmRpbmcgYW5kIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGZ1bmMgVGhlIGZ1bmN0aW9uIG9yIG1ldGhvZCBuYW1lIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICogICAgMSAtIGBfLmJpbmRgXG4gICAgICogICAgMiAtIGBfLmJpbmRLZXlgXG4gICAgICogICAgNCAtIGBfLmN1cnJ5YCBvciBgXy5jdXJyeVJpZ2h0YCBvZiBhIGJvdW5kIGZ1bmN0aW9uXG4gICAgICogICAgOCAtIGBfLmN1cnJ5YFxuICAgICAqICAgMTYgLSBgXy5jdXJyeVJpZ2h0YFxuICAgICAqICAgMzIgLSBgXy5wYXJ0aWFsYFxuICAgICAqICAgNjQgLSBgXy5wYXJ0aWFsUmlnaHRgXG4gICAgICogIDEyOCAtIGBfLnJlYXJnYFxuICAgICAqICAyNTYgLSBgXy5hcnlgXG4gICAgICogIDUxMiAtIGBfLmZsaXBgXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJ5XSBUaGUgYXJpdHkgY2FwIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlV3JhcChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNCaW5kS2V5ID0gYml0bWFzayAmIFdSQVBfQklORF9LRVlfRkxBRztcbiAgICAgIGlmICghaXNCaW5kS2V5ICYmIHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IHBhcnRpYWxzID8gcGFydGlhbHMubGVuZ3RoIDogMDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIGJpdG1hc2sgJj0gfihXUkFQX1BBUlRJQUxfRkxBRyB8IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKTtcbiAgICAgICAgcGFydGlhbHMgPSBob2xkZXJzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgYXJ5ID0gYXJ5ID09PSB1bmRlZmluZWQgPyBhcnkgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKGFyeSksIDApO1xuICAgICAgYXJpdHkgPSBhcml0eSA9PT0gdW5kZWZpbmVkID8gYXJpdHkgOiB0b0ludGVnZXIoYXJpdHkpO1xuICAgICAgbGVuZ3RoIC09IGhvbGRlcnMgPyBob2xkZXJzLmxlbmd0aCA6IDA7XG5cbiAgICAgIGlmIChiaXRtYXNrICYgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcpIHtcbiAgICAgICAgdmFyIHBhcnRpYWxzUmlnaHQgPSBwYXJ0aWFscyxcbiAgICAgICAgICAgIGhvbGRlcnNSaWdodCA9IGhvbGRlcnM7XG5cbiAgICAgICAgcGFydGlhbHMgPSBob2xkZXJzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdmFyIGRhdGEgPSBpc0JpbmRLZXkgPyB1bmRlZmluZWQgOiBnZXREYXRhKGZ1bmMpO1xuXG4gICAgICB2YXIgbmV3RGF0YSA9IFtcbiAgICAgICAgZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCxcbiAgICAgICAgYXJnUG9zLCBhcnksIGFyaXR5XG4gICAgICBdO1xuXG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBtZXJnZURhdGEobmV3RGF0YSwgZGF0YSk7XG4gICAgICB9XG4gICAgICBmdW5jID0gbmV3RGF0YVswXTtcbiAgICAgIGJpdG1hc2sgPSBuZXdEYXRhWzFdO1xuICAgICAgdGhpc0FyZyA9IG5ld0RhdGFbMl07XG4gICAgICBwYXJ0aWFscyA9IG5ld0RhdGFbM107XG4gICAgICBob2xkZXJzID0gbmV3RGF0YVs0XTtcbiAgICAgIGFyaXR5ID0gbmV3RGF0YVs5XSA9IG5ld0RhdGFbOV0gPT09IHVuZGVmaW5lZFxuICAgICAgICA/IChpc0JpbmRLZXkgPyAwIDogZnVuYy5sZW5ndGgpXG4gICAgICAgIDogbmF0aXZlTWF4KG5ld0RhdGFbOV0gLSBsZW5ndGgsIDApO1xuXG4gICAgICBpZiAoIWFyaXR5ICYmIGJpdG1hc2sgJiAoV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9DVVJSWV9SSUdIVF9GTEFHKSkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9DVVJSWV9SSUdIVF9GTEFHKTtcbiAgICAgIH1cbiAgICAgIGlmICghYml0bWFzayB8fCBiaXRtYXNrID09IFdSQVBfQklORF9GTEFHKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBjcmVhdGVCaW5kKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcpO1xuICAgICAgfSBlbHNlIGlmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRyB8fCBiaXRtYXNrID09IFdSQVBfQ1VSUllfUklHSFRfRkxBRykge1xuICAgICAgICByZXN1bHQgPSBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSk7XG4gICAgICB9IGVsc2UgaWYgKChiaXRtYXNrID09IFdSQVBfUEFSVElBTF9GTEFHIHx8IGJpdG1hc2sgPT0gKFdSQVBfQklORF9GTEFHIHwgV1JBUF9QQVJUSUFMX0ZMQUcpKSAmJiAhaG9sZGVycy5sZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBjcmVhdGVIeWJyaWQuYXBwbHkodW5kZWZpbmVkLCBuZXdEYXRhKTtcbiAgICAgIH1cbiAgICAgIHZhciBzZXR0ZXIgPSBkYXRhID8gYmFzZVNldERhdGEgOiBzZXREYXRhO1xuICAgICAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhzZXR0ZXIocmVzdWx0LCBuZXdEYXRhKSwgZnVuYywgYml0bWFzayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5kZWZhdWx0c2AgdG8gY3VzdG9taXplIGl0cyBgXy5hc3NpZ25JbmAgdXNlIHRvIGFzc2lnbiBwcm9wZXJ0aWVzXG4gICAgICogb2Ygc291cmNlIG9iamVjdHMgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgYWxsIGRlc3RpbmF0aW9uIHByb3BlcnRpZXNcbiAgICAgKiB0aGF0IHJlc29sdmUgdG8gYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gb2JqVmFsdWUgVGhlIGRlc3RpbmF0aW9uIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHNvdXJjZSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBwYXJlbnQgb2JqZWN0IG9mIGBvYmpWYWx1ZWAuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgIGlmIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKGVxKG9ialZhbHVlLCBvYmplY3RQcm90b1trZXldKSAmJiAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSB7XG4gICAgICAgIHJldHVybiBzcmNWYWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpWYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGJ5IGBfLmRlZmF1bHRzRGVlcGAgdG8gY3VzdG9taXplIGl0cyBgXy5tZXJnZWAgdXNlIHRvIG1lcmdlIHNvdXJjZVxuICAgICAqIG9iamVjdHMgaW50byBkZXN0aW5hdGlvbiBvYmplY3RzIHRoYXQgYXJlIHBhc3NlZCB0aHJ1LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IG9ialZhbHVlIFRoZSBkZXN0aW5hdGlvbiB2YWx1ZS5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSBzb3VyY2UgdmFsdWUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBtZXJnZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBwYXJlbnQgb2JqZWN0IG9mIGBvYmpWYWx1ZWAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgcGFyZW50IG9iamVjdCBvZiBgc3JjVmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzTWVyZ2Uob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlLCBzdGFjaykge1xuICAgICAgaWYgKGlzT2JqZWN0KG9ialZhbHVlKSAmJiBpc09iamVjdChzcmNWYWx1ZSkpIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIHN0YWNrLnNldChzcmNWYWx1ZSwgb2JqVmFsdWUpO1xuICAgICAgICBiYXNlTWVyZ2Uob2JqVmFsdWUsIHNyY1ZhbHVlLCB1bmRlZmluZWQsIGN1c3RvbURlZmF1bHRzTWVyZ2UsIHN0YWNrKTtcbiAgICAgICAgc3RhY2tbJ2RlbGV0ZSddKHNyY1ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpWYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGJ5IGBfLm9taXRgIHRvIGN1c3RvbWl6ZSBpdHMgYF8uY2xvbmVEZWVwYCB1c2UgdG8gb25seSBjbG9uZSBwbGFpblxuICAgICAqIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB1bmNsb25lZCB2YWx1ZSBvciBgdW5kZWZpbmVkYCB0byBkZWZlciBjbG9uaW5nIHRvIGBfLmNsb25lRGVlcGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VzdG9tT21pdENsb25lKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNQbGFpbk9iamVjdCh2YWx1ZSkgPyB1bmRlZmluZWQgOiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGFycmF5cyB3aXRoIHN1cHBvcnQgZm9yXG4gICAgICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBvdGhlciBUaGUgb3RoZXIgYXJyYXkgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBhcnJheWAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFycmF5cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxdWFsQXJyYXlzKGFycmF5LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICAgICAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgICAgICBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgb3RoTGVuZ3RoID0gb3RoZXIubGVuZ3RoO1xuXG4gICAgICBpZiAoYXJyTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhKGlzUGFydGlhbCAmJiBvdGhMZW5ndGggPiBhcnJMZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIHRoYXQgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICB2YXIgYXJyU3RhY2tlZCA9IHN0YWNrLmdldChhcnJheSk7XG4gICAgICB2YXIgb3RoU3RhY2tlZCA9IHN0YWNrLmdldChvdGhlcik7XG4gICAgICBpZiAoYXJyU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgICAgIHJldHVybiBhcnJTdGFja2VkID09IG90aGVyICYmIG90aFN0YWNrZWQgPT0gYXJyYXk7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSB0cnVlLFxuICAgICAgICAgIHNlZW4gPSAoYml0bWFzayAmIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpID8gbmV3IFNldENhY2hlIDogdW5kZWZpbmVkO1xuXG4gICAgICBzdGFjay5zZXQoYXJyYXksIG90aGVyKTtcbiAgICAgIHN0YWNrLnNldChvdGhlciwgYXJyYXkpO1xuXG4gICAgICAvLyBJZ25vcmUgbm9uLWluZGV4IHByb3BlcnRpZXMuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGFyckxlbmd0aCkge1xuICAgICAgICB2YXIgYXJyVmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBvdGhWYWx1ZSA9IG90aGVyW2luZGV4XTtcblxuICAgICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBhcnJWYWx1ZSwgaW5kZXgsIG90aGVyLCBhcnJheSwgc3RhY2spXG4gICAgICAgICAgICA6IGN1c3RvbWl6ZXIoYXJyVmFsdWUsIG90aFZhbHVlLCBpbmRleCwgYXJyYXksIG90aGVyLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXBhcmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoY29tcGFyZWQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBpZiAoc2Vlbikge1xuICAgICAgICAgIGlmICghYXJyYXlTb21lKG90aGVyLCBmdW5jdGlvbihvdGhWYWx1ZSwgb3RoSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNhY2hlSGFzKHNlZW4sIG90aEluZGV4KSAmJlxuICAgICAgICAgICAgICAgICAgICAoYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBzZWVuLnB1c2gob3RoSW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCEoXG4gICAgICAgICAgICAgIGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fFxuICAgICAgICAgICAgICAgIGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFja1snZGVsZXRlJ10oYXJyYXkpO1xuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBjb21wYXJpbmcgb2JqZWN0cyBvZlxuICAgICAqIHRoZSBzYW1lIGB0b1N0cmluZ1RhZ2AuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNvbXBhcmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gICAgICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgb3IgYFN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0cyB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIHRhZywgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgY2FzZSBkYXRhVmlld1RhZzpcbiAgICAgICAgICBpZiAoKG9iamVjdC5ieXRlTGVuZ3RoICE9IG90aGVyLmJ5dGVMZW5ndGgpIHx8XG4gICAgICAgICAgICAgIChvYmplY3QuYnl0ZU9mZnNldCAhPSBvdGhlci5ieXRlT2Zmc2V0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvYmplY3QgPSBvYmplY3QuYnVmZmVyO1xuICAgICAgICAgIG90aGVyID0gb3RoZXIuYnVmZmVyO1xuXG4gICAgICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgICAgICAhZXF1YWxGdW5jKG5ldyBVaW50OEFycmF5KG9iamVjdCksIG5ldyBVaW50OEFycmF5KG90aGVyKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgY2FzZSBib29sVGFnOlxuICAgICAgICBjYXNlIGRhdGVUYWc6XG4gICAgICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgICAgICAgIC8vIENvZXJjZSBib29sZWFucyB0byBgMWAgb3IgYDBgIGFuZCBkYXRlcyB0byBtaWxsaXNlY29uZHMuXG4gICAgICAgICAgLy8gSW52YWxpZCBkYXRlcyBhcmUgY29lcmNlZCB0byBgTmFOYC5cbiAgICAgICAgICByZXR1cm4gZXEoK29iamVjdCwgK290aGVyKTtcblxuICAgICAgICBjYXNlIGVycm9yVGFnOlxuICAgICAgICAgIHJldHVybiBvYmplY3QubmFtZSA9PSBvdGhlci5uYW1lICYmIG9iamVjdC5tZXNzYWdlID09IG90aGVyLm1lc3NhZ2U7XG5cbiAgICAgICAgY2FzZSByZWdleHBUYWc6XG4gICAgICAgIGNhc2Ugc3RyaW5nVGFnOlxuICAgICAgICAgIC8vIENvZXJjZSByZWdleGVzIHRvIHN0cmluZ3MgYW5kIHRyZWF0IHN0cmluZ3MsIHByaW1pdGl2ZXMgYW5kIG9iamVjdHMsXG4gICAgICAgICAgLy8gYXMgZXF1YWwuIFNlZSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcmVnZXhwLnByb3RvdHlwZS50b3N0cmluZ1xuICAgICAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgICAgcmV0dXJuIG9iamVjdCA9PSAob3RoZXIgKyAnJyk7XG5cbiAgICAgICAgY2FzZSBtYXBUYWc6XG4gICAgICAgICAgdmFyIGNvbnZlcnQgPSBtYXBUb0FycmF5O1xuXG4gICAgICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUc7XG4gICAgICAgICAgY29udmVydCB8fCAoY29udmVydCA9IHNldFRvQXJyYXkpO1xuXG4gICAgICAgICAgaWYgKG9iamVjdC5zaXplICE9IG90aGVyLnNpemUgJiYgIWlzUGFydGlhbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgICAgICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YWNrZWQgPT0gb3RoZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJpdG1hc2sgfD0gQ09NUEFSRV9VTk9SREVSRURfRkxBRztcblxuICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gZXF1YWxBcnJheXMoY29udmVydChvYmplY3QpLCBjb252ZXJ0KG90aGVyKSwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gICAgICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgICAgICBjYXNlIHN5bWJvbFRhZzpcbiAgICAgICAgICBpZiAoc3ltYm9sVmFsdWVPZikge1xuICAgICAgICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YuY2FsbChvYmplY3QpID09IHN5bWJvbFZhbHVlT2YuY2FsbChvdGhlcik7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3Igb2JqZWN0cyB3aXRoIHN1cHBvcnQgZm9yXG4gICAgICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICAgICAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgICAgICBvYmpQcm9wcyA9IGdldEFsbEtleXMob2JqZWN0KSxcbiAgICAgICAgICBvYmpMZW5ndGggPSBvYmpQcm9wcy5sZW5ndGgsXG4gICAgICAgICAgb3RoUHJvcHMgPSBnZXRBbGxLZXlzKG90aGVyKSxcbiAgICAgICAgICBvdGhMZW5ndGggPSBvdGhQcm9wcy5sZW5ndGg7XG5cbiAgICAgIGlmIChvYmpMZW5ndGggIT0gb3RoTGVuZ3RoICYmICFpc1BhcnRpYWwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gb2JqTGVuZ3RoO1xuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgdmFyIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICAgICAgaWYgKCEoaXNQYXJ0aWFsID8ga2V5IGluIG90aGVyIDogaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwga2V5KSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIHRoYXQgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICB2YXIgb2JqU3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpO1xuICAgICAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICAgICAgaWYgKG9ialN0YWNrZWQgJiYgb3RoU3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gb2JqU3RhY2tlZCA9PSBvdGhlciAmJiBvdGhTdGFja2VkID09IG9iamVjdDtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSB0cnVlO1xuICAgICAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICAgICAgc3RhY2suc2V0KG90aGVyLCBvYmplY3QpO1xuXG4gICAgICB2YXIgc2tpcEN0b3IgPSBpc1BhcnRpYWw7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IG9iakxlbmd0aCkge1xuICAgICAgICBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltrZXldO1xuXG4gICAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIG9ialZhbHVlLCBrZXksIG90aGVyLCBvYmplY3QsIHN0YWNrKVxuICAgICAgICAgICAgOiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSwga2V5LCBvYmplY3QsIG90aGVyLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGlmICghKGNvbXBhcmVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyAob2JqVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhvYmpWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSlcbiAgICAgICAgICAgICAgOiBjb21wYXJlZFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHNraXBDdG9yIHx8IChza2lwQ3RvciA9IGtleSA9PSAnY29uc3RydWN0b3InKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgJiYgIXNraXBDdG9yKSB7XG4gICAgICAgIHZhciBvYmpDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgb3RoQ3RvciA9IG90aGVyLmNvbnN0cnVjdG9yO1xuXG4gICAgICAgIC8vIE5vbiBgT2JqZWN0YCBvYmplY3QgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWFsLlxuICAgICAgICBpZiAob2JqQ3RvciAhPSBvdGhDdG9yICYmXG4gICAgICAgICAgICAoJ2NvbnN0cnVjdG9yJyBpbiBvYmplY3QgJiYgJ2NvbnN0cnVjdG9yJyBpbiBvdGhlcikgJiZcbiAgICAgICAgICAgICEodHlwZW9mIG9iakN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciAmJlxuICAgICAgICAgICAgICB0eXBlb2Ygb3RoQ3RvciA9PSAnZnVuY3Rpb24nICYmIG90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yKSkge1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIGZsYXR0ZW5zIHRoZSByZXN0IGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpIHtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCB1bmRlZmluZWQsIGZsYXR0ZW4pLCBmdW5jICsgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KSB7XG4gICAgICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzLCBnZXRTeW1ib2xzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gICAgICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0QWxsS2V5c0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0luLCBnZXRTeW1ib2xzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgbWV0YWRhdGEgZm9yIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGdldERhdGEgPSAhbWV0YU1hcCA/IG5vb3AgOiBmdW5jdGlvbihmdW5jKSB7XG4gICAgICByZXR1cm4gbWV0YU1hcC5nZXQoZnVuYyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5hbWUgb2YgYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEZ1bmNOYW1lKGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQgPSAoZnVuYy5uYW1lICsgJycpLFxuICAgICAgICAgIGFycmF5ID0gcmVhbE5hbWVzW3Jlc3VsdF0sXG4gICAgICAgICAgbGVuZ3RoID0gaGFzT3duUHJvcGVydHkuY2FsbChyZWFsTmFtZXMsIHJlc3VsdCkgPyBhcnJheS5sZW5ndGggOiAwO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGRhdGEgPSBhcnJheVtsZW5ndGhdLFxuICAgICAgICAgICAgb3RoZXJGdW5jID0gZGF0YS5mdW5jO1xuICAgICAgICBpZiAob3RoZXJGdW5jID09IG51bGwgfHwgb3RoZXJGdW5jID09IGZ1bmMpIHtcbiAgICAgICAgICByZXR1cm4gZGF0YS5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFyZ3VtZW50IHBsYWNlaG9sZGVyIHZhbHVlIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEhvbGRlcihmdW5jKSB7XG4gICAgICB2YXIgb2JqZWN0ID0gaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gsICdwbGFjZWhvbGRlcicpID8gbG9kYXNoIDogZnVuYztcbiAgICAgIHJldHVybiBvYmplY3QucGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYXBwcm9wcmlhdGUgXCJpdGVyYXRlZVwiIGZ1bmN0aW9uLiBJZiBgXy5pdGVyYXRlZWAgaXMgY3VzdG9taXplZCxcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGN1c3RvbSBtZXRob2QsIG90aGVyd2lzZSBpdCByZXR1cm5zIGBiYXNlSXRlcmF0ZWVgLlxuICAgICAqIElmIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQsIHRoZSBjaG9zZW4gZnVuY3Rpb24gaXMgaW52b2tlZCB3aXRoIHRoZW0gYW5kXG4gICAgICogaXRzIHJlc3VsdCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBbdmFsdWVdIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGFuIGl0ZXJhdGVlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiB0aGUgY3JlYXRlZCBpdGVyYXRlZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNob3NlbiBmdW5jdGlvbiBvciBpdHMgcmVzdWx0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEl0ZXJhdGVlKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaC5pdGVyYXRlZSB8fCBpdGVyYXRlZTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCA9PT0gaXRlcmF0ZWUgPyBiYXNlSXRlcmF0ZWUgOiByZXN1bHQ7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHJlc3VsdChhcmd1bWVudHNbMF0sIGFyZ3VtZW50c1sxXSkgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSByZWZlcmVuY2Uga2V5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXAgZGF0YS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCwga2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IG1hcC5fX2RhdGFfXztcbiAgICAgIHJldHVybiBpc0tleWFibGUoa2V5KVxuICAgICAgICA/IGRhdGFbdHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/ICdzdHJpbmcnIDogJ2hhc2gnXVxuICAgICAgICA6IGRhdGEubWFwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHByb3BlcnR5IG5hbWVzLCB2YWx1ZXMsIGFuZCBjb21wYXJlIGZsYWdzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBtYXRjaCBkYXRhIG9mIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE1hdGNoRGF0YShvYmplY3QpIHtcbiAgICAgIHZhciByZXN1bHQgPSBrZXlzKG9iamVjdCksXG4gICAgICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBrZXkgPSByZXN1bHRbbGVuZ3RoXSxcbiAgICAgICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICAgICAgcmVzdWx0W2xlbmd0aF0gPSBba2V5LCB2YWx1ZSwgaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCwga2V5KSB7XG4gICAgICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShvYmplY3QsIGtleSk7XG4gICAgICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJhdyBgdG9TdHJpbmdUYWdgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICAgICAgdmFyIGlzT3duID0gaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgc3ltVG9TdHJpbmdUYWcpLFxuICAgICAgICAgIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgdW5tYXNrZWQgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge31cblxuICAgICAgdmFyIHJlc3VsdCA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgICAgaWYgKHVubWFza2VkKSB7XG4gICAgICAgIGlmIChpc093bikge1xuICAgICAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHRhZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gICAgICovXG4gICAgdmFyIGdldFN5bWJvbHMgPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgcmV0dXJuIGFycmF5RmlsdGVyKG5hdGl2ZUdldFN5bWJvbHMob2JqZWN0KSwgZnVuY3Rpb24oc3ltYm9sKSB7XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCwgc3ltYm9sKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gICAgICovXG4gICAgdmFyIGdldFN5bWJvbHNJbiA9ICFuYXRpdmVHZXRTeW1ib2xzID8gc3R1YkFycmF5IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICB3aGlsZSAob2JqZWN0KSB7XG4gICAgICAgIGFycmF5UHVzaChyZXN1bHQsIGdldFN5bWJvbHMob2JqZWN0KSk7XG4gICAgICAgIG9iamVjdCA9IGdldFByb3RvdHlwZShvYmplY3QpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYHRvU3RyaW5nVGFnYCBvZiBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqL1xuICAgIHZhciBnZXRUYWcgPSBiYXNlR2V0VGFnO1xuXG4gICAgLy8gRmFsbGJhY2sgZm9yIGRhdGEgdmlld3MsIG1hcHMsIHNldHMsIGFuZCB3ZWFrIG1hcHMgaW4gSUUgMTEgYW5kIHByb21pc2VzIGluIE5vZGUuanMgPCA2LlxuICAgIGlmICgoRGF0YVZpZXcgJiYgZ2V0VGFnKG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMSkpKSAhPSBkYXRhVmlld1RhZykgfHxcbiAgICAgICAgKE1hcCAmJiBnZXRUYWcobmV3IE1hcCkgIT0gbWFwVGFnKSB8fFxuICAgICAgICAoUHJvbWlzZSAmJiBnZXRUYWcoUHJvbWlzZS5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcpIHx8XG4gICAgICAgIChTZXQgJiYgZ2V0VGFnKG5ldyBTZXQpICE9IHNldFRhZykgfHxcbiAgICAgICAgKFdlYWtNYXAgJiYgZ2V0VGFnKG5ldyBXZWFrTWFwKSAhPSB3ZWFrTWFwVGFnKSkge1xuICAgICAgZ2V0VGFnID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGJhc2VHZXRUYWcodmFsdWUpLFxuICAgICAgICAgICAgQ3RvciA9IHJlc3VsdCA9PSBvYmplY3RUYWcgPyB2YWx1ZS5jb25zdHJ1Y3RvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGN0b3JTdHJpbmcgPSBDdG9yID8gdG9Tb3VyY2UoQ3RvcikgOiAnJztcblxuICAgICAgICBpZiAoY3RvclN0cmluZykge1xuICAgICAgICAgIHN3aXRjaCAoY3RvclN0cmluZykge1xuICAgICAgICAgICAgY2FzZSBkYXRhVmlld0N0b3JTdHJpbmc6IHJldHVybiBkYXRhVmlld1RhZztcbiAgICAgICAgICAgIGNhc2UgbWFwQ3RvclN0cmluZzogcmV0dXJuIG1hcFRhZztcbiAgICAgICAgICAgIGNhc2UgcHJvbWlzZUN0b3JTdHJpbmc6IHJldHVybiBwcm9taXNlVGFnO1xuICAgICAgICAgICAgY2FzZSBzZXRDdG9yU3RyaW5nOiByZXR1cm4gc2V0VGFnO1xuICAgICAgICAgICAgY2FzZSB3ZWFrTWFwQ3RvclN0cmluZzogcmV0dXJuIHdlYWtNYXBUYWc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZpZXcsIGFwcGx5aW5nIGFueSBgdHJhbnNmb3Jtc2AgdG8gdGhlIGBzdGFydGAgYW5kIGBlbmRgIHBvc2l0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgdmlldy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHZpZXcuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdHJhbnNmb3JtcyBUaGUgdHJhbnNmb3JtYXRpb25zIHRvIGFwcGx5IHRvIHRoZSB2aWV3LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGBzdGFydGAgYW5kIGBlbmRgXG4gICAgICogIHBvc2l0aW9ucyBvZiB0aGUgdmlldy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRWaWV3KHN0YXJ0LCBlbmQsIHRyYW5zZm9ybXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHRyYW5zZm9ybXMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZGF0YSA9IHRyYW5zZm9ybXNbaW5kZXhdLFxuICAgICAgICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuICAgICAgICBzd2l0Y2ggKGRhdGEudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2Ryb3AnOiAgICAgIHN0YXJ0ICs9IHNpemU7IGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2Ryb3BSaWdodCc6IGVuZCAtPSBzaXplOyBicmVhaztcbiAgICAgICAgICBjYXNlICd0YWtlJzogICAgICBlbmQgPSBuYXRpdmVNaW4oZW5kLCBzdGFydCArIHNpemUpOyBicmVhaztcbiAgICAgICAgICBjYXNlICd0YWtlUmlnaHQnOiBzdGFydCA9IG5hdGl2ZU1heChzdGFydCwgZW5kIC0gc2l6ZSk7IGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyAnc3RhcnQnOiBzdGFydCwgJ2VuZCc6IGVuZCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIHdyYXBwZXIgZGV0YWlscyBmcm9tIHRoZSBgc291cmNlYCBib2R5IGNvbW1lbnQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd3JhcHBlciBkZXRhaWxzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFdyYXBEZXRhaWxzKHNvdXJjZSkge1xuICAgICAgdmFyIG1hdGNoID0gc291cmNlLm1hdGNoKHJlV3JhcERldGFpbHMpO1xuICAgICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0uc3BsaXQocmVTcGxpdERldGFpbHMpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwYXRoYCBleGlzdHMgb24gYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYXNGdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjayBwcm9wZXJ0aWVzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzUGF0aChvYmplY3QsIHBhdGgsIGhhc0Z1bmMpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKTtcbiAgICAgICAgaWYgKCEocmVzdWx0ID0gb2JqZWN0ICE9IG51bGwgJiYgaGFzRnVuYyhvYmplY3QsIGtleSkpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0ID0gb2JqZWN0W2tleV07XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0IHx8ICsraW5kZXggIT0gbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBsZW5ndGggPSBvYmplY3QgPT0gbnVsbCA/IDAgOiBvYmplY3QubGVuZ3RoO1xuICAgICAgcmV0dXJuICEhbGVuZ3RoICYmIGlzTGVuZ3RoKGxlbmd0aCkgJiYgaXNJbmRleChrZXksIGxlbmd0aCkgJiZcbiAgICAgICAgKGlzQXJyYXkob2JqZWN0KSB8fCBpc0FyZ3VtZW50cyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhbiBhcnJheSBjbG9uZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5pdENsb25lQXJyYXkoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7XG5cbiAgICAgIC8vIEFkZCBwcm9wZXJ0aWVzIGFzc2lnbmVkIGJ5IGBSZWdFeHAjZXhlY2AuXG4gICAgICBpZiAobGVuZ3RoICYmIHR5cGVvZiBhcnJheVswXSA9PSAnc3RyaW5nJyAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCAnaW5kZXgnKSkge1xuICAgICAgICByZXN1bHQuaW5kZXggPSBhcnJheS5pbmRleDtcbiAgICAgICAgcmVzdWx0LmlucHV0ID0gYXJyYXkuaW5wdXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3QpIHtcbiAgICAgIHJldHVybiAodHlwZW9mIG9iamVjdC5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmICFpc1Byb3RvdHlwZShvYmplY3QpKVxuICAgICAgICA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpXG4gICAgICAgIDoge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lIGJhc2VkIG9uIGl0cyBgdG9TdHJpbmdUYWdgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjbG9uaW5nIHZhbHVlcyB3aXRoIHRhZ3Mgb2ZcbiAgICAgKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE1hcGAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgYFNldGAsIG9yIGBTdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5pdENsb25lQnlUYWcob2JqZWN0LCB0YWcsIGlzRGVlcCkge1xuICAgICAgdmFyIEN0b3IgPSBvYmplY3QuY29uc3RydWN0b3I7XG4gICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZUFycmF5QnVmZmVyKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSBib29sVGFnOlxuICAgICAgICBjYXNlIGRhdGVUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKCtvYmplY3QpO1xuXG4gICAgICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lRGF0YVZpZXcob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgICAgIGNhc2UgZmxvYXQzMlRhZzogY2FzZSBmbG9hdDY0VGFnOlxuICAgICAgICBjYXNlIGludDhUYWc6IGNhc2UgaW50MTZUYWc6IGNhc2UgaW50MzJUYWc6XG4gICAgICAgIGNhc2UgdWludDhUYWc6IGNhc2UgdWludDhDbGFtcGVkVGFnOiBjYXNlIHVpbnQxNlRhZzogY2FzZSB1aW50MzJUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lVHlwZWRBcnJheShvYmplY3QsIGlzRGVlcCk7XG5cbiAgICAgICAgY2FzZSBtYXBUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgICAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgICAgICByZXR1cm4gbmV3IEN0b3Iob2JqZWN0KTtcblxuICAgICAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVSZWdFeHAob2JqZWN0KTtcblxuICAgICAgICBjYXNlIHNldFRhZzpcbiAgICAgICAgICByZXR1cm4gbmV3IEN0b3I7XG5cbiAgICAgICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lU3ltYm9sKG9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyB3cmFwcGVyIGBkZXRhaWxzYCBpbiBhIGNvbW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgYHNvdXJjZWAgYm9keS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBUaGUgc291cmNlIHRvIG1vZGlmeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IGRldGFpbHMgVGhlIGRldGFpbHMgdG8gaW5zZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIG1vZGlmaWVkIHNvdXJjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIGRldGFpbHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBkZXRhaWxzLmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICB9XG4gICAgICB2YXIgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcbiAgICAgIGRldGFpbHNbbGFzdEluZGV4XSA9IChsZW5ndGggPiAxID8gJyYgJyA6ICcnKSArIGRldGFpbHNbbGFzdEluZGV4XTtcbiAgICAgIGRldGFpbHMgPSBkZXRhaWxzLmpvaW4obGVuZ3RoID4gMiA/ICcsICcgOiAnICcpO1xuICAgICAgcmV0dXJuIHNvdXJjZS5yZXBsYWNlKHJlV3JhcENvbW1lbnQsICd7XFxuLyogW3dyYXBwZWQgd2l0aCAnICsgZGV0YWlscyArICddICovXFxuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmbGF0dGVuYWJsZSBgYXJndW1lbnRzYCBvYmplY3Qgb3IgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZsYXR0ZW5hYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGbGF0dGVuYWJsZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSB8fFxuICAgICAgICAhIShzcHJlYWRhYmxlU3ltYm9sICYmIHZhbHVlICYmIHZhbHVlW3NwcmVhZGFibGVTeW1ib2xdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcblxuICAgICAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgICAgICh0eXBlID09ICdudW1iZXInIHx8XG4gICAgICAgICAgKHR5cGUgIT0gJ3N5bWJvbCcgJiYgcmVJc1VpbnQudGVzdCh2YWx1ZSkpKSAmJlxuICAgICAgICAgICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSB2YWx1ZSBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0geyp9IGluZGV4IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgaW5kZXggb3Iga2V5IGFyZ3VtZW50LlxuICAgICAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0l0ZXJhdGVlQ2FsbCh2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIGluZGV4O1xuICAgICAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgICAgID8gKGlzQXJyYXlMaWtlKG9iamVjdCkgJiYgaXNJbmRleChpbmRleCwgb2JqZWN0Lmxlbmd0aCkpXG4gICAgICAgICAgICA6ICh0eXBlID09ICdzdHJpbmcnICYmIGluZGV4IGluIG9iamVjdClcbiAgICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNLZXkodmFsdWUsIG9iamVjdCkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgICAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuICAgICAgICAgIHZhbHVlID09IG51bGwgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlSXNQbGFpblByb3AudGVzdCh2YWx1ZSkgfHwgIXJlSXNEZWVwUHJvcC50ZXN0KHZhbHVlKSB8fFxuICAgICAgICAob2JqZWN0ICE9IG51bGwgJiYgdmFsdWUgaW4gT2JqZWN0KG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgdW5pcXVlIG9iamVjdCBrZXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNLZXlhYmxlKHZhbHVlKSB7XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIHJldHVybiAodHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicpXG4gICAgICAgID8gKHZhbHVlICE9PSAnX19wcm90b19fJylcbiAgICAgICAgOiAodmFsdWUgPT09IG51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBoYXMgYSBsYXp5IGNvdW50ZXJwYXJ0LFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMYXppYWJsZShmdW5jKSB7XG4gICAgICB2YXIgZnVuY05hbWUgPSBnZXRGdW5jTmFtZShmdW5jKSxcbiAgICAgICAgICBvdGhlciA9IGxvZGFzaFtmdW5jTmFtZV07XG5cbiAgICAgIGlmICh0eXBlb2Ygb3RoZXIgIT0gJ2Z1bmN0aW9uJyB8fCAhKGZ1bmNOYW1lIGluIExhenlXcmFwcGVyLnByb3RvdHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGZ1bmMgPT09IG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIGRhdGEgPSBnZXREYXRhKG90aGVyKTtcbiAgICAgIHJldHVybiAhIWRhdGEgJiYgZnVuYyA9PT0gZGF0YVswXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gICAgICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIChtYXNrU3JjS2V5IGluIGZ1bmMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZnVuY2AgaXMgY2FwYWJsZSBvZiBiZWluZyBtYXNrZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2FibGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICB2YXIgaXNNYXNrYWJsZSA9IGNvcmVKc0RhdGEgPyBpc0Z1bmN0aW9uIDogc3R1YkZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICAgICAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgICAgICBwcm90byA9ICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IucHJvdG90eXBlKSB8fCBvYmplY3RQcm90bztcblxuICAgICAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpZiBzdWl0YWJsZSBmb3Igc3RyaWN0XG4gICAgICogIGVxdWFsaXR5IGNvbXBhcmlzb25zLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlICYmICFpc09iamVjdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBtYXRjaGVzUHJvcGVydHlgIGZvciBzb3VyY2UgdmFsdWVzIHN1aXRhYmxlXG4gICAgICogZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShrZXksIHNyY1ZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0W2tleV0gPT09IHNyY1ZhbHVlICYmXG4gICAgICAgICAgKHNyY1ZhbHVlICE9PSB1bmRlZmluZWQgfHwgKGtleSBpbiBPYmplY3Qob2JqZWN0KSkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWVtb2l6ZWAgd2hpY2ggY2xlYXJzIHRoZSBtZW1vaXplZCBmdW5jdGlvbidzXG4gICAgICogY2FjaGUgd2hlbiBpdCBleGNlZWRzIGBNQVhfTUVNT0laRV9TSVpFYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lbW9pemVDYXBwZWQoZnVuYykge1xuICAgICAgdmFyIHJlc3VsdCA9IG1lbW9pemUoZnVuYywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmIChjYWNoZS5zaXplID09PSBNQVhfTUVNT0laRV9TSVpFKSB7XG4gICAgICAgICAgY2FjaGUuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBjYWNoZSA9IHJlc3VsdC5jYWNoZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWVyZ2VzIHRoZSBmdW5jdGlvbiBtZXRhZGF0YSBvZiBgc291cmNlYCBpbnRvIGBkYXRhYC5cbiAgICAgKlxuICAgICAqIE1lcmdpbmcgbWV0YWRhdGEgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIHdyYXBwZXJzIHVzZWQgdG8gaW52b2tlIGEgZnVuY3Rpb24uXG4gICAgICogVGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlIG1ldGhvZHMgbGlrZSBgXy5iaW5kYCwgYF8uY3VycnlgLCBhbmQgYF8ucGFydGlhbGBcbiAgICAgKiBtYXkgYmUgYXBwbGllZCByZWdhcmRsZXNzIG9mIGV4ZWN1dGlvbiBvcmRlci4gTWV0aG9kcyBsaWtlIGBfLmFyeWAgYW5kXG4gICAgICogYF8ucmVhcmdgIG1vZGlmeSBmdW5jdGlvbiBhcmd1bWVudHMsIG1ha2luZyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmVcbiAgICAgKiBleGVjdXRlZCBpbXBvcnRhbnQsIHByZXZlbnRpbmcgdGhlIG1lcmdpbmcgb2YgbWV0YWRhdGEuIEhvd2V2ZXIsIHdlIG1ha2VcbiAgICAgKiBhbiBleGNlcHRpb24gZm9yIGEgc2FmZSBjb21iaW5lZCBjYXNlIHdoZXJlIGN1cnJpZWQgZnVuY3Rpb25zIGhhdmUgYF8uYXJ5YFxuICAgICAqIGFuZCBvciBgXy5yZWFyZ2AgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gZGF0YSBUaGUgZGVzdGluYXRpb24gbWV0YWRhdGEuXG4gICAgICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBzb3VyY2UgbWV0YWRhdGEuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBkYXRhYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZXJnZURhdGEoZGF0YSwgc291cmNlKSB7XG4gICAgICB2YXIgYml0bWFzayA9IGRhdGFbMV0sXG4gICAgICAgICAgc3JjQml0bWFzayA9IHNvdXJjZVsxXSxcbiAgICAgICAgICBuZXdCaXRtYXNrID0gYml0bWFzayB8IHNyY0JpdG1hc2ssXG4gICAgICAgICAgaXNDb21tb24gPSBuZXdCaXRtYXNrIDwgKFdSQVBfQklORF9GTEFHIHwgV1JBUF9CSU5EX0tFWV9GTEFHIHwgV1JBUF9BUllfRkxBRyk7XG5cbiAgICAgIHZhciBpc0NvbWJvID1cbiAgICAgICAgKChzcmNCaXRtYXNrID09IFdSQVBfQVJZX0ZMQUcpICYmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRykpIHx8XG4gICAgICAgICgoc3JjQml0bWFzayA9PSBXUkFQX0FSWV9GTEFHKSAmJiAoYml0bWFzayA9PSBXUkFQX1JFQVJHX0ZMQUcpICYmIChkYXRhWzddLmxlbmd0aCA8PSBzb3VyY2VbOF0pKSB8fFxuICAgICAgICAoKHNyY0JpdG1hc2sgPT0gKFdSQVBfQVJZX0ZMQUcgfCBXUkFQX1JFQVJHX0ZMQUcpKSAmJiAoc291cmNlWzddLmxlbmd0aCA8PSBzb3VyY2VbOF0pICYmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRykpO1xuXG4gICAgICAvLyBFeGl0IGVhcmx5IGlmIG1ldGFkYXRhIGNhbid0IGJlIG1lcmdlZC5cbiAgICAgIGlmICghKGlzQ29tbW9uIHx8IGlzQ29tYm8pKSB7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgdGhpc0FyZ2AgaWYgYXZhaWxhYmxlLlxuICAgICAgaWYgKHNyY0JpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRykge1xuICAgICAgICBkYXRhWzJdID0gc291cmNlWzJdO1xuICAgICAgICAvLyBTZXQgd2hlbiBjdXJyeWluZyBhIGJvdW5kIGZ1bmN0aW9uLlxuICAgICAgICBuZXdCaXRtYXNrIHw9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyA/IDAgOiBXUkFQX0NVUlJZX0JPVU5EX0ZMQUc7XG4gICAgICB9XG4gICAgICAvLyBDb21wb3NlIHBhcnRpYWwgYXJndW1lbnRzLlxuICAgICAgdmFyIHZhbHVlID0gc291cmNlWzNdO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHZhciBwYXJ0aWFscyA9IGRhdGFbM107XG4gICAgICAgIGRhdGFbM10gPSBwYXJ0aWFscyA/IGNvbXBvc2VBcmdzKHBhcnRpYWxzLCB2YWx1ZSwgc291cmNlWzRdKSA6IHZhbHVlO1xuICAgICAgICBkYXRhWzRdID0gcGFydGlhbHMgPyByZXBsYWNlSG9sZGVycyhkYXRhWzNdLCBQTEFDRUhPTERFUikgOiBzb3VyY2VbNF07XG4gICAgICB9XG4gICAgICAvLyBDb21wb3NlIHBhcnRpYWwgcmlnaHQgYXJndW1lbnRzLlxuICAgICAgdmFsdWUgPSBzb3VyY2VbNV07XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgcGFydGlhbHMgPSBkYXRhWzVdO1xuICAgICAgICBkYXRhWzVdID0gcGFydGlhbHMgPyBjb21wb3NlQXJnc1JpZ2h0KHBhcnRpYWxzLCB2YWx1ZSwgc291cmNlWzZdKSA6IHZhbHVlO1xuICAgICAgICBkYXRhWzZdID0gcGFydGlhbHMgPyByZXBsYWNlSG9sZGVycyhkYXRhWzVdLCBQTEFDRUhPTERFUikgOiBzb3VyY2VbNl07XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcmdQb3NgIGlmIGF2YWlsYWJsZS5cbiAgICAgIHZhbHVlID0gc291cmNlWzddO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGRhdGFbN10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGFyeWAgaWYgaXQncyBzbWFsbGVyLlxuICAgICAgaWYgKHNyY0JpdG1hc2sgJiBXUkFQX0FSWV9GTEFHKSB7XG4gICAgICAgIGRhdGFbOF0gPSBkYXRhWzhdID09IG51bGwgPyBzb3VyY2VbOF0gOiBuYXRpdmVNaW4oZGF0YVs4XSwgc291cmNlWzhdKTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGFyaXR5YCBpZiBvbmUgaXMgbm90IHByb3ZpZGVkLlxuICAgICAgaWYgKGRhdGFbOV0gPT0gbnVsbCkge1xuICAgICAgICBkYXRhWzldID0gc291cmNlWzldO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgZnVuY2AgYW5kIG1lcmdlIGJpdG1hc2tzLlxuICAgICAgZGF0YVswXSA9IHNvdXJjZVswXTtcbiAgICAgIGRhdGFbMV0gPSBuZXdCaXRtYXNrO1xuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2VcbiAgICAgKiBbYE9iamVjdC5rZXlzYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gICAgICogZXhjZXB0IHRoYXQgaXQgaW5jbHVkZXMgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgaWYgKG9iamVjdCAhPSBudWxsKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIHRyYW5zZm9ybXMgdGhlIHJlc3QgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgcmVzdCBhcnJheSB0cmFuc2Zvcm0uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gb3ZlclJlc3QoZnVuYywgc3RhcnQsIHRyYW5zZm9ybSkge1xuICAgICAgc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQgPT09IHVuZGVmaW5lZCA/IChmdW5jLmxlbmd0aCAtIDEpIDogc3RhcnQsIDApO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoYXJncy5sZW5ndGggLSBzdGFydCwgMCksXG4gICAgICAgICAgICBhcnJheSA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcnJheVtpbmRleF0gPSBhcmdzW3N0YXJ0ICsgaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgIHZhciBvdGhlckFyZ3MgPSBBcnJheShzdGFydCArIDEpO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IHN0YXJ0KSB7XG4gICAgICAgICAgb3RoZXJBcmdzW2luZGV4XSA9IGFyZ3NbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIG90aGVyQXJnc1tzdGFydF0gPSB0cmFuc2Zvcm0oYXJyYXkpO1xuICAgICAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgb3RoZXJBcmdzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcGFyZW50IHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gZ2V0IHRoZSBwYXJlbnQgdmFsdWUgb2YuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHBhcmVudCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJlbnQob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gcGF0aC5sZW5ndGggPCAyID8gb2JqZWN0IDogYmFzZUdldChvYmplY3QsIGJhc2VTbGljZShwYXRoLCAwLCAtMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlb3JkZXIgYGFycmF5YCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpbmRleGVzIHdoZXJlIHRoZSBlbGVtZW50IGF0XG4gICAgICogdGhlIGZpcnN0IGluZGV4IGlzIGFzc2lnbmVkIGFzIHRoZSBmaXJzdCBlbGVtZW50LCB0aGUgZWxlbWVudCBhdFxuICAgICAqIHRoZSBzZWNvbmQgaW5kZXggaXMgYXNzaWduZWQgYXMgdGhlIHNlY29uZCBlbGVtZW50LCBhbmQgc28gb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byByZW9yZGVyLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGluZGV4ZXMgVGhlIGFycmFuZ2VkIGFycmF5IGluZGV4ZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVvcmRlcihhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNaW4oaW5kZXhlcy5sZW5ndGgsIGFyckxlbmd0aCksXG4gICAgICAgICAgb2xkQXJyYXkgPSBjb3B5QXJyYXkoYXJyYXkpO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGluZGV4ID0gaW5kZXhlc1tsZW5ndGhdO1xuICAgICAgICBhcnJheVtsZW5ndGhdID0gaXNJbmRleChpbmRleCwgYXJyTGVuZ3RoKSA/IG9sZEFycmF5W2luZGV4XSA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCwgdW5sZXNzIGBrZXlgIGlzIFwiX19wcm90b19fXCIgb3IgXCJjb25zdHJ1Y3RvclwiLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNhZmVHZXQob2JqZWN0LCBrZXkpIHtcbiAgICAgIGlmIChrZXkgPT09ICdjb25zdHJ1Y3RvcicgJiYgdHlwZW9mIG9iamVjdFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGtleSA9PSAnX19wcm90b19fJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYmplY3Rba2V5XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSWYgdGhpcyBmdW5jdGlvbiBiZWNvbWVzIGhvdCwgaS5lLiBpcyBpbnZva2VkIGEgbG90IGluIGEgc2hvcnRcbiAgICAgKiBwZXJpb2Qgb2YgdGltZSwgaXQgd2lsbCB0cmlwIGl0cyBicmVha2VyIGFuZCB0cmFuc2l0aW9uIHRvIGFuIGlkZW50aXR5XG4gICAgICogZnVuY3Rpb24gdG8gYXZvaWQgZ2FyYmFnZSBjb2xsZWN0aW9uIHBhdXNlcyBpbiBWOC4gU2VlXG4gICAgICogW1Y4IGlzc3VlIDIwNzBdKGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTIwNzApXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzb2NpYXRlIG1ldGFkYXRhIHdpdGguXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBzZXREYXRhID0gc2hvcnRPdXQoYmFzZVNldERhdGEpO1xuXG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgdGhlIGdsb2JhbCBbYHNldFRpbWVvdXRgXShodHRwczovL21kbi5pby9zZXRUaW1lb3V0KS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfE9iamVjdH0gUmV0dXJucyB0aGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3QuXG4gICAgICovXG4gICAgdmFyIHNldFRpbWVvdXQgPSBjdHhTZXRUaW1lb3V0IHx8IGZ1bmN0aW9uKGZ1bmMsIHdhaXQpIHtcbiAgICAgIHJldHVybiByb290LnNldFRpbWVvdXQoZnVuYywgd2FpdCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGBmdW5jYCB0byByZXR1cm4gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIHNldFRvU3RyaW5nID0gc2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGB3cmFwcGVyYCB0byBtaW1pYyB0aGUgc291cmNlIG9mIGByZWZlcmVuY2VgXG4gICAgICogd2l0aCB3cmFwcGVyIGRldGFpbHMgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIHNvdXJjZSBib2R5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwcGVyIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVmZXJlbmNlIFRoZSByZWZlcmVuY2UgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYHdyYXBwZXJgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldFdyYXBUb1N0cmluZyh3cmFwcGVyLCByZWZlcmVuY2UsIGJpdG1hc2spIHtcbiAgICAgIHZhciBzb3VyY2UgPSAocmVmZXJlbmNlICsgJycpO1xuICAgICAgcmV0dXJuIHNldFRvU3RyaW5nKHdyYXBwZXIsIGluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSwgdXBkYXRlV3JhcERldGFpbHMoZ2V0V3JhcERldGFpbHMoc291cmNlKSwgYml0bWFzaykpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCdsbCBzaG9ydCBvdXQgYW5kIGludm9rZSBgaWRlbnRpdHlgIGluc3RlYWRcbiAgICAgKiBvZiBgZnVuY2Agd2hlbiBpdCdzIGNhbGxlZCBgSE9UX0NPVU5UYCBvciBtb3JlIHRpbWVzIGluIGBIT1RfU1BBTmBcbiAgICAgKiBtaWxsaXNlY29uZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNob3J0YWJsZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaG9ydE91dChmdW5jKSB7XG4gICAgICB2YXIgY291bnQgPSAwLFxuICAgICAgICAgIGxhc3RDYWxsZWQgPSAwO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzdGFtcCA9IG5hdGl2ZU5vdygpLFxuICAgICAgICAgICAgcmVtYWluaW5nID0gSE9UX1NQQU4gLSAoc3RhbXAgLSBsYXN0Q2FsbGVkKTtcblxuICAgICAgICBsYXN0Q2FsbGVkID0gc3RhbXA7XG4gICAgICAgIGlmIChyZW1haW5pbmcgPiAwKSB7XG4gICAgICAgICAgaWYgKCsrY291bnQgPj0gSE9UX0NPVU5UKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb3VudCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2h1ZmZsZWAgd2hpY2ggbXV0YXRlcyBhbmQgc2V0cyB0aGUgc2l6ZSBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2h1ZmZsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9YXJyYXkubGVuZ3RoXSBUaGUgc2l6ZSBvZiBgYXJyYXlgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNodWZmbGVTZWxmKGFycmF5LCBzaXplKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICAgICAgc2l6ZSA9IHNpemUgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHNpemU7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IHNpemUpIHtcbiAgICAgICAgdmFyIHJhbmQgPSBiYXNlUmFuZG9tKGluZGV4LCBsYXN0SW5kZXgpLFxuICAgICAgICAgICAgdmFsdWUgPSBhcnJheVtyYW5kXTtcblxuICAgICAgICBhcnJheVtyYW5kXSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBhcnJheS5sZW5ndGggPSBzaXplO1xuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAqL1xuICAgIHZhciBzdHJpbmdUb1BhdGggPSBtZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgaWYgKHN0cmluZy5jaGFyQ29kZUF0KDApID09PSA0NiAvKiAuICovKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKCcnKTtcbiAgICAgIH1cbiAgICAgIHN0cmluZy5yZXBsYWNlKHJlUHJvcE5hbWUsIGZ1bmN0aW9uKG1hdGNoLCBudW1iZXIsIHF1b3RlLCBzdWJTdHJpbmcpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gocXVvdGUgPyBzdWJTdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyBrZXkgaWYgaXQncyBub3QgYSBzdHJpbmcgb3Igc3ltYm9sLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8c3ltYm9sfSBSZXR1cm5zIHRoZSBrZXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9LZXkodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gICAgICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYGZ1bmNgIHRvIGl0cyBzb3VyY2UgY29kZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1NvdXJjZShmdW5jKSB7XG4gICAgICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoZnVuYyArICcnKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHdyYXBwZXIgYGRldGFpbHNgIGJhc2VkIG9uIGBiaXRtYXNrYCBmbGFncy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHJldHVybnMge0FycmF5fSBkZXRhaWxzIFRoZSBkZXRhaWxzIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgZGV0YWlsc2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdXBkYXRlV3JhcERldGFpbHMoZGV0YWlscywgYml0bWFzaykge1xuICAgICAgYXJyYXlFYWNoKHdyYXBGbGFncywgZnVuY3Rpb24ocGFpcikge1xuICAgICAgICB2YXIgdmFsdWUgPSAnXy4nICsgcGFpclswXTtcbiAgICAgICAgaWYgKChiaXRtYXNrICYgcGFpclsxXSkgJiYgIWFycmF5SW5jbHVkZXMoZGV0YWlscywgdmFsdWUpKSB7XG4gICAgICAgICAgZGV0YWlscy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZGV0YWlscy5zb3J0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGB3cmFwcGVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHdyYXBwZXIgVGhlIHdyYXBwZXIgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHdyYXBwZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlckNsb25lKHdyYXBwZXIpIHtcbiAgICAgIGlmICh3cmFwcGVyIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpIHtcbiAgICAgICAgcmV0dXJuIHdyYXBwZXIuY2xvbmUoKTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBuZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVyLl9fd3JhcHBlZF9fLCB3cmFwcGVyLl9fY2hhaW5fXyk7XG4gICAgICByZXN1bHQuX19hY3Rpb25zX18gPSBjb3B5QXJyYXkod3JhcHBlci5fX2FjdGlvbnNfXyk7XG4gICAgICByZXN1bHQuX19pbmRleF9fICA9IHdyYXBwZXIuX19pbmRleF9fO1xuICAgICAgcmVzdWx0Ll9fdmFsdWVzX18gPSB3cmFwcGVyLl9fdmFsdWVzX187XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgc3BsaXQgaW50byBncm91cHMgdGhlIGxlbmd0aCBvZiBgc2l6ZWAuXG4gICAgICogSWYgYGFycmF5YCBjYW4ndCBiZSBzcGxpdCBldmVubHksIHRoZSBmaW5hbCBjaHVuayB3aWxsIGJlIHRoZSByZW1haW5pbmdcbiAgICAgKiBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZT0xXSBUaGUgbGVuZ3RoIG9mIGVhY2ggY2h1bmtcbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNodW5rcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jaHVuayhbJ2EnLCAnYicsICdjJywgJ2QnXSwgMik7XG4gICAgICogLy8gPT4gW1snYScsICdiJ10sIFsnYycsICdkJ11dXG4gICAgICpcbiAgICAgKiBfLmNodW5rKFsnYScsICdiJywgJ2MnLCAnZCddLCAzKTtcbiAgICAgKiAvLyA9PiBbWydhJywgJ2InLCAnYyddLCBbJ2QnXV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjaHVuayhhcnJheSwgc2l6ZSwgZ3VhcmQpIHtcbiAgICAgIGlmICgoZ3VhcmQgPyBpc0l0ZXJhdGVlQ2FsbChhcnJheSwgc2l6ZSwgZ3VhcmQpIDogc2l6ZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBzaXplID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpemUgPSBuYXRpdmVNYXgodG9JbnRlZ2VyKHNpemUpLCAwKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoIHx8IHNpemUgPCAxKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IDAsXG4gICAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KG5hdGl2ZUNlaWwobGVuZ3RoIC8gc2l6ZSkpO1xuXG4gICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gYmFzZVNsaWNlKGFycmF5LCBpbmRleCwgKGluZGV4ICs9IHNpemUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSB3aXRoIGFsbCBmYWxzZXkgdmFsdWVzIHJlbW92ZWQuIFRoZSB2YWx1ZXMgYGZhbHNlYCwgYG51bGxgLFxuICAgICAqIGAwYCwgYFwiXCJgLCBgdW5kZWZpbmVkYCwgYW5kIGBOYU5gIGFyZSBmYWxzZXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY29tcGFjdChbMCwgMSwgZmFsc2UsIDIsICcnLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGFjdChhcnJheSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYXJyYXkgY29uY2F0ZW5hdGluZyBgYXJyYXlgIHdpdGggYW55IGFkZGl0aW9uYWwgYXJyYXlzXG4gICAgICogYW5kL29yIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb25jYXRlbmF0ZS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gY29uY2F0ZW5hdGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgY29uY2F0ZW5hdGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMV07XG4gICAgICogdmFyIG90aGVyID0gXy5jb25jYXQoYXJyYXksIDIsIFszXSwgW1s0XV0pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob3RoZXIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCBbNF1dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uY2F0KCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgYXJncyA9IEFycmF5KGxlbmd0aCAtIDEpLFxuICAgICAgICAgIGFycmF5ID0gYXJndW1lbnRzWzBdLFxuICAgICAgICAgIGluZGV4ID0gbGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICBhcmdzW2luZGV4IC0gMV0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5UHVzaChpc0FycmF5KGFycmF5KSA/IGNvcHlBcnJheShhcnJheSkgOiBbYXJyYXldLCBiYXNlRmxhdHRlbihhcmdzLCAxKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBgYXJyYXlgIHZhbHVlcyBub3QgaW5jbHVkZWQgaW4gdGhlIG90aGVyIGdpdmVuIGFycmF5c1xuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBzZWUgXy53aXRob3V0LCBfLnhvclxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRpZmZlcmVuY2UoWzIsIDFdLCBbMiwgM10pO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSlcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZGlmZmVyZW5jZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgYW5kIGB2YWx1ZXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb25cbiAgICAgKiBieSB3aGljaCB0aGV5J3JlIGNvbXBhcmVkLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gICAgICogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbEJ5YCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRpZmZlcmVuY2VCeShbMi4xLCAxLjJdLCBbMi4zLCAzLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kaWZmZXJlbmNlQnkoW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCBbeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgdmFyIGRpZmZlcmVuY2VCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QodmFsdWVzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIGJhc2VGbGF0dGVuKHZhbHVlcywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRpZmZlcmVuY2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAgdG8gYHZhbHVlc2AuIFRoZSBvcmRlciBhbmRcbiAgICAgKiByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgY29tcGFyYXRvclxuICAgICAqIGlzIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsQWxsV2l0aGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICpcbiAgICAgKiBfLmRpZmZlcmVuY2VXaXRoKG9iamVjdHMsIFt7ICd4JzogMSwgJ3knOiAyIH1dLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgdmFyIGRpZmZlcmVuY2VXaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KHZhbHVlcyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoY29tcGFyYXRvcikpIHtcbiAgICAgICAgY29tcGFyYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICAgICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgYmFzZUZsYXR0ZW4odmFsdWVzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIHVuZGVmaW5lZCwgY29tcGFyYXRvcilcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgYmVnaW5uaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRyb3AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICpcbiAgICAgKiBfLmRyb3AoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcChhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBuIDwgMCA/IDAgOiBuLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgZW5kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRyb3AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkcm9wUmlnaHQoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgbiA9IGxlbmd0aCAtIG47XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCAwLCBuIDwgMCA/IDAgOiBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCBleGNsdWRpbmcgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBlbmQuXG4gICAgICogRWxlbWVudHMgYXJlIGRyb3BwZWQgdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFJpZ2h0V2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCB0cnVlLCB0cnVlKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIGV4Y2x1ZGluZyBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKiBFbGVtZW50cyBhcmUgZHJvcHBlZCB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkcm9wV2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCB0cnVlKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGxzIGVsZW1lbnRzIG9mIGBhcnJheWAgd2l0aCBgdmFsdWVgIGZyb20gYHN0YXJ0YCB1cCB0bywgYnV0IG5vdFxuICAgICAqIGluY2x1ZGluZywgYGVuZGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZpbGwuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBgYXJyYXlgIHdpdGguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfLmZpbGwoYXJyYXksICdhJyk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYScsICdhJywgJ2EnXVxuICAgICAqXG4gICAgICogXy5maWxsKEFycmF5KDMpLCAyKTtcbiAgICAgKiAvLyA9PiBbMiwgMiwgMl1cbiAgICAgKlxuICAgICAqIF8uZmlsbChbNCwgNiwgOCwgMTBdLCAnKicsIDEsIDMpO1xuICAgICAqIC8vID0+IFs0LCAnKicsICcqJywgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmlsbChhcnJheSwgdmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCAmJiB0eXBlb2Ygc3RhcnQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoYXJyYXksIHZhbHVlLCBzdGFydCkpIHtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdFxuICAgICAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdiYXJuZXknOyB9KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCB7ICd1c2VyJzogJ2ZyZWQnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kSW5kZXgodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gZnJvbUluZGV4ID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgIGluZGV4ID0gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kSW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHNcbiAgICAgKiBvZiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWFycmF5Lmxlbmd0aC0xXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXIgPT0gJ3BlYmJsZXMnOyB9KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBsZW5ndGggLSAxO1xuICAgICAgaWYgKGZyb21JbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGluZGV4ID0gdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gICAgICAgIGluZGV4ID0gZnJvbUluZGV4IDwgMFxuICAgICAgICAgID8gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKVxuICAgICAgICAgIDogbmF0aXZlTWluKGluZGV4LCBsZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBpbmRleCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmxhdHRlbnMgYGFycmF5YCBhIHNpbmdsZSBsZXZlbCBkZWVwLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW4oWzEsIFsyLCBbMywgWzRdXSwgNV1dKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdHRlbihhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VGbGF0dGVuKGFycmF5LCAxKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbkRlZXAoWzEsIFsyLCBbMywgWzRdXSwgNV1dKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgNCwgNV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuRGVlcChhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VGbGF0dGVuKGFycmF5LCBJTkZJTklUWSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWN1cnNpdmVseSBmbGF0dGVuIGBhcnJheWAgdXAgdG8gYGRlcHRoYCB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjQuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIFsyLCBbMywgWzRdXSwgNV1dO1xuICAgICAqXG4gICAgICogXy5mbGF0dGVuRGVwdGgoYXJyYXksIDEpO1xuICAgICAqIC8vID0+IFsxLCAyLCBbMywgWzRdXSwgNV1cbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbkRlcHRoKGFycmF5LCAyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgWzRdLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXR0ZW5EZXB0aChhcnJheSwgZGVwdGgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGRlcHRoID0gZGVwdGggPT09IHVuZGVmaW5lZCA/IDEgOiB0b0ludGVnZXIoZGVwdGgpO1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGludmVyc2Ugb2YgYF8udG9QYWlyc2A7IHRoaXMgbWV0aG9kIHJldHVybnMgYW4gb2JqZWN0IGNvbXBvc2VkXG4gICAgICogZnJvbSBrZXktdmFsdWUgYHBhaXJzYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhaXJzIFRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mcm9tUGFpcnMoW1snYScsIDFdLCBbJ2InLCAyXV0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21QYWlycyhwYWlycykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGFpcnMgPT0gbnVsbCA/IDAgOiBwYWlycy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBwYWlyID0gcGFpcnNbaW5kZXhdO1xuICAgICAgICByZXN1bHRbcGFpclswXV0gPSBwYWlyWzFdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAYWxpYXMgZmlyc3RcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5oZWFkKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogXy5oZWFkKFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoZWFkKGFycmF5KSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBhcnJheVswXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBgdmFsdWVgIGlzIGZvdW5kIGluIGBhcnJheWBcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gSWYgYGZyb21JbmRleGAgaXMgbmVnYXRpdmUsIGl0J3MgdXNlZCBhcyB0aGVcbiAgICAgKiBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluZGV4T2YoWzEsIDIsIDEsIDJdLCAyKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiAvLyBTZWFyY2ggZnJvbSB0aGUgYGZyb21JbmRleGAuXG4gICAgICogXy5pbmRleE9mKFsxLCAyLCAxLCAyXSwgMiwgMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGZyb21JbmRleCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICBpbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgYnV0IHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5pdGlhbChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRpYWwoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlU2xpY2UoYXJyYXksIDAsIC0xKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiBhbGwgZ2l2ZW4gYXJyYXlzXG4gICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW50ZXJzZWN0aW9uKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMl1cbiAgICAgKi9cbiAgICB2YXIgaW50ZXJzZWN0aW9uID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcbiAgICAgIHJldHVybiAobWFwcGVkLmxlbmd0aCAmJiBtYXBwZWRbMF0gPT09IGFycmF5c1swXSlcbiAgICAgICAgPyBiYXNlSW50ZXJzZWN0aW9uKG1hcHBlZClcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgZWFjaCBgYXJyYXlzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW50ZXJzZWN0aW9uQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uaW50ZXJzZWN0aW9uQnkoW3sgJ3gnOiAxIH1dLCBbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxIH1dXG4gICAgICovXG4gICAgdmFyIGludGVyc2VjdGlvbkJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KGFycmF5cyksXG4gICAgICAgICAgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcblxuICAgICAgaWYgKGl0ZXJhdGVlID09PSBsYXN0KG1hcHBlZCkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXBwZWQucG9wKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzXG4gICAgICogb2YgcmVzdWx0IHZhbHVlcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBjb21wYXJhdG9yIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgaW50ZXJzZWN0aW5nIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICAgICAqIHZhciBvdGhlcnMgPSBbeyAneCc6IDEsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5pbnRlcnNlY3Rpb25XaXRoKG9iamVjdHMsIG90aGVycywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9XVxuICAgICAqL1xuICAgIHZhciBpbnRlcnNlY3Rpb25XaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKSxcbiAgICAgICAgICBtYXBwZWQgPSBhcnJheU1hcChhcnJheXMsIGNhc3RBcnJheUxpa2VPYmplY3QpO1xuXG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY29tcGFyYXRvcikge1xuICAgICAgICBtYXBwZWQucG9wKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQsIHVuZGVmaW5lZCwgY29tcGFyYXRvcilcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFsbCBlbGVtZW50cyBpbiBgYXJyYXlgIGludG8gYSBzdHJpbmcgc2VwYXJhdGVkIGJ5IGBzZXBhcmF0b3JgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbnZlcnQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZXBhcmF0b3I9JywnXSBUaGUgZWxlbWVudCBzZXBhcmF0b3IuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgam9pbmVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5qb2luKFsnYScsICdiJywgJ2MnXSwgJ34nKTtcbiAgICAgKiAvLyA9PiAnYX5ifmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gam9pbihhcnJheSwgc2VwYXJhdG9yKSB7XG4gICAgICByZXR1cm4gYXJyYXkgPT0gbnVsbCA/ICcnIDogbmF0aXZlSm9pbi5jYWxsKGFycmF5LCBzZXBhcmF0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sYXN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhc3QoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBhcnJheVtsZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBgYXJyYXlgIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9YXJyYXkubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxhc3RJbmRleE9mKFsxLCAyLCAxLCAyXSwgMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogLy8gU2VhcmNoIGZyb20gdGhlIGBmcm9tSW5kZXhgLlxuICAgICAqIF8ubGFzdEluZGV4T2YoWzEsIDIsIDEsIDJdLCAyLCAyKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGFzdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGxlbmd0aDtcbiAgICAgIGlmIChmcm9tSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbmRleCA9IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgICBpbmRleCA9IGluZGV4IDwgMCA/IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCkgOiBuYXRpdmVNaW4oaW5kZXgsIGxlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZVxuICAgICAgICA/IHN0cmljdExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgaW5kZXgpXG4gICAgICAgIDogYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBpbmRleCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZWxlbWVudCBhdCBpbmRleCBgbmAgb2YgYGFycmF5YC4gSWYgYG5gIGlzIG5lZ2F0aXZlLCB0aGUgbnRoXG4gICAgICogZWxlbWVudCBmcm9tIHRoZSBlbmQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0wXSBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBudGggZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2QnXTtcbiAgICAgKlxuICAgICAqIF8ubnRoKGFycmF5LCAxKTtcbiAgICAgKiAvLyA9PiAnYidcbiAgICAgKlxuICAgICAqIF8ubnRoKGFycmF5LCAtMik7XG4gICAgICogLy8gPT4gJ2MnO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG50aChhcnJheSwgbikge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZU50aChhcnJheSwgdG9JbnRlZ2VyKG4pKSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBnaXZlbiB2YWx1ZXMgZnJvbSBgYXJyYXlgIHVzaW5nXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLndpdGhvdXRgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuIFVzZSBgXy5yZW1vdmVgXG4gICAgICogdG8gcmVtb3ZlIGVsZW1lbnRzIGZyb20gYW4gYXJyYXkgYnkgcHJlZGljYXRlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2EnLCAnYicsICdjJ107XG4gICAgICpcbiAgICAgKiBfLnB1bGwoYXJyYXksICdhJywgJ2MnKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWydiJywgJ2InXVxuICAgICAqL1xuICAgIHZhciBwdWxsID0gYmFzZVJlc3QocHVsbEFsbCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYW4gYXJyYXkgb2YgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZGlmZmVyZW5jZWAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2EnLCAnYicsICdjJ107XG4gICAgICpcbiAgICAgKiBfLnB1bGxBbGwoYXJyYXksIFsnYScsICdjJ10pO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2InLCAnYiddXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVsbEFsbChhcnJheSwgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCAmJiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aClcbiAgICAgICAgPyBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzKVxuICAgICAgICA6IGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucHVsbEFsbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgYW5kIGB2YWx1ZXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb25cbiAgICAgKiBieSB3aGljaCB0aGV5J3JlIGNvbXBhcmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZGlmZmVyZW5jZUJ5YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbeyAneCc6IDEgfSwgeyAneCc6IDIgfSwgeyAneCc6IDMgfSwgeyAneCc6IDEgfV07XG4gICAgICpcbiAgICAgKiBfLnB1bGxBbGxCeShhcnJheSwgW3sgJ3gnOiAxIH0sIHsgJ3gnOiAzIH1dLCAneCcpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwdWxsQWxsQnkoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoICYmIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKVxuICAgICAgICA/IGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxBbGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAgdG8gYHZhbHVlc2AuIFRoZSBjb21wYXJhdG9yIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VXaXRoYCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNi4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAzLCAneSc6IDQgfSwgeyAneCc6IDUsICd5JzogNiB9XTtcbiAgICAgKlxuICAgICAqIF8ucHVsbEFsbFdpdGgoYXJyYXksIFt7ICd4JzogMywgJ3knOiA0IH1dLCBfLmlzRXF1YWwpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogNSwgJ3knOiA2IH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVsbEFsbFdpdGgoYXJyYXksIHZhbHVlcywgY29tcGFyYXRvcikge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGggJiYgdmFsdWVzICYmIHZhbHVlcy5sZW5ndGgpXG4gICAgICAgID8gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcywgdW5kZWZpbmVkLCBjb21wYXJhdG9yKVxuICAgICAgICA6IGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgZWxlbWVudHMgZnJvbSBgYXJyYXlgIGNvcnJlc3BvbmRpbmcgdG8gYGluZGV4ZXNgIGFuZCByZXR1cm5zIGFuXG4gICAgICogYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uYXRgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7Li4uKG51bWJlcnxudW1iZXJbXSl9IFtpbmRleGVzXSBUaGUgaW5kZXhlcyBvZiBlbGVtZW50cyB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdkJ107XG4gICAgICogdmFyIHB1bGxlZCA9IF8ucHVsbEF0KGFycmF5LCBbMSwgM10pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYScsICdjJ11cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHB1bGxlZCk7XG4gICAgICogLy8gPT4gWydiJywgJ2QnXVxuICAgICAqL1xuICAgIHZhciBwdWxsQXQgPSBmbGF0UmVzdChmdW5jdGlvbihhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IGJhc2VBdChhcnJheSwgaW5kZXhlcyk7XG5cbiAgICAgIGJhc2VQdWxsQXQoYXJyYXksIGFycmF5TWFwKGluZGV4ZXMsIGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBpc0luZGV4KGluZGV4LCBsZW5ndGgpID8gK2luZGV4IDogaW5kZXg7XG4gICAgICB9KS5zb3J0KGNvbXBhcmVBc2NlbmRpbmcpKTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gYGFycmF5YCB0aGF0IGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvclxuICAgICAqIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZSByZW1vdmVkIGVsZW1lbnRzLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5maWx0ZXJgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuIFVzZSBgXy5wdWxsYFxuICAgICAqIHRvIHB1bGwgZWxlbWVudHMgZnJvbSBhbiBhcnJheSBieSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzLCA0XTtcbiAgICAgKiB2YXIgZXZlbnMgPSBfLnJlbW92ZShhcnJheSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDNdXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhldmVucyk7XG4gICAgICogLy8gPT4gWzIsIDRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVtb3ZlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluZGV4ZXMgPSBbXSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHByZWRpY2F0ZSA9IGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgaW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYmFzZVB1bGxBdChhcnJheSwgaW5kZXhlcyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2VzIGBhcnJheWAgc28gdGhhdCB0aGUgZmlyc3QgZWxlbWVudCBiZWNvbWVzIHRoZSBsYXN0LCB0aGUgc2Vjb25kXG4gICAgICogZWxlbWVudCBiZWNvbWVzIHRoZSBzZWNvbmQgdG8gbGFzdCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YCBhbmQgaXMgYmFzZWQgb25cbiAgICAgKiBbYEFycmF5I3JldmVyc2VgXShodHRwczovL21kbi5pby9BcnJheS9yZXZlcnNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTtcbiAgICAgKlxuICAgICAqIF8ucmV2ZXJzZShhcnJheSk7XG4gICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmV2ZXJzZShhcnJheSkge1xuICAgICAgcmV0dXJuIGFycmF5ID09IG51bGwgPyBhcnJheSA6IG5hdGl2ZVJldmVyc2UuY2FsbChhcnJheSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZnJvbSBgc3RhcnRgIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgdXNlZCBpbnN0ZWFkIG9mXG4gICAgICogW2BBcnJheSNzbGljZWBdKGh0dHBzOi8vbWRuLmlvL0FycmF5L3NsaWNlKSB0byBlbnN1cmUgZGVuc2UgYXJyYXlzIGFyZVxuICAgICAqIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNsaWNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgJiYgdHlwZW9mIGVuZCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChhcnJheSwgc3RhcnQsIGVuZCkpIHtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc3RhcnQgPSBzdGFydCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9JbnRlZ2VyKGVuZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VzIGEgYmluYXJ5IHNlYXJjaCB0byBkZXRlcm1pbmUgdGhlIGxvd2VzdCBpbmRleCBhdCB3aGljaCBgdmFsdWVgXG4gICAgICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0byBtYWludGFpbiBpdHMgc29ydCBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkSW5kZXgoWzMwLCA1MF0sIDQwKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkSW5kZXgoYXJyYXksIHZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRJbmRleGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCBmb3IgYHZhbHVlYCBhbmQgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgdG8gY29tcHV0ZSB0aGVpclxuICAgICAqIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDQgfSwgeyAneCc6IDUgfV07XG4gICAgICpcbiAgICAgKiBfLnNvcnRlZEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgZnVuY3Rpb24obykgeyByZXR1cm4gby54OyB9KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvcnRlZEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgJ3gnKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgYSBiaW5hcnlcbiAgICAgKiBzZWFyY2ggb24gYSBzb3J0ZWQgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRJbmRleE9mKFs0LCA1LCA1LCA1LCA2XSwgNSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4T2YoYXJyYXksIHZhbHVlKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUpO1xuICAgICAgICBpZiAoaW5kZXggPCBsZW5ndGggJiYgZXEoYXJyYXlbaW5kZXhdLCB2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRlZEluZGV4YCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBoaWdoZXN0XG4gICAgICogaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvXG4gICAgICogbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleChbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXgoYXJyYXksIHZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRMYXN0SW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgZm9yIGB2YWx1ZWAgYW5kIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIHRvIGNvbXB1dGUgdGhlaXJcbiAgICAgKiBzb3J0IHJhbmtpbmcuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiA0IH0sIHsgJ3gnOiA1IH1dO1xuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXhCeShvYmplY3RzLCB7ICd4JzogNCB9LCBmdW5jdGlvbihvKSB7IHJldHVybiBvLng7IH0pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29ydGVkTGFzdEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgJ3gnKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmxhc3RJbmRleE9mYCBleGNlcHQgdGhhdCBpdCBwZXJmb3JtcyBhIGJpbmFyeVxuICAgICAqIHNlYXJjaCBvbiBhIHNvcnRlZCBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleE9mKFs0LCA1LCA1LCA1LCA2XSwgNSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICB2YXIgaW5kZXggPSBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlLCB0cnVlKSAtIDE7XG4gICAgICAgIGlmIChlcShhcnJheVtpbmRleF0sIHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcWAgZXhjZXB0IHRoYXQgaXQncyBkZXNpZ25lZCBhbmQgb3B0aW1pemVkXG4gICAgICogZm9yIHNvcnRlZCBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRVbmlxKFsxLCAxLCAyXSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkVW5pcShhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVNvcnRlZFVuaXEoYXJyYXkpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxQnlgIGV4Y2VwdCB0aGF0IGl0J3MgZGVzaWduZWQgYW5kIG9wdGltaXplZFxuICAgICAqIGZvciBzb3J0ZWQgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRVbmlxQnkoWzEuMSwgMS4yLCAyLjMsIDIuNF0sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsxLjEsIDIuM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRVbmlxQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlU29ydGVkVW5pcShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGJ1dCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWlsKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFpbChhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VTbGljZShhcnJheSwgMSwgbGVuZ3RoKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byB0YWtlLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKlxuICAgICAqIF8udGFrZShbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2UoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCAwLCBuIDwgMCA/IDAgOiBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBlbmQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gdGFrZS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbM11cbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10sIDUpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2VSaWdodChhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICBuID0gbGVuZ3RoIC0gbjtcbiAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIG4gPCAwID8gMCA6IG4sIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBlbmQuIEVsZW1lbnRzIGFyZVxuICAgICAqIHRha2VuIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aFxuICAgICAqIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZVJpZ2h0V2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBmYWxzZSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGJlZ2lubmluZy4gRWxlbWVudHNcbiAgICAgKiBhcmUgdGFrZW4gdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoXG4gICAgICogdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy50YWtlV2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlV2hpbGUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlV2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcywgaW4gb3JkZXIsIGZyb20gYWxsIGdpdmVuIGFycmF5cyB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlvbihbMl0sIFsxLCAyXSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgdmFyIHVuaW9uID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieVxuICAgICAqIHdoaWNoIHVuaXF1ZW5lc3MgaXMgY29tcHV0ZWQuIFJlc3VsdCB2YWx1ZXMgYXJlIGNob3NlbiBmcm9tIHRoZSBmaXJzdFxuICAgICAqIGFycmF5IGluIHdoaWNoIHRoZSB2YWx1ZSBvY2N1cnMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlvbkJ5KFsyLjFdLCBbMS4yLCAyLjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMi4xLCAxLjJdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnVuaW9uQnkoW3sgJ3gnOiAxIH1dLCBbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgdmFyIHVuaW9uQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gUmVzdWx0IHZhbHVlcyBhcmUgY2hvc2VuIGZyb21cbiAgICAgKiB0aGUgZmlyc3QgYXJyYXkgaW4gd2hpY2ggdGhlIHZhbHVlIG9jY3Vycy4gVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8udW5pb25XaXRoKG9iamVjdHMsIG90aGVycywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDEgfV1cbiAgICAgKi9cbiAgICB2YXIgdW5pb25XaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkdXBsaWNhdGUtZnJlZSB2ZXJzaW9uIG9mIGFuIGFycmF5LCB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpbiB3aGljaCBvbmx5IHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2ggZWxlbWVudFxuICAgICAqIGlzIGtlcHQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXJcbiAgICAgKiBpbiB0aGUgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlxKFsyLCAxLCAyXSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcShhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZVVuaXEoYXJyYXkpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoXG4gICAgICogdW5pcXVlbmVzcyBpcyBjb21wdXRlZC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGVcbiAgICAgKiBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gICAgICogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlxQnkoWzIuMSwgMS4yLCAyLjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMi4xLCAxLjJdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnVuaXFCeShbeyAneCc6IDEgfSwgeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZVVuaXEoYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXkuVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8udW5pcVdpdGgob2JqZWN0cywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcVdpdGgoYXJyYXksIGNvbXBhcmF0b3IpIHtcbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5LCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYW4gYXJyYXkgb2YgZ3JvdXBlZFxuICAgICAqIGVsZW1lbnRzIGFuZCBjcmVhdGVzIGFuIGFycmF5IHJlZ3JvdXBpbmcgdGhlIGVsZW1lbnRzIHRvIHRoZWlyIHByZS16aXBcbiAgICAgKiBjb25maWd1cmF0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMi4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZWdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB6aXBwZWQgPSBfLnppcChbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxLCB0cnVlXSwgWydiJywgMiwgZmFsc2VdXVxuICAgICAqXG4gICAgICogXy51bnppcCh6aXBwZWQpO1xuICAgICAqIC8vID0+IFtbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW56aXAoYXJyYXkpIHtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IDA7XG4gICAgICBhcnJheSA9IGFycmF5RmlsdGVyKGFycmF5LCBmdW5jdGlvbihncm91cCkge1xuICAgICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoZ3JvdXApKSB7XG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGdyb3VwLmxlbmd0aCwgbGVuZ3RoKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYmFzZVRpbWVzKGxlbmd0aCwgZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TWFwKGFycmF5LCBiYXNlUHJvcGVydHkoaW5kZXgpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB0byBzcGVjaWZ5XG4gICAgICogaG93IHJlZ3JvdXBlZCB2YWx1ZXMgc2hvdWxkIGJlIGNvbWJpbmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRoZVxuICAgICAqIGVsZW1lbnRzIG9mIGVhY2ggZ3JvdXA6ICguLi5ncm91cCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy44LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cyB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gdG8gY29tYmluZVxuICAgICAqICByZWdyb3VwZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHppcHBlZCA9IF8uemlwKFsxLCAyXSwgWzEwLCAyMF0sIFsxMDAsIDIwMF0pO1xuICAgICAqIC8vID0+IFtbMSwgMTAsIDEwMF0sIFsyLCAyMCwgMjAwXV1cbiAgICAgKlxuICAgICAqIF8udW56aXBXaXRoKHppcHBlZCwgXy5hZGQpO1xuICAgICAqIC8vID0+IFszLCAzMCwgMzAwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuemlwV2l0aChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IHVuemlwKGFycmF5KTtcbiAgICAgIGlmIChpdGVyYXRlZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXlNYXAocmVzdWx0LCBmdW5jdGlvbihncm91cCkge1xuICAgICAgICByZXR1cm4gYXBwbHkoaXRlcmF0ZWUsIHVuZGVmaW5lZCwgZ3JvdXApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBleGNsdWRpbmcgYWxsIGdpdmVuIHZhbHVlcyB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZSwgXy54b3JcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy53aXRob3V0KFsyLCAxLCAyLCAzXSwgMSwgMik7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICovXG4gICAgdmFyIHdpdGhvdXQgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIHZhbHVlcylcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcyB0aGF0IGlzIHRoZVxuICAgICAqIFtzeW1tZXRyaWMgZGlmZmVyZW5jZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3ltbWV0cmljX2RpZmZlcmVuY2UpXG4gICAgICogb2YgdGhlIGdpdmVuIGFycmF5cy4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXJcbiAgICAgKiB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlLCBfLndpdGhvdXRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy54b3IoWzIsIDFdLCBbMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAzXVxuICAgICAqL1xuICAgIHZhciB4b3IgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ueG9yYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgZWFjaCBgYXJyYXlzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5XG4gICAgICogd2hpY2ggYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZFxuICAgICAqIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lXG4gICAgICogYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy54b3JCeShbMi4xLCAxLjJdLCBbMi4zLCAzLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMS4yLCAzLjRdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnhvckJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciB4b3JCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdChhcnJheXMpO1xuICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSkge1xuICAgICAgICBpdGVyYXRlZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy54b3JgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheXNgLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpc1xuICAgICAqIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5cy4gVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8ueG9yV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMSB9XVxuICAgICAqL1xuICAgIHZhciB4b3JXaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLCB0aGUgZmlyc3Qgb2Ygd2hpY2ggY29udGFpbnMgdGhlXG4gICAgICogZmlyc3QgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5cywgdGhlIHNlY29uZCBvZiB3aGljaCBjb250YWlucyB0aGVcbiAgICAgKiBzZWNvbmQgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5cywgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwKFsnYScsICdiJ10sIFsxLCAyXSwgW3RydWUsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gW1snYScsIDEsIHRydWVdLCBbJ2InLCAyLCBmYWxzZV1dXG4gICAgICovXG4gICAgdmFyIHppcCA9IGJhc2VSZXN0KHVuemlwKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZnJvbVBhaXJzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIHR3byBhcnJheXMsXG4gICAgICogb25lIG9mIHByb3BlcnR5IGlkZW50aWZpZXJzIGFuZCBvbmUgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC40LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcHJvcHM9W11dIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzPVtdXSBUaGUgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwT2JqZWN0KFsnYScsICdiJ10sIFsxLCAyXSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gemlwT2JqZWN0KHByb3BzLCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzIHx8IFtdLCB2YWx1ZXMgfHwgW10sIGFzc2lnblZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcE9iamVjdGAgZXhjZXB0IHRoYXQgaXQgc3VwcG9ydHMgcHJvcGVydHkgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcHJvcHM9W11dIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzPVtdXSBUaGUgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwT2JqZWN0RGVlcChbJ2EuYlswXS5jJywgJ2EuYlsxXS5kJ10sIFsxLCAyXSk7XG4gICAgICogLy8gPT4geyAnYSc6IHsgJ2InOiBbeyAnYyc6IDEgfSwgeyAnZCc6IDIgfV0gfSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gemlwT2JqZWN0RGVlcChwcm9wcywgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gYmFzZVppcE9iamVjdChwcm9wcyB8fCBbXSwgdmFsdWVzIHx8IFtdLCBiYXNlU2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHRvIHNwZWNpZnlcbiAgICAgKiBob3cgZ3JvdXBlZCB2YWx1ZXMgc2hvdWxkIGJlIGNvbWJpbmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRoZVxuICAgICAqIGVsZW1lbnRzIG9mIGVhY2ggZ3JvdXA6ICguLi5ncm91cCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy44LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIHByb2Nlc3MuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiB0byBjb21iaW5lXG4gICAgICogIGdyb3VwZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwV2l0aChbMSwgMl0sIFsxMCwgMjBdLCBbMTAwLCAyMDBdLCBmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgICogICByZXR1cm4gYSArIGIgKyBjO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IFsxMTEsIDIyMl1cbiAgICAgKi9cbiAgICB2YXIgemlwV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5cy5sZW5ndGgsXG4gICAgICAgICAgaXRlcmF0ZWUgPSBsZW5ndGggPiAxID8gYXJyYXlzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpdGVyYXRlZSA9IHR5cGVvZiBpdGVyYXRlZSA9PSAnZnVuY3Rpb24nID8gKGFycmF5cy5wb3AoKSwgaXRlcmF0ZWUpIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHVuemlwV2l0aChhcnJheXMsIGl0ZXJhdGVlKTtcbiAgICB9KTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlIHRoYXQgd3JhcHMgYHZhbHVlYCB3aXRoIGV4cGxpY2l0IG1ldGhvZFxuICAgICAqIGNoYWluIHNlcXVlbmNlcyBlbmFibGVkLiBUaGUgcmVzdWx0IG9mIHN1Y2ggc2VxdWVuY2VzIG11c3QgYmUgdW53cmFwcGVkXG4gICAgICogd2l0aCBgXyN2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogdmFyIHlvdW5nZXN0ID0gX1xuICAgICAqICAgLmNoYWluKHVzZXJzKVxuICAgICAqICAgLnNvcnRCeSgnYWdlJylcbiAgICAgKiAgIC5tYXAoZnVuY3Rpb24obykge1xuICAgICAqICAgICByZXR1cm4gby51c2VyICsgJyBpcyAnICsgby5hZ2U7XG4gICAgICogICB9KVxuICAgICAqICAgLmhlYWQoKVxuICAgICAqICAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMgaXMgMSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjaGFpbih2YWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaCh2YWx1ZSk7XG4gICAgICByZXN1bHQuX19jaGFpbl9fID0gdHJ1ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaW52b2tlcyBgaW50ZXJjZXB0b3JgIGFuZCByZXR1cm5zIGB2YWx1ZWAuIFRoZSBpbnRlcmNlcHRvclxuICAgICAqIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvXG4gICAgICogXCJ0YXAgaW50b1wiIGEgbWV0aG9kIGNoYWluIHNlcXVlbmNlIGluIG9yZGVyIHRvIG1vZGlmeSBpbnRlcm1lZGlhdGUgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm92aWRlIHRvIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaW50ZXJjZXB0b3IgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyBgdmFsdWVgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfKFsxLCAyLCAzXSlcbiAgICAgKiAgLnRhcChmdW5jdGlvbihhcnJheSkge1xuICAgICAqICAgIC8vIE11dGF0ZSBpbnB1dCBhcnJheS5cbiAgICAgKiAgICBhcnJheS5wb3AoKTtcbiAgICAgKiAgfSlcbiAgICAgKiAgLnJldmVyc2UoKVxuICAgICAqICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YXAodmFsdWUsIGludGVyY2VwdG9yKSB7XG4gICAgICBpbnRlcmNlcHRvcih2YWx1ZSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy50YXBgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBgaW50ZXJjZXB0b3JgLlxuICAgICAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIFwicGFzcyB0aHJ1XCIgdmFsdWVzIHJlcGxhY2luZyBpbnRlcm1lZGlhdGVcbiAgICAgKiByZXN1bHRzIGluIGEgbWV0aG9kIGNoYWluIHNlcXVlbmNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb3ZpZGUgdG8gYGludGVyY2VwdG9yYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbnRlcmNlcHRvciBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGludGVyY2VwdG9yYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXygnICBhYmMgICcpXG4gICAgICogIC5jaGFpbigpXG4gICAgICogIC50cmltKClcbiAgICAgKiAgLnRocnUoZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgICByZXR1cm4gW3ZhbHVlXTtcbiAgICAgKiAgfSlcbiAgICAgKiAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWydhYmMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRocnUodmFsdWUsIGludGVyY2VwdG9yKSB7XG4gICAgICByZXR1cm4gaW50ZXJjZXB0b3IodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHRoZSB3cmFwcGVyIHZlcnNpb24gb2YgYF8uYXRgLlxuICAgICAqXG4gICAgICogQG5hbWUgYXRcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9LCA0XSB9O1xuICAgICAqXG4gICAgICogXyhvYmplY3QpLmF0KFsnYVswXS5iLmMnLCAnYVsxXSddKS52YWx1ZSgpO1xuICAgICAqIC8vID0+IFszLCA0XVxuICAgICAqL1xuICAgIHZhciB3cmFwcGVyQXQgPSBmbGF0UmVzdChmdW5jdGlvbihwYXRocykge1xuICAgICAgdmFyIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCxcbiAgICAgICAgICBzdGFydCA9IGxlbmd0aCA/IHBhdGhzWzBdIDogMCxcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX18sXG4gICAgICAgICAgaW50ZXJjZXB0b3IgPSBmdW5jdGlvbihvYmplY3QpIHsgcmV0dXJuIGJhc2VBdChvYmplY3QsIHBhdGhzKTsgfTtcblxuICAgICAgaWYgKGxlbmd0aCA+IDEgfHwgdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGggfHxcbiAgICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpIHx8ICFpc0luZGV4KHN0YXJ0KSkge1xuICAgICAgICByZXR1cm4gdGhpcy50aHJ1KGludGVyY2VwdG9yKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2Uoc3RhcnQsICtzdGFydCArIChsZW5ndGggPyAxIDogMCkpO1xuICAgICAgdmFsdWUuX19hY3Rpb25zX18ucHVzaCh7XG4gICAgICAgICdmdW5jJzogdGhydSxcbiAgICAgICAgJ2FyZ3MnOiBbaW50ZXJjZXB0b3JdLFxuICAgICAgICAndGhpc0FyZyc6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodmFsdWUsIHRoaXMuX19jaGFpbl9fKS50aHJ1KGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgICAgIGlmIChsZW5ndGggJiYgIWFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgIGFycmF5LnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlIHdpdGggZXhwbGljaXQgbWV0aG9kIGNoYWluIHNlcXVlbmNlcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQG5hbWUgY2hhaW5cbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gQSBzZXF1ZW5jZSB3aXRob3V0IGV4cGxpY2l0IGNoYWluaW5nLlxuICAgICAqIF8odXNlcnMpLmhlYWQoKTtcbiAgICAgKiAvLyA9PiB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9XG4gICAgICpcbiAgICAgKiAvLyBBIHNlcXVlbmNlIHdpdGggZXhwbGljaXQgY2hhaW5pbmcuXG4gICAgICogXyh1c2VycylcbiAgICAgKiAgIC5jaGFpbigpXG4gICAgICogICAuaGVhZCgpXG4gICAgICogICAucGljaygndXNlcicpXG4gICAgICogICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiB7ICd1c2VyJzogJ2Jhcm5leScgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDaGFpbigpIHtcbiAgICAgIHJldHVybiBjaGFpbih0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgY2hhaW4gc2VxdWVuY2UgYW5kIHJldHVybnMgdGhlIHdyYXBwZWQgcmVzdWx0LlxuICAgICAqXG4gICAgICogQG5hbWUgY29tbWl0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyXTtcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oYXJyYXkpLnB1c2goMyk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiB3cmFwcGVkID0gd3JhcHBlZC5jb21taXQoKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiB3cmFwcGVkLmxhc3QoKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlckNvbW1pdCgpIHtcbiAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih0aGlzLnZhbHVlKCksIHRoaXMuX19jaGFpbl9fKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuZXh0IHZhbHVlIG9uIGEgd3JhcHBlZCBvYmplY3QgZm9sbG93aW5nIHRoZVxuICAgICAqIFtpdGVyYXRvciBwcm90b2NvbF0oaHR0cHM6Ly9tZG4uaW8vaXRlcmF0aW9uX3Byb3RvY29scyNpdGVyYXRvcikuXG4gICAgICpcbiAgICAgKiBAbmFtZSBuZXh0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV4dCBpdGVyYXRvciB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyXSk7XG4gICAgICpcbiAgICAgKiB3cmFwcGVkLm5leHQoKTtcbiAgICAgKiAvLyA9PiB7ICdkb25lJzogZmFsc2UsICd2YWx1ZSc6IDEgfVxuICAgICAqXG4gICAgICogd3JhcHBlZC5uZXh0KCk7XG4gICAgICogLy8gPT4geyAnZG9uZSc6IGZhbHNlLCAndmFsdWUnOiAyIH1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQubmV4dCgpO1xuICAgICAqIC8vID0+IHsgJ2RvbmUnOiB0cnVlLCAndmFsdWUnOiB1bmRlZmluZWQgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJOZXh0KCkge1xuICAgICAgaWYgKHRoaXMuX192YWx1ZXNfXyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX192YWx1ZXNfXyA9IHRvQXJyYXkodGhpcy52YWx1ZSgpKTtcbiAgICAgIH1cbiAgICAgIHZhciBkb25lID0gdGhpcy5fX2luZGV4X18gPj0gdGhpcy5fX3ZhbHVlc19fLmxlbmd0aCxcbiAgICAgICAgICB2YWx1ZSA9IGRvbmUgPyB1bmRlZmluZWQgOiB0aGlzLl9fdmFsdWVzX19bdGhpcy5fX2luZGV4X18rK107XG5cbiAgICAgIHJldHVybiB7ICdkb25lJzogZG9uZSwgJ3ZhbHVlJzogdmFsdWUgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSB3cmFwcGVyIHRvIGJlIGl0ZXJhYmxlLlxuICAgICAqXG4gICAgICogQG5hbWUgU3ltYm9sLml0ZXJhdG9yXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgd3JhcHBlciBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pO1xuICAgICAqXG4gICAgICogd3JhcHBlZFtTeW1ib2wuaXRlcmF0b3JdKCkgPT09IHdyYXBwZWQ7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogQXJyYXkuZnJvbSh3cmFwcGVkKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyVG9JdGVyYXRvcigpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgY2hhaW4gc2VxdWVuY2UgcGxhbnRpbmcgYHZhbHVlYCBhcyB0aGUgd3JhcHBlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHBsYW50XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGxhbnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyXSkubWFwKHNxdWFyZSk7XG4gICAgICogdmFyIG90aGVyID0gd3JhcHBlZC5wbGFudChbMywgNF0pO1xuICAgICAqXG4gICAgICogb3RoZXIudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbOSwgMTZdXG4gICAgICpcbiAgICAgKiB3cmFwcGVkLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzEsIDRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclBsYW50KHZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0LFxuICAgICAgICAgIHBhcmVudCA9IHRoaXM7XG5cbiAgICAgIHdoaWxlIChwYXJlbnQgaW5zdGFuY2VvZiBiYXNlTG9kYXNoKSB7XG4gICAgICAgIHZhciBjbG9uZSA9IHdyYXBwZXJDbG9uZShwYXJlbnQpO1xuICAgICAgICBjbG9uZS5fX2luZGV4X18gPSAwO1xuICAgICAgICBjbG9uZS5fX3ZhbHVlc19fID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcHJldmlvdXMuX193cmFwcGVkX18gPSBjbG9uZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSBjbG9uZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJldmlvdXMgPSBjbG9uZTtcbiAgICAgICAgcGFyZW50ID0gcGFyZW50Ll9fd3JhcHBlZF9fO1xuICAgICAgfVxuICAgICAgcHJldmlvdXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdGhlIHdyYXBwZXIgdmVyc2lvbiBvZiBgXy5yZXZlcnNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIHRoZSB3cmFwcGVkIGFycmF5LlxuICAgICAqXG4gICAgICogQG5hbWUgcmV2ZXJzZVxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfKGFycmF5KS5yZXZlcnNlKCkudmFsdWUoKVxuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJSZXZlcnNlKCkge1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5fX3dyYXBwZWRfXztcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgICAgIHZhciB3cmFwcGVkID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCkge1xuICAgICAgICAgIHdyYXBwZWQgPSBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgd3JhcHBlZCA9IHdyYXBwZWQucmV2ZXJzZSgpO1xuICAgICAgICB3cmFwcGVkLl9fYWN0aW9uc19fLnB1c2goe1xuICAgICAgICAgICdmdW5jJzogdGhydSxcbiAgICAgICAgICAnYXJncyc6IFtyZXZlcnNlXSxcbiAgICAgICAgICAndGhpc0FyZyc6IHVuZGVmaW5lZFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHdyYXBwZWQsIHRoaXMuX19jaGFpbl9fKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnRocnUocmV2ZXJzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIGNoYWluIHNlcXVlbmNlIHRvIHJlc29sdmUgdGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHZhbHVlXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAYWxpYXMgdG9KU09OLCB2YWx1ZU9mXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oWzEsIDIsIDNdKS52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJWYWx1ZSgpIHtcbiAgICAgIHJldHVybiBiYXNlV3JhcHBlclZhbHVlKHRoaXMuX193cmFwcGVkX18sIHRoaXMuX19hY3Rpb25zX18pO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZSBvZlxuICAgICAqIGVhY2gga2V5IGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGtleSB3YXMgcmV0dXJuZWQgYnkgYGl0ZXJhdGVlYC4gVGhlXG4gICAgICogaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29tcG9zZWQgYWdncmVnYXRlIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jb3VudEJ5KFs2LjEsIDQuMiwgNi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4geyAnNCc6IDEsICc2JzogMiB9XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmNvdW50QnkoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sICdsZW5ndGgnKTtcbiAgICAgKiAvLyA9PiB7ICczJzogMiwgJzUnOiAxIH1cbiAgICAgKi9cbiAgICB2YXIgY291bnRCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIGtleSkpIHtcbiAgICAgICAgKytyZXN1bHRba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgMSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yICoqYWxsKiogZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqIEl0ZXJhdGlvbiBpcyBzdG9wcGVkIG9uY2UgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgcmV0dXJucyBgdHJ1ZWAgZm9yXG4gICAgICogW2VtcHR5IGNvbGxlY3Rpb25zXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FbXB0eV9zZXQpIGJlY2F1c2VcbiAgICAgKiBbZXZlcnl0aGluZyBpcyB0cnVlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9WYWN1b3VzX3RydXRoKSBvZlxuICAgICAqIGVsZW1lbnRzIG9mIGVtcHR5IGNvbGxlY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5ldmVyeShbdHJ1ZSwgMSwgbnVsbCwgJ3llcyddLCBCb29sZWFuKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ldmVyeSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmV2ZXJ5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ldmVyeSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXZlcnkoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBndWFyZCkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlFdmVyeSA6IGJhc2VFdmVyeTtcbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSkge1xuICAgICAgICBwcmVkaWNhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nIGFuIGFycmF5IG9mIGFsbCBlbGVtZW50c1xuICAgICAqIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucmVtb3ZlYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKiBAc2VlIF8ucmVqZWN0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gQ29tYmluaW5nIHNldmVyYWwgcHJlZGljYXRlcyB1c2luZyBgXy5vdmVyRXZlcnlgIG9yIGBfLm92ZXJTb21lYC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgXy5vdmVyU29tZShbeyAnYWdlJzogMzYgfSwgWydhZ2UnLCA0MF1dKSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ2Jhcm5leSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmlsdGVyKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyB0aGUgZmlyc3QgZWxlbWVudFxuICAgICAqIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdiYXJuZXknXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZCh1c2VycywgeyAnYWdlJzogMSwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAncGViYmxlcydcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmQodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdmcmVkJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICAgICAqL1xuICAgIHZhciBmaW5kID0gY3JlYXRlRmluZChmaW5kSW5kZXgpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9Y29sbGVjdGlvbi5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmluZExhc3QoWzEsIDIsIDMsIDRdLCBmdW5jdGlvbihuKSB7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgdmFyIGZpbmRMYXN0ID0gY3JlYXRlRmluZChmaW5kTGFzdEluZGV4KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmbGF0dGVuZWQgYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYFxuICAgICAqIHRocnUgYGl0ZXJhdGVlYCBhbmQgZmxhdHRlbmluZyB0aGUgbWFwcGVkIHJlc3VsdHMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAgICAgKiAgIHJldHVybiBbbiwgbl07XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5mbGF0TWFwKFsxLCAyXSwgZHVwbGljYXRlKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMiwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0TWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mbGF0TWFwYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBmbGF0dGVucyB0aGVcbiAgICAgKiBtYXBwZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAgICAgKiAgIHJldHVybiBbW1tuLCBuXV1dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcERlZXAoWzEsIDJdLCBkdXBsaWNhdGUpO1xuICAgICAqIC8vID0+IFsxLCAxLCAyLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRNYXBEZWVwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgSU5GSU5JVFkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxhdE1hcGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgZmxhdHRlbnMgdGhlXG4gICAgICogbWFwcGVkIHJlc3VsdHMgdXAgdG8gYGRlcHRoYCB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAgICAgKiAgIHJldHVybiBbW1tuLCBuXV1dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcERlcHRoKFsxLCAyXSwgZHVwbGljYXRlLCAyKTtcbiAgICAgKiAvLyA9PiBbWzEsIDFdLCBbMiwgMl1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdE1hcERlcHRoKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBkZXB0aCkge1xuICAgICAgZGVwdGggPSBkZXB0aCA9PT0gdW5kZWZpbmVkID8gMSA6IHRvSW50ZWdlcihkZXB0aCk7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgZGVwdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gIGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggZWxlbWVudC5cbiAgICAgKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBBcyB3aXRoIG90aGVyIFwiQ29sbGVjdGlvbnNcIiBtZXRob2RzLCBvYmplY3RzIHdpdGggYSBcImxlbmd0aFwiXG4gICAgICogcHJvcGVydHkgYXJlIGl0ZXJhdGVkIGxpa2UgYXJyYXlzLiBUbyBhdm9pZCB0aGlzIGJlaGF2aW9yIHVzZSBgXy5mb3JJbmBcbiAgICAgKiBvciBgXy5mb3JPd25gIGZvciBvYmplY3QgaXRlcmF0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIGVhY2hcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBAc2VlIF8uZm9yRWFjaFJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZm9yRWFjaChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyBgMWAgdGhlbiBgMmAuXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goeyAnYSc6IDEsICdiJzogMiB9LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2EnIHRoZW4gJ2InIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckVhY2goY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RWFjaCA6IGJhc2VFYWNoO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvckVhY2hgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGFsaWFzIGVhY2hSaWdodFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICAgICAqIEBzZWUgXy5mb3JFYWNoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZm9yRWFjaFJpZ2h0KFsxLCAyXSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzIGAyYCB0aGVuIGAxYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JFYWNoUmlnaHQoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RWFjaFJpZ2h0IDogYmFzZUVhY2hSaWdodDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBvcmRlciBvZiBncm91cGVkIHZhbHVlc1xuICAgICAqIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gYGNvbGxlY3Rpb25gLiBUaGUgY29ycmVzcG9uZGluZ1xuICAgICAqIHZhbHVlIG9mIGVhY2gga2V5IGlzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZVxuICAgICAqIGtleS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZ3JvdXBCeShbNi4xLCA0LjIsIDYuM10sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IHsgJzQnOiBbNC4yXSwgJzYnOiBbNi4xLCA2LjNdIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZ3JvdXBCeShbJ29uZScsICd0d28nLCAndGhyZWUnXSwgJ2xlbmd0aCcpO1xuICAgICAqIC8vID0+IHsgJzMnOiBbJ29uZScsICd0d28nXSwgJzUnOiBbJ3RocmVlJ10gfVxuICAgICAqL1xuICAgIHZhciBncm91cEJ5ID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwga2V5KSkge1xuICAgICAgICByZXN1bHRba2V5XS5wdXNoKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgW3ZhbHVlXSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiBgY29sbGVjdGlvbmAuIElmIGBjb2xsZWN0aW9uYCBpcyBhIHN0cmluZywgaXQnc1xuICAgICAqIGNoZWNrZWQgZm9yIGEgc3Vic3RyaW5nIG9mIGB2YWx1ZWAsIG90aGVyd2lzZVxuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogaXMgdXNlZCBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXNcbiAgICAgKiB0aGUgb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLnJlZHVjZWAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbmNsdWRlcyhbMSwgMiwgM10sIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxLCAyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pbmNsdWRlcyh7ICdhJzogMSwgJ2InOiAyIH0sIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoJ2FiY2QnLCAnYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5jbHVkZXMoY29sbGVjdGlvbiwgdmFsdWUsIGZyb21JbmRleCwgZ3VhcmQpIHtcbiAgICAgIGNvbGxlY3Rpb24gPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IGNvbGxlY3Rpb24gOiB2YWx1ZXMoY29sbGVjdGlvbik7XG4gICAgICBmcm9tSW5kZXggPSAoZnJvbUluZGV4ICYmICFndWFyZCkgPyB0b0ludGVnZXIoZnJvbUluZGV4KSA6IDA7XG5cbiAgICAgIHZhciBsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgICAgIGZyb21JbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBmcm9tSW5kZXgsIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pXG4gICAgICAgID8gKGZyb21JbmRleCA8PSBsZW5ndGggJiYgY29sbGVjdGlvbi5pbmRleE9mKHZhbHVlLCBmcm9tSW5kZXgpID4gLTEpXG4gICAgICAgIDogKCEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgpID4gLTEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nXG4gICAgICogYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgZWFjaCBpbnZva2VkIG1ldGhvZC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAgICogYXJlIHByb3ZpZGVkIHRvIGVhY2ggaW52b2tlZCBtZXRob2QuIElmIGBwYXRoYCBpcyBhIGZ1bmN0aW9uLCBpdCdzIGludm9rZWRcbiAgICAgKiBmb3IsIGFuZCBgdGhpc2AgYm91bmQgdG8sIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5fEZ1bmN0aW9ufHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZSBvclxuICAgICAqICB0aGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGVhY2ggbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludm9rZU1hcChbWzUsIDEsIDddLCBbMywgMiwgMV1dLCAnc29ydCcpO1xuICAgICAqIC8vID0+IFtbMSwgNSwgN10sIFsxLCAyLCAzXV1cbiAgICAgKlxuICAgICAqIF8uaW52b2tlTWFwKFsxMjMsIDQ1Nl0sIFN0cmluZy5wcm90b3R5cGUuc3BsaXQsICcnKTtcbiAgICAgKiAvLyA9PiBbWycxJywgJzInLCAnMyddLCBbJzQnLCAnNScsICc2J11dXG4gICAgICovXG4gICAgdmFyIGludm9rZU1hcCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHBhdGgsIGFyZ3MpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGlzRnVuYyA9IHR5cGVvZiBwYXRoID09ICdmdW5jdGlvbicsXG4gICAgICAgICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcblxuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmVzdWx0WysraW5kZXhdID0gaXNGdW5jID8gYXBwbHkocGF0aCwgdmFsdWUsIGFyZ3MpIDogYmFzZUludm9rZSh2YWx1ZSwgcGF0aCwgYXJncyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2ZcbiAgICAgKiBlYWNoIGtleSBpcyB0aGUgbGFzdCBlbGVtZW50IHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBrZXkuIFRoZVxuICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFtcbiAgICAgKiAgIHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LFxuICAgICAqICAgeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmtleUJ5KGFycmF5LCBmdW5jdGlvbihvKSB7XG4gICAgICogICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShvLmNvZGUpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSwgJ2QnOiB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9IH1cbiAgICAgKlxuICAgICAqIF8ua2V5QnkoYXJyYXksICdkaXInKTtcbiAgICAgKiAvLyA9PiB7ICdsZWZ0JzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdyaWdodCc6IHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH0gfVxuICAgICAqL1xuICAgIHZhciBrZXlCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIHZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1XG4gICAgICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gICAgICogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gICAgICogYF8uZXZlcnlgLCBgXy5maWx0ZXJgLCBgXy5tYXBgLCBgXy5tYXBWYWx1ZXNgLCBgXy5yZWplY3RgLCBhbmQgYF8uc29tZWAuXG4gICAgICpcbiAgICAgKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAgICAgKiBgYXJ5YCwgYGNodW5rYCwgYGN1cnJ5YCwgYGN1cnJ5UmlnaHRgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLCBgZXZlcnlgLFxuICAgICAqIGBmaWxsYCwgYGludmVydGAsIGBwYXJzZUludGAsIGByYW5kb21gLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZXBlYXRgLFxuICAgICAqIGBzYW1wbGVTaXplYCwgYHNsaWNlYCwgYHNvbWVgLCBgc29ydEJ5YCwgYHNwbGl0YCwgYHRha2VgLCBgdGFrZVJpZ2h0YCxcbiAgICAgKiBgdGVtcGxhdGVgLCBgdHJpbWAsIGB0cmltRW5kYCwgYHRyaW1TdGFydGAsIGFuZCBgd29yZHNgXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5tYXAoWzQsIDhdLCBzcXVhcmUpO1xuICAgICAqIC8vID0+IFsxNiwgNjRdXG4gICAgICpcbiAgICAgKiBfLm1hcCh7ICdhJzogNCwgJ2InOiA4IH0sIHNxdWFyZSk7XG4gICAgICogLy8gPT4gWzE2LCA2NF0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JyB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJyB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWFwKHVzZXJzLCAndXNlcicpO1xuICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlNYXAgOiBiYXNlTWFwO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRCeWAgZXhjZXB0IHRoYXQgaXQgYWxsb3dzIHNwZWNpZnlpbmcgdGhlIHNvcnRcbiAgICAgKiBvcmRlcnMgb2YgdGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LiBJZiBgb3JkZXJzYCBpcyB1bnNwZWNpZmllZCwgYWxsIHZhbHVlc1xuICAgICAqIGFyZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLiBPdGhlcndpc2UsIHNwZWNpZnkgYW4gb3JkZXIgb2YgXCJkZXNjXCIgZm9yXG4gICAgICogZGVzY2VuZGluZyBvciBcImFzY1wiIGZvciBhc2NlbmRpbmcgc29ydCBvcmRlciBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7QXJyYXlbXXxGdW5jdGlvbltdfE9iamVjdFtdfHN0cmluZ1tdfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IFtvcmRlcnNdIFRoZSBzb3J0IG9yZGVycyBvZiBgaXRlcmF0ZWVzYC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5yZWR1Y2VgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM0IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBTb3J0IGJ5IGB1c2VyYCBpbiBhc2NlbmRpbmcgb3JkZXIgYW5kIGJ5IGBhZ2VgIGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICogXy5vcmRlckJ5KHVzZXJzLCBbJ3VzZXInLCAnYWdlJ10sIFsnYXNjJywgJ2Rlc2MnXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCA0MF1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gb3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycywgZ3VhcmQpIHtcbiAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0FycmF5KGl0ZXJhdGVlcykpIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gaXRlcmF0ZWVzID09IG51bGwgPyBbXSA6IFtpdGVyYXRlZXNdO1xuICAgICAgfVxuICAgICAgb3JkZXJzID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBvcmRlcnM7XG4gICAgICBpZiAoIWlzQXJyYXkob3JkZXJzKSkge1xuICAgICAgICBvcmRlcnMgPSBvcmRlcnMgPT0gbnVsbCA/IFtdIDogW29yZGVyc107XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgc3BsaXQgaW50byB0d28gZ3JvdXBzLCB0aGUgZmlyc3Qgb2Ygd2hpY2hcbiAgICAgKiBjb250YWlucyBlbGVtZW50cyBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IsIHRoZSBzZWNvbmQgb2Ygd2hpY2hcbiAgICAgKiBjb250YWlucyBlbGVtZW50cyBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleSBmb3IuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydmcmVkJ10sIFsnYmFybmV5JywgJ3BlYmJsZXMnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydwZWJibGVzJ10sIFsnYmFybmV5JywgJ2ZyZWQnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnBhcnRpdGlvbih1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsICdwZWJibGVzJ10sIFsnZnJlZCddXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydmcmVkJ10sIFsnYmFybmV5JywgJ3BlYmJsZXMnXV1cbiAgICAgKi9cbiAgICB2YXIgcGFydGl0aW9uID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlc3VsdFtrZXkgPyAwIDogMV0ucHVzaCh2YWx1ZSk7XG4gICAgfSwgZnVuY3Rpb24oKSB7IHJldHVybiBbW10sIFtdXTsgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZWR1Y2VzIGBjb2xsZWN0aW9uYCB0byBhIHZhbHVlIHdoaWNoIGlzIHRoZSBhY2N1bXVsYXRlZCByZXN1bHQgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLCB3aGVyZSBlYWNoIHN1Y2Nlc3NpdmVcbiAgICAgKiBpbnZvY2F0aW9uIGlzIHN1cHBsaWVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzLiBJZiBgYWNjdW11bGF0b3JgXG4gICAgICogaXMgbm90IGdpdmVuLCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbFxuICAgICAqIHZhbHVlLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOlxuICAgICAqIChhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBNYW55IGxvZGFzaCBtZXRob2RzIGFyZSBndWFyZGVkIHRvIHdvcmsgYXMgaXRlcmF0ZWVzIGZvciBtZXRob2RzIGxpa2VcbiAgICAgKiBgXy5yZWR1Y2VgLCBgXy5yZWR1Y2VSaWdodGAsIGFuZCBgXy50cmFuc2Zvcm1gLlxuICAgICAqXG4gICAgICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6XG4gICAgICogYGFzc2lnbmAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgaW5jbHVkZXNgLCBgbWVyZ2VgLCBgb3JkZXJCeWAsXG4gICAgICogYW5kIGBzb3J0QnlgXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5yZWR1Y2VSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlZHVjZShbMSwgMl0sIGZ1bmN0aW9uKHN1bSwgbikge1xuICAgICAqICAgcmV0dXJuIHN1bSArIG47XG4gICAgICogfSwgMCk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5yZWR1Y2UoeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTtcbiAgICAgKiAgIHJldHVybiByZXN1bHQ7XG4gICAgICogfSwge30pO1xuICAgICAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVJlZHVjZSA6IGJhc2VSZWR1Y2UsXG4gICAgICAgICAgaW5pdEFjY3VtID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7XG5cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCA0KSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgYmFzZUVhY2gpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucmVkdWNlYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLnJlZHVjZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbWzAsIDFdLCBbMiwgM10sIFs0LCA1XV07XG4gICAgICpcbiAgICAgKiBfLnJlZHVjZVJpZ2h0KGFycmF5LCBmdW5jdGlvbihmbGF0dGVuZWQsIG90aGVyKSB7XG4gICAgICogICByZXR1cm4gZmxhdHRlbmVkLmNvbmNhdChvdGhlcik7XG4gICAgICogfSwgW10pO1xuICAgICAqIC8vID0+IFs0LCA1LCAyLCAzLCAwLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlSZWR1Y2VSaWdodCA6IGJhc2VSZWR1Y2UsXG4gICAgICAgICAgaW5pdEFjY3VtID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7XG5cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCA0KSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgYmFzZUVhY2hSaWdodCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLmZpbHRlcmA7IHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYFxuICAgICAqIHRoYXQgYHByZWRpY2F0ZWAgZG9lcyAqKm5vdCoqIHJldHVybiB0cnV0aHkgZm9yLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgICAqIEBzZWUgXy5maWx0ZXJcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5yZWplY3QodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5yZWplY3QodXNlcnMsIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5yZWplY3QodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5yZWplY3QodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVqZWN0KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgbmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgcmFuZG9tIGVsZW1lbnQgZnJvbSBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2FtcGxlKFsxLCAyLCAzLCA0XSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNhbXBsZShjb2xsZWN0aW9uKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNhbXBsZSA6IGJhc2VTYW1wbGU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGBuYCByYW5kb20gZWxlbWVudHMgYXQgdW5pcXVlIGtleXMgZnJvbSBgY29sbGVjdGlvbmAgdXAgdG8gdGhlXG4gICAgICogc2l6ZSBvZiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zYW1wbGVTaXplKFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzMsIDFdXG4gICAgICpcbiAgICAgKiBfLnNhbXBsZVNpemUoWzEsIDIsIDNdLCA0KTtcbiAgICAgKiAvLyA9PiBbMiwgMywgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYW1wbGVTaXplKGNvbGxlY3Rpb24sIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgbiwgZ3VhcmQpIDogbiA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBuID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICB9XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNhbXBsZVNpemUgOiBiYXNlU2FtcGxlU2l6ZTtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygc2h1ZmZsZWQgdmFsdWVzLCB1c2luZyBhIHZlcnNpb24gb2YgdGhlXG4gICAgICogW0Zpc2hlci1ZYXRlcyBzaHVmZmxlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GaXNoZXItWWF0ZXNfc2h1ZmZsZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNodWZmbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2h1ZmZsZShbMSwgMiwgMywgNF0pO1xuICAgICAqIC8vID0+IFs0LCAxLCAzLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNodWZmbGUoY29sbGVjdGlvbikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTaHVmZmxlIDogYmFzZVNodWZmbGU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIGBjb2xsZWN0aW9uYCBieSByZXR1cm5pbmcgaXRzIGxlbmd0aCBmb3IgYXJyYXktbGlrZVxuICAgICAqIHZhbHVlcyBvciB0aGUgbnVtYmVyIG9mIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIGZvciBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIHNpemUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2l6ZShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8uc2l6ZSh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIF8uc2l6ZSgncGViYmxlcycpO1xuICAgICAqIC8vID0+IDdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaXplKGNvbGxlY3Rpb24pIHtcbiAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pID8gc3RyaW5nU2l6ZShjb2xsZWN0aW9uKSA6IGNvbGxlY3Rpb24ubGVuZ3RoO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IGdldFRhZyhjb2xsZWN0aW9uKTtcbiAgICAgIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uc2l6ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlS2V5cyhjb2xsZWN0aW9uKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciAqKmFueSoqIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqIEl0ZXJhdGlvbiBpcyBzdG9wcGVkIG9uY2UgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb21lKFtudWxsLCAwLCAneWVzJywgZmFsc2VdLCBCb29sZWFuKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zb21lKHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb21lKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U29tZSA6IGJhc2VTb21lO1xuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpKSB7XG4gICAgICAgIHByZWRpY2F0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMsIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgdGhlIHJlc3VsdHMgb2ZcbiAgICAgKiBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gdGhydSBlYWNoIGl0ZXJhdGVlLiBUaGlzIG1ldGhvZFxuICAgICAqIHBlcmZvcm1zIGEgc3RhYmxlIHNvcnQsIHRoYXQgaXMsIGl0IHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgc29ydCBvcmRlciBvZlxuICAgICAqIGVxdWFsIGVsZW1lbnRzLiBUaGUgaXRlcmF0ZWVzIGFyZSBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0OCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDMwIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uc29ydEJ5KHVzZXJzLCBbZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyOyB9XSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCAzMF1dXG4gICAgICpcbiAgICAgKiBfLnNvcnRCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNF0sIFsnYmFybmV5JywgMzZdLCBbJ2ZyZWQnLCAzMF0sIFsnZnJlZCcsIDQ4XV1cbiAgICAgKi9cbiAgICB2YXIgc29ydEJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWVzKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBpdGVyYXRlZXMubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCA+IDEgJiYgaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgaXRlcmF0ZWVzWzBdLCBpdGVyYXRlZXNbMV0pKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IFtdO1xuICAgICAgfSBlbHNlIGlmIChsZW5ndGggPiAyICYmIGlzSXRlcmF0ZWVDYWxsKGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdLCBpdGVyYXRlZXNbMl0pKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IFtpdGVyYXRlZXNbMF1dO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGJhc2VGbGF0dGVuKGl0ZXJhdGVlcywgMSksIFtdKTtcbiAgICB9KTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICAgICAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IERhdGVcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKF8ubm93KCkgLSBzdGFtcCk7XG4gICAgICogfSwgXy5ub3coKSk7XG4gICAgICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAgICAgKi9cbiAgICB2YXIgbm93ID0gY3R4Tm93IHx8IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHJvb3QuRGF0ZS5ub3coKTtcbiAgICB9O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLmJlZm9yZWA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXNcbiAgICAgKiBgZnVuY2Agb25jZSBpdCdzIGNhbGxlZCBgbmAgb3IgbW9yZSB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgY2FsbHMgYmVmb3JlIGBmdW5jYCBpcyBpbnZva2VkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXZlcyA9IFsncHJvZmlsZScsICdzZXR0aW5ncyddO1xuICAgICAqXG4gICAgICogdmFyIGRvbmUgPSBfLmFmdGVyKHNhdmVzLmxlbmd0aCwgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnZG9uZSBzYXZpbmchJyk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goc2F2ZXMsIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgKiAgIGFzeW5jU2F2ZSh7ICd0eXBlJzogdHlwZSwgJ2NvbXBsZXRlJzogZG9uZSB9KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdkb25lIHNhdmluZyEnIGFmdGVyIHRoZSB0d28gYXN5bmMgc2F2ZXMgaGF2ZSBjb21wbGV0ZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWZ0ZXIobiwgZnVuYykge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKC0tbiA8IDEpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgLCB3aXRoIHVwIHRvIGBuYCBhcmd1bWVudHMsXG4gICAgICogaWdub3JpbmcgYW55IGFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgY2FwLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcChbJzYnLCAnOCcsICcxMCddLCBfLmFyeShwYXJzZUludCwgMSkpO1xuICAgICAqIC8vID0+IFs2LCA4LCAxMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnkoZnVuYywgbiwgZ3VhcmQpIHtcbiAgICAgIG4gPSBndWFyZCA/IHVuZGVmaW5lZCA6IG47XG4gICAgICBuID0gKGZ1bmMgJiYgbiA9PSBudWxsKSA/IGZ1bmMubGVuZ3RoIDogbjtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfQVJZX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2AsIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHNcbiAgICAgKiBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbiwgd2hpbGUgaXQncyBjYWxsZWQgbGVzcyB0aGFuIGBuYCB0aW1lcy4gU3Vic2VxdWVudFxuICAgICAqIGNhbGxzIHRvIHRoZSBjcmVhdGVkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBpbnZvY2F0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBjYWxscyBhdCB3aGljaCBgZnVuY2AgaXMgbm8gbG9uZ2VyIGludm9rZWQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uYmVmb3JlKDUsIGFkZENvbnRhY3RUb0xpc3QpKTtcbiAgICAgKiAvLyA9PiBBbGxvd3MgYWRkaW5nIHVwIHRvIDQgY29udGFjdHMgdG8gdGhlIGxpc3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmVmb3JlKG4sIGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoLS1uID4gMCkge1xuICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobiA8PSAxKSB7XG4gICAgICAgICAgZnVuYyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2BcbiAgICAgKiBhbmQgYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5iaW5kLnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWMgYnVpbGRzLFxuICAgICAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgbmF0aXZlIGBGdW5jdGlvbiNiaW5kYCwgdGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCJcbiAgICAgKiBwcm9wZXJ0eSBvZiBib3VuZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBiaW5kLlxuICAgICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBncmVldChncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICd1c2VyJzogJ2ZyZWQnIH07XG4gICAgICpcbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmQoZ3JlZXQsIG9iamVjdCwgJ2hpJyk7XG4gICAgICogYm91bmQoJyEnKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCEnXG4gICAgICpcbiAgICAgKiAvLyBCb3VuZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmQoZ3JlZXQsIG9iamVjdCwgXywgJyEnKTtcbiAgICAgKiBib3VuZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCEnXG4gICAgICovXG4gICAgdmFyIGJpbmQgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCB0aGlzQXJnLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGJpdG1hc2sgPSBXUkFQX0JJTkRfRkxBRztcbiAgICAgIGlmIChwYXJ0aWFscy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKGJpbmQpKTtcbiAgICAgICAgYml0bWFzayB8PSBXUkFQX1BBUlRJQUxfRkxBRztcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIG1ldGhvZCBhdCBgb2JqZWN0W2tleV1gIHdpdGggYHBhcnRpYWxzYFxuICAgICAqIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIGBfLmJpbmRgIGJ5IGFsbG93aW5nIGJvdW5kIGZ1bmN0aW9ucyB0byByZWZlcmVuY2VcbiAgICAgKiBtZXRob2RzIHRoYXQgbWF5IGJlIHJlZGVmaW5lZCBvciBkb24ndCB5ZXQgZXhpc3QuIFNlZVxuICAgICAqIFtQZXRlciBNaWNoYXV4J3MgYXJ0aWNsZV0oaHR0cDovL3BldGVyLm1pY2hhdXguY2EvYXJ0aWNsZXMvbGF6eS1mdW5jdGlvbi1kZWZpbml0aW9uLXBhdHRlcm4pXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5iaW5kS2V5LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52b2tlIHRoZSBtZXRob2Qgb24uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYm91bmQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7XG4gICAgICogICAndXNlcic6ICdmcmVkJyxcbiAgICAgKiAgICdncmVldCc6IGZ1bmN0aW9uKGdyZWV0aW5nLCBwdW5jdHVhdGlvbikge1xuICAgICAqICAgICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjtcbiAgICAgKiAgIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kS2V5KG9iamVjdCwgJ2dyZWV0JywgJ2hpJyk7XG4gICAgICogYm91bmQoJyEnKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCEnXG4gICAgICpcbiAgICAgKiBvYmplY3QuZ3JlZXQgPSBmdW5jdGlvbihncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICd5YSAnICsgdGhpcy51c2VyICsgcHVuY3R1YXRpb247XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpeWEgZnJlZCEnXG4gICAgICpcbiAgICAgKiAvLyBCb3VuZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmRLZXkob2JqZWN0LCAnZ3JlZXQnLCBfLCAnIScpO1xuICAgICAqIGJvdW5kKCdoaScpO1xuICAgICAqIC8vID0+ICdoaXlhIGZyZWQhJ1xuICAgICAqL1xuICAgIHZhciBiaW5kS2V5ID0gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBrZXksIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgYml0bWFzayA9IFdSQVBfQklORF9GTEFHIHwgV1JBUF9CSU5EX0tFWV9GTEFHO1xuICAgICAgaWYgKHBhcnRpYWxzLmxlbmd0aCkge1xuICAgICAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIoYmluZEtleSkpO1xuICAgICAgICBiaXRtYXNrIHw9IFdSQVBfUEFSVElBTF9GTEFHO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoa2V5LCBiaXRtYXNrLCBvYmplY3QsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYXJndW1lbnRzIG9mIGBmdW5jYCBhbmQgZWl0aGVyIGludm9rZXNcbiAgICAgKiBgZnVuY2AgcmV0dXJuaW5nIGl0cyByZXN1bHQsIGlmIGF0IGxlYXN0IGBhcml0eWAgbnVtYmVyIG9mIGFyZ3VtZW50cyBoYXZlXG4gICAgICogYmVlbiBwcm92aWRlZCwgb3IgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB0aGUgcmVtYWluaW5nIGBmdW5jYFxuICAgICAqIGFyZ3VtZW50cywgYW5kIHNvIG9uLiBUaGUgYXJpdHkgb2YgYGZ1bmNgIG1heSBiZSBzcGVjaWZpZWQgaWYgYGZ1bmMubGVuZ3RoYFxuICAgICAqIGlzIG5vdCBzdWZmaWNpZW50LlxuICAgICAqXG4gICAgICogVGhlIGBfLmN1cnJ5LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWMgYnVpbGRzLFxuICAgICAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBjdXJyaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYWJjID0gZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5KGFiYyk7XG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEpKDIpKDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogY3VycmllZCgxLCAyKSgzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSwgMiwgMyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiAvLyBDdXJyaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIGN1cnJpZWQoMSkoXywgMykoMik7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VycnkoZnVuYywgYXJpdHksIGd1YXJkKSB7XG4gICAgICBhcml0eSA9IGd1YXJkID8gdW5kZWZpbmVkIDogYXJpdHk7XG4gICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0NVUlJZX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSk7XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBjdXJyeS5wbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jdXJyeWAgZXhjZXB0IHRoYXQgYXJndW1lbnRzIGFyZSBhcHBsaWVkIHRvIGBmdW5jYFxuICAgICAqIGluIHRoZSBtYW5uZXIgb2YgYF8ucGFydGlhbFJpZ2h0YCBpbnN0ZWFkIG9mIGBfLnBhcnRpYWxgLlxuICAgICAqXG4gICAgICogVGhlIGBfLmN1cnJ5UmlnaHQucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIGN1cnJpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eT1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGN1cnJpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhYmMgPSBmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgICogICByZXR1cm4gW2EsIGIsIGNdO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiB2YXIgY3VycmllZCA9IF8uY3VycnlSaWdodChhYmMpO1xuICAgICAqXG4gICAgICogY3VycmllZCgzKSgyKSgxKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMiwgMykoMSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEsIDIsIDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiBjdXJyaWVkKDMpKDEsIF8pKDIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1cnJ5UmlnaHQoZnVuYywgYXJpdHksIGd1YXJkKSB7XG4gICAgICBhcml0eSA9IGd1YXJkID8gdW5kZWZpbmVkIDogYXJpdHk7XG4gICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSk7XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBjdXJyeVJpZ2h0LnBsYWNlaG9sZGVyO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcbiAgICAgKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAgICAgKiBpbnZva2VkLiBUaGUgZGVib3VuY2VkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYCBtZXRob2QgdG8gY2FuY2VsXG4gICAgICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG4gICAgICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gICAgICogbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcbiAgICAgKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICAgICAqIGludm9jYXRpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gICAgICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb25cbiAgICAgKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gICAgICpcbiAgICAgKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAgICAgKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gICAgICpcbiAgICAgKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAgICAgKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cbiAgICAgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhXYWl0XVxuICAgICAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gICAgICpcbiAgICAgKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gICAgICogICAnbGVhZGluZyc6IHRydWUsXG4gICAgICogICAndHJhaWxpbmcnOiBmYWxzZVxuICAgICAqIH0pKTtcbiAgICAgKlxuICAgICAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG4gICAgICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gICAgICogdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL3N0cmVhbScpO1xuICAgICAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcbiAgICAgKlxuICAgICAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgZGVib3VuY2VkIGludm9jYXRpb24uXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICAgICAgdmFyIGxhc3RBcmdzLFxuICAgICAgICAgIGxhc3RUaGlzLFxuICAgICAgICAgIG1heFdhaXQsXG4gICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgIHRpbWVySWQsXG4gICAgICAgICAgbGFzdENhbGxUaW1lLFxuICAgICAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcbiAgICAgICAgICBsZWFkaW5nID0gZmFsc2UsXG4gICAgICAgICAgbWF4aW5nID0gZmFsc2UsXG4gICAgICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDtcbiAgICAgIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgICAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG4gICAgICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zO1xuICAgICAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0O1xuICAgICAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcbiAgICAgICAgICAgIHRoaXNBcmcgPSBsYXN0VGhpcztcblxuICAgICAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgICAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpIHtcbiAgICAgICAgLy8gUmVzZXQgYW55IGBtYXhXYWl0YCB0aW1lci5cbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgICAgICAvLyBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSB0cmFpbGluZyBlZGdlLlxuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cbiAgICAgICAgcmV0dXJuIGxlYWRpbmcgPyBpbnZva2VGdW5jKHRpbWUpIDogcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcbiAgICAgICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWUsXG4gICAgICAgICAgICB0aW1lV2FpdGluZyA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuICAgICAgICByZXR1cm4gbWF4aW5nXG4gICAgICAgICAgPyBuYXRpdmVNaW4odGltZVdhaXRpbmcsIG1heFdhaXQgLSB0aW1lU2luY2VMYXN0SW52b2tlKVxuICAgICAgICAgIDogdGltZVdhaXRpbmc7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHNob3VsZEludm9rZSh0aW1lKSB7XG4gICAgICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lO1xuXG4gICAgICAgIC8vIEVpdGhlciB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCBhY3Rpdml0eSBoYXMgc3RvcHBlZCBhbmQgd2UncmUgYXQgdGhlXG4gICAgICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG4gICAgICAgIC8vIGl0IGFzIHRoZSB0cmFpbGluZyBlZGdlLCBvciB3ZSd2ZSBoaXQgdGhlIGBtYXhXYWl0YCBsaW1pdC5cbiAgICAgICAgcmV0dXJuIChsYXN0Q2FsbFRpbWUgPT09IHVuZGVmaW5lZCB8fCAodGltZVNpbmNlTGFzdENhbGwgPj0gd2FpdCkgfHxcbiAgICAgICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB0aW1lckV4cGlyZWQoKSB7XG4gICAgICAgIHZhciB0aW1lID0gbm93KCk7XG4gICAgICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJhaWxpbmdFZGdlKHRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLlxuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHJlbWFpbmluZ1dhaXQodGltZSkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkge1xuICAgICAgICB0aW1lcklkID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW5cbiAgICAgICAgLy8gZGVib3VuY2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgICAgIGlmICh0cmFpbGluZyAmJiBsYXN0QXJncykge1xuICAgICAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0SW52b2tlVGltZSA9IDA7XG4gICAgICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICAgICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3coKSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcbiAgICAgICAgdmFyIHRpbWUgPSBub3coKSxcbiAgICAgICAgICAgIGlzSW52b2tpbmcgPSBzaG91bGRJbnZva2UodGltZSk7XG5cbiAgICAgICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICAgICAgbGFzdENhbGxUaW1lID0gdGltZTtcblxuICAgICAgICBpZiAoaXNJbnZva2luZykge1xuICAgICAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBsZWFkaW5nRWRnZShsYXN0Q2FsbFRpbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobWF4aW5nKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgaW52b2NhdGlvbnMgaW4gYSB0aWdodCBsb29wLlxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgICAgIHJldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICAgICAgZGVib3VuY2VkLmZsdXNoID0gZmx1c2g7XG4gICAgICByZXR1cm4gZGVib3VuY2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmVycyBpbnZva2luZyB0aGUgYGZ1bmNgIHVudGlsIHRoZSBjdXJyZW50IGNhbGwgc3RhY2sgaGFzIGNsZWFyZWQuIEFueVxuICAgICAqIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCdzIGludm9rZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWZlci5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lciBpZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZlcihmdW5jdGlvbih0ZXh0KSB7XG4gICAgICogICBjb25zb2xlLmxvZyh0ZXh0KTtcbiAgICAgKiB9LCAnZGVmZXJyZWQnKTtcbiAgICAgKiAvLyA9PiBMb2dzICdkZWZlcnJlZCcgYWZ0ZXIgb25lIG1pbGxpc2Vjb25kLlxuICAgICAqL1xuICAgIHZhciBkZWZlciA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBiYXNlRGVsYXkoZnVuYywgMSwgYXJncyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIGBmdW5jYCBhZnRlciBgd2FpdGAgbWlsbGlzZWNvbmRzLiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlXG4gICAgICogcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQncyBpbnZva2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lciBpZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWxheShmdW5jdGlvbih0ZXh0KSB7XG4gICAgICogICBjb25zb2xlLmxvZyh0ZXh0KTtcbiAgICAgKiB9LCAxMDAwLCAnbGF0ZXInKTtcbiAgICAgKiAvLyA9PiBMb2dzICdsYXRlcicgYWZ0ZXIgb25lIHNlY29uZC5cbiAgICAgKi9cbiAgICB2YXIgZGVsYXkgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCB3YWl0LCBhcmdzKSB7XG4gICAgICByZXR1cm4gYmFzZURlbGF5KGZ1bmMsIHRvTnVtYmVyKHdhaXQpIHx8IDAsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnV
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment