@cloudflare/realtimekit 1.5.0-staging.3 → 1.5.0-staging.4

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 Gl=Object.defineProperty,ml=Object.defineProperties;var Rl=Object.getOwnPropertyDescriptors;var e=Object.getOwnPropertySymbols;var pl=Object.prototype.hasOwnProperty,Yl=Object.prototype.propertyIsEnumerable;var K=(Z,d,l)=>d in Z?Gl(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)&&K(Z,l,d[l]);if(e)for(var l of e(d))Yl.call(d,l)&&K(Z,l,d[l]);return Z},Q=(Z,d)=>ml(Z,Rl(d));var R=(Z,d,l)=>(K(Z,typeof d!="symbol"?d+"":d,l),l),B=(Z,d,l)=>{if(!d.has(Z))throw TypeError("Cannot "+l)};var w=(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 W=m=>{try{X(l.next(m))}catch(u){b(u)}},V=m=>{try{X(l.throw(m))}catch(u){b(u)}},X=m=>m.done?c(m.value):Promise.resolve(m.value).then(W,V);X((l=l.apply(Z,d)).next())});var L={},ul={get exports(){return L},set exports(Z){L=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)},s;h&&typeof h.ownKeys=="function"?s=h.ownKeys:Object.getOwnPropertySymbols?s=function(d){return Object.getOwnPropertyNames(d).concat(Object.getOwnPropertySymbols(d))}:s=function(d){return Object.getOwnPropertyNames(d)};function yl(Z){console&&console.warn&&console.warn(Z)}var P=Number.isNaN||function(d){return d!==d};function G(){G.init.call(this)}ul.exports=G;L.once=Nl;G.EventEmitter=G;G.prototype._events=void 0;G.prototype._eventsCount=0;G.prototype._maxListeners=void 0;var j=10;function z(Z){if(typeof Z!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof Z)}Object.defineProperty(G,"defaultMaxListeners",{enumerable:!0,get:function(){return j},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+".");j=Z}});G.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};G.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 O(Z){return Z._maxListeners===void 0?G.defaultMaxListeners:Z._maxListeners}G.prototype.getMaxListeners=function(){return O(this)};G.prototype.emit=function(d){for(var l=[],c=1;c<arguments.length;c++)l.push(arguments[c]);var b=d==="error",W=this._events;if(W!==void 0)b=b&&W.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 X=new Error("Unhandled error."+(V?" ("+V.message+")":""));throw X.context=V,X}var m=W[d];if(m===void 0)return!1;if(typeof m=="function")M(m,this,l);else for(var u=m.length,y=_(m,u),c=0;c<u;++c)M(y[c],this,l);return!0};function f(Z,d,l,c){var b,W,V;if(z(l),W=Z._events,W===void 0?(W=Z._events=Object.create(null),Z._eventsCount=0):(W.newListener!==void 0&&(Z.emit("newListener",d,l.listener?l.listener:l),W=Z._events),V=W[d]),V===void 0)V=W[d]=l,++Z._eventsCount;else if(typeof V=="function"?V=W[d]=c?[l,V]:[V,l]:c?V.unshift(l):V.push(l),b=O(Z),b>0&&V.length>b&&!V.warned){V.warned=!0;var X=new Error("Possible EventEmitter memory leak detected. "+V.length+" "+String(d)+" listeners added. Use emitter.setMaxListeners() to increase limit");X.name="MaxListenersExceededWarning",X.emitter=Z,X.type=d,X.count=V.length,yl(X)}return Z}G.prototype.addListener=function(d,l){return f(this,d,l,!1)};G.prototype.on=G.prototype.addListener;G.prototype.prependListener=function(d,l){return f(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 r(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}G.prototype.once=function(d,l){return z(l),this.on(d,r(this,d,l)),this};G.prototype.prependOnceListener=function(d,l){return z(l),this.prependListener(d,r(this,d,l)),this};G.prototype.removeListener=function(d,l){var c,b,W,V,X;if(z(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(W=-1,V=c.length-1;V>=0;V--)if(c[V]===l||c[V].listener===l){X=c[V].listener,W=V;break}if(W<0)return this;W===0?c.shift():Jl(c,W),c.length===1&&(b[d]=c[0]),b.removeListener!==void 0&&this.emit("removeListener",d,X||l)}return this};G.prototype.off=G.prototype.removeListener;G.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 W=Object.keys(c),V;for(b=0;b<W.length;++b)V=W[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 D(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)}G.prototype.listeners=function(d){return D(this,d,!0)};G.prototype.rawListeners=function(d){return D(this,d,!1)};G.listenerCount=function(Z,d){return typeof Z.listenerCount=="function"?Z.listenerCount(d):A.call(Z,d)};G.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}G.prototype.eventNames=function(){return this._eventsCount>0?s(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(V){Z.removeListener(d,W),c(V)}function W(){typeof Z.removeListener=="function"&&Z.removeListener("error",b),l([].slice.call(arguments))}q(Z,d,W,{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(W){c.once&&Z.removeEventListener(d,b),l(W)});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 W=this.listenerCount(l);W>25&&W%25===0&&((b=this.logger)==null||b.warn("CustomEventEmitter::maxListenersExceeded",{eventListener:{eventName:l.toString(),listenerCount:this.listenerCount(l)}}))}catch(W){}return super.on(l,c)}addListener(l,c){var b;try{const W=this.listenerCount(l);W>25&&W%25===0&&((b=this.logger)==null||b.warn("CustomEventEmitter::maxListenersExceeded",{eventListener:{eventName:l.toString(),listenerCount:this.listenerCount(l)}}))}catch(W){}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 sl(){return typeof window.RTCRtpSender!="undefined"&&typeof window.RTCRtpSender.prototype.createEncodedStreams!="undefined"}function Ll(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 kl(){return sl()||x()}class Ul 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 W={key:l,participantId:c,keyIndex:b};this.keyInfoMap.set(`${c!=null?c:"shared"}-${b!=null?b:0}`,W),this.emit("setKey",W)}getKeys(){return Array.from(this.keyInfoMap.values())}getOptions(){return this.options}ratchetKey(l,c){this.emit("ratchetRequest",l,c)}}class Il extends Ul{constructor(l={}){const c=Q(n({},l),{sharedKey:!0});super(c);R(this,"ratchetInterval")}setKey(l){return J(this,null,function*(){const c=yield Ll(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="dmFyIHNhPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxuYT1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgaWE9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIGVzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsYWE9T2JqZWN0LmdldFByb3RvdHlwZU9mLG9hPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksY2E9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxkYT1SZWZsZWN0LmdldDt2YXIgRHQ9KF8sQSxNKT0+QSBpbiBfP3NhKF8sQSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6TX0pOl9bQV09TSxHPShfLEEpPT57Zm9yKHZhciBNIGluIEF8fChBPXt9KSlvYS5jYWxsKEEsTSkmJkR0KF8sTSxBW01dKTtpZihlcylmb3IodmFyIE0gb2YgZXMoQSkpY2EuY2FsbChBLE0pJiZEdChfLE0sQVtNXSk7cmV0dXJuIF99LFFlPShfLEEpPT5uYShfLGlhKEEpKTt2YXIgdT0oXyxBLE0pPT4oRHQoXyx0eXBlb2YgQSE9InN5bWJvbCI/QSsiIjpBLE0pLE0pLHRzPShfLEEsTSk9PntpZighQS5oYXMoXykpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIitNKX07dmFyIFE9KF8sQSxNKT0+KHRzKF8sQSwicmVhZCBmcm9tIHByaXZhdGUgZmllbGQiKSxNP00uY2FsbChfKTpBLmdldChfKSksbHQ9KF8sQSxNKT0+e2lmKEEuaGFzKF8pKXRocm93IFR5cGVFcnJvcigiQ2Fubm90IGFkZCB0aGUgc2FtZSBwcml2YXRlIG1lbWJlciBtb3JlIHRoYW4gb25jZSIpO0EgaW5zdGFuY2VvZiBXZWFrU2V0P0EuYWRkKF8pOkEuc2V0KF8sTSl9LGZlPShfLEEsTSxvZSk9Pih0cyhfLEEsIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxvZT9vZS5jYWxsKF8sTSk6QS5zZXQoXyxNKSxNKTt2YXIgcnM9KF8sQSxNKT0+ZGEoYWEoXyksTSxBKTt2YXIgdz0oXyxBLE0pPT5uZXcgUHJvbWlzZSgob2UsdXQpPT57dmFyIHB0PXo9Pnt0cnl7Z2UoTS5uZXh0KHopKX1jYXRjaChtZSl7dXQobWUpfX0sVz16PT57dHJ5e2dlKE0udGhyb3coeikpfWNhdGNoKG1lKXt1dChtZSl9fSxnZT16PT56LmRvbmU/b2Uoei52YWx1ZSk6UHJvbWlzZS5yZXNvbHZlKHoudmFsdWUpLnRoZW4ocHQsVyk7Z2UoKE09TS5hcHBseShfLEEpKS5uZXh0KCkpfSk7KGZ1bmN0aW9uKCl7dmFyIFBlLFosZWU7InVzZSBzdHJpY3QiO2NvbnN0IF89IkFFUy1HQ00iLE09e2tleToxMCxkZWx0YTozLGF1ZGlvOjEsZW1wdHk6MH0sb2U9MTIscHQ9e3NoYXJlZEtleTohMSxyYXRjaGV0U2FsdDoiUmVhbHRpbWVLaXRGcmFtZUVuY3J5cHRpb25LZXkiLHJhdGNoZXRXaW5kb3dTaXplOjh9O3ZhciBXPXt9LGdlPXtnZXQgZXhwb3J0cygpe3JldHVybiBXfSxzZXQgZXhwb3J0cyhyKXtXPXJ9fSx6PXR5cGVvZiBSZWZsZWN0PT0ib2JqZWN0Ij9SZWZsZWN0Om51bGwsbWU9eiYmdHlwZW9mIHouYXBwbHk9PSJmdW5jdGlvbiI/ei5hcHBseTpmdW5jdGlvbih0LGUscyl7cmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHQsZSxzKX0sSmU7eiYmdHlwZW9mIHoub3duS2V5cz09ImZ1bmN0aW9uIj9KZT16Lm93bktleXM6T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz9KZT1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCkpfTpKZT1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCl9O2Z1bmN0aW9uIHNzKHIpe2NvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKHIpfXZhciBOdD1OdW1iZXIuaXNOYU58fGZ1bmN0aW9uKHQpe3JldHVybiB0IT09dH07ZnVuY3Rpb24gTCgpe0wuaW5pdC5jYWxsKHRoaXMpfWdlLmV4cG9ydHM9TCxXLm9uY2U9b3MsTC5FdmVudEVtaXR0ZXI9TCxMLnByb3RvdHlwZS5fZXZlbnRzPXZvaWQgMCxMLnByb3RvdHlwZS5fZXZlbnRzQ291bnQ9MCxMLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzPXZvaWQgMDt2YXIgVnQ9MTA7ZnVuY3Rpb24gWGUocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShMLCJkZWZhdWx0TWF4TGlzdGVuZXJzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVnR9LHNldDpmdW5jdGlvbihyKXtpZih0eXBlb2YgciE9Im51bWJlciJ8fHI8MHx8TnQocikpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAiZGVmYXVsdE1heExpc3RlbmVycyIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJytyKyIuIik7VnQ9cn19KSxMLmluaXQ9ZnVuY3Rpb24oKXsodGhpcy5fZXZlbnRzPT09dm9pZCAwfHx0aGlzLl9ldmVudHM9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykmJih0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKSx0aGlzLl9tYXhMaXN0ZW5lcnM9dGhpcy5fbWF4TGlzdGVuZXJzfHx2b2lkIDB9LEwucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MHx8TnQodCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAibiIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyt0KyIuIik7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz10LHRoaXN9O2Z1bmN0aW9uIEJ0KHIpe3JldHVybiByLl9tYXhMaXN0ZW5lcnM9PT12b2lkIDA/TC5kZWZhdWx0TWF4TGlzdGVuZXJzOnIuX21heExpc3RlbmVyc31MLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oKXtyZXR1cm4gQnQodGhpcyl9LEwucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLHM9MTtzPGFyZ3VtZW50cy5sZW5ndGg7cysrKWUucHVzaChhcmd1bWVudHNbc10pO3ZhciBuPXQ9PT0iZXJyb3IiLGk9dGhpcy5fZXZlbnRzO2lmKGkhPT12b2lkIDApbj1uJiZpLmVycm9yPT09dm9pZCAwO2Vsc2UgaWYoIW4pcmV0dXJuITE7aWYobil7dmFyIGE7aWYoZS5sZW5ndGg+MCYmKGE9ZVswXSksYSBpbnN0YW5jZW9mIEVycm9yKXRocm93IGE7dmFyIGQ9bmV3IEVycm9yKCJVbmhhbmRsZWQgZXJyb3IuIisoYT8iICgiK2EubWVzc2FnZSsiKSI6IiIpKTt0aHJvdyBkLmNvbnRleHQ9YSxkfXZhciBvPWlbdF07aWYobz09PXZvaWQgMClyZXR1cm4hMTtpZih0eXBlb2Ygbz09ImZ1bmN0aW9uIiltZShvLHRoaXMsZSk7ZWxzZSBmb3IodmFyIGg9by5sZW5ndGgsZz1IdChvLGgpLHM9MDtzPGg7KytzKW1lKGdbc10sdGhpcyxlKTtyZXR1cm4hMH07ZnVuY3Rpb24gRnQocix0LGUscyl7dmFyIG4saSxhO2lmKFhlKGUpLGk9ci5fZXZlbnRzLGk9PT12b2lkIDA/KGk9ci5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksci5fZXZlbnRzQ291bnQ9MCk6KGkubmV3TGlzdGVuZXIhPT12b2lkIDAmJihyLmVtaXQoIm5ld0xpc3RlbmVyIix0LGUubGlzdGVuZXI/ZS5saXN0ZW5lcjplKSxpPXIuX2V2ZW50cyksYT1pW3RdKSxhPT09dm9pZCAwKWE9aVt0XT1lLCsrci5fZXZlbnRzQ291bnQ7ZWxzZSBpZih0eXBlb2YgYT09ImZ1bmN0aW9uIj9hPWlbdF09cz9bZSxhXTpbYSxlXTpzP2EudW5zaGlmdChlKTphLnB1c2goZSksbj1CdChyKSxuPjAmJmEubGVuZ3RoPm4mJiFhLndhcm5lZCl7YS53YXJuZWQ9ITA7dmFyIGQ9bmV3IEVycm9yKCJQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICIrYS5sZW5ndGgrIiAiK1N0cmluZyh0KSsiIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQiKTtkLm5hbWU9Ik1heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyIsZC5lbWl0dGVyPXIsZC50eXBlPXQsZC5jb3VudD1hLmxlbmd0aCxzcyhkKX1yZXR1cm4gcn1MLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiBGdCh0aGlzLHQsZSwhMSl9LEwucHJvdG90eXBlLm9uPUwucHJvdG90eXBlLmFkZExpc3RlbmVyLEwucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiBGdCh0aGlzLHQsZSwhMCl9O2Z1bmN0aW9uIG5zKCl7aWYoIXRoaXMuZmlyZWQpcmV0dXJuIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSx0aGlzLndyYXBGbiksdGhpcy5maXJlZD0hMCxhcmd1bWVudHMubGVuZ3RoPT09MD90aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpOnRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsYXJndW1lbnRzKX1mdW5jdGlvbiB4dChyLHQsZSl7dmFyIHM9e2ZpcmVkOiExLHdyYXBGbjp2b2lkIDAsdGFyZ2V0OnIsdHlwZTp0LGxpc3RlbmVyOmV9LG49bnMuYmluZChzKTtyZXR1cm4gbi5saXN0ZW5lcj1lLHMud3JhcEZuPW4sbn1MLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFhlKGUpLHRoaXMub24odCx4dCh0aGlzLHQsZSkpLHRoaXN9LEwucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gWGUoZSksdGhpcy5wcmVwZW5kTGlzdGVuZXIodCx4dCh0aGlzLHQsZSkpLHRoaXN9LEwucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7dmFyIHMsbixpLGEsZDtpZihYZShlKSxuPXRoaXMuX2V2ZW50cyxuPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKHM9blt0XSxzPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKHM9PT1lfHxzLmxpc3RlbmVyPT09ZSktLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTooZGVsZXRlIG5bdF0sbi5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsdCxzLmxpc3RlbmVyfHxlKSk7ZWxzZSBpZih0eXBlb2YgcyE9ImZ1bmN0aW9uIil7Zm9yKGk9LTEsYT1zLmxlbmd0aC0xO2E+PTA7YS0tKWlmKHNbYV09PT1lfHxzW2FdLmxpc3RlbmVyPT09ZSl7ZD1zW2FdLmxpc3RlbmVyLGk9YTticmVha31pZihpPDApcmV0dXJuIHRoaXM7aT09PTA/cy5zaGlmdCgpOmlzKHMsaSkscy5sZW5ndGg9PT0xJiYoblt0XT1zWzBdKSxuLnJlbW92ZUxpc3RlbmVyIT09dm9pZCAwJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIix0LGR8fGUpfXJldHVybiB0aGlzfSxMLnByb3RvdHlwZS5vZmY9TC5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIsTC5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlLHMsbjtpZihzPXRoaXMuX2V2ZW50cyxzPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKHMucmVtb3ZlTGlzdGVuZXI9PT12b2lkIDApcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0wPyh0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKTpzW3RdIT09dm9pZCAwJiYoLS10aGlzLl9ldmVudHNDb3VudD09PTA/dGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCk6ZGVsZXRlIHNbdF0pLHRoaXM7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApe3ZhciBpPU9iamVjdC5rZXlzKHMpLGE7Zm9yKG49MDtuPGkubGVuZ3RoOysrbilhPWlbbl0sYSE9PSJyZW1vdmVMaXN0ZW5lciImJnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGEpO3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygicmVtb3ZlTGlzdGVuZXIiKSx0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wLHRoaXN9aWYoZT1zW3RdLHR5cGVvZiBlPT0iZnVuY3Rpb24iKXRoaXMucmVtb3ZlTGlzdGVuZXIodCxlKTtlbHNlIGlmKGUhPT12b2lkIDApZm9yKG49ZS5sZW5ndGgtMTtuPj0wO24tLSl0aGlzLnJlbW92ZUxpc3RlbmVyKHQsZVtuXSk7cmV0dXJuIHRoaXN9O2Z1bmN0aW9uIGp0KHIsdCxlKXt2YXIgcz1yLl9ldmVudHM7aWYocz09PXZvaWQgMClyZXR1cm5bXTt2YXIgbj1zW3RdO3JldHVybiBuPT09dm9pZCAwP1tdOnR5cGVvZiBuPT0iZnVuY3Rpb24iP2U/W24ubGlzdGVuZXJ8fG5dOltuXTplP2FzKG4pOkh0KG4sbi5sZW5ndGgpfUwucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbih0KXtyZXR1cm4ganQodGhpcyx0LCEwKX0sTC5wcm90b3R5cGUucmF3TGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3JldHVybiBqdCh0aGlzLHQsITEpfSxMLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24ocix0KXtyZXR1cm4gdHlwZW9mIHIubGlzdGVuZXJDb3VudD09ImZ1bmN0aW9uIj9yLmxpc3RlbmVyQ291bnQodCk6VXQuY2FsbChyLHQpfSxMLnByb3RvdHlwZS5saXN0ZW5lckNvdW50PVV0O2Z1bmN0aW9uIFV0KHIpe3ZhciB0PXRoaXMuX2V2ZW50cztpZih0IT09dm9pZCAwKXt2YXIgZT10W3JdO2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iKXJldHVybiAxO2lmKGUhPT12b2lkIDApcmV0dXJuIGUubGVuZ3RofXJldHVybiAwfUwucHJvdG90eXBlLmV2ZW50TmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQ+MD9KZSh0aGlzLl9ldmVudHMpOltdfTtmdW5jdGlvbiBIdChyLHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodCkscz0wO3M8dDsrK3MpZVtzXT1yW3NdO3JldHVybiBlfWZ1bmN0aW9uIGlzKHIsdCl7Zm9yKDt0KzE8ci5sZW5ndGg7dCsrKXJbdF09clt0KzFdO3IucG9wKCl9ZnVuY3Rpb24gYXMocil7Zm9yKHZhciB0PW5ldyBBcnJheShyLmxlbmd0aCksZT0wO2U8dC5sZW5ndGg7KytlKXRbZV09cltlXS5saXN0ZW5lcnx8cltlXTtyZXR1cm4gdH1mdW5jdGlvbiBvcyhyLHQpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHMpe2Z1bmN0aW9uIG4oYSl7ci5yZW1vdmVMaXN0ZW5lcih0LGkpLHMoYSl9ZnVuY3Rpb24gaSgpe3R5cGVvZiByLnJlbW92ZUxpc3RlbmVyPT0iZnVuY3Rpb24iJiZyLnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsbiksZShbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpfUt0KHIsdCxpLHtvbmNlOiEwfSksdCE9PSJlcnJvciImJmNzKHIsbix7b25jZTohMH0pfSl9ZnVuY3Rpb24gY3Mocix0LGUpe3R5cGVvZiByLm9uPT0iZnVuY3Rpb24iJiZLdChyLCJlcnJvciIsdCxlKX1mdW5jdGlvbiBLdChyLHQsZSxzKXtpZih0eXBlb2Ygci5vbj09ImZ1bmN0aW9uIilzLm9uY2U/ci5vbmNlKHQsZSk6ci5vbih0LGUpO2Vsc2UgaWYodHlwZW9mIHIuYWRkRXZlbnRMaXN0ZW5lcj09ImZ1bmN0aW9uIilyLmFkZEV2ZW50TGlzdGVuZXIodCxmdW5jdGlvbiBuKGkpe3Mub25jZSYmci5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiksZShpKX0pO2Vsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJlbWl0dGVyIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRXZlbnRFbWl0dGVyLiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHIpfXZhciBSOyhmdW5jdGlvbihyKXtyW3IuTUFKT1JfRVZFTlQ9MF09Ik1BSk9SX0VWRU5UIixyW3IuTUlOT1JfRVZFTlQ9MV09Ik1JTk9SX0VWRU5UIn0pKFJ8fChSPXt9KSk7dmFyIFM7KGZ1bmN0aW9uKHIpe3IuUFJFQ0FMTF9URVNUX0JFR0lOPSJwcmVjYWxsX2JlZ2luIixyLlBSRUNBTExfVEVTVF9DT01QTEVURT0icHJlY2FsbF9lbmQiLHIuQ0FMTF9KT0lOX0JFR0lOPSJjYWxsX2pvaW4iLHIuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTj0ibmV0X3F1YWxpdHlfdGVzdF9iZWdpbiIsci5ORVRfUVVBTElUWV9URVNUX0VORD0ibmV0X3F1YWxpdHlfdGVzdF9lbmQiLHIuV0VCU09DS0VUX0NPTk5FQ1RFRD0id2Vic29ja2V0X2Nvbm5lY3RlZCIsci5UUkFOU1BPUlRfQ09OTkVDVEVEPSJ0cmFuc3BvcnRfY29ubmVjdGVkIixyLkFVRElPX09OPSJhdWRpb19vbiIsci5BVURJT19PRkY9ImF1ZGlvX29mZiIsci5WSURFT19PTj0idmlkZW9fb24iLHIuVklERU9fT0ZGPSJ2aWRlb19vZmYiLHIuUEFSVElDSVBBTlRfUk9MRT0icGFydGljaXBhbnRfcm9sZSIsci5QSU5HX1NUQVQ9InBpbmdfc3RhdCIsci5ESVNDT05ORUNUPSJkaXNjb25uZWN0IixyLlJFQ09OTkVDVF9BVFRFTVBUPSJyZWNvbm5lY3RfYXR0ZW1wdCIsci5TQ1JFRU5TSEFSRV9TVEFSVF9SRVFVRVNURUQ9InNjcmVlbnNoYXJlX3N0YXJ0X3JlcXVlc3RlZCIsci5TQ1JFRU5TSEFSRV9TVEFSVEVEPSJzY3JlZW5zaGFyZV9zdGFydGVkIixyLlNDUkVFTlNIQVJFX1NUT1BQRUQ9InNjcmVlbnNoYXJlX3N0b3BwZWQiLHIuVEFCX0NIQU5HRT0idGFiX2NoYW5nZSIsci5CUk9XU0VSX0JBQ0tHUk9VTkRFRD0iYnJvd3Nlcl9iYWNrZ3JvdW5kZWQiLHIuQlJPV1NFUl9GT1JFR1JPVU5ERUQ9ImJyb3dzZXJfZm9yZWdyb3VuZGVkIixyLkRPTUlOQU5UX1NQRUFLRVI9ImRvbWluYW50X3NwZWFrZXIiLHIuQVVESU9fREVWSUNFU19VUERBVEVTPSJhdWRpb19kZXZpY2VzX3VwZGF0ZXMiLHIuVklERU9fREVWSUNFU19VUERBVEVTPSJ2aWRlb19kZXZpY2VzX3VwZGF0ZXMiLHIuU1BFQUtFUl9ERVZJQ0VTX1VQREFURVM9InNwZWFrZXJfZGV2aWNlc191cGRhdGVzIixyLlNFTEVDVEVEX01JQ1JPSFBPTkVfVVBEQVRFPSJzZWxlY3RlZF9taWNyb3Bob25lX3VwZGF0ZSIsci5TRUxFQ1RFRF9DQU1FUkFfVVBEQVRFPSJzZWxlY3RlZF9jYW1lcmFfdXBkYXRlIixyLlNFTEVDVEVEX1NQRUFLRVJfVVBEQVRFPSJzZWxlY3RlZF9zcGVha2VyX3VwZGF0ZSIsci5FWFBFQ1RFRF9WSURFT19SRVNPTFVUSU9OPSJleHBlY3RlZF92aWRlb19yZXNvbHV0aW9uIixyLkVYUEVDVEVEX1NDUkVFTlNIQVJFX1JFU09MVVRJT049ImV4cGVjdGVkX3NjcmVlbnNoYXJlX3Jlc29sdXRpb24iLHIuTUVESUFfUEVSTUlTU0lPTj0ibWVkaWFfcGVybWlzc2lvbiIsci5MRUdBQ1lfU1dJVENIPSJsZWdhY3lfc3dpdGNoIixyLkFVRElPX1BMQVlfRkFJTEVEPSJhdWRpb19wbGF5X2ZhaWxlZCIsci5WSURFT19QTEFZX0ZBSUxFRD0idmlkZW9fcGxheV9mYWlsZWQiLHIuQVVESU9fVFJBQ0tfTVVURUQ9ImF1ZGlvX3RyYWNrX211dGVkIixyLlZJREVPX1RSQUNLX01VVEVEPSJ2aWRlb190cmFja19tdXRlZCIsci5JVlNfUExBWUVSX1JFQlVGRkVSSU5HPSJpdnNfcGxheWVyX3JlYnVmZmVyaW5nIixyLklWU19QTEFZRVJfQVVESU9fQkxPQ0tFRD0iaXZzX3BsYXllcl9hdWRpb19ibG9ja2VkIixyLklWU19QTEFZRVJfUExBWUJBQ0tfQkxPQ0tFRD0iaXZzX3BsYXllcl9wbGF5YmFja19ibG9ja2VkIixyLklWU19QTEFZRVJfRVJST1I9Iml2c19wbGF5ZXJfZXJyb3IiLHIuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUj0iaXZzX3BsYXllcl9yZWNvdmVyYWJsZV9lcnJvciIsci5JVlNfUExBWUVSX1dPUktFUl9FUlJPUj0iaXZzX3BsYXllcl93b3JrZXJfZXJyb3IiLHIuSVZTX1BMQVlFUl9ORVRXT1JLX1VOQVZBSUxBQkxFPSJpdnNfcGxheWVyX25ldHdvcmtfdW5hdmFpbGFibGUiLHIuTElWRVNUUkVBTV9MQVRFTkNZPSJsaXZlc3RyZWFtX2xhdGVuY3kiLHIuSVZTX1BMQVlFUl9BTkFMWVRJQ1NfRVZFTlQ9Iml2c19wbGF5ZXJfYW5hbHl0aWNzX2V2ZW50IixyLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VEPSJpdnNfcGxheWVyX3BsYXliYWNrX3JhdGVfY2hhbmdlZCIsci5JVlNfUExBWUVSX1FVQUxJVFlfQ0hBTkdFRD0iaXZzX3BsYXllcl9xdWFsaXR5X2NoYW5nZWQiLHIuSVZTX1BMQVlFUl9JTklUSUFMSVpFRD0iaXZzX3BsYXllcl9pbml0aWFsaXplZCJ9KShTfHwoUz17fSkpO2NvbnN0IGRzPW5ldyBNYXAoW1tTLlBSRUNBTExfVEVTVF9CRUdJTixSLk1JTk9SX0VWRU5UXSxbUy5QUkVDQUxMX1RFU1RfQ09NUExFVEUsUi5NSU5PUl9FVkVOVF0sW1MuQ0FMTF9KT0lOX0JFR0lOLFIuTUFKT1JfRVZFTlRdLFtTLk5FVF9RVUFMSVRZX1RFU1RfQkVHSU4sUi5NSU5PUl9FVkVOVF0sW1MuTkVUX1FVQUxJVFlfVEVTVF9FTkQsUi5NSU5PUl9FVkVOVF0sW1MuV0VCU09DS0VUX0NPTk5FQ1RFRCxSLk1JTk9SX0VWRU5UXSxbUy5UUkFOU1BPUlRfQ09OTkVDVEVELFIuTUFKT1JfRVZFTlRdLFtTLkFVRElPX09OLFIuTUlOT1JfRVZFTlRdLFtTLkFVRElPX09GRixSLk1JTk9SX0VWRU5UXSxbUy5WSURFT19PTixSLk1JTk9SX0VWRU5UXSxbUy5WSURFT19PRkYsUi5NSU5PUl9FVkVOVF0sW1MuUEFSVElDSVBBTlRfUk9MRSxSLk1JTk9SX0VWRU5UXSxbUy5QSU5HX1NUQVQsUi5NQUpPUl9FVkVOVF0sW1MuRElTQ09OTkVDVCxSLk1BSk9SX0VWRU5UXSxbUy5SRUNPTk5FQ1RfQVRURU1QVCxSLk1BSk9SX0VWRU5UXSxbUy5TQ1JFRU5TSEFSRV9TVEFSVF9SRVFVRVNURUQsUi5NSU5PUl9FVkVOVF0sW1MuU0NSRUVOU0hBUkVfU1RBUlRFRCxSLk1JTk9SX0VWRU5UXSxbUy5TQ1JFRU5TSEFSRV9TVE9QUEVELFIuTUlOT1JfRVZFTlRdLFtTLlRBQl9DSEFOR0UsUi5NSU5PUl9FVkVOVF0sW1MuQlJPV1NFUl9CQUNLR1JPVU5ERUQsUi5NSU5PUl9FVkVOVF0sW1MuQlJPV1NFUl9GT1JFR1JPVU5ERUQsUi5NSU5PUl9FVkVOVF0sW1MuRE9NSU5BTlRfU1BFQUtFUixSLk1JTk9SX0VWRU5UXSxbUy5BVURJT19ERVZJQ0VTX1VQREFURVMsUi5NSU5PUl9FVkVOVF0sW1MuVklERU9fREVWSUNFU19VUERBVEVTLFIuTUlOT1JfRVZFTlRdLFtTLlNQRUFLRVJfREVWSUNFU19VUERBVEVTLFIuTUlOT1JfRVZFTlRdLFtTLlNFTEVDVEVEX01JQ1JPSFBPTkVfVVBEQVRFLFIuTUlOT1JfRVZFTlRdLFtTLlNFTEVDVEVEX0NBTUVSQV9VUERBVEUsUi5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfU1BFQUtFUl9VUERBVEUsUi5NSU5PUl9FVkVOVF0sW1MuTUVESUFfUEVSTUlTU0lPTixSLk1JTk9SX0VWRU5UXSxbUy5MRUdBQ1lfU1dJVENILFIuTUlOT1JfRVZFTlRdLFtTLkFVRElPX1BMQVlfRkFJTEVELFIuTUlOT1JfRVZFTlRdLFtTLlZJREVPX1BMQVlfRkFJTEVELFIuTUlOT1JfRVZFTlRdLFtTLkFVRElPX1RSQUNLX01VVEVELFIuTUlOT1JfRVZFTlRdLFtTLlZJREVPX1RSQUNLX01VVEVELFIuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUkVCVUZGRVJJTkcsUi5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9BVURJT19CTE9DS0VELFIuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUExBWUJBQ0tfQkxPQ0tFRCxSLk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0VSUk9SLFIuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUkVDT1ZFUkFCTEVfRVJST1IsUi5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9XT1JLRVJfRVJST1IsUi5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9ORVRXT1JLX1VOQVZBSUxBQkxFLFIuTUFKT1JfRVZFTlRdLFtTLkxJVkVTVFJFQU1fTEFURU5DWSxSLk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0FOQUxZVElDU19FVkVOVCxSLk1JTk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX1BMQVlCQUNLX1JBVEVfQ0hBTkdFRCxSLk1JTk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX1FVQUxJVFlfQ0hBTkdFRCxSLk1JTk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0lOSVRJQUxJWkVELFIuTUlOT1JfRVZFTlRdLFtTLkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT04sUi5NSU5PUl9FVkVOVF0sW1MuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTixSLk1JTk9SX0VWRU5UXV0pO2NsYXNzIGxze2NvbnN0cnVjdG9yKCl7dSh0aGlzLCJldmVudHMiKTt0aGlzLmV2ZW50cz1bXX1hZGQodCl7dGhpcy5ldmVudHMucHVzaCh0KX1mbHVzaCgpe3JldHVybntlbnRyaWVzOnRoaXMuZXZlbnRzLnNwbGljZSgwLDI1KX19fWNsYXNzIHVzIGV4dGVuZHMgV3tjb25zdHJ1Y3Rvcih7bG9nZ2VyOmUscGVlcklkOnMsYXBpSG9zdG5hbWVzOm4sYXV0aFRva2VuOml9KXtzdXBlcigpO3UodGhpcywibG9nZ2VyIik7dSh0aGlzLCJwZWVySWQiKTt1KHRoaXMsImV2ZW50U3RvcmUiKTt1KHRoaXMsImFwaUVuZHBvaW50Iik7dSh0aGlzLCJhdXRoVG9rZW4iKTt0aGlzLmxvZ2dlcj1lLHRoaXMucGVlcklkPXMsdGhpcy5hdXRoVG9rZW49aSx0aGlzLmFwaUVuZHBvaW50PWBodHRwczovLyR7bi5kYUNvbGxlY3Rvcn0vYXBpL3YxL21lc3NhZ2VgLHRoaXMuZXZlbnRTdG9yZT1uZXcgbHN9c2VuZEV2ZW50c0NodW5rVG9TZXJ2ZXIoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9e3BheWxvYWQ6ZSxwZWVySWQ6dGhpcy5wZWVySWR9LG49bmV3IEFib3J0Q29udHJvbGxlcixpPXNldFRpbWVvdXQoKCk9Pm4uYWJvcnQoKSwzZTMpO3RyeXtyZXR1cm4geWllbGQgZmV0Y2godGhpcy5hcGlFbmRwb2ludCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiIsQXV0aG9yaXphdGlvbjpgQmVhcmVyICR7dGhpcy5hdXRoVG9rZW59YH0sYm9keTpKU09OLnN0cmluZ2lmeShzKSxzaWduYWw6bi5zaWduYWx9KSwhMH1jYXRjaChhKXtyZXR1cm4gdGhpcy5sb2dnZXIuZXJyb3IoImNhbGxTdGF0czo6c2VuZEV2ZW50c0NodW5rVG9TZXJ2ZXI6OmNhdGNoIix7cGVlcklkOnRoaXMucGVlcklkLGVuZHBvaW50OnRoaXMuYXBpRW5kcG9pbnQsZXJyb3I6YSBpbnN0YW5jZW9mIEVycm9yP2EubWVzc2FnZTpTdHJpbmcoYSksc3RhY2s6YSBpbnN0YW5jZW9mIEVycm9yP2Euc3RhY2s6dm9pZCAwfSksITF9ZmluYWxseXtjbGVhclRpbWVvdXQoaSl9fSl9Y2FsbEV2ZW50KGUpe2UudGltZXN0YW1wPW5ldyBEYXRlLHRoaXMuZXZlbnRTdG9yZS5hZGQoZSksdGhpcy5lbWl0KGUuZXZlbnQsZS5tZXRhRGF0YSksZHMuZ2V0KGUuZXZlbnQpPT09Ui5NQUpPUl9FVkVOVCYmdGhpcy5mbHVzaCgpfWZsdXNoKCl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBzO2NvbnN0IGU9dGhpcy5ldmVudFN0b3JlLmZsdXNoKCk7aWYoKHM9ZT09bnVsbD92b2lkIDA6ZS5lbnRyaWVzKSE9bnVsbCYmcy5sZW5ndGgpe2NvbnN0IG49eWllbGQgdGhpcy5zZW5kRXZlbnRzQ2h1bmtUb1NlcnZlcihlKTtyZXR1cm4gbnx8ZS5lbnRyaWVzLmZvckVhY2goaT0+e3RoaXMuZXZlbnRTdG9yZS5hZGQoaSl9KSxufXJldHVybiExfSl9fXZhciBXdDsoZnVuY3Rpb24ocil7ci5DSFJPTUlVTT0iY2hyb211bSIsci5GSVJFRk9YPSJmaXJlZm94IixyLlNBRkFSST0ic2FmYXJpIn0pKFd0fHwoV3Q9e30pKTtjb25zdCB6dD17REVWRUw6ImRldmVsIixQUkVQUk9EOiJwcmVwcm9kIixQUk9EOiJwcm9kIn07dmFyIFk7KGZ1bmN0aW9uKHIpe3IuQVVESU89IkFVRElPIixyLlZJREVPPSJWSURFTyIsci5TUEVBS0VSPSJTUEVBS0VSIixyLlNDUkVFTlNIQVJFPSJTQ1JFRU5TSEFSRSJ9KShZfHwoWT17fSkpO3ZhciAkdDsoZnVuY3Rpb24ocil7cltyLklOSVQ9MF09IklOSVQiLHJbci5BQ0NFUFRFRD0xXT0iQUNDRVBURUQiLHJbci5ERU5JRUQ9Ml09IkRFTklFRCIscltyLlNZU19ERU5JRUQ9M109IlNZU19ERU5JRUQiLHJbci5GQUlMRUQ9NF09IkZBSUxFRCIscltyLk5PVEZPVU5EPTVdPSJOT1RGT1VORCIscltyLk5PVF9BUFBMSUNBQkxFPTZdPSJOT1RfQVBQTElDQUJMRSJ9KSgkdHx8KCR0PXt9KSk7ZnVuY3Rpb24gdGUocil7cmV0dXJuIHI/ci5zcGxpdCgiLiIpLnNsaWNlKDAsMikuY29uY2F0KFsiMCIsIjAiXSkuam9pbigiLiIpOiIifWZ1bmN0aW9uIFplKHtwYWNrZXRzTG9zdDpyLHBhY2tldHNTZW50OnR9KXtyZXR1cm4gdD4wP3IqMTAwL3Q6MH1mdW5jdGlvbiBldCh7cGFja2V0c0xvc3Q6cixwYWNrZXRzUmVjZWl2ZWQ6dH0pe3JldHVybiB0K3I+MD9yKjEwMC8odCtyKTowfWNvbnN0IEd0PTI0MCxxdD03MjAsWXQ9OCxRdD0zLHR0PTEwLHJ0PS4wMixzdD0uMDM7ZnVuY3Rpb24gSih7c3RhdDpyLHdlaWdodDp0LHJhbmdlTWluOmUscmFuZ2VNYXg6cyxyYW5nZVJhbmtpbmdEaXJlY3Rpb246bn0pe3JldHVybiByPT1udWxsP3Q6ZT09PXM/bj09PSJVUCI/cjw9ZT90OjA6cj49cz90OjA6bj09PSJVUCI/KDEtTWF0aC5tYXgoTWF0aC5taW4ocyxNYXRoLmFicyhyKSktZSwwKS8ocy1lKSkqdDpuPT09IkRPV04iP01hdGgubWF4KE1hdGgubWluKHMsTWF0aC5hYnMocikpLWUsMCkvKHMtZSkqdDp0fWZ1bmN0aW9uIEp0KHtpc0xvd1F1YWxpdHlWaWRlbzpyLGlzVmlkZW9TdHVjazp0LGlzVmlkZW9MYWdnaW5nOmUsaml0dGVyUXVhbGl0eTpzLHBhY2tldHNMb3N0UXVhbGl0eTpufSl7Y29uc3QgaT0uOCooKHI/Ljg1OjEpKihlPy43OjEpKih0Py41OjEpKSsuMioocypuKTtyZXR1cm4gTWF0aC5yb3VuZCgoaStOdW1iZXIuRVBTSUxPTikqMTAwKS8xMDB9ZnVuY3Rpb24gWHQoe3BhY2tldHNMb3N0OnIscGFja2V0c1NlbnQ6dH0pe3JldHVybiB0PjA/cioxMDAvdDowfWZ1bmN0aW9uIFp0KHtwYWNrZXRzTG9zdDpyLHBhY2tldHNTZW50OnQsaml0dGVyOmV9KXtjb25zdCBuPUooe3N0YXQ6WHQoe3BhY2tldHNMb3N0OnIscGFja2V0c1NlbnQ6dH0pLHdlaWdodDouNyxyYW5nZU1pbjowLHJhbmdlTWF4OnR0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksYT1KKHtzdGF0OmUsd2VpZ2h0Oi4zLHJhbmdlTWluOnJ0LHJhbmdlTWF4OnN0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSk7cmV0dXJuIG4rYX1mdW5jdGlvbiBwcyh7ZnJhbWVXaWR0aDpyLGlzU2NyZWVuU2hhcmU6dH0pe3JldHVybiByPCh0P3F0Okd0KX1mdW5jdGlvbiBocyh7ZnJhbWVzUGVyU2Vjb25kOnIsaXNTY3JlZW5TaGFyZTp0fSl7cmV0dXJuIHI8KHQ/UXQ6WXQpfWZ1bmN0aW9uIG1zKHtmcmFtZXNFbmNvZGVkOnJ9KXtyZXR1cm4gcj09PTB9ZnVuY3Rpb24gZXIoe2ZyYW1lV2lkdGg6cixmcmFtZXNQZXJTZWNvbmQ6dCxwYWNrZXRzTG9zdDplLHBhY2tldHNTZW50OnMsaml0dGVyOm4saXNTY3JlZW5TaGFyZTppLGZyYW1lc0VuY29kZWQ6YX0pe2NvbnN0IGQ9Sih7c3RhdDpYdCh7cGFja2V0c0xvc3Q6ZSxwYWNrZXRzU2VudDpzfSksd2VpZ2h0OjEscmFuZ2VNaW46MCxyYW5nZU1heDp0dCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLG89Sih7c3RhdDpuLHdlaWdodDoxLHJhbmdlTWluOnJ0LHJhbmdlTWF4OnN0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksaD1wcyh7ZnJhbWVXaWR0aDpyLGlzU2NyZWVuU2hhcmU6aX0pLGc9aHMoe2ZyYW1lc1BlclNlY29uZDp0LGlzU2NyZWVuU2hhcmU6aX0pLGI9bXMoe2ZyYW1lc0VuY29kZWQ6YSxpc1NjcmVlblNoYXJlOml9KTtyZXR1cm4gSnQoe2lzTG93UXVhbGl0eVZpZGVvOmgsaXNWaWRlb0xhZ2dpbmc6Zyxpc1ZpZGVvU3R1Y2s6YixqaXR0ZXJRdWFsaXR5Om8scGFja2V0c0xvc3RRdWFsaXR5OmR9KX1mdW5jdGlvbiB0cih7cGFja2V0c0xvc3Q6cixwYWNrZXRzUmVjZWl2ZWQ6dH0pe3JldHVybiB0K3I+MD9yKjEwMC8odCtyKTowfWZ1bmN0aW9uIHJyKHtjb25jZWFsbWVudEV2ZW50czpyLHBhY2tldHNMb3N0OnQscGFja2V0c1JlY2VpdmVkOmUsaml0dGVyOnN9KXtjb25zdCBpPUooe3N0YXQ6cix3ZWlnaHQ6LjIscmFuZ2VNaW46MCxyYW5nZU1heDozLHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksYT0uNSxkPUooe3N0YXQ6dHIoe3BhY2tldHNMb3N0OnQscGFja2V0c1JlY2VpdmVkOmV9KSx3ZWlnaHQ6YSxyYW5nZU1pbjowLHJhbmdlTWF4OnR0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksaD1KKHtzdGF0OnMsd2VpZ2h0Oi4zLHJhbmdlTWluOnJ0LHJhbmdlTWF4OnN0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSk7cmV0dXJuIGkrZCtofWZ1bmN0aW9uIGZzKHtmcmFtZXNEZWNvZGVkOnJ9KXtyZXR1cm4gcj09PTB9ZnVuY3Rpb24gZ3Moe2ZyYW1lc1BlclNlY29uZDpyLGlzU2NyZWVuU2hhcmU6dH0pe3JldHVybiByPCh0P1F0Oll0KX1mdW5jdGlvbiBTcyh7ZnJhbWVXaWR0aDpyLGlzU2NyZWVuU2hhcmU6dH0pe3JldHVybiByPCh0P3F0Okd0KX1mdW5jdGlvbiBzcih7ZnJhbWVXaWR0aDpyLGZyYW1lc1BlclNlY29uZDp0LHBhY2tldHNMb3N0OmUscGFja2V0c1JlY2VpdmVkOnMsaml0dGVyOm4saXNTY3JlZW5TaGFyZTppLGZyYW1lc0RlY29kZWQ6YX0pe2NvbnN0IGQ9Sih7c3RhdDp0cih7cGFja2V0c0xvc3Q6ZSxwYWNrZXRzUmVjZWl2ZWQ6c30pLHdlaWdodDoxLHJhbmdlTWluOjAscmFuZ2VNYXg6dHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxvPUooe3N0YXQ6bix3ZWlnaHQ6MSxyYW5nZU1pbjpydCxyYW5nZU1heDpzdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGg9U3Moe2ZyYW1lV2lkdGg6cixpc1NjcmVlblNoYXJlOml9KSxnPWdzKHtmcmFtZXNQZXJTZWNvbmQ6dCxpc1NjcmVlblNoYXJlOml9KSxiPWZzKHtmcmFtZXNEZWNvZGVkOmEsaXNTY3JlZW5TaGFyZTppfSk7cmV0dXJuIEp0KHtpc0xvd1F1YWxpdHlWaWRlbzpoLGlzVmlkZW9MYWdnaW5nOmcsaXNWaWRlb1N0dWNrOmIsaml0dGVyUXVhbGl0eTpvLHBhY2tldHNMb3N0UXVhbGl0eTpkfSl9Y2xhc3MgWHtjb25zdHJ1Y3Rvcih0KXt1KHRoaXMsInBjMSIpO3UodGhpcywicGMyIik7dSh0aGlzLCJjb25zdHJhaW5WaWRlb0JpdHJhdGVLYnBzIik7dSh0aGlzLCJjb25zdHJhaW5PZmZlclRvUmVtb3ZlVmlkZW9GZWMiLCExKTt1KHRoaXMsImljZUNhbmRpZGF0ZUZpbHRlciIpO2NvbnN0IGU9bmV3IFJUQ1BlZXJDb25uZWN0aW9uKHQpLHM9bmV3IFJUQ1BlZXJDb25uZWN0aW9uKHQpO3RoaXMucGMxPWUsdGhpcy5wYzI9cyx0aGlzLmljZUNhbmRpZGF0ZUZpbHRlcj1YLm5vRmlsdGVyLHRoaXMucGMxLmFkZEV2ZW50TGlzdGVuZXIoImljZWNhbmRpZGF0ZSIsdGhpcy5vbkljZUNhbmRpZGF0ZS5iaW5kKHRoaXMsdGhpcy5wYzIpKSx0aGlzLnBjMi5hZGRFdmVudExpc3RlbmVyKCJpY2VjYW5kaWRhdGUiLHRoaXMub25JY2VDYW5kaWRhdGUuYmluZCh0aGlzLHRoaXMucGMxKSl9c3RhdGljIHBhcnNlQ2FuZGlkYXRlKHQpe2NvbnN0IGU9ImNhbmRpZGF0ZToiLHM9dC5pbmRleE9mKGUpK2UubGVuZ3RoLG49dC5zdWJzdHIocykuc3BsaXQoIiAiKTtyZXR1cm57dHlwZTpuWzddLHByb3RvY29sOm5bMl0sYWRkcmVzczpuWzRdfX1zdGF0aWMgaXNOb3RIb3N0Q2FuZGlkYXRlKHQpe3JldHVybiB0LnR5cGUhPT0iaG9zdCJ9c3RhdGljIGlzSG9zdCh0KXtyZXR1cm4gdC50eXBlPT09Imhvc3QifXN0YXRpYyBpc1JlbGF5KHQpe3JldHVybiB0LnR5cGU9PT0icmVsYXkifXN0YXRpYyBpc1JlZmxleGl2ZSh0KXtyZXR1cm4gdC50eXBlPT09InNyZmx4In1zdGF0aWMgbm9GaWx0ZXIodCl7cmV0dXJuITB9b25JY2VDYW5kaWRhdGUodCxlKXtpZihlLmNhbmRpZGF0ZSl7Y29uc3Qgcz1YLnBhcnNlQ2FuZGlkYXRlKGUuY2FuZGlkYXRlLmNhbmRpZGF0ZSk7dGhpcy5pY2VDYW5kaWRhdGVGaWx0ZXIocykmJnQuYWRkSWNlQ2FuZGlkYXRlKGUuY2FuZGlkYXRlKX19c2V0SWNlQ2FuZGlkYXRlRmlsdGVyKHQpe3RoaXMuaWNlQ2FuZGlkYXRlRmlsdGVyPXR9Y29uc3RyYWluVmlkZW9CaXRyYXRlKHQpe3RoaXMuY29uc3RyYWluVmlkZW9CaXRyYXRlS2Jwcz10fWRpc2FibGVWaWRlb0ZlYygpe3RoaXMuY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjPSEwfWdvdE9mZmVyKHQpe3RoaXMuY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjJiYodC5zZHA9dC5zZHAucmVwbGFjZSgvKG09dmlkZW8gMSBbXlxyXSspKDExNiAxMTcpKFxyXG4pL2csYCQxXHIKYCksdC5zZHA9dC5zZHAucmVwbGFjZSgvYT1ydHBtYXA6MTE2IHJlZFwvOTAwMDBcclxuL2csIiIpLHQuc2RwPXQuc2RwLnJlcGxhY2UoL2E9cnRwbWFwOjExNyB1bHBmZWNcLzkwMDAwXHJcbi9nLCIiKSx0LnNkcD10LnNkcC5yZXBsYWNlKC9hPXJ0cG1hcDo5OCBydHhcLzkwMDAwXHJcbi9nLCIiKSx0LnNkcD10LnNkcC5yZXBsYWNlKC9hPWZtdHA6OTggYXB0PTExNlxyXG4vZywiIikpLHRoaXMucGMxLnNldExvY2FsRGVzY3JpcHRpb24odCksdGhpcy5wYzIuc2V0UmVtb3RlRGVzY3JpcHRpb24odCksdGhpcy5wYzIuY3JlYXRlQW5zd2VyKCkudGhlbih0aGlzLmdvdEFuc3dlci5iaW5kKHRoaXMpLHRoaXMucmVwb3J0RmF0YWwuYmluZCh0aGlzKSl9Z290QW5zd2VyKHQpe3RoaXMuY29uc3RyYWluVmlkZW9CaXRyYXRlS2JwcyYmKHQuc2RwPXQuc2RwLnJlcGxhY2UoL2E9bWlkOnZpZGVvXHJcbi9nLGBhPW1pZDp2aWRlb1xyCmI9QVM6JHt0aGlzLmNvbnN0cmFpblZpZGVvQml0cmF0ZUticHN9XHIKYCkpLHRoaXMucGMyLnNldExvY2FsRGVzY3JpcHRpb24odCksdGhpcy5wYzEuc2V0UmVtb3RlRGVzY3JpcHRpb24odCl9ZXN0YWJsaXNoQ29ubmVjdGlvbigpe3RoaXMucGMxLmNyZWF0ZU9mZmVyKCkudGhlbih0aGlzLmdvdE9mZmVyLmJpbmQodGhpcyksdGhpcy5yZXBvcnRGYXRhbC5iaW5kKHRoaXMpKX1yZXBvcnRGYXRhbCh0KXtjb25zb2xlLmVycm9yKCJFcnJvcjoiLHQpfWdldFJvdW5kVHJpcFRpbWUoKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3RbdCxlXT15aWVsZCBQcm9taXNlLmFsbChbdGhpcy5wYzEuZ2V0U3RhdHMoKSx0aGlzLnBjMi5nZXRTdGF0cygpXSk7bGV0IHMsbjtpZih0LmZvckVhY2goaT0+e2kudHlwZT09PSJjYW5kaWRhdGUtcGFpciImJmkubm9taW5hdGVkPT09ITAmJmkuYnl0ZXNTZW50PjAmJihzPWkpfSksZS5mb3JFYWNoKGk9PntpLnR5cGU9PT0iY2FuZGlkYXRlLXBhaXIiJiZpLm5vbWluYXRlZD09PSEwJiZpLmJ5dGVzUmVjZWl2ZWQ+MCYmKG49aSl9KSxzJiZuKXRyeXtpZihzLmN1cnJlbnRSb3VuZFRyaXBUaW1lJiZuLmN1cnJlbnRSb3VuZFRyaXBUaW1lKXJldHVybntydHQ6cy5jdXJyZW50Um91bmRUcmlwVGltZSxiYWNrZW5kUlRUOm4uY3VycmVudFJvdW5kVHJpcFRpbWV9O2NvbnN0IGk9KG4ubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLXMubGFzdFBhY2tldFNlbnRUaW1lc3RhbXApLzFlMztyZXR1cm57cnR0OmksYmFja2VuZFJUVDppfX1jYXRjaChpKXtyZXR1cm59fSl9Y2xvc2UoKXt0aGlzLnBjMS5jbG9zZSgpLHRoaXMucGMyLmNsb3NlKCl9fWNsYXNzIG5yIGV4dGVuZHMgV3tjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3UodGhpcywiY2FsbCIpO3UodGhpcywidGltZU91dCIpO3RoaXMuY2FsbD1uZXcgWChlKX1zdGFydChlPTFlNCl7dGhpcy5jYWxsLmVzdGFibGlzaENvbm5lY3Rpb24oKSx0aGlzLnRpbWVPdXQ9c2V0VGltZW91dCh0aGlzLnRlc3RGYWlsZWQuYmluZCh0aGlzKSxlKX10ZXN0Q29tcGxldGUoZSl7Y2xlYXJUaW1lb3V0KHRoaXMudGltZU91dCksdGhpcy5jYWxsLmNsb3NlKCksdGhpcy5lbWl0KCJkb25lIixlKX10ZXN0RmFpbGVkKGUpe3RoaXMuY2FsbC5jbG9zZSgpLHRoaXMuZW1pdCgiZmFpbGVkIixlKX19Y29uc3QgeXM9OCx2cz0xLzFlMztjbGFzcyBicyBleHRlbmRzIG5ye2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO3UodGhpcywic2VuZGVyQ2hhbm5lbCIpO3UodGhpcywicmVjaWV2ZUNoYW5uZWwiKTt1KHRoaXMsInN0YXJ0VGltZSIpO3UodGhpcywibGFzdEJpdHJhdGVNZWFzdXJlVGltZSIpO3UodGhpcywic2VudFBheWxvYWRCeXRlcyIsMCk7dSh0aGlzLCJyZWNpZXZlZFBheWxvYWRCeXRlcyIsMCk7dSh0aGlzLCJsYXN0UmVjZWl2ZWRQYXlsb2FkQnl0ZXMiLDApO3UodGhpcywic3RvcFNlbmRpbmciLCExKTt1KHRoaXMsInRlc3RQcm9ncmVzcyIsMCk7dSh0aGlzLCJzYW1wbGVQYWNrZXQiLCIiKTt1KHRoaXMsImZpbmFsQml0cmF0ZVN1bSIsMCk7dSh0aGlzLCJiaXRSYXRlU2FtcGVscyIsMCk7dSh0aGlzLCJtYXhOdW1iZXJPZlBhY2tldHNUb1NlbmQiLDApO3UodGhpcywiYnl0ZXNUb0tlZXBCdWZmZXJlZCIsMCk7dSh0aGlzLCJ0ZXN0RHVyYXRpb25TZWNvbmRzIiw1KTt0aGlzLmNhbGwuc2V0SWNlQ2FuZGlkYXRlRmlsdGVyKFguaXNOb3RIb3N0Q2FuZGlkYXRlKSx0aGlzLnNlbmRlckNoYW5uZWw9dGhpcy5jYWxsLnBjMS5jcmVhdGVEYXRhQ2hhbm5lbChudWxsKTtmb3IobGV0IHM9MDtzPDEwMjQqMjU2O3MrPTEpdGhpcy5zYW1wbGVQYWNrZXQrPSJoIjt0aGlzLm1heE51bWJlck9mUGFja2V0c1RvU2VuZD0xLHRoaXMuYnl0ZXNUb0tlZXBCdWZmZXJlZD0xMDI0KnRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kLHRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz00LHRoaXMuc2VuZGVyQ2hhbm5lbC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIix0aGlzLnNlbmRpbmdTdGVwLmJpbmQodGhpcykpLHRoaXMuY2FsbC5wYzIuYWRkRXZlbnRMaXN0ZW5lcigiZGF0YWNoYW5uZWwiLHRoaXMub25SZWNpZXZlckNoYW5uZWwuYmluZCh0aGlzKSl9c2VuZGluZ1N0ZXAoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMuc3RhcnRUaW1lfHwodGhpcy5zdGFydFRpbWU9ZSx0aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWU9ZSk7Zm9yKGxldCBuPTA7biE9PXRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kJiYhKHRoaXMuc2VuZGVyQ2hhbm5lbC5idWZmZXJlZEFtb3VudD49dGhpcy5ieXRlc1RvS2VlcEJ1ZmZlcmVkKTtuKz0xKXt0aGlzLnNlbnRQYXlsb2FkQnl0ZXMrPXRoaXMuc2FtcGxlUGFja2V0Lmxlbmd0aDt0cnl7dGhpcy5zZW5kZXJDaGFubmVsLnNlbmQodGhpcy5zYW1wbGVQYWNrZXQpfWNhdGNoKGkpe319Y29uc3Qgcz1lLmdldFRpbWUoKS10aGlzLnN0YXJ0VGltZS5nZXRUaW1lKCk7cz49MWUzKnRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz8odGhpcy5zdG9wU2VuZGluZz0hMCx0aGlzLnRlc3RQcm9ncmVzcz0xMDApOih0aGlzLnRlc3RQcm9ncmVzcz1zLygxMCp0aGlzLnRlc3REdXJhdGlvblNlY29uZHMpLHNldFRpbWVvdXQodGhpcy5zZW5kaW5nU3RlcC5iaW5kKHRoaXMpLDEpKX1vbk1lc3NhZ2VSZWNpZXZlZChlKXt0aGlzLnJlY2lldmVkUGF5bG9hZEJ5dGVzKz1lLmRhdGEubGVuZ3RoO2NvbnN0IHM9bmV3IERhdGUsbj1zLmdldFRpbWUoKS10aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWUuZ2V0VGltZSgpO2lmKG4+PTFlMyl7Y29uc3QgYT0odGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcy10aGlzLmxhc3RSZWNlaXZlZFBheWxvYWRCeXRlcykqeXMvKG4vMWUzKTt0aGlzLmZpbmFsQml0cmF0ZVN1bSs9YSx0aGlzLmJpdFJhdGVTYW1wZWxzKz0xLHRoaXMubGFzdFJlY2VpdmVkUGF5bG9hZEJ5dGVzPXRoaXMucmVjaWV2ZWRQYXlsb2FkQnl0ZXMsdGhpcy5sYXN0Qml0cmF0ZU1lYXN1cmVUaW1lPXN9aWYodGhpcy5zdG9wU2VuZGluZyYmdGhpcy5zZW50UGF5bG9hZEJ5dGVzPT09dGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcyl7Y29uc3QgaT10aGlzLmZpbmFsQml0cmF0ZVN1bS90aGlzLmJpdFJhdGVTYW1wZWxzO3RoaXMudGVzdENvbXBsZXRlKHt0aHJvdWdocHV0Ok1hdGgucm91bmQoaSp2cyl9KX19dGVzdENvbXBsZXRlKGUpe3RoaXMuY2FsbC5nZXRSb3VuZFRyaXBUaW1lKCkudGhlbigoe3J0dDpzLGJhY2tlbmRSVFQ6bn0pPT5zdXBlci50ZXN0Q29tcGxldGUoe1JUVDpzLGJhY2tlbmRSVFQ6bix0aHJvdWdocHV0OmUudGhyb3VnaHB1dH0pKX1vblJlY2lldmVyQ2hhbm5lbChlKXt0aGlzLnJlY2lldmVDaGFubmVsPWUuY2hhbm5lbCx0aGlzLnJlY2lldmVDaGFubmVsLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25NZXNzYWdlUmVjaWV2ZWQuYmluZCh0aGlzKSl9fWNsYXNzIGh0IGV4dGVuZHMgbnJ7Y29uc3RydWN0b3IoZSxzPVgubm9GaWx0ZXIpe3N1cGVyKGUpO3UodGhpcywiY2gxIik7dSh0aGlzLCJjaDIiKTt0aGlzLmNhbGwuc2V0SWNlQ2FuZGlkYXRlRmlsdGVyKHMpO2NvbnN0IG49dGhpcy5jYWxsLnBjMS5jcmVhdGVEYXRhQ2hhbm5lbChudWxsKTt0aGlzLmNoMT1uLG4uYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsKCk9PntuLnNlbmQoImhlbGxvIil9KSxuLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25DaDFSZWNpZXZlLmJpbmQodGhpcykpLHRoaXMuY2FsbC5wYzIuYWRkRXZlbnRMaXN0ZW5lcigiZGF0YWNoYW5uZWwiLHRoaXMuZGF0YUNoYW5uZWxIYW5kbGVyLmJpbmQodGhpcykpfW9uQ2gxUmVjaWV2ZShlKXtlLmRhdGEhPT0id29ybGQiP3RoaXMuaGFuZ3VwKCJJbnZhbGlkIGRhdGEgdHJhbnNtaXR0ZWQuIik6dGhpcy50ZXN0Q29tcGxldGUoe2Nvbm5lY3Rpdml0eTohMH0pfW9uQ2gyUmVjaWV2ZShlKXtpZihlLmRhdGEhPT0iaGVsbG8iKXRoaXMuaGFuZ3VwKCJJbnZhbGlkIGRhdGEgdHJhbnNtaXR0ZWQuIik7ZWxzZSB0cnl7dGhpcy5jaDIuc2VuZCgid29ybGQiKX1jYXRjaChzKXt9fWRhdGFDaGFubmVsSGFuZGxlcihlKXtjb25zdCBzPWUuY2hhbm5lbDt0aGlzLmNoMj1zLHMuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5vbkNoMlJlY2lldmUuYmluZCh0aGlzKSl9aGFuZ3VwKGUpe3RoaXMudGVzdEZhaWxlZChlKX19Y2xhc3MgRXMgZXh0ZW5kcyBodHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LFguaXNIb3N0KX19Y2xhc3MgVHMgZXh0ZW5kcyBodHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LFguaXNSZWxheSl9fWNsYXNzIFJzIGV4dGVuZHMgaHR7Y29uc3RydWN0b3IodCl7c3VwZXIodCxYLmlzUmVmbGV4aXZlKX19Y2xhc3MgUHN7Y29uc3RydWN0b3IoKXt1KHRoaXMsImlwSW5mb3JtYXRpb24iLG51bGwpfWdldElQRGV0YWlscyhuKXtyZXR1cm4gdyh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDp0LGFwaUhvc3RuYW1lczplLGxvZ2dlcjpzfSl7dmFyIGksYSxkO2lmKCF0aGlzLmlwSW5mb3JtYXRpb24pe3RyeXtjb25zdCBvPWBodHRwczovLyR7ZS5sb2NhdGlvbn1gLGc9eWllbGQoeWllbGQgZmV0Y2gobykpLmpzb24oKTtpZigoKGk9Zy5sb2MpPT1udWxsP3ZvaWQgMDppLmxlbmd0aCk+NSlyZXR1cm4gdGhpcy5pcEluZm9ybWF0aW9uPWcsKGE9dGhpcy5pcEluZm9ybWF0aW9uKSE9bnVsbCYmYS5pcCYmKHRoaXMuaXBJbmZvcm1hdGlvbi5pcD10ZSh0aGlzLmlwSW5mb3JtYXRpb24uaXApKSxnO3Rocm93IEVycm9yKCJJbnN1ZmZpY2llbnQgZGF0YSIpfWNhdGNoKG8pe3MuZXJyb3IoImNhbGxzdGF0czo6aXBEZXRhaWxzOjogZmFpbGVkIHRvIGZldGNoIGlwIHVzaW5nIGxvY2F0aW9uIHNlcnZpY2UiLHtlcnJvcjpvfSl9dHJ5e2NvbnN0IG89eWllbGQgZmV0Y2goYGh0dHBzOi8vJHtlLmxvY2F0aW9uTGVnYWN5fS8/dG9rZW49M2M0OTM5MzJiMDYyNGMmcGVlcklkPSR7dH1gLHttZXRob2Q6IlBPU1QifSk7dGhpcy5pcEluZm9ybWF0aW9uPXlpZWxkIG8uanNvbigpLChkPXRoaXMuaXBJbmZvcm1hdGlvbikhPW51bGwmJmQuaXAmJih0aGlzLmlwSW5mb3JtYXRpb24uaXA9dGUodGhpcy5pcEluZm9ybWF0aW9uLmlwKSl9Y2F0Y2gobyl7cy5lcnJvcigiY2FsbHN0YXRzOjppcERldGFpbHM6OiBmYWlsZWQgdG8gZmV0Y2ggaXAgdXNpbmcgbGVnYWN5IGxvY2F0aW9uIHNlcnZpY2UiLHtlcnJvcjpvfSl9fXJldHVybiB0aGlzLmlwSW5mb3JtYXRpb259KX1yZXNldENhY2hlKCl7dGhpcy5pcEluZm9ybWF0aW9uPW51bGx9fWNvbnN0IGlyPW5ldyBQcyxhcj1be3VybHM6InR1cm46dHVybi5keXRlLmluOjQ0Mz90cmFuc3BvcnQ9dGNwIix1c2VybmFtZToiZHl0ZSIsY3JlZGVudGlhbDoiZHl0ZWluIixjcmVkZW50aWFsVHlwZToicGFzc3dvcmQifSx7dXJsczoidHVybjp0dXJuLmR5dGUuaW46MzQ3OD90cmFuc3BvcnQ9dWRwIix1c2VybmFtZToiZHl0ZSIsY3JlZGVudGlhbDoiZHl0ZWluIixjcmVkZW50aWFsVHlwZToicGFzc3dvcmQifV07ZnVuY3Rpb24gb3Iocil7Y29uc3RbdCxlXT1yLnNwbGl0KCIsIik7cmV0dXJue2Nvb3Jkczp7bGF0aXR1ZGU6TnVtYmVyKHQpLGxvbmdpdHVkZTpOdW1iZXIoZSl9fX1jbGFzcyBjcntjb25zdHJ1Y3Rvcigpe3UodGhpcywidHJhbnNwb3J0Iik7dSh0aGlzLCJjYW5kaWRhdGVQYWlyIik7dSh0aGlzLCJvdXRib3VuZFZpZGVvUnRwIixuZXcgTWFwKTt1KHRoaXMsImluYm91bmRWaWRlb1J0cCIsbmV3IE1hcCk7dSh0aGlzLCJvdXRib3VuZEF1ZGlvUnRwIixuZXcgTWFwKTt1KHRoaXMsImluYm91bmRBdWRpb1J0cCIsbmV3IE1hcCk7dSh0aGlzLCJyZW1vdGVJbmJvdW5kUnRwIixuZXcgTWFwKTt1KHRoaXMsInByb2R1Y2VyU3RyZWFtTWFwIixuZXcgTWFwKTt1KHRoaXMsImNvbnN1bWVyU3RyZWFtTWFwIixuZXcgTWFwKTt1KHRoaXMsInN0YWxlUHJvZHVjZXJTdHJlYW1NYXAiLCExKTt1KHRoaXMsInN0YWxlQ29uc3VtZXJTdHJlYW1NYXAiLCExKX19Y2xhc3MgZHIgZXh0ZW5kcyBXe2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt1KHRoaXMsIm9ic2VydmVyIik7dSh0aGlzLCJvdXRib3VuZFByb2R1Y2VyTWFwIixuZXcgTWFwKTt1KHRoaXMsImluYm91bmRDb25zdW1lck1hcCIsbmV3IE1hcCk7dSh0aGlzLCJjb25zdW1lclBlZXJJZE1hcCIsbmV3IE1hcCk7dSh0aGlzLCJwYXVzZWRDb25zdW1lck1hcCIsbmV3IE1hcCk7dSh0aGlzLCJwYXVzZWRQcm9kdWNlck1hcCIsbmV3IE1hcCk7dSh0aGlzLCJvdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwIix7fSk7dSh0aGlzLCJvdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwIix7fSk7dSh0aGlzLCJvdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXAiLHt9KTt1KHRoaXMsIm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcCIse30pO3UodGhpcywidmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAiLG5ldyBNYXApO3UodGhpcywiYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAiLG5ldyBNYXApO3UodGhpcywidmlkZW9Db25zdW1lclRvU3RhdHNNYXAiLG5ldyBNYXApO3UodGhpcywiYXVkaW9Db25zdW1lclRvU3RhdHNNYXAiLG5ldyBNYXApO3UodGhpcywiY29uc3VtZXJJZHNXaXRoRnJlZXplZFZpZGVvIixuZXcgU2V0KTt1KHRoaXMsImNvbnN1bWVySWRzV2l0aEZyZWV6ZWRBdWRpbyIsbmV3IFNldCk7dSh0aGlzLCJwcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8iLG5ldyBTZXQpO3UodGhpcywicHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvIixuZXcgU2V0KTt1KHRoaXMsImZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMiLG5ldyBTZXQpO3UodGhpcywiZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcyIsbmV3IFNldCk7dSh0aGlzLCJzY3JlZW5TaGFyZVByb2R1Y2VycyIsbmV3IFNldCk7dSh0aGlzLCJzY3JlZW5TaGFyZUNvbnN1bWVycyIsbmV3IFNldCk7dSh0aGlzLCJpcERldGFpbHMiKTt1KHRoaXMsImNhbGxTdGF0c0luc3RhbmNlIik7dGhpcy5vYnNlcnZlcj1uZXcgV31yZWdpc3RlclByb2R1Y2VyKGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt5aWVsZCB0aGlzLmdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAoZSksZS5vbigiY2xvc2UiLHRoaXMuZGVyZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSksZS5vbigicGF1c2UiLHRoaXMucGF1c2VQcm9kdWNlci5iaW5kKHRoaXMsZS5pZCkpLGUub24oInJlc3VtZSIsdGhpcy5yZXN1bWVQcm9kdWNlci5iaW5kKHRoaXMsZS5pZCkpLGUuYXBwRGF0YS5zY3JlZW5TaGFyZT09PSEwJiZ0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmFkZChlLmlkKX0pfXBhdXNlUHJvZHVjZXIoZSl7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5zZXQoZSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITF9KX1yZXN1bWVQcm9kdWNlcihlKXt0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmRlbGV0ZShlKX1wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyhlLHMsbil7dmFyIGEsZDtjb25zdCBpPSgoZD0oYT10aGlzPT1udWxsP3ZvaWQgMDp0aGlzLmNhbGxTdGF0c0luc3RhbmNlKT09bnVsbD92b2lkIDA6YS5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwKT09bnVsbD92b2lkIDA6ZC5nZXQoZSkpfHx7fTtzLnRvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ9PT1uLnBhY2tldHNSZWNlaXZlZD8odGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkVmlkZW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbHN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyVmlkZW9GcmVlemVkIix7Y29uc3VtZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfdmlkZW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxWaWRlb1BhY2tldHNSZWNlaXZlZD1uLnBhY2tldHNSZWNlaXZlZCx0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlby5oYXMoZSkmJih0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlby5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmaS52aWRlbyYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsc3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtZXJWaWRlb0RlZnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsInJlc3VtZSIsZSkpKSl9cHJvY2Vzc0luYm91bmRDb25zdW1lckF1ZGlvU3RhdHMoZSxzLG4pe3ZhciBhLGQ7Y29uc3QgaT0oKGQ9KGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOmQuZ2V0KGUpKXx8e307cy50b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkPT09bi5wYWNrZXRzUmVjZWl2ZWQ/KHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpjb25zdW1lckF1ZGlvRnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX2F1ZGlvX3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsQXVkaW9QYWNrZXRzUmVjZWl2ZWQ9bi5wYWNrZXRzUmVjZWl2ZWQsdGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8uaGFzKGUpJiYodGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyQXVkaW9EZWZyZWV6ZWQiLHtjb25zdW1lcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1lcl9hdWRpb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NPdXRib3VuZFByb2R1Y2VyVmlkZW9TdGF0cyhlLHMsbil7dmFyIGE7Y29uc3QgaT0oKGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9O3MudG90YWxWaWRlb1BhY2tldHNTZW50PT09bi5wYWNrZXRzU2VudD8odGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyVmlkZW9GcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfdmlkZW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxWaWRlb1BhY2tldHNTZW50PW4ucGFja2V0c1NlbnQsdGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uaGFzKGUpJiYodGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyVmlkZW9EZWZyZWV6ZWQiLHtwcm9kdWNlcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNlcl92aWRlb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NPdXRib3VuZFByb2R1Y2VyQXVkaW9TdGF0cyhlLHMsbil7dmFyIGE7Y29uc3QgaT0oKGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9O3MudG90YWxBdWRpb1BhY2tldHNTZW50PT09bi5wYWNrZXRzU2VudD8odGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyQXVkaW9GcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfYXVkaW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxBdWRpb1BhY2tldHNTZW50PW4ucGFja2V0c1NlbnQsdGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uaGFzKGUpJiYodGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyQXVkaW9EZWZyZWV6ZWQiLHtwcm9kdWNlcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NQcm9kdWNpbmdUcmFuc3BvcnRTdGF0cyhlLHMsbil7dmFyIGc7Y29uc3QgaT0oKGc9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmcuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9LHthdWRpbzphLHZpZGVvOmQsc2NyZWVuOm99PWksaD1hfHxkfHxvO3MudG90YWxQYWNrZXRzU2VudD09PW4ucGFja2V0c1NlbnQ/KHRoaXMuZnJlZXplZFByb2R1Y2luZ1RyYW5zcG9ydElkcy5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmaCYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6cHJvZHVjaW5nVHJhbnNwb3J0RnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNpbmdfdHJhbnNwb3J0X3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsUGFja2V0c1NlbnQ9bi5wYWNrZXRzU2VudCx0aGlzLmZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMuaGFzKGUpJiYodGhpcy5mcmVlemVkUHJvZHVjaW5nVHJhbnNwb3J0SWRzLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZoJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNpbmdUcmFuc3BvcnREZWZyZWV6ZWQiLHt0cmFuc3BvcnRJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NDb25zdW1pbmdUcmFuc3BvcnRTdGF0cyhlLHMsbil7dmFyIGQsbztjb25zdCBhPSEhQXJyYXkuZnJvbSgoKG89KGQ9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmQuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOm8udmFsdWVzKCkpfHxbXSkucmVkdWNlKChoLGcpPT5ofHxnLmF1ZGlvfHxnLnZpZGVvfHxnLnNjcmVlbiwhMSk7cy50b3RhbFBhY2tldHNSZWNlaXZlZD09PW4ucGFja2V0c1NlbnQ/KHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmYSYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtaW5nVHJhbnNwb3J0RnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsUGFja2V0c1JlY2VpdmVkPW4ucGFja2V0c1NlbnQsdGhpcy5mcmVlemVkQ29uc3VtaW5nVHJhbnNwb3J0SWRzLmhhcyhlKSYmKHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmYSYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtaW5nVHJhbnNwb3J0RGVmcmVlemVkIix7dHJhbnNwb3J0SWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWluZ190cmFuc3BvcnRfc3RhdHVzIiwicmVzdW1lIixlKSkpKX1yZWdpc3RlckNvbnN1bWVyKGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt5aWVsZCB0aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5zZXQoZS5pZCx7cHJvZHVjZXJJZDplLnByb2R1Y2VySWQscGVlcklkOmUuYXBwRGF0YS5wZWVySWQsYXBwRGF0YTplLmFwcERhdGF9KSxlLm9uKCJjbG9zZSIsdGhpcy5kZXJlZ2lzdGVyQ29uc3VtZXIuYmluZCh0aGlzLGUpKSxlLm9uKCJwYXVzZSIsdGhpcy5wYXVzZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5vbigicmVzdW1lIix0aGlzLnJlc3VtZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5hcHBEYXRhLnNjcmVlblNoYXJlPT09ITAmJnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuYWRkKGUuaWQpfSl9cGF1c2VDb25zdW1lcihlKXt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLnNldChlLHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMX0pfXJlc3VtZUNvbnN1bWVyKGUpe3RoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUpfWdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAoZSxzPSExKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgbj15aWVsZCBlLmdldFN0YXRzKCksaT1zP3RoaXMuZ2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQodGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsib3V0Ym91bmQtcnRwIiwicmVtb3RlLWluYm91bmQtcnRwIl0sITEsZS5pZCkpWzBdOnZvaWQgMDtmb3IoY29uc3QgYSBvZiBuLnZhbHVlcygpKXN3aXRjaChhLnR5cGUpe2Nhc2Uib3V0Ym91bmQtcnRwIjp7dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLnNldChhLmlkLGUuaWQpO2JyZWFrfX1yZXR1cm4gaX0pfWdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSxzPSExKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgbj15aWVsZCBlLmdldFN0YXRzKCksaT1zP3RoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQodGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsiaW5ib3VuZC1ydHAiXSwhMSxlLmlkKSlbMF06dm9pZCAwO2Zvcihjb25zdCBhIG9mIG4udmFsdWVzKCkpc3dpdGNoKGEudHlwZSl7Y2FzZSJpbmJvdW5kLXJ0cCI6e3RoaXMuaW5ib3VuZENvbnN1bWVyTWFwLnNldChhLmlkLGUuaWQpO2JyZWFrfX1yZXR1cm4gaX0pfWRlcmVnaXN0ZXJQcm9kdWNlcihlKXt0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZm9yRWFjaCgocyxuKT0+e3M9PT1lLmlkJiZ0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZGVsZXRlKG4pfSksdGhpcy5wYXVzZWRQcm9kdWNlck1hcC5kZWxldGUoZS5pZCksdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5kZWxldGUoZS5pZCl9ZGVyZWdpc3RlckNvbnN1bWVyKGUpe3RoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmZvckVhY2goKHMsbik9PntzPT09ZS5pZCYmdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZGVsZXRlKG4pfSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5kZWxldGUoZS5pZCksdGhpcy5wYXVzZWRDb25zdW1lck1hcC5kZWxldGUoZS5pZCksdGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5kZWxldGUoZS5pZCl9Z2V0SWNlQ2FuZGlkYXRlU3RhdHMoZSl7dmFyIHM7cmV0dXJue2lkOmUuaWQsdHlwZTplLmNhbmRpZGF0ZVR5cGV8fGUudHlwZSxhZGRyZXNzOmUuYWRkcmVzcyxwb3J0OmUucG9ydCx1cmw6ZS51cmwscHJvdG9jb2w6KHM9ZS5yZWxheVByb3RvY29sKSE9bnVsbD9zOmUucHJvdG9jb2wsbmV0d29ya1R5cGU6ZS5uZXR3b3JrVHlwZSxyZWxhdGVkQWRkcmVzczplLnJlbGF0ZWRBZGRyZXNzLHJlbGF0ZWRQb3J0OmUucmVsYXRlZFBvcnR9fWdldFdvcmtpbmdTaW11bGNhc3RWaWRlb1N0YXRzKGUpe3JldHVybiBlLmZpbmQobj0+e2NvbnN0IGk9bi5mcmFtZXNFbmNvZGVkPjAsYT1uLnBhY2tldHNTZW50PjAsZD1uLmZyYW1lV2lkdGgmJm4uZnJhbWVIZWlnaHQ7cmV0dXJuIGkmJmEmJiEhZH0pfHxlW2UubGVuZ3RoLTFdfXBhcnNlUlRDUmVwb3J0KGUscz1bXSxuPSExLGk9dm9pZCAwLGE9dm9pZCAwKXt2YXIgcSwkLGllLGFlLENlLEllLHdlLGtlLE1lLF9lLEFlLExlLE9lO2NvbnN0IGQ9ZSxvPW5ldyBjcixoPXMubGVuZ3RoP25ldyBTZXQocyk6dm9pZCAwLGc9W10sYj1bXSxUPVtdLFY9bmV3IE1hcCxVPW5ldyBNYXA7Zm9yKGNvbnN0IG0gb2YgZC52YWx1ZXMoKSl7aWYoaCl7aWYoaC5zaXplPT09MClicmVhaztpZihoLmhhcyhtLnR5cGUpKW4mJmguZGVsZXRlKG0udHlwZSk7ZWxzZSBjb250aW51ZX1zd2l0Y2gobS50eXBlKXtjYXNlImxvY2FsLWNhbmRpZGF0ZSI6e2cucHVzaCh0aGlzLmdldEljZUNhbmRpZGF0ZVN0YXRzKG0pKTticmVha31jYXNlInJlbW90ZS1jYW5kaWRhdGUiOntiLnB1c2godGhpcy5nZXRJY2VDYW5kaWRhdGVTdGF0cyhtKSk7YnJlYWt9Y2FzZSJjYW5kaWRhdGUtcGFpciI6e2NvbnN0e25vbWluYXRlZDpjfT1tLHtzZWxlY3RlZDpsfT1tLHY9bSxCPXtub21pbmF0ZWQ6YyE9bnVsbD9jOmwsY3VycmVudFJvdW5kVHJpcFRpbWU6di5jdXJyZW50Um91bmRUcmlwVGltZSx0b3RhbFJvdW5kVHJpcFRpbWU6di50b3RhbFJvdW5kVHJpcFRpbWUsYnl0ZXNSZWNlaXZlZDp2LmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50OnYuYnl0ZXNTZW50LGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTp2LmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxhdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU6di5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsbGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wOnYubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLGxhc3RQYWNrZXRTZW50VGltZXN0YW1wOnYubGFzdFBhY2tldFNlbnRUaW1lc3RhbXAsbG9jYWxDYW5kaWRhdGVJZDp2LmxvY2FsQ2FuZGlkYXRlSWQscmVtb3RlQ2FuZGlkYXRlSWQ6di5yZW1vdGVDYW5kaWRhdGVJZCxieXRlc0Rpc2NhcmRlZE9uU2VuZDp2LmJ5dGVzRGlzY2FyZGVkT25TZW5kLHBhY2tldHNTZW50OnYucGFja2V0c1NlbnQscGFja2V0c1JlY2VpdmVkOnYucGFja2V0c1JlY2VpdmVkLHBhY2tldHNEaXNjYXJkZWRPblNlbmQ6di5wYWNrZXRzRGlzY2FyZGVkT25TZW5kfTtULnB1c2goQiksKG0ubm9taW5hdGVkPT09ITB8fG0uc2VsZWN0ZWQ9PT0hMCkmJihvLmNhbmRpZGF0ZVBhaXI9Qik7YnJlYWt9Y2FzZSJ0cmFuc3BvcnQiOntjb25zdCBjPW07YSYmKGEucHJvZHVjaW5nJiYodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdfHwodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdPXt0b3RhbFBhY2tldHNTZW50OjB9KSksYS5jb25zdW1pbmcmJih0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF18fCh0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF09e3RvdGFsUGFja2V0c1JlY2VpdmVkOjB9KSkpO2NvbnN0IGw9e2J5dGVzUmVjZWl2ZWQ6Yy5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpjLmJ5dGVzU2VudCxwYWNrZXRzU2VudDpjLnBhY2tldHNTZW50LHBhY2tldHNSZWNlaXZlZDpjLnBhY2tldHNSZWNlaXZlZCxkdGxzQ2lwaGVyOmMuZHRsc0NpcGhlcixkdGxzU3RhdGU6Yy5kdGxzU3RhdGUsaWNlUm9sZTpjLmljZVJvbGV9O2lmKG8udHJhbnNwb3J0PWwsYSl7aWYoYS5wcm9kdWNpbmcpe2NvbnN0IHY9dGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdO3RoaXMucHJvY2Vzc1Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzKGEuaWQsdixsKX1pZihhLmNvbnN1bWluZyl7Y29uc3Qgdj10aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF07dGhpcy5wcm9jZXNzQ29uc3VtaW5nVHJhbnNwb3J0U3RhdHMoYS5pZCx2LGwpfX1icmVha31jYXNlInJlbW90ZS1pbmJvdW5kLXJ0cCI6e2NvbnN0IGM9bSxsPXtqaXR0ZXI6Yy5qaXR0ZXIsZnJhY3Rpb25Mb3N0OmMuZnJhY3Rpb25Mb3N0LHJvdW5kVHJpcFRpbWU6Yy5yb3VuZFRyaXBUaW1lLHJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHM6Yy5yb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzLHRvdGFsUm91bmRUcmlwVGltZTpjLnRvdGFsUm91bmRUcmlwVGltZSxwYWNrZXRzTG9zdDpjLnBhY2tldHNMb3N0fTtvLnJlbW90ZUluYm91bmRSdHAuc2V0KGMubG9jYWxJZCxsKTticmVha31jYXNlIm91dGJvdW5kLXJ0cCI6e2lmKCF0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuaGFzKG0uaWQpKWJyZWFrO2NvbnN0IGM9bSxsPWl8fHRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5nZXQobS5pZCksdj10aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmdldChsKTtpZih2KXtpZih2Lmxhc3RSZXBvcnRDYWxjdWxhdGVkPT09ITApYnJlYWs7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5zZXQobCx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITB9KX10aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFtsXXx8KHRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW2xdPXt0b3RhbFZpZGVvUGFja2V0c1NlbnQ6MCx0b3RhbEF1ZGlvUGFja2V0c1NlbnQ6MH0pO2NvbnN0IEI9dGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbbF07aWYoWyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5tZWRpYVR5cGUpfHxbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLmtpbmQpKXtpZighdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmhhcyhtLmlkKSl7by5zdGFsZVByb2R1Y2VyU3RyZWFtTWFwPSEwO2JyZWFrfWNvbnN0IHg9dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5wcm9kdWNlcnMuZ2V0KGwpO2lmKCgocT14PT1udWxsP3ZvaWQgMDp4LnRyYWNrKT09bnVsbD92b2lkIDA6cS5yZWFkeVN0YXRlKT09PSJlbmRlZCIpYnJlYWs7by5wcm9kdWNlclN0cmVhbU1hcC5oYXMobCl8fG8ucHJvZHVjZXJTdHJlYW1NYXAuc2V0KGwse291dGJvdW5kVmlkZW9SdHBJZDpbXSxvdXRib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCB5PXtieXRlc1NlbnQ6Yy5ieXRlc1NlbnQscGFja2V0c1NlbnQ6Yy5wYWNrZXRzU2VudCxuYWNrQ291bnQ6Yy5uYWNrQ291bnQsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGFjdGl2ZTpjLmFjdGl2ZSxjb2RlY0lkOmMuY29kZWNJZCxoZWFkZXJCeXRlc1NlbnQ6Yy5oZWFkZXJCeXRlc1NlbnR8fDAsdG90YWxQYWNrZXRTZW5kRGVsYXk6Yy50b3RhbFBhY2tldFNlbmREZWxheXx8MH07aWYoYy5tZWRpYVR5cGU9PT0idmlkZW8ifHxjLmtpbmQ9PT0idmlkZW8iKXtjb25zdCBwPWMsSD1HKHtmcmFtZUhlaWdodDpwLmZyYW1lSGVpZ2h0LGZyYW1lV2lkdGg6cC5mcmFtZVdpZHRoLGZyYW1lc0VuY29kZWQ6cC5mcmFtZXNFbmNvZGVkLGZyYW1lc0Ryb3BwZWQ6cC5mcmFtZXNEcm9wcGVkLGZyYW1lc1BlclNlY29uZDpwLmZyYW1lc1BlclNlY29uZCxmcmFtZXNTZW50OnAuZnJhbWVzU2VudCxrZXlGcmFtZXNFbmNvZGVkOnAua2V5RnJhbWVzRW5jb2RlZCxmaXJDb3VudDpwLmZpckNvdW50LGVuY29kZXJJbXBsZW1lbnRhdGlvbjpwLmVuY29kZXJJbXBsZW1lbnRhdGlvbixodWdlRnJhbWVzU2VudDpwLmh1Z2VGcmFtZXNTZW50LHBsaUNvdW50OnAucGxpQ291bnQscXBTdW06cC5xcFN1bSxxdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9uczpwLnF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zLHF1YWxpdHlMaW1pdGF0aW9uUmVhc29uOnAucXVhbGl0eUxpbWl0YXRpb25SZWFzb24scXVhbGl0eUxpbWl0YXRpb25SZXNvbHV0aW9uQ2hhbmdlczpwLnF1YWxpdHlMaW1pdGF0aW9uUmVzb2x1dGlvbkNoYW5nZXMsdG90YWxFbmNvZGVUaW1lOnAudGFyZ2V0Qml0cmF0ZSx0b3RhbFBhY2tldFNlbmREZWxheTpwLnRvdGFsUGFja2V0U2VuZERlbGF5LHJldHJhbnNtaXR0ZWRCeXRlc1NlbnQ6cC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50LHJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudDpwLnJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudCxzY2FsYWJpbGl0eU1vZGU6cC5zY2FsYWJpbGl0eU1vZGUscG93ZXJFZmZpY2llbnRFbmNvZGVyOnAucG93ZXJFZmZpY2llbnRFbmNvZGVyfSx5KTtvLm91dGJvdW5kVmlkZW9SdHAuc2V0KG0uaWQsSCksby5wcm9kdWNlclN0cmVhbU1hcC5nZXQobCkub3V0Ym91bmRWaWRlb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzT3V0Ym91bmRQcm9kdWNlclZpZGVvU3RhdHMobCxCLEgpfWVsc2UgaWYoYy5tZWRpYVR5cGU9PT0iYXVkaW8ifHxjLmtpbmQ9PT0iYXVkaW8iKXtjb25zdCBwPWMsSD1HKHtyZXRyYW5zbWl0dGVkQnl0ZXNTZW50OnAucmV0cmFuc21pdHRlZEJ5dGVzU2VudCxyZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQ6cC5yZXRyYW5zbWl0dGVkUGFja2V0c1NlbnR9LHkpO28ub3V0Ym91bmRBdWRpb1J0cC5zZXQobS5pZCxIKSxvLnByb2R1Y2VyU3RyZWFtTWFwLmdldChsKS5vdXRib3VuZEF1ZGlvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NPdXRib3VuZFByb2R1Y2VyQXVkaW9TdGF0cyhsLEIsSCl9fWVsc2UgdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoYENhbGxzdGF0czogVW5rbm93biBPdXRib3VuZC1ydHAuIG1lZGlhdHlwZTogJHtjLm1lZGlhVHlwZX0ga2luZDogJHtjLmtpbmR9YCk7YnJlYWt9Y2FzZSJpbmJvdW5kLXJ0cCI6e2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMobS5pZCkpYnJlYWs7Y29uc3QgYz1tLGw9aXx8dGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZ2V0KG0uaWQpLHY9dGhpcy5wYXVzZWRDb25zdW1lck1hcC5nZXQobCk7aWYodil7aWYodi5sYXN0UmVwb3J0Q2FsY3VsYXRlZD09PSEwKWJyZWFrO3RoaXMucGF1c2VkQ29uc3VtZXJNYXAuc2V0KGwse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiEwfSl9aWYoYy5zc3JjPT09MTIzNClicmVhazt0aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFtsXXx8KHRoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW2xdPXt0b3RhbFZpZGVvUGFja2V0c1JlY2VpdmVkOjAsdG90YWxBdWRpb1BhY2tldHNSZWNlaXZlZDowfSk7Y29uc3QgQj10aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFtsXTtpZihbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLm1lZGlhVHlwZSl8fFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMua2luZCkpe2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMobS5pZCkpe28uc3RhbGVDb25zdW1lclN0cmVhbU1hcD0hMDticmVha31vLmNvbnN1bWVyU3RyZWFtTWFwLmhhcyhsKXx8by5jb25zdW1lclN0cmVhbU1hcC5zZXQobCx7aW5ib3VuZFZpZGVvUnRwSWQ6W10saW5ib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCB4PXtieXRlc1JlY2VpdmVkOmMuYnl0ZXNSZWNlaXZlZCxwYWNrZXRzUmVjZWl2ZWQ6Yy5wYWNrZXRzUmVjZWl2ZWQscGFja2V0c0xvc3Q6Yy5wYWNrZXRzTG9zdD49MD9jLnBhY2tldHNMb3N0OjAsaml0dGVyOmMuaml0dGVyLG5hY2tDb3VudDpjLm5hY2tDb3VudCxqaXR0ZXJCdWZmZXJEZWxheTpjLmppdHRlckJ1ZmZlckRlbGF5LGppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudDpjLmppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudCxsYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXA6Yy5sYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXAsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGNvZGVjSWQ6Yy5jb2RlY0lkLGhlYWRlckJ5dGVzUmVjZWl2ZWQ6Yy5oZWFkZXJCeXRlc1JlY2VpdmVkfHwwLHBhY2tldHNEaXNjYXJkZWQ6Yy5wYWNrZXRzRGlzY2FyZGVkfHwwLGppdHRlckJ1ZmZlck1pbmltdW1EZWxheTpjLmppdHRlckJ1ZmZlck1pbmltdW1EZWxheXx8MCxqaXR0ZXJCdWZmZXJUYXJnZXREZWxheTpjLmppdHRlckJ1ZmZlclRhcmdldERlbGF5fHwwfTtpZihjLm1lZGlhVHlwZT09PSJ2aWRlbyJ8fGMua2luZD09PSJ2aWRlbyIpe2NvbnN0IHk9YyxwPUcoe2ZyYW1lSGVpZ2h0OnkuZnJhbWVIZWlnaHQsZnJhbWVXaWR0aDp5LmZyYW1lV2lkdGgsZnJhbWVzRGVjb2RlZDp5LmZyYW1lc0RlY29kZWQsZnJhbWVzRHJvcHBlZDp5LmZyYW1lc0Ryb3BwZWQsZnJhbWVzUGVyU2Vjb25kOnkuZnJhbWVzUGVyU2Vjb25kLGZyYW1lc1JlY2VpdmVkOnkuZnJhbWVzUmVjZWl2ZWQsa2V5RnJhbWVzRGVjb2RlZDp5LmtleUZyYW1lc0RlY29kZWQsZmlyQ291bnQ6eS5maXJDb3VudCxkZWNvZGVySW1wbGVtZW50YXRpb246eS5kZWNvZGVySW1wbGVtZW50YXRpb24scGxpQ291bnQ6eS5wbGlDb3VudCx0b3RhbFByb2Nlc3NpbmdEZWxheTp5LnRvdGFsUHJvY2Vzc2luZ0RlbGF5LHFwU3VtOnkucXBTdW18fDAsdG90YWxBc3NlbWJseVRpbWU6eS50b3RhbEFzc2VtYmx5VGltZXx8MCx0b3RhbERlY29kZVRpbWU6eS50b3RhbERlY29kZVRpbWV8fDAsdG90YWxGcmVlemVzRHVyYXRpb246eS50b3RhbEZyZWV6ZXNEdXJhdGlvbnx8MCx0b3RhbEludGVyRnJhbWVEZWxheTp5LnRvdGFsSW50ZXJGcmFtZURlbGF5fHwwLHRvdGFsUGF1c2VzRHVyYXRpb246eS50b3RhbFBhdXNlc0R1cmF0aW9ufHwwLHRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheTp5LnRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheXx8MCxmcmVlemVDb3VudDp5LmZyZWV6ZUNvdW50fHwwLHBhdXNlQ291bnQ6eS5wYXVzZUNvdW50fHwwLHBvd2VyRWZmaWNpZW50RGVjb2Rlcjp5LnBvd2VyRWZmaWNpZW50RGVjb2Rlcn0seCk7cC5zY29yZT1zcih7ZnJhbWVXaWR0aDpwLmZyYW1lV2lkdGh8fDAsZnJhbWVzRGVjb2RlZDoocC5mcmFtZXNEZWNvZGVkfHwwKS0oKCgkPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6JC5mcmFtZXNEZWNvZGVkKXx8MCksZnJhbWVzUGVyU2Vjb25kOnAuZnJhbWVzUGVyU2Vjb25kfHwwLHBhY2tldHNMb3N0OihwLnBhY2tldHNMb3N0fHwwKS0oKChpZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOmllLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihwLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoYWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDphZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKSxqaXR0ZXI6cC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyhsKX0pLFUuc2V0KGwse3Njb3JlOisocC5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6cC5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0OnAuZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOnAuZnJhbWVzUGVyU2Vjb25kfHwwLHBhY2tldHNMb3N0UGVyY2VudGFnZTpldCh7cGFja2V0c0xvc3Q6KHAucGFja2V0c0xvc3R8fDApLSgoKENlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6Q2UucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KHAucGFja2V0c1JlY2VpdmVkfHwwKS0oKChJZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOkllLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOnAuaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXMobCksYml0cmF0ZTooKHAuYnl0ZXNSZWNlaXZlZHx8MCktKCgod2U9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDp3ZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KGwscCksby5pbmJvdW5kVmlkZW9SdHAuc2V0KG0uaWQscCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQobCkuaW5ib3VuZFZpZGVvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJWaWRlb1N0YXRzKGwsQixwKX1lbHNlIGlmKGMubWVkaWFUeXBlPT09ImF1ZGlvInx8Yy5raW5kPT09ImF1ZGlvIil7Y29uc3QgeT1jLHA9Ryh7YXVkaW9MZXZlbDp5LmF1ZGlvTGV2ZWwsY29uY2VhbGVkU2FtcGxlczp5LmNvbmNlYWxlZFNhbXBsZXMsY29uY2VhbG1lbnRFdmVudHM6eS5jb25jZWFsbWVudEV2ZW50cyx0b3RhbEF1ZGlvRW5lcmd5OnkudG90YWxBdWRpb0VuZXJneSx0b3RhbFNhbXBsZXNEdXJhdGlvbjp5LnRvdGFsU2FtcGxlc0R1cmF0aW9uLHRvdGFsU2FtcGxlc1JlY2VpdmVkOnkudG90YWxTYW1wbGVzUmVjZWl2ZWQsZmVjUGFja2V0c0Rpc2NhcmRlZDp5LmZlY1BhY2tldHNEaXNjYXJkZWR8fDAsZmVjUGFja2V0c1JlY2VpdmVkOnkuZmVjUGFja2V0c1JlY2VpdmVkfHwwLGluc2VydGVkU2FtcGxlc0ZvckRlY2VsZXJhdGlvbjp5Lmluc2VydGVkU2FtcGxlc0ZvckRlY2VsZXJhdGlvbnx8MCxyZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbjp5LnJlbW92ZWRTYW1wbGVzRm9yQWNjZWxlcmF0aW9ufHwwLHNpbGVudENvbmNlYWxlZFNhbXBsZXM6eS5zaWxlbnRDb25jZWFsZWRTYW1wbGVzfHwwLHBsYXlvdXRJZDp5LnBsYXlvdXRJZH0seCk7cC5zY29yZT1ycih7Y29uY2VhbG1lbnRFdmVudHM6KHAuY29uY2VhbG1lbnRFdmVudHN8fDApLSgoKGtlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6a2UuY29uY2VhbG1lbnRFdmVudHMpfHwwKSxwYWNrZXRzTG9zdDoocC5wYWNrZXRzTG9zdHx8MCktKCgoTWU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDpNZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDoocC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKF9lPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6X2UucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOnAuaml0dGVyfHwwfSksVS5zZXQobCx7c2NvcmU6KyhwLnNjb3JlKjEwKS50b0ZpeGVkKCkscGFja2V0c0xvc3RQZXJjZW50YWdlOmV0KHtwYWNrZXRzTG9zdDoocC5wYWNrZXRzTG9zdHx8MCktKCgoQWU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDpBZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDoocC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKExlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6TGUucGFja2V0c1JlY2VpdmVkKXx8MCl9KSxqaXR0ZXI6cC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyhsKSxiaXRyYXRlOigocC5ieXRlc1JlY2VpdmVkfHwwKS0oKChPZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOk9lLmJ5dGVzUmVjZWl2ZWQpfHwwKSkqOC83fSksdGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5zZXQobCxwKSxvLmluYm91bmRBdWRpb1J0cC5zZXQobS5pZCxwKSxvLmNvbnN1bWVyU3RyZWFtTWFwLmdldChsKS5pbmJvdW5kQXVkaW9SdHBJZC5wdXNoKG0uaWQpLHRoaXMucHJvY2Vzc0luYm91bmRDb25zdW1lckF1ZGlvU3RhdHMobCxCLHApfX1lbHNlIHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmVycm9yKGBDYWxsc3RhdHM6IFVua25vd24gSW5ib3VuZC1ydHAuIG1lZGlhdHlwZTogJHtjLm1lZGlhVHlwZX0ga2luZDogJHtjLmtpbmR9YCk7YnJlYWt9fX1pZihvLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKG0sYyk9Pnt2YXIgbCx2LEIseCx5LHAsSCxEZSxOZSxWZSxCZSxGZSx4ZSxqZSxVZSxIZSxLZSxXZSx6ZSwkZSxHZSxxZSxZZTtpZihtLm91dGJvdW5kVmlkZW9SdHBJZC5sZW5ndGg+MCl7Y29uc3QgRD1bXTttLm91dGJvdW5kVmlkZW9SdHBJZC5mb3JFYWNoKE90PT57RC5wdXNoKG8ub3V0Ym91bmRWaWRlb1J0cC5nZXQoT3QpKX0pO2NvbnN0IGs9dGhpcy5nZXRXb3JraW5nU2ltdWxjYXN0VmlkZW9TdGF0cyhEKTtrLnNjb3JlPWVyKHtmcmFtZVdpZHRoOmsuZnJhbWVXaWR0aHx8MCxmcmFtZXNQZXJTZWNvbmQ6ay5mcmFtZXNQZXJTZWNvbmR8fDAsaml0dGVyOigobD1rLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpsLmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKSxwYWNrZXRzU2VudDooay5wYWNrZXRzU2VudHx8MCktKCgodj10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnYucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChCPWsucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOkIucGFja2V0c0xvc3QpfHwwKS0oKCh5PSh4PXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6eC5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6eS5wYWNrZXRzTG9zdCl8fDApLGZyYW1lc0VuY29kZWQ6KGsuZnJhbWVzRW5jb2RlZHx8MCktKCgocD10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnAuZnJhbWVzRW5jb2RlZCl8fDApfSksVi5zZXQoYyx7c2NvcmU6KyhrLnNjb3JlKjEwKS50b0ZpeGVkKCksZnJhbWVXaWR0aDprLmZyYW1lV2lkdGh8fDAsZnJhbWVIZWlnaHQ6ay5mcmFtZUhlaWdodHx8MCxmcmFtZXNQZXJTZWNvbmQ6ay5mcmFtZXNQZXJTZWNvbmR8fDAsaml0dGVyOigoSD1rLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpILmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKSxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6WmUoe3BhY2tldHNTZW50OihrLnBhY2tldHNTZW50fHwwKS0oKChEZT10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOkRlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoTmU9ay5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6TmUucGFja2V0c0xvc3QpfHwwKS0oKChCZT0oVmU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpWZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6QmUucGFja2V0c0xvc3QpfHwwKX0pLGJpdHJhdGU6KChrLmJ5dGVzU2VudHx8MCktKCgoRmU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpGZS5ieXRlc1NlbnQpfHwwKSkqOC83LGNwdUxpbWl0YXRpb25zOmsucXVhbGl0eUxpbWl0YXRpb25SZWFzb249PT0iY3B1IixiYW5kd2lkdGhMaW1pdGF0aW9uczprLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImJhbmR3aWR0aCJ9KSx0aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLGspfWVsc2UgaWYobS5vdXRib3VuZEF1ZGlvUnRwSWQubGVuZ3RoPjApe2NvbnN0IEQ9by5vdXRib3VuZEF1ZGlvUnRwLmdldChtLm91dGJvdW5kQXVkaW9SdHBJZFswXSk7RC5zY29yZT1adCh7cGFja2V0c1NlbnQ6KEQucGFja2V0c1NlbnR8fDApLSgoKHhlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6eGUucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChqZT1ELnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpqZS5wYWNrZXRzTG9zdCl8fDApLSgoKEhlPShVZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlVlLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpIZS5wYWNrZXRzTG9zdCl8fDApLGppdHRlcjooKEtlPUQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOktlLmppdHRlcil8fDB9KSxWLnNldChjLHtzY29yZTorKEQuc2NvcmUqMTApLnRvRml4ZWQoKSxiaXRyYXRlOigoRC5ieXRlc1NlbnR8fDApLSgoKFdlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6V2UuYnl0ZXNTZW50KXx8MCkpKjgvNyxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6WmUoe3BhY2tldHNTZW50OihELnBhY2tldHNTZW50fHwwKS0oKCh6ZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnplLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoJGU9RC5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6JGUucGFja2V0c0xvc3QpfHwwKS0oKChxZT0oR2U9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpHZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6cWUucGFja2V0c0xvc3QpfHwwKX0pLGppdHRlcjooKFllPUQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOlllLmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKX0pLHRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuc2V0KGMsRCl9fSksVC5mb3JFYWNoKG09Pntjb25zdCBjPWcuZmluZCh2PT52LmlkPT09bS5sb2NhbENhbmRpZGF0ZUlkPyhtLmxvY2FsQ2FuZGlkYXRlSWQ9di5pZCx2KTpudWxsKSxsPWIuZmluZCh2PT52LmlkPT09bS5yZW1vdGVDYW5kaWRhdGVJZD8obS5yZW1vdGVDYW5kaWRhdGVJZD12LmlkLHYpOm51bGwpO2MmJihtLmxvY2FsQ2FuZGlkYXRlVHlwZT1jLnR5cGUsbS5sb2NhbENhbmRpZGF0ZUFkZHJlc3M9dGUoYy5hZGRyZXNzKSxtLmxvY2FsQ2FuZGlkYXRlUG9ydD1jLnBvcnQsbS5sb2NhbENhbmRpZGF0ZVByb3RvY29sPWMucHJvdG9jb2wsbS5sb2NhbENhbmRpZGF0ZVVybD1jLnVybCxtLmxvY2FsQ2FuZGlkYXRlTmV0d29ya1R5cGU9Yy5uZXR3b3JrVHlwZSxtLmxvY2FsQ2FuZGlkYXRlUmVsYXRlZEFkZHJlc3M9dGUoYy5yZWxhdGVkQWRkcmVzcyksbS5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRQb3J0PWMucmVsYXRlZFBvcnQpLGwmJihtLnJlbW90ZUNhbmRpZGF0ZVR5cGU9bC50eXBlLG0ucmVtb3RlQ2FuZGlkYXRlQWRkcmVzcz10ZShsLmFkZHJlc3MpLG0ucmVtb3RlQ2FuZGlkYXRlUG9ydD1sLnBvcnQsbS5yZW1vdGVDYW5kaWRhdGVQcm90b2NvbD1sLnByb3RvY29sLG0ucmVtb3RlQ2FuZGlkYXRlVXJsPWwudXJsKX0pLG8uY2FuZGlkYXRlUGFpciYmKG8udHJhbnNwb3J0PyhvLnRyYW5zcG9ydC50b3RhbFJvdW5kVHJpcFRpbWU9by5jYW5kaWRhdGVQYWlyLnRvdGFsUm91bmRUcmlwVGltZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSk6by50cmFuc3BvcnQ9e2J5dGVzUmVjZWl2ZWQ6by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50Om8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsdG90YWxSb3VuZFRyaXBUaW1lOm8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUscm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWV9KSxvLnRyYW5zcG9ydCYmKG8udHJhbnNwb3J0LmNhbmRpZGF0ZVBhaXJzPVQpLG8udHJhbnNwb3J0JiYhby50cmFuc3BvcnQucm91bmRUcmlwVGltZSl7bGV0IG09MCxjPTA7by5yZW1vdGVJbmJvdW5kUnRwLmZvckVhY2goKGwsdik9PntsLnJvdW5kVHJpcFRpbWUmJmwucm91bmRUcmlwVGltZT5tJiYobT1sLnJvdW5kVHJpcFRpbWUsYz1sLnRvdGFsUm91bmRUcmlwVGltZSl9KSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW0sby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPWN9aWYoVS5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLFUpfWNhdGNoKG0pe31pZihWLnNpemU+MCl0cnl7dGhpcy5vYnNlcnZlci5lbWl0KCJwcm9kdWNlcl9zY29yZSIsVil9Y2F0Y2gobSl7fXJldHVybiBvfWdldFByb2R1Y2Vyc1JlcG9ydChlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1lLm1hcChuPT50aGlzLmdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAobiwhMCkpO3JldHVybiBzLmxlbmd0aD4wP1Byb21pc2UuYWxsKHMpOnZvaWQgMH0pfWdldENvbnN1bWVyc1JlcG9ydChlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1lLm1hcChuPT50aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAobiwhMCkpO3JldHVybiBzLmxlbmd0aD4wP1Byb21pc2UuYWxsKHMpOnZvaWQgMH0pfWdldFRyYW5zcG9ydFJlcG9ydChlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIGUuZ2V0U3RhdHMoKX0pfWdldFByb2Nlc3NlZFN0YXRzKGUscyxuKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgaT15aWVsZCB0aGlzLmdldFRyYW5zcG9ydFJlcG9ydChlKSxhPXtwcm9kdWNpbmc6bixjb25zdW1pbmc6cyxpZDplLmlkfSxkPWksbz10aGlzLnBhcnNlUlRDUmVwb3J0KGQsWyJ0cmFuc3BvcnQiLCJjYW5kaWRhdGUtcGFpciIsImluYm91bmQtcnRwIiwib3V0Ym91bmQtcnRwIiwicmVtb3RlLWluYm91bmQtcnRwIiwibG9jYWwtY2FuZGlkYXRlIiwicmVtb3RlLWNhbmRpZGF0ZSJdLCExLHZvaWQgMCxhKTtpZighbylyZXR1cm47Y29uc3QgaD17c3RhdHM6by50cmFuc3BvcnQsdHJhbnNwb3J0SWQ6ZS5pZCxjb25zdW1pbmc6cyxwcm9kdWNpbmc6bn0sZz1vLnN0YWxlUHJvZHVjZXJTdHJlYW1NYXA/dm9pZCAwOnRoaXMuZ2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQobyksYj1vLnN0YWxlQ29uc3VtZXJTdHJlYW1NYXA/dm9pZCAwOnRoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQobyk7cmV0dXJue3RyYW5zcG9ydFJlcG9ydDpoLHByb2R1Y2VyUmVwb3J0OmcsY29uc3VtZXJSZXBvcnQ6Yn19KX1nZXRQcm9kdWNlclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBzPVtdO3RyeXtlLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKG4saSk9Pnt2YXIgYSxkO3MucHVzaCh7cHJvZHVjZXJJZDppLHZpZGVvU3RhdHM6bi5vdXRib3VuZFZpZGVvUnRwSWQubWFwKG89PmUub3V0Ym91bmRWaWRlb1J0cC5nZXQobykpLGF1ZGlvU3RhdHM6bi5vdXRib3VuZEF1ZGlvUnRwSWQubWFwKG89PmUub3V0Ym91bmRBdWRpb1J0cC5nZXQobykpLGFwcERhdGE6KChkPShhPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UucHJvZHVjZXJzKT09bnVsbD92b2lkIDA6YS5nZXQoaSkpPT1udWxsP3ZvaWQgMDpkLmFwcERhdGEpfHxudWxsfSl9KX1jYXRjaChuKXt0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0Iix7ZXJyb3I6e3JlYXNvbjpuLnJlYXNvbixtZXNzYWdlOm4ubWVzc2FnZX19KX1yZXR1cm4gc31nZXRDb25zdW1lclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBzPVtdO3RyeXtlLmNvbnN1bWVyU3RyZWFtTWFwLmZvckVhY2goKG4saSk9Pntjb25zdHtwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvfT10aGlzLmNvbnN1bWVyUGVlcklkTWFwLmdldChpKTtzLnB1c2goe2NvbnN1bWVySWQ6aSxwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvLHZpZGVvU3RhdHM6bi5pbmJvdW5kVmlkZW9SdHBJZC5tYXAoaD0+ZS5pbmJvdW5kVmlkZW9SdHAuZ2V0KGgpKSxhdWRpb1N0YXRzOm4uaW5ib3VuZEF1ZGlvUnRwSWQubWFwKGg9PmUuaW5ib3VuZEF1ZGlvUnRwLmdldChoKSl9KX0pfWNhdGNoKG4pe2NvbnNvbGUuZXJyb3IoImdldENvbnN1bWVyc1JlcG9ydDogIixuLGUpfXJldHVybiBzfWdldFVzZXJMb2NhdGlvbigpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtyZXR1cm4gbmV3IFByb21pc2UoKGUscyk9Pnt0cnl7bmF2aWdhdG9yLmdlb2xvY2F0aW9uP25hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24obj0+e2Uobil9KTpzKCl9Y2F0Y2gobil7cyhuKX19KX0pfWdldENvbm5lY3Rpdml0eShlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e2NvbnN0IHM9e2ljZVNlcnZlcnM6ZXx8YXJ9LG49bmV3IFByb21pc2UoKGcsYik9Pnt0cnl7Y29uc3QgVD1uZXcgRXMocyk7VC5hZGRMaXN0ZW5lcigiZG9uZSIsZyksVC5hZGRMaXN0ZW5lcigiZmFpbGVkIiwoKT0+e2coe2Nvbm5lY3Rpdml0eTohMX0pfSksVC5zdGFydCgyZTMpfWNhdGNoKFQpe2IoVCl9fSksaT1uZXcgUHJvbWlzZSgoZyxiKT0+e3RyeXtjb25zdCBUPW5ldyBUcyhzKTtULmFkZExpc3RlbmVyKCJkb25lIixnKSxULmFkZExpc3RlbmVyKCJmYWlsZWQiLCgpPT57Zyh7Y29ubmVjdGl2aXR5OiExfSl9KSxULnN0YXJ0KDJlMyl9Y2F0Y2goVCl7YihUKX19KSxhPW5ldyBQcm9taXNlKChnLGIpPT57dHJ5e2NvbnN0IFQ9bmV3IFJzKHMpO1QuYWRkTGlzdGVuZXIoImRvbmUiLGcpLFQuYWRkTGlzdGVuZXIoImZhaWxlZCIsKCk9PntnKHtjb25uZWN0aXZpdHk6ITF9KX0pLFQuc3RhcnQoMmUzKX1jYXRjaChUKXtiKFQpfX0pLFtkLG8saF09eWllbGQgUHJvbWlzZS5hbGwoW24saSxhXSk7cmV0dXJue2hvc3Q6ZD09bnVsbD92b2lkIDA6ZC5jb25uZWN0aXZpdHkscmVsYXk6bz09bnVsbD92b2lkIDA6by5jb25uZWN0aXZpdHkscmVmbGV4aXZlOmg9PW51bGw/dm9pZCAwOmguY29ubmVjdGl2aXR5fX1jYXRjaChzKXtyZXR1cm57aG9zdDohMSxyZWxheTohMSxyZWZsZXhpdmU6ITF9fX0pfWdldFRocm91Z2hwdXQoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RyeXtjb25zdCBuPXlpZWxkIG5ldyBQcm9taXNlKChpLGEpPT57dHJ5e2NvbnN0IGQ9e2ljZVNlcnZlcnM6ZXx8YXJ9LG89bmV3IGJzKGQpO28uYWRkTGlzdGVuZXIoImRvbmUiLGkpLG8uYWRkTGlzdGVuZXIoImZhaWxlZCIsYSksby5zdGFydCgxZTQpfWNhdGNoKGQpe2EoZCl9fSk7cmV0dXJue3Rocm91Z2hwdXQ6bi50aHJvdWdocHV0LGZyYWN0aW9uYWxMb3NzOjAsUlRUOm4uUlRULGppdHRlcjowLGJhY2tlbmRSVFQ6bi5iYWNrZW5kUlRUfX1jYXRjaChzKXtyZXR1cm59fSl9Z2V0SVBEZXRhaWxzKCl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBlLHM7dHJ5e3JldHVybiB0aGlzLmlwRGV0YWlsc3x8KHRoaXMuaXBEZXRhaWxzPXlpZWxkIGlyLmdldElQRGV0YWlscyh7cGVlcklkOihlPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDplLnBlZXJJZCxhcGlIb3N0bmFtZXM6KHM9dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOnMuYXBpSG9zdG5hbWVzLGxvZ2dlcjp0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlcn0pKSx0aGlzLmlwRGV0YWlsc31jYXRjaChuKXtyZXR1cm59fSl9Z2V0TmV0d29ya1F1YWxpdHkoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0W3Msbl09eWllbGQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0Q29ubmVjdGl2aXR5KGUpLHRoaXMuZ2V0VGhyb3VnaHB1dChlKV0pO3JldHVybntjb25uZWN0aXZpdHk6cyx0aHJvdWdocHV0Om49PW51bGw/dm9pZCAwOm4udGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczpuPT1udWxsP3ZvaWQgMDpuLmZyYWN0aW9uYWxMb3NzLFJUVDpuPT1udWxsP3ZvaWQgMDpuLlJUVCxqaXR0ZXI6bj09bnVsbD92b2lkIDA6bi5qaXR0ZXIsYmFja2VuZFJUVDpuPT1udWxsP3ZvaWQgMDpuLmJhY2tlbmRSVFR9fSl9Z2V0TmV0d29ya0luZm8oZSxzPSExKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGQsbztpZihzKXtjb25zdCBoPXlpZWxkIHRoaXMuZ2V0SVBEZXRhaWxzKCk7cmV0dXJue2lwRGV0YWlsczpoLGVmZmVjdGl2ZU5ldHdvcmtUeXBlOihkPW5hdmlnYXRvci5jb25uZWN0aW9uKT09bnVsbD92b2lkIDA6ZC5lZmZlY3RpdmVUeXBlLGxvY2F0aW9uOmghPW51bGwmJmgubG9jP29yKGg9PW51bGw/dm9pZCAwOmgubG9jKTp2b2lkIDB9fWNvbnN0W24saSxhXT15aWVsZCBQcm9taXNlLmFsbChbdGhpcy5nZXRDb25uZWN0aXZpdHkoZSksdGhpcy5nZXRUaHJvdWdocHV0KGUpLHRoaXMuZ2V0SVBEZXRhaWxzKCldKTtyZXR1cm57aXBEZXRhaWxzOmEsZWZmZWN0aXZlTmV0d29ya1R5cGU6KG89bmF2aWdhdG9yLmNvbm5lY3Rpb24pPT1udWxsP3ZvaWQgMDpvLmVmZmVjdGl2ZVR5cGUsbG9jYXRpb246YSE9bnVsbCYmYS5sb2M/b3IoYT09bnVsbD92b2lkIDA6YS5sb2MpOnZvaWQgMCx0dXJuQ29ubmVjdGl2aXR5Om4/bi5ob3N0fHxuLnJlbGF5fHxuLnJlZmxleGl2ZTohMSxjb25uZWN0aXZpdHk6bix0aHJvdWdocHV0Omk9PW51bGw/dm9pZCAwOmkudGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczppPT1udWxsP3ZvaWQgMDppLmZyYWN0aW9uYWxMb3NzLFJUVDppPT1udWxsP3ZvaWQgMDppLlJUVCxqaXR0ZXI6aT09bnVsbD92b2lkIDA6aS5qaXR0ZXIsYmFja2VuZFJUVDppPT1udWxsP3ZvaWQgMDppLmJhY2tlbmRSVFR9fSl9fWNsYXNzIENzIGV4dGVuZHMgZHJ7fWNsYXNzIGxyIGV4dGVuZHMgZHJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3UodGhpcywicHJvZHVjZXJNYXAiLG5ldyBNYXApO3UodGhpcywiY29uc3VtZXJNYXAiLG5ldyBNYXApfXJlZ2lzdGVyUHJvZHVjZXIoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMucHJvZHVjZXJNYXAuc2V0KGUuaWQsZSkseWllbGQgdGhpcy5nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKGUpLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJQcm9kdWNlci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5hZGQoZS5pZCl9KX1yZWdpc3RlckNvbnN1bWVyKGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLmNvbnN1bWVyTWFwLnNldChlLmlkLGUpLHlpZWxkIHRoaXMuZ2VuZXJhdGVDb25zdW1lclN0cmVhbU1hcChlKSx0aGlzLmNvbnN1bWVyUGVlcklkTWFwLnNldChlLmlkLHtwcm9kdWNlcklkOmUucHJvZHVjZXJJZCxwZWVySWQ6ZS5hcHBEYXRhLnBlZXJJZCxhcHBEYXRhOmUuYXBwRGF0YX0pLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlQ29uc3VtZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lQ29uc3VtZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5hZGQoZS5pZCl9KX1nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKGUscz0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49eWllbGQgZS5nZXRTdGF0cygpLGk9dGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsiaW5ib3VuZC1ydHAiXSwhMSxlLmlkKSxhPVsuLi5pLmNvbnN1bWVyU3RyZWFtTWFwLnZhbHVlcygpXVswXSxkPXM/dGhpcy5nZXRDb25zdW1lclN0YXRzRnJvbVBhcnNlZENvbnN1bWVyU3RhdHMoaSxhLGUuaWQpOnZvaWQgMDtmb3IoY29uc3QgbyBvZiBuLnZhbHVlcygpKXN3aXRjaChvLnR5cGUpe2Nhc2UiaW5ib3VuZC1ydHAiOnt0aGlzLmluYm91bmRDb25zdW1lck1hcC5zZXQoby5pZCxlLmlkKTticmVha319cmV0dXJuIGR9KX1kZXJlZ2lzdGVyUHJvZHVjZXIoZSl7dGhpcy5wcm9kdWNlck1hcC5kZWxldGUoZS5pZCksdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmZvckVhY2goKHMsbik9PntzPT09ZS5pZCYmdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmRlbGV0ZShuKX0pLHRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuZGVsZXRlKGUuaWQpfWRlcmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVyTWFwLmRlbGV0ZShlLmlkKSx0aGlzLmluYm91bmRDb25zdW1lck1hcC5mb3JFYWNoKChzLG4pPT57cz09PWUuaWQmJnRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmRlbGV0ZShuKX0pLHRoaXMuY29uc3VtZXJQZWVySWRNYXAuZGVsZXRlKGUuaWQpLHRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuZGVsZXRlKGUuaWQpfWdldEljZUNhbmRpZGF0ZVN0YXRzKGUpe3ZhciBzO3JldHVybntpZDplLmlkLHR5cGU6ZS5jYW5kaWRhdGVUeXBlfHxlLnR5cGUsYWRkcmVzczplLmFkZHJlc3MscG9ydDplLnBvcnQsdXJsOmUudXJsLHByb3RvY29sOihzPWUucmVsYXlQcm90b2NvbCkhPW51bGw/czplLnByb3RvY29sLG5ldHdvcmtUeXBlOmUubmV0d29ya1R5cGUscmVsYXRlZEFkZHJlc3M6ZS5yZWxhdGVkQWRkcmVzcyxyZWxhdGVkUG9ydDplLnJlbGF0ZWRQb3J0fX1wYXJzZVJUQ1JlcG9ydChlLHM9W10sbj0hMSxpPXZvaWQgMCxhPXZvaWQgMCl7dmFyIHEsJCxpZSxhZSxDZSxJZSx3ZSxrZSxNZSxfZSxBZSxMZSxPZTtjb25zdCBkPWUsbz1uZXcgY3IsaD1zLmxlbmd0aD9uZXcgU2V0KHMpOnZvaWQgMCxnPVtdLGI9W10sVD1bXSxWPW5ldyBNYXAsVT1uZXcgTWFwO2Zvcihjb25zdCBtIG9mIGQudmFsdWVzKCkpe2lmKGgpe2lmKGguc2l6ZT09PTApYnJlYWs7aWYoaC5oYXMobS50eXBlKSluJiZoLmRlbGV0ZShtLnR5cGUpO2Vsc2UgY29udGludWV9c3dpdGNoKG0udHlwZSl7Y2FzZSJsb2NhbC1jYW5kaWRhdGUiOntnLnB1c2godGhpcy5nZXRJY2VDYW5kaWRhdGVTdGF0cyhtKSk7YnJlYWt9Y2FzZSJyZW1vdGUtY2FuZGlkYXRlIjp7Yi5wdXNoKHRoaXMuZ2V0SWNlQ2FuZGlkYXRlU3RhdHMobSkpO2JyZWFrfWNhc2UiY2FuZGlkYXRlLXBhaXIiOntjb25zdHtub21pbmF0ZWQ6Y309bSx7c2VsZWN0ZWQ6bH09bSx2PW0sQj17bm9taW5hdGVkOmMhPW51bGw/YzpsLGN1cnJlbnRSb3VuZFRyaXBUaW1lOnYuY3VycmVudFJvdW5kVHJpcFRpbWUsdG90YWxSb3VuZFRyaXBUaW1lOnYudG90YWxSb3VuZFRyaXBUaW1lLGJ5dGVzUmVjZWl2ZWQ6di5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDp2LmJ5dGVzU2VudCxhdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU6di5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOnYuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlLGxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcDp2Lmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcCxsYXN0UGFja2V0U2VudFRpbWVzdGFtcDp2Lmxhc3RQYWNrZXRTZW50VGltZXN0YW1wLGxvY2FsQ2FuZGlkYXRlSWQ6di5sb2NhbENhbmRpZGF0ZUlkLHJlbW90ZUNhbmRpZGF0ZUlkOnYucmVtb3RlQ2FuZGlkYXRlSWQsYnl0ZXNEaXNjYXJkZWRPblNlbmQ6di5ieXRlc0Rpc2NhcmRlZE9uU2VuZCxwYWNrZXRzU2VudDp2LnBhY2tldHNTZW50LHBhY2tldHNSZWNlaXZlZDp2LnBhY2tldHNSZWNlaXZlZCxwYWNrZXRzRGlzY2FyZGVkT25TZW5kOnYucGFja2V0c0Rpc2NhcmRlZE9uU2VuZH07VC5wdXNoKEIpLChtLm5vbWluYXRlZD09PSEwfHxtLnNlbGVjdGVkPT09ITApJiYoby5jYW5kaWRhdGVQYWlyPUIpO2JyZWFrfWNhc2UidHJhbnNwb3J0Ijp7Y29uc3QgYz1tO2EmJihhLnByb2R1Y2luZyYmKHRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXXx8KHRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXT17dG90YWxQYWNrZXRzU2VudDowfSkpLGEuY29uc3VtaW5nJiYodGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdfHwodGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdPXt0b3RhbFBhY2tldHNSZWNlaXZlZDowfSkpKTtjb25zdCBsPXtieXRlc1JlY2VpdmVkOmMuYnl0ZXNSZWNlaXZlZCxieXRlc1NlbnQ6Yy5ieXRlc1NlbnQscGFja2V0c1NlbnQ6Yy5wYWNrZXRzU2VudCxwYWNrZXRzUmVjZWl2ZWQ6Yy5wYWNrZXRzUmVjZWl2ZWQsZHRsc0NpcGhlcjpjLmR0bHNDaXBoZXIsZHRsc1N0YXRlOmMuZHRsc1N0YXRlLGljZVJvbGU6Yy5pY2VSb2xlfTtpZihvLnRyYW5zcG9ydD1sLGEpe2lmKGEucHJvZHVjaW5nKXtjb25zdCB2PXRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXTt0aGlzLnByb2Nlc3NQcm9kdWNpbmdUcmFuc3BvcnRTdGF0cyhhLmlkLHYsbCl9aWYoYS5jb25zdW1pbmcpe2NvbnN0IHY9dGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdO3RoaXMucHJvY2Vzc0NvbnN1bWluZ1RyYW5zcG9ydFN0YXRzKGEuaWQsdixsKX19YnJlYWt9Y2FzZSJyZW1vdGUtaW5ib3VuZC1ydHAiOntjb25zdCBjPW0sbD17aml0dGVyOmMuaml0dGVyLGZyYWN0aW9uTG9zdDpjLmZyYWN0aW9uTG9zdCxyb3VuZFRyaXBUaW1lOmMucm91bmRUcmlwVGltZSxyb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzOmMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cyx0b3RhbFJvdW5kVHJpcFRpbWU6Yy50b3RhbFJvdW5kVHJpcFRpbWUscGFja2V0c0xvc3Q6Yy5wYWNrZXRzTG9zdH07by5yZW1vdGVJbmJvdW5kUnRwLnNldChjLmxvY2FsSWQsbCk7YnJlYWt9Y2FzZSJvdXRib3VuZC1ydHAiOntpZighdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmhhcyhtLmlkKSlicmVhaztjb25zdCBjPW0sbD1pfHx0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZ2V0KG0uaWQpLHY9dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5nZXQobCk7aWYodil7aWYodi5sYXN0UmVwb3J0Q2FsY3VsYXRlZD09PSEwKWJyZWFrO3RoaXMucGF1c2VkUHJvZHVjZXJNYXAuc2V0KGwse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiEwfSl9dGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbbF18fCh0aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFtsXT17dG90YWxWaWRlb1BhY2tldHNTZW50OjAsdG90YWxBdWRpb1BhY2tldHNTZW50OjB9KTtjb25zdCBCPXRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW2xdO2lmKFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMubWVkaWFUeXBlKXx8WyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5raW5kKSl7aWYoIXRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5oYXMobS5pZCkpe28uc3RhbGVQcm9kdWNlclN0cmVhbU1hcD0hMDticmVha31jb25zdCB4PXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UucHJvZHVjZXJzLmdldChsKTtpZigoKHE9eD09bnVsbD92b2lkIDA6eC50cmFjayk9PW51bGw/dm9pZCAwOnEucmVhZHlTdGF0ZSk9PT0iZW5kZWQiKWJyZWFrO28ucHJvZHVjZXJTdHJlYW1NYXAuaGFzKGwpfHxvLnByb2R1Y2VyU3RyZWFtTWFwLnNldChsLHtvdXRib3VuZFZpZGVvUnRwSWQ6W10sb3V0Ym91bmRBdWRpb1J0cElkOltdfSk7Y29uc3QgeT17Ynl0ZXNTZW50OmMuYnl0ZXNTZW50LHBhY2tldHNTZW50OmMucGFja2V0c1NlbnQsbmFja0NvdW50OmMubmFja0NvdW50LHNzcmM6Yy5zc3JjLG1pZDpjLm1pZCxhY3RpdmU6Yy5hY3RpdmUsY29kZWNJZDpjLmNvZGVjSWQsaGVhZGVyQnl0ZXNTZW50OmMuaGVhZGVyQnl0ZXNTZW50fHwwLHRvdGFsUGFja2V0U2VuZERlbGF5OmMudG90YWxQYWNrZXRTZW5kRGVsYXl8fDB9O2lmKGMubWVkaWFUeXBlPT09InZpZGVvInx8Yy5raW5kPT09InZpZGVvIil7Y29uc3QgcD1jLEg9Ryh7ZnJhbWVIZWlnaHQ6cC5mcmFtZUhlaWdodCxmcmFtZVdpZHRoOnAuZnJhbWVXaWR0aCxmcmFtZXNFbmNvZGVkOnAuZnJhbWVzRW5jb2RlZCxmcmFtZXNEcm9wcGVkOnAuZnJhbWVzRHJvcHBlZD9wLmZyYW1lc0Ryb3BwZWQ6cC5kcm9wcGVkRnJhbWVzLGZyYW1lc1BlclNlY29uZDpwLmZyYW1lc1BlclNlY29uZD9wLmZyYW1lc1BlclNlY29uZDpwLmZyYW1lcmF0ZU1lYW4sZnJhbWVzU2VudDpwLmZyYW1lc1NlbnQsa2V5RnJhbWVzRW5jb2RlZDpwLmtleUZyYW1lc0VuY29kZWQsZmlyQ291bnQ6cC5maXJDb3VudCxlbmNvZGVySW1wbGVtZW50YXRpb246cC5lbmNvZGVySW1wbGVtZW50YXRpb24saHVnZUZyYW1lc1NlbnQ6cC5odWdlRnJhbWVzU2VudCxwbGlDb3VudDpwLnBsaUNvdW50LHFwU3VtOnAucXBTdW0scXVhbGl0eUxpbWl0YXRpb25SZWFzb246cC5xdWFsaXR5TGltaXRhdGlvblJlYXNvbixxdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9uczpwLnF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zLHF1YWxpdHlMaW1pdGF0aW9uUmVzb2x1dGlvbkNoYW5nZXM6cC5xdWFsaXR5TGltaXRhdGlvblJlc29sdXRpb25DaGFuZ2VzLHRvdGFsRW5jb2RlVGltZTpwLnRvdGFsRW5jb2RlVGltZSx0b3RhbFBhY2tldFNlbmREZWxheTpwLnRvdGFsRW5jb2RlVGltZSxyZXRyYW5zbWl0dGVkQnl0ZXNTZW50OnAucmV0cmFuc21pdHRlZEJ5dGVzU2VudCxyZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQ6cC5yZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQsc2NhbGFiaWxpdHlNb2RlOnAuc2NhbGFiaWxpdHlNb2RlLHBvd2VyRWZmaWNpZW50RW5jb2RlcjpwLnBvd2VyRWZmaWNpZW50RW5jb2Rlcn0seSk7by5vdXRib3VuZFZpZGVvUnRwLnNldChtLmlkLEgpLG8ucHJvZHVjZXJTdHJlYW1NYXAuZ2V0KGwpLm91dGJvdW5kVmlkZW9SdHBJZC5wdXNoKG0uaWQpLHRoaXMucHJvY2Vzc091dGJvdW5kUHJvZHVjZXJWaWRlb1N0YXRzKGwsQixIKX1lbHNlIGlmKGMubWVkaWFUeXBlPT09ImF1ZGlvInx8Yy5raW5kPT09ImF1ZGlvIil7Y29uc3QgcD1jLEg9Ryh7cmV0cmFuc21pdHRlZEJ5dGVzU2VudDpwLnJldHJhbnNtaXR0ZWRCeXRlc1NlbnQscmV0cmFuc21pdHRlZFBhY2tldHNTZW50OnAucmV0cmFuc21pdHRlZFBhY2tldHNTZW50fSx5KTtvLm91dGJvdW5kQXVkaW9SdHAuc2V0KG0uaWQsSCksby5wcm9kdWNlclN0cmVhbU1hcC5nZXQobCkub3V0Ym91bmRBdWRpb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzT3V0Ym91bmRQcm9kdWNlckF1ZGlvU3RhdHMobCxCLEgpfX1lbHNlIHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmVycm9yKGBDYWxsc3RhdHM6IFVua25vd24gT3V0Ym91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfWNhc2UiaW5ib3VuZC1ydHAiOntpZighdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuaGFzKG0uaWQpKWJyZWFrO2NvbnN0IGM9bSxsPWl8fHRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmdldChtLmlkKSx2PXRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZ2V0KGwpO2lmKHYpe2lmKHYubGFzdFJlcG9ydENhbGN1bGF0ZWQ9PT0hMClicmVhazt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLnNldChsLHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMH0pfWlmKGMuc3NyYz09PTEyMzQpYnJlYWs7dGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbbF18fCh0aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFtsXT17dG90YWxWaWRlb1BhY2tldHNSZWNlaXZlZDowLHRvdGFsQXVkaW9QYWNrZXRzUmVjZWl2ZWQ6MH0pO2NvbnN0IEI9dGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbbF07aWYoWyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5tZWRpYVR5cGUpfHxbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLmtpbmQpKXtpZighdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuaGFzKG0uaWQpKXtvLnN0YWxlQ29uc3VtZXJTdHJlYW1NYXA9ITA7YnJlYWt9by5jb25zdW1lclN0cmVhbU1hcC5oYXMobCl8fG8uY29uc3VtZXJTdHJlYW1NYXAuc2V0KGwse2luYm91bmRWaWRlb1J0cElkOltdLGluYm91bmRBdWRpb1J0cElkOltdfSk7Y29uc3QgeD17Ynl0ZXNSZWNlaXZlZDpjLmJ5dGVzUmVjZWl2ZWQscGFja2V0c1JlY2VpdmVkOmMucGFja2V0c1JlY2VpdmVkLHBhY2tldHNMb3N0OmMucGFja2V0c0xvc3Q+PTA/Yy5wYWNrZXRzTG9zdDowLGppdHRlcjpjLmppdHRlcixuYWNrQ291bnQ6Yy5uYWNrQ291bnQsaml0dGVyQnVmZmVyRGVsYXk6Yy5qaXR0ZXJCdWZmZXJEZWxheSxqaXR0ZXJCdWZmZXJFbWl0dGVkQ291bnQ6Yy5qaXR0ZXJCdWZmZXJFbWl0dGVkQ291bnQsbGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wOmMubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLHNzcmM6Yy5zc3JjLG1pZDpjLm1pZCxjb2RlY0lkOmMuY29kZWNJZCxoZWFkZXJCeXRlc1JlY2VpdmVkOmMuaGVhZGVyQnl0ZXNSZWNlaXZlZHx8MCxwYWNrZXRzRGlzY2FyZGVkOmMucGFja2V0c0Rpc2NhcmRlZHx8MCxqaXR0ZXJCdWZmZXJNaW5pbXVtRGVsYXk6Yy5qaXR0ZXJCdWZmZXJNaW5pbXVtRGVsYXl8fDAsaml0dGVyQnVmZmVyVGFyZ2V0RGVsYXk6Yy5qaXR0ZXJCdWZmZXJUYXJnZXREZWxheXx8MH07aWYoYy5tZWRpYVR5cGU9PT0idmlkZW8ifHxjLmtpbmQ9PT0idmlkZW8iKXtjb25zdCB5PWMscD1HKHtmcmFtZUhlaWdodDp5LmZyYW1lSGVpZ2h0LGZyYW1lV2lkdGg6eS5mcmFtZVdpZHRoLGZyYW1lc0RlY29kZWQ6eS5mcmFtZXNEZWNvZGVkLGZyYW1lc0Ryb3BwZWQ6eS5mcmFtZXNEcm9wcGVkP3kuZnJhbWVzRHJvcHBlZDp5LmRyb3BwZWRGcmFtZXMsZnJhbWVzUGVyU2Vjb25kOnkuZnJhbWVzUGVyU2Vjb25kP3kuZnJhbWVzUGVyU2Vjb25kOnkuZnJhbWVyYXRlTWVhbixmcmFtZXNSZWNlaXZlZDp5LmZyYW1lc1JlY2VpdmVkLGtleUZyYW1lc0RlY29kZWQ6eS5rZXlGcmFtZXNEZWNvZGVkLGZpckNvdW50OnkuZmlyQ291bnQsZGVjb2RlckltcGxlbWVudGF0aW9uOnkuZGVjb2RlckltcGxlbWVudGF0aW9uLHBsaUNvdW50OnkucGxpQ291bnQsdG90YWxQcm9jZXNzaW5nRGVsYXk6eS50b3RhbFByb2Nlc3NpbmdEZWxheSxxcFN1bTp5LnFwU3VtfHwwLHRvdGFsQXNzZW1ibHlUaW1lOnkudG90YWxBc3NlbWJseVRpbWV8fDAsdG90YWxEZWNvZGVUaW1lOnkudG90YWxEZWNvZGVUaW1lfHwwLHRvdGFsRnJlZXplc0R1cmF0aW9uOnkudG90YWxGcmVlemVzRHVyYXRpb258fDAsdG90YWxJbnRlckZyYW1lRGVsYXk6eS50b3RhbEludGVyRnJhbWVEZWxheXx8MCx0b3RhbFBhdXNlc0R1cmF0aW9uOnkudG90YWxQYXVzZXNEdXJhdGlvbnx8MCx0b3RhbFNxdWFyZWRJbnRlckZyYW1lRGVsYXk6eS50b3RhbFNxdWFyZWRJbnRlckZyYW1lRGVsYXl8fDAsZnJlZXplQ291bnQ6eS5mcmVlemVDb3VudHx8MCxwYXVzZUNvdW50OnkucGF1c2VDb3VudHx8MCxwb3dlckVmZmljaWVudERlY29kZXI6eS5wb3dlckVmZmljaWVudERlY29kZXJ9LHgpO3Auc2NvcmU9c3Ioe2ZyYW1lV2lkdGg6cC5mcmFtZVdpZHRofHwwLGZyYW1lc0RlY29kZWQ6KHAuZnJhbWVzRGVjb2RlZHx8MCktKCgoJD10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOiQuZnJhbWVzRGVjb2RlZCl8fDApLGZyYW1lc1BlclNlY29uZDpwLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdDoocC5wYWNrZXRzTG9zdHx8MCktKCgoaWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDppZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDoocC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKGFlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6YWUucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOnAuaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXMobCl9KSxVLnNldChsLHtzY29yZTorKHAuc2NvcmUqMTApLnRvRml4ZWQoKSxmcmFtZVdpZHRoOnAuZnJhbWVXaWR0aHx8MCxmcmFtZUhlaWdodDpwLmZyYW1lSGVpZ2h0fHwwLGZyYW1lc1BlclNlY29uZDpwLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6ZXQoe3BhY2tldHNMb3N0OihwLnBhY2tldHNMb3N0fHwwKS0oKChDZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOkNlLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihwLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoSWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDpJZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKX0pLGppdHRlcjpwLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKGwpLGJpdHJhdGU6KChwLmJ5dGVzUmVjZWl2ZWR8fDApLSgoKHdlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6d2UuYnl0ZXNSZWNlaXZlZCl8fDApKSo4Lzd9KSx0aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLnNldChsLHApLG8uaW5ib3VuZFZpZGVvUnRwLnNldChtLmlkLHApLG8uY29uc3VtZXJTdHJlYW1NYXAuZ2V0KGwpLmluYm91bmRWaWRlb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyhsLEIscCl9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IHk9YyxwPUcoe2F1ZGlvTGV2ZWw6eS5hdWRpb0xldmVsLGNvbmNlYWxlZFNhbXBsZXM6eS5jb25jZWFsZWRTYW1wbGVzLGNvbmNlYWxtZW50RXZlbnRzOnkuY29uY2VhbG1lbnRFdmVudHMsdG90YWxBdWRpb0VuZXJneTp5LnRvdGFsQXVkaW9FbmVyZ3ksdG90YWxTYW1wbGVzRHVyYXRpb246eS50b3RhbFNhbXBsZXNEdXJhdGlvbix0b3RhbFNhbXBsZXNSZWNlaXZlZDp5LnRvdGFsU2FtcGxlc1JlY2VpdmVkLGZlY1BhY2tldHNEaXNjYXJkZWQ6eS5mZWNQYWNrZXRzRGlzY2FyZGVkfHwwLGZlY1BhY2tldHNSZWNlaXZlZDp5LmZlY1BhY2tldHNSZWNlaXZlZHx8MCxpbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb246eS5pbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb258fDAscmVtb3ZlZFNhbXBsZXNGb3JBY2NlbGVyYXRpb246eS5yZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbnx8MCxzaWxlbnRDb25jZWFsZWRTYW1wbGVzOnkuc2lsZW50Q29uY2VhbGVkU2FtcGxlc3x8MCxwbGF5b3V0SWQ6eS5wbGF5b3V0SWR9LHgpO3Auc2NvcmU9cnIoe2NvbmNlYWxtZW50RXZlbnRzOihwLmNvbmNlYWxtZW50RXZlbnRzfHwwKS0oKChrZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOmtlLmNvbmNlYWxtZW50RXZlbnRzKXx8MCkscGFja2V0c0xvc3Q6KHAucGFja2V0c0xvc3R8fDApLSgoKE1lPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6TWUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KHAucGFja2V0c1JlY2VpdmVkfHwwKS0oKChfZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOl9lLnBhY2tldHNSZWNlaXZlZCl8fDApLGppdHRlcjpwLmppdHRlcnx8MH0pLFUuc2V0KGwse3Njb3JlOisocC5zY29yZSoxMCkudG9GaXhlZCgpLHBhY2tldHNMb3N0UGVyY2VudGFnZTpldCh7cGFja2V0c0xvc3Q6KHAucGFja2V0c0xvc3R8fDApLSgoKEFlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6QWUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KHAucGFja2V0c1JlY2VpdmVkfHwwKS0oKChMZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOkxlLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOnAuaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXMobCksYml0cmF0ZTooKHAuYnl0ZXNSZWNlaXZlZHx8MCktKCgoT2U9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDpPZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KGwscCksby5pbmJvdW5kQXVkaW9SdHAuc2V0KG0uaWQscCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQobCkuaW5ib3VuZEF1ZGlvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJBdWRpb1N0YXRzKGwsQixwKX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIEluYm91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfX19aWYoby5wcm9kdWNlclN0cmVhbU1hcC5mb3JFYWNoKChtLGMpPT57dmFyIGwsdixCLHgseSxwLEgsRGUsTmUsVmUsQmUsRmUseGUsamUsVWUsSGUsS2UsV2UsemUsJGUsR2UscWUsWWU7aWYobS5vdXRib3VuZFZpZGVvUnRwSWQubGVuZ3RoPjApe2NvbnN0IEQ9W107bS5vdXRib3VuZFZpZGVvUnRwSWQuZm9yRWFjaChPdD0+e0QucHVzaChvLm91dGJvdW5kVmlkZW9SdHAuZ2V0KE90KSl9KTtjb25zdCBrPXRoaXMuZ2V0V29ya2luZ1NpbXVsY2FzdFZpZGVvU3RhdHMoRCk7ay5zY29yZT1lcih7ZnJhbWVXaWR0aDprLmZyYW1lV2lkdGh8fDAsZnJhbWVzUGVyU2Vjb25kOmsuZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKGw9ay5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6bC5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c1NlbnQ6KGsucGFja2V0c1NlbnR8fDApLSgoKHY9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDp2LnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoQj1rLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpCLnBhY2tldHNMb3N0KXx8MCktKCgoeT0oeD10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOngucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnkucGFja2V0c0xvc3QpfHwwKSxmcmFtZXNFbmNvZGVkOihrLmZyYW1lc0VuY29kZWR8fDApLSgoKHA9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpwLmZyYW1lc0VuY29kZWQpfHwwKX0pLFYuc2V0KGMse3Njb3JlOisoay5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6ay5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0OmsuZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOmsuZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKEg9ay5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6SC5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c0xvc3RQZXJjZW50YWdlOlplKHtwYWNrZXRzU2VudDooay5wYWNrZXRzU2VudHx8MCktKCgoRGU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpEZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKE5lPWsucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOk5lLnBhY2tldHNMb3N0KXx8MCktKCgoQmU9KFZlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6VmUucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOkJlLnBhY2tldHNMb3N0KXx8MCl9KSxiaXRyYXRlOigoay5ieXRlc1NlbnR8fDApLSgoKEZlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6RmUuYnl0ZXNTZW50KXx8MCkpKjgvNyxjcHVMaW1pdGF0aW9uczprLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImNwdSIsYmFuZHdpZHRoTGltaXRhdGlvbnM6ay5xdWFsaXR5TGltaXRhdGlvblJlYXNvbj09PSJiYW5kd2lkdGgifSksdGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5zZXQoYyxrKX1lbHNlIGlmKG0ub3V0Ym91bmRBdWRpb1J0cElkLmxlbmd0aD4wKXtjb25zdCBEPW8ub3V0Ym91bmRBdWRpb1J0cC5nZXQobS5vdXRib3VuZEF1ZGlvUnRwSWRbMF0pO0Quc2NvcmU9WnQoe3BhY2tldHNTZW50OihELnBhY2tldHNTZW50fHwwKS0oKCh4ZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnhlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoamU9RC5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6amUucGFja2V0c0xvc3QpfHwwKS0oKChIZT0oVWU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpVZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6SGUucGFja2V0c0xvc3QpfHwwKSxqaXR0ZXI6KChLZT1ELnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpLZS5qaXR0ZXIpfHwwfSksVi5zZXQoYyx7c2NvcmU6KyhELnNjb3JlKjEwKS50b0ZpeGVkKCksYml0cmF0ZTooKEQuYnl0ZXNTZW50fHwwKS0oKChXZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOldlLmJ5dGVzU2VudCl8fDApKSo4LzcscGFja2V0c0xvc3RQZXJjZW50YWdlOlplKHtwYWNrZXRzU2VudDooRC5wYWNrZXRzU2VudHx8MCktKCgoemU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDp6ZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKCRlPUQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOiRlLnBhY2tldHNMb3N0KXx8MCktKCgocWU9KEdlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6R2UucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnFlLnBhY2tldHNMb3N0KXx8MCl9KSxqaXR0ZXI6KChZZT1ELnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpZZS5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYyl9KSx0aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLEQpfX0pLFQuZm9yRWFjaChtPT57Y29uc3QgYz1nLmZpbmQodj0+di5pZD09PW0ubG9jYWxDYW5kaWRhdGVJZD8obS5sb2NhbENhbmRpZGF0ZUlkPXYuaWQsdik6bnVsbCksbD1iLmZpbmQodj0+di5pZD09PW0ucmVtb3RlQ2FuZGlkYXRlSWQ/KG0ucmVtb3RlQ2FuZGlkYXRlSWQ9di5pZCx2KTpudWxsKTtjJiYobS5sb2NhbENhbmRpZGF0ZVR5cGU9Yy50eXBlLG0ubG9jYWxDYW5kaWRhdGVBZGRyZXNzPXRlKGMuYWRkcmVzcyksbS5sb2NhbENhbmRpZGF0ZVBvcnQ9Yy5wb3J0LG0ubG9jYWxDYW5kaWRhdGVQcm90b2NvbD1jLnByb3RvY29sLG0ubG9jYWxDYW5kaWRhdGVVcmw9Yy51cmwsbS5sb2NhbENhbmRpZGF0ZU5ldHdvcmtUeXBlPWMubmV0d29ya1R5cGUsbS5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRBZGRyZXNzPXRlKGMucmVsYXRlZEFkZHJlc3MpLG0ubG9jYWxDYW5kaWRhdGVSZWxhdGVkUG9ydD1jLnJlbGF0ZWRQb3J0KSxsJiYobS5yZW1vdGVDYW5kaWRhdGVUeXBlPWwudHlwZSxtLnJlbW90ZUNhbmRpZGF0ZUFkZHJlc3M9dGUobC5hZGRyZXNzKSxtLnJlbW90ZUNhbmRpZGF0ZVBvcnQ9bC5wb3J0LG0ucmVtb3RlQ2FuZGlkYXRlUHJvdG9jb2w9bC5wcm90b2NvbCxtLnJlbW90ZUNhbmRpZGF0ZVVybD1sLnVybCl9KSxvLmNhbmRpZGF0ZVBhaXImJihvLnRyYW5zcG9ydD8oby50cmFuc3BvcnQuYnl0ZXNSZWNlaXZlZD1vLmNhbmRpZGF0ZVBhaXIuYnl0ZXNSZWNlaXZlZCxvLnRyYW5zcG9ydC5ieXRlc1NlbnQ9by5jYW5kaWRhdGVQYWlyLmJ5dGVzU2VudCxvLnRyYW5zcG9ydC50b3RhbFJvdW5kVHJpcFRpbWU9by5jYW5kaWRhdGVQYWlyLnRvdGFsUm91bmRUcmlwVGltZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSk6by50cmFuc3BvcnQ9e2J5dGVzUmVjZWl2ZWQ6by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50Om8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsdG90YWxSb3VuZFRyaXBUaW1lOm8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUscm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWV9KSxvLnRyYW5zcG9ydCYmKG8udHJhbnNwb3J0LmNhbmRpZGF0ZVBhaXJzPVQpLG8udHJhbnNwb3J0JiYhby50cmFuc3BvcnQucm91bmRUcmlwVGltZSl7bGV0IG09MCxjPTA7by5yZW1vdGVJbmJvdW5kUnRwLmZvckVhY2goKGwsdik9PntsLnJvdW5kVHJpcFRpbWUmJmwucm91bmRUcmlwVGltZT5tJiYobT1sLnJvdW5kVHJpcFRpbWUsYz1sLnRvdGFsUm91bmRUcmlwVGltZSl9KSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW0sby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPWN9aWYoVS5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLFUpfWNhdGNoKG0pe31pZihWLnNpemU+MCl0cnl7dGhpcy5vYnNlcnZlci5lbWl0KCJwcm9kdWNlcl9zY29yZSIsVil9Y2F0Y2gobSl7fXJldHVybiBvfWdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0KGUpe2NvbnN0IHM9W107dHJ5e2UucHJvZHVjZXJTdHJlYW1NYXAuZm9yRWFjaCgobixpKT0+e2NvbnN0IGE9dGhpcy5wcm9kdWNlck1hcC5nZXQoaSksZD1hLnRyYWNrLmdldFNldHRpbmdzKCksbz1uLm91dGJvdW5kVmlkZW9SdHBJZC5tYXAoZz0+e2NvbnN0IGI9ZS5vdXRib3VuZFZpZGVvUnRwLmdldChnKTtyZXR1cm4gYi5mcmFtZUhlaWdodHx8KGIuZnJhbWVIZWlnaHQ9ZC5oZWlnaHQsYi5mcmFtZVdpZHRoPWQud2lkdGgsYi5mcmFtZXNQZXJTZWNvbmQ9ZC5mcmFtZVJhdGUpLGJ9KSxoPXtwcm9kdWNlcklkOmksYXBwRGF0YTphLmFwcERhdGEsdmlkZW9TdGF0czpvLGF1ZGlvU3RhdHM6bi5vdXRib3VuZEF1ZGlvUnRwSWQubWFwKGc9PmUub3V0Ym91bmRBdWRpb1J0cC5nZXQoZykpfTtzLnB1c2goaCl9KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKCJnZXRQcm9kdWNlcnNSZXBvcnQ6ICIsbixlKX1yZXR1cm4gc31nZXRDb25zdW1lclN0YXRzRnJvbVBhcnNlZENvbnN1bWVyU3RhdHMoZSxzLG4pe2xldCBpO3RyeXtjb25zdHtwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvfT10aGlzLmNvbnN1bWVyUGVlcklkTWFwLmdldChuKSxoPXM9PW51bGw/dm9pZCAwOnMuaW5ib3VuZFZpZGVvUnRwSWQubWFwKGc9Pntjb25zdCBUPXRoaXMuY29uc3VtZXJNYXAuZ2V0KG4pLnRyYWNrLmdldFNldHRpbmdzKCksVj1lLmluYm91bmRWaWRlb1J0cC5nZXQoZyk7cmV0dXJuIFYuZnJhbWVIZWlnaHR8fChWLmZyYW1lSGVpZ2h0PVQuaGVpZ2h0LFYuZnJhbWVXaWR0aD1ULndpZHRoLFYuZnJhbWVzUGVyU2Vjb25kPVQuZnJhbWVSYXRlKSxWfSk7aT17Y29uc3VtZXJJZDpuLHBlZXJJZDphLHByb2R1Y2VySWQ6ZCxhcHBEYXRhOm8sdmlkZW9TdGF0czpoLGF1ZGlvU3RhdHM6cz09bnVsbD92b2lkIDA6cy5pbmJvdW5kQXVkaW9SdHBJZC5tYXAoZz0+ZS5pbmJvdW5kQXVkaW9SdHAuZ2V0KGcpKX19Y2F0Y2goYSl7Y29uc29sZS5lcnJvcigiZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzOiAiLGEsZSl9cmV0dXJuIGl9Z2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQoZSl7Y29uc3Qgcz1bXTt0cnl7ZS5jb25zdW1lclN0cmVhbU1hcC5mb3JFYWNoKChuLGkpPT57cy5wdXNoKHRoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzKGUsbixpKSl9KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKCJnZXRDb25zdW1lclN0YXRzRnJvbVJlcG9ydDogIixuLGUpfXJldHVybiBzfX1jbGFzcyBJcyBleHRlbmRzIGxye31mdW5jdGlvbiBudChyLHQsZSxzKXtpZihyIT1udWxsJiZyLmxvZ2dlciYmci5sb2dnZXIuZXJyb3IoIkNhbGxzdGF0czo6aGFuZGxlRXJyb3IiLHtlcnJvcjpzfSksdHlwZW9mIGU9PSJmdW5jdGlvbiImJnMgaW5zdGFuY2VvZiB0KWUuY2FsbChudWxsLHMscik7ZWxzZSB0aHJvdyBzfWZ1bmN0aW9uIHVyKHIsdCxlKXtjb25zdCBzPXIudmFsdWU7cmV0dXJuIHIudmFsdWU9ZnVuY3Rpb24oLi4ubil7dHJ5e2NvbnN0IGk9cy5hcHBseSh0aGlzLG4pO3JldHVybiBpJiZpIGluc3RhbmNlb2YgUHJvbWlzZT9pLmNhdGNoKGE9PntudCh0aGlzLHQsZSxhKX0pOml9Y2F0Y2goaSl7bnQodGhpcyx0LGUsaSl9cmV0dXJuIG51bGx9LHJ9Y29uc3QgST0ocix0KT0+KGUscyxuKT0+e2NvbnN0IGk9bi52YWx1ZTtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbiguLi5hKXt0cnl7Y29uc3QgZD1pLmFwcGx5KHRoaXMsYSk7cmV0dXJuIGQmJmQgaW5zdGFuY2VvZiBQcm9taXNlP2QuY2F0Y2gobz0+e250KHRoaXMscix0LG8pfSk6ZH1jYXRjaChkKXtudCh0aGlzLHIsdCxkKX1yZXR1cm4gbnVsbH0sbn0sd3M9KHIsdCk9PihlLHMsbik9PntpZihuKXJldHVybiB1cihuLHIsdCk7Zm9yKGNvbnN0IGkgb2YgUmVmbGVjdC5vd25LZXlzKGUucHJvdG90eXBlKS5maWx0ZXIoYT0+YSE9PSJjb25zdHJ1Y3RvciIpKXtjb25zdCBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZS5wcm90b3R5cGUsaSk7YS52YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsaSx1cihhLHIsdCkpfX07dmFyIFA9ZnVuY3Rpb24ocix0LGUscyl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCxpPW48Mz90OnM9PT1udWxsP3M9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpOnMsYTtpZih0eXBlb2YgUmVmbGVjdD09Im9iamVjdCImJnR5cGVvZiBSZWZsZWN0LmRlY29yYXRlPT0iZnVuY3Rpb24iKWk9UmVmbGVjdC5kZWNvcmF0ZShyLHQsZSxzKTtlbHNlIGZvcih2YXIgZD1yLmxlbmd0aC0xO2Q+PTA7ZC0tKShhPXJbZF0pJiYoaT0objwzP2EoaSk6bj4zP2EodCxlLGkpOmEodCxlKSl8fGkpO3JldHVybiBuPjMmJmkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsaSksaX07Y29uc3QgQz1jb25zb2xlO2xldCBFPWNsYXNzIGV4dGVuZHMgV3tjb25zdHJ1Y3RvcihlPSJodHRwczovL2FwaS50ZXN0aW5ndjMuZHl0ZS5pbiIscz0iQmxpbmsiLG49enQuUFJPRCxpLGEsZCxvLGgpe3N1cGVyKCk7dSh0aGlzLCJvYnNlcnZlciIpO3UodGhpcywiZXZlbnRIYW5kbGVyIik7dSh0aGlzLCJtZWFzdXJlbWVudHMiKTt1KHRoaXMsInByb2R1Y2luZ1RyYW5zcG9ydCIpO3UodGhpcywiY29uc3VtaW5nVHJhbnNwb3J0Iik7dSh0aGlzLCJwcm9kdWNlcnMiLG5ldyBNYXApO3UodGhpcywiY29uc3VtZXJzIixuZXcgTWFwKTt1KHRoaXMsImljZVNlcnZlcnMiKTt1KHRoaXMsImNvbm5lY3Rpb25JbmZvUHJvbWlzZSIpO3UodGhpcywicGluZ1N0YXRzVGltZW91dCIpO3UodGhpcywibG9nZ2VyIik7dSh0aGlzLCJlbnYiKTt1KHRoaXMsImFwaUhvc3RuYW1lcyIpO3UodGhpcywicGVlcklkIik7dSh0aGlzLCJjb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwIixuZXcgTWFwKTt1KHRoaXMsImN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMiLHt9KTtpZighaCl0aHJvdyBFcnJvcigiYXV0aFRva2VuIGlzIG1pc3NpbmcgYnV0IHJlcXVpcmVkIHRvIGluaXRpYWxpemUgQ2FsbFN0YXRzISIpO3N3aXRjaCh0aGlzLmVudj1uLHRoaXMuYXBpSG9zdG5hbWVzPW8sdGhpcy5sb2dnZXI9YSx0aGlzLnBlZXJJZD1kLHRoaXMuZXZlbnRIYW5kbGVyPW5ldyB1cyh7bG9nZ2VyOmEscGVlcklkOmQsYXBpSG9zdG5hbWVzOm8sYXV0aFRva2VuOmh9KSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjplbmdpbmVOYW1lOiAiLHtlbmdpbmVOYW1lOnN9KSxzKXtjYXNlIkJsaW5rIjp0aGlzLm1lYXN1cmVtZW50cz1uZXcgQ3M7YnJlYWs7Y2FzZSJHZWNrbyI6dGhpcy5tZWFzdXJlbWVudHM9bmV3IGxyO2JyZWFrO2Nhc2UiV2ViS2l0Ijp0aGlzLm1lYXN1cmVtZW50cz1uZXcgSXM7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihgVW5rbm93biBlbmdpbmVOYW1lISAke3N9YCl9dGhpcy5tZWFzdXJlbWVudHMuY2FsbFN0YXRzSW5zdGFuY2U9dGhpcyx0aGlzLnJlZ2lzdGVyUHJvZHVjZXI9dGhpcy5yZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyksdGhpcy5yZWdpc3RlckNvbnN1bWVyPXRoaXMucmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMpLHRoaXMub2JzZXJ2ZXI9bmV3IFcsdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oImNvbnN1bWVyX3Njb3JlIixnPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpjb25zdW1lcl9zY29yZSAke1suLi5nLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLGcpfSksdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oInByb2R1Y2VyX3Njb3JlIixnPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpwcm9kdWNlcl9zY29yZSAke1suLi5nLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLGcpfSl9cmVnaXN0ZXJJY2VTZXJ2ZXJzKGUpe3RoaXMuaWNlU2VydmVycz1lfXJlZ2lzdGVyQ29uc3VtZXIoZSl7dmFyIHM7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlLmlkKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLmlkLHt9KSx0aGlzLmNvbnN1bWVycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlckNvbnN1bWVyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyQ29uc3VtZXIiLHtjb25zdW1lcklkOmUuaWQsY29uc3VtZXJraW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlckNvbnN1bWVyLmJpbmQodGhpcyxlKSl9cmVnaXN0ZXJQcm9kdWNlcihlKXt2YXIgczt0aGlzLnByb2R1Y2Vycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlclByb2R1Y2VyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSl9c2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50KGUscyl7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLHt9KTtjb25zdCBuPXRoaXMuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcC5nZXQoZSk7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLE9iamVjdC5hc3NpZ24obixzKSl9cmVnaXN0ZXJQcm9kdWNpbmdUcmFuc3BvcnQoZSl7dmFyIG47dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9ZSxlLm9uKCJjbG9zZSIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksZS5vbigiZGlzY29ubmVjdCIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksQXJyYXkuZnJvbSgoKG49ZS5fcHJvZHVjZXJzKT09bnVsbD92b2lkIDA6bi52YWx1ZXMoKSl8fFtdKS5mb3JFYWNoKGk9Pnt0aGlzLnJlZ2lzdGVyUHJvZHVjZXIoaSl9KSxlLm9uKCJuZXdwcm9kdWNlciIsdGhpcy5yZWdpc3RlclByb2R1Y2VyKX1yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKXt2YXIgbjt0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydD1lLGUub24oImNsb3NlIix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxlLm9uKCJkaXNjb25uZWN0Iix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxBcnJheS5mcm9tKCgobj1lLl9jb25zdW1lcnMpPT1udWxsP3ZvaWQgMDpuLnZhbHVlcygpKXx8W10pLmZvckVhY2goaT0+e3RoaXMucmVnaXN0ZXJDb25zdW1lcihpKX0pLGUub24oIm5ld2NvbnN1bWVyIix0aGlzLnJlZ2lzdGVyQ29uc3VtZXIpfWRlUmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVycy5kZWxldGUoZS5pZCl9ZGVSZWdpc3RlclByb2R1Y2VyKGUpe3ZhciBzO3RoaXMucHJvZHVjZXJzLmRlbGV0ZShlLmlkKSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpkZVJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSl9ZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCgpe3RoaXMuY29uc3VtaW5nVHJhbnNwb3J0PXZvaWQgMH1kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0KCl7dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9dm9pZCAwfWNhbGxFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoZSl9c2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlPSExLHMpe3RoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlPXRoaXMubWVhc3VyZW1lbnRzLmdldE5ldHdvcmtJbmZvKHRoaXMuaWNlU2VydmVycyxlKSx0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUFJFQ0FMTF9URVNUX0JFR0lOLHRpbWVzdGFtcDpzfSksdGhpcy5jb25uZWN0aW9uSW5mb1Byb21pc2UmJnRoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlLnRoZW4obj0+e3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5QUkVDQUxMX1RFU1RfQ09NUExFVEUsbWV0YURhdGE6e2Nvbm5lY3Rpb25JbmZvOm59LHRpbWVzdGFtcDpzfSl9KX1zZW5kU2NyZWVuU2hhcmVUb2dnbGVFdmVudChlLHM9bnVsbCxuKXt0aGlzLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMuc2NyZWVuPWUsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplP1MuU0NSRUVOU0hBUkVfU1RBUlRFRDpTLlNDUkVFTlNIQVJFX1NUT1BQRUQsbWV0YURhdGE6e3NzcmM6c30sdGltZXN0YW1wOm59KX1zZW5kU2NyZWVuU2hhcmVSZXF1ZXN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuU0NSRUVOU0hBUkVfU1RBUlRfUkVRVUVTVEVELHRpbWVzdGFtcDplfSl9c2VuZEFjdGl2ZVNwZWFrZXJFdmVudChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5ET01JTkFOVF9TUEVBS0VSLG1ldGFEYXRhOntwZWVySWQ6ZX0sdGltZXN0YW1wOnN9KX1kZXZpY2VzKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OmU9PT1ZLkFVRElPJiZTLkFVRElPX0RFVklDRVNfVVBEQVRFU3x8ZT09PVkuVklERU8mJlMuVklERU9fREVWSUNFU19VUERBVEVTfHxlPT09WS5TUEVBS0VSJiZTLlNQRUFLRVJfREVWSUNFU19VUERBVEVTLG1ldGFEYXRhOntkZXZpY2VMaXN0OnN9LHRpbWVzdGFtcDpufSl9c2VsZWN0ZWREZXZpY2UoZSxzLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PVkuQVVESU8mJlMuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEV8fGU9PT1ZLlZJREVPJiZTLlNFTEVDVEVEX0NBTUVSQV9VUERBVEV8fGU9PT1ZLlNQRUFLRVImJlMuU0VMRUNURURfU1BFQUtFUl9VUERBVEUsbWV0YURhdGE6e2RldmljZTpzfSx0aW1lc3RhbXA6bn0pfW1lZGlhUGVybWlzc2lvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk1FRElBX1BFUk1JU1NJT04sbWV0YURhdGE6e2RldmljZVR5cGU6ZSxwZXJtaXNzaW9uOnN9LHRpbWVzdGFtcDpufSl9bWVkaWFQbGF5YmFja0ZhaWxlZChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PVkuQVVESU8mJlMuQVVESU9fUExBWV9GQUlMRUR8fGU9PT1ZLlZJREVPJiZTLlZJREVPX1BMQVlfRkFJTEVELG1ldGFEYXRhOntkZXZpY2VUeXBlOmV9LHRpbWVzdGFtcDpzfSl9bWVkaWFUcmFja011dGVkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplPT09WS5BVURJTyYmUy5BVURJT19UUkFDS19NVVRFRHx8ZT09PVkuVklERU8mJlMuVklERU9fVFJBQ0tfTVVURUQsbWV0YURhdGE6e2RldmljZVR5cGU6ZX0sdGltZXN0YW1wOnN9KX10YWJDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlRBQl9DSEFOR0UsbWV0YURhdGE6e2lzTWVldGluZ3NUYWJBY3RpdmU6ZX0sdGltZXN0YW1wOnN9KX1icm93c2VyQmFja2dyb3VuZGVkKGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCx0aW1lc3RhbXA6ZX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkJST1dTRVJfRk9SRUdST1VOREVELHRpbWVzdGFtcDplfSl9bGVnYWN5U3dpdGNoKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkxFR0FDWV9TV0lUQ0gsbWV0YWRhdGE6e29uOmV9LHRpbWVzdGFtcDpzfSl9Z2V0UHJlQ2FsbFRlc3RSZXN1bHRzKCl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25JbmZvUHJvbWlzZX0pfXNlbmRDYWxsSm9pbkJlZ2luRXZlbnQoZSxzKXtlPVFlKEcoe30sZSkse21lZXRpbmdFbnY6dGhpcy5lbnZ9KSxlLmRldmljZUluZm89UWUoRyh7fSxlLmRldmljZUluZm8pLHt1c2VyQWdlbnQ6bmF2aWdhdG9yLnVzZXJBZ2VudCxjcHVzOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5LG1lbW9yeTpuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5fSksdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkNBTExfSk9JTl9CRUdJTixtZXRhRGF0YTp7cGVlck1ldGFEYXRhOmV9LHRpbWVzdGFtcDpzfSl9c2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTix0aW1lc3RhbXA6c30pLG5ldyBQcm9taXNlKChpLGEpPT53KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBkPVtdO3RyeXtmb3IoY29uc3QgbyBvZiBlKXRyeXtpZihvLmljZVNlcnZlcnMmJm8uaWNlU2VydmVycy5sZW5ndGg+MCl7Y29uc3QgaD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXROZXR3b3JrUXVhbGl0eShvLmljZVNlcnZlcnMpO2QucHVzaChRZShHKHt9LG8pLHtuZXR3b3JrUmVzdWx0czpofSkpfX1jYXRjaChoKXtjb25zb2xlLndhcm4oIkVycm9yIGhhbmRsaW5nICIsaCl9aSh7cmVnaW9uRGF0YTpkfSl9Y2F0Y2gobyl7Y29uc29sZS53YXJuKCJFcnJvciBpbiBjYWxsc3RhdHMsICIsbyksYShvKX19KSkudGhlbihpPT57dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk5FVF9RVUFMSVRZX1RFU1RfRU5ELHRpbWVzdGFtcDpzLG1ldGFEYXRhOml9KX0pfXNlbmRXZWJTb2NrZXRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuV0VCU09DS0VUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuVFJBTlNQT1JUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRBdWRpb1RvZ2dsZUV2ZW50KGUscyl7dGhpcy5jdXJyZW50VXNlck1lZGlhU3RhdGVzLmF1ZGlvPWU7bGV0IG47ZT9uPVMuQVVESU9fT046bj1TLkFVRElPX09GRix0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50Om4sdGltZXN0YW1wOnN9KX1zZW5kVmlkZW9Ub2dnbGVFdmVudChlLHMpe3RoaXMuY3VycmVudFVzZXJNZWRpYVN0YXRlcy52aWRlbz1lO2xldCBuO2U/bj1TLlZJREVPX09OOm49Uy5WSURFT19PRkYsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpuLHRpbWVzdGFtcDpzfSl9c2VuZFBhcnRpY2lwYW50Um9sZVRvZ2dsZUV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBBUlRJQ0lQQU5UX1JPTEUsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXN0YXJ0UGluZ1N0YXRzKGU9N2UzKXt0aGlzLnNlbmRQaW5nU3RhdHNFdmVudCghMSxuZXcgRGF0ZSksdGhpcy5waW5nU3RhdHNUaW1lb3V0PXNldEludGVydmFsKHRoaXMuc2VuZFBpbmdTdGF0c0V2ZW50LmJpbmQodGhpcyksZSl9c3RvcFBpbmdTdGF0cygpe2NsZWFySW50ZXJ2YWwodGhpcy5waW5nU3RhdHNUaW1lb3V0KX1zZW5kUGluZ1N0YXRzRXZlbnQoZT0hMCxzKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGQsbztsZXQgbixpO2lmKHRoaXMucHJvZHVjaW5nVHJhbnNwb3J0JiYobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksIW58fCEoKGQ9bj09bnVsbD92b2lkIDA6bi5wcm9kdWNlclJlcG9ydCkhPW51bGwmJmQubGVuZ3RoKSkpe3RoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnNlbmRQaW5nU3RhdHNFdmVudDo6c3RhbGVQcm9kdWNpbmdUcmFuc3BvcnQiLHtkaXNjbGFpbWVyOiJTdGFsZSBwcm9kdWNlcj8gUmVnZW5lcmF0aW5nIFN0cmVhbSBNYXBzISJ9KTtjb25zdCBoPXlpZWxkIHRoaXMubWVhc3VyZW1lbnRzLmdldFByb2R1Y2Vyc1JlcG9ydChbLi4udGhpcy5wcm9kdWNlcnMudmFsdWVzKCldKTtuJiZoP24ucHJvZHVjZXJSZXBvcnQ9aDoobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksKCFufHwhKG4hPW51bGwmJm4ucHJvZHVjZXJSZXBvcnQpKSYmdGhpcy5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6c2VuZFBpbmdTdGF0c0V2ZW50Ojpub1Byb2R1Y2luZ1RyYW5zcG9ydFJlcG9ydCIse2Rpc2NsYWltZXI6IlN0cmVhbSBtYXBzIGludmFsaWQgZGVzcGl0ZSByZWdlbmVyYXRpbmchIn0pKX1pZih0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydCYmKGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCFpfHwhKChvPWkuY29uc3VtZXJSZXBvcnQpIT1udWxsJiZvLmxlbmd0aCkpKXt0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6OnN0YWxlQ29uc3VtaW5nVHJhbnNwb3J0Iix7ZGlzY2xhaW1lcjoiU3RhbGUgY29uc3VtZXI/IFJlZ2VuZXJhdGluZyBTdHJlYW0gTWFwcyEifSk7Y29uc3QgaD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRDb25zdW1lcnNSZXBvcnQoWy4uLnRoaXMuY29uc3VtZXJzLnZhbHVlcygpXSk7aSYmaD9pLmNvbnN1bWVyUmVwb3J0PWg6KGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCghaXx8IWkuY29uc3VtZXJSZXBvcnQpJiZ0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6Om5vQ29uc3VtaW5nVHJhbnNwb3J0UmVwb3J0Iix7ZGlzY2xhaW1lcjoiU3RyZWFtIG1hcHMgaW52YWxpZCBkZXNwaXRlIHJlZ2VuZXJhdGluZyEifSkpfWNvbnN0IGE9e3Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzOm4/bj09bnVsbD92b2lkIDA6bi50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLGNvbnN1bWluZ1RyYW5zcG9ydFN0YXRzOmk/aT09bnVsbD92b2lkIDA6aS50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLHByb2R1Y2VyU3RhdHM6W10uY29uY2F0KChuPT1udWxsP3ZvaWQgMDpuLnByb2R1Y2VyUmVwb3J0KXx8W10pLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5wcm9kdWNlclJlcG9ydCl8fFtdKSxjb25zdW1lclN0YXRzOltdLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5jb25zdW1lclJlcG9ydCl8fFtdKS5jb25jYXQoKG49PW51bGw/dm9pZCAwOm4uY29uc3VtZXJSZXBvcnQpfHxbXSl9O2lmKGUmJmEucHJvZHVjZXJTdGF0cy5sZW5ndGg9PT0wJiZhLmNvbnN1bWVyU3RhdHMubGVuZ3RoPT09MCl7eWllbGQgdGhpcy5ldmVudEhhbmRsZXIuZmx1c2goKTtyZXR1cm59dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBJTkdfU1RBVCxtZXRhRGF0YTphLHRpbWVzdGFtcDpzfSl9KX1zZW5kSVZTUGxheWVyUmVidWZmZXJFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUJVRkZFUklORyx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJBdWRpb0Jsb2NrRXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQVVESU9fQkxPQ0tFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJQbGF5YmFja0Jsb2NrZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELHRpbWVzdGFtcDplfSl9c2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVySW5pdGlhbGl6ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9JTklUSUFMSVpFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUix0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfRVJST1IsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUix0aW1lc3RhbXA6cyxtZXRhRGF0YTplfSl9c2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOnt1cGRhdGVkUGxheWJhY2tSYXRlOmV9fSl9c2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kUGxheWVyTGl2ZUxhdGVuY3koZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTElWRVNUUkVBTV9MQVRFTkNZLHRpbWVzdGFtcDpzLG1ldGFEYXRhOntsYXRlbmN5OmV9fSl9c2VuZERpc2Nvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRElTQ09OTkVDVCx0aW1lc3RhbXA6ZX0pfXNlbmRSZWNvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUkVDT05ORUNUX0FUVEVNUFQsdGltZXN0YW1wOmV9KX1leHBlY3RlZFZpZGVvUmVzb2x1dGlvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT04sdGltZXN0YW1wOm4sbWV0YURhdGE6e2ZyYW1lV2lkdGg6ZSxmcmFtZUhlaWdodDpzfX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTix0aW1lc3RhbXA6bixtZXRhRGF0YTp7ZnJhbWVXaWR0aDplLGZyYW1lSGVpZ2h0OnN9fSl9fTtQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVySWNlU2VydmVycyIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJyZWdpc3RlckNvbnN1bWVyIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVyQ29uc3VtaW5nVHJhbnNwb3J0IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsImRlUmVnaXN0ZXJDb25zdW1lciIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJkZVJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwiZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJkaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRQcmVDYWxsVGVzdEJlZ2luRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlVG9nZ2xlRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZEFjdGl2ZVNwZWFrZXJFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJkZXZpY2VzIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbGVjdGVkRGV2aWNlIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsIm1lZGlhUGVybWlzc2lvbiIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJtZWRpYVBsYXliYWNrRmFpbGVkIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsIm1lZGlhVHJhY2tNdXRlZCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJ0YWJDaGFuZ2VkIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsImJyb3dzZXJCYWNrZ3JvdW5kZWQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwiYnJvd3NlckZvcmVncm91bmRlZCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJsZWdhY3lTd2l0Y2giLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwiZ2V0UHJlQ2FsbFRlc3RSZXN1bHRzIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRDYWxsSm9pbkJlZ2luRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZFdlYlNvY2tldENvbm5lY3RlZEV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kQXVkaW9Ub2dnbGVFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kVmlkZW9Ub2dnbGVFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kUGFydGljaXBhbnRSb2xlVG9nZ2xlRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic3RhcnRQaW5nU3RhdHMiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic3RvcFBpbmdTdGF0cyIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kUGluZ1N0YXRzRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJJbml0aWFsaXplZEV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJQbGF5YmFja1JhdGVDaGFuZ2VkRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRQbGF5ZXJMaXZlTGF0ZW5jeSIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kRGlzY29ubmVjdEV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRSZWNvbm5lY3RFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJleHBlY3RlZFZpZGVvUmVzb2x1dGlvbiIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJleHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbiIsbnVsbCksRT1QKFt3cyhUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUpO3ZhciBrcz1FO2NsYXNzIHByIGV4dGVuZHMgV3tjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7dSh0aGlzLCJzdGF0cyIpO3UodGhpcywicGVlcklkIik7dSh0aGlzLCJiYWNrZW5kIik7dSh0aGlzLCJpY2VTZXJ2ZXJzIik7dSh0aGlzLCJpbml0aWFsaXplZCIsITEpO3UodGhpcywic3RhbGxlZCIsITEpO3UodGhpcywiaXBJbmZvcm1hdGlvbiIpO3UodGhpcywibG9nZ2VyIil9aW5pdGlhbGl6ZShUKXtyZXR1cm4gdyh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDplLGVuZ2luZU5hbWU6cyxlbnY6bj16dC5QUk9ELGljZVNlcnZlcnM6aSxhcGlCYXNlOmE9Imh0dHBzOi8vYXBpLmNsdXN0ZXIuZHl0ZS5pbiIsZmxhZ3M6ZCxsb2dnZXI6bz1jb25zb2xlLGFwaUhvc3RuYW1lczpoLHNraXBDb25uZWN0aXZpdHlDaGVja3M6Zz0hMSxhdXRoVG9rZW46Yn0pe3ZhciBWLFUscTt0cnl7aWYodGhpcy5wZWVySWQ9ZSx0aGlzLmxvZ2dlcj1vLCFiKXt0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjppbml0aWFsaXplIix7ZXZlbnQ6ImF1dGhfdG9rZW5fbWlzc2luZyIscGVlcklkOnRoaXMucGVlcklkfSksdGhpcy5zdGFsbENhbGxTdGF0cygpO3JldHVybn10aGlzLmlwSW5mb3JtYXRpb249eWllbGQgaXIuZ2V0SVBEZXRhaWxzKHtwZWVySWQ6ZSxhcGlIb3N0bmFtZXM6aCxsb2dnZXI6b30pLHRoaXMuYmFja2VuZD1uZXcga3MoYSxzLG4sZCxvLGUsaCxiKSx0aGlzLmljZVNlcnZlcnM9aSwoVj10aGlzLmJhY2tlbmQpPT1udWxsfHxWLnJlZ2lzdGVySWNlU2VydmVycyh0aGlzLmljZVNlcnZlcnMpLHRoaXMuaW5pdGlhbGl6ZWQ9ITAsKHE9KFU9dGhpcy5iYWNrZW5kKT09bnVsbD92b2lkIDA6VS5ldmVudEhhbmRsZXIpPT1udWxsfHxxLmVtaXQoImluaXRpYWxpemVkIix0aGlzLmlwSW5mb3JtYXRpb24pLHRoaXMuZW1pdCgiaW5pdGlhbGl6ZWQiLHRoaXMuaXBJbmZvcm1hdGlvbiksdGhpcy5zdGFydFByZUNhbGxUZXN0KGcpfWNhdGNoKCQpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OkNhbGxTdGF0c0ludGVncmF0aW9uIix7cGVlcklkOnRoaXMucGVlcklkLGVycm9yOiQgaW5zdGFuY2VvZiBFcnJvcj8kLm1lc3NhZ2U6U3RyaW5nKCQpLHN0YWNrOiQgaW5zdGFuY2VvZiBFcnJvcj8kLnN0YWNrOnZvaWQgMH0pLHRoaXMuc3RhbGxDYWxsU3RhdHMoKX19KX1jb25maWd1cmVTZW5kVHJhbnNwb3J0KGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0KGUpfSl9Y29uZmlndXJlUmVjdlRyYW5zcG9ydChlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKX0pfWNhbmRpZGF0ZVJlZ2lvbmFsTmV0d29ya1F1YWxpdHlUZXN0KGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjt0cnl7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kTmV0d29ya1F1YWxpdHlUZXN0QmVnaW5FdmVudChlLHMpfWNhdGNoKGkpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OnNlbmROZXR3b3JrUXVhbGl0eVRlc3RCZWdpbkV2ZW50Iix7ZXJyb3I6e3JlYXNvbjppLnJlYXNvbn19KX19KX0pfXJvb21Kb2luZWQoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuLGk7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQ2FsbEpvaW5CZWdpbkV2ZW50KGUscyksdGhpcy5iYWNrZW5kLChpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc3RhcnRQaW5nU3RhdHMoKX0pfSl9YXVkaW9PZmYoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRBdWRpb1RvZ2dsZUV2ZW50KCExLGUpfSl9YXVkaW9Pbigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZEF1ZGlvVG9nZ2xlRXZlbnQoITAsZSl9KX12aWRlb09mZigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFZpZGVvVG9nZ2xlRXZlbnQoITEsZSl9KX12aWRlb09uKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kVmlkZW9Ub2dnbGVFdmVudCghMCxlKX0pfWNhbGxFbmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzLG47KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zdG9wUGluZ1N0YXRzKCksKG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kRGlzY29ubmVjdEV2ZW50KGUpfSl9c2NyZWVuU2hhcmVTdGFydChlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCEwLGUscyl9KX1jb25zdW1lclNoYXJlZE1lZGlhU3RhdGUoZSxzKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQ29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlRXZlbnQoZSxzKX0pfXNjcmVlblNoYXJlU3RvcChlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCExLGUscyl9KX1zY3JlZW5TaGFyZVJlcXVlc3RlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQoZSl9KX1hY3RpdmVTcGVha2VyKGUpe2lmKGUhPT10aGlzLnBlZXJJZClyZXR1cm47Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQWN0aXZlU3BlYWtlckV2ZW50KGUscyl9KX1kZXZpY2VzKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5kZXZpY2VzKGUscyxuKX0pfXNlbGVjdGVkRGV2aWNlKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5zZWxlY3RlZERldmljZShlLHMsbil9KX1tZWRpYVBlcm1pc3Npb24oZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLm1lZGlhUGVybWlzc2lvbihlLHMsbil9KX1tZWRpYVBsYXliYWNrRmFpbGVkKGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4ubWVkaWFQbGF5YmFja0ZhaWxlZChlLHMpfSl9bWVkaWFUcmFja011dGVkKGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4ubWVkaWFUcmFja011dGVkKGUscyl9KX10YWJDaGFuZ2VkKGU9ITEpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4udGFiQ2hhbmdlZChlLHMpfSl9YnJvd3NlckJhY2tncm91bmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuYnJvd3NlckJhY2tncm91bmRlZChlKX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl9KX1sZWdhY3lTd2l0Y2goZSl7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5sZWdhY3lTd2l0Y2goZSxzKX0pfXN0YXJ0UHJlQ2FsbFRlc3QoZT0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlLHMpfSl9KX1vblByZUNhbGxUZXN0UmVzdWx0cyhlKXtyZXR1cm4gdGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uY2UoInByZWNhbGxfZW5kIixlKX0pLGV9b25SZWNlaXZpbmdDb25zdW1lckF1ZGlvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigiY29uc3VtZXJfYXVkaW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nQ29uc3VtZXJWaWRlb1N0YXR1cyhlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5ldmVudEhhbmRsZXIub24oImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsZSl9KX1vblJlY2VpdmluZ1Byb2R1Y2VyQXVkaW9TdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdQcm9kdWNlclZpZGVvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigicHJvZHVjZXJfdmlkZW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdDb25zdW1pbmdUcmFuc3BvcnRTdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsZSl9KX1vblByb2R1Y2VyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9zY29yZSIsZSl9KX1vbkNvbnN1bWVyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1lcl9zY29yZSIsZSl9KX1vblNhZmVJbml0aWFsaXphdGlvbihlKXtpZih0aGlzLmluaXRpYWxpemVkKWUodGhpcy5pcEluZm9ybWF0aW9uLCExKTtlbHNlIGlmKCF0aGlzLnN0YWxsZWQpe2NvbnN0IHM9bj0+e2UobiwhMCl9O3JldHVybiB0aGlzLm9uY2UoImluaXRpYWxpemVkIixzKSxzfXJldHVybigpPT57fX1yZW1vdmVJbml0aWFsaXphdGlvbkxpc3RlbmVyKGUpe3RoaXMucmVtb3ZlTGlzdGVuZXIoImluaXRpYWxpemVkIixlKX1zdGFsbENhbGxTdGF0cygpe3RoaXMuc3RhbGxlZD0hMCx0aGlzLnJlbW92ZUFsbExpc3RlbmVycygiaW5pdGlhbGl6ZWQiKX1pdnNQbGF5ZXJFdmVudChlLHMpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBpLGEsZCxvLGgsZyxiLFQsVixVLHE7c3dpdGNoKGUpe2Nhc2UiUGxheWVyUmVidWZmZXJpbmciOihpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJBdWRpb0Jsb2NrZWQiOihhPXRoaXMuYmFja2VuZCk9PW51bGx8fGEuc2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudChuKTticmVhaztjYXNlIlBsYXllclBsYXliYWNrQmxvY2tlZCI6KGQ9dGhpcy5iYWNrZW5kKT09bnVsbHx8ZC5zZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJOZXR3b3JrVW5hdmFpbGFibGUiOihvPXRoaXMuYmFja2VuZCk9PW51bGx8fG8uc2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KG4pO2JyZWFrO2Nhc2UiUGxheWVySW5pdGlhbGl6ZWQiOihoPXRoaXMuYmFja2VuZCk9PW51bGx8fGguc2VuZElWU1BsYXllckluaXRpYWxpemVkRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJXb3JrZXJFcnJvciI6KGc9dGhpcy5iYWNrZW5kKT09bnVsbHx8Zy5zZW5kSVZTUGxheWVyV29ya2VyRXJyb3JFdmVudChuKTticmVhaztjYXNlIlBsYXllckVycm9yIjooYj10aGlzLmJhY2tlbmQpPT1udWxsfHxiLnNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KHMsbik7YnJlYWs7Y2FzZSJQbGF5ZXJSZWNvdmVyYWJsZUVycm9yIjooVD10aGlzLmJhY2tlbmQpPT1udWxsfHxULnNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQocyxuKTticmVhaztjYXNlIlBsYXllckFuYWx5dGljc0V2ZW50IjooVj10aGlzLmJhY2tlbmQpPT1udWxsfHxWLnNlbmRJVlNQbGF5ZXJBbmFseXRpY3NFdmVudChzLG4pO2JyZWFrO2Nhc2UiUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZCI6KFU9dGhpcy5iYWNrZW5kKT09bnVsbHx8VS5zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KHMsbik7YnJlYWs7Y2FzZSJQbGF5ZXJRdWFsaXR5Q2hhbmdlZCI6KHE9dGhpcy5iYWNrZW5kKT09bnVsbHx8cS5zZW5kSVZTUGxheWVyUXVhbGl0eUNoYW5nZWQocyxuKTticmVha319KX1saXZlc3RyZWFtTGF0ZW5jeShlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRQbGF5ZXJMaXZlTGF0ZW5jeShlLHMpfSl9ZXhwZWN0ZWRWaWRlb1Jlc29sdXRpb24oZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLmV4cGVjdGVkVmlkZW9SZXNvbHV0aW9uKGUscyxuKX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5leHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbihlLHMsbil9KX19bmV3IHByKCkuc2V0TWF4TGlzdGVuZXJzKDMwKTtjbGFzcyBNc3tjb25zdHJ1Y3Rvcigpe2x0KHRoaXMsUGUsdm9pZCAwKX1nZXQgdGVsZW1ldHJ5KCl7dmFyIHQ7cmV0dXJuKHQ9USh0aGlzLFBlKSk9PW51bGw/dm9pZCAwOnQuZ2V0VmFsdWUoInRlbGVtZXRyeSIpfWluaXQodCl7ZmUodGhpcyxQZSx0KX1pbmZvKHQsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigiaW5mbyIsdCxlLHMpfWVycm9yKHQsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLHQsZSxzKX1kZWJ1Zyh0LGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oImRlYnVnIix0LGUscyl9bG9nKHQsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigibG9nIix0LGUscyl9d2Fybih0LGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oIndhcm4iLHQsZSxzKX19UGU9bmV3IFdlYWtNYXA7Y29uc3QgTHQ9Y2xhc3MgZXh0ZW5kcyBXLkV2ZW50RW1pdHRlcntjb25zdHJ1Y3RvcihlKXtzdXBlcigpO2x0KHRoaXMsWix2b2lkIDApO2x0KHRoaXMsZWUsdm9pZCAwKTt1KHRoaXMsImFzeW5jUHJvbWlzZVRpbWVvdXQiKTt1KHRoaXMsImxvZ2dlciIpO3RoaXMubG9nZ2VyPWUsZmUodGhpcyxaLG5ldyBNYXApLGZlKHRoaXMsZWUsbmV3IE1hcCksdGhpcy5hc3luY1Byb21pc2VUaW1lb3V0PThlM31lbWl0QXN5bmMoZSwuLi5zKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7USh0aGlzLFopLnNldChlLFtdKTtjb25zdCBuPVEodGhpcyxlZSkuZ2V0KGUpLm1hcCgoKT0+bmV3IFByb21pc2UoaT0+e1EodGhpcyxaKS5nZXQoZSkucHVzaChpKX0pKTtycyhMdC5wcm90b3R5cGUsdGhpcywiZW1pdCIpLmNhbGwodGhpcyxlLC4uLnMpLHlpZWxkIFByb21pc2UucmFjZShbUHJvbWlzZS5hbGwobiksbmV3IFByb21pc2UoKGksYSk9PnNldFRpbWVvdXQoKCk9PmEobmV3IEVycm9yKGBlbWl0QXN5bmMgZmFpbGVkIHRvIHJlc29sdmUgZm9yIGV2ZW50ICR7ZX0uYCkpLHRoaXMuYXN5bmNQcm9taXNlVGltZW91dCkpXSksUSh0aGlzLFopLmRlbGV0ZShlKX0pfW9uQXN5bmMoZSxzKXtjb25zdCBuPVEodGhpcyxaKSxpPSguLi5hKT0+dyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIG87dHJ5e3lpZWxkIHMoLi4uYSl9Y2F0Y2goaCl7dGhpcy5sb2dnZXIuZXJyb3IoIltvbkFzeW5jXSIse2Vycm9yOmh9KX1jb25zdCBkPShvPW4uZ2V0KGUpKT09bnVsbD92b2lkIDA6by5zaGlmdCgpO2Q9PW51bGx8fGQoKX0pO3JldHVybiBRKHRoaXMsZWUpLmdldChlKXx8USh0aGlzLGVlKS5zZXQoZSxbXSksUSh0aGlzLGVlKS5nZXQoZSkucHVzaChpKSxzdXBlci5vbihlLGkpfXJlc2V0KCl7ZmUodGhpcyxaLG5ldyBNYXApLGZlKHRoaXMsZWUsbmV3IE1hcCksc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCl9fTtsZXQgbXQ9THQ7Wj1uZXcgV2Vha01hcCxlZT1uZXcgV2Vha01hcDt2YXIgaXQsX3M9bmV3IFVpbnQ4QXJyYXkoMTYpO2Z1bmN0aW9uIEFzKCl7aWYoIWl0JiYoaXQ9dHlwZW9mIGNyeXB0byE9InVuZGVmaW5lZCImJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMmJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pfHx0eXBlb2YgbXNDcnlwdG8hPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iJiZtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byksIWl0KSl0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIGl0KF9zKX12YXIgTHM9L14oPzpbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pO2Z1bmN0aW9uIE9zKHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyImJkxzLnRlc3Qocil9Zm9yKHZhciBqPVtdLGZ0PTA7ZnQ8MjU2OysrZnQpai5wdXNoKChmdCsyNTYpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkpO2Z1bmN0aW9uIERzKHIpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTowLGU9KGpbclt0KzBdXStqW3JbdCsxXV0raltyW3QrMl1dK2pbclt0KzNdXSsiLSIraltyW3QrNF1dK2pbclt0KzVdXSsiLSIraltyW3QrNl1dK2pbclt0KzddXSsiLSIraltyW3QrOF1dK2pbclt0KzldXSsiLSIraltyW3QrMTBdXStqW3JbdCsxMV1dK2pbclt0KzEyXV0raltyW3QrMTNdXStqW3JbdCsxNF1dK2pbclt0KzE1XV0pLnRvTG93ZXJDYXNlKCk7aWYoIU9zKGUpKXRocm93IFR5cGVFcnJvcigiU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkIik7cmV0dXJuIGV9ZnVuY3Rpb24gTnMocix0LGUpe3I9cnx8e307dmFyIHM9ci5yYW5kb218fChyLnJuZ3x8QXMpKCk7aWYoc1s2XT1zWzZdJjE1fDY0LHNbOF09c1s4XSY2M3wxMjgsdCl7ZT1lfHwwO2Zvcih2YXIgbj0wO248MTY7KytuKXRbZStuXT1zW25dO3JldHVybiB0fXJldHVybiBEcyhzKX12YXIgVnM9dHlwZW9mIGdsb2JhbD09Im9iamVjdCImJmdsb2JhbCYmZ2xvYmFsLk9iamVjdD09PU9iamVjdCYmZ2xvYmFsLGhyPVZzLEJzPXR5cGVvZiBzZWxmPT0ib2JqZWN0IiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsRnM9aHJ8fEJzfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLHJlPUZzLHhzPXJlLlN5bWJvbCxhdD14cyxtcj1PYmplY3QucHJvdG90eXBlLGpzPW1yLmhhc093blByb3BlcnR5LFVzPW1yLnRvU3RyaW5nLFNlPWF0P2F0LnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBIcyhyKXt2YXIgdD1qcy5jYWxsKHIsU2UpLGU9cltTZV07dHJ5e3JbU2VdPXZvaWQgMDt2YXIgcz0hMH1jYXRjaChpKXt9dmFyIG49VXMuY2FsbChyKTtyZXR1cm4gcyYmKHQ/cltTZV09ZTpkZWxldGUgcltTZV0pLG59dmFyIEtzPU9iamVjdC5wcm90b3R5cGUsV3M9S3MudG9TdHJpbmc7ZnVuY3Rpb24genMocil7cmV0dXJuIFdzLmNhbGwocil9dmFyICRzPSJbb2JqZWN0IE51bGxdIixHcz0iW29iamVjdCBVbmRlZmluZWRdIixmcj1hdD9hdC50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24geWUocil7cmV0dXJuIHI9PW51bGw/cj09PXZvaWQgMD9HczokczpmciYmZnIgaW4gT2JqZWN0KHIpP0hzKHIpOnpzKHIpfWZ1bmN0aW9uIGd0KHIpe3JldHVybiByIT1udWxsJiZ0eXBlb2Ygcj09Im9iamVjdCJ9dmFyIHFzPUFycmF5LmlzQXJyYXksWXM9cXM7ZnVuY3Rpb24gZ3Iocil7dmFyIHQ9dHlwZW9mIHI7cmV0dXJuIHIhPW51bGwmJih0PT0ib2JqZWN0Inx8dD09ImZ1bmN0aW9uIil9dmFyIFFzPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIixKcz0iW29iamVjdCBGdW5jdGlvbl0iLFhzPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsWnM9IltvYmplY3QgUHJveHldIjtmdW5jdGlvbiBTcihyKXtpZighZ3IocikpcmV0dXJuITE7dmFyIHQ9eWUocik7cmV0dXJuIHQ9PUpzfHx0PT1Yc3x8dD09UXN8fHQ9PVpzfXZhciBlbj1yZVsiX19jb3JlLWpzX3NoYXJlZF9fIl0sU3Q9ZW4seXI9ZnVuY3Rpb24oKXt2YXIgcj0vW14uXSskLy5leGVjKFN0JiZTdC5rZXlzJiZTdC5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHI/IlN5bWJvbChzcmMpXzEuIityOiIifSgpO2Z1bmN0aW9uIHRuKHIpe3JldHVybiEheXImJnlyIGluIHJ9dmFyIHJuPUZ1bmN0aW9uLnByb3RvdHlwZSxzbj1ybi50b1N0cmluZztmdW5jdGlvbiBjZShyKXtpZihyIT1udWxsKXt0cnl7cmV0dXJuIHNuLmNhbGwocil9Y2F0Y2godCl7fXRyeXtyZXR1cm4gcisiIn1jYXRjaCh0KXt9fXJldHVybiIifXZhciBubj0vW1xcXiQuKis/KClbXF17fXxdL2csYW49L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sb249RnVuY3Rpb24ucHJvdG90eXBlLGNuPU9iamVjdC5wcm90b3R5cGUsZG49b24udG9TdHJpbmcsbG49Y24uaGFzT3duUHJvcGVydHksdW49UmVnRXhwKCJeIitkbi5jYWxsKGxuKS5yZXBsYWNlKG5uLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIHBuKHIpe2lmKCFncihyKXx8dG4ocikpcmV0dXJuITE7dmFyIHQ9U3Iocik/dW46YW47cmV0dXJuIHQudGVzdChjZShyKSl9ZnVuY3Rpb24gaG4ocix0KXtyZXR1cm4gcj09bnVsbD92b2lkIDA6clt0XX1mdW5jdGlvbiB2ZShyLHQpe3ZhciBlPWhuKHIsdCk7cmV0dXJuIHBuKGUpP2U6dm9pZCAwfXZhciBtbj12ZShyZSwiV2Vha01hcCIpLHl0PW1uLGZuPTkwMDcxOTkyNTQ3NDA5OTE7ZnVuY3Rpb24gdnIocil7cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyIiYmcj4tMSYmciUxPT0wJiZyPD1mbn1mdW5jdGlvbiBnbihyKXtyZXR1cm4gciE9bnVsbCYmdnIoci5sZW5ndGgpJiYhU3Iocil9dmFyIFNuPU9iamVjdC5wcm90b3R5cGU7ZnVuY3Rpb24gYnIocil7dmFyIHQ9ciYmci5jb25zdHJ1Y3RvcixlPXR5cGVvZiB0PT0iZnVuY3Rpb24iJiZ0LnByb3RvdHlwZXx8U247cmV0dXJuIHI9PT1lfXZhciB5bj0iW29iamVjdCBBcmd1bWVudHNdIjtmdW5jdGlvbiBFcihyKXtyZXR1cm4gZ3QocikmJnllKHIpPT15bn12YXIgVHI9T2JqZWN0LnByb3RvdHlwZSx2bj1Uci5oYXNPd25Qcm9wZXJ0eSxibj1Uci5wcm9wZXJ0eUlzRW51bWVyYWJsZSxFbj1FcihmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP0VyOmZ1bmN0aW9uKHIpe3JldHVybiBndChyKSYmdm4uY2FsbChyLCJjYWxsZWUiKSYmIWJuLmNhbGwociwiY2FsbGVlIil9LFRuPUVuO2Z1bmN0aW9uIFJuKCl7cmV0dXJuITF9dmFyIFJyPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsUHI9UnImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxQbj1QciYmUHIuZXhwb3J0cz09PVJyLENyPVBuP3JlLkJ1ZmZlcjp2b2lkIDAsQ249Q3I/Q3IuaXNCdWZmZXI6dm9pZCAwLEluPUNufHxSbix3bj1Jbixrbj0iW29iamVjdCBBcmd1bWVudHNdIixNbj0iW29iamVjdCBBcnJheV0iLF9uPSJbb2JqZWN0IEJvb2xlYW5dIixBbj0iW29iamVjdCBEYXRlXSIsTG49IltvYmplY3QgRXJyb3JdIixPbj0iW29iamVjdCBGdW5jdGlvbl0iLERuPSJbb2JqZWN0IE1hcF0iLE5uPSJbb2JqZWN0IE51bWJlcl0iLFZuPSJbb2JqZWN0IE9iamVjdF0iLEJuPSJbb2JqZWN0IFJlZ0V4cF0iLEZuPSJbb2JqZWN0IFNldF0iLHhuPSJbb2JqZWN0IFN0cmluZ10iLGpuPSJbb2JqZWN0IFdlYWtNYXBdIixVbj0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLEhuPSJbb2JqZWN0IERhdGFWaWV3XSIsS249IltvYmplY3QgRmxvYXQzMkFycmF5XSIsV249IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsem49IltvYmplY3QgSW50OEFycmF5XSIsJG49IltvYmplY3QgSW50MTZBcnJheV0iLEduPSJbb2JqZWN0IEludDMyQXJyYXldIixxbj0iW29iamVjdCBVaW50OEFycmF5XSIsWW49IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixRbj0iW29iamVjdCBVaW50MTZBcnJheV0iLEpuPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsTj17fTtOW0tuXT1OW1duXT1OW3puXT1OWyRuXT1OW0duXT1OW3FuXT1OW1luXT1OW1FuXT1OW0puXT0hMCxOW2tuXT1OW01uXT1OW1VuXT1OW19uXT1OW0huXT1OW0FuXT1OW0xuXT1OW09uXT1OW0RuXT1OW05uXT1OW1ZuXT1OW0JuXT1OW0ZuXT1OW3huXT1OW2puXT0hMTtmdW5jdGlvbiBYbihyKXtyZXR1cm4gZ3QocikmJnZyKHIubGVuZ3RoKSYmISFOW3llKHIpXX1mdW5jdGlvbiBabihyKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIodCl9fXZhciBJcj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLGJlPUlyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsZWk9YmUmJmJlLmV4cG9ydHM9PT1Jcix2dD1laSYmaHIucHJvY2Vzcyx0aT1mdW5jdGlvbigpe3RyeXt2YXIgcj1iZSYmYmUucmVxdWlyZSYmYmUucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiByfHx2dCYmdnQuYmluZGluZyYmdnQuYmluZGluZygidXRpbCIpfWNhdGNoKHQpe319KCksd3I9dGksa3I9d3ImJndyLmlzVHlwZWRBcnJheSxyaT1rcj9abihrcik6WG4sc2k9cmk7ZnVuY3Rpb24gbmkocix0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHIodChlKSl9fXZhciBpaT1uaShPYmplY3Qua2V5cyxPYmplY3QpLGFpPWlpLG9pPU9iamVjdC5wcm90b3R5cGUsY2k9b2kuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gZGkocil7aWYoIWJyKHIpKXJldHVybiBhaShyKTt2YXIgdD1bXTtmb3IodmFyIGUgaW4gT2JqZWN0KHIpKWNpLmNhbGwocixlKSYmZSE9ImNvbnN0cnVjdG9yIiYmdC5wdXNoKGUpO3JldHVybiB0fXZhciBsaT12ZShyZSwiTWFwIiksYnQ9bGksdWk9dmUocmUsIkRhdGFWaWV3IiksRXQ9dWkscGk9dmUocmUsIlByb21pc2UiKSxUdD1waSxoaT12ZShyZSwiU2V0IiksUnQ9aGksTXI9IltvYmplY3QgTWFwXSIsbWk9IltvYmplY3QgT2JqZWN0XSIsX3I9IltvYmplY3QgUHJvbWlzZV0iLEFyPSJbb2JqZWN0IFNldF0iLExyPSJbb2JqZWN0IFdlYWtNYXBdIixPcj0iW29iamVjdCBEYXRhVmlld10iLGZpPWNlKEV0KSxnaT1jZShidCksU2k9Y2UoVHQpLHlpPWNlKFJ0KSx2aT1jZSh5dCksZGU9eWU7KEV0JiZkZShuZXcgRXQobmV3IEFycmF5QnVmZmVyKDEpKSkhPU9yfHxidCYmZGUobmV3IGJ0KSE9TXJ8fFR0JiZkZShUdC5yZXNvbHZlKCkpIT1fcnx8UnQmJmRlKG5ldyBSdCkhPUFyfHx5dCYmZGUobmV3IHl0KSE9THIpJiYoZGU9ZnVuY3Rpb24ocil7dmFyIHQ9eWUociksZT10PT1taT9yLmNvbnN0cnVjdG9yOnZvaWQgMCxzPWU/Y2UoZSk6IiI7aWYocylzd2l0Y2gocyl7Y2FzZSBmaTpyZXR1cm4gT3I7Y2FzZSBnaTpyZXR1cm4gTXI7Y2FzZSBTaTpyZXR1cm4gX3I7Y2FzZSB5aTpyZXR1cm4gQXI7Y2FzZSB2aTpyZXR1cm4gTHJ9cmV0dXJuIHR9KTt2YXIgYmk9ZGUsRWk9IltvYmplY3QgTWFwXSIsVGk9IltvYmplY3QgU2V0XSIsUmk9T2JqZWN0LnByb3RvdHlwZSxQaT1SaS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBDaShyKXtpZihyPT1udWxsKXJldHVybiEwO2lmKGduKHIpJiYoWXMocil8fHR5cGVvZiByPT0ic3RyaW5nInx8dHlwZW9mIHIuc3BsaWNlPT0iZnVuY3Rpb24ifHx3bihyKXx8c2kocil8fFRuKHIpKSlyZXR1cm4hci5sZW5ndGg7dmFyIHQ9Ymkocik7aWYodD09RWl8fHQ9PVRpKXJldHVybiFyLnNpemU7aWYoYnIocikpcmV0dXJuIWRpKHIpLmxlbmd0aDtmb3IodmFyIGUgaW4gcilpZihQaS5jYWxsKHIsZSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gb3Qocil7Y29uc3QgdD17fTtyZXR1cm4gdHlwZW9mKHI9PW51bGw/dm9pZCAwOnIuY29kZSk9PSJudW1iZXIiJiYodC5jb2RlPXIuY29kZSksdHlwZW9mKHI9PW51bGw/dm9pZCAwOnIuY29kZSk9PSJzdHJpbmciJiYodC5jb2RlPXIuY29kZS5zdWJzdHJpbmcoMCwxMDApKSx0eXBlb2Yocj09bnVsbD92b2lkIDA6ci5uYW1lKT09InN0cmluZyImJih0Lm5hbWU9ci5uYW1lLnN1YnN0cmluZygwLDUwMCkpLHR5cGVvZihyPT1udWxsP3ZvaWQgMDpyLm1lc3NhZ2UpPT0ic3RyaW5nIiYmKHQubWVzc2FnZT1yLm1lc3NhZ2Uuc3Vic3RyaW5nKDAsNTAwKSksdHlwZW9mKHI9PW51bGw/dm9pZCAwOnIucmVhc29uKT09InN0cmluZyImJih0LnJlYXNvbj1yLnJlYXNvbi5zdWJzdHJpbmcoMCw1MDApKSx0eXBlb2Yocj09bnVsbD92b2lkIDA6ci5zdGFjayk9PSJzdHJpbmciJiYodC5zdGFjaz1yLnN0YWNrLnN1YnN0cmluZygwLDUwMCkpLHR9ZnVuY3Rpb24gSWkoe3NlcnZpY2VQcmVmaXg6cixiYXNlVVJJOnR9KXtyZXR1cm5gJHtyfS4ke3R9YH1jb25zdCB3aT17bG9nczoiaHR0cHM6Ly9hcGkucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20vbG9ncy9vdGVsL2xvZ3MiLG1vY2s6e3VybDoiaHR0cHM6Ly9hcGkucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20vbW9jayIsZG9tYWluOiJtb2NrLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIixhcHA6Imh0dHBzOi8vZXhhbXBsZXMucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20vbWVldGluZyIsc3RhZ2luZ0FwcDoiaHR0cHM6Ly9leGFtcGxlcy5zdGFnaW5nLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tL21lZXRpbmcifSxhcGlCYXNlOntwcm9kOiJodHRwczovL2FwaS5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSIsc3RhZ2luZzoiaHR0cHM6Ly9hcGkuc3RhZ2luZy5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSIscHJvZEFsdGVybmF0ZToiaHR0cHM6Ly9hcGkucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20ifSxiYXNlVVJJOntwcm9kOiJyZWFsdGltZS5jbG91ZGZsYXJlLmNvbSIsc3RhZ2luZzoic3RhZ2luZy5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSJ9fTtmdW5jdGlvbiBEcihyKXt2YXIgcyxuLGk7Y29uc3QgdD10eXBlb2YgbmF2aWdhdG9yIT0idW5kZWZpbmVkIiYmIW5hdmlnYXRvci5pc1JlYWN0TmF0aXZlJiZ0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmKChzPXdpbmRvdy5sb2NhdGlvbi5ob3N0KT09bnVsbD92b2lkIDA6cy5pbmNsdWRlcyh3aS5iYXNlVVJJLnN0YWdpbmcpKSxlPSEhKChpPShuPXI9PW51bGw/dm9pZCAwOnIuZ2V0VmFsdWUoIm1vZHVsZXMiKSk9PW51bGw/dm9pZCAwOm4uZGV2VG9vbHMpIT1udWxsJiZpLmxvZ3MpO3JldHVybiB0fHxlfWZ1bmN0aW9uIGtpKHIsdCl7dmFyIHM7Y29uc3QgZT0ocz1yPT1udWxsP3ZvaWQgMDpyLmdldFZhbHVlKCJ0ZWxlbWV0cnkiKSk9PW51bGw/dm9pZCAwOnMubG9nTGV2ZWw7aWYoZT09PSJvZmYiKXJldHVybiExO2lmKGUhPT0iYWxsIil7Y29uc3Qgbj1bImRlYnVnIiwibG9nIiwiaW5mbyIsIndhcm4iLCJlcnJvciJdLGk9bi5pbmRleE9mKHQudG9Mb3dlckNhc2UoKSksYT1uLmluZGV4T2YoZSk7aWYoaTxhKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIE5yKHIsdCxlPXt9KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocikuZm9yRWFjaChzPT57dmFyIGk7aWYoW251bGwsdm9pZCAwLE5hTl0uaW5jbHVkZXMocltzXSl8fHQmJigoKGk9dC5tYXRjaCgvXC4vZykpPT1udWxsP3ZvaWQgMDppLmxlbmd0aCl8fDApPj0xMClyZXR1cm47Y29uc3Qgbj10P2Ake3R9LiR7c31gOnM7dHlwZW9mIHJbc109PSJvYmplY3QiP05yKHJbc10sbixlKTpbIm51bWJlciIsInN0cmluZyIsImJvb2xlYW4iXS5pbmNsdWRlcyh0eXBlb2YgcltzXSkmJihlW25dPXJbc10pfSksZX1mdW5jdGlvbiBWcihyLHQsZT17fSxzPSIiKXtjb25zdCBuPXt9O3RyeXtjb25zdCBpPUpTT04uc3RyaW5naWZ5KGUpLGE9SlNPTi5wYXJzZShpKSxkPU5yKGEscyksbz1KU09OLnN0cmluZ2lmeShkKTtpZighKHQ9PW51bGw/dm9pZCAwOnQuc3RhcnRzV2l0aCgiW1NEUF0iKSkmJm8ubGVuZ3RoPjVlMyl7Y29uc3QgZz1gTG9nIG5hbWVkOiAiJHt0fSIgaXMgdHJ5aW5nIHRvIGxvZyBhbiBmbGF0dGVuZWQgb2JqZWN0IG9mIHNpemUgCgkJCSR7by5sZW5ndGh9IGNoYXJzIHRoYXQgaXMgYmV5b25kIHBlcm1pdHRlZCBsaW1pdCBvZiA1MDAwIGNoYXJzLiBQbGVhc2Ugb3B0aW1pemUuYDt0aHJvdyBEcihyKSYmY29uc29sZS5lcnJvcihnLHtsb2c6ZSxmbGF0dGVuZWQ6b30pLG5ldyBFcnJvcihnKX1yZXR1cm4gSlNPTi5wYXJzZShvKX1jYXRjaChpKXtjb25zdCBhPW90KGkpO25bYCR7c30uZXJyb3IubWVzc2FnZWBdPWEubWVzc2FnZXx8IiIsbltgJHtzfS5lcnJvci5zdGFja2BdPWEuc3RhY2t8fCIiLG5bYCR7c30uZXJyb3IucmVhc29uYF09YS5yZWFzb258fCIiLG5bYCR7c30uZXJyb3Iuc291cmNlYF09InNhZmVseUZsYXR0ZW5PYmpGb3JPcGVuVGVsZW1ldHJ5In1yZXR1cm4gbn1jb25zdCBNaT17IkFtYXpvbiBTaWxrIjoiYW1hem9uX3NpbGsiLCJBbmRyb2lkIEJyb3dzZXIiOiJhbmRyb2lkIixCYWRhOiJiYWRhIixCbGFja0JlcnJ5OiJibGFja2JlcnJ5IixDaHJvbWU6ImNocm9tZSIsQ2hyb21pdW06ImNocm9taXVtIixFbGVjdHJvbjoiZWxlY3Ryb24iLEVwaXBoYW55OiJlcGlwaGFueSIsRmlyZWZveDoiZmlyZWZveCIsRm9jdXM6ImZvY3VzIixHZW5lcmljOiJnZW5lcmljIiwiR29vZ2xlIFNlYXJjaCI6Imdvb2dsZV9zZWFyY2giLEdvb2dsZWJvdDoiZ29vZ2xlYm90IiwiSW50ZXJuZXQgRXhwbG9yZXIiOiJpZSIsIkstTWVsZW9uIjoia19tZWxlb24iLE1heHRob246Im1heHRob24iLCJNaWNyb3NvZnQgRWRnZSI6ImVkZ2UiLCJNWiBCcm93c2VyIjoibXoiLCJOQVZFUiBXaGFsZSBCcm93c2VyIjoibmF2ZXIiLE9wZXJhOiJvcGVyYSIsIk9wZXJhIENvYXN0Ijoib3BlcmFfY29hc3QiLFBoYW50b21KUzoicGhhbnRvbWpzIixQdWZmaW46InB1ZmZpbiIsUXVwWmlsbGE6InF1cHppbGxhIixRUToicXEiLFFRTGl0ZToicXFsaXRlIixTYWZhcmk6InNhZmFyaSIsU2FpbGZpc2g6InNhaWxmaXNoIiwiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCI6InNhbXN1bmdfaW50ZXJuZXQiLFNlYU1vbmtleToic2VhbW9ua2V5IixTbGVpcG5pcjoic2xlaXBuaXIiLFN3aW5nOiJzd2luZyIsVGl6ZW46InRpemVuIiwiVUMgQnJvd3NlciI6InVjIixWaXZhbGRpOiJ2aXZhbGRpIiwiV2ViT1MgQnJvd3NlciI6IndlYm9zIixXZUNoYXQ6IndlY2hhdCIsIllhbmRleCBCcm93c2VyIjoieWFuZGV4IixSb2t1OiJyb2t1In0sQnI9e2FtYXpvbl9zaWxrOiJBbWF6b24gU2lsayIsYW5kcm9pZDoiQW5kcm9pZCBCcm93c2VyIixiYWRhOiJCYWRhIixibGFja2JlcnJ5OiJCbGFja0JlcnJ5IixjaHJvbWU6IkNocm9tZSIsY2hyb21pdW06IkNocm9taXVtIixlbGVjdHJvbjoiRWxlY3Ryb24iLGVwaXBoYW55OiJFcGlwaGFueSIsZmlyZWZveDoiRmlyZWZveCIsZm9jdXM6IkZvY3VzIixnZW5lcmljOiJHZW5lcmljIixnb29nbGVib3Q6Ikdvb2dsZWJvdCIsZ29vZ2xlX3NlYXJjaDoiR29vZ2xlIFNlYXJjaCIsaWU6IkludGVybmV0IEV4cGxvcmVyIixrX21lbGVvbjoiSy1NZWxlb24iLG1heHRob246Ik1heHRob24iLGVkZ2U6Ik1pY3Jvc29mdCBFZGdlIixtejoiTVogQnJvd3NlciIsbmF2ZXI6Ik5BVkVSIFdoYWxlIEJyb3dzZXIiLG9wZXJhOiJPcGVyYSIsb3BlcmFfY29hc3Q6Ik9wZXJhIENvYXN0IixwaGFudG9tanM6IlBoYW50b21KUyIscHVmZmluOiJQdWZmaW4iLHF1cHppbGxhOiJRdXBaaWxsYSIscXE6IlFRIEJyb3dzZXIiLHFxbGl0ZToiUVEgQnJvd3NlciBMaXRlIixzYWZhcmk6IlNhZmFyaSIsc2FpbGZpc2g6IlNhaWxmaXNoIixzYW1zdW5nX2ludGVybmV0OiJTYW1zdW5nIEludGVybmV0IGZvciBBbmRyb2lkIixzZWFtb25rZXk6IlNlYU1vbmtleSIsc2xlaXBuaXI6IlNsZWlwbmlyIixzd2luZzoiU3dpbmciLHRpemVuOiJUaXplbiIsdWM6IlVDIEJyb3dzZXIiLHZpdmFsZGk6IlZpdmFsZGkiLHdlYm9zOiJXZWJPUyBCcm93c2VyIix3ZWNoYXQ6IldlQ2hhdCIseWFuZGV4OiJZYW5kZXggQnJvd3NlciJ9LEY9e3RhYmxldDoidGFibGV0Iixtb2JpbGU6Im1vYmlsZSIsZGVza3RvcDoiZGVza3RvcCIsdHY6InR2In0sSz17V2luZG93c1Bob25lOiJXaW5kb3dzIFBob25lIixXaW5kb3dzOiJXaW5kb3dzIixNYWNPUzoibWFjT1MiLGlPUzoiaU9TIixBbmRyb2lkOiJBbmRyb2lkIixXZWJPUzoiV2ViT1MiLEJsYWNrQmVycnk6IkJsYWNrQmVycnkiLEJhZGE6IkJhZGEiLFRpemVuOiJUaXplbiIsTGludXg6IkxpbnV4IixDaHJvbWVPUzoiQ2hyb21lIE9TIixQbGF5U3RhdGlvbjQ6IlBsYXlTdGF0aW9uIDQiLFJva3U6IlJva3UifSxzZT17RWRnZUhUTUw6IkVkZ2VIVE1MIixCbGluazoiQmxpbmsiLFRyaWRlbnQ6IlRyaWRlbnQiLFByZXN0bzoiUHJlc3RvIixHZWNrbzoiR2Vja28iLFdlYktpdDoiV2ViS2l0In07Y2xhc3MgZntzdGF0aWMgZ2V0Rmlyc3RNYXRjaCh0LGUpe2NvbnN0IHM9ZS5tYXRjaCh0KTtyZXR1cm4gcyYmcy5sZW5ndGg+MCYmc1sxXXx8IiJ9c3RhdGljIGdldFNlY29uZE1hdGNoKHQsZSl7Y29uc3Qgcz1lLm1hdGNoKHQpO3JldHVybiBzJiZzLmxlbmd0aD4xJiZzWzJdfHwiIn1zdGF0aWMgbWF0Y2hBbmRSZXR1cm5Db25zdCh0LGUscyl7aWYodC50ZXN0KGUpKXJldHVybiBzfXN0YXRpYyBnZXRXaW5kb3dzVmVyc2lvbk5hbWUodCl7c3dpdGNoKHQpe2Nhc2UiTlQiOnJldHVybiJOVCI7Y2FzZSJYUCI6cmV0dXJuIlhQIjtjYXNlIk5UIDUuMCI6cmV0dXJuIjIwMDAiO2Nhc2UiTlQgNS4xIjpyZXR1cm4iWFAiO2Nhc2UiTlQgNS4yIjpyZXR1cm4iMjAwMyI7Y2FzZSJOVCA2LjAiOnJldHVybiJWaXN0YSI7Y2FzZSJOVCA2LjEiOnJldHVybiI3IjtjYXNlIk5UIDYuMiI6cmV0dXJuIjgiO2Nhc2UiTlQgNi4zIjpyZXR1cm4iOC4xIjtjYXNlIk5UIDEwLjAiOnJldHVybiIxMCI7ZGVmYXVsdDpyZXR1cm59fXN0YXRpYyBnZXRNYWNPU1ZlcnNpb25OYW1lKHQpe2NvbnN0IGU9dC5zcGxpdCgiLiIpLnNwbGljZSgwLDIpLm1hcChzPT5wYXJzZUludChzLDEwKXx8MCk7aWYoZS5wdXNoKDApLGVbMF09PT0xMClzd2l0Y2goZVsxXSl7Y2FzZSA1OnJldHVybiJMZW9wYXJkIjtjYXNlIDY6cmV0dXJuIlNub3cgTGVvcGFyZCI7Y2FzZSA3OnJldHVybiJMaW9uIjtjYXNlIDg6cmV0dXJuIk1vdW50YWluIExpb24iO2Nhc2UgOTpyZXR1cm4iTWF2ZXJpY2tzIjtjYXNlIDEwOnJldHVybiJZb3NlbWl0ZSI7Y2FzZSAxMTpyZXR1cm4iRWwgQ2FwaXRhbiI7Y2FzZSAxMjpyZXR1cm4iU2llcnJhIjtjYXNlIDEzOnJldHVybiJIaWdoIFNpZXJyYSI7Y2FzZSAxNDpyZXR1cm4iTW9qYXZlIjtjYXNlIDE1OnJldHVybiJDYXRhbGluYSI7ZGVmYXVsdDpyZXR1cm59fXN0YXRpYyBnZXRBbmRyb2lkVmVyc2lvbk5hbWUodCl7Y29uc3QgZT10LnNwbGl0KCIuIikuc3BsaWNlKDAsMikubWFwKHM9PnBhcnNlSW50KHMsMTApfHwwKTtpZihlLnB1c2goMCksIShlWzBdPT09MSYmZVsxXTw1KSl7aWYoZVswXT09PTEmJmVbMV08NilyZXR1cm4iQ3VwY2FrZSI7aWYoZVswXT09PTEmJmVbMV0+PTYpcmV0dXJuIkRvbnV0IjtpZihlWzBdPT09MiYmZVsxXTwyKXJldHVybiJFY2xhaXIiO2lmKGVbMF09PT0yJiZlWzFdPT09MilyZXR1cm4iRnJveW8iO2lmKGVbMF09PT0yJiZlWzFdPjIpcmV0dXJuIkdpbmdlcmJyZWFkIjtpZihlWzBdPT09MylyZXR1cm4iSG9uZXljb21iIjtpZihlWzBdPT09NCYmZVsxXTwxKXJldHVybiJJY2UgQ3JlYW0gU2FuZHdpY2giO2lmKGVbMF09PT00JiZlWzFdPDQpcmV0dXJuIkplbGx5IEJlYW4iO2lmKGVbMF09PT00JiZlWzFdPj00KXJldHVybiJLaXRLYXQiO2lmKGVbMF09PT01KXJldHVybiJMb2xsaXBvcCI7aWYoZVswXT09PTYpcmV0dXJuIk1hcnNobWFsbG93IjtpZihlWzBdPT09NylyZXR1cm4iTm91Z2F0IjtpZihlWzBdPT09OClyZXR1cm4iT3JlbyI7aWYoZVswXT09PTkpcmV0dXJuIlBpZSJ9fXN0YXRpYyBnZXRWZXJzaW9uUHJlY2lzaW9uKHQpe3JldHVybiB0LnNwbGl0KCIuIikubGVuZ3RofXN0YXRpYyBjb21wYXJlVmVyc2lvbnModCxlLHM9ITEpe2NvbnN0IG49Zi5nZXRWZXJzaW9uUHJlY2lzaW9uKHQpLGk9Zi5nZXRWZXJzaW9uUHJlY2lzaW9uKGUpO2xldCBhPU1hdGgubWF4KG4saSksZD0wO2NvbnN0IG89Zi5tYXAoW3QsZV0saD0+e2NvbnN0IGc9YS1mLmdldFZlcnNpb25QcmVjaXNpb24oaCksYj1oK25ldyBBcnJheShnKzEpLmpvaW4oIi4wIik7cmV0dXJuIGYubWFwKGIuc3BsaXQoIi4iKSxUPT5uZXcgQXJyYXkoMjAtVC5sZW5ndGgpLmpvaW4oIjAiKStUKS5yZXZlcnNlKCl9KTtmb3IocyYmKGQ9YS1NYXRoLm1pbihuLGkpKSxhLT0xO2E+PWQ7KXtpZihvWzBdW2FdPm9bMV1bYV0pcmV0dXJuIDE7aWYob1swXVthXT09PW9bMV1bYV0pe2lmKGE9PT1kKXJldHVybiAwO2EtPTF9ZWxzZSBpZihvWzBdW2FdPG9bMV1bYV0pcmV0dXJuLTF9fXN0YXRpYyBtYXAodCxlKXtjb25zdCBzPVtdO2xldCBuO2lmKEFycmF5LnByb3RvdHlwZS5tYXApcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbCh0LGUpO2ZvcihuPTA7bjx0Lmxlbmd0aDtuKz0xKXMucHVzaChlKHRbbl0pKTtyZXR1cm4gc31zdGF0aWMgZmluZCh0LGUpe2xldCBzLG47aWYoQXJyYXkucHJvdG90eXBlLmZpbmQpcmV0dXJuIEFycmF5LnByb3RvdHlwZS5maW5kLmNhbGwodCxlKTtmb3Iocz0wLG49dC5sZW5ndGg7czxuO3MrPTEpe2NvbnN0IGk9dFtzXTtpZihlKGkscykpcmV0dXJuIGl9fXN0YXRpYyBhc3NpZ24odCwuLi5lKXtjb25zdCBzPXQ7bGV0IG4saTtpZihPYmplY3QuYXNzaWduKXJldHVybiBPYmplY3QuYXNzaWduKHQsLi4uZSk7Zm9yKG49MCxpPWUubGVuZ3RoO248aTtuKz0xKXtjb25zdCBhPWVbbl07dHlwZW9mIGE9PSJvYmplY3QiJiZhIT09bnVsbCYmT2JqZWN0LmtleXMoYSkuZm9yRWFjaChvPT57c1tvXT1hW29dfSl9cmV0dXJuIHR9c3RhdGljIGdldEJyb3dzZXJBbGlhcyh0KXtyZXR1cm4gTWlbdF19c3RhdGljIGdldEJyb3dzZXJUeXBlQnlBbGlhcyh0KXtyZXR1cm4gQnJbdF18fCIifX1jb25zdCBPPS92ZXJzaW9uXC8oXGQrKFwuP18/XGQrKSspL2ksX2k9W3t0ZXN0OlsvZ29vZ2xlYm90L2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Ikdvb2dsZWJvdCJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC9nb29nbGVib3RcLyhcZCsoXC5cZCspKS9pLHIpfHxmLmdldEZpcnN0TWF0Y2goTyxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9vcGVyYS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJPcGVyYSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvKD86b3BlcmEpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvb3ByXC98b3Bpb3MvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiT3BlcmEifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86b3ByfG9waW9zKVtccy9dKFxTKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvU2Ftc3VuZ0Jyb3dzZXIvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvKD86U2Ftc3VuZ0Jyb3dzZXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvV2hhbGUvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTkFWRVIgV2hhbGUgQnJvd3NlciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvKD86d2hhbGUpW1xzL10oXGQrKD86XC5cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9NWkJyb3dzZXIvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTVogQnJvd3NlciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC8oPzpNWkJyb3dzZXIpW1xzL10oXGQrKD86XC5cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvZm9jdXMvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiRm9jdXMifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86Zm9jdXMpW1xzL10oXGQrKD86XC5cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvc3dpbmcvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU3dpbmcifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86c3dpbmcpW1xzL10oXGQrKD86XC5cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvY29hc3QvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiT3BlcmEgQ29hc3QifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OmNvYXN0KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL29wdFwvXGQrKD86Lj9fP1xkKykrL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Ik9wZXJhIFRvdWNoIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/Om9wdClbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsveWFicm93c2VyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IllhbmRleCBCcm93c2VyIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/OnlhYnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvdWNicm93c2VyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IlVDIEJyb3dzZXIifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OnVjYnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9NYXh0aG9ufG14aW9zL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Ik1heHRob24ifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/Ok1heHRob258bXhpb3MpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvZXBpcGhhbnkvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiRXBpcGhhbnkifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OmVwaXBoYW55KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3B1ZmZpbi9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJQdWZmaW4ifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OnB1ZmZpbilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9zbGVpcG5pci9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJTbGVpcG5pciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvKD86c2xlaXBuaXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvay1tZWxlb24vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiSy1NZWxlb24ifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OmstbWVsZW9uKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL21pY3JvbWVzc2VuZ2VyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IldlQ2hhdCJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC8oPzptaWNyb21lc3NlbmdlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvcXFicm93c2VyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6L3FxYnJvd3NlcmxpdGUvaS50ZXN0KHIpPyJRUSBCcm93c2VyIExpdGUiOiJRUSBCcm93c2VyIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/OnFxYnJvd3NlcmxpdGV8cXFicm93c2VyKVsvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvbXNpZXx0cmlkZW50L2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkludGVybmV0IEV4cGxvcmVyIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/Om1zaWUgfHJ2OikoXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvXHNlZGdcLy9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJNaWNyb3NvZnQgRWRnZSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC9cc2VkZ1wvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL2VkZyhbZWFdfGlvcykvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTWljcm9zb2Z0IEVkZ2UifSxlPWYuZ2V0U2Vjb25kTWF0Y2goL2VkZyhbZWFdfGlvcylcLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy92aXZhbGRpL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IlZpdmFsZGkifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvdml2YWxkaVwvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3NlYW1vbmtleS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJTZWFNb25rZXkifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvc2VhbW9ua2V5XC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvc2FpbGZpc2gvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2FpbGZpc2gifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvc2FpbGZpc2hccz9icm93c2VyXC8oXGQrKFwuXGQrKT8pL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvc2lsay9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJBbWF6b24gU2lsayJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC9zaWxrXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvcGhhbnRvbS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJQaGFudG9tSlMifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvcGhhbnRvbWpzXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvc2xpbWVyanMvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2xpbWVySlMifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvc2xpbWVyanNcLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9ibGFja2JlcnJ5fFxiYmJcZCsvaSwvcmltXHN0YWJsZXQvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiQmxhY2tCZXJyeSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVtcZF0rXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvKHdlYnxocHcpW28wXXMvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiV2ViT1MgQnJvd3NlciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvdyg/OmViKT9bbzBdc2Jyb3dzZXJcLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9iYWRhL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkJhZGEifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvZG9sZmluXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvdGl6ZW4vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiVGl6ZW4ifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86dGl6ZW5ccz8pP2Jyb3dzZXJcLyhcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvcXVwemlsbGEvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiUXVwWmlsbGEifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86cXVwemlsbGEpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscil8fGYuZ2V0Rmlyc3RNYXRjaChPLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL2ZpcmVmb3h8aWNld2Vhc2VsfGZ4aW9zL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkZpcmVmb3gifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86ZmlyZWZveHxpY2V3ZWFzZWx8Znhpb3MpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvZWxlY3Ryb24vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiRWxlY3Ryb24ifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86ZWxlY3Ryb24pXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvTWl1aUJyb3dzZXIvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTWl1aSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC8oPzpNaXVpQnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9jaHJvbWl1bS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJDaHJvbWl1bSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC8oPzpjaHJvbWl1bSlbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvY2hyb21lfGNyaW9zfGNybW8vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiQ2hyb21lIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/OmNocm9tZXxjcmlvc3xjcm1vKVwvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL0dTQS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJHb29nbGUgU2VhcmNoIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/OkdTQSlcLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Qocil7Y29uc3QgdD0hci50ZXN0KC9saWtlIGFuZHJvaWQvaSksZT1yLnRlc3QoL2FuZHJvaWQvaSk7cmV0dXJuIHQmJmV9LGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkFuZHJvaWQgQnJvd3NlciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvcGxheXN0YXRpb24gNC9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJQbGF5U3RhdGlvbiA0In0sZT1mLmdldEZpcnN0TWF0Y2goTyxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9zYWZhcml8YXBwbGV3ZWJraXQvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2FmYXJpIn0sZT1mLmdldEZpcnN0TWF0Y2goTyxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy8uKi9pXSxkZXNjcmliZShyKXtjb25zdCB0PS9eKC4qKVwvKC4qKSAvLGU9L14oLiopXC8oLiopWyBcdF1cKCguKikvLG49ci5zZWFyY2goIlxcKCIpIT09LTE/ZTp0O3JldHVybntuYW1lOmYuZ2V0Rmlyc3RNYXRjaChuLHIpLHZlcnNpb246Zi5nZXRTZWNvbmRNYXRjaChuLHIpfX19XTt2YXIgQWk9W3t0ZXN0OlsvUm9rdVwvRFZQL10sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goL1Jva3VcL0RWUC0oXGQrXC5cZCspL2kscik7cmV0dXJue25hbWU6Sy5Sb2t1LHZlcnNpb246dH19fSx7dGVzdDpbL3dpbmRvd3MgcGhvbmUvaV0sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goL3dpbmRvd3MgcGhvbmUgKD86b3MpP1xzPyhcZCsoXC5cZCspKikvaSxyKTtyZXR1cm57bmFtZTpLLldpbmRvd3NQaG9uZSx2ZXJzaW9uOnR9fX0se3Rlc3Q6Wy93aW5kb3dzIC9pXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvV2luZG93cyAoKE5UfFhQKSggXGRcZD8uXGQpPykvaSxyKSxlPWYuZ2V0V2luZG93c1ZlcnNpb25OYW1lKHQpO3JldHVybntuYW1lOksuV2luZG93cyx2ZXJzaW9uOnQsdmVyc2lvbk5hbWU6ZX19fSx7dGVzdDpbL01hY2ludG9zaCguKj8pIEZ4aU9TKC4qPylcLy9dLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Sy5pT1N9LGU9Zi5nZXRTZWNvbmRNYXRjaCgvKFZlcnNpb25cLykoXGRbXGQuXSspLyxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9tYWNpbnRvc2gvaV0sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goL21hYyBvcyB4IChcZCsoXC4/Xz9cZCspKykvaSxyKS5yZXBsYWNlKC9bX1xzXS9nLCIuIiksZT1mLmdldE1hY09TVmVyc2lvbk5hbWUodCkscz17bmFtZTpLLk1hY09TLHZlcnNpb246dH07cmV0dXJuIGUmJihzLnZlcnNpb25OYW1lPWUpLHN9fSx7dGVzdDpbLyhpcG9kfGlwaG9uZXxpcGFkKS9pXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvb3MgKFxkKyhbX1xzXVxkKykqKSBsaWtlIG1hYyBvcyB4L2kscikucmVwbGFjZSgvW19cc10vZywiLiIpO3JldHVybntuYW1lOksuaU9TLHZlcnNpb246dH19fSx7dGVzdChyKXtjb25zdCB0PSFyLnRlc3QoL2xpa2UgYW5kcm9pZC9pKSxlPXIudGVzdCgvYW5kcm9pZC9pKTtyZXR1cm4gdCYmZX0sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goL2FuZHJvaWRbXHMvLV0oXGQrKFwuXGQrKSopL2ksciksZT1mLmdldEFuZHJvaWRWZXJzaW9uTmFtZSh0KSxzPXtuYW1lOksuQW5kcm9pZCx2ZXJzaW9uOnR9O3JldHVybiBlJiYocy52ZXJzaW9uTmFtZT1lKSxzfX0se3Rlc3Q6Wy8od2VifGhwdylbbzBdcy9pXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvKD86d2VifGhwdylbbzBdc1wvKFxkKyhcLlxkKykqKS9pLHIpLGU9e25hbWU6Sy5XZWJPU307cmV0dXJuIHQmJnQubGVuZ3RoJiYoZS52ZXJzaW9uPXQpLGV9fSx7dGVzdDpbL2JsYWNrYmVycnl8XGJiYlxkKy9pLC9yaW1cc3RhYmxldC9pXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvcmltXHN0YWJsZXRcc29zXHMoXGQrKFwuXGQrKSopL2kscil8fGYuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVxkK1wvKFxkKyhbX1xzXVxkKykqKS9pLHIpfHxmLmdldEZpcnN0TWF0Y2goL1xiYmIoXGQrKS9pLHIpO3JldHVybntuYW1lOksuQmxhY2tCZXJyeSx2ZXJzaW9uOnR9fX0se3Rlc3Q6Wy9iYWRhL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9Zi5nZXRGaXJzdE1hdGNoKC9iYWRhXC8oXGQrKFwuXGQrKSopL2kscik7cmV0dXJue25hbWU6Sy5CYWRhLHZlcnNpb246dH19fSx7dGVzdDpbL3RpemVuL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9Zi5nZXRGaXJzdE1hdGNoKC90aXplblsvXHNdKFxkKyhcLlxkKykqKS9pLHIpO3JldHVybntuYW1lOksuVGl6ZW4sdmVyc2lvbjp0fX19LHt0ZXN0OlsvbGludXgvaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpLLkxpbnV4fX19LHt0ZXN0OlsvQ3JPUy9dLGRlc2NyaWJlKCl7cmV0dXJue25hbWU6Sy5DaHJvbWVPU319fSx7dGVzdDpbL1BsYXlTdGF0aW9uIDQvXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvUGxheVN0YXRpb24gNFsvXHNdKFxkKyhcLlxkKykqKS9pLHIpO3JldHVybntuYW1lOksuUGxheVN0YXRpb240LHZlcnNpb246dH19fV0sTGk9W3t0ZXN0OlsvZ29vZ2xlYm90L2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6ImJvdCIsdmVuZG9yOiJHb29nbGUifX19LHt0ZXN0OlsvaHVhd2VpL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9Zi5nZXRGaXJzdE1hdGNoKC8oY2FuLWwwMSkvaSxyKSYmIk5vdmEiLGU9e3R5cGU6Ri5tb2JpbGUsdmVuZG9yOiJIdWF3ZWkifTtyZXR1cm4gdCYmKGUubW9kZWw9dCksZX19LHt0ZXN0OlsvbmV4dXNccyooPzo3fDh8OXwxMCkuKi9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudGFibGV0LHZlbmRvcjoiTmV4dXMifX19LHt0ZXN0OlsvaXBhZC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudGFibGV0LHZlbmRvcjoiQXBwbGUiLG1vZGVsOiJpUGFkIn19fSx7dGVzdDpbL01hY2ludG9zaCguKj8pIEZ4aU9TKC4qPylcLy9dLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri50YWJsZXQsdmVuZG9yOiJBcHBsZSIsbW9kZWw6ImlQYWQifX19LHt0ZXN0Olsva2Z0dCBidWlsZC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudGFibGV0LHZlbmRvcjoiQW1hem9uIixtb2RlbDoiS2luZGxlIEZpcmUgSEQgNyJ9fX0se3Rlc3Q6Wy9zaWxrL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri50YWJsZXQsdmVuZG9yOiJBbWF6b24ifX19LHt0ZXN0OlsvdGFibGV0KD8hIHBjKS9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudGFibGV0fX19LHt0ZXN0KHIpe2NvbnN0IHQ9ci50ZXN0KC9pcG9kfGlwaG9uZS9pKSxlPXIudGVzdCgvbGlrZSAoaXBvZHxpcGhvbmUpL2kpO3JldHVybiB0JiYhZX0sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goLyhpcG9kfGlwaG9uZSkvaSxyKTtyZXR1cm57dHlwZTpGLm1vYmlsZSx2ZW5kb3I6IkFwcGxlIixtb2RlbDp0fX19LHt0ZXN0OlsvbmV4dXNccypbMC02XS4qL2ksL2dhbGF4eSBuZXh1cy9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYubW9iaWxlLHZlbmRvcjoiTmV4dXMifX19LHt0ZXN0OlsvW14tXW1vYmkvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLm1vYmlsZX19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRCcm93c2VyTmFtZSghMCk9PT0iYmxhY2tiZXJyeSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri5tb2JpbGUsdmVuZG9yOiJCbGFja0JlcnJ5In19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRCcm93c2VyTmFtZSghMCk9PT0iYmFkYSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri5tb2JpbGV9fX0se3Rlc3Qocil7cmV0dXJuIHIuZ2V0QnJvd3Nlck5hbWUoKT09PSJ3aW5kb3dzIHBob25lIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLm1vYmlsZSx2ZW5kb3I6Ik1pY3Jvc29mdCJ9fX0se3Rlc3Qocil7Y29uc3QgdD1OdW1iZXIoU3RyaW5nKHIuZ2V0T1NWZXJzaW9uKCkpLnNwbGl0KCIuIilbMF0pO3JldHVybiByLmdldE9TTmFtZSghMCk9PT0iYW5kcm9pZCImJnQ+PTN9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri50YWJsZXR9fX0se3Rlc3Qocil7cmV0dXJuIHIuZ2V0T1NOYW1lKCEwKT09PSJhbmRyb2lkIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLm1vYmlsZX19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRPU05hbWUoITApPT09Im1hY29zIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLmRlc2t0b3AsdmVuZG9yOiJBcHBsZSJ9fX0se3Rlc3Qocil7cmV0dXJuIHIuZ2V0T1NOYW1lKCEwKT09PSJ3aW5kb3dzIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLmRlc2t0b3B9fX0se3Rlc3Qocil7cmV0dXJuIHIuZ2V0T1NOYW1lKCEwKT09PSJsaW51eCJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri5kZXNrdG9wfX19LHt0ZXN0KHIpe3JldHVybiByLmdldE9TTmFtZSghMCk9PT0icGxheXN0YXRpb24gNCJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri50dn19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRPU05hbWUoITApPT09InJva3UifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudHZ9fX1dLE9pPVt7dGVzdChyKXtyZXR1cm4gci5nZXRCcm93c2VyTmFtZSghMCk9PT0ibWljcm9zb2Z0IGVkZ2UifSxkZXNjcmliZShyKXtpZigvXHNlZGdcLy9pLnRlc3QocikpcmV0dXJue25hbWU6c2UuQmxpbmt9O2NvbnN0IGU9Zi5nZXRGaXJzdE1hdGNoKC9lZGdlXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJue25hbWU6c2UuRWRnZUhUTUwsdmVyc2lvbjplfX19LHt0ZXN0OlsvdHJpZGVudC9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOnNlLlRyaWRlbnR9LGU9Zi5nZXRGaXJzdE1hdGNoKC90cmlkZW50XC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0KHIpe3JldHVybiByLnRlc3QoL3ByZXN0by9pKX0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZTpzZS5QcmVzdG99LGU9Zi5nZXRGaXJzdE1hdGNoKC9wcmVzdG9cLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Qocil7Y29uc3QgdD1yLnRlc3QoL2dlY2tvL2kpLGU9ci50ZXN0KC9saWtlIGdlY2tvL2kpO3JldHVybiB0JiYhZX0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZTpzZS5HZWNrb30sZT1mLmdldEZpcnN0TWF0Y2goL2dlY2tvXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvKGFwcGxlKT93ZWJraXRcLzUzN1wuMzYvaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpzZS5CbGlua319fSx7dGVzdDpbLyhhcHBsZSk/d2Via2l0L2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6c2UuV2ViS2l0fSxlPWYuZ2V0Rmlyc3RNYXRjaCgvd2Via2l0XC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19XTtjbGFzcyBGcntjb25zdHJ1Y3Rvcih0LGU9ITEpe2lmKHQ9PW51bGx8fHQ9PT0iIil0aHJvdyBuZXcgRXJyb3IoIlVzZXJBZ2VudCBwYXJhbWV0ZXIgY2FuJ3QgYmUgZW1wdHkiKTt0aGlzLl91YT10LHRoaXMucGFyc2VkUmVzdWx0PXt9LGUhPT0hMCYmdGhpcy5wYXJzZSgpfWdldFVBKCl7cmV0dXJuIHRoaXMuX3VhfXRlc3QodCl7cmV0dXJuIHQudGVzdCh0aGlzLl91YSl9cGFyc2VCcm93c2VyKCl7dGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj17fTtjb25zdCB0PWYuZmluZChfaSxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gdCYmKHRoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXI9dC5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyfWdldEJyb3dzZXIoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj90aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyOnRoaXMucGFyc2VCcm93c2VyKCl9Z2V0QnJvd3Nlck5hbWUodCl7cmV0dXJuIHQ/U3RyaW5nKHRoaXMuZ2V0QnJvd3NlcigpLm5hbWUpLnRvTG93ZXJDYXNlKCl8fCIiOnRoaXMuZ2V0QnJvd3NlcigpLm5hbWV8fCIifWdldEJyb3dzZXJWZXJzaW9uKCl7cmV0dXJuIHRoaXMuZ2V0QnJvd3NlcigpLnZlcnNpb259Z2V0T1MoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQub3M/dGhpcy5wYXJzZWRSZXN1bHQub3M6dGhpcy5wYXJzZU9TKCl9cGFyc2VPUygpe3RoaXMucGFyc2VkUmVzdWx0Lm9zPXt9O2NvbnN0IHQ9Zi5maW5kKEFpLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoZS50ZXN0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUudGVzdC5zb21lKHM9PnRoaXMudGVzdChzKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiB0JiYodGhpcy5wYXJzZWRSZXN1bHQub3M9dC5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5vc31nZXRPU05hbWUodCl7Y29uc3R7bmFtZTplfT10aGlzLmdldE9TKCk7cmV0dXJuIHQ/U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl8fCIiOmV8fCIifWdldE9TVmVyc2lvbigpe3JldHVybiB0aGlzLmdldE9TKCkudmVyc2lvbn1nZXRQbGF0Zm9ybSgpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT90aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybTp0aGlzLnBhcnNlUGxhdGZvcm0oKX1nZXRQbGF0Zm9ybVR5cGUodD0hMSl7Y29uc3R7dHlwZTplfT10aGlzLmdldFBsYXRmb3JtKCk7cmV0dXJuIHQ/U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl8fCIiOmV8fCIifXBhcnNlUGxhdGZvcm0oKXt0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT17fTtjb25zdCB0PWYuZmluZChMaSxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gdCYmKHRoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtPXQuZGVzY3JpYmUodGhpcy5nZXRVQSgpKSksdGhpcy5wYXJzZWRSZXN1bHQucGxhdGZvcm19Z2V0RW5naW5lKCl7cmV0dXJuIHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT90aGlzLnBhcnNlZFJlc3VsdC5lbmdpbmU6dGhpcy5wYXJzZUVuZ2luZSgpfWdldEVuZ2luZU5hbWUodCl7cmV0dXJuIHQ/U3RyaW5nKHRoaXMuZ2V0RW5naW5lKCkubmFtZSkudG9Mb3dlckNhc2UoKXx8IiI6dGhpcy5nZXRFbmdpbmUoKS5uYW1lfHwiIn1wYXJzZUVuZ2luZSgpe3RoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT17fTtjb25zdCB0PWYuZmluZChPaSxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gdCYmKHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT10LmRlc2NyaWJlKHRoaXMuZ2V0VUEoKSkpLHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZX1wYXJzZSgpe3JldHVybiB0aGlzLnBhcnNlQnJvd3NlcigpLHRoaXMucGFyc2VPUygpLHRoaXMucGFyc2VQbGF0Zm9ybSgpLHRoaXMucGFyc2VFbmdpbmUoKSx0aGlzfWdldFJlc3VsdCgpe3JldHVybiBmLmFzc2lnbih7fSx0aGlzLnBhcnNlZFJlc3VsdCl9c2F0aXNmaWVzKHQpe2NvbnN0IGU9e307bGV0IHM9MDtjb25zdCBuPXt9O2xldCBpPTA7aWYoT2JqZWN0LmtleXModCkuZm9yRWFjaChkPT57Y29uc3Qgbz10W2RdO3R5cGVvZiBvPT0ic3RyaW5nIj8obltkXT1vLGkrPTEpOnR5cGVvZiBvPT0ib2JqZWN0IiYmKGVbZF09byxzKz0xKX0pLHM+MCl7Y29uc3QgZD1PYmplY3Qua2V5cyhlKSxvPWYuZmluZChkLGc9PnRoaXMuaXNPUyhnKSk7aWYobyl7Y29uc3QgZz10aGlzLnNhdGlzZmllcyhlW29dKTtpZihnIT09dm9pZCAwKXJldHVybiBnfWNvbnN0IGg9Zi5maW5kKGQsZz0+dGhpcy5pc1BsYXRmb3JtKGcpKTtpZihoKXtjb25zdCBnPXRoaXMuc2F0aXNmaWVzKGVbaF0pO2lmKGchPT12b2lkIDApcmV0dXJuIGd9fWlmKGk+MCl7Y29uc3QgZD1PYmplY3Qua2V5cyhuKSxvPWYuZmluZChkLGg9PnRoaXMuaXNCcm93c2VyKGgsITApKTtpZihvIT09dm9pZCAwKXJldHVybiB0aGlzLmNvbXBhcmVWZXJzaW9uKG5bb10pfX1pc0Jyb3dzZXIodCxlPSExKXtjb25zdCBzPXRoaXMuZ2V0QnJvd3Nlck5hbWUoKS50b0xvd2VyQ2FzZSgpO2xldCBuPXQudG9Mb3dlckNhc2UoKTtjb25zdCBpPWYuZ2V0QnJvd3NlclR5cGVCeUFsaWFzKG4pO3JldHVybiBlJiZpJiYobj1pLnRvTG93ZXJDYXNlKCkpLG49PT1zfWNvbXBhcmVWZXJzaW9uKHQpe2xldCBlPVswXSxzPXQsbj0hMTtjb25zdCBpPXRoaXMuZ2V0QnJvd3NlclZlcnNpb24oKTtpZih0eXBlb2YgaT09InN0cmluZyIpcmV0dXJuIHRbMF09PT0iPiJ8fHRbMF09PT0iPCI/KHM9dC5zdWJzdHIoMSksdFsxXT09PSI9Ij8obj0hMCxzPXQuc3Vic3RyKDIpKTplPVtdLHRbMF09PT0iPiI/ZS5wdXNoKDEpOmUucHVzaCgtMSkpOnRbMF09PT0iPSI/cz10LnN1YnN0cigxKTp0WzBdPT09In4iJiYobj0hMCxzPXQuc3Vic3RyKDEpKSxlLmluZGV4T2YoZi5jb21wYXJlVmVyc2lvbnMoaSxzLG4pKT4tMX1pc09TKHQpe3JldHVybiB0aGlzLmdldE9TTmFtZSghMCk9PT1TdHJpbmcodCkudG9Mb3dlckNhc2UoKX1pc1BsYXRmb3JtKHQpe3JldHVybiB0aGlzLmdldFBsYXRmb3JtVHlwZSghMCk9PT1TdHJpbmcodCkudG9Mb3dlckNhc2UoKX1pc0VuZ2luZSh0KXtyZXR1cm4gdGhpcy5nZXRFbmdpbmVOYW1lKCEwKT09PVN0cmluZyh0KS50b0xvd2VyQ2FzZSgpfWlzKHQsZT0hMSl7cmV0dXJuIHRoaXMuaXNCcm93c2VyKHQsZSl8fHRoaXMuaXNPUyh0KXx8dGhpcy5pc1BsYXRmb3JtKHQpfXNvbWUodD1bXSl7cmV0dXJuIHQuc29tZShlPT50aGlzLmlzKGUpKX19LyohCiAqIEJvd3NlciAtIGEgYnJvd3NlciBkZXRlY3RvcgogKiBodHRwczovL2dpdGh1Yi5jb20vbGFuY2VkaWtzb24vYm93c2VyCiAqIE1JVCBMaWNlbnNlIHwgKGMpIER1c3RpbiBEaWF6IDIwMTItMjAxNQogKiBNSVQgTGljZW5zZSB8IChjKSBEZW5pcyBEZW1jaGVua28gMjAxNS0yMDE5CiAqL2NsYXNzIERpe3N0YXRpYyBnZXRQYXJzZXIodCxlPSExKXtpZih0eXBlb2YgdCE9InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKCJVc2VyQWdlbnQgc2hvdWxkIGJlIGEgc3RyaW5nIik7cmV0dXJuIG5ldyBGcih0LGUpfXN0YXRpYyBwYXJzZSh0KXtyZXR1cm4gbmV3IEZyKHQpLmdldFJlc3VsdCgpfXN0YXRpYyBnZXQgQlJPV1NFUl9NQVAoKXtyZXR1cm4gQnJ9c3RhdGljIGdldCBFTkdJTkVfTUFQKCl7cmV0dXJuIHNlfXN0YXRpYyBnZXQgT1NfTUFQKCl7cmV0dXJuIEt9c3RhdGljIGdldCBQTEFURk9STVNfTUFQKCl7cmV0dXJuIEZ9fWNvbnN0IEVlPSJjaHJvbWUiLHhyPSJvcGVyYSIsanI9ImZpcmVmb3giLFVyPSJpZXhwbG9yZXIiLEhyPSJzYWZhcmkiLEtyPSJud2pzIixXcj0iZWxlY3Ryb24iLHpyPSJyZWFjdC1uYXRpdmUiLFB0PSJ1bmtub3duIixjdD17Q2hyb21lOkVlLENocm9taXVtOkVlLE9wZXJhOnhyLEZpcmVmb3g6anIsIkludGVybmV0IEV4cGxvcmVyIjpVcixTYWZhcmk6SHJ9O2Z1bmN0aW9uIE5pKCl7Y29uc3R7dXNlckFnZW50OnJ9PW5hdmlnYXRvcix0PXtuYW1lOlB0LHZlcnNpb246dm9pZCAwfTtpZihyLm1hdGNoKC9DaHJvbWUvKSYmIXIubWF0Y2goL0VkZ2UvKSlpZihyLm1hdGNoKC9FZGcoQT8pLykpe2NvbnN0IGU9ci5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdO051bWJlci5wYXJzZUludChlLDEwKT43MiYmKHQubmFtZT1FZSx0LnZlcnNpb249ZSl9ZWxzZSB0Lm5hbWU9RWUsdC52ZXJzaW9uPXIubWF0Y2goL0Nocm9tZVwvKFtcZC5dKykvKVsxXTtyZXR1cm4gdH1mdW5jdGlvbiBWaSgpe2NvbnN0e3VzZXJBZ2VudDpyfT1uYXZpZ2F0b3I7aWYoci5tYXRjaCgvRWxlY3Ryb24vKSl7Y29uc3QgdD1yLm1hdGNoKC9FbGVjdHJvblwvKFtcZC5dKykvKVsxXTtyZXR1cm57bmFtZTpXcix2ZXJzaW9uOnR9fXJldHVybiBudWxsfWZ1bmN0aW9uIEJpKCl7Y29uc3R7dXNlckFnZW50OnJ9PW5hdmlnYXRvcjtpZihyLm1hdGNoKC9KaXRzaU1lZXROVy8pKXtjb25zdCB0PXIubWF0Y2goL0ppdHNpTWVldE5XXC8oW1xkLl0rKS8pWzFdO3JldHVybntuYW1lOktyLHZlcnNpb246dH19fWZ1bmN0aW9uIEZpKCl7Y29uc3Qgcj1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9cYihyZWFjdFsgXHRfLV0qbmF0aXZlKSg/OlwvKFxTKykpPy9pKTtsZXQgdDtpZihyfHxuYXZpZ2F0b3IucHJvZHVjdD09PSJSZWFjdE5hdGl2ZSIpcmV0dXJuIHImJnIubGVuZ3RoPjImJihyWzFdLHQ9clsyXSksdHx8KHQ9InVua25vd24iKSx7bmFtZTp6cix2ZXJzaW9uOnR9fWZ1bmN0aW9uIHhpKHIpe2xldCB0O2NvbnN0IGU9W0ZpLFZpLEJpXTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rPTEpaWYodD1lW25dKCksdClyZXR1cm4gdDtjb25zdCBzPXIuZ2V0QnJvd3Nlck5hbWUoKTtyZXR1cm4gcyBpbiBjdD97bmFtZTpjdFtzXSx2ZXJzaW9uOnIuZ2V0QnJvd3NlclZlcnNpb24oKX06KHQ9TmkoKSx0fHx7bmFtZTpQdCx2ZXJzaW9uOnZvaWQgMH0pfWNsYXNzIGppe2NvbnN0cnVjdG9yKCl7dSh0aGlzLCJfYm93c2VyIik7dSh0aGlzLCJfbmFtZSIpO3UodGhpcywiX3ZlcnNpb24iKTt1KHRoaXMsImdldERldmljZUluZm8iLCgpPT4oe2lzTW9iaWxlOnRoaXMuaXNNb2JpbGUoKSxicm93c2VyTmFtZTp0aGlzLl9ib3dzZXIuZ2V0QnJvd3Nlck5hbWUoKSxvc05hbWU6dGhpcy5fYm93c2VyLmdldE9TTmFtZSgpLGJyb3dzZXJWZXJzaW9uOnRoaXMuX2Jvd3Nlci5nZXRCcm93c2VyVmVyc2lvbigpLG9zVmVyc2lvbk5hbWU6dGhpcy5fYm93c2VyLmdldE9TVmVyc2lvbigpLGVuZ2luZU5hbWU6dGhpcy5fYm93c2VyLmdldEVuZ2luZU5hbWUoKX0pKX1pbml0KHQpe2xldCBlLHM7aWYodGhpcy5fYm93c2VyPURpLmdldFBhcnNlcihuYXZpZ2F0b3IudXNlckFnZW50KSx0eXBlb2YgdD09InVuZGVmaW5lZCIpe2NvbnN0IG49eGkodGhpcy5fYm93c2VyKTtlPW4ubmFtZSxzPW4udmVyc2lvbn1lbHNlIHQubmFtZSBpbiBjdD8oZT1jdFt0Lm5hbWVdLHM9dC52ZXJzaW9uKTooZT1QdCxzPXZvaWQgMCk7dGhpcy5fbmFtZT1lLHRoaXMuX3ZlcnNpb249c31nZXROYW1lKCl7cmV0dXJuIHRoaXMuX25hbWV9aXNDaHJvbWUoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUVlfWlzT3BlcmEoKXtyZXR1cm4gdGhpcy5fbmFtZT09PXhyfWlzRmlyZWZveCgpe3JldHVybiB0aGlzLl9uYW1lPT09anJ9aXNJRXhwbG9yZXIoKXtyZXR1cm4gdGhpcy5fbmFtZT09PVVyfWlzU2FmYXJpKCl7cmV0dXJuIHRoaXMuX25hbWU9PT1Icn1pc05XSlMoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUtyfWlzRWxlY3Ryb24oKXtyZXR1cm4gdGhpcy5fbmFtZT09PVdyfWlzUmVhY3ROYXRpdmUoKXtyZXR1cm4gdGhpcy5fbmFtZT09PXpyfHxuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZT09PSEwfWdldFZlcnNpb24oKXtyZXR1cm4gdGhpcy5fdmVyc2lvbn1pc01vYmlsZSgpe3JldHVybiB0aGlzLl9ib3dzZXIuZ2V0UGxhdGZvcm1UeXBlKCk9PT0ibW9iaWxlIn1fY2hlY2tDb25kaXRpb24odCl7aWYodGhpcy5fdmVyc2lvbilyZXR1cm4gdGhpcy5fYm93c2VyLnNhdGlzZmllcyh0KX1pc1ZlcnNpb25HcmVhdGVyVGhhbih0KXtyZXR1cm4gdGhpcy5fY2hlY2tDb25kaXRpb24oe1t0aGlzLl9uYW1lXTpgPiR7dH1gfSl9aXNWZXJzaW9uTGVzc1RoYW4odCl7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YDwke3R9YH0pfWlzVmVyc2lvbkVxdWFsVG8odCl7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YH4ke3R9YH0pfX1jbGFzcyBVaSBleHRlbmRzIGppe2RvZXNWaWRlb011dGVCeVN0cmVhbVJlbW92ZSgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c1AyUCgpe3JldHVybiF0aGlzLnVzZXNVbmlmaWVkUGxhbigpfWlzQ2hyb21pdW1CYXNlZCgpe3JldHVybiB0aGlzLmlzQ2hyb21lKCl8fHRoaXMuaXNFbGVjdHJvbigpfHx0aGlzLmlzTldKUygpfHx0aGlzLmlzT3BlcmEoKX1pc1dlYktpdEJhc2VkKCl7cmV0dXJuIHRoaXMuX2Jvd3Nlci5pc0VuZ2luZSgid2Via2l0IikmJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzIT0idW5kZWZpbmVkIiYmdHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhIT0idW5kZWZpbmVkIiYmdHlwZW9mIHdpbmRvdy5SVENSdHBUcmFuc2NlaXZlciE9InVuZGVmaW5lZCImJk9iamVjdC5rZXlzKFJUQ1J0cFRyYW5zY2VpdmVyLnByb3RvdHlwZSkuaW5kZXhPZigiY3VycmVudERpcmVjdGlvbiIpPi0xfWlzU3VwcG9ydGVkKCl7cmV0dXJuIHR5cGVvZiBSVENQZWVyQ29ubmVjdGlvbiE9InVuZGVmaW5lZCJ9aXNVc2VySW50ZXJhY3Rpb25SZXF1aXJlZEZvclVubXV0ZSgpe3JldHVybiB0aGlzLmlzRmlyZWZveCgpJiZ0aGlzLmlzVmVyc2lvbkxlc3NUaGFuKCI2OCIpfXN1cHBvcnRzVmlkZW9NdXRlT25Db25uSW50ZXJydXB0ZWQoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc1JlYWN0TmF0aXZlKCl8fHRoaXMuaXNXZWJLaXRCYXNlZCgpfXN1cHBvcnRzQmFuZHdpZHRoU3RhdGlzdGljcygpe3JldHVybiF0aGlzLmlzRmlyZWZveCgpJiYhdGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNDb2RlY1ByZWZlcmVuY2VzKCl7cmV0dXJuIHRoaXMudXNlc1VuaWZpZWRQbGFuKCkmJnR5cGVvZiB3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyh3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIucHJvdG90eXBlKS5pbmRleE9mKCJzZXRDb2RlY1ByZWZlcmVuY2VzIik+LTEmJk9iamVjdC5rZXlzKFJUQ1J0cFNlbmRlci5wcm90b3R5cGUpLmluZGV4T2YoImdldENhcGFiaWxpdGllcyIpPi0xJiYhdGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNEZXZpY2VDaGFuZ2VFdmVudCgpe3JldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5vbmRldmljZWNoYW5nZSE9InVuZGVmaW5lZCImJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmFkZEV2ZW50TGlzdGVuZXIhPSJ1bmRlZmluZWQifXN1cHBvcnRzTG9jYWxDYW5kaWRhdGVSdHRTdGF0aXN0aWNzKCl7cmV0dXJuIHRoaXMuaXNDaHJvbWl1bUJhc2VkKCl8fHRoaXMuaXNSZWFjdE5hdGl2ZSgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c1BlcmZvcm1hbmNlT2JzZXJ2ZXIoKXtyZXR1cm4gdHlwZW9mIHdpbmRvdy5QZXJmb3JtYW5jZU9ic2VydmVyIT0idW5kZWZpbmVkIiYmUGVyZm9ybWFuY2VPYnNlcnZlci5zdXBwb3J0ZWRFbnRyeVR5cGVzLmluZGV4T2YoImxvbmd0YXNrIik+LTF9c3VwcG9ydHNSZWNlaXZlclN0YXRzKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3cuUlRDUnRwUmVjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyhSVENSdHBSZWNlaXZlci5wcm90b3R5cGUpLmluZGV4T2YoImdldFN5bmNocm9uaXphdGlvblNvdXJjZXMiKT4tMX1zdXBwb3J0c1JUVFN0YXRpc3RpY3MoKXtyZXR1cm4hdGhpcy5pc0ZpcmVmb3goKX11c2VzUGxhbkIoKXtyZXR1cm4hdGhpcy51c2VzVW5pZmllZFBsYW4oKX11c2VzU2RwTXVuZ2luZ0ZvclNpbXVsY2FzdCgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzUmVhY3ROYXRpdmUoKXx8dGhpcy5pc1dlYktpdEJhc2VkKCl9dXNlc1VuaWZpZWRQbGFuKCl7cmV0dXJuISEodGhpcy5pc0ZpcmVmb3goKXx8dGhpcy5pc1dlYktpdEJhc2VkKCkpfXVzZXNOZXdHdW1GbG93KCl7cmV0dXJuISEodGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc0ZpcmVmb3goKXx8dGhpcy5pc1dlYktpdEJhc2VkKCkpfXVzZXNBZGFwdGVyKCl7cmV0dXJuIHRoaXMudXNlc05ld0d1bUZsb3coKX11c2VzUmlkc0ZvclNpbXVsY2FzdCgpe3JldHVybiExfXN1cHBvcnRzR2V0RGlzcGxheU1lZGlhKCl7cmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IuZ2V0RGlzcGxheU1lZGlhIT0idW5kZWZpbmVkInx8dHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXREaXNwbGF5TWVkaWEhPSJ1bmRlZmluZWQifXN1cHBvcnRzSW5zZXJ0YWJsZVN0cmVhbXMoKXtpZighKHR5cGVvZiB3aW5kb3cuUlRDUnRwU2VuZGVyIT0idW5kZWZpbmVkIiYmKHdpbmRvdy5SVENSdHBTZW5kZXIucHJvdG90eXBlLmNyZWF0ZUVuY29kZWRTdHJlYW1zfHx3aW5kb3cuUlRDUnRwU2VuZGVyLnByb3RvdHlwZS5jcmVhdGVFbmNvZGVkVmlkZW9TdHJlYW1zKSkpcmV0dXJuITE7Y29uc3QgdD1uZXcgUmVhZGFibGVTdHJlYW07dHJ5e3JldHVybiB3aW5kb3cucG9zdE1lc3NhZ2UodCwiKiIsW3RdKSwhMH1jYXRjaChlKXtyZXR1cm4hMX19c3VwcG9ydHNBdWRpb1JlZCgpe3JldHVybiBCb29sZWFuKHdpbmRvdy5SVENSdHBTZW5kZXImJndpbmRvdy5SVENSdHBTZW5kZXIuZ2V0Q2FwYWJpbGl0aWVzJiZ3aW5kb3cuUlRDUnRwU2VuZGVyLmdldENhcGFiaWxpdGllcygiYXVkaW8iKS5jb2RlY3Muc29tZSh0PT50Lm1pbWVUeXBlPT09ImF1ZGlvL3JlZCIpJiZ3aW5kb3cuUlRDUnRwUmVjZWl2ZXImJndpbmRvdy5SVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMmJndpbmRvdy5SVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMoImF1ZGlvIikuY29kZWNzLnNvbWUodD0+dC5taW1lVHlwZT09PSJhdWRpby9yZWQiKSl9c3VwcG9ydHNTZHBTZW1hbnRpY3MoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKX1fZ2V0Q2hyb21pdW1CYXNlZFZlcnNpb24oKXtpZih0aGlzLmlzQ2hyb21pdW1CYXNlZCgpKXtpZih0aGlzLmlzTldKUygpKXJldHVybiBOdW1iZXIucGFyc2VJbnQocHJvY2Vzcy52ZXJzaW9ucy5jaHJvbWl1bSwxMCk7Y29uc3QgdD1uYXZpZ2F0b3IudXNlckFnZW50O2lmKHQubWF0Y2goL0Nocm9tZS8pKXJldHVybiBOdW1iZXIucGFyc2VJbnQodC5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdLDEwKX1yZXR1cm4tMX1pc0lPU01vYmlsZSgpe3JldHVybiB0aGlzLmlzTW9iaWxlJiZ0aGlzLl9ib3dzZXIuZ2V0T1NOYW1lKCk9PT0iaU9TIn19Y29uc3QgSGk9bmV3IFVpO2NsYXNzIEtpe2NvbnN0cnVjdG9yKCl7dSh0aGlzLCJsb2dzQ2FjaGUiLFtdKTt1KHRoaXMsImxvZ3NQcm9jZXNzb3JUaW1lciIpO3UodGhpcywiY29tcHJlc3Npb25TdXBwb3J0ZWQiLG51bGwpO3UodGhpcywidHJhY2luZ0VuYWJsZWQiLCEwKTt1KHRoaXMsImluaXRpYWxpemVkIiwhMSk7dSh0aGlzLCJsb2dMZXZlbCIsImxvZyIpO3UodGhpcywibG9nc1Byb2Nlc3NpbmdJbnRlcnZhbCIsN2UzKTt1KHRoaXMsImxvZ0V4Y2x1c2lvbkxpc3QiLFsibWVzc2FnZSIsIndlYnNvY2tldC9tZXNzYWdlIiwicm9vbU1lc3NhZ2UiLCJ3ZWJzb2NrZXQvcm9vbS1tZXNzYWdlIiwid2Vic29ja2V0L3Jvb20tbGVnYWN5LW1vZGUiLCJjaGF0TWVzc2FnZSIsIndlYnNvY2tldC9uZXctY2hhdC1tZXNzYWdlIiwid2Vic29ja2V0L25vLWFjdGl2ZS1zcGVha2VyIiwid2Vic29ja2V0L3NlbGVjdGVkLXBlZXJzIiwid2Vic29ja2V0L2FjdGl2ZS1zcGVha2VyIiwicGluZyIsIndlYnNvY2tldC9uZXctY29uc3VtZXIiLCJ3ZWJzb2NrZXQvcHJvZHVjZXItc2NvcmUiLCJ3ZWJzb2NrZXQvY29uc3VtZXItc2NvcmUiLCJ3ZWJzb2NrZXQvcGx1Z2luLWV2ZW50Iiwid2Vic29ja2V0L3BsdWdpbi1kYXRhIiwid2Vic29ja2V0L3BsdWdpbi1pbnRlcm5hbC1kYXRhIl0pO3UodGhpcywibWVldGluZ01ldGFkYXRhIix7fSl9aXNDb21wcmVzc2lvblN1cHBvcnRlZCgpe2lmKHRoaXMuY29tcHJlc3Npb25TdXBwb3J0ZWQ9PT1udWxsKXRyeXt0aGlzLmNvbXByZXNzaW9uU3VwcG9ydGVkPXR5cGVvZiBDb21wcmVzc2lvblN0cmVhbSE9InVuZGVmaW5lZCImJnR5cGVvZiBCbG9iIT0idW5kZWZpbmVkIiYmdHlwZW9mIEJsb2IucHJvdG90eXBlLnN0cmVhbT09ImZ1bmN0aW9uIiYmdHlwZW9mIFJlc3BvbnNlIT0idW5kZWZpbmVkIn1jYXRjaCh0KXt0aGlzLmNvbXByZXNzaW9uU3VwcG9ydGVkPSExLHRoaXMuYWRkTG9nSW5DdXJyZW50U3Bhbigid2FybiIsIkNvbXByZXNzaW9uIGZlYXR1cmUgZGV0ZWN0aW9uIGZhaWxlZCwgdXNpbmcgdW5jb21wcmVzc2VkIGxvZ3MiLHtlcnJvcjp0fSl9cmV0dXJuIHRoaXMuY29tcHJlc3Npb25TdXBwb3J0ZWR9Z2V0IGxvZ3NFbmRwb2ludCgpe2NvbnN0IHQ9VGUuZ2V0Q29udGV4dCh0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpO3JldHVybmBodHRwczovLyR7SWkoe3NlcnZpY2VQcmVmaXg6ImFwaS1zaWxvcyIsYmFzZVVSSTp0LmdldFZhbHVlKCJiYXNlVVJJIil9KX0vb3RlbC9sb2dzYH1nZXQgbG9nc0JhdGNoU2l6ZSgpe3JldHVybiB0aGlzLmlzQ29tcHJlc3Npb25TdXBwb3J0ZWQoKT81MDoyNX1yZXNldFBlZXJJZCh0KXt0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQ9dH1pbml0KHQsZSxzLG4pe3RoaXMudHJhY2luZ0VuYWJsZWQ9ITAsdGhpcy5pbml0aWFsaXplZD0hMSxuJiYodGhpcy5sb2dMZXZlbD1uKSx0aGlzLmxvZ3NDYWNoZT1bXTtjb25zdCBpPXQuZ2V0VmFsdWUoInBlZXJJZCIpO3RoaXMubWVldGluZ01ldGFkYXRhPWUsdGhpcy50cmFjaW5nRW5hYmxlZD1zLHRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZD1pLHRoaXMubWVldGluZ01ldGFkYXRhLnNka1ZlcnNpb249dC5nZXRWYWx1ZSgic2RrVmVyc2lvbiIpO2NvbnN0e1JORGV2aWNlSW5mb0ltcGw6YX09bmF2aWdhdG9yO3RoaXMubWVldGluZ01ldGFkYXRhLmRldmljZUluZm89bmF2aWdhdG9yLmlzUmVhY3ROYXRpdmU/YT09bnVsbD92b2lkIDA6YS5nZXREZXZpY2VJbmZvKCk6SGkuZ2V0RGV2aWNlSW5mbygpLHRoaXMubWVldGluZ01ldGFkYXRhLnZpc2l0ZWRVcmw9IW5hdmlnYXRvci5pc1JlYWN0TmF0aXZlJiZ0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LmxvY2F0aW9uLmhyZWYsdGhpcy5sb2dzUHJvY2Vzc29yVGltZXI9c2V0SW50ZXJ2YWwoKCk9PnRoaXMucHJvY2Vzc0NhY2hlZExvZ3MoKS5jYXRjaCgoKT0+e30pLHRoaXMubG9nc1Byb2Nlc3NpbmdJbnRlcnZhbCkscyYmKHRoaXMuaW5pdGlhbGl6ZWQ9ITApfXN0YXRpYyB0cmFjZSh0LGU9dm9pZCAwKXtyZXR1cm4ocyxuLGkpPT57Y29uc3QgYT1pLnZhbHVlO3JldHVybiBpLnZhbHVlPWZ1bmN0aW9uKC4uLm8pe2NvbnN0IGg9dGhpcz09bnVsbD92b2lkIDA6dGhpcy50ZWxlbWV0cnk7aWYoIWh8fCFoLmluaXRpYWxpemVkfHxuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZXx8IWgudHJhY2luZ0VuYWJsZWQpcmV0dXJuIGEuYXBwbHkodGhpcyxvKTtoLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLHQsZSk7Y29uc3QgZz1wZXJmb3JtYW5jZS5ub3coKSxiPWEuYXBwbHkodGhpcyxvKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGIpLnRoZW4oKCk9Pntjb25zdCBUPXBlcmZvcm1hbmNlLm5vdygpO1QtZz4xMCYmaC5hZGRMb2dJbkN1cnJlbnRTcGFuKCJpbmZvIixgJHt0fV90aW1pbmdgLHtleGVjVGltZTpULWd9KX0pLmNhdGNoKCgpPT57Y29uc3QgVD1wZXJmb3JtYW5jZS5ub3coKTtoLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLGAke3R9X3RpbWluZ2Ase2V4ZWNUaW1lOlQtZ30pfSksYn0saX19aW5qZWN0Q29udGV4dCh0KXt2YXIgbjtjb25zdCBlPU5zKCkucmVwbGFjZSgvLS9nLCIiKS5zdWJzdHJpbmcoMCwxNikscz0obj10aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpPT1udWxsP3ZvaWQgMDpuLnJlcGxhY2UoLy0vZywiIik7dC5UUkFDRVBBUkVOVD1gMDAtJHtzfS0ke2V9LTAxYH1hZGRMb2dJbkN1cnJlbnRTcGFuKHQsZSxzPXt9LG49ITEpe3MhPW51bGwmJnMuZXJyb3ImJk9iamVjdC5hc3NpZ24ocyx7ZXJyb3I6b3Qocy5lcnJvcil9KTtjb25zdCBpPVRlLmdldENvbnRleHQodGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKTtpZihEcihpKSYmKENpKHMpP2NvbnNvbGVbdF0oIkludGVybmFsTG9nczo6ICIsdCxlKTpjb25zb2xlW3RdKCJJbnRlcm5hbExvZ3M6OiAiLHQsZSxzKSksISFraShpLHQpKXRyeXtjb25zdCBkPVZyKGksZSxzLCJtZXRhZGF0YSIpLG89bmV3IERhdGUsaD1RZShHKHttZXNzYWdlOmUsbGV2ZWw6dH0sZCkse2xvZ2dlZEF0Om8udG9JU09TdHJpbmcoKSxsb2dnZWRBdFR6T2Zmc2V0Om8uZ2V0VGltZXpvbmVPZmZzZXQoKX0pO24/dGhpcy5zZW5kT3RlbExvZ3NUb05ld1JlbGljKFtoXSx7aXNJbkRlc3RydWN0aW9uTW9kZTohMX0pLmNhdGNoKCgpPT57fSk6dGhpcy5sb2dzQ2FjaGUucHVzaChoKX1jYXRjaChkKXt0aGlzLmFkZExvZ0luQ3VycmVudFNwYW4oImVycm9yIiwib3BlbnRlbGVtZXRyeTo6YWRkTG9nSW5DdXJyZW50U3Bhbl9mYWlsZWQiLHtlcnJvcjpvdChkKX0pfX1zZW5kT3RlbExvZ3NUb05ld1JlbGljKHMpe3JldHVybiB3KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKih0LHtpc0luRGVzdHJ1Y3Rpb25Nb2RlOmU9ITF9PXtpc0luRGVzdHJ1Y3Rpb25Nb2RlOiExfSl7Y29uc3Qgbj1uZXcgQWJvcnRDb250cm9sbGVyLGk9c2V0VGltZW91dCgoKT0+bi5hYm9ydCgiTG9ncyByZXF1ZXN0IHRpbWVkIG91dCBhZnRlciA4IHNlY29uZHMiKSw4ZTMpO3RyeXtjb25zdCBhPVRlLmdldENvbnRleHQodGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKSxkPUpTT04uc3RyaW5naWZ5KHttZWV0aW5nTWV0YWRhdGE6VnIoYSwic2VuZE90ZWxMb2dzVG9OZXdSZWxpYyIsdGhpcy5tZWV0aW5nTWV0YWRhdGEsIm1lZXRpbmdNZXRhZGF0YSIpLHNlcnZpY2VOYW1lOmEuZ2V0VmFsdWUoInNka05hbWUiKSxsb2dzOnR9KTtsZXQgbztjb25zdCBoPXtBdXRob3JpemF0aW9uOmBCZWFyZXIgJHthLmdldFZhbHVlKCJhdXRoVG9rZW4iKX1gfTtpZih0aGlzLmlzQ29tcHJlc3Npb25TdXBwb3J0ZWQoKSl7Y29uc3QgZz1uZXcgQmxvYihbZF0pLnN0cmVhbSgpLnBpcGVUaHJvdWdoKG5ldyBDb21wcmVzc2lvblN0cmVhbSgiZ3ppcCIpKTtvPXlpZWxkIG5ldyBSZXNwb25zZShnKS5hcnJheUJ1ZmZlcigpLGhbIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi9nemlwIixoWyJDb250ZW50LUVuY29kaW5nIl09Imd6aXAifWVsc2Ugbz1kLGhbIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi9qc29uIjt5aWVsZCBmZXRjaCh0aGlzLmxvZ3NFbmRwb2ludCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOmgsYm9keTpvLHNpZ25hbDpuLnNpZ25hbCxrZWVwYWxpdmU6ISFlfSl9Y2F0Y2goYSl7ZXx8KHRoaXMuYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLCJvcGVudGVsZW1ldHJ5OjpzZW5kT3RlbExvZ1RvTmV3UmVsaWNfZmFpbGVkIix7ZXJyb3I6b3QoYSl9KSx0aGlzLmxvZ3NDYWNoZS5wdXNoKC4uLnQpKX1maW5hbGx5e2NsZWFyVGltZW91dChpKX19KX1wcm9jZXNzQ2FjaGVkTG9ncygpe3JldHVybiB3KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKih7aXNJbkRlc3RydWN0aW9uTW9kZTp0PSExfT17aXNJbkRlc3RydWN0aW9uTW9kZTohMX0pe2NvbnN0IGU9dGhpcy5sb2dzQ2FjaGUuc3BsaWNlKDAsdGhpcy5sb2dzQmF0Y2hTaXplKTtlIT1udWxsJiZlLmxlbmd0aCYmKHlpZWxkIHRoaXMuc2VuZE90ZWxMb2dzVG9OZXdSZWxpYyhlLHtpc0luRGVzdHJ1Y3Rpb25Nb2RlOnR9KSl9KX1kZXN0cnVjdCgpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtmb3IoY2xlYXJJbnRlcnZhbCh0aGlzLmxvZ3NQcm9jZXNzb3JUaW1lcik7dGhpcy5sb2dzQ2FjaGUubGVuZ3RoOyl5aWVsZCB0aGlzLnByb2Nlc3NDYWNoZWRMb2dzKHtpc0luRGVzdHJ1Y3Rpb25Nb2RlOiEwfSl9KX19ZnVuY3Rpb24gV2kocil7Y29uc3QgdD1HKHt9LHIpLGU9bmV3IE1hcCxzPShoLGcpPT4oZS5oYXMoaCl8fGUuc2V0KGgsbmV3IFNldCksZS5nZXQoaCkuYWRkKGcpLCgpPT57dmFyIGI7cmV0dXJuKGI9ZS5nZXQoaCkpPT1udWxsP3ZvaWQgMDpiLmRlbGV0ZShnKX0pLG49KGgsZyk9Pnt2YXIgYjsoYj1lLmdldChoKSk9PW51bGx8fGIuZGVsZXRlKGcpfSxpPWg9Pnt2YXIgZzsoZz1lLmdldChoKSk9PW51bGx8fGcuZm9yRWFjaChiPT57dHJ5e2IodFtoXSl9Y2F0Y2goVCl7fX0pfTtyZXR1cm57c3Vic2NyaWJlOnMsdW5zdWJzY3JpYmU6bixub3RpZnk6aSxzZXRWYWx1ZTooaCxnLGI9ITApPT57dFtoXT1nLGImJmkoaCl9LGdldFZhbHVlOmg9PnRbaF0sZ2V0QWxsVmFsdWVzOigpPT50fX1jbGFzcyB6aXtjb25zdHJ1Y3Rvcigpe3UodGhpcywiY29udGV4dHMiLG5ldyBNYXApO3UodGhpcywibW9zdFJlY2VudFBlZXJJZCIsbnVsbCl9Y3JlYXRlQ29udGV4dCh0LGUpe2lmKHRoaXMuY29udGV4dHMuaGFzKHQpKXJldHVybiB0aGlzLmNvbnRleHRzLmdldCh0KTtjb25zdCBzPW5ldyBLaSxuPW5ldyBNczt0aGlzLmNvbnRleHRzLnNldCh0LFdpKGUpKSx0aGlzLmNvbnRleHRzLmdldCh0KS5zZXRWYWx1ZSgicGVlclNlc3Npb25TdG9yZSIsbmV3IG10KG4pKTtjb25zdCBpPW5ldyBwcjtyZXR1cm4gaS5zZXRNYXhMaXN0ZW5lcnMoNTApLHRoaXMuY29udGV4dHMuZ2V0KHQpLnNldFZhbHVlKCJsb2dnZXIiLG4pLHRoaXMuY29udGV4dHMuZ2V0KHQpLnNldFZhbHVlKCJ0ZWxlbWV0cnkiLHMpLHRoaXMuY29udGV4dHMuZ2V0KHQpLnNldFZhbHVlKCJjYWxsc3RhdHMiLGkpLHRoaXMubW9zdFJlY2VudFBlZXJJZD10LHRoaXMuY29udGV4dHMuZ2V0KHQpfXJlbWFwQ29udGV4dCh0LGUpe2NvbnN0IHM9ZS5nZXRWYWx1ZSgicGVlcklkIik7cyE9PXQmJihlLnNldFZhbHVlKCJwZWVySWQiLHQpLHRoaXMubW9zdFJlY2VudFBlZXJJZD10LHRoaXMuY29udGV4dHMuc2V0KHQsZSksdGhpcy5jb250ZXh0cy5kZWxldGUocykpfWdldENvbnRleHQodCl7cmV0dXJuIHRoaXMuY29udGV4dHMuZ2V0KHQpfWdldE1vc3RSZWNlbnRQZWVySWQoKXtyZXR1cm4gdGhpcy5tb3N0UmVjZW50UGVlcklkfX12YXIgVGU9bmV3IHppO2NvbnN0ICRpPXsiMDAiOiJDbGllbnQiLCIwMSI6IkNvbnRyb2xsZXIiLCIwMiI6IlJvb21Ob2RlQ2xpZW50IiwiMDMiOiJIaXZlTm9kZUNsaWVudCIsIjA0IjoiU29ja2V0U2VydmljZSIsIjA1IjoiQ2hhdCIsIjA2IjoiUGx1Z2luIiwiMDciOiJQb2xscyIsIjA4IjoiTWV0YSIsIjA5IjoiUHJlc2V0IiwxMDoiUmVjb3JkaW5nIiwxMToiU2VsZiIsMTI6IlBhcnRpY2lwYW50IiwxMzoiU3BvdGxpZ2h0IiwxNDoiUmVtb3RlIFJlcXVlc3QiLDE1OiJXZWJpbmFyIiwxNjoiTG9jYWxNZWRpYUhhbmRsZXIiLDE3OiJFbmQtRW5kIEVuY3J5cHRpb24iLDE4OiJBSSIsMTk6IkxpdmVzdHJlYW0iLDIwOiJTdGFnZSJ9LGR0PXsiMDAwMCI6IkludGVybmFsIGV4Y2VwdGlvbi4iLCIwMDAxIjoiRmFpbGVkIHRvIGluaXRpYWxpemUuIiwiMDAwMiI6IkZhaWxlZCB0byBqb2luIHJvb20uIiwiMDAwMyI6IkZhaWxlZCB0byBsZWF2ZSByb29tLiIsIjAwMDQiOiJJbnZhbGlkIGF1dGggdG9rZW4iLCIwMDEwIjoiQnJvd3NlciBub3Qgc3VwcG9ydGVkIiwiMDAxMSI6IkhUVFAgTmV0d29yayBFcnJvciIsIjAwMTIiOiJXZWJzb2NrZXQgTmV0d29yayBFcnJvciIsIjAwMTMiOiJSYXRlIExpbWl0ZWQiLCIwMTAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDEwMSI6IlBlcm1pc3Npb24gZGVuaWVkIiwiMDEwMiI6IlByZXJlcXVpc2l0ZSBtb2R1bGUgbWlzc2luZyIsIjAyMDAiOiJJbnRlcm5hbCBleGNlcHRpb24uIiwiMDMwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA0MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNDA0IjoiTWlzc2luZyBwcmVyZXF1aXNpdGVzIHRvIGVzdGFibGlzaCBhIHdlYnNvY2tldCBjb25uZWN0aW9uIiwiMDUwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA1MDEiOiJQZXJtaXNzaW9uIGRlbmllZC4iLCIwNTAyIjoiSW52YWxpZCBtZXNzYWdlIGJvZHkuIiwiMDUwMyI6IlRleHQgTWVzc2FnZSBpcyB0b28gbGFyZ2UiLCIwNTA0IjoiTWVzc2FnZSBub3QgZm91bmQgYnkgdGhlIGdpdmVuIGlkIiwiMDUwNSI6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwiMDUwNiI6Ik1lc3NhZ2Ugc2VhcmNoIGlzIGRpc2FibGVkIiwiMDYwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA2MDEiOiJQZXJtaXNzaW9uIGRlbmllZC4iLCIwNjAyIjoiQXV0aCB0b2tlbiBub3Qgc2V0IGZvciBwbHVnaW4iLCIwNjAzIjoiSWZyYW1lIHdhcyBub3QgcHJvdmlkZWQiLCIwNzAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDcwNSI6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwiMDgwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA4MDEiOiJQZXJtaXNzaW9uIGRlbmllZCIsIjA5MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwOTA0IjoiQ291bGQgbm90IGxvYWQgcHJlc2V0IiwxZTM6IkludGVybmFsIGV4Y2VwdGlvbiIsMTAwMToiUGVybWlzc2lvbiBkZW5pZWQiLDEwMDQ6IkNvdWxkIG5vdCBmaW5kIHNwZWNpZmllZCByZWNvcmRpbmciLDEwMDU6IkFjdGlvbiBub3QgcGVybWl0dGVkIGluIGdpdmVuIHJlY29yZGluZyBzdGF0ZSIsMTEwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxMTAxOiJQZXJtaXNzaW9uIGRlbmllZCIsMTEwMjoiVW5zdXBwb3J0ZWQiLDExMDM6Ik5hbWUgY2Fubm90IGJlIGVtcHR5IiwxMTA0OiJObyBkZXZpY2Ugc2VsZWN0ZWQgd2hpbGUgY2FsbGluZyBtZWV0aW5nLnNlbGYuc2V0RGV2aWNlIiwxMTA1OiJBY3Rpb24gbm90IHBlcm1pdHRlZCB3aXRob3V0IGpvaW5pbmcgcm9vbSIsMTEwNjoiQ2FuJ3Qgc2V0IGN1cnJlbnRseSB1c2VkIGRldmljZSIsMTIwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxMjAxOiJQZXJtaXNzaW9uIGRlbmllZCIsMTIwMjoiSW52YWxpZCBwYWdlIG51bWJlciB3YXMgcmVxdWVzdGVkIiwxMjAzOiJJbnZhbGlkIHBhcnRpY2lwYW50IGNvdW50IHBlciBwYWdlIHdhcyByZXF1ZXN0ZWQiLDEyMDQ6Ik5vIHBhcnRpY2lwYW50cyBleGlzdHMgd2l0aCB0aGUgZ2l2ZW4gVXNlcklkcyIsMTIwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLDEyMDY6Ik1hbnVhbCBTdWJzY3JpcHRpb24gTW9kZSB3YXMgbm90IEFDVElWQVRFRCIsMTIwNzoiSW52YWxpZCB2aWV3IG1vZGUiLDEyMDg6Ik1hbnVhbCBTdWJzY3JpcHRpb24gbm90IGVuYWJsZWQgZm9yIG9yZ2FuaXphdGlvbiIsMTIwOToiQnJvYWRjYXN0IG1lc3NhZ2UgdHlwZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyIsMTMwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxNDAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE0MDI6Ik5vIGV4aXN0aW5nIHJlbW90ZSByZXF1ZXN0cyIsMTQwMzoiTm8gcGVlciBleGlzdHMgd2l0aCBnaXZlbiBpZCIsMTUwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxNjAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE2MDE6IkZhaWxlZCB0byBnZXQgYXVkaW8gdHJhY2siLDE2MDI6IkZhaWxlZCB0byBnZXQgdmlkZW8gdHJhY2siLDE2MDM6IkluY29ycmVjdCBkZXZpY2UiLDE2MDQ6IkZhaWxlZCB0byBjaGFuZ2UgZGV2aWNlIiwxNjA1OiJGYWlsZWQgdG8gZ2V0IGF1ZGlvICYgdmlkZW8gdHJhY2siLDE2MDY6Ik5vIGF1ZGlvIGlucHV0IGRldmljZXMgYXJlIGF2YWlsYWJsZSIsMTYwNzoiTm8gdmlkZW8gaW5wdXQgZGV2aWNlcyBhcmUgYXZhaWxhYmxlIiwxNjA4OiJObyBhdWRpbyBvdXRwdXQgZGV2aWNlcyAoc3BlYWtlcnMpIGFyZSBhdmFpbGFibGUiLDE2MDk6IkZhaWxlZCB0byBmZXRjaCBsaXN0IG9mIG1lZGlhIGRldmljZXMiLDE2MTA6Ik5vIG1lZGlhIHRyYWNrIGV4aXN0cyIsMTYxMToiRmFpbGVkIHRvIHVubXV0ZSB0cmFjayIsMTYxMjoiRmFpbGVkIHRvIGdldCBzY3JlZW5zaGFyZSB0cmFja3MiLDE3MDE6IkNyeXB0byBlcnJvciIsMTgwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxODAxOiJDYW4ndCBmZXRjaCB0cmFuc2NyaXB0IGZpbGUiLDE5MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTkwMToiUGVybWlzc2lvbiBkZW5pZWQuIiwxOTAyOiJMaXZlc3RyZWFtIHRoYXQgaGFzIG5vdCB5ZXQgc3RhcnRlZCwgY2FuJ3QgYmUgc3RvcHBlZCIsMmUzOiJJbnRlcm5hbCBleGNlcHRpb24iLDIwMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwyMDAyOiJVbnN1cHBvcnRlZCIsMjAwMzoiU3RhZ2UgaXMgZGlzYWJsZWQiLDIwMDQ6Ik1ldGhvZCBub3QgaW1wbGVtZW50ZWQiLDIwMDU6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwyMDA2OiJBY3Rpb24gbm90IHBlcm1pdHRlZCBpbiBjdXJyZW50IHN0YWdlIHN0YXR1cyIsOTkwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIn07T2JqZWN0LmtleXMoZHQpLmZvckVhY2gocj0+e2R0W3JdPWB7JHskaVtyLnNsaWNlKDAsMildfX0gJHtkdFtyXX1gfSk7Y2xhc3MgR2kgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlLHMsbj12b2lkIDAsaT0hMSl7c3VwZXIoZSk7dSh0aGlzLCJjb2RlIik7dGhpcy5jb2RlPXMsdGhpcy5uYW1lPSJDbGllbnRFcnJvciI7Y29uc3QgYT10aGlzLmNvZGU/YFtFUlIke3RoaXMuY29kZX1dYDoiW0VSUl0iLGQ9dGhpcy5jb2RlP2R0W3RoaXMuY29kZV06IiI7dGhpcy5tZXNzYWdlPWAke2F9OiAke2R9CiR7dGhpcy5tZXNzYWdlfWA7dHJ5e2xldCBvPWkmJiEhbjtzJiZzLmVuZHNXaXRoKCIwMCIpJiZuJiYobz0hMCksbyYmbi5lcnJvcigiQ2xpZW50RXJyb3IiLHtlcnJvcjp7bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsY29kZTpzfX0pO2NvbnN0IGg9VGUuZ2V0Q29udGV4dChUZS5nZXRNb3N0UmVjZW50UGVlcklkKCkpO2lmKGgpe2NvbnN0IGc9aC5nZXRWYWx1ZSgib25FcnJvciIpO3RyeXtnKHRoaXMpfWNhdGNoKGIpe319dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiQ2xpZW50RXJyb3IiLHtkZXRhaWw6dGhpc30pKX1jYXRjaChvKXt9fX12YXIgbGU9KHI9PihyW3IuSW52YWxpZEtleT0wXT0iSW52YWxpZEtleSIscltyLk1pc3NpbmdLZXk9MV09Ik1pc3NpbmdLZXkiLHJbci5JbnRlcm5hbEVycm9yPTJdPSJJbnRlcm5hbEVycm9yIixyKSkobGV8fHt9KTtjbGFzcyB1ZSBleHRlbmRzIEdpe2NvbnN0cnVjdG9yKGUscz0yKXtzdXBlcihlLCIxNzAxIik7dSh0aGlzLCJyZWFzb24iKTt0aGlzLnJlYXNvbj1zfX1jbGFzcyAkciBleHRlbmRzIFcuRXZlbnRFbWl0dGVye2NvbnN0cnVjdG9yKGUpe3N1cGVyKCk7dSh0aGlzLCJsb2dnZXIiKTt0aGlzLmxvZ2dlcj1lLHN1cGVyLnNldE1heExpc3RlbmVycygyNSl9ZW1pdChlLC4uLnMpe3JldHVybiBzdXBlci5lbWl0KCIqIixlLC4uLnMpLHN1cGVyLmVtaXQoZSwuLi5zKX1vbihlLHMpe3ZhciBuO3RyeXtjb25zdCBpPXRoaXMubGlzdGVuZXJDb3VudChlKTtpPjI1JiZpJTI1PT09MCYmKChuPXRoaXMubG9nZ2VyKT09bnVsbHx8bi53YXJuKCJDdXN0b21FdmVudEVtaXR0ZXI6Om1heExpc3RlbmVyc0V4Y2VlZGVkIix7ZXZlbnRMaXN0ZW5lcjp7ZXZlbnROYW1lOmUudG9TdHJpbmcoKSxsaXN0ZW5lckNvdW50OnRoaXMubGlzdGVuZXJDb3VudChlKX19KSl9Y2F0Y2goaSl7fXJldHVybiBzdXBlci5vbihlLHMpfWFkZExpc3RlbmVyKGUscyl7dmFyIG47dHJ5e2NvbnN0IGk9dGhpcy5saXN0ZW5lckNvdW50KGUpO2k+MjUmJmklMjU9PT0wJiYoKG49dGhpcy5sb2dnZXIpPT1udWxsfHxuLndhcm4oIkN1c3RvbUV2ZW50RW1pdHRlcjo6bWF4TGlzdGVuZXJzRXhjZWVkZWQiLHtldmVudExpc3RlbmVyOntldmVudE5hbWU6ZS50b1N0cmluZygpLGxpc3RlbmVyQ291bnQ6dGhpcy5saXN0ZW5lckNvdW50KGUpfX0pKX1jYXRjaChpKXt9cmV0dXJuIHN1cGVyLmFkZExpc3RlbmVyKGUscyl9b2ZmKGUscyl7cmV0dXJuIHN1cGVyLm9mZihlLHMpfW9uY2UoZSxzKXtyZXR1cm4gc3VwZXIub25jZShlLHMpfXByZXBlbmRMaXN0ZW5lcihlLHMpe3JldHVybiBzdXBlci5wcmVwZW5kTGlzdGVuZXIoZSxzKX1wcmVwZW5kT25jZUxpc3RlbmVyKGUscyl7cmV0dXJuIHN1cGVyLnByZXBlbmRPbmNlTGlzdGVuZXIoZSxzKX1yZW1vdmVMaXN0ZW5lcihlLHMpe3JldHVybiBzdXBlci5yZW1vdmVMaXN0ZW5lcihlLHMpfXJlbW92ZUFsbExpc3RlbmVycyhlKXtyZXR1cm4gc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKGUpfWxpc3RlbmVycyhlKXtyZXR1cm4gc3VwZXIubGlzdGVuZXJzKGUpfWxpc3RlbmVyQ291bnQoZSl7cmV0dXJuIHN1cGVyLmxpc3RlbmVyQ291bnQoZSl9fWNvbnN0IEN0PXtFcnJvcjoiY3J5cHRvckVycm9yIn07ZnVuY3Rpb24gcWkocil7cmV0dXJuInR5cGUiaW4gcn1mdW5jdGlvbiBZaShzKXtyZXR1cm4gdyh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbioocix0PXtuYW1lOl99LGU9ImVuY3J5cHQiKXtyZXR1cm4gY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoInJhdyIscix0LCExLGU9PT0iZGVyaXZlIj9bImRlcml2ZUJpdHMiLCJkZXJpdmVLZXkiXTpbImVuY3J5cHQiLCJkZWNyeXB0Il0pfSl9ZnVuY3Rpb24gR3Iocix0KXtjb25zdCBzPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0KTtzd2l0Y2gocil7Y2FzZSJIS0RGIjpyZXR1cm57bmFtZToiSEtERiIsc2FsdDpzLGhhc2g6IlNIQS0yNTYiLGluZm86bmV3IEFycmF5QnVmZmVyKDEyOCl9O2Nhc2UiUEJLREYyIjpyZXR1cm57bmFtZToiUEJLREYyIixzYWx0OnMsaGFzaDoiU0hBLTI1NiIsaXRlcmF0aW9uczoxZTV9O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBhbGdvcml0aG0gJHtyfSBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWRgKX19ZnVuY3Rpb24gcXIocix0KXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgZT1HcihyLmFsZ29yaXRobS5uYW1lLHQpLHM9eWllbGQgY3J5cHRvLnN1YnRsZS5kZXJpdmVLZXkoZSxyLHtuYW1lOl8sbGVuZ3RoOjEyOH0sITEsWyJlbmNyeXB0IiwiZGVjcnlwdCJdKTtyZXR1cm57bWF0ZXJpYWw6cixlbmNyeXB0aW9uS2V5OnN9fSl9ZnVuY3Rpb24gUWkocix0KXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgZT1HcihyLmFsZ29yaXRobS5uYW1lLHQpO3JldHVybiBjcnlwdG8uc3VidGxlLmRlcml2ZUJpdHMoZSxyLDI1Nil9KX1jbGFzcyBKaSBleHRlbmRzICRye31jbGFzcyBZciBleHRlbmRzIEppe2NvbnN0cnVjdG9yKGUpe3ZhciBzO3N1cGVyKHZvaWQgMCk7dSh0aGlzLCJzZW5kQ291bnRzIik7dSh0aGlzLCJpc0tleUludmFsaWQiLCExKTt1KHRoaXMsInBhcnRpY2lwYW50SWQiKTt1KHRoaXMsInRyYWNrSWQiKTt1KHRoaXMsImtleXMiKTt1KHRoaXMsInZpZGVvQ29kZWMiKTt1KHRoaXMsInJ0cE1hcCIpO3UodGhpcywia2V5UHJvdmlkZXJPcHRpb25zIik7dSh0aGlzLCJ1bmVuY3J5cHRlZEZyYW1lQnl0ZVRyYWlsZXIiKTt0aGlzLnNlbmRDb3VudHM9bmV3IE1hcCx0aGlzLmtleXM9ZS5rZXlzLHRoaXMucGFydGljaXBhbnRJZD1lLnBhcnRpY2lwYW50SWQsdGhpcy5ydHBNYXA9bmV3IE1hcCx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucz1lLmtleVByb3ZpZGVyT3B0aW9ucyx0aGlzLnVuZW5jcnlwdGVkRnJhbWVCeXRlVHJhaWxlcj0ocz1lLnVuZW5jcnlwdGVkRnJhbWVCeXRlcykhPW51bGw/czpuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoIkxLUk9DS1MiKX1zZXRQYXJ0aWNpcGFudChlLHMpe3RoaXMucGFydGljaXBhbnRJZD1lLHRoaXMua2V5cz1zfXVuc2V0UGFydGljaXBhbnQoKXt0aGlzLnBhcnRpY2lwYW50SWQ9dm9pZCAwfWdldFBhcnRpY2lwYW50SWQoKXtyZXR1cm4gdGhpcy5wYXJ0aWNpcGFudElkfWdldFRyYWNrSWQoKXtyZXR1cm4gdGhpcy50cmFja0lkfXNldFZpZGVvQ29kZWMoZSl7dGhpcy52aWRlb0NvZGVjPWV9c2V0UnRwTWFwKGUpe3RoaXMucnRwTWFwPWV9c2V0dXBUcmFuc2Zvcm0oZSxzLG4saSxhKXthJiYodGhpcy52aWRlb0NvZGVjPWEpO2NvbnN0IGQ9ZT09PSJlbmNvZGUiP3RoaXMuZW5jb2RlRnVuY3Rpb246dGhpcy5kZWNvZGVGdW5jdGlvbixvPW5ldyBUcmFuc2Zvcm1TdHJlYW0oe3RyYW5zZm9ybTpkLmJpbmQodGhpcyl9KTtzLnBpcGVUaHJvdWdoKG8pLnBpcGVUbyhuKS5jYXRjaChoPT57dGhpcy5lbWl0KCJjcnlwdG9yRXJyb3IiLGggaW5zdGFuY2VvZiB1ZT9oOm5ldyB1ZShoLm1lc3NhZ2UpKX0pLHRoaXMudHJhY2tJZD1pfWVuY29kZUZ1bmN0aW9uKGUscyl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBhO2lmKCF0aGlzLmtleXMuaXNFbmFibGVkKCl8fGUuZGF0YS5ieXRlTGVuZ3RoPT09MClyZXR1cm4gcy5lbnF1ZXVlKGUpO2NvbnN0e2VuY3J5cHRpb25LZXk6bn09dGhpcy5rZXlzLmdldEtleVNldCgpLGk9dGhpcy5rZXlzLmdldEN1cnJlbnRLZXlJbmRleCgpO2lmKG4pe2NvbnN0IGQ9dGhpcy5tYWtlSVYoKGE9ZS5nZXRNZXRhZGF0YSgpLnN5bmNocm9uaXphdGlvblNvdXJjZSkhPW51bGw/YTotMSxlLnRpbWVzdGFtcCksbz1uZXcgVWludDhBcnJheShlLmRhdGEsMCx0aGlzLmdldFVuZW5jcnlwdGVkQnl0ZXMoZSkpLGg9bmV3IFVpbnQ4QXJyYXkoMik7aFswXT1vZSxoWzFdPWk7dHJ5e2NvbnN0IGc9eWllbGQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KHtuYW1lOl8saXY6ZCxhZGRpdGlvbmFsRGF0YTpuZXcgVWludDhBcnJheShlLmRhdGEsMCxvLmJ5dGVMZW5ndGgpfSxuLG5ldyBVaW50OEFycmF5KGUuZGF0YSx0aGlzLmdldFVuZW5jcnlwdGVkQnl0ZXMoZSkpKSxiPW5ldyBBcnJheUJ1ZmZlcihvLmJ5dGVMZW5ndGgrZy5ieXRlTGVuZ3RoK2QuYnl0ZUxlbmd0aCtoLmJ5dGVMZW5ndGgpLFQ9bmV3IFVpbnQ4QXJyYXkoYik7cmV0dXJuIFQuc2V0KG8pLFQuc2V0KG5ldyBVaW50OEFycmF5KGcpLG8uYnl0ZUxlbmd0aCksVC5zZXQobmV3IFVpbnQ4QXJyYXkoZCksby5ieXRlTGVuZ3RoK2cuYnl0ZUxlbmd0aCksVC5zZXQoaCxvLmJ5dGVMZW5ndGgrZy5ieXRlTGVuZ3RoK2QuYnl0ZUxlbmd0aCksZS5kYXRhPWIscy5lbnF1ZXVlKGUpfWNhdGNoKGcpe319ZWxzZSB0aGlzLmVtaXQoQ3QuRXJyb3IsbmV3IHVlKCJlbmNyeXB0aW9uIGtleSBtaXNzaW5nIGZvciBlbmNvZGluZyIsbGUuTWlzc2luZ0tleSkpfSl9ZGVjb2RlRnVuY3Rpb24oZSxzKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7aWYoIXRoaXMua2V5cy5pc0VuYWJsZWQoKXx8ZS5kYXRhLmJ5dGVMZW5ndGg9PT0wfHxYaShlLmRhdGEsdGhpcy51bmVuY3J5cHRlZEZyYW1lQnl0ZVRyYWlsZXIpKXJldHVybiBzLmVucXVldWUoZSk7Y29uc3QgaT1uZXcgVWludDhBcnJheShlLmRhdGEpW2UuZGF0YS5ieXRlTGVuZ3RoLTFdO2lmKHRoaXMua2V5cy5nZXRLZXlTZXQoaSkpdHJ5e2NvbnN0IGE9eWllbGQgdGhpcy5kZWNyeXB0RnJhbWUoZSxpKTtpZihhKXJldHVybiBzLmVucXVldWUoYSk7dGhpcy5pc0tleUludmFsaWQ9ITF9Y2F0Y2goYSl7YSBpbnN0YW5jZW9mIHVlJiZhLnJlYXNvbj09PWxlLkludmFsaWRLZXkmJih0aGlzLmlzS2V5SW52YWxpZHx8KHRoaXMuZW1pdChDdC5FcnJvcixuZXcgdWUoYGludmFsaWQga2V5IGZvciBwYXJ0aWNpcGFudCAke3RoaXMucGFydGljaXBhbnRJZH1gLGxlLkludmFsaWRLZXkpKSx0aGlzLmlzS2V5SW52YWxpZD0hMCkpfWVsc2UgdGhpcy5lbWl0KEN0LkVycm9yLG5ldyB1ZShga2V5IG1pc3NpbmcgZm9yIHBhcnRpY2lwYW50ICR7dGhpcy5wYXJ0aWNpcGFudElkfWAsbGUuTWlzc2luZ0tleSkpO3JldHVybiBzLmVucXVldWUoZSl9KX1kZWNyeXB0RnJhbWUoYSxkKXtyZXR1cm4gdyh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooZSxzLG49dm9pZCAwLGk9e3JhdGNoZXRDb3VudDowfSl7dmFyIGg7Y29uc3Qgbz10aGlzLmtleXMuZ2V0S2V5U2V0KHMpO3RyeXtjb25zdCBnPW5ldyBVaW50OEFycmF5KGUuZGF0YSwwLHRoaXMuZ2V0VW5lbmNyeXB0ZWRCeXRlcyhlKSksYj1uZXcgVWludDhBcnJheShlLmRhdGEsZS5kYXRhLmJ5dGVMZW5ndGgtMiwyKSxUPWJbMF0sVj1uZXcgVWludDhBcnJheShlLmRhdGEsZS5kYXRhLmJ5dGVMZW5ndGgtVC1iLmJ5dGVMZW5ndGgsVCksVT1nLmJ5dGVMZW5ndGgscT1lLmRhdGEuYnl0ZUxlbmd0aC0oZy5ieXRlTGVuZ3RoK1QrYi5ieXRlTGVuZ3RoKSwkPXlpZWxkIGNyeXB0by5zdWJ0bGUuZGVjcnlwdCh7bmFtZTpfLGl2OlYsYWRkaXRpb25hbERhdGE6bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsZy5ieXRlTGVuZ3RoKX0sKGg9aS5lbmNyeXB0aW9uS2V5KSE9bnVsbD9oOm8uZW5jcnlwdGlvbktleSxuZXcgVWludDhBcnJheShlLmRhdGEsVSxxKSksaWU9bmV3IEFycmF5QnVmZmVyKGcuYnl0ZUxlbmd0aCskLmJ5dGVMZW5ndGgpLGFlPW5ldyBVaW50OEFycmF5KGllKTtyZXR1cm4gYWUuc2V0KG5ldyBVaW50OEFycmF5KGUuZGF0YSwwLGcuYnl0ZUxlbmd0aCkpLGFlLnNldChuZXcgVWludDhBcnJheSgkKSxnLmJ5dGVMZW5ndGgpLGUuZGF0YT1pZSxlfWNhdGNoKGcpe2lmKHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRXaW5kb3dTaXplPjApe2lmKGkucmF0Y2hldENvdW50PHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRXaW5kb3dTaXplKXtsZXQgYjtpZihvPT09dGhpcy5rZXlzLmdldEtleVNldChzKSl7Y29uc3QgVj15aWVsZCB0aGlzLmtleXMucmF0Y2hldEtleShzLCExKTtiPXlpZWxkIHFyKFYsdGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFNhbHQpfWNvbnN0IFQ9eWllbGQgdGhpcy5kZWNyeXB0RnJhbWUoZSxzLG58fG8se3JhdGNoZXRDb3VudDppLnJhdGNoZXRDb3VudCsxLGVuY3J5cHRpb25LZXk6Yj09bnVsbD92b2lkIDA6Yi5lbmNyeXB0aW9uS2V5fSk7cmV0dXJuIFQmJmImJih0aGlzLmtleXMuc2V0S2V5U2V0KGIscywhMCksdGhpcy5rZXlzLnNldEN1cnJlbnRLZXlJbmRleChzKSksVH1uJiZ0aGlzLmtleXMuc2V0S2V5RnJvbU1hdGVyaWFsKG4ubWF0ZXJpYWwscyl9ZWxzZSB0aHJvdyBuZXcgdWUoIkRlY3J5cHRpb24gZmFpbGVkLCBtb3N0IGxpa2VseSBiZWNhdXNlIG9mIGFuIGludmFsaWQga2V5IixsZS5JbnZhbGlkS2V5KX19KX1tYWtlSVYoZSxzKXt2YXIgZDtjb25zdCBuPW5ldyBBcnJheUJ1ZmZlcihvZSksaT1uZXcgRGF0YVZpZXcobik7dGhpcy5zZW5kQ291bnRzLmhhcyhlKXx8dGhpcy5zZW5kQ291bnRzLnNldChlLE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSo2NTUzNSkpO2NvbnN0IGE9KGQ9dGhpcy5zZW5kQ291bnRzLmdldChlKSkhPW51bGw/ZDowO3JldHVybiBpLnNldFVpbnQzMigwLGUpLGkuc2V0VWludDMyKDQscyksaS5zZXRVaW50MzIoOCxzLWElNjU1MzUpLHRoaXMuc2VuZENvdW50cy5zZXQoZSxhKzEpLG59Z2V0VW5lbmNyeXB0ZWRCeXRlcyhlKXt2YXIgcztpZihxaShlKSl7Y29uc3Qgbj0ocz10aGlzLmdldFZpZGVvQ29kZWMoZSkpIT1udWxsP3M6dGhpcy52aWRlb0NvZGVjO2lmKG49PT0iYXYxInx8bj09PSJ2cDkiKXRocm93IG5ldyBFcnJvcihgJHtufSBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgZW5kIHRvIGVuZCBlbmNyeXB0aW9uYCk7cmV0dXJuIE1bZS50eXBlXX1yZXR1cm4gTS5hdWRpb31nZXRWaWRlb0NvZGVjKGUpe2lmKHRoaXMucnRwTWFwLnNpemU9PT0wKXJldHVybjtjb25zdHtwYXlsb2FkVHlwZTpzfT1lLmdldE1ldGFkYXRhKCk7cmV0dXJuIHM/dGhpcy5ydHBNYXAuZ2V0KHMpOnZvaWQgMH19ZnVuY3Rpb24gWGkocix0KXtjb25zdCBlPW5ldyBVaW50OEFycmF5KHIuc2xpY2Uoci5ieXRlTGVuZ3RoLXQuYnl0ZUxlbmd0aCkpO3JldHVybiB0LmV2ZXJ5KChzLG4pPT5zPT09ZVtuXSl9Y2xhc3MgUXIgZXh0ZW5kcyAkcntjb25zdHJ1Y3RvcihlLHMsbil7c3VwZXIodm9pZCAwKTt1KHRoaXMsImN1cnJlbnRLZXlJbmRleCIpO3UodGhpcywiY3J5cHRvS2V5UmluZyIpO3UodGhpcywiZW5hYmxlZCIpO3UodGhpcywia2V5UHJvdmlkZXJPcHRpb25zIik7dSh0aGlzLCJyYXRjaGV0UHJvbWlzZU1hcCIpO3UodGhpcywicGFydGljaXBhbnRJZCIpO3RoaXMuY3VycmVudEtleUluZGV4PTAsdGhpcy5jcnlwdG9LZXlSaW5nPW5ldyBBcnJheSgxNiksdGhpcy5lbmFibGVkPXMsdGhpcy5rZXlQcm92aWRlck9wdGlvbnM9bix0aGlzLnJhdGNoZXRQcm9taXNlTWFwPW5ldyBNYXAsdGhpcy5wYXJ0aWNpcGFudElkPWV9c2V0RW5hYmxlZChlKXt0aGlzLmVuYWJsZWQ9ZX1yYXRjaGV0S2V5KGUscz0hMCl7Y29uc3Qgbj1lIT1udWxsP2U6dGhpcy5nZXRDdXJyZW50S2V5SW5kZXgoKSxpPW4sYT10aGlzLnJhdGNoZXRQcm9taXNlTWFwLmdldChpKTtpZih0eXBlb2YgYSE9InVuZGVmaW5lZCIpcmV0dXJuIGE7Y29uc3QgZD1uZXcgUHJvbWlzZSgobyxoKT0+dyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e2NvbnN0IGc9dGhpcy5nZXRLZXlTZXQoaSkubWF0ZXJpYWwsYj15aWVsZCBZaSh5aWVsZCBRaShnLHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRTYWx0KSxnLmFsZ29yaXRobS5uYW1lLCJkZXJpdmUiKTtzJiZ0aGlzLnNldEtleUZyb21NYXRlcmlhbChiLGksITApLHRoaXMuZW1pdCgia2V5UmF0Y2hldGVkIixiLG4sdGhpcy5wYXJ0aWNpcGFudElkKSxvKGIpfWNhdGNoKGcpe2goZyl9ZmluYWxseXt0aGlzLnJhdGNoZXRQcm9taXNlTWFwLmRlbGV0ZShpKX19KSk7cmV0dXJuIHRoaXMucmF0Y2hldFByb21pc2VNYXAuc2V0KGksZCksZH1zZXRLZXlGcm9tTWF0ZXJpYWwoZSxzPTAsbj0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3M+PTAmJih0aGlzLmN1cnJlbnRLZXlJbmRleD1zJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGgpO2NvbnN0IGk9eWllbGQgcXIoZSx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucy5yYXRjaGV0U2FsdCk7dGhpcy5zZXRLZXlTZXQoaSx0aGlzLmN1cnJlbnRLZXlJbmRleCxuKX0pfXNldEtleVNldChlLHMsbj0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMuY3J5cHRvS2V5UmluZ1tzJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGhdPWUsbiYmdGhpcy5lbWl0KCJrZXlSYXRjaGV0ZWQiLGUubWF0ZXJpYWwscyx0aGlzLnBhcnRpY2lwYW50SWQpfSl9c2V0Q3VycmVudEtleUluZGV4KGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLmN1cnJlbnRLZXlJbmRleD1lJXRoaXMuY3J5cHRvS2V5UmluZy5sZW5ndGh9KX1pc0VuYWJsZWQoKXtyZXR1cm4gdGhpcy5lbmFibGVkfWdldEN1cnJlbnRLZXlJbmRleCgpe3JldHVybiB0aGlzLmN1cnJlbnRLZXlJbmRleH1nZXRLZXlTZXQoZSl7cmV0dXJuIHRoaXMuY3J5cHRvS2V5UmluZ1tlIT1udWxsP2U6dGhpcy5jdXJyZW50S2V5SW5kZXhdfX1jb25zdCBJdD1bXSx3dD1uZXcgTWFwLGt0PVtdO2xldCBuZSxNdD0hMSxKcj0hMSxfdCxwZT1wdDtmdW5jdGlvbiBoZShyLHQpe3Bvc3RNZXNzYWdlKHtraW5kOiJsb2ciLGRhdGE6e2xldmVsOnIsc3RyOnR9fSl9ZnVuY3Rpb24gWmkocix0KXtwb3N0TWVzc2FnZSh7a2luZDoicmF0Y2hldEtleSIsZGF0YTp7a2V5SW5kZXg6dCxtYXRlcmlhbDpyfX0pfWZ1bmN0aW9uIFJlKHIpe2lmKCFyKXJldHVybiBuZTtsZXQgdD13dC5nZXQocik7cmV0dXJuIHR8fCh0PW5ldyBRcihyLCEwLHBlKSxfdCYmdC5zZXRLZXlGcm9tTWF0ZXJpYWwoX3QpLHd0LnNldChyLHQpKSx0fWZ1bmN0aW9uIGVhKHIsdCl7dD9SZSh0KS5zZXRFbmFibGVkKHIpOihNdD1yLG5lLnNldEVuYWJsZWQocikpfWZ1bmN0aW9uIFhyKHIpe3Iub24oImNyeXB0b3JFcnJvciIsdD0+e2NvbnN0IGU9e2tpbmQ6ImVycm9yIixkYXRhOntlcnJvcjpuZXcgRXJyb3IoYCR7bGVbdC5yZWFzb25dfTogJHt0Lm1lc3NhZ2V9YCl9fTtwb3N0TWVzc2FnZShlKX0pfWZ1bmN0aW9uIEF0KHIsdCl7bGV0IGU9SXQuZmluZChzPT5zLmdldFRyYWNrSWQoKT09PXQpO2lmKGUpciE9PWUuZ2V0UGFydGljaXBhbnRJZCgpJiZlLnNldFBhcnRpY2lwYW50KHIsUmUocikpO2Vsc2V7aWYoaGUoImluZm8iLGBjcmVhdGluZyBuZXcgY3J5cHRvciBmb3IgJHtyfWApLCFwZSl0aHJvdyBFcnJvcigiTWlzc2luZyBrZXlQcm92aWRlciBvcHRpb25zIik7ZT1uZXcgWXIoe3BhcnRpY2lwYW50SWQ6cixrZXlzOlJlKHIpLGtleVByb3ZpZGVyT3B0aW9uczpwZX0pLFhyKGUpLEl0LnB1c2goZSl9cmV0dXJuIGV9ZnVuY3Rpb24gWnIocil7bGV0IHQ9a3QuZmluZChlPT5lLmdldFRyYWNrSWQoKT09PXIpO2lmKCF0KXtpZighcGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiTWlzc2luZyBrZXlQcm92aWRlciBvcHRpb25zIik7dD1uZXcgWXIoe2tleXM6bmUscGFydGljaXBhbnRJZDoicHVibGlzaGVyIixrZXlQcm92aWRlck9wdGlvbnM6cGV9KSxYcih0KSxrdC5wdXNoKHQpfXJldHVybiB0fWZ1bmN0aW9uIHRhKHIpe3ZhciB0Oyh0PUl0LmZpbmQoZT0+ZS5nZXRUcmFja0lkKCk9PT1yKSk9PW51bGx8fHQudW5zZXRQYXJ0aWNpcGFudCgpfWZ1bmN0aW9uIHJhKHIsdCl7aGUoImRlYnVnIiwic2V0dGluZyBzaGFyZWQga2V5IiksX3Q9cixuZT09bnVsbHx8bmUuc2V0S2V5RnJvbU1hdGVyaWFsKHIsdCk7Zm9yKGNvbnN0WyxlXW9mIHd0KWUuc2V0S2V5RnJvbU1hdGVyaWFsKHIsdCl9b25tZXNzYWdlPXI9Pntjb25zdHtraW5kOnQsZGF0YTplfT1yLmRhdGE7c3dpdGNoKHQpe2Nhc2UiaW5pdCI6aGUoImluZm8iLCJ3b3JrZXIgaW5pdGlhbGl6ZWQiKSxwZT1lLmtleVByb3ZpZGVyT3B0aW9ucyxKcj0hIWUua2V5UHJvdmlkZXJPcHRpb25zLnNoYXJlZEtleTtjb25zdCBzPXtraW5kOiJlbmFibGUiLGRhdGE6e2VuYWJsZWQ6TXR9fTtuZT1uZXcgUXIodm9pZCAwLE10LHBlKSxuZS5vbigia2V5UmF0Y2hldGVkIixaaSkscG9zdE1lc3NhZ2Uocyk7YnJlYWs7Y2FzZSJlbmFibGUiOmVhKGUuZW5hYmxlZCxlLnBhcnRpY2lwYW50SWQpLGhlKCJpbmZvIiwidXBkYXRlZCBlMmVlIGVuYWJsZWQgc3RhdHVzIikscG9zdE1lc3NhZ2Uoci5kYXRhKTticmVhaztjYXNlImRlY29kZSI6QXQoZS5wYXJ0aWNpcGFudElkLGUudHJhY2tJZCkuc2V0dXBUcmFuc2Zvcm0odCxlLnJlYWRhYmxlU3RyZWFtLGUud3JpdGFibGVTdHJlYW0sZS50cmFja0lkLGUuY29kZWMpO2JyZWFrO2Nhc2UiZW5jb2RlIjpacihlLnRyYWNrSWQpLnNldHVwVHJhbnNmb3JtKHQsZS5yZWFkYWJsZVN0cmVhbSxlLndyaXRhYmxlU3RyZWFtLGUudHJhY2tJZCxlLmNvZGVjKTticmVhaztjYXNlInNldEtleSI6SnI/KGhlKCJkZWJ1ZyIsInNldCBzaGFyZWQga2V5IikscmEoZS5rZXksZS5rZXlJbmRleCkpOmUucGFydGljaXBhbnRJZD9SZShlLnBhcnRpY2lwYW50SWQpLnNldEtleUZyb21NYXRlcmlhbChlLmtleSxlLmtleUluZGV4KTpoZSgiZXJyb3IiLCJubyBwYXJ0aWNpcGFudCBJZCB3YXMgcHJvdmlkZWQgYW5kIHNoYXJlZCBrZXkgdXNhZ2UgaXMgZGlzYWJsZWQiKTticmVhaztjYXNlInJlbW92ZVRyYW5zZm9ybSI6dGEoZS50cmFja0lkKTticmVhaztjYXNlInVwZGF0ZUNvZGVjIjpBdChlLnBhcnRpY2lwYW50SWQsZS50cmFja0lkKS5zZXRWaWRlb0NvZGVjKGUuY29kZWMpO2JyZWFrO2Nhc2Uic2V0UlRQTWFwIjprdC5mb3JFYWNoKGE9PnthLnNldFJ0cE1hcChlLm1hcCl9KTticmVhaztjYXNlInJhdGNoZXRSZXF1ZXN0IjpSZShlLnBhcnRpY2lwYW50SWQpLnJhdGNoZXRLZXkoZS5rZXlJbmRleCk7YnJlYWt9fSxzZWxmLlJUQ1RyYW5zZm9ybUV2ZW50JiYoaGUoImRlYnVnIiwic2V0dXAgdHJhbnNmb3JtIGV2ZW50Iiksc2VsZi5vbnJ0Y3RyYW5zZm9ybT1yPT57Y29uc3R7dHJhbnNmb3JtZXI6dH09cjt0LmhhbmRsZWQ9ITA7Y29uc3R7a2luZDplLHBhcnRpY2lwYW50SWQ6cyx0cmFja0lkOm4sY29kZWM6aX09dC5vcHRpb25zOyhlPT09ImVuY29kZSI/WnIobik6QXQocyxuKSkuc2V0dXBUcmFuc2Zvcm0oZSx0LnJlYWRhYmxlLHQud3JpdGFibGUsbixpKX0pfSkoKTsK",g=typeof window!="undefined"&&window.Blob&&new Blob([atob(ll)],{type:"text/javascript;charset=utf-8"});function Hl(){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,k,U,dl,I,cl,a,T,v,Sl,H,bl,S,Wl,o,Vl,t,Xl;class Zl extends ${constructor(l){super(void 0);p(this,N);p(this,U);p(this,I);p(this,a);p(this,v);p(this,H);p(this,S);p(this,o);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(W=>{Y(this,a,T).call(this,W)});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,k,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 Hl,this.encryptionEnabled=!1}get isEnabled(){return this.encryptionEnabled}init(l,c){this.logger=l,this.peerSessionStore=c,this.setup()}setup(){if(!kl())throw new Error("tried to setup end-to-end encryption on an unsupported browser");this.logger.info("setting up e2ee"),Y(this,U,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=w(this,k),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")})},k=new WeakMap,U=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 V;const W={kind:"removeTransform",data:{participantId:c,trackId:b}};(V=this.worker)==null||V.postMessage(W)}),this.peerSessionStore.on(i.E2EE_ACTIVE_CONSUMER,({track:c,rtpReceiver:b,peerId:W})=>Y(this,H,bl).call(this,c,b,W)),this.peerSessionStore.on(i.E2EE_ACTIVE_PRODUCER,({track:c,rtpSender:b,appData:W})=>Y(this,S,Wl).call(this,c,b,W.peerId)),l.on("setKey",c=>Y(this,a,T).call(this,c)).on("ratchetRequest",(c,b)=>Y(this,I,cl).call(this,c,b))},I=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 W={kind:"setKey",data:{participantId:c,key:l,keyIndex:b}};this.worker.postMessage(W)},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)},H=new WeakSet,bl=function(l,c,b){Y(this,o,Vl).call(this,c,l.id,b)},S=new WeakSet,Wl=function(l,c,b){Y(this,t,Xl).call(this,c,l.id,b)},o=new WeakSet,Vl=function(l,c,b,W){return J(this,null,function*(){if(!this.worker)return;const V=l;if(x()){const X={kind:"decode",participantId:b,trackId:c,codec:W};V.transform=new RTCRtpScriptTransform(this.worker,X)}else{if(F in V&&W){const y={kind:"updateCodec",data:{trackId:c,codec:W,participantId:b}};this.worker.postMessage(y);return}let X=V.writableStream,m=V.readableStream;if(!X||!m){const y=V.createEncodedStreams();V.writableStream=y.writable,X=y.writable,V.readableStream=y.readable,m=y.readable}const u={kind:"decode",data:{readableStream:m,writableStream:X,trackId:c,codec:W,participantId:b}};this.worker.postMessage(u,[m,X])}V[F]=!0})},t=new WeakSet,Xl=function(l,c,b,W){if(F in l||!this.worker)return;const V=l;if(x()){this.logger.warn("initialize script transform");const X={kind:"encode",participantId:b,trackId:c,codec:W};V.transform=new RTCRtpScriptTransform(this.worker,X)}else{this.logger.warn("initialize encoded streams");const X=V.createEncodedStreams(),m={kind:"encode",data:{readableStream:X.readable,writableStream:X.writable,codec:W,trackId:c,participantId:b||"publisher"}};this.worker.postMessage(m,[X.readable,X.writable])}V[F]=!0},R(Zl,"SharedKeyProvider",Il);module.exports=Zl;
1
+ "use strict";var Gl=Object.defineProperty,ml=Object.defineProperties;var Rl=Object.getOwnPropertyDescriptors;var e=Object.getOwnPropertySymbols;var pl=Object.prototype.hasOwnProperty,Yl=Object.prototype.propertyIsEnumerable;var z=(Z,d,l)=>d in Z?Gl(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(e)for(var l of e(d))Yl.call(d,l)&&z(Z,l,d[l]);return Z},Q=(Z,d)=>ml(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 w=(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 V=m=>{try{X(l.next(m))}catch(u){b(u)}},W=m=>{try{X(l.throw(m))}catch(u){b(u)}},X=m=>m.done?c(m.value):Promise.resolve(m.value).then(V,W);X((l=l.apply(Z,d)).next())});var L={},ul={get exports(){return L},set exports(Z){L=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)},s;h&&typeof h.ownKeys=="function"?s=h.ownKeys:Object.getOwnPropertySymbols?s=function(d){return Object.getOwnPropertyNames(d).concat(Object.getOwnPropertySymbols(d))}:s=function(d){return Object.getOwnPropertyNames(d)};function yl(Z){console&&console.warn&&console.warn(Z)}var P=Number.isNaN||function(d){return d!==d};function G(){G.init.call(this)}ul.exports=G;L.once=Nl;G.EventEmitter=G;G.prototype._events=void 0;G.prototype._eventsCount=0;G.prototype._maxListeners=void 0;var j=10;function K(Z){if(typeof Z!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof Z)}Object.defineProperty(G,"defaultMaxListeners",{enumerable:!0,get:function(){return j},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+".");j=Z}});G.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};G.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 O(Z){return Z._maxListeners===void 0?G.defaultMaxListeners:Z._maxListeners}G.prototype.getMaxListeners=function(){return O(this)};G.prototype.emit=function(d){for(var l=[],c=1;c<arguments.length;c++)l.push(arguments[c]);var b=d==="error",V=this._events;if(V!==void 0)b=b&&V.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 X=new Error("Unhandled error."+(W?" ("+W.message+")":""));throw X.context=W,X}var m=V[d];if(m===void 0)return!1;if(typeof m=="function")M(m,this,l);else for(var u=m.length,y=_(m,u),c=0;c<u;++c)M(y[c],this,l);return!0};function f(Z,d,l,c){var b,V,W;if(K(l),V=Z._events,V===void 0?(V=Z._events=Object.create(null),Z._eventsCount=0):(V.newListener!==void 0&&(Z.emit("newListener",d,l.listener?l.listener:l),V=Z._events),W=V[d]),W===void 0)W=V[d]=l,++Z._eventsCount;else if(typeof W=="function"?W=V[d]=c?[l,W]:[W,l]:c?W.unshift(l):W.push(l),b=O(Z),b>0&&W.length>b&&!W.warned){W.warned=!0;var X=new Error("Possible EventEmitter memory leak detected. "+W.length+" "+String(d)+" listeners added. Use emitter.setMaxListeners() to increase limit");X.name="MaxListenersExceededWarning",X.emitter=Z,X.type=d,X.count=W.length,yl(X)}return Z}G.prototype.addListener=function(d,l){return f(this,d,l,!1)};G.prototype.on=G.prototype.addListener;G.prototype.prependListener=function(d,l){return f(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 r(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}G.prototype.once=function(d,l){return K(l),this.on(d,r(this,d,l)),this};G.prototype.prependOnceListener=function(d,l){return K(l),this.prependListener(d,r(this,d,l)),this};G.prototype.removeListener=function(d,l){var c,b,V,W,X;if(K(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(V=-1,W=c.length-1;W>=0;W--)if(c[W]===l||c[W].listener===l){X=c[W].listener,V=W;break}if(V<0)return this;V===0?c.shift():Jl(c,V),c.length===1&&(b[d]=c[0]),b.removeListener!==void 0&&this.emit("removeListener",d,X||l)}return this};G.prototype.off=G.prototype.removeListener;G.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 V=Object.keys(c),W;for(b=0;b<V.length;++b)W=V[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 D(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)}G.prototype.listeners=function(d){return D(this,d,!0)};G.prototype.rawListeners=function(d){return D(this,d,!1)};G.listenerCount=function(Z,d){return typeof Z.listenerCount=="function"?Z.listenerCount(d):A.call(Z,d)};G.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}G.prototype.eventNames=function(){return this._eventsCount>0?s(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,V),c(W)}function V(){typeof Z.removeListener=="function"&&Z.removeListener("error",b),l([].slice.call(arguments))}q(Z,d,V,{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(V){c.once&&Z.removeEventListener(d,b),l(V)});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 V=this.listenerCount(l);V>25&&V%25===0&&((b=this.logger)==null||b.warn("CustomEventEmitter::maxListenersExceeded",{eventListener:{eventName:l.toString(),listenerCount:this.listenerCount(l)}}))}catch(V){}return super.on(l,c)}addListener(l,c){var b;try{const V=this.listenerCount(l);V>25&&V%25===0&&((b=this.logger)==null||b.warn("CustomEventEmitter::maxListenersExceeded",{eventListener:{eventName:l.toString(),listenerCount:this.listenerCount(l)}}))}catch(V){}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 sl(){return typeof window.RTCRtpSender!="undefined"&&typeof window.RTCRtpSender.prototype.createEncodedStreams!="undefined"}function Ll(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 kl(){return sl()||x()}class Ul 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 V={key:l,participantId:c,keyIndex:b};this.keyInfoMap.set(`${c!=null?c:"shared"}-${b!=null?b:0}`,V),this.emit("setKey",V)}getKeys(){return Array.from(this.keyInfoMap.values())}getOptions(){return this.options}ratchetKey(l,c){this.emit("ratchetRequest",l,c)}}class Il extends Ul{constructor(l={}){const c=Q(n({},l),{sharedKey:!0});super(c);R(this,"ratchetInterval")}setKey(l){return J(this,null,function*(){const c=yield Ll(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="dmFyIHNhPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxuYT1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgaWE9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIGVzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsYWE9T2JqZWN0LmdldFByb3RvdHlwZU9mLG9hPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksY2E9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxkYT1SZWZsZWN0LmdldDt2YXIgRHQ9KF8sQSxNKT0+QSBpbiBfP3NhKF8sQSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6TX0pOl9bQV09TSxHPShfLEEpPT57Zm9yKHZhciBNIGluIEF8fChBPXt9KSlvYS5jYWxsKEEsTSkmJkR0KF8sTSxBW01dKTtpZihlcylmb3IodmFyIE0gb2YgZXMoQSkpY2EuY2FsbChBLE0pJiZEdChfLE0sQVtNXSk7cmV0dXJuIF99LFFlPShfLEEpPT5uYShfLGlhKEEpKTt2YXIgdT0oXyxBLE0pPT4oRHQoXyx0eXBlb2YgQSE9InN5bWJvbCI/QSsiIjpBLE0pLE0pLHRzPShfLEEsTSk9PntpZighQS5oYXMoXykpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIitNKX07dmFyIFE9KF8sQSxNKT0+KHRzKF8sQSwicmVhZCBmcm9tIHByaXZhdGUgZmllbGQiKSxNP00uY2FsbChfKTpBLmdldChfKSksbHQ9KF8sQSxNKT0+e2lmKEEuaGFzKF8pKXRocm93IFR5cGVFcnJvcigiQ2Fubm90IGFkZCB0aGUgc2FtZSBwcml2YXRlIG1lbWJlciBtb3JlIHRoYW4gb25jZSIpO0EgaW5zdGFuY2VvZiBXZWFrU2V0P0EuYWRkKF8pOkEuc2V0KF8sTSl9LGZlPShfLEEsTSxvZSk9Pih0cyhfLEEsIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxvZT9vZS5jYWxsKF8sTSk6QS5zZXQoXyxNKSxNKTt2YXIgcnM9KF8sQSxNKT0+ZGEoYWEoXyksTSxBKTt2YXIgdz0oXyxBLE0pPT5uZXcgUHJvbWlzZSgob2UsdXQpPT57dmFyIHB0PXo9Pnt0cnl7Z2UoTS5uZXh0KHopKX1jYXRjaChtZSl7dXQobWUpfX0sVz16PT57dHJ5e2dlKE0udGhyb3coeikpfWNhdGNoKG1lKXt1dChtZSl9fSxnZT16PT56LmRvbmU/b2Uoei52YWx1ZSk6UHJvbWlzZS5yZXNvbHZlKHoudmFsdWUpLnRoZW4ocHQsVyk7Z2UoKE09TS5hcHBseShfLEEpKS5uZXh0KCkpfSk7KGZ1bmN0aW9uKCl7dmFyIFBlLFosZWU7InVzZSBzdHJpY3QiO2NvbnN0IF89IkFFUy1HQ00iLE09e2tleToxMCxkZWx0YTozLGF1ZGlvOjEsZW1wdHk6MH0sb2U9MTIscHQ9e3NoYXJlZEtleTohMSxyYXRjaGV0U2FsdDoiUmVhbHRpbWVLaXRGcmFtZUVuY3J5cHRpb25LZXkiLHJhdGNoZXRXaW5kb3dTaXplOjh9O3ZhciBXPXt9LGdlPXtnZXQgZXhwb3J0cygpe3JldHVybiBXfSxzZXQgZXhwb3J0cyhyKXtXPXJ9fSx6PXR5cGVvZiBSZWZsZWN0PT0ib2JqZWN0Ij9SZWZsZWN0Om51bGwsbWU9eiYmdHlwZW9mIHouYXBwbHk9PSJmdW5jdGlvbiI/ei5hcHBseTpmdW5jdGlvbih0LGUscyl7cmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHQsZSxzKX0sSmU7eiYmdHlwZW9mIHoub3duS2V5cz09ImZ1bmN0aW9uIj9KZT16Lm93bktleXM6T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz9KZT1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCkpfTpKZT1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCl9O2Z1bmN0aW9uIHNzKHIpe2NvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKHIpfXZhciBOdD1OdW1iZXIuaXNOYU58fGZ1bmN0aW9uKHQpe3JldHVybiB0IT09dH07ZnVuY3Rpb24gTCgpe0wuaW5pdC5jYWxsKHRoaXMpfWdlLmV4cG9ydHM9TCxXLm9uY2U9b3MsTC5FdmVudEVtaXR0ZXI9TCxMLnByb3RvdHlwZS5fZXZlbnRzPXZvaWQgMCxMLnByb3RvdHlwZS5fZXZlbnRzQ291bnQ9MCxMLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzPXZvaWQgMDt2YXIgVnQ9MTA7ZnVuY3Rpb24gWGUocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShMLCJkZWZhdWx0TWF4TGlzdGVuZXJzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVnR9LHNldDpmdW5jdGlvbihyKXtpZih0eXBlb2YgciE9Im51bWJlciJ8fHI8MHx8TnQocikpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAiZGVmYXVsdE1heExpc3RlbmVycyIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJytyKyIuIik7VnQ9cn19KSxMLmluaXQ9ZnVuY3Rpb24oKXsodGhpcy5fZXZlbnRzPT09dm9pZCAwfHx0aGlzLl9ldmVudHM9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykmJih0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKSx0aGlzLl9tYXhMaXN0ZW5lcnM9dGhpcy5fbWF4TGlzdGVuZXJzfHx2b2lkIDB9LEwucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MHx8TnQodCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAibiIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyt0KyIuIik7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz10LHRoaXN9O2Z1bmN0aW9uIEJ0KHIpe3JldHVybiByLl9tYXhMaXN0ZW5lcnM9PT12b2lkIDA/TC5kZWZhdWx0TWF4TGlzdGVuZXJzOnIuX21heExpc3RlbmVyc31MLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oKXtyZXR1cm4gQnQodGhpcyl9LEwucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLHM9MTtzPGFyZ3VtZW50cy5sZW5ndGg7cysrKWUucHVzaChhcmd1bWVudHNbc10pO3ZhciBuPXQ9PT0iZXJyb3IiLGk9dGhpcy5fZXZlbnRzO2lmKGkhPT12b2lkIDApbj1uJiZpLmVycm9yPT09dm9pZCAwO2Vsc2UgaWYoIW4pcmV0dXJuITE7aWYobil7dmFyIGE7aWYoZS5sZW5ndGg+MCYmKGE9ZVswXSksYSBpbnN0YW5jZW9mIEVycm9yKXRocm93IGE7dmFyIGQ9bmV3IEVycm9yKCJVbmhhbmRsZWQgZXJyb3IuIisoYT8iICgiK2EubWVzc2FnZSsiKSI6IiIpKTt0aHJvdyBkLmNvbnRleHQ9YSxkfXZhciBvPWlbdF07aWYobz09PXZvaWQgMClyZXR1cm4hMTtpZih0eXBlb2Ygbz09ImZ1bmN0aW9uIiltZShvLHRoaXMsZSk7ZWxzZSBmb3IodmFyIGg9by5sZW5ndGgsZz1IdChvLGgpLHM9MDtzPGg7KytzKW1lKGdbc10sdGhpcyxlKTtyZXR1cm4hMH07ZnVuY3Rpb24gRnQocix0LGUscyl7dmFyIG4saSxhO2lmKFhlKGUpLGk9ci5fZXZlbnRzLGk9PT12b2lkIDA/KGk9ci5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksci5fZXZlbnRzQ291bnQ9MCk6KGkubmV3TGlzdGVuZXIhPT12b2lkIDAmJihyLmVtaXQoIm5ld0xpc3RlbmVyIix0LGUubGlzdGVuZXI/ZS5saXN0ZW5lcjplKSxpPXIuX2V2ZW50cyksYT1pW3RdKSxhPT09dm9pZCAwKWE9aVt0XT1lLCsrci5fZXZlbnRzQ291bnQ7ZWxzZSBpZih0eXBlb2YgYT09ImZ1bmN0aW9uIj9hPWlbdF09cz9bZSxhXTpbYSxlXTpzP2EudW5zaGlmdChlKTphLnB1c2goZSksbj1CdChyKSxuPjAmJmEubGVuZ3RoPm4mJiFhLndhcm5lZCl7YS53YXJuZWQ9ITA7dmFyIGQ9bmV3IEVycm9yKCJQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICIrYS5sZW5ndGgrIiAiK1N0cmluZyh0KSsiIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQiKTtkLm5hbWU9Ik1heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyIsZC5lbWl0dGVyPXIsZC50eXBlPXQsZC5jb3VudD1hLmxlbmd0aCxzcyhkKX1yZXR1cm4gcn1MLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiBGdCh0aGlzLHQsZSwhMSl9LEwucHJvdG90eXBlLm9uPUwucHJvdG90eXBlLmFkZExpc3RlbmVyLEwucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiBGdCh0aGlzLHQsZSwhMCl9O2Z1bmN0aW9uIG5zKCl7aWYoIXRoaXMuZmlyZWQpcmV0dXJuIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSx0aGlzLndyYXBGbiksdGhpcy5maXJlZD0hMCxhcmd1bWVudHMubGVuZ3RoPT09MD90aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpOnRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsYXJndW1lbnRzKX1mdW5jdGlvbiB4dChyLHQsZSl7dmFyIHM9e2ZpcmVkOiExLHdyYXBGbjp2b2lkIDAsdGFyZ2V0OnIsdHlwZTp0LGxpc3RlbmVyOmV9LG49bnMuYmluZChzKTtyZXR1cm4gbi5saXN0ZW5lcj1lLHMud3JhcEZuPW4sbn1MLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFhlKGUpLHRoaXMub24odCx4dCh0aGlzLHQsZSkpLHRoaXN9LEwucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gWGUoZSksdGhpcy5wcmVwZW5kTGlzdGVuZXIodCx4dCh0aGlzLHQsZSkpLHRoaXN9LEwucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7dmFyIHMsbixpLGEsZDtpZihYZShlKSxuPXRoaXMuX2V2ZW50cyxuPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKHM9blt0XSxzPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKHM9PT1lfHxzLmxpc3RlbmVyPT09ZSktLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTooZGVsZXRlIG5bdF0sbi5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsdCxzLmxpc3RlbmVyfHxlKSk7ZWxzZSBpZih0eXBlb2YgcyE9ImZ1bmN0aW9uIil7Zm9yKGk9LTEsYT1zLmxlbmd0aC0xO2E+PTA7YS0tKWlmKHNbYV09PT1lfHxzW2FdLmxpc3RlbmVyPT09ZSl7ZD1zW2FdLmxpc3RlbmVyLGk9YTticmVha31pZihpPDApcmV0dXJuIHRoaXM7aT09PTA/cy5zaGlmdCgpOmlzKHMsaSkscy5sZW5ndGg9PT0xJiYoblt0XT1zWzBdKSxuLnJlbW92ZUxpc3RlbmVyIT09dm9pZCAwJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIix0LGR8fGUpfXJldHVybiB0aGlzfSxMLnByb3RvdHlwZS5vZmY9TC5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIsTC5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlLHMsbjtpZihzPXRoaXMuX2V2ZW50cyxzPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKHMucmVtb3ZlTGlzdGVuZXI9PT12b2lkIDApcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0wPyh0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKTpzW3RdIT09dm9pZCAwJiYoLS10aGlzLl9ldmVudHNDb3VudD09PTA/dGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCk6ZGVsZXRlIHNbdF0pLHRoaXM7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApe3ZhciBpPU9iamVjdC5rZXlzKHMpLGE7Zm9yKG49MDtuPGkubGVuZ3RoOysrbilhPWlbbl0sYSE9PSJyZW1vdmVMaXN0ZW5lciImJnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGEpO3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygicmVtb3ZlTGlzdGVuZXIiKSx0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wLHRoaXN9aWYoZT1zW3RdLHR5cGVvZiBlPT0iZnVuY3Rpb24iKXRoaXMucmVtb3ZlTGlzdGVuZXIodCxlKTtlbHNlIGlmKGUhPT12b2lkIDApZm9yKG49ZS5sZW5ndGgtMTtuPj0wO24tLSl0aGlzLnJlbW92ZUxpc3RlbmVyKHQsZVtuXSk7cmV0dXJuIHRoaXN9O2Z1bmN0aW9uIGp0KHIsdCxlKXt2YXIgcz1yLl9ldmVudHM7aWYocz09PXZvaWQgMClyZXR1cm5bXTt2YXIgbj1zW3RdO3JldHVybiBuPT09dm9pZCAwP1tdOnR5cGVvZiBuPT0iZnVuY3Rpb24iP2U/W24ubGlzdGVuZXJ8fG5dOltuXTplP2FzKG4pOkh0KG4sbi5sZW5ndGgpfUwucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbih0KXtyZXR1cm4ganQodGhpcyx0LCEwKX0sTC5wcm90b3R5cGUucmF3TGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3JldHVybiBqdCh0aGlzLHQsITEpfSxMLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24ocix0KXtyZXR1cm4gdHlwZW9mIHIubGlzdGVuZXJDb3VudD09ImZ1bmN0aW9uIj9yLmxpc3RlbmVyQ291bnQodCk6VXQuY2FsbChyLHQpfSxMLnByb3RvdHlwZS5saXN0ZW5lckNvdW50PVV0O2Z1bmN0aW9uIFV0KHIpe3ZhciB0PXRoaXMuX2V2ZW50cztpZih0IT09dm9pZCAwKXt2YXIgZT10W3JdO2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iKXJldHVybiAxO2lmKGUhPT12b2lkIDApcmV0dXJuIGUubGVuZ3RofXJldHVybiAwfUwucHJvdG90eXBlLmV2ZW50TmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQ+MD9KZSh0aGlzLl9ldmVudHMpOltdfTtmdW5jdGlvbiBIdChyLHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodCkscz0wO3M8dDsrK3MpZVtzXT1yW3NdO3JldHVybiBlfWZ1bmN0aW9uIGlzKHIsdCl7Zm9yKDt0KzE8ci5sZW5ndGg7dCsrKXJbdF09clt0KzFdO3IucG9wKCl9ZnVuY3Rpb24gYXMocil7Zm9yKHZhciB0PW5ldyBBcnJheShyLmxlbmd0aCksZT0wO2U8dC5sZW5ndGg7KytlKXRbZV09cltlXS5saXN0ZW5lcnx8cltlXTtyZXR1cm4gdH1mdW5jdGlvbiBvcyhyLHQpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHMpe2Z1bmN0aW9uIG4oYSl7ci5yZW1vdmVMaXN0ZW5lcih0LGkpLHMoYSl9ZnVuY3Rpb24gaSgpe3R5cGVvZiByLnJlbW92ZUxpc3RlbmVyPT0iZnVuY3Rpb24iJiZyLnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsbiksZShbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpfUt0KHIsdCxpLHtvbmNlOiEwfSksdCE9PSJlcnJvciImJmNzKHIsbix7b25jZTohMH0pfSl9ZnVuY3Rpb24gY3Mocix0LGUpe3R5cGVvZiByLm9uPT0iZnVuY3Rpb24iJiZLdChyLCJlcnJvciIsdCxlKX1mdW5jdGlvbiBLdChyLHQsZSxzKXtpZih0eXBlb2Ygci5vbj09ImZ1bmN0aW9uIilzLm9uY2U/ci5vbmNlKHQsZSk6ci5vbih0LGUpO2Vsc2UgaWYodHlwZW9mIHIuYWRkRXZlbnRMaXN0ZW5lcj09ImZ1bmN0aW9uIilyLmFkZEV2ZW50TGlzdGVuZXIodCxmdW5jdGlvbiBuKGkpe3Mub25jZSYmci5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiksZShpKX0pO2Vsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJlbWl0dGVyIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRXZlbnRFbWl0dGVyLiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHIpfXZhciBSOyhmdW5jdGlvbihyKXtyW3IuTUFKT1JfRVZFTlQ9MF09Ik1BSk9SX0VWRU5UIixyW3IuTUlOT1JfRVZFTlQ9MV09Ik1JTk9SX0VWRU5UIn0pKFJ8fChSPXt9KSk7dmFyIFM7KGZ1bmN0aW9uKHIpe3IuUFJFQ0FMTF9URVNUX0JFR0lOPSJwcmVjYWxsX2JlZ2luIixyLlBSRUNBTExfVEVTVF9DT01QTEVURT0icHJlY2FsbF9lbmQiLHIuQ0FMTF9KT0lOX0JFR0lOPSJjYWxsX2pvaW4iLHIuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTj0ibmV0X3F1YWxpdHlfdGVzdF9iZWdpbiIsci5ORVRfUVVBTElUWV9URVNUX0VORD0ibmV0X3F1YWxpdHlfdGVzdF9lbmQiLHIuV0VCU09DS0VUX0NPTk5FQ1RFRD0id2Vic29ja2V0X2Nvbm5lY3RlZCIsci5UUkFOU1BPUlRfQ09OTkVDVEVEPSJ0cmFuc3BvcnRfY29ubmVjdGVkIixyLkFVRElPX09OPSJhdWRpb19vbiIsci5BVURJT19PRkY9ImF1ZGlvX29mZiIsci5WSURFT19PTj0idmlkZW9fb24iLHIuVklERU9fT0ZGPSJ2aWRlb19vZmYiLHIuUEFSVElDSVBBTlRfUk9MRT0icGFydGljaXBhbnRfcm9sZSIsci5QSU5HX1NUQVQ9InBpbmdfc3RhdCIsci5ESVNDT05ORUNUPSJkaXNjb25uZWN0IixyLlJFQ09OTkVDVF9BVFRFTVBUPSJyZWNvbm5lY3RfYXR0ZW1wdCIsci5TQ1JFRU5TSEFSRV9TVEFSVF9SRVFVRVNURUQ9InNjcmVlbnNoYXJlX3N0YXJ0X3JlcXVlc3RlZCIsci5TQ1JFRU5TSEFSRV9TVEFSVEVEPSJzY3JlZW5zaGFyZV9zdGFydGVkIixyLlNDUkVFTlNIQVJFX1NUT1BQRUQ9InNjcmVlbnNoYXJlX3N0b3BwZWQiLHIuVEFCX0NIQU5HRT0idGFiX2NoYW5nZSIsci5CUk9XU0VSX0JBQ0tHUk9VTkRFRD0iYnJvd3Nlcl9iYWNrZ3JvdW5kZWQiLHIuQlJPV1NFUl9GT1JFR1JPVU5ERUQ9ImJyb3dzZXJfZm9yZWdyb3VuZGVkIixyLkRPTUlOQU5UX1NQRUFLRVI9ImRvbWluYW50X3NwZWFrZXIiLHIuQVVESU9fREVWSUNFU19VUERBVEVTPSJhdWRpb19kZXZpY2VzX3VwZGF0ZXMiLHIuVklERU9fREVWSUNFU19VUERBVEVTPSJ2aWRlb19kZXZpY2VzX3VwZGF0ZXMiLHIuU1BFQUtFUl9ERVZJQ0VTX1VQREFURVM9InNwZWFrZXJfZGV2aWNlc191cGRhdGVzIixyLlNFTEVDVEVEX01JQ1JPSFBPTkVfVVBEQVRFPSJzZWxlY3RlZF9taWNyb3Bob25lX3VwZGF0ZSIsci5TRUxFQ1RFRF9DQU1FUkFfVVBEQVRFPSJzZWxlY3RlZF9jYW1lcmFfdXBkYXRlIixyLlNFTEVDVEVEX1NQRUFLRVJfVVBEQVRFPSJzZWxlY3RlZF9zcGVha2VyX3VwZGF0ZSIsci5FWFBFQ1RFRF9WSURFT19SRVNPTFVUSU9OPSJleHBlY3RlZF92aWRlb19yZXNvbHV0aW9uIixyLkVYUEVDVEVEX1NDUkVFTlNIQVJFX1JFU09MVVRJT049ImV4cGVjdGVkX3NjcmVlbnNoYXJlX3Jlc29sdXRpb24iLHIuTUVESUFfUEVSTUlTU0lPTj0ibWVkaWFfcGVybWlzc2lvbiIsci5MRUdBQ1lfU1dJVENIPSJsZWdhY3lfc3dpdGNoIixyLkFVRElPX1BMQVlfRkFJTEVEPSJhdWRpb19wbGF5X2ZhaWxlZCIsci5WSURFT19QTEFZX0ZBSUxFRD0idmlkZW9fcGxheV9mYWlsZWQiLHIuQVVESU9fVFJBQ0tfTVVURUQ9ImF1ZGlvX3RyYWNrX211dGVkIixyLlZJREVPX1RSQUNLX01VVEVEPSJ2aWRlb190cmFja19tdXRlZCIsci5JVlNfUExBWUVSX1JFQlVGRkVSSU5HPSJpdnNfcGxheWVyX3JlYnVmZmVyaW5nIixyLklWU19QTEFZRVJfQVVESU9fQkxPQ0tFRD0iaXZzX3BsYXllcl9hdWRpb19ibG9ja2VkIixyLklWU19QTEFZRVJfUExBWUJBQ0tfQkxPQ0tFRD0iaXZzX3BsYXllcl9wbGF5YmFja19ibG9ja2VkIixyLklWU19QTEFZRVJfRVJST1I9Iml2c19wbGF5ZXJfZXJyb3IiLHIuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUj0iaXZzX3BsYXllcl9yZWNvdmVyYWJsZV9lcnJvciIsci5JVlNfUExBWUVSX1dPUktFUl9FUlJPUj0iaXZzX3BsYXllcl93b3JrZXJfZXJyb3IiLHIuSVZTX1BMQVlFUl9ORVRXT1JLX1VOQVZBSUxBQkxFPSJpdnNfcGxheWVyX25ldHdvcmtfdW5hdmFpbGFibGUiLHIuTElWRVNUUkVBTV9MQVRFTkNZPSJsaXZlc3RyZWFtX2xhdGVuY3kiLHIuSVZTX1BMQVlFUl9BTkFMWVRJQ1NfRVZFTlQ9Iml2c19wbGF5ZXJfYW5hbHl0aWNzX2V2ZW50IixyLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VEPSJpdnNfcGxheWVyX3BsYXliYWNrX3JhdGVfY2hhbmdlZCIsci5JVlNfUExBWUVSX1FVQUxJVFlfQ0hBTkdFRD0iaXZzX3BsYXllcl9xdWFsaXR5X2NoYW5nZWQiLHIuSVZTX1BMQVlFUl9JTklUSUFMSVpFRD0iaXZzX3BsYXllcl9pbml0aWFsaXplZCJ9KShTfHwoUz17fSkpO2NvbnN0IGRzPW5ldyBNYXAoW1tTLlBSRUNBTExfVEVTVF9CRUdJTixSLk1JTk9SX0VWRU5UXSxbUy5QUkVDQUxMX1RFU1RfQ09NUExFVEUsUi5NSU5PUl9FVkVOVF0sW1MuQ0FMTF9KT0lOX0JFR0lOLFIuTUFKT1JfRVZFTlRdLFtTLk5FVF9RVUFMSVRZX1RFU1RfQkVHSU4sUi5NSU5PUl9FVkVOVF0sW1MuTkVUX1FVQUxJVFlfVEVTVF9FTkQsUi5NSU5PUl9FVkVOVF0sW1MuV0VCU09DS0VUX0NPTk5FQ1RFRCxSLk1JTk9SX0VWRU5UXSxbUy5UUkFOU1BPUlRfQ09OTkVDVEVELFIuTUFKT1JfRVZFTlRdLFtTLkFVRElPX09OLFIuTUlOT1JfRVZFTlRdLFtTLkFVRElPX09GRixSLk1JTk9SX0VWRU5UXSxbUy5WSURFT19PTixSLk1JTk9SX0VWRU5UXSxbUy5WSURFT19PRkYsUi5NSU5PUl9FVkVOVF0sW1MuUEFSVElDSVBBTlRfUk9MRSxSLk1JTk9SX0VWRU5UXSxbUy5QSU5HX1NUQVQsUi5NQUpPUl9FVkVOVF0sW1MuRElTQ09OTkVDVCxSLk1BSk9SX0VWRU5UXSxbUy5SRUNPTk5FQ1RfQVRURU1QVCxSLk1BSk9SX0VWRU5UXSxbUy5TQ1JFRU5TSEFSRV9TVEFSVF9SRVFVRVNURUQsUi5NSU5PUl9FVkVOVF0sW1MuU0NSRUVOU0hBUkVfU1RBUlRFRCxSLk1JTk9SX0VWRU5UXSxbUy5TQ1JFRU5TSEFSRV9TVE9QUEVELFIuTUlOT1JfRVZFTlRdLFtTLlRBQl9DSEFOR0UsUi5NSU5PUl9FVkVOVF0sW1MuQlJPV1NFUl9CQUNLR1JPVU5ERUQsUi5NSU5PUl9FVkVOVF0sW1MuQlJPV1NFUl9GT1JFR1JPVU5ERUQsUi5NSU5PUl9FVkVOVF0sW1MuRE9NSU5BTlRfU1BFQUtFUixSLk1JTk9SX0VWRU5UXSxbUy5BVURJT19ERVZJQ0VTX1VQREFURVMsUi5NSU5PUl9FVkVOVF0sW1MuVklERU9fREVWSUNFU19VUERBVEVTLFIuTUlOT1JfRVZFTlRdLFtTLlNQRUFLRVJfREVWSUNFU19VUERBVEVTLFIuTUlOT1JfRVZFTlRdLFtTLlNFTEVDVEVEX01JQ1JPSFBPTkVfVVBEQVRFLFIuTUlOT1JfRVZFTlRdLFtTLlNFTEVDVEVEX0NBTUVSQV9VUERBVEUsUi5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfU1BFQUtFUl9VUERBVEUsUi5NSU5PUl9FVkVOVF0sW1MuTUVESUFfUEVSTUlTU0lPTixSLk1JTk9SX0VWRU5UXSxbUy5MRUdBQ1lfU1dJVENILFIuTUlOT1JfRVZFTlRdLFtTLkFVRElPX1BMQVlfRkFJTEVELFIuTUlOT1JfRVZFTlRdLFtTLlZJREVPX1BMQVlfRkFJTEVELFIuTUlOT1JfRVZFTlRdLFtTLkFVRElPX1RSQUNLX01VVEVELFIuTUlOT1JfRVZFTlRdLFtTLlZJREVPX1RSQUNLX01VVEVELFIuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUkVCVUZGRVJJTkcsUi5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9BVURJT19CTE9DS0VELFIuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUExBWUJBQ0tfQkxPQ0tFRCxSLk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0VSUk9SLFIuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUkVDT1ZFUkFCTEVfRVJST1IsUi5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9XT1JLRVJfRVJST1IsUi5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9ORVRXT1JLX1VOQVZBSUxBQkxFLFIuTUFKT1JfRVZFTlRdLFtTLkxJVkVTVFJFQU1fTEFURU5DWSxSLk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0FOQUxZVElDU19FVkVOVCxSLk1JTk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX1BMQVlCQUNLX1JBVEVfQ0hBTkdFRCxSLk1JTk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX1FVQUxJVFlfQ0hBTkdFRCxSLk1JTk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0lOSVRJQUxJWkVELFIuTUlOT1JfRVZFTlRdLFtTLkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT04sUi5NSU5PUl9FVkVOVF0sW1MuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTixSLk1JTk9SX0VWRU5UXV0pO2NsYXNzIGxze2NvbnN0cnVjdG9yKCl7dSh0aGlzLCJldmVudHMiKTt0aGlzLmV2ZW50cz1bXX1hZGQodCl7dGhpcy5ldmVudHMucHVzaCh0KX1mbHVzaCgpe3JldHVybntlbnRyaWVzOnRoaXMuZXZlbnRzLnNwbGljZSgwLDI1KX19fWNsYXNzIHVzIGV4dGVuZHMgV3tjb25zdHJ1Y3Rvcih7bG9nZ2VyOmUscGVlcklkOnMsYXBpSG9zdG5hbWVzOm4sYXV0aFRva2VuOml9KXtzdXBlcigpO3UodGhpcywibG9nZ2VyIik7dSh0aGlzLCJwZWVySWQiKTt1KHRoaXMsImV2ZW50U3RvcmUiKTt1KHRoaXMsImFwaUVuZHBvaW50Iik7dSh0aGlzLCJhdXRoVG9rZW4iKTt0aGlzLmxvZ2dlcj1lLHRoaXMucGVlcklkPXMsdGhpcy5hdXRoVG9rZW49aSx0aGlzLmFwaUVuZHBvaW50PWBodHRwczovLyR7bi5kYUNvbGxlY3Rvcn0vYXBpL3YxL21lc3NhZ2VgLHRoaXMuZXZlbnRTdG9yZT1uZXcgbHN9c2VuZEV2ZW50c0NodW5rVG9TZXJ2ZXIoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9e3BheWxvYWQ6ZSxwZWVySWQ6dGhpcy5wZWVySWR9LG49bmV3IEFib3J0Q29udHJvbGxlcixpPXNldFRpbWVvdXQoKCk9Pm4uYWJvcnQoKSwzZTMpO3RyeXtyZXR1cm4geWllbGQgZmV0Y2godGhpcy5hcGlFbmRwb2ludCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiIsQXV0aG9yaXphdGlvbjpgQmVhcmVyICR7dGhpcy5hdXRoVG9rZW59YH0sYm9keTpKU09OLnN0cmluZ2lmeShzKSxzaWduYWw6bi5zaWduYWx9KSwhMH1jYXRjaChhKXtyZXR1cm4gdGhpcy5sb2dnZXIuZXJyb3IoImNhbGxTdGF0czo6c2VuZEV2ZW50c0NodW5rVG9TZXJ2ZXI6OmNhdGNoIix7cGVlcklkOnRoaXMucGVlcklkLGVuZHBvaW50OnRoaXMuYXBpRW5kcG9pbnQsZXJyb3I6YSBpbnN0YW5jZW9mIEVycm9yP2EubWVzc2FnZTpTdHJpbmcoYSksc3RhY2s6YSBpbnN0YW5jZW9mIEVycm9yP2Euc3RhY2s6dm9pZCAwfSksITF9ZmluYWxseXtjbGVhclRpbWVvdXQoaSl9fSl9Y2FsbEV2ZW50KGUpe2UudGltZXN0YW1wPW5ldyBEYXRlLHRoaXMuZXZlbnRTdG9yZS5hZGQoZSksdGhpcy5lbWl0KGUuZXZlbnQsZS5tZXRhRGF0YSksZHMuZ2V0KGUuZXZlbnQpPT09Ui5NQUpPUl9FVkVOVCYmdGhpcy5mbHVzaCgpfWZsdXNoKCl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBzO2NvbnN0IGU9dGhpcy5ldmVudFN0b3JlLmZsdXNoKCk7aWYoKHM9ZT09bnVsbD92b2lkIDA6ZS5lbnRyaWVzKSE9bnVsbCYmcy5sZW5ndGgpe2NvbnN0IG49eWllbGQgdGhpcy5zZW5kRXZlbnRzQ2h1bmtUb1NlcnZlcihlKTtyZXR1cm4gbnx8ZS5lbnRyaWVzLmZvckVhY2goaT0+e3RoaXMuZXZlbnRTdG9yZS5hZGQoaSl9KSxufXJldHVybiExfSl9fXZhciBXdDsoZnVuY3Rpb24ocil7ci5DSFJPTUlVTT0iY2hyb211bSIsci5GSVJFRk9YPSJmaXJlZm94IixyLlNBRkFSST0ic2FmYXJpIn0pKFd0fHwoV3Q9e30pKTtjb25zdCB6dD17REVWRUw6ImRldmVsIixQUkVQUk9EOiJwcmVwcm9kIixQUk9EOiJwcm9kIn07dmFyIFk7KGZ1bmN0aW9uKHIpe3IuQVVESU89IkFVRElPIixyLlZJREVPPSJWSURFTyIsci5TUEVBS0VSPSJTUEVBS0VSIixyLlNDUkVFTlNIQVJFPSJTQ1JFRU5TSEFSRSJ9KShZfHwoWT17fSkpO3ZhciAkdDsoZnVuY3Rpb24ocil7cltyLklOSVQ9MF09IklOSVQiLHJbci5BQ0NFUFRFRD0xXT0iQUNDRVBURUQiLHJbci5ERU5JRUQ9Ml09IkRFTklFRCIscltyLlNZU19ERU5JRUQ9M109IlNZU19ERU5JRUQiLHJbci5GQUlMRUQ9NF09IkZBSUxFRCIscltyLk5PVEZPVU5EPTVdPSJOT1RGT1VORCIscltyLk5PVF9BUFBMSUNBQkxFPTZdPSJOT1RfQVBQTElDQUJMRSJ9KSgkdHx8KCR0PXt9KSk7ZnVuY3Rpb24gdGUocil7cmV0dXJuIHI/ci5zcGxpdCgiLiIpLnNsaWNlKDAsMikuY29uY2F0KFsiMCIsIjAiXSkuam9pbigiLiIpOiIifWZ1bmN0aW9uIFplKHtwYWNrZXRzTG9zdDpyLHBhY2tldHNTZW50OnR9KXtyZXR1cm4gdD4wP3IqMTAwL3Q6MH1mdW5jdGlvbiBldCh7cGFja2V0c0xvc3Q6cixwYWNrZXRzUmVjZWl2ZWQ6dH0pe3JldHVybiB0K3I+MD9yKjEwMC8odCtyKTowfWNvbnN0IEd0PTI0MCxxdD03MjAsWXQ9OCxRdD0zLHR0PTEwLHJ0PS4wMixzdD0uMDM7ZnVuY3Rpb24gSih7c3RhdDpyLHdlaWdodDp0LHJhbmdlTWluOmUscmFuZ2VNYXg6cyxyYW5nZVJhbmtpbmdEaXJlY3Rpb246bn0pe3JldHVybiByPT1udWxsP3Q6ZT09PXM/bj09PSJVUCI/cjw9ZT90OjA6cj49cz90OjA6bj09PSJVUCI/KDEtTWF0aC5tYXgoTWF0aC5taW4ocyxNYXRoLmFicyhyKSktZSwwKS8ocy1lKSkqdDpuPT09IkRPV04iP01hdGgubWF4KE1hdGgubWluKHMsTWF0aC5hYnMocikpLWUsMCkvKHMtZSkqdDp0fWZ1bmN0aW9uIEp0KHtpc0xvd1F1YWxpdHlWaWRlbzpyLGlzVmlkZW9TdHVjazp0LGlzVmlkZW9MYWdnaW5nOmUsaml0dGVyUXVhbGl0eTpzLHBhY2tldHNMb3N0UXVhbGl0eTpufSl7Y29uc3QgaT0uOCooKHI/Ljg1OjEpKihlPy43OjEpKih0Py41OjEpKSsuMioocypuKTtyZXR1cm4gTWF0aC5yb3VuZCgoaStOdW1iZXIuRVBTSUxPTikqMTAwKS8xMDB9ZnVuY3Rpb24gWHQoe3BhY2tldHNMb3N0OnIscGFja2V0c1NlbnQ6dH0pe3JldHVybiB0PjA/cioxMDAvdDowfWZ1bmN0aW9uIFp0KHtwYWNrZXRzTG9zdDpyLHBhY2tldHNTZW50OnQsaml0dGVyOmV9KXtjb25zdCBuPUooe3N0YXQ6WHQoe3BhY2tldHNMb3N0OnIscGFja2V0c1NlbnQ6dH0pLHdlaWdodDouNyxyYW5nZU1pbjowLHJhbmdlTWF4OnR0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksYT1KKHtzdGF0OmUsd2VpZ2h0Oi4zLHJhbmdlTWluOnJ0LHJhbmdlTWF4OnN0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSk7cmV0dXJuIG4rYX1mdW5jdGlvbiBwcyh7ZnJhbWVXaWR0aDpyLGlzU2NyZWVuU2hhcmU6dH0pe3JldHVybiByPCh0P3F0Okd0KX1mdW5jdGlvbiBocyh7ZnJhbWVzUGVyU2Vjb25kOnIsaXNTY3JlZW5TaGFyZTp0fSl7cmV0dXJuIHI8KHQ/UXQ6WXQpfWZ1bmN0aW9uIG1zKHtmcmFtZXNFbmNvZGVkOnJ9KXtyZXR1cm4gcj09PTB9ZnVuY3Rpb24gZXIoe2ZyYW1lV2lkdGg6cixmcmFtZXNQZXJTZWNvbmQ6dCxwYWNrZXRzTG9zdDplLHBhY2tldHNTZW50OnMsaml0dGVyOm4saXNTY3JlZW5TaGFyZTppLGZyYW1lc0VuY29kZWQ6YX0pe2NvbnN0IGQ9Sih7c3RhdDpYdCh7cGFja2V0c0xvc3Q6ZSxwYWNrZXRzU2VudDpzfSksd2VpZ2h0OjEscmFuZ2VNaW46MCxyYW5nZU1heDp0dCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLG89Sih7c3RhdDpuLHdlaWdodDoxLHJhbmdlTWluOnJ0LHJhbmdlTWF4OnN0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksaD1wcyh7ZnJhbWVXaWR0aDpyLGlzU2NyZWVuU2hhcmU6aX0pLGc9aHMoe2ZyYW1lc1BlclNlY29uZDp0LGlzU2NyZWVuU2hhcmU6aX0pLGI9bXMoe2ZyYW1lc0VuY29kZWQ6YSxpc1NjcmVlblNoYXJlOml9KTtyZXR1cm4gSnQoe2lzTG93UXVhbGl0eVZpZGVvOmgsaXNWaWRlb0xhZ2dpbmc6Zyxpc1ZpZGVvU3R1Y2s6YixqaXR0ZXJRdWFsaXR5Om8scGFja2V0c0xvc3RRdWFsaXR5OmR9KX1mdW5jdGlvbiB0cih7cGFja2V0c0xvc3Q6cixwYWNrZXRzUmVjZWl2ZWQ6dH0pe3JldHVybiB0K3I+MD9yKjEwMC8odCtyKTowfWZ1bmN0aW9uIHJyKHtjb25jZWFsbWVudEV2ZW50czpyLHBhY2tldHNMb3N0OnQscGFja2V0c1JlY2VpdmVkOmUsaml0dGVyOnN9KXtjb25zdCBpPUooe3N0YXQ6cix3ZWlnaHQ6LjIscmFuZ2VNaW46MCxyYW5nZU1heDozLHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksYT0uNSxkPUooe3N0YXQ6dHIoe3BhY2tldHNMb3N0OnQscGFja2V0c1JlY2VpdmVkOmV9KSx3ZWlnaHQ6YSxyYW5nZU1pbjowLHJhbmdlTWF4OnR0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksaD1KKHtzdGF0OnMsd2VpZ2h0Oi4zLHJhbmdlTWluOnJ0LHJhbmdlTWF4OnN0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSk7cmV0dXJuIGkrZCtofWZ1bmN0aW9uIGZzKHtmcmFtZXNEZWNvZGVkOnJ9KXtyZXR1cm4gcj09PTB9ZnVuY3Rpb24gZ3Moe2ZyYW1lc1BlclNlY29uZDpyLGlzU2NyZWVuU2hhcmU6dH0pe3JldHVybiByPCh0P1F0Oll0KX1mdW5jdGlvbiBTcyh7ZnJhbWVXaWR0aDpyLGlzU2NyZWVuU2hhcmU6dH0pe3JldHVybiByPCh0P3F0Okd0KX1mdW5jdGlvbiBzcih7ZnJhbWVXaWR0aDpyLGZyYW1lc1BlclNlY29uZDp0LHBhY2tldHNMb3N0OmUscGFja2V0c1JlY2VpdmVkOnMsaml0dGVyOm4saXNTY3JlZW5TaGFyZTppLGZyYW1lc0RlY29kZWQ6YX0pe2NvbnN0IGQ9Sih7c3RhdDp0cih7cGFja2V0c0xvc3Q6ZSxwYWNrZXRzUmVjZWl2ZWQ6c30pLHdlaWdodDoxLHJhbmdlTWluOjAscmFuZ2VNYXg6dHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxvPUooe3N0YXQ6bix3ZWlnaHQ6MSxyYW5nZU1pbjpydCxyYW5nZU1heDpzdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGg9U3Moe2ZyYW1lV2lkdGg6cixpc1NjcmVlblNoYXJlOml9KSxnPWdzKHtmcmFtZXNQZXJTZWNvbmQ6dCxpc1NjcmVlblNoYXJlOml9KSxiPWZzKHtmcmFtZXNEZWNvZGVkOmEsaXNTY3JlZW5TaGFyZTppfSk7cmV0dXJuIEp0KHtpc0xvd1F1YWxpdHlWaWRlbzpoLGlzVmlkZW9MYWdnaW5nOmcsaXNWaWRlb1N0dWNrOmIsaml0dGVyUXVhbGl0eTpvLHBhY2tldHNMb3N0UXVhbGl0eTpkfSl9Y2xhc3MgWHtjb25zdHJ1Y3Rvcih0KXt1KHRoaXMsInBjMSIpO3UodGhpcywicGMyIik7dSh0aGlzLCJjb25zdHJhaW5WaWRlb0JpdHJhdGVLYnBzIik7dSh0aGlzLCJjb25zdHJhaW5PZmZlclRvUmVtb3ZlVmlkZW9GZWMiLCExKTt1KHRoaXMsImljZUNhbmRpZGF0ZUZpbHRlciIpO2NvbnN0IGU9bmV3IFJUQ1BlZXJDb25uZWN0aW9uKHQpLHM9bmV3IFJUQ1BlZXJDb25uZWN0aW9uKHQpO3RoaXMucGMxPWUsdGhpcy5wYzI9cyx0aGlzLmljZUNhbmRpZGF0ZUZpbHRlcj1YLm5vRmlsdGVyLHRoaXMucGMxLmFkZEV2ZW50TGlzdGVuZXIoImljZWNhbmRpZGF0ZSIsdGhpcy5vbkljZUNhbmRpZGF0ZS5iaW5kKHRoaXMsdGhpcy5wYzIpKSx0aGlzLnBjMi5hZGRFdmVudExpc3RlbmVyKCJpY2VjYW5kaWRhdGUiLHRoaXMub25JY2VDYW5kaWRhdGUuYmluZCh0aGlzLHRoaXMucGMxKSl9c3RhdGljIHBhcnNlQ2FuZGlkYXRlKHQpe2NvbnN0IGU9ImNhbmRpZGF0ZToiLHM9dC5pbmRleE9mKGUpK2UubGVuZ3RoLG49dC5zdWJzdHIocykuc3BsaXQoIiAiKTtyZXR1cm57dHlwZTpuWzddLHByb3RvY29sOm5bMl0sYWRkcmVzczpuWzRdfX1zdGF0aWMgaXNOb3RIb3N0Q2FuZGlkYXRlKHQpe3JldHVybiB0LnR5cGUhPT0iaG9zdCJ9c3RhdGljIGlzSG9zdCh0KXtyZXR1cm4gdC50eXBlPT09Imhvc3QifXN0YXRpYyBpc1JlbGF5KHQpe3JldHVybiB0LnR5cGU9PT0icmVsYXkifXN0YXRpYyBpc1JlZmxleGl2ZSh0KXtyZXR1cm4gdC50eXBlPT09InNyZmx4In1zdGF0aWMgbm9GaWx0ZXIodCl7cmV0dXJuITB9b25JY2VDYW5kaWRhdGUodCxlKXtpZihlLmNhbmRpZGF0ZSl7Y29uc3Qgcz1YLnBhcnNlQ2FuZGlkYXRlKGUuY2FuZGlkYXRlLmNhbmRpZGF0ZSk7dGhpcy5pY2VDYW5kaWRhdGVGaWx0ZXIocykmJnQuYWRkSWNlQ2FuZGlkYXRlKGUuY2FuZGlkYXRlKX19c2V0SWNlQ2FuZGlkYXRlRmlsdGVyKHQpe3RoaXMuaWNlQ2FuZGlkYXRlRmlsdGVyPXR9Y29uc3RyYWluVmlkZW9CaXRyYXRlKHQpe3RoaXMuY29uc3RyYWluVmlkZW9CaXRyYXRlS2Jwcz10fWRpc2FibGVWaWRlb0ZlYygpe3RoaXMuY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjPSEwfWdvdE9mZmVyKHQpe3RoaXMuY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjJiYodC5zZHA9dC5zZHAucmVwbGFjZSgvKG09dmlkZW8gMSBbXlxyXSspKDExNiAxMTcpKFxyXG4pL2csYCQxXHIKYCksdC5zZHA9dC5zZHAucmVwbGFjZSgvYT1ydHBtYXA6MTE2IHJlZFwvOTAwMDBcclxuL2csIiIpLHQuc2RwPXQuc2RwLnJlcGxhY2UoL2E9cnRwbWFwOjExNyB1bHBmZWNcLzkwMDAwXHJcbi9nLCIiKSx0LnNkcD10LnNkcC5yZXBsYWNlKC9hPXJ0cG1hcDo5OCBydHhcLzkwMDAwXHJcbi9nLCIiKSx0LnNkcD10LnNkcC5yZXBsYWNlKC9hPWZtdHA6OTggYXB0PTExNlxyXG4vZywiIikpLHRoaXMucGMxLnNldExvY2FsRGVzY3JpcHRpb24odCksdGhpcy5wYzIuc2V0UmVtb3RlRGVzY3JpcHRpb24odCksdGhpcy5wYzIuY3JlYXRlQW5zd2VyKCkudGhlbih0aGlzLmdvdEFuc3dlci5iaW5kKHRoaXMpLHRoaXMucmVwb3J0RmF0YWwuYmluZCh0aGlzKSl9Z290QW5zd2VyKHQpe3RoaXMuY29uc3RyYWluVmlkZW9CaXRyYXRlS2JwcyYmKHQuc2RwPXQuc2RwLnJlcGxhY2UoL2E9bWlkOnZpZGVvXHJcbi9nLGBhPW1pZDp2aWRlb1xyCmI9QVM6JHt0aGlzLmNvbnN0cmFpblZpZGVvQml0cmF0ZUticHN9XHIKYCkpLHRoaXMucGMyLnNldExvY2FsRGVzY3JpcHRpb24odCksdGhpcy5wYzEuc2V0UmVtb3RlRGVzY3JpcHRpb24odCl9ZXN0YWJsaXNoQ29ubmVjdGlvbigpe3RoaXMucGMxLmNyZWF0ZU9mZmVyKCkudGhlbih0aGlzLmdvdE9mZmVyLmJpbmQodGhpcyksdGhpcy5yZXBvcnRGYXRhbC5iaW5kKHRoaXMpKX1yZXBvcnRGYXRhbCh0KXtjb25zb2xlLmVycm9yKCJFcnJvcjoiLHQpfWdldFJvdW5kVHJpcFRpbWUoKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3RbdCxlXT15aWVsZCBQcm9taXNlLmFsbChbdGhpcy5wYzEuZ2V0U3RhdHMoKSx0aGlzLnBjMi5nZXRTdGF0cygpXSk7bGV0IHMsbjtpZih0LmZvckVhY2goaT0+e2kudHlwZT09PSJjYW5kaWRhdGUtcGFpciImJmkubm9taW5hdGVkPT09ITAmJmkuYnl0ZXNTZW50PjAmJihzPWkpfSksZS5mb3JFYWNoKGk9PntpLnR5cGU9PT0iY2FuZGlkYXRlLXBhaXIiJiZpLm5vbWluYXRlZD09PSEwJiZpLmJ5dGVzUmVjZWl2ZWQ+MCYmKG49aSl9KSxzJiZuKXRyeXtpZihzLmN1cnJlbnRSb3VuZFRyaXBUaW1lJiZuLmN1cnJlbnRSb3VuZFRyaXBUaW1lKXJldHVybntydHQ6cy5jdXJyZW50Um91bmRUcmlwVGltZSxiYWNrZW5kUlRUOm4uY3VycmVudFJvdW5kVHJpcFRpbWV9O2NvbnN0IGk9KG4ubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLXMubGFzdFBhY2tldFNlbnRUaW1lc3RhbXApLzFlMztyZXR1cm57cnR0OmksYmFja2VuZFJUVDppfX1jYXRjaChpKXtyZXR1cm59fSl9Y2xvc2UoKXt0aGlzLnBjMS5jbG9zZSgpLHRoaXMucGMyLmNsb3NlKCl9fWNsYXNzIG5yIGV4dGVuZHMgV3tjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3UodGhpcywiY2FsbCIpO3UodGhpcywidGltZU91dCIpO3RoaXMuY2FsbD1uZXcgWChlKX1zdGFydChlPTFlNCl7dGhpcy5jYWxsLmVzdGFibGlzaENvbm5lY3Rpb24oKSx0aGlzLnRpbWVPdXQ9c2V0VGltZW91dCh0aGlzLnRlc3RGYWlsZWQuYmluZCh0aGlzKSxlKX10ZXN0Q29tcGxldGUoZSl7Y2xlYXJUaW1lb3V0KHRoaXMudGltZU91dCksdGhpcy5jYWxsLmNsb3NlKCksdGhpcy5lbWl0KCJkb25lIixlKX10ZXN0RmFpbGVkKGUpe3RoaXMuY2FsbC5jbG9zZSgpLHRoaXMuZW1pdCgiZmFpbGVkIixlKX19Y29uc3QgeXM9OCx2cz0xLzFlMztjbGFzcyBicyBleHRlbmRzIG5ye2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO3UodGhpcywic2VuZGVyQ2hhbm5lbCIpO3UodGhpcywicmVjaWV2ZUNoYW5uZWwiKTt1KHRoaXMsInN0YXJ0VGltZSIpO3UodGhpcywibGFzdEJpdHJhdGVNZWFzdXJlVGltZSIpO3UodGhpcywic2VudFBheWxvYWRCeXRlcyIsMCk7dSh0aGlzLCJyZWNpZXZlZFBheWxvYWRCeXRlcyIsMCk7dSh0aGlzLCJsYXN0UmVjZWl2ZWRQYXlsb2FkQnl0ZXMiLDApO3UodGhpcywic3RvcFNlbmRpbmciLCExKTt1KHRoaXMsInRlc3RQcm9ncmVzcyIsMCk7dSh0aGlzLCJzYW1wbGVQYWNrZXQiLCIiKTt1KHRoaXMsImZpbmFsQml0cmF0ZVN1bSIsMCk7dSh0aGlzLCJiaXRSYXRlU2FtcGVscyIsMCk7dSh0aGlzLCJtYXhOdW1iZXJPZlBhY2tldHNUb1NlbmQiLDApO3UodGhpcywiYnl0ZXNUb0tlZXBCdWZmZXJlZCIsMCk7dSh0aGlzLCJ0ZXN0RHVyYXRpb25TZWNvbmRzIiw1KTt0aGlzLmNhbGwuc2V0SWNlQ2FuZGlkYXRlRmlsdGVyKFguaXNOb3RIb3N0Q2FuZGlkYXRlKSx0aGlzLnNlbmRlckNoYW5uZWw9dGhpcy5jYWxsLnBjMS5jcmVhdGVEYXRhQ2hhbm5lbChudWxsKTtmb3IobGV0IHM9MDtzPDEwMjQqMjU2O3MrPTEpdGhpcy5zYW1wbGVQYWNrZXQrPSJoIjt0aGlzLm1heE51bWJlck9mUGFja2V0c1RvU2VuZD0xLHRoaXMuYnl0ZXNUb0tlZXBCdWZmZXJlZD0xMDI0KnRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kLHRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz00LHRoaXMuc2VuZGVyQ2hhbm5lbC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIix0aGlzLnNlbmRpbmdTdGVwLmJpbmQodGhpcykpLHRoaXMuY2FsbC5wYzIuYWRkRXZlbnRMaXN0ZW5lcigiZGF0YWNoYW5uZWwiLHRoaXMub25SZWNpZXZlckNoYW5uZWwuYmluZCh0aGlzKSl9c2VuZGluZ1N0ZXAoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMuc3RhcnRUaW1lfHwodGhpcy5zdGFydFRpbWU9ZSx0aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWU9ZSk7Zm9yKGxldCBuPTA7biE9PXRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kJiYhKHRoaXMuc2VuZGVyQ2hhbm5lbC5idWZmZXJlZEFtb3VudD49dGhpcy5ieXRlc1RvS2VlcEJ1ZmZlcmVkKTtuKz0xKXt0aGlzLnNlbnRQYXlsb2FkQnl0ZXMrPXRoaXMuc2FtcGxlUGFja2V0Lmxlbmd0aDt0cnl7dGhpcy5zZW5kZXJDaGFubmVsLnNlbmQodGhpcy5zYW1wbGVQYWNrZXQpfWNhdGNoKGkpe319Y29uc3Qgcz1lLmdldFRpbWUoKS10aGlzLnN0YXJ0VGltZS5nZXRUaW1lKCk7cz49MWUzKnRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz8odGhpcy5zdG9wU2VuZGluZz0hMCx0aGlzLnRlc3RQcm9ncmVzcz0xMDApOih0aGlzLnRlc3RQcm9ncmVzcz1zLygxMCp0aGlzLnRlc3REdXJhdGlvblNlY29uZHMpLHNldFRpbWVvdXQodGhpcy5zZW5kaW5nU3RlcC5iaW5kKHRoaXMpLDEpKX1vbk1lc3NhZ2VSZWNpZXZlZChlKXt0aGlzLnJlY2lldmVkUGF5bG9hZEJ5dGVzKz1lLmRhdGEubGVuZ3RoO2NvbnN0IHM9bmV3IERhdGUsbj1zLmdldFRpbWUoKS10aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWUuZ2V0VGltZSgpO2lmKG4+PTFlMyl7Y29uc3QgYT0odGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcy10aGlzLmxhc3RSZWNlaXZlZFBheWxvYWRCeXRlcykqeXMvKG4vMWUzKTt0aGlzLmZpbmFsQml0cmF0ZVN1bSs9YSx0aGlzLmJpdFJhdGVTYW1wZWxzKz0xLHRoaXMubGFzdFJlY2VpdmVkUGF5bG9hZEJ5dGVzPXRoaXMucmVjaWV2ZWRQYXlsb2FkQnl0ZXMsdGhpcy5sYXN0Qml0cmF0ZU1lYXN1cmVUaW1lPXN9aWYodGhpcy5zdG9wU2VuZGluZyYmdGhpcy5zZW50UGF5bG9hZEJ5dGVzPT09dGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcyl7Y29uc3QgaT10aGlzLmZpbmFsQml0cmF0ZVN1bS90aGlzLmJpdFJhdGVTYW1wZWxzO3RoaXMudGVzdENvbXBsZXRlKHt0aHJvdWdocHV0Ok1hdGgucm91bmQoaSp2cyl9KX19dGVzdENvbXBsZXRlKGUpe3RoaXMuY2FsbC5nZXRSb3VuZFRyaXBUaW1lKCkudGhlbigoe3J0dDpzLGJhY2tlbmRSVFQ6bn0pPT5zdXBlci50ZXN0Q29tcGxldGUoe1JUVDpzLGJhY2tlbmRSVFQ6bix0aHJvdWdocHV0OmUudGhyb3VnaHB1dH0pKX1vblJlY2lldmVyQ2hhbm5lbChlKXt0aGlzLnJlY2lldmVDaGFubmVsPWUuY2hhbm5lbCx0aGlzLnJlY2lldmVDaGFubmVsLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25NZXNzYWdlUmVjaWV2ZWQuYmluZCh0aGlzKSl9fWNsYXNzIGh0IGV4dGVuZHMgbnJ7Y29uc3RydWN0b3IoZSxzPVgubm9GaWx0ZXIpe3N1cGVyKGUpO3UodGhpcywiY2gxIik7dSh0aGlzLCJjaDIiKTt0aGlzLmNhbGwuc2V0SWNlQ2FuZGlkYXRlRmlsdGVyKHMpO2NvbnN0IG49dGhpcy5jYWxsLnBjMS5jcmVhdGVEYXRhQ2hhbm5lbChudWxsKTt0aGlzLmNoMT1uLG4uYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsKCk9PntuLnNlbmQoImhlbGxvIil9KSxuLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25DaDFSZWNpZXZlLmJpbmQodGhpcykpLHRoaXMuY2FsbC5wYzIuYWRkRXZlbnRMaXN0ZW5lcigiZGF0YWNoYW5uZWwiLHRoaXMuZGF0YUNoYW5uZWxIYW5kbGVyLmJpbmQodGhpcykpfW9uQ2gxUmVjaWV2ZShlKXtlLmRhdGEhPT0id29ybGQiP3RoaXMuaGFuZ3VwKCJJbnZhbGlkIGRhdGEgdHJhbnNtaXR0ZWQuIik6dGhpcy50ZXN0Q29tcGxldGUoe2Nvbm5lY3Rpdml0eTohMH0pfW9uQ2gyUmVjaWV2ZShlKXtpZihlLmRhdGEhPT0iaGVsbG8iKXRoaXMuaGFuZ3VwKCJJbnZhbGlkIGRhdGEgdHJhbnNtaXR0ZWQuIik7ZWxzZSB0cnl7dGhpcy5jaDIuc2VuZCgid29ybGQiKX1jYXRjaChzKXt9fWRhdGFDaGFubmVsSGFuZGxlcihlKXtjb25zdCBzPWUuY2hhbm5lbDt0aGlzLmNoMj1zLHMuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5vbkNoMlJlY2lldmUuYmluZCh0aGlzKSl9aGFuZ3VwKGUpe3RoaXMudGVzdEZhaWxlZChlKX19Y2xhc3MgRXMgZXh0ZW5kcyBodHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LFguaXNIb3N0KX19Y2xhc3MgVHMgZXh0ZW5kcyBodHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LFguaXNSZWxheSl9fWNsYXNzIFJzIGV4dGVuZHMgaHR7Y29uc3RydWN0b3IodCl7c3VwZXIodCxYLmlzUmVmbGV4aXZlKX19Y2xhc3MgUHN7Y29uc3RydWN0b3IoKXt1KHRoaXMsImlwSW5mb3JtYXRpb24iLG51bGwpfWdldElQRGV0YWlscyhuKXtyZXR1cm4gdyh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDp0LGFwaUhvc3RuYW1lczplLGxvZ2dlcjpzfSl7dmFyIGksYSxkO2lmKCF0aGlzLmlwSW5mb3JtYXRpb24pe3RyeXtjb25zdCBvPWBodHRwczovLyR7ZS5sb2NhdGlvbn1gLGc9eWllbGQoeWllbGQgZmV0Y2gobykpLmpzb24oKTtpZigoKGk9Zy5sb2MpPT1udWxsP3ZvaWQgMDppLmxlbmd0aCk+NSlyZXR1cm4gdGhpcy5pcEluZm9ybWF0aW9uPWcsKGE9dGhpcy5pcEluZm9ybWF0aW9uKSE9bnVsbCYmYS5pcCYmKHRoaXMuaXBJbmZvcm1hdGlvbi5pcD10ZSh0aGlzLmlwSW5mb3JtYXRpb24uaXApKSxnO3Rocm93IEVycm9yKCJJbnN1ZmZpY2llbnQgZGF0YSIpfWNhdGNoKG8pe3MuZXJyb3IoImNhbGxzdGF0czo6aXBEZXRhaWxzOjogZmFpbGVkIHRvIGZldGNoIGlwIHVzaW5nIGxvY2F0aW9uIHNlcnZpY2UiLHtlcnJvcjpvfSl9dHJ5e2NvbnN0IG89eWllbGQgZmV0Y2goYGh0dHBzOi8vJHtlLmxvY2F0aW9uTGVnYWN5fS8/dG9rZW49M2M0OTM5MzJiMDYyNGMmcGVlcklkPSR7dH1gLHttZXRob2Q6IlBPU1QifSk7dGhpcy5pcEluZm9ybWF0aW9uPXlpZWxkIG8uanNvbigpLChkPXRoaXMuaXBJbmZvcm1hdGlvbikhPW51bGwmJmQuaXAmJih0aGlzLmlwSW5mb3JtYXRpb24uaXA9dGUodGhpcy5pcEluZm9ybWF0aW9uLmlwKSl9Y2F0Y2gobyl7cy5lcnJvcigiY2FsbHN0YXRzOjppcERldGFpbHM6OiBmYWlsZWQgdG8gZmV0Y2ggaXAgdXNpbmcgbGVnYWN5IGxvY2F0aW9uIHNlcnZpY2UiLHtlcnJvcjpvfSl9fXJldHVybiB0aGlzLmlwSW5mb3JtYXRpb259KX1yZXNldENhY2hlKCl7dGhpcy5pcEluZm9ybWF0aW9uPW51bGx9fWNvbnN0IGlyPW5ldyBQcyxhcj1be3VybHM6InR1cm46dHVybi5keXRlLmluOjQ0Mz90cmFuc3BvcnQ9dGNwIix1c2VybmFtZToiZHl0ZSIsY3JlZGVudGlhbDoiZHl0ZWluIixjcmVkZW50aWFsVHlwZToicGFzc3dvcmQifSx7dXJsczoidHVybjp0dXJuLmR5dGUuaW46MzQ3OD90cmFuc3BvcnQ9dWRwIix1c2VybmFtZToiZHl0ZSIsY3JlZGVudGlhbDoiZHl0ZWluIixjcmVkZW50aWFsVHlwZToicGFzc3dvcmQifV07ZnVuY3Rpb24gb3Iocil7Y29uc3RbdCxlXT1yLnNwbGl0KCIsIik7cmV0dXJue2Nvb3Jkczp7bGF0aXR1ZGU6TnVtYmVyKHQpLGxvbmdpdHVkZTpOdW1iZXIoZSl9fX1jbGFzcyBjcntjb25zdHJ1Y3Rvcigpe3UodGhpcywidHJhbnNwb3J0Iik7dSh0aGlzLCJjYW5kaWRhdGVQYWlyIik7dSh0aGlzLCJvdXRib3VuZFZpZGVvUnRwIixuZXcgTWFwKTt1KHRoaXMsImluYm91bmRWaWRlb1J0cCIsbmV3IE1hcCk7dSh0aGlzLCJvdXRib3VuZEF1ZGlvUnRwIixuZXcgTWFwKTt1KHRoaXMsImluYm91bmRBdWRpb1J0cCIsbmV3IE1hcCk7dSh0aGlzLCJyZW1vdGVJbmJvdW5kUnRwIixuZXcgTWFwKTt1KHRoaXMsInByb2R1Y2VyU3RyZWFtTWFwIixuZXcgTWFwKTt1KHRoaXMsImNvbnN1bWVyU3RyZWFtTWFwIixuZXcgTWFwKTt1KHRoaXMsInN0YWxlUHJvZHVjZXJTdHJlYW1NYXAiLCExKTt1KHRoaXMsInN0YWxlQ29uc3VtZXJTdHJlYW1NYXAiLCExKX19Y2xhc3MgZHIgZXh0ZW5kcyBXe2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt1KHRoaXMsIm9ic2VydmVyIik7dSh0aGlzLCJvdXRib3VuZFByb2R1Y2VyTWFwIixuZXcgTWFwKTt1KHRoaXMsImluYm91bmRDb25zdW1lck1hcCIsbmV3IE1hcCk7dSh0aGlzLCJjb25zdW1lclBlZXJJZE1hcCIsbmV3IE1hcCk7dSh0aGlzLCJwYXVzZWRDb25zdW1lck1hcCIsbmV3IE1hcCk7dSh0aGlzLCJwYXVzZWRQcm9kdWNlck1hcCIsbmV3IE1hcCk7dSh0aGlzLCJvdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwIix7fSk7dSh0aGlzLCJvdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwIix7fSk7dSh0aGlzLCJvdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXAiLHt9KTt1KHRoaXMsIm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcCIse30pO3UodGhpcywidmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAiLG5ldyBNYXApO3UodGhpcywiYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAiLG5ldyBNYXApO3UodGhpcywidmlkZW9Db25zdW1lclRvU3RhdHNNYXAiLG5ldyBNYXApO3UodGhpcywiYXVkaW9Db25zdW1lclRvU3RhdHNNYXAiLG5ldyBNYXApO3UodGhpcywiY29uc3VtZXJJZHNXaXRoRnJlZXplZFZpZGVvIixuZXcgU2V0KTt1KHRoaXMsImNvbnN1bWVySWRzV2l0aEZyZWV6ZWRBdWRpbyIsbmV3IFNldCk7dSh0aGlzLCJwcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8iLG5ldyBTZXQpO3UodGhpcywicHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvIixuZXcgU2V0KTt1KHRoaXMsImZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMiLG5ldyBTZXQpO3UodGhpcywiZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcyIsbmV3IFNldCk7dSh0aGlzLCJzY3JlZW5TaGFyZVByb2R1Y2VycyIsbmV3IFNldCk7dSh0aGlzLCJzY3JlZW5TaGFyZUNvbnN1bWVycyIsbmV3IFNldCk7dSh0aGlzLCJpcERldGFpbHMiKTt1KHRoaXMsImNhbGxTdGF0c0luc3RhbmNlIik7dGhpcy5vYnNlcnZlcj1uZXcgV31yZWdpc3RlclByb2R1Y2VyKGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt5aWVsZCB0aGlzLmdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAoZSksZS5vbigiY2xvc2UiLHRoaXMuZGVyZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSksZS5vbigicGF1c2UiLHRoaXMucGF1c2VQcm9kdWNlci5iaW5kKHRoaXMsZS5pZCkpLGUub24oInJlc3VtZSIsdGhpcy5yZXN1bWVQcm9kdWNlci5iaW5kKHRoaXMsZS5pZCkpLGUuYXBwRGF0YS5zY3JlZW5TaGFyZT09PSEwJiZ0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmFkZChlLmlkKX0pfXBhdXNlUHJvZHVjZXIoZSl7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5zZXQoZSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITF9KX1yZXN1bWVQcm9kdWNlcihlKXt0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmRlbGV0ZShlKX1wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyhlLHMsbil7dmFyIGEsZDtjb25zdCBpPSgoZD0oYT10aGlzPT1udWxsP3ZvaWQgMDp0aGlzLmNhbGxTdGF0c0luc3RhbmNlKT09bnVsbD92b2lkIDA6YS5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwKT09bnVsbD92b2lkIDA6ZC5nZXQoZSkpfHx7fTtzLnRvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ9PT1uLnBhY2tldHNSZWNlaXZlZD8odGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkVmlkZW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbHN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyVmlkZW9GcmVlemVkIix7Y29uc3VtZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfdmlkZW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxWaWRlb1BhY2tldHNSZWNlaXZlZD1uLnBhY2tldHNSZWNlaXZlZCx0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlby5oYXMoZSkmJih0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlby5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmaS52aWRlbyYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsc3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtZXJWaWRlb0RlZnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsInJlc3VtZSIsZSkpKSl9cHJvY2Vzc0luYm91bmRDb25zdW1lckF1ZGlvU3RhdHMoZSxzLG4pe3ZhciBhLGQ7Y29uc3QgaT0oKGQ9KGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOmQuZ2V0KGUpKXx8e307cy50b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkPT09bi5wYWNrZXRzUmVjZWl2ZWQ/KHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpjb25zdW1lckF1ZGlvRnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX2F1ZGlvX3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsQXVkaW9QYWNrZXRzUmVjZWl2ZWQ9bi5wYWNrZXRzUmVjZWl2ZWQsdGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8uaGFzKGUpJiYodGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyQXVkaW9EZWZyZWV6ZWQiLHtjb25zdW1lcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1lcl9hdWRpb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NPdXRib3VuZFByb2R1Y2VyVmlkZW9TdGF0cyhlLHMsbil7dmFyIGE7Y29uc3QgaT0oKGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9O3MudG90YWxWaWRlb1BhY2tldHNTZW50PT09bi5wYWNrZXRzU2VudD8odGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyVmlkZW9GcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfdmlkZW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxWaWRlb1BhY2tldHNTZW50PW4ucGFja2V0c1NlbnQsdGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uaGFzKGUpJiYodGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyVmlkZW9EZWZyZWV6ZWQiLHtwcm9kdWNlcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNlcl92aWRlb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NPdXRib3VuZFByb2R1Y2VyQXVkaW9TdGF0cyhlLHMsbil7dmFyIGE7Y29uc3QgaT0oKGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9O3MudG90YWxBdWRpb1BhY2tldHNTZW50PT09bi5wYWNrZXRzU2VudD8odGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyQXVkaW9GcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfYXVkaW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxBdWRpb1BhY2tldHNTZW50PW4ucGFja2V0c1NlbnQsdGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uaGFzKGUpJiYodGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyQXVkaW9EZWZyZWV6ZWQiLHtwcm9kdWNlcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NQcm9kdWNpbmdUcmFuc3BvcnRTdGF0cyhlLHMsbil7dmFyIGc7Y29uc3QgaT0oKGc9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmcuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9LHthdWRpbzphLHZpZGVvOmQsc2NyZWVuOm99PWksaD1hfHxkfHxvO3MudG90YWxQYWNrZXRzU2VudD09PW4ucGFja2V0c1NlbnQ/KHRoaXMuZnJlZXplZFByb2R1Y2luZ1RyYW5zcG9ydElkcy5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmaCYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6cHJvZHVjaW5nVHJhbnNwb3J0RnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNpbmdfdHJhbnNwb3J0X3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsUGFja2V0c1NlbnQ9bi5wYWNrZXRzU2VudCx0aGlzLmZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMuaGFzKGUpJiYodGhpcy5mcmVlemVkUHJvZHVjaW5nVHJhbnNwb3J0SWRzLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZoJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNpbmdUcmFuc3BvcnREZWZyZWV6ZWQiLHt0cmFuc3BvcnRJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NDb25zdW1pbmdUcmFuc3BvcnRTdGF0cyhlLHMsbil7dmFyIGQsbztjb25zdCBhPSEhQXJyYXkuZnJvbSgoKG89KGQ9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmQuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOm8udmFsdWVzKCkpfHxbXSkucmVkdWNlKChoLGcpPT5ofHxnLmF1ZGlvfHxnLnZpZGVvfHxnLnNjcmVlbiwhMSk7cy50b3RhbFBhY2tldHNSZWNlaXZlZD09PW4ucGFja2V0c1NlbnQ/KHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmYSYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtaW5nVHJhbnNwb3J0RnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsUGFja2V0c1JlY2VpdmVkPW4ucGFja2V0c1NlbnQsdGhpcy5mcmVlemVkQ29uc3VtaW5nVHJhbnNwb3J0SWRzLmhhcyhlKSYmKHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmYSYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtaW5nVHJhbnNwb3J0RGVmcmVlemVkIix7dHJhbnNwb3J0SWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWluZ190cmFuc3BvcnRfc3RhdHVzIiwicmVzdW1lIixlKSkpKX1yZWdpc3RlckNvbnN1bWVyKGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt5aWVsZCB0aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5zZXQoZS5pZCx7cHJvZHVjZXJJZDplLnByb2R1Y2VySWQscGVlcklkOmUuYXBwRGF0YS5wZWVySWQsYXBwRGF0YTplLmFwcERhdGF9KSxlLm9uKCJjbG9zZSIsdGhpcy5kZXJlZ2lzdGVyQ29uc3VtZXIuYmluZCh0aGlzLGUpKSxlLm9uKCJwYXVzZSIsdGhpcy5wYXVzZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5vbigicmVzdW1lIix0aGlzLnJlc3VtZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5hcHBEYXRhLnNjcmVlblNoYXJlPT09ITAmJnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuYWRkKGUuaWQpfSl9cGF1c2VDb25zdW1lcihlKXt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLnNldChlLHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMX0pfXJlc3VtZUNvbnN1bWVyKGUpe3RoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUpfWdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAoZSxzPSExKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgbj15aWVsZCBlLmdldFN0YXRzKCksaT1zP3RoaXMuZ2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQodGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsib3V0Ym91bmQtcnRwIiwicmVtb3RlLWluYm91bmQtcnRwIl0sITEsZS5pZCkpWzBdOnZvaWQgMDtmb3IoY29uc3QgYSBvZiBuLnZhbHVlcygpKXN3aXRjaChhLnR5cGUpe2Nhc2Uib3V0Ym91bmQtcnRwIjp7dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLnNldChhLmlkLGUuaWQpO2JyZWFrfX1yZXR1cm4gaX0pfWdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSxzPSExKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgbj15aWVsZCBlLmdldFN0YXRzKCksaT1zP3RoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQodGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsiaW5ib3VuZC1ydHAiXSwhMSxlLmlkKSlbMF06dm9pZCAwO2Zvcihjb25zdCBhIG9mIG4udmFsdWVzKCkpc3dpdGNoKGEudHlwZSl7Y2FzZSJpbmJvdW5kLXJ0cCI6e3RoaXMuaW5ib3VuZENvbnN1bWVyTWFwLnNldChhLmlkLGUuaWQpO2JyZWFrfX1yZXR1cm4gaX0pfWRlcmVnaXN0ZXJQcm9kdWNlcihlKXt0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZm9yRWFjaCgocyxuKT0+e3M9PT1lLmlkJiZ0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZGVsZXRlKG4pfSksdGhpcy5wYXVzZWRQcm9kdWNlck1hcC5kZWxldGUoZS5pZCksdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5kZWxldGUoZS5pZCl9ZGVyZWdpc3RlckNvbnN1bWVyKGUpe3RoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmZvckVhY2goKHMsbik9PntzPT09ZS5pZCYmdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZGVsZXRlKG4pfSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5kZWxldGUoZS5pZCksdGhpcy5wYXVzZWRDb25zdW1lck1hcC5kZWxldGUoZS5pZCksdGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5kZWxldGUoZS5pZCl9Z2V0SWNlQ2FuZGlkYXRlU3RhdHMoZSl7dmFyIHM7cmV0dXJue2lkOmUuaWQsdHlwZTplLmNhbmRpZGF0ZVR5cGV8fGUudHlwZSxhZGRyZXNzOmUuYWRkcmVzcyxwb3J0OmUucG9ydCx1cmw6ZS51cmwscHJvdG9jb2w6KHM9ZS5yZWxheVByb3RvY29sKSE9bnVsbD9zOmUucHJvdG9jb2wsbmV0d29ya1R5cGU6ZS5uZXR3b3JrVHlwZSxyZWxhdGVkQWRkcmVzczplLnJlbGF0ZWRBZGRyZXNzLHJlbGF0ZWRQb3J0OmUucmVsYXRlZFBvcnR9fWdldFdvcmtpbmdTaW11bGNhc3RWaWRlb1N0YXRzKGUpe3JldHVybiBlLmZpbmQobj0+e2NvbnN0IGk9bi5mcmFtZXNFbmNvZGVkPjAsYT1uLnBhY2tldHNTZW50PjAsZD1uLmZyYW1lV2lkdGgmJm4uZnJhbWVIZWlnaHQ7cmV0dXJuIGkmJmEmJiEhZH0pfHxlW2UubGVuZ3RoLTFdfXBhcnNlUlRDUmVwb3J0KGUscz1bXSxuPSExLGk9dm9pZCAwLGE9dm9pZCAwKXt2YXIgcSwkLGllLGFlLENlLEllLHdlLGtlLE1lLF9lLEFlLExlLE9lO2NvbnN0IGQ9ZSxvPW5ldyBjcixoPXMubGVuZ3RoP25ldyBTZXQocyk6dm9pZCAwLGc9W10sYj1bXSxUPVtdLFY9bmV3IE1hcCxVPW5ldyBNYXA7Zm9yKGNvbnN0IG0gb2YgZC52YWx1ZXMoKSl7aWYoaCl7aWYoaC5zaXplPT09MClicmVhaztpZihoLmhhcyhtLnR5cGUpKW4mJmguZGVsZXRlKG0udHlwZSk7ZWxzZSBjb250aW51ZX1zd2l0Y2gobS50eXBlKXtjYXNlImxvY2FsLWNhbmRpZGF0ZSI6e2cucHVzaCh0aGlzLmdldEljZUNhbmRpZGF0ZVN0YXRzKG0pKTticmVha31jYXNlInJlbW90ZS1jYW5kaWRhdGUiOntiLnB1c2godGhpcy5nZXRJY2VDYW5kaWRhdGVTdGF0cyhtKSk7YnJlYWt9Y2FzZSJjYW5kaWRhdGUtcGFpciI6e2NvbnN0e25vbWluYXRlZDpjfT1tLHtzZWxlY3RlZDpsfT1tLHY9bSxCPXtub21pbmF0ZWQ6YyE9bnVsbD9jOmwsY3VycmVudFJvdW5kVHJpcFRpbWU6di5jdXJyZW50Um91bmRUcmlwVGltZSx0b3RhbFJvdW5kVHJpcFRpbWU6di50b3RhbFJvdW5kVHJpcFRpbWUsYnl0ZXNSZWNlaXZlZDp2LmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50OnYuYnl0ZXNTZW50LGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTp2LmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxhdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU6di5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsbGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wOnYubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLGxhc3RQYWNrZXRTZW50VGltZXN0YW1wOnYubGFzdFBhY2tldFNlbnRUaW1lc3RhbXAsbG9jYWxDYW5kaWRhdGVJZDp2LmxvY2FsQ2FuZGlkYXRlSWQscmVtb3RlQ2FuZGlkYXRlSWQ6di5yZW1vdGVDYW5kaWRhdGVJZCxieXRlc0Rpc2NhcmRlZE9uU2VuZDp2LmJ5dGVzRGlzY2FyZGVkT25TZW5kLHBhY2tldHNTZW50OnYucGFja2V0c1NlbnQscGFja2V0c1JlY2VpdmVkOnYucGFja2V0c1JlY2VpdmVkLHBhY2tldHNEaXNjYXJkZWRPblNlbmQ6di5wYWNrZXRzRGlzY2FyZGVkT25TZW5kfTtULnB1c2goQiksKG0ubm9taW5hdGVkPT09ITB8fG0uc2VsZWN0ZWQ9PT0hMCkmJihvLmNhbmRpZGF0ZVBhaXI9Qik7YnJlYWt9Y2FzZSJ0cmFuc3BvcnQiOntjb25zdCBjPW07YSYmKGEucHJvZHVjaW5nJiYodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdfHwodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdPXt0b3RhbFBhY2tldHNTZW50OjB9KSksYS5jb25zdW1pbmcmJih0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF18fCh0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF09e3RvdGFsUGFja2V0c1JlY2VpdmVkOjB9KSkpO2NvbnN0IGw9e2J5dGVzUmVjZWl2ZWQ6Yy5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpjLmJ5dGVzU2VudCxwYWNrZXRzU2VudDpjLnBhY2tldHNTZW50LHBhY2tldHNSZWNlaXZlZDpjLnBhY2tldHNSZWNlaXZlZCxkdGxzQ2lwaGVyOmMuZHRsc0NpcGhlcixkdGxzU3RhdGU6Yy5kdGxzU3RhdGUsaWNlUm9sZTpjLmljZVJvbGV9O2lmKG8udHJhbnNwb3J0PWwsYSl7aWYoYS5wcm9kdWNpbmcpe2NvbnN0IHY9dGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdO3RoaXMucHJvY2Vzc1Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzKGEuaWQsdixsKX1pZihhLmNvbnN1bWluZyl7Y29uc3Qgdj10aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF07dGhpcy5wcm9jZXNzQ29uc3VtaW5nVHJhbnNwb3J0U3RhdHMoYS5pZCx2LGwpfX1icmVha31jYXNlInJlbW90ZS1pbmJvdW5kLXJ0cCI6e2NvbnN0IGM9bSxsPXtqaXR0ZXI6Yy5qaXR0ZXIsZnJhY3Rpb25Mb3N0OmMuZnJhY3Rpb25Mb3N0LHJvdW5kVHJpcFRpbWU6Yy5yb3VuZFRyaXBUaW1lLHJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHM6Yy5yb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzLHRvdGFsUm91bmRUcmlwVGltZTpjLnRvdGFsUm91bmRUcmlwVGltZSxwYWNrZXRzTG9zdDpjLnBhY2tldHNMb3N0fTtvLnJlbW90ZUluYm91bmRSdHAuc2V0KGMubG9jYWxJZCxsKTticmVha31jYXNlIm91dGJvdW5kLXJ0cCI6e2lmKCF0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuaGFzKG0uaWQpKWJyZWFrO2NvbnN0IGM9bSxsPWl8fHRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5nZXQobS5pZCksdj10aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmdldChsKTtpZih2KXtpZih2Lmxhc3RSZXBvcnRDYWxjdWxhdGVkPT09ITApYnJlYWs7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5zZXQobCx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITB9KX10aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFtsXXx8KHRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW2xdPXt0b3RhbFZpZGVvUGFja2V0c1NlbnQ6MCx0b3RhbEF1ZGlvUGFja2V0c1NlbnQ6MH0pO2NvbnN0IEI9dGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbbF07aWYoWyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5tZWRpYVR5cGUpfHxbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLmtpbmQpKXtpZighdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmhhcyhtLmlkKSl7by5zdGFsZVByb2R1Y2VyU3RyZWFtTWFwPSEwO2JyZWFrfWNvbnN0IHg9dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5wcm9kdWNlcnMuZ2V0KGwpO2lmKCgocT14PT1udWxsP3ZvaWQgMDp4LnRyYWNrKT09bnVsbD92b2lkIDA6cS5yZWFkeVN0YXRlKT09PSJlbmRlZCIpYnJlYWs7by5wcm9kdWNlclN0cmVhbU1hcC5oYXMobCl8fG8ucHJvZHVjZXJTdHJlYW1NYXAuc2V0KGwse291dGJvdW5kVmlkZW9SdHBJZDpbXSxvdXRib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCB5PXtieXRlc1NlbnQ6Yy5ieXRlc1NlbnQscGFja2V0c1NlbnQ6Yy5wYWNrZXRzU2VudCxuYWNrQ291bnQ6Yy5uYWNrQ291bnQsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGFjdGl2ZTpjLmFjdGl2ZSxjb2RlY0lkOmMuY29kZWNJZCxoZWFkZXJCeXRlc1NlbnQ6Yy5oZWFkZXJCeXRlc1NlbnR8fDAsdG90YWxQYWNrZXRTZW5kRGVsYXk6Yy50b3RhbFBhY2tldFNlbmREZWxheXx8MH07aWYoYy5tZWRpYVR5cGU9PT0idmlkZW8ifHxjLmtpbmQ9PT0idmlkZW8iKXtjb25zdCBwPWMsSD1HKHtmcmFtZUhlaWdodDpwLmZyYW1lSGVpZ2h0LGZyYW1lV2lkdGg6cC5mcmFtZVdpZHRoLGZyYW1lc0VuY29kZWQ6cC5mcmFtZXNFbmNvZGVkLGZyYW1lc0Ryb3BwZWQ6cC5mcmFtZXNEcm9wcGVkLGZyYW1lc1BlclNlY29uZDpwLmZyYW1lc1BlclNlY29uZCxmcmFtZXNTZW50OnAuZnJhbWVzU2VudCxrZXlGcmFtZXNFbmNvZGVkOnAua2V5RnJhbWVzRW5jb2RlZCxmaXJDb3VudDpwLmZpckNvdW50LGVuY29kZXJJbXBsZW1lbnRhdGlvbjpwLmVuY29kZXJJbXBsZW1lbnRhdGlvbixodWdlRnJhbWVzU2VudDpwLmh1Z2VGcmFtZXNTZW50LHBsaUNvdW50OnAucGxpQ291bnQscXBTdW06cC5xcFN1bSxxdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9uczpwLnF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zLHF1YWxpdHlMaW1pdGF0aW9uUmVhc29uOnAucXVhbGl0eUxpbWl0YXRpb25SZWFzb24scXVhbGl0eUxpbWl0YXRpb25SZXNvbHV0aW9uQ2hhbmdlczpwLnF1YWxpdHlMaW1pdGF0aW9uUmVzb2x1dGlvbkNoYW5nZXMsdG90YWxFbmNvZGVUaW1lOnAudGFyZ2V0Qml0cmF0ZSx0b3RhbFBhY2tldFNlbmREZWxheTpwLnRvdGFsUGFja2V0U2VuZERlbGF5LHJldHJhbnNtaXR0ZWRCeXRlc1NlbnQ6cC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50LHJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudDpwLnJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudCxzY2FsYWJpbGl0eU1vZGU6cC5zY2FsYWJpbGl0eU1vZGUscG93ZXJFZmZpY2llbnRFbmNvZGVyOnAucG93ZXJFZmZpY2llbnRFbmNvZGVyfSx5KTtvLm91dGJvdW5kVmlkZW9SdHAuc2V0KG0uaWQsSCksby5wcm9kdWNlclN0cmVhbU1hcC5nZXQobCkub3V0Ym91bmRWaWRlb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzT3V0Ym91bmRQcm9kdWNlclZpZGVvU3RhdHMobCxCLEgpfWVsc2UgaWYoYy5tZWRpYVR5cGU9PT0iYXVkaW8ifHxjLmtpbmQ9PT0iYXVkaW8iKXtjb25zdCBwPWMsSD1HKHtyZXRyYW5zbWl0dGVkQnl0ZXNTZW50OnAucmV0cmFuc21pdHRlZEJ5dGVzU2VudCxyZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQ6cC5yZXRyYW5zbWl0dGVkUGFja2V0c1NlbnR9LHkpO28ub3V0Ym91bmRBdWRpb1J0cC5zZXQobS5pZCxIKSxvLnByb2R1Y2VyU3RyZWFtTWFwLmdldChsKS5vdXRib3VuZEF1ZGlvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NPdXRib3VuZFByb2R1Y2VyQXVkaW9TdGF0cyhsLEIsSCl9fWVsc2UgdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoYENhbGxzdGF0czogVW5rbm93biBPdXRib3VuZC1ydHAuIG1lZGlhdHlwZTogJHtjLm1lZGlhVHlwZX0ga2luZDogJHtjLmtpbmR9YCk7YnJlYWt9Y2FzZSJpbmJvdW5kLXJ0cCI6e2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMobS5pZCkpYnJlYWs7Y29uc3QgYz1tLGw9aXx8dGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZ2V0KG0uaWQpLHY9dGhpcy5wYXVzZWRDb25zdW1lck1hcC5nZXQobCk7aWYodil7aWYodi5sYXN0UmVwb3J0Q2FsY3VsYXRlZD09PSEwKWJyZWFrO3RoaXMucGF1c2VkQ29uc3VtZXJNYXAuc2V0KGwse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiEwfSl9aWYoYy5zc3JjPT09MTIzNClicmVhazt0aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFtsXXx8KHRoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW2xdPXt0b3RhbFZpZGVvUGFja2V0c1JlY2VpdmVkOjAsdG90YWxBdWRpb1BhY2tldHNSZWNlaXZlZDowfSk7Y29uc3QgQj10aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFtsXTtpZihbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLm1lZGlhVHlwZSl8fFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMua2luZCkpe2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMobS5pZCkpe28uc3RhbGVDb25zdW1lclN0cmVhbU1hcD0hMDticmVha31vLmNvbnN1bWVyU3RyZWFtTWFwLmhhcyhsKXx8by5jb25zdW1lclN0cmVhbU1hcC5zZXQobCx7aW5ib3VuZFZpZGVvUnRwSWQ6W10saW5ib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCB4PXtieXRlc1JlY2VpdmVkOmMuYnl0ZXNSZWNlaXZlZCxwYWNrZXRzUmVjZWl2ZWQ6Yy5wYWNrZXRzUmVjZWl2ZWQscGFja2V0c0xvc3Q6Yy5wYWNrZXRzTG9zdD49MD9jLnBhY2tldHNMb3N0OjAsaml0dGVyOmMuaml0dGVyLG5hY2tDb3VudDpjLm5hY2tDb3VudCxqaXR0ZXJCdWZmZXJEZWxheTpjLmppdHRlckJ1ZmZlckRlbGF5LGppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudDpjLmppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudCxsYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXA6Yy5sYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXAsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGNvZGVjSWQ6Yy5jb2RlY0lkLGhlYWRlckJ5dGVzUmVjZWl2ZWQ6Yy5oZWFkZXJCeXRlc1JlY2VpdmVkfHwwLHBhY2tldHNEaXNjYXJkZWQ6Yy5wYWNrZXRzRGlzY2FyZGVkfHwwLGppdHRlckJ1ZmZlck1pbmltdW1EZWxheTpjLmppdHRlckJ1ZmZlck1pbmltdW1EZWxheXx8MCxqaXR0ZXJCdWZmZXJUYXJnZXREZWxheTpjLmppdHRlckJ1ZmZlclRhcmdldERlbGF5fHwwfTtpZihjLm1lZGlhVHlwZT09PSJ2aWRlbyJ8fGMua2luZD09PSJ2aWRlbyIpe2NvbnN0IHk9YyxwPUcoe2ZyYW1lSGVpZ2h0OnkuZnJhbWVIZWlnaHQsZnJhbWVXaWR0aDp5LmZyYW1lV2lkdGgsZnJhbWVzRGVjb2RlZDp5LmZyYW1lc0RlY29kZWQsZnJhbWVzRHJvcHBlZDp5LmZyYW1lc0Ryb3BwZWQsZnJhbWVzUGVyU2Vjb25kOnkuZnJhbWVzUGVyU2Vjb25kLGZyYW1lc1JlY2VpdmVkOnkuZnJhbWVzUmVjZWl2ZWQsa2V5RnJhbWVzRGVjb2RlZDp5LmtleUZyYW1lc0RlY29kZWQsZmlyQ291bnQ6eS5maXJDb3VudCxkZWNvZGVySW1wbGVtZW50YXRpb246eS5kZWNvZGVySW1wbGVtZW50YXRpb24scGxpQ291bnQ6eS5wbGlDb3VudCx0b3RhbFByb2Nlc3NpbmdEZWxheTp5LnRvdGFsUHJvY2Vzc2luZ0RlbGF5LHFwU3VtOnkucXBTdW18fDAsdG90YWxBc3NlbWJseVRpbWU6eS50b3RhbEFzc2VtYmx5VGltZXx8MCx0b3RhbERlY29kZVRpbWU6eS50b3RhbERlY29kZVRpbWV8fDAsdG90YWxGcmVlemVzRHVyYXRpb246eS50b3RhbEZyZWV6ZXNEdXJhdGlvbnx8MCx0b3RhbEludGVyRnJhbWVEZWxheTp5LnRvdGFsSW50ZXJGcmFtZURlbGF5fHwwLHRvdGFsUGF1c2VzRHVyYXRpb246eS50b3RhbFBhdXNlc0R1cmF0aW9ufHwwLHRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheTp5LnRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheXx8MCxmcmVlemVDb3VudDp5LmZyZWV6ZUNvdW50fHwwLHBhdXNlQ291bnQ6eS5wYXVzZUNvdW50fHwwLHBvd2VyRWZmaWNpZW50RGVjb2Rlcjp5LnBvd2VyRWZmaWNpZW50RGVjb2Rlcn0seCk7cC5zY29yZT1zcih7ZnJhbWVXaWR0aDpwLmZyYW1lV2lkdGh8fDAsZnJhbWVzRGVjb2RlZDoocC5mcmFtZXNEZWNvZGVkfHwwKS0oKCgkPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6JC5mcmFtZXNEZWNvZGVkKXx8MCksZnJhbWVzUGVyU2Vjb25kOnAuZnJhbWVzUGVyU2Vjb25kfHwwLHBhY2tldHNMb3N0OihwLnBhY2tldHNMb3N0fHwwKS0oKChpZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOmllLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihwLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoYWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDphZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKSxqaXR0ZXI6cC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyhsKX0pLFUuc2V0KGwse3Njb3JlOisocC5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6cC5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0OnAuZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOnAuZnJhbWVzUGVyU2Vjb25kfHwwLHBhY2tldHNMb3N0UGVyY2VudGFnZTpldCh7cGFja2V0c0xvc3Q6KHAucGFja2V0c0xvc3R8fDApLSgoKENlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6Q2UucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KHAucGFja2V0c1JlY2VpdmVkfHwwKS0oKChJZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOkllLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOnAuaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXMobCksYml0cmF0ZTooKHAuYnl0ZXNSZWNlaXZlZHx8MCktKCgod2U9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDp3ZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KGwscCksby5pbmJvdW5kVmlkZW9SdHAuc2V0KG0uaWQscCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQobCkuaW5ib3VuZFZpZGVvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJWaWRlb1N0YXRzKGwsQixwKX1lbHNlIGlmKGMubWVkaWFUeXBlPT09ImF1ZGlvInx8Yy5raW5kPT09ImF1ZGlvIil7Y29uc3QgeT1jLHA9Ryh7YXVkaW9MZXZlbDp5LmF1ZGlvTGV2ZWwsY29uY2VhbGVkU2FtcGxlczp5LmNvbmNlYWxlZFNhbXBsZXMsY29uY2VhbG1lbnRFdmVudHM6eS5jb25jZWFsbWVudEV2ZW50cyx0b3RhbEF1ZGlvRW5lcmd5OnkudG90YWxBdWRpb0VuZXJneSx0b3RhbFNhbXBsZXNEdXJhdGlvbjp5LnRvdGFsU2FtcGxlc0R1cmF0aW9uLHRvdGFsU2FtcGxlc1JlY2VpdmVkOnkudG90YWxTYW1wbGVzUmVjZWl2ZWQsZmVjUGFja2V0c0Rpc2NhcmRlZDp5LmZlY1BhY2tldHNEaXNjYXJkZWR8fDAsZmVjUGFja2V0c1JlY2VpdmVkOnkuZmVjUGFja2V0c1JlY2VpdmVkfHwwLGluc2VydGVkU2FtcGxlc0ZvckRlY2VsZXJhdGlvbjp5Lmluc2VydGVkU2FtcGxlc0ZvckRlY2VsZXJhdGlvbnx8MCxyZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbjp5LnJlbW92ZWRTYW1wbGVzRm9yQWNjZWxlcmF0aW9ufHwwLHNpbGVudENvbmNlYWxlZFNhbXBsZXM6eS5zaWxlbnRDb25jZWFsZWRTYW1wbGVzfHwwLHBsYXlvdXRJZDp5LnBsYXlvdXRJZH0seCk7cC5zY29yZT1ycih7Y29uY2VhbG1lbnRFdmVudHM6KHAuY29uY2VhbG1lbnRFdmVudHN8fDApLSgoKGtlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6a2UuY29uY2VhbG1lbnRFdmVudHMpfHwwKSxwYWNrZXRzTG9zdDoocC5wYWNrZXRzTG9zdHx8MCktKCgoTWU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDpNZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDoocC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKF9lPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6X2UucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOnAuaml0dGVyfHwwfSksVS5zZXQobCx7c2NvcmU6KyhwLnNjb3JlKjEwKS50b0ZpeGVkKCkscGFja2V0c0xvc3RQZXJjZW50YWdlOmV0KHtwYWNrZXRzTG9zdDoocC5wYWNrZXRzTG9zdHx8MCktKCgoQWU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDpBZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDoocC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKExlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6TGUucGFja2V0c1JlY2VpdmVkKXx8MCl9KSxqaXR0ZXI6cC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyhsKSxiaXRyYXRlOigocC5ieXRlc1JlY2VpdmVkfHwwKS0oKChPZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOk9lLmJ5dGVzUmVjZWl2ZWQpfHwwKSkqOC83fSksdGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5zZXQobCxwKSxvLmluYm91bmRBdWRpb1J0cC5zZXQobS5pZCxwKSxvLmNvbnN1bWVyU3RyZWFtTWFwLmdldChsKS5pbmJvdW5kQXVkaW9SdHBJZC5wdXNoKG0uaWQpLHRoaXMucHJvY2Vzc0luYm91bmRDb25zdW1lckF1ZGlvU3RhdHMobCxCLHApfX1lbHNlIHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmVycm9yKGBDYWxsc3RhdHM6IFVua25vd24gSW5ib3VuZC1ydHAuIG1lZGlhdHlwZTogJHtjLm1lZGlhVHlwZX0ga2luZDogJHtjLmtpbmR9YCk7YnJlYWt9fX1pZihvLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKG0sYyk9Pnt2YXIgbCx2LEIseCx5LHAsSCxEZSxOZSxWZSxCZSxGZSx4ZSxqZSxVZSxIZSxLZSxXZSx6ZSwkZSxHZSxxZSxZZTtpZihtLm91dGJvdW5kVmlkZW9SdHBJZC5sZW5ndGg+MCl7Y29uc3QgRD1bXTttLm91dGJvdW5kVmlkZW9SdHBJZC5mb3JFYWNoKE90PT57RC5wdXNoKG8ub3V0Ym91bmRWaWRlb1J0cC5nZXQoT3QpKX0pO2NvbnN0IGs9dGhpcy5nZXRXb3JraW5nU2ltdWxjYXN0VmlkZW9TdGF0cyhEKTtrLnNjb3JlPWVyKHtmcmFtZVdpZHRoOmsuZnJhbWVXaWR0aHx8MCxmcmFtZXNQZXJTZWNvbmQ6ay5mcmFtZXNQZXJTZWNvbmR8fDAsaml0dGVyOigobD1rLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpsLmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKSxwYWNrZXRzU2VudDooay5wYWNrZXRzU2VudHx8MCktKCgodj10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnYucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChCPWsucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOkIucGFja2V0c0xvc3QpfHwwKS0oKCh5PSh4PXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6eC5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6eS5wYWNrZXRzTG9zdCl8fDApLGZyYW1lc0VuY29kZWQ6KGsuZnJhbWVzRW5jb2RlZHx8MCktKCgocD10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnAuZnJhbWVzRW5jb2RlZCl8fDApfSksVi5zZXQoYyx7c2NvcmU6KyhrLnNjb3JlKjEwKS50b0ZpeGVkKCksZnJhbWVXaWR0aDprLmZyYW1lV2lkdGh8fDAsZnJhbWVIZWlnaHQ6ay5mcmFtZUhlaWdodHx8MCxmcmFtZXNQZXJTZWNvbmQ6ay5mcmFtZXNQZXJTZWNvbmR8fDAsaml0dGVyOigoSD1rLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpILmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKSxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6WmUoe3BhY2tldHNTZW50OihrLnBhY2tldHNTZW50fHwwKS0oKChEZT10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOkRlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoTmU9ay5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6TmUucGFja2V0c0xvc3QpfHwwKS0oKChCZT0oVmU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpWZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6QmUucGFja2V0c0xvc3QpfHwwKX0pLGJpdHJhdGU6KChrLmJ5dGVzU2VudHx8MCktKCgoRmU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpGZS5ieXRlc1NlbnQpfHwwKSkqOC83LGNwdUxpbWl0YXRpb25zOmsucXVhbGl0eUxpbWl0YXRpb25SZWFzb249PT0iY3B1IixiYW5kd2lkdGhMaW1pdGF0aW9uczprLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImJhbmR3aWR0aCJ9KSx0aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLGspfWVsc2UgaWYobS5vdXRib3VuZEF1ZGlvUnRwSWQubGVuZ3RoPjApe2NvbnN0IEQ9by5vdXRib3VuZEF1ZGlvUnRwLmdldChtLm91dGJvdW5kQXVkaW9SdHBJZFswXSk7RC5zY29yZT1adCh7cGFja2V0c1NlbnQ6KEQucGFja2V0c1NlbnR8fDApLSgoKHhlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6eGUucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChqZT1ELnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpqZS5wYWNrZXRzTG9zdCl8fDApLSgoKEhlPShVZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlVlLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpIZS5wYWNrZXRzTG9zdCl8fDApLGppdHRlcjooKEtlPUQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOktlLmppdHRlcil8fDB9KSxWLnNldChjLHtzY29yZTorKEQuc2NvcmUqMTApLnRvRml4ZWQoKSxiaXRyYXRlOigoRC5ieXRlc1NlbnR8fDApLSgoKFdlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6V2UuYnl0ZXNTZW50KXx8MCkpKjgvNyxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6WmUoe3BhY2tldHNTZW50OihELnBhY2tldHNTZW50fHwwKS0oKCh6ZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnplLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoJGU9RC5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6JGUucGFja2V0c0xvc3QpfHwwKS0oKChxZT0oR2U9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpHZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6cWUucGFja2V0c0xvc3QpfHwwKX0pLGppdHRlcjooKFllPUQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOlllLmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKX0pLHRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuc2V0KGMsRCl9fSksVC5mb3JFYWNoKG09Pntjb25zdCBjPWcuZmluZCh2PT52LmlkPT09bS5sb2NhbENhbmRpZGF0ZUlkPyhtLmxvY2FsQ2FuZGlkYXRlSWQ9di5pZCx2KTpudWxsKSxsPWIuZmluZCh2PT52LmlkPT09bS5yZW1vdGVDYW5kaWRhdGVJZD8obS5yZW1vdGVDYW5kaWRhdGVJZD12LmlkLHYpOm51bGwpO2MmJihtLmxvY2FsQ2FuZGlkYXRlVHlwZT1jLnR5cGUsbS5sb2NhbENhbmRpZGF0ZUFkZHJlc3M9dGUoYy5hZGRyZXNzKSxtLmxvY2FsQ2FuZGlkYXRlUG9ydD1jLnBvcnQsbS5sb2NhbENhbmRpZGF0ZVByb3RvY29sPWMucHJvdG9jb2wsbS5sb2NhbENhbmRpZGF0ZVVybD1jLnVybCxtLmxvY2FsQ2FuZGlkYXRlTmV0d29ya1R5cGU9Yy5uZXR3b3JrVHlwZSxtLmxvY2FsQ2FuZGlkYXRlUmVsYXRlZEFkZHJlc3M9dGUoYy5yZWxhdGVkQWRkcmVzcyksbS5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRQb3J0PWMucmVsYXRlZFBvcnQpLGwmJihtLnJlbW90ZUNhbmRpZGF0ZVR5cGU9bC50eXBlLG0ucmVtb3RlQ2FuZGlkYXRlQWRkcmVzcz10ZShsLmFkZHJlc3MpLG0ucmVtb3RlQ2FuZGlkYXRlUG9ydD1sLnBvcnQsbS5yZW1vdGVDYW5kaWRhdGVQcm90b2NvbD1sLnByb3RvY29sLG0ucmVtb3RlQ2FuZGlkYXRlVXJsPWwudXJsKX0pLG8uY2FuZGlkYXRlUGFpciYmKG8udHJhbnNwb3J0PyhvLnRyYW5zcG9ydC50b3RhbFJvdW5kVHJpcFRpbWU9by5jYW5kaWRhdGVQYWlyLnRvdGFsUm91bmRUcmlwVGltZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSk6by50cmFuc3BvcnQ9e2J5dGVzUmVjZWl2ZWQ6by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50Om8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsdG90YWxSb3VuZFRyaXBUaW1lOm8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUscm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWV9KSxvLnRyYW5zcG9ydCYmKG8udHJhbnNwb3J0LmNhbmRpZGF0ZVBhaXJzPVQpLG8udHJhbnNwb3J0JiYhby50cmFuc3BvcnQucm91bmRUcmlwVGltZSl7bGV0IG09MCxjPTA7by5yZW1vdGVJbmJvdW5kUnRwLmZvckVhY2goKGwsdik9PntsLnJvdW5kVHJpcFRpbWUmJmwucm91bmRUcmlwVGltZT5tJiYobT1sLnJvdW5kVHJpcFRpbWUsYz1sLnRvdGFsUm91bmRUcmlwVGltZSl9KSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW0sby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPWN9aWYoVS5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLFUpfWNhdGNoKG0pe31pZihWLnNpemU+MCl0cnl7dGhpcy5vYnNlcnZlci5lbWl0KCJwcm9kdWNlcl9zY29yZSIsVil9Y2F0Y2gobSl7fXJldHVybiBvfWdldFByb2R1Y2Vyc1JlcG9ydChlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1lLm1hcChuPT50aGlzLmdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAobiwhMCkpO3JldHVybiBzLmxlbmd0aD4wP1Byb21pc2UuYWxsKHMpOnZvaWQgMH0pfWdldENvbnN1bWVyc1JlcG9ydChlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1lLm1hcChuPT50aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAobiwhMCkpO3JldHVybiBzLmxlbmd0aD4wP1Byb21pc2UuYWxsKHMpOnZvaWQgMH0pfWdldFRyYW5zcG9ydFJlcG9ydChlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIGUuZ2V0U3RhdHMoKX0pfWdldFByb2Nlc3NlZFN0YXRzKGUscyxuKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgaT15aWVsZCB0aGlzLmdldFRyYW5zcG9ydFJlcG9ydChlKSxhPXtwcm9kdWNpbmc6bixjb25zdW1pbmc6cyxpZDplLmlkfSxkPWksbz10aGlzLnBhcnNlUlRDUmVwb3J0KGQsWyJ0cmFuc3BvcnQiLCJjYW5kaWRhdGUtcGFpciIsImluYm91bmQtcnRwIiwib3V0Ym91bmQtcnRwIiwicmVtb3RlLWluYm91bmQtcnRwIiwibG9jYWwtY2FuZGlkYXRlIiwicmVtb3RlLWNhbmRpZGF0ZSJdLCExLHZvaWQgMCxhKTtpZighbylyZXR1cm47Y29uc3QgaD17c3RhdHM6by50cmFuc3BvcnQsdHJhbnNwb3J0SWQ6ZS5pZCxjb25zdW1pbmc6cyxwcm9kdWNpbmc6bn0sZz1vLnN0YWxlUHJvZHVjZXJTdHJlYW1NYXA/dm9pZCAwOnRoaXMuZ2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQobyksYj1vLnN0YWxlQ29uc3VtZXJTdHJlYW1NYXA/dm9pZCAwOnRoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQobyk7cmV0dXJue3RyYW5zcG9ydFJlcG9ydDpoLHByb2R1Y2VyUmVwb3J0OmcsY29uc3VtZXJSZXBvcnQ6Yn19KX1nZXRQcm9kdWNlclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBzPVtdO3RyeXtlLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKG4saSk9Pnt2YXIgYSxkO3MucHVzaCh7cHJvZHVjZXJJZDppLHZpZGVvU3RhdHM6bi5vdXRib3VuZFZpZGVvUnRwSWQubWFwKG89PmUub3V0Ym91bmRWaWRlb1J0cC5nZXQobykpLGF1ZGlvU3RhdHM6bi5vdXRib3VuZEF1ZGlvUnRwSWQubWFwKG89PmUub3V0Ym91bmRBdWRpb1J0cC5nZXQobykpLGFwcERhdGE6KChkPShhPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UucHJvZHVjZXJzKT09bnVsbD92b2lkIDA6YS5nZXQoaSkpPT1udWxsP3ZvaWQgMDpkLmFwcERhdGEpfHxudWxsfSl9KX1jYXRjaChuKXt0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0Iix7ZXJyb3I6e3JlYXNvbjpuLnJlYXNvbixtZXNzYWdlOm4ubWVzc2FnZX19KX1yZXR1cm4gc31nZXRDb25zdW1lclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBzPVtdO3RyeXtlLmNvbnN1bWVyU3RyZWFtTWFwLmZvckVhY2goKG4saSk9Pntjb25zdHtwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvfT10aGlzLmNvbnN1bWVyUGVlcklkTWFwLmdldChpKTtzLnB1c2goe2NvbnN1bWVySWQ6aSxwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvLHZpZGVvU3RhdHM6bi5pbmJvdW5kVmlkZW9SdHBJZC5tYXAoaD0+ZS5pbmJvdW5kVmlkZW9SdHAuZ2V0KGgpKSxhdWRpb1N0YXRzOm4uaW5ib3VuZEF1ZGlvUnRwSWQubWFwKGg9PmUuaW5ib3VuZEF1ZGlvUnRwLmdldChoKSl9KX0pfWNhdGNoKG4pe2NvbnNvbGUuZXJyb3IoImdldENvbnN1bWVyc1JlcG9ydDogIixuLGUpfXJldHVybiBzfWdldFVzZXJMb2NhdGlvbigpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtyZXR1cm4gbmV3IFByb21pc2UoKGUscyk9Pnt0cnl7bmF2aWdhdG9yLmdlb2xvY2F0aW9uP25hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24obj0+e2Uobil9KTpzKCl9Y2F0Y2gobil7cyhuKX19KX0pfWdldENvbm5lY3Rpdml0eShlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e2NvbnN0IHM9e2ljZVNlcnZlcnM6ZXx8YXJ9LG49bmV3IFByb21pc2UoKGcsYik9Pnt0cnl7Y29uc3QgVD1uZXcgRXMocyk7VC5hZGRMaXN0ZW5lcigiZG9uZSIsZyksVC5hZGRMaXN0ZW5lcigiZmFpbGVkIiwoKT0+e2coe2Nvbm5lY3Rpdml0eTohMX0pfSksVC5zdGFydCgyZTMpfWNhdGNoKFQpe2IoVCl9fSksaT1uZXcgUHJvbWlzZSgoZyxiKT0+e3RyeXtjb25zdCBUPW5ldyBUcyhzKTtULmFkZExpc3RlbmVyKCJkb25lIixnKSxULmFkZExpc3RlbmVyKCJmYWlsZWQiLCgpPT57Zyh7Y29ubmVjdGl2aXR5OiExfSl9KSxULnN0YXJ0KDJlMyl9Y2F0Y2goVCl7YihUKX19KSxhPW5ldyBQcm9taXNlKChnLGIpPT57dHJ5e2NvbnN0IFQ9bmV3IFJzKHMpO1QuYWRkTGlzdGVuZXIoImRvbmUiLGcpLFQuYWRkTGlzdGVuZXIoImZhaWxlZCIsKCk9PntnKHtjb25uZWN0aXZpdHk6ITF9KX0pLFQuc3RhcnQoMmUzKX1jYXRjaChUKXtiKFQpfX0pLFtkLG8saF09eWllbGQgUHJvbWlzZS5hbGwoW24saSxhXSk7cmV0dXJue2hvc3Q6ZD09bnVsbD92b2lkIDA6ZC5jb25uZWN0aXZpdHkscmVsYXk6bz09bnVsbD92b2lkIDA6by5jb25uZWN0aXZpdHkscmVmbGV4aXZlOmg9PW51bGw/dm9pZCAwOmguY29ubmVjdGl2aXR5fX1jYXRjaChzKXtyZXR1cm57aG9zdDohMSxyZWxheTohMSxyZWZsZXhpdmU6ITF9fX0pfWdldFRocm91Z2hwdXQoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RyeXtjb25zdCBuPXlpZWxkIG5ldyBQcm9taXNlKChpLGEpPT57dHJ5e2NvbnN0IGQ9e2ljZVNlcnZlcnM6ZXx8YXJ9LG89bmV3IGJzKGQpO28uYWRkTGlzdGVuZXIoImRvbmUiLGkpLG8uYWRkTGlzdGVuZXIoImZhaWxlZCIsYSksby5zdGFydCgxZTQpfWNhdGNoKGQpe2EoZCl9fSk7cmV0dXJue3Rocm91Z2hwdXQ6bi50aHJvdWdocHV0LGZyYWN0aW9uYWxMb3NzOjAsUlRUOm4uUlRULGppdHRlcjowLGJhY2tlbmRSVFQ6bi5iYWNrZW5kUlRUfX1jYXRjaChzKXtyZXR1cm59fSl9Z2V0SVBEZXRhaWxzKCl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBlLHM7dHJ5e3JldHVybiB0aGlzLmlwRGV0YWlsc3x8KHRoaXMuaXBEZXRhaWxzPXlpZWxkIGlyLmdldElQRGV0YWlscyh7cGVlcklkOihlPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDplLnBlZXJJZCxhcGlIb3N0bmFtZXM6KHM9dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOnMuYXBpSG9zdG5hbWVzLGxvZ2dlcjp0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlcn0pKSx0aGlzLmlwRGV0YWlsc31jYXRjaChuKXtyZXR1cm59fSl9Z2V0TmV0d29ya1F1YWxpdHkoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0W3Msbl09eWllbGQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0Q29ubmVjdGl2aXR5KGUpLHRoaXMuZ2V0VGhyb3VnaHB1dChlKV0pO3JldHVybntjb25uZWN0aXZpdHk6cyx0aHJvdWdocHV0Om49PW51bGw/dm9pZCAwOm4udGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczpuPT1udWxsP3ZvaWQgMDpuLmZyYWN0aW9uYWxMb3NzLFJUVDpuPT1udWxsP3ZvaWQgMDpuLlJUVCxqaXR0ZXI6bj09bnVsbD92b2lkIDA6bi5qaXR0ZXIsYmFja2VuZFJUVDpuPT1udWxsP3ZvaWQgMDpuLmJhY2tlbmRSVFR9fSl9Z2V0TmV0d29ya0luZm8oZSxzPSExKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGQsbztpZihzKXtjb25zdCBoPXlpZWxkIHRoaXMuZ2V0SVBEZXRhaWxzKCk7cmV0dXJue2lwRGV0YWlsczpoLGVmZmVjdGl2ZU5ldHdvcmtUeXBlOihkPW5hdmlnYXRvci5jb25uZWN0aW9uKT09bnVsbD92b2lkIDA6ZC5lZmZlY3RpdmVUeXBlLGxvY2F0aW9uOmghPW51bGwmJmgubG9jP29yKGg9PW51bGw/dm9pZCAwOmgubG9jKTp2b2lkIDB9fWNvbnN0W24saSxhXT15aWVsZCBQcm9taXNlLmFsbChbdGhpcy5nZXRDb25uZWN0aXZpdHkoZSksdGhpcy5nZXRUaHJvdWdocHV0KGUpLHRoaXMuZ2V0SVBEZXRhaWxzKCldKTtyZXR1cm57aXBEZXRhaWxzOmEsZWZmZWN0aXZlTmV0d29ya1R5cGU6KG89bmF2aWdhdG9yLmNvbm5lY3Rpb24pPT1udWxsP3ZvaWQgMDpvLmVmZmVjdGl2ZVR5cGUsbG9jYXRpb246YSE9bnVsbCYmYS5sb2M/b3IoYT09bnVsbD92b2lkIDA6YS5sb2MpOnZvaWQgMCx0dXJuQ29ubmVjdGl2aXR5Om4/bi5ob3N0fHxuLnJlbGF5fHxuLnJlZmxleGl2ZTohMSxjb25uZWN0aXZpdHk6bix0aHJvdWdocHV0Omk9PW51bGw/dm9pZCAwOmkudGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczppPT1udWxsP3ZvaWQgMDppLmZyYWN0aW9uYWxMb3NzLFJUVDppPT1udWxsP3ZvaWQgMDppLlJUVCxqaXR0ZXI6aT09bnVsbD92b2lkIDA6aS5qaXR0ZXIsYmFja2VuZFJUVDppPT1udWxsP3ZvaWQgMDppLmJhY2tlbmRSVFR9fSl9fWNsYXNzIENzIGV4dGVuZHMgZHJ7fWNsYXNzIGxyIGV4dGVuZHMgZHJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3UodGhpcywicHJvZHVjZXJNYXAiLG5ldyBNYXApO3UodGhpcywiY29uc3VtZXJNYXAiLG5ldyBNYXApfXJlZ2lzdGVyUHJvZHVjZXIoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMucHJvZHVjZXJNYXAuc2V0KGUuaWQsZSkseWllbGQgdGhpcy5nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKGUpLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJQcm9kdWNlci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5hZGQoZS5pZCl9KX1yZWdpc3RlckNvbnN1bWVyKGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLmNvbnN1bWVyTWFwLnNldChlLmlkLGUpLHlpZWxkIHRoaXMuZ2VuZXJhdGVDb25zdW1lclN0cmVhbU1hcChlKSx0aGlzLmNvbnN1bWVyUGVlcklkTWFwLnNldChlLmlkLHtwcm9kdWNlcklkOmUucHJvZHVjZXJJZCxwZWVySWQ6ZS5hcHBEYXRhLnBlZXJJZCxhcHBEYXRhOmUuYXBwRGF0YX0pLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlQ29uc3VtZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lQ29uc3VtZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5hZGQoZS5pZCl9KX1nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKGUscz0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49eWllbGQgZS5nZXRTdGF0cygpLGk9dGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsiaW5ib3VuZC1ydHAiXSwhMSxlLmlkKSxhPVsuLi5pLmNvbnN1bWVyU3RyZWFtTWFwLnZhbHVlcygpXVswXSxkPXM/dGhpcy5nZXRDb25zdW1lclN0YXRzRnJvbVBhcnNlZENvbnN1bWVyU3RhdHMoaSxhLGUuaWQpOnZvaWQgMDtmb3IoY29uc3QgbyBvZiBuLnZhbHVlcygpKXN3aXRjaChvLnR5cGUpe2Nhc2UiaW5ib3VuZC1ydHAiOnt0aGlzLmluYm91bmRDb25zdW1lck1hcC5zZXQoby5pZCxlLmlkKTticmVha319cmV0dXJuIGR9KX1kZXJlZ2lzdGVyUHJvZHVjZXIoZSl7dGhpcy5wcm9kdWNlck1hcC5kZWxldGUoZS5pZCksdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmZvckVhY2goKHMsbik9PntzPT09ZS5pZCYmdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmRlbGV0ZShuKX0pLHRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuZGVsZXRlKGUuaWQpfWRlcmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVyTWFwLmRlbGV0ZShlLmlkKSx0aGlzLmluYm91bmRDb25zdW1lck1hcC5mb3JFYWNoKChzLG4pPT57cz09PWUuaWQmJnRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmRlbGV0ZShuKX0pLHRoaXMuY29uc3VtZXJQZWVySWRNYXAuZGVsZXRlKGUuaWQpLHRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuZGVsZXRlKGUuaWQpfWdldEljZUNhbmRpZGF0ZVN0YXRzKGUpe3ZhciBzO3JldHVybntpZDplLmlkLHR5cGU6ZS5jYW5kaWRhdGVUeXBlfHxlLnR5cGUsYWRkcmVzczplLmFkZHJlc3MscG9ydDplLnBvcnQsdXJsOmUudXJsLHByb3RvY29sOihzPWUucmVsYXlQcm90b2NvbCkhPW51bGw/czplLnByb3RvY29sLG5ldHdvcmtUeXBlOmUubmV0d29ya1R5cGUscmVsYXRlZEFkZHJlc3M6ZS5yZWxhdGVkQWRkcmVzcyxyZWxhdGVkUG9ydDplLnJlbGF0ZWRQb3J0fX1wYXJzZVJUQ1JlcG9ydChlLHM9W10sbj0hMSxpPXZvaWQgMCxhPXZvaWQgMCl7dmFyIHEsJCxpZSxhZSxDZSxJZSx3ZSxrZSxNZSxfZSxBZSxMZSxPZTtjb25zdCBkPWUsbz1uZXcgY3IsaD1zLmxlbmd0aD9uZXcgU2V0KHMpOnZvaWQgMCxnPVtdLGI9W10sVD1bXSxWPW5ldyBNYXAsVT1uZXcgTWFwO2Zvcihjb25zdCBtIG9mIGQudmFsdWVzKCkpe2lmKGgpe2lmKGguc2l6ZT09PTApYnJlYWs7aWYoaC5oYXMobS50eXBlKSluJiZoLmRlbGV0ZShtLnR5cGUpO2Vsc2UgY29udGludWV9c3dpdGNoKG0udHlwZSl7Y2FzZSJsb2NhbC1jYW5kaWRhdGUiOntnLnB1c2godGhpcy5nZXRJY2VDYW5kaWRhdGVTdGF0cyhtKSk7YnJlYWt9Y2FzZSJyZW1vdGUtY2FuZGlkYXRlIjp7Yi5wdXNoKHRoaXMuZ2V0SWNlQ2FuZGlkYXRlU3RhdHMobSkpO2JyZWFrfWNhc2UiY2FuZGlkYXRlLXBhaXIiOntjb25zdHtub21pbmF0ZWQ6Y309bSx7c2VsZWN0ZWQ6bH09bSx2PW0sQj17bm9taW5hdGVkOmMhPW51bGw/YzpsLGN1cnJlbnRSb3VuZFRyaXBUaW1lOnYuY3VycmVudFJvdW5kVHJpcFRpbWUsdG90YWxSb3VuZFRyaXBUaW1lOnYudG90YWxSb3VuZFRyaXBUaW1lLGJ5dGVzUmVjZWl2ZWQ6di5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDp2LmJ5dGVzU2VudCxhdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU6di5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOnYuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlLGxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcDp2Lmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcCxsYXN0UGFja2V0U2VudFRpbWVzdGFtcDp2Lmxhc3RQYWNrZXRTZW50VGltZXN0YW1wLGxvY2FsQ2FuZGlkYXRlSWQ6di5sb2NhbENhbmRpZGF0ZUlkLHJlbW90ZUNhbmRpZGF0ZUlkOnYucmVtb3RlQ2FuZGlkYXRlSWQsYnl0ZXNEaXNjYXJkZWRPblNlbmQ6di5ieXRlc0Rpc2NhcmRlZE9uU2VuZCxwYWNrZXRzU2VudDp2LnBhY2tldHNTZW50LHBhY2tldHNSZWNlaXZlZDp2LnBhY2tldHNSZWNlaXZlZCxwYWNrZXRzRGlzY2FyZGVkT25TZW5kOnYucGFja2V0c0Rpc2NhcmRlZE9uU2VuZH07VC5wdXNoKEIpLChtLm5vbWluYXRlZD09PSEwfHxtLnNlbGVjdGVkPT09ITApJiYoby5jYW5kaWRhdGVQYWlyPUIpO2JyZWFrfWNhc2UidHJhbnNwb3J0Ijp7Y29uc3QgYz1tO2EmJihhLnByb2R1Y2luZyYmKHRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXXx8KHRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXT17dG90YWxQYWNrZXRzU2VudDowfSkpLGEuY29uc3VtaW5nJiYodGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdfHwodGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdPXt0b3RhbFBhY2tldHNSZWNlaXZlZDowfSkpKTtjb25zdCBsPXtieXRlc1JlY2VpdmVkOmMuYnl0ZXNSZWNlaXZlZCxieXRlc1NlbnQ6Yy5ieXRlc1NlbnQscGFja2V0c1NlbnQ6Yy5wYWNrZXRzU2VudCxwYWNrZXRzUmVjZWl2ZWQ6Yy5wYWNrZXRzUmVjZWl2ZWQsZHRsc0NpcGhlcjpjLmR0bHNDaXBoZXIsZHRsc1N0YXRlOmMuZHRsc1N0YXRlLGljZVJvbGU6Yy5pY2VSb2xlfTtpZihvLnRyYW5zcG9ydD1sLGEpe2lmKGEucHJvZHVjaW5nKXtjb25zdCB2PXRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXTt0aGlzLnByb2Nlc3NQcm9kdWNpbmdUcmFuc3BvcnRTdGF0cyhhLmlkLHYsbCl9aWYoYS5jb25zdW1pbmcpe2NvbnN0IHY9dGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdO3RoaXMucHJvY2Vzc0NvbnN1bWluZ1RyYW5zcG9ydFN0YXRzKGEuaWQsdixsKX19YnJlYWt9Y2FzZSJyZW1vdGUtaW5ib3VuZC1ydHAiOntjb25zdCBjPW0sbD17aml0dGVyOmMuaml0dGVyLGZyYWN0aW9uTG9zdDpjLmZyYWN0aW9uTG9zdCxyb3VuZFRyaXBUaW1lOmMucm91bmRUcmlwVGltZSxyb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzOmMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cyx0b3RhbFJvdW5kVHJpcFRpbWU6Yy50b3RhbFJvdW5kVHJpcFRpbWUscGFja2V0c0xvc3Q6Yy5wYWNrZXRzTG9zdH07by5yZW1vdGVJbmJvdW5kUnRwLnNldChjLmxvY2FsSWQsbCk7YnJlYWt9Y2FzZSJvdXRib3VuZC1ydHAiOntpZighdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmhhcyhtLmlkKSlicmVhaztjb25zdCBjPW0sbD1pfHx0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZ2V0KG0uaWQpLHY9dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5nZXQobCk7aWYodil7aWYodi5sYXN0UmVwb3J0Q2FsY3VsYXRlZD09PSEwKWJyZWFrO3RoaXMucGF1c2VkUHJvZHVjZXJNYXAuc2V0KGwse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiEwfSl9dGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbbF18fCh0aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFtsXT17dG90YWxWaWRlb1BhY2tldHNTZW50OjAsdG90YWxBdWRpb1BhY2tldHNTZW50OjB9KTtjb25zdCBCPXRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW2xdO2lmKFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMubWVkaWFUeXBlKXx8WyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5raW5kKSl7aWYoIXRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5oYXMobS5pZCkpe28uc3RhbGVQcm9kdWNlclN0cmVhbU1hcD0hMDticmVha31jb25zdCB4PXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UucHJvZHVjZXJzLmdldChsKTtpZigoKHE9eD09bnVsbD92b2lkIDA6eC50cmFjayk9PW51bGw/dm9pZCAwOnEucmVhZHlTdGF0ZSk9PT0iZW5kZWQiKWJyZWFrO28ucHJvZHVjZXJTdHJlYW1NYXAuaGFzKGwpfHxvLnByb2R1Y2VyU3RyZWFtTWFwLnNldChsLHtvdXRib3VuZFZpZGVvUnRwSWQ6W10sb3V0Ym91bmRBdWRpb1J0cElkOltdfSk7Y29uc3QgeT17Ynl0ZXNTZW50OmMuYnl0ZXNTZW50LHBhY2tldHNTZW50OmMucGFja2V0c1NlbnQsbmFja0NvdW50OmMubmFja0NvdW50LHNzcmM6Yy5zc3JjLG1pZDpjLm1pZCxhY3RpdmU6Yy5hY3RpdmUsY29kZWNJZDpjLmNvZGVjSWQsaGVhZGVyQnl0ZXNTZW50OmMuaGVhZGVyQnl0ZXNTZW50fHwwLHRvdGFsUGFja2V0U2VuZERlbGF5OmMudG90YWxQYWNrZXRTZW5kRGVsYXl8fDB9O2lmKGMubWVkaWFUeXBlPT09InZpZGVvInx8Yy5raW5kPT09InZpZGVvIil7Y29uc3QgcD1jLEg9Ryh7ZnJhbWVIZWlnaHQ6cC5mcmFtZUhlaWdodCxmcmFtZVdpZHRoOnAuZnJhbWVXaWR0aCxmcmFtZXNFbmNvZGVkOnAuZnJhbWVzRW5jb2RlZCxmcmFtZXNEcm9wcGVkOnAuZnJhbWVzRHJvcHBlZD9wLmZyYW1lc0Ryb3BwZWQ6cC5kcm9wcGVkRnJhbWVzLGZyYW1lc1BlclNlY29uZDpwLmZyYW1lc1BlclNlY29uZD9wLmZyYW1lc1BlclNlY29uZDpwLmZyYW1lcmF0ZU1lYW4sZnJhbWVzU2VudDpwLmZyYW1lc1NlbnQsa2V5RnJhbWVzRW5jb2RlZDpwLmtleUZyYW1lc0VuY29kZWQsZmlyQ291bnQ6cC5maXJDb3VudCxlbmNvZGVySW1wbGVtZW50YXRpb246cC5lbmNvZGVySW1wbGVtZW50YXRpb24saHVnZUZyYW1lc1NlbnQ6cC5odWdlRnJhbWVzU2VudCxwbGlDb3VudDpwLnBsaUNvdW50LHFwU3VtOnAucXBTdW0scXVhbGl0eUxpbWl0YXRpb25SZWFzb246cC5xdWFsaXR5TGltaXRhdGlvblJlYXNvbixxdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9uczpwLnF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zLHF1YWxpdHlMaW1pdGF0aW9uUmVzb2x1dGlvbkNoYW5nZXM6cC5xdWFsaXR5TGltaXRhdGlvblJlc29sdXRpb25DaGFuZ2VzLHRvdGFsRW5jb2RlVGltZTpwLnRvdGFsRW5jb2RlVGltZSx0b3RhbFBhY2tldFNlbmREZWxheTpwLnRvdGFsRW5jb2RlVGltZSxyZXRyYW5zbWl0dGVkQnl0ZXNTZW50OnAucmV0cmFuc21pdHRlZEJ5dGVzU2VudCxyZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQ6cC5yZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQsc2NhbGFiaWxpdHlNb2RlOnAuc2NhbGFiaWxpdHlNb2RlLHBvd2VyRWZmaWNpZW50RW5jb2RlcjpwLnBvd2VyRWZmaWNpZW50RW5jb2Rlcn0seSk7by5vdXRib3VuZFZpZGVvUnRwLnNldChtLmlkLEgpLG8ucHJvZHVjZXJTdHJlYW1NYXAuZ2V0KGwpLm91dGJvdW5kVmlkZW9SdHBJZC5wdXNoKG0uaWQpLHRoaXMucHJvY2Vzc091dGJvdW5kUHJvZHVjZXJWaWRlb1N0YXRzKGwsQixIKX1lbHNlIGlmKGMubWVkaWFUeXBlPT09ImF1ZGlvInx8Yy5raW5kPT09ImF1ZGlvIil7Y29uc3QgcD1jLEg9Ryh7cmV0cmFuc21pdHRlZEJ5dGVzU2VudDpwLnJldHJhbnNtaXR0ZWRCeXRlc1NlbnQscmV0cmFuc21pdHRlZFBhY2tldHNTZW50OnAucmV0cmFuc21pdHRlZFBhY2tldHNTZW50fSx5KTtvLm91dGJvdW5kQXVkaW9SdHAuc2V0KG0uaWQsSCksby5wcm9kdWNlclN0cmVhbU1hcC5nZXQobCkub3V0Ym91bmRBdWRpb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzT3V0Ym91bmRQcm9kdWNlckF1ZGlvU3RhdHMobCxCLEgpfX1lbHNlIHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmVycm9yKGBDYWxsc3RhdHM6IFVua25vd24gT3V0Ym91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfWNhc2UiaW5ib3VuZC1ydHAiOntpZighdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuaGFzKG0uaWQpKWJyZWFrO2NvbnN0IGM9bSxsPWl8fHRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmdldChtLmlkKSx2PXRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZ2V0KGwpO2lmKHYpe2lmKHYubGFzdFJlcG9ydENhbGN1bGF0ZWQ9PT0hMClicmVhazt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLnNldChsLHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMH0pfWlmKGMuc3NyYz09PTEyMzQpYnJlYWs7dGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbbF18fCh0aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFtsXT17dG90YWxWaWRlb1BhY2tldHNSZWNlaXZlZDowLHRvdGFsQXVkaW9QYWNrZXRzUmVjZWl2ZWQ6MH0pO2NvbnN0IEI9dGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbbF07aWYoWyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5tZWRpYVR5cGUpfHxbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLmtpbmQpKXtpZighdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuaGFzKG0uaWQpKXtvLnN0YWxlQ29uc3VtZXJTdHJlYW1NYXA9ITA7YnJlYWt9by5jb25zdW1lclN0cmVhbU1hcC5oYXMobCl8fG8uY29uc3VtZXJTdHJlYW1NYXAuc2V0KGwse2luYm91bmRWaWRlb1J0cElkOltdLGluYm91bmRBdWRpb1J0cElkOltdfSk7Y29uc3QgeD17Ynl0ZXNSZWNlaXZlZDpjLmJ5dGVzUmVjZWl2ZWQscGFja2V0c1JlY2VpdmVkOmMucGFja2V0c1JlY2VpdmVkLHBhY2tldHNMb3N0OmMucGFja2V0c0xvc3Q+PTA/Yy5wYWNrZXRzTG9zdDowLGppdHRlcjpjLmppdHRlcixuYWNrQ291bnQ6Yy5uYWNrQ291bnQsaml0dGVyQnVmZmVyRGVsYXk6Yy5qaXR0ZXJCdWZmZXJEZWxheSxqaXR0ZXJCdWZmZXJFbWl0dGVkQ291bnQ6Yy5qaXR0ZXJCdWZmZXJFbWl0dGVkQ291bnQsbGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wOmMubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLHNzcmM6Yy5zc3JjLG1pZDpjLm1pZCxjb2RlY0lkOmMuY29kZWNJZCxoZWFkZXJCeXRlc1JlY2VpdmVkOmMuaGVhZGVyQnl0ZXNSZWNlaXZlZHx8MCxwYWNrZXRzRGlzY2FyZGVkOmMucGFja2V0c0Rpc2NhcmRlZHx8MCxqaXR0ZXJCdWZmZXJNaW5pbXVtRGVsYXk6Yy5qaXR0ZXJCdWZmZXJNaW5pbXVtRGVsYXl8fDAsaml0dGVyQnVmZmVyVGFyZ2V0RGVsYXk6Yy5qaXR0ZXJCdWZmZXJUYXJnZXREZWxheXx8MH07aWYoYy5tZWRpYVR5cGU9PT0idmlkZW8ifHxjLmtpbmQ9PT0idmlkZW8iKXtjb25zdCB5PWMscD1HKHtmcmFtZUhlaWdodDp5LmZyYW1lSGVpZ2h0LGZyYW1lV2lkdGg6eS5mcmFtZVdpZHRoLGZyYW1lc0RlY29kZWQ6eS5mcmFtZXNEZWNvZGVkLGZyYW1lc0Ryb3BwZWQ6eS5mcmFtZXNEcm9wcGVkP3kuZnJhbWVzRHJvcHBlZDp5LmRyb3BwZWRGcmFtZXMsZnJhbWVzUGVyU2Vjb25kOnkuZnJhbWVzUGVyU2Vjb25kP3kuZnJhbWVzUGVyU2Vjb25kOnkuZnJhbWVyYXRlTWVhbixmcmFtZXNSZWNlaXZlZDp5LmZyYW1lc1JlY2VpdmVkLGtleUZyYW1lc0RlY29kZWQ6eS5rZXlGcmFtZXNEZWNvZGVkLGZpckNvdW50OnkuZmlyQ291bnQsZGVjb2RlckltcGxlbWVudGF0aW9uOnkuZGVjb2RlckltcGxlbWVudGF0aW9uLHBsaUNvdW50OnkucGxpQ291bnQsdG90YWxQcm9jZXNzaW5nRGVsYXk6eS50b3RhbFByb2Nlc3NpbmdEZWxheSxxcFN1bTp5LnFwU3VtfHwwLHRvdGFsQXNzZW1ibHlUaW1lOnkudG90YWxBc3NlbWJseVRpbWV8fDAsdG90YWxEZWNvZGVUaW1lOnkudG90YWxEZWNvZGVUaW1lfHwwLHRvdGFsRnJlZXplc0R1cmF0aW9uOnkudG90YWxGcmVlemVzRHVyYXRpb258fDAsdG90YWxJbnRlckZyYW1lRGVsYXk6eS50b3RhbEludGVyRnJhbWVEZWxheXx8MCx0b3RhbFBhdXNlc0R1cmF0aW9uOnkudG90YWxQYXVzZXNEdXJhdGlvbnx8MCx0b3RhbFNxdWFyZWRJbnRlckZyYW1lRGVsYXk6eS50b3RhbFNxdWFyZWRJbnRlckZyYW1lRGVsYXl8fDAsZnJlZXplQ291bnQ6eS5mcmVlemVDb3VudHx8MCxwYXVzZUNvdW50OnkucGF1c2VDb3VudHx8MCxwb3dlckVmZmljaWVudERlY29kZXI6eS5wb3dlckVmZmljaWVudERlY29kZXJ9LHgpO3Auc2NvcmU9c3Ioe2ZyYW1lV2lkdGg6cC5mcmFtZVdpZHRofHwwLGZyYW1lc0RlY29kZWQ6KHAuZnJhbWVzRGVjb2RlZHx8MCktKCgoJD10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOiQuZnJhbWVzRGVjb2RlZCl8fDApLGZyYW1lc1BlclNlY29uZDpwLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdDoocC5wYWNrZXRzTG9zdHx8MCktKCgoaWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDppZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDoocC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKGFlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6YWUucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOnAuaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXMobCl9KSxVLnNldChsLHtzY29yZTorKHAuc2NvcmUqMTApLnRvRml4ZWQoKSxmcmFtZVdpZHRoOnAuZnJhbWVXaWR0aHx8MCxmcmFtZUhlaWdodDpwLmZyYW1lSGVpZ2h0fHwwLGZyYW1lc1BlclNlY29uZDpwLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6ZXQoe3BhY2tldHNMb3N0OihwLnBhY2tldHNMb3N0fHwwKS0oKChDZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOkNlLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihwLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoSWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDpJZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKX0pLGppdHRlcjpwLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKGwpLGJpdHJhdGU6KChwLmJ5dGVzUmVjZWl2ZWR8fDApLSgoKHdlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6d2UuYnl0ZXNSZWNlaXZlZCl8fDApKSo4Lzd9KSx0aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLnNldChsLHApLG8uaW5ib3VuZFZpZGVvUnRwLnNldChtLmlkLHApLG8uY29uc3VtZXJTdHJlYW1NYXAuZ2V0KGwpLmluYm91bmRWaWRlb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyhsLEIscCl9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IHk9YyxwPUcoe2F1ZGlvTGV2ZWw6eS5hdWRpb0xldmVsLGNvbmNlYWxlZFNhbXBsZXM6eS5jb25jZWFsZWRTYW1wbGVzLGNvbmNlYWxtZW50RXZlbnRzOnkuY29uY2VhbG1lbnRFdmVudHMsdG90YWxBdWRpb0VuZXJneTp5LnRvdGFsQXVkaW9FbmVyZ3ksdG90YWxTYW1wbGVzRHVyYXRpb246eS50b3RhbFNhbXBsZXNEdXJhdGlvbix0b3RhbFNhbXBsZXNSZWNlaXZlZDp5LnRvdGFsU2FtcGxlc1JlY2VpdmVkLGZlY1BhY2tldHNEaXNjYXJkZWQ6eS5mZWNQYWNrZXRzRGlzY2FyZGVkfHwwLGZlY1BhY2tldHNSZWNlaXZlZDp5LmZlY1BhY2tldHNSZWNlaXZlZHx8MCxpbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb246eS5pbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb258fDAscmVtb3ZlZFNhbXBsZXNGb3JBY2NlbGVyYXRpb246eS5yZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbnx8MCxzaWxlbnRDb25jZWFsZWRTYW1wbGVzOnkuc2lsZW50Q29uY2VhbGVkU2FtcGxlc3x8MCxwbGF5b3V0SWQ6eS5wbGF5b3V0SWR9LHgpO3Auc2NvcmU9cnIoe2NvbmNlYWxtZW50RXZlbnRzOihwLmNvbmNlYWxtZW50RXZlbnRzfHwwKS0oKChrZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOmtlLmNvbmNlYWxtZW50RXZlbnRzKXx8MCkscGFja2V0c0xvc3Q6KHAucGFja2V0c0xvc3R8fDApLSgoKE1lPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6TWUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KHAucGFja2V0c1JlY2VpdmVkfHwwKS0oKChfZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOl9lLnBhY2tldHNSZWNlaXZlZCl8fDApLGppdHRlcjpwLmppdHRlcnx8MH0pLFUuc2V0KGwse3Njb3JlOisocC5zY29yZSoxMCkudG9GaXhlZCgpLHBhY2tldHNMb3N0UGVyY2VudGFnZTpldCh7cGFja2V0c0xvc3Q6KHAucGFja2V0c0xvc3R8fDApLSgoKEFlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6QWUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KHAucGFja2V0c1JlY2VpdmVkfHwwKS0oKChMZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOkxlLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOnAuaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXMobCksYml0cmF0ZTooKHAuYnl0ZXNSZWNlaXZlZHx8MCktKCgoT2U9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDpPZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KGwscCksby5pbmJvdW5kQXVkaW9SdHAuc2V0KG0uaWQscCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQobCkuaW5ib3VuZEF1ZGlvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJBdWRpb1N0YXRzKGwsQixwKX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIEluYm91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfX19aWYoby5wcm9kdWNlclN0cmVhbU1hcC5mb3JFYWNoKChtLGMpPT57dmFyIGwsdixCLHgseSxwLEgsRGUsTmUsVmUsQmUsRmUseGUsamUsVWUsSGUsS2UsV2UsemUsJGUsR2UscWUsWWU7aWYobS5vdXRib3VuZFZpZGVvUnRwSWQubGVuZ3RoPjApe2NvbnN0IEQ9W107bS5vdXRib3VuZFZpZGVvUnRwSWQuZm9yRWFjaChPdD0+e0QucHVzaChvLm91dGJvdW5kVmlkZW9SdHAuZ2V0KE90KSl9KTtjb25zdCBrPXRoaXMuZ2V0V29ya2luZ1NpbXVsY2FzdFZpZGVvU3RhdHMoRCk7ay5zY29yZT1lcih7ZnJhbWVXaWR0aDprLmZyYW1lV2lkdGh8fDAsZnJhbWVzUGVyU2Vjb25kOmsuZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKGw9ay5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6bC5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c1NlbnQ6KGsucGFja2V0c1NlbnR8fDApLSgoKHY9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDp2LnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoQj1rLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpCLnBhY2tldHNMb3N0KXx8MCktKCgoeT0oeD10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOngucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnkucGFja2V0c0xvc3QpfHwwKSxmcmFtZXNFbmNvZGVkOihrLmZyYW1lc0VuY29kZWR8fDApLSgoKHA9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpwLmZyYW1lc0VuY29kZWQpfHwwKX0pLFYuc2V0KGMse3Njb3JlOisoay5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6ay5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0OmsuZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOmsuZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKEg9ay5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6SC5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c0xvc3RQZXJjZW50YWdlOlplKHtwYWNrZXRzU2VudDooay5wYWNrZXRzU2VudHx8MCktKCgoRGU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpEZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKE5lPWsucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOk5lLnBhY2tldHNMb3N0KXx8MCktKCgoQmU9KFZlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6VmUucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOkJlLnBhY2tldHNMb3N0KXx8MCl9KSxiaXRyYXRlOigoay5ieXRlc1NlbnR8fDApLSgoKEZlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6RmUuYnl0ZXNTZW50KXx8MCkpKjgvNyxjcHVMaW1pdGF0aW9uczprLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImNwdSIsYmFuZHdpZHRoTGltaXRhdGlvbnM6ay5xdWFsaXR5TGltaXRhdGlvblJlYXNvbj09PSJiYW5kd2lkdGgifSksdGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5zZXQoYyxrKX1lbHNlIGlmKG0ub3V0Ym91bmRBdWRpb1J0cElkLmxlbmd0aD4wKXtjb25zdCBEPW8ub3V0Ym91bmRBdWRpb1J0cC5nZXQobS5vdXRib3VuZEF1ZGlvUnRwSWRbMF0pO0Quc2NvcmU9WnQoe3BhY2tldHNTZW50OihELnBhY2tldHNTZW50fHwwKS0oKCh4ZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnhlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoamU9RC5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6amUucGFja2V0c0xvc3QpfHwwKS0oKChIZT0oVWU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpVZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6SGUucGFja2V0c0xvc3QpfHwwKSxqaXR0ZXI6KChLZT1ELnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpLZS5qaXR0ZXIpfHwwfSksVi5zZXQoYyx7c2NvcmU6KyhELnNjb3JlKjEwKS50b0ZpeGVkKCksYml0cmF0ZTooKEQuYnl0ZXNTZW50fHwwKS0oKChXZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOldlLmJ5dGVzU2VudCl8fDApKSo4LzcscGFja2V0c0xvc3RQZXJjZW50YWdlOlplKHtwYWNrZXRzU2VudDooRC5wYWNrZXRzU2VudHx8MCktKCgoemU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDp6ZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKCRlPUQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOiRlLnBhY2tldHNMb3N0KXx8MCktKCgocWU9KEdlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6R2UucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnFlLnBhY2tldHNMb3N0KXx8MCl9KSxqaXR0ZXI6KChZZT1ELnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpZZS5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYyl9KSx0aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLEQpfX0pLFQuZm9yRWFjaChtPT57Y29uc3QgYz1nLmZpbmQodj0+di5pZD09PW0ubG9jYWxDYW5kaWRhdGVJZD8obS5sb2NhbENhbmRpZGF0ZUlkPXYuaWQsdik6bnVsbCksbD1iLmZpbmQodj0+di5pZD09PW0ucmVtb3RlQ2FuZGlkYXRlSWQ/KG0ucmVtb3RlQ2FuZGlkYXRlSWQ9di5pZCx2KTpudWxsKTtjJiYobS5sb2NhbENhbmRpZGF0ZVR5cGU9Yy50eXBlLG0ubG9jYWxDYW5kaWRhdGVBZGRyZXNzPXRlKGMuYWRkcmVzcyksbS5sb2NhbENhbmRpZGF0ZVBvcnQ9Yy5wb3J0LG0ubG9jYWxDYW5kaWRhdGVQcm90b2NvbD1jLnByb3RvY29sLG0ubG9jYWxDYW5kaWRhdGVVcmw9Yy51cmwsbS5sb2NhbENhbmRpZGF0ZU5ldHdvcmtUeXBlPWMubmV0d29ya1R5cGUsbS5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRBZGRyZXNzPXRlKGMucmVsYXRlZEFkZHJlc3MpLG0ubG9jYWxDYW5kaWRhdGVSZWxhdGVkUG9ydD1jLnJlbGF0ZWRQb3J0KSxsJiYobS5yZW1vdGVDYW5kaWRhdGVUeXBlPWwudHlwZSxtLnJlbW90ZUNhbmRpZGF0ZUFkZHJlc3M9dGUobC5hZGRyZXNzKSxtLnJlbW90ZUNhbmRpZGF0ZVBvcnQ9bC5wb3J0LG0ucmVtb3RlQ2FuZGlkYXRlUHJvdG9jb2w9bC5wcm90b2NvbCxtLnJlbW90ZUNhbmRpZGF0ZVVybD1sLnVybCl9KSxvLmNhbmRpZGF0ZVBhaXImJihvLnRyYW5zcG9ydD8oby50cmFuc3BvcnQuYnl0ZXNSZWNlaXZlZD1vLmNhbmRpZGF0ZVBhaXIuYnl0ZXNSZWNlaXZlZCxvLnRyYW5zcG9ydC5ieXRlc1NlbnQ9by5jYW5kaWRhdGVQYWlyLmJ5dGVzU2VudCxvLnRyYW5zcG9ydC50b3RhbFJvdW5kVHJpcFRpbWU9by5jYW5kaWRhdGVQYWlyLnRvdGFsUm91bmRUcmlwVGltZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSk6by50cmFuc3BvcnQ9e2J5dGVzUmVjZWl2ZWQ6by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50Om8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsdG90YWxSb3VuZFRyaXBUaW1lOm8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUscm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWV9KSxvLnRyYW5zcG9ydCYmKG8udHJhbnNwb3J0LmNhbmRpZGF0ZVBhaXJzPVQpLG8udHJhbnNwb3J0JiYhby50cmFuc3BvcnQucm91bmRUcmlwVGltZSl7bGV0IG09MCxjPTA7by5yZW1vdGVJbmJvdW5kUnRwLmZvckVhY2goKGwsdik9PntsLnJvdW5kVHJpcFRpbWUmJmwucm91bmRUcmlwVGltZT5tJiYobT1sLnJvdW5kVHJpcFRpbWUsYz1sLnRvdGFsUm91bmRUcmlwVGltZSl9KSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW0sby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPWN9aWYoVS5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLFUpfWNhdGNoKG0pe31pZihWLnNpemU+MCl0cnl7dGhpcy5vYnNlcnZlci5lbWl0KCJwcm9kdWNlcl9zY29yZSIsVil9Y2F0Y2gobSl7fXJldHVybiBvfWdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0KGUpe2NvbnN0IHM9W107dHJ5e2UucHJvZHVjZXJTdHJlYW1NYXAuZm9yRWFjaCgobixpKT0+e2NvbnN0IGE9dGhpcy5wcm9kdWNlck1hcC5nZXQoaSksZD1hLnRyYWNrLmdldFNldHRpbmdzKCksbz1uLm91dGJvdW5kVmlkZW9SdHBJZC5tYXAoZz0+e2NvbnN0IGI9ZS5vdXRib3VuZFZpZGVvUnRwLmdldChnKTtyZXR1cm4gYi5mcmFtZUhlaWdodHx8KGIuZnJhbWVIZWlnaHQ9ZC5oZWlnaHQsYi5mcmFtZVdpZHRoPWQud2lkdGgsYi5mcmFtZXNQZXJTZWNvbmQ9ZC5mcmFtZVJhdGUpLGJ9KSxoPXtwcm9kdWNlcklkOmksYXBwRGF0YTphLmFwcERhdGEsdmlkZW9TdGF0czpvLGF1ZGlvU3RhdHM6bi5vdXRib3VuZEF1ZGlvUnRwSWQubWFwKGc9PmUub3V0Ym91bmRBdWRpb1J0cC5nZXQoZykpfTtzLnB1c2goaCl9KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKCJnZXRQcm9kdWNlcnNSZXBvcnQ6ICIsbixlKX1yZXR1cm4gc31nZXRDb25zdW1lclN0YXRzRnJvbVBhcnNlZENvbnN1bWVyU3RhdHMoZSxzLG4pe2xldCBpO3RyeXtjb25zdHtwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvfT10aGlzLmNvbnN1bWVyUGVlcklkTWFwLmdldChuKSxoPXM9PW51bGw/dm9pZCAwOnMuaW5ib3VuZFZpZGVvUnRwSWQubWFwKGc9Pntjb25zdCBUPXRoaXMuY29uc3VtZXJNYXAuZ2V0KG4pLnRyYWNrLmdldFNldHRpbmdzKCksVj1lLmluYm91bmRWaWRlb1J0cC5nZXQoZyk7cmV0dXJuIFYuZnJhbWVIZWlnaHR8fChWLmZyYW1lSGVpZ2h0PVQuaGVpZ2h0LFYuZnJhbWVXaWR0aD1ULndpZHRoLFYuZnJhbWVzUGVyU2Vjb25kPVQuZnJhbWVSYXRlKSxWfSk7aT17Y29uc3VtZXJJZDpuLHBlZXJJZDphLHByb2R1Y2VySWQ6ZCxhcHBEYXRhOm8sdmlkZW9TdGF0czpoLGF1ZGlvU3RhdHM6cz09bnVsbD92b2lkIDA6cy5pbmJvdW5kQXVkaW9SdHBJZC5tYXAoZz0+ZS5pbmJvdW5kQXVkaW9SdHAuZ2V0KGcpKX19Y2F0Y2goYSl7Y29uc29sZS5lcnJvcigiZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzOiAiLGEsZSl9cmV0dXJuIGl9Z2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQoZSl7Y29uc3Qgcz1bXTt0cnl7ZS5jb25zdW1lclN0cmVhbU1hcC5mb3JFYWNoKChuLGkpPT57cy5wdXNoKHRoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzKGUsbixpKSl9KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKCJnZXRDb25zdW1lclN0YXRzRnJvbVJlcG9ydDogIixuLGUpfXJldHVybiBzfX1jbGFzcyBJcyBleHRlbmRzIGxye31mdW5jdGlvbiBudChyLHQsZSxzKXtpZihyIT1udWxsJiZyLmxvZ2dlciYmci5sb2dnZXIuZXJyb3IoIkNhbGxzdGF0czo6aGFuZGxlRXJyb3IiLHtlcnJvcjpzfSksdHlwZW9mIGU9PSJmdW5jdGlvbiImJnMgaW5zdGFuY2VvZiB0KWUuY2FsbChudWxsLHMscik7ZWxzZSB0aHJvdyBzfWZ1bmN0aW9uIHVyKHIsdCxlKXtjb25zdCBzPXIudmFsdWU7cmV0dXJuIHIudmFsdWU9ZnVuY3Rpb24oLi4ubil7dHJ5e2NvbnN0IGk9cy5hcHBseSh0aGlzLG4pO3JldHVybiBpJiZpIGluc3RhbmNlb2YgUHJvbWlzZT9pLmNhdGNoKGE9PntudCh0aGlzLHQsZSxhKX0pOml9Y2F0Y2goaSl7bnQodGhpcyx0LGUsaSl9cmV0dXJuIG51bGx9LHJ9Y29uc3QgST0ocix0KT0+KGUscyxuKT0+e2NvbnN0IGk9bi52YWx1ZTtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbiguLi5hKXt0cnl7Y29uc3QgZD1pLmFwcGx5KHRoaXMsYSk7cmV0dXJuIGQmJmQgaW5zdGFuY2VvZiBQcm9taXNlP2QuY2F0Y2gobz0+e250KHRoaXMscix0LG8pfSk6ZH1jYXRjaChkKXtudCh0aGlzLHIsdCxkKX1yZXR1cm4gbnVsbH0sbn0sd3M9KHIsdCk9PihlLHMsbik9PntpZihuKXJldHVybiB1cihuLHIsdCk7Zm9yKGNvbnN0IGkgb2YgUmVmbGVjdC5vd25LZXlzKGUucHJvdG90eXBlKS5maWx0ZXIoYT0+YSE9PSJjb25zdHJ1Y3RvciIpKXtjb25zdCBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZS5wcm90b3R5cGUsaSk7YS52YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsaSx1cihhLHIsdCkpfX07dmFyIFA9ZnVuY3Rpb24ocix0LGUscyl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCxpPW48Mz90OnM9PT1udWxsP3M9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpOnMsYTtpZih0eXBlb2YgUmVmbGVjdD09Im9iamVjdCImJnR5cGVvZiBSZWZsZWN0LmRlY29yYXRlPT0iZnVuY3Rpb24iKWk9UmVmbGVjdC5kZWNvcmF0ZShyLHQsZSxzKTtlbHNlIGZvcih2YXIgZD1yLmxlbmd0aC0xO2Q+PTA7ZC0tKShhPXJbZF0pJiYoaT0objwzP2EoaSk6bj4zP2EodCxlLGkpOmEodCxlKSl8fGkpO3JldHVybiBuPjMmJmkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsaSksaX07Y29uc3QgQz1jb25zb2xlO2xldCBFPWNsYXNzIGV4dGVuZHMgV3tjb25zdHJ1Y3RvcihlPSJodHRwczovL2FwaS50ZXN0aW5ndjMuZHl0ZS5pbiIscz0iQmxpbmsiLG49enQuUFJPRCxpLGEsZCxvLGgpe3N1cGVyKCk7dSh0aGlzLCJvYnNlcnZlciIpO3UodGhpcywiZXZlbnRIYW5kbGVyIik7dSh0aGlzLCJtZWFzdXJlbWVudHMiKTt1KHRoaXMsInByb2R1Y2luZ1RyYW5zcG9ydCIpO3UodGhpcywiY29uc3VtaW5nVHJhbnNwb3J0Iik7dSh0aGlzLCJwcm9kdWNlcnMiLG5ldyBNYXApO3UodGhpcywiY29uc3VtZXJzIixuZXcgTWFwKTt1KHRoaXMsImljZVNlcnZlcnMiKTt1KHRoaXMsImNvbm5lY3Rpb25JbmZvUHJvbWlzZSIpO3UodGhpcywicGluZ1N0YXRzVGltZW91dCIpO3UodGhpcywibG9nZ2VyIik7dSh0aGlzLCJlbnYiKTt1KHRoaXMsImFwaUhvc3RuYW1lcyIpO3UodGhpcywicGVlcklkIik7dSh0aGlzLCJjb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwIixuZXcgTWFwKTt1KHRoaXMsImN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMiLHt9KTtpZighaCl0aHJvdyBFcnJvcigiYXV0aFRva2VuIGlzIG1pc3NpbmcgYnV0IHJlcXVpcmVkIHRvIGluaXRpYWxpemUgQ2FsbFN0YXRzISIpO3N3aXRjaCh0aGlzLmVudj1uLHRoaXMuYXBpSG9zdG5hbWVzPW8sdGhpcy5sb2dnZXI9YSx0aGlzLnBlZXJJZD1kLHRoaXMuZXZlbnRIYW5kbGVyPW5ldyB1cyh7bG9nZ2VyOmEscGVlcklkOmQsYXBpSG9zdG5hbWVzOm8sYXV0aFRva2VuOmh9KSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjplbmdpbmVOYW1lOiAiLHtlbmdpbmVOYW1lOnN9KSxzKXtjYXNlIkJsaW5rIjp0aGlzLm1lYXN1cmVtZW50cz1uZXcgQ3M7YnJlYWs7Y2FzZSJHZWNrbyI6dGhpcy5tZWFzdXJlbWVudHM9bmV3IGxyO2JyZWFrO2Nhc2UiV2ViS2l0Ijp0aGlzLm1lYXN1cmVtZW50cz1uZXcgSXM7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihgVW5rbm93biBlbmdpbmVOYW1lISAke3N9YCl9dGhpcy5tZWFzdXJlbWVudHMuY2FsbFN0YXRzSW5zdGFuY2U9dGhpcyx0aGlzLnJlZ2lzdGVyUHJvZHVjZXI9dGhpcy5yZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyksdGhpcy5yZWdpc3RlckNvbnN1bWVyPXRoaXMucmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMpLHRoaXMub2JzZXJ2ZXI9bmV3IFcsdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oImNvbnN1bWVyX3Njb3JlIixnPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpjb25zdW1lcl9zY29yZSAke1suLi5nLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLGcpfSksdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oInByb2R1Y2VyX3Njb3JlIixnPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpwcm9kdWNlcl9zY29yZSAke1suLi5nLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLGcpfSl9cmVnaXN0ZXJJY2VTZXJ2ZXJzKGUpe3RoaXMuaWNlU2VydmVycz1lfXJlZ2lzdGVyQ29uc3VtZXIoZSl7dmFyIHM7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlLmlkKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLmlkLHt9KSx0aGlzLmNvbnN1bWVycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlckNvbnN1bWVyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyQ29uc3VtZXIiLHtjb25zdW1lcklkOmUuaWQsY29uc3VtZXJraW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlckNvbnN1bWVyLmJpbmQodGhpcyxlKSl9cmVnaXN0ZXJQcm9kdWNlcihlKXt2YXIgczt0aGlzLnByb2R1Y2Vycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlclByb2R1Y2VyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSl9c2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50KGUscyl7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLHt9KTtjb25zdCBuPXRoaXMuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcC5nZXQoZSk7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLE9iamVjdC5hc3NpZ24obixzKSl9cmVnaXN0ZXJQcm9kdWNpbmdUcmFuc3BvcnQoZSl7dmFyIG47dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9ZSxlLm9uKCJjbG9zZSIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksZS5vbigiZGlzY29ubmVjdCIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksQXJyYXkuZnJvbSgoKG49ZS5fcHJvZHVjZXJzKT09bnVsbD92b2lkIDA6bi52YWx1ZXMoKSl8fFtdKS5mb3JFYWNoKGk9Pnt0aGlzLnJlZ2lzdGVyUHJvZHVjZXIoaSl9KSxlLm9uKCJuZXdwcm9kdWNlciIsdGhpcy5yZWdpc3RlclByb2R1Y2VyKX1yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKXt2YXIgbjt0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydD1lLGUub24oImNsb3NlIix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxlLm9uKCJkaXNjb25uZWN0Iix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxBcnJheS5mcm9tKCgobj1lLl9jb25zdW1lcnMpPT1udWxsP3ZvaWQgMDpuLnZhbHVlcygpKXx8W10pLmZvckVhY2goaT0+e3RoaXMucmVnaXN0ZXJDb25zdW1lcihpKX0pLGUub24oIm5ld2NvbnN1bWVyIix0aGlzLnJlZ2lzdGVyQ29uc3VtZXIpfWRlUmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVycy5kZWxldGUoZS5pZCl9ZGVSZWdpc3RlclByb2R1Y2VyKGUpe3ZhciBzO3RoaXMucHJvZHVjZXJzLmRlbGV0ZShlLmlkKSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpkZVJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSl9ZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCgpe3RoaXMuY29uc3VtaW5nVHJhbnNwb3J0PXZvaWQgMH1kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0KCl7dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9dm9pZCAwfWNhbGxFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoZSl9c2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlPSExLHMpe3RoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlPXRoaXMubWVhc3VyZW1lbnRzLmdldE5ldHdvcmtJbmZvKHRoaXMuaWNlU2VydmVycyxlKSx0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUFJFQ0FMTF9URVNUX0JFR0lOLHRpbWVzdGFtcDpzfSksdGhpcy5jb25uZWN0aW9uSW5mb1Byb21pc2UmJnRoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlLnRoZW4obj0+e3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5QUkVDQUxMX1RFU1RfQ09NUExFVEUsbWV0YURhdGE6e2Nvbm5lY3Rpb25JbmZvOm59LHRpbWVzdGFtcDpzfSl9KX1zZW5kU2NyZWVuU2hhcmVUb2dnbGVFdmVudChlLHM9bnVsbCxuKXt0aGlzLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMuc2NyZWVuPWUsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplP1MuU0NSRUVOU0hBUkVfU1RBUlRFRDpTLlNDUkVFTlNIQVJFX1NUT1BQRUQsbWV0YURhdGE6e3NzcmM6c30sdGltZXN0YW1wOm59KX1zZW5kU2NyZWVuU2hhcmVSZXF1ZXN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuU0NSRUVOU0hBUkVfU1RBUlRfUkVRVUVTVEVELHRpbWVzdGFtcDplfSl9c2VuZEFjdGl2ZVNwZWFrZXJFdmVudChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5ET01JTkFOVF9TUEVBS0VSLG1ldGFEYXRhOntwZWVySWQ6ZX0sdGltZXN0YW1wOnN9KX1kZXZpY2VzKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OmU9PT1ZLkFVRElPJiZTLkFVRElPX0RFVklDRVNfVVBEQVRFU3x8ZT09PVkuVklERU8mJlMuVklERU9fREVWSUNFU19VUERBVEVTfHxlPT09WS5TUEVBS0VSJiZTLlNQRUFLRVJfREVWSUNFU19VUERBVEVTLG1ldGFEYXRhOntkZXZpY2VMaXN0OnN9LHRpbWVzdGFtcDpufSl9c2VsZWN0ZWREZXZpY2UoZSxzLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PVkuQVVESU8mJlMuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEV8fGU9PT1ZLlZJREVPJiZTLlNFTEVDVEVEX0NBTUVSQV9VUERBVEV8fGU9PT1ZLlNQRUFLRVImJlMuU0VMRUNURURfU1BFQUtFUl9VUERBVEUsbWV0YURhdGE6e2RldmljZTpzfSx0aW1lc3RhbXA6bn0pfW1lZGlhUGVybWlzc2lvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk1FRElBX1BFUk1JU1NJT04sbWV0YURhdGE6e2RldmljZVR5cGU6ZSxwZXJtaXNzaW9uOnN9LHRpbWVzdGFtcDpufSl9bWVkaWFQbGF5YmFja0ZhaWxlZChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PVkuQVVESU8mJlMuQVVESU9fUExBWV9GQUlMRUR8fGU9PT1ZLlZJREVPJiZTLlZJREVPX1BMQVlfRkFJTEVELG1ldGFEYXRhOntkZXZpY2VUeXBlOmV9LHRpbWVzdGFtcDpzfSl9bWVkaWFUcmFja011dGVkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplPT09WS5BVURJTyYmUy5BVURJT19UUkFDS19NVVRFRHx8ZT09PVkuVklERU8mJlMuVklERU9fVFJBQ0tfTVVURUQsbWV0YURhdGE6e2RldmljZVR5cGU6ZX0sdGltZXN0YW1wOnN9KX10YWJDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlRBQl9DSEFOR0UsbWV0YURhdGE6e2lzTWVldGluZ3NUYWJBY3RpdmU6ZX0sdGltZXN0YW1wOnN9KX1icm93c2VyQmFja2dyb3VuZGVkKGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCx0aW1lc3RhbXA6ZX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkJST1dTRVJfRk9SRUdST1VOREVELHRpbWVzdGFtcDplfSl9bGVnYWN5U3dpdGNoKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkxFR0FDWV9TV0lUQ0gsbWV0YWRhdGE6e29uOmV9LHRpbWVzdGFtcDpzfSl9Z2V0UHJlQ2FsbFRlc3RSZXN1bHRzKCl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25JbmZvUHJvbWlzZX0pfXNlbmRDYWxsSm9pbkJlZ2luRXZlbnQoZSxzKXtlPVFlKEcoe30sZSkse21lZXRpbmdFbnY6dGhpcy5lbnZ9KSxlLmRldmljZUluZm89UWUoRyh7fSxlLmRldmljZUluZm8pLHt1c2VyQWdlbnQ6bmF2aWdhdG9yLnVzZXJBZ2VudCxjcHVzOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5LG1lbW9yeTpuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5fSksdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkNBTExfSk9JTl9CRUdJTixtZXRhRGF0YTp7cGVlck1ldGFEYXRhOmV9LHRpbWVzdGFtcDpzfSl9c2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTix0aW1lc3RhbXA6c30pLG5ldyBQcm9taXNlKChpLGEpPT53KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBkPVtdO3RyeXtmb3IoY29uc3QgbyBvZiBlKXRyeXtpZihvLmljZVNlcnZlcnMmJm8uaWNlU2VydmVycy5sZW5ndGg+MCl7Y29uc3QgaD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXROZXR3b3JrUXVhbGl0eShvLmljZVNlcnZlcnMpO2QucHVzaChRZShHKHt9LG8pLHtuZXR3b3JrUmVzdWx0czpofSkpfX1jYXRjaChoKXtjb25zb2xlLndhcm4oIkVycm9yIGhhbmRsaW5nICIsaCl9aSh7cmVnaW9uRGF0YTpkfSl9Y2F0Y2gobyl7Y29uc29sZS53YXJuKCJFcnJvciBpbiBjYWxsc3RhdHMsICIsbyksYShvKX19KSkudGhlbihpPT57dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk5FVF9RVUFMSVRZX1RFU1RfRU5ELHRpbWVzdGFtcDpzLG1ldGFEYXRhOml9KX0pfXNlbmRXZWJTb2NrZXRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuV0VCU09DS0VUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuVFJBTlNQT1JUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRBdWRpb1RvZ2dsZUV2ZW50KGUscyl7dGhpcy5jdXJyZW50VXNlck1lZGlhU3RhdGVzLmF1ZGlvPWU7bGV0IG47ZT9uPVMuQVVESU9fT046bj1TLkFVRElPX09GRix0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50Om4sdGltZXN0YW1wOnN9KX1zZW5kVmlkZW9Ub2dnbGVFdmVudChlLHMpe3RoaXMuY3VycmVudFVzZXJNZWRpYVN0YXRlcy52aWRlbz1lO2xldCBuO2U/bj1TLlZJREVPX09OOm49Uy5WSURFT19PRkYsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpuLHRpbWVzdGFtcDpzfSl9c2VuZFBhcnRpY2lwYW50Um9sZVRvZ2dsZUV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBBUlRJQ0lQQU5UX1JPTEUsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXN0YXJ0UGluZ1N0YXRzKGU9N2UzKXt0aGlzLnNlbmRQaW5nU3RhdHNFdmVudCghMSxuZXcgRGF0ZSksdGhpcy5waW5nU3RhdHNUaW1lb3V0PXNldEludGVydmFsKHRoaXMuc2VuZFBpbmdTdGF0c0V2ZW50LmJpbmQodGhpcyksZSl9c3RvcFBpbmdTdGF0cygpe2NsZWFySW50ZXJ2YWwodGhpcy5waW5nU3RhdHNUaW1lb3V0KX1zZW5kUGluZ1N0YXRzRXZlbnQoZT0hMCxzKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGQsbztsZXQgbixpO2lmKHRoaXMucHJvZHVjaW5nVHJhbnNwb3J0JiYobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksIW58fCEoKGQ9bj09bnVsbD92b2lkIDA6bi5wcm9kdWNlclJlcG9ydCkhPW51bGwmJmQubGVuZ3RoKSkpe3RoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnNlbmRQaW5nU3RhdHNFdmVudDo6c3RhbGVQcm9kdWNpbmdUcmFuc3BvcnQiLHtkaXNjbGFpbWVyOiJTdGFsZSBwcm9kdWNlcj8gUmVnZW5lcmF0aW5nIFN0cmVhbSBNYXBzISJ9KTtjb25zdCBoPXlpZWxkIHRoaXMubWVhc3VyZW1lbnRzLmdldFByb2R1Y2Vyc1JlcG9ydChbLi4udGhpcy5wcm9kdWNlcnMudmFsdWVzKCldKTtuJiZoP24ucHJvZHVjZXJSZXBvcnQ9aDoobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksKCFufHwhKG4hPW51bGwmJm4ucHJvZHVjZXJSZXBvcnQpKSYmdGhpcy5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6c2VuZFBpbmdTdGF0c0V2ZW50Ojpub1Byb2R1Y2luZ1RyYW5zcG9ydFJlcG9ydCIse2Rpc2NsYWltZXI6IlN0cmVhbSBtYXBzIGludmFsaWQgZGVzcGl0ZSByZWdlbmVyYXRpbmchIn0pKX1pZih0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydCYmKGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCFpfHwhKChvPWkuY29uc3VtZXJSZXBvcnQpIT1udWxsJiZvLmxlbmd0aCkpKXt0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6OnN0YWxlQ29uc3VtaW5nVHJhbnNwb3J0Iix7ZGlzY2xhaW1lcjoiU3RhbGUgY29uc3VtZXI/IFJlZ2VuZXJhdGluZyBTdHJlYW0gTWFwcyEifSk7Y29uc3QgaD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRDb25zdW1lcnNSZXBvcnQoWy4uLnRoaXMuY29uc3VtZXJzLnZhbHVlcygpXSk7aSYmaD9pLmNvbnN1bWVyUmVwb3J0PWg6KGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCghaXx8IWkuY29uc3VtZXJSZXBvcnQpJiZ0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6Om5vQ29uc3VtaW5nVHJhbnNwb3J0UmVwb3J0Iix7ZGlzY2xhaW1lcjoiU3RyZWFtIG1hcHMgaW52YWxpZCBkZXNwaXRlIHJlZ2VuZXJhdGluZyEifSkpfWNvbnN0IGE9e3Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzOm4/bj09bnVsbD92b2lkIDA6bi50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLGNvbnN1bWluZ1RyYW5zcG9ydFN0YXRzOmk/aT09bnVsbD92b2lkIDA6aS50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLHByb2R1Y2VyU3RhdHM6W10uY29uY2F0KChuPT1udWxsP3ZvaWQgMDpuLnByb2R1Y2VyUmVwb3J0KXx8W10pLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5wcm9kdWNlclJlcG9ydCl8fFtdKSxjb25zdW1lclN0YXRzOltdLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5jb25zdW1lclJlcG9ydCl8fFtdKS5jb25jYXQoKG49PW51bGw/dm9pZCAwOm4uY29uc3VtZXJSZXBvcnQpfHxbXSl9O2lmKGUmJmEucHJvZHVjZXJTdGF0cy5sZW5ndGg9PT0wJiZhLmNvbnN1bWVyU3RhdHMubGVuZ3RoPT09MCl7eWllbGQgdGhpcy5ldmVudEhhbmRsZXIuZmx1c2goKTtyZXR1cm59dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBJTkdfU1RBVCxtZXRhRGF0YTphLHRpbWVzdGFtcDpzfSl9KX1zZW5kSVZTUGxheWVyUmVidWZmZXJFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUJVRkZFUklORyx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJBdWRpb0Jsb2NrRXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQVVESU9fQkxPQ0tFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJQbGF5YmFja0Jsb2NrZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELHRpbWVzdGFtcDplfSl9c2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVySW5pdGlhbGl6ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9JTklUSUFMSVpFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUix0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfRVJST1IsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUix0aW1lc3RhbXA6cyxtZXRhRGF0YTplfSl9c2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOnt1cGRhdGVkUGxheWJhY2tSYXRlOmV9fSl9c2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kUGxheWVyTGl2ZUxhdGVuY3koZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTElWRVNUUkVBTV9MQVRFTkNZLHRpbWVzdGFtcDpzLG1ldGFEYXRhOntsYXRlbmN5OmV9fSl9c2VuZERpc2Nvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRElTQ09OTkVDVCx0aW1lc3RhbXA6ZX0pfXNlbmRSZWNvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUkVDT05ORUNUX0FUVEVNUFQsdGltZXN0YW1wOmV9KX1leHBlY3RlZFZpZGVvUmVzb2x1dGlvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT04sdGltZXN0YW1wOm4sbWV0YURhdGE6e2ZyYW1lV2lkdGg6ZSxmcmFtZUhlaWdodDpzfX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTix0aW1lc3RhbXA6bixtZXRhRGF0YTp7ZnJhbWVXaWR0aDplLGZyYW1lSGVpZ2h0OnN9fSl9fTtQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVySWNlU2VydmVycyIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJyZWdpc3RlckNvbnN1bWVyIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVyQ29uc3VtaW5nVHJhbnNwb3J0IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsImRlUmVnaXN0ZXJDb25zdW1lciIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJkZVJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwiZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJkaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRQcmVDYWxsVGVzdEJlZ2luRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlVG9nZ2xlRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZEFjdGl2ZVNwZWFrZXJFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJkZXZpY2VzIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbGVjdGVkRGV2aWNlIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsIm1lZGlhUGVybWlzc2lvbiIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJtZWRpYVBsYXliYWNrRmFpbGVkIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsIm1lZGlhVHJhY2tNdXRlZCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJ0YWJDaGFuZ2VkIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsImJyb3dzZXJCYWNrZ3JvdW5kZWQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwiYnJvd3NlckZvcmVncm91bmRlZCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJsZWdhY3lTd2l0Y2giLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwiZ2V0UHJlQ2FsbFRlc3RSZXN1bHRzIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRDYWxsSm9pbkJlZ2luRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZFdlYlNvY2tldENvbm5lY3RlZEV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kQXVkaW9Ub2dnbGVFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kVmlkZW9Ub2dnbGVFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kUGFydGljaXBhbnRSb2xlVG9nZ2xlRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic3RhcnRQaW5nU3RhdHMiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic3RvcFBpbmdTdGF0cyIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kUGluZ1N0YXRzRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJJbml0aWFsaXplZEV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJQbGF5YmFja1JhdGVDaGFuZ2VkRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRQbGF5ZXJMaXZlTGF0ZW5jeSIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kRGlzY29ubmVjdEV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRSZWNvbm5lY3RFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJleHBlY3RlZFZpZGVvUmVzb2x1dGlvbiIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJleHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbiIsbnVsbCksRT1QKFt3cyhUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUpO3ZhciBrcz1FO2NsYXNzIHByIGV4dGVuZHMgV3tjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7dSh0aGlzLCJzdGF0cyIpO3UodGhpcywicGVlcklkIik7dSh0aGlzLCJiYWNrZW5kIik7dSh0aGlzLCJpY2VTZXJ2ZXJzIik7dSh0aGlzLCJpbml0aWFsaXplZCIsITEpO3UodGhpcywic3RhbGxlZCIsITEpO3UodGhpcywiaXBJbmZvcm1hdGlvbiIpO3UodGhpcywibG9nZ2VyIil9aW5pdGlhbGl6ZShUKXtyZXR1cm4gdyh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDplLGVuZ2luZU5hbWU6cyxlbnY6bj16dC5QUk9ELGljZVNlcnZlcnM6aSxhcGlCYXNlOmE9Imh0dHBzOi8vYXBpLmNsdXN0ZXIuZHl0ZS5pbiIsZmxhZ3M6ZCxsb2dnZXI6bz1jb25zb2xlLGFwaUhvc3RuYW1lczpoLHNraXBDb25uZWN0aXZpdHlDaGVja3M6Zz0hMSxhdXRoVG9rZW46Yn0pe3ZhciBWLFUscTt0cnl7aWYodGhpcy5wZWVySWQ9ZSx0aGlzLmxvZ2dlcj1vLCFiKXt0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjppbml0aWFsaXplIix7ZXZlbnQ6ImF1dGhfdG9rZW5fbWlzc2luZyIscGVlcklkOnRoaXMucGVlcklkfSksdGhpcy5zdGFsbENhbGxTdGF0cygpO3JldHVybn10aGlzLmlwSW5mb3JtYXRpb249eWllbGQgaXIuZ2V0SVBEZXRhaWxzKHtwZWVySWQ6ZSxhcGlIb3N0bmFtZXM6aCxsb2dnZXI6b30pLHRoaXMuYmFja2VuZD1uZXcga3MoYSxzLG4sZCxvLGUsaCxiKSx0aGlzLmljZVNlcnZlcnM9aSwoVj10aGlzLmJhY2tlbmQpPT1udWxsfHxWLnJlZ2lzdGVySWNlU2VydmVycyh0aGlzLmljZVNlcnZlcnMpLHRoaXMuaW5pdGlhbGl6ZWQ9ITAsKHE9KFU9dGhpcy5iYWNrZW5kKT09bnVsbD92b2lkIDA6VS5ldmVudEhhbmRsZXIpPT1udWxsfHxxLmVtaXQoImluaXRpYWxpemVkIix0aGlzLmlwSW5mb3JtYXRpb24pLHRoaXMuZW1pdCgiaW5pdGlhbGl6ZWQiLHRoaXMuaXBJbmZvcm1hdGlvbiksdGhpcy5zdGFydFByZUNhbGxUZXN0KGcpfWNhdGNoKCQpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OkNhbGxTdGF0c0ludGVncmF0aW9uIix7cGVlcklkOnRoaXMucGVlcklkLGVycm9yOiQgaW5zdGFuY2VvZiBFcnJvcj8kLm1lc3NhZ2U6U3RyaW5nKCQpLHN0YWNrOiQgaW5zdGFuY2VvZiBFcnJvcj8kLnN0YWNrOnZvaWQgMH0pLHRoaXMuc3RhbGxDYWxsU3RhdHMoKX19KX1jb25maWd1cmVTZW5kVHJhbnNwb3J0KGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0KGUpfSl9Y29uZmlndXJlUmVjdlRyYW5zcG9ydChlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKX0pfWNhbmRpZGF0ZVJlZ2lvbmFsTmV0d29ya1F1YWxpdHlUZXN0KGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjt0cnl7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kTmV0d29ya1F1YWxpdHlUZXN0QmVnaW5FdmVudChlLHMpfWNhdGNoKGkpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OnNlbmROZXR3b3JrUXVhbGl0eVRlc3RCZWdpbkV2ZW50Iix7ZXJyb3I6e3JlYXNvbjppLnJlYXNvbn19KX19KX0pfXJvb21Kb2luZWQoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuLGk7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQ2FsbEpvaW5CZWdpbkV2ZW50KGUscyksdGhpcy5iYWNrZW5kLChpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc3RhcnRQaW5nU3RhdHMoKX0pfSl9YXVkaW9PZmYoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRBdWRpb1RvZ2dsZUV2ZW50KCExLGUpfSl9YXVkaW9Pbigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZEF1ZGlvVG9nZ2xlRXZlbnQoITAsZSl9KX12aWRlb09mZigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFZpZGVvVG9nZ2xlRXZlbnQoITEsZSl9KX12aWRlb09uKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kVmlkZW9Ub2dnbGVFdmVudCghMCxlKX0pfWNhbGxFbmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzLG47KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zdG9wUGluZ1N0YXRzKCksKG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kRGlzY29ubmVjdEV2ZW50KGUpfSl9c2NyZWVuU2hhcmVTdGFydChlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCEwLGUscyl9KX1jb25zdW1lclNoYXJlZE1lZGlhU3RhdGUoZSxzKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQ29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlRXZlbnQoZSxzKX0pfXNjcmVlblNoYXJlU3RvcChlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCExLGUscyl9KX1zY3JlZW5TaGFyZVJlcXVlc3RlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQoZSl9KX1hY3RpdmVTcGVha2VyKGUpe2lmKGUhPT10aGlzLnBlZXJJZClyZXR1cm47Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQWN0aXZlU3BlYWtlckV2ZW50KGUscyl9KX1kZXZpY2VzKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5kZXZpY2VzKGUscyxuKX0pfXNlbGVjdGVkRGV2aWNlKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5zZWxlY3RlZERldmljZShlLHMsbil9KX1tZWRpYVBlcm1pc3Npb24oZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLm1lZGlhUGVybWlzc2lvbihlLHMsbil9KX1tZWRpYVBsYXliYWNrRmFpbGVkKGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4ubWVkaWFQbGF5YmFja0ZhaWxlZChlLHMpfSl9bWVkaWFUcmFja011dGVkKGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4ubWVkaWFUcmFja011dGVkKGUscyl9KX10YWJDaGFuZ2VkKGU9ITEpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4udGFiQ2hhbmdlZChlLHMpfSl9YnJvd3NlckJhY2tncm91bmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuYnJvd3NlckJhY2tncm91bmRlZChlKX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl9KX1sZWdhY3lTd2l0Y2goZSl7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5sZWdhY3lTd2l0Y2goZSxzKX0pfXN0YXJ0UHJlQ2FsbFRlc3QoZT0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlLHMpfSl9KX1vblByZUNhbGxUZXN0UmVzdWx0cyhlKXtyZXR1cm4gdGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uY2UoInByZWNhbGxfZW5kIixlKX0pLGV9b25SZWNlaXZpbmdDb25zdW1lckF1ZGlvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigiY29uc3VtZXJfYXVkaW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nQ29uc3VtZXJWaWRlb1N0YXR1cyhlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5ldmVudEhhbmRsZXIub24oImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsZSl9KX1vblJlY2VpdmluZ1Byb2R1Y2VyQXVkaW9TdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdQcm9kdWNlclZpZGVvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigicHJvZHVjZXJfdmlkZW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdDb25zdW1pbmdUcmFuc3BvcnRTdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsZSl9KX1vblByb2R1Y2VyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9zY29yZSIsZSl9KX1vbkNvbnN1bWVyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1lcl9zY29yZSIsZSl9KX1vblNhZmVJbml0aWFsaXphdGlvbihlKXtpZih0aGlzLmluaXRpYWxpemVkKWUodGhpcy5pcEluZm9ybWF0aW9uLCExKTtlbHNlIGlmKCF0aGlzLnN0YWxsZWQpe2NvbnN0IHM9bj0+e2UobiwhMCl9O3JldHVybiB0aGlzLm9uY2UoImluaXRpYWxpemVkIixzKSxzfXJldHVybigpPT57fX1yZW1vdmVJbml0aWFsaXphdGlvbkxpc3RlbmVyKGUpe3RoaXMucmVtb3ZlTGlzdGVuZXIoImluaXRpYWxpemVkIixlKX1zdGFsbENhbGxTdGF0cygpe3RoaXMuc3RhbGxlZD0hMCx0aGlzLnJlbW92ZUFsbExpc3RlbmVycygiaW5pdGlhbGl6ZWQiKX1pdnNQbGF5ZXJFdmVudChlLHMpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBpLGEsZCxvLGgsZyxiLFQsVixVLHE7c3dpdGNoKGUpe2Nhc2UiUGxheWVyUmVidWZmZXJpbmciOihpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJBdWRpb0Jsb2NrZWQiOihhPXRoaXMuYmFja2VuZCk9PW51bGx8fGEuc2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudChuKTticmVhaztjYXNlIlBsYXllclBsYXliYWNrQmxvY2tlZCI6KGQ9dGhpcy5iYWNrZW5kKT09bnVsbHx8ZC5zZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJOZXR3b3JrVW5hdmFpbGFibGUiOihvPXRoaXMuYmFja2VuZCk9PW51bGx8fG8uc2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KG4pO2JyZWFrO2Nhc2UiUGxheWVySW5pdGlhbGl6ZWQiOihoPXRoaXMuYmFja2VuZCk9PW51bGx8fGguc2VuZElWU1BsYXllckluaXRpYWxpemVkRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJXb3JrZXJFcnJvciI6KGc9dGhpcy5iYWNrZW5kKT09bnVsbHx8Zy5zZW5kSVZTUGxheWVyV29ya2VyRXJyb3JFdmVudChuKTticmVhaztjYXNlIlBsYXllckVycm9yIjooYj10aGlzLmJhY2tlbmQpPT1udWxsfHxiLnNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KHMsbik7YnJlYWs7Y2FzZSJQbGF5ZXJSZWNvdmVyYWJsZUVycm9yIjooVD10aGlzLmJhY2tlbmQpPT1udWxsfHxULnNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQocyxuKTticmVhaztjYXNlIlBsYXllckFuYWx5dGljc0V2ZW50IjooVj10aGlzLmJhY2tlbmQpPT1udWxsfHxWLnNlbmRJVlNQbGF5ZXJBbmFseXRpY3NFdmVudChzLG4pO2JyZWFrO2Nhc2UiUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZCI6KFU9dGhpcy5iYWNrZW5kKT09bnVsbHx8VS5zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KHMsbik7YnJlYWs7Y2FzZSJQbGF5ZXJRdWFsaXR5Q2hhbmdlZCI6KHE9dGhpcy5iYWNrZW5kKT09bnVsbHx8cS5zZW5kSVZTUGxheWVyUXVhbGl0eUNoYW5nZWQocyxuKTticmVha319KX1saXZlc3RyZWFtTGF0ZW5jeShlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRQbGF5ZXJMaXZlTGF0ZW5jeShlLHMpfSl9ZXhwZWN0ZWRWaWRlb1Jlc29sdXRpb24oZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLmV4cGVjdGVkVmlkZW9SZXNvbHV0aW9uKGUscyxuKX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5leHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbihlLHMsbil9KX19bmV3IHByKCkuc2V0TWF4TGlzdGVuZXJzKDMwKTtjbGFzcyBNc3tjb25zdHJ1Y3Rvcigpe2x0KHRoaXMsUGUsdm9pZCAwKX1nZXQgdGVsZW1ldHJ5KCl7dmFyIHQ7cmV0dXJuKHQ9USh0aGlzLFBlKSk9PW51bGw/dm9pZCAwOnQuZ2V0VmFsdWUoInRlbGVtZXRyeSIpfWluaXQodCl7ZmUodGhpcyxQZSx0KX1pbmZvKHQsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigiaW5mbyIsdCxlLHMpfWVycm9yKHQsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLHQsZSxzKX1kZWJ1Zyh0LGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oImRlYnVnIix0LGUscyl9bG9nKHQsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigibG9nIix0LGUscyl9d2Fybih0LGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oIndhcm4iLHQsZSxzKX19UGU9bmV3IFdlYWtNYXA7Y29uc3QgTHQ9Y2xhc3MgZXh0ZW5kcyBXLkV2ZW50RW1pdHRlcntjb25zdHJ1Y3RvcihlKXtzdXBlcigpO2x0KHRoaXMsWix2b2lkIDApO2x0KHRoaXMsZWUsdm9pZCAwKTt1KHRoaXMsImFzeW5jUHJvbWlzZVRpbWVvdXQiKTt1KHRoaXMsImxvZ2dlciIpO3RoaXMubG9nZ2VyPWUsZmUodGhpcyxaLG5ldyBNYXApLGZlKHRoaXMsZWUsbmV3IE1hcCksdGhpcy5hc3luY1Byb21pc2VUaW1lb3V0PThlM31lbWl0QXN5bmMoZSwuLi5zKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7USh0aGlzLFopLnNldChlLFtdKTtjb25zdCBuPVEodGhpcyxlZSkuZ2V0KGUpLm1hcCgoKT0+bmV3IFByb21pc2UoaT0+e1EodGhpcyxaKS5nZXQoZSkucHVzaChpKX0pKTtycyhMdC5wcm90b3R5cGUsdGhpcywiZW1pdCIpLmNhbGwodGhpcyxlLC4uLnMpLHlpZWxkIFByb21pc2UucmFjZShbUHJvbWlzZS5hbGwobiksbmV3IFByb21pc2UoKGksYSk9PnNldFRpbWVvdXQoKCk9PmEobmV3IEVycm9yKGBlbWl0QXN5bmMgZmFpbGVkIHRvIHJlc29sdmUgZm9yIGV2ZW50ICR7ZX0uYCkpLHRoaXMuYXN5bmNQcm9taXNlVGltZW91dCkpXSksUSh0aGlzLFopLmRlbGV0ZShlKX0pfW9uQXN5bmMoZSxzKXtjb25zdCBuPVEodGhpcyxaKSxpPSguLi5hKT0+dyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIG87dHJ5e3lpZWxkIHMoLi4uYSl9Y2F0Y2goaCl7dGhpcy5sb2dnZXIuZXJyb3IoIltvbkFzeW5jXSIse2Vycm9yOmh9KX1jb25zdCBkPShvPW4uZ2V0KGUpKT09bnVsbD92b2lkIDA6by5zaGlmdCgpO2Q9PW51bGx8fGQoKX0pO3JldHVybiBRKHRoaXMsZWUpLmdldChlKXx8USh0aGlzLGVlKS5zZXQoZSxbXSksUSh0aGlzLGVlKS5nZXQoZSkucHVzaChpKSxzdXBlci5vbihlLGkpfXJlc2V0KCl7ZmUodGhpcyxaLG5ldyBNYXApLGZlKHRoaXMsZWUsbmV3IE1hcCksc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCl9fTtsZXQgbXQ9THQ7Wj1uZXcgV2Vha01hcCxlZT1uZXcgV2Vha01hcDt2YXIgaXQsX3M9bmV3IFVpbnQ4QXJyYXkoMTYpO2Z1bmN0aW9uIEFzKCl7aWYoIWl0JiYoaXQ9dHlwZW9mIGNyeXB0byE9InVuZGVmaW5lZCImJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMmJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pfHx0eXBlb2YgbXNDcnlwdG8hPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iJiZtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byksIWl0KSl0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIGl0KF9zKX12YXIgTHM9L14oPzpbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pO2Z1bmN0aW9uIE9zKHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyImJkxzLnRlc3Qocil9Zm9yKHZhciBqPVtdLGZ0PTA7ZnQ8MjU2OysrZnQpai5wdXNoKChmdCsyNTYpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkpO2Z1bmN0aW9uIERzKHIpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTowLGU9KGpbclt0KzBdXStqW3JbdCsxXV0raltyW3QrMl1dK2pbclt0KzNdXSsiLSIraltyW3QrNF1dK2pbclt0KzVdXSsiLSIraltyW3QrNl1dK2pbclt0KzddXSsiLSIraltyW3QrOF1dK2pbclt0KzldXSsiLSIraltyW3QrMTBdXStqW3JbdCsxMV1dK2pbclt0KzEyXV0raltyW3QrMTNdXStqW3JbdCsxNF1dK2pbclt0KzE1XV0pLnRvTG93ZXJDYXNlKCk7aWYoIU9zKGUpKXRocm93IFR5cGVFcnJvcigiU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkIik7cmV0dXJuIGV9ZnVuY3Rpb24gTnMocix0LGUpe3I9cnx8e307dmFyIHM9ci5yYW5kb218fChyLnJuZ3x8QXMpKCk7aWYoc1s2XT1zWzZdJjE1fDY0LHNbOF09c1s4XSY2M3wxMjgsdCl7ZT1lfHwwO2Zvcih2YXIgbj0wO248MTY7KytuKXRbZStuXT1zW25dO3JldHVybiB0fXJldHVybiBEcyhzKX12YXIgVnM9dHlwZW9mIGdsb2JhbD09Im9iamVjdCImJmdsb2JhbCYmZ2xvYmFsLk9iamVjdD09PU9iamVjdCYmZ2xvYmFsLGhyPVZzLEJzPXR5cGVvZiBzZWxmPT0ib2JqZWN0IiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsRnM9aHJ8fEJzfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLHJlPUZzLHhzPXJlLlN5bWJvbCxhdD14cyxtcj1PYmplY3QucHJvdG90eXBlLGpzPW1yLmhhc093blByb3BlcnR5LFVzPW1yLnRvU3RyaW5nLFNlPWF0P2F0LnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBIcyhyKXt2YXIgdD1qcy5jYWxsKHIsU2UpLGU9cltTZV07dHJ5e3JbU2VdPXZvaWQgMDt2YXIgcz0hMH1jYXRjaChpKXt9dmFyIG49VXMuY2FsbChyKTtyZXR1cm4gcyYmKHQ/cltTZV09ZTpkZWxldGUgcltTZV0pLG59dmFyIEtzPU9iamVjdC5wcm90b3R5cGUsV3M9S3MudG9TdHJpbmc7ZnVuY3Rpb24genMocil7cmV0dXJuIFdzLmNhbGwocil9dmFyICRzPSJbb2JqZWN0IE51bGxdIixHcz0iW29iamVjdCBVbmRlZmluZWRdIixmcj1hdD9hdC50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24geWUocil7cmV0dXJuIHI9PW51bGw/cj09PXZvaWQgMD9HczokczpmciYmZnIgaW4gT2JqZWN0KHIpP0hzKHIpOnpzKHIpfWZ1bmN0aW9uIGd0KHIpe3JldHVybiByIT1udWxsJiZ0eXBlb2Ygcj09Im9iamVjdCJ9dmFyIHFzPUFycmF5LmlzQXJyYXksWXM9cXM7ZnVuY3Rpb24gZ3Iocil7dmFyIHQ9dHlwZW9mIHI7cmV0dXJuIHIhPW51bGwmJih0PT0ib2JqZWN0Inx8dD09ImZ1bmN0aW9uIil9dmFyIFFzPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIixKcz0iW29iamVjdCBGdW5jdGlvbl0iLFhzPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsWnM9IltvYmplY3QgUHJveHldIjtmdW5jdGlvbiBTcihyKXtpZighZ3IocikpcmV0dXJuITE7dmFyIHQ9eWUocik7cmV0dXJuIHQ9PUpzfHx0PT1Yc3x8dD09UXN8fHQ9PVpzfXZhciBlbj1yZVsiX19jb3JlLWpzX3NoYXJlZF9fIl0sU3Q9ZW4seXI9ZnVuY3Rpb24oKXt2YXIgcj0vW14uXSskLy5leGVjKFN0JiZTdC5rZXlzJiZTdC5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHI/IlN5bWJvbChzcmMpXzEuIityOiIifSgpO2Z1bmN0aW9uIHRuKHIpe3JldHVybiEheXImJnlyIGluIHJ9dmFyIHJuPUZ1bmN0aW9uLnByb3RvdHlwZSxzbj1ybi50b1N0cmluZztmdW5jdGlvbiBjZShyKXtpZihyIT1udWxsKXt0cnl7cmV0dXJuIHNuLmNhbGwocil9Y2F0Y2godCl7fXRyeXtyZXR1cm4gcisiIn1jYXRjaCh0KXt9fXJldHVybiIifXZhciBubj0vW1xcXiQuKis/KClbXF17fXxdL2csYW49L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sb249RnVuY3Rpb24ucHJvdG90eXBlLGNuPU9iamVjdC5wcm90b3R5cGUsZG49b24udG9TdHJpbmcsbG49Y24uaGFzT3duUHJvcGVydHksdW49UmVnRXhwKCJeIitkbi5jYWxsKGxuKS5yZXBsYWNlKG5uLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIHBuKHIpe2lmKCFncihyKXx8dG4ocikpcmV0dXJuITE7dmFyIHQ9U3Iocik/dW46YW47cmV0dXJuIHQudGVzdChjZShyKSl9ZnVuY3Rpb24gaG4ocix0KXtyZXR1cm4gcj09bnVsbD92b2lkIDA6clt0XX1mdW5jdGlvbiB2ZShyLHQpe3ZhciBlPWhuKHIsdCk7cmV0dXJuIHBuKGUpP2U6dm9pZCAwfXZhciBtbj12ZShyZSwiV2Vha01hcCIpLHl0PW1uLGZuPTkwMDcxOTkyNTQ3NDA5OTE7ZnVuY3Rpb24gdnIocil7cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyIiYmcj4tMSYmciUxPT0wJiZyPD1mbn1mdW5jdGlvbiBnbihyKXtyZXR1cm4gciE9bnVsbCYmdnIoci5sZW5ndGgpJiYhU3Iocil9dmFyIFNuPU9iamVjdC5wcm90b3R5cGU7ZnVuY3Rpb24gYnIocil7dmFyIHQ9ciYmci5jb25zdHJ1Y3RvcixlPXR5cGVvZiB0PT0iZnVuY3Rpb24iJiZ0LnByb3RvdHlwZXx8U247cmV0dXJuIHI9PT1lfXZhciB5bj0iW29iamVjdCBBcmd1bWVudHNdIjtmdW5jdGlvbiBFcihyKXtyZXR1cm4gZ3QocikmJnllKHIpPT15bn12YXIgVHI9T2JqZWN0LnByb3RvdHlwZSx2bj1Uci5oYXNPd25Qcm9wZXJ0eSxibj1Uci5wcm9wZXJ0eUlzRW51bWVyYWJsZSxFbj1FcihmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP0VyOmZ1bmN0aW9uKHIpe3JldHVybiBndChyKSYmdm4uY2FsbChyLCJjYWxsZWUiKSYmIWJuLmNhbGwociwiY2FsbGVlIil9LFRuPUVuO2Z1bmN0aW9uIFJuKCl7cmV0dXJuITF9dmFyIFJyPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsUHI9UnImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxQbj1QciYmUHIuZXhwb3J0cz09PVJyLENyPVBuP3JlLkJ1ZmZlcjp2b2lkIDAsQ249Q3I/Q3IuaXNCdWZmZXI6dm9pZCAwLEluPUNufHxSbix3bj1Jbixrbj0iW29iamVjdCBBcmd1bWVudHNdIixNbj0iW29iamVjdCBBcnJheV0iLF9uPSJbb2JqZWN0IEJvb2xlYW5dIixBbj0iW29iamVjdCBEYXRlXSIsTG49IltvYmplY3QgRXJyb3JdIixPbj0iW29iamVjdCBGdW5jdGlvbl0iLERuPSJbb2JqZWN0IE1hcF0iLE5uPSJbb2JqZWN0IE51bWJlcl0iLFZuPSJbb2JqZWN0IE9iamVjdF0iLEJuPSJbb2JqZWN0IFJlZ0V4cF0iLEZuPSJbb2JqZWN0IFNldF0iLHhuPSJbb2JqZWN0IFN0cmluZ10iLGpuPSJbb2JqZWN0IFdlYWtNYXBdIixVbj0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLEhuPSJbb2JqZWN0IERhdGFWaWV3XSIsS249IltvYmplY3QgRmxvYXQzMkFycmF5XSIsV249IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsem49IltvYmplY3QgSW50OEFycmF5XSIsJG49IltvYmplY3QgSW50MTZBcnJheV0iLEduPSJbb2JqZWN0IEludDMyQXJyYXldIixxbj0iW29iamVjdCBVaW50OEFycmF5XSIsWW49IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixRbj0iW29iamVjdCBVaW50MTZBcnJheV0iLEpuPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsTj17fTtOW0tuXT1OW1duXT1OW3puXT1OWyRuXT1OW0duXT1OW3FuXT1OW1luXT1OW1FuXT1OW0puXT0hMCxOW2tuXT1OW01uXT1OW1VuXT1OW19uXT1OW0huXT1OW0FuXT1OW0xuXT1OW09uXT1OW0RuXT1OW05uXT1OW1ZuXT1OW0JuXT1OW0ZuXT1OW3huXT1OW2puXT0hMTtmdW5jdGlvbiBYbihyKXtyZXR1cm4gZ3QocikmJnZyKHIubGVuZ3RoKSYmISFOW3llKHIpXX1mdW5jdGlvbiBabihyKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIodCl9fXZhciBJcj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLGJlPUlyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsZWk9YmUmJmJlLmV4cG9ydHM9PT1Jcix2dD1laSYmaHIucHJvY2Vzcyx0aT1mdW5jdGlvbigpe3RyeXt2YXIgcj1iZSYmYmUucmVxdWlyZSYmYmUucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiByfHx2dCYmdnQuYmluZGluZyYmdnQuYmluZGluZygidXRpbCIpfWNhdGNoKHQpe319KCksd3I9dGksa3I9d3ImJndyLmlzVHlwZWRBcnJheSxyaT1rcj9abihrcik6WG4sc2k9cmk7ZnVuY3Rpb24gbmkocix0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHIodChlKSl9fXZhciBpaT1uaShPYmplY3Qua2V5cyxPYmplY3QpLGFpPWlpLG9pPU9iamVjdC5wcm90b3R5cGUsY2k9b2kuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gZGkocil7aWYoIWJyKHIpKXJldHVybiBhaShyKTt2YXIgdD1bXTtmb3IodmFyIGUgaW4gT2JqZWN0KHIpKWNpLmNhbGwocixlKSYmZSE9ImNvbnN0cnVjdG9yIiYmdC5wdXNoKGUpO3JldHVybiB0fXZhciBsaT12ZShyZSwiTWFwIiksYnQ9bGksdWk9dmUocmUsIkRhdGFWaWV3IiksRXQ9dWkscGk9dmUocmUsIlByb21pc2UiKSxUdD1waSxoaT12ZShyZSwiU2V0IiksUnQ9aGksTXI9IltvYmplY3QgTWFwXSIsbWk9IltvYmplY3QgT2JqZWN0XSIsX3I9IltvYmplY3QgUHJvbWlzZV0iLEFyPSJbb2JqZWN0IFNldF0iLExyPSJbb2JqZWN0IFdlYWtNYXBdIixPcj0iW29iamVjdCBEYXRhVmlld10iLGZpPWNlKEV0KSxnaT1jZShidCksU2k9Y2UoVHQpLHlpPWNlKFJ0KSx2aT1jZSh5dCksZGU9eWU7KEV0JiZkZShuZXcgRXQobmV3IEFycmF5QnVmZmVyKDEpKSkhPU9yfHxidCYmZGUobmV3IGJ0KSE9TXJ8fFR0JiZkZShUdC5yZXNvbHZlKCkpIT1fcnx8UnQmJmRlKG5ldyBSdCkhPUFyfHx5dCYmZGUobmV3IHl0KSE9THIpJiYoZGU9ZnVuY3Rpb24ocil7dmFyIHQ9eWUociksZT10PT1taT9yLmNvbnN0cnVjdG9yOnZvaWQgMCxzPWU/Y2UoZSk6IiI7aWYocylzd2l0Y2gocyl7Y2FzZSBmaTpyZXR1cm4gT3I7Y2FzZSBnaTpyZXR1cm4gTXI7Y2FzZSBTaTpyZXR1cm4gX3I7Y2FzZSB5aTpyZXR1cm4gQXI7Y2FzZSB2aTpyZXR1cm4gTHJ9cmV0dXJuIHR9KTt2YXIgYmk9ZGUsRWk9IltvYmplY3QgTWFwXSIsVGk9IltvYmplY3QgU2V0XSIsUmk9T2JqZWN0LnByb3RvdHlwZSxQaT1SaS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBDaShyKXtpZihyPT1udWxsKXJldHVybiEwO2lmKGduKHIpJiYoWXMocil8fHR5cGVvZiByPT0ic3RyaW5nInx8dHlwZW9mIHIuc3BsaWNlPT0iZnVuY3Rpb24ifHx3bihyKXx8c2kocil8fFRuKHIpKSlyZXR1cm4hci5sZW5ndGg7dmFyIHQ9Ymkocik7aWYodD09RWl8fHQ9PVRpKXJldHVybiFyLnNpemU7aWYoYnIocikpcmV0dXJuIWRpKHIpLmxlbmd0aDtmb3IodmFyIGUgaW4gcilpZihQaS5jYWxsKHIsZSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gb3Qocil7Y29uc3QgdD17fTtyZXR1cm4gdHlwZW9mKHI9PW51bGw/dm9pZCAwOnIuY29kZSk9PSJudW1iZXIiJiYodC5jb2RlPXIuY29kZSksdHlwZW9mKHI9PW51bGw/dm9pZCAwOnIuY29kZSk9PSJzdHJpbmciJiYodC5jb2RlPXIuY29kZS5zdWJzdHJpbmcoMCwxMDApKSx0eXBlb2Yocj09bnVsbD92b2lkIDA6ci5uYW1lKT09InN0cmluZyImJih0Lm5hbWU9ci5uYW1lLnN1YnN0cmluZygwLDUwMCkpLHR5cGVvZihyPT1udWxsP3ZvaWQgMDpyLm1lc3NhZ2UpPT0ic3RyaW5nIiYmKHQubWVzc2FnZT1yLm1lc3NhZ2Uuc3Vic3RyaW5nKDAsNTAwKSksdHlwZW9mKHI9PW51bGw/dm9pZCAwOnIucmVhc29uKT09InN0cmluZyImJih0LnJlYXNvbj1yLnJlYXNvbi5zdWJzdHJpbmcoMCw1MDApKSx0eXBlb2Yocj09bnVsbD92b2lkIDA6ci5zdGFjayk9PSJzdHJpbmciJiYodC5zdGFjaz1yLnN0YWNrLnN1YnN0cmluZygwLDUwMCkpLHR9ZnVuY3Rpb24gSWkoe3NlcnZpY2VQcmVmaXg6cixiYXNlVVJJOnR9KXtyZXR1cm5gJHtyfS4ke3R9YH1jb25zdCB3aT17bG9nczoiaHR0cHM6Ly9hcGkucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20vbG9ncy9vdGVsL2xvZ3MiLG1vY2s6e3VybDoiaHR0cHM6Ly9hcGkucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20vbW9jayIsZG9tYWluOiJtb2NrLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIixhcHA6Imh0dHBzOi8vZXhhbXBsZXMucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20vbWVldGluZyIsc3RhZ2luZ0FwcDoiaHR0cHM6Ly9leGFtcGxlcy5zdGFnaW5nLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tL21lZXRpbmcifSxhcGlCYXNlOntwcm9kOiJodHRwczovL2FwaS5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSIsc3RhZ2luZzoiaHR0cHM6Ly9hcGkuc3RhZ2luZy5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSIscHJvZEFsdGVybmF0ZToiaHR0cHM6Ly9hcGkucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20ifSxiYXNlVVJJOntwcm9kOiJyZWFsdGltZS5jbG91ZGZsYXJlLmNvbSIsc3RhZ2luZzoic3RhZ2luZy5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSJ9fTtmdW5jdGlvbiBEcihyKXt2YXIgcyxuLGk7Y29uc3QgdD10eXBlb2YgbmF2aWdhdG9yIT0idW5kZWZpbmVkIiYmIW5hdmlnYXRvci5pc1JlYWN0TmF0aXZlJiZ0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmKChzPXdpbmRvdy5sb2NhdGlvbi5ob3N0KT09bnVsbD92b2lkIDA6cy5pbmNsdWRlcyh3aS5iYXNlVVJJLnN0YWdpbmcpKSxlPSEhKChpPShuPXI9PW51bGw/dm9pZCAwOnIuZ2V0VmFsdWUoIm1vZHVsZXMiKSk9PW51bGw/dm9pZCAwOm4uZGV2VG9vbHMpIT1udWxsJiZpLmxvZ3MpO3JldHVybiB0fHxlfWZ1bmN0aW9uIGtpKHIsdCl7dmFyIHM7Y29uc3QgZT0ocz1yPT1udWxsP3ZvaWQgMDpyLmdldFZhbHVlKCJ0ZWxlbWV0cnkiKSk9PW51bGw/dm9pZCAwOnMubG9nTGV2ZWw7aWYoZT09PSJvZmYiKXJldHVybiExO2lmKGUhPT0iYWxsIil7Y29uc3Qgbj1bImRlYnVnIiwibG9nIiwiaW5mbyIsIndhcm4iLCJlcnJvciJdLGk9bi5pbmRleE9mKHQudG9Mb3dlckNhc2UoKSksYT1uLmluZGV4T2YoZSk7aWYoaTxhKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIE5yKHIsdCxlPXt9KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocikuZm9yRWFjaChzPT57dmFyIGk7aWYoW251bGwsdm9pZCAwLE5hTl0uaW5jbHVkZXMocltzXSl8fHQmJigoKGk9dC5tYXRjaCgvXC4vZykpPT1udWxsP3ZvaWQgMDppLmxlbmd0aCl8fDApPj0xMClyZXR1cm47Y29uc3Qgbj10P2Ake3R9LiR7c31gOnM7dHlwZW9mIHJbc109PSJvYmplY3QiP05yKHJbc10sbixlKTpbIm51bWJlciIsInN0cmluZyIsImJvb2xlYW4iXS5pbmNsdWRlcyh0eXBlb2YgcltzXSkmJihlW25dPXJbc10pfSksZX1mdW5jdGlvbiBWcihyLHQsZT17fSxzPSIiKXtjb25zdCBuPXt9O3RyeXtjb25zdCBpPUpTT04uc3RyaW5naWZ5KGUpLGE9SlNPTi5wYXJzZShpKSxkPU5yKGEscyksbz1KU09OLnN0cmluZ2lmeShkKTtpZighKHQ9PW51bGw/dm9pZCAwOnQuc3RhcnRzV2l0aCgiW1NEUF0iKSkmJm8ubGVuZ3RoPjVlMyl7Y29uc3QgZz1gTG9nIG5hbWVkOiAiJHt0fSIgaXMgdHJ5aW5nIHRvIGxvZyBhbiBmbGF0dGVuZWQgb2JqZWN0IG9mIHNpemUgCgkJCSR7by5sZW5ndGh9IGNoYXJzIHRoYXQgaXMgYmV5b25kIHBlcm1pdHRlZCBsaW1pdCBvZiA1MDAwIGNoYXJzLiBQbGVhc2Ugb3B0aW1pemUuYDt0aHJvdyBEcihyKSYmY29uc29sZS5lcnJvcihnLHtsb2c6ZSxmbGF0dGVuZWQ6b30pLG5ldyBFcnJvcihnKX1yZXR1cm4gSlNPTi5wYXJzZShvKX1jYXRjaChpKXtjb25zdCBhPW90KGkpO25bYCR7c30uZXJyb3IubWVzc2FnZWBdPWEubWVzc2FnZXx8IiIsbltgJHtzfS5lcnJvci5zdGFja2BdPWEuc3RhY2t8fCIiLG5bYCR7c30uZXJyb3IucmVhc29uYF09YS5yZWFzb258fCIiLG5bYCR7c30uZXJyb3Iuc291cmNlYF09InNhZmVseUZsYXR0ZW5PYmpGb3JPcGVuVGVsZW1ldHJ5In1yZXR1cm4gbn1jb25zdCBNaT17IkFtYXpvbiBTaWxrIjoiYW1hem9uX3NpbGsiLCJBbmRyb2lkIEJyb3dzZXIiOiJhbmRyb2lkIixCYWRhOiJiYWRhIixCbGFja0JlcnJ5OiJibGFja2JlcnJ5IixDaHJvbWU6ImNocm9tZSIsQ2hyb21pdW06ImNocm9taXVtIixFbGVjdHJvbjoiZWxlY3Ryb24iLEVwaXBoYW55OiJlcGlwaGFueSIsRmlyZWZveDoiZmlyZWZveCIsRm9jdXM6ImZvY3VzIixHZW5lcmljOiJnZW5lcmljIiwiR29vZ2xlIFNlYXJjaCI6Imdvb2dsZV9zZWFyY2giLEdvb2dsZWJvdDoiZ29vZ2xlYm90IiwiSW50ZXJuZXQgRXhwbG9yZXIiOiJpZSIsIkstTWVsZW9uIjoia19tZWxlb24iLE1heHRob246Im1heHRob24iLCJNaWNyb3NvZnQgRWRnZSI6ImVkZ2UiLCJNWiBCcm93c2VyIjoibXoiLCJOQVZFUiBXaGFsZSBCcm93c2VyIjoibmF2ZXIiLE9wZXJhOiJvcGVyYSIsIk9wZXJhIENvYXN0Ijoib3BlcmFfY29hc3QiLFBoYW50b21KUzoicGhhbnRvbWpzIixQdWZmaW46InB1ZmZpbiIsUXVwWmlsbGE6InF1cHppbGxhIixRUToicXEiLFFRTGl0ZToicXFsaXRlIixTYWZhcmk6InNhZmFyaSIsU2FpbGZpc2g6InNhaWxmaXNoIiwiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCI6InNhbXN1bmdfaW50ZXJuZXQiLFNlYU1vbmtleToic2VhbW9ua2V5IixTbGVpcG5pcjoic2xlaXBuaXIiLFN3aW5nOiJzd2luZyIsVGl6ZW46InRpemVuIiwiVUMgQnJvd3NlciI6InVjIixWaXZhbGRpOiJ2aXZhbGRpIiwiV2ViT1MgQnJvd3NlciI6IndlYm9zIixXZUNoYXQ6IndlY2hhdCIsIllhbmRleCBCcm93c2VyIjoieWFuZGV4IixSb2t1OiJyb2t1In0sQnI9e2FtYXpvbl9zaWxrOiJBbWF6b24gU2lsayIsYW5kcm9pZDoiQW5kcm9pZCBCcm93c2VyIixiYWRhOiJCYWRhIixibGFja2JlcnJ5OiJCbGFja0JlcnJ5IixjaHJvbWU6IkNocm9tZSIsY2hyb21pdW06IkNocm9taXVtIixlbGVjdHJvbjoiRWxlY3Ryb24iLGVwaXBoYW55OiJFcGlwaGFueSIsZmlyZWZveDoiRmlyZWZveCIsZm9jdXM6IkZvY3VzIixnZW5lcmljOiJHZW5lcmljIixnb29nbGVib3Q6Ikdvb2dsZWJvdCIsZ29vZ2xlX3NlYXJjaDoiR29vZ2xlIFNlYXJjaCIsaWU6IkludGVybmV0IEV4cGxvcmVyIixrX21lbGVvbjoiSy1NZWxlb24iLG1heHRob246Ik1heHRob24iLGVkZ2U6Ik1pY3Jvc29mdCBFZGdlIixtejoiTVogQnJvd3NlciIsbmF2ZXI6Ik5BVkVSIFdoYWxlIEJyb3dzZXIiLG9wZXJhOiJPcGVyYSIsb3BlcmFfY29hc3Q6Ik9wZXJhIENvYXN0IixwaGFudG9tanM6IlBoYW50b21KUyIscHVmZmluOiJQdWZmaW4iLHF1cHppbGxhOiJRdXBaaWxsYSIscXE6IlFRIEJyb3dzZXIiLHFxbGl0ZToiUVEgQnJvd3NlciBMaXRlIixzYWZhcmk6IlNhZmFyaSIsc2FpbGZpc2g6IlNhaWxmaXNoIixzYW1zdW5nX2ludGVybmV0OiJTYW1zdW5nIEludGVybmV0IGZvciBBbmRyb2lkIixzZWFtb25rZXk6IlNlYU1vbmtleSIsc2xlaXBuaXI6IlNsZWlwbmlyIixzd2luZzoiU3dpbmciLHRpemVuOiJUaXplbiIsdWM6IlVDIEJyb3dzZXIiLHZpdmFsZGk6IlZpdmFsZGkiLHdlYm9zOiJXZWJPUyBCcm93c2VyIix3ZWNoYXQ6IldlQ2hhdCIseWFuZGV4OiJZYW5kZXggQnJvd3NlciJ9LEY9e3RhYmxldDoidGFibGV0Iixtb2JpbGU6Im1vYmlsZSIsZGVza3RvcDoiZGVza3RvcCIsdHY6InR2In0sSz17V2luZG93c1Bob25lOiJXaW5kb3dzIFBob25lIixXaW5kb3dzOiJXaW5kb3dzIixNYWNPUzoibWFjT1MiLGlPUzoiaU9TIixBbmRyb2lkOiJBbmRyb2lkIixXZWJPUzoiV2ViT1MiLEJsYWNrQmVycnk6IkJsYWNrQmVycnkiLEJhZGE6IkJhZGEiLFRpemVuOiJUaXplbiIsTGludXg6IkxpbnV4IixDaHJvbWVPUzoiQ2hyb21lIE9TIixQbGF5U3RhdGlvbjQ6IlBsYXlTdGF0aW9uIDQiLFJva3U6IlJva3UifSxzZT17RWRnZUhUTUw6IkVkZ2VIVE1MIixCbGluazoiQmxpbmsiLFRyaWRlbnQ6IlRyaWRlbnQiLFByZXN0bzoiUHJlc3RvIixHZWNrbzoiR2Vja28iLFdlYktpdDoiV2ViS2l0In07Y2xhc3MgZntzdGF0aWMgZ2V0Rmlyc3RNYXRjaCh0LGUpe2NvbnN0IHM9ZS5tYXRjaCh0KTtyZXR1cm4gcyYmcy5sZW5ndGg+MCYmc1sxXXx8IiJ9c3RhdGljIGdldFNlY29uZE1hdGNoKHQsZSl7Y29uc3Qgcz1lLm1hdGNoKHQpO3JldHVybiBzJiZzLmxlbmd0aD4xJiZzWzJdfHwiIn1zdGF0aWMgbWF0Y2hBbmRSZXR1cm5Db25zdCh0LGUscyl7aWYodC50ZXN0KGUpKXJldHVybiBzfXN0YXRpYyBnZXRXaW5kb3dzVmVyc2lvbk5hbWUodCl7c3dpdGNoKHQpe2Nhc2UiTlQiOnJldHVybiJOVCI7Y2FzZSJYUCI6cmV0dXJuIlhQIjtjYXNlIk5UIDUuMCI6cmV0dXJuIjIwMDAiO2Nhc2UiTlQgNS4xIjpyZXR1cm4iWFAiO2Nhc2UiTlQgNS4yIjpyZXR1cm4iMjAwMyI7Y2FzZSJOVCA2LjAiOnJldHVybiJWaXN0YSI7Y2FzZSJOVCA2LjEiOnJldHVybiI3IjtjYXNlIk5UIDYuMiI6cmV0dXJuIjgiO2Nhc2UiTlQgNi4zIjpyZXR1cm4iOC4xIjtjYXNlIk5UIDEwLjAiOnJldHVybiIxMCI7ZGVmYXVsdDpyZXR1cm59fXN0YXRpYyBnZXRNYWNPU1ZlcnNpb25OYW1lKHQpe2NvbnN0IGU9dC5zcGxpdCgiLiIpLnNwbGljZSgwLDIpLm1hcChzPT5wYXJzZUludChzLDEwKXx8MCk7aWYoZS5wdXNoKDApLGVbMF09PT0xMClzd2l0Y2goZVsxXSl7Y2FzZSA1OnJldHVybiJMZW9wYXJkIjtjYXNlIDY6cmV0dXJuIlNub3cgTGVvcGFyZCI7Y2FzZSA3OnJldHVybiJMaW9uIjtjYXNlIDg6cmV0dXJuIk1vdW50YWluIExpb24iO2Nhc2UgOTpyZXR1cm4iTWF2ZXJpY2tzIjtjYXNlIDEwOnJldHVybiJZb3NlbWl0ZSI7Y2FzZSAxMTpyZXR1cm4iRWwgQ2FwaXRhbiI7Y2FzZSAxMjpyZXR1cm4iU2llcnJhIjtjYXNlIDEzOnJldHVybiJIaWdoIFNpZXJyYSI7Y2FzZSAxNDpyZXR1cm4iTW9qYXZlIjtjYXNlIDE1OnJldHVybiJDYXRhbGluYSI7ZGVmYXVsdDpyZXR1cm59fXN0YXRpYyBnZXRBbmRyb2lkVmVyc2lvbk5hbWUodCl7Y29uc3QgZT10LnNwbGl0KCIuIikuc3BsaWNlKDAsMikubWFwKHM9PnBhcnNlSW50KHMsMTApfHwwKTtpZihlLnB1c2goMCksIShlWzBdPT09MSYmZVsxXTw1KSl7aWYoZVswXT09PTEmJmVbMV08NilyZXR1cm4iQ3VwY2FrZSI7aWYoZVswXT09PTEmJmVbMV0+PTYpcmV0dXJuIkRvbnV0IjtpZihlWzBdPT09MiYmZVsxXTwyKXJldHVybiJFY2xhaXIiO2lmKGVbMF09PT0yJiZlWzFdPT09MilyZXR1cm4iRnJveW8iO2lmKGVbMF09PT0yJiZlWzFdPjIpcmV0dXJuIkdpbmdlcmJyZWFkIjtpZihlWzBdPT09MylyZXR1cm4iSG9uZXljb21iIjtpZihlWzBdPT09NCYmZVsxXTwxKXJldHVybiJJY2UgQ3JlYW0gU2FuZHdpY2giO2lmKGVbMF09PT00JiZlWzFdPDQpcmV0dXJuIkplbGx5IEJlYW4iO2lmKGVbMF09PT00JiZlWzFdPj00KXJldHVybiJLaXRLYXQiO2lmKGVbMF09PT01KXJldHVybiJMb2xsaXBvcCI7aWYoZVswXT09PTYpcmV0dXJuIk1hcnNobWFsbG93IjtpZihlWzBdPT09NylyZXR1cm4iTm91Z2F0IjtpZihlWzBdPT09OClyZXR1cm4iT3JlbyI7aWYoZVswXT09PTkpcmV0dXJuIlBpZSJ9fXN0YXRpYyBnZXRWZXJzaW9uUHJlY2lzaW9uKHQpe3JldHVybiB0LnNwbGl0KCIuIikubGVuZ3RofXN0YXRpYyBjb21wYXJlVmVyc2lvbnModCxlLHM9ITEpe2NvbnN0IG49Zi5nZXRWZXJzaW9uUHJlY2lzaW9uKHQpLGk9Zi5nZXRWZXJzaW9uUHJlY2lzaW9uKGUpO2xldCBhPU1hdGgubWF4KG4saSksZD0wO2NvbnN0IG89Zi5tYXAoW3QsZV0saD0+e2NvbnN0IGc9YS1mLmdldFZlcnNpb25QcmVjaXNpb24oaCksYj1oK25ldyBBcnJheShnKzEpLmpvaW4oIi4wIik7cmV0dXJuIGYubWFwKGIuc3BsaXQoIi4iKSxUPT5uZXcgQXJyYXkoMjAtVC5sZW5ndGgpLmpvaW4oIjAiKStUKS5yZXZlcnNlKCl9KTtmb3IocyYmKGQ9YS1NYXRoLm1pbihuLGkpKSxhLT0xO2E+PWQ7KXtpZihvWzBdW2FdPm9bMV1bYV0pcmV0dXJuIDE7aWYob1swXVthXT09PW9bMV1bYV0pe2lmKGE9PT1kKXJldHVybiAwO2EtPTF9ZWxzZSBpZihvWzBdW2FdPG9bMV1bYV0pcmV0dXJuLTF9fXN0YXRpYyBtYXAodCxlKXtjb25zdCBzPVtdO2xldCBuO2lmKEFycmF5LnByb3RvdHlwZS5tYXApcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbCh0LGUpO2ZvcihuPTA7bjx0Lmxlbmd0aDtuKz0xKXMucHVzaChlKHRbbl0pKTtyZXR1cm4gc31zdGF0aWMgZmluZCh0LGUpe2xldCBzLG47aWYoQXJyYXkucHJvdG90eXBlLmZpbmQpcmV0dXJuIEFycmF5LnByb3RvdHlwZS5maW5kLmNhbGwodCxlKTtmb3Iocz0wLG49dC5sZW5ndGg7czxuO3MrPTEpe2NvbnN0IGk9dFtzXTtpZihlKGkscykpcmV0dXJuIGl9fXN0YXRpYyBhc3NpZ24odCwuLi5lKXtjb25zdCBzPXQ7bGV0IG4saTtpZihPYmplY3QuYXNzaWduKXJldHVybiBPYmplY3QuYXNzaWduKHQsLi4uZSk7Zm9yKG49MCxpPWUubGVuZ3RoO248aTtuKz0xKXtjb25zdCBhPWVbbl07dHlwZW9mIGE9PSJvYmplY3QiJiZhIT09bnVsbCYmT2JqZWN0LmtleXMoYSkuZm9yRWFjaChvPT57c1tvXT1hW29dfSl9cmV0dXJuIHR9c3RhdGljIGdldEJyb3dzZXJBbGlhcyh0KXtyZXR1cm4gTWlbdF19c3RhdGljIGdldEJyb3dzZXJUeXBlQnlBbGlhcyh0KXtyZXR1cm4gQnJbdF18fCIifX1jb25zdCBPPS92ZXJzaW9uXC8oXGQrKFwuP18/XGQrKSspL2ksX2k9W3t0ZXN0OlsvZ29vZ2xlYm90L2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Ikdvb2dsZWJvdCJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC9nb29nbGVib3RcLyhcZCsoXC5cZCspKS9pLHIpfHxmLmdldEZpcnN0TWF0Y2goTyxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9vcGVyYS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJPcGVyYSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvKD86b3BlcmEpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvb3ByXC98b3Bpb3MvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiT3BlcmEifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86b3ByfG9waW9zKVtccy9dKFxTKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvU2Ftc3VuZ0Jyb3dzZXIvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvKD86U2Ftc3VuZ0Jyb3dzZXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvV2hhbGUvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTkFWRVIgV2hhbGUgQnJvd3NlciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvKD86d2hhbGUpW1xzL10oXGQrKD86XC5cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9NWkJyb3dzZXIvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTVogQnJvd3NlciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC8oPzpNWkJyb3dzZXIpW1xzL10oXGQrKD86XC5cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvZm9jdXMvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiRm9jdXMifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86Zm9jdXMpW1xzL10oXGQrKD86XC5cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvc3dpbmcvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU3dpbmcifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86c3dpbmcpW1xzL10oXGQrKD86XC5cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvY29hc3QvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiT3BlcmEgQ29hc3QifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OmNvYXN0KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL29wdFwvXGQrKD86Lj9fP1xkKykrL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Ik9wZXJhIFRvdWNoIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/Om9wdClbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsveWFicm93c2VyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IllhbmRleCBCcm93c2VyIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/OnlhYnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvdWNicm93c2VyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IlVDIEJyb3dzZXIifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OnVjYnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9NYXh0aG9ufG14aW9zL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Ik1heHRob24ifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/Ok1heHRob258bXhpb3MpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvZXBpcGhhbnkvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiRXBpcGhhbnkifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OmVwaXBoYW55KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3B1ZmZpbi9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJQdWZmaW4ifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OnB1ZmZpbilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9zbGVpcG5pci9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJTbGVpcG5pciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvKD86c2xlaXBuaXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvay1tZWxlb24vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiSy1NZWxlb24ifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OmstbWVsZW9uKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL21pY3JvbWVzc2VuZ2VyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IldlQ2hhdCJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC8oPzptaWNyb21lc3NlbmdlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvcXFicm93c2VyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6L3FxYnJvd3NlcmxpdGUvaS50ZXN0KHIpPyJRUSBCcm93c2VyIExpdGUiOiJRUSBCcm93c2VyIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/OnFxYnJvd3NlcmxpdGV8cXFicm93c2VyKVsvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvbXNpZXx0cmlkZW50L2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkludGVybmV0IEV4cGxvcmVyIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/Om1zaWUgfHJ2OikoXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvXHNlZGdcLy9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJNaWNyb3NvZnQgRWRnZSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC9cc2VkZ1wvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL2VkZyhbZWFdfGlvcykvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTWljcm9zb2Z0IEVkZ2UifSxlPWYuZ2V0U2Vjb25kTWF0Y2goL2VkZyhbZWFdfGlvcylcLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy92aXZhbGRpL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IlZpdmFsZGkifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvdml2YWxkaVwvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3NlYW1vbmtleS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJTZWFNb25rZXkifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvc2VhbW9ua2V5XC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvc2FpbGZpc2gvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2FpbGZpc2gifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvc2FpbGZpc2hccz9icm93c2VyXC8oXGQrKFwuXGQrKT8pL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvc2lsay9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJBbWF6b24gU2lsayJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC9zaWxrXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvcGhhbnRvbS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJQaGFudG9tSlMifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvcGhhbnRvbWpzXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvc2xpbWVyanMvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2xpbWVySlMifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvc2xpbWVyanNcLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9ibGFja2JlcnJ5fFxiYmJcZCsvaSwvcmltXHN0YWJsZXQvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiQmxhY2tCZXJyeSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVtcZF0rXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvKHdlYnxocHcpW28wXXMvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiV2ViT1MgQnJvd3NlciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvdyg/OmViKT9bbzBdc2Jyb3dzZXJcLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9iYWRhL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkJhZGEifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvZG9sZmluXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvdGl6ZW4vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiVGl6ZW4ifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86dGl6ZW5ccz8pP2Jyb3dzZXJcLyhcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvcXVwemlsbGEvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiUXVwWmlsbGEifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86cXVwemlsbGEpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscil8fGYuZ2V0Rmlyc3RNYXRjaChPLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL2ZpcmVmb3h8aWNld2Vhc2VsfGZ4aW9zL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkZpcmVmb3gifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86ZmlyZWZveHxpY2V3ZWFzZWx8Znhpb3MpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvZWxlY3Ryb24vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiRWxlY3Ryb24ifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86ZWxlY3Ryb24pXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvTWl1aUJyb3dzZXIvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTWl1aSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC8oPzpNaXVpQnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9jaHJvbWl1bS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJDaHJvbWl1bSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC8oPzpjaHJvbWl1bSlbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvY2hyb21lfGNyaW9zfGNybW8vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiQ2hyb21lIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/OmNocm9tZXxjcmlvc3xjcm1vKVwvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL0dTQS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJHb29nbGUgU2VhcmNoIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/OkdTQSlcLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Qocil7Y29uc3QgdD0hci50ZXN0KC9saWtlIGFuZHJvaWQvaSksZT1yLnRlc3QoL2FuZHJvaWQvaSk7cmV0dXJuIHQmJmV9LGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkFuZHJvaWQgQnJvd3NlciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvcGxheXN0YXRpb24gNC9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJQbGF5U3RhdGlvbiA0In0sZT1mLmdldEZpcnN0TWF0Y2goTyxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9zYWZhcml8YXBwbGV3ZWJraXQvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2FmYXJpIn0sZT1mLmdldEZpcnN0TWF0Y2goTyxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy8uKi9pXSxkZXNjcmliZShyKXtjb25zdCB0PS9eKC4qKVwvKC4qKSAvLGU9L14oLiopXC8oLiopWyBcdF1cKCguKikvLG49ci5zZWFyY2goIlxcKCIpIT09LTE/ZTp0O3JldHVybntuYW1lOmYuZ2V0Rmlyc3RNYXRjaChuLHIpLHZlcnNpb246Zi5nZXRTZWNvbmRNYXRjaChuLHIpfX19XTt2YXIgQWk9W3t0ZXN0OlsvUm9rdVwvRFZQL10sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goL1Jva3VcL0RWUC0oXGQrXC5cZCspL2kscik7cmV0dXJue25hbWU6Sy5Sb2t1LHZlcnNpb246dH19fSx7dGVzdDpbL3dpbmRvd3MgcGhvbmUvaV0sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goL3dpbmRvd3MgcGhvbmUgKD86b3MpP1xzPyhcZCsoXC5cZCspKikvaSxyKTtyZXR1cm57bmFtZTpLLldpbmRvd3NQaG9uZSx2ZXJzaW9uOnR9fX0se3Rlc3Q6Wy93aW5kb3dzIC9pXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvV2luZG93cyAoKE5UfFhQKSggXGRcZD8uXGQpPykvaSxyKSxlPWYuZ2V0V2luZG93c1ZlcnNpb25OYW1lKHQpO3JldHVybntuYW1lOksuV2luZG93cyx2ZXJzaW9uOnQsdmVyc2lvbk5hbWU6ZX19fSx7dGVzdDpbL01hY2ludG9zaCguKj8pIEZ4aU9TKC4qPylcLy9dLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Sy5pT1N9LGU9Zi5nZXRTZWNvbmRNYXRjaCgvKFZlcnNpb25cLykoXGRbXGQuXSspLyxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9tYWNpbnRvc2gvaV0sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goL21hYyBvcyB4IChcZCsoXC4/Xz9cZCspKykvaSxyKS5yZXBsYWNlKC9bX1xzXS9nLCIuIiksZT1mLmdldE1hY09TVmVyc2lvbk5hbWUodCkscz17bmFtZTpLLk1hY09TLHZlcnNpb246dH07cmV0dXJuIGUmJihzLnZlcnNpb25OYW1lPWUpLHN9fSx7dGVzdDpbLyhpcG9kfGlwaG9uZXxpcGFkKS9pXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvb3MgKFxkKyhbX1xzXVxkKykqKSBsaWtlIG1hYyBvcyB4L2kscikucmVwbGFjZSgvW19cc10vZywiLiIpO3JldHVybntuYW1lOksuaU9TLHZlcnNpb246dH19fSx7dGVzdChyKXtjb25zdCB0PSFyLnRlc3QoL2xpa2UgYW5kcm9pZC9pKSxlPXIudGVzdCgvYW5kcm9pZC9pKTtyZXR1cm4gdCYmZX0sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goL2FuZHJvaWRbXHMvLV0oXGQrKFwuXGQrKSopL2ksciksZT1mLmdldEFuZHJvaWRWZXJzaW9uTmFtZSh0KSxzPXtuYW1lOksuQW5kcm9pZCx2ZXJzaW9uOnR9O3JldHVybiBlJiYocy52ZXJzaW9uTmFtZT1lKSxzfX0se3Rlc3Q6Wy8od2VifGhwdylbbzBdcy9pXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvKD86d2VifGhwdylbbzBdc1wvKFxkKyhcLlxkKykqKS9pLHIpLGU9e25hbWU6Sy5XZWJPU307cmV0dXJuIHQmJnQubGVuZ3RoJiYoZS52ZXJzaW9uPXQpLGV9fSx7dGVzdDpbL2JsYWNrYmVycnl8XGJiYlxkKy9pLC9yaW1cc3RhYmxldC9pXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvcmltXHN0YWJsZXRcc29zXHMoXGQrKFwuXGQrKSopL2kscil8fGYuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVxkK1wvKFxkKyhbX1xzXVxkKykqKS9pLHIpfHxmLmdldEZpcnN0TWF0Y2goL1xiYmIoXGQrKS9pLHIpO3JldHVybntuYW1lOksuQmxhY2tCZXJyeSx2ZXJzaW9uOnR9fX0se3Rlc3Q6Wy9iYWRhL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9Zi5nZXRGaXJzdE1hdGNoKC9iYWRhXC8oXGQrKFwuXGQrKSopL2kscik7cmV0dXJue25hbWU6Sy5CYWRhLHZlcnNpb246dH19fSx7dGVzdDpbL3RpemVuL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9Zi5nZXRGaXJzdE1hdGNoKC90aXplblsvXHNdKFxkKyhcLlxkKykqKS9pLHIpO3JldHVybntuYW1lOksuVGl6ZW4sdmVyc2lvbjp0fX19LHt0ZXN0OlsvbGludXgvaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpLLkxpbnV4fX19LHt0ZXN0OlsvQ3JPUy9dLGRlc2NyaWJlKCl7cmV0dXJue25hbWU6Sy5DaHJvbWVPU319fSx7dGVzdDpbL1BsYXlTdGF0aW9uIDQvXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvUGxheVN0YXRpb24gNFsvXHNdKFxkKyhcLlxkKykqKS9pLHIpO3JldHVybntuYW1lOksuUGxheVN0YXRpb240LHZlcnNpb246dH19fV0sTGk9W3t0ZXN0OlsvZ29vZ2xlYm90L2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6ImJvdCIsdmVuZG9yOiJHb29nbGUifX19LHt0ZXN0OlsvaHVhd2VpL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9Zi5nZXRGaXJzdE1hdGNoKC8oY2FuLWwwMSkvaSxyKSYmIk5vdmEiLGU9e3R5cGU6Ri5tb2JpbGUsdmVuZG9yOiJIdWF3ZWkifTtyZXR1cm4gdCYmKGUubW9kZWw9dCksZX19LHt0ZXN0OlsvbmV4dXNccyooPzo3fDh8OXwxMCkuKi9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudGFibGV0LHZlbmRvcjoiTmV4dXMifX19LHt0ZXN0OlsvaXBhZC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudGFibGV0LHZlbmRvcjoiQXBwbGUiLG1vZGVsOiJpUGFkIn19fSx7dGVzdDpbL01hY2ludG9zaCguKj8pIEZ4aU9TKC4qPylcLy9dLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri50YWJsZXQsdmVuZG9yOiJBcHBsZSIsbW9kZWw6ImlQYWQifX19LHt0ZXN0Olsva2Z0dCBidWlsZC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudGFibGV0LHZlbmRvcjoiQW1hem9uIixtb2RlbDoiS2luZGxlIEZpcmUgSEQgNyJ9fX0se3Rlc3Q6Wy9zaWxrL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri50YWJsZXQsdmVuZG9yOiJBbWF6b24ifX19LHt0ZXN0OlsvdGFibGV0KD8hIHBjKS9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudGFibGV0fX19LHt0ZXN0KHIpe2NvbnN0IHQ9ci50ZXN0KC9pcG9kfGlwaG9uZS9pKSxlPXIudGVzdCgvbGlrZSAoaXBvZHxpcGhvbmUpL2kpO3JldHVybiB0JiYhZX0sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goLyhpcG9kfGlwaG9uZSkvaSxyKTtyZXR1cm57dHlwZTpGLm1vYmlsZSx2ZW5kb3I6IkFwcGxlIixtb2RlbDp0fX19LHt0ZXN0OlsvbmV4dXNccypbMC02XS4qL2ksL2dhbGF4eSBuZXh1cy9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYubW9iaWxlLHZlbmRvcjoiTmV4dXMifX19LHt0ZXN0OlsvW14tXW1vYmkvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLm1vYmlsZX19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRCcm93c2VyTmFtZSghMCk9PT0iYmxhY2tiZXJyeSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri5tb2JpbGUsdmVuZG9yOiJCbGFja0JlcnJ5In19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRCcm93c2VyTmFtZSghMCk9PT0iYmFkYSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri5tb2JpbGV9fX0se3Rlc3Qocil7cmV0dXJuIHIuZ2V0QnJvd3Nlck5hbWUoKT09PSJ3aW5kb3dzIHBob25lIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLm1vYmlsZSx2ZW5kb3I6Ik1pY3Jvc29mdCJ9fX0se3Rlc3Qocil7Y29uc3QgdD1OdW1iZXIoU3RyaW5nKHIuZ2V0T1NWZXJzaW9uKCkpLnNwbGl0KCIuIilbMF0pO3JldHVybiByLmdldE9TTmFtZSghMCk9PT0iYW5kcm9pZCImJnQ+PTN9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri50YWJsZXR9fX0se3Rlc3Qocil7cmV0dXJuIHIuZ2V0T1NOYW1lKCEwKT09PSJhbmRyb2lkIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLm1vYmlsZX19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRPU05hbWUoITApPT09Im1hY29zIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLmRlc2t0b3AsdmVuZG9yOiJBcHBsZSJ9fX0se3Rlc3Qocil7cmV0dXJuIHIuZ2V0T1NOYW1lKCEwKT09PSJ3aW5kb3dzIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLmRlc2t0b3B9fX0se3Rlc3Qocil7cmV0dXJuIHIuZ2V0T1NOYW1lKCEwKT09PSJsaW51eCJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri5kZXNrdG9wfX19LHt0ZXN0KHIpe3JldHVybiByLmdldE9TTmFtZSghMCk9PT0icGxheXN0YXRpb24gNCJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri50dn19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRPU05hbWUoITApPT09InJva3UifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudHZ9fX1dLE9pPVt7dGVzdChyKXtyZXR1cm4gci5nZXRCcm93c2VyTmFtZSghMCk9PT0ibWljcm9zb2Z0IGVkZ2UifSxkZXNjcmliZShyKXtpZigvXHNlZGdcLy9pLnRlc3QocikpcmV0dXJue25hbWU6c2UuQmxpbmt9O2NvbnN0IGU9Zi5nZXRGaXJzdE1hdGNoKC9lZGdlXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJue25hbWU6c2UuRWRnZUhUTUwsdmVyc2lvbjplfX19LHt0ZXN0OlsvdHJpZGVudC9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOnNlLlRyaWRlbnR9LGU9Zi5nZXRGaXJzdE1hdGNoKC90cmlkZW50XC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0KHIpe3JldHVybiByLnRlc3QoL3ByZXN0by9pKX0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZTpzZS5QcmVzdG99LGU9Zi5nZXRGaXJzdE1hdGNoKC9wcmVzdG9cLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Qocil7Y29uc3QgdD1yLnRlc3QoL2dlY2tvL2kpLGU9ci50ZXN0KC9saWtlIGdlY2tvL2kpO3JldHVybiB0JiYhZX0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZTpzZS5HZWNrb30sZT1mLmdldEZpcnN0TWF0Y2goL2dlY2tvXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvKGFwcGxlKT93ZWJraXRcLzUzN1wuMzYvaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpzZS5CbGlua319fSx7dGVzdDpbLyhhcHBsZSk/d2Via2l0L2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6c2UuV2ViS2l0fSxlPWYuZ2V0Rmlyc3RNYXRjaCgvd2Via2l0XC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19XTtjbGFzcyBGcntjb25zdHJ1Y3Rvcih0LGU9ITEpe2lmKHQ9PW51bGx8fHQ9PT0iIil0aHJvdyBuZXcgRXJyb3IoIlVzZXJBZ2VudCBwYXJhbWV0ZXIgY2FuJ3QgYmUgZW1wdHkiKTt0aGlzLl91YT10LHRoaXMucGFyc2VkUmVzdWx0PXt9LGUhPT0hMCYmdGhpcy5wYXJzZSgpfWdldFVBKCl7cmV0dXJuIHRoaXMuX3VhfXRlc3QodCl7cmV0dXJuIHQudGVzdCh0aGlzLl91YSl9cGFyc2VCcm93c2VyKCl7dGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj17fTtjb25zdCB0PWYuZmluZChfaSxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gdCYmKHRoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXI9dC5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyfWdldEJyb3dzZXIoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj90aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyOnRoaXMucGFyc2VCcm93c2VyKCl9Z2V0QnJvd3Nlck5hbWUodCl7cmV0dXJuIHQ/U3RyaW5nKHRoaXMuZ2V0QnJvd3NlcigpLm5hbWUpLnRvTG93ZXJDYXNlKCl8fCIiOnRoaXMuZ2V0QnJvd3NlcigpLm5hbWV8fCIifWdldEJyb3dzZXJWZXJzaW9uKCl7cmV0dXJuIHRoaXMuZ2V0QnJvd3NlcigpLnZlcnNpb259Z2V0T1MoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQub3M/dGhpcy5wYXJzZWRSZXN1bHQub3M6dGhpcy5wYXJzZU9TKCl9cGFyc2VPUygpe3RoaXMucGFyc2VkUmVzdWx0Lm9zPXt9O2NvbnN0IHQ9Zi5maW5kKEFpLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoZS50ZXN0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUudGVzdC5zb21lKHM9PnRoaXMudGVzdChzKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiB0JiYodGhpcy5wYXJzZWRSZXN1bHQub3M9dC5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5vc31nZXRPU05hbWUodCl7Y29uc3R7bmFtZTplfT10aGlzLmdldE9TKCk7cmV0dXJuIHQ/U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl8fCIiOmV8fCIifWdldE9TVmVyc2lvbigpe3JldHVybiB0aGlzLmdldE9TKCkudmVyc2lvbn1nZXRQbGF0Zm9ybSgpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT90aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybTp0aGlzLnBhcnNlUGxhdGZvcm0oKX1nZXRQbGF0Zm9ybVR5cGUodD0hMSl7Y29uc3R7dHlwZTplfT10aGlzLmdldFBsYXRmb3JtKCk7cmV0dXJuIHQ/U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl8fCIiOmV8fCIifXBhcnNlUGxhdGZvcm0oKXt0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT17fTtjb25zdCB0PWYuZmluZChMaSxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gdCYmKHRoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtPXQuZGVzY3JpYmUodGhpcy5nZXRVQSgpKSksdGhpcy5wYXJzZWRSZXN1bHQucGxhdGZvcm19Z2V0RW5naW5lKCl7cmV0dXJuIHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT90aGlzLnBhcnNlZFJlc3VsdC5lbmdpbmU6dGhpcy5wYXJzZUVuZ2luZSgpfWdldEVuZ2luZU5hbWUodCl7cmV0dXJuIHQ/U3RyaW5nKHRoaXMuZ2V0RW5naW5lKCkubmFtZSkudG9Mb3dlckNhc2UoKXx8IiI6dGhpcy5nZXRFbmdpbmUoKS5uYW1lfHwiIn1wYXJzZUVuZ2luZSgpe3RoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT17fTtjb25zdCB0PWYuZmluZChPaSxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gdCYmKHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT10LmRlc2NyaWJlKHRoaXMuZ2V0VUEoKSkpLHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZX1wYXJzZSgpe3JldHVybiB0aGlzLnBhcnNlQnJvd3NlcigpLHRoaXMucGFyc2VPUygpLHRoaXMucGFyc2VQbGF0Zm9ybSgpLHRoaXMucGFyc2VFbmdpbmUoKSx0aGlzfWdldFJlc3VsdCgpe3JldHVybiBmLmFzc2lnbih7fSx0aGlzLnBhcnNlZFJlc3VsdCl9c2F0aXNmaWVzKHQpe2NvbnN0IGU9e307bGV0IHM9MDtjb25zdCBuPXt9O2xldCBpPTA7aWYoT2JqZWN0LmtleXModCkuZm9yRWFjaChkPT57Y29uc3Qgbz10W2RdO3R5cGVvZiBvPT0ic3RyaW5nIj8obltkXT1vLGkrPTEpOnR5cGVvZiBvPT0ib2JqZWN0IiYmKGVbZF09byxzKz0xKX0pLHM+MCl7Y29uc3QgZD1PYmplY3Qua2V5cyhlKSxvPWYuZmluZChkLGc9PnRoaXMuaXNPUyhnKSk7aWYobyl7Y29uc3QgZz10aGlzLnNhdGlzZmllcyhlW29dKTtpZihnIT09dm9pZCAwKXJldHVybiBnfWNvbnN0IGg9Zi5maW5kKGQsZz0+dGhpcy5pc1BsYXRmb3JtKGcpKTtpZihoKXtjb25zdCBnPXRoaXMuc2F0aXNmaWVzKGVbaF0pO2lmKGchPT12b2lkIDApcmV0dXJuIGd9fWlmKGk+MCl7Y29uc3QgZD1PYmplY3Qua2V5cyhuKSxvPWYuZmluZChkLGg9PnRoaXMuaXNCcm93c2VyKGgsITApKTtpZihvIT09dm9pZCAwKXJldHVybiB0aGlzLmNvbXBhcmVWZXJzaW9uKG5bb10pfX1pc0Jyb3dzZXIodCxlPSExKXtjb25zdCBzPXRoaXMuZ2V0QnJvd3Nlck5hbWUoKS50b0xvd2VyQ2FzZSgpO2xldCBuPXQudG9Mb3dlckNhc2UoKTtjb25zdCBpPWYuZ2V0QnJvd3NlclR5cGVCeUFsaWFzKG4pO3JldHVybiBlJiZpJiYobj1pLnRvTG93ZXJDYXNlKCkpLG49PT1zfWNvbXBhcmVWZXJzaW9uKHQpe2xldCBlPVswXSxzPXQsbj0hMTtjb25zdCBpPXRoaXMuZ2V0QnJvd3NlclZlcnNpb24oKTtpZih0eXBlb2YgaT09InN0cmluZyIpcmV0dXJuIHRbMF09PT0iPiJ8fHRbMF09PT0iPCI/KHM9dC5zdWJzdHIoMSksdFsxXT09PSI9Ij8obj0hMCxzPXQuc3Vic3RyKDIpKTplPVtdLHRbMF09PT0iPiI/ZS5wdXNoKDEpOmUucHVzaCgtMSkpOnRbMF09PT0iPSI/cz10LnN1YnN0cigxKTp0WzBdPT09In4iJiYobj0hMCxzPXQuc3Vic3RyKDEpKSxlLmluZGV4T2YoZi5jb21wYXJlVmVyc2lvbnMoaSxzLG4pKT4tMX1pc09TKHQpe3JldHVybiB0aGlzLmdldE9TTmFtZSghMCk9PT1TdHJpbmcodCkudG9Mb3dlckNhc2UoKX1pc1BsYXRmb3JtKHQpe3JldHVybiB0aGlzLmdldFBsYXRmb3JtVHlwZSghMCk9PT1TdHJpbmcodCkudG9Mb3dlckNhc2UoKX1pc0VuZ2luZSh0KXtyZXR1cm4gdGhpcy5nZXRFbmdpbmVOYW1lKCEwKT09PVN0cmluZyh0KS50b0xvd2VyQ2FzZSgpfWlzKHQsZT0hMSl7cmV0dXJuIHRoaXMuaXNCcm93c2VyKHQsZSl8fHRoaXMuaXNPUyh0KXx8dGhpcy5pc1BsYXRmb3JtKHQpfXNvbWUodD1bXSl7cmV0dXJuIHQuc29tZShlPT50aGlzLmlzKGUpKX19LyohCiAqIEJvd3NlciAtIGEgYnJvd3NlciBkZXRlY3RvcgogKiBodHRwczovL2dpdGh1Yi5jb20vbGFuY2VkaWtzb24vYm93c2VyCiAqIE1JVCBMaWNlbnNlIHwgKGMpIER1c3RpbiBEaWF6IDIwMTItMjAxNQogKiBNSVQgTGljZW5zZSB8IChjKSBEZW5pcyBEZW1jaGVua28gMjAxNS0yMDE5CiAqL2NsYXNzIERpe3N0YXRpYyBnZXRQYXJzZXIodCxlPSExKXtpZih0eXBlb2YgdCE9InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKCJVc2VyQWdlbnQgc2hvdWxkIGJlIGEgc3RyaW5nIik7cmV0dXJuIG5ldyBGcih0LGUpfXN0YXRpYyBwYXJzZSh0KXtyZXR1cm4gbmV3IEZyKHQpLmdldFJlc3VsdCgpfXN0YXRpYyBnZXQgQlJPV1NFUl9NQVAoKXtyZXR1cm4gQnJ9c3RhdGljIGdldCBFTkdJTkVfTUFQKCl7cmV0dXJuIHNlfXN0YXRpYyBnZXQgT1NfTUFQKCl7cmV0dXJuIEt9c3RhdGljIGdldCBQTEFURk9STVNfTUFQKCl7cmV0dXJuIEZ9fWNvbnN0IEVlPSJjaHJvbWUiLHhyPSJvcGVyYSIsanI9ImZpcmVmb3giLFVyPSJpZXhwbG9yZXIiLEhyPSJzYWZhcmkiLEtyPSJud2pzIixXcj0iZWxlY3Ryb24iLHpyPSJyZWFjdC1uYXRpdmUiLFB0PSJ1bmtub3duIixjdD17Q2hyb21lOkVlLENocm9taXVtOkVlLE9wZXJhOnhyLEZpcmVmb3g6anIsIkludGVybmV0IEV4cGxvcmVyIjpVcixTYWZhcmk6SHJ9O2Z1bmN0aW9uIE5pKCl7Y29uc3R7dXNlckFnZW50OnJ9PW5hdmlnYXRvcix0PXtuYW1lOlB0LHZlcnNpb246dm9pZCAwfTtpZihyLm1hdGNoKC9DaHJvbWUvKSYmIXIubWF0Y2goL0VkZ2UvKSlpZihyLm1hdGNoKC9FZGcoQT8pLykpe2NvbnN0IGU9ci5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdO051bWJlci5wYXJzZUludChlLDEwKT43MiYmKHQubmFtZT1FZSx0LnZlcnNpb249ZSl9ZWxzZSB0Lm5hbWU9RWUsdC52ZXJzaW9uPXIubWF0Y2goL0Nocm9tZVwvKFtcZC5dKykvKVsxXTtyZXR1cm4gdH1mdW5jdGlvbiBWaSgpe2NvbnN0e3VzZXJBZ2VudDpyfT1uYXZpZ2F0b3I7aWYoci5tYXRjaCgvRWxlY3Ryb24vKSl7Y29uc3QgdD1yLm1hdGNoKC9FbGVjdHJvblwvKFtcZC5dKykvKVsxXTtyZXR1cm57bmFtZTpXcix2ZXJzaW9uOnR9fXJldHVybiBudWxsfWZ1bmN0aW9uIEJpKCl7Y29uc3R7dXNlckFnZW50OnJ9PW5hdmlnYXRvcjtpZihyLm1hdGNoKC9KaXRzaU1lZXROVy8pKXtjb25zdCB0PXIubWF0Y2goL0ppdHNpTWVldE5XXC8oW1xkLl0rKS8pWzFdO3JldHVybntuYW1lOktyLHZlcnNpb246dH19fWZ1bmN0aW9uIEZpKCl7Y29uc3Qgcj1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9cYihyZWFjdFsgXHRfLV0qbmF0aXZlKSg/OlwvKFxTKykpPy9pKTtsZXQgdDtpZihyfHxuYXZpZ2F0b3IucHJvZHVjdD09PSJSZWFjdE5hdGl2ZSIpcmV0dXJuIHImJnIubGVuZ3RoPjImJihyWzFdLHQ9clsyXSksdHx8KHQ9InVua25vd24iKSx7bmFtZTp6cix2ZXJzaW9uOnR9fWZ1bmN0aW9uIHhpKHIpe2xldCB0O2NvbnN0IGU9W0ZpLFZpLEJpXTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rPTEpaWYodD1lW25dKCksdClyZXR1cm4gdDtjb25zdCBzPXIuZ2V0QnJvd3Nlck5hbWUoKTtyZXR1cm4gcyBpbiBjdD97bmFtZTpjdFtzXSx2ZXJzaW9uOnIuZ2V0QnJvd3NlclZlcnNpb24oKX06KHQ9TmkoKSx0fHx7bmFtZTpQdCx2ZXJzaW9uOnZvaWQgMH0pfWNsYXNzIGppe2NvbnN0cnVjdG9yKCl7dSh0aGlzLCJfYm93c2VyIik7dSh0aGlzLCJfbmFtZSIpO3UodGhpcywiX3ZlcnNpb24iKTt1KHRoaXMsImdldERldmljZUluZm8iLCgpPT4oe2lzTW9iaWxlOnRoaXMuaXNNb2JpbGUoKSxicm93c2VyTmFtZTp0aGlzLl9ib3dzZXIuZ2V0QnJvd3Nlck5hbWUoKSxvc05hbWU6dGhpcy5fYm93c2VyLmdldE9TTmFtZSgpLGJyb3dzZXJWZXJzaW9uOnRoaXMuX2Jvd3Nlci5nZXRCcm93c2VyVmVyc2lvbigpLG9zVmVyc2lvbk5hbWU6dGhpcy5fYm93c2VyLmdldE9TVmVyc2lvbigpLGVuZ2luZU5hbWU6dGhpcy5fYm93c2VyLmdldEVuZ2luZU5hbWUoKX0pKX1pbml0KHQpe2xldCBlLHM7aWYodGhpcy5fYm93c2VyPURpLmdldFBhcnNlcihuYXZpZ2F0b3IudXNlckFnZW50KSx0eXBlb2YgdD09InVuZGVmaW5lZCIpe2NvbnN0IG49eGkodGhpcy5fYm93c2VyKTtlPW4ubmFtZSxzPW4udmVyc2lvbn1lbHNlIHQubmFtZSBpbiBjdD8oZT1jdFt0Lm5hbWVdLHM9dC52ZXJzaW9uKTooZT1QdCxzPXZvaWQgMCk7dGhpcy5fbmFtZT1lLHRoaXMuX3ZlcnNpb249c31nZXROYW1lKCl7cmV0dXJuIHRoaXMuX25hbWV9aXNDaHJvbWUoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUVlfWlzT3BlcmEoKXtyZXR1cm4gdGhpcy5fbmFtZT09PXhyfWlzRmlyZWZveCgpe3JldHVybiB0aGlzLl9uYW1lPT09anJ9aXNJRXhwbG9yZXIoKXtyZXR1cm4gdGhpcy5fbmFtZT09PVVyfWlzU2FmYXJpKCl7cmV0dXJuIHRoaXMuX25hbWU9PT1Icn1pc05XSlMoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUtyfWlzRWxlY3Ryb24oKXtyZXR1cm4gdGhpcy5fbmFtZT09PVdyfWlzUmVhY3ROYXRpdmUoKXtyZXR1cm4gdGhpcy5fbmFtZT09PXpyfHxuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZT09PSEwfWdldFZlcnNpb24oKXtyZXR1cm4gdGhpcy5fdmVyc2lvbn1pc01vYmlsZSgpe3JldHVybiB0aGlzLl9ib3dzZXIuZ2V0UGxhdGZvcm1UeXBlKCk9PT0ibW9iaWxlIn1fY2hlY2tDb25kaXRpb24odCl7aWYodGhpcy5fdmVyc2lvbilyZXR1cm4gdGhpcy5fYm93c2VyLnNhdGlzZmllcyh0KX1pc1ZlcnNpb25HcmVhdGVyVGhhbih0KXtyZXR1cm4gdGhpcy5fY2hlY2tDb25kaXRpb24oe1t0aGlzLl9uYW1lXTpgPiR7dH1gfSl9aXNWZXJzaW9uTGVzc1RoYW4odCl7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YDwke3R9YH0pfWlzVmVyc2lvbkVxdWFsVG8odCl7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YH4ke3R9YH0pfX1jbGFzcyBVaSBleHRlbmRzIGppe2RvZXNWaWRlb011dGVCeVN0cmVhbVJlbW92ZSgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c1AyUCgpe3JldHVybiF0aGlzLnVzZXNVbmlmaWVkUGxhbigpfWlzQ2hyb21pdW1CYXNlZCgpe3JldHVybiB0aGlzLmlzQ2hyb21lKCl8fHRoaXMuaXNFbGVjdHJvbigpfHx0aGlzLmlzTldKUygpfHx0aGlzLmlzT3BlcmEoKX1pc1dlYktpdEJhc2VkKCl7cmV0dXJuIHRoaXMuX2Jvd3Nlci5pc0VuZ2luZSgid2Via2l0IikmJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzIT0idW5kZWZpbmVkIiYmdHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhIT0idW5kZWZpbmVkIiYmdHlwZW9mIHdpbmRvdy5SVENSdHBUcmFuc2NlaXZlciE9InVuZGVmaW5lZCImJk9iamVjdC5rZXlzKFJUQ1J0cFRyYW5zY2VpdmVyLnByb3RvdHlwZSkuaW5kZXhPZigiY3VycmVudERpcmVjdGlvbiIpPi0xfWlzU3VwcG9ydGVkKCl7cmV0dXJuIHR5cGVvZiBSVENQZWVyQ29ubmVjdGlvbiE9InVuZGVmaW5lZCJ9aXNVc2VySW50ZXJhY3Rpb25SZXF1aXJlZEZvclVubXV0ZSgpe3JldHVybiB0aGlzLmlzRmlyZWZveCgpJiZ0aGlzLmlzVmVyc2lvbkxlc3NUaGFuKCI2OCIpfXN1cHBvcnRzVmlkZW9NdXRlT25Db25uSW50ZXJydXB0ZWQoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc1JlYWN0TmF0aXZlKCl8fHRoaXMuaXNXZWJLaXRCYXNlZCgpfXN1cHBvcnRzQmFuZHdpZHRoU3RhdGlzdGljcygpe3JldHVybiF0aGlzLmlzRmlyZWZveCgpJiYhdGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNDb2RlY1ByZWZlcmVuY2VzKCl7cmV0dXJuIHRoaXMudXNlc1VuaWZpZWRQbGFuKCkmJnR5cGVvZiB3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyh3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIucHJvdG90eXBlKS5pbmRleE9mKCJzZXRDb2RlY1ByZWZlcmVuY2VzIik+LTEmJk9iamVjdC5rZXlzKFJUQ1J0cFNlbmRlci5wcm90b3R5cGUpLmluZGV4T2YoImdldENhcGFiaWxpdGllcyIpPi0xJiYhdGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNEZXZpY2VDaGFuZ2VFdmVudCgpe3JldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5vbmRldmljZWNoYW5nZSE9InVuZGVmaW5lZCImJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmFkZEV2ZW50TGlzdGVuZXIhPSJ1bmRlZmluZWQifXN1cHBvcnRzTG9jYWxDYW5kaWRhdGVSdHRTdGF0aXN0aWNzKCl7cmV0dXJuIHRoaXMuaXNDaHJvbWl1bUJhc2VkKCl8fHRoaXMuaXNSZWFjdE5hdGl2ZSgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c1BlcmZvcm1hbmNlT2JzZXJ2ZXIoKXtyZXR1cm4gdHlwZW9mIHdpbmRvdy5QZXJmb3JtYW5jZU9ic2VydmVyIT0idW5kZWZpbmVkIiYmUGVyZm9ybWFuY2VPYnNlcnZlci5zdXBwb3J0ZWRFbnRyeVR5cGVzLmluZGV4T2YoImxvbmd0YXNrIik+LTF9c3VwcG9ydHNSZWNlaXZlclN0YXRzKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3cuUlRDUnRwUmVjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyhSVENSdHBSZWNlaXZlci5wcm90b3R5cGUpLmluZGV4T2YoImdldFN5bmNocm9uaXphdGlvblNvdXJjZXMiKT4tMX1zdXBwb3J0c1JUVFN0YXRpc3RpY3MoKXtyZXR1cm4hdGhpcy5pc0ZpcmVmb3goKX11c2VzUGxhbkIoKXtyZXR1cm4hdGhpcy51c2VzVW5pZmllZFBsYW4oKX11c2VzU2RwTXVuZ2luZ0ZvclNpbXVsY2FzdCgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzUmVhY3ROYXRpdmUoKXx8dGhpcy5pc1dlYktpdEJhc2VkKCl9dXNlc1VuaWZpZWRQbGFuKCl7cmV0dXJuISEodGhpcy5pc0ZpcmVmb3goKXx8dGhpcy5pc1dlYktpdEJhc2VkKCkpfXVzZXNOZXdHdW1GbG93KCl7cmV0dXJuISEodGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc0ZpcmVmb3goKXx8dGhpcy5pc1dlYktpdEJhc2VkKCkpfXVzZXNBZGFwdGVyKCl7cmV0dXJuIHRoaXMudXNlc05ld0d1bUZsb3coKX11c2VzUmlkc0ZvclNpbXVsY2FzdCgpe3JldHVybiExfXN1cHBvcnRzR2V0RGlzcGxheU1lZGlhKCl7cmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IuZ2V0RGlzcGxheU1lZGlhIT0idW5kZWZpbmVkInx8dHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXREaXNwbGF5TWVkaWEhPSJ1bmRlZmluZWQifXN1cHBvcnRzSW5zZXJ0YWJsZVN0cmVhbXMoKXtpZighKHR5cGVvZiB3aW5kb3cuUlRDUnRwU2VuZGVyIT0idW5kZWZpbmVkIiYmKHdpbmRvdy5SVENSdHBTZW5kZXIucHJvdG90eXBlLmNyZWF0ZUVuY29kZWRTdHJlYW1zfHx3aW5kb3cuUlRDUnRwU2VuZGVyLnByb3RvdHlwZS5jcmVhdGVFbmNvZGVkVmlkZW9TdHJlYW1zKSkpcmV0dXJuITE7Y29uc3QgdD1uZXcgUmVhZGFibGVTdHJlYW07dHJ5e3JldHVybiB3aW5kb3cucG9zdE1lc3NhZ2UodCwiKiIsW3RdKSwhMH1jYXRjaChlKXtyZXR1cm4hMX19c3VwcG9ydHNBdWRpb1JlZCgpe3JldHVybiBCb29sZWFuKHdpbmRvdy5SVENSdHBTZW5kZXImJndpbmRvdy5SVENSdHBTZW5kZXIuZ2V0Q2FwYWJpbGl0aWVzJiZ3aW5kb3cuUlRDUnRwU2VuZGVyLmdldENhcGFiaWxpdGllcygiYXVkaW8iKS5jb2RlY3Muc29tZSh0PT50Lm1pbWVUeXBlPT09ImF1ZGlvL3JlZCIpJiZ3aW5kb3cuUlRDUnRwUmVjZWl2ZXImJndpbmRvdy5SVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMmJndpbmRvdy5SVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMoImF1ZGlvIikuY29kZWNzLnNvbWUodD0+dC5taW1lVHlwZT09PSJhdWRpby9yZWQiKSl9c3VwcG9ydHNTZHBTZW1hbnRpY3MoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKX1fZ2V0Q2hyb21pdW1CYXNlZFZlcnNpb24oKXtpZih0aGlzLmlzQ2hyb21pdW1CYXNlZCgpKXtpZih0aGlzLmlzTldKUygpKXJldHVybiBOdW1iZXIucGFyc2VJbnQocHJvY2Vzcy52ZXJzaW9ucy5jaHJvbWl1bSwxMCk7Y29uc3QgdD1uYXZpZ2F0b3IudXNlckFnZW50O2lmKHQubWF0Y2goL0Nocm9tZS8pKXJldHVybiBOdW1iZXIucGFyc2VJbnQodC5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdLDEwKX1yZXR1cm4tMX1pc0lPU01vYmlsZSgpe3JldHVybiB0aGlzLmlzTW9iaWxlJiZ0aGlzLl9ib3dzZXIuZ2V0T1NOYW1lKCk9PT0iaU9TIn19Y29uc3QgSGk9bmV3IFVpO2NsYXNzIEtpe2NvbnN0cnVjdG9yKCl7dSh0aGlzLCJsb2dzQ2FjaGUiLFtdKTt1KHRoaXMsImxvZ3NQcm9jZXNzb3JUaW1lciIpO3UodGhpcywiY29tcHJlc3Npb25TdXBwb3J0ZWQiLG51bGwpO3UodGhpcywidHJhY2luZ0VuYWJsZWQiLCEwKTt1KHRoaXMsImluaXRpYWxpemVkIiwhMSk7dSh0aGlzLCJsb2dMZXZlbCIsImxvZyIpO3UodGhpcywibG9nc1Byb2Nlc3NpbmdJbnRlcnZhbCIsN2UzKTt1KHRoaXMsImxvZ0V4Y2x1c2lvbkxpc3QiLFsibWVzc2FnZSIsIndlYnNvY2tldC9tZXNzYWdlIiwicm9vbU1lc3NhZ2UiLCJ3ZWJzb2NrZXQvcm9vbS1tZXNzYWdlIiwid2Vic29ja2V0L3Jvb20tbGVnYWN5LW1vZGUiLCJjaGF0TWVzc2FnZSIsIndlYnNvY2tldC9uZXctY2hhdC1tZXNzYWdlIiwid2Vic29ja2V0L25vLWFjdGl2ZS1zcGVha2VyIiwid2Vic29ja2V0L3NlbGVjdGVkLXBlZXJzIiwid2Vic29ja2V0L2FjdGl2ZS1zcGVha2VyIiwicGluZyIsIndlYnNvY2tldC9uZXctY29uc3VtZXIiLCJ3ZWJzb2NrZXQvcHJvZHVjZXItc2NvcmUiLCJ3ZWJzb2NrZXQvY29uc3VtZXItc2NvcmUiLCJ3ZWJzb2NrZXQvcGx1Z2luLWV2ZW50Iiwid2Vic29ja2V0L3BsdWdpbi1kYXRhIiwid2Vic29ja2V0L3BsdWdpbi1pbnRlcm5hbC1kYXRhIl0pO3UodGhpcywibWVldGluZ01ldGFkYXRhIix7fSl9aXNDb21wcmVzc2lvblN1cHBvcnRlZCgpe2lmKHRoaXMuY29tcHJlc3Npb25TdXBwb3J0ZWQ9PT1udWxsKXRyeXt0aGlzLmNvbXByZXNzaW9uU3VwcG9ydGVkPXR5cGVvZiBDb21wcmVzc2lvblN0cmVhbSE9InVuZGVmaW5lZCImJnR5cGVvZiBCbG9iIT0idW5kZWZpbmVkIiYmdHlwZW9mIEJsb2IucHJvdG90eXBlLnN0cmVhbT09ImZ1bmN0aW9uIiYmdHlwZW9mIFJlc3BvbnNlIT0idW5kZWZpbmVkIn1jYXRjaCh0KXt0aGlzLmNvbXByZXNzaW9uU3VwcG9ydGVkPSExLHRoaXMuYWRkTG9nSW5DdXJyZW50U3Bhbigid2FybiIsIkNvbXByZXNzaW9uIGZlYXR1cmUgZGV0ZWN0aW9uIGZhaWxlZCwgdXNpbmcgdW5jb21wcmVzc2VkIGxvZ3MiLHtlcnJvcjp0fSl9cmV0dXJuIHRoaXMuY29tcHJlc3Npb25TdXBwb3J0ZWR9Z2V0IGxvZ3NFbmRwb2ludCgpe2NvbnN0IHQ9VGUuZ2V0Q29udGV4dCh0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpO3JldHVybmBodHRwczovLyR7SWkoe3NlcnZpY2VQcmVmaXg6ImFwaS1zaWxvcyIsYmFzZVVSSTp0LmdldFZhbHVlKCJiYXNlVVJJIil9KX0vb3RlbC9sb2dzYH1nZXQgbG9nc0JhdGNoU2l6ZSgpe3JldHVybiB0aGlzLmlzQ29tcHJlc3Npb25TdXBwb3J0ZWQoKT81MDoyNX1yZXNldFBlZXJJZCh0KXt0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQ9dH1pbml0KHQsZSxzLG4pe3RoaXMudHJhY2luZ0VuYWJsZWQ9ITAsdGhpcy5pbml0aWFsaXplZD0hMSxuJiYodGhpcy5sb2dMZXZlbD1uKSx0aGlzLmxvZ3NDYWNoZT1bXTtjb25zdCBpPXQuZ2V0VmFsdWUoInBlZXJJZCIpO3RoaXMubWVldGluZ01ldGFkYXRhPWUsdGhpcy50cmFjaW5nRW5hYmxlZD1zLHRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZD1pLHRoaXMubWVldGluZ01ldGFkYXRhLnNka1ZlcnNpb249dC5nZXRWYWx1ZSgic2RrVmVyc2lvbiIpO2NvbnN0e1JORGV2aWNlSW5mb0ltcGw6YX09bmF2aWdhdG9yO3RoaXMubWVldGluZ01ldGFkYXRhLmRldmljZUluZm89bmF2aWdhdG9yLmlzUmVhY3ROYXRpdmU/YT09bnVsbD92b2lkIDA6YS5nZXREZXZpY2VJbmZvKCk6SGkuZ2V0RGV2aWNlSW5mbygpLHRoaXMubWVldGluZ01ldGFkYXRhLnZpc2l0ZWRVcmw9IW5hdmlnYXRvci5pc1JlYWN0TmF0aXZlJiZ0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LmxvY2F0aW9uLmhyZWYsdGhpcy5sb2dzUHJvY2Vzc29yVGltZXI9c2V0SW50ZXJ2YWwoKCk9PnRoaXMucHJvY2Vzc0NhY2hlZExvZ3MoKS5jYXRjaCgoKT0+e30pLHRoaXMubG9nc1Byb2Nlc3NpbmdJbnRlcnZhbCkscyYmKHRoaXMuaW5pdGlhbGl6ZWQ9ITApfXN0YXRpYyB0cmFjZSh0LGU9dm9pZCAwKXtyZXR1cm4ocyxuLGkpPT57Y29uc3QgYT1pLnZhbHVlO3JldHVybiBpLnZhbHVlPWZ1bmN0aW9uKC4uLm8pe2NvbnN0IGg9dGhpcz09bnVsbD92b2lkIDA6dGhpcy50ZWxlbWV0cnk7aWYoIWh8fCFoLmluaXRpYWxpemVkfHxuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZXx8IWgudHJhY2luZ0VuYWJsZWQpcmV0dXJuIGEuYXBwbHkodGhpcyxvKTtoLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLHQsZSk7Y29uc3QgZz1wZXJmb3JtYW5jZS5ub3coKSxiPWEuYXBwbHkodGhpcyxvKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGIpLnRoZW4oKCk9Pntjb25zdCBUPXBlcmZvcm1hbmNlLm5vdygpO1QtZz4xMCYmaC5hZGRMb2dJbkN1cnJlbnRTcGFuKCJpbmZvIixgJHt0fV90aW1pbmdgLHtleGVjVGltZTpULWd9KX0pLmNhdGNoKCgpPT57Y29uc3QgVD1wZXJmb3JtYW5jZS5ub3coKTtoLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLGAke3R9X3RpbWluZ2Ase2V4ZWNUaW1lOlQtZ30pfSksYn0saX19aW5qZWN0Q29udGV4dCh0KXt2YXIgbjtjb25zdCBlPU5zKCkucmVwbGFjZSgvLS9nLCIiKS5zdWJzdHJpbmcoMCwxNikscz0obj10aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpPT1udWxsP3ZvaWQgMDpuLnJlcGxhY2UoLy0vZywiIik7dC5UUkFDRVBBUkVOVD1gMDAtJHtzfS0ke2V9LTAxYH1hZGRMb2dJbkN1cnJlbnRTcGFuKHQsZSxzPXt9LG49ITEpe3MhPW51bGwmJnMuZXJyb3ImJk9iamVjdC5hc3NpZ24ocyx7ZXJyb3I6b3Qocy5lcnJvcil9KTtjb25zdCBpPVRlLmdldENvbnRleHQodGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKTtpZihEcihpKSYmKENpKHMpP2NvbnNvbGVbdF0oIkludGVybmFsTG9nczo6ICIsdCxlKTpjb25zb2xlW3RdKCJJbnRlcm5hbExvZ3M6OiAiLHQsZSxzKSksISFraShpLHQpKXRyeXtjb25zdCBkPVZyKGksZSxzLCJtZXRhZGF0YSIpLG89bmV3IERhdGUsaD1RZShHKHttZXNzYWdlOmUsbGV2ZWw6dH0sZCkse2xvZ2dlZEF0Om8udG9JU09TdHJpbmcoKSxsb2dnZWRBdFR6T2Zmc2V0Om8uZ2V0VGltZXpvbmVPZmZzZXQoKX0pO24/dGhpcy5zZW5kT3RlbExvZ3NUb05ld1JlbGljKFtoXSx7aXNJbkRlc3RydWN0aW9uTW9kZTohMX0pLmNhdGNoKCgpPT57fSk6dGhpcy5sb2dzQ2FjaGUucHVzaChoKX1jYXRjaChkKXt0aGlzLmFkZExvZ0luQ3VycmVudFNwYW4oImVycm9yIiwib3BlbnRlbGVtZXRyeTo6YWRkTG9nSW5DdXJyZW50U3Bhbl9mYWlsZWQiLHtlcnJvcjpvdChkKX0pfX1zZW5kT3RlbExvZ3NUb05ld1JlbGljKHMpe3JldHVybiB3KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKih0LHtpc0luRGVzdHJ1Y3Rpb25Nb2RlOmU9ITF9PXtpc0luRGVzdHJ1Y3Rpb25Nb2RlOiExfSl7Y29uc3Qgbj1uZXcgQWJvcnRDb250cm9sbGVyLGk9c2V0VGltZW91dCgoKT0+bi5hYm9ydCgiTG9ncyByZXF1ZXN0IHRpbWVkIG91dCBhZnRlciA4IHNlY29uZHMiKSw4ZTMpO3RyeXtjb25zdCBhPVRlLmdldENvbnRleHQodGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKSxkPUpTT04uc3RyaW5naWZ5KHttZWV0aW5nTWV0YWRhdGE6VnIoYSwic2VuZE90ZWxMb2dzVG9OZXdSZWxpYyIsdGhpcy5tZWV0aW5nTWV0YWRhdGEsIm1lZXRpbmdNZXRhZGF0YSIpLHNlcnZpY2VOYW1lOmEuZ2V0VmFsdWUoInNka05hbWUiKSxsb2dzOnR9KTtsZXQgbztjb25zdCBoPXtBdXRob3JpemF0aW9uOmBCZWFyZXIgJHthLmdldFZhbHVlKCJhdXRoVG9rZW4iKX1gfTtpZih0aGlzLmlzQ29tcHJlc3Npb25TdXBwb3J0ZWQoKSl7Y29uc3QgZz1uZXcgQmxvYihbZF0pLnN0cmVhbSgpLnBpcGVUaHJvdWdoKG5ldyBDb21wcmVzc2lvblN0cmVhbSgiZ3ppcCIpKTtvPXlpZWxkIG5ldyBSZXNwb25zZShnKS5hcnJheUJ1ZmZlcigpLGhbIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi9nemlwIixoWyJDb250ZW50LUVuY29kaW5nIl09Imd6aXAifWVsc2Ugbz1kLGhbIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi9qc29uIjt5aWVsZCBmZXRjaCh0aGlzLmxvZ3NFbmRwb2ludCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOmgsYm9keTpvLHNpZ25hbDpuLnNpZ25hbCxrZWVwYWxpdmU6ISFlfSl9Y2F0Y2goYSl7ZXx8KHRoaXMuYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLCJvcGVudGVsZW1ldHJ5OjpzZW5kT3RlbExvZ1RvTmV3UmVsaWNfZmFpbGVkIix7ZXJyb3I6b3QoYSl9KSx0aGlzLmxvZ3NDYWNoZS5wdXNoKC4uLnQpKX1maW5hbGx5e2NsZWFyVGltZW91dChpKX19KX1wcm9jZXNzQ2FjaGVkTG9ncygpe3JldHVybiB3KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKih7aXNJbkRlc3RydWN0aW9uTW9kZTp0PSExfT17aXNJbkRlc3RydWN0aW9uTW9kZTohMX0pe2NvbnN0IGU9dGhpcy5sb2dzQ2FjaGUuc3BsaWNlKDAsdGhpcy5sb2dzQmF0Y2hTaXplKTtlIT1udWxsJiZlLmxlbmd0aCYmKHlpZWxkIHRoaXMuc2VuZE90ZWxMb2dzVG9OZXdSZWxpYyhlLHtpc0luRGVzdHJ1Y3Rpb25Nb2RlOnR9KSl9KX1kZXN0cnVjdCgpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtmb3IoY2xlYXJJbnRlcnZhbCh0aGlzLmxvZ3NQcm9jZXNzb3JUaW1lcik7dGhpcy5sb2dzQ2FjaGUubGVuZ3RoOyl5aWVsZCB0aGlzLnByb2Nlc3NDYWNoZWRMb2dzKHtpc0luRGVzdHJ1Y3Rpb25Nb2RlOiEwfSl9KX19ZnVuY3Rpb24gV2kocil7Y29uc3QgdD1HKHt9LHIpLGU9bmV3IE1hcCxzPShoLGcpPT4oZS5oYXMoaCl8fGUuc2V0KGgsbmV3IFNldCksZS5nZXQoaCkuYWRkKGcpLCgpPT57dmFyIGI7cmV0dXJuKGI9ZS5nZXQoaCkpPT1udWxsP3ZvaWQgMDpiLmRlbGV0ZShnKX0pLG49KGgsZyk9Pnt2YXIgYjsoYj1lLmdldChoKSk9PW51bGx8fGIuZGVsZXRlKGcpfSxpPWg9Pnt2YXIgZzsoZz1lLmdldChoKSk9PW51bGx8fGcuZm9yRWFjaChiPT57dHJ5e2IodFtoXSl9Y2F0Y2goVCl7fX0pfTtyZXR1cm57c3Vic2NyaWJlOnMsdW5zdWJzY3JpYmU6bixub3RpZnk6aSxzZXRWYWx1ZTooaCxnLGI9ITApPT57dFtoXT1nLGImJmkoaCl9LGdldFZhbHVlOmg9PnRbaF0sZ2V0QWxsVmFsdWVzOigpPT50fX1jbGFzcyB6aXtjb25zdHJ1Y3Rvcigpe3UodGhpcywiY29udGV4dHMiLG5ldyBNYXApO3UodGhpcywibW9zdFJlY2VudFBlZXJJZCIsbnVsbCl9Y3JlYXRlQ29udGV4dCh0LGUpe2lmKHRoaXMuY29udGV4dHMuaGFzKHQpKXJldHVybiB0aGlzLmNvbnRleHRzLmdldCh0KTtjb25zdCBzPW5ldyBLaSxuPW5ldyBNczt0aGlzLmNvbnRleHRzLnNldCh0LFdpKGUpKSx0aGlzLmNvbnRleHRzLmdldCh0KS5zZXRWYWx1ZSgicGVlclNlc3Npb25TdG9yZSIsbmV3IG10KG4pKTtjb25zdCBpPW5ldyBwcjtyZXR1cm4gaS5zZXRNYXhMaXN0ZW5lcnMoNTApLHRoaXMuY29udGV4dHMuZ2V0KHQpLnNldFZhbHVlKCJsb2dnZXIiLG4pLHRoaXMuY29udGV4dHMuZ2V0KHQpLnNldFZhbHVlKCJ0ZWxlbWV0cnkiLHMpLHRoaXMuY29udGV4dHMuZ2V0KHQpLnNldFZhbHVlKCJjYWxsc3RhdHMiLGkpLHRoaXMubW9zdFJlY2VudFBlZXJJZD10LHRoaXMuY29udGV4dHMuZ2V0KHQpfXJlbWFwQ29udGV4dCh0LGUpe2NvbnN0IHM9ZS5nZXRWYWx1ZSgicGVlcklkIik7cyE9PXQmJihlLnNldFZhbHVlKCJwZWVySWQiLHQpLHRoaXMubW9zdFJlY2VudFBlZXJJZD10LHRoaXMuY29udGV4dHMuc2V0KHQsZSksdGhpcy5jb250ZXh0cy5kZWxldGUocykpfWdldENvbnRleHQodCl7cmV0dXJuIHRoaXMuY29udGV4dHMuZ2V0KHQpfWdldE1vc3RSZWNlbnRQZWVySWQoKXtyZXR1cm4gdGhpcy5tb3N0UmVjZW50UGVlcklkfX12YXIgVGU9bmV3IHppO2NvbnN0ICRpPXsiMDAiOiJDbGllbnQiLCIwMSI6IkNvbnRyb2xsZXIiLCIwMiI6IlJvb21Ob2RlQ2xpZW50IiwiMDMiOiJIaXZlTm9kZUNsaWVudCIsIjA0IjoiU29ja2V0U2VydmljZSIsIjA1IjoiQ2hhdCIsIjA2IjoiUGx1Z2luIiwiMDciOiJQb2xscyIsIjA4IjoiTWV0YSIsIjA5IjoiUHJlc2V0IiwxMDoiUmVjb3JkaW5nIiwxMToiU2VsZiIsMTI6IlBhcnRpY2lwYW50IiwxMzoiU3BvdGxpZ2h0IiwxNDoiUmVtb3RlIFJlcXVlc3QiLDE1OiJXZWJpbmFyIiwxNjoiTG9jYWxNZWRpYUhhbmRsZXIiLDE3OiJFbmQtRW5kIEVuY3J5cHRpb24iLDE4OiJBSSIsMTk6IkxpdmVzdHJlYW0iLDIwOiJTdGFnZSJ9LGR0PXsiMDAwMCI6IkludGVybmFsIGV4Y2VwdGlvbi4iLCIwMDAxIjoiRmFpbGVkIHRvIGluaXRpYWxpemUuIiwiMDAwMiI6IkZhaWxlZCB0byBqb2luIHJvb20uIiwiMDAwMyI6IkZhaWxlZCB0byBsZWF2ZSByb29tLiIsIjAwMDQiOiJJbnZhbGlkIGF1dGggdG9rZW4iLCIwMDEwIjoiQnJvd3NlciBub3Qgc3VwcG9ydGVkIiwiMDAxMSI6IkhUVFAgTmV0d29yayBFcnJvciIsIjAwMTIiOiJXZWJzb2NrZXQgTmV0d29yayBFcnJvciIsIjAwMTMiOiJSYXRlIExpbWl0ZWQiLCIwMDE0IjoiRmFpbGVkIHRvIGVzdGFibGlzaCBtZWRpYSBjb25uZWN0aW9uLiIsIjAxMDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwMTAxIjoiUGVybWlzc2lvbiBkZW5pZWQiLCIwMTAyIjoiUHJlcmVxdWlzaXRlIG1vZHVsZSBtaXNzaW5nIiwiMDIwMCI6IkludGVybmFsIGV4Y2VwdGlvbi4iLCIwMzAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDQwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA0MDQiOiJNaXNzaW5nIHByZXJlcXVpc2l0ZXMgdG8gZXN0YWJsaXNoIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24iLCIwNTAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDUwMSI6IlBlcm1pc3Npb24gZGVuaWVkLiIsIjA1MDIiOiJJbnZhbGlkIG1lc3NhZ2UgYm9keS4iLCIwNTAzIjoiVGV4dCBNZXNzYWdlIGlzIHRvbyBsYXJnZSIsIjA1MDQiOiJNZXNzYWdlIG5vdCBmb3VuZCBieSB0aGUgZ2l2ZW4gaWQiLCIwNTA1IjoiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLCIwNTA2IjoiTWVzc2FnZSBzZWFyY2ggaXMgZGlzYWJsZWQiLCIwNjAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDYwMSI6IlBlcm1pc3Npb24gZGVuaWVkLiIsIjA2MDIiOiJBdXRoIHRva2VuIG5vdCBzZXQgZm9yIHBsdWdpbiIsIjA2MDMiOiJJZnJhbWUgd2FzIG5vdCBwcm92aWRlZCIsIjA3MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNzA1IjoiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLCIwODAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDgwMSI6IlBlcm1pc3Npb24gZGVuaWVkIiwiMDkwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA5MDQiOiJDb3VsZCBub3QgbG9hZCBwcmVzZXQiLDFlMzoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxMDAxOiJQZXJtaXNzaW9uIGRlbmllZCIsMTAwNDoiQ291bGQgbm90IGZpbmQgc3BlY2lmaWVkIHJlY29yZGluZyIsMTAwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgaW4gZ2l2ZW4gcmVjb3JkaW5nIHN0YXRlIiwxMTAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDExMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwxMTAyOiJVbnN1cHBvcnRlZCIsMTEwMzoiTmFtZSBjYW5ub3QgYmUgZW1wdHkiLDExMDQ6Ik5vIGRldmljZSBzZWxlY3RlZCB3aGlsZSBjYWxsaW5nIG1lZXRpbmcuc2VsZi5zZXREZXZpY2UiLDExMDU6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwxMTA2OiJDYW4ndCBzZXQgY3VycmVudGx5IHVzZWQgZGV2aWNlIiwxMjAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDEyMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwxMjAyOiJJbnZhbGlkIHBhZ2UgbnVtYmVyIHdhcyByZXF1ZXN0ZWQiLDEyMDM6IkludmFsaWQgcGFydGljaXBhbnQgY291bnQgcGVyIHBhZ2Ugd2FzIHJlcXVlc3RlZCIsMTIwNDoiTm8gcGFydGljaXBhbnRzIGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBVc2VySWRzIiwxMjA1OiJBY3Rpb24gbm90IHBlcm1pdHRlZCB3aXRob3V0IGpvaW5pbmcgcm9vbSIsMTIwNjoiTWFudWFsIFN1YnNjcmlwdGlvbiBNb2RlIHdhcyBub3QgQUNUSVZBVEVEIiwxMjA3OiJJbnZhbGlkIHZpZXcgbW9kZSIsMTIwODoiTWFudWFsIFN1YnNjcmlwdGlvbiBub3QgZW5hYmxlZCBmb3Igb3JnYW5pemF0aW9uIiwxMjA5OiJCcm9hZGNhc3QgbWVzc2FnZSB0eXBlIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIiwxMzAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE0MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTQwMjoiTm8gZXhpc3RpbmcgcmVtb3RlIHJlcXVlc3RzIiwxNDAzOiJObyBwZWVyIGV4aXN0cyB3aXRoIGdpdmVuIGlkIiwxNTAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE2MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTYwMToiRmFpbGVkIHRvIGdldCBhdWRpbyB0cmFjayIsMTYwMjoiRmFpbGVkIHRvIGdldCB2aWRlbyB0cmFjayIsMTYwMzoiSW5jb3JyZWN0IGRldmljZSIsMTYwNDoiRmFpbGVkIHRvIGNoYW5nZSBkZXZpY2UiLDE2MDU6IkZhaWxlZCB0byBnZXQgYXVkaW8gJiB2aWRlbyB0cmFjayIsMTYwNjoiTm8gYXVkaW8gaW5wdXQgZGV2aWNlcyBhcmUgYXZhaWxhYmxlIiwxNjA3OiJObyB2aWRlbyBpbnB1dCBkZXZpY2VzIGFyZSBhdmFpbGFibGUiLDE2MDg6Ik5vIGF1ZGlvIG91dHB1dCBkZXZpY2VzIChzcGVha2VycykgYXJlIGF2YWlsYWJsZSIsMTYwOToiRmFpbGVkIHRvIGZldGNoIGxpc3Qgb2YgbWVkaWEgZGV2aWNlcyIsMTYxMDoiTm8gbWVkaWEgdHJhY2sgZXhpc3RzIiwxNjExOiJGYWlsZWQgdG8gdW5tdXRlIHRyYWNrIiwxNjEyOiJGYWlsZWQgdG8gZ2V0IHNjcmVlbnNoYXJlIHRyYWNrcyIsMTcwMToiQ3J5cHRvIGVycm9yIiwxODAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE4MDE6IkNhbid0IGZldGNoIHRyYW5zY3JpcHQgZmlsZSIsMTkwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxOTAxOiJQZXJtaXNzaW9uIGRlbmllZC4iLDE5MDI6IkxpdmVzdHJlYW0gdGhhdCBoYXMgbm90IHlldCBzdGFydGVkLCBjYW4ndCBiZSBzdG9wcGVkIiwyZTM6IkludGVybmFsIGV4Y2VwdGlvbiIsMjAwMToiUGVybWlzc2lvbiBkZW5pZWQiLDIwMDI6IlVuc3VwcG9ydGVkIiwyMDAzOiJTdGFnZSBpcyBkaXNhYmxlZCIsMjAwNDoiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZCIsMjAwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLDIwMDY6IkFjdGlvbiBub3QgcGVybWl0dGVkIGluIGN1cnJlbnQgc3RhZ2Ugc3RhdHVzIiw5OTAwOiJJbnRlcm5hbCBleGNlcHRpb24ifTtPYmplY3Qua2V5cyhkdCkuZm9yRWFjaChyPT57ZHRbcl09YHskeyRpW3Iuc2xpY2UoMCwyKV19fSAke2R0W3JdfWB9KTtjbGFzcyBHaSBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKGUscyxuPXZvaWQgMCxpPSExKXtzdXBlcihlKTt1KHRoaXMsImNvZGUiKTt0aGlzLmNvZGU9cyx0aGlzLm5hbWU9IkNsaWVudEVycm9yIjtjb25zdCBhPXRoaXMuY29kZT9gW0VSUiR7dGhpcy5jb2RlfV1gOiJbRVJSXSIsZD10aGlzLmNvZGU/ZHRbdGhpcy5jb2RlXToiIjt0aGlzLm1lc3NhZ2U9YCR7YX06ICR7ZH0KJHt0aGlzLm1lc3NhZ2V9YDt0cnl7bGV0IG89aSYmISFuO3MmJnMuZW5kc1dpdGgoIjAwIikmJm4mJihvPSEwKSxvJiZuLmVycm9yKCJDbGllbnRFcnJvciIse2Vycm9yOnttZXNzYWdlOnRoaXMubWVzc2FnZSxuYW1lOnRoaXMubmFtZSxjb2RlOnN9fSk7Y29uc3QgaD1UZS5nZXRDb250ZXh0KFRlLmdldE1vc3RSZWNlbnRQZWVySWQoKSk7aWYoaCl7Y29uc3QgZz1oLmdldFZhbHVlKCJvbkVycm9yIik7dHJ5e2codGhpcyl9Y2F0Y2goYil7fX10eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJDbGllbnRFcnJvciIse2RldGFpbDp0aGlzfSkpfWNhdGNoKG8pe319fXZhciBsZT0ocj0+KHJbci5JbnZhbGlkS2V5PTBdPSJJbnZhbGlkS2V5IixyW3IuTWlzc2luZ0tleT0xXT0iTWlzc2luZ0tleSIscltyLkludGVybmFsRXJyb3I9Ml09IkludGVybmFsRXJyb3IiLHIpKShsZXx8e30pO2NsYXNzIHVlIGV4dGVuZHMgR2l7Y29uc3RydWN0b3IoZSxzPTIpe3N1cGVyKGUsIjE3MDEiKTt1KHRoaXMsInJlYXNvbiIpO3RoaXMucmVhc29uPXN9fWNsYXNzICRyIGV4dGVuZHMgVy5FdmVudEVtaXR0ZXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoKTt1KHRoaXMsImxvZ2dlciIpO3RoaXMubG9nZ2VyPWUsc3VwZXIuc2V0TWF4TGlzdGVuZXJzKDI1KX1lbWl0KGUsLi4ucyl7cmV0dXJuIHN1cGVyLmVtaXQoIioiLGUsLi4ucyksc3VwZXIuZW1pdChlLC4uLnMpfW9uKGUscyl7dmFyIG47dHJ5e2NvbnN0IGk9dGhpcy5saXN0ZW5lckNvdW50KGUpO2k+MjUmJmklMjU9PT0wJiYoKG49dGhpcy5sb2dnZXIpPT1udWxsfHxuLndhcm4oIkN1c3RvbUV2ZW50RW1pdHRlcjo6bWF4TGlzdGVuZXJzRXhjZWVkZWQiLHtldmVudExpc3RlbmVyOntldmVudE5hbWU6ZS50b1N0cmluZygpLGxpc3RlbmVyQ291bnQ6dGhpcy5saXN0ZW5lckNvdW50KGUpfX0pKX1jYXRjaChpKXt9cmV0dXJuIHN1cGVyLm9uKGUscyl9YWRkTGlzdGVuZXIoZSxzKXt2YXIgbjt0cnl7Y29uc3QgaT10aGlzLmxpc3RlbmVyQ291bnQoZSk7aT4yNSYmaSUyNT09PTAmJigobj10aGlzLmxvZ2dlcik9PW51bGx8fG4ud2FybigiQ3VzdG9tRXZlbnRFbWl0dGVyOjptYXhMaXN0ZW5lcnNFeGNlZWRlZCIse2V2ZW50TGlzdGVuZXI6e2V2ZW50TmFtZTplLnRvU3RyaW5nKCksbGlzdGVuZXJDb3VudDp0aGlzLmxpc3RlbmVyQ291bnQoZSl9fSkpfWNhdGNoKGkpe31yZXR1cm4gc3VwZXIuYWRkTGlzdGVuZXIoZSxzKX1vZmYoZSxzKXtyZXR1cm4gc3VwZXIub2ZmKGUscyl9b25jZShlLHMpe3JldHVybiBzdXBlci5vbmNlKGUscyl9cHJlcGVuZExpc3RlbmVyKGUscyl7cmV0dXJuIHN1cGVyLnByZXBlbmRMaXN0ZW5lcihlLHMpfXByZXBlbmRPbmNlTGlzdGVuZXIoZSxzKXtyZXR1cm4gc3VwZXIucHJlcGVuZE9uY2VMaXN0ZW5lcihlLHMpfXJlbW92ZUxpc3RlbmVyKGUscyl7cmV0dXJuIHN1cGVyLnJlbW92ZUxpc3RlbmVyKGUscyl9cmVtb3ZlQWxsTGlzdGVuZXJzKGUpe3JldHVybiBzdXBlci5yZW1vdmVBbGxMaXN0ZW5lcnMoZSl9bGlzdGVuZXJzKGUpe3JldHVybiBzdXBlci5saXN0ZW5lcnMoZSl9bGlzdGVuZXJDb3VudChlKXtyZXR1cm4gc3VwZXIubGlzdGVuZXJDb3VudChlKX19Y29uc3QgQ3Q9e0Vycm9yOiJjcnlwdG9yRXJyb3IifTtmdW5jdGlvbiBxaShyKXtyZXR1cm4idHlwZSJpbiByfWZ1bmN0aW9uIFlpKHMpe3JldHVybiB3KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKihyLHQ9e25hbWU6X30sZT0iZW5jcnlwdCIpe3JldHVybiBjcnlwdG8uc3VidGxlLmltcG9ydEtleSgicmF3IixyLHQsITEsZT09PSJkZXJpdmUiP1siZGVyaXZlQml0cyIsImRlcml2ZUtleSJdOlsiZW5jcnlwdCIsImRlY3J5cHQiXSl9KX1mdW5jdGlvbiBHcihyLHQpe2NvbnN0IHM9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHQpO3N3aXRjaChyKXtjYXNlIkhLREYiOnJldHVybntuYW1lOiJIS0RGIixzYWx0OnMsaGFzaDoiU0hBLTI1NiIsaW5mbzpuZXcgQXJyYXlCdWZmZXIoMTI4KX07Y2FzZSJQQktERjIiOnJldHVybntuYW1lOiJQQktERjIiLHNhbHQ6cyxoYXNoOiJTSEEtMjU2IixpdGVyYXRpb25zOjFlNX07ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGFsZ29yaXRobSAke3J9IGlzIGN1cnJlbnRseSB1bnN1cHBvcnRlZGApfX1mdW5jdGlvbiBxcihyLHQpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBlPUdyKHIuYWxnb3JpdGhtLm5hbWUsdCkscz15aWVsZCBjcnlwdG8uc3VidGxlLmRlcml2ZUtleShlLHIse25hbWU6XyxsZW5ndGg6MTI4fSwhMSxbImVuY3J5cHQiLCJkZWNyeXB0Il0pO3JldHVybnttYXRlcmlhbDpyLGVuY3J5cHRpb25LZXk6c319KX1mdW5jdGlvbiBRaShyLHQpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBlPUdyKHIuYWxnb3JpdGhtLm5hbWUsdCk7cmV0dXJuIGNyeXB0by5zdWJ0bGUuZGVyaXZlQml0cyhlLHIsMjU2KX0pfWNsYXNzIEppIGV4dGVuZHMgJHJ7fWNsYXNzIFlyIGV4dGVuZHMgSml7Y29uc3RydWN0b3IoZSl7dmFyIHM7c3VwZXIodm9pZCAwKTt1KHRoaXMsInNlbmRDb3VudHMiKTt1KHRoaXMsImlzS2V5SW52YWxpZCIsITEpO3UodGhpcywicGFydGljaXBhbnRJZCIpO3UodGhpcywidHJhY2tJZCIpO3UodGhpcywia2V5cyIpO3UodGhpcywidmlkZW9Db2RlYyIpO3UodGhpcywicnRwTWFwIik7dSh0aGlzLCJrZXlQcm92aWRlck9wdGlvbnMiKTt1KHRoaXMsInVuZW5jcnlwdGVkRnJhbWVCeXRlVHJhaWxlciIpO3RoaXMuc2VuZENvdW50cz1uZXcgTWFwLHRoaXMua2V5cz1lLmtleXMsdGhpcy5wYXJ0aWNpcGFudElkPWUucGFydGljaXBhbnRJZCx0aGlzLnJ0cE1hcD1uZXcgTWFwLHRoaXMua2V5UHJvdmlkZXJPcHRpb25zPWUua2V5UHJvdmlkZXJPcHRpb25zLHRoaXMudW5lbmNyeXB0ZWRGcmFtZUJ5dGVUcmFpbGVyPShzPWUudW5lbmNyeXB0ZWRGcmFtZUJ5dGVzKSE9bnVsbD9zOm5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgiTEtST0NLUyIpfXNldFBhcnRpY2lwYW50KGUscyl7dGhpcy5wYXJ0aWNpcGFudElkPWUsdGhpcy5rZXlzPXN9dW5zZXRQYXJ0aWNpcGFudCgpe3RoaXMucGFydGljaXBhbnRJZD12b2lkIDB9Z2V0UGFydGljaXBhbnRJZCgpe3JldHVybiB0aGlzLnBhcnRpY2lwYW50SWR9Z2V0VHJhY2tJZCgpe3JldHVybiB0aGlzLnRyYWNrSWR9c2V0VmlkZW9Db2RlYyhlKXt0aGlzLnZpZGVvQ29kZWM9ZX1zZXRSdHBNYXAoZSl7dGhpcy5ydHBNYXA9ZX1zZXR1cFRyYW5zZm9ybShlLHMsbixpLGEpe2EmJih0aGlzLnZpZGVvQ29kZWM9YSk7Y29uc3QgZD1lPT09ImVuY29kZSI/dGhpcy5lbmNvZGVGdW5jdGlvbjp0aGlzLmRlY29kZUZ1bmN0aW9uLG89bmV3IFRyYW5zZm9ybVN0cmVhbSh7dHJhbnNmb3JtOmQuYmluZCh0aGlzKX0pO3MucGlwZVRocm91Z2gobykucGlwZVRvKG4pLmNhdGNoKGg9Pnt0aGlzLmVtaXQoImNyeXB0b3JFcnJvciIsaCBpbnN0YW5jZW9mIHVlP2g6bmV3IHVlKGgubWVzc2FnZSkpfSksdGhpcy50cmFja0lkPWl9ZW5jb2RlRnVuY3Rpb24oZSxzKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGE7aWYoIXRoaXMua2V5cy5pc0VuYWJsZWQoKXx8ZS5kYXRhLmJ5dGVMZW5ndGg9PT0wKXJldHVybiBzLmVucXVldWUoZSk7Y29uc3R7ZW5jcnlwdGlvbktleTpufT10aGlzLmtleXMuZ2V0S2V5U2V0KCksaT10aGlzLmtleXMuZ2V0Q3VycmVudEtleUluZGV4KCk7aWYobil7Y29uc3QgZD10aGlzLm1ha2VJVigoYT1lLmdldE1ldGFkYXRhKCkuc3luY2hyb25pemF0aW9uU291cmNlKSE9bnVsbD9hOi0xLGUudGltZXN0YW1wKSxvPW5ldyBVaW50OEFycmF5KGUuZGF0YSwwLHRoaXMuZ2V0VW5lbmNyeXB0ZWRCeXRlcyhlKSksaD1uZXcgVWludDhBcnJheSgyKTtoWzBdPW9lLGhbMV09aTt0cnl7Y29uc3QgZz15aWVsZCBjcnlwdG8uc3VidGxlLmVuY3J5cHQoe25hbWU6XyxpdjpkLGFkZGl0aW9uYWxEYXRhOm5ldyBVaW50OEFycmF5KGUuZGF0YSwwLG8uYnl0ZUxlbmd0aCl9LG4sbmV3IFVpbnQ4QXJyYXkoZS5kYXRhLHRoaXMuZ2V0VW5lbmNyeXB0ZWRCeXRlcyhlKSkpLGI9bmV3IEFycmF5QnVmZmVyKG8uYnl0ZUxlbmd0aCtnLmJ5dGVMZW5ndGgrZC5ieXRlTGVuZ3RoK2guYnl0ZUxlbmd0aCksVD1uZXcgVWludDhBcnJheShiKTtyZXR1cm4gVC5zZXQobyksVC5zZXQobmV3IFVpbnQ4QXJyYXkoZyksby5ieXRlTGVuZ3RoKSxULnNldChuZXcgVWludDhBcnJheShkKSxvLmJ5dGVMZW5ndGgrZy5ieXRlTGVuZ3RoKSxULnNldChoLG8uYnl0ZUxlbmd0aCtnLmJ5dGVMZW5ndGgrZC5ieXRlTGVuZ3RoKSxlLmRhdGE9YixzLmVucXVldWUoZSl9Y2F0Y2goZyl7fX1lbHNlIHRoaXMuZW1pdChDdC5FcnJvcixuZXcgdWUoImVuY3J5cHRpb24ga2V5IG1pc3NpbmcgZm9yIGVuY29kaW5nIixsZS5NaXNzaW5nS2V5KSl9KX1kZWNvZGVGdW5jdGlvbihlLHMpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtpZighdGhpcy5rZXlzLmlzRW5hYmxlZCgpfHxlLmRhdGEuYnl0ZUxlbmd0aD09PTB8fFhpKGUuZGF0YSx0aGlzLnVuZW5jcnlwdGVkRnJhbWVCeXRlVHJhaWxlcikpcmV0dXJuIHMuZW5xdWV1ZShlKTtjb25zdCBpPW5ldyBVaW50OEFycmF5KGUuZGF0YSlbZS5kYXRhLmJ5dGVMZW5ndGgtMV07aWYodGhpcy5rZXlzLmdldEtleVNldChpKSl0cnl7Y29uc3QgYT15aWVsZCB0aGlzLmRlY3J5cHRGcmFtZShlLGkpO2lmKGEpcmV0dXJuIHMuZW5xdWV1ZShhKTt0aGlzLmlzS2V5SW52YWxpZD0hMX1jYXRjaChhKXthIGluc3RhbmNlb2YgdWUmJmEucmVhc29uPT09bGUuSW52YWxpZEtleSYmKHRoaXMuaXNLZXlJbnZhbGlkfHwodGhpcy5lbWl0KEN0LkVycm9yLG5ldyB1ZShgaW52YWxpZCBrZXkgZm9yIHBhcnRpY2lwYW50ICR7dGhpcy5wYXJ0aWNpcGFudElkfWAsbGUuSW52YWxpZEtleSkpLHRoaXMuaXNLZXlJbnZhbGlkPSEwKSl9ZWxzZSB0aGlzLmVtaXQoQ3QuRXJyb3IsbmV3IHVlKGBrZXkgbWlzc2luZyBmb3IgcGFydGljaXBhbnQgJHt0aGlzLnBhcnRpY2lwYW50SWR9YCxsZS5NaXNzaW5nS2V5KSk7cmV0dXJuIHMuZW5xdWV1ZShlKX0pfWRlY3J5cHRGcmFtZShhLGQpe3JldHVybiB3KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKihlLHMsbj12b2lkIDAsaT17cmF0Y2hldENvdW50OjB9KXt2YXIgaDtjb25zdCBvPXRoaXMua2V5cy5nZXRLZXlTZXQocyk7dHJ5e2NvbnN0IGc9bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsdGhpcy5nZXRVbmVuY3J5cHRlZEJ5dGVzKGUpKSxiPW5ldyBVaW50OEFycmF5KGUuZGF0YSxlLmRhdGEuYnl0ZUxlbmd0aC0yLDIpLFQ9YlswXSxWPW5ldyBVaW50OEFycmF5KGUuZGF0YSxlLmRhdGEuYnl0ZUxlbmd0aC1ULWIuYnl0ZUxlbmd0aCxUKSxVPWcuYnl0ZUxlbmd0aCxxPWUuZGF0YS5ieXRlTGVuZ3RoLShnLmJ5dGVMZW5ndGgrVCtiLmJ5dGVMZW5ndGgpLCQ9eWllbGQgY3J5cHRvLnN1YnRsZS5kZWNyeXB0KHtuYW1lOl8saXY6VixhZGRpdGlvbmFsRGF0YTpuZXcgVWludDhBcnJheShlLmRhdGEsMCxnLmJ5dGVMZW5ndGgpfSwoaD1pLmVuY3J5cHRpb25LZXkpIT1udWxsP2g6by5lbmNyeXB0aW9uS2V5LG5ldyBVaW50OEFycmF5KGUuZGF0YSxVLHEpKSxpZT1uZXcgQXJyYXlCdWZmZXIoZy5ieXRlTGVuZ3RoKyQuYnl0ZUxlbmd0aCksYWU9bmV3IFVpbnQ4QXJyYXkoaWUpO3JldHVybiBhZS5zZXQobmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsZy5ieXRlTGVuZ3RoKSksYWUuc2V0KG5ldyBVaW50OEFycmF5KCQpLGcuYnl0ZUxlbmd0aCksZS5kYXRhPWllLGV9Y2F0Y2goZyl7aWYodGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFdpbmRvd1NpemU+MCl7aWYoaS5yYXRjaGV0Q291bnQ8dGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFdpbmRvd1NpemUpe2xldCBiO2lmKG89PT10aGlzLmtleXMuZ2V0S2V5U2V0KHMpKXtjb25zdCBWPXlpZWxkIHRoaXMua2V5cy5yYXRjaGV0S2V5KHMsITEpO2I9eWllbGQgcXIoVix0aGlzLmtleVByb3ZpZGVyT3B0aW9ucy5yYXRjaGV0U2FsdCl9Y29uc3QgVD15aWVsZCB0aGlzLmRlY3J5cHRGcmFtZShlLHMsbnx8byx7cmF0Y2hldENvdW50OmkucmF0Y2hldENvdW50KzEsZW5jcnlwdGlvbktleTpiPT1udWxsP3ZvaWQgMDpiLmVuY3J5cHRpb25LZXl9KTtyZXR1cm4gVCYmYiYmKHRoaXMua2V5cy5zZXRLZXlTZXQoYixzLCEwKSx0aGlzLmtleXMuc2V0Q3VycmVudEtleUluZGV4KHMpKSxUfW4mJnRoaXMua2V5cy5zZXRLZXlGcm9tTWF0ZXJpYWwobi5tYXRlcmlhbCxzKX1lbHNlIHRocm93IG5ldyB1ZSgiRGVjcnlwdGlvbiBmYWlsZWQsIG1vc3QgbGlrZWx5IGJlY2F1c2Ugb2YgYW4gaW52YWxpZCBrZXkiLGxlLkludmFsaWRLZXkpfX0pfW1ha2VJVihlLHMpe3ZhciBkO2NvbnN0IG49bmV3IEFycmF5QnVmZmVyKG9lKSxpPW5ldyBEYXRhVmlldyhuKTt0aGlzLnNlbmRDb3VudHMuaGFzKGUpfHx0aGlzLnNlbmRDb3VudHMuc2V0KGUsTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjY1NTM1KSk7Y29uc3QgYT0oZD10aGlzLnNlbmRDb3VudHMuZ2V0KGUpKSE9bnVsbD9kOjA7cmV0dXJuIGkuc2V0VWludDMyKDAsZSksaS5zZXRVaW50MzIoNCxzKSxpLnNldFVpbnQzMig4LHMtYSU2NTUzNSksdGhpcy5zZW5kQ291bnRzLnNldChlLGErMSksbn1nZXRVbmVuY3J5cHRlZEJ5dGVzKGUpe3ZhciBzO2lmKHFpKGUpKXtjb25zdCBuPShzPXRoaXMuZ2V0VmlkZW9Db2RlYyhlKSkhPW51bGw/czp0aGlzLnZpZGVvQ29kZWM7aWYobj09PSJhdjEifHxuPT09InZwOSIpdGhyb3cgbmV3IEVycm9yKGAke259IGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBlbmQgdG8gZW5kIGVuY3J5cHRpb25gKTtyZXR1cm4gTVtlLnR5cGVdfXJldHVybiBNLmF1ZGlvfWdldFZpZGVvQ29kZWMoZSl7aWYodGhpcy5ydHBNYXAuc2l6ZT09PTApcmV0dXJuO2NvbnN0e3BheWxvYWRUeXBlOnN9PWUuZ2V0TWV0YWRhdGEoKTtyZXR1cm4gcz90aGlzLnJ0cE1hcC5nZXQocyk6dm9pZCAwfX1mdW5jdGlvbiBYaShyLHQpe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoci5zbGljZShyLmJ5dGVMZW5ndGgtdC5ieXRlTGVuZ3RoKSk7cmV0dXJuIHQuZXZlcnkoKHMsbik9PnM9PT1lW25dKX1jbGFzcyBRciBleHRlbmRzICRye2NvbnN0cnVjdG9yKGUscyxuKXtzdXBlcih2b2lkIDApO3UodGhpcywiY3VycmVudEtleUluZGV4Iik7dSh0aGlzLCJjcnlwdG9LZXlSaW5nIik7dSh0aGlzLCJlbmFibGVkIik7dSh0aGlzLCJrZXlQcm92aWRlck9wdGlvbnMiKTt1KHRoaXMsInJhdGNoZXRQcm9taXNlTWFwIik7dSh0aGlzLCJwYXJ0aWNpcGFudElkIik7dGhpcy5jdXJyZW50S2V5SW5kZXg9MCx0aGlzLmNyeXB0b0tleVJpbmc9bmV3IEFycmF5KDE2KSx0aGlzLmVuYWJsZWQ9cyx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucz1uLHRoaXMucmF0Y2hldFByb21pc2VNYXA9bmV3IE1hcCx0aGlzLnBhcnRpY2lwYW50SWQ9ZX1zZXRFbmFibGVkKGUpe3RoaXMuZW5hYmxlZD1lfXJhdGNoZXRLZXkoZSxzPSEwKXtjb25zdCBuPWUhPW51bGw/ZTp0aGlzLmdldEN1cnJlbnRLZXlJbmRleCgpLGk9bixhPXRoaXMucmF0Y2hldFByb21pc2VNYXAuZ2V0KGkpO2lmKHR5cGVvZiBhIT0idW5kZWZpbmVkIilyZXR1cm4gYTtjb25zdCBkPW5ldyBQcm9taXNlKChvLGgpPT53KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0cnl7Y29uc3QgZz10aGlzLmdldEtleVNldChpKS5tYXRlcmlhbCxiPXlpZWxkIFlpKHlpZWxkIFFpKGcsdGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFNhbHQpLGcuYWxnb3JpdGhtLm5hbWUsImRlcml2ZSIpO3MmJnRoaXMuc2V0S2V5RnJvbU1hdGVyaWFsKGIsaSwhMCksdGhpcy5lbWl0KCJrZXlSYXRjaGV0ZWQiLGIsbix0aGlzLnBhcnRpY2lwYW50SWQpLG8oYil9Y2F0Y2goZyl7aChnKX1maW5hbGx5e3RoaXMucmF0Y2hldFByb21pc2VNYXAuZGVsZXRlKGkpfX0pKTtyZXR1cm4gdGhpcy5yYXRjaGV0UHJvbWlzZU1hcC5zZXQoaSxkKSxkfXNldEtleUZyb21NYXRlcmlhbChlLHM9MCxuPSExKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cz49MCYmKHRoaXMuY3VycmVudEtleUluZGV4PXMldGhpcy5jcnlwdG9LZXlSaW5nLmxlbmd0aCk7Y29uc3QgaT15aWVsZCBxcihlLHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRTYWx0KTt0aGlzLnNldEtleVNldChpLHRoaXMuY3VycmVudEtleUluZGV4LG4pfSl9c2V0S2V5U2V0KGUscyxuPSExKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dGhpcy5jcnlwdG9LZXlSaW5nW3MldGhpcy5jcnlwdG9LZXlSaW5nLmxlbmd0aF09ZSxuJiZ0aGlzLmVtaXQoImtleVJhdGNoZXRlZCIsZS5tYXRlcmlhbCxzLHRoaXMucGFydGljaXBhbnRJZCl9KX1zZXRDdXJyZW50S2V5SW5kZXgoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMuY3VycmVudEtleUluZGV4PWUldGhpcy5jcnlwdG9LZXlSaW5nLmxlbmd0aH0pfWlzRW5hYmxlZCgpe3JldHVybiB0aGlzLmVuYWJsZWR9Z2V0Q3VycmVudEtleUluZGV4KCl7cmV0dXJuIHRoaXMuY3VycmVudEtleUluZGV4fWdldEtleVNldChlKXtyZXR1cm4gdGhpcy5jcnlwdG9LZXlSaW5nW2UhPW51bGw/ZTp0aGlzLmN1cnJlbnRLZXlJbmRleF19fWNvbnN0IEl0PVtdLHd0PW5ldyBNYXAsa3Q9W107bGV0IG5lLE10PSExLEpyPSExLF90LHBlPXB0O2Z1bmN0aW9uIGhlKHIsdCl7cG9zdE1lc3NhZ2Uoe2tpbmQ6ImxvZyIsZGF0YTp7bGV2ZWw6cixzdHI6dH19KX1mdW5jdGlvbiBaaShyLHQpe3Bvc3RNZXNzYWdlKHtraW5kOiJyYXRjaGV0S2V5IixkYXRhOntrZXlJbmRleDp0LG1hdGVyaWFsOnJ9fSl9ZnVuY3Rpb24gUmUocil7aWYoIXIpcmV0dXJuIG5lO2xldCB0PXd0LmdldChyKTtyZXR1cm4gdHx8KHQ9bmV3IFFyKHIsITAscGUpLF90JiZ0LnNldEtleUZyb21NYXRlcmlhbChfdCksd3Quc2V0KHIsdCkpLHR9ZnVuY3Rpb24gZWEocix0KXt0P1JlKHQpLnNldEVuYWJsZWQocik6KE10PXIsbmUuc2V0RW5hYmxlZChyKSl9ZnVuY3Rpb24gWHIocil7ci5vbigiY3J5cHRvckVycm9yIix0PT57Y29uc3QgZT17a2luZDoiZXJyb3IiLGRhdGE6e2Vycm9yOm5ldyBFcnJvcihgJHtsZVt0LnJlYXNvbl19OiAke3QubWVzc2FnZX1gKX19O3Bvc3RNZXNzYWdlKGUpfSl9ZnVuY3Rpb24gQXQocix0KXtsZXQgZT1JdC5maW5kKHM9PnMuZ2V0VHJhY2tJZCgpPT09dCk7aWYoZSlyIT09ZS5nZXRQYXJ0aWNpcGFudElkKCkmJmUuc2V0UGFydGljaXBhbnQocixSZShyKSk7ZWxzZXtpZihoZSgiaW5mbyIsYGNyZWF0aW5nIG5ldyBjcnlwdG9yIGZvciAke3J9YCksIXBlKXRocm93IEVycm9yKCJNaXNzaW5nIGtleVByb3ZpZGVyIG9wdGlvbnMiKTtlPW5ldyBZcih7cGFydGljaXBhbnRJZDpyLGtleXM6UmUociksa2V5UHJvdmlkZXJPcHRpb25zOnBlfSksWHIoZSksSXQucHVzaChlKX1yZXR1cm4gZX1mdW5jdGlvbiBacihyKXtsZXQgdD1rdC5maW5kKGU9PmUuZ2V0VHJhY2tJZCgpPT09cik7aWYoIXQpe2lmKCFwZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJNaXNzaW5nIGtleVByb3ZpZGVyIG9wdGlvbnMiKTt0PW5ldyBZcih7a2V5czpuZSxwYXJ0aWNpcGFudElkOiJwdWJsaXNoZXIiLGtleVByb3ZpZGVyT3B0aW9uczpwZX0pLFhyKHQpLGt0LnB1c2godCl9cmV0dXJuIHR9ZnVuY3Rpb24gdGEocil7dmFyIHQ7KHQ9SXQuZmluZChlPT5lLmdldFRyYWNrSWQoKT09PXIpKT09bnVsbHx8dC51bnNldFBhcnRpY2lwYW50KCl9ZnVuY3Rpb24gcmEocix0KXtoZSgiZGVidWciLCJzZXR0aW5nIHNoYXJlZCBrZXkiKSxfdD1yLG5lPT1udWxsfHxuZS5zZXRLZXlGcm9tTWF0ZXJpYWwocix0KTtmb3IoY29uc3RbLGVdb2Ygd3QpZS5zZXRLZXlGcm9tTWF0ZXJpYWwocix0KX1vbm1lc3NhZ2U9cj0+e2NvbnN0e2tpbmQ6dCxkYXRhOmV9PXIuZGF0YTtzd2l0Y2godCl7Y2FzZSJpbml0IjpoZSgiaW5mbyIsIndvcmtlciBpbml0aWFsaXplZCIpLHBlPWUua2V5UHJvdmlkZXJPcHRpb25zLEpyPSEhZS5rZXlQcm92aWRlck9wdGlvbnMuc2hhcmVkS2V5O2NvbnN0IHM9e2tpbmQ6ImVuYWJsZSIsZGF0YTp7ZW5hYmxlZDpNdH19O25lPW5ldyBRcih2b2lkIDAsTXQscGUpLG5lLm9uKCJrZXlSYXRjaGV0ZWQiLFppKSxwb3N0TWVzc2FnZShzKTticmVhaztjYXNlImVuYWJsZSI6ZWEoZS5lbmFibGVkLGUucGFydGljaXBhbnRJZCksaGUoImluZm8iLCJ1cGRhdGVkIGUyZWUgZW5hYmxlZCBzdGF0dXMiKSxwb3N0TWVzc2FnZShyLmRhdGEpO2JyZWFrO2Nhc2UiZGVjb2RlIjpBdChlLnBhcnRpY2lwYW50SWQsZS50cmFja0lkKS5zZXR1cFRyYW5zZm9ybSh0LGUucmVhZGFibGVTdHJlYW0sZS53cml0YWJsZVN0cmVhbSxlLnRyYWNrSWQsZS5jb2RlYyk7YnJlYWs7Y2FzZSJlbmNvZGUiOlpyKGUudHJhY2tJZCkuc2V0dXBUcmFuc2Zvcm0odCxlLnJlYWRhYmxlU3RyZWFtLGUud3JpdGFibGVTdHJlYW0sZS50cmFja0lkLGUuY29kZWMpO2JyZWFrO2Nhc2Uic2V0S2V5IjpKcj8oaGUoImRlYnVnIiwic2V0IHNoYXJlZCBrZXkiKSxyYShlLmtleSxlLmtleUluZGV4KSk6ZS5wYXJ0aWNpcGFudElkP1JlKGUucGFydGljaXBhbnRJZCkuc2V0S2V5RnJvbU1hdGVyaWFsKGUua2V5LGUua2V5SW5kZXgpOmhlKCJlcnJvciIsIm5vIHBhcnRpY2lwYW50IElkIHdhcyBwcm92aWRlZCBhbmQgc2hhcmVkIGtleSB1c2FnZSBpcyBkaXNhYmxlZCIpO2JyZWFrO2Nhc2UicmVtb3ZlVHJhbnNmb3JtIjp0YShlLnRyYWNrSWQpO2JyZWFrO2Nhc2UidXBkYXRlQ29kZWMiOkF0KGUucGFydGljaXBhbnRJZCxlLnRyYWNrSWQpLnNldFZpZGVvQ29kZWMoZS5jb2RlYyk7YnJlYWs7Y2FzZSJzZXRSVFBNYXAiOmt0LmZvckVhY2goYT0+e2Euc2V0UnRwTWFwKGUubWFwKX0pO2JyZWFrO2Nhc2UicmF0Y2hldFJlcXVlc3QiOlJlKGUucGFydGljaXBhbnRJZCkucmF0Y2hldEtleShlLmtleUluZGV4KTticmVha319LHNlbGYuUlRDVHJhbnNmb3JtRXZlbnQmJihoZSgiZGVidWciLCJzZXR1cCB0cmFuc2Zvcm0gZXZlbnQiKSxzZWxmLm9ucnRjdHJhbnNmb3JtPXI9Pntjb25zdHt0cmFuc2Zvcm1lcjp0fT1yO3QuaGFuZGxlZD0hMDtjb25zdHtraW5kOmUscGFydGljaXBhbnRJZDpzLHRyYWNrSWQ6bixjb2RlYzppfT10Lm9wdGlvbnM7KGU9PT0iZW5jb2RlIj9acihuKTpBdChzLG4pKS5zZXR1cFRyYW5zZm9ybShlLHQucmVhZGFibGUsdC53cml0YWJsZSxuLGkpfSl9KSgpOwo=",g=typeof window!="undefined"&&window.Blob&&new Blob([atob(ll)],{type:"text/javascript;charset=utf-8"});function Hl(){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,k,U,dl,I,cl,a,T,v,Sl,H,bl,S,Vl,t,Wl,o,Xl;class Zl extends ${constructor(l){super(void 0);p(this,N);p(this,U);p(this,I);p(this,a);p(this,v);p(this,H);p(this,S);p(this,t);p(this,o);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(V=>{Y(this,a,T).call(this,V)});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,k,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 Hl,this.encryptionEnabled=!1}get isEnabled(){return this.encryptionEnabled}init(l,c){this.logger=l,this.peerSessionStore=c,this.setup()}setup(){if(!kl())throw new Error("tried to setup end-to-end encryption on an unsupported browser");this.logger.info("setting up e2ee"),Y(this,U,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=w(this,k),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")})},k=new WeakMap,U=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 V={kind:"removeTransform",data:{participantId:c,trackId:b}};(W=this.worker)==null||W.postMessage(V)}),this.peerSessionStore.on(i.E2EE_ACTIVE_CONSUMER,({track:c,rtpReceiver:b,peerId:V})=>Y(this,H,bl).call(this,c,b,V)),this.peerSessionStore.on(i.E2EE_ACTIVE_PRODUCER,({track:c,rtpSender:b,appData:V})=>Y(this,S,Vl).call(this,c,b,V.peerId)),l.on("setKey",c=>Y(this,a,T).call(this,c)).on("ratchetRequest",(c,b)=>Y(this,I,cl).call(this,c,b))},I=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 V={kind:"setKey",data:{participantId:c,key:l,keyIndex:b}};this.worker.postMessage(V)},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)},H=new WeakSet,bl=function(l,c,b){Y(this,t,Wl).call(this,c,l.id,b)},S=new WeakSet,Vl=function(l,c,b){Y(this,o,Xl).call(this,c,l.id,b)},t=new WeakSet,Wl=function(l,c,b,V){return J(this,null,function*(){if(!this.worker)return;const W=l;if(x()){const X={kind:"decode",participantId:b,trackId:c,codec:V};W.transform=new RTCRtpScriptTransform(this.worker,X)}else{if(F in W&&V){const y={kind:"updateCodec",data:{trackId:c,codec:V,participantId:b}};this.worker.postMessage(y);return}let X=W.writableStream,m=W.readableStream;if(!X||!m){const y=W.createEncodedStreams();W.writableStream=y.writable,X=y.writable,W.readableStream=y.readable,m=y.readable}const u={kind:"decode",data:{readableStream:m,writableStream:X,trackId:c,codec:V,participantId:b}};this.worker.postMessage(u,[m,X])}W[F]=!0})},o=new WeakSet,Xl=function(l,c,b,V){if(F in l||!this.worker)return;const W=l;if(x()){this.logger.warn("initialize script transform");const X={kind:"encode",participantId:b,trackId:c,codec:V};W.transform=new RTCRtpScriptTransform(this.worker,X)}else{this.logger.warn("initialize encoded streams");const X=W.createEncodedStreams(),m={kind:"encode",data:{readableStream:X.readable,writableStream:X.writable,codec:V,trackId:c,participantId:b||"publisher"}};this.worker.postMessage(m,[X.readable,X.writable])}W[F]=!0},R(Zl,"SharedKeyProvider",Il);module.exports=Zl;