@cloudflare/realtimekit 1.4.0 → 1.5.0-staging.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- "use strict";var ml=Object.defineProperty,Gl=Object.defineProperties;var Rl=Object.getOwnPropertyDescriptors;var Q=Object.getOwnPropertySymbols;var pl=Object.prototype.hasOwnProperty,Yl=Object.prototype.propertyIsEnumerable;var z=(Z,d,l)=>d in Z?ml(Z,d,{enumerable:!0,configurable:!0,writable:!0,value:l}):Z[d]=l,n=(Z,d)=>{for(var l in d||(d={}))pl.call(d,l)&&z(Z,l,d[l]);if(Q)for(var l of Q(d))Yl.call(d,l)&&z(Z,l,d[l]);return Z},e=(Z,d)=>Gl(Z,Rl(d));var R=(Z,d,l)=>(z(Z,typeof d!="symbol"?d+"":d,l),l),B=(Z,d,l)=>{if(!d.has(Z))throw TypeError("Cannot "+l)};var j=(Z,d,l)=>(B(Z,d,"read from private field"),l?l.call(Z):d.get(Z)),p=(Z,d,l)=>{if(d.has(Z))throw TypeError("Cannot add the same private member more than once");d instanceof WeakSet?d.add(Z):d.set(Z,l)};var Y=(Z,d,l)=>(B(Z,d,"access private method"),l);var J=(Z,d,l)=>new Promise((c,b)=>{var X=G=>{try{V(l.next(G))}catch(y){b(y)}},W=G=>{try{V(l.throw(G))}catch(y){b(y)}},V=G=>G.done?c(G.value):Promise.resolve(G.value).then(X,W);V((l=l.apply(Z,d)).next())});var I={},yl={get exports(){return I},set exports(Z){I=Z}},h=typeof Reflect=="object"?Reflect:null,M=h&&typeof h.apply=="function"?h.apply:function(d,l,c){return Function.prototype.apply.call(d,l,c)},L;h&&typeof h.ownKeys=="function"?L=h.ownKeys:Object.getOwnPropertySymbols?L=function(d){return Object.getOwnPropertyNames(d).concat(Object.getOwnPropertySymbols(d))}:L=function(d){return Object.getOwnPropertyNames(d)};function ul(Z){console&&console.warn&&console.warn(Z)}var P=Number.isNaN||function(d){return d!==d};function m(){m.init.call(this)}yl.exports=m;I.once=Nl;m.EventEmitter=m;m.prototype._events=void 0;m.prototype._eventsCount=0;m.prototype._maxListeners=void 0;var w=10;function o(Z){if(typeof Z!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof Z)}Object.defineProperty(m,"defaultMaxListeners",{enumerable:!0,get:function(){return w},set:function(Z){if(typeof Z!="number"||Z<0||P(Z))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+Z+".");w=Z}});m.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0};m.prototype.setMaxListeners=function(d){if(typeof d!="number"||d<0||P(d))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+d+".");return this._maxListeners=d,this};function f(Z){return Z._maxListeners===void 0?m.defaultMaxListeners:Z._maxListeners}m.prototype.getMaxListeners=function(){return f(this)};m.prototype.emit=function(d){for(var l=[],c=1;c<arguments.length;c++)l.push(arguments[c]);var b=d==="error",X=this._events;if(X!==void 0)b=b&&X.error===void 0;else if(!b)return!1;if(b){var W;if(l.length>0&&(W=l[0]),W instanceof Error)throw W;var V=new Error("Unhandled error."+(W?" ("+W.message+")":""));throw V.context=W,V}var G=X[d];if(G===void 0)return!1;if(typeof G=="function")M(G,this,l);else for(var y=G.length,u=_(G,y),c=0;c<y;++c)M(u[c],this,l);return!0};function O(Z,d,l,c){var b,X,W;if(o(l),X=Z._events,X===void 0?(X=Z._events=Object.create(null),Z._eventsCount=0):(X.newListener!==void 0&&(Z.emit("newListener",d,l.listener?l.listener:l),X=Z._events),W=X[d]),W===void 0)W=X[d]=l,++Z._eventsCount;else if(typeof W=="function"?W=X[d]=c?[l,W]:[W,l]:c?W.unshift(l):W.push(l),b=f(Z),b>0&&W.length>b&&!W.warned){W.warned=!0;var V=new Error("Possible EventEmitter memory leak detected. "+W.length+" "+String(d)+" listeners added. Use emitter.setMaxListeners() to increase limit");V.name="MaxListenersExceededWarning",V.emitter=Z,V.type=d,V.count=W.length,ul(V)}return Z}m.prototype.addListener=function(d,l){return O(this,d,l,!1)};m.prototype.on=m.prototype.addListener;m.prototype.prependListener=function(d,l){return O(this,d,l,!0)};function hl(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function D(Z,d,l){var c={fired:!1,wrapFn:void 0,target:Z,type:d,listener:l},b=hl.bind(c);return b.listener=l,c.wrapFn=b,b}m.prototype.once=function(d,l){return o(l),this.on(d,D(this,d,l)),this};m.prototype.prependOnceListener=function(d,l){return o(l),this.prependListener(d,D(this,d,l)),this};m.prototype.removeListener=function(d,l){var c,b,X,W,V;if(o(l),b=this._events,b===void 0)return this;if(c=b[d],c===void 0)return this;if(c===l||c.listener===l)--this._eventsCount===0?this._events=Object.create(null):(delete b[d],b.removeListener&&this.emit("removeListener",d,c.listener||l));else if(typeof c!="function"){for(X=-1,W=c.length-1;W>=0;W--)if(c[W]===l||c[W].listener===l){V=c[W].listener,X=W;break}if(X<0)return this;X===0?c.shift():Jl(c,X),c.length===1&&(b[d]=c[0]),b.removeListener!==void 0&&this.emit("removeListener",d,V||l)}return this};m.prototype.off=m.prototype.removeListener;m.prototype.removeAllListeners=function(d){var l,c,b;if(c=this._events,c===void 0)return this;if(c.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):c[d]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete c[d]),this;if(arguments.length===0){var X=Object.keys(c),W;for(b=0;b<X.length;++b)W=X[b],W!=="removeListener"&&this.removeAllListeners(W);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if(l=c[d],typeof l=="function")this.removeListener(d,l);else if(l!==void 0)for(b=l.length-1;b>=0;b--)this.removeListener(d,l[b]);return this};function r(Z,d,l){var c=Z._events;if(c===void 0)return[];var b=c[d];return b===void 0?[]:typeof b=="function"?l?[b.listener||b]:[b]:l?il(b):_(b,b.length)}m.prototype.listeners=function(d){return r(this,d,!0)};m.prototype.rawListeners=function(d){return r(this,d,!1)};m.listenerCount=function(Z,d){return typeof Z.listenerCount=="function"?Z.listenerCount(d):A.call(Z,d)};m.prototype.listenerCount=A;function A(Z){var d=this._events;if(d!==void 0){var l=d[Z];if(typeof l=="function")return 1;if(l!==void 0)return l.length}return 0}m.prototype.eventNames=function(){return this._eventsCount>0?L(this._events):[]};function _(Z,d){for(var l=new Array(d),c=0;c<d;++c)l[c]=Z[c];return l}function Jl(Z,d){for(;d+1<Z.length;d++)Z[d]=Z[d+1];Z.pop()}function il(Z){for(var d=new Array(Z.length),l=0;l<d.length;++l)d[l]=Z[l].listener||Z[l];return d}function Nl(Z,d){return new Promise(function(l,c){function b(W){Z.removeListener(d,X),c(W)}function X(){typeof Z.removeListener=="function"&&Z.removeListener("error",b),l([].slice.call(arguments))}q(Z,d,X,{once:!0}),d!=="error"&&al(Z,b,{once:!0})})}function al(Z,d,l){typeof Z.on=="function"&&q(Z,"error",d,l)}function q(Z,d,l,c){if(typeof Z.on=="function")c.once?Z.once(d,l):Z.on(d,l);else if(typeof Z.addEventListener=="function")Z.addEventListener(d,function b(X){c.once&&Z.removeEventListener(d,b),l(X)});else throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof Z)}class $ extends I.EventEmitter{constructor(l){super();R(this,"logger");this.logger=l,super.setMaxListeners(25)}emit(l,...c){return super.emit("*",l,...c),super.emit(l,...c)}on(l,c){var b;try{const X=this.listenerCount(l);X>25&&X%25===0&&((b=this.logger)==null||b.warn("CustomEventEmitter::maxListenersExceeded",{eventListener:{eventName:l.toString(),listenerCount:this.listenerCount(l)}}))}catch(X){}return super.on(l,c)}addListener(l,c){var b;try{const X=this.listenerCount(l);X>25&&X%25===0&&((b=this.logger)==null||b.warn("CustomEventEmitter::maxListenersExceeded",{eventListener:{eventName:l.toString(),listenerCount:this.listenerCount(l)}}))}catch(X){}return super.addListener(l,c)}off(l,c){return super.off(l,c)}once(l,c){return super.once(l,c)}prependListener(l,c){return super.prependListener(l,c)}prependOnceListener(l,c){return super.prependOnceListener(l,c)}removeListener(l,c){return super.removeListener(l,c)}removeAllListeners(l){return super.removeAllListeners(l)}listeners(l){return super.listeners(l)}listenerCount(l){return super.listenerCount(l)}}const F="realtimekit_e2ee",nl="RealtimeKitFrameEncryptionKey",Fl={sharedKey:!1,ratchetSalt:nl,ratchetWindowSize:8};function x(){return typeof window.RTCRtpScriptTransform!="undefined"}function Ll(){return typeof window.RTCRtpSender!="undefined"&&typeof window.RTCRtpSender.prototype.createEncodedStreams!="undefined"}function Il(Z){return J(this,null,function*(){const d=new TextEncoder;return yield crypto.subtle.importKey("raw",d.encode(Z),{name:"PBKDF2"},!1,["deriveBits","deriveKey"])})}function sl(){return Ll()||x()}class kl extends ${constructor(l={}){super(void 0);R(this,"keyInfoMap");R(this,"options");R(this,"onKeyRatcheted",(l,c)=>{});this.keyInfoMap=new Map,this.options=n(n({},Fl),l),this.on("keyRatcheted",this.onKeyRatcheted)}onSetEncryptionKey(l,c,b){const X={key:l,participantId:c,keyIndex:b};this.keyInfoMap.set(`${c!=null?c:"shared"}-${b!=null?b:0}`,X),this.emit("setKey",X)}getKeys(){return Array.from(this.keyInfoMap.values())}getOptions(){return this.options}ratchetKey(l,c){this.emit("ratchetRequest",l,c)}}class Hl extends kl{constructor(l={}){const c=e(n({},l),{sharedKey:!0});super(c);R(this,"ratchetInterval")}setKey(l){return J(this,null,function*(){const c=yield Il(l);this.onSetEncryptionKey(c)})}}const E={ParticipantEncryptionStatusChanged:"participantEncryptionStatusChanged",Error:"encryptionError"};var i=(Z=>(Z.NEW_PRODUCER="NEW_PRODUCER",Z.ROOM_NODE_CONNECTION_ERROR="ROOM_NODE_CONNECTION_ERROR",Z.SOCKET_SERVICE_ROOM_JOINED="SOCKET_SERVICE_ROOM_JOINED",Z.SOCKET_SERVICE_RECONNECTED="SOCKET_SERVICE_RECONNECTED",Z.SOCKET_SERVICE_DISCONNECTED="SOCKET_SERVICE_DISCONNECTED",Z.SOCKET_SERVICE_FAILED="SOCKET_SERVICE_FAILED",Z.SOCKET_STATE_UPDATE="SOCKET_STATE_UPDATE",Z.ROOM_NODE_RECONNECTED="ROOM_NODE_RECONNECTED",Z.ROOM_NODE_DISCONNECTED="ROOM_NODE_DISCONNECTED",Z.ROOM_NODE_FAILED="ROOM_NODE_FAILED",Z.TRANSPORT_STATE_UPDATE="TRANSPORT_STATE_UPDATE",Z.PRODUCER_SCORE_UPDATE="PRODUCER_SCORE_UPDATE",Z.CONSUMER_SCORE_UPDATE="CONSUMER_SCORE_UPDATE",Z.PRODUCER_STATUS_UPDATE="PRODUCER_STATUS_UPDATE",Z.CONSUMER_STATUS_UPDATE="CONSUMER_STATUS_UPDATE",Z.LOW_CONSUMER_SCORE="LOW_CONSUMER_SCORE",Z.MEDIA_PERMISSION_ERROR="MEDIA_PERMISSION_ERROR",Z.MEDIA_PERMISSION_UPDATE="MEDIA_PERMISSION_UPDATE",Z.MESSAGE="websocket/message",Z.ROOM_MESSAGE="websocket/room-message",Z.PEER_JOINED_INTERNAL="peer/joined-internal",Z.PEER_CLOSED="websocket/peer-closed",Z.CONSUMER_CLOSED="websocket/consumer-closed",Z.CONSUMER_PAUSED="websocket/consumer-paused",Z.CONSUMER_RESUMED="websocket/consumer-resumed",Z.PRODUCER_CLOSED="websocket/producer-closed",Z.NEW_CONSUMER="websocket/new-consumer",Z.PRODUCER_SCORE="websocket/producer-score",Z.CONSUMER_SCORE="websocket/consumer-score",Z.PRODUCER_TOGGLE="cf/producer-toggle",Z.UPDATE_ACTIVE="media/update-active",Z.RESET_PRODUCER_STATE="cf/reset-producer-state",Z.ROOM_STATE="sockethub/room-state",Z.GET_STAGE_REQUESTS="GET_STAGE_REQUESTS",Z.UPDATE_STAGE_REQUESTS="UPDATE_STAGE_REQUESTS",Z.KICK_PEER="KICK_PEER",Z.UPDATE_PEER_STAGE_STATUS="UPDATE_PEER_STAGE_STATUS",Z.JOIN_MEDIA_ROOM="JOIN_MEDIA_ROOM",Z.LEAVE_MEDIA_ROOM="LEAVE_MEDIA_ROOM",Z.PIP_HANGUP="PIP_HANGUP",Z.E2EE_ACTIVE_PRODUCER="E2EE_ACTIVE_PRODUCER",Z.E2EE_INACTIVE_PRODUCER="E2EE_INACTIVE_PRODUCER",Z.E2EE_ACTIVE_CONSUMER="E2EE_ACTIVE_CONSUMER",Z.E2EE_INACTIVE_CONSUMER="E2EE_INACTIVE_CONSUMER",Z.SOCKET_PEERS="SOCKET_PEERS",Z.UPDATE_PERMISSIONS="UPDATE_PERMISSIONS",Z.MAX_SPATIAL_LAYER_CHANGE="MAX_SPATIAL_LAYER_CHANGE",Z.MUTE_SELF="MUTE_SELF",Z.MUTE_SELF_VIDEO="MUTE_SELF_VIDEO",Z))(i||{});const ll="dmFyIHdkPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxBZD1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgTWQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIFpzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsa2Q9T2JqZWN0LmdldFByb3RvdHlwZU9mLE9kPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksTGQ9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxEZD1SZWZsZWN0LmdldDt2YXIgc3I9KGssTyxNKT0+TyBpbiBrP3dkKGssTyx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6TX0pOmtbT109TSxRPShrLE8pPT57Zm9yKHZhciBNIGluIE98fChPPXt9KSlPZC5jYWxsKE8sTSkmJnNyKGssTSxPW01dKTtpZihacylmb3IodmFyIE0gb2YgWnMoTykpTGQuY2FsbChPLE0pJiZzcihrLE0sT1tNXSk7cmV0dXJuIGt9LG90PShrLE8pPT5BZChrLE1kKE8pKTt2YXIgcD0oayxPLE0pPT4oc3Ioayx0eXBlb2YgTyE9InN5bWJvbCI/TysiIjpPLE0pLE0pLGVuPShrLE8sTSk9PntpZighTy5oYXMoaykpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIitNKX07dmFyIGVlPShrLE8sTSk9PihlbihrLE8sInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksTT9NLmNhbGwoayk6Ty5nZXQoaykpLEl0PShrLE8sTSk9PntpZihPLmhhcyhrKSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTtPIGluc3RhbmNlb2YgV2Vha1NldD9PLmFkZChrKTpPLnNldChrLE0pfSxDZT0oayxPLE0sZGUpPT4oZW4oayxPLCJ3cml0ZSB0byBwcml2YXRlIGZpZWxkIiksZGU/ZGUuY2FsbChrLE0pOk8uc2V0KGssTSksTSk7dmFyIHRuPShrLE8sTSk9PkRkKGtkKGspLE0sTyk7dmFyIEk9KGssTyxNKT0+bmV3IFByb21pc2UoKGRlLHd0KT0+e3ZhciBBdD1ZPT57dHJ5e0llKE0ubmV4dChZKSl9Y2F0Y2goYmUpe3d0KGJlKX19LHE9WT0+e3RyeXtJZShNLnRocm93KFkpKX1jYXRjaChiZSl7d3QoYmUpfX0sSWU9WT0+WS5kb25lP2RlKFkudmFsdWUpOlByb21pc2UucmVzb2x2ZShZLnZhbHVlKS50aGVuKEF0LHEpO0llKChNPU0uYXBwbHkoayxPKSkubmV4dCgpKX0pOyhmdW5jdGlvbigpe3ZhciBYcyxGZSxuZSxpZTsidXNlIHN0cmljdCI7Y29uc3Qgaz0iQUVTLUdDTSIsTT17a2V5OjEwLGRlbHRhOjMsYXVkaW86MSxlbXB0eTowfSxkZT0xMixBdD17c2hhcmVkS2V5OiExLHJhdGNoZXRTYWx0OiJSZWFsdGltZUtpdEZyYW1lRW5jcnlwdGlvbktleSIscmF0Y2hldFdpbmRvd1NpemU6OH07dmFyIHE9e30sSWU9e2dldCBleHBvcnRzKCl7cmV0dXJuIHF9LHNldCBleHBvcnRzKHQpe3E9dH19LFk9dHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiP1JlZmxlY3Q6bnVsbCxiZT1ZJiZ0eXBlb2YgWS5hcHBseT09ImZ1bmN0aW9uIj9ZLmFwcGx5OmZ1bmN0aW9uKHIsZSxzKXtyZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwocixlLHMpfSxjdDtZJiZ0eXBlb2YgWS5vd25LZXlzPT0iZnVuY3Rpb24iP2N0PVkub3duS2V5czpPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzP2N0PWZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhyKSl9OmN0PWZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKX07ZnVuY3Rpb24gcm4odCl7Y29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4odCl9dmFyIG5yPU51bWJlci5pc05hTnx8ZnVuY3Rpb24ocil7cmV0dXJuIHIhPT1yfTtmdW5jdGlvbiBEKCl7RC5pbml0LmNhbGwodGhpcyl9SWUuZXhwb3J0cz1ELHEub25jZT1vbixELkV2ZW50RW1pdHRlcj1ELEQucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLEQucHJvdG90eXBlLl9ldmVudHNDb3VudD0wLEQucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwO3ZhciBpcj0xMDtmdW5jdGlvbiBkdCh0KXtpZih0eXBlb2YgdCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgdCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KEQsImRlZmF1bHRNYXhMaXN0ZW5lcnMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBpcn0sc2V0OmZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHxucih0KSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mICJkZWZhdWx0TWF4TGlzdGVuZXJzIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3QrIi4iKTtpcj10fX0pLEQuaW5pdD1mdW5jdGlvbigpeyh0aGlzLl9ldmVudHM9PT12b2lkIDB8fHRoaXMuX2V2ZW50cz09PU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSYmKHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApLHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH0sRC5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKHIpe2lmKHR5cGVvZiByIT0ibnVtYmVyInx8cjwwfHxucihyKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mICJuIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3IrIi4iKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPXIsdGhpc307ZnVuY3Rpb24gYXIodCl7cmV0dXJuIHQuX21heExpc3RlbmVycz09PXZvaWQgMD9ELmRlZmF1bHRNYXhMaXN0ZW5lcnM6dC5fbWF4TGlzdGVuZXJzfUQucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybiBhcih0aGlzKX0sRC5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihyKXtmb3IodmFyIGU9W10scz0xO3M8YXJndW1lbnRzLmxlbmd0aDtzKyspZS5wdXNoKGFyZ3VtZW50c1tzXSk7dmFyIG49cj09PSJlcnJvciIsaT10aGlzLl9ldmVudHM7aWYoaSE9PXZvaWQgMCluPW4mJmkuZXJyb3I9PT12b2lkIDA7ZWxzZSBpZighbilyZXR1cm4hMTtpZihuKXt2YXIgYTtpZihlLmxlbmd0aD4wJiYoYT1lWzBdKSxhIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgYTt2YXIgZD1uZXcgRXJyb3IoIlVuaGFuZGxlZCBlcnJvci4iKyhhPyIgKCIrYS5tZXNzYWdlKyIpIjoiIikpO3Rocm93IGQuY29udGV4dD1hLGR9dmFyIG89aVtyXTtpZihvPT09dm9pZCAwKXJldHVybiExO2lmKHR5cGVvZiBvPT0iZnVuY3Rpb24iKWJlKG8sdGhpcyxlKTtlbHNlIGZvcih2YXIgbD1vLmxlbmd0aCxmPXVyKG8sbCkscz0wO3M8bDsrK3MpYmUoZltzXSx0aGlzLGUpO3JldHVybiEwfTtmdW5jdGlvbiBvcih0LHIsZSxzKXt2YXIgbixpLGE7aWYoZHQoZSksaT10Ll9ldmVudHMsaT09PXZvaWQgMD8oaT10Ll9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0Ll9ldmVudHNDb3VudD0wKTooaS5uZXdMaXN0ZW5lciE9PXZvaWQgMCYmKHQuZW1pdCgibmV3TGlzdGVuZXIiLHIsZS5saXN0ZW5lcj9lLmxpc3RlbmVyOmUpLGk9dC5fZXZlbnRzKSxhPWlbcl0pLGE9PT12b2lkIDApYT1pW3JdPWUsKyt0Ll9ldmVudHNDb3VudDtlbHNlIGlmKHR5cGVvZiBhPT0iZnVuY3Rpb24iP2E9aVtyXT1zP1tlLGFdOlthLGVdOnM/YS51bnNoaWZ0KGUpOmEucHVzaChlKSxuPWFyKHQpLG4+MCYmYS5sZW5ndGg+biYmIWEud2FybmVkKXthLndhcm5lZD0hMDt2YXIgZD1uZXcgRXJyb3IoIlBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gIithLmxlbmd0aCsiICIrU3RyaW5nKHIpKyIgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdCIpO2QubmFtZT0iTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nIixkLmVtaXR0ZXI9dCxkLnR5cGU9cixkLmNvdW50PWEubGVuZ3RoLHJuKGQpfXJldHVybiB0fUQucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIG9yKHRoaXMscixlLCExKX0sRC5wcm90b3R5cGUub249RC5wcm90b3R5cGUuYWRkTGlzdGVuZXIsRC5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIG9yKHRoaXMscixlLCEwKX07ZnVuY3Rpb24gc24oKXtpZighdGhpcy5maXJlZClyZXR1cm4gdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLHRoaXMud3JhcEZuKSx0aGlzLmZpcmVkPSEwLGFyZ3VtZW50cy5sZW5ndGg9PT0wP3RoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk6dGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCxhcmd1bWVudHMpfWZ1bmN0aW9uIGNyKHQscixlKXt2YXIgcz17ZmlyZWQ6ITEsd3JhcEZuOnZvaWQgMCx0YXJnZXQ6dCx0eXBlOnIsbGlzdGVuZXI6ZX0sbj1zbi5iaW5kKHMpO3JldHVybiBuLmxpc3RlbmVyPWUscy53cmFwRm49bixufUQucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24ocixlKXtyZXR1cm4gZHQoZSksdGhpcy5vbihyLGNyKHRoaXMscixlKSksdGhpc30sRC5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1mdW5jdGlvbihyLGUpe3JldHVybiBkdChlKSx0aGlzLnByZXBlbmRMaXN0ZW5lcihyLGNyKHRoaXMscixlKSksdGhpc30sRC5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24ocixlKXt2YXIgcyxuLGksYSxkO2lmKGR0KGUpLG49dGhpcy5fZXZlbnRzLG49PT12b2lkIDApcmV0dXJuIHRoaXM7aWYocz1uW3JdLHM9PT12b2lkIDApcmV0dXJuIHRoaXM7aWYocz09PWV8fHMubGlzdGVuZXI9PT1lKS0tdGhpcy5fZXZlbnRzQ291bnQ9PT0wP3RoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpOihkZWxldGUgbltyXSxuLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIixyLHMubGlzdGVuZXJ8fGUpKTtlbHNlIGlmKHR5cGVvZiBzIT0iZnVuY3Rpb24iKXtmb3IoaT0tMSxhPXMubGVuZ3RoLTE7YT49MDthLS0paWYoc1thXT09PWV8fHNbYV0ubGlzdGVuZXI9PT1lKXtkPXNbYV0ubGlzdGVuZXIsaT1hO2JyZWFrfWlmKGk8MClyZXR1cm4gdGhpcztpPT09MD9zLnNoaWZ0KCk6bm4ocyxpKSxzLmxlbmd0aD09PTEmJihuW3JdPXNbMF0pLG4ucmVtb3ZlTGlzdGVuZXIhPT12b2lkIDAmJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLHIsZHx8ZSl9cmV0dXJuIHRoaXN9LEQucHJvdG90eXBlLm9mZj1ELnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcixELnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7dmFyIGUscyxuO2lmKHM9dGhpcy5fZXZlbnRzLHM9PT12b2lkIDApcmV0dXJuIHRoaXM7aWYocy5yZW1vdmVMaXN0ZW5lcj09PXZvaWQgMClyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTA/KHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApOnNbcl0hPT12b2lkIDAmJigtLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTpkZWxldGUgc1tyXSksdGhpcztpZihhcmd1bWVudHMubGVuZ3RoPT09MCl7dmFyIGk9T2JqZWN0LmtleXMocyksYTtmb3Iobj0wO248aS5sZW5ndGg7KytuKWE9aVtuXSxhIT09InJlbW92ZUxpc3RlbmVyIiYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoYSk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTAsdGhpc31pZihlPXNbcl0sdHlwZW9mIGU9PSJmdW5jdGlvbiIpdGhpcy5yZW1vdmVMaXN0ZW5lcihyLGUpO2Vsc2UgaWYoZSE9PXZvaWQgMClmb3Iobj1lLmxlbmd0aC0xO24+PTA7bi0tKXRoaXMucmVtb3ZlTGlzdGVuZXIocixlW25dKTtyZXR1cm4gdGhpc307ZnVuY3Rpb24gZHIodCxyLGUpe3ZhciBzPXQuX2V2ZW50cztpZihzPT09dm9pZCAwKXJldHVybltdO3ZhciBuPXNbcl07cmV0dXJuIG49PT12b2lkIDA/W106dHlwZW9mIG49PSJmdW5jdGlvbiI/ZT9bbi5saXN0ZW5lcnx8bl06W25dOmU/YW4obik6dXIobixuLmxlbmd0aCl9RC5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKHIpe3JldHVybiBkcih0aGlzLHIsITApfSxELnByb3RvdHlwZS5yYXdMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7cmV0dXJuIGRyKHRoaXMsciwhMSl9LEQubGlzdGVuZXJDb3VudD1mdW5jdGlvbih0LHIpe3JldHVybiB0eXBlb2YgdC5saXN0ZW5lckNvdW50PT0iZnVuY3Rpb24iP3QubGlzdGVuZXJDb3VudChyKTpsci5jYWxsKHQscil9LEQucHJvdG90eXBlLmxpc3RlbmVyQ291bnQ9bHI7ZnVuY3Rpb24gbHIodCl7dmFyIHI9dGhpcy5fZXZlbnRzO2lmKHIhPT12b2lkIDApe3ZhciBlPXJbdF07aWYodHlwZW9mIGU9PSJmdW5jdGlvbiIpcmV0dXJuIDE7aWYoZSE9PXZvaWQgMClyZXR1cm4gZS5sZW5ndGh9cmV0dXJuIDB9RC5wcm90b3R5cGUuZXZlbnROYW1lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudHNDb3VudD4wP2N0KHRoaXMuX2V2ZW50cyk6W119O2Z1bmN0aW9uIHVyKHQscil7Zm9yKHZhciBlPW5ldyBBcnJheShyKSxzPTA7czxyOysrcyllW3NdPXRbc107cmV0dXJuIGV9ZnVuY3Rpb24gbm4odCxyKXtmb3IoO3IrMTx0Lmxlbmd0aDtyKyspdFtyXT10W3IrMV07dC5wb3AoKX1mdW5jdGlvbiBhbih0KXtmb3IodmFyIHI9bmV3IEFycmF5KHQubGVuZ3RoKSxlPTA7ZTxyLmxlbmd0aDsrK2UpcltlXT10W2VdLmxpc3RlbmVyfHx0W2VdO3JldHVybiByfWZ1bmN0aW9uIG9uKHQscil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUscyl7ZnVuY3Rpb24gbihhKXt0LnJlbW92ZUxpc3RlbmVyKHIsaSkscyhhKX1mdW5jdGlvbiBpKCl7dHlwZW9mIHQucmVtb3ZlTGlzdGVuZXI9PSJmdW5jdGlvbiImJnQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixuKSxlKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSl9cHIodCxyLGkse29uY2U6ITB9KSxyIT09ImVycm9yIiYmY24odCxuLHtvbmNlOiEwfSl9KX1mdW5jdGlvbiBjbih0LHIsZSl7dHlwZW9mIHQub249PSJmdW5jdGlvbiImJnByKHQsImVycm9yIixyLGUpfWZ1bmN0aW9uIHByKHQscixlLHMpe2lmKHR5cGVvZiB0Lm9uPT0iZnVuY3Rpb24iKXMub25jZT90Lm9uY2UocixlKTp0Lm9uKHIsZSk7ZWxzZSBpZih0eXBlb2YgdC5hZGRFdmVudExpc3RlbmVyPT0iZnVuY3Rpb24iKXQuYWRkRXZlbnRMaXN0ZW5lcihyLGZ1bmN0aW9uIG4oaSl7cy5vbmNlJiZ0LnJlbW92ZUV2ZW50TGlzdGVuZXIocixuKSxlKGkpfSk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImVtaXR0ZXIiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgdCl9dmFyIFQ7KGZ1bmN0aW9uKHQpe3RbdC5NQUpPUl9FVkVOVD0wXT0iTUFKT1JfRVZFTlQiLHRbdC5NSU5PUl9FVkVOVD0xXT0iTUlOT1JfRVZFTlQifSkoVHx8KFQ9e30pKTt2YXIgUzsoZnVuY3Rpb24odCl7dC5QUkVDQUxMX1RFU1RfQkVHSU49InByZWNhbGxfYmVnaW4iLHQuUFJFQ0FMTF9URVNUX0NPTVBMRVRFPSJwcmVjYWxsX2VuZCIsdC5DQUxMX0pPSU5fQkVHSU49ImNhbGxfam9pbiIsdC5ORVRfUVVBTElUWV9URVNUX0JFR0lOPSJuZXRfcXVhbGl0eV90ZXN0X2JlZ2luIix0Lk5FVF9RVUFMSVRZX1RFU1RfRU5EPSJuZXRfcXVhbGl0eV90ZXN0X2VuZCIsdC5XRUJTT0NLRVRfQ09OTkVDVEVEPSJ3ZWJzb2NrZXRfY29ubmVjdGVkIix0LlRSQU5TUE9SVF9DT05ORUNURUQ9InRyYW5zcG9ydF9jb25uZWN0ZWQiLHQuQVVESU9fT049ImF1ZGlvX29uIix0LkFVRElPX09GRj0iYXVkaW9fb2ZmIix0LlZJREVPX09OPSJ2aWRlb19vbiIsdC5WSURFT19PRkY9InZpZGVvX29mZiIsdC5QQVJUSUNJUEFOVF9ST0xFPSJwYXJ0aWNpcGFudF9yb2xlIix0LlBJTkdfU1RBVD0icGluZ19zdGF0Iix0LkRJU0NPTk5FQ1Q9ImRpc2Nvbm5lY3QiLHQuUkVDT05ORUNUX0FUVEVNUFQ9InJlY29ubmVjdF9hdHRlbXB0Iix0LlNDUkVFTlNIQVJFX1NUQVJUX1JFUVVFU1RFRD0ic2NyZWVuc2hhcmVfc3RhcnRfcmVxdWVzdGVkIix0LlNDUkVFTlNIQVJFX1NUQVJURUQ9InNjcmVlbnNoYXJlX3N0YXJ0ZWQiLHQuU0NSRUVOU0hBUkVfU1RPUFBFRD0ic2NyZWVuc2hhcmVfc3RvcHBlZCIsdC5UQUJfQ0hBTkdFPSJ0YWJfY2hhbmdlIix0LkJST1dTRVJfQkFDS0dST1VOREVEPSJicm93c2VyX2JhY2tncm91bmRlZCIsdC5CUk9XU0VSX0ZPUkVHUk9VTkRFRD0iYnJvd3Nlcl9mb3JlZ3JvdW5kZWQiLHQuRE9NSU5BTlRfU1BFQUtFUj0iZG9taW5hbnRfc3BlYWtlciIsdC5BVURJT19ERVZJQ0VTX1VQREFURVM9ImF1ZGlvX2RldmljZXNfdXBkYXRlcyIsdC5WSURFT19ERVZJQ0VTX1VQREFURVM9InZpZGVvX2RldmljZXNfdXBkYXRlcyIsdC5TUEVBS0VSX0RFVklDRVNfVVBEQVRFUz0ic3BlYWtlcl9kZXZpY2VzX3VwZGF0ZXMiLHQuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEU9InNlbGVjdGVkX21pY3JvcGhvbmVfdXBkYXRlIix0LlNFTEVDVEVEX0NBTUVSQV9VUERBVEU9InNlbGVjdGVkX2NhbWVyYV91cGRhdGUiLHQuU0VMRUNURURfU1BFQUtFUl9VUERBVEU9InNlbGVjdGVkX3NwZWFrZXJfdXBkYXRlIix0LkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT049ImV4cGVjdGVkX3ZpZGVvX3Jlc29sdXRpb24iLHQuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTj0iZXhwZWN0ZWRfc2NyZWVuc2hhcmVfcmVzb2x1dGlvbiIsdC5NRURJQV9QRVJNSVNTSU9OPSJtZWRpYV9wZXJtaXNzaW9uIix0LkxFR0FDWV9TV0lUQ0g9ImxlZ2FjeV9zd2l0Y2giLHQuQVVESU9fUExBWV9GQUlMRUQ9ImF1ZGlvX3BsYXlfZmFpbGVkIix0LlZJREVPX1BMQVlfRkFJTEVEPSJ2aWRlb19wbGF5X2ZhaWxlZCIsdC5BVURJT19UUkFDS19NVVRFRD0iYXVkaW9fdHJhY2tfbXV0ZWQiLHQuVklERU9fVFJBQ0tfTVVURUQ9InZpZGVvX3RyYWNrX211dGVkIix0LklWU19QTEFZRVJfUkVCVUZGRVJJTkc9Iml2c19wbGF5ZXJfcmVidWZmZXJpbmciLHQuSVZTX1BMQVlFUl9BVURJT19CTE9DS0VEPSJpdnNfcGxheWVyX2F1ZGlvX2Jsb2NrZWQiLHQuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VEPSJpdnNfcGxheWVyX3BsYXliYWNrX2Jsb2NrZWQiLHQuSVZTX1BMQVlFUl9FUlJPUj0iaXZzX3BsYXllcl9lcnJvciIsdC5JVlNfUExBWUVSX1JFQ09WRVJBQkxFX0VSUk9SPSJpdnNfcGxheWVyX3JlY292ZXJhYmxlX2Vycm9yIix0LklWU19QTEFZRVJfV09SS0VSX0VSUk9SPSJpdnNfcGxheWVyX3dvcmtlcl9lcnJvciIsdC5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEU9Iml2c19wbGF5ZXJfbmV0d29ya191bmF2YWlsYWJsZSIsdC5MSVZFU1RSRUFNX0xBVEVOQ1k9ImxpdmVzdHJlYW1fbGF0ZW5jeSIsdC5JVlNfUExBWUVSX0FOQUxZVElDU19FVkVOVD0iaXZzX3BsYXllcl9hbmFseXRpY3NfZXZlbnQiLHQuSVZTX1BMQVlFUl9QTEFZQkFDS19SQVRFX0NIQU5HRUQ9Iml2c19wbGF5ZXJfcGxheWJhY2tfcmF0ZV9jaGFuZ2VkIix0LklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VEPSJpdnNfcGxheWVyX3F1YWxpdHlfY2hhbmdlZCIsdC5JVlNfUExBWUVSX0lOSVRJQUxJWkVEPSJpdnNfcGxheWVyX2luaXRpYWxpemVkIn0pKFN8fChTPXt9KSk7Y29uc3QgZG49bmV3IE1hcChbW1MuUFJFQ0FMTF9URVNUX0JFR0lOLFQuTUlOT1JfRVZFTlRdLFtTLlBSRUNBTExfVEVTVF9DT01QTEVURSxULk1JTk9SX0VWRU5UXSxbUy5DQUxMX0pPSU5fQkVHSU4sVC5NQUpPUl9FVkVOVF0sW1MuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTixULk1JTk9SX0VWRU5UXSxbUy5ORVRfUVVBTElUWV9URVNUX0VORCxULk1JTk9SX0VWRU5UXSxbUy5XRUJTT0NLRVRfQ09OTkVDVEVELFQuTUlOT1JfRVZFTlRdLFtTLlRSQU5TUE9SVF9DT05ORUNURUQsVC5NQUpPUl9FVkVOVF0sW1MuQVVESU9fT04sVC5NSU5PUl9FVkVOVF0sW1MuQVVESU9fT0ZGLFQuTUlOT1JfRVZFTlRdLFtTLlZJREVPX09OLFQuTUlOT1JfRVZFTlRdLFtTLlZJREVPX09GRixULk1JTk9SX0VWRU5UXSxbUy5QQVJUSUNJUEFOVF9ST0xFLFQuTUlOT1JfRVZFTlRdLFtTLlBJTkdfU1RBVCxULk1BSk9SX0VWRU5UXSxbUy5ESVNDT05ORUNULFQuTUFKT1JfRVZFTlRdLFtTLlJFQ09OTkVDVF9BVFRFTVBULFQuTUFKT1JfRVZFTlRdLFtTLlNDUkVFTlNIQVJFX1NUQVJUX1JFUVVFU1RFRCxULk1JTk9SX0VWRU5UXSxbUy5TQ1JFRU5TSEFSRV9TVEFSVEVELFQuTUlOT1JfRVZFTlRdLFtTLlNDUkVFTlNIQVJFX1NUT1BQRUQsVC5NSU5PUl9FVkVOVF0sW1MuVEFCX0NIQU5HRSxULk1JTk9SX0VWRU5UXSxbUy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCxULk1JTk9SX0VWRU5UXSxbUy5CUk9XU0VSX0ZPUkVHUk9VTkRFRCxULk1JTk9SX0VWRU5UXSxbUy5ET01JTkFOVF9TUEVBS0VSLFQuTUlOT1JfRVZFTlRdLFtTLkFVRElPX0RFVklDRVNfVVBEQVRFUyxULk1JTk9SX0VWRU5UXSxbUy5WSURFT19ERVZJQ0VTX1VQREFURVMsVC5NSU5PUl9FVkVOVF0sW1MuU1BFQUtFUl9ERVZJQ0VTX1VQREFURVMsVC5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEUsVC5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfQ0FNRVJBX1VQREFURSxULk1JTk9SX0VWRU5UXSxbUy5TRUxFQ1RFRF9TUEVBS0VSX1VQREFURSxULk1JTk9SX0VWRU5UXSxbUy5NRURJQV9QRVJNSVNTSU9OLFQuTUlOT1JfRVZFTlRdLFtTLkxFR0FDWV9TV0lUQ0gsVC5NSU5PUl9FVkVOVF0sW1MuQVVESU9fUExBWV9GQUlMRUQsVC5NSU5PUl9FVkVOVF0sW1MuVklERU9fUExBWV9GQUlMRUQsVC5NSU5PUl9FVkVOVF0sW1MuQVVESU9fVFJBQ0tfTVVURUQsVC5NSU5PUl9FVkVOVF0sW1MuVklERU9fVFJBQ0tfTVVURUQsVC5NSU5PUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9SRUJVRkZFUklORyxULk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0FVRElPX0JMT0NLRUQsVC5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELFQuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfRVJST1IsVC5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUixULk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUixULk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsVC5NQUpPUl9FVkVOVF0sW1MuTElWRVNUUkVBTV9MQVRFTkNZLFQuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULFQuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELFQuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELFQuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfSU5JVElBTElaRUQsVC5NSU5PUl9FVkVOVF0sW1MuRVhQRUNURURfVklERU9fUkVTT0xVVElPTixULk1JTk9SX0VWRU5UXSxbUy5FWFBFQ1RFRF9TQ1JFRU5TSEFSRV9SRVNPTFVUSU9OLFQuTUlOT1JfRVZFTlRdXSk7Y2xhc3MgbG57Y29uc3RydWN0b3IoKXtwKHRoaXMsImV2ZW50cyIpO3RoaXMuZXZlbnRzPVtdfWFkZChyKXt0aGlzLmV2ZW50cy5wdXNoKHIpfWZsdXNoKCl7cmV0dXJue2VudHJpZXM6dGhpcy5ldmVudHMuc3BsaWNlKDAsMjUpfX19Y2xhc3MgdW4gZXh0ZW5kcyBxe2NvbnN0cnVjdG9yKHtsb2dnZXI6ZSxwZWVySWQ6cyxhcGlIb3N0bmFtZXM6bixhdXRoVG9rZW46aX0pe3N1cGVyKCk7cCh0aGlzLCJsb2dnZXIiKTtwKHRoaXMsInBlZXJJZCIpO3AodGhpcywiZXZlbnRTdG9yZSIpO3AodGhpcywiYXBpRW5kcG9pbnQiKTtwKHRoaXMsImF1dGhUb2tlbiIpO3RoaXMubG9nZ2VyPWUsdGhpcy5wZWVySWQ9cyx0aGlzLmF1dGhUb2tlbj1pLHRoaXMuYXBpRW5kcG9pbnQ9YGh0dHBzOi8vJHtuLmRhQ29sbGVjdG9yfS9hcGkvdjEvbWVzc2FnZWAsdGhpcy5ldmVudFN0b3JlPW5ldyBsbn1zZW5kRXZlbnRzQ2h1bmtUb1NlcnZlcihlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz17cGF5bG9hZDplLHBlZXJJZDp0aGlzLnBlZXJJZH0sbj1uZXcgQWJvcnRDb250cm9sbGVyLGk9c2V0VGltZW91dCgoKT0+bi5hYm9ydCgpLDNlMyk7dHJ5e3JldHVybiB5aWVsZCBmZXRjaCh0aGlzLmFwaUVuZHBvaW50LHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIixBdXRob3JpemF0aW9uOmBCZWFyZXIgJHt0aGlzLmF1dGhUb2tlbn1gfSxib2R5OkpTT04uc3RyaW5naWZ5KHMpLHNpZ25hbDpuLnNpZ25hbH0pLCEwfWNhdGNoKGEpe3JldHVybiB0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjpzZW5kRXZlbnRzQ2h1bmtUb1NlcnZlcjo6Y2F0Y2giLHtwZWVySWQ6dGhpcy5wZWVySWQsZW5kcG9pbnQ6dGhpcy5hcGlFbmRwb2ludCxlcnJvcjphIGluc3RhbmNlb2YgRXJyb3I/YS5tZXNzYWdlOlN0cmluZyhhKSxzdGFjazphIGluc3RhbmNlb2YgRXJyb3I/YS5zdGFjazp2b2lkIDB9KSwhMX1maW5hbGx5e2NsZWFyVGltZW91dChpKX19KX1jYWxsRXZlbnQoZSl7ZS50aW1lc3RhbXA9bmV3IERhdGUsdGhpcy5ldmVudFN0b3JlLmFkZChlKSx0aGlzLmVtaXQoZS5ldmVudCxlLm1ldGFEYXRhKSxkbi5nZXQoZS5ldmVudCk9PT1ULk1BSk9SX0VWRU5UJiZ0aGlzLmZsdXNoKCl9Zmx1c2goKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIHM7Y29uc3QgZT10aGlzLmV2ZW50U3RvcmUuZmx1c2goKTtpZigocz1lPT1udWxsP3ZvaWQgMDplLmVudHJpZXMpIT1udWxsJiZzLmxlbmd0aCl7Y29uc3Qgbj15aWVsZCB0aGlzLnNlbmRFdmVudHNDaHVua1RvU2VydmVyKGUpO3JldHVybiBufHxlLmVudHJpZXMuZm9yRWFjaChpPT57dGhpcy5ldmVudFN0b3JlLmFkZChpKX0pLG59cmV0dXJuITF9KX19dmFyIGhyOyhmdW5jdGlvbih0KXt0LkNIUk9NSVVNPSJjaHJvbXVtIix0LkZJUkVGT1g9ImZpcmVmb3giLHQuU0FGQVJJPSJzYWZhcmkifSkoaHJ8fChocj17fSkpO2NvbnN0IGZyPXtERVZFTDoiZGV2ZWwiLFBSRVBST0Q6InByZXByb2QiLFBST0Q6InByb2QifTt2YXIgSjsoZnVuY3Rpb24odCl7dC5BVURJTz0iQVVESU8iLHQuVklERU89IlZJREVPIix0LlNQRUFLRVI9IlNQRUFLRVIiLHQuU0NSRUVOU0hBUkU9IlNDUkVFTlNIQVJFIn0pKEp8fChKPXt9KSk7dmFyIG1yOyhmdW5jdGlvbih0KXt0W3QuSU5JVD0wXT0iSU5JVCIsdFt0LkFDQ0VQVEVEPTFdPSJBQ0NFUFRFRCIsdFt0LkRFTklFRD0yXT0iREVOSUVEIix0W3QuU1lTX0RFTklFRD0zXT0iU1lTX0RFTklFRCIsdFt0LkZBSUxFRD00XT0iRkFJTEVEIix0W3QuTk9URk9VTkQ9NV09Ik5PVEZPVU5EIix0W3QuTk9UX0FQUExJQ0FCTEU9Nl09Ik5PVF9BUFBMSUNBQkxFIn0pKG1yfHwobXI9e30pKTtmdW5jdGlvbiBhZSh0KXtyZXR1cm4gdD90LnNwbGl0KCIuIikuc2xpY2UoMCwyKS5jb25jYXQoWyIwIiwiMCJdKS5qb2luKCIuIik6IiJ9ZnVuY3Rpb24gbHQoe3BhY2tldHNMb3N0OnQscGFja2V0c1NlbnQ6cn0pe3JldHVybiByPjA/dCoxMDAvcjowfWZ1bmN0aW9uIHV0KHtwYWNrZXRzTG9zdDp0LHBhY2tldHNSZWNlaXZlZDpyfSl7cmV0dXJuIHIrdD4wP3QqMTAwLyhyK3QpOjB9Y29uc3QgZ3I9MjQwLFNyPTcyMCx2cj04LHlyPTMscHQ9MTAsaHQ9LjAyLGZ0PS4wMztmdW5jdGlvbiB0ZSh7c3RhdDp0LHdlaWdodDpyLHJhbmdlTWluOmUscmFuZ2VNYXg6cyxyYW5nZVJhbmtpbmdEaXJlY3Rpb246bn0pe3JldHVybiB0PT1udWxsP3I6ZT09PXM/bj09PSJVUCI/dDw9ZT9yOjA6dD49cz9yOjA6bj09PSJVUCI/KDEtTWF0aC5tYXgoTWF0aC5taW4ocyxNYXRoLmFicyh0KSktZSwwKS8ocy1lKSkqcjpuPT09IkRPV04iP01hdGgubWF4KE1hdGgubWluKHMsTWF0aC5hYnModCkpLWUsMCkvKHMtZSkqcjpyfWZ1bmN0aW9uIGJyKHtpc0xvd1F1YWxpdHlWaWRlbzp0LGlzVmlkZW9TdHVjazpyLGlzVmlkZW9MYWdnaW5nOmUsaml0dGVyUXVhbGl0eTpzLHBhY2tldHNMb3N0UXVhbGl0eTpufSl7Y29uc3QgaT0uOCooKHQ/Ljg1OjEpKihlPy43OjEpKihyPy41OjEpKSsuMioocypuKTtyZXR1cm4gTWF0aC5yb3VuZCgoaStOdW1iZXIuRVBTSUxPTikqMTAwKS8xMDB9ZnVuY3Rpb24gRXIoe3BhY2tldHNMb3N0OnQscGFja2V0c1NlbnQ6cn0pe3JldHVybiByPjA/dCoxMDAvcjowfWZ1bmN0aW9uIF9yKHtwYWNrZXRzTG9zdDp0LHBhY2tldHNTZW50OnIsaml0dGVyOmV9KXtjb25zdCBuPXRlKHtzdGF0OkVyKHtwYWNrZXRzTG9zdDp0LHBhY2tldHNTZW50OnJ9KSx3ZWlnaHQ6LjcscmFuZ2VNaW46MCxyYW5nZU1heDpwdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGE9dGUoe3N0YXQ6ZSx3ZWlnaHQ6LjMscmFuZ2VNaW46aHQscmFuZ2VNYXg6ZnQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KTtyZXR1cm4gbithfWZ1bmN0aW9uIHBuKHtmcmFtZVdpZHRoOnQsaXNTY3JlZW5TaGFyZTpyfSl7cmV0dXJuIHQ8KHI/U3I6Z3IpfWZ1bmN0aW9uIGhuKHtmcmFtZXNQZXJTZWNvbmQ6dCxpc1NjcmVlblNoYXJlOnJ9KXtyZXR1cm4gdDwocj95cjp2cil9ZnVuY3Rpb24gZm4oe2ZyYW1lc0VuY29kZWQ6dH0pe3JldHVybiB0PT09MH1mdW5jdGlvbiBUcih7ZnJhbWVXaWR0aDp0LGZyYW1lc1BlclNlY29uZDpyLHBhY2tldHNMb3N0OmUscGFja2V0c1NlbnQ6cyxqaXR0ZXI6bixpc1NjcmVlblNoYXJlOmksZnJhbWVzRW5jb2RlZDphfSl7Y29uc3QgZD10ZSh7c3RhdDpFcih7cGFja2V0c0xvc3Q6ZSxwYWNrZXRzU2VudDpzfSksd2VpZ2h0OjEscmFuZ2VNaW46MCxyYW5nZU1heDpwdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLG89dGUoe3N0YXQ6bix3ZWlnaHQ6MSxyYW5nZU1pbjpodCxyYW5nZU1heDpmdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGw9cG4oe2ZyYW1lV2lkdGg6dCxpc1NjcmVlblNoYXJlOml9KSxmPWhuKHtmcmFtZXNQZXJTZWNvbmQ6cixpc1NjcmVlblNoYXJlOml9KSx2PWZuKHtmcmFtZXNFbmNvZGVkOmEsaXNTY3JlZW5TaGFyZTppfSk7cmV0dXJuIGJyKHtpc0xvd1F1YWxpdHlWaWRlbzpsLGlzVmlkZW9MYWdnaW5nOmYsaXNWaWRlb1N0dWNrOnYsaml0dGVyUXVhbGl0eTpvLHBhY2tldHNMb3N0UXVhbGl0eTpkfSl9ZnVuY3Rpb24gUnIoe3BhY2tldHNMb3N0OnQscGFja2V0c1JlY2VpdmVkOnJ9KXtyZXR1cm4gcit0PjA/dCoxMDAvKHIrdCk6MH1mdW5jdGlvbiBQcih7Y29uY2VhbG1lbnRFdmVudHM6dCxwYWNrZXRzTG9zdDpyLHBhY2tldHNSZWNlaXZlZDplLGppdHRlcjpzfSl7Y29uc3QgaT10ZSh7c3RhdDp0LHdlaWdodDouMixyYW5nZU1pbjowLHJhbmdlTWF4OjMscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxhPS41LGQ9dGUoe3N0YXQ6UnIoe3BhY2tldHNMb3N0OnIscGFja2V0c1JlY2VpdmVkOmV9KSx3ZWlnaHQ6YSxyYW5nZU1pbjowLHJhbmdlTWF4OnB0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksbD10ZSh7c3RhdDpzLHdlaWdodDouMyxyYW5nZU1pbjpodCxyYW5nZU1heDpmdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pO3JldHVybiBpK2QrbH1mdW5jdGlvbiBtbih7ZnJhbWVzRGVjb2RlZDp0fSl7cmV0dXJuIHQ9PT0wfWZ1bmN0aW9uIGduKHtmcmFtZXNQZXJTZWNvbmQ6dCxpc1NjcmVlblNoYXJlOnJ9KXtyZXR1cm4gdDwocj95cjp2cil9ZnVuY3Rpb24gU24oe2ZyYW1lV2lkdGg6dCxpc1NjcmVlblNoYXJlOnJ9KXtyZXR1cm4gdDwocj9Tcjpncil9ZnVuY3Rpb24gQ3Ioe2ZyYW1lV2lkdGg6dCxmcmFtZXNQZXJTZWNvbmQ6cixwYWNrZXRzTG9zdDplLHBhY2tldHNSZWNlaXZlZDpzLGppdHRlcjpuLGlzU2NyZWVuU2hhcmU6aSxmcmFtZXNEZWNvZGVkOmF9KXtjb25zdCBkPXRlKHtzdGF0OlJyKHtwYWNrZXRzTG9zdDplLHBhY2tldHNSZWNlaXZlZDpzfSksd2VpZ2h0OjEscmFuZ2VNaW46MCxyYW5nZU1heDpwdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLG89dGUoe3N0YXQ6bix3ZWlnaHQ6MSxyYW5nZU1pbjpodCxyYW5nZU1heDpmdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGw9U24oe2ZyYW1lV2lkdGg6dCxpc1NjcmVlblNoYXJlOml9KSxmPWduKHtmcmFtZXNQZXJTZWNvbmQ6cixpc1NjcmVlblNoYXJlOml9KSx2PW1uKHtmcmFtZXNEZWNvZGVkOmEsaXNTY3JlZW5TaGFyZTppfSk7cmV0dXJuIGJyKHtpc0xvd1F1YWxpdHlWaWRlbzpsLGlzVmlkZW9MYWdnaW5nOmYsaXNWaWRlb1N0dWNrOnYsaml0dGVyUXVhbGl0eTpvLHBhY2tldHNMb3N0UXVhbGl0eTpkfSl9Y2xhc3MgcmV7Y29uc3RydWN0b3Iocil7cCh0aGlzLCJwYzEiKTtwKHRoaXMsInBjMiIpO3AodGhpcywiY29uc3RyYWluVmlkZW9CaXRyYXRlS2JwcyIpO3AodGhpcywiY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjIiwhMSk7cCh0aGlzLCJpY2VDYW5kaWRhdGVGaWx0ZXIiKTtjb25zdCBlPW5ldyBSVENQZWVyQ29ubmVjdGlvbihyKSxzPW5ldyBSVENQZWVyQ29ubmVjdGlvbihyKTt0aGlzLnBjMT1lLHRoaXMucGMyPXMsdGhpcy5pY2VDYW5kaWRhdGVGaWx0ZXI9cmUubm9GaWx0ZXIsdGhpcy5wYzEuYWRkRXZlbnRMaXN0ZW5lcigiaWNlY2FuZGlkYXRlIix0aGlzLm9uSWNlQ2FuZGlkYXRlLmJpbmQodGhpcyx0aGlzLnBjMikpLHRoaXMucGMyLmFkZEV2ZW50TGlzdGVuZXIoImljZWNhbmRpZGF0ZSIsdGhpcy5vbkljZUNhbmRpZGF0ZS5iaW5kKHRoaXMsdGhpcy5wYzEpKX1zdGF0aWMgcGFyc2VDYW5kaWRhdGUocil7Y29uc3QgZT0iY2FuZGlkYXRlOiIscz1yLmluZGV4T2YoZSkrZS5sZW5ndGgsbj1yLnN1YnN0cihzKS5zcGxpdCgiICIpO3JldHVybnt0eXBlOm5bN10scHJvdG9jb2w6blsyXSxhZGRyZXNzOm5bNF19fXN0YXRpYyBpc05vdEhvc3RDYW5kaWRhdGUocil7cmV0dXJuIHIudHlwZSE9PSJob3N0In1zdGF0aWMgaXNIb3N0KHIpe3JldHVybiByLnR5cGU9PT0iaG9zdCJ9c3RhdGljIGlzUmVsYXkocil7cmV0dXJuIHIudHlwZT09PSJyZWxheSJ9c3RhdGljIGlzUmVmbGV4aXZlKHIpe3JldHVybiByLnR5cGU9PT0ic3JmbHgifXN0YXRpYyBub0ZpbHRlcihyKXtyZXR1cm4hMH1vbkljZUNhbmRpZGF0ZShyLGUpe2lmKGUuY2FuZGlkYXRlKXtjb25zdCBzPXJlLnBhcnNlQ2FuZGlkYXRlKGUuY2FuZGlkYXRlLmNhbmRpZGF0ZSk7dGhpcy5pY2VDYW5kaWRhdGVGaWx0ZXIocykmJnIuYWRkSWNlQ2FuZGlkYXRlKGUuY2FuZGlkYXRlKX19c2V0SWNlQ2FuZGlkYXRlRmlsdGVyKHIpe3RoaXMuaWNlQ2FuZGlkYXRlRmlsdGVyPXJ9Y29uc3RyYWluVmlkZW9CaXRyYXRlKHIpe3RoaXMuY29uc3RyYWluVmlkZW9CaXRyYXRlS2Jwcz1yfWRpc2FibGVWaWRlb0ZlYygpe3RoaXMuY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjPSEwfWdvdE9mZmVyKHIpe3RoaXMuY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjJiYoci5zZHA9ci5zZHAucmVwbGFjZSgvKG09dmlkZW8gMSBbXlxyXSspKDExNiAxMTcpKFxyXG4pL2csYCQxXHIKYCksci5zZHA9ci5zZHAucmVwbGFjZSgvYT1ydHBtYXA6MTE2IHJlZFwvOTAwMDBcclxuL2csIiIpLHIuc2RwPXIuc2RwLnJlcGxhY2UoL2E9cnRwbWFwOjExNyB1bHBmZWNcLzkwMDAwXHJcbi9nLCIiKSxyLnNkcD1yLnNkcC5yZXBsYWNlKC9hPXJ0cG1hcDo5OCBydHhcLzkwMDAwXHJcbi9nLCIiKSxyLnNkcD1yLnNkcC5yZXBsYWNlKC9hPWZtdHA6OTggYXB0PTExNlxyXG4vZywiIikpLHRoaXMucGMxLnNldExvY2FsRGVzY3JpcHRpb24ociksdGhpcy5wYzIuc2V0UmVtb3RlRGVzY3JpcHRpb24ociksdGhpcy5wYzIuY3JlYXRlQW5zd2VyKCkudGhlbih0aGlzLmdvdEFuc3dlci5iaW5kKHRoaXMpLHRoaXMucmVwb3J0RmF0YWwuYmluZCh0aGlzKSl9Z290QW5zd2VyKHIpe3RoaXMuY29uc3RyYWluVmlkZW9CaXRyYXRlS2JwcyYmKHIuc2RwPXIuc2RwLnJlcGxhY2UoL2E9bWlkOnZpZGVvXHJcbi9nLGBhPW1pZDp2aWRlb1xyCmI9QVM6JHt0aGlzLmNvbnN0cmFpblZpZGVvQml0cmF0ZUticHN9XHIKYCkpLHRoaXMucGMyLnNldExvY2FsRGVzY3JpcHRpb24ociksdGhpcy5wYzEuc2V0UmVtb3RlRGVzY3JpcHRpb24ocil9ZXN0YWJsaXNoQ29ubmVjdGlvbigpe3RoaXMucGMxLmNyZWF0ZU9mZmVyKCkudGhlbih0aGlzLmdvdE9mZmVyLmJpbmQodGhpcyksdGhpcy5yZXBvcnRGYXRhbC5iaW5kKHRoaXMpKX1yZXBvcnRGYXRhbChyKXtjb25zb2xlLmVycm9yKCJFcnJvcjoiLHIpfWdldFJvdW5kVHJpcFRpbWUoKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3RbcixlXT15aWVsZCBQcm9taXNlLmFsbChbdGhpcy5wYzEuZ2V0U3RhdHMoKSx0aGlzLnBjMi5nZXRTdGF0cygpXSk7bGV0IHMsbjtpZihyLmZvckVhY2goaT0+e2kudHlwZT09PSJjYW5kaWRhdGUtcGFpciImJmkubm9taW5hdGVkPT09ITAmJmkuYnl0ZXNTZW50PjAmJihzPWkpfSksZS5mb3JFYWNoKGk9PntpLnR5cGU9PT0iY2FuZGlkYXRlLXBhaXIiJiZpLm5vbWluYXRlZD09PSEwJiZpLmJ5dGVzUmVjZWl2ZWQ+MCYmKG49aSl9KSxzJiZuKXRyeXtpZihzLmN1cnJlbnRSb3VuZFRyaXBUaW1lJiZuLmN1cnJlbnRSb3VuZFRyaXBUaW1lKXJldHVybntydHQ6cy5jdXJyZW50Um91bmRUcmlwVGltZSxiYWNrZW5kUlRUOm4uY3VycmVudFJvdW5kVHJpcFRpbWV9O2NvbnN0IGk9KG4ubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLXMubGFzdFBhY2tldFNlbnRUaW1lc3RhbXApLzFlMztyZXR1cm57cnR0OmksYmFja2VuZFJUVDppfX1jYXRjaChpKXtyZXR1cm59fSl9Y2xvc2UoKXt0aGlzLnBjMS5jbG9zZSgpLHRoaXMucGMyLmNsb3NlKCl9fWNsYXNzIElyIGV4dGVuZHMgcXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3AodGhpcywiY2FsbCIpO3AodGhpcywidGltZU91dCIpO3RoaXMuY2FsbD1uZXcgcmUoZSl9c3RhcnQoZT0xZTQpe3RoaXMuY2FsbC5lc3RhYmxpc2hDb25uZWN0aW9uKCksdGhpcy50aW1lT3V0PXNldFRpbWVvdXQodGhpcy50ZXN0RmFpbGVkLmJpbmQodGhpcyksZSl9dGVzdENvbXBsZXRlKGUpe2NsZWFyVGltZW91dCh0aGlzLnRpbWVPdXQpLHRoaXMuY2FsbC5jbG9zZSgpLHRoaXMuZW1pdCgiZG9uZSIsZSl9dGVzdEZhaWxlZChlKXt0aGlzLmNhbGwuY2xvc2UoKSx0aGlzLmVtaXQoImZhaWxlZCIsZSl9fWNvbnN0IHZuPTgseW49MS8xZTM7Y2xhc3MgYm4gZXh0ZW5kcyBJcntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtwKHRoaXMsInNlbmRlckNoYW5uZWwiKTtwKHRoaXMsInJlY2lldmVDaGFubmVsIik7cCh0aGlzLCJzdGFydFRpbWUiKTtwKHRoaXMsImxhc3RCaXRyYXRlTWVhc3VyZVRpbWUiKTtwKHRoaXMsInNlbnRQYXlsb2FkQnl0ZXMiLDApO3AodGhpcywicmVjaWV2ZWRQYXlsb2FkQnl0ZXMiLDApO3AodGhpcywibGFzdFJlY2VpdmVkUGF5bG9hZEJ5dGVzIiwwKTtwKHRoaXMsInN0b3BTZW5kaW5nIiwhMSk7cCh0aGlzLCJ0ZXN0UHJvZ3Jlc3MiLDApO3AodGhpcywic2FtcGxlUGFja2V0IiwiIik7cCh0aGlzLCJmaW5hbEJpdHJhdGVTdW0iLDApO3AodGhpcywiYml0UmF0ZVNhbXBlbHMiLDApO3AodGhpcywibWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kIiwwKTtwKHRoaXMsImJ5dGVzVG9LZWVwQnVmZmVyZWQiLDApO3AodGhpcywidGVzdER1cmF0aW9uU2Vjb25kcyIsNSk7dGhpcy5jYWxsLnNldEljZUNhbmRpZGF0ZUZpbHRlcihyZS5pc05vdEhvc3RDYW5kaWRhdGUpLHRoaXMuc2VuZGVyQ2hhbm5lbD10aGlzLmNhbGwucGMxLmNyZWF0ZURhdGFDaGFubmVsKG51bGwpO2ZvcihsZXQgcz0wO3M8MTAyNCoyNTY7cys9MSl0aGlzLnNhbXBsZVBhY2tldCs9ImgiO3RoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kPTEsdGhpcy5ieXRlc1RvS2VlcEJ1ZmZlcmVkPTEwMjQqdGhpcy5tYXhOdW1iZXJPZlBhY2tldHNUb1NlbmQsdGhpcy50ZXN0RHVyYXRpb25TZWNvbmRzPTQsdGhpcy5zZW5kZXJDaGFubmVsLmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLHRoaXMuc2VuZGluZ1N0ZXAuYmluZCh0aGlzKSksdGhpcy5jYWxsLnBjMi5hZGRFdmVudExpc3RlbmVyKCJkYXRhY2hhbm5lbCIsdGhpcy5vblJlY2lldmVyQ2hhbm5lbC5iaW5kKHRoaXMpKX1zZW5kaW5nU3RlcCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5zdGFydFRpbWV8fCh0aGlzLnN0YXJ0VGltZT1lLHRoaXMubGFzdEJpdHJhdGVNZWFzdXJlVGltZT1lKTtmb3IobGV0IG49MDtuIT09dGhpcy5tYXhOdW1iZXJPZlBhY2tldHNUb1NlbmQmJiEodGhpcy5zZW5kZXJDaGFubmVsLmJ1ZmZlcmVkQW1vdW50Pj10aGlzLmJ5dGVzVG9LZWVwQnVmZmVyZWQpO24rPTEpe3RoaXMuc2VudFBheWxvYWRCeXRlcys9dGhpcy5zYW1wbGVQYWNrZXQubGVuZ3RoO3RyeXt0aGlzLnNlbmRlckNoYW5uZWwuc2VuZCh0aGlzLnNhbXBsZVBhY2tldCl9Y2F0Y2goaSl7fX1jb25zdCBzPWUuZ2V0VGltZSgpLXRoaXMuc3RhcnRUaW1lLmdldFRpbWUoKTtzPj0xZTMqdGhpcy50ZXN0RHVyYXRpb25TZWNvbmRzPyh0aGlzLnN0b3BTZW5kaW5nPSEwLHRoaXMudGVzdFByb2dyZXNzPTEwMCk6KHRoaXMudGVzdFByb2dyZXNzPXMvKDEwKnRoaXMudGVzdER1cmF0aW9uU2Vjb25kcyksc2V0VGltZW91dCh0aGlzLnNlbmRpbmdTdGVwLmJpbmQodGhpcyksMSkpfW9uTWVzc2FnZVJlY2lldmVkKGUpe3RoaXMucmVjaWV2ZWRQYXlsb2FkQnl0ZXMrPWUuZGF0YS5sZW5ndGg7Y29uc3Qgcz1uZXcgRGF0ZSxuPXMuZ2V0VGltZSgpLXRoaXMubGFzdEJpdHJhdGVNZWFzdXJlVGltZS5nZXRUaW1lKCk7aWYobj49MWUzKXtjb25zdCBhPSh0aGlzLnJlY2lldmVkUGF5bG9hZEJ5dGVzLXRoaXMubGFzdFJlY2VpdmVkUGF5bG9hZEJ5dGVzKSp2bi8obi8xZTMpO3RoaXMuZmluYWxCaXRyYXRlU3VtKz1hLHRoaXMuYml0UmF0ZVNhbXBlbHMrPTEsdGhpcy5sYXN0UmVjZWl2ZWRQYXlsb2FkQnl0ZXM9dGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcyx0aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWU9c31pZih0aGlzLnN0b3BTZW5kaW5nJiZ0aGlzLnNlbnRQYXlsb2FkQnl0ZXM9PT10aGlzLnJlY2lldmVkUGF5bG9hZEJ5dGVzKXtjb25zdCBpPXRoaXMuZmluYWxCaXRyYXRlU3VtL3RoaXMuYml0UmF0ZVNhbXBlbHM7dGhpcy50ZXN0Q29tcGxldGUoe3Rocm91Z2hwdXQ6TWF0aC5yb3VuZChpKnluKX0pfX10ZXN0Q29tcGxldGUoZSl7dGhpcy5jYWxsLmdldFJvdW5kVHJpcFRpbWUoKS50aGVuKCh7cnR0OnMsYmFja2VuZFJUVDpufSk9PnN1cGVyLnRlc3RDb21wbGV0ZSh7UlRUOnMsYmFja2VuZFJUVDpuLHRocm91Z2hwdXQ6ZS50aHJvdWdocHV0fSkpfW9uUmVjaWV2ZXJDaGFubmVsKGUpe3RoaXMucmVjaWV2ZUNoYW5uZWw9ZS5jaGFubmVsLHRoaXMucmVjaWV2ZUNoYW5uZWwuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5vbk1lc3NhZ2VSZWNpZXZlZC5iaW5kKHRoaXMpKX19Y2xhc3MgTXQgZXh0ZW5kcyBJcntjb25zdHJ1Y3RvcihlLHM9cmUubm9GaWx0ZXIpe3N1cGVyKGUpO3AodGhpcywiY2gxIik7cCh0aGlzLCJjaDIiKTt0aGlzLmNhbGwuc2V0SWNlQ2FuZGlkYXRlRmlsdGVyKHMpO2NvbnN0IG49dGhpcy5jYWxsLnBjMS5jcmVhdGVEYXRhQ2hhbm5lbChudWxsKTt0aGlzLmNoMT1uLG4uYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsKCk9PntuLnNlbmQoImhlbGxvIil9KSxuLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25DaDFSZWNpZXZlLmJpbmQodGhpcykpLHRoaXMuY2FsbC5wYzIuYWRkRXZlbnRMaXN0ZW5lcigiZGF0YWNoYW5uZWwiLHRoaXMuZGF0YUNoYW5uZWxIYW5kbGVyLmJpbmQodGhpcykpfW9uQ2gxUmVjaWV2ZShlKXtlLmRhdGEhPT0id29ybGQiP3RoaXMuaGFuZ3VwKCJJbnZhbGlkIGRhdGEgdHJhbnNtaXR0ZWQuIik6dGhpcy50ZXN0Q29tcGxldGUoe2Nvbm5lY3Rpdml0eTohMH0pfW9uQ2gyUmVjaWV2ZShlKXtpZihlLmRhdGEhPT0iaGVsbG8iKXRoaXMuaGFuZ3VwKCJJbnZhbGlkIGRhdGEgdHJhbnNtaXR0ZWQuIik7ZWxzZSB0cnl7dGhpcy5jaDIuc2VuZCgid29ybGQiKX1jYXRjaChzKXt9fWRhdGFDaGFubmVsSGFuZGxlcihlKXtjb25zdCBzPWUuY2hhbm5lbDt0aGlzLmNoMj1zLHMuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5vbkNoMlJlY2lldmUuYmluZCh0aGlzKSl9aGFuZ3VwKGUpe3RoaXMudGVzdEZhaWxlZChlKX19Y2xhc3MgRW4gZXh0ZW5kcyBNdHtjb25zdHJ1Y3RvcihyKXtzdXBlcihyLHJlLmlzSG9zdCl9fWNsYXNzIF9uIGV4dGVuZHMgTXR7Y29uc3RydWN0b3Iocil7c3VwZXIocixyZS5pc1JlbGF5KX19Y2xhc3MgVG4gZXh0ZW5kcyBNdHtjb25zdHJ1Y3RvcihyKXtzdXBlcihyLHJlLmlzUmVmbGV4aXZlKX19Y2xhc3MgUm57Y29uc3RydWN0b3IoKXtwKHRoaXMsImlwSW5mb3JtYXRpb24iLG51bGwpfWdldElQRGV0YWlscyhuKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDpyLGFwaUhvc3RuYW1lczplLGxvZ2dlcjpzfSl7dmFyIGksYSxkO2lmKCF0aGlzLmlwSW5mb3JtYXRpb24pe3RyeXtjb25zdCBvPWBodHRwczovLyR7ZS5sb2NhdGlvbn1gLGY9eWllbGQoeWllbGQgZmV0Y2gobykpLmpzb24oKTtpZigoKGk9Zi5sb2MpPT1udWxsP3ZvaWQgMDppLmxlbmd0aCk+NSlyZXR1cm4gdGhpcy5pcEluZm9ybWF0aW9uPWYsKGE9dGhpcy5pcEluZm9ybWF0aW9uKSE9bnVsbCYmYS5pcCYmKHRoaXMuaXBJbmZvcm1hdGlvbi5pcD1hZSh0aGlzLmlwSW5mb3JtYXRpb24uaXApKSxmO3Rocm93IEVycm9yKCJJbnN1ZmZpY2llbnQgZGF0YSIpfWNhdGNoKG8pe3MuZXJyb3IoImNhbGxzdGF0czo6aXBEZXRhaWxzOjogZmFpbGVkIHRvIGZldGNoIGlwIHVzaW5nIGxvY2F0aW9uIHNlcnZpY2UiLHtlcnJvcjpvfSl9dHJ5e2NvbnN0IG89eWllbGQgZmV0Y2goYGh0dHBzOi8vJHtlLmxvY2F0aW9uTGVnYWN5fS8/dG9rZW49M2M0OTM5MzJiMDYyNGMmcGVlcklkPSR7cn1gLHttZXRob2Q6IlBPU1QifSk7dGhpcy5pcEluZm9ybWF0aW9uPXlpZWxkIG8uanNvbigpLChkPXRoaXMuaXBJbmZvcm1hdGlvbikhPW51bGwmJmQuaXAmJih0aGlzLmlwSW5mb3JtYXRpb24uaXA9YWUodGhpcy5pcEluZm9ybWF0aW9uLmlwKSl9Y2F0Y2gobyl7cy5lcnJvcigiY2FsbHN0YXRzOjppcERldGFpbHM6OiBmYWlsZWQgdG8gZmV0Y2ggaXAgdXNpbmcgbGVnYWN5IGxvY2F0aW9uIHNlcnZpY2UiLHtlcnJvcjpvfSl9fXJldHVybiB0aGlzLmlwSW5mb3JtYXRpb259KX1yZXNldENhY2hlKCl7dGhpcy5pcEluZm9ybWF0aW9uPW51bGx9fWNvbnN0IHdyPW5ldyBSbixBcj1be3VybHM6InR1cm46dHVybi5keXRlLmluOjQ0Mz90cmFuc3BvcnQ9dGNwIix1c2VybmFtZToiZHl0ZSIsY3JlZGVudGlhbDoiZHl0ZWluIixjcmVkZW50aWFsVHlwZToicGFzc3dvcmQifSx7dXJsczoidHVybjp0dXJuLmR5dGUuaW46MzQ3OD90cmFuc3BvcnQ9dWRwIix1c2VybmFtZToiZHl0ZSIsY3JlZGVudGlhbDoiZHl0ZWluIixjcmVkZW50aWFsVHlwZToicGFzc3dvcmQifV07ZnVuY3Rpb24gTXIodCl7Y29uc3RbcixlXT10LnNwbGl0KCIsIik7cmV0dXJue2Nvb3Jkczp7bGF0aXR1ZGU6TnVtYmVyKHIpLGxvbmdpdHVkZTpOdW1iZXIoZSl9fX1jbGFzcyBrcntjb25zdHJ1Y3Rvcigpe3AodGhpcywidHJhbnNwb3J0Iik7cCh0aGlzLCJjYW5kaWRhdGVQYWlyIik7cCh0aGlzLCJvdXRib3VuZFZpZGVvUnRwIixuZXcgTWFwKTtwKHRoaXMsImluYm91bmRWaWRlb1J0cCIsbmV3IE1hcCk7cCh0aGlzLCJvdXRib3VuZEF1ZGlvUnRwIixuZXcgTWFwKTtwKHRoaXMsImluYm91bmRBdWRpb1J0cCIsbmV3IE1hcCk7cCh0aGlzLCJyZW1vdGVJbmJvdW5kUnRwIixuZXcgTWFwKTtwKHRoaXMsInByb2R1Y2VyU3RyZWFtTWFwIixuZXcgTWFwKTtwKHRoaXMsImNvbnN1bWVyU3RyZWFtTWFwIixuZXcgTWFwKTtwKHRoaXMsInN0YWxlUHJvZHVjZXJTdHJlYW1NYXAiLCExKTtwKHRoaXMsInN0YWxlQ29uc3VtZXJTdHJlYW1NYXAiLCExKX19Y2xhc3MgT3IgZXh0ZW5kcyBxe2NvbnN0cnVjdG9yKCl7c3VwZXIoKTtwKHRoaXMsIm9ic2VydmVyIik7cCh0aGlzLCJvdXRib3VuZFByb2R1Y2VyTWFwIixuZXcgTWFwKTtwKHRoaXMsImluYm91bmRDb25zdW1lck1hcCIsbmV3IE1hcCk7cCh0aGlzLCJjb25zdW1lclBlZXJJZE1hcCIsbmV3IE1hcCk7cCh0aGlzLCJwYXVzZWRDb25zdW1lck1hcCIsbmV3IE1hcCk7cCh0aGlzLCJwYXVzZWRQcm9kdWNlck1hcCIsbmV3IE1hcCk7cCh0aGlzLCJvdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwIix7fSk7cCh0aGlzLCJvdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwIix7fSk7cCh0aGlzLCJvdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXAiLHt9KTtwKHRoaXMsIm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcCIse30pO3AodGhpcywidmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAiLG5ldyBNYXApO3AodGhpcywiYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAiLG5ldyBNYXApO3AodGhpcywidmlkZW9Db25zdW1lclRvU3RhdHNNYXAiLG5ldyBNYXApO3AodGhpcywiYXVkaW9Db25zdW1lclRvU3RhdHNNYXAiLG5ldyBNYXApO3AodGhpcywiY29uc3VtZXJJZHNXaXRoRnJlZXplZFZpZGVvIixuZXcgU2V0KTtwKHRoaXMsImNvbnN1bWVySWRzV2l0aEZyZWV6ZWRBdWRpbyIsbmV3IFNldCk7cCh0aGlzLCJwcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8iLG5ldyBTZXQpO3AodGhpcywicHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvIixuZXcgU2V0KTtwKHRoaXMsImZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMiLG5ldyBTZXQpO3AodGhpcywiZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcyIsbmV3IFNldCk7cCh0aGlzLCJzY3JlZW5TaGFyZVByb2R1Y2VycyIsbmV3IFNldCk7cCh0aGlzLCJzY3JlZW5TaGFyZUNvbnN1bWVycyIsbmV3IFNldCk7cCh0aGlzLCJpcERldGFpbHMiKTtwKHRoaXMsImNhbGxTdGF0c0luc3RhbmNlIik7dGhpcy5vYnNlcnZlcj1uZXcgcX1yZWdpc3RlclByb2R1Y2VyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt5aWVsZCB0aGlzLmdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAoZSksZS5vbigiY2xvc2UiLHRoaXMuZGVyZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSksZS5vbigicGF1c2UiLHRoaXMucGF1c2VQcm9kdWNlci5iaW5kKHRoaXMsZS5pZCkpLGUub24oInJlc3VtZSIsdGhpcy5yZXN1bWVQcm9kdWNlci5iaW5kKHRoaXMsZS5pZCkpLGUuYXBwRGF0YS5zY3JlZW5TaGFyZT09PSEwJiZ0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmFkZChlLmlkKX0pfXBhdXNlUHJvZHVjZXIoZSl7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5zZXQoZSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITF9KX1yZXN1bWVQcm9kdWNlcihlKXt0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmRlbGV0ZShlKX1wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyhlLHMsbil7dmFyIGEsZDtjb25zdCBpPSgoZD0oYT10aGlzPT1udWxsP3ZvaWQgMDp0aGlzLmNhbGxTdGF0c0luc3RhbmNlKT09bnVsbD92b2lkIDA6YS5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwKT09bnVsbD92b2lkIDA6ZC5nZXQoZSkpfHx7fTtzLnRvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ9PT1uLnBhY2tldHNSZWNlaXZlZD8odGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkVmlkZW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbHN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyVmlkZW9GcmVlemVkIix7Y29uc3VtZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfdmlkZW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxWaWRlb1BhY2tldHNSZWNlaXZlZD1uLnBhY2tldHNSZWNlaXZlZCx0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlby5oYXMoZSkmJih0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlby5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmaS52aWRlbyYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsc3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtZXJWaWRlb0RlZnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsInJlc3VtZSIsZSkpKSl9cHJvY2Vzc0luYm91bmRDb25zdW1lckF1ZGlvU3RhdHMoZSxzLG4pe3ZhciBhLGQ7Y29uc3QgaT0oKGQ9KGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOmQuZ2V0KGUpKXx8e307cy50b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkPT09bi5wYWNrZXRzUmVjZWl2ZWQ/KHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpjb25zdW1lckF1ZGlvRnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX2F1ZGlvX3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsQXVkaW9QYWNrZXRzUmVjZWl2ZWQ9bi5wYWNrZXRzUmVjZWl2ZWQsdGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8uaGFzKGUpJiYodGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyQXVkaW9EZWZyZWV6ZWQiLHtjb25zdW1lcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1lcl9hdWRpb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NPdXRib3VuZFByb2R1Y2VyVmlkZW9TdGF0cyhlLHMsbil7dmFyIGE7Y29uc3QgaT0oKGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9O3MudG90YWxWaWRlb1BhY2tldHNTZW50PT09bi5wYWNrZXRzU2VudD8odGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyVmlkZW9GcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfdmlkZW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxWaWRlb1BhY2tldHNTZW50PW4ucGFja2V0c1NlbnQsdGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uaGFzKGUpJiYodGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyVmlkZW9EZWZyZWV6ZWQiLHtwcm9kdWNlcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNlcl92aWRlb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NPdXRib3VuZFByb2R1Y2VyQXVkaW9TdGF0cyhlLHMsbil7dmFyIGE7Y29uc3QgaT0oKGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9O3MudG90YWxBdWRpb1BhY2tldHNTZW50PT09bi5wYWNrZXRzU2VudD8odGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyQXVkaW9GcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfYXVkaW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxBdWRpb1BhY2tldHNTZW50PW4ucGFja2V0c1NlbnQsdGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uaGFzKGUpJiYodGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyQXVkaW9EZWZyZWV6ZWQiLHtwcm9kdWNlcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NQcm9kdWNpbmdUcmFuc3BvcnRTdGF0cyhlLHMsbil7dmFyIGY7Y29uc3QgaT0oKGY9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmYuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9LHthdWRpbzphLHZpZGVvOmQsc2NyZWVuOm99PWksbD1hfHxkfHxvO3MudG90YWxQYWNrZXRzU2VudD09PW4ucGFja2V0c1NlbnQ/KHRoaXMuZnJlZXplZFByb2R1Y2luZ1RyYW5zcG9ydElkcy5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmbCYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6cHJvZHVjaW5nVHJhbnNwb3J0RnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNpbmdfdHJhbnNwb3J0X3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsUGFja2V0c1NlbnQ9bi5wYWNrZXRzU2VudCx0aGlzLmZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMuaGFzKGUpJiYodGhpcy5mcmVlemVkUHJvZHVjaW5nVHJhbnNwb3J0SWRzLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZsJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNpbmdUcmFuc3BvcnREZWZyZWV6ZWQiLHt0cmFuc3BvcnRJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NDb25zdW1pbmdUcmFuc3BvcnRTdGF0cyhlLHMsbil7dmFyIGQsbztjb25zdCBhPSEhQXJyYXkuZnJvbSgoKG89KGQ9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmQuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOm8udmFsdWVzKCkpfHxbXSkucmVkdWNlKChsLGYpPT5sfHxmLmF1ZGlvfHxmLnZpZGVvfHxmLnNjcmVlbiwhMSk7cy50b3RhbFBhY2tldHNSZWNlaXZlZD09PW4ucGFja2V0c1NlbnQ/KHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmYSYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtaW5nVHJhbnNwb3J0RnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsUGFja2V0c1JlY2VpdmVkPW4ucGFja2V0c1NlbnQsdGhpcy5mcmVlemVkQ29uc3VtaW5nVHJhbnNwb3J0SWRzLmhhcyhlKSYmKHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmYSYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtaW5nVHJhbnNwb3J0RGVmcmVlemVkIix7dHJhbnNwb3J0SWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWluZ190cmFuc3BvcnRfc3RhdHVzIiwicmVzdW1lIixlKSkpKX1yZWdpc3RlckNvbnN1bWVyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt5aWVsZCB0aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5zZXQoZS5pZCx7cHJvZHVjZXJJZDplLnByb2R1Y2VySWQscGVlcklkOmUuYXBwRGF0YS5wZWVySWQsYXBwRGF0YTplLmFwcERhdGF9KSxlLm9uKCJjbG9zZSIsdGhpcy5kZXJlZ2lzdGVyQ29uc3VtZXIuYmluZCh0aGlzLGUpKSxlLm9uKCJwYXVzZSIsdGhpcy5wYXVzZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5vbigicmVzdW1lIix0aGlzLnJlc3VtZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5hcHBEYXRhLnNjcmVlblNoYXJlPT09ITAmJnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuYWRkKGUuaWQpfSl9cGF1c2VDb25zdW1lcihlKXt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLnNldChlLHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMX0pfXJlc3VtZUNvbnN1bWVyKGUpe3RoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUpfWdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAoZSxzPSExKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgbj15aWVsZCBlLmdldFN0YXRzKCksaT1zP3RoaXMuZ2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQodGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsib3V0Ym91bmQtcnRwIiwicmVtb3RlLWluYm91bmQtcnRwIl0sITEsZS5pZCkpWzBdOnZvaWQgMDtmb3IoY29uc3QgYSBvZiBuLnZhbHVlcygpKXN3aXRjaChhLnR5cGUpe2Nhc2Uib3V0Ym91bmQtcnRwIjp7dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLnNldChhLmlkLGUuaWQpO2JyZWFrfX1yZXR1cm4gaX0pfWdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSxzPSExKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgbj15aWVsZCBlLmdldFN0YXRzKCksaT1zP3RoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQodGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsiaW5ib3VuZC1ydHAiXSwhMSxlLmlkKSlbMF06dm9pZCAwO2Zvcihjb25zdCBhIG9mIG4udmFsdWVzKCkpc3dpdGNoKGEudHlwZSl7Y2FzZSJpbmJvdW5kLXJ0cCI6e3RoaXMuaW5ib3VuZENvbnN1bWVyTWFwLnNldChhLmlkLGUuaWQpO2JyZWFrfX1yZXR1cm4gaX0pfWRlcmVnaXN0ZXJQcm9kdWNlcihlKXt0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZm9yRWFjaCgocyxuKT0+e3M9PT1lLmlkJiZ0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZGVsZXRlKG4pfSksdGhpcy5wYXVzZWRQcm9kdWNlck1hcC5kZWxldGUoZS5pZCksdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5kZWxldGUoZS5pZCl9ZGVyZWdpc3RlckNvbnN1bWVyKGUpe3RoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmZvckVhY2goKHMsbik9PntzPT09ZS5pZCYmdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZGVsZXRlKG4pfSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5kZWxldGUoZS5pZCksdGhpcy5wYXVzZWRDb25zdW1lck1hcC5kZWxldGUoZS5pZCksdGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5kZWxldGUoZS5pZCl9Z2V0SWNlQ2FuZGlkYXRlU3RhdHMoZSl7dmFyIHM7cmV0dXJue2lkOmUuaWQsdHlwZTplLmNhbmRpZGF0ZVR5cGV8fGUudHlwZSxhZGRyZXNzOmUuYWRkcmVzcyxwb3J0OmUucG9ydCx1cmw6ZS51cmwscHJvdG9jb2w6KHM9ZS5yZWxheVByb3RvY29sKSE9bnVsbD9zOmUucHJvdG9jb2wsbmV0d29ya1R5cGU6ZS5uZXR3b3JrVHlwZSxyZWxhdGVkQWRkcmVzczplLnJlbGF0ZWRBZGRyZXNzLHJlbGF0ZWRQb3J0OmUucmVsYXRlZFBvcnR9fWdldFdvcmtpbmdTaW11bGNhc3RWaWRlb1N0YXRzKGUpe3JldHVybiBlLmZpbmQobj0+e2NvbnN0IGk9bi5mcmFtZXNFbmNvZGVkPjAsYT1uLnBhY2tldHNTZW50PjAsZD1uLmZyYW1lV2lkdGgmJm4uZnJhbWVIZWlnaHQ7cmV0dXJuIGkmJmEmJiEhZH0pfHxlW2UubGVuZ3RoLTFdfXBhcnNlUlRDUmVwb3J0KGUscz1bXSxuPSExLGk9dm9pZCAwLGE9dm9pZCAwKXt2YXIgVSxMLEgsWix2ZSx5ZSxCZSx4ZSxqZSxVZSwkZSxIZSxLZTtjb25zdCBkPWUsbz1uZXcga3IsbD1zLmxlbmd0aD9uZXcgU2V0KHMpOnZvaWQgMCxmPVtdLHY9W10sRT1bXSx3PW5ldyBNYXAseD1uZXcgTWFwO2Zvcihjb25zdCBtIG9mIGQudmFsdWVzKCkpe2lmKGwpe2lmKGwuc2l6ZT09PTApYnJlYWs7aWYobC5oYXMobS50eXBlKSluJiZsLmRlbGV0ZShtLnR5cGUpO2Vsc2UgY29udGludWV9c3dpdGNoKG0udHlwZSl7Y2FzZSJsb2NhbC1jYW5kaWRhdGUiOntmLnB1c2godGhpcy5nZXRJY2VDYW5kaWRhdGVTdGF0cyhtKSk7YnJlYWt9Y2FzZSJyZW1vdGUtY2FuZGlkYXRlIjp7di5wdXNoKHRoaXMuZ2V0SWNlQ2FuZGlkYXRlU3RhdHMobSkpO2JyZWFrfWNhc2UiY2FuZGlkYXRlLXBhaXIiOntjb25zdHtub21pbmF0ZWQ6Y309bSx7c2VsZWN0ZWQ6dX09bSxiPW0saj17bm9taW5hdGVkOmMhPW51bGw/Yzp1LGN1cnJlbnRSb3VuZFRyaXBUaW1lOmIuY3VycmVudFJvdW5kVHJpcFRpbWUsdG90YWxSb3VuZFRyaXBUaW1lOmIudG90YWxSb3VuZFRyaXBUaW1lLGJ5dGVzUmVjZWl2ZWQ6Yi5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpiLmJ5dGVzU2VudCxhdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU6Yi5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOmIuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlLGxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcDpiLmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcCxsYXN0UGFja2V0U2VudFRpbWVzdGFtcDpiLmxhc3RQYWNrZXRTZW50VGltZXN0YW1wLGxvY2FsQ2FuZGlkYXRlSWQ6Yi5sb2NhbENhbmRpZGF0ZUlkLHJlbW90ZUNhbmRpZGF0ZUlkOmIucmVtb3RlQ2FuZGlkYXRlSWQsYnl0ZXNEaXNjYXJkZWRPblNlbmQ6Yi5ieXRlc0Rpc2NhcmRlZE9uU2VuZCxwYWNrZXRzU2VudDpiLnBhY2tldHNTZW50LHBhY2tldHNSZWNlaXZlZDpiLnBhY2tldHNSZWNlaXZlZCxwYWNrZXRzRGlzY2FyZGVkT25TZW5kOmIucGFja2V0c0Rpc2NhcmRlZE9uU2VuZH07RS5wdXNoKGopLChtLm5vbWluYXRlZD09PSEwfHxtLnNlbGVjdGVkPT09ITApJiYoby5jYW5kaWRhdGVQYWlyPWopO2JyZWFrfWNhc2UidHJhbnNwb3J0Ijp7Y29uc3QgYz1tO2EmJihhLnByb2R1Y2luZyYmKHRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXXx8KHRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXT17dG90YWxQYWNrZXRzU2VudDowfSkpLGEuY29uc3VtaW5nJiYodGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdfHwodGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdPXt0b3RhbFBhY2tldHNSZWNlaXZlZDowfSkpKTtjb25zdCB1PXtieXRlc1JlY2VpdmVkOmMuYnl0ZXNSZWNlaXZlZCxieXRlc1NlbnQ6Yy5ieXRlc1NlbnQscGFja2V0c1NlbnQ6Yy5wYWNrZXRzU2VudCxwYWNrZXRzUmVjZWl2ZWQ6Yy5wYWNrZXRzUmVjZWl2ZWQsZHRsc0NpcGhlcjpjLmR0bHNDaXBoZXIsZHRsc1N0YXRlOmMuZHRsc1N0YXRlLGljZVJvbGU6Yy5pY2VSb2xlfTtpZihvLnRyYW5zcG9ydD11LGEpe2lmKGEucHJvZHVjaW5nKXtjb25zdCBiPXRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXTt0aGlzLnByb2Nlc3NQcm9kdWNpbmdUcmFuc3BvcnRTdGF0cyhhLmlkLGIsdSl9aWYoYS5jb25zdW1pbmcpe2NvbnN0IGI9dGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdO3RoaXMucHJvY2Vzc0NvbnN1bWluZ1RyYW5zcG9ydFN0YXRzKGEuaWQsYix1KX19YnJlYWt9Y2FzZSJyZW1vdGUtaW5ib3VuZC1ydHAiOntjb25zdCBjPW0sdT17aml0dGVyOmMuaml0dGVyLGZyYWN0aW9uTG9zdDpjLmZyYWN0aW9uTG9zdCxyb3VuZFRyaXBUaW1lOmMucm91bmRUcmlwVGltZSxyb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzOmMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cyx0b3RhbFJvdW5kVHJpcFRpbWU6Yy50b3RhbFJvdW5kVHJpcFRpbWUscGFja2V0c0xvc3Q6Yy5wYWNrZXRzTG9zdH07by5yZW1vdGVJbmJvdW5kUnRwLnNldChjLmxvY2FsSWQsdSk7YnJlYWt9Y2FzZSJvdXRib3VuZC1ydHAiOntpZighdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmhhcyhtLmlkKSlicmVhaztjb25zdCBjPW0sdT1pfHx0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZ2V0KG0uaWQpLGI9dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5nZXQodSk7aWYoYil7aWYoYi5sYXN0UmVwb3J0Q2FsY3VsYXRlZD09PSEwKWJyZWFrO3RoaXMucGF1c2VkUHJvZHVjZXJNYXAuc2V0KHUse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiEwfSl9dGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbdV18fCh0aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFt1XT17dG90YWxWaWRlb1BhY2tldHNTZW50OjAsdG90YWxBdWRpb1BhY2tldHNTZW50OjB9KTtjb25zdCBqPXRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW3VdO2lmKFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMubWVkaWFUeXBlKXx8WyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5raW5kKSl7aWYoIXRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5oYXMobS5pZCkpe28uc3RhbGVQcm9kdWNlclN0cmVhbU1hcD0hMDticmVha31jb25zdCBLPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UucHJvZHVjZXJzLmdldCh1KTtpZigoKFU9Sz09bnVsbD92b2lkIDA6Sy50cmFjayk9PW51bGw/dm9pZCAwOlUucmVhZHlTdGF0ZSk9PT0iZW5kZWQiKWJyZWFrO28ucHJvZHVjZXJTdHJlYW1NYXAuaGFzKHUpfHxvLnByb2R1Y2VyU3RyZWFtTWFwLnNldCh1LHtvdXRib3VuZFZpZGVvUnRwSWQ6W10sb3V0Ym91bmRBdWRpb1J0cElkOltdfSk7Y29uc3QgeT17Ynl0ZXNTZW50OmMuYnl0ZXNTZW50LHBhY2tldHNTZW50OmMucGFja2V0c1NlbnQsbmFja0NvdW50OmMubmFja0NvdW50LHNzcmM6Yy5zc3JjLG1pZDpjLm1pZCxhY3RpdmU6Yy5hY3RpdmUsY29kZWNJZDpjLmNvZGVjSWQsaGVhZGVyQnl0ZXNTZW50OmMuaGVhZGVyQnl0ZXNTZW50fHwwLHRvdGFsUGFja2V0U2VuZERlbGF5OmMudG90YWxQYWNrZXRTZW5kRGVsYXl8fDB9O2lmKGMubWVkaWFUeXBlPT09InZpZGVvInx8Yy5raW5kPT09InZpZGVvIil7Y29uc3QgaD1jLHo9USh7ZnJhbWVIZWlnaHQ6aC5mcmFtZUhlaWdodCxmcmFtZVdpZHRoOmguZnJhbWVXaWR0aCxmcmFtZXNFbmNvZGVkOmguZnJhbWVzRW5jb2RlZCxmcmFtZXNEcm9wcGVkOmguZnJhbWVzRHJvcHBlZCxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmQsZnJhbWVzU2VudDpoLmZyYW1lc1NlbnQsa2V5RnJhbWVzRW5jb2RlZDpoLmtleUZyYW1lc0VuY29kZWQsZmlyQ291bnQ6aC5maXJDb3VudCxlbmNvZGVySW1wbGVtZW50YXRpb246aC5lbmNvZGVySW1wbGVtZW50YXRpb24saHVnZUZyYW1lc1NlbnQ6aC5odWdlRnJhbWVzU2VudCxwbGlDb3VudDpoLnBsaUNvdW50LHFwU3VtOmgucXBTdW0scXVhbGl0eUxpbWl0YXRpb25EdXJhdGlvbnM6aC5xdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9ucyxxdWFsaXR5TGltaXRhdGlvblJlYXNvbjpoLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uLHF1YWxpdHlMaW1pdGF0aW9uUmVzb2x1dGlvbkNoYW5nZXM6aC5xdWFsaXR5TGltaXRhdGlvblJlc29sdXRpb25DaGFuZ2VzLHRvdGFsRW5jb2RlVGltZTpoLnRhcmdldEJpdHJhdGUsdG90YWxQYWNrZXRTZW5kRGVsYXk6aC50b3RhbFBhY2tldFNlbmREZWxheSxyZXRyYW5zbWl0dGVkQnl0ZXNTZW50OmgucmV0cmFuc21pdHRlZEJ5dGVzU2VudCxyZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQ6aC5yZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQsc2NhbGFiaWxpdHlNb2RlOmguc2NhbGFiaWxpdHlNb2RlLHBvd2VyRWZmaWNpZW50RW5jb2RlcjpoLnBvd2VyRWZmaWNpZW50RW5jb2Rlcn0seSk7by5vdXRib3VuZFZpZGVvUnRwLnNldChtLmlkLHopLG8ucHJvZHVjZXJTdHJlYW1NYXAuZ2V0KHUpLm91dGJvdW5kVmlkZW9SdHBJZC5wdXNoKG0uaWQpLHRoaXMucHJvY2Vzc091dGJvdW5kUHJvZHVjZXJWaWRlb1N0YXRzKHUsaix6KX1lbHNlIGlmKGMubWVkaWFUeXBlPT09ImF1ZGlvInx8Yy5raW5kPT09ImF1ZGlvIil7Y29uc3QgaD1jLHo9USh7cmV0cmFuc21pdHRlZEJ5dGVzU2VudDpoLnJldHJhbnNtaXR0ZWRCeXRlc1NlbnQscmV0cmFuc21pdHRlZFBhY2tldHNTZW50OmgucmV0cmFuc21pdHRlZFBhY2tldHNTZW50fSx5KTtvLm91dGJvdW5kQXVkaW9SdHAuc2V0KG0uaWQseiksby5wcm9kdWNlclN0cmVhbU1hcC5nZXQodSkub3V0Ym91bmRBdWRpb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzT3V0Ym91bmRQcm9kdWNlckF1ZGlvU3RhdHModSxqLHopfX1lbHNlIHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmVycm9yKGBDYWxsc3RhdHM6IFVua25vd24gT3V0Ym91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfWNhc2UiaW5ib3VuZC1ydHAiOntpZighdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuaGFzKG0uaWQpKWJyZWFrO2NvbnN0IGM9bSx1PWl8fHRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmdldChtLmlkKSxiPXRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZ2V0KHUpO2lmKGIpe2lmKGIubGFzdFJlcG9ydENhbGN1bGF0ZWQ9PT0hMClicmVhazt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLnNldCh1LHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMH0pfWlmKGMuc3NyYz09PTEyMzQpYnJlYWs7dGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbdV18fCh0aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFt1XT17dG90YWxWaWRlb1BhY2tldHNSZWNlaXZlZDowLHRvdGFsQXVkaW9QYWNrZXRzUmVjZWl2ZWQ6MH0pO2NvbnN0IGo9dGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbdV07aWYoWyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5tZWRpYVR5cGUpfHxbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLmtpbmQpKXtpZighdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuaGFzKG0uaWQpKXtvLnN0YWxlQ29uc3VtZXJTdHJlYW1NYXA9ITA7YnJlYWt9by5jb25zdW1lclN0cmVhbU1hcC5oYXModSl8fG8uY29uc3VtZXJTdHJlYW1NYXAuc2V0KHUse2luYm91bmRWaWRlb1J0cElkOltdLGluYm91bmRBdWRpb1J0cElkOltdfSk7Y29uc3QgSz17Ynl0ZXNSZWNlaXZlZDpjLmJ5dGVzUmVjZWl2ZWQscGFja2V0c1JlY2VpdmVkOmMucGFja2V0c1JlY2VpdmVkLHBhY2tldHNMb3N0OmMucGFja2V0c0xvc3Q+PTA/Yy5wYWNrZXRzTG9zdDowLGppdHRlcjpjLmppdHRlcixuYWNrQ291bnQ6Yy5uYWNrQ291bnQsaml0dGVyQnVmZmVyRGVsYXk6Yy5qaXR0ZXJCdWZmZXJEZWxheSxqaXR0ZXJCdWZmZXJFbWl0dGVkQ291bnQ6Yy5qaXR0ZXJCdWZmZXJFbWl0dGVkQ291bnQsbGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wOmMubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLHNzcmM6Yy5zc3JjLG1pZDpjLm1pZCxjb2RlY0lkOmMuY29kZWNJZCxoZWFkZXJCeXRlc1JlY2VpdmVkOmMuaGVhZGVyQnl0ZXNSZWNlaXZlZHx8MCxwYWNrZXRzRGlzY2FyZGVkOmMucGFja2V0c0Rpc2NhcmRlZHx8MCxqaXR0ZXJCdWZmZXJNaW5pbXVtRGVsYXk6Yy5qaXR0ZXJCdWZmZXJNaW5pbXVtRGVsYXl8fDAsaml0dGVyQnVmZmVyVGFyZ2V0RGVsYXk6Yy5qaXR0ZXJCdWZmZXJUYXJnZXREZWxheXx8MH07aWYoYy5tZWRpYVR5cGU9PT0idmlkZW8ifHxjLmtpbmQ9PT0idmlkZW8iKXtjb25zdCB5PWMsaD1RKHtmcmFtZUhlaWdodDp5LmZyYW1lSGVpZ2h0LGZyYW1lV2lkdGg6eS5mcmFtZVdpZHRoLGZyYW1lc0RlY29kZWQ6eS5mcmFtZXNEZWNvZGVkLGZyYW1lc0Ryb3BwZWQ6eS5mcmFtZXNEcm9wcGVkLGZyYW1lc1BlclNlY29uZDp5LmZyYW1lc1BlclNlY29uZCxmcmFtZXNSZWNlaXZlZDp5LmZyYW1lc1JlY2VpdmVkLGtleUZyYW1lc0RlY29kZWQ6eS5rZXlGcmFtZXNEZWNvZGVkLGZpckNvdW50OnkuZmlyQ291bnQsZGVjb2RlckltcGxlbWVudGF0aW9uOnkuZGVjb2RlckltcGxlbWVudGF0aW9uLHBsaUNvdW50OnkucGxpQ291bnQsdG90YWxQcm9jZXNzaW5nRGVsYXk6eS50b3RhbFByb2Nlc3NpbmdEZWxheSxxcFN1bTp5LnFwU3VtfHwwLHRvdGFsQXNzZW1ibHlUaW1lOnkudG90YWxBc3NlbWJseVRpbWV8fDAsdG90YWxEZWNvZGVUaW1lOnkudG90YWxEZWNvZGVUaW1lfHwwLHRvdGFsRnJlZXplc0R1cmF0aW9uOnkudG90YWxGcmVlemVzRHVyYXRpb258fDAsdG90YWxJbnRlckZyYW1lRGVsYXk6eS50b3RhbEludGVyRnJhbWVEZWxheXx8MCx0b3RhbFBhdXNlc0R1cmF0aW9uOnkudG90YWxQYXVzZXNEdXJhdGlvbnx8MCx0b3RhbFNxdWFyZWRJbnRlckZyYW1lRGVsYXk6eS50b3RhbFNxdWFyZWRJbnRlckZyYW1lRGVsYXl8fDAsZnJlZXplQ291bnQ6eS5mcmVlemVDb3VudHx8MCxwYXVzZUNvdW50OnkucGF1c2VDb3VudHx8MCxwb3dlckVmZmljaWVudERlY29kZXI6eS5wb3dlckVmZmljaWVudERlY29kZXJ9LEspO2guc2NvcmU9Q3Ioe2ZyYW1lV2lkdGg6aC5mcmFtZVdpZHRofHwwLGZyYW1lc0RlY29kZWQ6KGguZnJhbWVzRGVjb2RlZHx8MCktKCgoTD10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkwuZnJhbWVzRGVjb2RlZCl8fDApLGZyYW1lc1BlclNlY29uZDpoLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdDooaC5wYWNrZXRzTG9zdHx8MCktKCgoSD10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkgucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChaPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6Wi5wYWNrZXRzUmVjZWl2ZWQpfHwwKSxqaXR0ZXI6aC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyh1KX0pLHguc2V0KHUse3Njb3JlOisoaC5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6aC5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0OmguZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kfHwwLHBhY2tldHNMb3N0UGVyY2VudGFnZTp1dCh7cGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKHZlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6dmUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKCh5ZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnllLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSksYml0cmF0ZTooKGguYnl0ZXNSZWNlaXZlZHx8MCktKCgoQmU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpCZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KHUsaCksby5pbmJvdW5kVmlkZW9SdHAuc2V0KG0uaWQsaCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQodSkuaW5ib3VuZFZpZGVvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJWaWRlb1N0YXRzKHUsaixoKX1lbHNlIGlmKGMubWVkaWFUeXBlPT09ImF1ZGlvInx8Yy5raW5kPT09ImF1ZGlvIil7Y29uc3QgeT1jLGg9USh7YXVkaW9MZXZlbDp5LmF1ZGlvTGV2ZWwsY29uY2VhbGVkU2FtcGxlczp5LmNvbmNlYWxlZFNhbXBsZXMsY29uY2VhbG1lbnRFdmVudHM6eS5jb25jZWFsbWVudEV2ZW50cyx0b3RhbEF1ZGlvRW5lcmd5OnkudG90YWxBdWRpb0VuZXJneSx0b3RhbFNhbXBsZXNEdXJhdGlvbjp5LnRvdGFsU2FtcGxlc0R1cmF0aW9uLHRvdGFsU2FtcGxlc1JlY2VpdmVkOnkudG90YWxTYW1wbGVzUmVjZWl2ZWQsZmVjUGFja2V0c0Rpc2NhcmRlZDp5LmZlY1BhY2tldHNEaXNjYXJkZWR8fDAsZmVjUGFja2V0c1JlY2VpdmVkOnkuZmVjUGFja2V0c1JlY2VpdmVkfHwwLGluc2VydGVkU2FtcGxlc0ZvckRlY2VsZXJhdGlvbjp5Lmluc2VydGVkU2FtcGxlc0ZvckRlY2VsZXJhdGlvbnx8MCxyZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbjp5LnJlbW92ZWRTYW1wbGVzRm9yQWNjZWxlcmF0aW9ufHwwLHNpbGVudENvbmNlYWxlZFNhbXBsZXM6eS5zaWxlbnRDb25jZWFsZWRTYW1wbGVzfHwwLHBsYXlvdXRJZDp5LnBsYXlvdXRJZH0sSyk7aC5zY29yZT1Qcih7Y29uY2VhbG1lbnRFdmVudHM6KGguY29uY2VhbG1lbnRFdmVudHN8fDApLSgoKHhlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6eGUuY29uY2VhbG1lbnRFdmVudHMpfHwwKSxwYWNrZXRzTG9zdDooaC5wYWNrZXRzTG9zdHx8MCktKCgoamU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpqZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKFVlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6VWUucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOmguaml0dGVyfHwwfSkseC5zZXQodSx7c2NvcmU6KyhoLnNjb3JlKjEwKS50b0ZpeGVkKCkscGFja2V0c0xvc3RQZXJjZW50YWdlOnV0KHtwYWNrZXRzTG9zdDooaC5wYWNrZXRzTG9zdHx8MCktKCgoJGU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDokZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKEhlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6SGUucGFja2V0c1JlY2VpdmVkKXx8MCl9KSxqaXR0ZXI6aC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyh1KSxiaXRyYXRlOigoaC5ieXRlc1JlY2VpdmVkfHwwKS0oKChLZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOktlLmJ5dGVzUmVjZWl2ZWQpfHwwKSkqOC83fSksdGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5zZXQodSxoKSxvLmluYm91bmRBdWRpb1J0cC5zZXQobS5pZCxoKSxvLmNvbnN1bWVyU3RyZWFtTWFwLmdldCh1KS5pbmJvdW5kQXVkaW9SdHBJZC5wdXNoKG0uaWQpLHRoaXMucHJvY2Vzc0luYm91bmRDb25zdW1lckF1ZGlvU3RhdHModSxqLGgpfX1lbHNlIHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmVycm9yKGBDYWxsc3RhdHM6IFVua25vd24gSW5ib3VuZC1ydHAuIG1lZGlhdHlwZTogJHtjLm1lZGlhVHlwZX0ga2luZDogJHtjLmtpbmR9YCk7YnJlYWt9fX1pZihvLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKG0sYyk9Pnt2YXIgdSxiLGosSyx5LGgseixXZSx6ZSxHZSxxZSxZZSxRZSxKZSxYZSxaZSxldCx0dCxydCxzdCxudCxpdCxhdDtpZihtLm91dGJvdW5kVmlkZW9SdHBJZC5sZW5ndGg+MCl7Y29uc3QgVj1bXTttLm91dGJvdW5kVmlkZW9SdHBJZC5mb3JFYWNoKHJyPT57Vi5wdXNoKG8ub3V0Ym91bmRWaWRlb1J0cC5nZXQocnIpKX0pO2NvbnN0IEE9dGhpcy5nZXRXb3JraW5nU2ltdWxjYXN0VmlkZW9TdGF0cyhWKTtBLnNjb3JlPVRyKHtmcmFtZVdpZHRoOkEuZnJhbWVXaWR0aHx8MCxmcmFtZXNQZXJTZWNvbmQ6QS5mcmFtZXNQZXJTZWNvbmR8fDAsaml0dGVyOigodT1BLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDp1LmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKSxwYWNrZXRzU2VudDooQS5wYWNrZXRzU2VudHx8MCktKCgoYj10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOmIucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChqPUEucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOmoucGFja2V0c0xvc3QpfHwwKS0oKCh5PShLPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6Sy5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6eS5wYWNrZXRzTG9zdCl8fDApLGZyYW1lc0VuY29kZWQ6KEEuZnJhbWVzRW5jb2RlZHx8MCktKCgoaD10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOmguZnJhbWVzRW5jb2RlZCl8fDApfSksdy5zZXQoYyx7c2NvcmU6KyhBLnNjb3JlKjEwKS50b0ZpeGVkKCksZnJhbWVXaWR0aDpBLmZyYW1lV2lkdGh8fDAsZnJhbWVIZWlnaHQ6QS5mcmFtZUhlaWdodHx8MCxmcmFtZXNQZXJTZWNvbmQ6QS5mcmFtZXNQZXJTZWNvbmR8fDAsaml0dGVyOigoej1BLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDp6LmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKSxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6bHQoe3BhY2tldHNTZW50OihBLnBhY2tldHNTZW50fHwwKS0oKChXZT10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOldlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoemU9QS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6emUucGFja2V0c0xvc3QpfHwwKS0oKChxZT0oR2U9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpHZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6cWUucGFja2V0c0xvc3QpfHwwKX0pLGJpdHJhdGU6KChBLmJ5dGVzU2VudHx8MCktKCgoWWU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpZZS5ieXRlc1NlbnQpfHwwKSkqOC83LGNwdUxpbWl0YXRpb25zOkEucXVhbGl0eUxpbWl0YXRpb25SZWFzb249PT0iY3B1IixiYW5kd2lkdGhMaW1pdGF0aW9uczpBLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImJhbmR3aWR0aCJ9KSx0aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLEEpfWVsc2UgaWYobS5vdXRib3VuZEF1ZGlvUnRwSWQubGVuZ3RoPjApe2NvbnN0IFY9by5vdXRib3VuZEF1ZGlvUnRwLmdldChtLm91dGJvdW5kQXVkaW9SdHBJZFswXSk7Vi5zY29yZT1fcih7cGFja2V0c1NlbnQ6KFYucGFja2V0c1NlbnR8fDApLSgoKFFlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6UWUucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChKZT1WLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpKZS5wYWNrZXRzTG9zdCl8fDApLSgoKFplPShYZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlhlLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpaZS5wYWNrZXRzTG9zdCl8fDApLGppdHRlcjooKGV0PVYucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOmV0LmppdHRlcil8fDB9KSx3LnNldChjLHtzY29yZTorKFYuc2NvcmUqMTApLnRvRml4ZWQoKSxiaXRyYXRlOigoVi5ieXRlc1NlbnR8fDApLSgoKHR0PXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6dHQuYnl0ZXNTZW50KXx8MCkpKjgvNyxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6bHQoe3BhY2tldHNTZW50OihWLnBhY2tldHNTZW50fHwwKS0oKChydD10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnJ0LnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoc3Q9Vi5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6c3QucGFja2V0c0xvc3QpfHwwKS0oKChpdD0obnQ9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpudC5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6aXQucGFja2V0c0xvc3QpfHwwKX0pLGppdHRlcjooKGF0PVYucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOmF0LmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKX0pLHRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuc2V0KGMsVil9fSksRS5mb3JFYWNoKG09Pntjb25zdCBjPWYuZmluZChiPT5iLmlkPT09bS5sb2NhbENhbmRpZGF0ZUlkPyhtLmxvY2FsQ2FuZGlkYXRlSWQ9Yi5pZCxiKTpudWxsKSx1PXYuZmluZChiPT5iLmlkPT09bS5yZW1vdGVDYW5kaWRhdGVJZD8obS5yZW1vdGVDYW5kaWRhdGVJZD1iLmlkLGIpOm51bGwpO2MmJihtLmxvY2FsQ2FuZGlkYXRlVHlwZT1jLnR5cGUsbS5sb2NhbENhbmRpZGF0ZUFkZHJlc3M9YWUoYy5hZGRyZXNzKSxtLmxvY2FsQ2FuZGlkYXRlUG9ydD1jLnBvcnQsbS5sb2NhbENhbmRpZGF0ZVByb3RvY29sPWMucHJvdG9jb2wsbS5sb2NhbENhbmRpZGF0ZVVybD1jLnVybCxtLmxvY2FsQ2FuZGlkYXRlTmV0d29ya1R5cGU9Yy5uZXR3b3JrVHlwZSxtLmxvY2FsQ2FuZGlkYXRlUmVsYXRlZEFkZHJlc3M9YWUoYy5yZWxhdGVkQWRkcmVzcyksbS5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRQb3J0PWMucmVsYXRlZFBvcnQpLHUmJihtLnJlbW90ZUNhbmRpZGF0ZVR5cGU9dS50eXBlLG0ucmVtb3RlQ2FuZGlkYXRlQWRkcmVzcz1hZSh1LmFkZHJlc3MpLG0ucmVtb3RlQ2FuZGlkYXRlUG9ydD11LnBvcnQsbS5yZW1vdGVDYW5kaWRhdGVQcm90b2NvbD11LnByb3RvY29sLG0ucmVtb3RlQ2FuZGlkYXRlVXJsPXUudXJsKX0pLG8uY2FuZGlkYXRlUGFpciYmKG8udHJhbnNwb3J0PyhvLnRyYW5zcG9ydC50b3RhbFJvdW5kVHJpcFRpbWU9by5jYW5kaWRhdGVQYWlyLnRvdGFsUm91bmRUcmlwVGltZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSk6by50cmFuc3BvcnQ9e2J5dGVzUmVjZWl2ZWQ6by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50Om8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsdG90YWxSb3VuZFRyaXBUaW1lOm8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUscm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWV9KSxvLnRyYW5zcG9ydCYmKG8udHJhbnNwb3J0LmNhbmRpZGF0ZVBhaXJzPUUpLG8udHJhbnNwb3J0JiYhby50cmFuc3BvcnQucm91bmRUcmlwVGltZSl7bGV0IG09MCxjPTA7by5yZW1vdGVJbmJvdW5kUnRwLmZvckVhY2goKHUsYik9Pnt1LnJvdW5kVHJpcFRpbWUmJnUucm91bmRUcmlwVGltZT5tJiYobT11LnJvdW5kVHJpcFRpbWUsYz11LnRvdGFsUm91bmRUcmlwVGltZSl9KSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW0sby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPWN9aWYoeC5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLHgpfWNhdGNoKG0pe31pZih3LnNpemU+MCl0cnl7dGhpcy5vYnNlcnZlci5lbWl0KCJwcm9kdWNlcl9zY29yZSIsdyl9Y2F0Y2gobSl7fXJldHVybiBvfWdldFByb2R1Y2Vyc1JlcG9ydChlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1lLm1hcChuPT50aGlzLmdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAobiwhMCkpO3JldHVybiBzLmxlbmd0aD4wP1Byb21pc2UuYWxsKHMpOnZvaWQgMH0pfWdldENvbnN1bWVyc1JlcG9ydChlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1lLm1hcChuPT50aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAobiwhMCkpO3JldHVybiBzLmxlbmd0aD4wP1Byb21pc2UuYWxsKHMpOnZvaWQgMH0pfWdldFRyYW5zcG9ydFJlcG9ydChlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIGUuZ2V0U3RhdHMoKX0pfWdldFByb2Nlc3NlZFN0YXRzKGUscyxuKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgaT15aWVsZCB0aGlzLmdldFRyYW5zcG9ydFJlcG9ydChlKSxhPXtwcm9kdWNpbmc6bixjb25zdW1pbmc6cyxpZDplLmlkfSxkPWksbz10aGlzLnBhcnNlUlRDUmVwb3J0KGQsWyJ0cmFuc3BvcnQiLCJjYW5kaWRhdGUtcGFpciIsImluYm91bmQtcnRwIiwib3V0Ym91bmQtcnRwIiwicmVtb3RlLWluYm91bmQtcnRwIiwibG9jYWwtY2FuZGlkYXRlIiwicmVtb3RlLWNhbmRpZGF0ZSJdLCExLHZvaWQgMCxhKTtpZighbylyZXR1cm47Y29uc3QgbD17c3RhdHM6by50cmFuc3BvcnQsdHJhbnNwb3J0SWQ6ZS5pZCxjb25zdW1pbmc6cyxwcm9kdWNpbmc6bn0sZj1vLnN0YWxlUHJvZHVjZXJTdHJlYW1NYXA/dm9pZCAwOnRoaXMuZ2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQobyksdj1vLnN0YWxlQ29uc3VtZXJTdHJlYW1NYXA/dm9pZCAwOnRoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQobyk7cmV0dXJue3RyYW5zcG9ydFJlcG9ydDpsLHByb2R1Y2VyUmVwb3J0OmYsY29uc3VtZXJSZXBvcnQ6dn19KX1nZXRQcm9kdWNlclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBzPVtdO3RyeXtlLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKG4saSk9Pnt2YXIgYSxkO3MucHVzaCh7cHJvZHVjZXJJZDppLHZpZGVvU3RhdHM6bi5vdXRib3VuZFZpZGVvUnRwSWQubWFwKG89PmUub3V0Ym91bmRWaWRlb1J0cC5nZXQobykpLGF1ZGlvU3RhdHM6bi5vdXRib3VuZEF1ZGlvUnRwSWQubWFwKG89PmUub3V0Ym91bmRBdWRpb1J0cC5nZXQobykpLGFwcERhdGE6KChkPShhPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UucHJvZHVjZXJzKT09bnVsbD92b2lkIDA6YS5nZXQoaSkpPT1udWxsP3ZvaWQgMDpkLmFwcERhdGEpfHxudWxsfSl9KX1jYXRjaChuKXt0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0Iix7ZXJyb3I6e3JlYXNvbjpuLnJlYXNvbixtZXNzYWdlOm4ubWVzc2FnZX19KX1yZXR1cm4gc31nZXRDb25zdW1lclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBzPVtdO3RyeXtlLmNvbnN1bWVyU3RyZWFtTWFwLmZvckVhY2goKG4saSk9Pntjb25zdHtwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvfT10aGlzLmNvbnN1bWVyUGVlcklkTWFwLmdldChpKTtzLnB1c2goe2NvbnN1bWVySWQ6aSxwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvLHZpZGVvU3RhdHM6bi5pbmJvdW5kVmlkZW9SdHBJZC5tYXAobD0+ZS5pbmJvdW5kVmlkZW9SdHAuZ2V0KGwpKSxhdWRpb1N0YXRzOm4uaW5ib3VuZEF1ZGlvUnRwSWQubWFwKGw9PmUuaW5ib3VuZEF1ZGlvUnRwLmdldChsKSl9KX0pfWNhdGNoKG4pe2NvbnNvbGUuZXJyb3IoImdldENvbnN1bWVyc1JlcG9ydDogIixuLGUpfXJldHVybiBzfWdldFVzZXJMb2NhdGlvbigpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtyZXR1cm4gbmV3IFByb21pc2UoKGUscyk9Pnt0cnl7bmF2aWdhdG9yLmdlb2xvY2F0aW9uP25hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24obj0+e2Uobil9KTpzKCl9Y2F0Y2gobil7cyhuKX19KX0pfWdldENvbm5lY3Rpdml0eShlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e2NvbnN0IHM9e2ljZVNlcnZlcnM6ZXx8QXJ9LG49bmV3IFByb21pc2UoKGYsdik9Pnt0cnl7Y29uc3QgRT1uZXcgRW4ocyk7RS5hZGRMaXN0ZW5lcigiZG9uZSIsZiksRS5hZGRMaXN0ZW5lcigiZmFpbGVkIiwoKT0+e2Yoe2Nvbm5lY3Rpdml0eTohMX0pfSksRS5zdGFydCgyZTMpfWNhdGNoKEUpe3YoRSl9fSksaT1uZXcgUHJvbWlzZSgoZix2KT0+e3RyeXtjb25zdCBFPW5ldyBfbihzKTtFLmFkZExpc3RlbmVyKCJkb25lIixmKSxFLmFkZExpc3RlbmVyKCJmYWlsZWQiLCgpPT57Zih7Y29ubmVjdGl2aXR5OiExfSl9KSxFLnN0YXJ0KDJlMyl9Y2F0Y2goRSl7dihFKX19KSxhPW5ldyBQcm9taXNlKChmLHYpPT57dHJ5e2NvbnN0IEU9bmV3IFRuKHMpO0UuYWRkTGlzdGVuZXIoImRvbmUiLGYpLEUuYWRkTGlzdGVuZXIoImZhaWxlZCIsKCk9PntmKHtjb25uZWN0aXZpdHk6ITF9KX0pLEUuc3RhcnQoMmUzKX1jYXRjaChFKXt2KEUpfX0pLFtkLG8sbF09eWllbGQgUHJvbWlzZS5hbGwoW24saSxhXSk7cmV0dXJue2hvc3Q6ZD09bnVsbD92b2lkIDA6ZC5jb25uZWN0aXZpdHkscmVsYXk6bz09bnVsbD92b2lkIDA6by5jb25uZWN0aXZpdHkscmVmbGV4aXZlOmw9PW51bGw/dm9pZCAwOmwuY29ubmVjdGl2aXR5fX1jYXRjaChzKXtyZXR1cm57aG9zdDohMSxyZWxheTohMSxyZWZsZXhpdmU6ITF9fX0pfWdldFRocm91Z2hwdXQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RyeXtjb25zdCBuPXlpZWxkIG5ldyBQcm9taXNlKChpLGEpPT57dHJ5e2NvbnN0IGQ9e2ljZVNlcnZlcnM6ZXx8QXJ9LG89bmV3IGJuKGQpO28uYWRkTGlzdGVuZXIoImRvbmUiLGkpLG8uYWRkTGlzdGVuZXIoImZhaWxlZCIsYSksby5zdGFydCgxZTQpfWNhdGNoKGQpe2EoZCl9fSk7cmV0dXJue3Rocm91Z2hwdXQ6bi50aHJvdWdocHV0LGZyYWN0aW9uYWxMb3NzOjAsUlRUOm4uUlRULGppdHRlcjowLGJhY2tlbmRSVFQ6bi5iYWNrZW5kUlRUfX1jYXRjaChzKXtyZXR1cm59fSl9Z2V0SVBEZXRhaWxzKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBlLHM7dHJ5e3JldHVybiB0aGlzLmlwRGV0YWlsc3x8KHRoaXMuaXBEZXRhaWxzPXlpZWxkIHdyLmdldElQRGV0YWlscyh7cGVlcklkOihlPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDplLnBlZXJJZCxhcGlIb3N0bmFtZXM6KHM9dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOnMuYXBpSG9zdG5hbWVzLGxvZ2dlcjp0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlcn0pKSx0aGlzLmlwRGV0YWlsc31jYXRjaChuKXtyZXR1cm59fSl9Z2V0TmV0d29ya1F1YWxpdHkoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0W3Msbl09eWllbGQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0Q29ubmVjdGl2aXR5KGUpLHRoaXMuZ2V0VGhyb3VnaHB1dChlKV0pO3JldHVybntjb25uZWN0aXZpdHk6cyx0aHJvdWdocHV0Om49PW51bGw/dm9pZCAwOm4udGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczpuPT1udWxsP3ZvaWQgMDpuLmZyYWN0aW9uYWxMb3NzLFJUVDpuPT1udWxsP3ZvaWQgMDpuLlJUVCxqaXR0ZXI6bj09bnVsbD92b2lkIDA6bi5qaXR0ZXIsYmFja2VuZFJUVDpuPT1udWxsP3ZvaWQgMDpuLmJhY2tlbmRSVFR9fSl9Z2V0TmV0d29ya0luZm8oZSxzPSExKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGQsbztpZihzKXtjb25zdCBsPXlpZWxkIHRoaXMuZ2V0SVBEZXRhaWxzKCk7cmV0dXJue2lwRGV0YWlsczpsLGVmZmVjdGl2ZU5ldHdvcmtUeXBlOihkPW5hdmlnYXRvci5jb25uZWN0aW9uKT09bnVsbD92b2lkIDA6ZC5lZmZlY3RpdmVUeXBlLGxvY2F0aW9uOmwhPW51bGwmJmwubG9jP01yKGw9PW51bGw/dm9pZCAwOmwubG9jKTp2b2lkIDB9fWNvbnN0W24saSxhXT15aWVsZCBQcm9taXNlLmFsbChbdGhpcy5nZXRDb25uZWN0aXZpdHkoZSksdGhpcy5nZXRUaHJvdWdocHV0KGUpLHRoaXMuZ2V0SVBEZXRhaWxzKCldKTtyZXR1cm57aXBEZXRhaWxzOmEsZWZmZWN0aXZlTmV0d29ya1R5cGU6KG89bmF2aWdhdG9yLmNvbm5lY3Rpb24pPT1udWxsP3ZvaWQgMDpvLmVmZmVjdGl2ZVR5cGUsbG9jYXRpb246YSE9bnVsbCYmYS5sb2M/TXIoYT09bnVsbD92b2lkIDA6YS5sb2MpOnZvaWQgMCx0dXJuQ29ubmVjdGl2aXR5Om4/bi5ob3N0fHxuLnJlbGF5fHxuLnJlZmxleGl2ZTohMSxjb25uZWN0aXZpdHk6bix0aHJvdWdocHV0Omk9PW51bGw/dm9pZCAwOmkudGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczppPT1udWxsP3ZvaWQgMDppLmZyYWN0aW9uYWxMb3NzLFJUVDppPT1udWxsP3ZvaWQgMDppLlJUVCxqaXR0ZXI6aT09bnVsbD92b2lkIDA6aS5qaXR0ZXIsYmFja2VuZFJUVDppPT1udWxsP3ZvaWQgMDppLmJhY2tlbmRSVFR9fSl9fWNsYXNzIFBuIGV4dGVuZHMgT3J7fWNsYXNzIExyIGV4dGVuZHMgT3J7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3AodGhpcywicHJvZHVjZXJNYXAiLG5ldyBNYXApO3AodGhpcywiY29uc3VtZXJNYXAiLG5ldyBNYXApfXJlZ2lzdGVyUHJvZHVjZXIoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMucHJvZHVjZXJNYXAuc2V0KGUuaWQsZSkseWllbGQgdGhpcy5nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKGUpLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJQcm9kdWNlci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5hZGQoZS5pZCl9KX1yZWdpc3RlckNvbnN1bWVyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLmNvbnN1bWVyTWFwLnNldChlLmlkLGUpLHlpZWxkIHRoaXMuZ2VuZXJhdGVDb25zdW1lclN0cmVhbU1hcChlKSx0aGlzLmNvbnN1bWVyUGVlcklkTWFwLnNldChlLmlkLHtwcm9kdWNlcklkOmUucHJvZHVjZXJJZCxwZWVySWQ6ZS5hcHBEYXRhLnBlZXJJZCxhcHBEYXRhOmUuYXBwRGF0YX0pLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlQ29uc3VtZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lQ29uc3VtZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5hZGQoZS5pZCl9KX1nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKGUscz0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49eWllbGQgZS5nZXRTdGF0cygpLGk9dGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsiaW5ib3VuZC1ydHAiXSwhMSxlLmlkKSxhPVsuLi5pLmNvbnN1bWVyU3RyZWFtTWFwLnZhbHVlcygpXVswXSxkPXM/dGhpcy5nZXRDb25zdW1lclN0YXRzRnJvbVBhcnNlZENvbnN1bWVyU3RhdHMoaSxhLGUuaWQpOnZvaWQgMDtmb3IoY29uc3QgbyBvZiBuLnZhbHVlcygpKXN3aXRjaChvLnR5cGUpe2Nhc2UiaW5ib3VuZC1ydHAiOnt0aGlzLmluYm91bmRDb25zdW1lck1hcC5zZXQoby5pZCxlLmlkKTticmVha319cmV0dXJuIGR9KX1kZXJlZ2lzdGVyUHJvZHVjZXIoZSl7dGhpcy5wcm9kdWNlck1hcC5kZWxldGUoZS5pZCksdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmZvckVhY2goKHMsbik9PntzPT09ZS5pZCYmdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmRlbGV0ZShuKX0pLHRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuZGVsZXRlKGUuaWQpfWRlcmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVyTWFwLmRlbGV0ZShlLmlkKSx0aGlzLmluYm91bmRDb25zdW1lck1hcC5mb3JFYWNoKChzLG4pPT57cz09PWUuaWQmJnRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmRlbGV0ZShuKX0pLHRoaXMuY29uc3VtZXJQZWVySWRNYXAuZGVsZXRlKGUuaWQpLHRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuZGVsZXRlKGUuaWQpfWdldEljZUNhbmRpZGF0ZVN0YXRzKGUpe3ZhciBzO3JldHVybntpZDplLmlkLHR5cGU6ZS5jYW5kaWRhdGVUeXBlfHxlLnR5cGUsYWRkcmVzczplLmFkZHJlc3MscG9ydDplLnBvcnQsdXJsOmUudXJsLHByb3RvY29sOihzPWUucmVsYXlQcm90b2NvbCkhPW51bGw/czplLnByb3RvY29sLG5ldHdvcmtUeXBlOmUubmV0d29ya1R5cGUscmVsYXRlZEFkZHJlc3M6ZS5yZWxhdGVkQWRkcmVzcyxyZWxhdGVkUG9ydDplLnJlbGF0ZWRQb3J0fX1wYXJzZVJUQ1JlcG9ydChlLHM9W10sbj0hMSxpPXZvaWQgMCxhPXZvaWQgMCl7dmFyIFUsTCxILFosdmUseWUsQmUseGUsamUsVWUsJGUsSGUsS2U7Y29uc3QgZD1lLG89bmV3IGtyLGw9cy5sZW5ndGg/bmV3IFNldChzKTp2b2lkIDAsZj1bXSx2PVtdLEU9W10sdz1uZXcgTWFwLHg9bmV3IE1hcDtmb3IoY29uc3QgbSBvZiBkLnZhbHVlcygpKXtpZihsKXtpZihsLnNpemU9PT0wKWJyZWFrO2lmKGwuaGFzKG0udHlwZSkpbiYmbC5kZWxldGUobS50eXBlKTtlbHNlIGNvbnRpbnVlfXN3aXRjaChtLnR5cGUpe2Nhc2UibG9jYWwtY2FuZGlkYXRlIjp7Zi5wdXNoKHRoaXMuZ2V0SWNlQ2FuZGlkYXRlU3RhdHMobSkpO2JyZWFrfWNhc2UicmVtb3RlLWNhbmRpZGF0ZSI6e3YucHVzaCh0aGlzLmdldEljZUNhbmRpZGF0ZVN0YXRzKG0pKTticmVha31jYXNlImNhbmRpZGF0ZS1wYWlyIjp7Y29uc3R7bm9taW5hdGVkOmN9PW0se3NlbGVjdGVkOnV9PW0sYj1tLGo9e25vbWluYXRlZDpjIT1udWxsP2M6dSxjdXJyZW50Um91bmRUcmlwVGltZTpiLmN1cnJlbnRSb3VuZFRyaXBUaW1lLHRvdGFsUm91bmRUcmlwVGltZTpiLnRvdGFsUm91bmRUcmlwVGltZSxieXRlc1JlY2VpdmVkOmIuYnl0ZXNSZWNlaXZlZCxieXRlc1NlbnQ6Yi5ieXRlc1NlbnQsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOmIuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlLGF2YWlsYWJsZUluY29taW5nQml0cmF0ZTpiLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxsYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXA6Yi5sYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXAsbGFzdFBhY2tldFNlbnRUaW1lc3RhbXA6Yi5sYXN0UGFja2V0U2VudFRpbWVzdGFtcCxsb2NhbENhbmRpZGF0ZUlkOmIubG9jYWxDYW5kaWRhdGVJZCxyZW1vdGVDYW5kaWRhdGVJZDpiLnJlbW90ZUNhbmRpZGF0ZUlkLGJ5dGVzRGlzY2FyZGVkT25TZW5kOmIuYnl0ZXNEaXNjYXJkZWRPblNlbmQscGFja2V0c1NlbnQ6Yi5wYWNrZXRzU2VudCxwYWNrZXRzUmVjZWl2ZWQ6Yi5wYWNrZXRzUmVjZWl2ZWQscGFja2V0c0Rpc2NhcmRlZE9uU2VuZDpiLnBhY2tldHNEaXNjYXJkZWRPblNlbmR9O0UucHVzaChqKSwobS5ub21pbmF0ZWQ9PT0hMHx8bS5zZWxlY3RlZD09PSEwKSYmKG8uY2FuZGlkYXRlUGFpcj1qKTticmVha31jYXNlInRyYW5zcG9ydCI6e2NvbnN0IGM9bTthJiYoYS5wcm9kdWNpbmcmJih0aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF18fCh0aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF09e3RvdGFsUGFja2V0c1NlbnQ6MH0pKSxhLmNvbnN1bWluZyYmKHRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXXx8KHRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXT17dG90YWxQYWNrZXRzUmVjZWl2ZWQ6MH0pKSk7Y29uc3QgdT17Ynl0ZXNSZWNlaXZlZDpjLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50OmMuYnl0ZXNTZW50LHBhY2tldHNTZW50OmMucGFja2V0c1NlbnQscGFja2V0c1JlY2VpdmVkOmMucGFja2V0c1JlY2VpdmVkLGR0bHNDaXBoZXI6Yy5kdGxzQ2lwaGVyLGR0bHNTdGF0ZTpjLmR0bHNTdGF0ZSxpY2VSb2xlOmMuaWNlUm9sZX07aWYoby50cmFuc3BvcnQ9dSxhKXtpZihhLnByb2R1Y2luZyl7Y29uc3QgYj10aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF07dGhpcy5wcm9jZXNzUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHMoYS5pZCxiLHUpfWlmKGEuY29uc3VtaW5nKXtjb25zdCBiPXRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXTt0aGlzLnByb2Nlc3NDb25zdW1pbmdUcmFuc3BvcnRTdGF0cyhhLmlkLGIsdSl9fWJyZWFrfWNhc2UicmVtb3RlLWluYm91bmQtcnRwIjp7Y29uc3QgYz1tLHU9e2ppdHRlcjpjLmppdHRlcixmcmFjdGlvbkxvc3Q6Yy5mcmFjdGlvbkxvc3Qscm91bmRUcmlwVGltZTpjLnJvdW5kVHJpcFRpbWUscm91bmRUcmlwVGltZU1lYXN1cmVtZW50czpjLnJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHMsdG90YWxSb3VuZFRyaXBUaW1lOmMudG90YWxSb3VuZFRyaXBUaW1lLHBhY2tldHNMb3N0OmMucGFja2V0c0xvc3R9O28ucmVtb3RlSW5ib3VuZFJ0cC5zZXQoYy5sb2NhbElkLHUpO2JyZWFrfWNhc2Uib3V0Ym91bmQtcnRwIjp7aWYoIXRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5oYXMobS5pZCkpYnJlYWs7Y29uc3QgYz1tLHU9aXx8dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmdldChtLmlkKSxiPXRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZ2V0KHUpO2lmKGIpe2lmKGIubGFzdFJlcG9ydENhbGN1bGF0ZWQ9PT0hMClicmVhazt0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLnNldCh1LHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMH0pfXRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW3VdfHwodGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbdV09e3RvdGFsVmlkZW9QYWNrZXRzU2VudDowLHRvdGFsQXVkaW9QYWNrZXRzU2VudDowfSk7Y29uc3Qgaj10aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFt1XTtpZihbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLm1lZGlhVHlwZSl8fFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMua2luZCkpe2lmKCF0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuaGFzKG0uaWQpKXtvLnN0YWxlUHJvZHVjZXJTdHJlYW1NYXA9ITA7YnJlYWt9Y29uc3QgSz10aGlzLmNhbGxTdGF0c0luc3RhbmNlLnByb2R1Y2Vycy5nZXQodSk7aWYoKChVPUs9PW51bGw/dm9pZCAwOksudHJhY2spPT1udWxsP3ZvaWQgMDpVLnJlYWR5U3RhdGUpPT09ImVuZGVkIilicmVhaztvLnByb2R1Y2VyU3RyZWFtTWFwLmhhcyh1KXx8by5wcm9kdWNlclN0cmVhbU1hcC5zZXQodSx7b3V0Ym91bmRWaWRlb1J0cElkOltdLG91dGJvdW5kQXVkaW9SdHBJZDpbXX0pO2NvbnN0IHk9e2J5dGVzU2VudDpjLmJ5dGVzU2VudCxwYWNrZXRzU2VudDpjLnBhY2tldHNTZW50LG5hY2tDb3VudDpjLm5hY2tDb3VudCxzc3JjOmMuc3NyYyxtaWQ6Yy5taWQsYWN0aXZlOmMuYWN0aXZlLGNvZGVjSWQ6Yy5jb2RlY0lkLGhlYWRlckJ5dGVzU2VudDpjLmhlYWRlckJ5dGVzU2VudHx8MCx0b3RhbFBhY2tldFNlbmREZWxheTpjLnRvdGFsUGFja2V0U2VuZERlbGF5fHwwfTtpZihjLm1lZGlhVHlwZT09PSJ2aWRlbyJ8fGMua2luZD09PSJ2aWRlbyIpe2NvbnN0IGg9Yyx6PVEoe2ZyYW1lSGVpZ2h0OmguZnJhbWVIZWlnaHQsZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGgsZnJhbWVzRW5jb2RlZDpoLmZyYW1lc0VuY29kZWQsZnJhbWVzRHJvcHBlZDpoLmZyYW1lc0Ryb3BwZWQ/aC5mcmFtZXNEcm9wcGVkOmguZHJvcHBlZEZyYW1lcyxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmQ/aC5mcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXJhdGVNZWFuLGZyYW1lc1NlbnQ6aC5mcmFtZXNTZW50LGtleUZyYW1lc0VuY29kZWQ6aC5rZXlGcmFtZXNFbmNvZGVkLGZpckNvdW50OmguZmlyQ291bnQsZW5jb2RlckltcGxlbWVudGF0aW9uOmguZW5jb2RlckltcGxlbWVudGF0aW9uLGh1Z2VGcmFtZXNTZW50OmguaHVnZUZyYW1lc1NlbnQscGxpQ291bnQ6aC5wbGlDb3VudCxxcFN1bTpoLnFwU3VtLHF1YWxpdHlMaW1pdGF0aW9uUmVhc29uOmgucXVhbGl0eUxpbWl0YXRpb25SZWFzb24scXVhbGl0eUxpbWl0YXRpb25EdXJhdGlvbnM6aC5xdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9ucyxxdWFsaXR5TGltaXRhdGlvblJlc29sdXRpb25DaGFuZ2VzOmgucXVhbGl0eUxpbWl0YXRpb25SZXNvbHV0aW9uQ2hhbmdlcyx0b3RhbEVuY29kZVRpbWU6aC50b3RhbEVuY29kZVRpbWUsdG90YWxQYWNrZXRTZW5kRGVsYXk6aC50b3RhbEVuY29kZVRpbWUscmV0cmFuc21pdHRlZEJ5dGVzU2VudDpoLnJldHJhbnNtaXR0ZWRCeXRlc1NlbnQscmV0cmFuc21pdHRlZFBhY2tldHNTZW50OmgucmV0cmFuc21pdHRlZFBhY2tldHNTZW50LHNjYWxhYmlsaXR5TW9kZTpoLnNjYWxhYmlsaXR5TW9kZSxwb3dlckVmZmljaWVudEVuY29kZXI6aC5wb3dlckVmZmljaWVudEVuY29kZXJ9LHkpO28ub3V0Ym91bmRWaWRlb1J0cC5zZXQobS5pZCx6KSxvLnByb2R1Y2VyU3RyZWFtTWFwLmdldCh1KS5vdXRib3VuZFZpZGVvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NPdXRib3VuZFByb2R1Y2VyVmlkZW9TdGF0cyh1LGoseil9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IGg9Yyx6PVEoe3JldHJhbnNtaXR0ZWRCeXRlc1NlbnQ6aC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50LHJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudDpoLnJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudH0seSk7by5vdXRib3VuZEF1ZGlvUnRwLnNldChtLmlkLHopLG8ucHJvZHVjZXJTdHJlYW1NYXAuZ2V0KHUpLm91dGJvdW5kQXVkaW9SdHBJZC5wdXNoKG0uaWQpLHRoaXMucHJvY2Vzc091dGJvdW5kUHJvZHVjZXJBdWRpb1N0YXRzKHUsaix6KX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIE91dGJvdW5kLXJ0cC4gbWVkaWF0eXBlOiAke2MubWVkaWFUeXBlfSBraW5kOiAke2Mua2luZH1gKTticmVha31jYXNlImluYm91bmQtcnRwIjp7aWYoIXRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmhhcyhtLmlkKSlicmVhaztjb25zdCBjPW0sdT1pfHx0aGlzLmluYm91bmRDb25zdW1lck1hcC5nZXQobS5pZCksYj10aGlzLnBhdXNlZENvbnN1bWVyTWFwLmdldCh1KTtpZihiKXtpZihiLmxhc3RSZXBvcnRDYWxjdWxhdGVkPT09ITApYnJlYWs7dGhpcy5wYXVzZWRDb25zdW1lck1hcC5zZXQodSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITB9KX1pZihjLnNzcmM9PT0xMjM0KWJyZWFrO3RoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdfHwodGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbdV09e3RvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ6MCx0b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkOjB9KTtjb25zdCBqPXRoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdO2lmKFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMubWVkaWFUeXBlKXx8WyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5raW5kKSl7aWYoIXRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmhhcyhtLmlkKSl7by5zdGFsZUNvbnN1bWVyU3RyZWFtTWFwPSEwO2JyZWFrfW8uY29uc3VtZXJTdHJlYW1NYXAuaGFzKHUpfHxvLmNvbnN1bWVyU3RyZWFtTWFwLnNldCh1LHtpbmJvdW5kVmlkZW9SdHBJZDpbXSxpbmJvdW5kQXVkaW9SdHBJZDpbXX0pO2NvbnN0IEs9e2J5dGVzUmVjZWl2ZWQ6Yy5ieXRlc1JlY2VpdmVkLHBhY2tldHNSZWNlaXZlZDpjLnBhY2tldHNSZWNlaXZlZCxwYWNrZXRzTG9zdDpjLnBhY2tldHNMb3N0Pj0wP2MucGFja2V0c0xvc3Q6MCxqaXR0ZXI6Yy5qaXR0ZXIsbmFja0NvdW50OmMubmFja0NvdW50LGppdHRlckJ1ZmZlckRlbGF5OmMuaml0dGVyQnVmZmVyRGVsYXksaml0dGVyQnVmZmVyRW1pdHRlZENvdW50OmMuaml0dGVyQnVmZmVyRW1pdHRlZENvdW50LGxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcDpjLmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcCxzc3JjOmMuc3NyYyxtaWQ6Yy5taWQsY29kZWNJZDpjLmNvZGVjSWQsaGVhZGVyQnl0ZXNSZWNlaXZlZDpjLmhlYWRlckJ5dGVzUmVjZWl2ZWR8fDAscGFja2V0c0Rpc2NhcmRlZDpjLnBhY2tldHNEaXNjYXJkZWR8fDAsaml0dGVyQnVmZmVyTWluaW11bURlbGF5OmMuaml0dGVyQnVmZmVyTWluaW11bURlbGF5fHwwLGppdHRlckJ1ZmZlclRhcmdldERlbGF5OmMuaml0dGVyQnVmZmVyVGFyZ2V0RGVsYXl8fDB9O2lmKGMubWVkaWFUeXBlPT09InZpZGVvInx8Yy5raW5kPT09InZpZGVvIil7Y29uc3QgeT1jLGg9USh7ZnJhbWVIZWlnaHQ6eS5mcmFtZUhlaWdodCxmcmFtZVdpZHRoOnkuZnJhbWVXaWR0aCxmcmFtZXNEZWNvZGVkOnkuZnJhbWVzRGVjb2RlZCxmcmFtZXNEcm9wcGVkOnkuZnJhbWVzRHJvcHBlZD95LmZyYW1lc0Ryb3BwZWQ6eS5kcm9wcGVkRnJhbWVzLGZyYW1lc1BlclNlY29uZDp5LmZyYW1lc1BlclNlY29uZD95LmZyYW1lc1BlclNlY29uZDp5LmZyYW1lcmF0ZU1lYW4sZnJhbWVzUmVjZWl2ZWQ6eS5mcmFtZXNSZWNlaXZlZCxrZXlGcmFtZXNEZWNvZGVkOnkua2V5RnJhbWVzRGVjb2RlZCxmaXJDb3VudDp5LmZpckNvdW50LGRlY29kZXJJbXBsZW1lbnRhdGlvbjp5LmRlY29kZXJJbXBsZW1lbnRhdGlvbixwbGlDb3VudDp5LnBsaUNvdW50LHRvdGFsUHJvY2Vzc2luZ0RlbGF5OnkudG90YWxQcm9jZXNzaW5nRGVsYXkscXBTdW06eS5xcFN1bXx8MCx0b3RhbEFzc2VtYmx5VGltZTp5LnRvdGFsQXNzZW1ibHlUaW1lfHwwLHRvdGFsRGVjb2RlVGltZTp5LnRvdGFsRGVjb2RlVGltZXx8MCx0b3RhbEZyZWV6ZXNEdXJhdGlvbjp5LnRvdGFsRnJlZXplc0R1cmF0aW9ufHwwLHRvdGFsSW50ZXJGcmFtZURlbGF5OnkudG90YWxJbnRlckZyYW1lRGVsYXl8fDAsdG90YWxQYXVzZXNEdXJhdGlvbjp5LnRvdGFsUGF1c2VzRHVyYXRpb258fDAsdG90YWxTcXVhcmVkSW50ZXJGcmFtZURlbGF5OnkudG90YWxTcXVhcmVkSW50ZXJGcmFtZURlbGF5fHwwLGZyZWV6ZUNvdW50OnkuZnJlZXplQ291bnR8fDAscGF1c2VDb3VudDp5LnBhdXNlQ291bnR8fDAscG93ZXJFZmZpY2llbnREZWNvZGVyOnkucG93ZXJFZmZpY2llbnREZWNvZGVyfSxLKTtoLnNjb3JlPUNyKHtmcmFtZVdpZHRoOmguZnJhbWVXaWR0aHx8MCxmcmFtZXNEZWNvZGVkOihoLmZyYW1lc0RlY29kZWR8fDApLSgoKEw9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpMLmZyYW1lc0RlY29kZWQpfHwwKSxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmR8fDAscGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKEg9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpILnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoWj10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOloucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSl9KSx4LnNldCh1LHtzY29yZTorKGguc2NvcmUqMTApLnRvRml4ZWQoKSxmcmFtZVdpZHRoOmguZnJhbWVXaWR0aHx8MCxmcmFtZUhlaWdodDpoLmZyYW1lSGVpZ2h0fHwwLGZyYW1lc1BlclNlY29uZDpoLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6dXQoe3BhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKCh2ZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnZlLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoeWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp5ZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKX0pLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpLGJpdHJhdGU6KChoLmJ5dGVzUmVjZWl2ZWR8fDApLSgoKEJlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6QmUuYnl0ZXNSZWNlaXZlZCl8fDApKSo4Lzd9KSx0aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLnNldCh1LGgpLG8uaW5ib3VuZFZpZGVvUnRwLnNldChtLmlkLGgpLG8uY29uc3VtZXJTdHJlYW1NYXAuZ2V0KHUpLmluYm91bmRWaWRlb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyh1LGosaCl9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IHk9YyxoPVEoe2F1ZGlvTGV2ZWw6eS5hdWRpb0xldmVsLGNvbmNlYWxlZFNhbXBsZXM6eS5jb25jZWFsZWRTYW1wbGVzLGNvbmNlYWxtZW50RXZlbnRzOnkuY29uY2VhbG1lbnRFdmVudHMsdG90YWxBdWRpb0VuZXJneTp5LnRvdGFsQXVkaW9FbmVyZ3ksdG90YWxTYW1wbGVzRHVyYXRpb246eS50b3RhbFNhbXBsZXNEdXJhdGlvbix0b3RhbFNhbXBsZXNSZWNlaXZlZDp5LnRvdGFsU2FtcGxlc1JlY2VpdmVkLGZlY1BhY2tldHNEaXNjYXJkZWQ6eS5mZWNQYWNrZXRzRGlzY2FyZGVkfHwwLGZlY1BhY2tldHNSZWNlaXZlZDp5LmZlY1BhY2tldHNSZWNlaXZlZHx8MCxpbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb246eS5pbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb258fDAscmVtb3ZlZFNhbXBsZXNGb3JBY2NlbGVyYXRpb246eS5yZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbnx8MCxzaWxlbnRDb25jZWFsZWRTYW1wbGVzOnkuc2lsZW50Q29uY2VhbGVkU2FtcGxlc3x8MCxwbGF5b3V0SWQ6eS5wbGF5b3V0SWR9LEspO2guc2NvcmU9UHIoe2NvbmNlYWxtZW50RXZlbnRzOihoLmNvbmNlYWxtZW50RXZlbnRzfHwwKS0oKCh4ZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnhlLmNvbmNlYWxtZW50RXZlbnRzKXx8MCkscGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKGplPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6amUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChVZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOlVlLnBhY2tldHNSZWNlaXZlZCl8fDApLGppdHRlcjpoLmppdHRlcnx8MH0pLHguc2V0KHUse3Njb3JlOisoaC5zY29yZSoxMCkudG9GaXhlZCgpLHBhY2tldHNMb3N0UGVyY2VudGFnZTp1dCh7cGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKCRlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6JGUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChIZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkhlLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSksYml0cmF0ZTooKGguYnl0ZXNSZWNlaXZlZHx8MCktKCgoS2U9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpLZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KHUsaCksby5pbmJvdW5kQXVkaW9SdHAuc2V0KG0uaWQsaCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQodSkuaW5ib3VuZEF1ZGlvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJBdWRpb1N0YXRzKHUsaixoKX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIEluYm91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfX19aWYoby5wcm9kdWNlclN0cmVhbU1hcC5mb3JFYWNoKChtLGMpPT57dmFyIHUsYixqLEsseSxoLHosV2UsemUsR2UscWUsWWUsUWUsSmUsWGUsWmUsZXQsdHQscnQsc3QsbnQsaXQsYXQ7aWYobS5vdXRib3VuZFZpZGVvUnRwSWQubGVuZ3RoPjApe2NvbnN0IFY9W107bS5vdXRib3VuZFZpZGVvUnRwSWQuZm9yRWFjaChycj0+e1YucHVzaChvLm91dGJvdW5kVmlkZW9SdHAuZ2V0KHJyKSl9KTtjb25zdCBBPXRoaXMuZ2V0V29ya2luZ1NpbXVsY2FzdFZpZGVvU3RhdHMoVik7QS5zY29yZT1Ucih7ZnJhbWVXaWR0aDpBLmZyYW1lV2lkdGh8fDAsZnJhbWVzUGVyU2Vjb25kOkEuZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKHU9QS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6dS5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c1NlbnQ6KEEucGFja2V0c1NlbnR8fDApLSgoKGI9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpiLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoaj1BLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpqLnBhY2tldHNMb3N0KXx8MCktKCgoeT0oSz10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOksucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnkucGFja2V0c0xvc3QpfHwwKSxmcmFtZXNFbmNvZGVkOihBLmZyYW1lc0VuY29kZWR8fDApLSgoKGg9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpoLmZyYW1lc0VuY29kZWQpfHwwKX0pLHcuc2V0KGMse3Njb3JlOisoQS5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6QS5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0OkEuZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOkEuZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKHo9QS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6ei5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c0xvc3RQZXJjZW50YWdlOmx0KHtwYWNrZXRzU2VudDooQS5wYWNrZXRzU2VudHx8MCktKCgoV2U9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpXZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKHplPUEucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnplLnBhY2tldHNMb3N0KXx8MCktKCgocWU9KEdlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6R2UucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnFlLnBhY2tldHNMb3N0KXx8MCl9KSxiaXRyYXRlOigoQS5ieXRlc1NlbnR8fDApLSgoKFllPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6WWUuYnl0ZXNTZW50KXx8MCkpKjgvNyxjcHVMaW1pdGF0aW9uczpBLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImNwdSIsYmFuZHdpZHRoTGltaXRhdGlvbnM6QS5xdWFsaXR5TGltaXRhdGlvblJlYXNvbj09PSJiYW5kd2lkdGgifSksdGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5zZXQoYyxBKX1lbHNlIGlmKG0ub3V0Ym91bmRBdWRpb1J0cElkLmxlbmd0aD4wKXtjb25zdCBWPW8ub3V0Ym91bmRBdWRpb1J0cC5nZXQobS5vdXRib3VuZEF1ZGlvUnRwSWRbMF0pO1Yuc2NvcmU9X3Ioe3BhY2tldHNTZW50OihWLnBhY2tldHNTZW50fHwwKS0oKChRZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlFlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoSmU9Vi5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6SmUucGFja2V0c0xvc3QpfHwwKS0oKChaZT0oWGU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpYZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6WmUucGFja2V0c0xvc3QpfHwwKSxqaXR0ZXI6KChldD1WLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpldC5qaXR0ZXIpfHwwfSksdy5zZXQoYyx7c2NvcmU6KyhWLnNjb3JlKjEwKS50b0ZpeGVkKCksYml0cmF0ZTooKFYuYnl0ZXNTZW50fHwwKS0oKCh0dD10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnR0LmJ5dGVzU2VudCl8fDApKSo4LzcscGFja2V0c0xvc3RQZXJjZW50YWdlOmx0KHtwYWNrZXRzU2VudDooVi5wYWNrZXRzU2VudHx8MCktKCgocnQ9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpydC5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKHN0PVYucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnN0LnBhY2tldHNMb3N0KXx8MCktKCgoaXQ9KG50PXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6bnQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOml0LnBhY2tldHNMb3N0KXx8MCl9KSxqaXR0ZXI6KChhdD1WLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDphdC5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYyl9KSx0aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLFYpfX0pLEUuZm9yRWFjaChtPT57Y29uc3QgYz1mLmZpbmQoYj0+Yi5pZD09PW0ubG9jYWxDYW5kaWRhdGVJZD8obS5sb2NhbENhbmRpZGF0ZUlkPWIuaWQsYik6bnVsbCksdT12LmZpbmQoYj0+Yi5pZD09PW0ucmVtb3RlQ2FuZGlkYXRlSWQ/KG0ucmVtb3RlQ2FuZGlkYXRlSWQ9Yi5pZCxiKTpudWxsKTtjJiYobS5sb2NhbENhbmRpZGF0ZVR5cGU9Yy50eXBlLG0ubG9jYWxDYW5kaWRhdGVBZGRyZXNzPWFlKGMuYWRkcmVzcyksbS5sb2NhbENhbmRpZGF0ZVBvcnQ9Yy5wb3J0LG0ubG9jYWxDYW5kaWRhdGVQcm90b2NvbD1jLnByb3RvY29sLG0ubG9jYWxDYW5kaWRhdGVVcmw9Yy51cmwsbS5sb2NhbENhbmRpZGF0ZU5ldHdvcmtUeXBlPWMubmV0d29ya1R5cGUsbS5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRBZGRyZXNzPWFlKGMucmVsYXRlZEFkZHJlc3MpLG0ubG9jYWxDYW5kaWRhdGVSZWxhdGVkUG9ydD1jLnJlbGF0ZWRQb3J0KSx1JiYobS5yZW1vdGVDYW5kaWRhdGVUeXBlPXUudHlwZSxtLnJlbW90ZUNhbmRpZGF0ZUFkZHJlc3M9YWUodS5hZGRyZXNzKSxtLnJlbW90ZUNhbmRpZGF0ZVBvcnQ9dS5wb3J0LG0ucmVtb3RlQ2FuZGlkYXRlUHJvdG9jb2w9dS5wcm90b2NvbCxtLnJlbW90ZUNhbmRpZGF0ZVVybD11LnVybCl9KSxvLmNhbmRpZGF0ZVBhaXImJihvLnRyYW5zcG9ydD8oby50cmFuc3BvcnQuYnl0ZXNSZWNlaXZlZD1vLmNhbmRpZGF0ZVBhaXIuYnl0ZXNSZWNlaXZlZCxvLnRyYW5zcG9ydC5ieXRlc1NlbnQ9by5jYW5kaWRhdGVQYWlyLmJ5dGVzU2VudCxvLnRyYW5zcG9ydC50b3RhbFJvdW5kVHJpcFRpbWU9by5jYW5kaWRhdGVQYWlyLnRvdGFsUm91bmRUcmlwVGltZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSk6by50cmFuc3BvcnQ9e2J5dGVzUmVjZWl2ZWQ6by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50Om8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsdG90YWxSb3VuZFRyaXBUaW1lOm8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUscm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWV9KSxvLnRyYW5zcG9ydCYmKG8udHJhbnNwb3J0LmNhbmRpZGF0ZVBhaXJzPUUpLG8udHJhbnNwb3J0JiYhby50cmFuc3BvcnQucm91bmRUcmlwVGltZSl7bGV0IG09MCxjPTA7by5yZW1vdGVJbmJvdW5kUnRwLmZvckVhY2goKHUsYik9Pnt1LnJvdW5kVHJpcFRpbWUmJnUucm91bmRUcmlwVGltZT5tJiYobT11LnJvdW5kVHJpcFRpbWUsYz11LnRvdGFsUm91bmRUcmlwVGltZSl9KSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW0sby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPWN9aWYoeC5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLHgpfWNhdGNoKG0pe31pZih3LnNpemU+MCl0cnl7dGhpcy5vYnNlcnZlci5lbWl0KCJwcm9kdWNlcl9zY29yZSIsdyl9Y2F0Y2gobSl7fXJldHVybiBvfWdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0KGUpe2NvbnN0IHM9W107dHJ5e2UucHJvZHVjZXJTdHJlYW1NYXAuZm9yRWFjaCgobixpKT0+e2NvbnN0IGE9dGhpcy5wcm9kdWNlck1hcC5nZXQoaSksZD1hLnRyYWNrLmdldFNldHRpbmdzKCksbz1uLm91dGJvdW5kVmlkZW9SdHBJZC5tYXAoZj0+e2NvbnN0IHY9ZS5vdXRib3VuZFZpZGVvUnRwLmdldChmKTtyZXR1cm4gdi5mcmFtZUhlaWdodHx8KHYuZnJhbWVIZWlnaHQ9ZC5oZWlnaHQsdi5mcmFtZVdpZHRoPWQud2lkdGgsdi5mcmFtZXNQZXJTZWNvbmQ9ZC5mcmFtZVJhdGUpLHZ9KSxsPXtwcm9kdWNlcklkOmksYXBwRGF0YTphLmFwcERhdGEsdmlkZW9TdGF0czpvLGF1ZGlvU3RhdHM6bi5vdXRib3VuZEF1ZGlvUnRwSWQubWFwKGY9PmUub3V0Ym91bmRBdWRpb1J0cC5nZXQoZikpfTtzLnB1c2gobCl9KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKCJnZXRQcm9kdWNlcnNSZXBvcnQ6ICIsbixlKX1yZXR1cm4gc31nZXRDb25zdW1lclN0YXRzRnJvbVBhcnNlZENvbnN1bWVyU3RhdHMoZSxzLG4pe2xldCBpO3RyeXtjb25zdHtwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvfT10aGlzLmNvbnN1bWVyUGVlcklkTWFwLmdldChuKSxsPXM9PW51bGw/dm9pZCAwOnMuaW5ib3VuZFZpZGVvUnRwSWQubWFwKGY9Pntjb25zdCBFPXRoaXMuY29uc3VtZXJNYXAuZ2V0KG4pLnRyYWNrLmdldFNldHRpbmdzKCksdz1lLmluYm91bmRWaWRlb1J0cC5nZXQoZik7cmV0dXJuIHcuZnJhbWVIZWlnaHR8fCh3LmZyYW1lSGVpZ2h0PUUuaGVpZ2h0LHcuZnJhbWVXaWR0aD1FLndpZHRoLHcuZnJhbWVzUGVyU2Vjb25kPUUuZnJhbWVSYXRlKSx3fSk7aT17Y29uc3VtZXJJZDpuLHBlZXJJZDphLHByb2R1Y2VySWQ6ZCxhcHBEYXRhOm8sdmlkZW9TdGF0czpsLGF1ZGlvU3RhdHM6cz09bnVsbD92b2lkIDA6cy5pbmJvdW5kQXVkaW9SdHBJZC5tYXAoZj0+ZS5pbmJvdW5kQXVkaW9SdHAuZ2V0KGYpKX19Y2F0Y2goYSl7Y29uc29sZS5lcnJvcigiZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzOiAiLGEsZSl9cmV0dXJuIGl9Z2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQoZSl7Y29uc3Qgcz1bXTt0cnl7ZS5jb25zdW1lclN0cmVhbU1hcC5mb3JFYWNoKChuLGkpPT57cy5wdXNoKHRoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzKGUsbixpKSl9KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKCJnZXRDb25zdW1lclN0YXRzRnJvbVJlcG9ydDogIixuLGUpfXJldHVybiBzfX1jbGFzcyBDbiBleHRlbmRzIExye31mdW5jdGlvbiBtdCh0LHIsZSxzKXtpZih0IT1udWxsJiZ0LmxvZ2dlciYmdC5sb2dnZXIuZXJyb3IoIkNhbGxzdGF0czo6aGFuZGxlRXJyb3IiLHtlcnJvcjpzfSksdHlwZW9mIGU9PSJmdW5jdGlvbiImJnMgaW5zdGFuY2VvZiByKWUuY2FsbChudWxsLHMsdCk7ZWxzZSB0aHJvdyBzfWZ1bmN0aW9uIERyKHQscixlKXtjb25zdCBzPXQudmFsdWU7cmV0dXJuIHQudmFsdWU9ZnVuY3Rpb24oLi4ubil7dHJ5e2NvbnN0IGk9cy5hcHBseSh0aGlzLG4pO3JldHVybiBpJiZpIGluc3RhbmNlb2YgUHJvbWlzZT9pLmNhdGNoKGE9PnttdCh0aGlzLHIsZSxhKX0pOml9Y2F0Y2goaSl7bXQodGhpcyxyLGUsaSl9cmV0dXJuIG51bGx9LHR9Y29uc3QgQz0odCxyKT0+KGUscyxuKT0+e2NvbnN0IGk9bi52YWx1ZTtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbiguLi5hKXt0cnl7Y29uc3QgZD1pLmFwcGx5KHRoaXMsYSk7cmV0dXJuIGQmJmQgaW5zdGFuY2VvZiBQcm9taXNlP2QuY2F0Y2gobz0+e210KHRoaXMsdCxyLG8pfSk6ZH1jYXRjaChkKXttdCh0aGlzLHQscixkKX1yZXR1cm4gbnVsbH0sbn0sSW49KHQscik9PihlLHMsbik9PntpZihuKXJldHVybiBEcihuLHQscik7Zm9yKGNvbnN0IGkgb2YgUmVmbGVjdC5vd25LZXlzKGUucHJvdG90eXBlKS5maWx0ZXIoYT0+YSE9PSJjb25zdHJ1Y3RvciIpKXtjb25zdCBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZS5wcm90b3R5cGUsaSk7YS52YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsaSxEcihhLHQscikpfX07dmFyIFI9ZnVuY3Rpb24odCxyLGUscyl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCxpPW48Mz9yOnM9PT1udWxsP3M9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLGUpOnMsYTtpZih0eXBlb2YgUmVmbGVjdD09Im9iamVjdCImJnR5cGVvZiBSZWZsZWN0LmRlY29yYXRlPT0iZnVuY3Rpb24iKWk9UmVmbGVjdC5kZWNvcmF0ZSh0LHIsZSxzKTtlbHNlIGZvcih2YXIgZD10Lmxlbmd0aC0xO2Q+PTA7ZC0tKShhPXRbZF0pJiYoaT0objwzP2EoaSk6bj4zP2EocixlLGkpOmEocixlKSl8fGkpO3JldHVybiBuPjMmJmkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLGUsaSksaX07Y29uc3QgUD1jb25zb2xlO2xldCBfPWNsYXNzIGV4dGVuZHMgcXtjb25zdHJ1Y3RvcihlPSJodHRwczovL2FwaS50ZXN0aW5ndjMuZHl0ZS5pbiIscz0iQmxpbmsiLG49ZnIuUFJPRCxpLGEsZCxvLGwpe3N1cGVyKCk7cCh0aGlzLCJvYnNlcnZlciIpO3AodGhpcywiZXZlbnRIYW5kbGVyIik7cCh0aGlzLCJtZWFzdXJlbWVudHMiKTtwKHRoaXMsInByb2R1Y2luZ1RyYW5zcG9ydCIpO3AodGhpcywiY29uc3VtaW5nVHJhbnNwb3J0Iik7cCh0aGlzLCJwcm9kdWNlcnMiLG5ldyBNYXApO3AodGhpcywiY29uc3VtZXJzIixuZXcgTWFwKTtwKHRoaXMsImljZVNlcnZlcnMiKTtwKHRoaXMsImNvbm5lY3Rpb25JbmZvUHJvbWlzZSIpO3AodGhpcywicGluZ1N0YXRzVGltZW91dCIpO3AodGhpcywibG9nZ2VyIik7cCh0aGlzLCJlbnYiKTtwKHRoaXMsImFwaUhvc3RuYW1lcyIpO3AodGhpcywicGVlcklkIik7cCh0aGlzLCJjb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwIixuZXcgTWFwKTtwKHRoaXMsImN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMiLHt9KTtpZighbCl0aHJvdyBFcnJvcigiYXV0aFRva2VuIGlzIG1pc3NpbmcgYnV0IHJlcXVpcmVkIHRvIGluaXRpYWxpemUgQ2FsbFN0YXRzISIpO3N3aXRjaCh0aGlzLmVudj1uLHRoaXMuYXBpSG9zdG5hbWVzPW8sdGhpcy5sb2dnZXI9YSx0aGlzLnBlZXJJZD1kLHRoaXMuZXZlbnRIYW5kbGVyPW5ldyB1bih7bG9nZ2VyOmEscGVlcklkOmQsYXBpSG9zdG5hbWVzOm8sYXV0aFRva2VuOmx9KSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjplbmdpbmVOYW1lOiAiLHtlbmdpbmVOYW1lOnN9KSxzKXtjYXNlIkJsaW5rIjp0aGlzLm1lYXN1cmVtZW50cz1uZXcgUG47YnJlYWs7Y2FzZSJHZWNrbyI6dGhpcy5tZWFzdXJlbWVudHM9bmV3IExyO2JyZWFrO2Nhc2UiV2ViS2l0Ijp0aGlzLm1lYXN1cmVtZW50cz1uZXcgQ247YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihgVW5rbm93biBlbmdpbmVOYW1lISAke3N9YCl9dGhpcy5tZWFzdXJlbWVudHMuY2FsbFN0YXRzSW5zdGFuY2U9dGhpcyx0aGlzLnJlZ2lzdGVyUHJvZHVjZXI9dGhpcy5yZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyksdGhpcy5yZWdpc3RlckNvbnN1bWVyPXRoaXMucmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMpLHRoaXMub2JzZXJ2ZXI9bmV3IHEsdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oImNvbnN1bWVyX3Njb3JlIixmPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpjb25zdW1lcl9zY29yZSAke1suLi5mLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLGYpfSksdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oInByb2R1Y2VyX3Njb3JlIixmPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpwcm9kdWNlcl9zY29yZSAke1suLi5mLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLGYpfSl9cmVnaXN0ZXJJY2VTZXJ2ZXJzKGUpe3RoaXMuaWNlU2VydmVycz1lfXJlZ2lzdGVyQ29uc3VtZXIoZSl7dmFyIHM7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlLmlkKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLmlkLHt9KSx0aGlzLmNvbnN1bWVycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlckNvbnN1bWVyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyQ29uc3VtZXIiLHtjb25zdW1lcklkOmUuaWQsY29uc3VtZXJraW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlckNvbnN1bWVyLmJpbmQodGhpcyxlKSl9cmVnaXN0ZXJQcm9kdWNlcihlKXt2YXIgczt0aGlzLnByb2R1Y2Vycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlclByb2R1Y2VyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSl9c2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50KGUscyl7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLHt9KTtjb25zdCBuPXRoaXMuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcC5nZXQoZSk7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLE9iamVjdC5hc3NpZ24obixzKSl9cmVnaXN0ZXJQcm9kdWNpbmdUcmFuc3BvcnQoZSl7dmFyIG47dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9ZSxlLm9uKCJjbG9zZSIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksZS5vbigiZGlzY29ubmVjdCIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksQXJyYXkuZnJvbSgoKG49ZS5fcHJvZHVjZXJzKT09bnVsbD92b2lkIDA6bi52YWx1ZXMoKSl8fFtdKS5mb3JFYWNoKGk9Pnt0aGlzLnJlZ2lzdGVyUHJvZHVjZXIoaSl9KSxlLm9uKCJuZXdwcm9kdWNlciIsdGhpcy5yZWdpc3RlclByb2R1Y2VyKX1yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKXt2YXIgbjt0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydD1lLGUub24oImNsb3NlIix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxlLm9uKCJkaXNjb25uZWN0Iix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxBcnJheS5mcm9tKCgobj1lLl9jb25zdW1lcnMpPT1udWxsP3ZvaWQgMDpuLnZhbHVlcygpKXx8W10pLmZvckVhY2goaT0+e3RoaXMucmVnaXN0ZXJDb25zdW1lcihpKX0pLGUub24oIm5ld2NvbnN1bWVyIix0aGlzLnJlZ2lzdGVyQ29uc3VtZXIpfWRlUmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVycy5kZWxldGUoZS5pZCl9ZGVSZWdpc3RlclByb2R1Y2VyKGUpe3ZhciBzO3RoaXMucHJvZHVjZXJzLmRlbGV0ZShlLmlkKSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpkZVJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSl9ZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCgpe3RoaXMuY29uc3VtaW5nVHJhbnNwb3J0PXZvaWQgMH1kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0KCl7dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9dm9pZCAwfWNhbGxFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoZSl9c2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlPSExLHMpe3RoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlPXRoaXMubWVhc3VyZW1lbnRzLmdldE5ldHdvcmtJbmZvKHRoaXMuaWNlU2VydmVycyxlKSx0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUFJFQ0FMTF9URVNUX0JFR0lOLHRpbWVzdGFtcDpzfSksdGhpcy5jb25uZWN0aW9uSW5mb1Byb21pc2UmJnRoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlLnRoZW4obj0+e3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5QUkVDQUxMX1RFU1RfQ09NUExFVEUsbWV0YURhdGE6e2Nvbm5lY3Rpb25JbmZvOm59LHRpbWVzdGFtcDpzfSl9KX1zZW5kU2NyZWVuU2hhcmVUb2dnbGVFdmVudChlLHM9bnVsbCxuKXt0aGlzLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMuc2NyZWVuPWUsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplP1MuU0NSRUVOU0hBUkVfU1RBUlRFRDpTLlNDUkVFTlNIQVJFX1NUT1BQRUQsbWV0YURhdGE6e3NzcmM6c30sdGltZXN0YW1wOm59KX1zZW5kU2NyZWVuU2hhcmVSZXF1ZXN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuU0NSRUVOU0hBUkVfU1RBUlRfUkVRVUVTVEVELHRpbWVzdGFtcDplfSl9c2VuZEFjdGl2ZVNwZWFrZXJFdmVudChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5ET01JTkFOVF9TUEVBS0VSLG1ldGFEYXRhOntwZWVySWQ6ZX0sdGltZXN0YW1wOnN9KX1kZXZpY2VzKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OmU9PT1KLkFVRElPJiZTLkFVRElPX0RFVklDRVNfVVBEQVRFU3x8ZT09PUouVklERU8mJlMuVklERU9fREVWSUNFU19VUERBVEVTfHxlPT09Si5TUEVBS0VSJiZTLlNQRUFLRVJfREVWSUNFU19VUERBVEVTLG1ldGFEYXRhOntkZXZpY2VMaXN0OnN9LHRpbWVzdGFtcDpufSl9c2VsZWN0ZWREZXZpY2UoZSxzLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PUouQVVESU8mJlMuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEV8fGU9PT1KLlZJREVPJiZTLlNFTEVDVEVEX0NBTUVSQV9VUERBVEV8fGU9PT1KLlNQRUFLRVImJlMuU0VMRUNURURfU1BFQUtFUl9VUERBVEUsbWV0YURhdGE6e2RldmljZTpzfSx0aW1lc3RhbXA6bn0pfW1lZGlhUGVybWlzc2lvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk1FRElBX1BFUk1JU1NJT04sbWV0YURhdGE6e2RldmljZVR5cGU6ZSxwZXJtaXNzaW9uOnN9LHRpbWVzdGFtcDpufSl9bWVkaWFQbGF5YmFja0ZhaWxlZChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PUouQVVESU8mJlMuQVVESU9fUExBWV9GQUlMRUR8fGU9PT1KLlZJREVPJiZTLlZJREVPX1BMQVlfRkFJTEVELG1ldGFEYXRhOntkZXZpY2VUeXBlOmV9LHRpbWVzdGFtcDpzfSl9bWVkaWFUcmFja011dGVkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplPT09Si5BVURJTyYmUy5BVURJT19UUkFDS19NVVRFRHx8ZT09PUouVklERU8mJlMuVklERU9fVFJBQ0tfTVVURUQsbWV0YURhdGE6e2RldmljZVR5cGU6ZX0sdGltZXN0YW1wOnN9KX10YWJDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlRBQl9DSEFOR0UsbWV0YURhdGE6e2lzTWVldGluZ3NUYWJBY3RpdmU6ZX0sdGltZXN0YW1wOnN9KX1icm93c2VyQmFja2dyb3VuZGVkKGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCx0aW1lc3RhbXA6ZX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkJST1dTRVJfRk9SRUdST1VOREVELHRpbWVzdGFtcDplfSl9bGVnYWN5U3dpdGNoKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkxFR0FDWV9TV0lUQ0gsbWV0YWRhdGE6e29uOmV9LHRpbWVzdGFtcDpzfSl9Z2V0UHJlQ2FsbFRlc3RSZXN1bHRzKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25JbmZvUHJvbWlzZX0pfXNlbmRDYWxsSm9pbkJlZ2luRXZlbnQoZSxzKXtlPW90KFEoe30sZSkse21lZXRpbmdFbnY6dGhpcy5lbnZ9KSxlLmRldmljZUluZm89b3QoUSh7fSxlLmRldmljZUluZm8pLHt1c2VyQWdlbnQ6bmF2aWdhdG9yLnVzZXJBZ2VudCxjcHVzOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5LG1lbW9yeTpuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5fSksdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkNBTExfSk9JTl9CRUdJTixtZXRhRGF0YTp7cGVlck1ldGFEYXRhOmV9LHRpbWVzdGFtcDpzfSl9c2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTix0aW1lc3RhbXA6c30pLG5ldyBQcm9taXNlKChpLGEpPT5JKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBkPVtdO3RyeXtmb3IoY29uc3QgbyBvZiBlKXRyeXtpZihvLmljZVNlcnZlcnMmJm8uaWNlU2VydmVycy5sZW5ndGg+MCl7Y29uc3QgbD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXROZXR3b3JrUXVhbGl0eShvLmljZVNlcnZlcnMpO2QucHVzaChvdChRKHt9LG8pLHtuZXR3b3JrUmVzdWx0czpsfSkpfX1jYXRjaChsKXtjb25zb2xlLndhcm4oIkVycm9yIGhhbmRsaW5nICIsbCl9aSh7cmVnaW9uRGF0YTpkfSl9Y2F0Y2gobyl7Y29uc29sZS53YXJuKCJFcnJvciBpbiBjYWxsc3RhdHMsICIsbyksYShvKX19KSkudGhlbihpPT57dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk5FVF9RVUFMSVRZX1RFU1RfRU5ELHRpbWVzdGFtcDpzLG1ldGFEYXRhOml9KX0pfXNlbmRXZWJTb2NrZXRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuV0VCU09DS0VUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuVFJBTlNQT1JUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRBdWRpb1RvZ2dsZUV2ZW50KGUscyl7dGhpcy5jdXJyZW50VXNlck1lZGlhU3RhdGVzLmF1ZGlvPWU7bGV0IG47ZT9uPVMuQVVESU9fT046bj1TLkFVRElPX09GRix0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50Om4sdGltZXN0YW1wOnN9KX1zZW5kVmlkZW9Ub2dnbGVFdmVudChlLHMpe3RoaXMuY3VycmVudFVzZXJNZWRpYVN0YXRlcy52aWRlbz1lO2xldCBuO2U/bj1TLlZJREVPX09OOm49Uy5WSURFT19PRkYsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpuLHRpbWVzdGFtcDpzfSl9c2VuZFBhcnRpY2lwYW50Um9sZVRvZ2dsZUV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBBUlRJQ0lQQU5UX1JPTEUsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXN0YXJ0UGluZ1N0YXRzKGU9N2UzKXt0aGlzLnNlbmRQaW5nU3RhdHNFdmVudCghMSxuZXcgRGF0ZSksdGhpcy5waW5nU3RhdHNUaW1lb3V0PXNldEludGVydmFsKHRoaXMuc2VuZFBpbmdTdGF0c0V2ZW50LmJpbmQodGhpcyksZSl9c3RvcFBpbmdTdGF0cygpe2NsZWFySW50ZXJ2YWwodGhpcy5waW5nU3RhdHNUaW1lb3V0KX1zZW5kUGluZ1N0YXRzRXZlbnQoZT0hMCxzKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGQsbztsZXQgbixpO2lmKHRoaXMucHJvZHVjaW5nVHJhbnNwb3J0JiYobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksIW58fCEoKGQ9bj09bnVsbD92b2lkIDA6bi5wcm9kdWNlclJlcG9ydCkhPW51bGwmJmQubGVuZ3RoKSkpe3RoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnNlbmRQaW5nU3RhdHNFdmVudDo6c3RhbGVQcm9kdWNpbmdUcmFuc3BvcnQiLHtkaXNjbGFpbWVyOiJTdGFsZSBwcm9kdWNlcj8gUmVnZW5lcmF0aW5nIFN0cmVhbSBNYXBzISJ9KTtjb25zdCBsPXlpZWxkIHRoaXMubWVhc3VyZW1lbnRzLmdldFByb2R1Y2Vyc1JlcG9ydChbLi4udGhpcy5wcm9kdWNlcnMudmFsdWVzKCldKTtuJiZsP24ucHJvZHVjZXJSZXBvcnQ9bDoobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksKCFufHwhKG4hPW51bGwmJm4ucHJvZHVjZXJSZXBvcnQpKSYmdGhpcy5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6c2VuZFBpbmdTdGF0c0V2ZW50Ojpub1Byb2R1Y2luZ1RyYW5zcG9ydFJlcG9ydCIse2Rpc2NsYWltZXI6IlN0cmVhbSBtYXBzIGludmFsaWQgZGVzcGl0ZSByZWdlbmVyYXRpbmchIn0pKX1pZih0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydCYmKGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCFpfHwhKChvPWkuY29uc3VtZXJSZXBvcnQpIT1udWxsJiZvLmxlbmd0aCkpKXt0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6OnN0YWxlQ29uc3VtaW5nVHJhbnNwb3J0Iix7ZGlzY2xhaW1lcjoiU3RhbGUgY29uc3VtZXI/IFJlZ2VuZXJhdGluZyBTdHJlYW0gTWFwcyEifSk7Y29uc3QgbD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRDb25zdW1lcnNSZXBvcnQoWy4uLnRoaXMuY29uc3VtZXJzLnZhbHVlcygpXSk7aSYmbD9pLmNvbnN1bWVyUmVwb3J0PWw6KGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCghaXx8IWkuY29uc3VtZXJSZXBvcnQpJiZ0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6Om5vQ29uc3VtaW5nVHJhbnNwb3J0UmVwb3J0Iix7ZGlzY2xhaW1lcjoiU3RyZWFtIG1hcHMgaW52YWxpZCBkZXNwaXRlIHJlZ2VuZXJhdGluZyEifSkpfWNvbnN0IGE9e3Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzOm4/bj09bnVsbD92b2lkIDA6bi50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLGNvbnN1bWluZ1RyYW5zcG9ydFN0YXRzOmk/aT09bnVsbD92b2lkIDA6aS50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLHByb2R1Y2VyU3RhdHM6W10uY29uY2F0KChuPT1udWxsP3ZvaWQgMDpuLnByb2R1Y2VyUmVwb3J0KXx8W10pLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5wcm9kdWNlclJlcG9ydCl8fFtdKSxjb25zdW1lclN0YXRzOltdLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5jb25zdW1lclJlcG9ydCl8fFtdKS5jb25jYXQoKG49PW51bGw/dm9pZCAwOm4uY29uc3VtZXJSZXBvcnQpfHxbXSl9O2lmKGUmJmEucHJvZHVjZXJTdGF0cy5sZW5ndGg9PT0wJiZhLmNvbnN1bWVyU3RhdHMubGVuZ3RoPT09MCl7eWllbGQgdGhpcy5ldmVudEhhbmRsZXIuZmx1c2goKTtyZXR1cm59dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBJTkdfU1RBVCxtZXRhRGF0YTphLHRpbWVzdGFtcDpzfSl9KX1zZW5kSVZTUGxheWVyUmVidWZmZXJFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUJVRkZFUklORyx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJBdWRpb0Jsb2NrRXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQVVESU9fQkxPQ0tFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJQbGF5YmFja0Jsb2NrZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELHRpbWVzdGFtcDplfSl9c2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVySW5pdGlhbGl6ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9JTklUSUFMSVpFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUix0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfRVJST1IsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUix0aW1lc3RhbXA6cyxtZXRhRGF0YTplfSl9c2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOnt1cGRhdGVkUGxheWJhY2tSYXRlOmV9fSl9c2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kUGxheWVyTGl2ZUxhdGVuY3koZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTElWRVNUUkVBTV9MQVRFTkNZLHRpbWVzdGFtcDpzLG1ldGFEYXRhOntsYXRlbmN5OmV9fSl9c2VuZERpc2Nvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRElTQ09OTkVDVCx0aW1lc3RhbXA6ZX0pfXNlbmRSZWNvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUkVDT05ORUNUX0FUVEVNUFQsdGltZXN0YW1wOmV9KX1leHBlY3RlZFZpZGVvUmVzb2x1dGlvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT04sdGltZXN0YW1wOm4sbWV0YURhdGE6e2ZyYW1lV2lkdGg6ZSxmcmFtZUhlaWdodDpzfX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTix0aW1lc3RhbXA6bixtZXRhRGF0YTp7ZnJhbWVXaWR0aDplLGZyYW1lSGVpZ2h0OnN9fSl9fTtSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInJlZ2lzdGVySWNlU2VydmVycyIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJyZWdpc3RlckNvbnN1bWVyIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInJlZ2lzdGVyQ29uc3VtaW5nVHJhbnNwb3J0IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsImRlUmVnaXN0ZXJDb25zdW1lciIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJkZVJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJkaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRQcmVDYWxsVGVzdEJlZ2luRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlVG9nZ2xlRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZEFjdGl2ZVNwZWFrZXJFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJkZXZpY2VzIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbGVjdGVkRGV2aWNlIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsIm1lZGlhUGVybWlzc2lvbiIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJtZWRpYVBsYXliYWNrRmFpbGVkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsIm1lZGlhVHJhY2tNdXRlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJ0YWJDaGFuZ2VkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsImJyb3dzZXJCYWNrZ3JvdW5kZWQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiYnJvd3NlckZvcmVncm91bmRlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJsZWdhY3lTd2l0Y2giLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwiZ2V0UHJlQ2FsbFRlc3RSZXN1bHRzIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRDYWxsSm9pbkJlZ2luRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZFdlYlNvY2tldENvbm5lY3RlZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kQXVkaW9Ub2dnbGVFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kVmlkZW9Ub2dnbGVFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kUGFydGljaXBhbnRSb2xlVG9nZ2xlRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic3RhcnRQaW5nU3RhdHMiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic3RvcFBpbmdTdGF0cyIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kUGluZ1N0YXRzRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJJbml0aWFsaXplZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJQbGF5YmFja1JhdGVDaGFuZ2VkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxfLnByb3RvdHlwZSwic2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRQbGF5ZXJMaXZlTGF0ZW5jeSIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJzZW5kRGlzY29ubmVjdEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sXy5wcm90b3R5cGUsInNlbmRSZWNvbm5lY3RFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJleHBlY3RlZFZpZGVvUmVzb2x1dGlvbiIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8ucHJvdG90eXBlLCJleHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbiIsbnVsbCksXz1SKFtJbihUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLF8pO3ZhciB3bj1fO2NsYXNzIE5yIGV4dGVuZHMgcXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7cCh0aGlzLCJzdGF0cyIpO3AodGhpcywicGVlcklkIik7cCh0aGlzLCJiYWNrZW5kIik7cCh0aGlzLCJpY2VTZXJ2ZXJzIik7cCh0aGlzLCJpbml0aWFsaXplZCIsITEpO3AodGhpcywic3RhbGxlZCIsITEpO3AodGhpcywiaXBJbmZvcm1hdGlvbiIpO3AodGhpcywibG9nZ2VyIil9aW5pdGlhbGl6ZShFKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDplLGVuZ2luZU5hbWU6cyxlbnY6bj1mci5QUk9ELGljZVNlcnZlcnM6aSxhcGlCYXNlOmE9Imh0dHBzOi8vYXBpLmNsdXN0ZXIuZHl0ZS5pbiIsZmxhZ3M6ZCxsb2dnZXI6bz1jb25zb2xlLGFwaUhvc3RuYW1lczpsLHNraXBDb25uZWN0aXZpdHlDaGVja3M6Zj0hMSxhdXRoVG9rZW46dn0pe3ZhciB3LHgsVTt0cnl7aWYodGhpcy5wZWVySWQ9ZSx0aGlzLmxvZ2dlcj1vLCF2KXt0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjppbml0aWFsaXplIix7ZXZlbnQ6ImF1dGhfdG9rZW5fbWlzc2luZyIscGVlcklkOnRoaXMucGVlcklkfSksdGhpcy5zdGFsbENhbGxTdGF0cygpO3JldHVybn10aGlzLmlwSW5mb3JtYXRpb249eWllbGQgd3IuZ2V0SVBEZXRhaWxzKHtwZWVySWQ6ZSxhcGlIb3N0bmFtZXM6bCxsb2dnZXI6b30pLHRoaXMuYmFja2VuZD1uZXcgd24oYSxzLG4sZCxvLGUsbCx2KSx0aGlzLmljZVNlcnZlcnM9aSwodz10aGlzLmJhY2tlbmQpPT1udWxsfHx3LnJlZ2lzdGVySWNlU2VydmVycyh0aGlzLmljZVNlcnZlcnMpLHRoaXMuaW5pdGlhbGl6ZWQ9ITAsKFU9KHg9dGhpcy5iYWNrZW5kKT09bnVsbD92b2lkIDA6eC5ldmVudEhhbmRsZXIpPT1udWxsfHxVLmVtaXQoImluaXRpYWxpemVkIix0aGlzLmlwSW5mb3JtYXRpb24pLHRoaXMuZW1pdCgiaW5pdGlhbGl6ZWQiLHRoaXMuaXBJbmZvcm1hdGlvbiksdGhpcy5zdGFydFByZUNhbGxUZXN0KGYpfWNhdGNoKEwpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OkNhbGxTdGF0c0ludGVncmF0aW9uIix7cGVlcklkOnRoaXMucGVlcklkLGVycm9yOkwgaW5zdGFuY2VvZiBFcnJvcj9MLm1lc3NhZ2U6U3RyaW5nKEwpLHN0YWNrOkwgaW5zdGFuY2VvZiBFcnJvcj9MLnN0YWNrOnZvaWQgMH0pLHRoaXMuc3RhbGxDYWxsU3RhdHMoKX19KX1jb25maWd1cmVTZW5kVHJhbnNwb3J0KGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0KGUpfSl9Y29uZmlndXJlUmVjdlRyYW5zcG9ydChlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKX0pfWNhbmRpZGF0ZVJlZ2lvbmFsTmV0d29ya1F1YWxpdHlUZXN0KGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjt0cnl7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kTmV0d29ya1F1YWxpdHlUZXN0QmVnaW5FdmVudChlLHMpfWNhdGNoKGkpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OnNlbmROZXR3b3JrUXVhbGl0eVRlc3RCZWdpbkV2ZW50Iix7ZXJyb3I6e3JlYXNvbjppLnJlYXNvbn19KX19KX0pfXJvb21Kb2luZWQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuLGk7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQ2FsbEpvaW5CZWdpbkV2ZW50KGUscyksdGhpcy5iYWNrZW5kLChpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc3RhcnRQaW5nU3RhdHMoKX0pfSl9YXVkaW9PZmYoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRBdWRpb1RvZ2dsZUV2ZW50KCExLGUpfSl9YXVkaW9Pbigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZEF1ZGlvVG9nZ2xlRXZlbnQoITAsZSl9KX12aWRlb09mZigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFZpZGVvVG9nZ2xlRXZlbnQoITEsZSl9KX12aWRlb09uKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kVmlkZW9Ub2dnbGVFdmVudCghMCxlKX0pfWNhbGxFbmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzLG47KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zdG9wUGluZ1N0YXRzKCksKG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kRGlzY29ubmVjdEV2ZW50KGUpfSl9c2NyZWVuU2hhcmVTdGFydChlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCEwLGUscyl9KX1jb25zdW1lclNoYXJlZE1lZGlhU3RhdGUoZSxzKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQ29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlRXZlbnQoZSxzKX0pfXNjcmVlblNoYXJlU3RvcChlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCExLGUscyl9KX1zY3JlZW5TaGFyZVJlcXVlc3RlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQoZSl9KX1hY3RpdmVTcGVha2VyKGUpe2lmKGUhPT10aGlzLnBlZXJJZClyZXR1cm47Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQWN0aXZlU3BlYWtlckV2ZW50KGUscyl9KX1kZXZpY2VzKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5kZXZpY2VzKGUscyxuKX0pfXNlbGVjdGVkRGV2aWNlKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5zZWxlY3RlZERldmljZShlLHMsbil9KX1tZWRpYVBlcm1pc3Npb24oZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLm1lZGlhUGVybWlzc2lvbihlLHMsbil9KX1tZWRpYVBsYXliYWNrRmFpbGVkKGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4ubWVkaWFQbGF5YmFja0ZhaWxlZChlLHMpfSl9bWVkaWFUcmFja011dGVkKGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4ubWVkaWFUcmFja011dGVkKGUscyl9KX10YWJDaGFuZ2VkKGU9ITEpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4udGFiQ2hhbmdlZChlLHMpfSl9YnJvd3NlckJhY2tncm91bmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuYnJvd3NlckJhY2tncm91bmRlZChlKX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl9KX1sZWdhY3lTd2l0Y2goZSl7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5sZWdhY3lTd2l0Y2goZSxzKX0pfXN0YXJ0UHJlQ2FsbFRlc3QoZT0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlLHMpfSl9KX1vblByZUNhbGxUZXN0UmVzdWx0cyhlKXtyZXR1cm4gdGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uY2UoInByZWNhbGxfZW5kIixlKX0pLGV9b25SZWNlaXZpbmdDb25zdW1lckF1ZGlvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigiY29uc3VtZXJfYXVkaW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nQ29uc3VtZXJWaWRlb1N0YXR1cyhlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5ldmVudEhhbmRsZXIub24oImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsZSl9KX1vblJlY2VpdmluZ1Byb2R1Y2VyQXVkaW9TdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdQcm9kdWNlclZpZGVvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigicHJvZHVjZXJfdmlkZW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdDb25zdW1pbmdUcmFuc3BvcnRTdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsZSl9KX1vblByb2R1Y2VyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9zY29yZSIsZSl9KX1vbkNvbnN1bWVyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1lcl9zY29yZSIsZSl9KX1vblNhZmVJbml0aWFsaXphdGlvbihlKXtpZih0aGlzLmluaXRpYWxpemVkKWUodGhpcy5pcEluZm9ybWF0aW9uLCExKTtlbHNlIGlmKCF0aGlzLnN0YWxsZWQpe2NvbnN0IHM9bj0+e2UobiwhMCl9O3JldHVybiB0aGlzLm9uY2UoImluaXRpYWxpemVkIixzKSxzfXJldHVybigpPT57fX1yZW1vdmVJbml0aWFsaXphdGlvbkxpc3RlbmVyKGUpe3RoaXMucmVtb3ZlTGlzdGVuZXIoImluaXRpYWxpemVkIixlKX1zdGFsbENhbGxTdGF0cygpe3RoaXMuc3RhbGxlZD0hMCx0aGlzLnJlbW92ZUFsbExpc3RlbmVycygiaW5pdGlhbGl6ZWQiKX1pdnNQbGF5ZXJFdmVudChlLHMpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBpLGEsZCxvLGwsZix2LEUsdyx4LFU7c3dpdGNoKGUpe2Nhc2UiUGxheWVyUmVidWZmZXJpbmciOihpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJBdWRpb0Jsb2NrZWQiOihhPXRoaXMuYmFja2VuZCk9PW51bGx8fGEuc2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudChuKTticmVhaztjYXNlIlBsYXllclBsYXliYWNrQmxvY2tlZCI6KGQ9dGhpcy5iYWNrZW5kKT09bnVsbHx8ZC5zZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJOZXR3b3JrVW5hdmFpbGFibGUiOihvPXRoaXMuYmFja2VuZCk9PW51bGx8fG8uc2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KG4pO2JyZWFrO2Nhc2UiUGxheWVySW5pdGlhbGl6ZWQiOihsPXRoaXMuYmFja2VuZCk9PW51bGx8fGwuc2VuZElWU1BsYXllckluaXRpYWxpemVkRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJXb3JrZXJFcnJvciI6KGY9dGhpcy5iYWNrZW5kKT09bnVsbHx8Zi5zZW5kSVZTUGxheWVyV29ya2VyRXJyb3JFdmVudChuKTticmVhaztjYXNlIlBsYXllckVycm9yIjoodj10aGlzLmJhY2tlbmQpPT1udWxsfHx2LnNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KHMsbik7YnJlYWs7Y2FzZSJQbGF5ZXJSZWNvdmVyYWJsZUVycm9yIjooRT10aGlzLmJhY2tlbmQpPT1udWxsfHxFLnNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQocyxuKTticmVhaztjYXNlIlBsYXllckFuYWx5dGljc0V2ZW50Ijoodz10aGlzLmJhY2tlbmQpPT1udWxsfHx3LnNlbmRJVlNQbGF5ZXJBbmFseXRpY3NFdmVudChzLG4pO2JyZWFrO2Nhc2UiUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZCI6KHg9dGhpcy5iYWNrZW5kKT09bnVsbHx8eC5zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KHMsbik7YnJlYWs7Y2FzZSJQbGF5ZXJRdWFsaXR5Q2hhbmdlZCI6KFU9dGhpcy5iYWNrZW5kKT09bnVsbHx8VS5zZW5kSVZTUGxheWVyUXVhbGl0eUNoYW5nZWQocyxuKTticmVha319KX1saXZlc3RyZWFtTGF0ZW5jeShlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRQbGF5ZXJMaXZlTGF0ZW5jeShlLHMpfSl9ZXhwZWN0ZWRWaWRlb1Jlc29sdXRpb24oZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLmV4cGVjdGVkVmlkZW9SZXNvbHV0aW9uKGUscyxuKX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5leHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbihlLHMsbil9KX19bmV3IE5yKCkuc2V0TWF4TGlzdGVuZXJzKDMwKTtmdW5jdGlvbiBBbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9ZnVuY3Rpb24gVnIodCxyKXtyZXR1cm4gdD09PXJ8fHQhPT10JiZyIT09cn1mdW5jdGlvbiBndCh0LHIpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS07KWlmKFZyKHRbZV1bMF0scikpcmV0dXJuIGU7cmV0dXJuLTF9dmFyIE1uPUFycmF5LnByb3RvdHlwZSxrbj1Nbi5zcGxpY2U7ZnVuY3Rpb24gT24odCl7dmFyIHI9dGhpcy5fX2RhdGFfXyxlPWd0KHIsdCk7aWYoZTwwKXJldHVybiExO3ZhciBzPXIubGVuZ3RoLTE7cmV0dXJuIGU9PXM/ci5wb3AoKTprbi5jYWxsKHIsZSwxKSwtLXRoaXMuc2l6ZSwhMH1mdW5jdGlvbiBMbih0KXt2YXIgcj10aGlzLl9fZGF0YV9fLGU9Z3Qocix0KTtyZXR1cm4gZTwwP3ZvaWQgMDpyW2VdWzFdfWZ1bmN0aW9uIERuKHQpe3JldHVybiBndCh0aGlzLl9fZGF0YV9fLHQpPi0xfWZ1bmN0aW9uIE5uKHQscil7dmFyIGU9dGhpcy5fX2RhdGFfXyxzPWd0KGUsdCk7cmV0dXJuIHM8MD8oKyt0aGlzLnNpemUsZS5wdXNoKFt0LHJdKSk6ZVtzXVsxXT1yLHRoaXN9ZnVuY3Rpb24gc2UodCl7dmFyIHI9LTEsZT10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK3I8ZTspe3ZhciBzPXRbcl07dGhpcy5zZXQoc1swXSxzWzFdKX19c2UucHJvdG90eXBlLmNsZWFyPUFuLHNlLnByb3RvdHlwZS5kZWxldGU9T24sc2UucHJvdG90eXBlLmdldD1MbixzZS5wcm90b3R5cGUuaGFzPURuLHNlLnByb3RvdHlwZS5zZXQ9Tm47ZnVuY3Rpb24gVm4oKXt0aGlzLl9fZGF0YV9fPW5ldyBzZSx0aGlzLnNpemU9MH1mdW5jdGlvbiBGbih0KXt2YXIgcj10aGlzLl9fZGF0YV9fLGU9ci5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1yLnNpemUsZX1mdW5jdGlvbiBCbih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9ZnVuY3Rpb24geG4odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfXZhciBqbj10eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWwsRnI9am4sVW49dHlwZW9mIHNlbGY9PSJvYmplY3QiJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZiwkbj1Gcnx8VW58fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksWD0kbixIbj1YLlN5bWJvbCxFZT1IbixCcj1PYmplY3QucHJvdG90eXBlLEtuPUJyLmhhc093blByb3BlcnR5LFduPUJyLnRvU3RyaW5nLHdlPUVlP0VlLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiB6bih0KXt2YXIgcj1Lbi5jYWxsKHQsd2UpLGU9dFt3ZV07dHJ5e3Rbd2VdPXZvaWQgMDt2YXIgcz0hMH1jYXRjaChpKXt9dmFyIG49V24uY2FsbCh0KTtyZXR1cm4gcyYmKHI/dFt3ZV09ZTpkZWxldGUgdFt3ZV0pLG59dmFyIEduPU9iamVjdC5wcm90b3R5cGUscW49R24udG9TdHJpbmc7ZnVuY3Rpb24gWW4odCl7cmV0dXJuIHFuLmNhbGwodCl9dmFyIFFuPSJbb2JqZWN0IE51bGxdIixKbj0iW29iamVjdCBVbmRlZmluZWRdIix4cj1FZT9FZS50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gQWUodCl7cmV0dXJuIHQ9PW51bGw/dD09PXZvaWQgMD9KbjpRbjp4ciYmeHIgaW4gT2JqZWN0KHQpP3puKHQpOlluKHQpfWZ1bmN0aW9uIE1lKHQpe3ZhciByPXR5cGVvZiB0O3JldHVybiB0IT1udWxsJiYocj09Im9iamVjdCJ8fHI9PSJmdW5jdGlvbiIpfXZhciBYbj0iW29iamVjdCBBc3luY0Z1bmN0aW9uXSIsWm49IltvYmplY3QgRnVuY3Rpb25dIixlaT0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLHRpPSJbb2JqZWN0IFByb3h5XSI7ZnVuY3Rpb24ganIodCl7aWYoIU1lKHQpKXJldHVybiExO3ZhciByPUFlKHQpO3JldHVybiByPT1abnx8cj09ZWl8fHI9PVhufHxyPT10aX12YXIgcmk9WFsiX19jb3JlLWpzX3NoYXJlZF9fIl0sa3Q9cmksVXI9ZnVuY3Rpb24oKXt2YXIgdD0vW14uXSskLy5leGVjKGt0JiZrdC5rZXlzJiZrdC5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHQ/IlN5bWJvbChzcmMpXzEuIit0OiIifSgpO2Z1bmN0aW9uIHNpKHQpe3JldHVybiEhVXImJlVyIGluIHR9dmFyIG5pPUZ1bmN0aW9uLnByb3RvdHlwZSxpaT1uaS50b1N0cmluZztmdW5jdGlvbiBsZSh0KXtpZih0IT1udWxsKXt0cnl7cmV0dXJuIGlpLmNhbGwodCl9Y2F0Y2gocil7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaChyKXt9fXJldHVybiIifXZhciBhaT0vW1xcXiQuKis/KClbXF17fXxdL2csb2k9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sY2k9RnVuY3Rpb24ucHJvdG90eXBlLGRpPU9iamVjdC5wcm90b3R5cGUsbGk9Y2kudG9TdHJpbmcsdWk9ZGkuaGFzT3duUHJvcGVydHkscGk9UmVnRXhwKCJeIitsaS5jYWxsKHVpKS5yZXBsYWNlKGFpLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIGhpKHQpe2lmKCFNZSh0KXx8c2kodCkpcmV0dXJuITE7dmFyIHI9anIodCk/cGk6b2k7cmV0dXJuIHIudGVzdChsZSh0KSl9ZnVuY3Rpb24gZmkodCxyKXtyZXR1cm4gdD09bnVsbD92b2lkIDA6dFtyXX1mdW5jdGlvbiB1ZSh0LHIpe3ZhciBlPWZpKHQscik7cmV0dXJuIGhpKGUpP2U6dm9pZCAwfXZhciBtaT11ZShYLCJNYXAiKSxrZT1taSxnaT11ZShPYmplY3QsImNyZWF0ZSIpLE9lPWdpO2Z1bmN0aW9uIFNpKCl7dGhpcy5fX2RhdGFfXz1PZT9PZShudWxsKTp7fSx0aGlzLnNpemU9MH1mdW5jdGlvbiB2aSh0KXt2YXIgcj10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09cj8xOjAscn12YXIgeWk9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLGJpPU9iamVjdC5wcm90b3R5cGUsRWk9YmkuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gX2kodCl7dmFyIHI9dGhpcy5fX2RhdGFfXztpZihPZSl7dmFyIGU9clt0XTtyZXR1cm4gZT09PXlpP3ZvaWQgMDplfXJldHVybiBFaS5jYWxsKHIsdCk/clt0XTp2b2lkIDB9dmFyIFRpPU9iamVjdC5wcm90b3R5cGUsUmk9VGkuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gUGkodCl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gT2U/clt0XSE9PXZvaWQgMDpSaS5jYWxsKHIsdCl9dmFyIENpPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiBJaSh0LHIpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLGVbdF09T2UmJnI9PT12b2lkIDA/Q2k6cix0aGlzfWZ1bmN0aW9uIHBlKHQpe3ZhciByPS0xLGU9dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytyPGU7KXt2YXIgcz10W3JdO3RoaXMuc2V0KHNbMF0sc1sxXSl9fXBlLnByb3RvdHlwZS5jbGVhcj1TaSxwZS5wcm90b3R5cGUuZGVsZXRlPXZpLHBlLnByb3RvdHlwZS5nZXQ9X2kscGUucHJvdG90eXBlLmhhcz1QaSxwZS5wcm90b3R5cGUuc2V0PUlpO2Z1bmN0aW9uIHdpKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgcGUsbWFwOm5ldyhrZXx8c2UpLHN0cmluZzpuZXcgcGV9fWZ1bmN0aW9uIEFpKHQpe3ZhciByPXR5cGVvZiB0O3JldHVybiByPT0ic3RyaW5nInx8cj09Im51bWJlciJ8fHI9PSJzeW1ib2wifHxyPT0iYm9vbGVhbiI/dCE9PSJfX3Byb3RvX18iOnQ9PT1udWxsfWZ1bmN0aW9uIFN0KHQscil7dmFyIGU9dC5fX2RhdGFfXztyZXR1cm4gQWkocik/ZVt0eXBlb2Ygcj09InN0cmluZyI/InN0cmluZyI6Imhhc2giXTplLm1hcH1mdW5jdGlvbiBNaSh0KXt2YXIgcj1TdCh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1yPzE6MCxyfWZ1bmN0aW9uIGtpKHQpe3JldHVybiBTdCh0aGlzLHQpLmdldCh0KX1mdW5jdGlvbiBPaSh0KXtyZXR1cm4gU3QodGhpcyx0KS5oYXModCl9ZnVuY3Rpb24gTGkodCxyKXt2YXIgZT1TdCh0aGlzLHQpLHM9ZS5zaXplO3JldHVybiBlLnNldCh0LHIpLHRoaXMuc2l6ZSs9ZS5zaXplPT1zPzA6MSx0aGlzfWZ1bmN0aW9uIF9lKHQpe3ZhciByPS0xLGU9dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytyPGU7KXt2YXIgcz10W3JdO3RoaXMuc2V0KHNbMF0sc1sxXSl9fV9lLnByb3RvdHlwZS5jbGVhcj13aSxfZS5wcm90b3R5cGUuZGVsZXRlPU1pLF9lLnByb3RvdHlwZS5nZXQ9a2ksX2UucHJvdG90eXBlLmhhcz1PaSxfZS5wcm90b3R5cGUuc2V0PUxpO3ZhciBEaT0yMDA7ZnVuY3Rpb24gTmkodCxyKXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKGUgaW5zdGFuY2VvZiBzZSl7dmFyIHM9ZS5fX2RhdGFfXztpZigha2V8fHMubGVuZ3RoPERpLTEpcmV0dXJuIHMucHVzaChbdCxyXSksdGhpcy5zaXplPSsrZS5zaXplLHRoaXM7ZT10aGlzLl9fZGF0YV9fPW5ldyBfZShzKX1yZXR1cm4gZS5zZXQodCxyKSx0aGlzLnNpemU9ZS5zaXplLHRoaXN9ZnVuY3Rpb24gVGUodCl7dmFyIHI9dGhpcy5fX2RhdGFfXz1uZXcgc2UodCk7dGhpcy5zaXplPXIuc2l6ZX1UZS5wcm90b3R5cGUuY2xlYXI9Vm4sVGUucHJvdG90eXBlLmRlbGV0ZT1GbixUZS5wcm90b3R5cGUuZ2V0PUJuLFRlLnByb3RvdHlwZS5oYXM9eG4sVGUucHJvdG90eXBlLnNldD1OaTtmdW5jdGlvbiBWaSh0LHIpe2Zvcih2YXIgZT0tMSxzPXQ9PW51bGw/MDp0Lmxlbmd0aDsrK2U8cyYmcih0W2VdLGUsdCkhPT0hMTspO3JldHVybiB0fXZhciBGaT1mdW5jdGlvbigpe3RyeXt2YXIgdD11ZShPYmplY3QsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIHQoe30sIiIse30pLHR9Y2F0Y2gocil7fX0oKSwkcj1GaTtmdW5jdGlvbiBIcih0LHIsZSl7cj09Il9fcHJvdG9fXyImJiRyPyRyKHQscix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZSx3cml0YWJsZTohMH0pOnRbcl09ZX12YXIgQmk9T2JqZWN0LnByb3RvdHlwZSx4aT1CaS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBLcih0LHIsZSl7dmFyIHM9dFtyXTsoISh4aS5jYWxsKHQscikmJlZyKHMsZSkpfHxlPT09dm9pZCAwJiYhKHIgaW4gdCkpJiZIcih0LHIsZSl9ZnVuY3Rpb24gdnQodCxyLGUscyl7dmFyIG49IWU7ZXx8KGU9e30pO2Zvcih2YXIgaT0tMSxhPXIubGVuZ3RoOysraTxhOyl7dmFyIGQ9cltpXSxvPXM/cyhlW2RdLHRbZF0sZCxlLHQpOnZvaWQgMDtvPT09dm9pZCAwJiYobz10W2RdKSxuP0hyKGUsZCxvKTpLcihlLGQsbyl9cmV0dXJuIGV9ZnVuY3Rpb24gamkodCxyKXtmb3IodmFyIGU9LTEscz1BcnJheSh0KTsrK2U8dDspc1tlXT1yKGUpO3JldHVybiBzfWZ1bmN0aW9uIExlKHQpe3JldHVybiB0IT1udWxsJiZ0eXBlb2YgdD09Im9iamVjdCJ9dmFyIFVpPSJbb2JqZWN0IEFyZ3VtZW50c10iO2Z1bmN0aW9uIFdyKHQpe3JldHVybiBMZSh0KSYmQWUodCk9PVVpfXZhciB6cj1PYmplY3QucHJvdG90eXBlLCRpPXpyLmhhc093blByb3BlcnR5LEhpPXpyLnByb3BlcnR5SXNFbnVtZXJhYmxlLEtpPVdyKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/V3I6ZnVuY3Rpb24odCl7cmV0dXJuIExlKHQpJiYkaS5jYWxsKHQsImNhbGxlZSIpJiYhSGkuY2FsbCh0LCJjYWxsZWUiKX0sR3I9S2ksV2k9QXJyYXkuaXNBcnJheSx5dD1XaTtmdW5jdGlvbiB6aSgpe3JldHVybiExfXZhciBxcj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLFlyPXFyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsR2k9WXImJllyLmV4cG9ydHM9PT1xcixRcj1HaT9YLkJ1ZmZlcjp2b2lkIDAscWk9UXI/UXIuaXNCdWZmZXI6dm9pZCAwLFlpPXFpfHx6aSxPdD1ZaSxRaT05MDA3MTk5MjU0NzQwOTkxLEppPS9eKD86MHxbMS05XVxkKikkLztmdW5jdGlvbiBYaSh0LHIpe3ZhciBlPXR5cGVvZiB0O3JldHVybiByPXI9PW51bGw/UWk6ciwhIXImJihlPT0ibnVtYmVyInx8ZSE9InN5bWJvbCImJkppLnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8cn12YXIgWmk9OTAwNzE5OTI1NDc0MDk5MTtmdW5jdGlvbiBKcih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiJiZ0Pi0xJiZ0JTE9PTAmJnQ8PVppfXZhciBlYT0iW29iamVjdCBBcmd1bWVudHNdIix0YT0iW29iamVjdCBBcnJheV0iLHJhPSJbb2JqZWN0IEJvb2xlYW5dIixzYT0iW29iamVjdCBEYXRlXSIsbmE9IltvYmplY3QgRXJyb3JdIixpYT0iW29iamVjdCBGdW5jdGlvbl0iLGFhPSJbb2JqZWN0IE1hcF0iLG9hPSJbb2JqZWN0IE51bWJlcl0iLGNhPSJbb2JqZWN0IE9iamVjdF0iLGRhPSJbb2JqZWN0IFJlZ0V4cF0iLGxhPSJbb2JqZWN0IFNldF0iLHVhPSJbb2JqZWN0IFN0cmluZ10iLHBhPSJbb2JqZWN0IFdlYWtNYXBdIixoYT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLGZhPSJbb2JqZWN0IERhdGFWaWV3XSIsbWE9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsZ2E9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsU2E9IltvYmplY3QgSW50OEFycmF5XSIsdmE9IltvYmplY3QgSW50MTZBcnJheV0iLHlhPSJbb2JqZWN0IEludDMyQXJyYXldIixiYT0iW29iamVjdCBVaW50OEFycmF5XSIsRWE9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixfYT0iW29iamVjdCBVaW50MTZBcnJheV0iLFRhPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsQj17fTtCW21hXT1CW2dhXT1CW1NhXT1CW3ZhXT1CW3lhXT1CW2JhXT1CW0VhXT1CW19hXT1CW1RhXT0hMCxCW2VhXT1CW3RhXT1CW2hhXT1CW3JhXT1CW2ZhXT1CW3NhXT1CW25hXT1CW2lhXT1CW2FhXT1CW29hXT1CW2NhXT1CW2RhXT1CW2xhXT1CW3VhXT1CW3BhXT0hMTtmdW5jdGlvbiBSYSh0KXtyZXR1cm4gTGUodCkmJkpyKHQubGVuZ3RoKSYmISFCW0FlKHQpXX1mdW5jdGlvbiBMdCh0KXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQocil9fXZhciBYcj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLERlPVhyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsUGE9RGUmJkRlLmV4cG9ydHM9PT1YcixEdD1QYSYmRnIucHJvY2VzcyxDYT1mdW5jdGlvbigpe3RyeXt2YXIgdD1EZSYmRGUucmVxdWlyZSYmRGUucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiB0fHxEdCYmRHQuYmluZGluZyYmRHQuYmluZGluZygidXRpbCIpfWNhdGNoKHIpe319KCksUmU9Q2EsWnI9UmUmJlJlLmlzVHlwZWRBcnJheSxJYT1acj9MdChacik6UmEsZXM9SWEsd2E9T2JqZWN0LnByb3RvdHlwZSxBYT13YS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiB0cyh0LHIpe3ZhciBlPXl0KHQpLHM9IWUmJkdyKHQpLG49IWUmJiFzJiZPdCh0KSxpPSFlJiYhcyYmIW4mJmVzKHQpLGE9ZXx8c3x8bnx8aSxkPWE/amkodC5sZW5ndGgsU3RyaW5nKTpbXSxvPWQubGVuZ3RoO2Zvcih2YXIgbCBpbiB0KShyfHxBYS5jYWxsKHQsbCkpJiYhKGEmJihsPT0ibGVuZ3RoInx8biYmKGw9PSJvZmZzZXQifHxsPT0icGFyZW50Iil8fGkmJihsPT0iYnVmZmVyInx8bD09ImJ5dGVMZW5ndGgifHxsPT0iYnl0ZU9mZnNldCIpfHxYaShsLG8pKSkmJmQucHVzaChsKTtyZXR1cm4gZH12YXIgTWE9T2JqZWN0LnByb3RvdHlwZTtmdW5jdGlvbiBidCh0KXt2YXIgcj10JiZ0LmNvbnN0cnVjdG9yLGU9dHlwZW9mIHI9PSJmdW5jdGlvbiImJnIucHJvdG90eXBlfHxNYTtyZXR1cm4gdD09PWV9ZnVuY3Rpb24gcnModCxyKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQocihlKSl9fXZhciBrYT1ycyhPYmplY3Qua2V5cyxPYmplY3QpLE9hPWthLExhPU9iamVjdC5wcm90b3R5cGUsRGE9TGEuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gc3ModCl7aWYoIWJ0KHQpKXJldHVybiBPYSh0KTt2YXIgcj1bXTtmb3IodmFyIGUgaW4gT2JqZWN0KHQpKURhLmNhbGwodCxlKSYmZSE9ImNvbnN0cnVjdG9yIiYmci5wdXNoKGUpO3JldHVybiByfWZ1bmN0aW9uIE50KHQpe3JldHVybiB0IT1udWxsJiZKcih0Lmxlbmd0aCkmJiFqcih0KX1mdW5jdGlvbiBWdCh0KXtyZXR1cm4gTnQodCk/dHModCk6c3ModCl9ZnVuY3Rpb24gTmEodCxyKXtyZXR1cm4gdCYmdnQocixWdChyKSx0KX1mdW5jdGlvbiBWYSh0KXt2YXIgcj1bXTtpZih0IT1udWxsKWZvcih2YXIgZSBpbiBPYmplY3QodCkpci5wdXNoKGUpO3JldHVybiByfXZhciBGYT1PYmplY3QucHJvdG90eXBlLEJhPUZhLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIHhhKHQpe2lmKCFNZSh0KSlyZXR1cm4gVmEodCk7dmFyIHI9YnQodCksZT1bXTtmb3IodmFyIHMgaW4gdClzPT0iY29uc3RydWN0b3IiJiYocnx8IUJhLmNhbGwodCxzKSl8fGUucHVzaChzKTtyZXR1cm4gZX1mdW5jdGlvbiBGdCh0KXtyZXR1cm4gTnQodCk/dHModCwhMCk6eGEodCl9ZnVuY3Rpb24gamEodCxyKXtyZXR1cm4gdCYmdnQocixGdChyKSx0KX12YXIgbnM9dHlwZW9mIGV4cG9ydHM9PSJvYmplY3QiJiZleHBvcnRzJiYhZXhwb3J0cy5ub2RlVHlwZSYmZXhwb3J0cyxpcz1ucyYmdHlwZW9mIG1vZHVsZT09Im9iamVjdCImJm1vZHVsZSYmIW1vZHVsZS5ub2RlVHlwZSYmbW9kdWxlLFVhPWlzJiZpcy5leHBvcnRzPT09bnMsYXM9VWE/WC5CdWZmZXI6dm9pZCAwLG9zPWFzP2FzLmFsbG9jVW5zYWZlOnZvaWQgMDtmdW5jdGlvbiAkYSh0LHIpe2lmKHIpcmV0dXJuIHQuc2xpY2UoKTt2YXIgZT10Lmxlbmd0aCxzPW9zP29zKGUpOm5ldyB0LmNvbnN0cnVjdG9yKGUpO3JldHVybiB0LmNvcHkocyksc31mdW5jdGlvbiBIYSh0LHIpe3ZhciBlPS0xLHM9dC5sZW5ndGg7Zm9yKHJ8fChyPUFycmF5KHMpKTsrK2U8czspcltlXT10W2VdO3JldHVybiByfWZ1bmN0aW9uIEthKHQscil7Zm9yKHZhciBlPS0xLHM9dD09bnVsbD8wOnQubGVuZ3RoLG49MCxpPVtdOysrZTxzOyl7dmFyIGE9dFtlXTtyKGEsZSx0KSYmKGlbbisrXT1hKX1yZXR1cm4gaX1mdW5jdGlvbiBjcygpe3JldHVybltdfXZhciBXYT1PYmplY3QucHJvdG90eXBlLHphPVdhLnByb3BlcnR5SXNFbnVtZXJhYmxlLGRzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsR2E9ZHM/ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PW51bGw/W106KHQ9T2JqZWN0KHQpLEthKGRzKHQpLGZ1bmN0aW9uKHIpe3JldHVybiB6YS5jYWxsKHQscil9KSl9OmNzLEJ0PUdhO2Z1bmN0aW9uIHFhKHQscil7cmV0dXJuIHZ0KHQsQnQodCkscil9ZnVuY3Rpb24gbHModCxyKXtmb3IodmFyIGU9LTEscz1yLmxlbmd0aCxuPXQubGVuZ3RoOysrZTxzOyl0W24rZV09cltlXTtyZXR1cm4gdH12YXIgWWE9cnMoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCksdXM9WWEsUWE9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxKYT1RYT9mdW5jdGlvbih0KXtmb3IodmFyIHI9W107dDspbHMocixCdCh0KSksdD11cyh0KTtyZXR1cm4gcn06Y3MscHM9SmE7ZnVuY3Rpb24gWGEodCxyKXtyZXR1cm4gdnQodCxwcyh0KSxyKX1mdW5jdGlvbiBocyh0LHIsZSl7dmFyIHM9cih0KTtyZXR1cm4geXQodCk/czpscyhzLGUodCkpfWZ1bmN0aW9uIFphKHQpe3JldHVybiBocyh0LFZ0LEJ0KX1mdW5jdGlvbiBlbyh0KXtyZXR1cm4gaHModCxGdCxwcyl9dmFyIHRvPXVlKFgsIkRhdGFWaWV3IikseHQ9dG8scm89dWUoWCwiUHJvbWlzZSIpLGp0PXJvLHNvPXVlKFgsIlNldCIpLFV0PXNvLG5vPXVlKFgsIldlYWtNYXAiKSwkdD1ubyxmcz0iW29iamVjdCBNYXBdIixpbz0iW29iamVjdCBPYmplY3RdIixtcz0iW29iamVjdCBQcm9taXNlXSIsZ3M9IltvYmplY3QgU2V0XSIsU3M9IltvYmplY3QgV2Vha01hcF0iLHZzPSJbb2JqZWN0IERhdGFWaWV3XSIsYW89bGUoeHQpLG9vPWxlKGtlKSxjbz1sZShqdCksbG89bGUoVXQpLHVvPWxlKCR0KSxoZT1BZTsoeHQmJmhlKG5ldyB4dChuZXcgQXJyYXlCdWZmZXIoMSkpKSE9dnN8fGtlJiZoZShuZXcga2UpIT1mc3x8anQmJmhlKGp0LnJlc29sdmUoKSkhPW1zfHxVdCYmaGUobmV3IFV0KSE9Z3N8fCR0JiZoZShuZXcgJHQpIT1TcykmJihoZT1mdW5jdGlvbih0KXt2YXIgcj1BZSh0KSxlPXI9PWlvP3QuY29uc3RydWN0b3I6dm9pZCAwLHM9ZT9sZShlKToiIjtpZihzKXN3aXRjaChzKXtjYXNlIGFvOnJldHVybiB2cztjYXNlIG9vOnJldHVybiBmcztjYXNlIGNvOnJldHVybiBtcztjYXNlIGxvOnJldHVybiBncztjYXNlIHVvOnJldHVybiBTc31yZXR1cm4gcn0pO3ZhciBFdD1oZSxwbz1PYmplY3QucHJvdG90eXBlLGhvPXBvLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGZvKHQpe3ZhciByPXQubGVuZ3RoLGU9bmV3IHQuY29uc3RydWN0b3Iocik7cmV0dXJuIHImJnR5cGVvZiB0WzBdPT0ic3RyaW5nIiYmaG8uY2FsbCh0LCJpbmRleCIpJiYoZS5pbmRleD10LmluZGV4LGUuaW5wdXQ9dC5pbnB1dCksZX12YXIgbW89WC5VaW50OEFycmF5LHlzPW1vO2Z1bmN0aW9uIEh0KHQpe3ZhciByPW5ldyB0LmNvbnN0cnVjdG9yKHQuYnl0ZUxlbmd0aCk7cmV0dXJuIG5ldyB5cyhyKS5zZXQobmV3IHlzKHQpKSxyfWZ1bmN0aW9uIGdvKHQscil7dmFyIGU9cj9IdCh0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKGUsdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aCl9dmFyIFNvPS9cdyokLztmdW5jdGlvbiB2byh0KXt2YXIgcj1uZXcgdC5jb25zdHJ1Y3Rvcih0LnNvdXJjZSxTby5leGVjKHQpKTtyZXR1cm4gci5sYXN0SW5kZXg9dC5sYXN0SW5kZXgscn12YXIgYnM9RWU/RWUucHJvdG90eXBlOnZvaWQgMCxFcz1icz9icy52YWx1ZU9mOnZvaWQgMDtmdW5jdGlvbiB5byh0KXtyZXR1cm4gRXM/T2JqZWN0KEVzLmNhbGwodCkpOnt9fWZ1bmN0aW9uIGJvKHQscil7dmFyIGU9cj9IdCh0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKGUsdC5ieXRlT2Zmc2V0LHQubGVuZ3RoKX12YXIgRW89IltvYmplY3QgQm9vbGVhbl0iLF9vPSJbb2JqZWN0IERhdGVdIixUbz0iW29iamVjdCBNYXBdIixSbz0iW29iamVjdCBOdW1iZXJdIixQbz0iW29iamVjdCBSZWdFeHBdIixDbz0iW29iamVjdCBTZXRdIixJbz0iW29iamVjdCBTdHJpbmddIix3bz0iW29iamVjdCBTeW1ib2xdIixBbz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLE1vPSJbb2JqZWN0IERhdGFWaWV3XSIsa289IltvYmplY3QgRmxvYXQzMkFycmF5XSIsT289IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsTG89IltvYmplY3QgSW50OEFycmF5XSIsRG89IltvYmplY3QgSW50MTZBcnJheV0iLE5vPSJbb2JqZWN0IEludDMyQXJyYXldIixWbz0iW29iamVjdCBVaW50OEFycmF5XSIsRm89IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixCbz0iW29iamVjdCBVaW50MTZBcnJheV0iLHhvPSJbb2JqZWN0IFVpbnQzMkFycmF5XSI7ZnVuY3Rpb24gam8odCxyLGUpe3ZhciBzPXQuY29uc3RydWN0b3I7c3dpdGNoKHIpe2Nhc2UgQW86cmV0dXJuIEh0KHQpO2Nhc2UgRW86Y2FzZSBfbzpyZXR1cm4gbmV3IHMoK3QpO2Nhc2UgTW86cmV0dXJuIGdvKHQsZSk7Y2FzZSBrbzpjYXNlIE9vOmNhc2UgTG86Y2FzZSBEbzpjYXNlIE5vOmNhc2UgVm86Y2FzZSBGbzpjYXNlIEJvOmNhc2UgeG86cmV0dXJuIGJvKHQsZSk7Y2FzZSBUbzpyZXR1cm4gbmV3IHM7Y2FzZSBSbzpjYXNlIElvOnJldHVybiBuZXcgcyh0KTtjYXNlIFBvOnJldHVybiB2byh0KTtjYXNlIENvOnJldHVybiBuZXcgcztjYXNlIHdvOnJldHVybiB5byh0KX19dmFyIF9zPU9iamVjdC5jcmVhdGUsVW89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiBmdW5jdGlvbihyKXtpZighTWUocikpcmV0dXJue307aWYoX3MpcmV0dXJuIF9zKHIpO3QucHJvdG90eXBlPXI7dmFyIGU9bmV3IHQ7cmV0dXJuIHQucHJvdG90eXBlPXZvaWQgMCxlfX0oKSwkbz1VbztmdW5jdGlvbiBIbyh0KXtyZXR1cm4gdHlwZW9mIHQuY29uc3RydWN0b3I9PSJmdW5jdGlvbiImJiFidCh0KT8kbyh1cyh0KSk6e319dmFyIEtvPSJbb2JqZWN0IE1hcF0iO2Z1bmN0aW9uIFdvKHQpe3JldHVybiBMZSh0KSYmRXQodCk9PUtvfXZhciBUcz1SZSYmUmUuaXNNYXAsem89VHM/THQoVHMpOldvLEdvPXpvLHFvPSJbb2JqZWN0IFNldF0iO2Z1bmN0aW9uIFlvKHQpe3JldHVybiBMZSh0KSYmRXQodCk9PXFvfXZhciBScz1SZSYmUmUuaXNTZXQsUW89UnM/THQoUnMpOllvLEpvPVFvLFhvPTEsWm89MixlYz00LFBzPSJbb2JqZWN0IEFyZ3VtZW50c10iLHRjPSJbb2JqZWN0IEFycmF5XSIscmM9IltvYmplY3QgQm9vbGVhbl0iLHNjPSJbb2JqZWN0IERhdGVdIixuYz0iW29iamVjdCBFcnJvcl0iLENzPSJbb2JqZWN0IEZ1bmN0aW9uXSIsaWM9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixhYz0iW29iamVjdCBNYXBdIixvYz0iW29iamVjdCBOdW1iZXJdIixJcz0iW29iamVjdCBPYmplY3RdIixjYz0iW29iamVjdCBSZWdFeHBdIixkYz0iW29iamVjdCBTZXRdIixsYz0iW29iamVjdCBTdHJpbmddIix1Yz0iW29iamVjdCBTeW1ib2xdIixwYz0iW29iamVjdCBXZWFrTWFwXSIsaGM9IltvYmplY3QgQXJyYXlCdWZmZXJdIixmYz0iW29iamVjdCBEYXRhVmlld10iLG1jPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLGdjPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLFNjPSJbb2JqZWN0IEludDhBcnJheV0iLHZjPSJbb2JqZWN0IEludDE2QXJyYXldIix5Yz0iW29iamVjdCBJbnQzMkFycmF5XSIsYmM9IltvYmplY3QgVWludDhBcnJheV0iLEVjPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsX2M9IltvYmplY3QgVWludDE2QXJyYXldIixUYz0iW29iamVjdCBVaW50MzJBcnJheV0iLEY9e307RltQc109Rlt0Y109RltoY109RltmY109RltyY109RltzY109RlttY109RltnY109RltTY109Rlt2Y109Rlt5Y109RlthY109RltvY109RltJc109RltjY109RltkY109RltsY109Rlt1Y109RltiY109RltFY109RltfY109RltUY109ITAsRltuY109RltDc109RltwY109ITE7ZnVuY3Rpb24gX3QodCxyLGUscyxuLGkpe3ZhciBhLGQ9ciZYbyxvPXImWm8sbD1yJmVjO2lmKGUmJihhPW4/ZSh0LHMsbixpKTplKHQpKSxhIT09dm9pZCAwKXJldHVybiBhO2lmKCFNZSh0KSlyZXR1cm4gdDt2YXIgZj15dCh0KTtpZihmKXtpZihhPWZvKHQpLCFkKXJldHVybiBIYSh0LGEpfWVsc2V7dmFyIHY9RXQodCksRT12PT1Dc3x8dj09aWM7aWYoT3QodCkpcmV0dXJuICRhKHQsZCk7aWYodj09SXN8fHY9PVBzfHxFJiYhbil7aWYoYT1vfHxFP3t9OkhvKHQpLCFkKXJldHVybiBvP1hhKHQsamEoYSx0KSk6cWEodCxOYShhLHQpKX1lbHNle2lmKCFGW3ZdKXJldHVybiBuP3Q6e307YT1qbyh0LHYsZCl9fWl8fChpPW5ldyBUZSk7dmFyIHc9aS5nZXQodCk7aWYodylyZXR1cm4gdztpLnNldCh0LGEpLEpvKHQpP3QuZm9yRWFjaChmdW5jdGlvbihMKXthLmFkZChfdChMLHIsZSxMLHQsaSkpfSk6R28odCkmJnQuZm9yRWFjaChmdW5jdGlvbihMLEgpe2Euc2V0KEgsX3QoTCxyLGUsSCx0LGkpKX0pO3ZhciB4PWw/bz9lbzpaYTpvP0Z0OlZ0LFU9Zj92b2lkIDA6eCh0KTtyZXR1cm4gVmkoVXx8dCxmdW5jdGlvbihMLEgpe1UmJihIPUwsTD10W0hdKSxLcihhLEgsX3QoTCxyLGUsSCx0LGkpKX0pLGF9dmFyIFJjPTEsUGM9NDtmdW5jdGlvbiBDYyh0KXtyZXR1cm4gX3QodCxSY3xQYyl9dmFyIHdzPSJoWGdVOFdjOHB3dUdOcTltczVxOUhoIjt0eXBlb2YgcHJvY2VzcyE9InVuZGVmaW5lZCImJihYcz1wcm9jZXNzPT1udWxsP3ZvaWQgMDpwcm9jZXNzLmVudikhPW51bGwmJlhzLkZMQUdTTUlUSF9FTlZJUk9OTUVOVF9LRVkmJih3cz1wcm9jZXNzLmVudi5GTEFHU01JVEhfRU5WSVJPTk1FTlRfS0VZKTtmdW5jdGlvbiBJYyh0PVtdKXtjb25zdCByPXt9O3JldHVybiB0LmZvckVhY2goZT0+e3JbZS5mZWF0dXJlLm5hbWVdPXtlbmFibGVkOmUuZW5hYmxlZCx2YWx1ZTplLmZlYXR1cmVfc3RhdGVfdmFsdWV9fSkscn12YXIgd2M9Y2xhc3N7Y29uc3RydWN0b3IodD13cyl7cCh0aGlzLCJmbGFncyIse30pO3AodGhpcywiZW52aXJvbm1lbnRLZXkiLG51bGwpO3RoaXMuZW52aXJvbm1lbnRLZXk9dH1pZGVudGlmeUFuZEZldGNoRmxhZ3NXaXRoUmV0cnkoZCl7cmV0dXJuIEkodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKHtwcmltYXJ5RW5kcG9pbnQ6dCxzZWNvbmRhcnlFbmRwb2ludDpyLGZvcmNlRXZhbHVhdGU6ZSx0aW1lb3V0OnMsdW5pcXVlSWRlbnRpZmllcjpuLHRyYWl0c09iajppLGxvZ2dlcjphfSl7Y29uc3Qgbz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGkpKSxsPU9iamVjdC5lbnRyaWVzKG8pLm1hcCh2PT4oe3RyYWl0X2tleTp2WzBdLHRyYWl0X3ZhbHVlOnZbMV19KSksZj1bdCxyLHJdO2Zvcihjb25zdCB2IG9mIGYpdHJ5e2NvbnN0IEU9bmV3IEFib3J0Q29udHJvbGxlcix3PXNldFRpbWVvdXQoKCk9PkUuYWJvcnQoKSxzKSx4PWBfJHsoTWF0aC5yYW5kb20oKSsxKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIpfWAsVT15aWVsZCBmZXRjaChgaHR0cHM6Ly8ke3Z9L2FwaS92MS9pZGVudGl0aWVzL2Ase21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24iLCJYLUVudmlyb25tZW50LUtleSI6dGhpcy5lbnZpcm9ubWVudEtleX0sYm9keTpKU09OLnN0cmluZ2lmeSh7aWRlbnRpZmllcjpuKyhlP3g6IiIpLHRyYWl0czpsfSksc2lnbmFsOkUuc2lnbmFsfSk7aWYoY2xlYXJUaW1lb3V0KHcpLCFVLm9rKXRocm93IG5ldyBFcnJvcihgUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgJHtVLnN0YXR1c31gKTtjb25zdCBMPXlpZWxkIFUuanNvbigpO3JldHVybiBJYyhMLmZsYWdzfHxbXSl9Y2F0Y2goRSl7YS5lcnJvcigiRmxhZ3NtaXRoIGlkZW50aWZ5IGZhaWxlZCEhIix7ZXJyb3I6RSx1cmw6dn0pfXJldHVybnt9fSl9aWRlbnRpZnkoYSl7cmV0dXJuIEkodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKHQscj17fSxlPSExLHM9NWUzLG49ImVkZ2UuYXBpLmZsYWdzbWl0aC5jb20iLGk9Y29uc29sZSl7cmV0dXJuIHRoaXMuZmxhZ3M9eWllbGQgdGhpcy5pZGVudGlmeUFuZEZldGNoRmxhZ3NXaXRoUmV0cnkoe3RyYWl0c09iajpyLHVuaXF1ZUlkZW50aWZpZXI6dCxmb3JjZUV2YWx1YXRlOmUsdGltZW91dDpzLHByaW1hcnlFbmRwb2ludDpuLHNlY29uZGFyeUVuZHBvaW50OiJlZGdlLmFwaS5mbGFnc21pdGguY29tIixsb2dnZXI6aX0pLHRoaXMuZmxhZ3N9KX1nZXRWYWx1ZSh0KXtyZXR1cm4gdGhpcy5mbGFncyYmdGhpcy5mbGFnc1t0XSYmdGhpcy5mbGFnc1t0XS52YWx1ZX1oYXNGZWF0dXJlKHQpe3JldHVybiB0aGlzLmZsYWdzJiZ0aGlzLmZsYWdzW3RdJiZ0aGlzLmZsYWdzW3RdLmVuYWJsZWR9Z2V0QWxsRmxhZ3MoKXtyZXR1cm4gdGhpcy5mbGFnc319O2Z1bmN0aW9uIEFjKHQpe3JldHVybiBuZXcgd2ModCl9dmFyIEFzPVstMiwtMSwwLDEsMl0sTWM9WzAsMSwyLDMsNF07ZnVuY3Rpb24ga2ModCl7dD10LnRyaW0oKTtsZXQgcj0iMCIsZT0iMCIscz0iMCI7cmV0dXJuIHQubGVuZ3RoPT00PyhyPWAweCR7dFsxXX0ke3RbMV19YCxlPWAweCR7dFsyXX0ke3RbMl19YCxzPWAweCR7dFszXX0ke3RbM119YCk6dC5sZW5ndGg+NiYmKHI9YDB4JHt0WzFdfSR7dFsyXX1gLGU9YDB4JHt0WzNdfSR7dFs0XX1gLHM9YDB4JHt0WzVdfSR7dFs2XX1gKSxbK3IsK2UsK3NdfXZhciBPYz0odCxyLGUpPT57bGV0IHMsbixpO2lmKHI9PTApcz1uPWk9ZTtlbHNle2NvbnN0IGE9KGwsZix2KT0+KHY8MCYmKHYrPTEpLHY+MSYmKHYtPTEpLHY8LjE2NjY2NjY2NjY2NjY2NjY2P2wrKGYtbCkqNip2OnY8LjU/Zjp2PC42NjY2NjY2NjY2NjY2NjY2P2wrKGYtbCkqKC42NjY2NjY2NjY2NjY2NjY2LXYpKjY6bCksZD1lPC41P2UqKDErcik6ZStyLWUqcixvPTIqZS1kO3M9YShvLGQsdCsxLzMpLG49YShvLGQsdCksaT1hKG8sZCx0LTEvMyl9cmV0dXJuW01hdGgucm91bmQocyoyNTUpLE1hdGgucm91bmQobioyNTUpLE1hdGgucm91bmQoaSoyNTUpXX0sTGM9KHQscixlKT0+e3QvPTI1NSxyLz0yNTUsZS89MjU1O2NvbnN0IHM9TWF0aC5tYXgodCxyLGUpLG49TWF0aC5taW4odCxyLGUpO2xldCBpLGE7Y29uc3QgZD0ocytuKS8yO2lmKHM9PW4paT1hPTA7ZWxzZXtjb25zdCBvPXMtbjtzd2l0Y2goYT1kPi41P28vKDItcy1uKTpvLyhzK24pLHMpe2Nhc2UgdDppPShyLWUpL28rKHI8ZT82OjApO2JyZWFrO2Nhc2UgcjppPShlLXQpL28rMjticmVhaztjYXNlIGU6aT0odC1yKS9vKzQ7YnJlYWt9aS89Nn1yZXR1cm5baSxhLGRdfSxEYz0odCxyLGUpPT57Y29uc3Qgcz1uPT5uLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIik7cmV0dXJuYCMke3ModCl9JHtzKHIpfSR7cyhlKX1gfSxNcz0odCxyPUFzLGU9LjQpPT57Y29uc3Qgcz1bXSxbbixpLGFdPWtjKHQpLFtkLG8sbF09TGMobixpLGEpLGY9TWF0aC5yb3VuZChsKjEwMCk7Zj43MD9lPS44OmY+NjA/ZT0uOTpmPDEwP2U9LjA3NTpmPDQyJiYoZT0uMyk7Y29uc3Qgdj1yLmZpbmRJbmRleChMPT5MPT09MCk7aWYodj09PS0xKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCByZWR1Y2VyIHByb3ZpZGVkLCBpdCBtdXN0IGNvbnRhaW4gYXRsZWFzdCBvbmUgemVybyIpO2NvbnN0IEU9NS12LHc9disxLHg9KDEwMC1mKS9FLFU9Zi93O2Zvcihjb25zdCBMIG9mIHIpe2xldCBIO0w8MD9IPWYrTCpVKmU6TD4wP0g9ZitMKngqZTpIPWY7Y29uc3RbWix2ZSx5ZV09T2MoZCxvLEgvMTAwKTtzLnB1c2goRGMoWix2ZSx5ZSkpfXJldHVybiBzfSxrcz17ZGFyazp7YmFja2dyb3VuZDp7MWUzOiIjMjUyNTI1Iiw5MDA6IiMyRjJGMkYiLDgwMDoiIzMyMzIzMiIsNzAwOiIjM0UzRTNFIiw2MDA6IiM0QTRBNEEifSx0ZXh0OiIjRjVGNUY1IiwidmlkZW8tYmciOiIjMUMxQzFDIn0sbGlnaHQ6e2JhY2tncm91bmQ6ezFlMzoiI0ZGRkZGRiIsOTAwOiIjRjVGNUY1Iiw4MDA6IiNFQkVCRUIiLDcwMDoiI0UwRTBFMCIsNjAwOiIjRDZENkQ2In0sdGV4dDoiIzExMTExMSIsInRleHQtb24tYnJhbmQiOiIjZmZmZmZmIiwidmlkZW8tYmciOiIjREFEQURBIn19LE5jPXQ9Pntjb25zdFtyLGUscyxuLGldPU1zKHQsQXMpO3JldHVybnszMDA6ciw0MDA6ZSw1MDA6cyw2MDA6biw3MDA6aX19LFZjPXQ9PntpZih0PT09IiNGRkZGRkYiKXJldHVybiBrcy5saWdodC5iYWNrZ3JvdW5kO2lmKHQ9PT0iIzAwMDAwMCIpcmV0dXJuIGtzLmRhcmsuYmFja2dyb3VuZDtjb25zdFtyLGUscyxuLGldPU1zKHQsTWMpO3JldHVybnsxZTM6ciw5MDA6ZSw4MDA6cyw3MDA6biw2MDA6aX19LEZjPXtib3JkZXJfcmFkaXVzOiJyb3VuZGVkIixib3JkZXJfd2lkdGg6InRoaW4iLHNwYWNpbmdfYmFzZTo0LHRoZW1lOiJkYXJrIixjb2xvcnM6e2JyYW5kOk5jKCIjMjE2MEZEIiksYmFja2dyb3VuZDpWYygiIzE0MTQxNCIpLGRhbmdlcjoiI0ZGMkQyRCIsdGV4dDoiI0VFRUVFRSIsdGV4dF9vbl9icmFuZDoiI0VFRUVFRSIsc3VjY2VzczoiIzYyQTUwNCIsdmlkZW9fYmc6IiMxOTE5MTkiLHdhcm5pbmc6IiNGRkNEMDcifX07ZnVuY3Rpb24gT3MoKXtyZXR1cm4gQ2MoRmMpfU9zKCksT3MoKTtjbGFzcyBCY3tjb25zdHJ1Y3Rvcigpe0l0KHRoaXMsRmUsdm9pZCAwKX1nZXQgdGVsZW1ldHJ5KCl7dmFyIHI7cmV0dXJuKHI9ZWUodGhpcyxGZSkpPT1udWxsP3ZvaWQgMDpyLmdldFZhbHVlKCJ0ZWxlbWV0cnkiKX1pbml0KHIpe0NlKHRoaXMsRmUscil9aW5mbyhyLGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLHIsZSxzKX1lcnJvcihyLGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oImVycm9yIixyLGUscyl9ZGVidWcocixlLHMpe3ZhciBuOyhuPXRoaXMudGVsZW1ldHJ5KT09bnVsbHx8bi5hZGRMb2dJbkN1cnJlbnRTcGFuKCJkZWJ1ZyIscixlLHMpfWxvZyhyLGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oImxvZyIscixlLHMpfXdhcm4ocixlLHMpe3ZhciBuOyhuPXRoaXMudGVsZW1ldHJ5KT09bnVsbHx8bi5hZGRMb2dJbkN1cnJlbnRTcGFuKCJ3YXJuIixyLGUscyl9fUZlPW5ldyBXZWFrTWFwO2NvbnN0IHRyPWNsYXNzIGV4dGVuZHMgcS5FdmVudEVtaXR0ZXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoKTtJdCh0aGlzLG5lLHZvaWQgMCk7SXQodGhpcyxpZSx2b2lkIDApO3AodGhpcywiYXN5bmNQcm9taXNlVGltZW91dCIpO3AodGhpcywibG9nZ2VyIik7dGhpcy5sb2dnZXI9ZSxDZSh0aGlzLG5lLG5ldyBNYXApLENlKHRoaXMsaWUsbmV3IE1hcCksdGhpcy5hc3luY1Byb21pc2VUaW1lb3V0PThlM31lbWl0QXN5bmMoZSwuLi5zKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7ZWUodGhpcyxuZSkuc2V0KGUsW10pO2NvbnN0IG49ZWUodGhpcyxpZSkuZ2V0KGUpLm1hcCgoKT0+bmV3IFByb21pc2UoaT0+e2VlKHRoaXMsbmUpLmdldChlKS5wdXNoKGkpfSkpO3RuKHRyLnByb3RvdHlwZSx0aGlzLCJlbWl0IikuY2FsbCh0aGlzLGUsLi4ucykseWllbGQgUHJvbWlzZS5yYWNlKFtQcm9taXNlLmFsbChuKSxuZXcgUHJvbWlzZSgoaSxhKT0+c2V0VGltZW91dCgoKT0+YShuZXcgRXJyb3IoYGVtaXRBc3luYyBmYWlsZWQgdG8gcmVzb2x2ZSBmb3IgZXZlbnQgJHtlfS5gKSksdGhpcy5hc3luY1Byb21pc2VUaW1lb3V0KSldKSxlZSh0aGlzLG5lKS5kZWxldGUoZSl9KX1vbkFzeW5jKGUscyl7Y29uc3Qgbj1lZSh0aGlzLG5lKSxpPSguLi5hKT0+SSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIG87dHJ5e3lpZWxkIHMoLi4uYSl9Y2F0Y2gobCl7dGhpcy5sb2dnZXIuZXJyb3IoIltvbkFzeW5jXSIse2Vycm9yOmx9KX1jb25zdCBkPShvPW4uZ2V0KGUpKT09bnVsbD92b2lkIDA6by5zaGlmdCgpO2Q9PW51bGx8fGQoKX0pO3JldHVybiBlZSh0aGlzLGllKS5nZXQoZSl8fGVlKHRoaXMsaWUpLnNldChlLFtdKSxlZSh0aGlzLGllKS5nZXQoZSkucHVzaChpKSxzdXBlci5vbihlLGkpfXJlc2V0KCl7Q2UodGhpcyxuZSxuZXcgTWFwKSxDZSh0aGlzLGllLG5ldyBNYXApLHN1cGVyLnJlbW92ZUFsbExpc3RlbmVycygpfX07bGV0IEt0PXRyO25lPW5ldyBXZWFrTWFwLGllPW5ldyBXZWFrTWFwO3ZhciBUdCx4Yz1uZXcgVWludDhBcnJheSgxNik7ZnVuY3Rpb24gamMoKXtpZighVHQmJihUdD10eXBlb2YgY3J5cHRvIT0idW5kZWZpbmVkIiYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byl8fHR5cGVvZiBtc0NyeXB0byE9InVuZGVmaW5lZCImJnR5cGVvZiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXM9PSJmdW5jdGlvbiImJm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKSwhVHQpKXRocm93IG5ldyBFcnJvcigiY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWQiKTtyZXR1cm4gVHQoeGMpfXZhciBVYz0vXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7ZnVuY3Rpb24gJGModCl7cmV0dXJuIHR5cGVvZiB0PT0ic3RyaW5nIiYmVWMudGVzdCh0KX1mb3IodmFyIFc9W10sV3Q9MDtXdDwyNTY7KytXdClXLnB1c2goKFd0KzI1NikudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7ZnVuY3Rpb24gSGModCl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOjAsZT0oV1t0W3IrMF1dK1dbdFtyKzFdXStXW3RbcisyXV0rV1t0W3IrM11dKyItIitXW3Rbcis0XV0rV1t0W3IrNV1dKyItIitXW3Rbcis2XV0rV1t0W3IrN11dKyItIitXW3Rbcis4XV0rV1t0W3IrOV1dKyItIitXW3RbcisxMF1dK1dbdFtyKzExXV0rV1t0W3IrMTJdXStXW3RbcisxM11dK1dbdFtyKzE0XV0rV1t0W3IrMTVdXSkudG9Mb3dlckNhc2UoKTtpZighJGMoZSkpdGhyb3cgVHlwZUVycm9yKCJTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBLYyh0LHIsZSl7dD10fHx7fTt2YXIgcz10LnJhbmRvbXx8KHQucm5nfHxqYykoKTtpZihzWzZdPXNbNl0mMTV8NjQsc1s4XT1zWzhdJjYzfDEyOCxyKXtlPWV8fDA7Zm9yKHZhciBuPTA7bjwxNjsrK24pcltlK25dPXNbbl07cmV0dXJuIHJ9cmV0dXJuIEhjKHMpfXZhciBXYz0iW29iamVjdCBNYXBdIix6Yz0iW29iamVjdCBTZXRdIixHYz1PYmplY3QucHJvdG90eXBlLHFjPUdjLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFljKHQpe2lmKHQ9PW51bGwpcmV0dXJuITA7aWYoTnQodCkmJih5dCh0KXx8dHlwZW9mIHQ9PSJzdHJpbmcifHx0eXBlb2YgdC5zcGxpY2U9PSJmdW5jdGlvbiJ8fE90KHQpfHxlcyh0KXx8R3IodCkpKXJldHVybiF0Lmxlbmd0aDt2YXIgcj1FdCh0KTtpZihyPT1XY3x8cj09emMpcmV0dXJuIXQuc2l6ZTtpZihidCh0KSlyZXR1cm4hc3ModCkubGVuZ3RoO2Zvcih2YXIgZSBpbiB0KWlmKHFjLmNhbGwodCxlKSlyZXR1cm4hMTtyZXR1cm4hMH1jb25zdCB6dD17UFJPUEFHQVRFX0tJQ0tfQUxMOiJwcm9wYWdhdGVfa2lja19hY3Jvc3Nfcm9vbXMiLFJFRlJFU0hfSURfT05fRElTQ09OTkVDVElPTjoicmVmcmVzaF9pZF9vbl9kaXNjb25uZWN0aW9uIixTS0lQX09URUxfVFJBQ0VTOiJza2lwX290ZWxfdHJhY2VzIixDRl9UUkFOU1BPUlRfRk9SQ0VfUkVMQVlfT05fSUNFX0ZBSUxFRDoiY2ZfdHJhbnNwb3J0X2ZvcmNlX3JlbGF5X29uX2ljZV9mYWlsZWQiLExPR19MRVZFTDoibG9nX2xldmVsIixWMV9QTFVHSU5TOiJ2MV9wbHVnaW5zIixMSVZFU1RSRUFNOiJmZWF0X2xpdmVzdHJlYW0iLFZBTF9NSU5fRlJBTUVSQVRFOiJ2YWxfbWluX2ZyYW1lcmF0ZSIsU0NSRUVFTlNIQVJFX0VSUl9IQUNLOiJzY3JlZW5zaGFyZV9lcnJfaGFjayIsU0NSRUVFTlNIQVJFX0NPTlNUUkFJTlRTX1JFVFJZOiJzY3JlZW5zaGFyZV9jb25zdHJhaW50c19yZXRyeSIsU0NSRUVOU0hBUkVfQ09OU1RSQUlOVFM6InNjcmVlbnNoYXJlX2NvbnN0cmFpbnRzIixPQlNfUVVBTElUWToib2JzX3F1YWxpdHkiLEFMTE9XX1NBRkFSSV9NRURJQV9NSURETEVXQVJFUzoiYWxsb3dfc2FmYXJpX21lZGlhX21pZGRsZXdhcmVzIixFWFBfUkVTSEFSRToiZXhwX3Jlc2hhcmUiLFNLSVBfU0VUVElOR19JTl9VU0VfREVWSUNFOiJza2lwX3NldHRpbmdfaW5fdXNlX2RldmljZSIsUFJFQ0FMTF9CQU5EV0lEVEhfVEVTVDoicHJlY2FsbF9iYW5kd2lkdGhfdGVzdCIsREVCVUdfU09DS0VUX0pPSU46ImRlYnVnX3NvY2tldF9qb2luIixGT1JDRV9SRUxBWToiZm9yY2VfcmVsYXkiLEZPUkNFX1ZJREVPX0NPREVDOiJmb3JjZV92aWRlb19jb2RlYyIsVFJBQ0tfSElOVDoidHJhY2tfaGludCIsUFJFQ1JFQVRFX1BST0RVQ0VSUzoicHJlY3JlYXRlX3Byb2R1Y2VycyIsRElTQUJMRV9PUFVTX0RUWF9DRjoiZGlzYWJsZV9vcHVzX2R0eF9jZiIsRU5BQkxFX0FVRElPX0FDVElWSVRZX0RFQlVHX0xPR1M6ImVuYWJsZV9hdWRpb19hY3Rpdml0eV9kZWJ1Z19sb2dzIixESVNBQkxFX0xBWUVSX1NXSVRDSDoiZGlzYWJsZV9sYXllcl9zd2l0Y2gifTtmdW5jdGlvbiBSdCh0KXtjb25zdCByPXt9O3JldHVybiB0eXBlb2YodD09bnVsbD92b2lkIDA6dC5jb2RlKT09Im51bWJlciImJihyLmNvZGU9dC5jb2RlKSx0eXBlb2YodD09bnVsbD92b2lkIDA6dC5jb2RlKT09InN0cmluZyImJihyLmNvZGU9dC5jb2RlLnN1YnN0cmluZygwLDEwMCkpLHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0Lm5hbWUpPT0ic3RyaW5nIiYmKHIubmFtZT10Lm5hbWUuc3Vic3RyaW5nKDAsNTAwKSksdHlwZW9mKHQ9PW51bGw/dm9pZCAwOnQubWVzc2FnZSk9PSJzdHJpbmciJiYoci5tZXNzYWdlPXQubWVzc2FnZS5zdWJzdHJpbmcoMCw1MDApKSx0eXBlb2YodD09bnVsbD92b2lkIDA6dC5yZWFzb24pPT0ic3RyaW5nIiYmKHIucmVhc29uPXQucmVhc29uLnN1YnN0cmluZygwLDUwMCkpLHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0LnN0YWNrKT09InN0cmluZyImJihyLnN0YWNrPXQuc3RhY2suc3Vic3RyaW5nKDAsNTAwKSkscn1mdW5jdGlvbiBRYyh7c2VydmljZVByZWZpeDp0LGJhc2VVUkk6cn0pe3JldHVybmAke3R9LiR7cn1gfWNvbnN0IEpjPXtsb2dzOiJodHRwczovL2FwaS5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbS9sb2dzL290ZWwvbG9ncyIsbW9jazp7dXJsOiJodHRwczovL2FwaS5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbS9tb2NrIixkb21haW46Im1vY2sucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20iLGFwcDoiaHR0cHM6Ly9leGFtcGxlcy5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbS9tZWV0aW5nIixzdGFnaW5nQXBwOiJodHRwczovL2V4YW1wbGVzLnN0YWdpbmcucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20vbWVldGluZyJ9LGFwaUJhc2U6e3Byb2Q6Imh0dHBzOi8vYXBpLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIixzdGFnaW5nOiJodHRwczovL2FwaS5zdGFnaW5nLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIixwcm9kQWx0ZXJuYXRlOiJodHRwczovL2FwaS5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSJ9LGJhc2VVUkk6e3Byb2Q6InJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIixzdGFnaW5nOiJzdGFnaW5nLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIn19O2Z1bmN0aW9uIFhjKHQpe3ZhciBzLG4saTtjb25zdCByPXR5cGVvZiBuYXZpZ2F0b3IhPSJ1bmRlZmluZWQiJiYhbmF2aWdhdG9yLmlzUmVhY3ROYXRpdmUmJnR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiYoKHM9d2luZG93LmxvY2F0aW9uLmhvc3QpPT1udWxsP3ZvaWQgMDpzLmluY2x1ZGVzKEpjLmJhc2VVUkkuc3RhZ2luZykpLGU9ISEoKGk9KG49dD09bnVsbD92b2lkIDA6dC5nZXRWYWx1ZSgibW9kdWxlcyIpKT09bnVsbD92b2lkIDA6bi5kZXZUb29scykhPW51bGwmJmkubG9ncyk7cmV0dXJuIHJ8fGV9ZnVuY3Rpb24gWmModCxyKXt2YXIgZTtpZih0IT1udWxsJiZ0LmdldFZhbHVlKCJmbGFnc21pdGgiKS5oYXNGZWF0dXJlKHp0LkxPR19MRVZFTCkpe2xldCBzPSgoZT10LmdldFZhbHVlKCJmbGFnc21pdGgiKS5nZXRWYWx1ZSh6dC5MT0dfTEVWRUwpKT09bnVsbD92b2lkIDA6ZS50b1N0cmluZygpKXx8ImFsbCI7aWYocz1zLnRvTG93ZXJDYXNlKCkudHJpbSgpLHM9PT0ib2ZmIilyZXR1cm4hMTtpZihzIT09ImFsbCIpe2NvbnN0IG49WyJkZWJ1ZyIsImxvZyIsImluZm8iLCJ3YXJuIiwiZXJyb3IiXSxpPW4uaW5kZXhPZihyKSxhPW4uaW5kZXhPZihzKTtpZihpPGEpcmV0dXJuITF9fXJldHVybiEwfWZ1bmN0aW9uIExzKHQscixlPXt9KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkuZm9yRWFjaChzPT57dmFyIGk7aWYoW251bGwsdm9pZCAwLE5hTl0uaW5jbHVkZXModFtzXSl8fHImJigoKGk9ci5tYXRjaCgvXC4vZykpPT1udWxsP3ZvaWQgMDppLmxlbmd0aCl8fDApPj0xMClyZXR1cm47Y29uc3Qgbj1yP2Ake3J9LiR7c31gOnM7dHlwZW9mIHRbc109PSJvYmplY3QiP0xzKHRbc10sbixlKTpbIm51bWJlciIsInN0cmluZyIsImJvb2xlYW4iXS5pbmNsdWRlcyh0eXBlb2YgdFtzXSkmJihlW25dPXRbc10pfSksZX1mdW5jdGlvbiBEcyh0LHIsZT17fSxzPSIiKXtjb25zdCBuPXt9O3RyeXtjb25zdCBpPUpTT04uc3RyaW5naWZ5KGUpLGE9SlNPTi5wYXJzZShpKSxkPUxzKGEscyksbz1KU09OLnN0cmluZ2lmeShkKTtyZXR1cm4gSlNPTi5wYXJzZShvKX1jYXRjaChpKXtjb25zdCBhPVJ0KGkpO25bYCR7c30uZXJyb3IubWVzc2FnZWBdPWEubWVzc2FnZXx8IiIsbltgJHtzfS5lcnJvci5zdGFja2BdPWEuc3RhY2t8fCIiLG5bYCR7c30uZXJyb3IucmVhc29uYF09YS5yZWFzb258fCIiLG5bYCR7c30uZXJyb3Iuc291cmNlYF09InNhZmVseUZsYXR0ZW5PYmpGb3JPcGVuVGVsZW1ldHJ5In1yZXR1cm4gbn1jb25zdCBlZD17IkFtYXpvbiBTaWxrIjoiYW1hem9uX3NpbGsiLCJBbmRyb2lkIEJyb3dzZXIiOiJhbmRyb2lkIixCYWRhOiJiYWRhIixCbGFja0JlcnJ5OiJibGFja2JlcnJ5IixDaHJvbWU6ImNocm9tZSIsQ2hyb21pdW06ImNocm9taXVtIixFbGVjdHJvbjoiZWxlY3Ryb24iLEVwaXBoYW55OiJlcGlwaGFueSIsRmlyZWZveDoiZmlyZWZveCIsRm9jdXM6ImZvY3VzIixHZW5lcmljOiJnZW5lcmljIiwiR29vZ2xlIFNlYXJjaCI6Imdvb2dsZV9zZWFyY2giLEdvb2dsZWJvdDoiZ29vZ2xlYm90IiwiSW50ZXJuZXQgRXhwbG9yZXIiOiJpZSIsIkstTWVsZW9uIjoia19tZWxlb24iLE1heHRob246Im1heHRob24iLCJNaWNyb3NvZnQgRWRnZSI6ImVkZ2UiLCJNWiBCcm93c2VyIjoibXoiLCJOQVZFUiBXaGFsZSBCcm93c2VyIjoibmF2ZXIiLE9wZXJhOiJvcGVyYSIsIk9wZXJhIENvYXN0Ijoib3BlcmFfY29hc3QiLFBoYW50b21KUzoicGhhbnRvbWpzIixQdWZmaW46InB1ZmZpbiIsUXVwWmlsbGE6InF1cHppbGxhIixRUToicXEiLFFRTGl0ZToicXFsaXRlIixTYWZhcmk6InNhZmFyaSIsU2FpbGZpc2g6InNhaWxmaXNoIiwiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCI6InNhbXN1bmdfaW50ZXJuZXQiLFNlYU1vbmtleToic2VhbW9ua2V5IixTbGVpcG5pcjoic2xlaXBuaXIiLFN3aW5nOiJzd2luZyIsVGl6ZW46InRpemVuIiwiVUMgQnJvd3NlciI6InVjIixWaXZhbGRpOiJ2aXZhbGRpIiwiV2ViT1MgQnJvd3NlciI6IndlYm9zIixXZUNoYXQ6IndlY2hhdCIsIllhbmRleCBCcm93c2VyIjoieWFuZGV4IixSb2t1OiJyb2t1In0sTnM9e2FtYXpvbl9zaWxrOiJBbWF6b24gU2lsayIsYW5kcm9pZDoiQW5kcm9pZCBCcm93c2VyIixiYWRhOiJCYWRhIixibGFja2JlcnJ5OiJCbGFja0JlcnJ5IixjaHJvbWU6IkNocm9tZSIsY2hyb21pdW06IkNocm9taXVtIixlbGVjdHJvbjoiRWxlY3Ryb24iLGVwaXBoYW55OiJFcGlwaGFueSIsZmlyZWZveDoiRmlyZWZveCIsZm9jdXM6IkZvY3VzIixnZW5lcmljOiJHZW5lcmljIixnb29nbGVib3Q6Ikdvb2dsZWJvdCIsZ29vZ2xlX3NlYXJjaDoiR29vZ2xlIFNlYXJjaCIsaWU6IkludGVybmV0IEV4cGxvcmVyIixrX21lbGVvbjoiSy1NZWxlb24iLG1heHRob246Ik1heHRob24iLGVkZ2U6Ik1pY3Jvc29mdCBFZGdlIixtejoiTVogQnJvd3NlciIsbmF2ZXI6Ik5BVkVSIFdoYWxlIEJyb3dzZXIiLG9wZXJhOiJPcGVyYSIsb3BlcmFfY29hc3Q6Ik9wZXJhIENvYXN0IixwaGFudG9tanM6IlBoYW50b21KUyIscHVmZmluOiJQdWZmaW4iLHF1cHppbGxhOiJRdXBaaWxsYSIscXE6IlFRIEJyb3dzZXIiLHFxbGl0ZToiUVEgQnJvd3NlciBMaXRlIixzYWZhcmk6IlNhZmFyaSIsc2FpbGZpc2g6IlNhaWxmaXNoIixzYW1zdW5nX2ludGVybmV0OiJTYW1zdW5nIEludGVybmV0IGZvciBBbmRyb2lkIixzZWFtb25rZXk6IlNlYU1vbmtleSIsc2xlaXBuaXI6IlNsZWlwbmlyIixzd2luZzoiU3dpbmciLHRpemVuOiJUaXplbiIsdWM6IlVDIEJyb3dzZXIiLHZpdmFsZGk6IlZpdmFsZGkiLHdlYm9zOiJXZWJPUyBCcm93c2VyIix3ZWNoYXQ6IldlQ2hhdCIseWFuZGV4OiJZYW5kZXggQnJvd3NlciJ9LCQ9e3RhYmxldDoidGFibGV0Iixtb2JpbGU6Im1vYmlsZSIsZGVza3RvcDoiZGVza3RvcCIsdHY6InR2In0sRz17V2luZG93c1Bob25lOiJXaW5kb3dzIFBob25lIixXaW5kb3dzOiJXaW5kb3dzIixNYWNPUzoibWFjT1MiLGlPUzoiaU9TIixBbmRyb2lkOiJBbmRyb2lkIixXZWJPUzoiV2ViT1MiLEJsYWNrQmVycnk6IkJsYWNrQmVycnkiLEJhZGE6IkJhZGEiLFRpemVuOiJUaXplbiIsTGludXg6IkxpbnV4IixDaHJvbWVPUzoiQ2hyb21lIE9TIixQbGF5U3RhdGlvbjQ6IlBsYXlTdGF0aW9uIDQiLFJva3U6IlJva3UifSxvZT17RWRnZUhUTUw6IkVkZ2VIVE1MIixCbGluazoiQmxpbmsiLFRyaWRlbnQ6IlRyaWRlbnQiLFByZXN0bzoiUHJlc3RvIixHZWNrbzoiR2Vja28iLFdlYktpdDoiV2ViS2l0In07Y2xhc3MgZ3tzdGF0aWMgZ2V0Rmlyc3RNYXRjaChyLGUpe2NvbnN0IHM9ZS5tYXRjaChyKTtyZXR1cm4gcyYmcy5sZW5ndGg+MCYmc1sxXXx8IiJ9c3RhdGljIGdldFNlY29uZE1hdGNoKHIsZSl7Y29uc3Qgcz1lLm1hdGNoKHIpO3JldHVybiBzJiZzLmxlbmd0aD4xJiZzWzJdfHwiIn1zdGF0aWMgbWF0Y2hBbmRSZXR1cm5Db25zdChyLGUscyl7aWYoci50ZXN0KGUpKXJldHVybiBzfXN0YXRpYyBnZXRXaW5kb3dzVmVyc2lvbk5hbWUocil7c3dpdGNoKHIpe2Nhc2UiTlQiOnJldHVybiJOVCI7Y2FzZSJYUCI6cmV0dXJuIlhQIjtjYXNlIk5UIDUuMCI6cmV0dXJuIjIwMDAiO2Nhc2UiTlQgNS4xIjpyZXR1cm4iWFAiO2Nhc2UiTlQgNS4yIjpyZXR1cm4iMjAwMyI7Y2FzZSJOVCA2LjAiOnJldHVybiJWaXN0YSI7Y2FzZSJOVCA2LjEiOnJldHVybiI3IjtjYXNlIk5UIDYuMiI6cmV0dXJuIjgiO2Nhc2UiTlQgNi4zIjpyZXR1cm4iOC4xIjtjYXNlIk5UIDEwLjAiOnJldHVybiIxMCI7ZGVmYXVsdDpyZXR1cm59fXN0YXRpYyBnZXRNYWNPU1ZlcnNpb25OYW1lKHIpe2NvbnN0IGU9ci5zcGxpdCgiLiIpLnNwbGljZSgwLDIpLm1hcChzPT5wYXJzZUludChzLDEwKXx8MCk7aWYoZS5wdXNoKDApLGVbMF09PT0xMClzd2l0Y2goZVsxXSl7Y2FzZSA1OnJldHVybiJMZW9wYXJkIjtjYXNlIDY6cmV0dXJuIlNub3cgTGVvcGFyZCI7Y2FzZSA3OnJldHVybiJMaW9uIjtjYXNlIDg6cmV0dXJuIk1vdW50YWluIExpb24iO2Nhc2UgOTpyZXR1cm4iTWF2ZXJpY2tzIjtjYXNlIDEwOnJldHVybiJZb3NlbWl0ZSI7Y2FzZSAxMTpyZXR1cm4iRWwgQ2FwaXRhbiI7Y2FzZSAxMjpyZXR1cm4iU2llcnJhIjtjYXNlIDEzOnJldHVybiJIaWdoIFNpZXJyYSI7Y2FzZSAxNDpyZXR1cm4iTW9qYXZlIjtjYXNlIDE1OnJldHVybiJDYXRhbGluYSI7ZGVmYXVsdDpyZXR1cm59fXN0YXRpYyBnZXRBbmRyb2lkVmVyc2lvbk5hbWUocil7Y29uc3QgZT1yLnNwbGl0KCIuIikuc3BsaWNlKDAsMikubWFwKHM9PnBhcnNlSW50KHMsMTApfHwwKTtpZihlLnB1c2goMCksIShlWzBdPT09MSYmZVsxXTw1KSl7aWYoZVswXT09PTEmJmVbMV08NilyZXR1cm4iQ3VwY2FrZSI7aWYoZVswXT09PTEmJmVbMV0+PTYpcmV0dXJuIkRvbnV0IjtpZihlWzBdPT09MiYmZVsxXTwyKXJldHVybiJFY2xhaXIiO2lmKGVbMF09PT0yJiZlWzFdPT09MilyZXR1cm4iRnJveW8iO2lmKGVbMF09PT0yJiZlWzFdPjIpcmV0dXJuIkdpbmdlcmJyZWFkIjtpZihlWzBdPT09MylyZXR1cm4iSG9uZXljb21iIjtpZihlWzBdPT09NCYmZVsxXTwxKXJldHVybiJJY2UgQ3JlYW0gU2FuZHdpY2giO2lmKGVbMF09PT00JiZlWzFdPDQpcmV0dXJuIkplbGx5IEJlYW4iO2lmKGVbMF09PT00JiZlWzFdPj00KXJldHVybiJLaXRLYXQiO2lmKGVbMF09PT01KXJldHVybiJMb2xsaXBvcCI7aWYoZVswXT09PTYpcmV0dXJuIk1hcnNobWFsbG93IjtpZihlWzBdPT09NylyZXR1cm4iTm91Z2F0IjtpZihlWzBdPT09OClyZXR1cm4iT3JlbyI7aWYoZVswXT09PTkpcmV0dXJuIlBpZSJ9fXN0YXRpYyBnZXRWZXJzaW9uUHJlY2lzaW9uKHIpe3JldHVybiByLnNwbGl0KCIuIikubGVuZ3RofXN0YXRpYyBjb21wYXJlVmVyc2lvbnMocixlLHM9ITEpe2NvbnN0IG49Zy5nZXRWZXJzaW9uUHJlY2lzaW9uKHIpLGk9Zy5nZXRWZXJzaW9uUHJlY2lzaW9uKGUpO2xldCBhPU1hdGgubWF4KG4saSksZD0wO2NvbnN0IG89Zy5tYXAoW3IsZV0sbD0+e2NvbnN0IGY9YS1nLmdldFZlcnNpb25QcmVjaXNpb24obCksdj1sK25ldyBBcnJheShmKzEpLmpvaW4oIi4wIik7cmV0dXJuIGcubWFwKHYuc3BsaXQoIi4iKSxFPT5uZXcgQXJyYXkoMjAtRS5sZW5ndGgpLmpvaW4oIjAiKStFKS5yZXZlcnNlKCl9KTtmb3IocyYmKGQ9YS1NYXRoLm1pbihuLGkpKSxhLT0xO2E+PWQ7KXtpZihvWzBdW2FdPm9bMV1bYV0pcmV0dXJuIDE7aWYob1swXVthXT09PW9bMV1bYV0pe2lmKGE9PT1kKXJldHVybiAwO2EtPTF9ZWxzZSBpZihvWzBdW2FdPG9bMV1bYV0pcmV0dXJuLTF9fXN0YXRpYyBtYXAocixlKXtjb25zdCBzPVtdO2xldCBuO2lmKEFycmF5LnByb3RvdHlwZS5tYXApcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChyLGUpO2ZvcihuPTA7bjxyLmxlbmd0aDtuKz0xKXMucHVzaChlKHJbbl0pKTtyZXR1cm4gc31zdGF0aWMgZmluZChyLGUpe2xldCBzLG47aWYoQXJyYXkucHJvdG90eXBlLmZpbmQpcmV0dXJuIEFycmF5LnByb3RvdHlwZS5maW5kLmNhbGwocixlKTtmb3Iocz0wLG49ci5sZW5ndGg7czxuO3MrPTEpe2NvbnN0IGk9cltzXTtpZihlKGkscykpcmV0dXJuIGl9fXN0YXRpYyBhc3NpZ24ociwuLi5lKXtjb25zdCBzPXI7bGV0IG4saTtpZihPYmplY3QuYXNzaWduKXJldHVybiBPYmplY3QuYXNzaWduKHIsLi4uZSk7Zm9yKG49MCxpPWUubGVuZ3RoO248aTtuKz0xKXtjb25zdCBhPWVbbl07dHlwZW9mIGE9PSJvYmplY3QiJiZhIT09bnVsbCYmT2JqZWN0LmtleXMoYSkuZm9yRWFjaChvPT57c1tvXT1hW29dfSl9cmV0dXJuIHJ9c3RhdGljIGdldEJyb3dzZXJBbGlhcyhyKXtyZXR1cm4gZWRbcl19c3RhdGljIGdldEJyb3dzZXJUeXBlQnlBbGlhcyhyKXtyZXR1cm4gTnNbcl18fCIifX1jb25zdCBOPS92ZXJzaW9uXC8oXGQrKFwuP18/XGQrKSspL2ksdGQ9W3t0ZXN0OlsvZ29vZ2xlYm90L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ikdvb2dsZWJvdCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9nb29nbGVib3RcLyhcZCsoXC5cZCspKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goTix0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9vcGVyYS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJPcGVyYSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86b3BlcmEpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvb3ByXC98b3Bpb3MvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiT3BlcmEifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86b3ByfG9waW9zKVtccy9dKFxTKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvU2Ftc3VuZ0Jyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86U2Ftc3VuZ0Jyb3dzZXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvV2hhbGUvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTkFWRVIgV2hhbGUgQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86d2hhbGUpW1xzL10oXGQrKD86XC5cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9NWkJyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTVogQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpNWkJyb3dzZXIpW1xzL10oXGQrKD86XC5cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZm9jdXMvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiRm9jdXMifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86Zm9jdXMpW1xzL10oXGQrKD86XC5cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc3dpbmcvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU3dpbmcifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86c3dpbmcpW1xzL10oXGQrKD86XC5cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvY29hc3QvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiT3BlcmEgQ29hc3QifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OmNvYXN0KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL29wdFwvXGQrKD86Lj9fP1xkKykrL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik9wZXJhIFRvdWNoIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Om9wdClbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsveWFicm93c2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IllhbmRleCBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OnlhYnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvdWNicm93c2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlVDIEJyb3dzZXIifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OnVjYnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9NYXh0aG9ufG14aW9zL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik1heHRob24ifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/Ok1heHRob258bXhpb3MpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZXBpcGhhbnkvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiRXBpcGhhbnkifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OmVwaXBoYW55KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3B1ZmZpbi9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJQdWZmaW4ifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OnB1ZmZpbilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zbGVpcG5pci9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTbGVpcG5pciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86c2xlaXBuaXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvay1tZWxlb24vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiSy1NZWxlb24ifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OmstbWVsZW9uKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL21pY3JvbWVzc2VuZ2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IldlQ2hhdCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzptaWNyb21lc3NlbmdlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcXFicm93c2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6L3FxYnJvd3NlcmxpdGUvaS50ZXN0KHQpPyJRUSBCcm93c2VyIExpdGUiOiJRUSBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OnFxYnJvd3NlcmxpdGV8cXFicm93c2VyKVsvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvbXNpZXx0cmlkZW50L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkludGVybmV0IEV4cGxvcmVyIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Om1zaWUgfHJ2OikoXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvXHNlZGdcLy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJNaWNyb3NvZnQgRWRnZSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9cc2VkZ1wvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2VkZyhbZWFdfGlvcykvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTWljcm9zb2Z0IEVkZ2UifSxlPWcuZ2V0U2Vjb25kTWF0Y2goL2VkZyhbZWFdfGlvcylcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy92aXZhbGRpL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlZpdmFsZGkifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvdml2YWxkaVwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3NlYW1vbmtleS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTZWFNb25rZXkifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvc2VhbW9ua2V5XC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc2FpbGZpc2gvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU2FpbGZpc2gifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvc2FpbGZpc2hccz9icm93c2VyXC8oXGQrKFwuXGQrKT8pL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc2lsay9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJBbWF6b24gU2lsayJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9zaWxrXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcGhhbnRvbS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJQaGFudG9tSlMifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvcGhhbnRvbWpzXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc2xpbWVyanMvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU2xpbWVySlMifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvc2xpbWVyanNcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9ibGFja2JlcnJ5fFxiYmJcZCsvaSwvcmltXHN0YWJsZXQvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiQmxhY2tCZXJyeSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVtcZF0rXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvKHdlYnxocHcpW28wXXMvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiV2ViT1MgQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvdyg/OmViKT9bbzBdc2Jyb3dzZXJcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9iYWRhL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkJhZGEifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvZG9sZmluXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvdGl6ZW4vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiVGl6ZW4ifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86dGl6ZW5ccz8pP2Jyb3dzZXJcLyhcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcXVwemlsbGEvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiUXVwWmlsbGEifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86cXVwemlsbGEpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaChOLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2ZpcmVmb3h8aWNld2Vhc2VsfGZ4aW9zL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkZpcmVmb3gifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86ZmlyZWZveHxpY2V3ZWFzZWx8Znhpb3MpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZWxlY3Ryb24vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiRWxlY3Ryb24ifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86ZWxlY3Ryb24pXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvTWl1aUJyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTWl1aSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpNaXVpQnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9jaHJvbWl1bS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJDaHJvbWl1bSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpjaHJvbWl1bSlbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvY2hyb21lfGNyaW9zfGNybW8vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiQ2hyb21lIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OmNocm9tZXxjcmlvc3xjcm1vKVwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL0dTQS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJHb29nbGUgU2VhcmNoIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OkdTQSlcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3QodCl7Y29uc3Qgcj0hdC50ZXN0KC9saWtlIGFuZHJvaWQvaSksZT10LnRlc3QoL2FuZHJvaWQvaSk7cmV0dXJuIHImJmV9LGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkFuZHJvaWQgQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcGxheXN0YXRpb24gNC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJQbGF5U3RhdGlvbiA0In0sZT1nLmdldEZpcnN0TWF0Y2goTix0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zYWZhcml8YXBwbGV3ZWJraXQvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU2FmYXJpIn0sZT1nLmdldEZpcnN0TWF0Y2goTix0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy8uKi9pXSxkZXNjcmliZSh0KXtjb25zdCByPS9eKC4qKVwvKC4qKSAvLGU9L14oLiopXC8oLiopWyBcdF1cKCguKikvLG49dC5zZWFyY2goIlxcKCIpIT09LTE/ZTpyO3JldHVybntuYW1lOmcuZ2V0Rmlyc3RNYXRjaChuLHQpLHZlcnNpb246Zy5nZXRTZWNvbmRNYXRjaChuLHQpfX19XTt2YXIgcmQ9W3t0ZXN0OlsvUm9rdVwvRFZQL10sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL1Jva3VcL0RWUC0oXGQrXC5cZCspL2ksdCk7cmV0dXJue25hbWU6Ry5Sb2t1LHZlcnNpb246cn19fSx7dGVzdDpbL3dpbmRvd3MgcGhvbmUvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL3dpbmRvd3MgcGhvbmUgKD86b3MpP1xzPyhcZCsoXC5cZCspKikvaSx0KTtyZXR1cm57bmFtZTpHLldpbmRvd3NQaG9uZSx2ZXJzaW9uOnJ9fX0se3Rlc3Q6Wy93aW5kb3dzIC9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvV2luZG93cyAoKE5UfFhQKSggXGRcZD8uXGQpPykvaSx0KSxlPWcuZ2V0V2luZG93c1ZlcnNpb25OYW1lKHIpO3JldHVybntuYW1lOkcuV2luZG93cyx2ZXJzaW9uOnIsdmVyc2lvbk5hbWU6ZX19fSx7dGVzdDpbL01hY2ludG9zaCguKj8pIEZ4aU9TKC4qPylcLy9dLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ry5pT1N9LGU9Zy5nZXRTZWNvbmRNYXRjaCgvKFZlcnNpb25cLykoXGRbXGQuXSspLyx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9tYWNpbnRvc2gvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL21hYyBvcyB4IChcZCsoXC4/Xz9cZCspKykvaSx0KS5yZXBsYWNlKC9bX1xzXS9nLCIuIiksZT1nLmdldE1hY09TVmVyc2lvbk5hbWUocikscz17bmFtZTpHLk1hY09TLHZlcnNpb246cn07cmV0dXJuIGUmJihzLnZlcnNpb25OYW1lPWUpLHN9fSx7dGVzdDpbLyhpcG9kfGlwaG9uZXxpcGFkKS9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvb3MgKFxkKyhbX1xzXVxkKykqKSBsaWtlIG1hYyBvcyB4L2ksdCkucmVwbGFjZSgvW19cc10vZywiLiIpO3JldHVybntuYW1lOkcuaU9TLHZlcnNpb246cn19fSx7dGVzdCh0KXtjb25zdCByPSF0LnRlc3QoL2xpa2UgYW5kcm9pZC9pKSxlPXQudGVzdCgvYW5kcm9pZC9pKTtyZXR1cm4gciYmZX0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL2FuZHJvaWRbXHMvLV0oXGQrKFwuXGQrKSopL2ksdCksZT1nLmdldEFuZHJvaWRWZXJzaW9uTmFtZShyKSxzPXtuYW1lOkcuQW5kcm9pZCx2ZXJzaW9uOnJ9O3JldHVybiBlJiYocy52ZXJzaW9uTmFtZT1lKSxzfX0se3Rlc3Q6Wy8od2VifGhwdylbbzBdcy9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvKD86d2VifGhwdylbbzBdc1wvKFxkKyhcLlxkKykqKS9pLHQpLGU9e25hbWU6Ry5XZWJPU307cmV0dXJuIHImJnIubGVuZ3RoJiYoZS52ZXJzaW9uPXIpLGV9fSx7dGVzdDpbL2JsYWNrYmVycnl8XGJiYlxkKy9pLC9yaW1cc3RhYmxldC9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvcmltXHN0YWJsZXRcc29zXHMoXGQrKFwuXGQrKSopL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVxkK1wvKFxkKyhbX1xzXVxkKykqKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goL1xiYmIoXGQrKS9pLHQpO3JldHVybntuYW1lOkcuQmxhY2tCZXJyeSx2ZXJzaW9uOnJ9fX0se3Rlc3Q6Wy9iYWRhL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9iYWRhXC8oXGQrKFwuXGQrKSopL2ksdCk7cmV0dXJue25hbWU6Ry5CYWRhLHZlcnNpb246cn19fSx7dGVzdDpbL3RpemVuL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC90aXplblsvXHNdKFxkKyhcLlxkKykqKS9pLHQpO3JldHVybntuYW1lOkcuVGl6ZW4sdmVyc2lvbjpyfX19LHt0ZXN0OlsvbGludXgvaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpHLkxpbnV4fX19LHt0ZXN0OlsvQ3JPUy9dLGRlc2NyaWJlKCl7cmV0dXJue25hbWU6Ry5DaHJvbWVPU319fSx7dGVzdDpbL1BsYXlTdGF0aW9uIDQvXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvUGxheVN0YXRpb24gNFsvXHNdKFxkKyhcLlxkKykqKS9pLHQpO3JldHVybntuYW1lOkcuUGxheVN0YXRpb240LHZlcnNpb246cn19fV0sc2Q9W3t0ZXN0OlsvZ29vZ2xlYm90L2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6ImJvdCIsdmVuZG9yOiJHb29nbGUifX19LHt0ZXN0OlsvaHVhd2VpL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC8oY2FuLWwwMSkvaSx0KSYmIk5vdmEiLGU9e3R5cGU6JC5tb2JpbGUsdmVuZG9yOiJIdWF3ZWkifTtyZXR1cm4gciYmKGUubW9kZWw9ciksZX19LHt0ZXN0OlsvbmV4dXNccyooPzo3fDh8OXwxMCkuKi9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQudGFibGV0LHZlbmRvcjoiTmV4dXMifX19LHt0ZXN0OlsvaXBhZC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQudGFibGV0LHZlbmRvcjoiQXBwbGUiLG1vZGVsOiJpUGFkIn19fSx7dGVzdDpbL01hY2ludG9zaCguKj8pIEZ4aU9TKC4qPylcLy9dLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC50YWJsZXQsdmVuZG9yOiJBcHBsZSIsbW9kZWw6ImlQYWQifX19LHt0ZXN0Olsva2Z0dCBidWlsZC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQudGFibGV0LHZlbmRvcjoiQW1hem9uIixtb2RlbDoiS2luZGxlIEZpcmUgSEQgNyJ9fX0se3Rlc3Q6Wy9zaWxrL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC50YWJsZXQsdmVuZG9yOiJBbWF6b24ifX19LHt0ZXN0OlsvdGFibGV0KD8hIHBjKS9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQudGFibGV0fX19LHt0ZXN0KHQpe2NvbnN0IHI9dC50ZXN0KC9pcG9kfGlwaG9uZS9pKSxlPXQudGVzdCgvbGlrZSAoaXBvZHxpcGhvbmUpL2kpO3JldHVybiByJiYhZX0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goLyhpcG9kfGlwaG9uZSkvaSx0KTtyZXR1cm57dHlwZTokLm1vYmlsZSx2ZW5kb3I6IkFwcGxlIixtb2RlbDpyfX19LHt0ZXN0OlsvbmV4dXNccypbMC02XS4qL2ksL2dhbGF4eSBuZXh1cy9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQubW9iaWxlLHZlbmRvcjoiTmV4dXMifX19LHt0ZXN0OlsvW14tXW1vYmkvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTokLm1vYmlsZX19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRCcm93c2VyTmFtZSghMCk9PT0iYmxhY2tiZXJyeSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC5tb2JpbGUsdmVuZG9yOiJCbGFja0JlcnJ5In19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRCcm93c2VyTmFtZSghMCk9PT0iYmFkYSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC5tb2JpbGV9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0QnJvd3Nlck5hbWUoKT09PSJ3aW5kb3dzIHBob25lIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTokLm1vYmlsZSx2ZW5kb3I6Ik1pY3Jvc29mdCJ9fX0se3Rlc3QodCl7Y29uc3Qgcj1OdW1iZXIoU3RyaW5nKHQuZ2V0T1NWZXJzaW9uKCkpLnNwbGl0KCIuIilbMF0pO3JldHVybiB0LmdldE9TTmFtZSghMCk9PT0iYW5kcm9pZCImJnI+PTN9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC50YWJsZXR9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJhbmRyb2lkIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTokLm1vYmlsZX19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09Im1hY29zIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTokLmRlc2t0b3AsdmVuZG9yOiJBcHBsZSJ9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJ3aW5kb3dzIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTokLmRlc2t0b3B9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJsaW51eCJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC5kZXNrdG9wfX19LHt0ZXN0KHQpe3JldHVybiB0LmdldE9TTmFtZSghMCk9PT0icGxheXN0YXRpb24gNCJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC50dn19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09InJva3UifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQudHZ9fX1dLG5kPVt7dGVzdCh0KXtyZXR1cm4gdC5nZXRCcm93c2VyTmFtZSghMCk9PT0ibWljcm9zb2Z0IGVkZ2UifSxkZXNjcmliZSh0KXtpZigvXHNlZGdcLy9pLnRlc3QodCkpcmV0dXJue25hbWU6b2UuQmxpbmt9O2NvbnN0IGU9Zy5nZXRGaXJzdE1hdGNoKC9lZGdlXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJue25hbWU6b2UuRWRnZUhUTUwsdmVyc2lvbjplfX19LHt0ZXN0OlsvdHJpZGVudC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOm9lLlRyaWRlbnR9LGU9Zy5nZXRGaXJzdE1hdGNoKC90cmlkZW50XC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0KHQpe3JldHVybiB0LnRlc3QoL3ByZXN0by9pKX0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTpvZS5QcmVzdG99LGU9Zy5nZXRGaXJzdE1hdGNoKC9wcmVzdG9cLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3QodCl7Y29uc3Qgcj10LnRlc3QoL2dlY2tvL2kpLGU9dC50ZXN0KC9saWtlIGdlY2tvL2kpO3JldHVybiByJiYhZX0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTpvZS5HZWNrb30sZT1nLmdldEZpcnN0TWF0Y2goL2dlY2tvXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvKGFwcGxlKT93ZWJraXRcLzUzN1wuMzYvaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpvZS5CbGlua319fSx7dGVzdDpbLyhhcHBsZSk/d2Via2l0L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6b2UuV2ViS2l0fSxlPWcuZ2V0Rmlyc3RNYXRjaCgvd2Via2l0XC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19XTtjbGFzcyBWc3tjb25zdHJ1Y3RvcihyLGU9ITEpe2lmKHI9PW51bGx8fHI9PT0iIil0aHJvdyBuZXcgRXJyb3IoIlVzZXJBZ2VudCBwYXJhbWV0ZXIgY2FuJ3QgYmUgZW1wdHkiKTt0aGlzLl91YT1yLHRoaXMucGFyc2VkUmVzdWx0PXt9LGUhPT0hMCYmdGhpcy5wYXJzZSgpfWdldFVBKCl7cmV0dXJuIHRoaXMuX3VhfXRlc3Qocil7cmV0dXJuIHIudGVzdCh0aGlzLl91YSl9cGFyc2VCcm93c2VyKCl7dGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj17fTtjb25zdCByPWcuZmluZCh0ZCxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gciYmKHRoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXI9ci5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyfWdldEJyb3dzZXIoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj90aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyOnRoaXMucGFyc2VCcm93c2VyKCl9Z2V0QnJvd3Nlck5hbWUocil7cmV0dXJuIHI/U3RyaW5nKHRoaXMuZ2V0QnJvd3NlcigpLm5hbWUpLnRvTG93ZXJDYXNlKCl8fCIiOnRoaXMuZ2V0QnJvd3NlcigpLm5hbWV8fCIifWdldEJyb3dzZXJWZXJzaW9uKCl7cmV0dXJuIHRoaXMuZ2V0QnJvd3NlcigpLnZlcnNpb259Z2V0T1MoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQub3M/dGhpcy5wYXJzZWRSZXN1bHQub3M6dGhpcy5wYXJzZU9TKCl9cGFyc2VPUygpe3RoaXMucGFyc2VkUmVzdWx0Lm9zPXt9O2NvbnN0IHI9Zy5maW5kKHJkLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoZS50ZXN0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUudGVzdC5zb21lKHM9PnRoaXMudGVzdChzKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiByJiYodGhpcy5wYXJzZWRSZXN1bHQub3M9ci5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5vc31nZXRPU05hbWUocil7Y29uc3R7bmFtZTplfT10aGlzLmdldE9TKCk7cmV0dXJuIHI/U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl8fCIiOmV8fCIifWdldE9TVmVyc2lvbigpe3JldHVybiB0aGlzLmdldE9TKCkudmVyc2lvbn1nZXRQbGF0Zm9ybSgpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT90aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybTp0aGlzLnBhcnNlUGxhdGZvcm0oKX1nZXRQbGF0Zm9ybVR5cGUocj0hMSl7Y29uc3R7dHlwZTplfT10aGlzLmdldFBsYXRmb3JtKCk7cmV0dXJuIHI/U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl8fCIiOmV8fCIifXBhcnNlUGxhdGZvcm0oKXt0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT17fTtjb25zdCByPWcuZmluZChzZCxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gciYmKHRoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtPXIuZGVzY3JpYmUodGhpcy5nZXRVQSgpKSksdGhpcy5wYXJzZWRSZXN1bHQucGxhdGZvcm19Z2V0RW5naW5lKCl7cmV0dXJuIHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT90aGlzLnBhcnNlZFJlc3VsdC5lbmdpbmU6dGhpcy5wYXJzZUVuZ2luZSgpfWdldEVuZ2luZU5hbWUocil7cmV0dXJuIHI/U3RyaW5nKHRoaXMuZ2V0RW5naW5lKCkubmFtZSkudG9Mb3dlckNhc2UoKXx8IiI6dGhpcy5nZXRFbmdpbmUoKS5uYW1lfHwiIn1wYXJzZUVuZ2luZSgpe3RoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT17fTtjb25zdCByPWcuZmluZChuZCxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gciYmKHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT1yLmRlc2NyaWJlKHRoaXMuZ2V0VUEoKSkpLHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZX1wYXJzZSgpe3JldHVybiB0aGlzLnBhcnNlQnJvd3NlcigpLHRoaXMucGFyc2VPUygpLHRoaXMucGFyc2VQbGF0Zm9ybSgpLHRoaXMucGFyc2VFbmdpbmUoKSx0aGlzfWdldFJlc3VsdCgpe3JldHVybiBnLmFzc2lnbih7fSx0aGlzLnBhcnNlZFJlc3VsdCl9c2F0aXNmaWVzKHIpe2NvbnN0IGU9e307bGV0IHM9MDtjb25zdCBuPXt9O2xldCBpPTA7aWYoT2JqZWN0LmtleXMocikuZm9yRWFjaChkPT57Y29uc3Qgbz1yW2RdO3R5cGVvZiBvPT0ic3RyaW5nIj8obltkXT1vLGkrPTEpOnR5cGVvZiBvPT0ib2JqZWN0IiYmKGVbZF09byxzKz0xKX0pLHM+MCl7Y29uc3QgZD1PYmplY3Qua2V5cyhlKSxvPWcuZmluZChkLGY9PnRoaXMuaXNPUyhmKSk7aWYobyl7Y29uc3QgZj10aGlzLnNhdGlzZmllcyhlW29dKTtpZihmIT09dm9pZCAwKXJldHVybiBmfWNvbnN0IGw9Zy5maW5kKGQsZj0+dGhpcy5pc1BsYXRmb3JtKGYpKTtpZihsKXtjb25zdCBmPXRoaXMuc2F0aXNmaWVzKGVbbF0pO2lmKGYhPT12b2lkIDApcmV0dXJuIGZ9fWlmKGk+MCl7Y29uc3QgZD1PYmplY3Qua2V5cyhuKSxvPWcuZmluZChkLGw9PnRoaXMuaXNCcm93c2VyKGwsITApKTtpZihvIT09dm9pZCAwKXJldHVybiB0aGlzLmNvbXBhcmVWZXJzaW9uKG5bb10pfX1pc0Jyb3dzZXIocixlPSExKXtjb25zdCBzPXRoaXMuZ2V0QnJvd3Nlck5hbWUoKS50b0xvd2VyQ2FzZSgpO2xldCBuPXIudG9Mb3dlckNhc2UoKTtjb25zdCBpPWcuZ2V0QnJvd3NlclR5cGVCeUFsaWFzKG4pO3JldHVybiBlJiZpJiYobj1pLnRvTG93ZXJDYXNlKCkpLG49PT1zfWNvbXBhcmVWZXJzaW9uKHIpe2xldCBlPVswXSxzPXIsbj0hMTtjb25zdCBpPXRoaXMuZ2V0QnJvd3NlclZlcnNpb24oKTtpZih0eXBlb2YgaT09InN0cmluZyIpcmV0dXJuIHJbMF09PT0iPiJ8fHJbMF09PT0iPCI/KHM9ci5zdWJzdHIoMSksclsxXT09PSI9Ij8obj0hMCxzPXIuc3Vic3RyKDIpKTplPVtdLHJbMF09PT0iPiI/ZS5wdXNoKDEpOmUucHVzaCgtMSkpOnJbMF09PT0iPSI/cz1yLnN1YnN0cigxKTpyWzBdPT09In4iJiYobj0hMCxzPXIuc3Vic3RyKDEpKSxlLmluZGV4T2YoZy5jb21wYXJlVmVyc2lvbnMoaSxzLG4pKT4tMX1pc09TKHIpe3JldHVybiB0aGlzLmdldE9TTmFtZSghMCk9PT1TdHJpbmcocikudG9Mb3dlckNhc2UoKX1pc1BsYXRmb3JtKHIpe3JldHVybiB0aGlzLmdldFBsYXRmb3JtVHlwZSghMCk9PT1TdHJpbmcocikudG9Mb3dlckNhc2UoKX1pc0VuZ2luZShyKXtyZXR1cm4gdGhpcy5nZXRFbmdpbmVOYW1lKCEwKT09PVN0cmluZyhyKS50b0xvd2VyQ2FzZSgpfWlzKHIsZT0hMSl7cmV0dXJuIHRoaXMuaXNCcm93c2VyKHIsZSl8fHRoaXMuaXNPUyhyKXx8dGhpcy5pc1BsYXRmb3JtKHIpfXNvbWUocj1bXSl7cmV0dXJuIHIuc29tZShlPT50aGlzLmlzKGUpKX19LyohCiAqIEJvd3NlciAtIGEgYnJvd3NlciBkZXRlY3RvcgogKiBodHRwczovL2dpdGh1Yi5jb20vbGFuY2VkaWtzb24vYm93c2VyCiAqIE1JVCBMaWNlbnNlIHwgKGMpIER1c3RpbiBEaWF6IDIwMTItMjAxNQogKiBNSVQgTGljZW5zZSB8IChjKSBEZW5pcyBEZW1jaGVua28gMjAxNS0yMDE5CiAqL2NsYXNzIGlke3N0YXRpYyBnZXRQYXJzZXIocixlPSExKXtpZih0eXBlb2YgciE9InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKCJVc2VyQWdlbnQgc2hvdWxkIGJlIGEgc3RyaW5nIik7cmV0dXJuIG5ldyBWcyhyLGUpfXN0YXRpYyBwYXJzZShyKXtyZXR1cm4gbmV3IFZzKHIpLmdldFJlc3VsdCgpfXN0YXRpYyBnZXQgQlJPV1NFUl9NQVAoKXtyZXR1cm4gTnN9c3RhdGljIGdldCBFTkdJTkVfTUFQKCl7cmV0dXJuIG9lfXN0YXRpYyBnZXQgT1NfTUFQKCl7cmV0dXJuIEd9c3RhdGljIGdldCBQTEFURk9STVNfTUFQKCl7cmV0dXJuICR9fWNvbnN0IE5lPSJjaHJvbWUiLEZzPSJvcGVyYSIsQnM9ImZpcmVmb3giLHhzPSJpZXhwbG9yZXIiLGpzPSJzYWZhcmkiLFVzPSJud2pzIiwkcz0iZWxlY3Ryb24iLEhzPSJyZWFjdC1uYXRpdmUiLEd0PSJ1bmtub3duIixQdD17Q2hyb21lOk5lLENocm9taXVtOk5lLE9wZXJhOkZzLEZpcmVmb3g6QnMsIkludGVybmV0IEV4cGxvcmVyIjp4cyxTYWZhcmk6anN9O2Z1bmN0aW9uIGFkKCl7Y29uc3R7dXNlckFnZW50OnR9PW5hdmlnYXRvcixyPXtuYW1lOkd0LHZlcnNpb246dm9pZCAwfTtpZih0Lm1hdGNoKC9DaHJvbWUvKSYmIXQubWF0Y2goL0VkZ2UvKSlpZih0Lm1hdGNoKC9FZGcoQT8pLykpe2NvbnN0IGU9dC5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdO051bWJlci5wYXJzZUludChlLDEwKT43MiYmKHIubmFtZT1OZSxyLnZlcnNpb249ZSl9ZWxzZSByLm5hbWU9TmUsci52ZXJzaW9uPXQubWF0Y2goL0Nocm9tZVwvKFtcZC5dKykvKVsxXTtyZXR1cm4gcn1mdW5jdGlvbiBvZCgpe2NvbnN0e3VzZXJBZ2VudDp0fT1uYXZpZ2F0b3I7aWYodC5tYXRjaCgvRWxlY3Ryb24vKSl7Y29uc3Qgcj10Lm1hdGNoKC9FbGVjdHJvblwvKFtcZC5dKykvKVsxXTtyZXR1cm57bmFtZTokcyx2ZXJzaW9uOnJ9fXJldHVybiBudWxsfWZ1bmN0aW9uIGNkKCl7Y29uc3R7dXNlckFnZW50OnR9PW5hdmlnYXRvcjtpZih0Lm1hdGNoKC9KaXRzaU1lZXROVy8pKXtjb25zdCByPXQubWF0Y2goL0ppdHNpTWVldE5XXC8oW1xkLl0rKS8pWzFdO3JldHVybntuYW1lOlVzLHZlcnNpb246cn19fWZ1bmN0aW9uIGRkKCl7Y29uc3QgdD1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9cYihyZWFjdFsgXHRfLV0qbmF0aXZlKSg/OlwvKFxTKykpPy9pKTtsZXQgcjtpZih0fHxuYXZpZ2F0b3IucHJvZHVjdD09PSJSZWFjdE5hdGl2ZSIpcmV0dXJuIHQmJnQubGVuZ3RoPjImJih0WzFdLHI9dFsyXSkscnx8KHI9InVua25vd24iKSx7bmFtZTpIcyx2ZXJzaW9uOnJ9fWZ1bmN0aW9uIGxkKHQpe2xldCByO2NvbnN0IGU9W2RkLG9kLGNkXTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rPTEpaWYocj1lW25dKCkscilyZXR1cm4gcjtjb25zdCBzPXQuZ2V0QnJvd3Nlck5hbWUoKTtyZXR1cm4gcyBpbiBQdD97bmFtZTpQdFtzXSx2ZXJzaW9uOnQuZ2V0QnJvd3NlclZlcnNpb24oKX06KHI9YWQoKSxyfHx7bmFtZTpHdCx2ZXJzaW9uOnZvaWQgMH0pfWNsYXNzIHVke2NvbnN0cnVjdG9yKCl7cCh0aGlzLCJfYm93c2VyIik7cCh0aGlzLCJfbmFtZSIpO3AodGhpcywiX3ZlcnNpb24iKTtwKHRoaXMsImdldERldmljZUluZm8iLCgpPT4oe2lzTW9iaWxlOnRoaXMuaXNNb2JpbGUoKSxicm93c2VyTmFtZTp0aGlzLl9ib3dzZXIuZ2V0QnJvd3Nlck5hbWUoKSxvc05hbWU6dGhpcy5fYm93c2VyLmdldE9TTmFtZSgpLGJyb3dzZXJWZXJzaW9uOnRoaXMuX2Jvd3Nlci5nZXRCcm93c2VyVmVyc2lvbigpLG9zVmVyc2lvbk5hbWU6dGhpcy5fYm93c2VyLmdldE9TVmVyc2lvbigpLGVuZ2luZU5hbWU6dGhpcy5fYm93c2VyLmdldEVuZ2luZU5hbWUoKX0pKX1pbml0KHIpe2xldCBlLHM7aWYodGhpcy5fYm93c2VyPWlkLmdldFBhcnNlcihuYXZpZ2F0b3IudXNlckFnZW50KSx0eXBlb2Ygcj09InVuZGVmaW5lZCIpe2NvbnN0IG49bGQodGhpcy5fYm93c2VyKTtlPW4ubmFtZSxzPW4udmVyc2lvbn1lbHNlIHIubmFtZSBpbiBQdD8oZT1QdFtyLm5hbWVdLHM9ci52ZXJzaW9uKTooZT1HdCxzPXZvaWQgMCk7dGhpcy5fbmFtZT1lLHRoaXMuX3ZlcnNpb249c31nZXROYW1lKCl7cmV0dXJuIHRoaXMuX25hbWV9aXNDaHJvbWUoKXtyZXR1cm4gdGhpcy5fbmFtZT09PU5lfWlzT3BlcmEoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUZzfWlzRmlyZWZveCgpe3JldHVybiB0aGlzLl9uYW1lPT09QnN9aXNJRXhwbG9yZXIoKXtyZXR1cm4gdGhpcy5fbmFtZT09PXhzfWlzU2FmYXJpKCl7cmV0dXJuIHRoaXMuX25hbWU9PT1qc31pc05XSlMoKXtyZXR1cm4gdGhpcy5fbmFtZT09PVVzfWlzRWxlY3Ryb24oKXtyZXR1cm4gdGhpcy5fbmFtZT09PSRzfWlzUmVhY3ROYXRpdmUoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUhzfHxuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZT09PSEwfWdldFZlcnNpb24oKXtyZXR1cm4gdGhpcy5fdmVyc2lvbn1pc01vYmlsZSgpe3JldHVybiB0aGlzLl9ib3dzZXIuZ2V0UGxhdGZvcm1UeXBlKCk9PT0ibW9iaWxlIn1fY2hlY2tDb25kaXRpb24ocil7aWYodGhpcy5fdmVyc2lvbilyZXR1cm4gdGhpcy5fYm93c2VyLnNhdGlzZmllcyhyKX1pc1ZlcnNpb25HcmVhdGVyVGhhbihyKXtyZXR1cm4gdGhpcy5fY2hlY2tDb25kaXRpb24oe1t0aGlzLl9uYW1lXTpgPiR7cn1gfSl9aXNWZXJzaW9uTGVzc1RoYW4ocil7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YDwke3J9YH0pfWlzVmVyc2lvbkVxdWFsVG8ocil7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YH4ke3J9YH0pfX1jbGFzcyBwZCBleHRlbmRzIHVke2RvZXNWaWRlb011dGVCeVN0cmVhbVJlbW92ZSgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c1AyUCgpe3JldHVybiF0aGlzLnVzZXNVbmlmaWVkUGxhbigpfWlzQ2hyb21pdW1CYXNlZCgpe3JldHVybiB0aGlzLmlzQ2hyb21lKCl8fHRoaXMuaXNFbGVjdHJvbigpfHx0aGlzLmlzTldKUygpfHx0aGlzLmlzT3BlcmEoKX1pc1dlYktpdEJhc2VkKCl7cmV0dXJuIHRoaXMuX2Jvd3Nlci5pc0VuZ2luZSgid2Via2l0IikmJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzIT0idW5kZWZpbmVkIiYmdHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhIT0idW5kZWZpbmVkIiYmdHlwZW9mIHdpbmRvdy5SVENSdHBUcmFuc2NlaXZlciE9InVuZGVmaW5lZCImJk9iamVjdC5rZXlzKFJUQ1J0cFRyYW5zY2VpdmVyLnByb3RvdHlwZSkuaW5kZXhPZigiY3VycmVudERpcmVjdGlvbiIpPi0xfWlzU3VwcG9ydGVkKCl7cmV0dXJuIHR5cGVvZiBSVENQZWVyQ29ubmVjdGlvbiE9InVuZGVmaW5lZCJ9aXNVc2VySW50ZXJhY3Rpb25SZXF1aXJlZEZvclVubXV0ZSgpe3JldHVybiB0aGlzLmlzRmlyZWZveCgpJiZ0aGlzLmlzVmVyc2lvbkxlc3NUaGFuKCI2OCIpfXN1cHBvcnRzVmlkZW9NdXRlT25Db25uSW50ZXJydXB0ZWQoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc1JlYWN0TmF0aXZlKCl8fHRoaXMuaXNXZWJLaXRCYXNlZCgpfXN1cHBvcnRzQmFuZHdpZHRoU3RhdGlzdGljcygpe3JldHVybiF0aGlzLmlzRmlyZWZveCgpJiYhdGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNDb2RlY1ByZWZlcmVuY2VzKCl7cmV0dXJuIHRoaXMudXNlc1VuaWZpZWRQbGFuKCkmJnR5cGVvZiB3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyh3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIucHJvdG90eXBlKS5pbmRleE9mKCJzZXRDb2RlY1ByZWZlcmVuY2VzIik+LTEmJk9iamVjdC5rZXlzKFJUQ1J0cFNlbmRlci5wcm90b3R5cGUpLmluZGV4T2YoImdldENhcGFiaWxpdGllcyIpPi0xJiYhdGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNEZXZpY2VDaGFuZ2VFdmVudCgpe3JldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5vbmRldmljZWNoYW5nZSE9InVuZGVmaW5lZCImJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmFkZEV2ZW50TGlzdGVuZXIhPSJ1bmRlZmluZWQifXN1cHBvcnRzTG9jYWxDYW5kaWRhdGVSdHRTdGF0aXN0aWNzKCl7cmV0dXJuIHRoaXMuaXNDaHJvbWl1bUJhc2VkKCl8fHRoaXMuaXNSZWFjdE5hdGl2ZSgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c1BlcmZvcm1hbmNlT2JzZXJ2ZXIoKXtyZXR1cm4gdHlwZW9mIHdpbmRvdy5QZXJmb3JtYW5jZU9ic2VydmVyIT0idW5kZWZpbmVkIiYmUGVyZm9ybWFuY2VPYnNlcnZlci5zdXBwb3J0ZWRFbnRyeVR5cGVzLmluZGV4T2YoImxvbmd0YXNrIik+LTF9c3VwcG9ydHNSZWNlaXZlclN0YXRzKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3cuUlRDUnRwUmVjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyhSVENSdHBSZWNlaXZlci5wcm90b3R5cGUpLmluZGV4T2YoImdldFN5bmNocm9uaXphdGlvblNvdXJjZXMiKT4tMX1zdXBwb3J0c1JUVFN0YXRpc3RpY3MoKXtyZXR1cm4hdGhpcy5pc0ZpcmVmb3goKX11c2VzUGxhbkIoKXtyZXR1cm4hdGhpcy51c2VzVW5pZmllZFBsYW4oKX11c2VzU2RwTXVuZ2luZ0ZvclNpbXVsY2FzdCgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzUmVhY3ROYXRpdmUoKXx8dGhpcy5pc1dlYktpdEJhc2VkKCl9dXNlc1VuaWZpZWRQbGFuKCl7cmV0dXJuISEodGhpcy5pc0ZpcmVmb3goKXx8dGhpcy5pc1dlYktpdEJhc2VkKCkpfXVzZXNOZXdHdW1GbG93KCl7cmV0dXJuISEodGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc0ZpcmVmb3goKXx8dGhpcy5pc1dlYktpdEJhc2VkKCkpfXVzZXNBZGFwdGVyKCl7cmV0dXJuIHRoaXMudXNlc05ld0d1bUZsb3coKX11c2VzUmlkc0ZvclNpbXVsY2FzdCgpe3JldHVybiExfXN1cHBvcnRzR2V0RGlzcGxheU1lZGlhKCl7cmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IuZ2V0RGlzcGxheU1lZGlhIT0idW5kZWZpbmVkInx8dHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXREaXNwbGF5TWVkaWEhPSJ1bmRlZmluZWQifXN1cHBvcnRzSW5zZXJ0YWJsZVN0cmVhbXMoKXtpZighKHR5cGVvZiB3aW5kb3cuUlRDUnRwU2VuZGVyIT0idW5kZWZpbmVkIiYmKHdpbmRvdy5SVENSdHBTZW5kZXIucHJvdG90eXBlLmNyZWF0ZUVuY29kZWRTdHJlYW1zfHx3aW5kb3cuUlRDUnRwU2VuZGVyLnByb3RvdHlwZS5jcmVhdGVFbmNvZGVkVmlkZW9TdHJlYW1zKSkpcmV0dXJuITE7Y29uc3Qgcj1uZXcgUmVhZGFibGVTdHJlYW07dHJ5e3JldHVybiB3aW5kb3cucG9zdE1lc3NhZ2UociwiKiIsW3JdKSwhMH1jYXRjaChlKXtyZXR1cm4hMX19c3VwcG9ydHNBdWRpb1JlZCgpe3JldHVybiBCb29sZWFuKHdpbmRvdy5SVENSdHBTZW5kZXImJndpbmRvdy5SVENSdHBTZW5kZXIuZ2V0Q2FwYWJpbGl0aWVzJiZ3aW5kb3cuUlRDUnRwU2VuZGVyLmdldENhcGFiaWxpdGllcygiYXVkaW8iKS5jb2RlY3Muc29tZShyPT5yLm1pbWVUeXBlPT09ImF1ZGlvL3JlZCIpJiZ3aW5kb3cuUlRDUnRwUmVjZWl2ZXImJndpbmRvdy5SVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMmJndpbmRvdy5SVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMoImF1ZGlvIikuY29kZWNzLnNvbWUocj0+ci5taW1lVHlwZT09PSJhdWRpby9yZWQiKSl9c3VwcG9ydHNTZHBTZW1hbnRpY3MoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKX1fZ2V0Q2hyb21pdW1CYXNlZFZlcnNpb24oKXtpZih0aGlzLmlzQ2hyb21pdW1CYXNlZCgpKXtpZih0aGlzLmlzTldKUygpKXJldHVybiBOdW1iZXIucGFyc2VJbnQocHJvY2Vzcy52ZXJzaW9ucy5jaHJvbWl1bSwxMCk7Y29uc3Qgcj1uYXZpZ2F0b3IudXNlckFnZW50O2lmKHIubWF0Y2goL0Nocm9tZS8pKXJldHVybiBOdW1iZXIucGFyc2VJbnQoci5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdLDEwKX1yZXR1cm4tMX1pc0lPU01vYmlsZSgpe3JldHVybiB0aGlzLmlzTW9iaWxlJiZ0aGlzLl9ib3dzZXIuZ2V0T1NOYW1lKCk9PT0iaU9TIn19Y29uc3QgaGQ9bmV3IHBkO2NsYXNzIGZke2NvbnN0cnVjdG9yKCl7cCh0aGlzLCJsb2dzQ2FjaGUiLFtdKTtwKHRoaXMsImxvZ3NQcm9jZXNzb3JUaW1lciIpO3AodGhpcywidHJhY2luZ0VuYWJsZWQiLCEwKTtwKHRoaXMsImluaXRpYWxpemVkIiwhMSk7cCh0aGlzLCJsb2dzUHJvY2Vzc2luZ0ludGVydmFsIiw3ZTMpO3AodGhpcywibG9nRXhjbHVzaW9uTGlzdCIsWyJtZXNzYWdlIiwid2Vic29ja2V0L21lc3NhZ2UiLCJyb29tTWVzc2FnZSIsIndlYnNvY2tldC9yb29tLW1lc3NhZ2UiLCJ3ZWJzb2NrZXQvcm9vbS1sZWdhY3ktbW9kZSIsImNoYXRNZXNzYWdlIiwid2Vic29ja2V0L25ldy1jaGF0LW1lc3NhZ2UiLCJ3ZWJzb2NrZXQvbm8tYWN0aXZlLXNwZWFrZXIiLCJ3ZWJzb2NrZXQvc2VsZWN0ZWQtcGVlcnMiLCJ3ZWJzb2NrZXQvYWN0aXZlLXNwZWFrZXIiLCJwaW5nIiwid2Vic29ja2V0L25ldy1jb25zdW1lciIsIndlYnNvY2tldC9wcm9kdWNlci1zY29yZSIsIndlYnNvY2tldC9jb25zdW1lci1zY29yZSIsIndlYnNvY2tldC9wbHVnaW4tZXZlbnQiLCJ3ZWJzb2NrZXQvcGx1Z2luLWRhdGEiLCJ3ZWJzb2NrZXQvcGx1Z2luLWludGVybmFsLWRhdGEiXSk7cCh0aGlzLCJtZWV0aW5nTWV0YWRhdGEiLHt9KX1nZXQgbG9nc0VuZHBvaW50KCl7Y29uc3Qgcj1QZS5nZXRDb250ZXh0KHRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZCk7cmV0dXJuYGh0dHBzOi8vJHtRYyh7c2VydmljZVByZWZpeDoiYXBpLXNpbG9zIixiYXNlVVJJOnIuZ2V0VmFsdWUoImJhc2VVUkkiKX0pfS9vdGVsL2xvZ3NgfXJlc2V0UGVlcklkKHIpe3RoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZD1yfWluaXQocixlLHMpe3RoaXMudHJhY2luZ0VuYWJsZWQ9ITAsdGhpcy5pbml0aWFsaXplZD0hMSx0aGlzLmxvZ3NDYWNoZT1bXTtjb25zdCBuPXIuZ2V0VmFsdWUoInBlZXJJZCIpO3RoaXMubWVldGluZ01ldGFkYXRhPWUsdGhpcy50cmFjaW5nRW5hYmxlZD1zLHRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZD1uLHRoaXMubWVldGluZ01ldGFkYXRhLnNka1ZlcnNpb249ci5nZXRWYWx1ZSgic2RrVmVyc2lvbiIpO2NvbnN0e1JORGV2aWNlSW5mb0ltcGw6aX09bmF2aWdhdG9yO3RoaXMubWVldGluZ01ldGFkYXRhLmRldmljZUluZm89bmF2aWdhdG9yLmlzUmVhY3ROYXRpdmU/aT09bnVsbD92b2lkIDA6aS5nZXREZXZpY2VJbmZvKCk6aGQuZ2V0RGV2aWNlSW5mbygpLHRoaXMubWVldGluZ01ldGFkYXRhLnZpc2l0ZWRVcmw9IW5hdmlnYXRvci5pc1JlYWN0TmF0aXZlJiZ0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LmxvY2F0aW9uLmhyZWYsdGhpcy5sb2dzUHJvY2Vzc29yVGltZXI9c2V0SW50ZXJ2YWwodGhpcy5wcm9jZXNzQ2FjaGVkTG9ncy5iaW5kKHRoaXMpLHRoaXMubG9nc1Byb2Nlc3NpbmdJbnRlcnZhbCkscyYmKHRoaXMuaW5pdGlhbGl6ZWQ9ITApfXN0YXRpYyB0cmFjZShyLGU9dm9pZCAwKXtyZXR1cm4ocyxuLGkpPT57Y29uc3QgYT1pLnZhbHVlO3JldHVybiBpLnZhbHVlPWZ1bmN0aW9uKC4uLm8pe3ZhciBFO2NvbnN0IGw9dGhpcz09bnVsbD92b2lkIDA6dGhpcy50ZWxlbWV0cnk7aWYoIWx8fCFsLmluaXRpYWxpemVkfHxuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZXx8IWwudHJhY2luZ0VuYWJsZWR8fChFPVBlLmdldENvbnRleHQobC5tZWV0aW5nTWV0YWRhdGEucGVlcklkKSkhPW51bGwmJkUuZ2V0VmFsdWUoImZsYWdzbWl0aCIpLmhhc0ZlYXR1cmUoenQuU0tJUF9PVEVMX1RSQUNFUykpcmV0dXJuIGEuYXBwbHkodGhpcyxvKTtsLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLHIsZSk7Y29uc3QgZj1wZXJmb3JtYW5jZS5ub3coKSx2PWEuYXBwbHkodGhpcyxvKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oKCk9Pntjb25zdCB3PXBlcmZvcm1hbmNlLm5vdygpO3ctZj4xMCYmbC5hZGRMb2dJbkN1cnJlbnRTcGFuKCJpbmZvIixgJHtyfV90aW1pbmdgLHtleGVjVGltZTp3LWZ9KX0pLmNhdGNoKCgpPT57Y29uc3Qgdz1wZXJmb3JtYW5jZS5ub3coKTtsLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLGAke3J9X3RpbWluZ2Ase2V4ZWNUaW1lOnctZn0pfSksdn0saX19aW5qZWN0Q29udGV4dChyKXt2YXIgbjtjb25zdCBlPUtjKCkucmVwbGFjZSgvLS9nLCIiKS5zdWJzdHJpbmcoMCwxNikscz0obj10aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpPT1udWxsP3ZvaWQgMDpuLnJlcGxhY2UoLy0vZywiIik7ci5UUkFDRVBBUkVOVD1gMDAtJHtzfS0ke2V9LTAxYH1hZGRMb2dJbkN1cnJlbnRTcGFuKHIsZSxzPXt9LG49ITEpe3MhPW51bGwmJnMuZXJyb3ImJk9iamVjdC5hc3NpZ24ocyx7ZXJyb3I6UnQocy5lcnJvcil9KTtjb25zdCBpPVBlLmdldENvbnRleHQodGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKTtpZihYYyhpKSYmKFljKHMpP2NvbnNvbGVbcl0oIkludGVybmFsTG9nczo6ICIscixlKTpjb25zb2xlW3JdKCJJbnRlcm5hbExvZ3M6OiAiLHIsZSxzKSksISFaYyhpLHIpKXRyeXtjb25zdCBkPURzKGksZSxzLCJtZXRhZGF0YSIpLG89bmV3IERhdGUsbD1vdChRKHttZXNzYWdlOmUsbGV2ZWw6cn0sZCkse2xvZ2dlZEF0Om8udG9JU09TdHJpbmcoKSxsb2dnZWRBdFR6T2Zmc2V0Om8uZ2V0VGltZXpvbmVPZmZzZXQoKX0pO24/dGhpcy5zZW5kT3RlbExvZ3NUb05ld1JlbGljKFtsXSk6dGhpcy5sb2dzQ2FjaGUucHVzaChsKX1jYXRjaChkKXt0aGlzLmFkZExvZ0luQ3VycmVudFNwYW4oImVycm9yIiwib3BlbnRlbGVtZXRyeTo6YWRkTG9nSW5DdXJyZW50U3Bhbl9mYWlsZWQiLHtlcnJvcjpSdChkKX0pfX1zZW5kT3RlbExvZ3NUb05ld1JlbGljKHIpe2NvbnN0IGU9UGUuZ2V0Q29udGV4dCh0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpO2ZldGNoKHRoaXMubG9nc0VuZHBvaW50LHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIixBdXRob3JpemF0aW9uOmBCZWFyZXIgJHtlLmdldFZhbHVlKCJhdXRoVG9rZW4iKX1gfSxib2R5OkpTT04uc3RyaW5naWZ5KHttZWV0aW5nTWV0YWRhdGE6RHMoZSwic2VuZE90ZWxMb2dzVG9OZXdSZWxpYyIsdGhpcy5tZWV0aW5nTWV0YWRhdGEsIm1lZXRpbmdNZXRhZGF0YSIpLHNlcnZpY2VOYW1lOmUuZ2V0VmFsdWUoInNka05hbWUiKSxsb2dzOnJ9KX0pLmNhdGNoKHM9Pnt0aGlzLmFkZExvZ0luQ3VycmVudFNwYW4oImVycm9yIiwib3BlbnRlbGVtZXRyeTo6c2VuZE90ZWxMb2dUb05ld1JlbGljX2ZhaWxlZCIse2Vycm9yOlJ0KHMpfSksdGhpcy5sb2dzQ2FjaGUucHVzaCguLi5yKX0pfXByb2Nlc3NDYWNoZWRMb2dzKCl7Y29uc3Qgcj10aGlzLmxvZ3NDYWNoZS5zcGxpY2UoMCwyNSk7ciE9bnVsbCYmci5sZW5ndGgmJnRoaXMuc2VuZE90ZWxMb2dzVG9OZXdSZWxpYyhyKX1kZXN0cnVjdCgpe2NsZWFySW50ZXJ2YWwodGhpcy5sb2dzUHJvY2Vzc29yVGltZXIpLHRoaXMucHJvY2Vzc0NhY2hlZExvZ3MoKX19ZnVuY3Rpb24gbWQodCl7Y29uc3Qgcj1RKHt9LHQpLGU9bmV3IE1hcCxzPShsLGYpPT4oZS5oYXMobCl8fGUuc2V0KGwsbmV3IFNldCksZS5nZXQobCkuYWRkKGYpLCgpPT57dmFyIHY7cmV0dXJuKHY9ZS5nZXQobCkpPT1udWxsP3ZvaWQgMDp2LmRlbGV0ZShmKX0pLG49KGwsZik9Pnt2YXIgdjsodj1lLmdldChsKSk9PW51bGx8fHYuZGVsZXRlKGYpfSxpPWw9Pnt2YXIgZjsoZj1lLmdldChsKSk9PW51bGx8fGYuZm9yRWFjaCh2PT57dHJ5e3YocltsXSl9Y2F0Y2goRSl7fX0pfTtyZXR1cm57c3Vic2NyaWJlOnMsdW5zdWJzY3JpYmU6bixub3RpZnk6aSxzZXRWYWx1ZToobCxmLHY9ITApPT57cltsXT1mLHYmJmkobCl9LGdldFZhbHVlOmw9PnJbbF0sZ2V0QWxsVmFsdWVzOigpPT5yfX1jbGFzcyBnZHtjb25zdHJ1Y3Rvcigpe3AodGhpcywiY29udGV4dHMiLG5ldyBNYXApO3AodGhpcywibW9zdFJlY2VudFBlZXJJZCIsbnVsbCl9Y3JlYXRlQ29udGV4dChyLGUpe2lmKHRoaXMuY29udGV4dHMuaGFzKHIpKXJldHVybiB0aGlzLmNvbnRleHRzLmdldChyKTtjb25zdCBzPW5ldyBmZCxuPW5ldyBCYzt0aGlzLmNvbnRleHRzLnNldChyLG1kKGUpKSx0aGlzLmNvbnRleHRzLmdldChyKS5zZXRWYWx1ZSgicGVlclNlc3Npb25TdG9yZSIsbmV3IEt0KG4pKTtjb25zdCBpPW5ldyBOcjtyZXR1cm4gaS5zZXRNYXhMaXN0ZW5lcnMoNTApLHRoaXMuY29udGV4dHMuZ2V0KHIpLnNldFZhbHVlKCJsb2dnZXIiLG4pLHRoaXMuY29udGV4dHMuZ2V0KHIpLnNldFZhbHVlKCJ0ZWxlbWV0cnkiLHMpLHRoaXMuY29udGV4dHMuZ2V0KHIpLnNldFZhbHVlKCJjYWxsc3RhdHMiLGkpLHRoaXMuY29udGV4dHMuZ2V0KHIpLnNldFZhbHVlKCJmbGFnc21pdGgiLEFjKCkpLHRoaXMubW9zdFJlY2VudFBlZXJJZD1yLHRoaXMuY29udGV4dHMuZ2V0KHIpfXJlbWFwQ29udGV4dChyLGUpe2NvbnN0IHM9ZS5nZXRWYWx1ZSgicGVlcklkIik7cyE9PXImJihlLnNldFZhbHVlKCJwZWVySWQiLHIpLHRoaXMubW9zdFJlY2VudFBlZXJJZD1yLHRoaXMuY29udGV4dHMuc2V0KHIsZSksdGhpcy5jb250ZXh0cy5kZWxldGUocykpfWdldENvbnRleHQocil7cmV0dXJuIHRoaXMuY29udGV4dHMuZ2V0KHIpfWdldE1vc3RSZWNlbnRQZWVySWQoKXtyZXR1cm4gdGhpcy5tb3N0UmVjZW50UGVlcklkfX12YXIgUGU9bmV3IGdkO2NvbnN0IFNkPXsiMDAiOiJDbGllbnQiLCIwMSI6IkNvbnRyb2xsZXIiLCIwMiI6IlJvb21Ob2RlQ2xpZW50IiwiMDMiOiJIaXZlTm9kZUNsaWVudCIsIjA0IjoiU29ja2V0U2VydmljZSIsIjA1IjoiQ2hhdCIsIjA2IjoiUGx1Z2luIiwiMDciOiJQb2xscyIsIjA4IjoiTWV0YSIsIjA5IjoiUHJlc2V0IiwxMDoiUmVjb3JkaW5nIiwxMToiU2VsZiIsMTI6IlBhcnRpY2lwYW50IiwxMzoiU3BvdGxpZ2h0IiwxNDoiUmVtb3RlIFJlcXVlc3QiLDE1OiJXZWJpbmFyIiwxNjoiTG9jYWxNZWRpYUhhbmRsZXIiLDE3OiJFbmQtRW5kIEVuY3J5cHRpb24iLDE4OiJBSSIsMTk6IkxpdmVzdHJlYW0iLDIwOiJTdGFnZSJ9LEN0PXsiMDAwMCI6IkludGVybmFsIGV4Y2VwdGlvbi4iLCIwMDAxIjoiRmFpbGVkIHRvIGluaXRpYWxpemUuIiwiMDAwMiI6IkZhaWxlZCB0byBqb2luIHJvb20uIiwiMDAwMyI6IkZhaWxlZCB0byBsZWF2ZSByb29tLiIsIjAwMDQiOiJJbnZhbGlkIGF1dGggdG9rZW4iLCIwMDEwIjoiQnJvd3NlciBub3Qgc3VwcG9ydGVkIiwiMDAxMSI6IkhUVFAgTmV0d29yayBFcnJvciIsIjAwMTIiOiJXZWJzb2NrZXQgTmV0d29yayBFcnJvciIsIjAwMTMiOiJSYXRlIExpbWl0ZWQiLCIwMTAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDEwMSI6IlBlcm1pc3Npb24gZGVuaWVkIiwiMDEwMiI6IlByZXJlcXVpc2l0ZSBtb2R1bGUgbWlzc2luZyIsIjAyMDAiOiJJbnRlcm5hbCBleGNlcHRpb24uIiwiMDMwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA0MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNDA0IjoiTWlzc2luZyBwcmVyZXF1aXNpdGVzIHRvIGVzdGFibGlzaCBhIHdlYnNvY2tldCBjb25uZWN0aW9uIiwiMDUwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA1MDEiOiJQZXJtaXNzaW9uIGRlbmllZC4iLCIwNTAyIjoiSW52YWxpZCBtZXNzYWdlIGJvZHkuIiwiMDUwMyI6IlRleHQgTWVzc2FnZSBpcyB0b28gbGFyZ2UiLCIwNTA0IjoiTWVzc2FnZSBub3QgZm91bmQgYnkgdGhlIGdpdmVuIGlkIiwiMDUwNSI6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwiMDUwNiI6Ik1lc3NhZ2Ugc2VhcmNoIGlzIGRpc2FibGVkIiwiMDYwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA2MDEiOiJQZXJtaXNzaW9uIGRlbmllZC4iLCIwNjAyIjoiQXV0aCB0b2tlbiBub3Qgc2V0IGZvciBwbHVnaW4iLCIwNjAzIjoiSWZyYW1lIHdhcyBub3QgcHJvdmlkZWQiLCIwNzAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDcwNSI6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwiMDgwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA4MDEiOiJQZXJtaXNzaW9uIGRlbmllZCIsIjA5MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwOTA0IjoiQ291bGQgbm90IGxvYWQgcHJlc2V0IiwxZTM6IkludGVybmFsIGV4Y2VwdGlvbiIsMTAwMToiUGVybWlzc2lvbiBkZW5pZWQiLDEwMDQ6IkNvdWxkIG5vdCBmaW5kIHNwZWNpZmllZCByZWNvcmRpbmciLDEwMDU6IkFjdGlvbiBub3QgcGVybWl0dGVkIGluIGdpdmVuIHJlY29yZGluZyBzdGF0ZSIsMTEwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxMTAxOiJQZXJtaXNzaW9uIGRlbmllZCIsMTEwMjoiVW5zdXBwb3J0ZWQiLDExMDM6Ik5hbWUgY2Fubm90IGJlIGVtcHR5IiwxMTA0OiJObyBkZXZpY2Ugc2VsZWN0ZWQgd2hpbGUgY2FsbGluZyBtZWV0aW5nLnNlbGYuc2V0RGV2aWNlIiwxMTA1OiJBY3Rpb24gbm90IHBlcm1pdHRlZCB3aXRob3V0IGpvaW5pbmcgcm9vbSIsMTEwNjoiQ2FuJ3Qgc2V0IGN1cnJlbnRseSB1c2VkIGRldmljZSIsMTIwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxMjAxOiJQZXJtaXNzaW9uIGRlbmllZCIsMTIwMjoiSW52YWxpZCBwYWdlIG51bWJlciB3YXMgcmVxdWVzdGVkIiwxMjAzOiJJbnZhbGlkIHBhcnRpY2lwYW50IGNvdW50IHBlciBwYWdlIHdhcyByZXF1ZXN0ZWQiLDEyMDQ6Ik5vIHBhcnRpY2lwYW50cyBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gVXNlcklkcyIsMTIwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLDEyMDY6Ik1hbnVhbCBTdWJzY3JpcHRpb24gTW9kZSB3YXMgbm90IEFDVElWQVRFRCIsMTIwNzoiSW52YWxpZCB2aWV3IG1vZGUiLDEyMDg6Ik1hbnVhbCBTdWJzY3JpcHRpb24gbm90IGVuYWJsZWQgZm9yIG9yZ2FuaXphdGlvbiIsMTIwOToiQnJvYWRjYXN0IG1lc3NhZ2UgdHlwZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyIsMTMwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxNDAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE0MDI6Ik5vIGV4aXN0aW5nIHJlbW90ZSByZXF1ZXN0cyIsMTQwMzoiTm8gcGVlciBleGlzdHMgd2l0aCBnaXZlbiBpZCIsMTUwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxNjAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE2MDE6IkZhaWxlZCB0byBnZXQgYXVkaW8gdHJhY2siLDE2MDI6IkZhaWxlZCB0byBnZXQgdmlkZW8gdHJhY2siLDE2MDM6IkluY29ycmVjdCBkZXZpY2UiLDE2MDQ6IkZhaWxlZCB0byBjaGFuZ2UgZGV2aWNlIiwxNjA1OiJGYWlsZWQgdG8gZ2V0IGF1ZGlvICYgdmlkZW8gdHJhY2siLDE2MDY6Ik5vIGF1ZGlvIGlucHV0IGRldmljZXMgYXJlIGF2YWlsYWJsZSIsMTYwNzoiTm8gdmlkZW8gaW5wdXQgZGV2aWNlcyBhcmUgYXZhaWxhYmxlIiwxNjA4OiJObyBhdWRpbyBvdXRwdXQgZGV2aWNlcyAoc3BlYWtlcnMpIGFyZSBhdmFpbGFibGUiLDE2MDk6IkZhaWxlZCB0byBmZXRjaCBsaXN0IG9mIG1lZGlhIGRldmljZXMiLDE2MTA6Ik5vIG1lZGlhIHRyYWNrIGV4aXN0cyIsMTYxMToiRmFpbGVkIHRvIHVubXV0ZSB0cmFjayIsMTYxMjoiRmFpbGVkIHRvIGdldCBzY3JlZW5zaGFyZSB0cmFja3MiLDE3MDE6IkNyeXB0byBlcnJvciIsMTgwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxODAxOiJDYW4ndCBmZXRjaCB0cmFuc2NyaXB0IGZpbGUiLDE5MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTkwMToiUGVybWlzc2lvbiBkZW5pZWQuIiwxOTAyOiJMaXZlc3RyZWFtIHRoYXQgaGFzIG5vdCB5ZXQgc3RhcnRlZCwgY2FuJ3QgYmUgc3RvcHBlZCIsMmUzOiJJbnRlcm5hbCBleGNlcHRpb24iLDIwMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwyMDAyOiJVbnN1cHBvcnRlZCIsMjAwMzoiU3RhZ2UgaXMgZGlzYWJsZWQiLDIwMDQ6Ik1ldGhvZCBub3QgaW1wbGVtZW50ZWQiLDIwMDU6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwyMDA2OiJBY3Rpb24gbm90IHBlcm1pdHRlZCBpbiBjdXJyZW50IHN0YWdlIHN0YXR1cyIsOTkwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIn07T2JqZWN0LmtleXMoQ3QpLmZvckVhY2godD0+e0N0W3RdPWB7JHtTZFt0LnNsaWNlKDAsMildfX0gJHtDdFt0XX1gfSk7Y2xhc3MgdmQgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlLHMsbj12b2lkIDAsaT0hMSl7c3VwZXIoZSk7cCh0aGlzLCJjb2RlIik7dGhpcy5jb2RlPXMsdGhpcy5uYW1lPSJDbGllbnRFcnJvciI7Y29uc3QgYT10aGlzLmNvZGU/YFtFUlIke3RoaXMuY29kZX1dYDoiW0VSUl0iLGQ9dGhpcy5jb2RlP0N0W3RoaXMuY29kZV06IiI7dGhpcy5tZXNzYWdlPWAke2F9OiAke2R9CiR7dGhpcy5tZXNzYWdlfWA7dHJ5e2xldCBvPWkmJiEhbjtzJiZzLmVuZHNXaXRoKCIwMCIpJiZuJiYobz0hMCksbyYmbi5lcnJvcigiQ2xpZW50RXJyb3IiLHtlcnJvcjp7bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsY29kZTpzfX0pO2NvbnN0IGw9UGUuZ2V0Q29udGV4dChQZS5nZXRNb3N0UmVjZW50UGVlcklkKCkpO2lmKGwpe2NvbnN0IGY9bC5nZXRWYWx1ZSgib25FcnJvciIpO3RyeXtmKHRoaXMpfWNhdGNoKHYpe319dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiQ2xpZW50RXJyb3IiLHtkZXRhaWw6dGhpc30pKX1jYXRjaChvKXt9fX12YXIgZmU9KHQ9Pih0W3QuSW52YWxpZEtleT0wXT0iSW52YWxpZEtleSIsdFt0Lk1pc3NpbmdLZXk9MV09Ik1pc3NpbmdLZXkiLHRbdC5JbnRlcm5hbEVycm9yPTJdPSJJbnRlcm5hbEVycm9yIix0KSkoZmV8fHt9KTtjbGFzcyBtZSBleHRlbmRzIHZke2NvbnN0cnVjdG9yKGUscz0yKXtzdXBlcihlLCIxNzAxIik7cCh0aGlzLCJyZWFzb24iKTt0aGlzLnJlYXNvbj1zfX1jbGFzcyBLcyBleHRlbmRzIHEuRXZlbnRFbWl0dGVye2NvbnN0cnVjdG9yKGUpe3N1cGVyKCk7cCh0aGlzLCJsb2dnZXIiKTt0aGlzLmxvZ2dlcj1lLHN1cGVyLnNldE1heExpc3RlbmVycygyNSl9ZW1pdChlLC4uLnMpe3JldHVybiBzdXBlci5lbWl0KCIqIixlLC4uLnMpLHN1cGVyLmVtaXQoZSwuLi5zKX1vbihlLHMpe3ZhciBuO3RyeXtjb25zdCBpPXRoaXMubGlzdGVuZXJDb3VudChlKTtpPjI1JiZpJTI1PT09MCYmKChuPXRoaXMubG9nZ2VyKT09bnVsbHx8bi53YXJuKCJDdXN0b21FdmVudEVtaXR0ZXI6Om1heExpc3RlbmVyc0V4Y2VlZGVkIix7ZXZlbnRMaXN0ZW5lcjp7ZXZlbnROYW1lOmUudG9TdHJpbmcoKSxsaXN0ZW5lckNvdW50OnRoaXMubGlzdGVuZXJDb3VudChlKX19KSl9Y2F0Y2goaSl7fXJldHVybiBzdXBlci5vbihlLHMpfWFkZExpc3RlbmVyKGUscyl7dmFyIG47dHJ5e2NvbnN0IGk9dGhpcy5saXN0ZW5lckNvdW50KGUpO2k+MjUmJmklMjU9PT0wJiYoKG49dGhpcy5sb2dnZXIpPT1udWxsfHxuLndhcm4oIkN1c3RvbUV2ZW50RW1pdHRlcjo6bWF4TGlzdGVuZXJzRXhjZWVkZWQiLHtldmVudExpc3RlbmVyOntldmVudE5hbWU6ZS50b1N0cmluZygpLGxpc3RlbmVyQ291bnQ6dGhpcy5saXN0ZW5lckNvdW50KGUpfX0pKX1jYXRjaChpKXt9cmV0dXJuIHN1cGVyLmFkZExpc3RlbmVyKGUscyl9b2ZmKGUscyl7cmV0dXJuIHN1cGVyLm9mZihlLHMpfW9uY2UoZSxzKXtyZXR1cm4gc3VwZXIub25jZShlLHMpfXByZXBlbmRMaXN0ZW5lcihlLHMpe3JldHVybiBzdXBlci5wcmVwZW5kTGlzdGVuZXIoZSxzKX1wcmVwZW5kT25jZUxpc3RlbmVyKGUscyl7cmV0dXJuIHN1cGVyLnByZXBlbmRPbmNlTGlzdGVuZXIoZSxzKX1yZW1vdmVMaXN0ZW5lcihlLHMpe3JldHVybiBzdXBlci5yZW1vdmVMaXN0ZW5lcihlLHMpfXJlbW92ZUFsbExpc3RlbmVycyhlKXtyZXR1cm4gc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKGUpfWxpc3RlbmVycyhlKXtyZXR1cm4gc3VwZXIubGlzdGVuZXJzKGUpfWxpc3RlbmVyQ291bnQoZSl7cmV0dXJuIHN1cGVyLmxpc3RlbmVyQ291bnQoZSl9fWNvbnN0IHF0PXtFcnJvcjoiY3J5cHRvckVycm9yIn07ZnVuY3Rpb24geWQodCl7cmV0dXJuInR5cGUiaW4gdH1mdW5jdGlvbiBiZChzKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbioodCxyPXtuYW1lOmt9LGU9ImVuY3J5cHQiKXtyZXR1cm4gY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoInJhdyIsdCxyLCExLGU9PT0iZGVyaXZlIj9bImRlcml2ZUJpdHMiLCJkZXJpdmVLZXkiXTpbImVuY3J5cHQiLCJkZWNyeXB0Il0pfSl9ZnVuY3Rpb24gV3ModCxyKXtjb25zdCBzPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShyKTtzd2l0Y2godCl7Y2FzZSJIS0RGIjpyZXR1cm57bmFtZToiSEtERiIsc2FsdDpzLGhhc2g6IlNIQS0yNTYiLGluZm86bmV3IEFycmF5QnVmZmVyKDEyOCl9O2Nhc2UiUEJLREYyIjpyZXR1cm57bmFtZToiUEJLREYyIixzYWx0OnMsaGFzaDoiU0hBLTI1NiIsaXRlcmF0aW9uczoxZTV9O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBhbGdvcml0aG0gJHt0fSBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWRgKX19ZnVuY3Rpb24genModCxyKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgZT1Xcyh0LmFsZ29yaXRobS5uYW1lLHIpLHM9eWllbGQgY3J5cHRvLnN1YnRsZS5kZXJpdmVLZXkoZSx0LHtuYW1lOmssbGVuZ3RoOjEyOH0sITEsWyJlbmNyeXB0IiwiZGVjcnlwdCJdKTtyZXR1cm57bWF0ZXJpYWw6dCxlbmNyeXB0aW9uS2V5OnN9fSl9ZnVuY3Rpb24gRWQodCxyKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgZT1Xcyh0LmFsZ29yaXRobS5uYW1lLHIpO3JldHVybiBjcnlwdG8uc3VidGxlLmRlcml2ZUJpdHMoZSx0LDI1Nil9KX1jbGFzcyBfZCBleHRlbmRzIEtze31jbGFzcyBHcyBleHRlbmRzIF9ke2NvbnN0cnVjdG9yKGUpe3ZhciBzO3N1cGVyKHZvaWQgMCk7cCh0aGlzLCJzZW5kQ291bnRzIik7cCh0aGlzLCJpc0tleUludmFsaWQiLCExKTtwKHRoaXMsInBhcnRpY2lwYW50SWQiKTtwKHRoaXMsInRyYWNrSWQiKTtwKHRoaXMsImtleXMiKTtwKHRoaXMsInZpZGVvQ29kZWMiKTtwKHRoaXMsInJ0cE1hcCIpO3AodGhpcywia2V5UHJvdmlkZXJPcHRpb25zIik7cCh0aGlzLCJ1bmVuY3J5cHRlZEZyYW1lQnl0ZVRyYWlsZXIiKTt0aGlzLnNlbmRDb3VudHM9bmV3IE1hcCx0aGlzLmtleXM9ZS5rZXlzLHRoaXMucGFydGljaXBhbnRJZD1lLnBhcnRpY2lwYW50SWQsdGhpcy5ydHBNYXA9bmV3IE1hcCx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucz1lLmtleVByb3ZpZGVyT3B0aW9ucyx0aGlzLnVuZW5jcnlwdGVkRnJhbWVCeXRlVHJhaWxlcj0ocz1lLnVuZW5jcnlwdGVkRnJhbWVCeXRlcykhPW51bGw/czpuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoIkxLUk9DS1MiKX1zZXRQYXJ0aWNpcGFudChlLHMpe3RoaXMucGFydGljaXBhbnRJZD1lLHRoaXMua2V5cz1zfXVuc2V0UGFydGljaXBhbnQoKXt0aGlzLnBhcnRpY2lwYW50SWQ9dm9pZCAwfWdldFBhcnRpY2lwYW50SWQoKXtyZXR1cm4gdGhpcy5wYXJ0aWNpcGFudElkfWdldFRyYWNrSWQoKXtyZXR1cm4gdGhpcy50cmFja0lkfXNldFZpZGVvQ29kZWMoZSl7dGhpcy52aWRlb0NvZGVjPWV9c2V0UnRwTWFwKGUpe3RoaXMucnRwTWFwPWV9c2V0dXBUcmFuc2Zvcm0oZSxzLG4saSxhKXthJiYodGhpcy52aWRlb0NvZGVjPWEpO2NvbnN0IGQ9ZT09PSJlbmNvZGUiP3RoaXMuZW5jb2RlRnVuY3Rpb246dGhpcy5kZWNvZGVGdW5jdGlvbixvPW5ldyBUcmFuc2Zvcm1TdHJlYW0oe3RyYW5zZm9ybTpkLmJpbmQodGhpcyl9KTtzLnBpcGVUaHJvdWdoKG8pLnBpcGVUbyhuKS5jYXRjaChsPT57dGhpcy5lbWl0KCJjcnlwdG9yRXJyb3IiLGwgaW5zdGFuY2VvZiBtZT9sOm5ldyBtZShsLm1lc3NhZ2UpKX0pLHRoaXMudHJhY2tJZD1pfWVuY29kZUZ1bmN0aW9uKGUscyl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBhO2lmKCF0aGlzLmtleXMuaXNFbmFibGVkKCl8fGUuZGF0YS5ieXRlTGVuZ3RoPT09MClyZXR1cm4gcy5lbnF1ZXVlKGUpO2NvbnN0e2VuY3J5cHRpb25LZXk6bn09dGhpcy5rZXlzLmdldEtleVNldCgpLGk9dGhpcy5rZXlzLmdldEN1cnJlbnRLZXlJbmRleCgpO2lmKG4pe2NvbnN0IGQ9dGhpcy5tYWtlSVYoKGE9ZS5nZXRNZXRhZGF0YSgpLnN5bmNocm9uaXphdGlvblNvdXJjZSkhPW51bGw/YTotMSxlLnRpbWVzdGFtcCksbz1uZXcgVWludDhBcnJheShlLmRhdGEsMCx0aGlzLmdldFVuZW5jcnlwdGVkQnl0ZXMoZSkpLGw9bmV3IFVpbnQ4QXJyYXkoMik7bFswXT1kZSxsWzFdPWk7dHJ5e2NvbnN0IGY9eWllbGQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KHtuYW1lOmssaXY6ZCxhZGRpdGlvbmFsRGF0YTpuZXcgVWludDhBcnJheShlLmRhdGEsMCxvLmJ5dGVMZW5ndGgpfSxuLG5ldyBVaW50OEFycmF5KGUuZGF0YSx0aGlzLmdldFVuZW5jcnlwdGVkQnl0ZXMoZSkpKSx2PW5ldyBBcnJheUJ1ZmZlcihvLmJ5dGVMZW5ndGgrZi5ieXRlTGVuZ3RoK2QuYnl0ZUxlbmd0aCtsLmJ5dGVMZW5ndGgpLEU9bmV3IFVpbnQ4QXJyYXkodik7cmV0dXJuIEUuc2V0KG8pLEUuc2V0KG5ldyBVaW50OEFycmF5KGYpLG8uYnl0ZUxlbmd0aCksRS5zZXQobmV3IFVpbnQ4QXJyYXkoZCksby5ieXRlTGVuZ3RoK2YuYnl0ZUxlbmd0aCksRS5zZXQobCxvLmJ5dGVMZW5ndGgrZi5ieXRlTGVuZ3RoK2QuYnl0ZUxlbmd0aCksZS5kYXRhPXYscy5lbnF1ZXVlKGUpfWNhdGNoKGYpe319ZWxzZSB0aGlzLmVtaXQocXQuRXJyb3IsbmV3IG1lKCJlbmNyeXB0aW9uIGtleSBtaXNzaW5nIGZvciBlbmNvZGluZyIsZmUuTWlzc2luZ0tleSkpfSl9ZGVjb2RlRnVuY3Rpb24oZSxzKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7aWYoIXRoaXMua2V5cy5pc0VuYWJsZWQoKXx8ZS5kYXRhLmJ5dGVMZW5ndGg9PT0wfHxUZChlLmRhdGEsdGhpcy51bmVuY3J5cHRlZEZyYW1lQnl0ZVRyYWlsZXIpKXJldHVybiBzLmVucXVldWUoZSk7Y29uc3QgaT1uZXcgVWludDhBcnJheShlLmRhdGEpW2UuZGF0YS5ieXRlTGVuZ3RoLTFdO2lmKHRoaXMua2V5cy5nZXRLZXlTZXQoaSkpdHJ5e2NvbnN0IGE9eWllbGQgdGhpcy5kZWNyeXB0RnJhbWUoZSxpKTtpZihhKXJldHVybiBzLmVucXVldWUoYSk7dGhpcy5pc0tleUludmFsaWQ9ITF9Y2F0Y2goYSl7YSBpbnN0YW5jZW9mIG1lJiZhLnJlYXNvbj09PWZlLkludmFsaWRLZXkmJih0aGlzLmlzS2V5SW52YWxpZHx8KHRoaXMuZW1pdChxdC5FcnJvcixuZXcgbWUoYGludmFsaWQga2V5IGZvciBwYXJ0aWNpcGFudCAke3RoaXMucGFydGljaXBhbnRJZH1gLGZlLkludmFsaWRLZXkpKSx0aGlzLmlzS2V5SW52YWxpZD0hMCkpfWVsc2UgdGhpcy5lbWl0KHF0LkVycm9yLG5ldyBtZShga2V5IG1pc3NpbmcgZm9yIHBhcnRpY2lwYW50ICR7dGhpcy5wYXJ0aWNpcGFudElkfWAsZmUuTWlzc2luZ0tleSkpO3JldHVybiBzLmVucXVldWUoZSl9KX1kZWNyeXB0RnJhbWUoYSxkKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooZSxzLG49dm9pZCAwLGk9e3JhdGNoZXRDb3VudDowfSl7dmFyIGw7Y29uc3Qgbz10aGlzLmtleXMuZ2V0S2V5U2V0KHMpO3RyeXtjb25zdCBmPW5ldyBVaW50OEFycmF5KGUuZGF0YSwwLHRoaXMuZ2V0VW5lbmNyeXB0ZWRCeXRlcyhlKSksdj1uZXcgVWludDhBcnJheShlLmRhdGEsZS5kYXRhLmJ5dGVMZW5ndGgtMiwyKSxFPXZbMF0sdz1uZXcgVWludDhBcnJheShlLmRhdGEsZS5kYXRhLmJ5dGVMZW5ndGgtRS12LmJ5dGVMZW5ndGgsRSkseD1mLmJ5dGVMZW5ndGgsVT1lLmRhdGEuYnl0ZUxlbmd0aC0oZi5ieXRlTGVuZ3RoK0Urdi5ieXRlTGVuZ3RoKSxMPXlpZWxkIGNyeXB0by5zdWJ0bGUuZGVjcnlwdCh7bmFtZTprLGl2OncsYWRkaXRpb25hbERhdGE6bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsZi5ieXRlTGVuZ3RoKX0sKGw9aS5lbmNyeXB0aW9uS2V5KSE9bnVsbD9sOm8uZW5jcnlwdGlvbktleSxuZXcgVWludDhBcnJheShlLmRhdGEseCxVKSksSD1uZXcgQXJyYXlCdWZmZXIoZi5ieXRlTGVuZ3RoK0wuYnl0ZUxlbmd0aCksWj1uZXcgVWludDhBcnJheShIKTtyZXR1cm4gWi5zZXQobmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsZi5ieXRlTGVuZ3RoKSksWi5zZXQobmV3IFVpbnQ4QXJyYXkoTCksZi5ieXRlTGVuZ3RoKSxlLmRhdGE9SCxlfWNhdGNoKGYpe2lmKHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRXaW5kb3dTaXplPjApe2lmKGkucmF0Y2hldENvdW50PHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRXaW5kb3dTaXplKXtsZXQgdjtpZihvPT09dGhpcy5rZXlzLmdldEtleVNldChzKSl7Y29uc3Qgdz15aWVsZCB0aGlzLmtleXMucmF0Y2hldEtleShzLCExKTt2PXlpZWxkIHpzKHcsdGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFNhbHQpfWNvbnN0IEU9eWllbGQgdGhpcy5kZWNyeXB0RnJhbWUoZSxzLG58fG8se3JhdGNoZXRDb3VudDppLnJhdGNoZXRDb3VudCsxLGVuY3J5cHRpb25LZXk6dj09bnVsbD92b2lkIDA6di5lbmNyeXB0aW9uS2V5fSk7cmV0dXJuIEUmJnYmJih0aGlzLmtleXMuc2V0S2V5U2V0KHYscywhMCksdGhpcy5rZXlzLnNldEN1cnJlbnRLZXlJbmRleChzKSksRX1uJiZ0aGlzLmtleXMuc2V0S2V5RnJvbU1hdGVyaWFsKG4ubWF0ZXJpYWwscyl9ZWxzZSB0aHJvdyBuZXcgbWUoIkRlY3J5cHRpb24gZmFpbGVkLCBtb3N0IGxpa2VseSBiZWNhdXNlIG9mIGFuIGludmFsaWQga2V5IixmZS5JbnZhbGlkS2V5KX19KX1tYWtlSVYoZSxzKXt2YXIgZDtjb25zdCBuPW5ldyBBcnJheUJ1ZmZlcihkZSksaT1uZXcgRGF0YVZpZXcobik7dGhpcy5zZW5kQ291bnRzLmhhcyhlKXx8dGhpcy5zZW5kQ291bnRzLnNldChlLE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSo2NTUzNSkpO2NvbnN0IGE9KGQ9dGhpcy5zZW5kQ291bnRzLmdldChlKSkhPW51bGw/ZDowO3JldHVybiBpLnNldFVpbnQzMigwLGUpLGkuc2V0VWludDMyKDQscyksaS5zZXRVaW50MzIoOCxzLWElNjU1MzUpLHRoaXMuc2VuZENvdW50cy5zZXQoZSxhKzEpLG59Z2V0VW5lbmNyeXB0ZWRCeXRlcyhlKXt2YXIgcztpZih5ZChlKSl7Y29uc3Qgbj0ocz10aGlzLmdldFZpZGVvQ29kZWMoZSkpIT1udWxsP3M6dGhpcy52aWRlb0NvZGVjO2lmKG49PT0iYXYxInx8bj09PSJ2cDkiKXRocm93IG5ldyBFcnJvcihgJHtufSBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgZW5kIHRvIGVuZCBlbmNyeXB0aW9uYCk7cmV0dXJuIE1bZS50eXBlXX1yZXR1cm4gTS5hdWRpb31nZXRWaWRlb0NvZGVjKGUpe2lmKHRoaXMucnRwTWFwLnNpemU9PT0wKXJldHVybjtjb25zdHtwYXlsb2FkVHlwZTpzfT1lLmdldE1ldGFkYXRhKCk7cmV0dXJuIHM/dGhpcy5ydHBNYXAuZ2V0KHMpOnZvaWQgMH19ZnVuY3Rpb24gVGQodCxyKXtjb25zdCBlPW5ldyBVaW50OEFycmF5KHQuc2xpY2UodC5ieXRlTGVuZ3RoLXIuYnl0ZUxlbmd0aCkpO3JldHVybiByLmV2ZXJ5KChzLG4pPT5zPT09ZVtuXSl9Y2xhc3MgcXMgZXh0ZW5kcyBLc3tjb25zdHJ1Y3RvcihlLHMsbil7c3VwZXIodm9pZCAwKTtwKHRoaXMsImN1cnJlbnRLZXlJbmRleCIpO3AodGhpcywiY3J5cHRvS2V5UmluZyIpO3AodGhpcywiZW5hYmxlZCIpO3AodGhpcywia2V5UHJvdmlkZXJPcHRpb25zIik7cCh0aGlzLCJyYXRjaGV0UHJvbWlzZU1hcCIpO3AodGhpcywicGFydGljaXBhbnRJZCIpO3RoaXMuY3VycmVudEtleUluZGV4PTAsdGhpcy5jcnlwdG9LZXlSaW5nPW5ldyBBcnJheSgxNiksdGhpcy5lbmFibGVkPXMsdGhpcy5rZXlQcm92aWRlck9wdGlvbnM9bix0aGlzLnJhdGNoZXRQcm9taXNlTWFwPW5ldyBNYXAsdGhpcy5wYXJ0aWNpcGFudElkPWV9c2V0RW5hYmxlZChlKXt0aGlzLmVuYWJsZWQ9ZX1yYXRjaGV0S2V5KGUscz0hMCl7Y29uc3Qgbj1lIT1udWxsP2U6dGhpcy5nZXRDdXJyZW50S2V5SW5kZXgoKSxpPW4sYT10aGlzLnJhdGNoZXRQcm9taXNlTWFwLmdldChpKTtpZih0eXBlb2YgYSE9InVuZGVmaW5lZCIpcmV0dXJuIGE7Y29uc3QgZD1uZXcgUHJvbWlzZSgobyxsKT0+SSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e2NvbnN0IGY9dGhpcy5nZXRLZXlTZXQoaSkubWF0ZXJpYWwsdj15aWVsZCBiZCh5aWVsZCBFZChmLHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRTYWx0KSxmLmFsZ29yaXRobS5uYW1lLCJkZXJpdmUiKTtzJiZ0aGlzLnNldEtleUZyb21NYXRlcmlhbCh2LGksITApLHRoaXMuZW1pdCgia2V5UmF0Y2hldGVkIix2LG4sdGhpcy5wYXJ0aWNpcGFudElkKSxvKHYpfWNhdGNoKGYpe2woZil9ZmluYWxseXt0aGlzLnJhdGNoZXRQcm9taXNlTWFwLmRlbGV0ZShpKX19KSk7cmV0dXJuIHRoaXMucmF0Y2hldFByb21pc2VNYXAuc2V0KGksZCksZH1zZXRLZXlGcm9tTWF0ZXJpYWwoZSxzPTAsbj0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3M+PTAmJih0aGlzLmN1cnJlbnRLZXlJbmRleD1zJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGgpO2NvbnN0IGk9eWllbGQgenMoZSx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucy5yYXRjaGV0U2FsdCk7dGhpcy5zZXRLZXlTZXQoaSx0aGlzLmN1cnJlbnRLZXlJbmRleCxuKX0pfXNldEtleVNldChlLHMsbj0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMuY3J5cHRvS2V5UmluZ1tzJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGhdPWUsbiYmdGhpcy5lbWl0KCJrZXlSYXRjaGV0ZWQiLGUubWF0ZXJpYWwscyx0aGlzLnBhcnRpY2lwYW50SWQpfSl9c2V0Q3VycmVudEtleUluZGV4KGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLmN1cnJlbnRLZXlJbmRleD1lJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGh9KX1pc0VuYWJsZWQoKXtyZXR1cm4gdGhpcy5lbmFibGVkfWdldEN1cnJlbnRLZXlJbmRleCgpe3JldHVybiB0aGlzLmN1cnJlbnRLZXlJbmRleH1nZXRLZXlTZXQoZSl7cmV0dXJuIHRoaXMuY3J5cHRvS2V5UmluZ1tlIT1udWxsP2U6dGhpcy5jdXJyZW50S2V5SW5kZXhdfX1jb25zdCBZdD1bXSxRdD1uZXcgTWFwLEp0PVtdO2xldCBjZSxYdD0hMSxZcz0hMSxadCxnZT1BdDtmdW5jdGlvbiBTZSh0LHIpe3Bvc3RNZXNzYWdlKHtraW5kOiJsb2ciLGRhdGE6e2xldmVsOnQsc3RyOnJ9fSl9ZnVuY3Rpb24gUmQodCxyKXtwb3N0TWVzc2FnZSh7a2luZDoicmF0Y2hldEtleSIsZGF0YTp7a2V5SW5kZXg6cixtYXRlcmlhbDp0fX0pfWZ1bmN0aW9uIFZlKHQpe2lmKCF0KXJldHVybiBjZTtsZXQgcj1RdC5nZXQodCk7cmV0dXJuIHJ8fChyPW5ldyBxcyh0LCEwLGdlKSxadCYmci5zZXRLZXlGcm9tTWF0ZXJpYWwoWnQpLFF0LnNldCh0LHIpKSxyfWZ1bmN0aW9uIFBkKHQscil7cj9WZShyKS5zZXRFbmFibGVkKHQpOihYdD10LGNlLnNldEVuYWJsZWQodCkpfWZ1bmN0aW9uIFFzKHQpe3Qub24oImNyeXB0b3JFcnJvciIscj0+e2NvbnN0IGU9e2tpbmQ6ImVycm9yIixkYXRhOntlcnJvcjpuZXcgRXJyb3IoYCR7ZmVbci5yZWFzb25dfTogJHtyLm1lc3NhZ2V9YCl9fTtwb3N0TWVzc2FnZShlKX0pfWZ1bmN0aW9uIGVyKHQscil7bGV0IGU9WXQuZmluZChzPT5zLmdldFRyYWNrSWQoKT09PXIpO2lmKGUpdCE9PWUuZ2V0UGFydGljaXBhbnRJZCgpJiZlLnNldFBhcnRpY2lwYW50KHQsVmUodCkpO2Vsc2V7aWYoU2UoImluZm8iLGBjcmVhdGluZyBuZXcgY3J5cHRvciBmb3IgJHt0fWApLCFnZSl0aHJvdyBFcnJvcigiTWlzc2luZyBrZXlQcm92aWRlciBvcHRpb25zIik7ZT1uZXcgR3Moe3BhcnRpY2lwYW50SWQ6dCxrZXlzOlZlKHQpLGtleVByb3ZpZGVyT3B0aW9uczpnZX0pLFFzKGUpLFl0LnB1c2goZSl9cmV0dXJuIGV9ZnVuY3Rpb24gSnModCl7bGV0IHI9SnQuZmluZChlPT5lLmdldFRyYWNrSWQoKT09PXQpO2lmKCFyKXtpZighZ2UpdGhyb3cgbmV3IFR5cGVFcnJvcigiTWlzc2luZyBrZXlQcm92aWRlciBvcHRpb25zIik7cj1uZXcgR3Moe2tleXM6Y2UscGFydGljaXBhbnRJZDoicHVibGlzaGVyIixrZXlQcm92aWRlck9wdGlvbnM6Z2V9KSxRcyhyKSxKdC5wdXNoKHIpfXJldHVybiByfWZ1bmN0aW9uIENkKHQpe3ZhciByOyhyPVl0LmZpbmQoZT0+ZS5nZXRUcmFja0lkKCk9PT10KSk9PW51bGx8fHIudW5zZXRQYXJ0aWNpcGFudCgpfWZ1bmN0aW9uIElkKHQscil7U2UoImRlYnVnIiwic2V0dGluZyBzaGFyZWQga2V5IiksWnQ9dCxjZT09bnVsbHx8Y2Uuc2V0S2V5RnJvbU1hdGVyaWFsKHQscik7Zm9yKGNvbnN0WyxlXW9mIFF0KWUuc2V0S2V5RnJvbU1hdGVyaWFsKHQscil9b25tZXNzYWdlPXQ9Pntjb25zdHtraW5kOnIsZGF0YTplfT10LmRhdGE7c3dpdGNoKHIpe2Nhc2UiaW5pdCI6U2UoImluZm8iLCJ3b3JrZXIgaW5pdGlhbGl6ZWQiKSxnZT1lLmtleVByb3ZpZGVyT3B0aW9ucyxZcz0hIWUua2V5UHJvdmlkZXJPcHRpb25zLnNoYXJlZEtleTtjb25zdCBzPXtraW5kOiJlbmFibGUiLGRhdGE6e2VuYWJsZWQ6WHR9fTtjZT1uZXcgcXModm9pZCAwLFh0LGdlKSxjZS5vbigia2V5UmF0Y2hldGVkIixSZCkscG9zdE1lc3NhZ2Uocyk7YnJlYWs7Y2FzZSJlbmFibGUiOlBkKGUuZW5hYmxlZCxlLnBhcnRpY2lwYW50SWQpLFNlKCJpbmZvIiwidXBkYXRlZCBlMmVlIGVuYWJsZWQgc3RhdHVzIikscG9zdE1lc3NhZ2UodC5kYXRhKTticmVhaztjYXNlImRlY29kZSI6ZXIoZS5wYXJ0aWNpcGFudElkLGUudHJhY2tJZCkuc2V0dXBUcmFuc2Zvcm0ocixlLnJlYWRhYmxlU3RyZWFtLGUud3JpdGFibGVTdHJlYW0sZS50cmFja0lkLGUuY29kZWMpO2JyZWFrO2Nhc2UiZW5jb2RlIjpKcyhlLnRyYWNrSWQpLnNldHVwVHJhbnNmb3JtKHIsZS5yZWFkYWJsZVN0cmVhbSxlLndyaXRhYmxlU3RyZWFtLGUudHJhY2tJZCxlLmNvZGVjKTticmVhaztjYXNlInNldEtleSI6WXM/KFNlKCJkZWJ1ZyIsInNldCBzaGFyZWQga2V5IiksSWQoZS5rZXksZS5rZXlJbmRleCkpOmUucGFydGljaXBhbnRJZD9WZShlLnBhcnRpY2lwYW50SWQpLnNldEtleUZyb21NYXRlcmlhbChlLmtleSxlLmtleUluZGV4KTpTZSgiZXJyb3IiLCJubyBwYXJ0aWNpcGFudCBJZCB3YXMgcHJvdmlkZWQgYW5kIHNoYXJlZCBrZXkgdXNhZ2UgaXMgZGlzYWJsZWQiKTticmVhaztjYXNlInJlbW92ZVRyYW5zZm9ybSI6Q2QoZS50cmFja0lkKTticmVhaztjYXNlInVwZGF0ZUNvZGVjIjplcihlLnBhcnRpY2lwYW50SWQsZS50cmFja0lkKS5zZXRWaWRlb0NvZGVjKGUuY29kZWMpO2JyZWFrO2Nhc2Uic2V0UlRQTWFwIjpKdC5mb3JFYWNoKGE9PnthLnNldFJ0cE1hcChlLm1hcCl9KTticmVhaztjYXNlInJhdGNoZXRSZXF1ZXN0IjpWZShlLnBhcnRpY2lwYW50SWQpLnJhdGNoZXRLZXkoZS5rZXlJbmRleCk7YnJlYWt9fSxzZWxmLlJUQ1RyYW5zZm9ybUV2ZW50JiYoU2UoImRlYnVnIiwic2V0dXAgdHJhbnNmb3JtIGV2ZW50Iiksc2VsZi5vbnJ0Y3RyYW5zZm9ybT10PT57Y29uc3R7dHJhbnNmb3JtZXI6cn09dDtyLmhhbmRsZWQ9ITA7Y29uc3R7a2luZDplLHBhcnRpY2lwYW50SWQ6cyx0cmFja0lkOm4sY29kZWM6aX09ci5vcHRpb25zOyhlPT09ImVuY29kZSI/SnMobik6ZXIocyxuKSkuc2V0dXBUcmFuc2Zvcm0oZSxyLnJlYWRhYmxlLHIud3JpdGFibGUsbixpKX0pfSkoKTsK",g=typeof window!="undefined"&&window.Blob&&new Blob([atob(ll)],{type:"text/javascript;charset=utf-8"});function Ul(){const Z=g&&(window.URL||window.webkitURL).createObjectURL(g);try{return Z?new Worker(Z):new Worker("data:application/javascript;base64,"+ll)}finally{Z&&(window.URL||window.webkitURL).revokeObjectURL(Z)}}var N,C,s,k,dl,H,cl,a,T,v,Sl,U,bl,S,Xl,t,Wl,K,Vl;class Zl extends ${constructor(l){super(void 0);p(this,N);p(this,k);p(this,H);p(this,a);p(this,v);p(this,U);p(this,S);p(this,t);p(this,K);R(this,"worker");R(this,"encryptionEnabled");R(this,"keyProvider");R(this,"peerSessionStore");R(this,"onWorkerMessage",l=>{const{kind:c,data:b}=l.data;switch(c){case"error":this.logger.error("error in worker",{error:b.error}),this.emit(E.Error,b.error);break;case"enable":this.encryptionEnabled!==b.enabled&&!b.participantId?this.encryptionEnabled=b.enabled:b.participantId,this.encryptionEnabled&&this.keyProvider.getKeys().forEach(X=>{Y(this,a,T).call(this,X)});break;case"ratchetKey":this.keyProvider.emit("keyRatcheted",b.material,b.keyIndex);break;case"log":this.logger&&this.logger[b.level](b.str);break}});p(this,s,l=>{this.logger.error("e2ee worker encountered an error:",{error:l.error}),this.emit(E.Error,l.error)});this.keyProvider=l.keyProvider,this.worker=new Ul,this.encryptionEnabled=!1}get isEnabled(){return this.encryptionEnabled}init(l,c){this.logger=l,this.peerSessionStore=c,this.setup()}setup(){if(!sl())throw new Error("tried to setup end-to-end encryption on an unsupported browser");this.logger.info("setting up e2ee"),Y(this,k,dl).call(this,this.keyProvider);const l={kind:"init",data:{keyProviderOptions:this.keyProvider.getOptions()}};this.worker&&(this.logger.info("initializing worker"),this.worker.onmessage=this.onWorkerMessage,this.worker.onerror=j(this,s),this.worker.postMessage(l)),Y(this,N,C).call(this,!0)}}N=new WeakSet,C=function(l,c){return J(this,null,function*(){if(this.logger.info(`set e2ee to ${l} for ${c||"self"}`),this.worker){const b={kind:"enable",data:{enabled:l,participantId:c}};this.worker.postMessage(b)}else throw new ReferenceError("failed to enable e2ee, worker is not ready")})},s=new WeakMap,k=new WeakSet,dl=function(l){this.peerSessionStore.on(i.NEW_CONSUMER,({appData:c,peerId:b})=>{c.e2ee&&Y(this,N,C).call(this,c.e2ee,b)}),this.peerSessionStore.on(i.E2EE_INACTIVE_CONSUMER,({peerId:c,trackId:b})=>{var W;const X={kind:"removeTransform",data:{participantId:c,trackId:b}};(W=this.worker)==null||W.postMessage(X)}),this.peerSessionStore.on(i.E2EE_ACTIVE_CONSUMER,({track:c,rtpReceiver:b,peerId:X})=>Y(this,U,bl).call(this,c,b,X)),this.peerSessionStore.on(i.E2EE_ACTIVE_PRODUCER,({track:c,rtpSender:b,appData:X})=>Y(this,S,Xl).call(this,c,b,X.peerId)),l.on("setKey",c=>Y(this,a,T).call(this,c)).on("ratchetRequest",(c,b)=>Y(this,H,cl).call(this,c,b))},H=new WeakSet,cl=function(l,c){if(!this.worker)throw Error("could not ratchet key, worker is missing");const b={kind:"ratchetRequest",data:{participantId:l,keyIndex:c}};this.worker.postMessage(b)},a=new WeakSet,T=function({key:l,participantId:c,keyIndex:b}){if(!this.worker)throw Error("could not set key, worker is missing");const X={kind:"setKey",data:{participantId:c,key:l,keyIndex:b}};this.worker.postMessage(X)},v=new WeakSet,Sl=function(l){if(!this.worker)throw Error("could not post rtp map, worker is missing");const c={kind:"setRTPMap",data:{map:l}};this.worker.postMessage(c)},U=new WeakSet,bl=function(l,c,b){Y(this,t,Wl).call(this,c,l.id,b)},S=new WeakSet,Xl=function(l,c,b){Y(this,K,Vl).call(this,c,l.id,b)},t=new WeakSet,Wl=function(l,c,b,X){return J(this,null,function*(){if(!this.worker)return;const W=l;if(x()){const V={kind:"decode",participantId:b,trackId:c,codec:X};W.transform=new RTCRtpScriptTransform(this.worker,V)}else{if(F in W&&X){const u={kind:"updateCodec",data:{trackId:c,codec:X,participantId:b}};this.worker.postMessage(u);return}let V=W.writableStream,G=W.readableStream;if(!V||!G){const u=W.createEncodedStreams();W.writableStream=u.writable,V=u.writable,W.readableStream=u.readable,G=u.readable}const y={kind:"decode",data:{readableStream:G,writableStream:V,trackId:c,codec:X,participantId:b}};this.worker.postMessage(y,[G,V])}W[F]=!0})},K=new WeakSet,Vl=function(l,c,b,X){if(F in l||!this.worker)return;const W=l;if(x()){this.logger.warn("initialize script transform");const V={kind:"encode",participantId:b,trackId:c,codec:X};W.transform=new RTCRtpScriptTransform(this.worker,V)}else{this.logger.warn("initialize encoded streams");const V=W.createEncodedStreams(),G={kind:"encode",data:{readableStream:V.readable,writableStream:V.writable,codec:X,trackId:c,participantId:b||"publisher"}};this.worker.postMessage(G,[V.readable,V.writable])}W[F]=!0},R(Zl,"SharedKeyProvider",Hl);module.exports=Zl;
1
+ "use strict";var ml=Object.defineProperty,Gl=Object.defineProperties;var Rl=Object.getOwnPropertyDescriptors;var Q=Object.getOwnPropertySymbols;var pl=Object.prototype.hasOwnProperty,yl=Object.prototype.propertyIsEnumerable;var z=(Z,d,l)=>d in Z?ml(Z,d,{enumerable:!0,configurable:!0,writable:!0,value:l}):Z[d]=l,n=(Z,d)=>{for(var l in d||(d={}))pl.call(d,l)&&z(Z,l,d[l]);if(Q)for(var l of Q(d))yl.call(d,l)&&z(Z,l,d[l]);return Z},e=(Z,d)=>Gl(Z,Rl(d));var R=(Z,d,l)=>(z(Z,typeof d!="symbol"?d+"":d,l),l),B=(Z,d,l)=>{if(!d.has(Z))throw TypeError("Cannot "+l)};var M=(Z,d,l)=>(B(Z,d,"read from private field"),l?l.call(Z):d.get(Z)),p=(Z,d,l)=>{if(d.has(Z))throw TypeError("Cannot add the same private member more than once");d instanceof WeakSet?d.add(Z):d.set(Z,l)};var y=(Z,d,l)=>(B(Z,d,"access private method"),l);var i=(Z,d,l)=>new Promise((c,b)=>{var X=G=>{try{W(l.next(G))}catch(Y){b(Y)}},V=G=>{try{W(l.throw(G))}catch(Y){b(Y)}},W=G=>G.done?c(G.value):Promise.resolve(G.value).then(X,V);W((l=l.apply(Z,d)).next())});var L={},Yl={get exports(){return L},set exports(Z){L=Z}},h=typeof Reflect=="object"?Reflect:null,j=h&&typeof h.apply=="function"?h.apply:function(d,l,c){return Function.prototype.apply.call(d,l,c)},I;h&&typeof h.ownKeys=="function"?I=h.ownKeys:Object.getOwnPropertySymbols?I=function(d){return Object.getOwnPropertyNames(d).concat(Object.getOwnPropertySymbols(d))}:I=function(d){return Object.getOwnPropertyNames(d)};function ul(Z){console&&console.warn&&console.warn(Z)}var P=Number.isNaN||function(d){return d!==d};function m(){m.init.call(this)}Yl.exports=m;L.once=Nl;m.EventEmitter=m;m.prototype._events=void 0;m.prototype._eventsCount=0;m.prototype._maxListeners=void 0;var w=10;function o(Z){if(typeof Z!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof Z)}Object.defineProperty(m,"defaultMaxListeners",{enumerable:!0,get:function(){return w},set:function(Z){if(typeof Z!="number"||Z<0||P(Z))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+Z+".");w=Z}});m.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0};m.prototype.setMaxListeners=function(d){if(typeof d!="number"||d<0||P(d))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+d+".");return this._maxListeners=d,this};function f(Z){return Z._maxListeners===void 0?m.defaultMaxListeners:Z._maxListeners}m.prototype.getMaxListeners=function(){return f(this)};m.prototype.emit=function(d){for(var l=[],c=1;c<arguments.length;c++)l.push(arguments[c]);var b=d==="error",X=this._events;if(X!==void 0)b=b&&X.error===void 0;else if(!b)return!1;if(b){var V;if(l.length>0&&(V=l[0]),V instanceof Error)throw V;var W=new Error("Unhandled error."+(V?" ("+V.message+")":""));throw W.context=V,W}var G=X[d];if(G===void 0)return!1;if(typeof G=="function")j(G,this,l);else for(var Y=G.length,u=_(G,Y),c=0;c<Y;++c)j(u[c],this,l);return!0};function O(Z,d,l,c){var b,X,V;if(o(l),X=Z._events,X===void 0?(X=Z._events=Object.create(null),Z._eventsCount=0):(X.newListener!==void 0&&(Z.emit("newListener",d,l.listener?l.listener:l),X=Z._events),V=X[d]),V===void 0)V=X[d]=l,++Z._eventsCount;else if(typeof V=="function"?V=X[d]=c?[l,V]:[V,l]:c?V.unshift(l):V.push(l),b=f(Z),b>0&&V.length>b&&!V.warned){V.warned=!0;var W=new Error("Possible EventEmitter memory leak detected. "+V.length+" "+String(d)+" listeners added. Use emitter.setMaxListeners() to increase limit");W.name="MaxListenersExceededWarning",W.emitter=Z,W.type=d,W.count=V.length,ul(W)}return Z}m.prototype.addListener=function(d,l){return O(this,d,l,!1)};m.prototype.on=m.prototype.addListener;m.prototype.prependListener=function(d,l){return O(this,d,l,!0)};function hl(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function D(Z,d,l){var c={fired:!1,wrapFn:void 0,target:Z,type:d,listener:l},b=hl.bind(c);return b.listener=l,c.wrapFn=b,b}m.prototype.once=function(d,l){return o(l),this.on(d,D(this,d,l)),this};m.prototype.prependOnceListener=function(d,l){return o(l),this.prependListener(d,D(this,d,l)),this};m.prototype.removeListener=function(d,l){var c,b,X,V,W;if(o(l),b=this._events,b===void 0)return this;if(c=b[d],c===void 0)return this;if(c===l||c.listener===l)--this._eventsCount===0?this._events=Object.create(null):(delete b[d],b.removeListener&&this.emit("removeListener",d,c.listener||l));else if(typeof c!="function"){for(X=-1,V=c.length-1;V>=0;V--)if(c[V]===l||c[V].listener===l){W=c[V].listener,X=V;break}if(X<0)return this;X===0?c.shift():il(c,X),c.length===1&&(b[d]=c[0]),b.removeListener!==void 0&&this.emit("removeListener",d,W||l)}return this};m.prototype.off=m.prototype.removeListener;m.prototype.removeAllListeners=function(d){var l,c,b;if(c=this._events,c===void 0)return this;if(c.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):c[d]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete c[d]),this;if(arguments.length===0){var X=Object.keys(c),V;for(b=0;b<X.length;++b)V=X[b],V!=="removeListener"&&this.removeAllListeners(V);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if(l=c[d],typeof l=="function")this.removeListener(d,l);else if(l!==void 0)for(b=l.length-1;b>=0;b--)this.removeListener(d,l[b]);return this};function r(Z,d,l){var c=Z._events;if(c===void 0)return[];var b=c[d];return b===void 0?[]:typeof b=="function"?l?[b.listener||b]:[b]:l?Jl(b):_(b,b.length)}m.prototype.listeners=function(d){return r(this,d,!0)};m.prototype.rawListeners=function(d){return r(this,d,!1)};m.listenerCount=function(Z,d){return typeof Z.listenerCount=="function"?Z.listenerCount(d):A.call(Z,d)};m.prototype.listenerCount=A;function A(Z){var d=this._events;if(d!==void 0){var l=d[Z];if(typeof l=="function")return 1;if(l!==void 0)return l.length}return 0}m.prototype.eventNames=function(){return this._eventsCount>0?I(this._events):[]};function _(Z,d){for(var l=new Array(d),c=0;c<d;++c)l[c]=Z[c];return l}function il(Z,d){for(;d+1<Z.length;d++)Z[d]=Z[d+1];Z.pop()}function Jl(Z){for(var d=new Array(Z.length),l=0;l<d.length;++l)d[l]=Z[l].listener||Z[l];return d}function Nl(Z,d){return new Promise(function(l,c){function b(V){Z.removeListener(d,X),c(V)}function X(){typeof Z.removeListener=="function"&&Z.removeListener("error",b),l([].slice.call(arguments))}q(Z,d,X,{once:!0}),d!=="error"&&al(Z,b,{once:!0})})}function al(Z,d,l){typeof Z.on=="function"&&q(Z,"error",d,l)}function q(Z,d,l,c){if(typeof Z.on=="function")c.once?Z.once(d,l):Z.on(d,l);else if(typeof Z.addEventListener=="function")Z.addEventListener(d,function b(X){c.once&&Z.removeEventListener(d,b),l(X)});else throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof Z)}class $ extends L.EventEmitter{constructor(l){super();R(this,"logger");this.logger=l,super.setMaxListeners(25)}emit(l,...c){return super.emit("*",l,...c),super.emit(l,...c)}on(l,c){var b;try{const X=this.listenerCount(l);X>25&&X%25===0&&((b=this.logger)==null||b.warn("CustomEventEmitter::maxListenersExceeded",{eventListener:{eventName:l.toString(),listenerCount:this.listenerCount(l)}}))}catch(X){}return super.on(l,c)}addListener(l,c){var b;try{const X=this.listenerCount(l);X>25&&X%25===0&&((b=this.logger)==null||b.warn("CustomEventEmitter::maxListenersExceeded",{eventListener:{eventName:l.toString(),listenerCount:this.listenerCount(l)}}))}catch(X){}return super.addListener(l,c)}off(l,c){return super.off(l,c)}once(l,c){return super.once(l,c)}prependListener(l,c){return super.prependListener(l,c)}prependOnceListener(l,c){return super.prependOnceListener(l,c)}removeListener(l,c){return super.removeListener(l,c)}removeAllListeners(l){return super.removeAllListeners(l)}listeners(l){return super.listeners(l)}listenerCount(l){return super.listenerCount(l)}}const F="realtimekit_e2ee",nl="RealtimeKitFrameEncryptionKey",Fl={sharedKey:!1,ratchetSalt:nl,ratchetWindowSize:8};function x(){return typeof window.RTCRtpScriptTransform!="undefined"}function Il(){return typeof window.RTCRtpSender!="undefined"&&typeof window.RTCRtpSender.prototype.createEncodedStreams!="undefined"}function Ll(Z){return i(this,null,function*(){const d=new TextEncoder;return yield crypto.subtle.importKey("raw",d.encode(Z),{name:"PBKDF2"},!1,["deriveBits","deriveKey"])})}function sl(){return Il()||x()}class kl extends ${constructor(l={}){super(void 0);R(this,"keyInfoMap");R(this,"options");R(this,"onKeyRatcheted",(l,c)=>{});this.keyInfoMap=new Map,this.options=n(n({},Fl),l),this.on("keyRatcheted",this.onKeyRatcheted)}onSetEncryptionKey(l,c,b){const X={key:l,participantId:c,keyIndex:b};this.keyInfoMap.set(`${c!=null?c:"shared"}-${b!=null?b:0}`,X),this.emit("setKey",X)}getKeys(){return Array.from(this.keyInfoMap.values())}getOptions(){return this.options}ratchetKey(l,c){this.emit("ratchetRequest",l,c)}}class Hl extends kl{constructor(l={}){const c=e(n({},l),{sharedKey:!0});super(c);R(this,"ratchetInterval")}setKey(l){return i(this,null,function*(){const c=yield Ll(l);this.onSetEncryptionKey(c)})}}const E={ParticipantEncryptionStatusChanged:"participantEncryptionStatusChanged",Error:"encryptionError"};var J=(Z=>(Z.NEW_PRODUCER="NEW_PRODUCER",Z.ROOM_NODE_CONNECTION_ERROR="ROOM_NODE_CONNECTION_ERROR",Z.SOCKET_SERVICE_ROOM_JOINED="SOCKET_SERVICE_ROOM_JOINED",Z.SOCKET_SERVICE_RECONNECTED="SOCKET_SERVICE_RECONNECTED",Z.SOCKET_SERVICE_DISCONNECTED="SOCKET_SERVICE_DISCONNECTED",Z.SOCKET_SERVICE_FAILED="SOCKET_SERVICE_FAILED",Z.SOCKET_STATE_UPDATE="SOCKET_STATE_UPDATE",Z.ROOM_NODE_RECONNECTED="ROOM_NODE_RECONNECTED",Z.ROOM_NODE_DISCONNECTED="ROOM_NODE_DISCONNECTED",Z.ROOM_NODE_FAILED="ROOM_NODE_FAILED",Z.TRANSPORT_STATE_UPDATE="TRANSPORT_STATE_UPDATE",Z.PRODUCER_SCORE_UPDATE="PRODUCER_SCORE_UPDATE",Z.CONSUMER_SCORE_UPDATE="CONSUMER_SCORE_UPDATE",Z.PRODUCER_STATUS_UPDATE="PRODUCER_STATUS_UPDATE",Z.CONSUMER_STATUS_UPDATE="CONSUMER_STATUS_UPDATE",Z.LOW_CONSUMER_SCORE="LOW_CONSUMER_SCORE",Z.MEDIA_PERMISSION_ERROR="MEDIA_PERMISSION_ERROR",Z.MEDIA_PERMISSION_UPDATE="MEDIA_PERMISSION_UPDATE",Z.MESSAGE="websocket/message",Z.ROOM_MESSAGE="websocket/room-message",Z.PEER_JOINED_INTERNAL="peer/joined-internal",Z.PEER_CLOSED="websocket/peer-closed",Z.CONSUMER_CLOSED="websocket/consumer-closed",Z.CONSUMER_PAUSED="websocket/consumer-paused",Z.CONSUMER_RESUMED="websocket/consumer-resumed",Z.PRODUCER_CLOSED="websocket/producer-closed",Z.NEW_CONSUMER="websocket/new-consumer",Z.PRODUCER_SCORE="websocket/producer-score",Z.CONSUMER_SCORE="websocket/consumer-score",Z.PRODUCER_TOGGLE="cf/producer-toggle",Z.UPDATE_ACTIVE="media/update-active",Z.RESET_PRODUCER_STATE="cf/reset-producer-state",Z.ROOM_STATE="sockethub/room-state",Z.GET_STAGE_REQUESTS="GET_STAGE_REQUESTS",Z.UPDATE_STAGE_REQUESTS="UPDATE_STAGE_REQUESTS",Z.KICK_PEER="KICK_PEER",Z.UPDATE_PEER_STAGE_STATUS="UPDATE_PEER_STAGE_STATUS",Z.JOIN_MEDIA_ROOM="JOIN_MEDIA_ROOM",Z.LEAVE_MEDIA_ROOM="LEAVE_MEDIA_ROOM",Z.PIP_HANGUP="PIP_HANGUP",Z.E2EE_ACTIVE_PRODUCER="E2EE_ACTIVE_PRODUCER",Z.E2EE_INACTIVE_PRODUCER="E2EE_INACTIVE_PRODUCER",Z.E2EE_ACTIVE_CONSUMER="E2EE_ACTIVE_CONSUMER",Z.E2EE_INACTIVE_CONSUMER="E2EE_INACTIVE_CONSUMER",Z.SOCKET_PEERS="SOCKET_PEERS",Z.UPDATE_PERMISSIONS="UPDATE_PERMISSIONS",Z.MAX_SPATIAL_LAYER_CHANGE="MAX_SPATIAL_LAYER_CHANGE",Z.MUTE_SELF="MUTE_SELF",Z.MUTE_SELF_VIDEO="MUTE_SELF_VIDEO",Z))(J||{});const ll="dmFyIHdkPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxNZD1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgQWQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIGVuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsa2Q9T2JqZWN0LmdldFByb3RvdHlwZU9mLE9kPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksTGQ9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxEZD1SZWZsZWN0LmdldDt2YXIgc3I9KGssTyxBKT0+TyBpbiBrP3dkKGssTyx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6QX0pOmtbT109QSxRPShrLE8pPT57Zm9yKHZhciBBIGluIE98fChPPXt9KSlPZC5jYWxsKE8sQSkmJnNyKGssQSxPW0FdKTtpZihlbilmb3IodmFyIEEgb2YgZW4oTykpTGQuY2FsbChPLEEpJiZzcihrLEEsT1tBXSk7cmV0dXJuIGt9LG90PShrLE8pPT5NZChrLEFkKE8pKTt2YXIgcD0oayxPLEEpPT4oc3Ioayx0eXBlb2YgTyE9InN5bWJvbCI/TysiIjpPLEEpLEEpLHRuPShrLE8sQSk9PntpZighTy5oYXMoaykpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIitBKX07dmFyIGVlPShrLE8sQSk9Pih0bihrLE8sInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksQT9BLmNhbGwoayk6Ty5nZXQoaykpLEl0PShrLE8sQSk9PntpZihPLmhhcyhrKSl0aHJvdyBUeXBlRXJyb3IoIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2UiKTtPIGluc3RhbmNlb2YgV2Vha1NldD9PLmFkZChrKTpPLnNldChrLEEpfSxDZT0oayxPLEEsZGUpPT4odG4oayxPLCJ3cml0ZSB0byBwcml2YXRlIGZpZWxkIiksZGU/ZGUuY2FsbChrLEEpOk8uc2V0KGssQSksQSk7dmFyIHJuPShrLE8sQSk9PkRkKGtkKGspLEEsTyk7dmFyIEk9KGssTyxBKT0+bmV3IFByb21pc2UoKGRlLHd0KT0+e3ZhciBNdD1ZPT57dHJ5e0llKEEubmV4dChZKSl9Y2F0Y2goYmUpe3d0KGJlKX19LHE9WT0+e3RyeXtJZShBLnRocm93KFkpKX1jYXRjaChiZSl7d3QoYmUpfX0sSWU9WT0+WS5kb25lP2RlKFkudmFsdWUpOlByb21pc2UucmVzb2x2ZShZLnZhbHVlKS50aGVuKE10LHEpO0llKChBPUEuYXBwbHkoayxPKSkubmV4dCgpKX0pOyhmdW5jdGlvbigpe3ZhciBacyxGZSxuZSxpZTsidXNlIHN0cmljdCI7Y29uc3Qgaz0iQUVTLUdDTSIsQT17a2V5OjEwLGRlbHRhOjMsYXVkaW86MSxlbXB0eTowfSxkZT0xMixNdD17c2hhcmVkS2V5OiExLHJhdGNoZXRTYWx0OiJSZWFsdGltZUtpdEZyYW1lRW5jcnlwdGlvbktleSIscmF0Y2hldFdpbmRvd1NpemU6OH07dmFyIHE9e30sSWU9e2dldCBleHBvcnRzKCl7cmV0dXJuIHF9LHNldCBleHBvcnRzKHQpe3E9dH19LFk9dHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiP1JlZmxlY3Q6bnVsbCxiZT1ZJiZ0eXBlb2YgWS5hcHBseT09ImZ1bmN0aW9uIj9ZLmFwcGx5OmZ1bmN0aW9uKHIsZSxzKXtyZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwocixlLHMpfSxjdDtZJiZ0eXBlb2YgWS5vd25LZXlzPT0iZnVuY3Rpb24iP2N0PVkub3duS2V5czpPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzP2N0PWZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhyKSl9OmN0PWZ1bmN0aW9uKHIpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKX07ZnVuY3Rpb24gc24odCl7Y29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4odCl9dmFyIG5yPU51bWJlci5pc05hTnx8ZnVuY3Rpb24ocil7cmV0dXJuIHIhPT1yfTtmdW5jdGlvbiBEKCl7RC5pbml0LmNhbGwodGhpcyl9SWUuZXhwb3J0cz1ELHEub25jZT1jbixELkV2ZW50RW1pdHRlcj1ELEQucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLEQucHJvdG90eXBlLl9ldmVudHNDb3VudD0wLEQucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwO3ZhciBpcj0xMDtmdW5jdGlvbiBkdCh0KXtpZih0eXBlb2YgdCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImxpc3RlbmVyIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRnVuY3Rpb24uIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgdCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KEQsImRlZmF1bHRNYXhMaXN0ZW5lcnMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBpcn0sc2V0OmZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHxucih0KSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mICJkZWZhdWx0TWF4TGlzdGVuZXJzIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3QrIi4iKTtpcj10fX0pLEQuaW5pdD1mdW5jdGlvbigpeyh0aGlzLl9ldmVudHM9PT12b2lkIDB8fHRoaXMuX2V2ZW50cz09PU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSYmKHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApLHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH0sRC5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKHIpe2lmKHR5cGVvZiByIT0ibnVtYmVyInx8cjwwfHxucihyKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mICJuIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3IrIi4iKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPXIsdGhpc307ZnVuY3Rpb24gYXIodCl7cmV0dXJuIHQuX21heExpc3RlbmVycz09PXZvaWQgMD9ELmRlZmF1bHRNYXhMaXN0ZW5lcnM6dC5fbWF4TGlzdGVuZXJzfUQucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybiBhcih0aGlzKX0sRC5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihyKXtmb3IodmFyIGU9W10scz0xO3M8YXJndW1lbnRzLmxlbmd0aDtzKyspZS5wdXNoKGFyZ3VtZW50c1tzXSk7dmFyIG49cj09PSJlcnJvciIsaT10aGlzLl9ldmVudHM7aWYoaSE9PXZvaWQgMCluPW4mJmkuZXJyb3I9PT12b2lkIDA7ZWxzZSBpZighbilyZXR1cm4hMTtpZihuKXt2YXIgYTtpZihlLmxlbmd0aD4wJiYoYT1lWzBdKSxhIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgYTt2YXIgZD1uZXcgRXJyb3IoIlVuaGFuZGxlZCBlcnJvci4iKyhhPyIgKCIrYS5tZXNzYWdlKyIpIjoiIikpO3Rocm93IGQuY29udGV4dD1hLGR9dmFyIG89aVtyXTtpZihvPT09dm9pZCAwKXJldHVybiExO2lmKHR5cGVvZiBvPT0iZnVuY3Rpb24iKWJlKG8sdGhpcyxlKTtlbHNlIGZvcih2YXIgbD1vLmxlbmd0aCxmPXVyKG8sbCkscz0wO3M8bDsrK3MpYmUoZltzXSx0aGlzLGUpO3JldHVybiEwfTtmdW5jdGlvbiBvcih0LHIsZSxzKXt2YXIgbixpLGE7aWYoZHQoZSksaT10Ll9ldmVudHMsaT09PXZvaWQgMD8oaT10Ll9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0Ll9ldmVudHNDb3VudD0wKTooaS5uZXdMaXN0ZW5lciE9PXZvaWQgMCYmKHQuZW1pdCgibmV3TGlzdGVuZXIiLHIsZS5saXN0ZW5lcj9lLmxpc3RlbmVyOmUpLGk9dC5fZXZlbnRzKSxhPWlbcl0pLGE9PT12b2lkIDApYT1pW3JdPWUsKyt0Ll9ldmVudHNDb3VudDtlbHNlIGlmKHR5cGVvZiBhPT0iZnVuY3Rpb24iP2E9aVtyXT1zP1tlLGFdOlthLGVdOnM/YS51bnNoaWZ0KGUpOmEucHVzaChlKSxuPWFyKHQpLG4+MCYmYS5sZW5ndGg+biYmIWEud2FybmVkKXthLndhcm5lZD0hMDt2YXIgZD1uZXcgRXJyb3IoIlBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gIithLmxlbmd0aCsiICIrU3RyaW5nKHIpKyIgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdCIpO2QubmFtZT0iTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nIixkLmVtaXR0ZXI9dCxkLnR5cGU9cixkLmNvdW50PWEubGVuZ3RoLHNuKGQpfXJldHVybiB0fUQucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIG9yKHRoaXMscixlLCExKX0sRC5wcm90b3R5cGUub249RC5wcm90b3R5cGUuYWRkTGlzdGVuZXIsRC5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uKHIsZSl7cmV0dXJuIG9yKHRoaXMscixlLCEwKX07ZnVuY3Rpb24gbm4oKXtpZighdGhpcy5maXJlZClyZXR1cm4gdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLHRoaXMud3JhcEZuKSx0aGlzLmZpcmVkPSEwLGFyZ3VtZW50cy5sZW5ndGg9PT0wP3RoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk6dGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCxhcmd1bWVudHMpfWZ1bmN0aW9uIGNyKHQscixlKXt2YXIgcz17ZmlyZWQ6ITEsd3JhcEZuOnZvaWQgMCx0YXJnZXQ6dCx0eXBlOnIsbGlzdGVuZXI6ZX0sbj1ubi5iaW5kKHMpO3JldHVybiBuLmxpc3RlbmVyPWUscy53cmFwRm49bixufUQucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24ocixlKXtyZXR1cm4gZHQoZSksdGhpcy5vbihyLGNyKHRoaXMscixlKSksdGhpc30sRC5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1mdW5jdGlvbihyLGUpe3JldHVybiBkdChlKSx0aGlzLnByZXBlbmRMaXN0ZW5lcihyLGNyKHRoaXMscixlKSksdGhpc30sRC5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24ocixlKXt2YXIgcyxuLGksYSxkO2lmKGR0KGUpLG49dGhpcy5fZXZlbnRzLG49PT12b2lkIDApcmV0dXJuIHRoaXM7aWYocz1uW3JdLHM9PT12b2lkIDApcmV0dXJuIHRoaXM7aWYocz09PWV8fHMubGlzdGVuZXI9PT1lKS0tdGhpcy5fZXZlbnRzQ291bnQ9PT0wP3RoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpOihkZWxldGUgbltyXSxuLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIixyLHMubGlzdGVuZXJ8fGUpKTtlbHNlIGlmKHR5cGVvZiBzIT0iZnVuY3Rpb24iKXtmb3IoaT0tMSxhPXMubGVuZ3RoLTE7YT49MDthLS0paWYoc1thXT09PWV8fHNbYV0ubGlzdGVuZXI9PT1lKXtkPXNbYV0ubGlzdGVuZXIsaT1hO2JyZWFrfWlmKGk8MClyZXR1cm4gdGhpcztpPT09MD9zLnNoaWZ0KCk6YW4ocyxpKSxzLmxlbmd0aD09PTEmJihuW3JdPXNbMF0pLG4ucmVtb3ZlTGlzdGVuZXIhPT12b2lkIDAmJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLHIsZHx8ZSl9cmV0dXJuIHRoaXN9LEQucHJvdG90eXBlLm9mZj1ELnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcixELnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7dmFyIGUscyxuO2lmKHM9dGhpcy5fZXZlbnRzLHM9PT12b2lkIDApcmV0dXJuIHRoaXM7aWYocy5yZW1vdmVMaXN0ZW5lcj09PXZvaWQgMClyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTA/KHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApOnNbcl0hPT12b2lkIDAmJigtLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTpkZWxldGUgc1tyXSksdGhpcztpZihhcmd1bWVudHMubGVuZ3RoPT09MCl7dmFyIGk9T2JqZWN0LmtleXMocyksYTtmb3Iobj0wO248aS5sZW5ndGg7KytuKWE9aVtuXSxhIT09InJlbW92ZUxpc3RlbmVyIiYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoYSk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTAsdGhpc31pZihlPXNbcl0sdHlwZW9mIGU9PSJmdW5jdGlvbiIpdGhpcy5yZW1vdmVMaXN0ZW5lcihyLGUpO2Vsc2UgaWYoZSE9PXZvaWQgMClmb3Iobj1lLmxlbmd0aC0xO24+PTA7bi0tKXRoaXMucmVtb3ZlTGlzdGVuZXIocixlW25dKTtyZXR1cm4gdGhpc307ZnVuY3Rpb24gZHIodCxyLGUpe3ZhciBzPXQuX2V2ZW50cztpZihzPT09dm9pZCAwKXJldHVybltdO3ZhciBuPXNbcl07cmV0dXJuIG49PT12b2lkIDA/W106dHlwZW9mIG49PSJmdW5jdGlvbiI/ZT9bbi5saXN0ZW5lcnx8bl06W25dOmU/b24obik6dXIobixuLmxlbmd0aCl9RC5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKHIpe3JldHVybiBkcih0aGlzLHIsITApfSxELnByb3RvdHlwZS5yYXdMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7cmV0dXJuIGRyKHRoaXMsciwhMSl9LEQubGlzdGVuZXJDb3VudD1mdW5jdGlvbih0LHIpe3JldHVybiB0eXBlb2YgdC5saXN0ZW5lckNvdW50PT0iZnVuY3Rpb24iP3QubGlzdGVuZXJDb3VudChyKTpsci5jYWxsKHQscil9LEQucHJvdG90eXBlLmxpc3RlbmVyQ291bnQ9bHI7ZnVuY3Rpb24gbHIodCl7dmFyIHI9dGhpcy5fZXZlbnRzO2lmKHIhPT12b2lkIDApe3ZhciBlPXJbdF07aWYodHlwZW9mIGU9PSJmdW5jdGlvbiIpcmV0dXJuIDE7aWYoZSE9PXZvaWQgMClyZXR1cm4gZS5sZW5ndGh9cmV0dXJuIDB9RC5wcm90b3R5cGUuZXZlbnROYW1lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudHNDb3VudD4wP2N0KHRoaXMuX2V2ZW50cyk6W119O2Z1bmN0aW9uIHVyKHQscil7Zm9yKHZhciBlPW5ldyBBcnJheShyKSxzPTA7czxyOysrcyllW3NdPXRbc107cmV0dXJuIGV9ZnVuY3Rpb24gYW4odCxyKXtmb3IoO3IrMTx0Lmxlbmd0aDtyKyspdFtyXT10W3IrMV07dC5wb3AoKX1mdW5jdGlvbiBvbih0KXtmb3IodmFyIHI9bmV3IEFycmF5KHQubGVuZ3RoKSxlPTA7ZTxyLmxlbmd0aDsrK2UpcltlXT10W2VdLmxpc3RlbmVyfHx0W2VdO3JldHVybiByfWZ1bmN0aW9uIGNuKHQscil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUscyl7ZnVuY3Rpb24gbihhKXt0LnJlbW92ZUxpc3RlbmVyKHIsaSkscyhhKX1mdW5jdGlvbiBpKCl7dHlwZW9mIHQucmVtb3ZlTGlzdGVuZXI9PSJmdW5jdGlvbiImJnQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixuKSxlKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSl9cHIodCxyLGkse29uY2U6ITB9KSxyIT09ImVycm9yIiYmZG4odCxuLHtvbmNlOiEwfSl9KX1mdW5jdGlvbiBkbih0LHIsZSl7dHlwZW9mIHQub249PSJmdW5jdGlvbiImJnByKHQsImVycm9yIixyLGUpfWZ1bmN0aW9uIHByKHQscixlLHMpe2lmKHR5cGVvZiB0Lm9uPT0iZnVuY3Rpb24iKXMub25jZT90Lm9uY2UocixlKTp0Lm9uKHIsZSk7ZWxzZSBpZih0eXBlb2YgdC5hZGRFdmVudExpc3RlbmVyPT0iZnVuY3Rpb24iKXQuYWRkRXZlbnRMaXN0ZW5lcihyLGZ1bmN0aW9uIG4oaSl7cy5vbmNlJiZ0LnJlbW92ZUV2ZW50TGlzdGVuZXIocixuKSxlKGkpfSk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImVtaXR0ZXIiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBFdmVudEVtaXR0ZXIuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgdCl9dmFyIF87KGZ1bmN0aW9uKHQpe3RbdC5NQUpPUl9FVkVOVD0wXT0iTUFKT1JfRVZFTlQiLHRbdC5NSU5PUl9FVkVOVD0xXT0iTUlOT1JfRVZFTlQifSkoX3x8KF89e30pKTt2YXIgUzsoZnVuY3Rpb24odCl7dC5QUkVDQUxMX1RFU1RfQkVHSU49InByZWNhbGxfYmVnaW4iLHQuUFJFQ0FMTF9URVNUX0NPTVBMRVRFPSJwcmVjYWxsX2VuZCIsdC5DQUxMX0pPSU5fQkVHSU49ImNhbGxfam9pbiIsdC5ORVRfUVVBTElUWV9URVNUX0JFR0lOPSJuZXRfcXVhbGl0eV90ZXN0X2JlZ2luIix0Lk5FVF9RVUFMSVRZX1RFU1RfRU5EPSJuZXRfcXVhbGl0eV90ZXN0X2VuZCIsdC5XRUJTT0NLRVRfQ09OTkVDVEVEPSJ3ZWJzb2NrZXRfY29ubmVjdGVkIix0LlRSQU5TUE9SVF9DT05ORUNURUQ9InRyYW5zcG9ydF9jb25uZWN0ZWQiLHQuQVVESU9fT049ImF1ZGlvX29uIix0LkFVRElPX09GRj0iYXVkaW9fb2ZmIix0LlZJREVPX09OPSJ2aWRlb19vbiIsdC5WSURFT19PRkY9InZpZGVvX29mZiIsdC5QQVJUSUNJUEFOVF9ST0xFPSJwYXJ0aWNpcGFudF9yb2xlIix0LlBJTkdfU1RBVD0icGluZ19zdGF0Iix0LkRJU0NPTk5FQ1Q9ImRpc2Nvbm5lY3QiLHQuUkVDT05ORUNUX0FUVEVNUFQ9InJlY29ubmVjdF9hdHRlbXB0Iix0LlNDUkVFTlNIQVJFX1NUQVJUX1JFUVVFU1RFRD0ic2NyZWVuc2hhcmVfc3RhcnRfcmVxdWVzdGVkIix0LlNDUkVFTlNIQVJFX1NUQVJURUQ9InNjcmVlbnNoYXJlX3N0YXJ0ZWQiLHQuU0NSRUVOU0hBUkVfU1RPUFBFRD0ic2NyZWVuc2hhcmVfc3RvcHBlZCIsdC5UQUJfQ0hBTkdFPSJ0YWJfY2hhbmdlIix0LkJST1dTRVJfQkFDS0dST1VOREVEPSJicm93c2VyX2JhY2tncm91bmRlZCIsdC5CUk9XU0VSX0ZPUkVHUk9VTkRFRD0iYnJvd3Nlcl9mb3JlZ3JvdW5kZWQiLHQuRE9NSU5BTlRfU1BFQUtFUj0iZG9taW5hbnRfc3BlYWtlciIsdC5BVURJT19ERVZJQ0VTX1VQREFURVM9ImF1ZGlvX2RldmljZXNfdXBkYXRlcyIsdC5WSURFT19ERVZJQ0VTX1VQREFURVM9InZpZGVvX2RldmljZXNfdXBkYXRlcyIsdC5TUEVBS0VSX0RFVklDRVNfVVBEQVRFUz0ic3BlYWtlcl9kZXZpY2VzX3VwZGF0ZXMiLHQuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEU9InNlbGVjdGVkX21pY3JvcGhvbmVfdXBkYXRlIix0LlNFTEVDVEVEX0NBTUVSQV9VUERBVEU9InNlbGVjdGVkX2NhbWVyYV91cGRhdGUiLHQuU0VMRUNURURfU1BFQUtFUl9VUERBVEU9InNlbGVjdGVkX3NwZWFrZXJfdXBkYXRlIix0LkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT049ImV4cGVjdGVkX3ZpZGVvX3Jlc29sdXRpb24iLHQuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTj0iZXhwZWN0ZWRfc2NyZWVuc2hhcmVfcmVzb2x1dGlvbiIsdC5NRURJQV9QRVJNSVNTSU9OPSJtZWRpYV9wZXJtaXNzaW9uIix0LkxFR0FDWV9TV0lUQ0g9ImxlZ2FjeV9zd2l0Y2giLHQuQVVESU9fUExBWV9GQUlMRUQ9ImF1ZGlvX3BsYXlfZmFpbGVkIix0LlZJREVPX1BMQVlfRkFJTEVEPSJ2aWRlb19wbGF5X2ZhaWxlZCIsdC5BVURJT19UUkFDS19NVVRFRD0iYXVkaW9fdHJhY2tfbXV0ZWQiLHQuVklERU9fVFJBQ0tfTVVURUQ9InZpZGVvX3RyYWNrX211dGVkIix0LklWU19QTEFZRVJfUkVCVUZGRVJJTkc9Iml2c19wbGF5ZXJfcmVidWZmZXJpbmciLHQuSVZTX1BMQVlFUl9BVURJT19CTE9DS0VEPSJpdnNfcGxheWVyX2F1ZGlvX2Jsb2NrZWQiLHQuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VEPSJpdnNfcGxheWVyX3BsYXliYWNrX2Jsb2NrZWQiLHQuSVZTX1BMQVlFUl9FUlJPUj0iaXZzX3BsYXllcl9lcnJvciIsdC5JVlNfUExBWUVSX1JFQ09WRVJBQkxFX0VSUk9SPSJpdnNfcGxheWVyX3JlY292ZXJhYmxlX2Vycm9yIix0LklWU19QTEFZRVJfV09SS0VSX0VSUk9SPSJpdnNfcGxheWVyX3dvcmtlcl9lcnJvciIsdC5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEU9Iml2c19wbGF5ZXJfbmV0d29ya191bmF2YWlsYWJsZSIsdC5MSVZFU1RSRUFNX0xBVEVOQ1k9ImxpdmVzdHJlYW1fbGF0ZW5jeSIsdC5JVlNfUExBWUVSX0FOQUxZVElDU19FVkVOVD0iaXZzX3BsYXllcl9hbmFseXRpY3NfZXZlbnQiLHQuSVZTX1BMQVlFUl9QTEFZQkFDS19SQVRFX0NIQU5HRUQ9Iml2c19wbGF5ZXJfcGxheWJhY2tfcmF0ZV9jaGFuZ2VkIix0LklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VEPSJpdnNfcGxheWVyX3F1YWxpdHlfY2hhbmdlZCIsdC5JVlNfUExBWUVSX0lOSVRJQUxJWkVEPSJpdnNfcGxheWVyX2luaXRpYWxpemVkIn0pKFN8fChTPXt9KSk7Y29uc3QgbG49bmV3IE1hcChbW1MuUFJFQ0FMTF9URVNUX0JFR0lOLF8uTUlOT1JfRVZFTlRdLFtTLlBSRUNBTExfVEVTVF9DT01QTEVURSxfLk1JTk9SX0VWRU5UXSxbUy5DQUxMX0pPSU5fQkVHSU4sXy5NQUpPUl9FVkVOVF0sW1MuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTixfLk1JTk9SX0VWRU5UXSxbUy5ORVRfUVVBTElUWV9URVNUX0VORCxfLk1JTk9SX0VWRU5UXSxbUy5XRUJTT0NLRVRfQ09OTkVDVEVELF8uTUlOT1JfRVZFTlRdLFtTLlRSQU5TUE9SVF9DT05ORUNURUQsXy5NQUpPUl9FVkVOVF0sW1MuQVVESU9fT04sXy5NSU5PUl9FVkVOVF0sW1MuQVVESU9fT0ZGLF8uTUlOT1JfRVZFTlRdLFtTLlZJREVPX09OLF8uTUlOT1JfRVZFTlRdLFtTLlZJREVPX09GRixfLk1JTk9SX0VWRU5UXSxbUy5QQVJUSUNJUEFOVF9ST0xFLF8uTUlOT1JfRVZFTlRdLFtTLlBJTkdfU1RBVCxfLk1BSk9SX0VWRU5UXSxbUy5ESVNDT05ORUNULF8uTUFKT1JfRVZFTlRdLFtTLlJFQ09OTkVDVF9BVFRFTVBULF8uTUFKT1JfRVZFTlRdLFtTLlNDUkVFTlNIQVJFX1NUQVJUX1JFUVVFU1RFRCxfLk1JTk9SX0VWRU5UXSxbUy5TQ1JFRU5TSEFSRV9TVEFSVEVELF8uTUlOT1JfRVZFTlRdLFtTLlNDUkVFTlNIQVJFX1NUT1BQRUQsXy5NSU5PUl9FVkVOVF0sW1MuVEFCX0NIQU5HRSxfLk1JTk9SX0VWRU5UXSxbUy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCxfLk1JTk9SX0VWRU5UXSxbUy5CUk9XU0VSX0ZPUkVHUk9VTkRFRCxfLk1JTk9SX0VWRU5UXSxbUy5ET01JTkFOVF9TUEVBS0VSLF8uTUlOT1JfRVZFTlRdLFtTLkFVRElPX0RFVklDRVNfVVBEQVRFUyxfLk1JTk9SX0VWRU5UXSxbUy5WSURFT19ERVZJQ0VTX1VQREFURVMsXy5NSU5PUl9FVkVOVF0sW1MuU1BFQUtFUl9ERVZJQ0VTX1VQREFURVMsXy5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEUsXy5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfQ0FNRVJBX1VQREFURSxfLk1JTk9SX0VWRU5UXSxbUy5TRUxFQ1RFRF9TUEVBS0VSX1VQREFURSxfLk1JTk9SX0VWRU5UXSxbUy5NRURJQV9QRVJNSVNTSU9OLF8uTUlOT1JfRVZFTlRdLFtTLkxFR0FDWV9TV0lUQ0gsXy5NSU5PUl9FVkVOVF0sW1MuQVVESU9fUExBWV9GQUlMRUQsXy5NSU5PUl9FVkVOVF0sW1MuVklERU9fUExBWV9GQUlMRUQsXy5NSU5PUl9FVkVOVF0sW1MuQVVESU9fVFJBQ0tfTVVURUQsXy5NSU5PUl9FVkVOVF0sW1MuVklERU9fVFJBQ0tfTVVURUQsXy5NSU5PUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9SRUJVRkZFUklORyxfLk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0FVRElPX0JMT0NLRUQsXy5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELF8uTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfRVJST1IsXy5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUixfLk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUixfLk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsXy5NQUpPUl9FVkVOVF0sW1MuTElWRVNUUkVBTV9MQVRFTkNZLF8uTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULF8uTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELF8uTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELF8uTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfSU5JVElBTElaRUQsXy5NSU5PUl9FVkVOVF0sW1MuRVhQRUNURURfVklERU9fUkVTT0xVVElPTixfLk1JTk9SX0VWRU5UXSxbUy5FWFBFQ1RFRF9TQ1JFRU5TSEFSRV9SRVNPTFVUSU9OLF8uTUlOT1JfRVZFTlRdXSk7Y2xhc3MgdW57Y29uc3RydWN0b3IoKXtwKHRoaXMsImV2ZW50cyIpO3RoaXMuZXZlbnRzPVtdfWFkZChyKXt0aGlzLmV2ZW50cy5wdXNoKHIpfWZsdXNoKCl7cmV0dXJue2VudHJpZXM6dGhpcy5ldmVudHMuc3BsaWNlKDAsMjUpfX19Y2xhc3MgcG4gZXh0ZW5kcyBxe2NvbnN0cnVjdG9yKHtsb2dnZXI6ZSxwZWVySWQ6cyxhcGlIb3N0bmFtZXM6bixhdXRoVG9rZW46aX0pe3N1cGVyKCk7cCh0aGlzLCJsb2dnZXIiKTtwKHRoaXMsInBlZXJJZCIpO3AodGhpcywiZXZlbnRTdG9yZSIpO3AodGhpcywiYXBpRW5kcG9pbnQiKTtwKHRoaXMsImF1dGhUb2tlbiIpO3RoaXMubG9nZ2VyPWUsdGhpcy5wZWVySWQ9cyx0aGlzLmF1dGhUb2tlbj1pLHRoaXMuYXBpRW5kcG9pbnQ9YGh0dHBzOi8vJHtuLmRhQ29sbGVjdG9yfS9hcGkvdjEvbWVzc2FnZWAsdGhpcy5ldmVudFN0b3JlPW5ldyB1bn1zZW5kRXZlbnRzQ2h1bmtUb1NlcnZlcihlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz17cGF5bG9hZDplLHBlZXJJZDp0aGlzLnBlZXJJZH0sbj1uZXcgQWJvcnRDb250cm9sbGVyLGk9c2V0VGltZW91dCgoKT0+bi5hYm9ydCgpLDNlMyk7dHJ5e3JldHVybiB5aWVsZCBmZXRjaCh0aGlzLmFwaUVuZHBvaW50LHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIixBdXRob3JpemF0aW9uOmBCZWFyZXIgJHt0aGlzLmF1dGhUb2tlbn1gfSxib2R5OkpTT04uc3RyaW5naWZ5KHMpLHNpZ25hbDpuLnNpZ25hbH0pLCEwfWNhdGNoKGEpe3JldHVybiB0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjpzZW5kRXZlbnRzQ2h1bmtUb1NlcnZlcjo6Y2F0Y2giLHtwZWVySWQ6dGhpcy5wZWVySWQsZW5kcG9pbnQ6dGhpcy5hcGlFbmRwb2ludCxlcnJvcjphIGluc3RhbmNlb2YgRXJyb3I/YS5tZXNzYWdlOlN0cmluZyhhKSxzdGFjazphIGluc3RhbmNlb2YgRXJyb3I/YS5zdGFjazp2b2lkIDB9KSwhMX1maW5hbGx5e2NsZWFyVGltZW91dChpKX19KX1jYWxsRXZlbnQoZSl7ZS50aW1lc3RhbXA9bmV3IERhdGUsdGhpcy5ldmVudFN0b3JlLmFkZChlKSx0aGlzLmVtaXQoZS5ldmVudCxlLm1ldGFEYXRhKSxsbi5nZXQoZS5ldmVudCk9PT1fLk1BSk9SX0VWRU5UJiZ0aGlzLmZsdXNoKCl9Zmx1c2goKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIHM7Y29uc3QgZT10aGlzLmV2ZW50U3RvcmUuZmx1c2goKTtpZigocz1lPT1udWxsP3ZvaWQgMDplLmVudHJpZXMpIT1udWxsJiZzLmxlbmd0aCl7Y29uc3Qgbj15aWVsZCB0aGlzLnNlbmRFdmVudHNDaHVua1RvU2VydmVyKGUpO3JldHVybiBufHxlLmVudHJpZXMuZm9yRWFjaChpPT57dGhpcy5ldmVudFN0b3JlLmFkZChpKX0pLG59cmV0dXJuITF9KX19dmFyIGhyOyhmdW5jdGlvbih0KXt0LkNIUk9NSVVNPSJjaHJvbXVtIix0LkZJUkVGT1g9ImZpcmVmb3giLHQuU0FGQVJJPSJzYWZhcmkifSkoaHJ8fChocj17fSkpO2NvbnN0IGZyPXtERVZFTDoiZGV2ZWwiLFBSRVBST0Q6InByZXByb2QiLFBST0Q6InByb2QifTt2YXIgSjsoZnVuY3Rpb24odCl7dC5BVURJTz0iQVVESU8iLHQuVklERU89IlZJREVPIix0LlNQRUFLRVI9IlNQRUFLRVIiLHQuU0NSRUVOU0hBUkU9IlNDUkVFTlNIQVJFIn0pKEp8fChKPXt9KSk7dmFyIG1yOyhmdW5jdGlvbih0KXt0W3QuSU5JVD0wXT0iSU5JVCIsdFt0LkFDQ0VQVEVEPTFdPSJBQ0NFUFRFRCIsdFt0LkRFTklFRD0yXT0iREVOSUVEIix0W3QuU1lTX0RFTklFRD0zXT0iU1lTX0RFTklFRCIsdFt0LkZBSUxFRD00XT0iRkFJTEVEIix0W3QuTk9URk9VTkQ9NV09Ik5PVEZPVU5EIix0W3QuTk9UX0FQUExJQ0FCTEU9Nl09Ik5PVF9BUFBMSUNBQkxFIn0pKG1yfHwobXI9e30pKTtmdW5jdGlvbiBhZSh0KXtyZXR1cm4gdD90LnNwbGl0KCIuIikuc2xpY2UoMCwyKS5jb25jYXQoWyIwIiwiMCJdKS5qb2luKCIuIik6IiJ9ZnVuY3Rpb24gbHQoe3BhY2tldHNMb3N0OnQscGFja2V0c1NlbnQ6cn0pe3JldHVybiByPjA/dCoxMDAvcjowfWZ1bmN0aW9uIHV0KHtwYWNrZXRzTG9zdDp0LHBhY2tldHNSZWNlaXZlZDpyfSl7cmV0dXJuIHIrdD4wP3QqMTAwLyhyK3QpOjB9Y29uc3QgZ3I9MjQwLFNyPTcyMCx5cj04LHZyPTMscHQ9MTAsaHQ9LjAyLGZ0PS4wMztmdW5jdGlvbiB0ZSh7c3RhdDp0LHdlaWdodDpyLHJhbmdlTWluOmUscmFuZ2VNYXg6cyxyYW5nZVJhbmtpbmdEaXJlY3Rpb246bn0pe3JldHVybiB0PT1udWxsP3I6ZT09PXM/bj09PSJVUCI/dDw9ZT9yOjA6dD49cz9yOjA6bj09PSJVUCI/KDEtTWF0aC5tYXgoTWF0aC5taW4ocyxNYXRoLmFicyh0KSktZSwwKS8ocy1lKSkqcjpuPT09IkRPV04iP01hdGgubWF4KE1hdGgubWluKHMsTWF0aC5hYnModCkpLWUsMCkvKHMtZSkqcjpyfWZ1bmN0aW9uIGJyKHtpc0xvd1F1YWxpdHlWaWRlbzp0LGlzVmlkZW9TdHVjazpyLGlzVmlkZW9MYWdnaW5nOmUsaml0dGVyUXVhbGl0eTpzLHBhY2tldHNMb3N0UXVhbGl0eTpufSl7Y29uc3QgaT0uOCooKHQ/Ljg1OjEpKihlPy43OjEpKihyPy41OjEpKSsuMioocypuKTtyZXR1cm4gTWF0aC5yb3VuZCgoaStOdW1iZXIuRVBTSUxPTikqMTAwKS8xMDB9ZnVuY3Rpb24gRXIoe3BhY2tldHNMb3N0OnQscGFja2V0c1NlbnQ6cn0pe3JldHVybiByPjA/dCoxMDAvcjowfWZ1bmN0aW9uIFRyKHtwYWNrZXRzTG9zdDp0LHBhY2tldHNTZW50OnIsaml0dGVyOmV9KXtjb25zdCBuPXRlKHtzdGF0OkVyKHtwYWNrZXRzTG9zdDp0LHBhY2tldHNTZW50OnJ9KSx3ZWlnaHQ6LjcscmFuZ2VNaW46MCxyYW5nZU1heDpwdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGE9dGUoe3N0YXQ6ZSx3ZWlnaHQ6LjMscmFuZ2VNaW46aHQscmFuZ2VNYXg6ZnQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KTtyZXR1cm4gbithfWZ1bmN0aW9uIGhuKHtmcmFtZVdpZHRoOnQsaXNTY3JlZW5TaGFyZTpyfSl7cmV0dXJuIHQ8KHI/U3I6Z3IpfWZ1bmN0aW9uIGZuKHtmcmFtZXNQZXJTZWNvbmQ6dCxpc1NjcmVlblNoYXJlOnJ9KXtyZXR1cm4gdDwocj92cjp5cil9ZnVuY3Rpb24gbW4oe2ZyYW1lc0VuY29kZWQ6dH0pe3JldHVybiB0PT09MH1mdW5jdGlvbiBfcih7ZnJhbWVXaWR0aDp0LGZyYW1lc1BlclNlY29uZDpyLHBhY2tldHNMb3N0OmUscGFja2V0c1NlbnQ6cyxqaXR0ZXI6bixpc1NjcmVlblNoYXJlOmksZnJhbWVzRW5jb2RlZDphfSl7Y29uc3QgZD10ZSh7c3RhdDpFcih7cGFja2V0c0xvc3Q6ZSxwYWNrZXRzU2VudDpzfSksd2VpZ2h0OjEscmFuZ2VNaW46MCxyYW5nZU1heDpwdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLG89dGUoe3N0YXQ6bix3ZWlnaHQ6MSxyYW5nZU1pbjpodCxyYW5nZU1heDpmdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGw9aG4oe2ZyYW1lV2lkdGg6dCxpc1NjcmVlblNoYXJlOml9KSxmPWZuKHtmcmFtZXNQZXJTZWNvbmQ6cixpc1NjcmVlblNoYXJlOml9KSx5PW1uKHtmcmFtZXNFbmNvZGVkOmEsaXNTY3JlZW5TaGFyZTppfSk7cmV0dXJuIGJyKHtpc0xvd1F1YWxpdHlWaWRlbzpsLGlzVmlkZW9MYWdnaW5nOmYsaXNWaWRlb1N0dWNrOnksaml0dGVyUXVhbGl0eTpvLHBhY2tldHNMb3N0UXVhbGl0eTpkfSl9ZnVuY3Rpb24gUnIoe3BhY2tldHNMb3N0OnQscGFja2V0c1JlY2VpdmVkOnJ9KXtyZXR1cm4gcit0PjA/dCoxMDAvKHIrdCk6MH1mdW5jdGlvbiBQcih7Y29uY2VhbG1lbnRFdmVudHM6dCxwYWNrZXRzTG9zdDpyLHBhY2tldHNSZWNlaXZlZDplLGppdHRlcjpzfSl7Y29uc3QgaT10ZSh7c3RhdDp0LHdlaWdodDouMixyYW5nZU1pbjowLHJhbmdlTWF4OjMscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxhPS41LGQ9dGUoe3N0YXQ6UnIoe3BhY2tldHNMb3N0OnIscGFja2V0c1JlY2VpdmVkOmV9KSx3ZWlnaHQ6YSxyYW5nZU1pbjowLHJhbmdlTWF4OnB0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksbD10ZSh7c3RhdDpzLHdlaWdodDouMyxyYW5nZU1pbjpodCxyYW5nZU1heDpmdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pO3JldHVybiBpK2QrbH1mdW5jdGlvbiBnbih7ZnJhbWVzRGVjb2RlZDp0fSl7cmV0dXJuIHQ9PT0wfWZ1bmN0aW9uIFNuKHtmcmFtZXNQZXJTZWNvbmQ6dCxpc1NjcmVlblNoYXJlOnJ9KXtyZXR1cm4gdDwocj92cjp5cil9ZnVuY3Rpb24geW4oe2ZyYW1lV2lkdGg6dCxpc1NjcmVlblNoYXJlOnJ9KXtyZXR1cm4gdDwocj9Tcjpncil9ZnVuY3Rpb24gQ3Ioe2ZyYW1lV2lkdGg6dCxmcmFtZXNQZXJTZWNvbmQ6cixwYWNrZXRzTG9zdDplLHBhY2tldHNSZWNlaXZlZDpzLGppdHRlcjpuLGlzU2NyZWVuU2hhcmU6aSxmcmFtZXNEZWNvZGVkOmF9KXtjb25zdCBkPXRlKHtzdGF0OlJyKHtwYWNrZXRzTG9zdDplLHBhY2tldHNSZWNlaXZlZDpzfSksd2VpZ2h0OjEscmFuZ2VNaW46MCxyYW5nZU1heDpwdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLG89dGUoe3N0YXQ6bix3ZWlnaHQ6MSxyYW5nZU1pbjpodCxyYW5nZU1heDpmdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGw9eW4oe2ZyYW1lV2lkdGg6dCxpc1NjcmVlblNoYXJlOml9KSxmPVNuKHtmcmFtZXNQZXJTZWNvbmQ6cixpc1NjcmVlblNoYXJlOml9KSx5PWduKHtmcmFtZXNEZWNvZGVkOmEsaXNTY3JlZW5TaGFyZTppfSk7cmV0dXJuIGJyKHtpc0xvd1F1YWxpdHlWaWRlbzpsLGlzVmlkZW9MYWdnaW5nOmYsaXNWaWRlb1N0dWNrOnksaml0dGVyUXVhbGl0eTpvLHBhY2tldHNMb3N0UXVhbGl0eTpkfSl9Y2xhc3MgcmV7Y29uc3RydWN0b3Iocil7cCh0aGlzLCJwYzEiKTtwKHRoaXMsInBjMiIpO3AodGhpcywiY29uc3RyYWluVmlkZW9CaXRyYXRlS2JwcyIpO3AodGhpcywiY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjIiwhMSk7cCh0aGlzLCJpY2VDYW5kaWRhdGVGaWx0ZXIiKTtjb25zdCBlPW5ldyBSVENQZWVyQ29ubmVjdGlvbihyKSxzPW5ldyBSVENQZWVyQ29ubmVjdGlvbihyKTt0aGlzLnBjMT1lLHRoaXMucGMyPXMsdGhpcy5pY2VDYW5kaWRhdGVGaWx0ZXI9cmUubm9GaWx0ZXIsdGhpcy5wYzEuYWRkRXZlbnRMaXN0ZW5lcigiaWNlY2FuZGlkYXRlIix0aGlzLm9uSWNlQ2FuZGlkYXRlLmJpbmQodGhpcyx0aGlzLnBjMikpLHRoaXMucGMyLmFkZEV2ZW50TGlzdGVuZXIoImljZWNhbmRpZGF0ZSIsdGhpcy5vbkljZUNhbmRpZGF0ZS5iaW5kKHRoaXMsdGhpcy5wYzEpKX1zdGF0aWMgcGFyc2VDYW5kaWRhdGUocil7Y29uc3QgZT0iY2FuZGlkYXRlOiIscz1yLmluZGV4T2YoZSkrZS5sZW5ndGgsbj1yLnN1YnN0cihzKS5zcGxpdCgiICIpO3JldHVybnt0eXBlOm5bN10scHJvdG9jb2w6blsyXSxhZGRyZXNzOm5bNF19fXN0YXRpYyBpc05vdEhvc3RDYW5kaWRhdGUocil7cmV0dXJuIHIudHlwZSE9PSJob3N0In1zdGF0aWMgaXNIb3N0KHIpe3JldHVybiByLnR5cGU9PT0iaG9zdCJ9c3RhdGljIGlzUmVsYXkocil7cmV0dXJuIHIudHlwZT09PSJyZWxheSJ9c3RhdGljIGlzUmVmbGV4aXZlKHIpe3JldHVybiByLnR5cGU9PT0ic3JmbHgifXN0YXRpYyBub0ZpbHRlcihyKXtyZXR1cm4hMH1vbkljZUNhbmRpZGF0ZShyLGUpe2lmKGUuY2FuZGlkYXRlKXtjb25zdCBzPXJlLnBhcnNlQ2FuZGlkYXRlKGUuY2FuZGlkYXRlLmNhbmRpZGF0ZSk7dGhpcy5pY2VDYW5kaWRhdGVGaWx0ZXIocykmJnIuYWRkSWNlQ2FuZGlkYXRlKGUuY2FuZGlkYXRlKX19c2V0SWNlQ2FuZGlkYXRlRmlsdGVyKHIpe3RoaXMuaWNlQ2FuZGlkYXRlRmlsdGVyPXJ9Y29uc3RyYWluVmlkZW9CaXRyYXRlKHIpe3RoaXMuY29uc3RyYWluVmlkZW9CaXRyYXRlS2Jwcz1yfWRpc2FibGVWaWRlb0ZlYygpe3RoaXMuY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjPSEwfWdvdE9mZmVyKHIpe3RoaXMuY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjJiYoci5zZHA9ci5zZHAucmVwbGFjZSgvKG09dmlkZW8gMSBbXlxyXSspKDExNiAxMTcpKFxyXG4pL2csYCQxXHIKYCksci5zZHA9ci5zZHAucmVwbGFjZSgvYT1ydHBtYXA6MTE2IHJlZFwvOTAwMDBcclxuL2csIiIpLHIuc2RwPXIuc2RwLnJlcGxhY2UoL2E9cnRwbWFwOjExNyB1bHBmZWNcLzkwMDAwXHJcbi9nLCIiKSxyLnNkcD1yLnNkcC5yZXBsYWNlKC9hPXJ0cG1hcDo5OCBydHhcLzkwMDAwXHJcbi9nLCIiKSxyLnNkcD1yLnNkcC5yZXBsYWNlKC9hPWZtdHA6OTggYXB0PTExNlxyXG4vZywiIikpLHRoaXMucGMxLnNldExvY2FsRGVzY3JpcHRpb24ociksdGhpcy5wYzIuc2V0UmVtb3RlRGVzY3JpcHRpb24ociksdGhpcy5wYzIuY3JlYXRlQW5zd2VyKCkudGhlbih0aGlzLmdvdEFuc3dlci5iaW5kKHRoaXMpLHRoaXMucmVwb3J0RmF0YWwuYmluZCh0aGlzKSl9Z290QW5zd2VyKHIpe3RoaXMuY29uc3RyYWluVmlkZW9CaXRyYXRlS2JwcyYmKHIuc2RwPXIuc2RwLnJlcGxhY2UoL2E9bWlkOnZpZGVvXHJcbi9nLGBhPW1pZDp2aWRlb1xyCmI9QVM6JHt0aGlzLmNvbnN0cmFpblZpZGVvQml0cmF0ZUticHN9XHIKYCkpLHRoaXMucGMyLnNldExvY2FsRGVzY3JpcHRpb24ociksdGhpcy5wYzEuc2V0UmVtb3RlRGVzY3JpcHRpb24ocil9ZXN0YWJsaXNoQ29ubmVjdGlvbigpe3RoaXMucGMxLmNyZWF0ZU9mZmVyKCkudGhlbih0aGlzLmdvdE9mZmVyLmJpbmQodGhpcyksdGhpcy5yZXBvcnRGYXRhbC5iaW5kKHRoaXMpKX1yZXBvcnRGYXRhbChyKXtjb25zb2xlLmVycm9yKCJFcnJvcjoiLHIpfWdldFJvdW5kVHJpcFRpbWUoKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3RbcixlXT15aWVsZCBQcm9taXNlLmFsbChbdGhpcy5wYzEuZ2V0U3RhdHMoKSx0aGlzLnBjMi5nZXRTdGF0cygpXSk7bGV0IHMsbjtpZihyLmZvckVhY2goaT0+e2kudHlwZT09PSJjYW5kaWRhdGUtcGFpciImJmkubm9taW5hdGVkPT09ITAmJmkuYnl0ZXNTZW50PjAmJihzPWkpfSksZS5mb3JFYWNoKGk9PntpLnR5cGU9PT0iY2FuZGlkYXRlLXBhaXIiJiZpLm5vbWluYXRlZD09PSEwJiZpLmJ5dGVzUmVjZWl2ZWQ+MCYmKG49aSl9KSxzJiZuKXRyeXtpZihzLmN1cnJlbnRSb3VuZFRyaXBUaW1lJiZuLmN1cnJlbnRSb3VuZFRyaXBUaW1lKXJldHVybntydHQ6cy5jdXJyZW50Um91bmRUcmlwVGltZSxiYWNrZW5kUlRUOm4uY3VycmVudFJvdW5kVHJpcFRpbWV9O2NvbnN0IGk9KG4ubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLXMubGFzdFBhY2tldFNlbnRUaW1lc3RhbXApLzFlMztyZXR1cm57cnR0OmksYmFja2VuZFJUVDppfX1jYXRjaChpKXtyZXR1cm59fSl9Y2xvc2UoKXt0aGlzLnBjMS5jbG9zZSgpLHRoaXMucGMyLmNsb3NlKCl9fWNsYXNzIElyIGV4dGVuZHMgcXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3AodGhpcywiY2FsbCIpO3AodGhpcywidGltZU91dCIpO3RoaXMuY2FsbD1uZXcgcmUoZSl9c3RhcnQoZT0xZTQpe3RoaXMuY2FsbC5lc3RhYmxpc2hDb25uZWN0aW9uKCksdGhpcy50aW1lT3V0PXNldFRpbWVvdXQodGhpcy50ZXN0RmFpbGVkLmJpbmQodGhpcyksZSl9dGVzdENvbXBsZXRlKGUpe2NsZWFyVGltZW91dCh0aGlzLnRpbWVPdXQpLHRoaXMuY2FsbC5jbG9zZSgpLHRoaXMuZW1pdCgiZG9uZSIsZSl9dGVzdEZhaWxlZChlKXt0aGlzLmNhbGwuY2xvc2UoKSx0aGlzLmVtaXQoImZhaWxlZCIsZSl9fWNvbnN0IHZuPTgsYm49MS8xZTM7Y2xhc3MgRW4gZXh0ZW5kcyBJcntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtwKHRoaXMsInNlbmRlckNoYW5uZWwiKTtwKHRoaXMsInJlY2lldmVDaGFubmVsIik7cCh0aGlzLCJzdGFydFRpbWUiKTtwKHRoaXMsImxhc3RCaXRyYXRlTWVhc3VyZVRpbWUiKTtwKHRoaXMsInNlbnRQYXlsb2FkQnl0ZXMiLDApO3AodGhpcywicmVjaWV2ZWRQYXlsb2FkQnl0ZXMiLDApO3AodGhpcywibGFzdFJlY2VpdmVkUGF5bG9hZEJ5dGVzIiwwKTtwKHRoaXMsInN0b3BTZW5kaW5nIiwhMSk7cCh0aGlzLCJ0ZXN0UHJvZ3Jlc3MiLDApO3AodGhpcywic2FtcGxlUGFja2V0IiwiIik7cCh0aGlzLCJmaW5hbEJpdHJhdGVTdW0iLDApO3AodGhpcywiYml0UmF0ZVNhbXBlbHMiLDApO3AodGhpcywibWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kIiwwKTtwKHRoaXMsImJ5dGVzVG9LZWVwQnVmZmVyZWQiLDApO3AodGhpcywidGVzdER1cmF0aW9uU2Vjb25kcyIsNSk7dGhpcy5jYWxsLnNldEljZUNhbmRpZGF0ZUZpbHRlcihyZS5pc05vdEhvc3RDYW5kaWRhdGUpLHRoaXMuc2VuZGVyQ2hhbm5lbD10aGlzLmNhbGwucGMxLmNyZWF0ZURhdGFDaGFubmVsKG51bGwpO2ZvcihsZXQgcz0wO3M8MTAyNCoyNTY7cys9MSl0aGlzLnNhbXBsZVBhY2tldCs9ImgiO3RoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kPTEsdGhpcy5ieXRlc1RvS2VlcEJ1ZmZlcmVkPTEwMjQqdGhpcy5tYXhOdW1iZXJPZlBhY2tldHNUb1NlbmQsdGhpcy50ZXN0RHVyYXRpb25TZWNvbmRzPTQsdGhpcy5zZW5kZXJDaGFubmVsLmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLHRoaXMuc2VuZGluZ1N0ZXAuYmluZCh0aGlzKSksdGhpcy5jYWxsLnBjMi5hZGRFdmVudExpc3RlbmVyKCJkYXRhY2hhbm5lbCIsdGhpcy5vblJlY2lldmVyQ2hhbm5lbC5iaW5kKHRoaXMpKX1zZW5kaW5nU3RlcCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5zdGFydFRpbWV8fCh0aGlzLnN0YXJ0VGltZT1lLHRoaXMubGFzdEJpdHJhdGVNZWFzdXJlVGltZT1lKTtmb3IobGV0IG49MDtuIT09dGhpcy5tYXhOdW1iZXJPZlBhY2tldHNUb1NlbmQmJiEodGhpcy5zZW5kZXJDaGFubmVsLmJ1ZmZlcmVkQW1vdW50Pj10aGlzLmJ5dGVzVG9LZWVwQnVmZmVyZWQpO24rPTEpe3RoaXMuc2VudFBheWxvYWRCeXRlcys9dGhpcy5zYW1wbGVQYWNrZXQubGVuZ3RoO3RyeXt0aGlzLnNlbmRlckNoYW5uZWwuc2VuZCh0aGlzLnNhbXBsZVBhY2tldCl9Y2F0Y2goaSl7fX1jb25zdCBzPWUuZ2V0VGltZSgpLXRoaXMuc3RhcnRUaW1lLmdldFRpbWUoKTtzPj0xZTMqdGhpcy50ZXN0RHVyYXRpb25TZWNvbmRzPyh0aGlzLnN0b3BTZW5kaW5nPSEwLHRoaXMudGVzdFByb2dyZXNzPTEwMCk6KHRoaXMudGVzdFByb2dyZXNzPXMvKDEwKnRoaXMudGVzdER1cmF0aW9uU2Vjb25kcyksc2V0VGltZW91dCh0aGlzLnNlbmRpbmdTdGVwLmJpbmQodGhpcyksMSkpfW9uTWVzc2FnZVJlY2lldmVkKGUpe3RoaXMucmVjaWV2ZWRQYXlsb2FkQnl0ZXMrPWUuZGF0YS5sZW5ndGg7Y29uc3Qgcz1uZXcgRGF0ZSxuPXMuZ2V0VGltZSgpLXRoaXMubGFzdEJpdHJhdGVNZWFzdXJlVGltZS5nZXRUaW1lKCk7aWYobj49MWUzKXtjb25zdCBhPSh0aGlzLnJlY2lldmVkUGF5bG9hZEJ5dGVzLXRoaXMubGFzdFJlY2VpdmVkUGF5bG9hZEJ5dGVzKSp2bi8obi8xZTMpO3RoaXMuZmluYWxCaXRyYXRlU3VtKz1hLHRoaXMuYml0UmF0ZVNhbXBlbHMrPTEsdGhpcy5sYXN0UmVjZWl2ZWRQYXlsb2FkQnl0ZXM9dGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcyx0aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWU9c31pZih0aGlzLnN0b3BTZW5kaW5nJiZ0aGlzLnNlbnRQYXlsb2FkQnl0ZXM9PT10aGlzLnJlY2lldmVkUGF5bG9hZEJ5dGVzKXtjb25zdCBpPXRoaXMuZmluYWxCaXRyYXRlU3VtL3RoaXMuYml0UmF0ZVNhbXBlbHM7dGhpcy50ZXN0Q29tcGxldGUoe3Rocm91Z2hwdXQ6TWF0aC5yb3VuZChpKmJuKX0pfX10ZXN0Q29tcGxldGUoZSl7dGhpcy5jYWxsLmdldFJvdW5kVHJpcFRpbWUoKS50aGVuKCh7cnR0OnMsYmFja2VuZFJUVDpufSk9PnN1cGVyLnRlc3RDb21wbGV0ZSh7UlRUOnMsYmFja2VuZFJUVDpuLHRocm91Z2hwdXQ6ZS50aHJvdWdocHV0fSkpfW9uUmVjaWV2ZXJDaGFubmVsKGUpe3RoaXMucmVjaWV2ZUNoYW5uZWw9ZS5jaGFubmVsLHRoaXMucmVjaWV2ZUNoYW5uZWwuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5vbk1lc3NhZ2VSZWNpZXZlZC5iaW5kKHRoaXMpKX19Y2xhc3MgQXQgZXh0ZW5kcyBJcntjb25zdHJ1Y3RvcihlLHM9cmUubm9GaWx0ZXIpe3N1cGVyKGUpO3AodGhpcywiY2gxIik7cCh0aGlzLCJjaDIiKTt0aGlzLmNhbGwuc2V0SWNlQ2FuZGlkYXRlRmlsdGVyKHMpO2NvbnN0IG49dGhpcy5jYWxsLnBjMS5jcmVhdGVEYXRhQ2hhbm5lbChudWxsKTt0aGlzLmNoMT1uLG4uYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsKCk9PntuLnNlbmQoImhlbGxvIil9KSxuLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25DaDFSZWNpZXZlLmJpbmQodGhpcykpLHRoaXMuY2FsbC5wYzIuYWRkRXZlbnRMaXN0ZW5lcigiZGF0YWNoYW5uZWwiLHRoaXMuZGF0YUNoYW5uZWxIYW5kbGVyLmJpbmQodGhpcykpfW9uQ2gxUmVjaWV2ZShlKXtlLmRhdGEhPT0id29ybGQiP3RoaXMuaGFuZ3VwKCJJbnZhbGlkIGRhdGEgdHJhbnNtaXR0ZWQuIik6dGhpcy50ZXN0Q29tcGxldGUoe2Nvbm5lY3Rpdml0eTohMH0pfW9uQ2gyUmVjaWV2ZShlKXtpZihlLmRhdGEhPT0iaGVsbG8iKXRoaXMuaGFuZ3VwKCJJbnZhbGlkIGRhdGEgdHJhbnNtaXR0ZWQuIik7ZWxzZSB0cnl7dGhpcy5jaDIuc2VuZCgid29ybGQiKX1jYXRjaChzKXt9fWRhdGFDaGFubmVsSGFuZGxlcihlKXtjb25zdCBzPWUuY2hhbm5lbDt0aGlzLmNoMj1zLHMuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5vbkNoMlJlY2lldmUuYmluZCh0aGlzKSl9aGFuZ3VwKGUpe3RoaXMudGVzdEZhaWxlZChlKX19Y2xhc3MgVG4gZXh0ZW5kcyBBdHtjb25zdHJ1Y3RvcihyKXtzdXBlcihyLHJlLmlzSG9zdCl9fWNsYXNzIF9uIGV4dGVuZHMgQXR7Y29uc3RydWN0b3Iocil7c3VwZXIocixyZS5pc1JlbGF5KX19Y2xhc3MgUm4gZXh0ZW5kcyBBdHtjb25zdHJ1Y3RvcihyKXtzdXBlcihyLHJlLmlzUmVmbGV4aXZlKX19Y2xhc3MgUG57Y29uc3RydWN0b3IoKXtwKHRoaXMsImlwSW5mb3JtYXRpb24iLG51bGwpfWdldElQRGV0YWlscyhuKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDpyLGFwaUhvc3RuYW1lczplLGxvZ2dlcjpzfSl7dmFyIGksYSxkO2lmKCF0aGlzLmlwSW5mb3JtYXRpb24pe3RyeXtjb25zdCBvPWBodHRwczovLyR7ZS5sb2NhdGlvbn1gLGY9eWllbGQoeWllbGQgZmV0Y2gobykpLmpzb24oKTtpZigoKGk9Zi5sb2MpPT1udWxsP3ZvaWQgMDppLmxlbmd0aCk+NSlyZXR1cm4gdGhpcy5pcEluZm9ybWF0aW9uPWYsKGE9dGhpcy5pcEluZm9ybWF0aW9uKSE9bnVsbCYmYS5pcCYmKHRoaXMuaXBJbmZvcm1hdGlvbi5pcD1hZSh0aGlzLmlwSW5mb3JtYXRpb24uaXApKSxmO3Rocm93IEVycm9yKCJJbnN1ZmZpY2llbnQgZGF0YSIpfWNhdGNoKG8pe3MuZXJyb3IoImNhbGxzdGF0czo6aXBEZXRhaWxzOjogZmFpbGVkIHRvIGZldGNoIGlwIHVzaW5nIGxvY2F0aW9uIHNlcnZpY2UiLHtlcnJvcjpvfSl9dHJ5e2NvbnN0IG89eWllbGQgZmV0Y2goYGh0dHBzOi8vJHtlLmxvY2F0aW9uTGVnYWN5fS8/dG9rZW49M2M0OTM5MzJiMDYyNGMmcGVlcklkPSR7cn1gLHttZXRob2Q6IlBPU1QifSk7dGhpcy5pcEluZm9ybWF0aW9uPXlpZWxkIG8uanNvbigpLChkPXRoaXMuaXBJbmZvcm1hdGlvbikhPW51bGwmJmQuaXAmJih0aGlzLmlwSW5mb3JtYXRpb24uaXA9YWUodGhpcy5pcEluZm9ybWF0aW9uLmlwKSl9Y2F0Y2gobyl7cy5lcnJvcigiY2FsbHN0YXRzOjppcERldGFpbHM6OiBmYWlsZWQgdG8gZmV0Y2ggaXAgdXNpbmcgbGVnYWN5IGxvY2F0aW9uIHNlcnZpY2UiLHtlcnJvcjpvfSl9fXJldHVybiB0aGlzLmlwSW5mb3JtYXRpb259KX1yZXNldENhY2hlKCl7dGhpcy5pcEluZm9ybWF0aW9uPW51bGx9fWNvbnN0IHdyPW5ldyBQbixNcj1be3VybHM6InR1cm46dHVybi5keXRlLmluOjQ0Mz90cmFuc3BvcnQ9dGNwIix1c2VybmFtZToiZHl0ZSIsY3JlZGVudGlhbDoiZHl0ZWluIixjcmVkZW50aWFsVHlwZToicGFzc3dvcmQifSx7dXJsczoidHVybjp0dXJuLmR5dGUuaW46MzQ3OD90cmFuc3BvcnQ9dWRwIix1c2VybmFtZToiZHl0ZSIsY3JlZGVudGlhbDoiZHl0ZWluIixjcmVkZW50aWFsVHlwZToicGFzc3dvcmQifV07ZnVuY3Rpb24gQXIodCl7Y29uc3RbcixlXT10LnNwbGl0KCIsIik7cmV0dXJue2Nvb3Jkczp7bGF0aXR1ZGU6TnVtYmVyKHIpLGxvbmdpdHVkZTpOdW1iZXIoZSl9fX1jbGFzcyBrcntjb25zdHJ1Y3Rvcigpe3AodGhpcywidHJhbnNwb3J0Iik7cCh0aGlzLCJjYW5kaWRhdGVQYWlyIik7cCh0aGlzLCJvdXRib3VuZFZpZGVvUnRwIixuZXcgTWFwKTtwKHRoaXMsImluYm91bmRWaWRlb1J0cCIsbmV3IE1hcCk7cCh0aGlzLCJvdXRib3VuZEF1ZGlvUnRwIixuZXcgTWFwKTtwKHRoaXMsImluYm91bmRBdWRpb1J0cCIsbmV3IE1hcCk7cCh0aGlzLCJyZW1vdGVJbmJvdW5kUnRwIixuZXcgTWFwKTtwKHRoaXMsInByb2R1Y2VyU3RyZWFtTWFwIixuZXcgTWFwKTtwKHRoaXMsImNvbnN1bWVyU3RyZWFtTWFwIixuZXcgTWFwKTtwKHRoaXMsInN0YWxlUHJvZHVjZXJTdHJlYW1NYXAiLCExKTtwKHRoaXMsInN0YWxlQ29uc3VtZXJTdHJlYW1NYXAiLCExKX19Y2xhc3MgT3IgZXh0ZW5kcyBxe2NvbnN0cnVjdG9yKCl7c3VwZXIoKTtwKHRoaXMsIm9ic2VydmVyIik7cCh0aGlzLCJvdXRib3VuZFByb2R1Y2VyTWFwIixuZXcgTWFwKTtwKHRoaXMsImluYm91bmRDb25zdW1lck1hcCIsbmV3IE1hcCk7cCh0aGlzLCJjb25zdW1lclBlZXJJZE1hcCIsbmV3IE1hcCk7cCh0aGlzLCJwYXVzZWRDb25zdW1lck1hcCIsbmV3IE1hcCk7cCh0aGlzLCJwYXVzZWRQcm9kdWNlck1hcCIsbmV3IE1hcCk7cCh0aGlzLCJvdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwIix7fSk7cCh0aGlzLCJvdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwIix7fSk7cCh0aGlzLCJvdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXAiLHt9KTtwKHRoaXMsIm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcCIse30pO3AodGhpcywidmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAiLG5ldyBNYXApO3AodGhpcywiYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAiLG5ldyBNYXApO3AodGhpcywidmlkZW9Db25zdW1lclRvU3RhdHNNYXAiLG5ldyBNYXApO3AodGhpcywiYXVkaW9Db25zdW1lclRvU3RhdHNNYXAiLG5ldyBNYXApO3AodGhpcywiY29uc3VtZXJJZHNXaXRoRnJlZXplZFZpZGVvIixuZXcgU2V0KTtwKHRoaXMsImNvbnN1bWVySWRzV2l0aEZyZWV6ZWRBdWRpbyIsbmV3IFNldCk7cCh0aGlzLCJwcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8iLG5ldyBTZXQpO3AodGhpcywicHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvIixuZXcgU2V0KTtwKHRoaXMsImZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMiLG5ldyBTZXQpO3AodGhpcywiZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcyIsbmV3IFNldCk7cCh0aGlzLCJzY3JlZW5TaGFyZVByb2R1Y2VycyIsbmV3IFNldCk7cCh0aGlzLCJzY3JlZW5TaGFyZUNvbnN1bWVycyIsbmV3IFNldCk7cCh0aGlzLCJpcERldGFpbHMiKTtwKHRoaXMsImNhbGxTdGF0c0luc3RhbmNlIik7dGhpcy5vYnNlcnZlcj1uZXcgcX1yZWdpc3RlclByb2R1Y2VyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt5aWVsZCB0aGlzLmdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAoZSksZS5vbigiY2xvc2UiLHRoaXMuZGVyZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSksZS5vbigicGF1c2UiLHRoaXMucGF1c2VQcm9kdWNlci5iaW5kKHRoaXMsZS5pZCkpLGUub24oInJlc3VtZSIsdGhpcy5yZXN1bWVQcm9kdWNlci5iaW5kKHRoaXMsZS5pZCkpLGUuYXBwRGF0YS5zY3JlZW5TaGFyZT09PSEwJiZ0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmFkZChlLmlkKX0pfXBhdXNlUHJvZHVjZXIoZSl7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5zZXQoZSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITF9KX1yZXN1bWVQcm9kdWNlcihlKXt0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmRlbGV0ZShlKX1wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyhlLHMsbil7dmFyIGEsZDtjb25zdCBpPSgoZD0oYT10aGlzPT1udWxsP3ZvaWQgMDp0aGlzLmNhbGxTdGF0c0luc3RhbmNlKT09bnVsbD92b2lkIDA6YS5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwKT09bnVsbD92b2lkIDA6ZC5nZXQoZSkpfHx7fTtzLnRvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ9PT1uLnBhY2tldHNSZWNlaXZlZD8odGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkVmlkZW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbHN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyVmlkZW9GcmVlemVkIix7Y29uc3VtZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfdmlkZW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxWaWRlb1BhY2tldHNSZWNlaXZlZD1uLnBhY2tldHNSZWNlaXZlZCx0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlby5oYXMoZSkmJih0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlby5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmaS52aWRlbyYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsc3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtZXJWaWRlb0RlZnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsInJlc3VtZSIsZSkpKSl9cHJvY2Vzc0luYm91bmRDb25zdW1lckF1ZGlvU3RhdHMoZSxzLG4pe3ZhciBhLGQ7Y29uc3QgaT0oKGQ9KGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOmQuZ2V0KGUpKXx8e307cy50b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkPT09bi5wYWNrZXRzUmVjZWl2ZWQ/KHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpjb25zdW1lckF1ZGlvRnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX2F1ZGlvX3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsQXVkaW9QYWNrZXRzUmVjZWl2ZWQ9bi5wYWNrZXRzUmVjZWl2ZWQsdGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8uaGFzKGUpJiYodGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyQXVkaW9EZWZyZWV6ZWQiLHtjb25zdW1lcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1lcl9hdWRpb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NPdXRib3VuZFByb2R1Y2VyVmlkZW9TdGF0cyhlLHMsbil7dmFyIGE7Y29uc3QgaT0oKGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9O3MudG90YWxWaWRlb1BhY2tldHNTZW50PT09bi5wYWNrZXRzU2VudD8odGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyVmlkZW9GcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfdmlkZW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxWaWRlb1BhY2tldHNTZW50PW4ucGFja2V0c1NlbnQsdGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uaGFzKGUpJiYodGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyVmlkZW9EZWZyZWV6ZWQiLHtwcm9kdWNlcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNlcl92aWRlb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NPdXRib3VuZFByb2R1Y2VyQXVkaW9TdGF0cyhlLHMsbil7dmFyIGE7Y29uc3QgaT0oKGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9O3MudG90YWxBdWRpb1BhY2tldHNTZW50PT09bi5wYWNrZXRzU2VudD8odGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyQXVkaW9GcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfYXVkaW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxBdWRpb1BhY2tldHNTZW50PW4ucGFja2V0c1NlbnQsdGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uaGFzKGUpJiYodGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyQXVkaW9EZWZyZWV6ZWQiLHtwcm9kdWNlcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NQcm9kdWNpbmdUcmFuc3BvcnRTdGF0cyhlLHMsbil7dmFyIGY7Y29uc3QgaT0oKGY9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmYuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9LHthdWRpbzphLHZpZGVvOmQsc2NyZWVuOm99PWksbD1hfHxkfHxvO3MudG90YWxQYWNrZXRzU2VudD09PW4ucGFja2V0c1NlbnQ/KHRoaXMuZnJlZXplZFByb2R1Y2luZ1RyYW5zcG9ydElkcy5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmbCYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6cHJvZHVjaW5nVHJhbnNwb3J0RnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNpbmdfdHJhbnNwb3J0X3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsUGFja2V0c1NlbnQ9bi5wYWNrZXRzU2VudCx0aGlzLmZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMuaGFzKGUpJiYodGhpcy5mcmVlemVkUHJvZHVjaW5nVHJhbnNwb3J0SWRzLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZsJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNpbmdUcmFuc3BvcnREZWZyZWV6ZWQiLHt0cmFuc3BvcnRJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NDb25zdW1pbmdUcmFuc3BvcnRTdGF0cyhlLHMsbil7dmFyIGQsbztjb25zdCBhPSEhQXJyYXkuZnJvbSgoKG89KGQ9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmQuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOm8udmFsdWVzKCkpfHxbXSkucmVkdWNlKChsLGYpPT5sfHxmLmF1ZGlvfHxmLnZpZGVvfHxmLnNjcmVlbiwhMSk7cy50b3RhbFBhY2tldHNSZWNlaXZlZD09PW4ucGFja2V0c1NlbnQ/KHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmYSYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtaW5nVHJhbnNwb3J0RnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsUGFja2V0c1JlY2VpdmVkPW4ucGFja2V0c1NlbnQsdGhpcy5mcmVlemVkQ29uc3VtaW5nVHJhbnNwb3J0SWRzLmhhcyhlKSYmKHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmYSYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtaW5nVHJhbnNwb3J0RGVmcmVlemVkIix7dHJhbnNwb3J0SWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWluZ190cmFuc3BvcnRfc3RhdHVzIiwicmVzdW1lIixlKSkpKX1yZWdpc3RlckNvbnN1bWVyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt5aWVsZCB0aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5zZXQoZS5pZCx7cHJvZHVjZXJJZDplLnByb2R1Y2VySWQscGVlcklkOmUuYXBwRGF0YS5wZWVySWQsYXBwRGF0YTplLmFwcERhdGF9KSxlLm9uKCJjbG9zZSIsdGhpcy5kZXJlZ2lzdGVyQ29uc3VtZXIuYmluZCh0aGlzLGUpKSxlLm9uKCJwYXVzZSIsdGhpcy5wYXVzZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5vbigicmVzdW1lIix0aGlzLnJlc3VtZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5hcHBEYXRhLnNjcmVlblNoYXJlPT09ITAmJnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuYWRkKGUuaWQpfSl9cGF1c2VDb25zdW1lcihlKXt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLnNldChlLHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMX0pfXJlc3VtZUNvbnN1bWVyKGUpe3RoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUpfWdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAoZSxzPSExKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgbj15aWVsZCBlLmdldFN0YXRzKCksaT1zP3RoaXMuZ2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQodGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsib3V0Ym91bmQtcnRwIiwicmVtb3RlLWluYm91bmQtcnRwIl0sITEsZS5pZCkpWzBdOnZvaWQgMDtmb3IoY29uc3QgYSBvZiBuLnZhbHVlcygpKXN3aXRjaChhLnR5cGUpe2Nhc2Uib3V0Ym91bmQtcnRwIjp7dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLnNldChhLmlkLGUuaWQpO2JyZWFrfX1yZXR1cm4gaX0pfWdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSxzPSExKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgbj15aWVsZCBlLmdldFN0YXRzKCksaT1zP3RoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQodGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsiaW5ib3VuZC1ydHAiXSwhMSxlLmlkKSlbMF06dm9pZCAwO2Zvcihjb25zdCBhIG9mIG4udmFsdWVzKCkpc3dpdGNoKGEudHlwZSl7Y2FzZSJpbmJvdW5kLXJ0cCI6e3RoaXMuaW5ib3VuZENvbnN1bWVyTWFwLnNldChhLmlkLGUuaWQpO2JyZWFrfX1yZXR1cm4gaX0pfWRlcmVnaXN0ZXJQcm9kdWNlcihlKXt0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZm9yRWFjaCgocyxuKT0+e3M9PT1lLmlkJiZ0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZGVsZXRlKG4pfSksdGhpcy5wYXVzZWRQcm9kdWNlck1hcC5kZWxldGUoZS5pZCksdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5kZWxldGUoZS5pZCl9ZGVyZWdpc3RlckNvbnN1bWVyKGUpe3RoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmZvckVhY2goKHMsbik9PntzPT09ZS5pZCYmdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZGVsZXRlKG4pfSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5kZWxldGUoZS5pZCksdGhpcy5wYXVzZWRDb25zdW1lck1hcC5kZWxldGUoZS5pZCksdGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5kZWxldGUoZS5pZCl9Z2V0SWNlQ2FuZGlkYXRlU3RhdHMoZSl7dmFyIHM7cmV0dXJue2lkOmUuaWQsdHlwZTplLmNhbmRpZGF0ZVR5cGV8fGUudHlwZSxhZGRyZXNzOmUuYWRkcmVzcyxwb3J0OmUucG9ydCx1cmw6ZS51cmwscHJvdG9jb2w6KHM9ZS5yZWxheVByb3RvY29sKSE9bnVsbD9zOmUucHJvdG9jb2wsbmV0d29ya1R5cGU6ZS5uZXR3b3JrVHlwZSxyZWxhdGVkQWRkcmVzczplLnJlbGF0ZWRBZGRyZXNzLHJlbGF0ZWRQb3J0OmUucmVsYXRlZFBvcnR9fWdldFdvcmtpbmdTaW11bGNhc3RWaWRlb1N0YXRzKGUpe3JldHVybiBlLmZpbmQobj0+e2NvbnN0IGk9bi5mcmFtZXNFbmNvZGVkPjAsYT1uLnBhY2tldHNTZW50PjAsZD1uLmZyYW1lV2lkdGgmJm4uZnJhbWVIZWlnaHQ7cmV0dXJuIGkmJmEmJiEhZH0pfHxlW2UubGVuZ3RoLTFdfXBhcnNlUlRDUmVwb3J0KGUscz1bXSxuPSExLGk9dm9pZCAwLGE9dm9pZCAwKXt2YXIgVSxMLEgsWix5ZSx2ZSxCZSx4ZSxqZSxVZSwkZSxIZSxLZTtjb25zdCBkPWUsbz1uZXcga3IsbD1zLmxlbmd0aD9uZXcgU2V0KHMpOnZvaWQgMCxmPVtdLHk9W10sRT1bXSx3PW5ldyBNYXAseD1uZXcgTWFwO2Zvcihjb25zdCBtIG9mIGQudmFsdWVzKCkpe2lmKGwpe2lmKGwuc2l6ZT09PTApYnJlYWs7aWYobC5oYXMobS50eXBlKSluJiZsLmRlbGV0ZShtLnR5cGUpO2Vsc2UgY29udGludWV9c3dpdGNoKG0udHlwZSl7Y2FzZSJsb2NhbC1jYW5kaWRhdGUiOntmLnB1c2godGhpcy5nZXRJY2VDYW5kaWRhdGVTdGF0cyhtKSk7YnJlYWt9Y2FzZSJyZW1vdGUtY2FuZGlkYXRlIjp7eS5wdXNoKHRoaXMuZ2V0SWNlQ2FuZGlkYXRlU3RhdHMobSkpO2JyZWFrfWNhc2UiY2FuZGlkYXRlLXBhaXIiOntjb25zdHtub21pbmF0ZWQ6Y309bSx7c2VsZWN0ZWQ6dX09bSxiPW0saj17bm9taW5hdGVkOmMhPW51bGw/Yzp1LGN1cnJlbnRSb3VuZFRyaXBUaW1lOmIuY3VycmVudFJvdW5kVHJpcFRpbWUsdG90YWxSb3VuZFRyaXBUaW1lOmIudG90YWxSb3VuZFRyaXBUaW1lLGJ5dGVzUmVjZWl2ZWQ6Yi5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpiLmJ5dGVzU2VudCxhdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU6Yi5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOmIuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlLGxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcDpiLmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcCxsYXN0UGFja2V0U2VudFRpbWVzdGFtcDpiLmxhc3RQYWNrZXRTZW50VGltZXN0YW1wLGxvY2FsQ2FuZGlkYXRlSWQ6Yi5sb2NhbENhbmRpZGF0ZUlkLHJlbW90ZUNhbmRpZGF0ZUlkOmIucmVtb3RlQ2FuZGlkYXRlSWQsYnl0ZXNEaXNjYXJkZWRPblNlbmQ6Yi5ieXRlc0Rpc2NhcmRlZE9uU2VuZCxwYWNrZXRzU2VudDpiLnBhY2tldHNTZW50LHBhY2tldHNSZWNlaXZlZDpiLnBhY2tldHNSZWNlaXZlZCxwYWNrZXRzRGlzY2FyZGVkT25TZW5kOmIucGFja2V0c0Rpc2NhcmRlZE9uU2VuZH07RS5wdXNoKGopLChtLm5vbWluYXRlZD09PSEwfHxtLnNlbGVjdGVkPT09ITApJiYoby5jYW5kaWRhdGVQYWlyPWopO2JyZWFrfWNhc2UidHJhbnNwb3J0Ijp7Y29uc3QgYz1tO2EmJihhLnByb2R1Y2luZyYmKHRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXXx8KHRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXT17dG90YWxQYWNrZXRzU2VudDowfSkpLGEuY29uc3VtaW5nJiYodGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdfHwodGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdPXt0b3RhbFBhY2tldHNSZWNlaXZlZDowfSkpKTtjb25zdCB1PXtieXRlc1JlY2VpdmVkOmMuYnl0ZXNSZWNlaXZlZCxieXRlc1NlbnQ6Yy5ieXRlc1NlbnQscGFja2V0c1NlbnQ6Yy5wYWNrZXRzU2VudCxwYWNrZXRzUmVjZWl2ZWQ6Yy5wYWNrZXRzUmVjZWl2ZWQsZHRsc0NpcGhlcjpjLmR0bHNDaXBoZXIsZHRsc1N0YXRlOmMuZHRsc1N0YXRlLGljZVJvbGU6Yy5pY2VSb2xlfTtpZihvLnRyYW5zcG9ydD11LGEpe2lmKGEucHJvZHVjaW5nKXtjb25zdCBiPXRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXTt0aGlzLnByb2Nlc3NQcm9kdWNpbmdUcmFuc3BvcnRTdGF0cyhhLmlkLGIsdSl9aWYoYS5jb25zdW1pbmcpe2NvbnN0IGI9dGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdO3RoaXMucHJvY2Vzc0NvbnN1bWluZ1RyYW5zcG9ydFN0YXRzKGEuaWQsYix1KX19YnJlYWt9Y2FzZSJyZW1vdGUtaW5ib3VuZC1ydHAiOntjb25zdCBjPW0sdT17aml0dGVyOmMuaml0dGVyLGZyYWN0aW9uTG9zdDpjLmZyYWN0aW9uTG9zdCxyb3VuZFRyaXBUaW1lOmMucm91bmRUcmlwVGltZSxyb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzOmMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cyx0b3RhbFJvdW5kVHJpcFRpbWU6Yy50b3RhbFJvdW5kVHJpcFRpbWUscGFja2V0c0xvc3Q6Yy5wYWNrZXRzTG9zdH07by5yZW1vdGVJbmJvdW5kUnRwLnNldChjLmxvY2FsSWQsdSk7YnJlYWt9Y2FzZSJvdXRib3VuZC1ydHAiOntpZighdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmhhcyhtLmlkKSlicmVhaztjb25zdCBjPW0sdT1pfHx0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZ2V0KG0uaWQpLGI9dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5nZXQodSk7aWYoYil7aWYoYi5sYXN0UmVwb3J0Q2FsY3VsYXRlZD09PSEwKWJyZWFrO3RoaXMucGF1c2VkUHJvZHVjZXJNYXAuc2V0KHUse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiEwfSl9dGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbdV18fCh0aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFt1XT17dG90YWxWaWRlb1BhY2tldHNTZW50OjAsdG90YWxBdWRpb1BhY2tldHNTZW50OjB9KTtjb25zdCBqPXRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW3VdO2lmKFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMubWVkaWFUeXBlKXx8WyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5raW5kKSl7aWYoIXRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5oYXMobS5pZCkpe28uc3RhbGVQcm9kdWNlclN0cmVhbU1hcD0hMDticmVha31jb25zdCBLPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UucHJvZHVjZXJzLmdldCh1KTtpZigoKFU9Sz09bnVsbD92b2lkIDA6Sy50cmFjayk9PW51bGw/dm9pZCAwOlUucmVhZHlTdGF0ZSk9PT0iZW5kZWQiKWJyZWFrO28ucHJvZHVjZXJTdHJlYW1NYXAuaGFzKHUpfHxvLnByb2R1Y2VyU3RyZWFtTWFwLnNldCh1LHtvdXRib3VuZFZpZGVvUnRwSWQ6W10sb3V0Ym91bmRBdWRpb1J0cElkOltdfSk7Y29uc3Qgdj17Ynl0ZXNTZW50OmMuYnl0ZXNTZW50LHBhY2tldHNTZW50OmMucGFja2V0c1NlbnQsbmFja0NvdW50OmMubmFja0NvdW50LHNzcmM6Yy5zc3JjLG1pZDpjLm1pZCxhY3RpdmU6Yy5hY3RpdmUsY29kZWNJZDpjLmNvZGVjSWQsaGVhZGVyQnl0ZXNTZW50OmMuaGVhZGVyQnl0ZXNTZW50fHwwLHRvdGFsUGFja2V0U2VuZERlbGF5OmMudG90YWxQYWNrZXRTZW5kRGVsYXl8fDB9O2lmKGMubWVkaWFUeXBlPT09InZpZGVvInx8Yy5raW5kPT09InZpZGVvIil7Y29uc3QgaD1jLFc9USh7ZnJhbWVIZWlnaHQ6aC5mcmFtZUhlaWdodCxmcmFtZVdpZHRoOmguZnJhbWVXaWR0aCxmcmFtZXNFbmNvZGVkOmguZnJhbWVzRW5jb2RlZCxmcmFtZXNEcm9wcGVkOmguZnJhbWVzRHJvcHBlZCxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmQsZnJhbWVzU2VudDpoLmZyYW1lc1NlbnQsa2V5RnJhbWVzRW5jb2RlZDpoLmtleUZyYW1lc0VuY29kZWQsZmlyQ291bnQ6aC5maXJDb3VudCxlbmNvZGVySW1wbGVtZW50YXRpb246aC5lbmNvZGVySW1wbGVtZW50YXRpb24saHVnZUZyYW1lc1NlbnQ6aC5odWdlRnJhbWVzU2VudCxwbGlDb3VudDpoLnBsaUNvdW50LHFwU3VtOmgucXBTdW0scXVhbGl0eUxpbWl0YXRpb25EdXJhdGlvbnM6aC5xdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9ucyxxdWFsaXR5TGltaXRhdGlvblJlYXNvbjpoLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uLHF1YWxpdHlMaW1pdGF0aW9uUmVzb2x1dGlvbkNoYW5nZXM6aC5xdWFsaXR5TGltaXRhdGlvblJlc29sdXRpb25DaGFuZ2VzLHRvdGFsRW5jb2RlVGltZTpoLnRhcmdldEJpdHJhdGUsdG90YWxQYWNrZXRTZW5kRGVsYXk6aC50b3RhbFBhY2tldFNlbmREZWxheSxyZXRyYW5zbWl0dGVkQnl0ZXNTZW50OmgucmV0cmFuc21pdHRlZEJ5dGVzU2VudCxyZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQ6aC5yZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQsc2NhbGFiaWxpdHlNb2RlOmguc2NhbGFiaWxpdHlNb2RlLHBvd2VyRWZmaWNpZW50RW5jb2RlcjpoLnBvd2VyRWZmaWNpZW50RW5jb2Rlcn0sdik7by5vdXRib3VuZFZpZGVvUnRwLnNldChtLmlkLFcpLG8ucHJvZHVjZXJTdHJlYW1NYXAuZ2V0KHUpLm91dGJvdW5kVmlkZW9SdHBJZC5wdXNoKG0uaWQpLHRoaXMucHJvY2Vzc091dGJvdW5kUHJvZHVjZXJWaWRlb1N0YXRzKHUsaixXKX1lbHNlIGlmKGMubWVkaWFUeXBlPT09ImF1ZGlvInx8Yy5raW5kPT09ImF1ZGlvIil7Y29uc3QgaD1jLFc9USh7cmV0cmFuc21pdHRlZEJ5dGVzU2VudDpoLnJldHJhbnNtaXR0ZWRCeXRlc1NlbnQscmV0cmFuc21pdHRlZFBhY2tldHNTZW50OmgucmV0cmFuc21pdHRlZFBhY2tldHNTZW50fSx2KTtvLm91dGJvdW5kQXVkaW9SdHAuc2V0KG0uaWQsVyksby5wcm9kdWNlclN0cmVhbU1hcC5nZXQodSkub3V0Ym91bmRBdWRpb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzT3V0Ym91bmRQcm9kdWNlckF1ZGlvU3RhdHModSxqLFcpfX1lbHNlIHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmVycm9yKGBDYWxsc3RhdHM6IFVua25vd24gT3V0Ym91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfWNhc2UiaW5ib3VuZC1ydHAiOntpZighdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuaGFzKG0uaWQpKWJyZWFrO2NvbnN0IGM9bSx1PWl8fHRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmdldChtLmlkKSxiPXRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZ2V0KHUpO2lmKGIpe2lmKGIubGFzdFJlcG9ydENhbGN1bGF0ZWQ9PT0hMClicmVhazt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLnNldCh1LHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMH0pfWlmKGMuc3NyYz09PTEyMzQpYnJlYWs7dGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbdV18fCh0aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFt1XT17dG90YWxWaWRlb1BhY2tldHNSZWNlaXZlZDowLHRvdGFsQXVkaW9QYWNrZXRzUmVjZWl2ZWQ6MH0pO2NvbnN0IGo9dGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbdV07aWYoWyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5tZWRpYVR5cGUpfHxbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLmtpbmQpKXtpZighdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuaGFzKG0uaWQpKXtvLnN0YWxlQ29uc3VtZXJTdHJlYW1NYXA9ITA7YnJlYWt9by5jb25zdW1lclN0cmVhbU1hcC5oYXModSl8fG8uY29uc3VtZXJTdHJlYW1NYXAuc2V0KHUse2luYm91bmRWaWRlb1J0cElkOltdLGluYm91bmRBdWRpb1J0cElkOltdfSk7Y29uc3QgSz17Ynl0ZXNSZWNlaXZlZDpjLmJ5dGVzUmVjZWl2ZWQscGFja2V0c1JlY2VpdmVkOmMucGFja2V0c1JlY2VpdmVkLHBhY2tldHNMb3N0OmMucGFja2V0c0xvc3Q+PTA/Yy5wYWNrZXRzTG9zdDowLGppdHRlcjpjLmppdHRlcixuYWNrQ291bnQ6Yy5uYWNrQ291bnQsaml0dGVyQnVmZmVyRGVsYXk6Yy5qaXR0ZXJCdWZmZXJEZWxheSxqaXR0ZXJCdWZmZXJFbWl0dGVkQ291bnQ6Yy5qaXR0ZXJCdWZmZXJFbWl0dGVkQ291bnQsbGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wOmMubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLHNzcmM6Yy5zc3JjLG1pZDpjLm1pZCxjb2RlY0lkOmMuY29kZWNJZCxoZWFkZXJCeXRlc1JlY2VpdmVkOmMuaGVhZGVyQnl0ZXNSZWNlaXZlZHx8MCxwYWNrZXRzRGlzY2FyZGVkOmMucGFja2V0c0Rpc2NhcmRlZHx8MCxqaXR0ZXJCdWZmZXJNaW5pbXVtRGVsYXk6Yy5qaXR0ZXJCdWZmZXJNaW5pbXVtRGVsYXl8fDAsaml0dGVyQnVmZmVyVGFyZ2V0RGVsYXk6Yy5qaXR0ZXJCdWZmZXJUYXJnZXREZWxheXx8MH07aWYoYy5tZWRpYVR5cGU9PT0idmlkZW8ifHxjLmtpbmQ9PT0idmlkZW8iKXtjb25zdCB2PWMsaD1RKHtmcmFtZUhlaWdodDp2LmZyYW1lSGVpZ2h0LGZyYW1lV2lkdGg6di5mcmFtZVdpZHRoLGZyYW1lc0RlY29kZWQ6di5mcmFtZXNEZWNvZGVkLGZyYW1lc0Ryb3BwZWQ6di5mcmFtZXNEcm9wcGVkLGZyYW1lc1BlclNlY29uZDp2LmZyYW1lc1BlclNlY29uZCxmcmFtZXNSZWNlaXZlZDp2LmZyYW1lc1JlY2VpdmVkLGtleUZyYW1lc0RlY29kZWQ6di5rZXlGcmFtZXNEZWNvZGVkLGZpckNvdW50OnYuZmlyQ291bnQsZGVjb2RlckltcGxlbWVudGF0aW9uOnYuZGVjb2RlckltcGxlbWVudGF0aW9uLHBsaUNvdW50OnYucGxpQ291bnQsdG90YWxQcm9jZXNzaW5nRGVsYXk6di50b3RhbFByb2Nlc3NpbmdEZWxheSxxcFN1bTp2LnFwU3VtfHwwLHRvdGFsQXNzZW1ibHlUaW1lOnYudG90YWxBc3NlbWJseVRpbWV8fDAsdG90YWxEZWNvZGVUaW1lOnYudG90YWxEZWNvZGVUaW1lfHwwLHRvdGFsRnJlZXplc0R1cmF0aW9uOnYudG90YWxGcmVlemVzRHVyYXRpb258fDAsdG90YWxJbnRlckZyYW1lRGVsYXk6di50b3RhbEludGVyRnJhbWVEZWxheXx8MCx0b3RhbFBhdXNlc0R1cmF0aW9uOnYudG90YWxQYXVzZXNEdXJhdGlvbnx8MCx0b3RhbFNxdWFyZWRJbnRlckZyYW1lRGVsYXk6di50b3RhbFNxdWFyZWRJbnRlckZyYW1lRGVsYXl8fDAsZnJlZXplQ291bnQ6di5mcmVlemVDb3VudHx8MCxwYXVzZUNvdW50OnYucGF1c2VDb3VudHx8MCxwb3dlckVmZmljaWVudERlY29kZXI6di5wb3dlckVmZmljaWVudERlY29kZXJ9LEspO2guc2NvcmU9Q3Ioe2ZyYW1lV2lkdGg6aC5mcmFtZVdpZHRofHwwLGZyYW1lc0RlY29kZWQ6KGguZnJhbWVzRGVjb2RlZHx8MCktKCgoTD10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkwuZnJhbWVzRGVjb2RlZCl8fDApLGZyYW1lc1BlclNlY29uZDpoLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdDooaC5wYWNrZXRzTG9zdHx8MCktKCgoSD10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkgucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChaPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6Wi5wYWNrZXRzUmVjZWl2ZWQpfHwwKSxqaXR0ZXI6aC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyh1KX0pLHguc2V0KHUse3Njb3JlOisoaC5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6aC5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0OmguZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kfHwwLHBhY2tldHNMb3N0UGVyY2VudGFnZTp1dCh7cGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKHllPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6eWUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKCh2ZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnZlLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSksYml0cmF0ZTooKGguYnl0ZXNSZWNlaXZlZHx8MCktKCgoQmU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpCZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KHUsaCksby5pbmJvdW5kVmlkZW9SdHAuc2V0KG0uaWQsaCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQodSkuaW5ib3VuZFZpZGVvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJWaWRlb1N0YXRzKHUsaixoKX1lbHNlIGlmKGMubWVkaWFUeXBlPT09ImF1ZGlvInx8Yy5raW5kPT09ImF1ZGlvIil7Y29uc3Qgdj1jLGg9USh7YXVkaW9MZXZlbDp2LmF1ZGlvTGV2ZWwsY29uY2VhbGVkU2FtcGxlczp2LmNvbmNlYWxlZFNhbXBsZXMsY29uY2VhbG1lbnRFdmVudHM6di5jb25jZWFsbWVudEV2ZW50cyx0b3RhbEF1ZGlvRW5lcmd5OnYudG90YWxBdWRpb0VuZXJneSx0b3RhbFNhbXBsZXNEdXJhdGlvbjp2LnRvdGFsU2FtcGxlc0R1cmF0aW9uLHRvdGFsU2FtcGxlc1JlY2VpdmVkOnYudG90YWxTYW1wbGVzUmVjZWl2ZWQsZmVjUGFja2V0c0Rpc2NhcmRlZDp2LmZlY1BhY2tldHNEaXNjYXJkZWR8fDAsZmVjUGFja2V0c1JlY2VpdmVkOnYuZmVjUGFja2V0c1JlY2VpdmVkfHwwLGluc2VydGVkU2FtcGxlc0ZvckRlY2VsZXJhdGlvbjp2Lmluc2VydGVkU2FtcGxlc0ZvckRlY2VsZXJhdGlvbnx8MCxyZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbjp2LnJlbW92ZWRTYW1wbGVzRm9yQWNjZWxlcmF0aW9ufHwwLHNpbGVudENvbmNlYWxlZFNhbXBsZXM6di5zaWxlbnRDb25jZWFsZWRTYW1wbGVzfHwwLHBsYXlvdXRJZDp2LnBsYXlvdXRJZH0sSyk7aC5zY29yZT1Qcih7Y29uY2VhbG1lbnRFdmVudHM6KGguY29uY2VhbG1lbnRFdmVudHN8fDApLSgoKHhlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6eGUuY29uY2VhbG1lbnRFdmVudHMpfHwwKSxwYWNrZXRzTG9zdDooaC5wYWNrZXRzTG9zdHx8MCktKCgoamU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpqZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKFVlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6VWUucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOmguaml0dGVyfHwwfSkseC5zZXQodSx7c2NvcmU6KyhoLnNjb3JlKjEwKS50b0ZpeGVkKCkscGFja2V0c0xvc3RQZXJjZW50YWdlOnV0KHtwYWNrZXRzTG9zdDooaC5wYWNrZXRzTG9zdHx8MCktKCgoJGU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDokZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKEhlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6SGUucGFja2V0c1JlY2VpdmVkKXx8MCl9KSxqaXR0ZXI6aC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyh1KSxiaXRyYXRlOigoaC5ieXRlc1JlY2VpdmVkfHwwKS0oKChLZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOktlLmJ5dGVzUmVjZWl2ZWQpfHwwKSkqOC83fSksdGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5zZXQodSxoKSxvLmluYm91bmRBdWRpb1J0cC5zZXQobS5pZCxoKSxvLmNvbnN1bWVyU3RyZWFtTWFwLmdldCh1KS5pbmJvdW5kQXVkaW9SdHBJZC5wdXNoKG0uaWQpLHRoaXMucHJvY2Vzc0luYm91bmRDb25zdW1lckF1ZGlvU3RhdHModSxqLGgpfX1lbHNlIHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmVycm9yKGBDYWxsc3RhdHM6IFVua25vd24gSW5ib3VuZC1ydHAuIG1lZGlhdHlwZTogJHtjLm1lZGlhVHlwZX0ga2luZDogJHtjLmtpbmR9YCk7YnJlYWt9fX1pZihvLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKG0sYyk9Pnt2YXIgdSxiLGosSyx2LGgsVyx6ZSxXZSxHZSxxZSxZZSxRZSxKZSxYZSxaZSxldCx0dCxydCxzdCxudCxpdCxhdDtpZihtLm91dGJvdW5kVmlkZW9SdHBJZC5sZW5ndGg+MCl7Y29uc3QgVj1bXTttLm91dGJvdW5kVmlkZW9SdHBJZC5mb3JFYWNoKHJyPT57Vi5wdXNoKG8ub3V0Ym91bmRWaWRlb1J0cC5nZXQocnIpKX0pO2NvbnN0IE09dGhpcy5nZXRXb3JraW5nU2ltdWxjYXN0VmlkZW9TdGF0cyhWKTtNLnNjb3JlPV9yKHtmcmFtZVdpZHRoOk0uZnJhbWVXaWR0aHx8MCxmcmFtZXNQZXJTZWNvbmQ6TS5mcmFtZXNQZXJTZWNvbmR8fDAsaml0dGVyOigodT1NLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDp1LmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKSxwYWNrZXRzU2VudDooTS5wYWNrZXRzU2VudHx8MCktKCgoYj10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOmIucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChqPU0ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOmoucGFja2V0c0xvc3QpfHwwKS0oKCh2PShLPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6Sy5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6di5wYWNrZXRzTG9zdCl8fDApLGZyYW1lc0VuY29kZWQ6KE0uZnJhbWVzRW5jb2RlZHx8MCktKCgoaD10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOmguZnJhbWVzRW5jb2RlZCl8fDApfSksdy5zZXQoYyx7c2NvcmU6KyhNLnNjb3JlKjEwKS50b0ZpeGVkKCksZnJhbWVXaWR0aDpNLmZyYW1lV2lkdGh8fDAsZnJhbWVIZWlnaHQ6TS5mcmFtZUhlaWdodHx8MCxmcmFtZXNQZXJTZWNvbmQ6TS5mcmFtZXNQZXJTZWNvbmR8fDAsaml0dGVyOigoVz1NLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpXLmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKSxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6bHQoe3BhY2tldHNTZW50OihNLnBhY2tldHNTZW50fHwwKS0oKCh6ZT10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnplLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoV2U9TS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6V2UucGFja2V0c0xvc3QpfHwwKS0oKChxZT0oR2U9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpHZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6cWUucGFja2V0c0xvc3QpfHwwKX0pLGJpdHJhdGU6KChNLmJ5dGVzU2VudHx8MCktKCgoWWU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpZZS5ieXRlc1NlbnQpfHwwKSkqOC83LGNwdUxpbWl0YXRpb25zOk0ucXVhbGl0eUxpbWl0YXRpb25SZWFzb249PT0iY3B1IixiYW5kd2lkdGhMaW1pdGF0aW9uczpNLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImJhbmR3aWR0aCJ9KSx0aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLE0pfWVsc2UgaWYobS5vdXRib3VuZEF1ZGlvUnRwSWQubGVuZ3RoPjApe2NvbnN0IFY9by5vdXRib3VuZEF1ZGlvUnRwLmdldChtLm91dGJvdW5kQXVkaW9SdHBJZFswXSk7Vi5zY29yZT1Ucih7cGFja2V0c1NlbnQ6KFYucGFja2V0c1NlbnR8fDApLSgoKFFlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6UWUucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChKZT1WLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpKZS5wYWNrZXRzTG9zdCl8fDApLSgoKFplPShYZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlhlLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpaZS5wYWNrZXRzTG9zdCl8fDApLGppdHRlcjooKGV0PVYucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOmV0LmppdHRlcil8fDB9KSx3LnNldChjLHtzY29yZTorKFYuc2NvcmUqMTApLnRvRml4ZWQoKSxiaXRyYXRlOigoVi5ieXRlc1NlbnR8fDApLSgoKHR0PXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6dHQuYnl0ZXNTZW50KXx8MCkpKjgvNyxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6bHQoe3BhY2tldHNTZW50OihWLnBhY2tldHNTZW50fHwwKS0oKChydD10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnJ0LnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoc3Q9Vi5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6c3QucGFja2V0c0xvc3QpfHwwKS0oKChpdD0obnQ9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpudC5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6aXQucGFja2V0c0xvc3QpfHwwKX0pLGppdHRlcjooKGF0PVYucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOmF0LmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKX0pLHRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuc2V0KGMsVil9fSksRS5mb3JFYWNoKG09Pntjb25zdCBjPWYuZmluZChiPT5iLmlkPT09bS5sb2NhbENhbmRpZGF0ZUlkPyhtLmxvY2FsQ2FuZGlkYXRlSWQ9Yi5pZCxiKTpudWxsKSx1PXkuZmluZChiPT5iLmlkPT09bS5yZW1vdGVDYW5kaWRhdGVJZD8obS5yZW1vdGVDYW5kaWRhdGVJZD1iLmlkLGIpOm51bGwpO2MmJihtLmxvY2FsQ2FuZGlkYXRlVHlwZT1jLnR5cGUsbS5sb2NhbENhbmRpZGF0ZUFkZHJlc3M9YWUoYy5hZGRyZXNzKSxtLmxvY2FsQ2FuZGlkYXRlUG9ydD1jLnBvcnQsbS5sb2NhbENhbmRpZGF0ZVByb3RvY29sPWMucHJvdG9jb2wsbS5sb2NhbENhbmRpZGF0ZVVybD1jLnVybCxtLmxvY2FsQ2FuZGlkYXRlTmV0d29ya1R5cGU9Yy5uZXR3b3JrVHlwZSxtLmxvY2FsQ2FuZGlkYXRlUmVsYXRlZEFkZHJlc3M9YWUoYy5yZWxhdGVkQWRkcmVzcyksbS5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRQb3J0PWMucmVsYXRlZFBvcnQpLHUmJihtLnJlbW90ZUNhbmRpZGF0ZVR5cGU9dS50eXBlLG0ucmVtb3RlQ2FuZGlkYXRlQWRkcmVzcz1hZSh1LmFkZHJlc3MpLG0ucmVtb3RlQ2FuZGlkYXRlUG9ydD11LnBvcnQsbS5yZW1vdGVDYW5kaWRhdGVQcm90b2NvbD11LnByb3RvY29sLG0ucmVtb3RlQ2FuZGlkYXRlVXJsPXUudXJsKX0pLG8uY2FuZGlkYXRlUGFpciYmKG8udHJhbnNwb3J0PyhvLnRyYW5zcG9ydC50b3RhbFJvdW5kVHJpcFRpbWU9by5jYW5kaWRhdGVQYWlyLnRvdGFsUm91bmRUcmlwVGltZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSk6by50cmFuc3BvcnQ9e2J5dGVzUmVjZWl2ZWQ6by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50Om8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsdG90YWxSb3VuZFRyaXBUaW1lOm8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUscm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWV9KSxvLnRyYW5zcG9ydCYmKG8udHJhbnNwb3J0LmNhbmRpZGF0ZVBhaXJzPUUpLG8udHJhbnNwb3J0JiYhby50cmFuc3BvcnQucm91bmRUcmlwVGltZSl7bGV0IG09MCxjPTA7by5yZW1vdGVJbmJvdW5kUnRwLmZvckVhY2goKHUsYik9Pnt1LnJvdW5kVHJpcFRpbWUmJnUucm91bmRUcmlwVGltZT5tJiYobT11LnJvdW5kVHJpcFRpbWUsYz11LnRvdGFsUm91bmRUcmlwVGltZSl9KSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW0sby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPWN9aWYoeC5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLHgpfWNhdGNoKG0pe31pZih3LnNpemU+MCl0cnl7dGhpcy5vYnNlcnZlci5lbWl0KCJwcm9kdWNlcl9zY29yZSIsdyl9Y2F0Y2gobSl7fXJldHVybiBvfWdldFByb2R1Y2Vyc1JlcG9ydChlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1lLm1hcChuPT50aGlzLmdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAobiwhMCkpO3JldHVybiBzLmxlbmd0aD4wP1Byb21pc2UuYWxsKHMpOnZvaWQgMH0pfWdldENvbnN1bWVyc1JlcG9ydChlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1lLm1hcChuPT50aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAobiwhMCkpO3JldHVybiBzLmxlbmd0aD4wP1Byb21pc2UuYWxsKHMpOnZvaWQgMH0pfWdldFRyYW5zcG9ydFJlcG9ydChlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIGUuZ2V0U3RhdHMoKX0pfWdldFByb2Nlc3NlZFN0YXRzKGUscyxuKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgaT15aWVsZCB0aGlzLmdldFRyYW5zcG9ydFJlcG9ydChlKSxhPXtwcm9kdWNpbmc6bixjb25zdW1pbmc6cyxpZDplLmlkfSxkPWksbz10aGlzLnBhcnNlUlRDUmVwb3J0KGQsWyJ0cmFuc3BvcnQiLCJjYW5kaWRhdGUtcGFpciIsImluYm91bmQtcnRwIiwib3V0Ym91bmQtcnRwIiwicmVtb3RlLWluYm91bmQtcnRwIiwibG9jYWwtY2FuZGlkYXRlIiwicmVtb3RlLWNhbmRpZGF0ZSJdLCExLHZvaWQgMCxhKTtpZighbylyZXR1cm47Y29uc3QgbD17c3RhdHM6by50cmFuc3BvcnQsdHJhbnNwb3J0SWQ6ZS5pZCxjb25zdW1pbmc6cyxwcm9kdWNpbmc6bn0sZj1vLnN0YWxlUHJvZHVjZXJTdHJlYW1NYXA/dm9pZCAwOnRoaXMuZ2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQobykseT1vLnN0YWxlQ29uc3VtZXJTdHJlYW1NYXA/dm9pZCAwOnRoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQobyk7cmV0dXJue3RyYW5zcG9ydFJlcG9ydDpsLHByb2R1Y2VyUmVwb3J0OmYsY29uc3VtZXJSZXBvcnQ6eX19KX1nZXRQcm9kdWNlclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBzPVtdO3RyeXtlLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKG4saSk9Pnt2YXIgYSxkO3MucHVzaCh7cHJvZHVjZXJJZDppLHZpZGVvU3RhdHM6bi5vdXRib3VuZFZpZGVvUnRwSWQubWFwKG89PmUub3V0Ym91bmRWaWRlb1J0cC5nZXQobykpLGF1ZGlvU3RhdHM6bi5vdXRib3VuZEF1ZGlvUnRwSWQubWFwKG89PmUub3V0Ym91bmRBdWRpb1J0cC5nZXQobykpLGFwcERhdGE6KChkPShhPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UucHJvZHVjZXJzKT09bnVsbD92b2lkIDA6YS5nZXQoaSkpPT1udWxsP3ZvaWQgMDpkLmFwcERhdGEpfHxudWxsfSl9KX1jYXRjaChuKXt0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0Iix7ZXJyb3I6e3JlYXNvbjpuLnJlYXNvbixtZXNzYWdlOm4ubWVzc2FnZX19KX1yZXR1cm4gc31nZXRDb25zdW1lclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBzPVtdO3RyeXtlLmNvbnN1bWVyU3RyZWFtTWFwLmZvckVhY2goKG4saSk9Pntjb25zdHtwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvfT10aGlzLmNvbnN1bWVyUGVlcklkTWFwLmdldChpKTtzLnB1c2goe2NvbnN1bWVySWQ6aSxwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvLHZpZGVvU3RhdHM6bi5pbmJvdW5kVmlkZW9SdHBJZC5tYXAobD0+ZS5pbmJvdW5kVmlkZW9SdHAuZ2V0KGwpKSxhdWRpb1N0YXRzOm4uaW5ib3VuZEF1ZGlvUnRwSWQubWFwKGw9PmUuaW5ib3VuZEF1ZGlvUnRwLmdldChsKSl9KX0pfWNhdGNoKG4pe2NvbnNvbGUuZXJyb3IoImdldENvbnN1bWVyc1JlcG9ydDogIixuLGUpfXJldHVybiBzfWdldFVzZXJMb2NhdGlvbigpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtyZXR1cm4gbmV3IFByb21pc2UoKGUscyk9Pnt0cnl7bmF2aWdhdG9yLmdlb2xvY2F0aW9uP25hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24obj0+e2Uobil9KTpzKCl9Y2F0Y2gobil7cyhuKX19KX0pfWdldENvbm5lY3Rpdml0eShlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e2NvbnN0IHM9e2ljZVNlcnZlcnM6ZXx8TXJ9LG49bmV3IFByb21pc2UoKGYseSk9Pnt0cnl7Y29uc3QgRT1uZXcgVG4ocyk7RS5hZGRMaXN0ZW5lcigiZG9uZSIsZiksRS5hZGRMaXN0ZW5lcigiZmFpbGVkIiwoKT0+e2Yoe2Nvbm5lY3Rpdml0eTohMX0pfSksRS5zdGFydCgyZTMpfWNhdGNoKEUpe3koRSl9fSksaT1uZXcgUHJvbWlzZSgoZix5KT0+e3RyeXtjb25zdCBFPW5ldyBfbihzKTtFLmFkZExpc3RlbmVyKCJkb25lIixmKSxFLmFkZExpc3RlbmVyKCJmYWlsZWQiLCgpPT57Zih7Y29ubmVjdGl2aXR5OiExfSl9KSxFLnN0YXJ0KDJlMyl9Y2F0Y2goRSl7eShFKX19KSxhPW5ldyBQcm9taXNlKChmLHkpPT57dHJ5e2NvbnN0IEU9bmV3IFJuKHMpO0UuYWRkTGlzdGVuZXIoImRvbmUiLGYpLEUuYWRkTGlzdGVuZXIoImZhaWxlZCIsKCk9PntmKHtjb25uZWN0aXZpdHk6ITF9KX0pLEUuc3RhcnQoMmUzKX1jYXRjaChFKXt5KEUpfX0pLFtkLG8sbF09eWllbGQgUHJvbWlzZS5hbGwoW24saSxhXSk7cmV0dXJue2hvc3Q6ZD09bnVsbD92b2lkIDA6ZC5jb25uZWN0aXZpdHkscmVsYXk6bz09bnVsbD92b2lkIDA6by5jb25uZWN0aXZpdHkscmVmbGV4aXZlOmw9PW51bGw/dm9pZCAwOmwuY29ubmVjdGl2aXR5fX1jYXRjaChzKXtyZXR1cm57aG9zdDohMSxyZWxheTohMSxyZWZsZXhpdmU6ITF9fX0pfWdldFRocm91Z2hwdXQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RyeXtjb25zdCBuPXlpZWxkIG5ldyBQcm9taXNlKChpLGEpPT57dHJ5e2NvbnN0IGQ9e2ljZVNlcnZlcnM6ZXx8TXJ9LG89bmV3IEVuKGQpO28uYWRkTGlzdGVuZXIoImRvbmUiLGkpLG8uYWRkTGlzdGVuZXIoImZhaWxlZCIsYSksby5zdGFydCgxZTQpfWNhdGNoKGQpe2EoZCl9fSk7cmV0dXJue3Rocm91Z2hwdXQ6bi50aHJvdWdocHV0LGZyYWN0aW9uYWxMb3NzOjAsUlRUOm4uUlRULGppdHRlcjowLGJhY2tlbmRSVFQ6bi5iYWNrZW5kUlRUfX1jYXRjaChzKXtyZXR1cm59fSl9Z2V0SVBEZXRhaWxzKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBlLHM7dHJ5e3JldHVybiB0aGlzLmlwRGV0YWlsc3x8KHRoaXMuaXBEZXRhaWxzPXlpZWxkIHdyLmdldElQRGV0YWlscyh7cGVlcklkOihlPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDplLnBlZXJJZCxhcGlIb3N0bmFtZXM6KHM9dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOnMuYXBpSG9zdG5hbWVzLGxvZ2dlcjp0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlcn0pKSx0aGlzLmlwRGV0YWlsc31jYXRjaChuKXtyZXR1cm59fSl9Z2V0TmV0d29ya1F1YWxpdHkoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0W3Msbl09eWllbGQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0Q29ubmVjdGl2aXR5KGUpLHRoaXMuZ2V0VGhyb3VnaHB1dChlKV0pO3JldHVybntjb25uZWN0aXZpdHk6cyx0aHJvdWdocHV0Om49PW51bGw/dm9pZCAwOm4udGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczpuPT1udWxsP3ZvaWQgMDpuLmZyYWN0aW9uYWxMb3NzLFJUVDpuPT1udWxsP3ZvaWQgMDpuLlJUVCxqaXR0ZXI6bj09bnVsbD92b2lkIDA6bi5qaXR0ZXIsYmFja2VuZFJUVDpuPT1udWxsP3ZvaWQgMDpuLmJhY2tlbmRSVFR9fSl9Z2V0TmV0d29ya0luZm8oZSxzPSExKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGQsbztpZihzKXtjb25zdCBsPXlpZWxkIHRoaXMuZ2V0SVBEZXRhaWxzKCk7cmV0dXJue2lwRGV0YWlsczpsLGVmZmVjdGl2ZU5ldHdvcmtUeXBlOihkPW5hdmlnYXRvci5jb25uZWN0aW9uKT09bnVsbD92b2lkIDA6ZC5lZmZlY3RpdmVUeXBlLGxvY2F0aW9uOmwhPW51bGwmJmwubG9jP0FyKGw9PW51bGw/dm9pZCAwOmwubG9jKTp2b2lkIDB9fWNvbnN0W24saSxhXT15aWVsZCBQcm9taXNlLmFsbChbdGhpcy5nZXRDb25uZWN0aXZpdHkoZSksdGhpcy5nZXRUaHJvdWdocHV0KGUpLHRoaXMuZ2V0SVBEZXRhaWxzKCldKTtyZXR1cm57aXBEZXRhaWxzOmEsZWZmZWN0aXZlTmV0d29ya1R5cGU6KG89bmF2aWdhdG9yLmNvbm5lY3Rpb24pPT1udWxsP3ZvaWQgMDpvLmVmZmVjdGl2ZVR5cGUsbG9jYXRpb246YSE9bnVsbCYmYS5sb2M/QXIoYT09bnVsbD92b2lkIDA6YS5sb2MpOnZvaWQgMCx0dXJuQ29ubmVjdGl2aXR5Om4/bi5ob3N0fHxuLnJlbGF5fHxuLnJlZmxleGl2ZTohMSxjb25uZWN0aXZpdHk6bix0aHJvdWdocHV0Omk9PW51bGw/dm9pZCAwOmkudGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczppPT1udWxsP3ZvaWQgMDppLmZyYWN0aW9uYWxMb3NzLFJUVDppPT1udWxsP3ZvaWQgMDppLlJUVCxqaXR0ZXI6aT09bnVsbD92b2lkIDA6aS5qaXR0ZXIsYmFja2VuZFJUVDppPT1udWxsP3ZvaWQgMDppLmJhY2tlbmRSVFR9fSl9fWNsYXNzIENuIGV4dGVuZHMgT3J7fWNsYXNzIExyIGV4dGVuZHMgT3J7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3AodGhpcywicHJvZHVjZXJNYXAiLG5ldyBNYXApO3AodGhpcywiY29uc3VtZXJNYXAiLG5ldyBNYXApfXJlZ2lzdGVyUHJvZHVjZXIoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMucHJvZHVjZXJNYXAuc2V0KGUuaWQsZSkseWllbGQgdGhpcy5nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKGUpLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJQcm9kdWNlci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5hZGQoZS5pZCl9KX1yZWdpc3RlckNvbnN1bWVyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLmNvbnN1bWVyTWFwLnNldChlLmlkLGUpLHlpZWxkIHRoaXMuZ2VuZXJhdGVDb25zdW1lclN0cmVhbU1hcChlKSx0aGlzLmNvbnN1bWVyUGVlcklkTWFwLnNldChlLmlkLHtwcm9kdWNlcklkOmUucHJvZHVjZXJJZCxwZWVySWQ6ZS5hcHBEYXRhLnBlZXJJZCxhcHBEYXRhOmUuYXBwRGF0YX0pLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlQ29uc3VtZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lQ29uc3VtZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5hZGQoZS5pZCl9KX1nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKGUscz0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49eWllbGQgZS5nZXRTdGF0cygpLGk9dGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsiaW5ib3VuZC1ydHAiXSwhMSxlLmlkKSxhPVsuLi5pLmNvbnN1bWVyU3RyZWFtTWFwLnZhbHVlcygpXVswXSxkPXM/dGhpcy5nZXRDb25zdW1lclN0YXRzRnJvbVBhcnNlZENvbnN1bWVyU3RhdHMoaSxhLGUuaWQpOnZvaWQgMDtmb3IoY29uc3QgbyBvZiBuLnZhbHVlcygpKXN3aXRjaChvLnR5cGUpe2Nhc2UiaW5ib3VuZC1ydHAiOnt0aGlzLmluYm91bmRDb25zdW1lck1hcC5zZXQoby5pZCxlLmlkKTticmVha319cmV0dXJuIGR9KX1kZXJlZ2lzdGVyUHJvZHVjZXIoZSl7dGhpcy5wcm9kdWNlck1hcC5kZWxldGUoZS5pZCksdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmZvckVhY2goKHMsbik9PntzPT09ZS5pZCYmdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmRlbGV0ZShuKX0pLHRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuZGVsZXRlKGUuaWQpfWRlcmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVyTWFwLmRlbGV0ZShlLmlkKSx0aGlzLmluYm91bmRDb25zdW1lck1hcC5mb3JFYWNoKChzLG4pPT57cz09PWUuaWQmJnRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmRlbGV0ZShuKX0pLHRoaXMuY29uc3VtZXJQZWVySWRNYXAuZGVsZXRlKGUuaWQpLHRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuZGVsZXRlKGUuaWQpfWdldEljZUNhbmRpZGF0ZVN0YXRzKGUpe3ZhciBzO3JldHVybntpZDplLmlkLHR5cGU6ZS5jYW5kaWRhdGVUeXBlfHxlLnR5cGUsYWRkcmVzczplLmFkZHJlc3MscG9ydDplLnBvcnQsdXJsOmUudXJsLHByb3RvY29sOihzPWUucmVsYXlQcm90b2NvbCkhPW51bGw/czplLnByb3RvY29sLG5ldHdvcmtUeXBlOmUubmV0d29ya1R5cGUscmVsYXRlZEFkZHJlc3M6ZS5yZWxhdGVkQWRkcmVzcyxyZWxhdGVkUG9ydDplLnJlbGF0ZWRQb3J0fX1wYXJzZVJUQ1JlcG9ydChlLHM9W10sbj0hMSxpPXZvaWQgMCxhPXZvaWQgMCl7dmFyIFUsTCxILFoseWUsdmUsQmUseGUsamUsVWUsJGUsSGUsS2U7Y29uc3QgZD1lLG89bmV3IGtyLGw9cy5sZW5ndGg/bmV3IFNldChzKTp2b2lkIDAsZj1bXSx5PVtdLEU9W10sdz1uZXcgTWFwLHg9bmV3IE1hcDtmb3IoY29uc3QgbSBvZiBkLnZhbHVlcygpKXtpZihsKXtpZihsLnNpemU9PT0wKWJyZWFrO2lmKGwuaGFzKG0udHlwZSkpbiYmbC5kZWxldGUobS50eXBlKTtlbHNlIGNvbnRpbnVlfXN3aXRjaChtLnR5cGUpe2Nhc2UibG9jYWwtY2FuZGlkYXRlIjp7Zi5wdXNoKHRoaXMuZ2V0SWNlQ2FuZGlkYXRlU3RhdHMobSkpO2JyZWFrfWNhc2UicmVtb3RlLWNhbmRpZGF0ZSI6e3kucHVzaCh0aGlzLmdldEljZUNhbmRpZGF0ZVN0YXRzKG0pKTticmVha31jYXNlImNhbmRpZGF0ZS1wYWlyIjp7Y29uc3R7bm9taW5hdGVkOmN9PW0se3NlbGVjdGVkOnV9PW0sYj1tLGo9e25vbWluYXRlZDpjIT1udWxsP2M6dSxjdXJyZW50Um91bmRUcmlwVGltZTpiLmN1cnJlbnRSb3VuZFRyaXBUaW1lLHRvdGFsUm91bmRUcmlwVGltZTpiLnRvdGFsUm91bmRUcmlwVGltZSxieXRlc1JlY2VpdmVkOmIuYnl0ZXNSZWNlaXZlZCxieXRlc1NlbnQ6Yi5ieXRlc1NlbnQsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOmIuYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlLGF2YWlsYWJsZUluY29taW5nQml0cmF0ZTpiLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxsYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXA6Yi5sYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXAsbGFzdFBhY2tldFNlbnRUaW1lc3RhbXA6Yi5sYXN0UGFja2V0U2VudFRpbWVzdGFtcCxsb2NhbENhbmRpZGF0ZUlkOmIubG9jYWxDYW5kaWRhdGVJZCxyZW1vdGVDYW5kaWRhdGVJZDpiLnJlbW90ZUNhbmRpZGF0ZUlkLGJ5dGVzRGlzY2FyZGVkT25TZW5kOmIuYnl0ZXNEaXNjYXJkZWRPblNlbmQscGFja2V0c1NlbnQ6Yi5wYWNrZXRzU2VudCxwYWNrZXRzUmVjZWl2ZWQ6Yi5wYWNrZXRzUmVjZWl2ZWQscGFja2V0c0Rpc2NhcmRlZE9uU2VuZDpiLnBhY2tldHNEaXNjYXJkZWRPblNlbmR9O0UucHVzaChqKSwobS5ub21pbmF0ZWQ9PT0hMHx8bS5zZWxlY3RlZD09PSEwKSYmKG8uY2FuZGlkYXRlUGFpcj1qKTticmVha31jYXNlInRyYW5zcG9ydCI6e2NvbnN0IGM9bTthJiYoYS5wcm9kdWNpbmcmJih0aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF18fCh0aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF09e3RvdGFsUGFja2V0c1NlbnQ6MH0pKSxhLmNvbnN1bWluZyYmKHRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXXx8KHRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXT17dG90YWxQYWNrZXRzUmVjZWl2ZWQ6MH0pKSk7Y29uc3QgdT17Ynl0ZXNSZWNlaXZlZDpjLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50OmMuYnl0ZXNTZW50LHBhY2tldHNTZW50OmMucGFja2V0c1NlbnQscGFja2V0c1JlY2VpdmVkOmMucGFja2V0c1JlY2VpdmVkLGR0bHNDaXBoZXI6Yy5kdGxzQ2lwaGVyLGR0bHNTdGF0ZTpjLmR0bHNTdGF0ZSxpY2VSb2xlOmMuaWNlUm9sZX07aWYoby50cmFuc3BvcnQ9dSxhKXtpZihhLnByb2R1Y2luZyl7Y29uc3QgYj10aGlzLm92ZXJhbGxQcm9kdWNpbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF07dGhpcy5wcm9jZXNzUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHMoYS5pZCxiLHUpfWlmKGEuY29uc3VtaW5nKXtjb25zdCBiPXRoaXMub3ZlcmFsbENvbnN1bWluZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXTt0aGlzLnByb2Nlc3NDb25zdW1pbmdUcmFuc3BvcnRTdGF0cyhhLmlkLGIsdSl9fWJyZWFrfWNhc2UicmVtb3RlLWluYm91bmQtcnRwIjp7Y29uc3QgYz1tLHU9e2ppdHRlcjpjLmppdHRlcixmcmFjdGlvbkxvc3Q6Yy5mcmFjdGlvbkxvc3Qscm91bmRUcmlwVGltZTpjLnJvdW5kVHJpcFRpbWUscm91bmRUcmlwVGltZU1lYXN1cmVtZW50czpjLnJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHMsdG90YWxSb3VuZFRyaXBUaW1lOmMudG90YWxSb3VuZFRyaXBUaW1lLHBhY2tldHNMb3N0OmMucGFja2V0c0xvc3R9O28ucmVtb3RlSW5ib3VuZFJ0cC5zZXQoYy5sb2NhbElkLHUpO2JyZWFrfWNhc2Uib3V0Ym91bmQtcnRwIjp7aWYoIXRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5oYXMobS5pZCkpYnJlYWs7Y29uc3QgYz1tLHU9aXx8dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmdldChtLmlkKSxiPXRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZ2V0KHUpO2lmKGIpe2lmKGIubGFzdFJlcG9ydENhbGN1bGF0ZWQ9PT0hMClicmVhazt0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLnNldCh1LHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMH0pfXRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW3VdfHwodGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbdV09e3RvdGFsVmlkZW9QYWNrZXRzU2VudDowLHRvdGFsQXVkaW9QYWNrZXRzU2VudDowfSk7Y29uc3Qgaj10aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFt1XTtpZihbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLm1lZGlhVHlwZSl8fFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMua2luZCkpe2lmKCF0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuaGFzKG0uaWQpKXtvLnN0YWxlUHJvZHVjZXJTdHJlYW1NYXA9ITA7YnJlYWt9Y29uc3QgSz10aGlzLmNhbGxTdGF0c0luc3RhbmNlLnByb2R1Y2Vycy5nZXQodSk7aWYoKChVPUs9PW51bGw/dm9pZCAwOksudHJhY2spPT1udWxsP3ZvaWQgMDpVLnJlYWR5U3RhdGUpPT09ImVuZGVkIilicmVhaztvLnByb2R1Y2VyU3RyZWFtTWFwLmhhcyh1KXx8by5wcm9kdWNlclN0cmVhbU1hcC5zZXQodSx7b3V0Ym91bmRWaWRlb1J0cElkOltdLG91dGJvdW5kQXVkaW9SdHBJZDpbXX0pO2NvbnN0IHY9e2J5dGVzU2VudDpjLmJ5dGVzU2VudCxwYWNrZXRzU2VudDpjLnBhY2tldHNTZW50LG5hY2tDb3VudDpjLm5hY2tDb3VudCxzc3JjOmMuc3NyYyxtaWQ6Yy5taWQsYWN0aXZlOmMuYWN0aXZlLGNvZGVjSWQ6Yy5jb2RlY0lkLGhlYWRlckJ5dGVzU2VudDpjLmhlYWRlckJ5dGVzU2VudHx8MCx0b3RhbFBhY2tldFNlbmREZWxheTpjLnRvdGFsUGFja2V0U2VuZERlbGF5fHwwfTtpZihjLm1lZGlhVHlwZT09PSJ2aWRlbyJ8fGMua2luZD09PSJ2aWRlbyIpe2NvbnN0IGg9YyxXPVEoe2ZyYW1lSGVpZ2h0OmguZnJhbWVIZWlnaHQsZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGgsZnJhbWVzRW5jb2RlZDpoLmZyYW1lc0VuY29kZWQsZnJhbWVzRHJvcHBlZDpoLmZyYW1lc0Ryb3BwZWQ/aC5mcmFtZXNEcm9wcGVkOmguZHJvcHBlZEZyYW1lcyxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmQ/aC5mcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXJhdGVNZWFuLGZyYW1lc1NlbnQ6aC5mcmFtZXNTZW50LGtleUZyYW1lc0VuY29kZWQ6aC5rZXlGcmFtZXNFbmNvZGVkLGZpckNvdW50OmguZmlyQ291bnQsZW5jb2RlckltcGxlbWVudGF0aW9uOmguZW5jb2RlckltcGxlbWVudGF0aW9uLGh1Z2VGcmFtZXNTZW50OmguaHVnZUZyYW1lc1NlbnQscGxpQ291bnQ6aC5wbGlDb3VudCxxcFN1bTpoLnFwU3VtLHF1YWxpdHlMaW1pdGF0aW9uUmVhc29uOmgucXVhbGl0eUxpbWl0YXRpb25SZWFzb24scXVhbGl0eUxpbWl0YXRpb25EdXJhdGlvbnM6aC5xdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9ucyxxdWFsaXR5TGltaXRhdGlvblJlc29sdXRpb25DaGFuZ2VzOmgucXVhbGl0eUxpbWl0YXRpb25SZXNvbHV0aW9uQ2hhbmdlcyx0b3RhbEVuY29kZVRpbWU6aC50b3RhbEVuY29kZVRpbWUsdG90YWxQYWNrZXRTZW5kRGVsYXk6aC50b3RhbEVuY29kZVRpbWUscmV0cmFuc21pdHRlZEJ5dGVzU2VudDpoLnJldHJhbnNtaXR0ZWRCeXRlc1NlbnQscmV0cmFuc21pdHRlZFBhY2tldHNTZW50OmgucmV0cmFuc21pdHRlZFBhY2tldHNTZW50LHNjYWxhYmlsaXR5TW9kZTpoLnNjYWxhYmlsaXR5TW9kZSxwb3dlckVmZmljaWVudEVuY29kZXI6aC5wb3dlckVmZmljaWVudEVuY29kZXJ9LHYpO28ub3V0Ym91bmRWaWRlb1J0cC5zZXQobS5pZCxXKSxvLnByb2R1Y2VyU3RyZWFtTWFwLmdldCh1KS5vdXRib3VuZFZpZGVvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NPdXRib3VuZFByb2R1Y2VyVmlkZW9TdGF0cyh1LGosVyl9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IGg9YyxXPVEoe3JldHJhbnNtaXR0ZWRCeXRlc1NlbnQ6aC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50LHJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudDpoLnJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudH0sdik7by5vdXRib3VuZEF1ZGlvUnRwLnNldChtLmlkLFcpLG8ucHJvZHVjZXJTdHJlYW1NYXAuZ2V0KHUpLm91dGJvdW5kQXVkaW9SdHBJZC5wdXNoKG0uaWQpLHRoaXMucHJvY2Vzc091dGJvdW5kUHJvZHVjZXJBdWRpb1N0YXRzKHUsaixXKX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIE91dGJvdW5kLXJ0cC4gbWVkaWF0eXBlOiAke2MubWVkaWFUeXBlfSBraW5kOiAke2Mua2luZH1gKTticmVha31jYXNlImluYm91bmQtcnRwIjp7aWYoIXRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmhhcyhtLmlkKSlicmVhaztjb25zdCBjPW0sdT1pfHx0aGlzLmluYm91bmRDb25zdW1lck1hcC5nZXQobS5pZCksYj10aGlzLnBhdXNlZENvbnN1bWVyTWFwLmdldCh1KTtpZihiKXtpZihiLmxhc3RSZXBvcnRDYWxjdWxhdGVkPT09ITApYnJlYWs7dGhpcy5wYXVzZWRDb25zdW1lck1hcC5zZXQodSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITB9KX1pZihjLnNzcmM9PT0xMjM0KWJyZWFrO3RoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdfHwodGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbdV09e3RvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ6MCx0b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkOjB9KTtjb25zdCBqPXRoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdO2lmKFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMubWVkaWFUeXBlKXx8WyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5raW5kKSl7aWYoIXRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmhhcyhtLmlkKSl7by5zdGFsZUNvbnN1bWVyU3RyZWFtTWFwPSEwO2JyZWFrfW8uY29uc3VtZXJTdHJlYW1NYXAuaGFzKHUpfHxvLmNvbnN1bWVyU3RyZWFtTWFwLnNldCh1LHtpbmJvdW5kVmlkZW9SdHBJZDpbXSxpbmJvdW5kQXVkaW9SdHBJZDpbXX0pO2NvbnN0IEs9e2J5dGVzUmVjZWl2ZWQ6Yy5ieXRlc1JlY2VpdmVkLHBhY2tldHNSZWNlaXZlZDpjLnBhY2tldHNSZWNlaXZlZCxwYWNrZXRzTG9zdDpjLnBhY2tldHNMb3N0Pj0wP2MucGFja2V0c0xvc3Q6MCxqaXR0ZXI6Yy5qaXR0ZXIsbmFja0NvdW50OmMubmFja0NvdW50LGppdHRlckJ1ZmZlckRlbGF5OmMuaml0dGVyQnVmZmVyRGVsYXksaml0dGVyQnVmZmVyRW1pdHRlZENvdW50OmMuaml0dGVyQnVmZmVyRW1pdHRlZENvdW50LGxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcDpjLmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcCxzc3JjOmMuc3NyYyxtaWQ6Yy5taWQsY29kZWNJZDpjLmNvZGVjSWQsaGVhZGVyQnl0ZXNSZWNlaXZlZDpjLmhlYWRlckJ5dGVzUmVjZWl2ZWR8fDAscGFja2V0c0Rpc2NhcmRlZDpjLnBhY2tldHNEaXNjYXJkZWR8fDAsaml0dGVyQnVmZmVyTWluaW11bURlbGF5OmMuaml0dGVyQnVmZmVyTWluaW11bURlbGF5fHwwLGppdHRlckJ1ZmZlclRhcmdldERlbGF5OmMuaml0dGVyQnVmZmVyVGFyZ2V0RGVsYXl8fDB9O2lmKGMubWVkaWFUeXBlPT09InZpZGVvInx8Yy5raW5kPT09InZpZGVvIil7Y29uc3Qgdj1jLGg9USh7ZnJhbWVIZWlnaHQ6di5mcmFtZUhlaWdodCxmcmFtZVdpZHRoOnYuZnJhbWVXaWR0aCxmcmFtZXNEZWNvZGVkOnYuZnJhbWVzRGVjb2RlZCxmcmFtZXNEcm9wcGVkOnYuZnJhbWVzRHJvcHBlZD92LmZyYW1lc0Ryb3BwZWQ6di5kcm9wcGVkRnJhbWVzLGZyYW1lc1BlclNlY29uZDp2LmZyYW1lc1BlclNlY29uZD92LmZyYW1lc1BlclNlY29uZDp2LmZyYW1lcmF0ZU1lYW4sZnJhbWVzUmVjZWl2ZWQ6di5mcmFtZXNSZWNlaXZlZCxrZXlGcmFtZXNEZWNvZGVkOnYua2V5RnJhbWVzRGVjb2RlZCxmaXJDb3VudDp2LmZpckNvdW50LGRlY29kZXJJbXBsZW1lbnRhdGlvbjp2LmRlY29kZXJJbXBsZW1lbnRhdGlvbixwbGlDb3VudDp2LnBsaUNvdW50LHRvdGFsUHJvY2Vzc2luZ0RlbGF5OnYudG90YWxQcm9jZXNzaW5nRGVsYXkscXBTdW06di5xcFN1bXx8MCx0b3RhbEFzc2VtYmx5VGltZTp2LnRvdGFsQXNzZW1ibHlUaW1lfHwwLHRvdGFsRGVjb2RlVGltZTp2LnRvdGFsRGVjb2RlVGltZXx8MCx0b3RhbEZyZWV6ZXNEdXJhdGlvbjp2LnRvdGFsRnJlZXplc0R1cmF0aW9ufHwwLHRvdGFsSW50ZXJGcmFtZURlbGF5OnYudG90YWxJbnRlckZyYW1lRGVsYXl8fDAsdG90YWxQYXVzZXNEdXJhdGlvbjp2LnRvdGFsUGF1c2VzRHVyYXRpb258fDAsdG90YWxTcXVhcmVkSW50ZXJGcmFtZURlbGF5OnYudG90YWxTcXVhcmVkSW50ZXJGcmFtZURlbGF5fHwwLGZyZWV6ZUNvdW50OnYuZnJlZXplQ291bnR8fDAscGF1c2VDb3VudDp2LnBhdXNlQ291bnR8fDAscG93ZXJFZmZpY2llbnREZWNvZGVyOnYucG93ZXJFZmZpY2llbnREZWNvZGVyfSxLKTtoLnNjb3JlPUNyKHtmcmFtZVdpZHRoOmguZnJhbWVXaWR0aHx8MCxmcmFtZXNEZWNvZGVkOihoLmZyYW1lc0RlY29kZWR8fDApLSgoKEw9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpMLmZyYW1lc0RlY29kZWQpfHwwKSxmcmFtZXNQZXJTZWNvbmQ6aC5mcmFtZXNQZXJTZWNvbmR8fDAscGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKEg9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpILnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoWj10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOloucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSl9KSx4LnNldCh1LHtzY29yZTorKGguc2NvcmUqMTApLnRvRml4ZWQoKSxmcmFtZVdpZHRoOmguZnJhbWVXaWR0aHx8MCxmcmFtZUhlaWdodDpoLmZyYW1lSGVpZ2h0fHwwLGZyYW1lc1BlclNlY29uZDpoLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6dXQoe3BhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKCh5ZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnllLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgodmU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp2ZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKX0pLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpLGJpdHJhdGU6KChoLmJ5dGVzUmVjZWl2ZWR8fDApLSgoKEJlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6QmUuYnl0ZXNSZWNlaXZlZCl8fDApKSo4Lzd9KSx0aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLnNldCh1LGgpLG8uaW5ib3VuZFZpZGVvUnRwLnNldChtLmlkLGgpLG8uY29uc3VtZXJTdHJlYW1NYXAuZ2V0KHUpLmluYm91bmRWaWRlb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyh1LGosaCl9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IHY9YyxoPVEoe2F1ZGlvTGV2ZWw6di5hdWRpb0xldmVsLGNvbmNlYWxlZFNhbXBsZXM6di5jb25jZWFsZWRTYW1wbGVzLGNvbmNlYWxtZW50RXZlbnRzOnYuY29uY2VhbG1lbnRFdmVudHMsdG90YWxBdWRpb0VuZXJneTp2LnRvdGFsQXVkaW9FbmVyZ3ksdG90YWxTYW1wbGVzRHVyYXRpb246di50b3RhbFNhbXBsZXNEdXJhdGlvbix0b3RhbFNhbXBsZXNSZWNlaXZlZDp2LnRvdGFsU2FtcGxlc1JlY2VpdmVkLGZlY1BhY2tldHNEaXNjYXJkZWQ6di5mZWNQYWNrZXRzRGlzY2FyZGVkfHwwLGZlY1BhY2tldHNSZWNlaXZlZDp2LmZlY1BhY2tldHNSZWNlaXZlZHx8MCxpbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb246di5pbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb258fDAscmVtb3ZlZFNhbXBsZXNGb3JBY2NlbGVyYXRpb246di5yZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbnx8MCxzaWxlbnRDb25jZWFsZWRTYW1wbGVzOnYuc2lsZW50Q29uY2VhbGVkU2FtcGxlc3x8MCxwbGF5b3V0SWQ6di5wbGF5b3V0SWR9LEspO2guc2NvcmU9UHIoe2NvbmNlYWxtZW50RXZlbnRzOihoLmNvbmNlYWxtZW50RXZlbnRzfHwwKS0oKCh4ZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOnhlLmNvbmNlYWxtZW50RXZlbnRzKXx8MCkscGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKGplPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6amUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChVZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOlVlLnBhY2tldHNSZWNlaXZlZCl8fDApLGppdHRlcjpoLmppdHRlcnx8MH0pLHguc2V0KHUse3Njb3JlOisoaC5zY29yZSoxMCkudG9GaXhlZCgpLHBhY2tldHNMb3N0UGVyY2VudGFnZTp1dCh7cGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKCRlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6JGUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChIZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkhlLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSksYml0cmF0ZTooKGguYnl0ZXNSZWNlaXZlZHx8MCktKCgoS2U9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpLZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KHUsaCksby5pbmJvdW5kQXVkaW9SdHAuc2V0KG0uaWQsaCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQodSkuaW5ib3VuZEF1ZGlvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJBdWRpb1N0YXRzKHUsaixoKX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIEluYm91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfX19aWYoby5wcm9kdWNlclN0cmVhbU1hcC5mb3JFYWNoKChtLGMpPT57dmFyIHUsYixqLEssdixoLFcsemUsV2UsR2UscWUsWWUsUWUsSmUsWGUsWmUsZXQsdHQscnQsc3QsbnQsaXQsYXQ7aWYobS5vdXRib3VuZFZpZGVvUnRwSWQubGVuZ3RoPjApe2NvbnN0IFY9W107bS5vdXRib3VuZFZpZGVvUnRwSWQuZm9yRWFjaChycj0+e1YucHVzaChvLm91dGJvdW5kVmlkZW9SdHAuZ2V0KHJyKSl9KTtjb25zdCBNPXRoaXMuZ2V0V29ya2luZ1NpbXVsY2FzdFZpZGVvU3RhdHMoVik7TS5zY29yZT1fcih7ZnJhbWVXaWR0aDpNLmZyYW1lV2lkdGh8fDAsZnJhbWVzUGVyU2Vjb25kOk0uZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKHU9TS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6dS5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c1NlbnQ6KE0ucGFja2V0c1NlbnR8fDApLSgoKGI9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpiLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoaj1NLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpqLnBhY2tldHNMb3N0KXx8MCktKCgodj0oSz10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOksucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnYucGFja2V0c0xvc3QpfHwwKSxmcmFtZXNFbmNvZGVkOihNLmZyYW1lc0VuY29kZWR8fDApLSgoKGg9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpoLmZyYW1lc0VuY29kZWQpfHwwKX0pLHcuc2V0KGMse3Njb3JlOisoTS5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6TS5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0Ok0uZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOk0uZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKFc9TS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6Vy5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c0xvc3RQZXJjZW50YWdlOmx0KHtwYWNrZXRzU2VudDooTS5wYWNrZXRzU2VudHx8MCktKCgoemU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDp6ZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKFdlPU0ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOldlLnBhY2tldHNMb3N0KXx8MCktKCgocWU9KEdlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6R2UucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnFlLnBhY2tldHNMb3N0KXx8MCl9KSxiaXRyYXRlOigoTS5ieXRlc1NlbnR8fDApLSgoKFllPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6WWUuYnl0ZXNTZW50KXx8MCkpKjgvNyxjcHVMaW1pdGF0aW9uczpNLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImNwdSIsYmFuZHdpZHRoTGltaXRhdGlvbnM6TS5xdWFsaXR5TGltaXRhdGlvblJlYXNvbj09PSJiYW5kd2lkdGgifSksdGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5zZXQoYyxNKX1lbHNlIGlmKG0ub3V0Ym91bmRBdWRpb1J0cElkLmxlbmd0aD4wKXtjb25zdCBWPW8ub3V0Ym91bmRBdWRpb1J0cC5nZXQobS5vdXRib3VuZEF1ZGlvUnRwSWRbMF0pO1Yuc2NvcmU9VHIoe3BhY2tldHNTZW50OihWLnBhY2tldHNTZW50fHwwKS0oKChRZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlFlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoSmU9Vi5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6SmUucGFja2V0c0xvc3QpfHwwKS0oKChaZT0oWGU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpYZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6WmUucGFja2V0c0xvc3QpfHwwKSxqaXR0ZXI6KChldD1WLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpldC5qaXR0ZXIpfHwwfSksdy5zZXQoYyx7c2NvcmU6KyhWLnNjb3JlKjEwKS50b0ZpeGVkKCksYml0cmF0ZTooKFYuYnl0ZXNTZW50fHwwKS0oKCh0dD10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnR0LmJ5dGVzU2VudCl8fDApKSo4LzcscGFja2V0c0xvc3RQZXJjZW50YWdlOmx0KHtwYWNrZXRzU2VudDooVi5wYWNrZXRzU2VudHx8MCktKCgocnQ9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpydC5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKHN0PVYucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnN0LnBhY2tldHNMb3N0KXx8MCktKCgoaXQ9KG50PXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6bnQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOml0LnBhY2tldHNMb3N0KXx8MCl9KSxqaXR0ZXI6KChhdD1WLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDphdC5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYyl9KSx0aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLFYpfX0pLEUuZm9yRWFjaChtPT57Y29uc3QgYz1mLmZpbmQoYj0+Yi5pZD09PW0ubG9jYWxDYW5kaWRhdGVJZD8obS5sb2NhbENhbmRpZGF0ZUlkPWIuaWQsYik6bnVsbCksdT15LmZpbmQoYj0+Yi5pZD09PW0ucmVtb3RlQ2FuZGlkYXRlSWQ/KG0ucmVtb3RlQ2FuZGlkYXRlSWQ9Yi5pZCxiKTpudWxsKTtjJiYobS5sb2NhbENhbmRpZGF0ZVR5cGU9Yy50eXBlLG0ubG9jYWxDYW5kaWRhdGVBZGRyZXNzPWFlKGMuYWRkcmVzcyksbS5sb2NhbENhbmRpZGF0ZVBvcnQ9Yy5wb3J0LG0ubG9jYWxDYW5kaWRhdGVQcm90b2NvbD1jLnByb3RvY29sLG0ubG9jYWxDYW5kaWRhdGVVcmw9Yy51cmwsbS5sb2NhbENhbmRpZGF0ZU5ldHdvcmtUeXBlPWMubmV0d29ya1R5cGUsbS5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRBZGRyZXNzPWFlKGMucmVsYXRlZEFkZHJlc3MpLG0ubG9jYWxDYW5kaWRhdGVSZWxhdGVkUG9ydD1jLnJlbGF0ZWRQb3J0KSx1JiYobS5yZW1vdGVDYW5kaWRhdGVUeXBlPXUudHlwZSxtLnJlbW90ZUNhbmRpZGF0ZUFkZHJlc3M9YWUodS5hZGRyZXNzKSxtLnJlbW90ZUNhbmRpZGF0ZVBvcnQ9dS5wb3J0LG0ucmVtb3RlQ2FuZGlkYXRlUHJvdG9jb2w9dS5wcm90b2NvbCxtLnJlbW90ZUNhbmRpZGF0ZVVybD11LnVybCl9KSxvLmNhbmRpZGF0ZVBhaXImJihvLnRyYW5zcG9ydD8oby50cmFuc3BvcnQuYnl0ZXNSZWNlaXZlZD1vLmNhbmRpZGF0ZVBhaXIuYnl0ZXNSZWNlaXZlZCxvLnRyYW5zcG9ydC5ieXRlc1NlbnQ9by5jYW5kaWRhdGVQYWlyLmJ5dGVzU2VudCxvLnRyYW5zcG9ydC50b3RhbFJvdW5kVHJpcFRpbWU9by5jYW5kaWRhdGVQYWlyLnRvdGFsUm91bmRUcmlwVGltZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSk6by50cmFuc3BvcnQ9e2J5dGVzUmVjZWl2ZWQ6by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50Om8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsdG90YWxSb3VuZFRyaXBUaW1lOm8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUscm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWV9KSxvLnRyYW5zcG9ydCYmKG8udHJhbnNwb3J0LmNhbmRpZGF0ZVBhaXJzPUUpLG8udHJhbnNwb3J0JiYhby50cmFuc3BvcnQucm91bmRUcmlwVGltZSl7bGV0IG09MCxjPTA7by5yZW1vdGVJbmJvdW5kUnRwLmZvckVhY2goKHUsYik9Pnt1LnJvdW5kVHJpcFRpbWUmJnUucm91bmRUcmlwVGltZT5tJiYobT11LnJvdW5kVHJpcFRpbWUsYz11LnRvdGFsUm91bmRUcmlwVGltZSl9KSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW0sby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPWN9aWYoeC5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLHgpfWNhdGNoKG0pe31pZih3LnNpemU+MCl0cnl7dGhpcy5vYnNlcnZlci5lbWl0KCJwcm9kdWNlcl9zY29yZSIsdyl9Y2F0Y2gobSl7fXJldHVybiBvfWdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0KGUpe2NvbnN0IHM9W107dHJ5e2UucHJvZHVjZXJTdHJlYW1NYXAuZm9yRWFjaCgobixpKT0+e2NvbnN0IGE9dGhpcy5wcm9kdWNlck1hcC5nZXQoaSksZD1hLnRyYWNrLmdldFNldHRpbmdzKCksbz1uLm91dGJvdW5kVmlkZW9SdHBJZC5tYXAoZj0+e2NvbnN0IHk9ZS5vdXRib3VuZFZpZGVvUnRwLmdldChmKTtyZXR1cm4geS5mcmFtZUhlaWdodHx8KHkuZnJhbWVIZWlnaHQ9ZC5oZWlnaHQseS5mcmFtZVdpZHRoPWQud2lkdGgseS5mcmFtZXNQZXJTZWNvbmQ9ZC5mcmFtZVJhdGUpLHl9KSxsPXtwcm9kdWNlcklkOmksYXBwRGF0YTphLmFwcERhdGEsdmlkZW9TdGF0czpvLGF1ZGlvU3RhdHM6bi5vdXRib3VuZEF1ZGlvUnRwSWQubWFwKGY9PmUub3V0Ym91bmRBdWRpb1J0cC5nZXQoZikpfTtzLnB1c2gobCl9KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKCJnZXRQcm9kdWNlcnNSZXBvcnQ6ICIsbixlKX1yZXR1cm4gc31nZXRDb25zdW1lclN0YXRzRnJvbVBhcnNlZENvbnN1bWVyU3RhdHMoZSxzLG4pe2xldCBpO3RyeXtjb25zdHtwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvfT10aGlzLmNvbnN1bWVyUGVlcklkTWFwLmdldChuKSxsPXM9PW51bGw/dm9pZCAwOnMuaW5ib3VuZFZpZGVvUnRwSWQubWFwKGY9Pntjb25zdCBFPXRoaXMuY29uc3VtZXJNYXAuZ2V0KG4pLnRyYWNrLmdldFNldHRpbmdzKCksdz1lLmluYm91bmRWaWRlb1J0cC5nZXQoZik7cmV0dXJuIHcuZnJhbWVIZWlnaHR8fCh3LmZyYW1lSGVpZ2h0PUUuaGVpZ2h0LHcuZnJhbWVXaWR0aD1FLndpZHRoLHcuZnJhbWVzUGVyU2Vjb25kPUUuZnJhbWVSYXRlKSx3fSk7aT17Y29uc3VtZXJJZDpuLHBlZXJJZDphLHByb2R1Y2VySWQ6ZCxhcHBEYXRhOm8sdmlkZW9TdGF0czpsLGF1ZGlvU3RhdHM6cz09bnVsbD92b2lkIDA6cy5pbmJvdW5kQXVkaW9SdHBJZC5tYXAoZj0+ZS5pbmJvdW5kQXVkaW9SdHAuZ2V0KGYpKX19Y2F0Y2goYSl7Y29uc29sZS5lcnJvcigiZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzOiAiLGEsZSl9cmV0dXJuIGl9Z2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQoZSl7Y29uc3Qgcz1bXTt0cnl7ZS5jb25zdW1lclN0cmVhbU1hcC5mb3JFYWNoKChuLGkpPT57cy5wdXNoKHRoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzKGUsbixpKSl9KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKCJnZXRDb25zdW1lclN0YXRzRnJvbVJlcG9ydDogIixuLGUpfXJldHVybiBzfX1jbGFzcyBJbiBleHRlbmRzIExye31mdW5jdGlvbiBtdCh0LHIsZSxzKXtpZih0IT1udWxsJiZ0LmxvZ2dlciYmdC5sb2dnZXIuZXJyb3IoIkNhbGxzdGF0czo6aGFuZGxlRXJyb3IiLHtlcnJvcjpzfSksdHlwZW9mIGU9PSJmdW5jdGlvbiImJnMgaW5zdGFuY2VvZiByKWUuY2FsbChudWxsLHMsdCk7ZWxzZSB0aHJvdyBzfWZ1bmN0aW9uIERyKHQscixlKXtjb25zdCBzPXQudmFsdWU7cmV0dXJuIHQudmFsdWU9ZnVuY3Rpb24oLi4ubil7dHJ5e2NvbnN0IGk9cy5hcHBseSh0aGlzLG4pO3JldHVybiBpJiZpIGluc3RhbmNlb2YgUHJvbWlzZT9pLmNhdGNoKGE9PnttdCh0aGlzLHIsZSxhKX0pOml9Y2F0Y2goaSl7bXQodGhpcyxyLGUsaSl9cmV0dXJuIG51bGx9LHR9Y29uc3QgQz0odCxyKT0+KGUscyxuKT0+e2NvbnN0IGk9bi52YWx1ZTtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbiguLi5hKXt0cnl7Y29uc3QgZD1pLmFwcGx5KHRoaXMsYSk7cmV0dXJuIGQmJmQgaW5zdGFuY2VvZiBQcm9taXNlP2QuY2F0Y2gobz0+e210KHRoaXMsdCxyLG8pfSk6ZH1jYXRjaChkKXttdCh0aGlzLHQscixkKX1yZXR1cm4gbnVsbH0sbn0sd249KHQscik9PihlLHMsbik9PntpZihuKXJldHVybiBEcihuLHQscik7Zm9yKGNvbnN0IGkgb2YgUmVmbGVjdC5vd25LZXlzKGUucHJvdG90eXBlKS5maWx0ZXIoYT0+YSE9PSJjb25zdHJ1Y3RvciIpKXtjb25zdCBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZS5wcm90b3R5cGUsaSk7YS52YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsaSxEcihhLHQscikpfX07dmFyIFI9ZnVuY3Rpb24odCxyLGUscyl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCxpPW48Mz9yOnM9PT1udWxsP3M9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLGUpOnMsYTtpZih0eXBlb2YgUmVmbGVjdD09Im9iamVjdCImJnR5cGVvZiBSZWZsZWN0LmRlY29yYXRlPT0iZnVuY3Rpb24iKWk9UmVmbGVjdC5kZWNvcmF0ZSh0LHIsZSxzKTtlbHNlIGZvcih2YXIgZD10Lmxlbmd0aC0xO2Q+PTA7ZC0tKShhPXRbZF0pJiYoaT0objwzP2EoaSk6bj4zP2EocixlLGkpOmEocixlKSl8fGkpO3JldHVybiBuPjMmJmkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLGUsaSksaX07Y29uc3QgUD1jb25zb2xlO2xldCBUPWNsYXNzIGV4dGVuZHMgcXtjb25zdHJ1Y3RvcihlPSJodHRwczovL2FwaS50ZXN0aW5ndjMuZHl0ZS5pbiIscz0iQmxpbmsiLG49ZnIuUFJPRCxpLGEsZCxvLGwpe3N1cGVyKCk7cCh0aGlzLCJvYnNlcnZlciIpO3AodGhpcywiZXZlbnRIYW5kbGVyIik7cCh0aGlzLCJtZWFzdXJlbWVudHMiKTtwKHRoaXMsInByb2R1Y2luZ1RyYW5zcG9ydCIpO3AodGhpcywiY29uc3VtaW5nVHJhbnNwb3J0Iik7cCh0aGlzLCJwcm9kdWNlcnMiLG5ldyBNYXApO3AodGhpcywiY29uc3VtZXJzIixuZXcgTWFwKTtwKHRoaXMsImljZVNlcnZlcnMiKTtwKHRoaXMsImNvbm5lY3Rpb25JbmZvUHJvbWlzZSIpO3AodGhpcywicGluZ1N0YXRzVGltZW91dCIpO3AodGhpcywibG9nZ2VyIik7cCh0aGlzLCJlbnYiKTtwKHRoaXMsImFwaUhvc3RuYW1lcyIpO3AodGhpcywicGVlcklkIik7cCh0aGlzLCJjb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwIixuZXcgTWFwKTtwKHRoaXMsImN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMiLHt9KTtpZighbCl0aHJvdyBFcnJvcigiYXV0aFRva2VuIGlzIG1pc3NpbmcgYnV0IHJlcXVpcmVkIHRvIGluaXRpYWxpemUgQ2FsbFN0YXRzISIpO3N3aXRjaCh0aGlzLmVudj1uLHRoaXMuYXBpSG9zdG5hbWVzPW8sdGhpcy5sb2dnZXI9YSx0aGlzLnBlZXJJZD1kLHRoaXMuZXZlbnRIYW5kbGVyPW5ldyBwbih7bG9nZ2VyOmEscGVlcklkOmQsYXBpSG9zdG5hbWVzOm8sYXV0aFRva2VuOmx9KSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjplbmdpbmVOYW1lOiAiLHtlbmdpbmVOYW1lOnN9KSxzKXtjYXNlIkJsaW5rIjp0aGlzLm1lYXN1cmVtZW50cz1uZXcgQ247YnJlYWs7Y2FzZSJHZWNrbyI6dGhpcy5tZWFzdXJlbWVudHM9bmV3IExyO2JyZWFrO2Nhc2UiV2ViS2l0Ijp0aGlzLm1lYXN1cmVtZW50cz1uZXcgSW47YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihgVW5rbm93biBlbmdpbmVOYW1lISAke3N9YCl9dGhpcy5tZWFzdXJlbWVudHMuY2FsbFN0YXRzSW5zdGFuY2U9dGhpcyx0aGlzLnJlZ2lzdGVyUHJvZHVjZXI9dGhpcy5yZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyksdGhpcy5yZWdpc3RlckNvbnN1bWVyPXRoaXMucmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMpLHRoaXMub2JzZXJ2ZXI9bmV3IHEsdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oImNvbnN1bWVyX3Njb3JlIixmPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpjb25zdW1lcl9zY29yZSAke1suLi5mLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLGYpfSksdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oInByb2R1Y2VyX3Njb3JlIixmPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpwcm9kdWNlcl9zY29yZSAke1suLi5mLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLGYpfSl9cmVnaXN0ZXJJY2VTZXJ2ZXJzKGUpe3RoaXMuaWNlU2VydmVycz1lfXJlZ2lzdGVyQ29uc3VtZXIoZSl7dmFyIHM7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlLmlkKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLmlkLHt9KSx0aGlzLmNvbnN1bWVycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlckNvbnN1bWVyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyQ29uc3VtZXIiLHtjb25zdW1lcklkOmUuaWQsY29uc3VtZXJraW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlckNvbnN1bWVyLmJpbmQodGhpcyxlKSl9cmVnaXN0ZXJQcm9kdWNlcihlKXt2YXIgczt0aGlzLnByb2R1Y2Vycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlclByb2R1Y2VyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSl9c2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50KGUscyl7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLHt9KTtjb25zdCBuPXRoaXMuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcC5nZXQoZSk7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLE9iamVjdC5hc3NpZ24obixzKSl9cmVnaXN0ZXJQcm9kdWNpbmdUcmFuc3BvcnQoZSl7dmFyIG47dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9ZSxlLm9uKCJjbG9zZSIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksZS5vbigiZGlzY29ubmVjdCIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksQXJyYXkuZnJvbSgoKG49ZS5fcHJvZHVjZXJzKT09bnVsbD92b2lkIDA6bi52YWx1ZXMoKSl8fFtdKS5mb3JFYWNoKGk9Pnt0aGlzLnJlZ2lzdGVyUHJvZHVjZXIoaSl9KSxlLm9uKCJuZXdwcm9kdWNlciIsdGhpcy5yZWdpc3RlclByb2R1Y2VyKX1yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKXt2YXIgbjt0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydD1lLGUub24oImNsb3NlIix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxlLm9uKCJkaXNjb25uZWN0Iix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxBcnJheS5mcm9tKCgobj1lLl9jb25zdW1lcnMpPT1udWxsP3ZvaWQgMDpuLnZhbHVlcygpKXx8W10pLmZvckVhY2goaT0+e3RoaXMucmVnaXN0ZXJDb25zdW1lcihpKX0pLGUub24oIm5ld2NvbnN1bWVyIix0aGlzLnJlZ2lzdGVyQ29uc3VtZXIpfWRlUmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVycy5kZWxldGUoZS5pZCl9ZGVSZWdpc3RlclByb2R1Y2VyKGUpe3ZhciBzO3RoaXMucHJvZHVjZXJzLmRlbGV0ZShlLmlkKSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpkZVJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSl9ZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCgpe3RoaXMuY29uc3VtaW5nVHJhbnNwb3J0PXZvaWQgMH1kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0KCl7dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9dm9pZCAwfWNhbGxFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoZSl9c2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlPSExLHMpe3RoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlPXRoaXMubWVhc3VyZW1lbnRzLmdldE5ldHdvcmtJbmZvKHRoaXMuaWNlU2VydmVycyxlKSx0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUFJFQ0FMTF9URVNUX0JFR0lOLHRpbWVzdGFtcDpzfSksdGhpcy5jb25uZWN0aW9uSW5mb1Byb21pc2UmJnRoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlLnRoZW4obj0+e3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5QUkVDQUxMX1RFU1RfQ09NUExFVEUsbWV0YURhdGE6e2Nvbm5lY3Rpb25JbmZvOm59LHRpbWVzdGFtcDpzfSl9KX1zZW5kU2NyZWVuU2hhcmVUb2dnbGVFdmVudChlLHM9bnVsbCxuKXt0aGlzLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMuc2NyZWVuPWUsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplP1MuU0NSRUVOU0hBUkVfU1RBUlRFRDpTLlNDUkVFTlNIQVJFX1NUT1BQRUQsbWV0YURhdGE6e3NzcmM6c30sdGltZXN0YW1wOm59KX1zZW5kU2NyZWVuU2hhcmVSZXF1ZXN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuU0NSRUVOU0hBUkVfU1RBUlRfUkVRVUVTVEVELHRpbWVzdGFtcDplfSl9c2VuZEFjdGl2ZVNwZWFrZXJFdmVudChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5ET01JTkFOVF9TUEVBS0VSLG1ldGFEYXRhOntwZWVySWQ6ZX0sdGltZXN0YW1wOnN9KX1kZXZpY2VzKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OmU9PT1KLkFVRElPJiZTLkFVRElPX0RFVklDRVNfVVBEQVRFU3x8ZT09PUouVklERU8mJlMuVklERU9fREVWSUNFU19VUERBVEVTfHxlPT09Si5TUEVBS0VSJiZTLlNQRUFLRVJfREVWSUNFU19VUERBVEVTLG1ldGFEYXRhOntkZXZpY2VMaXN0OnN9LHRpbWVzdGFtcDpufSl9c2VsZWN0ZWREZXZpY2UoZSxzLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PUouQVVESU8mJlMuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEV8fGU9PT1KLlZJREVPJiZTLlNFTEVDVEVEX0NBTUVSQV9VUERBVEV8fGU9PT1KLlNQRUFLRVImJlMuU0VMRUNURURfU1BFQUtFUl9VUERBVEUsbWV0YURhdGE6e2RldmljZTpzfSx0aW1lc3RhbXA6bn0pfW1lZGlhUGVybWlzc2lvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk1FRElBX1BFUk1JU1NJT04sbWV0YURhdGE6e2RldmljZVR5cGU6ZSxwZXJtaXNzaW9uOnN9LHRpbWVzdGFtcDpufSl9bWVkaWFQbGF5YmFja0ZhaWxlZChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PUouQVVESU8mJlMuQVVESU9fUExBWV9GQUlMRUR8fGU9PT1KLlZJREVPJiZTLlZJREVPX1BMQVlfRkFJTEVELG1ldGFEYXRhOntkZXZpY2VUeXBlOmV9LHRpbWVzdGFtcDpzfSl9bWVkaWFUcmFja011dGVkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplPT09Si5BVURJTyYmUy5BVURJT19UUkFDS19NVVRFRHx8ZT09PUouVklERU8mJlMuVklERU9fVFJBQ0tfTVVURUQsbWV0YURhdGE6e2RldmljZVR5cGU6ZX0sdGltZXN0YW1wOnN9KX10YWJDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlRBQl9DSEFOR0UsbWV0YURhdGE6e2lzTWVldGluZ3NUYWJBY3RpdmU6ZX0sdGltZXN0YW1wOnN9KX1icm93c2VyQmFja2dyb3VuZGVkKGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCx0aW1lc3RhbXA6ZX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkJST1dTRVJfRk9SRUdST1VOREVELHRpbWVzdGFtcDplfSl9bGVnYWN5U3dpdGNoKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkxFR0FDWV9TV0lUQ0gsbWV0YWRhdGE6e29uOmV9LHRpbWVzdGFtcDpzfSl9Z2V0UHJlQ2FsbFRlc3RSZXN1bHRzKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25JbmZvUHJvbWlzZX0pfXNlbmRDYWxsSm9pbkJlZ2luRXZlbnQoZSxzKXtlPW90KFEoe30sZSkse21lZXRpbmdFbnY6dGhpcy5lbnZ9KSxlLmRldmljZUluZm89b3QoUSh7fSxlLmRldmljZUluZm8pLHt1c2VyQWdlbnQ6bmF2aWdhdG9yLnVzZXJBZ2VudCxjcHVzOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5LG1lbW9yeTpuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5fSksdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkNBTExfSk9JTl9CRUdJTixtZXRhRGF0YTp7cGVlck1ldGFEYXRhOmV9LHRpbWVzdGFtcDpzfSl9c2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTix0aW1lc3RhbXA6c30pLG5ldyBQcm9taXNlKChpLGEpPT5JKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBkPVtdO3RyeXtmb3IoY29uc3QgbyBvZiBlKXRyeXtpZihvLmljZVNlcnZlcnMmJm8uaWNlU2VydmVycy5sZW5ndGg+MCl7Y29uc3QgbD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXROZXR3b3JrUXVhbGl0eShvLmljZVNlcnZlcnMpO2QucHVzaChvdChRKHt9LG8pLHtuZXR3b3JrUmVzdWx0czpsfSkpfX1jYXRjaChsKXtjb25zb2xlLndhcm4oIkVycm9yIGhhbmRsaW5nICIsbCl9aSh7cmVnaW9uRGF0YTpkfSl9Y2F0Y2gobyl7Y29uc29sZS53YXJuKCJFcnJvciBpbiBjYWxsc3RhdHMsICIsbyksYShvKX19KSkudGhlbihpPT57dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk5FVF9RVUFMSVRZX1RFU1RfRU5ELHRpbWVzdGFtcDpzLG1ldGFEYXRhOml9KX0pfXNlbmRXZWJTb2NrZXRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuV0VCU09DS0VUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuVFJBTlNQT1JUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRBdWRpb1RvZ2dsZUV2ZW50KGUscyl7dGhpcy5jdXJyZW50VXNlck1lZGlhU3RhdGVzLmF1ZGlvPWU7bGV0IG47ZT9uPVMuQVVESU9fT046bj1TLkFVRElPX09GRix0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50Om4sdGltZXN0YW1wOnN9KX1zZW5kVmlkZW9Ub2dnbGVFdmVudChlLHMpe3RoaXMuY3VycmVudFVzZXJNZWRpYVN0YXRlcy52aWRlbz1lO2xldCBuO2U/bj1TLlZJREVPX09OOm49Uy5WSURFT19PRkYsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpuLHRpbWVzdGFtcDpzfSl9c2VuZFBhcnRpY2lwYW50Um9sZVRvZ2dsZUV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBBUlRJQ0lQQU5UX1JPTEUsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXN0YXJ0UGluZ1N0YXRzKGU9N2UzKXt0aGlzLnNlbmRQaW5nU3RhdHNFdmVudCghMSxuZXcgRGF0ZSksdGhpcy5waW5nU3RhdHNUaW1lb3V0PXNldEludGVydmFsKHRoaXMuc2VuZFBpbmdTdGF0c0V2ZW50LmJpbmQodGhpcyksZSl9c3RvcFBpbmdTdGF0cygpe2NsZWFySW50ZXJ2YWwodGhpcy5waW5nU3RhdHNUaW1lb3V0KX1zZW5kUGluZ1N0YXRzRXZlbnQoZT0hMCxzKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGQsbztsZXQgbixpO2lmKHRoaXMucHJvZHVjaW5nVHJhbnNwb3J0JiYobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksIW58fCEoKGQ9bj09bnVsbD92b2lkIDA6bi5wcm9kdWNlclJlcG9ydCkhPW51bGwmJmQubGVuZ3RoKSkpe3RoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnNlbmRQaW5nU3RhdHNFdmVudDo6c3RhbGVQcm9kdWNpbmdUcmFuc3BvcnQiLHtkaXNjbGFpbWVyOiJTdGFsZSBwcm9kdWNlcj8gUmVnZW5lcmF0aW5nIFN0cmVhbSBNYXBzISJ9KTtjb25zdCBsPXlpZWxkIHRoaXMubWVhc3VyZW1lbnRzLmdldFByb2R1Y2Vyc1JlcG9ydChbLi4udGhpcy5wcm9kdWNlcnMudmFsdWVzKCldKTtuJiZsP24ucHJvZHVjZXJSZXBvcnQ9bDoobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksKCFufHwhKG4hPW51bGwmJm4ucHJvZHVjZXJSZXBvcnQpKSYmdGhpcy5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6c2VuZFBpbmdTdGF0c0V2ZW50Ojpub1Byb2R1Y2luZ1RyYW5zcG9ydFJlcG9ydCIse2Rpc2NsYWltZXI6IlN0cmVhbSBtYXBzIGludmFsaWQgZGVzcGl0ZSByZWdlbmVyYXRpbmchIn0pKX1pZih0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydCYmKGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCFpfHwhKChvPWkuY29uc3VtZXJSZXBvcnQpIT1udWxsJiZvLmxlbmd0aCkpKXt0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6OnN0YWxlQ29uc3VtaW5nVHJhbnNwb3J0Iix7ZGlzY2xhaW1lcjoiU3RhbGUgY29uc3VtZXI/IFJlZ2VuZXJhdGluZyBTdHJlYW0gTWFwcyEifSk7Y29uc3QgbD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRDb25zdW1lcnNSZXBvcnQoWy4uLnRoaXMuY29uc3VtZXJzLnZhbHVlcygpXSk7aSYmbD9pLmNvbnN1bWVyUmVwb3J0PWw6KGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCghaXx8IWkuY29uc3VtZXJSZXBvcnQpJiZ0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6Om5vQ29uc3VtaW5nVHJhbnNwb3J0UmVwb3J0Iix7ZGlzY2xhaW1lcjoiU3RyZWFtIG1hcHMgaW52YWxpZCBkZXNwaXRlIHJlZ2VuZXJhdGluZyEifSkpfWNvbnN0IGE9e3Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzOm4/bj09bnVsbD92b2lkIDA6bi50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLGNvbnN1bWluZ1RyYW5zcG9ydFN0YXRzOmk/aT09bnVsbD92b2lkIDA6aS50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLHByb2R1Y2VyU3RhdHM6W10uY29uY2F0KChuPT1udWxsP3ZvaWQgMDpuLnByb2R1Y2VyUmVwb3J0KXx8W10pLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5wcm9kdWNlclJlcG9ydCl8fFtdKSxjb25zdW1lclN0YXRzOltdLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5jb25zdW1lclJlcG9ydCl8fFtdKS5jb25jYXQoKG49PW51bGw/dm9pZCAwOm4uY29uc3VtZXJSZXBvcnQpfHxbXSl9O2lmKGUmJmEucHJvZHVjZXJTdGF0cy5sZW5ndGg9PT0wJiZhLmNvbnN1bWVyU3RhdHMubGVuZ3RoPT09MCl7eWllbGQgdGhpcy5ldmVudEhhbmRsZXIuZmx1c2goKTtyZXR1cm59dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBJTkdfU1RBVCxtZXRhRGF0YTphLHRpbWVzdGFtcDpzfSl9KX1zZW5kSVZTUGxheWVyUmVidWZmZXJFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUJVRkZFUklORyx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJBdWRpb0Jsb2NrRXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQVVESU9fQkxPQ0tFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJQbGF5YmFja0Jsb2NrZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELHRpbWVzdGFtcDplfSl9c2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVySW5pdGlhbGl6ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9JTklUSUFMSVpFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUix0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfRVJST1IsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUix0aW1lc3RhbXA6cyxtZXRhRGF0YTplfSl9c2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOnt1cGRhdGVkUGxheWJhY2tSYXRlOmV9fSl9c2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kUGxheWVyTGl2ZUxhdGVuY3koZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTElWRVNUUkVBTV9MQVRFTkNZLHRpbWVzdGFtcDpzLG1ldGFEYXRhOntsYXRlbmN5OmV9fSl9c2VuZERpc2Nvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRElTQ09OTkVDVCx0aW1lc3RhbXA6ZX0pfXNlbmRSZWNvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUkVDT05ORUNUX0FUVEVNUFQsdGltZXN0YW1wOmV9KX1leHBlY3RlZFZpZGVvUmVzb2x1dGlvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT04sdGltZXN0YW1wOm4sbWV0YURhdGE6e2ZyYW1lV2lkdGg6ZSxmcmFtZUhlaWdodDpzfX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTix0aW1lc3RhbXA6bixtZXRhRGF0YTp7ZnJhbWVXaWR0aDplLGZyYW1lSGVpZ2h0OnN9fSl9fTtSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInJlZ2lzdGVySWNlU2VydmVycyIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJyZWdpc3RlckNvbnN1bWVyIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInJlZ2lzdGVyQ29uc3VtaW5nVHJhbnNwb3J0IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsImRlUmVnaXN0ZXJDb25zdW1lciIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJkZVJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwiZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJkaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRQcmVDYWxsVGVzdEJlZ2luRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlVG9nZ2xlRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZEFjdGl2ZVNwZWFrZXJFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJkZXZpY2VzIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbGVjdGVkRGV2aWNlIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsIm1lZGlhUGVybWlzc2lvbiIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJtZWRpYVBsYXliYWNrRmFpbGVkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsIm1lZGlhVHJhY2tNdXRlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJ0YWJDaGFuZ2VkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsImJyb3dzZXJCYWNrZ3JvdW5kZWQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwiYnJvd3NlckZvcmVncm91bmRlZCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJsZWdhY3lTd2l0Y2giLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwiZ2V0UHJlQ2FsbFRlc3RSZXN1bHRzIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRDYWxsSm9pbkJlZ2luRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZFdlYlNvY2tldENvbm5lY3RlZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJzZW5kQXVkaW9Ub2dnbGVFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJzZW5kVmlkZW9Ub2dnbGVFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJzZW5kUGFydGljaXBhbnRSb2xlVG9nZ2xlRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic3RhcnRQaW5nU3RhdHMiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic3RvcFBpbmdTdGF0cyIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJzZW5kUGluZ1N0YXRzRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJJbml0aWFsaXplZEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJQbGF5YmFja1JhdGVDaGFuZ2VkRXZlbnQiLG51bGwpLFIoW0MoVHlwZUVycm9yLCh0LHIpPT5QLmVycm9yKHIsdCkpXSxULnByb3RvdHlwZSwic2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkIixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRQbGF5ZXJMaXZlTGF0ZW5jeSIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJzZW5kRGlzY29ubmVjdEV2ZW50IixudWxsKSxSKFtDKFR5cGVFcnJvciwodCxyKT0+UC5lcnJvcihyLHQpKV0sVC5wcm90b3R5cGUsInNlbmRSZWNvbm5lY3RFdmVudCIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJleHBlY3RlZFZpZGVvUmVzb2x1dGlvbiIsbnVsbCksUihbQyhUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQucHJvdG90eXBlLCJleHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbiIsbnVsbCksVD1SKFt3bihUeXBlRXJyb3IsKHQscik9PlAuZXJyb3Iocix0KSldLFQpO3ZhciBNbj1UO2NsYXNzIE5yIGV4dGVuZHMgcXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7cCh0aGlzLCJzdGF0cyIpO3AodGhpcywicGVlcklkIik7cCh0aGlzLCJiYWNrZW5kIik7cCh0aGlzLCJpY2VTZXJ2ZXJzIik7cCh0aGlzLCJpbml0aWFsaXplZCIsITEpO3AodGhpcywic3RhbGxlZCIsITEpO3AodGhpcywiaXBJbmZvcm1hdGlvbiIpO3AodGhpcywibG9nZ2VyIil9aW5pdGlhbGl6ZShFKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDplLGVuZ2luZU5hbWU6cyxlbnY6bj1mci5QUk9ELGljZVNlcnZlcnM6aSxhcGlCYXNlOmE9Imh0dHBzOi8vYXBpLmNsdXN0ZXIuZHl0ZS5pbiIsZmxhZ3M6ZCxsb2dnZXI6bz1jb25zb2xlLGFwaUhvc3RuYW1lczpsLHNraXBDb25uZWN0aXZpdHlDaGVja3M6Zj0hMSxhdXRoVG9rZW46eX0pe3ZhciB3LHgsVTt0cnl7aWYodGhpcy5wZWVySWQ9ZSx0aGlzLmxvZ2dlcj1vLCF5KXt0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjppbml0aWFsaXplIix7ZXZlbnQ6ImF1dGhfdG9rZW5fbWlzc2luZyIscGVlcklkOnRoaXMucGVlcklkfSksdGhpcy5zdGFsbENhbGxTdGF0cygpO3JldHVybn10aGlzLmlwSW5mb3JtYXRpb249eWllbGQgd3IuZ2V0SVBEZXRhaWxzKHtwZWVySWQ6ZSxhcGlIb3N0bmFtZXM6bCxsb2dnZXI6b30pLHRoaXMuYmFja2VuZD1uZXcgTW4oYSxzLG4sZCxvLGUsbCx5KSx0aGlzLmljZVNlcnZlcnM9aSwodz10aGlzLmJhY2tlbmQpPT1udWxsfHx3LnJlZ2lzdGVySWNlU2VydmVycyh0aGlzLmljZVNlcnZlcnMpLHRoaXMuaW5pdGlhbGl6ZWQ9ITAsKFU9KHg9dGhpcy5iYWNrZW5kKT09bnVsbD92b2lkIDA6eC5ldmVudEhhbmRsZXIpPT1udWxsfHxVLmVtaXQoImluaXRpYWxpemVkIix0aGlzLmlwSW5mb3JtYXRpb24pLHRoaXMuZW1pdCgiaW5pdGlhbGl6ZWQiLHRoaXMuaXBJbmZvcm1hdGlvbiksdGhpcy5zdGFydFByZUNhbGxUZXN0KGYpfWNhdGNoKEwpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OkNhbGxTdGF0c0ludGVncmF0aW9uIix7cGVlcklkOnRoaXMucGVlcklkLGVycm9yOkwgaW5zdGFuY2VvZiBFcnJvcj9MLm1lc3NhZ2U6U3RyaW5nKEwpLHN0YWNrOkwgaW5zdGFuY2VvZiBFcnJvcj9MLnN0YWNrOnZvaWQgMH0pLHRoaXMuc3RhbGxDYWxsU3RhdHMoKX19KX1jb25maWd1cmVTZW5kVHJhbnNwb3J0KGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0KGUpfSl9Y29uZmlndXJlUmVjdlRyYW5zcG9ydChlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKX0pfWNhbmRpZGF0ZVJlZ2lvbmFsTmV0d29ya1F1YWxpdHlUZXN0KGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjt0cnl7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kTmV0d29ya1F1YWxpdHlUZXN0QmVnaW5FdmVudChlLHMpfWNhdGNoKGkpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OnNlbmROZXR3b3JrUXVhbGl0eVRlc3RCZWdpbkV2ZW50Iix7ZXJyb3I6e3JlYXNvbjppLnJlYXNvbn19KX19KX0pfXJvb21Kb2luZWQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuLGk7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQ2FsbEpvaW5CZWdpbkV2ZW50KGUscyksdGhpcy5iYWNrZW5kLChpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc3RhcnRQaW5nU3RhdHMoKX0pfSl9YXVkaW9PZmYoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRBdWRpb1RvZ2dsZUV2ZW50KCExLGUpfSl9YXVkaW9Pbigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZEF1ZGlvVG9nZ2xlRXZlbnQoITAsZSl9KX12aWRlb09mZigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFZpZGVvVG9nZ2xlRXZlbnQoITEsZSl9KX12aWRlb09uKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kVmlkZW9Ub2dnbGVFdmVudCghMCxlKX0pfWNhbGxFbmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzLG47KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zdG9wUGluZ1N0YXRzKCksKG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kRGlzY29ubmVjdEV2ZW50KGUpfSl9c2NyZWVuU2hhcmVTdGFydChlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCEwLGUscyl9KX1jb25zdW1lclNoYXJlZE1lZGlhU3RhdGUoZSxzKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQ29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlRXZlbnQoZSxzKX0pfXNjcmVlblNoYXJlU3RvcChlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCExLGUscyl9KX1zY3JlZW5TaGFyZVJlcXVlc3RlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQoZSl9KX1hY3RpdmVTcGVha2VyKGUpe2lmKGUhPT10aGlzLnBlZXJJZClyZXR1cm47Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQWN0aXZlU3BlYWtlckV2ZW50KGUscyl9KX1kZXZpY2VzKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5kZXZpY2VzKGUscyxuKX0pfXNlbGVjdGVkRGV2aWNlKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5zZWxlY3RlZERldmljZShlLHMsbil9KX1tZWRpYVBlcm1pc3Npb24oZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLm1lZGlhUGVybWlzc2lvbihlLHMsbil9KX1tZWRpYVBsYXliYWNrRmFpbGVkKGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4ubWVkaWFQbGF5YmFja0ZhaWxlZChlLHMpfSl9bWVkaWFUcmFja011dGVkKGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4ubWVkaWFUcmFja011dGVkKGUscyl9KX10YWJDaGFuZ2VkKGU9ITEpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4udGFiQ2hhbmdlZChlLHMpfSl9YnJvd3NlckJhY2tncm91bmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuYnJvd3NlckJhY2tncm91bmRlZChlKX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl9KX1sZWdhY3lTd2l0Y2goZSl7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5sZWdhY3lTd2l0Y2goZSxzKX0pfXN0YXJ0UHJlQ2FsbFRlc3QoZT0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlLHMpfSl9KX1vblByZUNhbGxUZXN0UmVzdWx0cyhlKXtyZXR1cm4gdGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uY2UoInByZWNhbGxfZW5kIixlKX0pLGV9b25SZWNlaXZpbmdDb25zdW1lckF1ZGlvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigiY29uc3VtZXJfYXVkaW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nQ29uc3VtZXJWaWRlb1N0YXR1cyhlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5ldmVudEhhbmRsZXIub24oImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsZSl9KX1vblJlY2VpdmluZ1Byb2R1Y2VyQXVkaW9TdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdQcm9kdWNlclZpZGVvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigicHJvZHVjZXJfdmlkZW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdDb25zdW1pbmdUcmFuc3BvcnRTdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsZSl9KX1vblByb2R1Y2VyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9zY29yZSIsZSl9KX1vbkNvbnN1bWVyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1lcl9zY29yZSIsZSl9KX1vblNhZmVJbml0aWFsaXphdGlvbihlKXtpZih0aGlzLmluaXRpYWxpemVkKWUodGhpcy5pcEluZm9ybWF0aW9uLCExKTtlbHNlIGlmKCF0aGlzLnN0YWxsZWQpe2NvbnN0IHM9bj0+e2UobiwhMCl9O3JldHVybiB0aGlzLm9uY2UoImluaXRpYWxpemVkIixzKSxzfXJldHVybigpPT57fX1yZW1vdmVJbml0aWFsaXphdGlvbkxpc3RlbmVyKGUpe3RoaXMucmVtb3ZlTGlzdGVuZXIoImluaXRpYWxpemVkIixlKX1zdGFsbENhbGxTdGF0cygpe3RoaXMuc3RhbGxlZD0hMCx0aGlzLnJlbW92ZUFsbExpc3RlbmVycygiaW5pdGlhbGl6ZWQiKX1pdnNQbGF5ZXJFdmVudChlLHMpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBpLGEsZCxvLGwsZix5LEUsdyx4LFU7c3dpdGNoKGUpe2Nhc2UiUGxheWVyUmVidWZmZXJpbmciOihpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJBdWRpb0Jsb2NrZWQiOihhPXRoaXMuYmFja2VuZCk9PW51bGx8fGEuc2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudChuKTticmVhaztjYXNlIlBsYXllclBsYXliYWNrQmxvY2tlZCI6KGQ9dGhpcy5iYWNrZW5kKT09bnVsbHx8ZC5zZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJOZXR3b3JrVW5hdmFpbGFibGUiOihvPXRoaXMuYmFja2VuZCk9PW51bGx8fG8uc2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KG4pO2JyZWFrO2Nhc2UiUGxheWVySW5pdGlhbGl6ZWQiOihsPXRoaXMuYmFja2VuZCk9PW51bGx8fGwuc2VuZElWU1BsYXllckluaXRpYWxpemVkRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJXb3JrZXJFcnJvciI6KGY9dGhpcy5iYWNrZW5kKT09bnVsbHx8Zi5zZW5kSVZTUGxheWVyV29ya2VyRXJyb3JFdmVudChuKTticmVhaztjYXNlIlBsYXllckVycm9yIjooeT10aGlzLmJhY2tlbmQpPT1udWxsfHx5LnNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KHMsbik7YnJlYWs7Y2FzZSJQbGF5ZXJSZWNvdmVyYWJsZUVycm9yIjooRT10aGlzLmJhY2tlbmQpPT1udWxsfHxFLnNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQocyxuKTticmVhaztjYXNlIlBsYXllckFuYWx5dGljc0V2ZW50Ijoodz10aGlzLmJhY2tlbmQpPT1udWxsfHx3LnNlbmRJVlNQbGF5ZXJBbmFseXRpY3NFdmVudChzLG4pO2JyZWFrO2Nhc2UiUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZCI6KHg9dGhpcy5iYWNrZW5kKT09bnVsbHx8eC5zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KHMsbik7YnJlYWs7Y2FzZSJQbGF5ZXJRdWFsaXR5Q2hhbmdlZCI6KFU9dGhpcy5iYWNrZW5kKT09bnVsbHx8VS5zZW5kSVZTUGxheWVyUXVhbGl0eUNoYW5nZWQocyxuKTticmVha319KX1saXZlc3RyZWFtTGF0ZW5jeShlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRQbGF5ZXJMaXZlTGF0ZW5jeShlLHMpfSl9ZXhwZWN0ZWRWaWRlb1Jlc29sdXRpb24oZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLmV4cGVjdGVkVmlkZW9SZXNvbHV0aW9uKGUscyxuKX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5leHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbihlLHMsbil9KX19bmV3IE5yKCkuc2V0TWF4TGlzdGVuZXJzKDMwKTtmdW5jdGlvbiBBbigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9ZnVuY3Rpb24gVnIodCxyKXtyZXR1cm4gdD09PXJ8fHQhPT10JiZyIT09cn1mdW5jdGlvbiBndCh0LHIpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS07KWlmKFZyKHRbZV1bMF0scikpcmV0dXJuIGU7cmV0dXJuLTF9dmFyIGtuPUFycmF5LnByb3RvdHlwZSxPbj1rbi5zcGxpY2U7ZnVuY3Rpb24gTG4odCl7dmFyIHI9dGhpcy5fX2RhdGFfXyxlPWd0KHIsdCk7aWYoZTwwKXJldHVybiExO3ZhciBzPXIubGVuZ3RoLTE7cmV0dXJuIGU9PXM/ci5wb3AoKTpPbi5jYWxsKHIsZSwxKSwtLXRoaXMuc2l6ZSwhMH1mdW5jdGlvbiBEbih0KXt2YXIgcj10aGlzLl9fZGF0YV9fLGU9Z3Qocix0KTtyZXR1cm4gZTwwP3ZvaWQgMDpyW2VdWzFdfWZ1bmN0aW9uIE5uKHQpe3JldHVybiBndCh0aGlzLl9fZGF0YV9fLHQpPi0xfWZ1bmN0aW9uIFZuKHQscil7dmFyIGU9dGhpcy5fX2RhdGFfXyxzPWd0KGUsdCk7cmV0dXJuIHM8MD8oKyt0aGlzLnNpemUsZS5wdXNoKFt0LHJdKSk6ZVtzXVsxXT1yLHRoaXN9ZnVuY3Rpb24gc2UodCl7dmFyIHI9LTEsZT10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK3I8ZTspe3ZhciBzPXRbcl07dGhpcy5zZXQoc1swXSxzWzFdKX19c2UucHJvdG90eXBlLmNsZWFyPUFuLHNlLnByb3RvdHlwZS5kZWxldGU9TG4sc2UucHJvdG90eXBlLmdldD1EbixzZS5wcm90b3R5cGUuaGFzPU5uLHNlLnByb3RvdHlwZS5zZXQ9Vm47ZnVuY3Rpb24gRm4oKXt0aGlzLl9fZGF0YV9fPW5ldyBzZSx0aGlzLnNpemU9MH1mdW5jdGlvbiBCbih0KXt2YXIgcj10aGlzLl9fZGF0YV9fLGU9ci5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1yLnNpemUsZX1mdW5jdGlvbiB4bih0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9ZnVuY3Rpb24gam4odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfXZhciBVbj10eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWwsRnI9VW4sJG49dHlwZW9mIHNlbGY9PSJvYmplY3QiJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixIbj1Gcnx8JG58fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksWD1IbixLbj1YLlN5bWJvbCxFZT1LbixCcj1PYmplY3QucHJvdG90eXBlLHpuPUJyLmhhc093blByb3BlcnR5LFduPUJyLnRvU3RyaW5nLHdlPUVlP0VlLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBHbih0KXt2YXIgcj16bi5jYWxsKHQsd2UpLGU9dFt3ZV07dHJ5e3Rbd2VdPXZvaWQgMDt2YXIgcz0hMH1jYXRjaChpKXt9dmFyIG49V24uY2FsbCh0KTtyZXR1cm4gcyYmKHI/dFt3ZV09ZTpkZWxldGUgdFt3ZV0pLG59dmFyIHFuPU9iamVjdC5wcm90b3R5cGUsWW49cW4udG9TdHJpbmc7ZnVuY3Rpb24gUW4odCl7cmV0dXJuIFluLmNhbGwodCl9dmFyIEpuPSJbb2JqZWN0IE51bGxdIixYbj0iW29iamVjdCBVbmRlZmluZWRdIix4cj1FZT9FZS50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gTWUodCl7cmV0dXJuIHQ9PW51bGw/dD09PXZvaWQgMD9YbjpKbjp4ciYmeHIgaW4gT2JqZWN0KHQpP0duKHQpOlFuKHQpfWZ1bmN0aW9uIEFlKHQpe3ZhciByPXR5cGVvZiB0O3JldHVybiB0IT1udWxsJiYocj09Im9iamVjdCJ8fHI9PSJmdW5jdGlvbiIpfXZhciBabj0iW29iamVjdCBBc3luY0Z1bmN0aW9uXSIsZWk9IltvYmplY3QgRnVuY3Rpb25dIix0aT0iW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iLHJpPSJbb2JqZWN0IFByb3h5XSI7ZnVuY3Rpb24ganIodCl7aWYoIUFlKHQpKXJldHVybiExO3ZhciByPU1lKHQpO3JldHVybiByPT1laXx8cj09dGl8fHI9PVpufHxyPT1yaX12YXIgc2k9WFsiX19jb3JlLWpzX3NoYXJlZF9fIl0sa3Q9c2ksVXI9ZnVuY3Rpb24oKXt2YXIgdD0vW14uXSskLy5leGVjKGt0JiZrdC5rZXlzJiZrdC5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHQ/IlN5bWJvbChzcmMpXzEuIit0OiIifSgpO2Z1bmN0aW9uIG5pKHQpe3JldHVybiEhVXImJlVyIGluIHR9dmFyIGlpPUZ1bmN0aW9uLnByb3RvdHlwZSxhaT1paS50b1N0cmluZztmdW5jdGlvbiBsZSh0KXtpZih0IT1udWxsKXt0cnl7cmV0dXJuIGFpLmNhbGwodCl9Y2F0Y2gocil7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaChyKXt9fXJldHVybiIifXZhciBvaT0vW1xcXiQuKis/KClbXF17fXxdL2csY2k9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sZGk9RnVuY3Rpb24ucHJvdG90eXBlLGxpPU9iamVjdC5wcm90b3R5cGUsdWk9ZGkudG9TdHJpbmcscGk9bGkuaGFzT3duUHJvcGVydHksaGk9UmVnRXhwKCJeIit1aS5jYWxsKHBpKS5yZXBsYWNlKG9pLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIGZpKHQpe2lmKCFBZSh0KXx8bmkodCkpcmV0dXJuITE7dmFyIHI9anIodCk/aGk6Y2k7cmV0dXJuIHIudGVzdChsZSh0KSl9ZnVuY3Rpb24gbWkodCxyKXtyZXR1cm4gdD09bnVsbD92b2lkIDA6dFtyXX1mdW5jdGlvbiB1ZSh0LHIpe3ZhciBlPW1pKHQscik7cmV0dXJuIGZpKGUpP2U6dm9pZCAwfXZhciBnaT11ZShYLCJNYXAiKSxrZT1naSxTaT11ZShPYmplY3QsImNyZWF0ZSIpLE9lPVNpO2Z1bmN0aW9uIHlpKCl7dGhpcy5fX2RhdGFfXz1PZT9PZShudWxsKTp7fSx0aGlzLnNpemU9MH1mdW5jdGlvbiB2aSh0KXt2YXIgcj10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09cj8xOjAscn12YXIgYmk9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLEVpPU9iamVjdC5wcm90b3R5cGUsVGk9RWkuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gX2kodCl7dmFyIHI9dGhpcy5fX2RhdGFfXztpZihPZSl7dmFyIGU9clt0XTtyZXR1cm4gZT09PWJpP3ZvaWQgMDplfXJldHVybiBUaS5jYWxsKHIsdCk/clt0XTp2b2lkIDB9dmFyIFJpPU9iamVjdC5wcm90b3R5cGUsUGk9UmkuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gQ2kodCl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gT2U/clt0XSE9PXZvaWQgMDpQaS5jYWxsKHIsdCl9dmFyIElpPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiB3aSh0LHIpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLGVbdF09T2UmJnI9PT12b2lkIDA/SWk6cix0aGlzfWZ1bmN0aW9uIHBlKHQpe3ZhciByPS0xLGU9dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytyPGU7KXt2YXIgcz10W3JdO3RoaXMuc2V0KHNbMF0sc1sxXSl9fXBlLnByb3RvdHlwZS5jbGVhcj15aSxwZS5wcm90b3R5cGUuZGVsZXRlPXZpLHBlLnByb3RvdHlwZS5nZXQ9X2kscGUucHJvdG90eXBlLmhhcz1DaSxwZS5wcm90b3R5cGUuc2V0PXdpO2Z1bmN0aW9uIE1pKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgcGUsbWFwOm5ldyhrZXx8c2UpLHN0cmluZzpuZXcgcGV9fWZ1bmN0aW9uIEFpKHQpe3ZhciByPXR5cGVvZiB0O3JldHVybiByPT0ic3RyaW5nInx8cj09Im51bWJlciJ8fHI9PSJzeW1ib2wifHxyPT0iYm9vbGVhbiI/dCE9PSJfX3Byb3RvX18iOnQ9PT1udWxsfWZ1bmN0aW9uIFN0KHQscil7dmFyIGU9dC5fX2RhdGFfXztyZXR1cm4gQWkocik/ZVt0eXBlb2Ygcj09InN0cmluZyI/InN0cmluZyI6Imhhc2giXTplLm1hcH1mdW5jdGlvbiBraSh0KXt2YXIgcj1TdCh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1yPzE6MCxyfWZ1bmN0aW9uIE9pKHQpe3JldHVybiBTdCh0aGlzLHQpLmdldCh0KX1mdW5jdGlvbiBMaSh0KXtyZXR1cm4gU3QodGhpcyx0KS5oYXModCl9ZnVuY3Rpb24gRGkodCxyKXt2YXIgZT1TdCh0aGlzLHQpLHM9ZS5zaXplO3JldHVybiBlLnNldCh0LHIpLHRoaXMuc2l6ZSs9ZS5zaXplPT1zPzA6MSx0aGlzfWZ1bmN0aW9uIFRlKHQpe3ZhciByPS0xLGU9dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytyPGU7KXt2YXIgcz10W3JdO3RoaXMuc2V0KHNbMF0sc1sxXSl9fVRlLnByb3RvdHlwZS5jbGVhcj1NaSxUZS5wcm90b3R5cGUuZGVsZXRlPWtpLFRlLnByb3RvdHlwZS5nZXQ9T2ksVGUucHJvdG90eXBlLmhhcz1MaSxUZS5wcm90b3R5cGUuc2V0PURpO3ZhciBOaT0yMDA7ZnVuY3Rpb24gVmkodCxyKXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKGUgaW5zdGFuY2VvZiBzZSl7dmFyIHM9ZS5fX2RhdGFfXztpZigha2V8fHMubGVuZ3RoPE5pLTEpcmV0dXJuIHMucHVzaChbdCxyXSksdGhpcy5zaXplPSsrZS5zaXplLHRoaXM7ZT10aGlzLl9fZGF0YV9fPW5ldyBUZShzKX1yZXR1cm4gZS5zZXQodCxyKSx0aGlzLnNpemU9ZS5zaXplLHRoaXN9ZnVuY3Rpb24gX2UodCl7dmFyIHI9dGhpcy5fX2RhdGFfXz1uZXcgc2UodCk7dGhpcy5zaXplPXIuc2l6ZX1fZS5wcm90b3R5cGUuY2xlYXI9Rm4sX2UucHJvdG90eXBlLmRlbGV0ZT1CbixfZS5wcm90b3R5cGUuZ2V0PXhuLF9lLnByb3RvdHlwZS5oYXM9am4sX2UucHJvdG90eXBlLnNldD1WaTtmdW5jdGlvbiBGaSh0LHIpe2Zvcih2YXIgZT0tMSxzPXQ9PW51bGw/MDp0Lmxlbmd0aDsrK2U8cyYmcih0W2VdLGUsdCkhPT0hMTspO3JldHVybiB0fXZhciBCaT1mdW5jdGlvbigpe3RyeXt2YXIgdD11ZShPYmplY3QsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIHQoe30sIiIse30pLHR9Y2F0Y2gocil7fX0oKSwkcj1CaTtmdW5jdGlvbiBIcih0LHIsZSl7cj09Il9fcHJvdG9fXyImJiRyPyRyKHQscix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZSx3cml0YWJsZTohMH0pOnRbcl09ZX12YXIgeGk9T2JqZWN0LnByb3RvdHlwZSxqaT14aS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBLcih0LHIsZSl7dmFyIHM9dFtyXTsoIShqaS5jYWxsKHQscikmJlZyKHMsZSkpfHxlPT09dm9pZCAwJiYhKHIgaW4gdCkpJiZIcih0LHIsZSl9ZnVuY3Rpb24geXQodCxyLGUscyl7dmFyIG49IWU7ZXx8KGU9e30pO2Zvcih2YXIgaT0tMSxhPXIubGVuZ3RoOysraTxhOyl7dmFyIGQ9cltpXSxvPXM/cyhlW2RdLHRbZF0sZCxlLHQpOnZvaWQgMDtvPT09dm9pZCAwJiYobz10W2RdKSxuP0hyKGUsZCxvKTpLcihlLGQsbyl9cmV0dXJuIGV9ZnVuY3Rpb24gVWkodCxyKXtmb3IodmFyIGU9LTEscz1BcnJheSh0KTsrK2U8dDspc1tlXT1yKGUpO3JldHVybiBzfWZ1bmN0aW9uIExlKHQpe3JldHVybiB0IT1udWxsJiZ0eXBlb2YgdD09Im9iamVjdCJ9dmFyICRpPSJbb2JqZWN0IEFyZ3VtZW50c10iO2Z1bmN0aW9uIHpyKHQpe3JldHVybiBMZSh0KSYmTWUodCk9PSRpfXZhciBXcj1PYmplY3QucHJvdG90eXBlLEhpPVdyLmhhc093blByb3BlcnR5LEtpPVdyLnByb3BlcnR5SXNFbnVtZXJhYmxlLHppPXpyKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/enI6ZnVuY3Rpb24odCl7cmV0dXJuIExlKHQpJiZIaS5jYWxsKHQsImNhbGxlZSIpJiYhS2kuY2FsbCh0LCJjYWxsZWUiKX0sR3I9emksV2k9QXJyYXkuaXNBcnJheSx2dD1XaTtmdW5jdGlvbiBHaSgpe3JldHVybiExfXZhciBxcj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLFlyPXFyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUscWk9WXImJllyLmV4cG9ydHM9PT1xcixRcj1xaT9YLkJ1ZmZlcjp2b2lkIDAsWWk9UXI/UXIuaXNCdWZmZXI6dm9pZCAwLFFpPVlpfHxHaSxPdD1RaSxKaT05MDA3MTk5MjU0NzQwOTkxLFhpPS9eKD86MHxbMS05XVxkKikkLztmdW5jdGlvbiBaaSh0LHIpe3ZhciBlPXR5cGVvZiB0O3JldHVybiByPXI9PW51bGw/Smk6ciwhIXImJihlPT0ibnVtYmVyInx8ZSE9InN5bWJvbCImJlhpLnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8cn12YXIgZWE9OTAwNzE5OTI1NDc0MDk5MTtmdW5jdGlvbiBKcih0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiJiZ0Pi0xJiZ0JTE9PTAmJnQ8PWVhfXZhciB0YT0iW29iamVjdCBBcmd1bWVudHNdIixyYT0iW29iamVjdCBBcnJheV0iLHNhPSJbb2JqZWN0IEJvb2xlYW5dIixuYT0iW29iamVjdCBEYXRlXSIsaWE9IltvYmplY3QgRXJyb3JdIixhYT0iW29iamVjdCBGdW5jdGlvbl0iLG9hPSJbb2JqZWN0IE1hcF0iLGNhPSJbb2JqZWN0IE51bWJlcl0iLGRhPSJbb2JqZWN0IE9iamVjdF0iLGxhPSJbb2JqZWN0IFJlZ0V4cF0iLHVhPSJbb2JqZWN0IFNldF0iLHBhPSJbb2JqZWN0IFN0cmluZ10iLGhhPSJbb2JqZWN0IFdlYWtNYXBdIixmYT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLG1hPSJbb2JqZWN0IERhdGFWaWV3XSIsZ2E9IltvYmplY3QgRmxvYXQzMkFycmF5XSIsU2E9IltvYmplY3QgRmxvYXQ2NEFycmF5XSIseWE9IltvYmplY3QgSW50OEFycmF5XSIsdmE9IltvYmplY3QgSW50MTZBcnJheV0iLGJhPSJbb2JqZWN0IEludDMyQXJyYXldIixFYT0iW29iamVjdCBVaW50OEFycmF5XSIsVGE9IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixfYT0iW29iamVjdCBVaW50MTZBcnJheV0iLFJhPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsQj17fTtCW2dhXT1CW1NhXT1CW3lhXT1CW3ZhXT1CW2JhXT1CW0VhXT1CW1RhXT1CW19hXT1CW1JhXT0hMCxCW3RhXT1CW3JhXT1CW2ZhXT1CW3NhXT1CW21hXT1CW25hXT1CW2lhXT1CW2FhXT1CW29hXT1CW2NhXT1CW2RhXT1CW2xhXT1CW3VhXT1CW3BhXT1CW2hhXT0hMTtmdW5jdGlvbiBQYSh0KXtyZXR1cm4gTGUodCkmJkpyKHQubGVuZ3RoKSYmISFCW01lKHQpXX1mdW5jdGlvbiBMdCh0KXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQocil9fXZhciBYcj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLERlPVhyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsQ2E9RGUmJkRlLmV4cG9ydHM9PT1YcixEdD1DYSYmRnIucHJvY2VzcyxJYT1mdW5jdGlvbigpe3RyeXt2YXIgdD1EZSYmRGUucmVxdWlyZSYmRGUucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiB0fHxEdCYmRHQuYmluZGluZyYmRHQuYmluZGluZygidXRpbCIpfWNhdGNoKHIpe319KCksUmU9SWEsWnI9UmUmJlJlLmlzVHlwZWRBcnJheSx3YT1acj9MdChacik6UGEsZXM9d2EsTWE9T2JqZWN0LnByb3RvdHlwZSxBYT1NYS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiB0cyh0LHIpe3ZhciBlPXZ0KHQpLHM9IWUmJkdyKHQpLG49IWUmJiFzJiZPdCh0KSxpPSFlJiYhcyYmIW4mJmVzKHQpLGE9ZXx8c3x8bnx8aSxkPWE/VWkodC5sZW5ndGgsU3RyaW5nKTpbXSxvPWQubGVuZ3RoO2Zvcih2YXIgbCBpbiB0KShyfHxBYS5jYWxsKHQsbCkpJiYhKGEmJihsPT0ibGVuZ3RoInx8biYmKGw9PSJvZmZzZXQifHxsPT0icGFyZW50Iil8fGkmJihsPT0iYnVmZmVyInx8bD09ImJ5dGVMZW5ndGgifHxsPT0iYnl0ZU9mZnNldCIpfHxaaShsLG8pKSkmJmQucHVzaChsKTtyZXR1cm4gZH12YXIga2E9T2JqZWN0LnByb3RvdHlwZTtmdW5jdGlvbiBidCh0KXt2YXIgcj10JiZ0LmNvbnN0cnVjdG9yLGU9dHlwZW9mIHI9PSJmdW5jdGlvbiImJnIucHJvdG90eXBlfHxrYTtyZXR1cm4gdD09PWV9ZnVuY3Rpb24gcnModCxyKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQocihlKSl9fXZhciBPYT1ycyhPYmplY3Qua2V5cyxPYmplY3QpLExhPU9hLERhPU9iamVjdC5wcm90b3R5cGUsTmE9RGEuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gc3ModCl7aWYoIWJ0KHQpKXJldHVybiBMYSh0KTt2YXIgcj1bXTtmb3IodmFyIGUgaW4gT2JqZWN0KHQpKU5hLmNhbGwodCxlKSYmZSE9ImNvbnN0cnVjdG9yIiYmci5wdXNoKGUpO3JldHVybiByfWZ1bmN0aW9uIE50KHQpe3JldHVybiB0IT1udWxsJiZKcih0Lmxlbmd0aCkmJiFqcih0KX1mdW5jdGlvbiBWdCh0KXtyZXR1cm4gTnQodCk/dHModCk6c3ModCl9ZnVuY3Rpb24gVmEodCxyKXtyZXR1cm4gdCYmeXQocixWdChyKSx0KX1mdW5jdGlvbiBGYSh0KXt2YXIgcj1bXTtpZih0IT1udWxsKWZvcih2YXIgZSBpbiBPYmplY3QodCkpci5wdXNoKGUpO3JldHVybiByfXZhciBCYT1PYmplY3QucHJvdG90eXBlLHhhPUJhLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGphKHQpe2lmKCFBZSh0KSlyZXR1cm4gRmEodCk7dmFyIHI9YnQodCksZT1bXTtmb3IodmFyIHMgaW4gdClzPT0iY29uc3RydWN0b3IiJiYocnx8IXhhLmNhbGwodCxzKSl8fGUucHVzaChzKTtyZXR1cm4gZX1mdW5jdGlvbiBGdCh0KXtyZXR1cm4gTnQodCk/dHModCwhMCk6amEodCl9ZnVuY3Rpb24gVWEodCxyKXtyZXR1cm4gdCYmeXQocixGdChyKSx0KX12YXIgbnM9dHlwZW9mIGV4cG9ydHM9PSJvYmplY3QiJiZleHBvcnRzJiYhZXhwb3J0cy5ub2RlVHlwZSYmZXhwb3J0cyxpcz1ucyYmdHlwZW9mIG1vZHVsZT09Im9iamVjdCImJm1vZHVsZSYmIW1vZHVsZS5ub2RlVHlwZSYmbW9kdWxlLCRhPWlzJiZpcy5leHBvcnRzPT09bnMsYXM9JGE/WC5CdWZmZXI6dm9pZCAwLG9zPWFzP2FzLmFsbG9jVW5zYWZlOnZvaWQgMDtmdW5jdGlvbiBIYSh0LHIpe2lmKHIpcmV0dXJuIHQuc2xpY2UoKTt2YXIgZT10Lmxlbmd0aCxzPW9zP29zKGUpOm5ldyB0LmNvbnN0cnVjdG9yKGUpO3JldHVybiB0LmNvcHkocyksc31mdW5jdGlvbiBLYSh0LHIpe3ZhciBlPS0xLHM9dC5sZW5ndGg7Zm9yKHJ8fChyPUFycmF5KHMpKTsrK2U8czspcltlXT10W2VdO3JldHVybiByfWZ1bmN0aW9uIHphKHQscil7Zm9yKHZhciBlPS0xLHM9dD09bnVsbD8wOnQubGVuZ3RoLG49MCxpPVtdOysrZTxzOyl7dmFyIGE9dFtlXTtyKGEsZSx0KSYmKGlbbisrXT1hKX1yZXR1cm4gaX1mdW5jdGlvbiBjcygpe3JldHVybltdfXZhciBXYT1PYmplY3QucHJvdG90eXBlLEdhPVdhLnByb3BlcnR5SXNFbnVtZXJhYmxlLGRzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMscWE9ZHM/ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PW51bGw/W106KHQ9T2JqZWN0KHQpLHphKGRzKHQpLGZ1bmN0aW9uKHIpe3JldHVybiBHYS5jYWxsKHQscil9KSl9OmNzLEJ0PXFhO2Z1bmN0aW9uIFlhKHQscil7cmV0dXJuIHl0KHQsQnQodCkscil9ZnVuY3Rpb24gbHModCxyKXtmb3IodmFyIGU9LTEscz1yLmxlbmd0aCxuPXQubGVuZ3RoOysrZTxzOyl0W24rZV09cltlXTtyZXR1cm4gdH12YXIgUWE9cnMoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCksdXM9UWEsSmE9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxYYT1KYT9mdW5jdGlvbih0KXtmb3IodmFyIHI9W107dDspbHMocixCdCh0KSksdD11cyh0KTtyZXR1cm4gcn06Y3MscHM9WGE7ZnVuY3Rpb24gWmEodCxyKXtyZXR1cm4geXQodCxwcyh0KSxyKX1mdW5jdGlvbiBocyh0LHIsZSl7dmFyIHM9cih0KTtyZXR1cm4gdnQodCk/czpscyhzLGUodCkpfWZ1bmN0aW9uIGVvKHQpe3JldHVybiBocyh0LFZ0LEJ0KX1mdW5jdGlvbiB0byh0KXtyZXR1cm4gaHModCxGdCxwcyl9dmFyIHJvPXVlKFgsIkRhdGFWaWV3IikseHQ9cm8sc289dWUoWCwiUHJvbWlzZSIpLGp0PXNvLG5vPXVlKFgsIlNldCIpLFV0PW5vLGlvPXVlKFgsIldlYWtNYXAiKSwkdD1pbyxmcz0iW29iamVjdCBNYXBdIixhbz0iW29iamVjdCBPYmplY3RdIixtcz0iW29iamVjdCBQcm9taXNlXSIsZ3M9IltvYmplY3QgU2V0XSIsU3M9IltvYmplY3QgV2Vha01hcF0iLHlzPSJbb2JqZWN0IERhdGFWaWV3XSIsb289bGUoeHQpLGNvPWxlKGtlKSxsbz1sZShqdCksdW89bGUoVXQpLHBvPWxlKCR0KSxoZT1NZTsoeHQmJmhlKG5ldyB4dChuZXcgQXJyYXlCdWZmZXIoMSkpKSE9eXN8fGtlJiZoZShuZXcga2UpIT1mc3x8anQmJmhlKGp0LnJlc29sdmUoKSkhPW1zfHxVdCYmaGUobmV3IFV0KSE9Z3N8fCR0JiZoZShuZXcgJHQpIT1TcykmJihoZT1mdW5jdGlvbih0KXt2YXIgcj1NZSh0KSxlPXI9PWFvP3QuY29uc3RydWN0b3I6dm9pZCAwLHM9ZT9sZShlKToiIjtpZihzKXN3aXRjaChzKXtjYXNlIG9vOnJldHVybiB5cztjYXNlIGNvOnJldHVybiBmcztjYXNlIGxvOnJldHVybiBtcztjYXNlIHVvOnJldHVybiBncztjYXNlIHBvOnJldHVybiBTc31yZXR1cm4gcn0pO3ZhciBFdD1oZSxobz1PYmplY3QucHJvdG90eXBlLGZvPWhvLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIG1vKHQpe3ZhciByPXQubGVuZ3RoLGU9bmV3IHQuY29uc3RydWN0b3Iocik7cmV0dXJuIHImJnR5cGVvZiB0WzBdPT0ic3RyaW5nIiYmZm8uY2FsbCh0LCJpbmRleCIpJiYoZS5pbmRleD10LmluZGV4LGUuaW5wdXQ9dC5pbnB1dCksZX12YXIgZ289WC5VaW50OEFycmF5LHZzPWdvO2Z1bmN0aW9uIEh0KHQpe3ZhciByPW5ldyB0LmNvbnN0cnVjdG9yKHQuYnl0ZUxlbmd0aCk7cmV0dXJuIG5ldyB2cyhyKS5zZXQobmV3IHZzKHQpKSxyfWZ1bmN0aW9uIFNvKHQscil7dmFyIGU9cj9IdCh0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKGUsdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aCl9dmFyIHlvPS9cdyokLztmdW5jdGlvbiB2byh0KXt2YXIgcj1uZXcgdC5jb25zdHJ1Y3Rvcih0LnNvdXJjZSx5by5leGVjKHQpKTtyZXR1cm4gci5sYXN0SW5kZXg9dC5sYXN0SW5kZXgscn12YXIgYnM9RWU/RWUucHJvdG90eXBlOnZvaWQgMCxFcz1icz9icy52YWx1ZU9mOnZvaWQgMDtmdW5jdGlvbiBibyh0KXtyZXR1cm4gRXM/T2JqZWN0KEVzLmNhbGwodCkpOnt9fWZ1bmN0aW9uIEVvKHQscil7dmFyIGU9cj9IdCh0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKGUsdC5ieXRlT2Zmc2V0LHQubGVuZ3RoKX12YXIgVG89IltvYmplY3QgQm9vbGVhbl0iLF9vPSJbb2JqZWN0IERhdGVdIixSbz0iW29iamVjdCBNYXBdIixQbz0iW29iamVjdCBOdW1iZXJdIixDbz0iW29iamVjdCBSZWdFeHBdIixJbz0iW29iamVjdCBTZXRdIix3bz0iW29iamVjdCBTdHJpbmddIixNbz0iW29iamVjdCBTeW1ib2xdIixBbz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLGtvPSJbb2JqZWN0IERhdGFWaWV3XSIsT289IltvYmplY3QgRmxvYXQzMkFycmF5XSIsTG89IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsRG89IltvYmplY3QgSW50OEFycmF5XSIsTm89IltvYmplY3QgSW50MTZBcnJheV0iLFZvPSJbb2JqZWN0IEludDMyQXJyYXldIixGbz0iW29iamVjdCBVaW50OEFycmF5XSIsQm89IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIix4bz0iW29iamVjdCBVaW50MTZBcnJheV0iLGpvPSJbb2JqZWN0IFVpbnQzMkFycmF5XSI7ZnVuY3Rpb24gVW8odCxyLGUpe3ZhciBzPXQuY29uc3RydWN0b3I7c3dpdGNoKHIpe2Nhc2UgQW86cmV0dXJuIEh0KHQpO2Nhc2UgVG86Y2FzZSBfbzpyZXR1cm4gbmV3IHMoK3QpO2Nhc2Uga286cmV0dXJuIFNvKHQsZSk7Y2FzZSBPbzpjYXNlIExvOmNhc2UgRG86Y2FzZSBObzpjYXNlIFZvOmNhc2UgRm86Y2FzZSBCbzpjYXNlIHhvOmNhc2Ugam86cmV0dXJuIEVvKHQsZSk7Y2FzZSBSbzpyZXR1cm4gbmV3IHM7Y2FzZSBQbzpjYXNlIHdvOnJldHVybiBuZXcgcyh0KTtjYXNlIENvOnJldHVybiB2byh0KTtjYXNlIElvOnJldHVybiBuZXcgcztjYXNlIE1vOnJldHVybiBibyh0KX19dmFyIFRzPU9iamVjdC5jcmVhdGUsJG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiBmdW5jdGlvbihyKXtpZighQWUocikpcmV0dXJue307aWYoVHMpcmV0dXJuIFRzKHIpO3QucHJvdG90eXBlPXI7dmFyIGU9bmV3IHQ7cmV0dXJuIHQucHJvdG90eXBlPXZvaWQgMCxlfX0oKSxIbz0kbztmdW5jdGlvbiBLbyh0KXtyZXR1cm4gdHlwZW9mIHQuY29uc3RydWN0b3I9PSJmdW5jdGlvbiImJiFidCh0KT9Ibyh1cyh0KSk6e319dmFyIHpvPSJbb2JqZWN0IE1hcF0iO2Z1bmN0aW9uIFdvKHQpe3JldHVybiBMZSh0KSYmRXQodCk9PXpvfXZhciBfcz1SZSYmUmUuaXNNYXAsR289X3M/THQoX3MpOldvLHFvPUdvLFlvPSJbb2JqZWN0IFNldF0iO2Z1bmN0aW9uIFFvKHQpe3JldHVybiBMZSh0KSYmRXQodCk9PVlvfXZhciBScz1SZSYmUmUuaXNTZXQsSm89UnM/THQoUnMpOlFvLFhvPUpvLFpvPTEsZWM9Mix0Yz00LFBzPSJbb2JqZWN0IEFyZ3VtZW50c10iLHJjPSJbb2JqZWN0IEFycmF5XSIsc2M9IltvYmplY3QgQm9vbGVhbl0iLG5jPSJbb2JqZWN0IERhdGVdIixpYz0iW29iamVjdCBFcnJvcl0iLENzPSJbb2JqZWN0IEZ1bmN0aW9uXSIsYWM9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixvYz0iW29iamVjdCBNYXBdIixjYz0iW29iamVjdCBOdW1iZXJdIixJcz0iW29iamVjdCBPYmplY3RdIixkYz0iW29iamVjdCBSZWdFeHBdIixsYz0iW29iamVjdCBTZXRdIix1Yz0iW29iamVjdCBTdHJpbmddIixwYz0iW29iamVjdCBTeW1ib2xdIixoYz0iW29iamVjdCBXZWFrTWFwXSIsZmM9IltvYmplY3QgQXJyYXlCdWZmZXJdIixtYz0iW29iamVjdCBEYXRhVmlld10iLGdjPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLFNjPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLHljPSJbb2JqZWN0IEludDhBcnJheV0iLHZjPSJbb2JqZWN0IEludDE2QXJyYXldIixiYz0iW29iamVjdCBJbnQzMkFycmF5XSIsRWM9IltvYmplY3QgVWludDhBcnJheV0iLFRjPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsX2M9IltvYmplY3QgVWludDE2QXJyYXldIixSYz0iW29iamVjdCBVaW50MzJBcnJheV0iLEY9e307RltQc109RltyY109RltmY109RlttY109RltzY109RltuY109RltnY109RltTY109Rlt5Y109Rlt2Y109RltiY109RltvY109RltjY109RltJc109RltkY109RltsY109Rlt1Y109RltwY109RltFY109RltUY109RltfY109RltSY109ITAsRltpY109RltDc109RltoY109ITE7ZnVuY3Rpb24gVHQodCxyLGUscyxuLGkpe3ZhciBhLGQ9ciZabyxvPXImZWMsbD1yJnRjO2lmKGUmJihhPW4/ZSh0LHMsbixpKTplKHQpKSxhIT09dm9pZCAwKXJldHVybiBhO2lmKCFBZSh0KSlyZXR1cm4gdDt2YXIgZj12dCh0KTtpZihmKXtpZihhPW1vKHQpLCFkKXJldHVybiBLYSh0LGEpfWVsc2V7dmFyIHk9RXQodCksRT15PT1Dc3x8eT09YWM7aWYoT3QodCkpcmV0dXJuIEhhKHQsZCk7aWYoeT09SXN8fHk9PVBzfHxFJiYhbil7aWYoYT1vfHxFP3t9OktvKHQpLCFkKXJldHVybiBvP1phKHQsVWEoYSx0KSk6WWEodCxWYShhLHQpKX1lbHNle2lmKCFGW3ldKXJldHVybiBuP3Q6e307YT1Vbyh0LHksZCl9fWl8fChpPW5ldyBfZSk7dmFyIHc9aS5nZXQodCk7aWYodylyZXR1cm4gdztpLnNldCh0LGEpLFhvKHQpP3QuZm9yRWFjaChmdW5jdGlvbihMKXthLmFkZChUdChMLHIsZSxMLHQsaSkpfSk6cW8odCkmJnQuZm9yRWFjaChmdW5jdGlvbihMLEgpe2Euc2V0KEgsVHQoTCxyLGUsSCx0LGkpKX0pO3ZhciB4PWw/bz90bzplbzpvP0Z0OlZ0LFU9Zj92b2lkIDA6eCh0KTtyZXR1cm4gRmkoVXx8dCxmdW5jdGlvbihMLEgpe1UmJihIPUwsTD10W0hdKSxLcihhLEgsVHQoTCxyLGUsSCx0LGkpKX0pLGF9dmFyIFBjPTEsQ2M9NDtmdW5jdGlvbiBJYyh0KXtyZXR1cm4gVHQodCxQY3xDYyl9dmFyIHdzPSJoWGdVOFdjOHB3dUdOcTltczVxOUhoIjt0eXBlb2YgcHJvY2VzcyE9InVuZGVmaW5lZCImJihacz1wcm9jZXNzPT1udWxsP3ZvaWQgMDpwcm9jZXNzLmVudikhPW51bGwmJlpzLkZMQUdTTUlUSF9FTlZJUk9OTUVOVF9LRVkmJih3cz1wcm9jZXNzLmVudi5GTEFHU01JVEhfRU5WSVJPTk1FTlRfS0VZKTtmdW5jdGlvbiB3Yyh0PVtdKXtjb25zdCByPXt9O3JldHVybiB0LmZvckVhY2goZT0+e3JbZS5mZWF0dXJlLm5hbWVdPXtlbmFibGVkOmUuZW5hYmxlZCx2YWx1ZTplLmZlYXR1cmVfc3RhdGVfdmFsdWV9fSkscn12YXIgTWM9Y2xhc3N7Y29uc3RydWN0b3IodD13cyl7cCh0aGlzLCJmbGFncyIse30pO3AodGhpcywiZW52aXJvbm1lbnRLZXkiLG51bGwpO3RoaXMuZW52aXJvbm1lbnRLZXk9dH1pZGVudGlmeUFuZEZldGNoRmxhZ3NXaXRoUmV0cnkoZCl7cmV0dXJuIEkodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKHtwcmltYXJ5RW5kcG9pbnQ6dCxzZWNvbmRhcnlFbmRwb2ludDpyLGZvcmNlRXZhbHVhdGU6ZSx0aW1lb3V0OnMsdW5pcXVlSWRlbnRpZmllcjpuLHRyYWl0c09iajppLGxvZ2dlcjphfSl7Y29uc3Qgbz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGkpKSxsPU9iamVjdC5lbnRyaWVzKG8pLm1hcCh5PT4oe3RyYWl0X2tleTp5WzBdLHRyYWl0X3ZhbHVlOnlbMV19KSksZj1bdCxyLHJdO2Zvcihjb25zdCB5IG9mIGYpdHJ5e2NvbnN0IEU9bmV3IEFib3J0Q29udHJvbGxlcix3PXNldFRpbWVvdXQoKCk9PkUuYWJvcnQoKSxzKSx4PWBfJHsoTWF0aC5yYW5kb20oKSsxKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIpfWAsVT15aWVsZCBmZXRjaChgaHR0cHM6Ly8ke3l9L2FwaS92MS9pZGVudGl0aWVzL2Ase21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24iLCJYLUVudmlyb25tZW50LUtleSI6dGhpcy5lbnZpcm9ubWVudEtleX0sYm9keTpKU09OLnN0cmluZ2lmeSh7aWRlbnRpZmllcjpuKyhlP3g6IiIpLHRyYWl0czpsfSksc2lnbmFsOkUuc2lnbmFsfSk7aWYoY2xlYXJUaW1lb3V0KHcpLCFVLm9rKXRocm93IG5ldyBFcnJvcihgUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgJHtVLnN0YXR1c31gKTtjb25zdCBMPXlpZWxkIFUuanNvbigpO3JldHVybiB3YyhMLmZsYWdzfHxbXSl9Y2F0Y2goRSl7YS5lcnJvcigiRmxhZ3NtaXRoIGlkZW50aWZ5IGZhaWxlZCEhIix7ZXJyb3I6RSx1cmw6eX0pfXJldHVybnt9fSl9aWRlbnRpZnkoYSl7cmV0dXJuIEkodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKHQscj17fSxlPSExLHM9NWUzLG49ImVkZ2UuYXBpLmZsYWdzbWl0aC5jb20iLGk9Y29uc29sZSl7cmV0dXJuIHRoaXMuZmxhZ3M9eWllbGQgdGhpcy5pZGVudGlmeUFuZEZldGNoRmxhZ3NXaXRoUmV0cnkoe3RyYWl0c09iajpyLHVuaXF1ZUlkZW50aWZpZXI6dCxmb3JjZUV2YWx1YXRlOmUsdGltZW91dDpzLHByaW1hcnlFbmRwb2ludDpuLHNlY29uZGFyeUVuZHBvaW50OiJlZGdlLmFwaS5mbGFnc21pdGguY29tIixsb2dnZXI6aX0pLHRoaXMuZmxhZ3N9KX1nZXRWYWx1ZSh0KXtyZXR1cm4gdGhpcy5mbGFncyYmdGhpcy5mbGFnc1t0XSYmdGhpcy5mbGFnc1t0XS52YWx1ZX1oYXNGZWF0dXJlKHQpe3JldHVybiB0aGlzLmZsYWdzJiZ0aGlzLmZsYWdzW3RdJiZ0aGlzLmZsYWdzW3RdLmVuYWJsZWR9Z2V0QWxsRmxhZ3MoKXtyZXR1cm4gdGhpcy5mbGFnc319O2Z1bmN0aW9uIEFjKHQpe3JldHVybiBuZXcgTWModCl9dmFyIE1zPVstMiwtMSwwLDEsMl0sa2M9WzAsMSwyLDMsNF07ZnVuY3Rpb24gT2ModCl7dD10LnRyaW0oKTtsZXQgcj0iMCIsZT0iMCIscz0iMCI7cmV0dXJuIHQubGVuZ3RoPT00PyhyPWAweCR7dFsxXX0ke3RbMV19YCxlPWAweCR7dFsyXX0ke3RbMl19YCxzPWAweCR7dFszXX0ke3RbM119YCk6dC5sZW5ndGg+NiYmKHI9YDB4JHt0WzFdfSR7dFsyXX1gLGU9YDB4JHt0WzNdfSR7dFs0XX1gLHM9YDB4JHt0WzVdfSR7dFs2XX1gKSxbK3IsK2UsK3NdfXZhciBMYz0odCxyLGUpPT57bGV0IHMsbixpO2lmKHI9PTApcz1uPWk9ZTtlbHNle2NvbnN0IGE9KGwsZix5KT0+KHk8MCYmKHkrPTEpLHk+MSYmKHktPTEpLHk8LjE2NjY2NjY2NjY2NjY2NjY2P2wrKGYtbCkqNip5Onk8LjU/Zjp5PC42NjY2NjY2NjY2NjY2NjY2P2wrKGYtbCkqKC42NjY2NjY2NjY2NjY2NjY2LXkpKjY6bCksZD1lPC41P2UqKDErcik6ZStyLWUqcixvPTIqZS1kO3M9YShvLGQsdCsxLzMpLG49YShvLGQsdCksaT1hKG8sZCx0LTEvMyl9cmV0dXJuW01hdGgucm91bmQocyoyNTUpLE1hdGgucm91bmQobioyNTUpLE1hdGgucm91bmQoaSoyNTUpXX0sRGM9KHQscixlKT0+e3QvPTI1NSxyLz0yNTUsZS89MjU1O2NvbnN0IHM9TWF0aC5tYXgodCxyLGUpLG49TWF0aC5taW4odCxyLGUpO2xldCBpLGE7Y29uc3QgZD0ocytuKS8yO2lmKHM9PW4paT1hPTA7ZWxzZXtjb25zdCBvPXMtbjtzd2l0Y2goYT1kPi41P28vKDItcy1uKTpvLyhzK24pLHMpe2Nhc2UgdDppPShyLWUpL28rKHI8ZT82OjApO2JyZWFrO2Nhc2UgcjppPShlLXQpL28rMjticmVhaztjYXNlIGU6aT0odC1yKS9vKzQ7YnJlYWt9aS89Nn1yZXR1cm5baSxhLGRdfSxOYz0odCxyLGUpPT57Y29uc3Qgcz1uPT5uLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIik7cmV0dXJuYCMke3ModCl9JHtzKHIpfSR7cyhlKX1gfSxBcz0odCxyPU1zLGU9LjQpPT57Y29uc3Qgcz1bXSxbbixpLGFdPU9jKHQpLFtkLG8sbF09RGMobixpLGEpLGY9TWF0aC5yb3VuZChsKjEwMCk7Zj43MD9lPS44OmY+NjA/ZT0uOTpmPDEwP2U9LjA3NTpmPDQyJiYoZT0uMyk7Y29uc3QgeT1yLmZpbmRJbmRleChMPT5MPT09MCk7aWYoeT09PS0xKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCByZWR1Y2VyIHByb3ZpZGVkLCBpdCBtdXN0IGNvbnRhaW4gYXRsZWFzdCBvbmUgemVybyIpO2NvbnN0IEU9NS15LHc9eSsxLHg9KDEwMC1mKS9FLFU9Zi93O2Zvcihjb25zdCBMIG9mIHIpe2xldCBIO0w8MD9IPWYrTCpVKmU6TD4wP0g9ZitMKngqZTpIPWY7Y29uc3RbWix5ZSx2ZV09TGMoZCxvLEgvMTAwKTtzLnB1c2goTmMoWix5ZSx2ZSkpfXJldHVybiBzfSxrcz17ZGFyazp7YmFja2dyb3VuZDp7MWUzOiIjMjUyNTI1Iiw5MDA6IiMyRjJGMkYiLDgwMDoiIzMyMzIzMiIsNzAwOiIjM0UzRTNFIiw2MDA6IiM0QTRBNEEifSx0ZXh0OiIjRjVGNUY1IiwidmlkZW8tYmciOiIjMUMxQzFDIn0sbGlnaHQ6e2JhY2tncm91bmQ6ezFlMzoiI0ZGRkZGRiIsOTAwOiIjRjVGNUY1Iiw4MDA6IiNFQkVCRUIiLDcwMDoiI0UwRTBFMCIsNjAwOiIjRDZENkQ2In0sdGV4dDoiIzExMTExMSIsInRleHQtb24tYnJhbmQiOiIjZmZmZmZmIiwidmlkZW8tYmciOiIjREFEQURBIn19LFZjPXQ9Pntjb25zdFtyLGUscyxuLGldPUFzKHQsTXMpO3JldHVybnszMDA6ciw0MDA6ZSw1MDA6cyw2MDA6biw3MDA6aX19LEZjPXQ9PntpZih0PT09IiNGRkZGRkYiKXJldHVybiBrcy5saWdodC5iYWNrZ3JvdW5kO2lmKHQ9PT0iIzAwMDAwMCIpcmV0dXJuIGtzLmRhcmsuYmFja2dyb3VuZDtjb25zdFtyLGUscyxuLGldPUFzKHQsa2MpO3JldHVybnsxZTM6ciw5MDA6ZSw4MDA6cyw3MDA6biw2MDA6aX19LEJjPXtib3JkZXJfcmFkaXVzOiJyb3VuZGVkIixib3JkZXJfd2lkdGg6InRoaW4iLHNwYWNpbmdfYmFzZTo0LHRoZW1lOiJkYXJrIixjb2xvcnM6e2JyYW5kOlZjKCIjMjE2MEZEIiksYmFja2dyb3VuZDpGYygiIzE0MTQxNCIpLGRhbmdlcjoiI0ZGMkQyRCIsdGV4dDoiI0VFRUVFRSIsdGV4dF9vbl9icmFuZDoiI0VFRUVFRSIsc3VjY2VzczoiIzYyQTUwNCIsdmlkZW9fYmc6IiMxOTE5MTkiLHdhcm5pbmc6IiNGRkNEMDcifX07ZnVuY3Rpb24gT3MoKXtyZXR1cm4gSWMoQmMpfU9zKCksT3MoKTtjbGFzcyB4Y3tjb25zdHJ1Y3Rvcigpe0l0KHRoaXMsRmUsdm9pZCAwKX1nZXQgdGVsZW1ldHJ5KCl7dmFyIHI7cmV0dXJuKHI9ZWUodGhpcyxGZSkpPT1udWxsP3ZvaWQgMDpyLmdldFZhbHVlKCJ0ZWxlbWV0cnkiKX1pbml0KHIpe0NlKHRoaXMsRmUscil9aW5mbyhyLGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLHIsZSxzKX1lcnJvcihyLGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oImVycm9yIixyLGUscyl9ZGVidWcocixlLHMpe3ZhciBuOyhuPXRoaXMudGVsZW1ldHJ5KT09bnVsbHx8bi5hZGRMb2dJbkN1cnJlbnRTcGFuKCJkZWJ1ZyIscixlLHMpfWxvZyhyLGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oImxvZyIscixlLHMpfXdhcm4ocixlLHMpe3ZhciBuOyhuPXRoaXMudGVsZW1ldHJ5KT09bnVsbHx8bi5hZGRMb2dJbkN1cnJlbnRTcGFuKCJ3YXJuIixyLGUscyl9fUZlPW5ldyBXZWFrTWFwO2NvbnN0IHRyPWNsYXNzIGV4dGVuZHMgcS5FdmVudEVtaXR0ZXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoKTtJdCh0aGlzLG5lLHZvaWQgMCk7SXQodGhpcyxpZSx2b2lkIDApO3AodGhpcywiYXN5bmNQcm9taXNlVGltZW91dCIpO3AodGhpcywibG9nZ2VyIik7dGhpcy5sb2dnZXI9ZSxDZSh0aGlzLG5lLG5ldyBNYXApLENlKHRoaXMsaWUsbmV3IE1hcCksdGhpcy5hc3luY1Byb21pc2VUaW1lb3V0PThlM31lbWl0QXN5bmMoZSwuLi5zKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7ZWUodGhpcyxuZSkuc2V0KGUsW10pO2NvbnN0IG49ZWUodGhpcyxpZSkuZ2V0KGUpLm1hcCgoKT0+bmV3IFByb21pc2UoaT0+e2VlKHRoaXMsbmUpLmdldChlKS5wdXNoKGkpfSkpO3JuKHRyLnByb3RvdHlwZSx0aGlzLCJlbWl0IikuY2FsbCh0aGlzLGUsLi4ucykseWllbGQgUHJvbWlzZS5yYWNlKFtQcm9taXNlLmFsbChuKSxuZXcgUHJvbWlzZSgoaSxhKT0+c2V0VGltZW91dCgoKT0+YShuZXcgRXJyb3IoYGVtaXRBc3luYyBmYWlsZWQgdG8gcmVzb2x2ZSBmb3IgZXZlbnQgJHtlfS5gKSksdGhpcy5hc3luY1Byb21pc2VUaW1lb3V0KSldKSxlZSh0aGlzLG5lKS5kZWxldGUoZSl9KX1vbkFzeW5jKGUscyl7Y29uc3Qgbj1lZSh0aGlzLG5lKSxpPSguLi5hKT0+SSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIG87dHJ5e3lpZWxkIHMoLi4uYSl9Y2F0Y2gobCl7dGhpcy5sb2dnZXIuZXJyb3IoIltvbkFzeW5jXSIse2Vycm9yOmx9KX1jb25zdCBkPShvPW4uZ2V0KGUpKT09bnVsbD92b2lkIDA6by5zaGlmdCgpO2Q9PW51bGx8fGQoKX0pO3JldHVybiBlZSh0aGlzLGllKS5nZXQoZSl8fGVlKHRoaXMsaWUpLnNldChlLFtdKSxlZSh0aGlzLGllKS5nZXQoZSkucHVzaChpKSxzdXBlci5vbihlLGkpfXJlc2V0KCl7Q2UodGhpcyxuZSxuZXcgTWFwKSxDZSh0aGlzLGllLG5ldyBNYXApLHN1cGVyLnJlbW92ZUFsbExpc3RlbmVycygpfX07bGV0IEt0PXRyO25lPW5ldyBXZWFrTWFwLGllPW5ldyBXZWFrTWFwO3ZhciBfdCxqYz1uZXcgVWludDhBcnJheSgxNik7ZnVuY3Rpb24gVWMoKXtpZighX3QmJihfdD10eXBlb2YgY3J5cHRvIT0idW5kZWZpbmVkIiYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byl8fHR5cGVvZiBtc0NyeXB0byE9InVuZGVmaW5lZCImJnR5cGVvZiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXM9PSJmdW5jdGlvbiImJm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKSwhX3QpKXRocm93IG5ldyBFcnJvcigiY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWQiKTtyZXR1cm4gX3QoamMpfXZhciAkYz0vXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7ZnVuY3Rpb24gSGModCl7cmV0dXJuIHR5cGVvZiB0PT0ic3RyaW5nIiYmJGMudGVzdCh0KX1mb3IodmFyIHo9W10senQ9MDt6dDwyNTY7Kyt6dCl6LnB1c2goKHp0KzI1NikudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7ZnVuY3Rpb24gS2ModCl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOjAsZT0oelt0W3IrMF1dK3pbdFtyKzFdXSt6W3RbcisyXV0relt0W3IrM11dKyItIit6W3Rbcis0XV0relt0W3IrNV1dKyItIit6W3Rbcis2XV0relt0W3IrN11dKyItIit6W3Rbcis4XV0relt0W3IrOV1dKyItIit6W3RbcisxMF1dK3pbdFtyKzExXV0relt0W3IrMTJdXSt6W3RbcisxM11dK3pbdFtyKzE0XV0relt0W3IrMTVdXSkudG9Mb3dlckNhc2UoKTtpZighSGMoZSkpdGhyb3cgVHlwZUVycm9yKCJTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQiKTtyZXR1cm4gZX1mdW5jdGlvbiB6Yyh0LHIsZSl7dD10fHx7fTt2YXIgcz10LnJhbmRvbXx8KHQucm5nfHxVYykoKTtpZihzWzZdPXNbNl0mMTV8NjQsc1s4XT1zWzhdJjYzfDEyOCxyKXtlPWV8fDA7Zm9yKHZhciBuPTA7bjwxNjsrK24pcltlK25dPXNbbl07cmV0dXJuIHJ9cmV0dXJuIEtjKHMpfXZhciBXYz0iW29iamVjdCBNYXBdIixHYz0iW29iamVjdCBTZXRdIixxYz1PYmplY3QucHJvdG90eXBlLFljPXFjLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFFjKHQpe2lmKHQ9PW51bGwpcmV0dXJuITA7aWYoTnQodCkmJih2dCh0KXx8dHlwZW9mIHQ9PSJzdHJpbmcifHx0eXBlb2YgdC5zcGxpY2U9PSJmdW5jdGlvbiJ8fE90KHQpfHxlcyh0KXx8R3IodCkpKXJldHVybiF0Lmxlbmd0aDt2YXIgcj1FdCh0KTtpZihyPT1XY3x8cj09R2MpcmV0dXJuIXQuc2l6ZTtpZihidCh0KSlyZXR1cm4hc3ModCkubGVuZ3RoO2Zvcih2YXIgZSBpbiB0KWlmKFljLmNhbGwodCxlKSlyZXR1cm4hMTtyZXR1cm4hMH1jb25zdCBXdD17UFJPUEFHQVRFX0tJQ0tfQUxMOiJwcm9wYWdhdGVfa2lja19hY3Jvc3Nfcm9vbXMiLFJFRlJFU0hfSURfT05fRElTQ09OTkVDVElPTjoicmVmcmVzaF9pZF9vbl9kaXNjb25uZWN0aW9uIixTS0lQX09URUxfVFJBQ0VTOiJza2lwX290ZWxfdHJhY2VzIixDRl9UUkFOU1BPUlRfRk9SQ0VfUkVMQVlfT05fSUNFX0ZBSUxFRDoiY2ZfdHJhbnNwb3J0X2ZvcmNlX3JlbGF5X29uX2ljZV9mYWlsZWQiLExPR19MRVZFTDoibG9nX2xldmVsIixWMV9QTFVHSU5TOiJ2MV9wbHVnaW5zIixMSVZFU1RSRUFNOiJmZWF0X2xpdmVzdHJlYW0iLFZBTF9NSU5fRlJBTUVSQVRFOiJ2YWxfbWluX2ZyYW1lcmF0ZSIsU0NSRUVFTlNIQVJFX0VSUl9IQUNLOiJzY3JlZW5zaGFyZV9lcnJfaGFjayIsU0NSRUVFTlNIQVJFX0NPTlNUUkFJTlRTX1JFVFJZOiJzY3JlZW5zaGFyZV9jb25zdHJhaW50c19yZXRyeSIsU0NSRUVOU0hBUkVfQ09OU1RSQUlOVFM6InNjcmVlbnNoYXJlX2NvbnN0cmFpbnRzIixPQlNfUVVBTElUWToib2JzX3F1YWxpdHkiLEFMTE9XX1NBRkFSSV9NRURJQV9NSURETEVXQVJFUzoiYWxsb3dfc2FmYXJpX21lZGlhX21pZGRsZXdhcmVzIixFWFBfUkVTSEFSRToiZXhwX3Jlc2hhcmUiLFNLSVBfU0VUVElOR19JTl9VU0VfREVWSUNFOiJza2lwX3NldHRpbmdfaW5fdXNlX2RldmljZSIsUFJFQ0FMTF9CQU5EV0lEVEhfVEVTVDoicHJlY2FsbF9iYW5kd2lkdGhfdGVzdCIsREVCVUdfU09DS0VUX0pPSU46ImRlYnVnX3NvY2tldF9qb2luIixGT1JDRV9SRUxBWToiZm9yY2VfcmVsYXkiLEZPUkNFX1ZJREVPX0NPREVDOiJmb3JjZV92aWRlb19jb2RlYyIsVFJBQ0tfSElOVDoidHJhY2tfaGludCIsUFJFQ1JFQVRFX1BST0RVQ0VSUzoicHJlY3JlYXRlX3Byb2R1Y2VycyIsRElTQUJMRV9PUFVTX0RUWF9DRjoiZGlzYWJsZV9vcHVzX2R0eF9jZiIsRU5BQkxFX0FVRElPX0FDVElWSVRZX0RFQlVHX0xPR1M6ImVuYWJsZV9hdWRpb19hY3Rpdml0eV9kZWJ1Z19sb2dzIixESVNBQkxFX0xBWUVSX1NXSVRDSDoiZGlzYWJsZV9sYXllcl9zd2l0Y2gifTtmdW5jdGlvbiBSdCh0KXtjb25zdCByPXt9O3JldHVybiB0eXBlb2YodD09bnVsbD92b2lkIDA6dC5jb2RlKT09Im51bWJlciImJihyLmNvZGU9dC5jb2RlKSx0eXBlb2YodD09bnVsbD92b2lkIDA6dC5jb2RlKT09InN0cmluZyImJihyLmNvZGU9dC5jb2RlLnN1YnN0cmluZygwLDEwMCkpLHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0Lm5hbWUpPT0ic3RyaW5nIiYmKHIubmFtZT10Lm5hbWUuc3Vic3RyaW5nKDAsNTAwKSksdHlwZW9mKHQ9PW51bGw/dm9pZCAwOnQubWVzc2FnZSk9PSJzdHJpbmciJiYoci5tZXNzYWdlPXQubWVzc2FnZS5zdWJzdHJpbmcoMCw1MDApKSx0eXBlb2YodD09bnVsbD92b2lkIDA6dC5yZWFzb24pPT0ic3RyaW5nIiYmKHIucmVhc29uPXQucmVhc29uLnN1YnN0cmluZygwLDUwMCkpLHR5cGVvZih0PT1udWxsP3ZvaWQgMDp0LnN0YWNrKT09InN0cmluZyImJihyLnN0YWNrPXQuc3RhY2suc3Vic3RyaW5nKDAsNTAwKSkscn1mdW5jdGlvbiBKYyh7c2VydmljZVByZWZpeDp0LGJhc2VVUkk6cn0pe3JldHVybmAke3R9LiR7cn1gfWNvbnN0IFhjPXtsb2dzOiJodHRwczovL2FwaS5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbS9sb2dzL290ZWwvbG9ncyIsbW9jazp7dXJsOiJodHRwczovL2FwaS5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbS9tb2NrIixkb21haW46Im1vY2sucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20iLGFwcDoiaHR0cHM6Ly9leGFtcGxlcy5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbS9tZWV0aW5nIixzdGFnaW5nQXBwOiJodHRwczovL2V4YW1wbGVzLnN0YWdpbmcucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20vbWVldGluZyJ9LGFwaUJhc2U6e3Byb2Q6Imh0dHBzOi8vYXBpLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIixzdGFnaW5nOiJodHRwczovL2FwaS5zdGFnaW5nLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIixwcm9kQWx0ZXJuYXRlOiJodHRwczovL2FwaS5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSJ9LGJhc2VVUkk6e3Byb2Q6InJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIixzdGFnaW5nOiJzdGFnaW5nLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIn19O2Z1bmN0aW9uIExzKHQpe3ZhciBzLG4saTtjb25zdCByPXR5cGVvZiBuYXZpZ2F0b3IhPSJ1bmRlZmluZWQiJiYhbmF2aWdhdG9yLmlzUmVhY3ROYXRpdmUmJnR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiYoKHM9d2luZG93LmxvY2F0aW9uLmhvc3QpPT1udWxsP3ZvaWQgMDpzLmluY2x1ZGVzKFhjLmJhc2VVUkkuc3RhZ2luZykpLGU9ISEoKGk9KG49dD09bnVsbD92b2lkIDA6dC5nZXRWYWx1ZSgibW9kdWxlcyIpKT09bnVsbD92b2lkIDA6bi5kZXZUb29scykhPW51bGwmJmkubG9ncyk7cmV0dXJuIHJ8fGV9ZnVuY3Rpb24gWmModCxyKXt2YXIgZTtpZih0IT1udWxsJiZ0LmdldFZhbHVlKCJmbGFnc21pdGgiKS5oYXNGZWF0dXJlKFd0LkxPR19MRVZFTCkpe2xldCBzPSgoZT10LmdldFZhbHVlKCJmbGFnc21pdGgiKS5nZXRWYWx1ZShXdC5MT0dfTEVWRUwpKT09bnVsbD92b2lkIDA6ZS50b1N0cmluZygpKXx8ImFsbCI7aWYocz1zLnRvTG93ZXJDYXNlKCkudHJpbSgpLHM9PT0ib2ZmIilyZXR1cm4hMTtpZihzIT09ImFsbCIpe2NvbnN0IG49WyJkZWJ1ZyIsImxvZyIsImluZm8iLCJ3YXJuIiwiZXJyb3IiXSxpPW4uaW5kZXhPZihyKSxhPW4uaW5kZXhPZihzKTtpZihpPGEpcmV0dXJuITF9fXJldHVybiEwfWZ1bmN0aW9uIERzKHQscixlPXt9KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkuZm9yRWFjaChzPT57dmFyIGk7aWYoW251bGwsdm9pZCAwLE5hTl0uaW5jbHVkZXModFtzXSl8fHImJigoKGk9ci5tYXRjaCgvXC4vZykpPT1udWxsP3ZvaWQgMDppLmxlbmd0aCl8fDApPj0xMClyZXR1cm47Y29uc3Qgbj1yP2Ake3J9LiR7c31gOnM7dHlwZW9mIHRbc109PSJvYmplY3QiP0RzKHRbc10sbixlKTpbIm51bWJlciIsInN0cmluZyIsImJvb2xlYW4iXS5pbmNsdWRlcyh0eXBlb2YgdFtzXSkmJihlW25dPXRbc10pfSksZX1mdW5jdGlvbiBOcyh0LHIsZT17fSxzPSIiKXtjb25zdCBuPXt9O3RyeXtjb25zdCBpPUpTT04uc3RyaW5naWZ5KGUpLGE9SlNPTi5wYXJzZShpKSxkPURzKGEscyksbz1KU09OLnN0cmluZ2lmeShkKTtpZighKHI9PW51bGw/dm9pZCAwOnIuc3RhcnRzV2l0aCgiW1NEUF0iKSkmJm8ubGVuZ3RoPjVlMyl7Y29uc3QgZj1gTG9nIG5hbWVkOiAiJHtyfSIgaXMgdHJ5aW5nIHRvIGxvZyBhbiBmbGF0dGVuZWQgb2JqZWN0IG9mIHNpemUgCgkJCSR7by5sZW5ndGh9IGNoYXJzIHRoYXQgaXMgYmV5b25kIHBlcm1pdHRlZCBsaW1pdCBvZiA1MDAwIGNoYXJzLiBQbGVhc2Ugb3B0aW1pemUuYDt0aHJvdyBMcyh0KSYmY29uc29sZS5lcnJvcihmLHtsb2c6ZSxmbGF0dGVuZWQ6b30pLG5ldyBFcnJvcihmKX1yZXR1cm4gSlNPTi5wYXJzZShvKX1jYXRjaChpKXtjb25zdCBhPVJ0KGkpO25bYCR7c30uZXJyb3IubWVzc2FnZWBdPWEubWVzc2FnZXx8IiIsbltgJHtzfS5lcnJvci5zdGFja2BdPWEuc3RhY2t8fCIiLG5bYCR7c30uZXJyb3IucmVhc29uYF09YS5yZWFzb258fCIiLG5bYCR7c30uZXJyb3Iuc291cmNlYF09InNhZmVseUZsYXR0ZW5PYmpGb3JPcGVuVGVsZW1ldHJ5In1yZXR1cm4gbn1jb25zdCBlZD17IkFtYXpvbiBTaWxrIjoiYW1hem9uX3NpbGsiLCJBbmRyb2lkIEJyb3dzZXIiOiJhbmRyb2lkIixCYWRhOiJiYWRhIixCbGFja0JlcnJ5OiJibGFja2JlcnJ5IixDaHJvbWU6ImNocm9tZSIsQ2hyb21pdW06ImNocm9taXVtIixFbGVjdHJvbjoiZWxlY3Ryb24iLEVwaXBoYW55OiJlcGlwaGFueSIsRmlyZWZveDoiZmlyZWZveCIsRm9jdXM6ImZvY3VzIixHZW5lcmljOiJnZW5lcmljIiwiR29vZ2xlIFNlYXJjaCI6Imdvb2dsZV9zZWFyY2giLEdvb2dsZWJvdDoiZ29vZ2xlYm90IiwiSW50ZXJuZXQgRXhwbG9yZXIiOiJpZSIsIkstTWVsZW9uIjoia19tZWxlb24iLE1heHRob246Im1heHRob24iLCJNaWNyb3NvZnQgRWRnZSI6ImVkZ2UiLCJNWiBCcm93c2VyIjoibXoiLCJOQVZFUiBXaGFsZSBCcm93c2VyIjoibmF2ZXIiLE9wZXJhOiJvcGVyYSIsIk9wZXJhIENvYXN0Ijoib3BlcmFfY29hc3QiLFBoYW50b21KUzoicGhhbnRvbWpzIixQdWZmaW46InB1ZmZpbiIsUXVwWmlsbGE6InF1cHppbGxhIixRUToicXEiLFFRTGl0ZToicXFsaXRlIixTYWZhcmk6InNhZmFyaSIsU2FpbGZpc2g6InNhaWxmaXNoIiwiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCI6InNhbXN1bmdfaW50ZXJuZXQiLFNlYU1vbmtleToic2VhbW9ua2V5IixTbGVpcG5pcjoic2xlaXBuaXIiLFN3aW5nOiJzd2luZyIsVGl6ZW46InRpemVuIiwiVUMgQnJvd3NlciI6InVjIixWaXZhbGRpOiJ2aXZhbGRpIiwiV2ViT1MgQnJvd3NlciI6IndlYm9zIixXZUNoYXQ6IndlY2hhdCIsIllhbmRleCBCcm93c2VyIjoieWFuZGV4IixSb2t1OiJyb2t1In0sVnM9e2FtYXpvbl9zaWxrOiJBbWF6b24gU2lsayIsYW5kcm9pZDoiQW5kcm9pZCBCcm93c2VyIixiYWRhOiJCYWRhIixibGFja2JlcnJ5OiJCbGFja0JlcnJ5IixjaHJvbWU6IkNocm9tZSIsY2hyb21pdW06IkNocm9taXVtIixlbGVjdHJvbjoiRWxlY3Ryb24iLGVwaXBoYW55OiJFcGlwaGFueSIsZmlyZWZveDoiRmlyZWZveCIsZm9jdXM6IkZvY3VzIixnZW5lcmljOiJHZW5lcmljIixnb29nbGVib3Q6Ikdvb2dsZWJvdCIsZ29vZ2xlX3NlYXJjaDoiR29vZ2xlIFNlYXJjaCIsaWU6IkludGVybmV0IEV4cGxvcmVyIixrX21lbGVvbjoiSy1NZWxlb24iLG1heHRob246Ik1heHRob24iLGVkZ2U6Ik1pY3Jvc29mdCBFZGdlIixtejoiTVogQnJvd3NlciIsbmF2ZXI6Ik5BVkVSIFdoYWxlIEJyb3dzZXIiLG9wZXJhOiJPcGVyYSIsb3BlcmFfY29hc3Q6Ik9wZXJhIENvYXN0IixwaGFudG9tanM6IlBoYW50b21KUyIscHVmZmluOiJQdWZmaW4iLHF1cHppbGxhOiJRdXBaaWxsYSIscXE6IlFRIEJyb3dzZXIiLHFxbGl0ZToiUVEgQnJvd3NlciBMaXRlIixzYWZhcmk6IlNhZmFyaSIsc2FpbGZpc2g6IlNhaWxmaXNoIixzYW1zdW5nX2ludGVybmV0OiJTYW1zdW5nIEludGVybmV0IGZvciBBbmRyb2lkIixzZWFtb25rZXk6IlNlYU1vbmtleSIsc2xlaXBuaXI6IlNsZWlwbmlyIixzd2luZzoiU3dpbmciLHRpemVuOiJUaXplbiIsdWM6IlVDIEJyb3dzZXIiLHZpdmFsZGk6IlZpdmFsZGkiLHdlYm9zOiJXZWJPUyBCcm93c2VyIix3ZWNoYXQ6IldlQ2hhdCIseWFuZGV4OiJZYW5kZXggQnJvd3NlciJ9LCQ9e3RhYmxldDoidGFibGV0Iixtb2JpbGU6Im1vYmlsZSIsZGVza3RvcDoiZGVza3RvcCIsdHY6InR2In0sRz17V2luZG93c1Bob25lOiJXaW5kb3dzIFBob25lIixXaW5kb3dzOiJXaW5kb3dzIixNYWNPUzoibWFjT1MiLGlPUzoiaU9TIixBbmRyb2lkOiJBbmRyb2lkIixXZWJPUzoiV2ViT1MiLEJsYWNrQmVycnk6IkJsYWNrQmVycnkiLEJhZGE6IkJhZGEiLFRpemVuOiJUaXplbiIsTGludXg6IkxpbnV4IixDaHJvbWVPUzoiQ2hyb21lIE9TIixQbGF5U3RhdGlvbjQ6IlBsYXlTdGF0aW9uIDQiLFJva3U6IlJva3UifSxvZT17RWRnZUhUTUw6IkVkZ2VIVE1MIixCbGluazoiQmxpbmsiLFRyaWRlbnQ6IlRyaWRlbnQiLFByZXN0bzoiUHJlc3RvIixHZWNrbzoiR2Vja28iLFdlYktpdDoiV2ViS2l0In07Y2xhc3MgZ3tzdGF0aWMgZ2V0Rmlyc3RNYXRjaChyLGUpe2NvbnN0IHM9ZS5tYXRjaChyKTtyZXR1cm4gcyYmcy5sZW5ndGg+MCYmc1sxXXx8IiJ9c3RhdGljIGdldFNlY29uZE1hdGNoKHIsZSl7Y29uc3Qgcz1lLm1hdGNoKHIpO3JldHVybiBzJiZzLmxlbmd0aD4xJiZzWzJdfHwiIn1zdGF0aWMgbWF0Y2hBbmRSZXR1cm5Db25zdChyLGUscyl7aWYoci50ZXN0KGUpKXJldHVybiBzfXN0YXRpYyBnZXRXaW5kb3dzVmVyc2lvbk5hbWUocil7c3dpdGNoKHIpe2Nhc2UiTlQiOnJldHVybiJOVCI7Y2FzZSJYUCI6cmV0dXJuIlhQIjtjYXNlIk5UIDUuMCI6cmV0dXJuIjIwMDAiO2Nhc2UiTlQgNS4xIjpyZXR1cm4iWFAiO2Nhc2UiTlQgNS4yIjpyZXR1cm4iMjAwMyI7Y2FzZSJOVCA2LjAiOnJldHVybiJWaXN0YSI7Y2FzZSJOVCA2LjEiOnJldHVybiI3IjtjYXNlIk5UIDYuMiI6cmV0dXJuIjgiO2Nhc2UiTlQgNi4zIjpyZXR1cm4iOC4xIjtjYXNlIk5UIDEwLjAiOnJldHVybiIxMCI7ZGVmYXVsdDpyZXR1cm59fXN0YXRpYyBnZXRNYWNPU1ZlcnNpb25OYW1lKHIpe2NvbnN0IGU9ci5zcGxpdCgiLiIpLnNwbGljZSgwLDIpLm1hcChzPT5wYXJzZUludChzLDEwKXx8MCk7aWYoZS5wdXNoKDApLGVbMF09PT0xMClzd2l0Y2goZVsxXSl7Y2FzZSA1OnJldHVybiJMZW9wYXJkIjtjYXNlIDY6cmV0dXJuIlNub3cgTGVvcGFyZCI7Y2FzZSA3OnJldHVybiJMaW9uIjtjYXNlIDg6cmV0dXJuIk1vdW50YWluIExpb24iO2Nhc2UgOTpyZXR1cm4iTWF2ZXJpY2tzIjtjYXNlIDEwOnJldHVybiJZb3NlbWl0ZSI7Y2FzZSAxMTpyZXR1cm4iRWwgQ2FwaXRhbiI7Y2FzZSAxMjpyZXR1cm4iU2llcnJhIjtjYXNlIDEzOnJldHVybiJIaWdoIFNpZXJyYSI7Y2FzZSAxNDpyZXR1cm4iTW9qYXZlIjtjYXNlIDE1OnJldHVybiJDYXRhbGluYSI7ZGVmYXVsdDpyZXR1cm59fXN0YXRpYyBnZXRBbmRyb2lkVmVyc2lvbk5hbWUocil7Y29uc3QgZT1yLnNwbGl0KCIuIikuc3BsaWNlKDAsMikubWFwKHM9PnBhcnNlSW50KHMsMTApfHwwKTtpZihlLnB1c2goMCksIShlWzBdPT09MSYmZVsxXTw1KSl7aWYoZVswXT09PTEmJmVbMV08NilyZXR1cm4iQ3VwY2FrZSI7aWYoZVswXT09PTEmJmVbMV0+PTYpcmV0dXJuIkRvbnV0IjtpZihlWzBdPT09MiYmZVsxXTwyKXJldHVybiJFY2xhaXIiO2lmKGVbMF09PT0yJiZlWzFdPT09MilyZXR1cm4iRnJveW8iO2lmKGVbMF09PT0yJiZlWzFdPjIpcmV0dXJuIkdpbmdlcmJyZWFkIjtpZihlWzBdPT09MylyZXR1cm4iSG9uZXljb21iIjtpZihlWzBdPT09NCYmZVsxXTwxKXJldHVybiJJY2UgQ3JlYW0gU2FuZHdpY2giO2lmKGVbMF09PT00JiZlWzFdPDQpcmV0dXJuIkplbGx5IEJlYW4iO2lmKGVbMF09PT00JiZlWzFdPj00KXJldHVybiJLaXRLYXQiO2lmKGVbMF09PT01KXJldHVybiJMb2xsaXBvcCI7aWYoZVswXT09PTYpcmV0dXJuIk1hcnNobWFsbG93IjtpZihlWzBdPT09NylyZXR1cm4iTm91Z2F0IjtpZihlWzBdPT09OClyZXR1cm4iT3JlbyI7aWYoZVswXT09PTkpcmV0dXJuIlBpZSJ9fXN0YXRpYyBnZXRWZXJzaW9uUHJlY2lzaW9uKHIpe3JldHVybiByLnNwbGl0KCIuIikubGVuZ3RofXN0YXRpYyBjb21wYXJlVmVyc2lvbnMocixlLHM9ITEpe2NvbnN0IG49Zy5nZXRWZXJzaW9uUHJlY2lzaW9uKHIpLGk9Zy5nZXRWZXJzaW9uUHJlY2lzaW9uKGUpO2xldCBhPU1hdGgubWF4KG4saSksZD0wO2NvbnN0IG89Zy5tYXAoW3IsZV0sbD0+e2NvbnN0IGY9YS1nLmdldFZlcnNpb25QcmVjaXNpb24obCkseT1sK25ldyBBcnJheShmKzEpLmpvaW4oIi4wIik7cmV0dXJuIGcubWFwKHkuc3BsaXQoIi4iKSxFPT5uZXcgQXJyYXkoMjAtRS5sZW5ndGgpLmpvaW4oIjAiKStFKS5yZXZlcnNlKCl9KTtmb3IocyYmKGQ9YS1NYXRoLm1pbihuLGkpKSxhLT0xO2E+PWQ7KXtpZihvWzBdW2FdPm9bMV1bYV0pcmV0dXJuIDE7aWYob1swXVthXT09PW9bMV1bYV0pe2lmKGE9PT1kKXJldHVybiAwO2EtPTF9ZWxzZSBpZihvWzBdW2FdPG9bMV1bYV0pcmV0dXJuLTF9fXN0YXRpYyBtYXAocixlKXtjb25zdCBzPVtdO2xldCBuO2lmKEFycmF5LnByb3RvdHlwZS5tYXApcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChyLGUpO2ZvcihuPTA7bjxyLmxlbmd0aDtuKz0xKXMucHVzaChlKHJbbl0pKTtyZXR1cm4gc31zdGF0aWMgZmluZChyLGUpe2xldCBzLG47aWYoQXJyYXkucHJvdG90eXBlLmZpbmQpcmV0dXJuIEFycmF5LnByb3RvdHlwZS5maW5kLmNhbGwocixlKTtmb3Iocz0wLG49ci5sZW5ndGg7czxuO3MrPTEpe2NvbnN0IGk9cltzXTtpZihlKGkscykpcmV0dXJuIGl9fXN0YXRpYyBhc3NpZ24ociwuLi5lKXtjb25zdCBzPXI7bGV0IG4saTtpZihPYmplY3QuYXNzaWduKXJldHVybiBPYmplY3QuYXNzaWduKHIsLi4uZSk7Zm9yKG49MCxpPWUubGVuZ3RoO248aTtuKz0xKXtjb25zdCBhPWVbbl07dHlwZW9mIGE9PSJvYmplY3QiJiZhIT09bnVsbCYmT2JqZWN0LmtleXMoYSkuZm9yRWFjaChvPT57c1tvXT1hW29dfSl9cmV0dXJuIHJ9c3RhdGljIGdldEJyb3dzZXJBbGlhcyhyKXtyZXR1cm4gZWRbcl19c3RhdGljIGdldEJyb3dzZXJUeXBlQnlBbGlhcyhyKXtyZXR1cm4gVnNbcl18fCIifX1jb25zdCBOPS92ZXJzaW9uXC8oXGQrKFwuP18/XGQrKSspL2ksdGQ9W3t0ZXN0OlsvZ29vZ2xlYm90L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ikdvb2dsZWJvdCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9nb29nbGVib3RcLyhcZCsoXC5cZCspKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goTix0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9vcGVyYS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJPcGVyYSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86b3BlcmEpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvb3ByXC98b3Bpb3MvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiT3BlcmEifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86b3ByfG9waW9zKVtccy9dKFxTKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvU2Ftc3VuZ0Jyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86U2Ftc3VuZ0Jyb3dzZXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvV2hhbGUvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTkFWRVIgV2hhbGUgQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86d2hhbGUpW1xzL10oXGQrKD86XC5cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9NWkJyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTVogQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpNWkJyb3dzZXIpW1xzL10oXGQrKD86XC5cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZm9jdXMvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiRm9jdXMifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86Zm9jdXMpW1xzL10oXGQrKD86XC5cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc3dpbmcvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU3dpbmcifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86c3dpbmcpW1xzL10oXGQrKD86XC5cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvY29hc3QvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiT3BlcmEgQ29hc3QifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OmNvYXN0KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL29wdFwvXGQrKD86Lj9fP1xkKykrL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik9wZXJhIFRvdWNoIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Om9wdClbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsveWFicm93c2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IllhbmRleCBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OnlhYnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvdWNicm93c2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlVDIEJyb3dzZXIifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OnVjYnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9NYXh0aG9ufG14aW9zL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ik1heHRob24ifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/Ok1heHRob258bXhpb3MpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZXBpcGhhbnkvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiRXBpcGhhbnkifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OmVwaXBoYW55KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3B1ZmZpbi9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJQdWZmaW4ifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OnB1ZmZpbilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zbGVpcG5pci9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTbGVpcG5pciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvKD86c2xlaXBuaXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvay1tZWxlb24vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiSy1NZWxlb24ifSxlPWcuZ2V0Rmlyc3RNYXRjaChOLHQpfHxnLmdldEZpcnN0TWF0Y2goLyg/OmstbWVsZW9uKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL21pY3JvbWVzc2VuZ2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IldlQ2hhdCJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzptaWNyb21lc3NlbmdlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcXFicm93c2VyL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6L3FxYnJvd3NlcmxpdGUvaS50ZXN0KHQpPyJRUSBCcm93c2VyIExpdGUiOiJRUSBCcm93c2VyIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OnFxYnJvd3NlcmxpdGV8cXFicm93c2VyKVsvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvbXNpZXx0cmlkZW50L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkludGVybmV0IEV4cGxvcmVyIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/Om1zaWUgfHJ2OikoXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvXHNlZGdcLy9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJNaWNyb3NvZnQgRWRnZSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9cc2VkZ1wvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2VkZyhbZWFdfGlvcykvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTWljcm9zb2Z0IEVkZ2UifSxlPWcuZ2V0U2Vjb25kTWF0Y2goL2VkZyhbZWFdfGlvcylcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy92aXZhbGRpL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IlZpdmFsZGkifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvdml2YWxkaVwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL3NlYW1vbmtleS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJTZWFNb25rZXkifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvc2VhbW9ua2V5XC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc2FpbGZpc2gvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU2FpbGZpc2gifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvc2FpbGZpc2hccz9icm93c2VyXC8oXGQrKFwuXGQrKT8pL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc2lsay9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJBbWF6b24gU2lsayJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC9zaWxrXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcGhhbnRvbS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJQaGFudG9tSlMifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvcGhhbnRvbWpzXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0Olsvc2xpbWVyanMvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU2xpbWVySlMifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvc2xpbWVyanNcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9ibGFja2JlcnJ5fFxiYmJcZCsvaSwvcmltXHN0YWJsZXQvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiQmxhY2tCZXJyeSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVtcZF0rXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvKHdlYnxocHcpW28wXXMvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiV2ViT1MgQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvdyg/OmViKT9bbzBdc2Jyb3dzZXJcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9iYWRhL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkJhZGEifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvZG9sZmluXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvdGl6ZW4vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiVGl6ZW4ifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86dGl6ZW5ccz8pP2Jyb3dzZXJcLyhcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcXVwemlsbGEvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiUXVwWmlsbGEifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86cXVwemlsbGEpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaChOLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL2ZpcmVmb3h8aWNld2Vhc2VsfGZ4aW9zL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkZpcmVmb3gifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86ZmlyZWZveHxpY2V3ZWFzZWx8Znhpb3MpW1xzL10oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvZWxlY3Ryb24vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiRWxlY3Ryb24ifSxlPWcuZ2V0Rmlyc3RNYXRjaCgvKD86ZWxlY3Ryb24pXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvTWl1aUJyb3dzZXIvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiTWl1aSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpNaXVpQnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9jaHJvbWl1bS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJDaHJvbWl1bSJ9LGU9Zy5nZXRGaXJzdE1hdGNoKC8oPzpjaHJvbWl1bSlbXHMvXShcZCsoXC4/Xz9cZCspKykvaSx0KXx8Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvY2hyb21lfGNyaW9zfGNybW8vaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiQ2hyb21lIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OmNocm9tZXxjcmlvc3xjcm1vKVwvKFxkKyhcLj9fP1xkKykrKS9pLHQpO3JldHVybiBlJiYoci52ZXJzaW9uPWUpLHJ9fSx7dGVzdDpbL0dTQS9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJHb29nbGUgU2VhcmNoIn0sZT1nLmdldEZpcnN0TWF0Y2goLyg/OkdTQSlcLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3QodCl7Y29uc3Qgcj0hdC50ZXN0KC9saWtlIGFuZHJvaWQvaSksZT10LnRlc3QoL2FuZHJvaWQvaSk7cmV0dXJuIHImJmV9LGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6IkFuZHJvaWQgQnJvd3NlciJ9LGU9Zy5nZXRGaXJzdE1hdGNoKE4sdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvcGxheXN0YXRpb24gNC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOiJQbGF5U3RhdGlvbiA0In0sZT1nLmdldEZpcnN0TWF0Y2goTix0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9zYWZhcml8YXBwbGV3ZWJraXQvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZToiU2FmYXJpIn0sZT1nLmdldEZpcnN0TWF0Y2goTix0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy8uKi9pXSxkZXNjcmliZSh0KXtjb25zdCByPS9eKC4qKVwvKC4qKSAvLGU9L14oLiopXC8oLiopWyBcdF1cKCguKikvLG49dC5zZWFyY2goIlxcKCIpIT09LTE/ZTpyO3JldHVybntuYW1lOmcuZ2V0Rmlyc3RNYXRjaChuLHQpLHZlcnNpb246Zy5nZXRTZWNvbmRNYXRjaChuLHQpfX19XTt2YXIgcmQ9W3t0ZXN0OlsvUm9rdVwvRFZQL10sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL1Jva3VcL0RWUC0oXGQrXC5cZCspL2ksdCk7cmV0dXJue25hbWU6Ry5Sb2t1LHZlcnNpb246cn19fSx7dGVzdDpbL3dpbmRvd3MgcGhvbmUvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL3dpbmRvd3MgcGhvbmUgKD86b3MpP1xzPyhcZCsoXC5cZCspKikvaSx0KTtyZXR1cm57bmFtZTpHLldpbmRvd3NQaG9uZSx2ZXJzaW9uOnJ9fX0se3Rlc3Q6Wy93aW5kb3dzIC9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvV2luZG93cyAoKE5UfFhQKSggXGRcZD8uXGQpPykvaSx0KSxlPWcuZ2V0V2luZG93c1ZlcnNpb25OYW1lKHIpO3JldHVybntuYW1lOkcuV2luZG93cyx2ZXJzaW9uOnIsdmVyc2lvbk5hbWU6ZX19fSx7dGVzdDpbL01hY2ludG9zaCguKj8pIEZ4aU9TKC4qPylcLy9dLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6Ry5pT1N9LGU9Zy5nZXRTZWNvbmRNYXRjaCgvKFZlcnNpb25cLykoXGRbXGQuXSspLyx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3Q6Wy9tYWNpbnRvc2gvaV0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL21hYyBvcyB4IChcZCsoXC4/Xz9cZCspKykvaSx0KS5yZXBsYWNlKC9bX1xzXS9nLCIuIiksZT1nLmdldE1hY09TVmVyc2lvbk5hbWUocikscz17bmFtZTpHLk1hY09TLHZlcnNpb246cn07cmV0dXJuIGUmJihzLnZlcnNpb25OYW1lPWUpLHN9fSx7dGVzdDpbLyhpcG9kfGlwaG9uZXxpcGFkKS9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvb3MgKFxkKyhbX1xzXVxkKykqKSBsaWtlIG1hYyBvcyB4L2ksdCkucmVwbGFjZSgvW19cc10vZywiLiIpO3JldHVybntuYW1lOkcuaU9TLHZlcnNpb246cn19fSx7dGVzdCh0KXtjb25zdCByPSF0LnRlc3QoL2xpa2UgYW5kcm9pZC9pKSxlPXQudGVzdCgvYW5kcm9pZC9pKTtyZXR1cm4gciYmZX0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goL2FuZHJvaWRbXHMvLV0oXGQrKFwuXGQrKSopL2ksdCksZT1nLmdldEFuZHJvaWRWZXJzaW9uTmFtZShyKSxzPXtuYW1lOkcuQW5kcm9pZCx2ZXJzaW9uOnJ9O3JldHVybiBlJiYocy52ZXJzaW9uTmFtZT1lKSxzfX0se3Rlc3Q6Wy8od2VifGhwdylbbzBdcy9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvKD86d2VifGhwdylbbzBdc1wvKFxkKyhcLlxkKykqKS9pLHQpLGU9e25hbWU6Ry5XZWJPU307cmV0dXJuIHImJnIubGVuZ3RoJiYoZS52ZXJzaW9uPXIpLGV9fSx7dGVzdDpbL2JsYWNrYmVycnl8XGJiYlxkKy9pLC9yaW1cc3RhYmxldC9pXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvcmltXHN0YWJsZXRcc29zXHMoXGQrKFwuXGQrKSopL2ksdCl8fGcuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVxkK1wvKFxkKyhbX1xzXVxkKykqKS9pLHQpfHxnLmdldEZpcnN0TWF0Y2goL1xiYmIoXGQrKS9pLHQpO3JldHVybntuYW1lOkcuQmxhY2tCZXJyeSx2ZXJzaW9uOnJ9fX0se3Rlc3Q6Wy9iYWRhL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC9iYWRhXC8oXGQrKFwuXGQrKSopL2ksdCk7cmV0dXJue25hbWU6Ry5CYWRhLHZlcnNpb246cn19fSx7dGVzdDpbL3RpemVuL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC90aXplblsvXHNdKFxkKyhcLlxkKykqKS9pLHQpO3JldHVybntuYW1lOkcuVGl6ZW4sdmVyc2lvbjpyfX19LHt0ZXN0OlsvbGludXgvaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpHLkxpbnV4fX19LHt0ZXN0OlsvQ3JPUy9dLGRlc2NyaWJlKCl7cmV0dXJue25hbWU6Ry5DaHJvbWVPU319fSx7dGVzdDpbL1BsYXlTdGF0aW9uIDQvXSxkZXNjcmliZSh0KXtjb25zdCByPWcuZ2V0Rmlyc3RNYXRjaCgvUGxheVN0YXRpb24gNFsvXHNdKFxkKyhcLlxkKykqKS9pLHQpO3JldHVybntuYW1lOkcuUGxheVN0YXRpb240LHZlcnNpb246cn19fV0sc2Q9W3t0ZXN0OlsvZ29vZ2xlYm90L2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6ImJvdCIsdmVuZG9yOiJHb29nbGUifX19LHt0ZXN0OlsvaHVhd2VpL2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9Zy5nZXRGaXJzdE1hdGNoKC8oY2FuLWwwMSkvaSx0KSYmIk5vdmEiLGU9e3R5cGU6JC5tb2JpbGUsdmVuZG9yOiJIdWF3ZWkifTtyZXR1cm4gciYmKGUubW9kZWw9ciksZX19LHt0ZXN0OlsvbmV4dXNccyooPzo3fDh8OXwxMCkuKi9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQudGFibGV0LHZlbmRvcjoiTmV4dXMifX19LHt0ZXN0OlsvaXBhZC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQudGFibGV0LHZlbmRvcjoiQXBwbGUiLG1vZGVsOiJpUGFkIn19fSx7dGVzdDpbL01hY2ludG9zaCguKj8pIEZ4aU9TKC4qPylcLy9dLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC50YWJsZXQsdmVuZG9yOiJBcHBsZSIsbW9kZWw6ImlQYWQifX19LHt0ZXN0Olsva2Z0dCBidWlsZC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQudGFibGV0LHZlbmRvcjoiQW1hem9uIixtb2RlbDoiS2luZGxlIEZpcmUgSEQgNyJ9fX0se3Rlc3Q6Wy9zaWxrL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC50YWJsZXQsdmVuZG9yOiJBbWF6b24ifX19LHt0ZXN0OlsvdGFibGV0KD8hIHBjKS9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQudGFibGV0fX19LHt0ZXN0KHQpe2NvbnN0IHI9dC50ZXN0KC9pcG9kfGlwaG9uZS9pKSxlPXQudGVzdCgvbGlrZSAoaXBvZHxpcGhvbmUpL2kpO3JldHVybiByJiYhZX0sZGVzY3JpYmUodCl7Y29uc3Qgcj1nLmdldEZpcnN0TWF0Y2goLyhpcG9kfGlwaG9uZSkvaSx0KTtyZXR1cm57dHlwZTokLm1vYmlsZSx2ZW5kb3I6IkFwcGxlIixtb2RlbDpyfX19LHt0ZXN0OlsvbmV4dXNccypbMC02XS4qL2ksL2dhbGF4eSBuZXh1cy9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQubW9iaWxlLHZlbmRvcjoiTmV4dXMifX19LHt0ZXN0OlsvW14tXW1vYmkvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTokLm1vYmlsZX19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRCcm93c2VyTmFtZSghMCk9PT0iYmxhY2tiZXJyeSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC5tb2JpbGUsdmVuZG9yOiJCbGFja0JlcnJ5In19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRCcm93c2VyTmFtZSghMCk9PT0iYmFkYSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC5tb2JpbGV9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0QnJvd3Nlck5hbWUoKT09PSJ3aW5kb3dzIHBob25lIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTokLm1vYmlsZSx2ZW5kb3I6Ik1pY3Jvc29mdCJ9fX0se3Rlc3QodCl7Y29uc3Qgcj1OdW1iZXIoU3RyaW5nKHQuZ2V0T1NWZXJzaW9uKCkpLnNwbGl0KCIuIilbMF0pO3JldHVybiB0LmdldE9TTmFtZSghMCk9PT0iYW5kcm9pZCImJnI+PTN9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC50YWJsZXR9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJhbmRyb2lkIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTokLm1vYmlsZX19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09Im1hY29zIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTokLmRlc2t0b3AsdmVuZG9yOiJBcHBsZSJ9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJ3aW5kb3dzIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTokLmRlc2t0b3B9fX0se3Rlc3QodCl7cmV0dXJuIHQuZ2V0T1NOYW1lKCEwKT09PSJsaW51eCJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC5kZXNrdG9wfX19LHt0ZXN0KHQpe3JldHVybiB0LmdldE9TTmFtZSghMCk9PT0icGxheXN0YXRpb24gNCJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6JC50dn19fSx7dGVzdCh0KXtyZXR1cm4gdC5nZXRPU05hbWUoITApPT09InJva3UifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOiQudHZ9fX1dLG5kPVt7dGVzdCh0KXtyZXR1cm4gdC5nZXRCcm93c2VyTmFtZSghMCk9PT0ibWljcm9zb2Z0IGVkZ2UifSxkZXNjcmliZSh0KXtpZigvXHNlZGdcLy9pLnRlc3QodCkpcmV0dXJue25hbWU6b2UuQmxpbmt9O2NvbnN0IGU9Zy5nZXRGaXJzdE1hdGNoKC9lZGdlXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJue25hbWU6b2UuRWRnZUhUTUwsdmVyc2lvbjplfX19LHt0ZXN0OlsvdHJpZGVudC9pXSxkZXNjcmliZSh0KXtjb25zdCByPXtuYW1lOm9lLlRyaWRlbnR9LGU9Zy5nZXRGaXJzdE1hdGNoKC90cmlkZW50XC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0KHQpe3JldHVybiB0LnRlc3QoL3ByZXN0by9pKX0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTpvZS5QcmVzdG99LGU9Zy5nZXRGaXJzdE1hdGNoKC9wcmVzdG9cLyhcZCsoXC4/Xz9cZCspKykvaSx0KTtyZXR1cm4gZSYmKHIudmVyc2lvbj1lKSxyfX0se3Rlc3QodCl7Y29uc3Qgcj10LnRlc3QoL2dlY2tvL2kpLGU9dC50ZXN0KC9saWtlIGdlY2tvL2kpO3JldHVybiByJiYhZX0sZGVzY3JpYmUodCl7Y29uc3Qgcj17bmFtZTpvZS5HZWNrb30sZT1nLmdldEZpcnN0TWF0Y2goL2dlY2tvXC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19LHt0ZXN0OlsvKGFwcGxlKT93ZWJraXRcLzUzN1wuMzYvaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpvZS5CbGlua319fSx7dGVzdDpbLyhhcHBsZSk/d2Via2l0L2ldLGRlc2NyaWJlKHQpe2NvbnN0IHI9e25hbWU6b2UuV2ViS2l0fSxlPWcuZ2V0Rmlyc3RNYXRjaCgvd2Via2l0XC8oXGQrKFwuP18/XGQrKSspL2ksdCk7cmV0dXJuIGUmJihyLnZlcnNpb249ZSkscn19XTtjbGFzcyBGc3tjb25zdHJ1Y3RvcihyLGU9ITEpe2lmKHI9PW51bGx8fHI9PT0iIil0aHJvdyBuZXcgRXJyb3IoIlVzZXJBZ2VudCBwYXJhbWV0ZXIgY2FuJ3QgYmUgZW1wdHkiKTt0aGlzLl91YT1yLHRoaXMucGFyc2VkUmVzdWx0PXt9LGUhPT0hMCYmdGhpcy5wYXJzZSgpfWdldFVBKCl7cmV0dXJuIHRoaXMuX3VhfXRlc3Qocil7cmV0dXJuIHIudGVzdCh0aGlzLl91YSl9cGFyc2VCcm93c2VyKCl7dGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj17fTtjb25zdCByPWcuZmluZCh0ZCxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gciYmKHRoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXI9ci5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyfWdldEJyb3dzZXIoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj90aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyOnRoaXMucGFyc2VCcm93c2VyKCl9Z2V0QnJvd3Nlck5hbWUocil7cmV0dXJuIHI/U3RyaW5nKHRoaXMuZ2V0QnJvd3NlcigpLm5hbWUpLnRvTG93ZXJDYXNlKCl8fCIiOnRoaXMuZ2V0QnJvd3NlcigpLm5hbWV8fCIifWdldEJyb3dzZXJWZXJzaW9uKCl7cmV0dXJuIHRoaXMuZ2V0QnJvd3NlcigpLnZlcnNpb259Z2V0T1MoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQub3M/dGhpcy5wYXJzZWRSZXN1bHQub3M6dGhpcy5wYXJzZU9TKCl9cGFyc2VPUygpe3RoaXMucGFyc2VkUmVzdWx0Lm9zPXt9O2NvbnN0IHI9Zy5maW5kKHJkLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoZS50ZXN0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUudGVzdC5zb21lKHM9PnRoaXMudGVzdChzKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiByJiYodGhpcy5wYXJzZWRSZXN1bHQub3M9ci5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5vc31nZXRPU05hbWUocil7Y29uc3R7bmFtZTplfT10aGlzLmdldE9TKCk7cmV0dXJuIHI/U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl8fCIiOmV8fCIifWdldE9TVmVyc2lvbigpe3JldHVybiB0aGlzLmdldE9TKCkudmVyc2lvbn1nZXRQbGF0Zm9ybSgpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT90aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybTp0aGlzLnBhcnNlUGxhdGZvcm0oKX1nZXRQbGF0Zm9ybVR5cGUocj0hMSl7Y29uc3R7dHlwZTplfT10aGlzLmdldFBsYXRmb3JtKCk7cmV0dXJuIHI/U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl8fCIiOmV8fCIifXBhcnNlUGxhdGZvcm0oKXt0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT17fTtjb25zdCByPWcuZmluZChzZCxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gciYmKHRoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtPXIuZGVzY3JpYmUodGhpcy5nZXRVQSgpKSksdGhpcy5wYXJzZWRSZXN1bHQucGxhdGZvcm19Z2V0RW5naW5lKCl7cmV0dXJuIHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT90aGlzLnBhcnNlZFJlc3VsdC5lbmdpbmU6dGhpcy5wYXJzZUVuZ2luZSgpfWdldEVuZ2luZU5hbWUocil7cmV0dXJuIHI/U3RyaW5nKHRoaXMuZ2V0RW5naW5lKCkubmFtZSkudG9Mb3dlckNhc2UoKXx8IiI6dGhpcy5nZXRFbmdpbmUoKS5uYW1lfHwiIn1wYXJzZUVuZ2luZSgpe3RoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT17fTtjb25zdCByPWcuZmluZChuZCxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gciYmKHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT1yLmRlc2NyaWJlKHRoaXMuZ2V0VUEoKSkpLHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZX1wYXJzZSgpe3JldHVybiB0aGlzLnBhcnNlQnJvd3NlcigpLHRoaXMucGFyc2VPUygpLHRoaXMucGFyc2VQbGF0Zm9ybSgpLHRoaXMucGFyc2VFbmdpbmUoKSx0aGlzfWdldFJlc3VsdCgpe3JldHVybiBnLmFzc2lnbih7fSx0aGlzLnBhcnNlZFJlc3VsdCl9c2F0aXNmaWVzKHIpe2NvbnN0IGU9e307bGV0IHM9MDtjb25zdCBuPXt9O2xldCBpPTA7aWYoT2JqZWN0LmtleXMocikuZm9yRWFjaChkPT57Y29uc3Qgbz1yW2RdO3R5cGVvZiBvPT0ic3RyaW5nIj8obltkXT1vLGkrPTEpOnR5cGVvZiBvPT0ib2JqZWN0IiYmKGVbZF09byxzKz0xKX0pLHM+MCl7Y29uc3QgZD1PYmplY3Qua2V5cyhlKSxvPWcuZmluZChkLGY9PnRoaXMuaXNPUyhmKSk7aWYobyl7Y29uc3QgZj10aGlzLnNhdGlzZmllcyhlW29dKTtpZihmIT09dm9pZCAwKXJldHVybiBmfWNvbnN0IGw9Zy5maW5kKGQsZj0+dGhpcy5pc1BsYXRmb3JtKGYpKTtpZihsKXtjb25zdCBmPXRoaXMuc2F0aXNmaWVzKGVbbF0pO2lmKGYhPT12b2lkIDApcmV0dXJuIGZ9fWlmKGk+MCl7Y29uc3QgZD1PYmplY3Qua2V5cyhuKSxvPWcuZmluZChkLGw9PnRoaXMuaXNCcm93c2VyKGwsITApKTtpZihvIT09dm9pZCAwKXJldHVybiB0aGlzLmNvbXBhcmVWZXJzaW9uKG5bb10pfX1pc0Jyb3dzZXIocixlPSExKXtjb25zdCBzPXRoaXMuZ2V0QnJvd3Nlck5hbWUoKS50b0xvd2VyQ2FzZSgpO2xldCBuPXIudG9Mb3dlckNhc2UoKTtjb25zdCBpPWcuZ2V0QnJvd3NlclR5cGVCeUFsaWFzKG4pO3JldHVybiBlJiZpJiYobj1pLnRvTG93ZXJDYXNlKCkpLG49PT1zfWNvbXBhcmVWZXJzaW9uKHIpe2xldCBlPVswXSxzPXIsbj0hMTtjb25zdCBpPXRoaXMuZ2V0QnJvd3NlclZlcnNpb24oKTtpZih0eXBlb2YgaT09InN0cmluZyIpcmV0dXJuIHJbMF09PT0iPiJ8fHJbMF09PT0iPCI/KHM9ci5zdWJzdHIoMSksclsxXT09PSI9Ij8obj0hMCxzPXIuc3Vic3RyKDIpKTplPVtdLHJbMF09PT0iPiI/ZS5wdXNoKDEpOmUucHVzaCgtMSkpOnJbMF09PT0iPSI/cz1yLnN1YnN0cigxKTpyWzBdPT09In4iJiYobj0hMCxzPXIuc3Vic3RyKDEpKSxlLmluZGV4T2YoZy5jb21wYXJlVmVyc2lvbnMoaSxzLG4pKT4tMX1pc09TKHIpe3JldHVybiB0aGlzLmdldE9TTmFtZSghMCk9PT1TdHJpbmcocikudG9Mb3dlckNhc2UoKX1pc1BsYXRmb3JtKHIpe3JldHVybiB0aGlzLmdldFBsYXRmb3JtVHlwZSghMCk9PT1TdHJpbmcocikudG9Mb3dlckNhc2UoKX1pc0VuZ2luZShyKXtyZXR1cm4gdGhpcy5nZXRFbmdpbmVOYW1lKCEwKT09PVN0cmluZyhyKS50b0xvd2VyQ2FzZSgpfWlzKHIsZT0hMSl7cmV0dXJuIHRoaXMuaXNCcm93c2VyKHIsZSl8fHRoaXMuaXNPUyhyKXx8dGhpcy5pc1BsYXRmb3JtKHIpfXNvbWUocj1bXSl7cmV0dXJuIHIuc29tZShlPT50aGlzLmlzKGUpKX19LyohCiAqIEJvd3NlciAtIGEgYnJvd3NlciBkZXRlY3RvcgogKiBodHRwczovL2dpdGh1Yi5jb20vbGFuY2VkaWtzb24vYm93c2VyCiAqIE1JVCBMaWNlbnNlIHwgKGMpIER1c3RpbiBEaWF6IDIwMTItMjAxNQogKiBNSVQgTGljZW5zZSB8IChjKSBEZW5pcyBEZW1jaGVua28gMjAxNS0yMDE5CiAqL2NsYXNzIGlke3N0YXRpYyBnZXRQYXJzZXIocixlPSExKXtpZih0eXBlb2YgciE9InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKCJVc2VyQWdlbnQgc2hvdWxkIGJlIGEgc3RyaW5nIik7cmV0dXJuIG5ldyBGcyhyLGUpfXN0YXRpYyBwYXJzZShyKXtyZXR1cm4gbmV3IEZzKHIpLmdldFJlc3VsdCgpfXN0YXRpYyBnZXQgQlJPV1NFUl9NQVAoKXtyZXR1cm4gVnN9c3RhdGljIGdldCBFTkdJTkVfTUFQKCl7cmV0dXJuIG9lfXN0YXRpYyBnZXQgT1NfTUFQKCl7cmV0dXJuIEd9c3RhdGljIGdldCBQTEFURk9STVNfTUFQKCl7cmV0dXJuICR9fWNvbnN0IE5lPSJjaHJvbWUiLEJzPSJvcGVyYSIseHM9ImZpcmVmb3giLGpzPSJpZXhwbG9yZXIiLFVzPSJzYWZhcmkiLCRzPSJud2pzIixIcz0iZWxlY3Ryb24iLEtzPSJyZWFjdC1uYXRpdmUiLEd0PSJ1bmtub3duIixQdD17Q2hyb21lOk5lLENocm9taXVtOk5lLE9wZXJhOkJzLEZpcmVmb3g6eHMsIkludGVybmV0IEV4cGxvcmVyIjpqcyxTYWZhcmk6VXN9O2Z1bmN0aW9uIGFkKCl7Y29uc3R7dXNlckFnZW50OnR9PW5hdmlnYXRvcixyPXtuYW1lOkd0LHZlcnNpb246dm9pZCAwfTtpZih0Lm1hdGNoKC9DaHJvbWUvKSYmIXQubWF0Y2goL0VkZ2UvKSlpZih0Lm1hdGNoKC9FZGcoQT8pLykpe2NvbnN0IGU9dC5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdO051bWJlci5wYXJzZUludChlLDEwKT43MiYmKHIubmFtZT1OZSxyLnZlcnNpb249ZSl9ZWxzZSByLm5hbWU9TmUsci52ZXJzaW9uPXQubWF0Y2goL0Nocm9tZVwvKFtcZC5dKykvKVsxXTtyZXR1cm4gcn1mdW5jdGlvbiBvZCgpe2NvbnN0e3VzZXJBZ2VudDp0fT1uYXZpZ2F0b3I7aWYodC5tYXRjaCgvRWxlY3Ryb24vKSl7Y29uc3Qgcj10Lm1hdGNoKC9FbGVjdHJvblwvKFtcZC5dKykvKVsxXTtyZXR1cm57bmFtZTpIcyx2ZXJzaW9uOnJ9fXJldHVybiBudWxsfWZ1bmN0aW9uIGNkKCl7Y29uc3R7dXNlckFnZW50OnR9PW5hdmlnYXRvcjtpZih0Lm1hdGNoKC9KaXRzaU1lZXROVy8pKXtjb25zdCByPXQubWF0Y2goL0ppdHNpTWVldE5XXC8oW1xkLl0rKS8pWzFdO3JldHVybntuYW1lOiRzLHZlcnNpb246cn19fWZ1bmN0aW9uIGRkKCl7Y29uc3QgdD1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9cYihyZWFjdFsgXHRfLV0qbmF0aXZlKSg/OlwvKFxTKykpPy9pKTtsZXQgcjtpZih0fHxuYXZpZ2F0b3IucHJvZHVjdD09PSJSZWFjdE5hdGl2ZSIpcmV0dXJuIHQmJnQubGVuZ3RoPjImJih0WzFdLHI9dFsyXSkscnx8KHI9InVua25vd24iKSx7bmFtZTpLcyx2ZXJzaW9uOnJ9fWZ1bmN0aW9uIGxkKHQpe2xldCByO2NvbnN0IGU9W2RkLG9kLGNkXTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rPTEpaWYocj1lW25dKCkscilyZXR1cm4gcjtjb25zdCBzPXQuZ2V0QnJvd3Nlck5hbWUoKTtyZXR1cm4gcyBpbiBQdD97bmFtZTpQdFtzXSx2ZXJzaW9uOnQuZ2V0QnJvd3NlclZlcnNpb24oKX06KHI9YWQoKSxyfHx7bmFtZTpHdCx2ZXJzaW9uOnZvaWQgMH0pfWNsYXNzIHVke2NvbnN0cnVjdG9yKCl7cCh0aGlzLCJfYm93c2VyIik7cCh0aGlzLCJfbmFtZSIpO3AodGhpcywiX3ZlcnNpb24iKTtwKHRoaXMsImdldERldmljZUluZm8iLCgpPT4oe2lzTW9iaWxlOnRoaXMuaXNNb2JpbGUoKSxicm93c2VyTmFtZTp0aGlzLl9ib3dzZXIuZ2V0QnJvd3Nlck5hbWUoKSxvc05hbWU6dGhpcy5fYm93c2VyLmdldE9TTmFtZSgpLGJyb3dzZXJWZXJzaW9uOnRoaXMuX2Jvd3Nlci5nZXRCcm93c2VyVmVyc2lvbigpLG9zVmVyc2lvbk5hbWU6dGhpcy5fYm93c2VyLmdldE9TVmVyc2lvbigpLGVuZ2luZU5hbWU6dGhpcy5fYm93c2VyLmdldEVuZ2luZU5hbWUoKX0pKX1pbml0KHIpe2xldCBlLHM7aWYodGhpcy5fYm93c2VyPWlkLmdldFBhcnNlcihuYXZpZ2F0b3IudXNlckFnZW50KSx0eXBlb2Ygcj09InVuZGVmaW5lZCIpe2NvbnN0IG49bGQodGhpcy5fYm93c2VyKTtlPW4ubmFtZSxzPW4udmVyc2lvbn1lbHNlIHIubmFtZSBpbiBQdD8oZT1QdFtyLm5hbWVdLHM9ci52ZXJzaW9uKTooZT1HdCxzPXZvaWQgMCk7dGhpcy5fbmFtZT1lLHRoaXMuX3ZlcnNpb249c31nZXROYW1lKCl7cmV0dXJuIHRoaXMuX25hbWV9aXNDaHJvbWUoKXtyZXR1cm4gdGhpcy5fbmFtZT09PU5lfWlzT3BlcmEoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUJzfWlzRmlyZWZveCgpe3JldHVybiB0aGlzLl9uYW1lPT09eHN9aXNJRXhwbG9yZXIoKXtyZXR1cm4gdGhpcy5fbmFtZT09PWpzfWlzU2FmYXJpKCl7cmV0dXJuIHRoaXMuX25hbWU9PT1Vc31pc05XSlMoKXtyZXR1cm4gdGhpcy5fbmFtZT09PSRzfWlzRWxlY3Ryb24oKXtyZXR1cm4gdGhpcy5fbmFtZT09PUhzfWlzUmVhY3ROYXRpdmUoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUtzfHxuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZT09PSEwfWdldFZlcnNpb24oKXtyZXR1cm4gdGhpcy5fdmVyc2lvbn1pc01vYmlsZSgpe3JldHVybiB0aGlzLl9ib3dzZXIuZ2V0UGxhdGZvcm1UeXBlKCk9PT0ibW9iaWxlIn1fY2hlY2tDb25kaXRpb24ocil7aWYodGhpcy5fdmVyc2lvbilyZXR1cm4gdGhpcy5fYm93c2VyLnNhdGlzZmllcyhyKX1pc1ZlcnNpb25HcmVhdGVyVGhhbihyKXtyZXR1cm4gdGhpcy5fY2hlY2tDb25kaXRpb24oe1t0aGlzLl9uYW1lXTpgPiR7cn1gfSl9aXNWZXJzaW9uTGVzc1RoYW4ocil7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YDwke3J9YH0pfWlzVmVyc2lvbkVxdWFsVG8ocil7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YH4ke3J9YH0pfX1jbGFzcyBwZCBleHRlbmRzIHVke2RvZXNWaWRlb011dGVCeVN0cmVhbVJlbW92ZSgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c1AyUCgpe3JldHVybiF0aGlzLnVzZXNVbmlmaWVkUGxhbigpfWlzQ2hyb21pdW1CYXNlZCgpe3JldHVybiB0aGlzLmlzQ2hyb21lKCl8fHRoaXMuaXNFbGVjdHJvbigpfHx0aGlzLmlzTldKUygpfHx0aGlzLmlzT3BlcmEoKX1pc1dlYktpdEJhc2VkKCl7cmV0dXJuIHRoaXMuX2Jvd3Nlci5pc0VuZ2luZSgid2Via2l0IikmJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzIT0idW5kZWZpbmVkIiYmdHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhIT0idW5kZWZpbmVkIiYmdHlwZW9mIHdpbmRvdy5SVENSdHBUcmFuc2NlaXZlciE9InVuZGVmaW5lZCImJk9iamVjdC5rZXlzKFJUQ1J0cFRyYW5zY2VpdmVyLnByb3RvdHlwZSkuaW5kZXhPZigiY3VycmVudERpcmVjdGlvbiIpPi0xfWlzU3VwcG9ydGVkKCl7cmV0dXJuIHR5cGVvZiBSVENQZWVyQ29ubmVjdGlvbiE9InVuZGVmaW5lZCJ9aXNVc2VySW50ZXJhY3Rpb25SZXF1aXJlZEZvclVubXV0ZSgpe3JldHVybiB0aGlzLmlzRmlyZWZveCgpJiZ0aGlzLmlzVmVyc2lvbkxlc3NUaGFuKCI2OCIpfXN1cHBvcnRzVmlkZW9NdXRlT25Db25uSW50ZXJydXB0ZWQoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc1JlYWN0TmF0aXZlKCl8fHRoaXMuaXNXZWJLaXRCYXNlZCgpfXN1cHBvcnRzQmFuZHdpZHRoU3RhdGlzdGljcygpe3JldHVybiF0aGlzLmlzRmlyZWZveCgpJiYhdGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNDb2RlY1ByZWZlcmVuY2VzKCl7cmV0dXJuIHRoaXMudXNlc1VuaWZpZWRQbGFuKCkmJnR5cGVvZiB3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyh3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIucHJvdG90eXBlKS5pbmRleE9mKCJzZXRDb2RlY1ByZWZlcmVuY2VzIik+LTEmJk9iamVjdC5rZXlzKFJUQ1J0cFNlbmRlci5wcm90b3R5cGUpLmluZGV4T2YoImdldENhcGFiaWxpdGllcyIpPi0xJiYhdGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNEZXZpY2VDaGFuZ2VFdmVudCgpe3JldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5vbmRldmljZWNoYW5nZSE9InVuZGVmaW5lZCImJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmFkZEV2ZW50TGlzdGVuZXIhPSJ1bmRlZmluZWQifXN1cHBvcnRzTG9jYWxDYW5kaWRhdGVSdHRTdGF0aXN0aWNzKCl7cmV0dXJuIHRoaXMuaXNDaHJvbWl1bUJhc2VkKCl8fHRoaXMuaXNSZWFjdE5hdGl2ZSgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c1BlcmZvcm1hbmNlT2JzZXJ2ZXIoKXtyZXR1cm4gdHlwZW9mIHdpbmRvdy5QZXJmb3JtYW5jZU9ic2VydmVyIT0idW5kZWZpbmVkIiYmUGVyZm9ybWFuY2VPYnNlcnZlci5zdXBwb3J0ZWRFbnRyeVR5cGVzLmluZGV4T2YoImxvbmd0YXNrIik+LTF9c3VwcG9ydHNSZWNlaXZlclN0YXRzKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3cuUlRDUnRwUmVjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyhSVENSdHBSZWNlaXZlci5wcm90b3R5cGUpLmluZGV4T2YoImdldFN5bmNocm9uaXphdGlvblNvdXJjZXMiKT4tMX1zdXBwb3J0c1JUVFN0YXRpc3RpY3MoKXtyZXR1cm4hdGhpcy5pc0ZpcmVmb3goKX11c2VzUGxhbkIoKXtyZXR1cm4hdGhpcy51c2VzVW5pZmllZFBsYW4oKX11c2VzU2RwTXVuZ2luZ0ZvclNpbXVsY2FzdCgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzUmVhY3ROYXRpdmUoKXx8dGhpcy5pc1dlYktpdEJhc2VkKCl9dXNlc1VuaWZpZWRQbGFuKCl7cmV0dXJuISEodGhpcy5pc0ZpcmVmb3goKXx8dGhpcy5pc1dlYktpdEJhc2VkKCkpfXVzZXNOZXdHdW1GbG93KCl7cmV0dXJuISEodGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc0ZpcmVmb3goKXx8dGhpcy5pc1dlYktpdEJhc2VkKCkpfXVzZXNBZGFwdGVyKCl7cmV0dXJuIHRoaXMudXNlc05ld0d1bUZsb3coKX11c2VzUmlkc0ZvclNpbXVsY2FzdCgpe3JldHVybiExfXN1cHBvcnRzR2V0RGlzcGxheU1lZGlhKCl7cmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IuZ2V0RGlzcGxheU1lZGlhIT0idW5kZWZpbmVkInx8dHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXREaXNwbGF5TWVkaWEhPSJ1bmRlZmluZWQifXN1cHBvcnRzSW5zZXJ0YWJsZVN0cmVhbXMoKXtpZighKHR5cGVvZiB3aW5kb3cuUlRDUnRwU2VuZGVyIT0idW5kZWZpbmVkIiYmKHdpbmRvdy5SVENSdHBTZW5kZXIucHJvdG90eXBlLmNyZWF0ZUVuY29kZWRTdHJlYW1zfHx3aW5kb3cuUlRDUnRwU2VuZGVyLnByb3RvdHlwZS5jcmVhdGVFbmNvZGVkVmlkZW9TdHJlYW1zKSkpcmV0dXJuITE7Y29uc3Qgcj1uZXcgUmVhZGFibGVTdHJlYW07dHJ5e3JldHVybiB3aW5kb3cucG9zdE1lc3NhZ2UociwiKiIsW3JdKSwhMH1jYXRjaChlKXtyZXR1cm4hMX19c3VwcG9ydHNBdWRpb1JlZCgpe3JldHVybiBCb29sZWFuKHdpbmRvdy5SVENSdHBTZW5kZXImJndpbmRvdy5SVENSdHBTZW5kZXIuZ2V0Q2FwYWJpbGl0aWVzJiZ3aW5kb3cuUlRDUnRwU2VuZGVyLmdldENhcGFiaWxpdGllcygiYXVkaW8iKS5jb2RlY3Muc29tZShyPT5yLm1pbWVUeXBlPT09ImF1ZGlvL3JlZCIpJiZ3aW5kb3cuUlRDUnRwUmVjZWl2ZXImJndpbmRvdy5SVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMmJndpbmRvdy5SVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMoImF1ZGlvIikuY29kZWNzLnNvbWUocj0+ci5taW1lVHlwZT09PSJhdWRpby9yZWQiKSl9c3VwcG9ydHNTZHBTZW1hbnRpY3MoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKX1fZ2V0Q2hyb21pdW1CYXNlZFZlcnNpb24oKXtpZih0aGlzLmlzQ2hyb21pdW1CYXNlZCgpKXtpZih0aGlzLmlzTldKUygpKXJldHVybiBOdW1iZXIucGFyc2VJbnQocHJvY2Vzcy52ZXJzaW9ucy5jaHJvbWl1bSwxMCk7Y29uc3Qgcj1uYXZpZ2F0b3IudXNlckFnZW50O2lmKHIubWF0Y2goL0Nocm9tZS8pKXJldHVybiBOdW1iZXIucGFyc2VJbnQoci5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdLDEwKX1yZXR1cm4tMX1pc0lPU01vYmlsZSgpe3JldHVybiB0aGlzLmlzTW9iaWxlJiZ0aGlzLl9ib3dzZXIuZ2V0T1NOYW1lKCk9PT0iaU9TIn19Y29uc3QgaGQ9bmV3IHBkO2NsYXNzIGZke2NvbnN0cnVjdG9yKCl7cCh0aGlzLCJsb2dzQ2FjaGUiLFtdKTtwKHRoaXMsImxvZ3NQcm9jZXNzb3JUaW1lciIpO3AodGhpcywiY29tcHJlc3Npb25TdXBwb3J0ZWQiLG51bGwpO3AodGhpcywidHJhY2luZ0VuYWJsZWQiLCEwKTtwKHRoaXMsImluaXRpYWxpemVkIiwhMSk7cCh0aGlzLCJsb2dzUHJvY2Vzc2luZ0ludGVydmFsIiw3ZTMpO3AodGhpcywibG9nRXhjbHVzaW9uTGlzdCIsWyJtZXNzYWdlIiwid2Vic29ja2V0L21lc3NhZ2UiLCJyb29tTWVzc2FnZSIsIndlYnNvY2tldC9yb29tLW1lc3NhZ2UiLCJ3ZWJzb2NrZXQvcm9vbS1sZWdhY3ktbW9kZSIsImNoYXRNZXNzYWdlIiwid2Vic29ja2V0L25ldy1jaGF0LW1lc3NhZ2UiLCJ3ZWJzb2NrZXQvbm8tYWN0aXZlLXNwZWFrZXIiLCJ3ZWJzb2NrZXQvc2VsZWN0ZWQtcGVlcnMiLCJ3ZWJzb2NrZXQvYWN0aXZlLXNwZWFrZXIiLCJwaW5nIiwid2Vic29ja2V0L25ldy1jb25zdW1lciIsIndlYnNvY2tldC9wcm9kdWNlci1zY29yZSIsIndlYnNvY2tldC9jb25zdW1lci1zY29yZSIsIndlYnNvY2tldC9wbHVnaW4tZXZlbnQiLCJ3ZWJzb2NrZXQvcGx1Z2luLWRhdGEiLCJ3ZWJzb2NrZXQvcGx1Z2luLWludGVybmFsLWRhdGEiXSk7cCh0aGlzLCJtZWV0aW5nTWV0YWRhdGEiLHt9KX1pc0NvbXByZXNzaW9uU3VwcG9ydGVkKCl7aWYodGhpcy5jb21wcmVzc2lvblN1cHBvcnRlZD09PW51bGwpdHJ5e3RoaXMuY29tcHJlc3Npb25TdXBwb3J0ZWQ9dHlwZW9mIENvbXByZXNzaW9uU3RyZWFtIT0idW5kZWZpbmVkIiYmdHlwZW9mIEJsb2IhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgQmxvYi5wcm90b3R5cGUuc3RyZWFtPT0iZnVuY3Rpb24iJiZ0eXBlb2YgUmVzcG9uc2UhPSJ1bmRlZmluZWQifWNhdGNoKHIpe3RoaXMuY29tcHJlc3Npb25TdXBwb3J0ZWQ9ITEsdGhpcy5hZGRMb2dJbkN1cnJlbnRTcGFuKCJ3YXJuIiwiQ29tcHJlc3Npb24gZmVhdHVyZSBkZXRlY3Rpb24gZmFpbGVkLCB1c2luZyB1bmNvbXByZXNzZWQgbG9ncyIse2Vycm9yOnJ9KX1yZXR1cm4gdGhpcy5jb21wcmVzc2lvblN1cHBvcnRlZH1nZXQgbG9nc0VuZHBvaW50KCl7Y29uc3Qgcj1QZS5nZXRDb250ZXh0KHRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZCk7cmV0dXJuYGh0dHBzOi8vJHtKYyh7c2VydmljZVByZWZpeDoiYXBpLXNpbG9zIixiYXNlVVJJOnIuZ2V0VmFsdWUoImJhc2VVUkkiKX0pfS9vdGVsL2xvZ3NgfWdldCBsb2dzQmF0Y2hTaXplKCl7cmV0dXJuIHRoaXMuaXNDb21wcmVzc2lvblN1cHBvcnRlZCgpPzEwMDoyNX1yZXNldFBlZXJJZChyKXt0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQ9cn1pbml0KHIsZSxzKXt0aGlzLnRyYWNpbmdFbmFibGVkPSEwLHRoaXMuaW5pdGlhbGl6ZWQ9ITEsdGhpcy5sb2dzQ2FjaGU9W107Y29uc3Qgbj1yLmdldFZhbHVlKCJwZWVySWQiKTt0aGlzLm1lZXRpbmdNZXRhZGF0YT1lLHRoaXMudHJhY2luZ0VuYWJsZWQ9cyx0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQ9bix0aGlzLm1lZXRpbmdNZXRhZGF0YS5zZGtWZXJzaW9uPXIuZ2V0VmFsdWUoInNka1ZlcnNpb24iKTtjb25zdHtSTkRldmljZUluZm9JbXBsOml9PW5hdmlnYXRvcjt0aGlzLm1lZXRpbmdNZXRhZGF0YS5kZXZpY2VJbmZvPW5hdmlnYXRvci5pc1JlYWN0TmF0aXZlP2k9PW51bGw/dm9pZCAwOmkuZ2V0RGV2aWNlSW5mbygpOmhkLmdldERldmljZUluZm8oKSx0aGlzLm1lZXRpbmdNZXRhZGF0YS52aXNpdGVkVXJsPSFuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZSYmdHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvdy5sb2NhdGlvbi5ocmVmLHRoaXMubG9nc1Byb2Nlc3NvclRpbWVyPXNldEludGVydmFsKCgpPT50aGlzLnByb2Nlc3NDYWNoZWRMb2dzKCkuY2F0Y2goKCk9Pnt9KSx0aGlzLmxvZ3NQcm9jZXNzaW5nSW50ZXJ2YWwpLHMmJih0aGlzLmluaXRpYWxpemVkPSEwKX1zdGF0aWMgdHJhY2UocixlPXZvaWQgMCl7cmV0dXJuKHMsbixpKT0+e2NvbnN0IGE9aS52YWx1ZTtyZXR1cm4gaS52YWx1ZT1mdW5jdGlvbiguLi5vKXt2YXIgRTtjb25zdCBsPXRoaXM9PW51bGw/dm9pZCAwOnRoaXMudGVsZW1ldHJ5O2lmKCFsfHwhbC5pbml0aWFsaXplZHx8bmF2aWdhdG9yLmlzUmVhY3ROYXRpdmV8fCFsLnRyYWNpbmdFbmFibGVkfHwoRT1QZS5nZXRDb250ZXh0KGwubWVldGluZ01ldGFkYXRhLnBlZXJJZCkpIT1udWxsJiZFLmdldFZhbHVlKCJmbGFnc21pdGgiKS5oYXNGZWF0dXJlKFd0LlNLSVBfT1RFTF9UUkFDRVMpKXJldHVybiBhLmFwcGx5KHRoaXMsbyk7bC5hZGRMb2dJbkN1cnJlbnRTcGFuKCJpbmZvIixyLGUpO2NvbnN0IGY9cGVyZm9ybWFuY2Uubm93KCkseT1hLmFwcGx5KHRoaXMsbyk7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh5KS50aGVuKCgpPT57Y29uc3Qgdz1wZXJmb3JtYW5jZS5ub3coKTt3LWY+MTAmJmwuYWRkTG9nSW5DdXJyZW50U3BhbigiaW5mbyIsYCR7cn1fdGltaW5nYCx7ZXhlY1RpbWU6dy1mfSl9KS5jYXRjaCgoKT0+e2NvbnN0IHc9cGVyZm9ybWFuY2Uubm93KCk7bC5hZGRMb2dJbkN1cnJlbnRTcGFuKCJpbmZvIixgJHtyfV90aW1pbmdgLHtleGVjVGltZTp3LWZ9KX0pLHl9LGl9fWluamVjdENvbnRleHQocil7dmFyIG47Y29uc3QgZT16YygpLnJlcGxhY2UoLy0vZywiIikuc3Vic3RyaW5nKDAsMTYpLHM9KG49dGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKT09bnVsbD92b2lkIDA6bi5yZXBsYWNlKC8tL2csIiIpO3IuVFJBQ0VQQVJFTlQ9YDAwLSR7c30tJHtlfS0wMWB9YWRkTG9nSW5DdXJyZW50U3BhbihyLGUscz17fSxuPSExKXtzIT1udWxsJiZzLmVycm9yJiZPYmplY3QuYXNzaWduKHMse2Vycm9yOlJ0KHMuZXJyb3IpfSk7Y29uc3QgaT1QZS5nZXRDb250ZXh0KHRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZCk7aWYoTHMoaSkmJihRYyhzKT9jb25zb2xlW3JdKCJJbnRlcm5hbExvZ3M6OiAiLHIsZSk6Y29uc29sZVtyXSgiSW50ZXJuYWxMb2dzOjogIixyLGUscykpLCEhWmMoaSxyKSl0cnl7Y29uc3QgZD1OcyhpLGUscywibWV0YWRhdGEiKSxvPW5ldyBEYXRlLGw9b3QoUSh7bWVzc2FnZTplLGxldmVsOnJ9LGQpLHtsb2dnZWRBdDpvLnRvSVNPU3RyaW5nKCksbG9nZ2VkQXRUek9mZnNldDpvLmdldFRpbWV6b25lT2Zmc2V0KCl9KTtuP3RoaXMuc2VuZE90ZWxMb2dzVG9OZXdSZWxpYyhbbF0se2lzSW5EZXN0cnVjdGlvbk1vZGU6ITF9KS5jYXRjaCgoKT0+e30pOnRoaXMubG9nc0NhY2hlLnB1c2gobCl9Y2F0Y2goZCl7dGhpcy5hZGRMb2dJbkN1cnJlbnRTcGFuKCJlcnJvciIsIm9wZW50ZWxlbWV0cnk6OmFkZExvZ0luQ3VycmVudFNwYW5fZmFpbGVkIix7ZXJyb3I6UnQoZCl9KX19c2VuZE90ZWxMb2dzVG9OZXdSZWxpYyhzKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbioocix7aXNJbkRlc3RydWN0aW9uTW9kZTplPSExfT17aXNJbkRlc3RydWN0aW9uTW9kZTohMX0pe2NvbnN0IG49bmV3IEFib3J0Q29udHJvbGxlcixpPXNldFRpbWVvdXQoKCk9Pm4uYWJvcnQoIkxvZ3MgcmVxdWVzdCB0aW1lZCBvdXQgYWZ0ZXIgOCBzZWNvbmRzIiksOGUzKTt0cnl7Y29uc3QgYT1QZS5nZXRDb250ZXh0KHRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZCksZD1KU09OLnN0cmluZ2lmeSh7bWVldGluZ01ldGFkYXRhOk5zKGEsInNlbmRPdGVsTG9nc1RvTmV3UmVsaWMiLHRoaXMubWVldGluZ01ldGFkYXRhLCJtZWV0aW5nTWV0YWRhdGEiKSxzZXJ2aWNlTmFtZTphLmdldFZhbHVlKCJzZGtOYW1lIiksbG9nczpyfSk7bGV0IG87Y29uc3QgbD17QXV0aG9yaXphdGlvbjpgQmVhcmVyICR7YS5nZXRWYWx1ZSgiYXV0aFRva2VuIil9YH07aWYodGhpcy5pc0NvbXByZXNzaW9uU3VwcG9ydGVkKCkpe2NvbnN0IGY9bmV3IEJsb2IoW2RdKS5zdHJlYW0oKS5waXBlVGhyb3VnaChuZXcgQ29tcHJlc3Npb25TdHJlYW0oImd6aXAiKSk7bz15aWVsZCBuZXcgUmVzcG9uc2UoZikuYXJyYXlCdWZmZXIoKSxsWyJDb250ZW50LVR5cGUiXT0iYXBwbGljYXRpb24vZ3ppcCIsbFsiQ29udGVudC1FbmNvZGluZyJdPSJnemlwIn1lbHNlIG89ZCxsWyJDb250ZW50LVR5cGUiXT0iYXBwbGljYXRpb24vanNvbiI7eWllbGQgZmV0Y2godGhpcy5sb2dzRW5kcG9pbnQse21ldGhvZDoiUE9TVCIsaGVhZGVyczpsLGJvZHk6byxzaWduYWw6bi5zaWduYWwsa2VlcGFsaXZlOiEhZX0pfWNhdGNoKGEpe2V8fCh0aGlzLmFkZExvZ0luQ3VycmVudFNwYW4oImVycm9yIiwib3BlbnRlbGVtZXRyeTo6c2VuZE90ZWxMb2dUb05ld1JlbGljX2ZhaWxlZCIse2Vycm9yOlJ0KGEpfSksdGhpcy5sb2dzQ2FjaGUucHVzaCguLi5yKSl9ZmluYWxseXtjbGVhclRpbWVvdXQoaSl9fSl9cHJvY2Vzc0NhY2hlZExvZ3MoKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe2lzSW5EZXN0cnVjdGlvbk1vZGU6cj0hMX09e2lzSW5EZXN0cnVjdGlvbk1vZGU6ITF9KXtjb25zdCBlPXRoaXMubG9nc0NhY2hlLnNwbGljZSgwLHRoaXMubG9nc0JhdGNoU2l6ZSk7ZSE9bnVsbCYmZS5sZW5ndGgmJih5aWVsZCB0aGlzLnNlbmRPdGVsTG9nc1RvTmV3UmVsaWMoZSx7aXNJbkRlc3RydWN0aW9uTW9kZTpyfSkpfSl9ZGVzdHJ1Y3QoKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Zm9yKGNsZWFySW50ZXJ2YWwodGhpcy5sb2dzUHJvY2Vzc29yVGltZXIpO3RoaXMubG9nc0NhY2hlLmxlbmd0aDspeWllbGQgdGhpcy5wcm9jZXNzQ2FjaGVkTG9ncyh7aXNJbkRlc3RydWN0aW9uTW9kZTohMH0pfSl9fWZ1bmN0aW9uIG1kKHQpe2NvbnN0IHI9USh7fSx0KSxlPW5ldyBNYXAscz0obCxmKT0+KGUuaGFzKGwpfHxlLnNldChsLG5ldyBTZXQpLGUuZ2V0KGwpLmFkZChmKSwoKT0+e3ZhciB5O3JldHVybih5PWUuZ2V0KGwpKT09bnVsbD92b2lkIDA6eS5kZWxldGUoZil9KSxuPShsLGYpPT57dmFyIHk7KHk9ZS5nZXQobCkpPT1udWxsfHx5LmRlbGV0ZShmKX0saT1sPT57dmFyIGY7KGY9ZS5nZXQobCkpPT1udWxsfHxmLmZvckVhY2goeT0+e3RyeXt5KHJbbF0pfWNhdGNoKEUpe319KX07cmV0dXJue3N1YnNjcmliZTpzLHVuc3Vic2NyaWJlOm4sbm90aWZ5Omksc2V0VmFsdWU6KGwsZix5PSEwKT0+e3JbbF09Zix5JiZpKGwpfSxnZXRWYWx1ZTpsPT5yW2xdLGdldEFsbFZhbHVlczooKT0+cn19Y2xhc3MgZ2R7Y29uc3RydWN0b3IoKXtwKHRoaXMsImNvbnRleHRzIixuZXcgTWFwKTtwKHRoaXMsIm1vc3RSZWNlbnRQZWVySWQiLG51bGwpfWNyZWF0ZUNvbnRleHQocixlKXtpZih0aGlzLmNvbnRleHRzLmhhcyhyKSlyZXR1cm4gdGhpcy5jb250ZXh0cy5nZXQocik7Y29uc3Qgcz1uZXcgZmQsbj1uZXcgeGM7dGhpcy5jb250ZXh0cy5zZXQocixtZChlKSksdGhpcy5jb250ZXh0cy5nZXQocikuc2V0VmFsdWUoInBlZXJTZXNzaW9uU3RvcmUiLG5ldyBLdChuKSk7Y29uc3QgaT1uZXcgTnI7cmV0dXJuIGkuc2V0TWF4TGlzdGVuZXJzKDUwKSx0aGlzLmNvbnRleHRzLmdldChyKS5zZXRWYWx1ZSgibG9nZ2VyIixuKSx0aGlzLmNvbnRleHRzLmdldChyKS5zZXRWYWx1ZSgidGVsZW1ldHJ5IixzKSx0aGlzLmNvbnRleHRzLmdldChyKS5zZXRWYWx1ZSgiY2FsbHN0YXRzIixpKSx0aGlzLmNvbnRleHRzLmdldChyKS5zZXRWYWx1ZSgiZmxhZ3NtaXRoIixBYygpKSx0aGlzLm1vc3RSZWNlbnRQZWVySWQ9cix0aGlzLmNvbnRleHRzLmdldChyKX1yZW1hcENvbnRleHQocixlKXtjb25zdCBzPWUuZ2V0VmFsdWUoInBlZXJJZCIpO3MhPT1yJiYoZS5zZXRWYWx1ZSgicGVlcklkIixyKSx0aGlzLm1vc3RSZWNlbnRQZWVySWQ9cix0aGlzLmNvbnRleHRzLnNldChyLGUpLHRoaXMuY29udGV4dHMuZGVsZXRlKHMpKX1nZXRDb250ZXh0KHIpe3JldHVybiB0aGlzLmNvbnRleHRzLmdldChyKX1nZXRNb3N0UmVjZW50UGVlcklkKCl7cmV0dXJuIHRoaXMubW9zdFJlY2VudFBlZXJJZH19dmFyIFBlPW5ldyBnZDtjb25zdCBTZD17IjAwIjoiQ2xpZW50IiwiMDEiOiJDb250cm9sbGVyIiwiMDIiOiJSb29tTm9kZUNsaWVudCIsIjAzIjoiSGl2ZU5vZGVDbGllbnQiLCIwNCI6IlNvY2tldFNlcnZpY2UiLCIwNSI6IkNoYXQiLCIwNiI6IlBsdWdpbiIsIjA3IjoiUG9sbHMiLCIwOCI6Ik1ldGEiLCIwOSI6IlByZXNldCIsMTA6IlJlY29yZGluZyIsMTE6IlNlbGYiLDEyOiJQYXJ0aWNpcGFudCIsMTM6IlNwb3RsaWdodCIsMTQ6IlJlbW90ZSBSZXF1ZXN0IiwxNToiV2ViaW5hciIsMTY6IkxvY2FsTWVkaWFIYW5kbGVyIiwxNzoiRW5kLUVuZCBFbmNyeXB0aW9uIiwxODoiQUkiLDE5OiJMaXZlc3RyZWFtIiwyMDoiU3RhZ2UifSxDdD17IjAwMDAiOiJJbnRlcm5hbCBleGNlcHRpb24uIiwiMDAwMSI6IkZhaWxlZCB0byBpbml0aWFsaXplLiIsIjAwMDIiOiJGYWlsZWQgdG8gam9pbiByb29tLiIsIjAwMDMiOiJGYWlsZWQgdG8gbGVhdmUgcm9vbS4iLCIwMDA0IjoiSW52YWxpZCBhdXRoIHRva2VuIiwiMDAxMCI6IkJyb3dzZXIgbm90IHN1cHBvcnRlZCIsIjAwMTEiOiJIVFRQIE5ldHdvcmsgRXJyb3IiLCIwMDEyIjoiV2Vic29ja2V0IE5ldHdvcmsgRXJyb3IiLCIwMDEzIjoiUmF0ZSBMaW1pdGVkIiwiMDEwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjAxMDEiOiJQZXJtaXNzaW9uIGRlbmllZCIsIjAxMDIiOiJQcmVyZXF1aXNpdGUgbW9kdWxlIG1pc3NpbmciLCIwMjAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uLiIsIjAzMDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNDAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDQwNCI6Ik1pc3NpbmcgcHJlcmVxdWlzaXRlcyB0byBlc3RhYmxpc2ggYSB3ZWJzb2NrZXQgY29ubmVjdGlvbiIsIjA1MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNTAxIjoiUGVybWlzc2lvbiBkZW5pZWQuIiwiMDUwMiI6IkludmFsaWQgbWVzc2FnZSBib2R5LiIsIjA1MDMiOiJUZXh0IE1lc3NhZ2UgaXMgdG9vIGxhcmdlIiwiMDUwNCI6Ik1lc3NhZ2Ugbm90IGZvdW5kIGJ5IHRoZSBnaXZlbiBpZCIsIjA1MDUiOiJBY3Rpb24gbm90IHBlcm1pdHRlZCB3aXRob3V0IGpvaW5pbmcgcm9vbSIsIjA1MDYiOiJNZXNzYWdlIHNlYXJjaCBpcyBkaXNhYmxlZCIsIjA2MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNjAxIjoiUGVybWlzc2lvbiBkZW5pZWQuIiwiMDYwMiI6IkF1dGggdG9rZW4gbm90IHNldCBmb3IgcGx1Z2luIiwiMDYwMyI6IklmcmFtZSB3YXMgbm90IHByb3ZpZGVkIiwiMDcwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA3MDUiOiJBY3Rpb24gbm90IHBlcm1pdHRlZCB3aXRob3V0IGpvaW5pbmcgcm9vbSIsIjA4MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwODAxIjoiUGVybWlzc2lvbiBkZW5pZWQiLCIwOTAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDkwNCI6IkNvdWxkIG5vdCBsb2FkIHByZXNldCIsMWUzOiJJbnRlcm5hbCBleGNlcHRpb24iLDEwMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwxMDA0OiJDb3VsZCBub3QgZmluZCBzcGVjaWZpZWQgcmVjb3JkaW5nIiwxMDA1OiJBY3Rpb24gbm90IHBlcm1pdHRlZCBpbiBnaXZlbiByZWNvcmRpbmcgc3RhdGUiLDExMDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTEwMToiUGVybWlzc2lvbiBkZW5pZWQiLDExMDI6IlVuc3VwcG9ydGVkIiwxMTAzOiJOYW1lIGNhbm5vdCBiZSBlbXB0eSIsMTEwNDoiTm8gZGV2aWNlIHNlbGVjdGVkIHdoaWxlIGNhbGxpbmcgbWVldGluZy5zZWxmLnNldERldmljZSIsMTEwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLDExMDY6IkNhbid0IHNldCBjdXJyZW50bHkgdXNlZCBkZXZpY2UiLDEyMDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTIwMToiUGVybWlzc2lvbiBkZW5pZWQiLDEyMDI6IkludmFsaWQgcGFnZSBudW1iZXIgd2FzIHJlcXVlc3RlZCIsMTIwMzoiSW52YWxpZCBwYXJ0aWNpcGFudCBjb3VudCBwZXIgcGFnZSB3YXMgcmVxdWVzdGVkIiwxMjA0OiJObyBwYXJ0aWNpcGFudHMgZXhpc3RzIHdpdGggdGhlIGdpdmVuIFVzZXJJZHMiLDEyMDU6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwxMjA2OiJNYW51YWwgU3Vic2NyaXB0aW9uIE1vZGUgd2FzIG5vdCBBQ1RJVkFURUQiLDEyMDc6IkludmFsaWQgdmlldyBtb2RlIiwxMjA4OiJNYW51YWwgU3Vic2NyaXB0aW9uIG5vdCBlbmFibGVkIGZvciBvcmdhbml6YXRpb24iLDEyMDk6IkJyb2FkY2FzdCBtZXNzYWdlIHR5cGUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmciLDEzMDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTQwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxNDAyOiJObyBleGlzdGluZyByZW1vdGUgcmVxdWVzdHMiLDE0MDM6Ik5vIHBlZXIgZXhpc3RzIHdpdGggZ2l2ZW4gaWQiLDE1MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTYwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxNjAxOiJGYWlsZWQgdG8gZ2V0IGF1ZGlvIHRyYWNrIiwxNjAyOiJGYWlsZWQgdG8gZ2V0IHZpZGVvIHRyYWNrIiwxNjAzOiJJbmNvcnJlY3QgZGV2aWNlIiwxNjA0OiJGYWlsZWQgdG8gY2hhbmdlIGRldmljZSIsMTYwNToiRmFpbGVkIHRvIGdldCBhdWRpbyAmIHZpZGVvIHRyYWNrIiwxNjA2OiJObyBhdWRpbyBpbnB1dCBkZXZpY2VzIGFyZSBhdmFpbGFibGUiLDE2MDc6Ik5vIHZpZGVvIGlucHV0IGRldmljZXMgYXJlIGF2YWlsYWJsZSIsMTYwODoiTm8gYXVkaW8gb3V0cHV0IGRldmljZXMgKHNwZWFrZXJzKSBhcmUgYXZhaWxhYmxlIiwxNjA5OiJGYWlsZWQgdG8gZmV0Y2ggbGlzdCBvZiBtZWRpYSBkZXZpY2VzIiwxNjEwOiJObyBtZWRpYSB0cmFjayBleGlzdHMiLDE2MTE6IkZhaWxlZCB0byB1bm11dGUgdHJhY2siLDE2MTI6IkZhaWxlZCB0byBnZXQgc2NyZWVuc2hhcmUgdHJhY2tzIiwxNzAxOiJDcnlwdG8gZXJyb3IiLDE4MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTgwMToiQ2FuJ3QgZmV0Y2ggdHJhbnNjcmlwdCBmaWxlIiwxOTAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE5MDE6IlBlcm1pc3Npb24gZGVuaWVkLiIsMTkwMjoiTGl2ZXN0cmVhbSB0aGF0IGhhcyBub3QgeWV0IHN0YXJ0ZWQsIGNhbid0IGJlIHN0b3BwZWQiLDJlMzoiSW50ZXJuYWwgZXhjZXB0aW9uIiwyMDAxOiJQZXJtaXNzaW9uIGRlbmllZCIsMjAwMjoiVW5zdXBwb3J0ZWQiLDIwMDM6IlN0YWdlIGlzIGRpc2FibGVkIiwyMDA0OiJNZXRob2Qgbm90IGltcGxlbWVudGVkIiwyMDA1OiJBY3Rpb24gbm90IHBlcm1pdHRlZCB3aXRob3V0IGpvaW5pbmcgcm9vbSIsMjAwNjoiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgaW4gY3VycmVudCBzdGFnZSBzdGF0dXMiLDk5MDA6IkludGVybmFsIGV4Y2VwdGlvbiJ9O09iamVjdC5rZXlzKEN0KS5mb3JFYWNoKHQ9PntDdFt0XT1geyR7U2RbdC5zbGljZSgwLDIpXX19ICR7Q3RbdF19YH0pO2NsYXNzIHlkIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSxzLG49dm9pZCAwLGk9ITEpe3N1cGVyKGUpO3AodGhpcywiY29kZSIpO3RoaXMuY29kZT1zLHRoaXMubmFtZT0iQ2xpZW50RXJyb3IiO2NvbnN0IGE9dGhpcy5jb2RlP2BbRVJSJHt0aGlzLmNvZGV9XWA6IltFUlJdIixkPXRoaXMuY29kZT9DdFt0aGlzLmNvZGVdOiIiO3RoaXMubWVzc2FnZT1gJHthfTogJHtkfQoke3RoaXMubWVzc2FnZX1gO3RyeXtsZXQgbz1pJiYhIW47cyYmcy5lbmRzV2l0aCgiMDAiKSYmbiYmKG89ITApLG8mJm4uZXJyb3IoIkNsaWVudEVycm9yIix7ZXJyb3I6e21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGNvZGU6c319KTtjb25zdCBsPVBlLmdldENvbnRleHQoUGUuZ2V0TW9zdFJlY2VudFBlZXJJZCgpKTtpZihsKXtjb25zdCBmPWwuZ2V0VmFsdWUoIm9uRXJyb3IiKTt0cnl7Zih0aGlzKX1jYXRjaCh5KXt9fXR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiZ3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIkNsaWVudEVycm9yIix7ZGV0YWlsOnRoaXN9KSl9Y2F0Y2gobyl7fX19dmFyIGZlPSh0PT4odFt0LkludmFsaWRLZXk9MF09IkludmFsaWRLZXkiLHRbdC5NaXNzaW5nS2V5PTFdPSJNaXNzaW5nS2V5Iix0W3QuSW50ZXJuYWxFcnJvcj0yXT0iSW50ZXJuYWxFcnJvciIsdCkpKGZlfHx7fSk7Y2xhc3MgbWUgZXh0ZW5kcyB5ZHtjb25zdHJ1Y3RvcihlLHM9Mil7c3VwZXIoZSwiMTcwMSIpO3AodGhpcywicmVhc29uIik7dGhpcy5yZWFzb249c319Y2xhc3MgenMgZXh0ZW5kcyBxLkV2ZW50RW1pdHRlcntjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3AodGhpcywibG9nZ2VyIik7dGhpcy5sb2dnZXI9ZSxzdXBlci5zZXRNYXhMaXN0ZW5lcnMoMjUpfWVtaXQoZSwuLi5zKXtyZXR1cm4gc3VwZXIuZW1pdCgiKiIsZSwuLi5zKSxzdXBlci5lbWl0KGUsLi4ucyl9b24oZSxzKXt2YXIgbjt0cnl7Y29uc3QgaT10aGlzLmxpc3RlbmVyQ291bnQoZSk7aT4yNSYmaSUyNT09PTAmJigobj10aGlzLmxvZ2dlcik9PW51bGx8fG4ud2FybigiQ3VzdG9tRXZlbnRFbWl0dGVyOjptYXhMaXN0ZW5lcnNFeGNlZWRlZCIse2V2ZW50TGlzdGVuZXI6e2V2ZW50TmFtZTplLnRvU3RyaW5nKCksbGlzdGVuZXJDb3VudDp0aGlzLmxpc3RlbmVyQ291bnQoZSl9fSkpfWNhdGNoKGkpe31yZXR1cm4gc3VwZXIub24oZSxzKX1hZGRMaXN0ZW5lcihlLHMpe3ZhciBuO3RyeXtjb25zdCBpPXRoaXMubGlzdGVuZXJDb3VudChlKTtpPjI1JiZpJTI1PT09MCYmKChuPXRoaXMubG9nZ2VyKT09bnVsbHx8bi53YXJuKCJDdXN0b21FdmVudEVtaXR0ZXI6Om1heExpc3RlbmVyc0V4Y2VlZGVkIix7ZXZlbnRMaXN0ZW5lcjp7ZXZlbnROYW1lOmUudG9TdHJpbmcoKSxsaXN0ZW5lckNvdW50OnRoaXMubGlzdGVuZXJDb3VudChlKX19KSl9Y2F0Y2goaSl7fXJldHVybiBzdXBlci5hZGRMaXN0ZW5lcihlLHMpfW9mZihlLHMpe3JldHVybiBzdXBlci5vZmYoZSxzKX1vbmNlKGUscyl7cmV0dXJuIHN1cGVyLm9uY2UoZSxzKX1wcmVwZW5kTGlzdGVuZXIoZSxzKXtyZXR1cm4gc3VwZXIucHJlcGVuZExpc3RlbmVyKGUscyl9cHJlcGVuZE9uY2VMaXN0ZW5lcihlLHMpe3JldHVybiBzdXBlci5wcmVwZW5kT25jZUxpc3RlbmVyKGUscyl9cmVtb3ZlTGlzdGVuZXIoZSxzKXtyZXR1cm4gc3VwZXIucmVtb3ZlTGlzdGVuZXIoZSxzKX1yZW1vdmVBbGxMaXN0ZW5lcnMoZSl7cmV0dXJuIHN1cGVyLnJlbW92ZUFsbExpc3RlbmVycyhlKX1saXN0ZW5lcnMoZSl7cmV0dXJuIHN1cGVyLmxpc3RlbmVycyhlKX1saXN0ZW5lckNvdW50KGUpe3JldHVybiBzdXBlci5saXN0ZW5lckNvdW50KGUpfX1jb25zdCBxdD17RXJyb3I6ImNyeXB0b3JFcnJvciJ9O2Z1bmN0aW9uIHZkKHQpe3JldHVybiJ0eXBlImluIHR9ZnVuY3Rpb24gYmQocyl7cmV0dXJuIEkodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKHQscj17bmFtZTprfSxlPSJlbmNyeXB0Iil7cmV0dXJuIGNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCJyYXciLHQsciwhMSxlPT09ImRlcml2ZSI/WyJkZXJpdmVCaXRzIiwiZGVyaXZlS2V5Il06WyJlbmNyeXB0IiwiZGVjcnlwdCJdKX0pfWZ1bmN0aW9uIFdzKHQscil7Y29uc3Qgcz1uZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUocik7c3dpdGNoKHQpe2Nhc2UiSEtERiI6cmV0dXJue25hbWU6IkhLREYiLHNhbHQ6cyxoYXNoOiJTSEEtMjU2IixpbmZvOm5ldyBBcnJheUJ1ZmZlcigxMjgpfTtjYXNlIlBCS0RGMiI6cmV0dXJue25hbWU6IlBCS0RGMiIsc2FsdDpzLGhhc2g6IlNIQS0yNTYiLGl0ZXJhdGlvbnM6MWU1fTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgYWxnb3JpdGhtICR7dH0gaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkYCl9fWZ1bmN0aW9uIEdzKHQscil7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IGU9V3ModC5hbGdvcml0aG0ubmFtZSxyKSxzPXlpZWxkIGNyeXB0by5zdWJ0bGUuZGVyaXZlS2V5KGUsdCx7bmFtZTprLGxlbmd0aDoxMjh9LCExLFsiZW5jcnlwdCIsImRlY3J5cHQiXSk7cmV0dXJue21hdGVyaWFsOnQsZW5jcnlwdGlvbktleTpzfX0pfWZ1bmN0aW9uIEVkKHQscil7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IGU9V3ModC5hbGdvcml0aG0ubmFtZSxyKTtyZXR1cm4gY3J5cHRvLnN1YnRsZS5kZXJpdmVCaXRzKGUsdCwyNTYpfSl9Y2xhc3MgVGQgZXh0ZW5kcyB6c3t9Y2xhc3MgcXMgZXh0ZW5kcyBUZHtjb25zdHJ1Y3RvcihlKXt2YXIgcztzdXBlcih2b2lkIDApO3AodGhpcywic2VuZENvdW50cyIpO3AodGhpcywiaXNLZXlJbnZhbGlkIiwhMSk7cCh0aGlzLCJwYXJ0aWNpcGFudElkIik7cCh0aGlzLCJ0cmFja0lkIik7cCh0aGlzLCJrZXlzIik7cCh0aGlzLCJ2aWRlb0NvZGVjIik7cCh0aGlzLCJydHBNYXAiKTtwKHRoaXMsImtleVByb3ZpZGVyT3B0aW9ucyIpO3AodGhpcywidW5lbmNyeXB0ZWRGcmFtZUJ5dGVUcmFpbGVyIik7dGhpcy5zZW5kQ291bnRzPW5ldyBNYXAsdGhpcy5rZXlzPWUua2V5cyx0aGlzLnBhcnRpY2lwYW50SWQ9ZS5wYXJ0aWNpcGFudElkLHRoaXMucnRwTWFwPW5ldyBNYXAsdGhpcy5rZXlQcm92aWRlck9wdGlvbnM9ZS5rZXlQcm92aWRlck9wdGlvbnMsdGhpcy51bmVuY3J5cHRlZEZyYW1lQnl0ZVRyYWlsZXI9KHM9ZS51bmVuY3J5cHRlZEZyYW1lQnl0ZXMpIT1udWxsP3M6bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKCJMS1JPQ0tTIil9c2V0UGFydGljaXBhbnQoZSxzKXt0aGlzLnBhcnRpY2lwYW50SWQ9ZSx0aGlzLmtleXM9c311bnNldFBhcnRpY2lwYW50KCl7dGhpcy5wYXJ0aWNpcGFudElkPXZvaWQgMH1nZXRQYXJ0aWNpcGFudElkKCl7cmV0dXJuIHRoaXMucGFydGljaXBhbnRJZH1nZXRUcmFja0lkKCl7cmV0dXJuIHRoaXMudHJhY2tJZH1zZXRWaWRlb0NvZGVjKGUpe3RoaXMudmlkZW9Db2RlYz1lfXNldFJ0cE1hcChlKXt0aGlzLnJ0cE1hcD1lfXNldHVwVHJhbnNmb3JtKGUscyxuLGksYSl7YSYmKHRoaXMudmlkZW9Db2RlYz1hKTtjb25zdCBkPWU9PT0iZW5jb2RlIj90aGlzLmVuY29kZUZ1bmN0aW9uOnRoaXMuZGVjb2RlRnVuY3Rpb24sbz1uZXcgVHJhbnNmb3JtU3RyZWFtKHt0cmFuc2Zvcm06ZC5iaW5kKHRoaXMpfSk7cy5waXBlVGhyb3VnaChvKS5waXBlVG8obikuY2F0Y2gobD0+e3RoaXMuZW1pdCgiY3J5cHRvckVycm9yIixsIGluc3RhbmNlb2YgbWU/bDpuZXcgbWUobC5tZXNzYWdlKSl9KSx0aGlzLnRyYWNrSWQ9aX1lbmNvZGVGdW5jdGlvbihlLHMpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgYTtpZighdGhpcy5rZXlzLmlzRW5hYmxlZCgpfHxlLmRhdGEuYnl0ZUxlbmd0aD09PTApcmV0dXJuIHMuZW5xdWV1ZShlKTtjb25zdHtlbmNyeXB0aW9uS2V5Om59PXRoaXMua2V5cy5nZXRLZXlTZXQoKSxpPXRoaXMua2V5cy5nZXRDdXJyZW50S2V5SW5kZXgoKTtpZihuKXtjb25zdCBkPXRoaXMubWFrZUlWKChhPWUuZ2V0TWV0YWRhdGEoKS5zeW5jaHJvbml6YXRpb25Tb3VyY2UpIT1udWxsP2E6LTEsZS50aW1lc3RhbXApLG89bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsdGhpcy5nZXRVbmVuY3J5cHRlZEJ5dGVzKGUpKSxsPW5ldyBVaW50OEFycmF5KDIpO2xbMF09ZGUsbFsxXT1pO3RyeXtjb25zdCBmPXlpZWxkIGNyeXB0by5zdWJ0bGUuZW5jcnlwdCh7bmFtZTprLGl2OmQsYWRkaXRpb25hbERhdGE6bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsby5ieXRlTGVuZ3RoKX0sbixuZXcgVWludDhBcnJheShlLmRhdGEsdGhpcy5nZXRVbmVuY3J5cHRlZEJ5dGVzKGUpKSkseT1uZXcgQXJyYXlCdWZmZXIoby5ieXRlTGVuZ3RoK2YuYnl0ZUxlbmd0aCtkLmJ5dGVMZW5ndGgrbC5ieXRlTGVuZ3RoKSxFPW5ldyBVaW50OEFycmF5KHkpO3JldHVybiBFLnNldChvKSxFLnNldChuZXcgVWludDhBcnJheShmKSxvLmJ5dGVMZW5ndGgpLEUuc2V0KG5ldyBVaW50OEFycmF5KGQpLG8uYnl0ZUxlbmd0aCtmLmJ5dGVMZW5ndGgpLEUuc2V0KGwsby5ieXRlTGVuZ3RoK2YuYnl0ZUxlbmd0aCtkLmJ5dGVMZW5ndGgpLGUuZGF0YT15LHMuZW5xdWV1ZShlKX1jYXRjaChmKXt9fWVsc2UgdGhpcy5lbWl0KHF0LkVycm9yLG5ldyBtZSgiZW5jcnlwdGlvbiBrZXkgbWlzc2luZyBmb3IgZW5jb2RpbmciLGZlLk1pc3NpbmdLZXkpKX0pfWRlY29kZUZ1bmN0aW9uKGUscyl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2lmKCF0aGlzLmtleXMuaXNFbmFibGVkKCl8fGUuZGF0YS5ieXRlTGVuZ3RoPT09MHx8X2QoZS5kYXRhLHRoaXMudW5lbmNyeXB0ZWRGcmFtZUJ5dGVUcmFpbGVyKSlyZXR1cm4gcy5lbnF1ZXVlKGUpO2NvbnN0IGk9bmV3IFVpbnQ4QXJyYXkoZS5kYXRhKVtlLmRhdGEuYnl0ZUxlbmd0aC0xXTtpZih0aGlzLmtleXMuZ2V0S2V5U2V0KGkpKXRyeXtjb25zdCBhPXlpZWxkIHRoaXMuZGVjcnlwdEZyYW1lKGUsaSk7aWYoYSlyZXR1cm4gcy5lbnF1ZXVlKGEpO3RoaXMuaXNLZXlJbnZhbGlkPSExfWNhdGNoKGEpe2EgaW5zdGFuY2VvZiBtZSYmYS5yZWFzb249PT1mZS5JbnZhbGlkS2V5JiYodGhpcy5pc0tleUludmFsaWR8fCh0aGlzLmVtaXQocXQuRXJyb3IsbmV3IG1lKGBpbnZhbGlkIGtleSBmb3IgcGFydGljaXBhbnQgJHt0aGlzLnBhcnRpY2lwYW50SWR9YCxmZS5JbnZhbGlkS2V5KSksdGhpcy5pc0tleUludmFsaWQ9ITApKX1lbHNlIHRoaXMuZW1pdChxdC5FcnJvcixuZXcgbWUoYGtleSBtaXNzaW5nIGZvciBwYXJ0aWNpcGFudCAke3RoaXMucGFydGljaXBhbnRJZH1gLGZlLk1pc3NpbmdLZXkpKTtyZXR1cm4gcy5lbnF1ZXVlKGUpfSl9ZGVjcnlwdEZyYW1lKGEsZCl7cmV0dXJuIEkodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKGUscyxuPXZvaWQgMCxpPXtyYXRjaGV0Q291bnQ6MH0pe3ZhciBsO2NvbnN0IG89dGhpcy5rZXlzLmdldEtleVNldChzKTt0cnl7Y29uc3QgZj1uZXcgVWludDhBcnJheShlLmRhdGEsMCx0aGlzLmdldFVuZW5jcnlwdGVkQnl0ZXMoZSkpLHk9bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLGUuZGF0YS5ieXRlTGVuZ3RoLTIsMiksRT15WzBdLHc9bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLGUuZGF0YS5ieXRlTGVuZ3RoLUUteS5ieXRlTGVuZ3RoLEUpLHg9Zi5ieXRlTGVuZ3RoLFU9ZS5kYXRhLmJ5dGVMZW5ndGgtKGYuYnl0ZUxlbmd0aCtFK3kuYnl0ZUxlbmd0aCksTD15aWVsZCBjcnlwdG8uc3VidGxlLmRlY3J5cHQoe25hbWU6ayxpdjp3LGFkZGl0aW9uYWxEYXRhOm5ldyBVaW50OEFycmF5KGUuZGF0YSwwLGYuYnl0ZUxlbmd0aCl9LChsPWkuZW5jcnlwdGlvbktleSkhPW51bGw/bDpvLmVuY3J5cHRpb25LZXksbmV3IFVpbnQ4QXJyYXkoZS5kYXRhLHgsVSkpLEg9bmV3IEFycmF5QnVmZmVyKGYuYnl0ZUxlbmd0aCtMLmJ5dGVMZW5ndGgpLFo9bmV3IFVpbnQ4QXJyYXkoSCk7cmV0dXJuIFouc2V0KG5ldyBVaW50OEFycmF5KGUuZGF0YSwwLGYuYnl0ZUxlbmd0aCkpLFouc2V0KG5ldyBVaW50OEFycmF5KEwpLGYuYnl0ZUxlbmd0aCksZS5kYXRhPUgsZX1jYXRjaChmKXtpZih0aGlzLmtleVByb3ZpZGVyT3B0aW9ucy5yYXRjaGV0V2luZG93U2l6ZT4wKXtpZihpLnJhdGNoZXRDb3VudDx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucy5yYXRjaGV0V2luZG93U2l6ZSl7bGV0IHk7aWYobz09PXRoaXMua2V5cy5nZXRLZXlTZXQocykpe2NvbnN0IHc9eWllbGQgdGhpcy5rZXlzLnJhdGNoZXRLZXkocywhMSk7eT15aWVsZCBHcyh3LHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRTYWx0KX1jb25zdCBFPXlpZWxkIHRoaXMuZGVjcnlwdEZyYW1lKGUscyxufHxvLHtyYXRjaGV0Q291bnQ6aS5yYXRjaGV0Q291bnQrMSxlbmNyeXB0aW9uS2V5Onk9PW51bGw/dm9pZCAwOnkuZW5jcnlwdGlvbktleX0pO3JldHVybiBFJiZ5JiYodGhpcy5rZXlzLnNldEtleVNldCh5LHMsITApLHRoaXMua2V5cy5zZXRDdXJyZW50S2V5SW5kZXgocykpLEV9biYmdGhpcy5rZXlzLnNldEtleUZyb21NYXRlcmlhbChuLm1hdGVyaWFsLHMpfWVsc2UgdGhyb3cgbmV3IG1lKCJEZWNyeXB0aW9uIGZhaWxlZCwgbW9zdCBsaWtlbHkgYmVjYXVzZSBvZiBhbiBpbnZhbGlkIGtleSIsZmUuSW52YWxpZEtleSl9fSl9bWFrZUlWKGUscyl7dmFyIGQ7Y29uc3Qgbj1uZXcgQXJyYXlCdWZmZXIoZGUpLGk9bmV3IERhdGFWaWV3KG4pO3RoaXMuc2VuZENvdW50cy5oYXMoZSl8fHRoaXMuc2VuZENvdW50cy5zZXQoZSxNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqNjU1MzUpKTtjb25zdCBhPShkPXRoaXMuc2VuZENvdW50cy5nZXQoZSkpIT1udWxsP2Q6MDtyZXR1cm4gaS5zZXRVaW50MzIoMCxlKSxpLnNldFVpbnQzMig0LHMpLGkuc2V0VWludDMyKDgscy1hJTY1NTM1KSx0aGlzLnNlbmRDb3VudHMuc2V0KGUsYSsxKSxufWdldFVuZW5jcnlwdGVkQnl0ZXMoZSl7dmFyIHM7aWYodmQoZSkpe2NvbnN0IG49KHM9dGhpcy5nZXRWaWRlb0NvZGVjKGUpKSE9bnVsbD9zOnRoaXMudmlkZW9Db2RlYztpZihuPT09ImF2MSJ8fG49PT0idnA5Iil0aHJvdyBuZXcgRXJyb3IoYCR7bn0gaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIGVuZCB0byBlbmQgZW5jcnlwdGlvbmApO3JldHVybiBBW2UudHlwZV19cmV0dXJuIEEuYXVkaW99Z2V0VmlkZW9Db2RlYyhlKXtpZih0aGlzLnJ0cE1hcC5zaXplPT09MClyZXR1cm47Y29uc3R7cGF5bG9hZFR5cGU6c309ZS5nZXRNZXRhZGF0YSgpO3JldHVybiBzP3RoaXMucnRwTWFwLmdldChzKTp2b2lkIDB9fWZ1bmN0aW9uIF9kKHQscil7Y29uc3QgZT1uZXcgVWludDhBcnJheSh0LnNsaWNlKHQuYnl0ZUxlbmd0aC1yLmJ5dGVMZW5ndGgpKTtyZXR1cm4gci5ldmVyeSgocyxuKT0+cz09PWVbbl0pfWNsYXNzIFlzIGV4dGVuZHMgenN7Y29uc3RydWN0b3IoZSxzLG4pe3N1cGVyKHZvaWQgMCk7cCh0aGlzLCJjdXJyZW50S2V5SW5kZXgiKTtwKHRoaXMsImNyeXB0b0tleVJpbmciKTtwKHRoaXMsImVuYWJsZWQiKTtwKHRoaXMsImtleVByb3ZpZGVyT3B0aW9ucyIpO3AodGhpcywicmF0Y2hldFByb21pc2VNYXAiKTtwKHRoaXMsInBhcnRpY2lwYW50SWQiKTt0aGlzLmN1cnJlbnRLZXlJbmRleD0wLHRoaXMuY3J5cHRvS2V5UmluZz1uZXcgQXJyYXkoMTYpLHRoaXMuZW5hYmxlZD1zLHRoaXMua2V5UHJvdmlkZXJPcHRpb25zPW4sdGhpcy5yYXRjaGV0UHJvbWlzZU1hcD1uZXcgTWFwLHRoaXMucGFydGljaXBhbnRJZD1lfXNldEVuYWJsZWQoZSl7dGhpcy5lbmFibGVkPWV9cmF0Y2hldEtleShlLHM9ITApe2NvbnN0IG49ZSE9bnVsbD9lOnRoaXMuZ2V0Q3VycmVudEtleUluZGV4KCksaT1uLGE9dGhpcy5yYXRjaGV0UHJvbWlzZU1hcC5nZXQoaSk7aWYodHlwZW9mIGEhPSJ1bmRlZmluZWQiKXJldHVybiBhO2NvbnN0IGQ9bmV3IFByb21pc2UoKG8sbCk9PkkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RyeXtjb25zdCBmPXRoaXMuZ2V0S2V5U2V0KGkpLm1hdGVyaWFsLHk9eWllbGQgYmQoeWllbGQgRWQoZix0aGlzLmtleVByb3ZpZGVyT3B0aW9ucy5yYXRjaGV0U2FsdCksZi5hbGdvcml0aG0ubmFtZSwiZGVyaXZlIik7cyYmdGhpcy5zZXRLZXlGcm9tTWF0ZXJpYWwoeSxpLCEwKSx0aGlzLmVtaXQoImtleVJhdGNoZXRlZCIseSxuLHRoaXMucGFydGljaXBhbnRJZCksbyh5KX1jYXRjaChmKXtsKGYpfWZpbmFsbHl7dGhpcy5yYXRjaGV0UHJvbWlzZU1hcC5kZWxldGUoaSl9fSkpO3JldHVybiB0aGlzLnJhdGNoZXRQcm9taXNlTWFwLnNldChpLGQpLGR9c2V0S2V5RnJvbU1hdGVyaWFsKGUscz0wLG49ITEpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtzPj0wJiYodGhpcy5jdXJyZW50S2V5SW5kZXg9cyV0aGlzLmNyeXB0b0tleVJpbmcubGVuZ3RoKTtjb25zdCBpPXlpZWxkIEdzKGUsdGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFNhbHQpO3RoaXMuc2V0S2V5U2V0KGksdGhpcy5jdXJyZW50S2V5SW5kZXgsbil9KX1zZXRLZXlTZXQoZSxzLG49ITEpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLmNyeXB0b0tleVJpbmdbcyV0aGlzLmNyeXB0b0tleVJpbmcubGVuZ3RoXT1lLG4mJnRoaXMuZW1pdCgia2V5UmF0Y2hldGVkIixlLm1hdGVyaWFsLHMsdGhpcy5wYXJ0aWNpcGFudElkKX0pfXNldEN1cnJlbnRLZXlJbmRleChlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dGhpcy5jdXJyZW50S2V5SW5kZXg9ZSV0aGlzLmNyeXB0b0tleVJpbmcubGVuZ3RofSl9aXNFbmFibGVkKCl7cmV0dXJuIHRoaXMuZW5hYmxlZH1nZXRDdXJyZW50S2V5SW5kZXgoKXtyZXR1cm4gdGhpcy5jdXJyZW50S2V5SW5kZXh9Z2V0S2V5U2V0KGUpe3JldHVybiB0aGlzLmNyeXB0b0tleVJpbmdbZSE9bnVsbD9lOnRoaXMuY3VycmVudEtleUluZGV4XX19Y29uc3QgWXQ9W10sUXQ9bmV3IE1hcCxKdD1bXTtsZXQgY2UsWHQ9ITEsUXM9ITEsWnQsZ2U9TXQ7ZnVuY3Rpb24gU2UodCxyKXtwb3N0TWVzc2FnZSh7a2luZDoibG9nIixkYXRhOntsZXZlbDp0LHN0cjpyfX0pfWZ1bmN0aW9uIFJkKHQscil7cG9zdE1lc3NhZ2Uoe2tpbmQ6InJhdGNoZXRLZXkiLGRhdGE6e2tleUluZGV4OnIsbWF0ZXJpYWw6dH19KX1mdW5jdGlvbiBWZSh0KXtpZighdClyZXR1cm4gY2U7bGV0IHI9UXQuZ2V0KHQpO3JldHVybiByfHwocj1uZXcgWXModCwhMCxnZSksWnQmJnIuc2V0S2V5RnJvbU1hdGVyaWFsKFp0KSxRdC5zZXQodCxyKSkscn1mdW5jdGlvbiBQZCh0LHIpe3I/VmUocikuc2V0RW5hYmxlZCh0KTooWHQ9dCxjZS5zZXRFbmFibGVkKHQpKX1mdW5jdGlvbiBKcyh0KXt0Lm9uKCJjcnlwdG9yRXJyb3IiLHI9Pntjb25zdCBlPXtraW5kOiJlcnJvciIsZGF0YTp7ZXJyb3I6bmV3IEVycm9yKGAke2ZlW3IucmVhc29uXX06ICR7ci5tZXNzYWdlfWApfX07cG9zdE1lc3NhZ2UoZSl9KX1mdW5jdGlvbiBlcih0LHIpe2xldCBlPVl0LmZpbmQocz0+cy5nZXRUcmFja0lkKCk9PT1yKTtpZihlKXQhPT1lLmdldFBhcnRpY2lwYW50SWQoKSYmZS5zZXRQYXJ0aWNpcGFudCh0LFZlKHQpKTtlbHNle2lmKFNlKCJpbmZvIixgY3JlYXRpbmcgbmV3IGNyeXB0b3IgZm9yICR7dH1gKSwhZ2UpdGhyb3cgRXJyb3IoIk1pc3Npbmcga2V5UHJvdmlkZXIgb3B0aW9ucyIpO2U9bmV3IHFzKHtwYXJ0aWNpcGFudElkOnQsa2V5czpWZSh0KSxrZXlQcm92aWRlck9wdGlvbnM6Z2V9KSxKcyhlKSxZdC5wdXNoKGUpfXJldHVybiBlfWZ1bmN0aW9uIFhzKHQpe2xldCByPUp0LmZpbmQoZT0+ZS5nZXRUcmFja0lkKCk9PT10KTtpZighcil7aWYoIWdlKXRocm93IG5ldyBUeXBlRXJyb3IoIk1pc3Npbmcga2V5UHJvdmlkZXIgb3B0aW9ucyIpO3I9bmV3IHFzKHtrZXlzOmNlLHBhcnRpY2lwYW50SWQ6InB1Ymxpc2hlciIsa2V5UHJvdmlkZXJPcHRpb25zOmdlfSksSnMociksSnQucHVzaChyKX1yZXR1cm4gcn1mdW5jdGlvbiBDZCh0KXt2YXIgcjsocj1ZdC5maW5kKGU9PmUuZ2V0VHJhY2tJZCgpPT09dCkpPT1udWxsfHxyLnVuc2V0UGFydGljaXBhbnQoKX1mdW5jdGlvbiBJZCh0LHIpe1NlKCJkZWJ1ZyIsInNldHRpbmcgc2hhcmVkIGtleSIpLFp0PXQsY2U9PW51bGx8fGNlLnNldEtleUZyb21NYXRlcmlhbCh0LHIpO2Zvcihjb25zdFssZV1vZiBRdCllLnNldEtleUZyb21NYXRlcmlhbCh0LHIpfW9ubWVzc2FnZT10PT57Y29uc3R7a2luZDpyLGRhdGE6ZX09dC5kYXRhO3N3aXRjaChyKXtjYXNlImluaXQiOlNlKCJpbmZvIiwid29ya2VyIGluaXRpYWxpemVkIiksZ2U9ZS5rZXlQcm92aWRlck9wdGlvbnMsUXM9ISFlLmtleVByb3ZpZGVyT3B0aW9ucy5zaGFyZWRLZXk7Y29uc3Qgcz17a2luZDoiZW5hYmxlIixkYXRhOntlbmFibGVkOlh0fX07Y2U9bmV3IFlzKHZvaWQgMCxYdCxnZSksY2Uub24oImtleVJhdGNoZXRlZCIsUmQpLHBvc3RNZXNzYWdlKHMpO2JyZWFrO2Nhc2UiZW5hYmxlIjpQZChlLmVuYWJsZWQsZS5wYXJ0aWNpcGFudElkKSxTZSgiaW5mbyIsInVwZGF0ZWQgZTJlZSBlbmFibGVkIHN0YXR1cyIpLHBvc3RNZXNzYWdlKHQuZGF0YSk7YnJlYWs7Y2FzZSJkZWNvZGUiOmVyKGUucGFydGljaXBhbnRJZCxlLnRyYWNrSWQpLnNldHVwVHJhbnNmb3JtKHIsZS5yZWFkYWJsZVN0cmVhbSxlLndyaXRhYmxlU3RyZWFtLGUudHJhY2tJZCxlLmNvZGVjKTticmVhaztjYXNlImVuY29kZSI6WHMoZS50cmFja0lkKS5zZXR1cFRyYW5zZm9ybShyLGUucmVhZGFibGVTdHJlYW0sZS53cml0YWJsZVN0cmVhbSxlLnRyYWNrSWQsZS5jb2RlYyk7YnJlYWs7Y2FzZSJzZXRLZXkiOlFzPyhTZSgiZGVidWciLCJzZXQgc2hhcmVkIGtleSIpLElkKGUua2V5LGUua2V5SW5kZXgpKTplLnBhcnRpY2lwYW50SWQ/VmUoZS5wYXJ0aWNpcGFudElkKS5zZXRLZXlGcm9tTWF0ZXJpYWwoZS5rZXksZS5rZXlJbmRleCk6U2UoImVycm9yIiwibm8gcGFydGljaXBhbnQgSWQgd2FzIHByb3ZpZGVkIGFuZCBzaGFyZWQga2V5IHVzYWdlIGlzIGRpc2FibGVkIik7YnJlYWs7Y2FzZSJyZW1vdmVUcmFuc2Zvcm0iOkNkKGUudHJhY2tJZCk7YnJlYWs7Y2FzZSJ1cGRhdGVDb2RlYyI6ZXIoZS5wYXJ0aWNpcGFudElkLGUudHJhY2tJZCkuc2V0VmlkZW9Db2RlYyhlLmNvZGVjKTticmVhaztjYXNlInNldFJUUE1hcCI6SnQuZm9yRWFjaChhPT57YS5zZXRSdHBNYXAoZS5tYXApfSk7YnJlYWs7Y2FzZSJyYXRjaGV0UmVxdWVzdCI6VmUoZS5wYXJ0aWNpcGFudElkKS5yYXRjaGV0S2V5KGUua2V5SW5kZXgpO2JyZWFrfX0sc2VsZi5SVENUcmFuc2Zvcm1FdmVudCYmKFNlKCJkZWJ1ZyIsInNldHVwIHRyYW5zZm9ybSBldmVudCIpLHNlbGYub25ydGN0cmFuc2Zvcm09dD0+e2NvbnN0e3RyYW5zZm9ybWVyOnJ9PXQ7ci5oYW5kbGVkPSEwO2NvbnN0e2tpbmQ6ZSxwYXJ0aWNpcGFudElkOnMsdHJhY2tJZDpuLGNvZGVjOml9PXIub3B0aW9uczsoZT09PSJlbmNvZGUiP1hzKG4pOmVyKHMsbikpLnNldHVwVHJhbnNmb3JtKGUsci5yZWFkYWJsZSxyLndyaXRhYmxlLG4saSl9KX0pKCk7Cg==",g=typeof window!="undefined"&&window.Blob&&new Blob([atob(ll)],{type:"text/javascript;charset=utf-8"});function Ul(){const Z=g&&(window.URL||window.webkitURL).createObjectURL(g);try{return Z?new Worker(Z):new Worker("data:application/javascript;base64,"+ll)}finally{Z&&(window.URL||window.webkitURL).revokeObjectURL(Z)}}var N,C,s,k,dl,H,cl,a,T,v,Sl,U,bl,S,Xl,K,Vl,t,Wl;class Zl extends ${constructor(l){super(void 0);p(this,N);p(this,k);p(this,H);p(this,a);p(this,v);p(this,U);p(this,S);p(this,K);p(this,t);R(this,"worker");R(this,"encryptionEnabled");R(this,"keyProvider");R(this,"peerSessionStore");R(this,"onWorkerMessage",l=>{const{kind:c,data:b}=l.data;switch(c){case"error":this.logger.error("error in worker",{error:b.error}),this.emit(E.Error,b.error);break;case"enable":this.encryptionEnabled!==b.enabled&&!b.participantId?this.encryptionEnabled=b.enabled:b.participantId,this.encryptionEnabled&&this.keyProvider.getKeys().forEach(X=>{y(this,a,T).call(this,X)});break;case"ratchetKey":this.keyProvider.emit("keyRatcheted",b.material,b.keyIndex);break;case"log":this.logger&&this.logger[b.level](b.str);break}});p(this,s,l=>{this.logger.error("e2ee worker encountered an error:",{error:l.error}),this.emit(E.Error,l.error)});this.keyProvider=l.keyProvider,this.worker=new Ul,this.encryptionEnabled=!1}get isEnabled(){return this.encryptionEnabled}init(l,c){this.logger=l,this.peerSessionStore=c,this.setup()}setup(){if(!sl())throw new Error("tried to setup end-to-end encryption on an unsupported browser");this.logger.info("setting up e2ee"),y(this,k,dl).call(this,this.keyProvider);const l={kind:"init",data:{keyProviderOptions:this.keyProvider.getOptions()}};this.worker&&(this.logger.info("initializing worker"),this.worker.onmessage=this.onWorkerMessage,this.worker.onerror=M(this,s),this.worker.postMessage(l)),y(this,N,C).call(this,!0)}}N=new WeakSet,C=function(l,c){return i(this,null,function*(){if(this.logger.info(`set e2ee to ${l} for ${c||"self"}`),this.worker){const b={kind:"enable",data:{enabled:l,participantId:c}};this.worker.postMessage(b)}else throw new ReferenceError("failed to enable e2ee, worker is not ready")})},s=new WeakMap,k=new WeakSet,dl=function(l){this.peerSessionStore.on(J.NEW_CONSUMER,({appData:c,peerId:b})=>{c.e2ee&&y(this,N,C).call(this,c.e2ee,b)}),this.peerSessionStore.on(J.E2EE_INACTIVE_CONSUMER,({peerId:c,trackId:b})=>{var V;const X={kind:"removeTransform",data:{participantId:c,trackId:b}};(V=this.worker)==null||V.postMessage(X)}),this.peerSessionStore.on(J.E2EE_ACTIVE_CONSUMER,({track:c,rtpReceiver:b,peerId:X})=>y(this,U,bl).call(this,c,b,X)),this.peerSessionStore.on(J.E2EE_ACTIVE_PRODUCER,({track:c,rtpSender:b,appData:X})=>y(this,S,Xl).call(this,c,b,X.peerId)),l.on("setKey",c=>y(this,a,T).call(this,c)).on("ratchetRequest",(c,b)=>y(this,H,cl).call(this,c,b))},H=new WeakSet,cl=function(l,c){if(!this.worker)throw Error("could not ratchet key, worker is missing");const b={kind:"ratchetRequest",data:{participantId:l,keyIndex:c}};this.worker.postMessage(b)},a=new WeakSet,T=function({key:l,participantId:c,keyIndex:b}){if(!this.worker)throw Error("could not set key, worker is missing");const X={kind:"setKey",data:{participantId:c,key:l,keyIndex:b}};this.worker.postMessage(X)},v=new WeakSet,Sl=function(l){if(!this.worker)throw Error("could not post rtp map, worker is missing");const c={kind:"setRTPMap",data:{map:l}};this.worker.postMessage(c)},U=new WeakSet,bl=function(l,c,b){y(this,K,Vl).call(this,c,l.id,b)},S=new WeakSet,Xl=function(l,c,b){y(this,t,Wl).call(this,c,l.id,b)},K=new WeakSet,Vl=function(l,c,b,X){return i(this,null,function*(){if(!this.worker)return;const V=l;if(x()){const W={kind:"decode",participantId:b,trackId:c,codec:X};V.transform=new RTCRtpScriptTransform(this.worker,W)}else{if(F in V&&X){const u={kind:"updateCodec",data:{trackId:c,codec:X,participantId:b}};this.worker.postMessage(u);return}let W=V.writableStream,G=V.readableStream;if(!W||!G){const u=V.createEncodedStreams();V.writableStream=u.writable,W=u.writable,V.readableStream=u.readable,G=u.readable}const Y={kind:"decode",data:{readableStream:G,writableStream:W,trackId:c,codec:X,participantId:b}};this.worker.postMessage(Y,[G,W])}V[F]=!0})},t=new WeakSet,Wl=function(l,c,b,X){if(F in l||!this.worker)return;const V=l;if(x()){this.logger.warn("initialize script transform");const W={kind:"encode",participantId:b,trackId:c,codec:X};V.transform=new RTCRtpScriptTransform(this.worker,W)}else{this.logger.warn("initialize encoded streams");const W=V.createEncodedStreams(),G={kind:"encode",data:{readableStream:W.readable,writableStream:W.writable,codec:X,trackId:c,participantId:b||"publisher"}};this.worker.postMessage(G,[W.readable,W.writable])}V[F]=!0},R(Zl,"SharedKeyProvider",Hl);module.exports=Zl;